[Distutils] FINAL DRAFT: Dependency specifier PEP
Robert Collins
robertc at robertcollins.net
Tue Nov 17 15:51:31 EST 2015
Addressed along with some minor quirks and github feedback.
diff --git a/dependency-specification.rst b/dependency-specification.rst
index a9953ed..8a632ba 100644
--- a/dependency-specification.rst
+++ b/dependency-specification.rst
@@ -18,7 +18,7 @@ Abstract
This PEP specifies the language used to describe dependencies for packages.
It draws a border at the edge of describing a single dependency - the
different sorts of dependencies and when they should be installed is a higher
-level problem. The intent is provide a building block for higher layer
+level problem. The intent is to provide a building block for higher layer
specifications.
The job of a dependency is to enable tools like pip [#pip]_ to find the right
@@ -85,7 +85,7 @@ Versions may be specified according to the PEP-440
[#pep440]_ rules. (Note:
URI is defined in std-66 [#std66]_::
version_cmp = wsp* '<' | '<=' | '!=' | '==' | '>=' | '>' | '~=' | '==='
- version = wsp* ( letterOrDigit | '-' | '_' | '.' | '*' )+
+ version = wsp* ( letterOrDigit | '-' | '_' | '.' | '*' | '+' | '!' )+
version_one = version_cmp version wsp*
version_many = version_one (wsp* ',' version_one)*
versionspec = ( '(' version_many ')' ) | version_many
@@ -94,7 +94,7 @@ URI is defined in std-66 [#std66]_::
Environment markers allow making a specification only take effect in some
environments::
- marker_op = version_cmp | 'in' | 'not' wsp+ 'in'
+ marker_op = version_cmp | (wsp* 'in') | (wsp* 'not' wsp+ 'in')
python_str_c = (wsp | letter | digit | '(' | ')' | '.' | '{' | '}' |
'-' | '_' | '*')
dquote = '"'
@@ -108,10 +108,14 @@ environments::
'implementation_name' | 'implementation_version' |
'extra' # ONLY when defined by a containing layer
)
- marker_var = env_var | python_str
- marker_expr = ('(' wsp* marker wsp* ')'
- | (marker_var wsp* marker_op wsp* marker_var))
- marker = wsp* marker_expr ( wsp* ('and' | 'or') wsp* marker_expr)*
+ marker_var = wsp* (env_var | python_str)
+ marker_expr = marker_var marker_op marker_var
+ | wsp* '(' marker wsp* ')'
+ marker_and = marker_expr wsp* 'and' marker_expr
+ | marker_expr
+ marker_or = marker_and wsp* 'or' marker_and
+ | marker_and
+ marker = marker_or
quoted_marker = ';' wsp* marker
Optional components of a distribution may be specified using the extras
@@ -304,7 +308,7 @@ The ``implementation_version`` marker variable is
derived from
Backwards Compatibility
=======================
-Most of this PEP is already widely deployed and thus offers no compatibiltiy
+Most of this PEP is already widely deployed and thus offers no compatibility
concerns.
There are however a few points where the PEP differs from the deployed base.
@@ -355,7 +359,7 @@ The complete parsley grammar::
version_many = version_one:v1 (wsp* ',' version_one)*:v2 -> [v1] + v2
versionspec = ('(' version_many:v ')' ->v) | version_many
urlspec = '@' wsp* <URI_reference>
- marker_op = version_cmp | 'in' | 'not' wsp+ 'in'
+ marker_op = version_cmp | (wsp* 'in') | (wsp* 'not' wsp+ 'in')
python_str_c = (wsp | letter | digit | '(' | ')' | '.' | '{' | '}' |
'-' | '_' | '*' | '#')
dquote = '"'
@@ -369,12 +373,14 @@ The complete parsley grammar::
'implementation_name' | 'implementation_version' |
'extra' # ONLY when defined by a containing layer
):varname -> lookup(varname)
- marker_var = env_var | python_str
- marker_expr = (("(" wsp* marker:m wsp* ")" -> m)
- | ((marker_var:l wsp* marker_op:o wsp* marker_var:r))
- -> (l, o, r))
- marker = (wsp* marker_expr:m ( wsp* ("and" | "or"):o wsp*
- marker_expr:r -> (o, r))*:ms -> (m, ms))
+ marker_var = wsp* (env_var | python_str)
+ marker_expr = marker_var:l marker_op:o marker_var:r -> (o, l, r)
+ | wsp* '(' marker:m wsp* ')' -> m
+ marker_and = marker_expr:l wsp* 'and' marker_expr:r -> ('and', l, r)
+ | marker_expr:m -> m
+ marker_or = marker_and:l wsp* 'or' marker_and:r -> ('or', l, r)
+ | marker_and:m -> m
+ marker = marker_or
quoted_marker = ';' wsp* marker
identifier = <letterOrDigit (
letterOrDigit |
@@ -469,8 +475,15 @@ A test program - if the grammar is in a string
``grammar``::
"name>=3,<2",
"name [fred,bar] @ http://foo.com ; python_version=='2.7'",
"name[quux, strange];python_version<'2.7' and platform_version=='2'",
- "name; os_name=='dud' and (os_name=='odd' or os_name=='fred')",
- "name; os_name=='dud' and os_name=='odd' or os_name=='fred'",
+ "name; os_name=='a' or os_name=='b'",
+ # Should parse as (a and b) or c
+ "name; os_name=='a' and os_name=='b' or os_name=='c'",
+ # Overriding precedence -> a and (b or c)
+ "name; os_name=='a' and (os_name=='b' or os_name=='c')",
+ # should parse as a or (b and c)
+ "name; os_name=='a' or os_name=='b' and os_name=='c'",
+ # Overriding precedence -> (a or b) and c
+ "name; (os_name=='a' or os_name=='b') and os_name=='c'",
]
def format_full_version(info):
@@ -502,8 +515,8 @@ A test program - if the grammar is in a string ``grammar``::
compiled = makeGrammar(grammar, {'lookup': bindings.__getitem__})
for test in tests:
- parsed = compiled(test).specification()
- print(parsed)
+ parsed = compiled(test).specification()
+ print("%s -> %s" % (test, parsed))
References
==========
On 17 November 2015 at 16:59, Robert Collins <robertc at robertcollins.net> wrote:
> On 17 November 2015 at 16:37, Nathaniel Smith <njs at pobox.com> wrote:
>
> Blah. Shall address.
>
> -Rob
>
>>
>> --
>> Nathaniel J. Smith -- http://vorpus.org
>
>
>
> --
> Robert Collins <rbtcollins at hp.com>
> Distinguished Technologist
> HP Converged Cloud
--
Robert Collins <rbtcollins at hp.com>
Distinguished Technologist
HP Converged Cloud
More information about the Distutils-SIG
mailing list