madpah / madpah/requirements-parser

the parser chokes on a single dot

Open
#83 1 comment 1 reaction 0 assignees View on GitHub
enhancement
Dominant language
Python
Stars
141
Forks
42
PR merge metrics
No merged PRs in 30d

Description

In the [PyDigger](https://pydigger.com/) project I monitor PyPI and analyze recent releases. Among other things I use `requirements-parser` to parse the requirements.txt file.

Recently I encountered this project https://github.com/Te-k/pycrtsh where the "requirements.txt" file contains a single dot"

```
.
```

the parser raises an exception.

Is this a bug in `requirements.parse` or is having a single dot really incorrect?

See:

```
>>> import requirements
>>> for req in requirements.parse(".\n"): print(req)
...

Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/requirements.py", line 98, in __init__
req = REQUIREMENT.parseString(requirement_string)
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 1654, in parseString
raise exc
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 1644, in parseString
loc, tokens = self._parse( instring, 0 )
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 1402, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 3417, in parseImpl
loc, exprtokens = e._parse( instring, loc, doActions )
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 1402, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 3739, in parseImpl
return self.expr._parse( instring, loc, doActions, callPreParse=False )
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 1402, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 3400, in parseImpl
loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 1406, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py", line 2711, in parseImpl
raise ParseException(instring, loc, self.errmsg, self)
pkg_resources._vendor.pyparsing.ParseException: Expected W:(abcd...) (at char 0), (line:1, col:1)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "", line 1, in
File "/usr/local/lib/python3.9/site-packages/requirements/parser.py", line 87, in parse
yield Requirement.parse(line)
File "/usr/local/lib/python3.9/site-packages/requirements/requirement.py", line 254, in parse
return cls.parse_line(line)
File "/usr/local/lib/python3.9/site-packages/requirements/requirement.py", line 232, in parse_line
pkg_req = Req.parse(line)
File "/usr/local/lib/python3.9/site-packages/pkg_resources/__init__.py", line 3139, in parse
req, = parse_requirements(s)
File "/usr/local/lib/python3.9/site-packages/pkg_resources/__init__.py", line 3084, in parse_requirements
yield Requirement(line)
File "/usr/local/lib/python3.9/site-packages/pkg_resources/__init__.py", line 3094, in __init__
super(Requirement, self).__init__(requirement_string)
File "/usr/local/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/requirements.py", line 100, in __init__
raise InvalidRequirement(
pkg_resources.extern.packaging.requirements.InvalidRequirement: Parse error at "'.'": Expected W:(abcd...)

```

Contributor guide

Open the contributing guide

Research direction

Start with requirements/parser.py, where requirements.parse yields each line, and requirements/requirement.py, where parse_line delegates to the dependency parser. Reproduce the failure with a single dot and determine the expected handling for this requirements.txt entry; done means that behavior is covered by a regression test without breaking ordinary requirement parsing.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.