2
2
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
3
3
# for complete details.
4
4
5
- import re
6
- import string
7
5
import urllib .parse
6
+ from collections import namedtuple
8
7
from typing import List , Optional as TOptional , Set
9
8
10
- from .markers import Marker
11
- from .specifiers import LegacySpecifier , Specifier , SpecifierSet
9
+ from ._parser import parse_named_requirement
10
+ from ._tokenizer import ParseException
11
+ from .markers import InvalidMarker , Marker
12
+ from .specifiers import SpecifierSet
12
13
13
14
14
15
class InvalidRequirement (ValueError ):
@@ -31,12 +32,13 @@ class Requirement:
31
32
# TODO: Can we normalize the name and extra name?
32
33
33
34
def __init__ (self , requirement_string : str ) -> None :
35
+ _RequirementTuple = namedtuple (
36
+ "_RequirementTuple" , ["name" , "url" , "extras" , "specifier" , "marker" ]
37
+ )
34
38
try :
35
- req = REQUIREMENT . parseString ( requirement_string )
39
+ req = _RequirementTuple ( * parse_named_requirement ( requirement_string ) )
36
40
except ParseException as e :
37
- raise InvalidRequirement (
38
- f'Parse error at "{ requirement_string [e .loc : e .loc + 8 ]!r} ": { e .msg } '
39
- )
41
+ raise InvalidRequirement (str (e ))
40
42
41
43
self .name : str = req .name
42
44
if req .url :
@@ -51,9 +53,12 @@ def __init__(self, requirement_string: str) -> None:
51
53
self .url : TOptional [str ] = req .url
52
54
else :
53
55
self .url = None
54
- self .extras : Set [str ] = set (req .extras . asList () if req .extras else [])
56
+ self .extras : Set [str ] = set (req .extras if req .extras else [])
55
57
self .specifier : SpecifierSet = SpecifierSet (req .specifier )
56
- self .marker : TOptional [Marker ] = req .marker if req .marker else None
58
+ try :
59
+ self .marker : TOptional [Marker ] = Marker (req .marker ) if req .marker else None
60
+ except InvalidMarker as e :
61
+ raise InvalidRequirement (str (e ))
57
62
58
63
def __str__ (self ) -> str :
59
64
parts : List [str ] = [self .name ]
0 commit comments