diff --git a/libs/patchwheel/parse.go b/libs/patchwheel/parse.go index 3982d617c..b450a4efb 100644 --- a/libs/patchwheel/parse.go +++ b/libs/patchwheel/parse.go @@ -39,30 +39,20 @@ func ParseWheelFilename(filename string) (*WheelInfo, error) { if len(parts) < 5 { return nil, fmt.Errorf("invalid wheel filename format: not enough parts in %s", filename) } + + if len(parts) > 6 { + return nil, fmt.Errorf("invalid wheel filename format: too many parts in %s", filename) + } + if !strings.HasSuffix(parts[len(parts)-1], ".whl") { return nil, fmt.Errorf("invalid wheel filename format: missing .whl extension in %s", filename) } - // The last three parts are always the python, abi and platform tags - tagStartIdx := len(parts) - 3 - tags := parts[tagStartIdx:] - tags[2] = strings.TrimSuffix(tags[2], ".whl") - - // The distribution is always the first part - distribution := parts[0] - - // The version is the second part - don't include build tags - version := parts[1] - - // If there are build tags between version and python tag, include them in tags - if tagStartIdx > 2 { - buildTags := parts[2:tagStartIdx] - tags = append(buildTags, tags...) - } + parts[len(parts)-1] = strings.TrimSuffix(parts[len(parts)-1], ".whl") return &WheelInfo{ - Distribution: distribution, - Version: version, - Tags: tags, + Distribution: parts[0], + Version: parts[1], + Tags: parts[2:], }, nil } diff --git a/libs/patchwheel/parse_test.go b/libs/patchwheel/parse_test.go index c2f21766d..ec5f639ea 100644 --- a/libs/patchwheel/parse_test.go +++ b/libs/patchwheel/parse_test.go @@ -7,274 +7,6 @@ import ( "github.com/stretchr/testify/require" ) -/* - -AI TODO: incorporate this test cases into TestParseWheelFilename - -@pytest.mark.parametrize( - "filename,expected", - [ - ( - "astrocats-0.3.2-universal-none-any.whl", - ParsedWheelFilename( - project="astrocats", - version="0.3.2", - build=None, - python_tags=["universal"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "bencoder.pyx-1.1.2-pp226-pp226-win32.whl", - ParsedWheelFilename( - project="bencoder.pyx", - version="1.1.2", - build=None, - python_tags=["pp226"], - abi_tags=["pp226"], - platform_tags=["win32"], - ), - ), - ( - "brotlipy-0.1.2-pp27-none-macosx_10_10_x86_64.whl", - ParsedWheelFilename( - project="brotlipy", - version="0.1.2", - build=None, - python_tags=["pp27"], - abi_tags=["none"], - platform_tags=["macosx_10_10_x86_64"], - ), - ), - ( - "brotlipy-0.3.0-pp226-pp226u-macosx_10_10_x86_64.whl", - ParsedWheelFilename( - project="brotlipy", - version="0.3.0", - build=None, - python_tags=["pp226"], - abi_tags=["pp226u"], - platform_tags=["macosx_10_10_x86_64"], - ), - ), - ( - "carbonara_archinfo-7.7.9.14.post1-py2-none-any.whl", - ParsedWheelFilename( - project="carbonara_archinfo", - version="7.7.9.14.post1", - build=None, - python_tags=["py2"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "coremltools-0.3.0-py2.7-none-any.whl", - ParsedWheelFilename( - project="coremltools", - version="0.3.0", - build=None, - python_tags=["py2", "7"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "cvxopt-1.2.0-001-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel" - ".macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", - ParsedWheelFilename( - project="cvxopt", - version="1.2.0", - build="001", - python_tags=["cp34"], - abi_tags=["cp34m"], - platform_tags=[ - "macosx_10_6_intel", - "macosx_10_9_intel", - "macosx_10_9_x86_64", - "macosx_10_10_intel", - "macosx_10_10_x86_64", - ], - ), - ), - ( - "django_mbrowse-0.0.1-10-py2-none-any.whl", - ParsedWheelFilename( - project="django_mbrowse", - version="0.0.1", - build="10", - python_tags=["py2"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "efilter-1!1.2-py2-none-any.whl", - ParsedWheelFilename( - project="efilter", - version="1!1.2", - build=None, - python_tags=["py2"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "line.sep-0.2.0.dev1-py2.py3-none-any.whl", - ParsedWheelFilename( - project="line.sep", - version="0.2.0.dev1", - build=None, - python_tags=["py2", "py3"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "mayan_edms-1.1.0-1502100955-py2-none-any.whl", - ParsedWheelFilename( - project="mayan_edms", - version="1.1.0", - build="1502100955", - python_tags=["py2"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "mxnet_model_server-1.0a5-20180816-py2.py3-none-any.whl", - ParsedWheelFilename( - project="mxnet_model_server", - version="1.0a5", - build="20180816", - python_tags=["py2", "py3"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "pip-18.0-py2.py3-none-any.whl", - ParsedWheelFilename( - project="pip", - version="18.0", - build=None, - python_tags=["py2", "py3"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "polarTransform-2-1.0.0-py3-none-any.whl", - ParsedWheelFilename( - project="polarTransform", - version="2", - build="1.0.0", - python_tags=["py3"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "psycopg2-2.7.5-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel" - ".macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", - ParsedWheelFilename( - project="psycopg2", - version="2.7.5", - build=None, - python_tags=["cp37"], - abi_tags=["cp37m"], - platform_tags=[ - "macosx_10_6_intel", - "macosx_10_9_intel", - "macosx_10_9_x86_64", - "macosx_10_10_intel", - "macosx_10_10_x86_64", - ], - ), - ), - ( - "pyinterval-1.0.0-0-cp27-none-win32.whl", - ParsedWheelFilename( - project="pyinterval", - version="1.0.0", - build="0", - python_tags=["cp27"], - abi_tags=["none"], - platform_tags=["win32"], - ), - ), - ( - "pypi_simple-0.1.0.dev1-py2.py3-none-any.whl", - ParsedWheelFilename( - project="pypi_simple", - version="0.1.0.dev1", - build=None, - python_tags=["py2", "py3"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "PyQt3D-5.7.1-5.7.1-cp34.cp35.cp36-abi3-macosx_10_6_intel.whl", - ParsedWheelFilename( - project="PyQt3D", - version="5.7.1", - build="5.7.1", - python_tags=["cp34", "cp35", "cp36"], - abi_tags=["abi3"], - platform_tags=["macosx_10_6_intel"], - ), - ), - ( - "qypi-0.4.1-py3-none-any.whl", - ParsedWheelFilename( - project="qypi", - version="0.4.1", - build=None, - python_tags=["py3"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "SimpleSteem-1.1.9-3.0-none-any.whl", - ParsedWheelFilename( - project="SimpleSteem", - version="1.1.9", - build=None, - python_tags=["3", "0"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "simple_workflow-0.1.47-pypy-none-any.whl", - ParsedWheelFilename( - project="simple_workflow", - version="0.1.47", - build=None, - python_tags=["pypy"], - abi_tags=["none"], - platform_tags=["any"], - ), - ), - ( - "tables-3.4.2-3-cp27-cp27m-manylinux1_i686.whl", - ParsedWheelFilename( - project="tables", - version="3.4.2", - build="3", - python_tags=["cp27"], - abi_tags=["cp27m"], - platform_tags=["manylinux1_i686"], - ), - ), - ], -) - -*/ - func TestCalculateNewVersion(t *testing.T) { tests := []struct { name string @@ -354,13 +86,15 @@ func TestParseWheelFilename(t *testing.T) { wantErr: false, }, { - filename: "my-proj-with-hyphens-0.1.0-py3-none-any.whl", - wantDistribution: "my-proj-with-hyphens", + filename: "my_proj_with_parts-0.1.0-py3-none-any.whl", + wantDistribution: "my_proj_with_parts", wantVersion: "0.1.0", wantTags: []string{"py3", "none", "any"}, wantErr: false, }, - // Test cases from the AI TODO + // Test cases adapted from wheelodex/wheel-filename + // https://github.com/wheelodex/wheel-filename/blob/f5a72b560d016cc9663c8b5a094c96dc338a2209/test/test_parse.py + // MIT License: https://github.com/wheelodex/wheel-filename/blob/f5a72b560d016cc9663c8b5a094c96dc338a2209/LICENSE { filename: "astrocats-0.3.2-universal-none-any.whl", wantDistribution: "astrocats", @@ -538,10 +272,26 @@ func TestParseWheelFilename(t *testing.T) { require.Error(t, err) } else { require.NoError(t, err) - require.Equal(t, tt.wantDistribution, info.Distribution) - require.Equal(t, tt.wantVersion, info.Version) - require.Equal(t, tt.wantTags, info.Tags) + require.Equal(t, tt.wantDistribution, info.Distribution, "distribution mismatch") + require.Equal(t, tt.wantVersion, info.Version, "version mismatch") + require.Equal(t, tt.wantTags, info.Tags, "tags mismatch") } }) } } + +func TestParseError(t *testing.T) { + tests := []string{ + "", + "a-b", + "a-b-c.whl", + "a-b-c-d.whl", + "a-b-c-d-e-f-g.whl", + } + for _, tt := range tests { + t.Run(tt, func(t *testing.T) { + info, err := ParseWheelFilename(tt) + require.Error(t, err, "info=%v", info) + }) + } +}