diff --git a/buildtools/pip/pip.go b/buildtools/pip/pip.go index 0033d7c0e2..0a53e22bd2 100644 --- a/buildtools/pip/pip.go +++ b/buildtools/pip/pip.go @@ -59,15 +59,18 @@ func FromFile(filename string) ([]Requirement, error) { var reqs []Requirement for _, line := range strings.Split(string(contents), "\n") { - trimmed := strings.TrimSpace(line) + // Remove all line comments and whitespace. + commentSplit := strings.Split(line, "#") + trimmed := strings.TrimSpace(commentSplit[0]) if strings.HasPrefix(trimmed, "#") || strings.HasPrefix(trimmed, "-") || trimmed == "" { continue } + log.WithField("line", line).Debug("parsing line") // See https://pip.pypa.io/en/stable/reference/pip_install/#requirements-file-format // and https://pip.pypa.io/en/stable/reference/pip_install/#pip-install-examples matched := false - operators := []string{"<=", ">=", "==", ">", "<", "!="} + operators := []string{"===", "<=", ">=", "==", ">", "<", "!=", "~="} for _, op := range operators { sections := strings.Split(trimmed, op) if len(sections) == 2 { diff --git a/buildtools/pip/pip_test.go b/buildtools/pip/pip_test.go index bfab422699..0c99409b7f 100644 --- a/buildtools/pip/pip_test.go +++ b/buildtools/pip/pip_test.go @@ -11,12 +11,15 @@ import ( func TestFromFile(t *testing.T) { reqs, err := pip.FromFile("testdata/requirements.txt") assert.NoError(t, err) - assert.Equal(t, 5, len(reqs)) + assert.Equal(t, 8, len(reqs)) assert.Contains(t, reqs, pip.Requirement{Name: "simple", Revision: "1.0.0", Operator: "=="}) assert.Contains(t, reqs, pip.Requirement{Name: "extra", Revision: "2.0.0", Operator: "=="}) assert.Contains(t, reqs, pip.Requirement{Name: "latest"}) assert.Contains(t, reqs, pip.Requirement{Name: "latestExtra"}) assert.Contains(t, reqs, pip.Requirement{Name: "notEqualOp", Revision: "3.0.0", Operator: ">="}) + assert.Contains(t, reqs, pip.Requirement{Name: "comment-version", Revision: "2.0.0", Operator: "==="}) + assert.Contains(t, reqs, pip.Requirement{Name: "comment"}) + assert.Contains(t, reqs, pip.Requirement{Name: "tilde", Revision: "2.0.0", Operator: "~="}) assert.NotContains(t, reqs, pip.Requirement{Name: "-r other-requirements.txt"}) assert.NotContains(t, reqs, pip.Requirement{Name: "--option test-option"}) } diff --git a/buildtools/pip/testdata/requirements.txt b/buildtools/pip/testdata/requirements.txt index 8319a9344b..a8042605d4 100644 --- a/buildtools/pip/testdata/requirements.txt +++ b/buildtools/pip/testdata/requirements.txt @@ -5,3 +5,6 @@ extra[extra]==2.0.0 latest latestExtra[security] notEqualOp>=3.0.0 +tilde~=2.0.0 +comment-version===2.0.0 #comment +comment #comment \ No newline at end of file