Package expressions are strings representing a software package. They are defined by this EBNF grammar:
package_expression ::= name '-' version_expression dependency*
name ::= [A-Za-z0-9][-A-Za-z0-9]*
dependency ::= ';' 'depends' requirement_expression
requirement_expression ::= name build_options? constraints_expression?
build_options ::= '[' name (',' name)* ']'
constraints_expression ::= constraint_expression (',' constraint_expression)*
constraint_expression ::= operator version_expression
operator ::= '==' | '!=' | '>' | '<' | '<=' | '>='
version_expression ::= main | main '-' prerelease | main '+' build_metadata | main '-' prerelease '+' build_metadata
main ::= major ('.' minor ('.' patch)?)?
major ::= number
minor ::= number
patch ::= number
prerelease ::= string | number
build_metadata ::= string
number ::= [0-9]+
string ::= [0-9a-zA-Z.-]+
The Package.parse() class method parses package expressions into corresponding Package objects:
>>> from versions import Package
>>> p = Package.parse('foo-1.0')
>>> p.name
'foo'
>>> p.version
Version.parse('1.0.0')
Dependencies can also be specified in a package expression:
>>> package = Package.parse('foo-1.0; depends bar; depends baz >1, <2')
>>> package.dependencies
set([Requirement.parse('baz>1.0.0,<2.0.0'), Requirement.parse('bar')])