def get_reqs(extra=None): for req in run_requires: req_, sep, marker = req.rpartition(';') if not sep: yield req elif interpret(marker, {'extra': extra}): yield req_.rstrip()
def parse_from_toml( cls, dep_name: str, dep_metadata: Union[str, InlineTable]) -> 'VersionedDependency': if isinstance(dep_metadata, str): return VersionedDependency(dep_name, dep_metadata) version = dep_metadata['version'] markers = None if 'markers' in dep_metadata: markers = dep_metadata['markers'] try: interpret(markers) except SyntaxError as e: raise InvalidEnvironmentMarkers(e.args[0]) return VersionedDependency(dep_name, version, markers=markers)
def get_reqs(extra=None): for req in run_requires: assert isinstance(req, text_type) req_, sep, marker = req.rpartition(';') if not sep: yield req elif interpret(marker.lstrip(), {'extra': extra}): yield req_.rstrip()
def requires(self): requires = [] for extra in chain([None], self.wheel_metadata.extras): reqs = [] for req in self.wheel_metadata.run_requires: if req.get('extra') == extra: marker = req.get('environment') if not marker or interpret(marker): reqs.extend(req['requires']) if reqs: requires.append((extra, reqs)) return requires
def _get_requires_json(wheel_metadata): """ Compute requirements, grouped by extra. This expects wheel_metadata.run_requires to be in the JSON format as described at https://www.python.org/dev/peps/pep-0426/#dependencies """ by_extra = defaultdict(set) for req in wheel_metadata.run_requires: extra = req.get('extra') marker = req.get('environment') if not marker or interpret(marker): by_extra[extra].update(req['requires']) for extra in sorted(by_extra.keys(), key=lambda extra: (extra is not None, extra)): yield extra, sorted(by_extra[extra])
def test_interpret(self): sys_platform = sys.platform version = sys.version.split()[0] os_name = os.name platform_version = platform.version() platform_machine = platform.machine() platform_python_implementation = python_implementation() self.assertTrue(interpret("sys_platform == '%s'" % sys_platform)) self.assertTrue(interpret( "sys_platform == '%s' and python_full_version == '%s'" % (sys_platform, version))) self.assertTrue(interpret("'%s' == sys_platform" % sys_platform)) self.assertTrue(interpret('os_name == "%s"' % os_name)) self.assertTrue(interpret( 'platform_version == "%s" and platform_machine == "%s"' % (platform_version, platform_machine))) self.assertTrue(interpret('platform_python_implementation == "%s"' % platform_python_implementation)) self.assertTrue(interpret('platform_in_venv == "%s"' % in_venv())) # stuff that need to raise a syntax error ops = ('os_name == 2', "'2' == '2'", 'okpjonon', '', 'os_name ==', 'python_version == 2.4') for op in ops: self.assertRaises(SyntaxError, interpret, op) # combined operations OP = 'os_name == "%s"' % os_name FALSEOP = 'os_name == "buuuu"' AND = ' and ' OR = ' or ' self.assertTrue(interpret(OP + AND + OP)) self.assertTrue(interpret(OP + AND + OP + AND + OP)) self.assertTrue(interpret(OP + OR + OP)) self.assertTrue(interpret(OP + OR + FALSEOP)) self.assertTrue(interpret(OP + OR + OP + OR + FALSEOP)) self.assertTrue(interpret(OP + OR + FALSEOP + OR + FALSEOP)) self.assertTrue(interpret(FALSEOP + OR + OP)) self.assertFalse(interpret(FALSEOP + AND + FALSEOP)) self.assertFalse(interpret(FALSEOP + OR + FALSEOP)) # other operators self.assertTrue(interpret("os_name != 'buuuu'")) self.assertTrue(interpret("python_version > '1.0'")) self.assertTrue(interpret("python_version < '5.0'")) self.assertTrue(interpret("python_version <= '5.0'")) self.assertTrue(interpret("python_version >= '1.0'")) self.assertTrue(interpret("'%s' in os_name" % os_name)) self.assertTrue(interpret("'buuuu' not in os_name")) self.assertTrue(interpret( "'buuuu' not in os_name and '%s' in os_name" % os_name)) # execution context self.assertTrue(interpret('python_version == "0.1"', {'python_version': '0.1'})) # parentheses and extra if sys.platform != 'win32': relop = '!=' else: relop = '==' expression = ("(sys_platform %s 'win32' or python_version == '2.4') " "and extra == 'quux'" % relop) self.assertTrue(interpret(expression, {'extra': 'quux'}))
def test_interpret(self): sys_platform = sys.platform version = sys.version.split()[0] os_name = os.name platform_version = platform.version() platform_machine = platform.machine() platform_python_implementation = python_implementation() self.assertTrue(interpret("sys_platform == '%s'" % sys_platform)) self.assertTrue( interpret("sys_platform == '%s' and python_full_version == '%s'" % (sys_platform, version))) self.assertTrue(interpret("'%s' == sys_platform" % sys_platform)) self.assertTrue(interpret('os_name == "%s"' % os_name)) self.assertTrue( interpret('platform_version == "%s" and platform_machine == "%s"' % (platform_version, platform_machine))) self.assertTrue( interpret('platform_python_implementation == "%s"' % platform_python_implementation)) self.assertTrue(interpret('platform_in_venv == "%s"' % in_venv())) # stuff that need to raise a syntax error ops = ('os_name == 2', "'2' == '2'", 'okpjonon', '', 'os_name ==', 'python_version == 2.4') for op in ops: self.assertRaises(SyntaxError, interpret, op) # combined operations OP = 'os_name == "%s"' % os_name FALSEOP = 'os_name == "buuuu"' AND = ' and ' OR = ' or ' self.assertTrue(interpret(OP + AND + OP)) self.assertTrue(interpret(OP + AND + OP + AND + OP)) self.assertTrue(interpret(OP + OR + OP)) self.assertTrue(interpret(OP + OR + FALSEOP)) self.assertTrue(interpret(OP + OR + OP + OR + FALSEOP)) self.assertTrue(interpret(OP + OR + FALSEOP + OR + FALSEOP)) self.assertTrue(interpret(FALSEOP + OR + OP)) self.assertFalse(interpret(FALSEOP + AND + FALSEOP)) self.assertFalse(interpret(FALSEOP + OR + FALSEOP)) # other operators self.assertTrue(interpret("os_name != 'buuuu'")) self.assertTrue(interpret("python_version > '1.0'")) self.assertTrue(interpret("python_version < '5.0'")) self.assertTrue(interpret("python_version <= '5.0'")) self.assertTrue(interpret("python_version >= '1.0'")) self.assertTrue(interpret("'%s' in os_name" % os_name)) self.assertTrue(interpret("'buuuu' not in os_name")) self.assertTrue(interpret("'buu' in os_name", {'os_name': 'buuu'})) self.assertTrue( interpret("'buuuu' not in os_name and '%s' in os_name" % os_name)) # execution context self.assertTrue( interpret('python_version == "0.1"', {'python_version': '0.1'})) # parentheses and extra if sys.platform != 'win32': relop = '!=' else: relop = '==' expression = ("(sys_platform %s 'win32' or python_version == '2.4') " "and extra == 'quux'" % relop) self.assertTrue(interpret(expression, {'extra': 'quux'}))