def app_get_index(all_version=False): """ return the index of available applications on the channels By default only the latest version of each app is included in the result, unless all_version is set to True. """ import sys pyxx = 'py%d%d' % sys.version_info[:2] def filter_build(build): return bool(pyxx in build) if 'py' in build else True index = {fn: info for fn, info in iteritems(get_index()) if info.get('type') == 'app' and filter_build(info['build'])} if all_version: return index d = defaultdict(list) # name -> list of Package objects for fn, info in iteritems(index): d[_name_fn(fn)].append(Package(fn, info)) res = {} for pkgs in itervalues(d): pkg = max(pkgs) res[pkg.fn] = index[pkg.fn] return res
def test_get_index_no_platform_with_offline_cache(self): import conda.core.subdir_data with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', reset_context): with patch.object(conda.core.subdir_data, 'read_mod_and_etag') as read_mod_and_etag: read_mod_and_etag.return_value = {} channel_urls = ('https://repo.continuum.io/pkgs/pro',) with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', reset_context): this_platform = context.subdir index = get_index(channel_urls=channel_urls, prepend=False) for dist, record in iteritems(index): assert platform_in_record(this_platform, record), (this_platform, record.url) # When unknown=True (which is implicity engaged when context.offline is # True), there may be additional items in the cache that are included in # the index. But where those items coincide with entries already in the # cache, they must not change the record in any way. TODO: add one or # more packages to the cache so these tests affirmatively exercise # supplement_index_from_cache on CI? for unknown in (None, False, True): with env_var('CONDA_OFFLINE', 'yes', reset_context): with patch.object(conda.core.subdir_data, 'fetch_repodata_remote_request') as remote_request: index2 = get_index(channel_urls=channel_urls, prepend=False, unknown=unknown) assert all(index2.get(k) == rec for k, rec in iteritems(index)) assert unknown is not False or len(index) == len(index2) assert remote_request.call_count == 0 for unknown in (False, True): with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', reset_context): with patch.object(conda.core.subdir_data, 'fetch_repodata_remote_request') as remote_request: remote_request.side_effect = Response304ContentUnchanged() index3 = get_index(channel_urls=channel_urls, prepend=False, unknown=unknown) assert all(index3.get(k) == rec for k, rec in iteritems(index)) assert unknown or len(index) == len(index3)
def test_get_index_no_platform_with_offline_cache(self): import conda.core.subdir_data with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', stack_callback=conda_tests_ctxt_mgmt_def_pol): with patch.object(conda.core.subdir_data, 'read_mod_and_etag') as read_mod_and_etag: read_mod_and_etag.return_value = {} channel_urls = ('https://repo.anaconda.com/pkgs/pro',) with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', stack_callback=conda_tests_ctxt_mgmt_def_pol): this_platform = context.subdir index = get_index(channel_urls=channel_urls, prepend=False) for dist, record in iteritems(index): assert platform_in_record(this_platform, record), (this_platform, record.url) # When unknown=True (which is implicity engaged when context.offline is # True), there may be additional items in the cache that are included in # the index. But where those items coincide with entries already in the # cache, they must not change the record in any way. TODO: add one or # more packages to the cache so these tests affirmatively exercise # supplement_index_from_cache on CI? for unknown in (None, False, True): with env_var('CONDA_OFFLINE', 'yes', stack_callback=conda_tests_ctxt_mgmt_def_pol): with patch.object(conda.core.subdir_data, 'fetch_repodata_remote_request') as remote_request: index2 = get_index(channel_urls=channel_urls, prepend=False, unknown=unknown) assert all(index2.get(k) == rec for k, rec in iteritems(index)) assert unknown is not False or len(index) == len(index2) assert remote_request.call_count == 0 for unknown in (False, True): with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', stack_callback=conda_tests_ctxt_mgmt_def_pol): with patch.object(conda.core.subdir_data, 'fetch_repodata_remote_request') as remote_request: remote_request.side_effect = Response304ContentUnchanged() index3 = get_index(channel_urls=channel_urls, prepend=False, unknown=unknown) assert all(index3.get(k) == rec for k, rec in iteritems(index)) assert unknown or len(index) == len(index3)
def add_feature_records(index): all_features = defaultdict(set) for rec in itervalues(index): for k, v in iteritems(rec.requires_features): all_features[k].add(v) for k, v in iteritems(rec.provides_features): all_features[k].add(v) for feature_name, feature_values in iteritems(all_features): for feature_value in feature_values: rec = make_feature_record(feature_name, feature_value) index[Dist(rec)] = rec
def get_index(channel_urls=(), prepend=True, platform=None, use_cache=False, unknown=False, offline=False, prefix=None): """ Return the index of packages available on the channels If prepend=False, only the channels passed in as arguments are used. If platform=None, then the current platform is used. If prefix is supplied, then the packages installed in that prefix are added. """ channel_urls = config.normalize_urls(channel_urls, platform=platform) if prepend: channel_urls += config.get_channel_urls(platform=platform) if offline: channel_urls = [url for url in channel_urls if url.startswith('file:')] index = fetch_index(tuple(channel_urls), use_cache=use_cache, unknown=unknown) if prefix: for dist, info in iteritems(install.linked_data(prefix)): fn = dist + '.tar.bz2' if fn not in index: # only if the package in not in the repodata, use local # conda-meta (with 'depends' defaulting to []) info.setdefault('depends', []) index[fn] = info return index
def test_circular_dependencies(): index2 = index.copy() index2['package1-1.0-0.tar.bz2'] = Record(**{ 'build': '0', 'build_number': 0, 'depends': ['package2'], 'name': 'package1', 'requires': ['package2'], 'version': '1.0', }) index2['package2-1.0-0.tar.bz2'] = Record(**{ 'build': '0', 'build_number': 0, 'depends': ['package1'], 'name': 'package2', 'requires': ['package1'], 'version': '1.0', }) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) assert set(r.find_matches(MatchSpec('package1'))) == { Dist('package1-1.0-0.tar.bz2'), } assert set(r.get_reduced_index(['package1']).keys()) == { Dist('package1-1.0-0.tar.bz2'), Dist('package2-1.0-0.tar.bz2'), } assert r.install(['package1']) == r.install(['package2']) == \ r.install(['package1', 'package2']) == [ Dist('package1-1.0-0.tar.bz2'), Dist('package2-1.0-0.tar.bz2'), ]
def test_get_index_no_platform_with_offline_cache(self): import conda.core.index with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', reset_context): with patch.object(conda.core.index, 'read_mod_and_etag') as read_mod_and_etag: read_mod_and_etag.return_value = {} channel_urls = ('https://repo.continuum.io/pkgs/pro', ) with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', reset_context): this_platform = context.subdir index = get_index(channel_urls=channel_urls, prepend=False) for dist, record in iteritems(index): assert platform_in_record(this_platform, record), (this_platform, record.url) with env_var('CONDA_OFFLINE', 'yes', reset_context): with patch.object( conda.core.index, 'fetch_repodata_remote_request') as remote_request: index2 = get_index(channel_urls=channel_urls, prepend=False) assert index2 == index assert remote_request.call_count == 0 with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', reset_context): with patch.object( conda.core.index, 'fetch_repodata_remote_request') as remote_request: remote_request.side_effect = Response304ContentUnchanged() index3 = get_index(channel_urls=channel_urls, prepend=False) assert index3 == index
def __enter__(self): from pexpect.popen_spawn import PopenSpawn cwd = os.getcwd() env = os.environ.copy() env['PATH'] = self.activator.pathsep_join( self.activator.path_conversion( concatv( self.activator._get_path_dirs(join(cwd, 'shell')), (dirname(sys.executable), ), self.activator._get_starting_path_list(), ))) env['PYTHONPATH'] = CONDA_PACKAGE_ROOT env = {str(k): str(v) for k, v in iteritems(env)} p = PopenSpawn(self.shell_name, timeout=6, maxread=2000, searchwindowsize=None, logfile=sys.stdout, cwd=cwd, env=env, encoding=None, codec_errors='strict') if self.init_command: p.sendline(self.init_command) self.p = p return self
def test_channel_priority(): fn1 = 'pandas-0.10.1-np17py27_0.tar.bz2' fn2 = 'other::' + fn1 spec = ['pandas', 'python 2.7*'] index2 = index.copy() index2[Dist(fn2)] = index2[Dist(fn1)].copy() index2 = {Dist(key): value for key, value in iteritems(index2)} r2 = Resolve(index2) rec = r2.index[Dist(fn2)] os.environ['CONDA_CHANNEL_PRIORITY'] = 'True' reset_context(()) rec['priority'] = 0 # Should select the "other", older package because it # has a lower channel priority number installed1 = r2.install(spec) # Should select the newer package because now the "other" # package has a higher priority number rec['priority'] = 2 installed2 = r2.install(spec) # Should also select the newer package because we have # turned off channel priority altogether os.environ['CONDA_CHANNEL_PRIORITY'] = 'False' reset_context(()) rec['priority'] = 0 installed3 = r2.install(spec) assert installed1 != installed2 assert installed1 != installed3 assert installed2 == installed3
def test_install_package_with_feature(): index2 = index.copy() index2['mypackage-1.0-featurepy33_0.tar.bz2'] = IndexRecord( **{ "channel": "defaults", "subdir": context.subdir, "md5": "0123456789", "fn": "doesnt-matter-here", 'build': 'featurepy33_0', 'build_number': 0, 'depends': ['python 3.3*'], 'name': 'mypackage', 'version': '1.0', 'features': 'feature', }) index2['feature-1.0-py33_0.tar.bz2'] = IndexRecord( **{ "channel": "defaults", "subdir": context.subdir, "md5": "0123456789", "fn": "doesnt-matter-here", 'build': 'py33_0', 'build_number': 0, 'depends': ['python 3.3*'], 'name': 'feature', 'version': '1.0', 'track_features': 'feature', }) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) # It should not raise r.install(['mypackage', 'feature 1.0'])
def test_circular_dependencies(): index2 = index.copy() index2['package1-1.0-0.tar.bz2'] = IndexRecord(**{ 'build': '0', 'build_number': 0, 'depends': ['package2'], 'name': 'package1', 'requires': ['package2'], 'version': '1.0', }) index2['package2-1.0-0.tar.bz2'] = IndexRecord(**{ 'build': '0', 'build_number': 0, 'depends': ['package1'], 'name': 'package2', 'requires': ['package1'], 'version': '1.0', }) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) assert set(r.find_matches(MatchSpec('package1'))) == { Dist('package1-1.0-0.tar.bz2'), } assert set(r.get_reduced_index(['package1']).keys()) == { Dist('package1-1.0-0.tar.bz2'), Dist('package2-1.0-0.tar.bz2'), } assert r.install(['package1']) == r.install(['package2']) == \ r.install(['package1', 'package2']) == [ Dist('package1-1.0-0.tar.bz2'), Dist('package2-1.0-0.tar.bz2'), ]
def test_install_package_with_feature(): index2 = index.copy() index2['mypackage-1.0-featurepy33_0.tar.bz2'] = IndexRecord( **{ 'build': 'featurepy33_0', 'build_number': 0, 'depends': ['python 3.3*'], 'name': 'mypackage', 'version': '1.0', 'features': 'feature', }) index2['feature-1.0-py33_0.tar.bz2'] = IndexRecord( **{ 'build': 'py33_0', 'build_number': 0, 'depends': ['python 3.3*'], 'name': 'feature', 'version': '1.0', 'track_features': 'feature', }) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) # It should not raise r.install(['mypackage', 'feature 1.0'])
def test_channel_priority(): fn1 = 'pandas-0.10.1-np17py27_0.tar.bz2' fn2 = 'other::' + fn1 spec = ['pandas', 'python 2.7*'] index2 = index.copy() index2[Dist(fn2)] = index2[Dist(add_defaults_if_no_channel(fn1))].copy() index2 = {Dist(key): value for key, value in iteritems(index2)} r2 = Resolve(index2) rec = r2.index[Dist(fn2)] os.environ['CONDA_CHANNEL_PRIORITY'] = 'True' reset_context(()) r2.index[Dist(fn2)] = IndexRecord.from_objects(r2.index[Dist(fn2)], priority=0) # Should select the "other", older package because it # has a lower channel priority number installed1 = r2.install(spec) # Should select the newer package because now the "other" # package has a higher priority number r2.index[Dist(fn2)] = IndexRecord.from_objects(r2.index[Dist(fn2)], priority=2) installed2 = r2.install(spec) # Should also select the newer package because we have # turned off channel priority altogether os.environ['CONDA_CHANNEL_PRIORITY'] = 'False' reset_context(()) r2.index[Dist(fn2)] = IndexRecord.from_objects(r2.index[Dist(fn2)], priority=0) installed3 = r2.install(spec) assert installed1 != installed2 assert installed1 != installed3 assert installed2 == installed3
def __init__(self, shell_name): self.shell_name = shell_name base_shell = self.shells[shell_name].get('base_shell') shell_vals = self.shells.get(base_shell, {}) shell_vals.update(self.shells[shell_name]) for key, value in iteritems(shell_vals): setattr(self, key, value) self.activator = Activator(shell_vals['activator'])
def test_context_parameters_have_descriptions(self): skip_categories = ('CLI-only', 'Hidden and Undocumented') documented_parameter_names = chain.from_iterable( (parameter_names for category, parameter_names in iteritems(context.category_map) if category not in skip_categories)) from pprint import pprint for name in documented_parameter_names: description = context.get_descriptions()[name] pprint(context.describe_parameter(name))
def LB_Preprocess_(self, equation): if type(equation) is dict: equation = [(c, self.varnum(a)) for a, c in iteritems(equation)] if any(c <= 0 or type(a) is bool for c, a in equation): offset = sum(c for c, a in equation if a is True or a is not False and c <= 0) equation = [(c, a) if c > 0 else (-c, -a) for c, a in equation if type(a) is not bool and c] else: offset = 0 equation = sorted(equation) return equation, offset
def test_context_parameters_have_descriptions(self): skip_categories = ('CLI-only', 'Hidden and Undocumented') documented_parameter_names = chain.from_iterable(( parameter_names for category, parameter_names in iteritems(context.category_map) if category not in skip_categories )) from pprint import pprint for name in documented_parameter_names: description = context.get_descriptions()[name] pprint(context.describe_parameter(name))
def test_multiple_solution(): index2 = index.copy() fn = 'pandas-0.11.0-np16py27_1.tar.bz2' res1 = set([fn]) for k in range(1,15): fn2 = Dist('%s_%d.tar.bz2'%(fn[:-8],k)) index2[fn2] = index[Dist(add_defaults_if_no_channel(fn))] res1.add(fn2) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) res = r.solve(['pandas', 'python 2.7*', 'numpy 1.6*'], returnall=True) res = set([y for x in res for y in x if r.package_name(y).startswith('pandas')]) assert len(res) <= len(res1)
def test_multiple_solution(): index2 = index.copy() fn = 'pandas-0.11.0-np16py27_1.tar.bz2' res1 = set([fn]) for k in range(1,15): fn2 = Dist('%s_%d.tar.bz2'%(fn[:-8],k)) index2[fn2] = index[Dist(fn)] res1.add(fn2) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) res = r.solve(['pandas', 'python 2.7*', 'numpy 1.6*'], returnall=True) res = set([y for x in res for y in x if r.package_name(y).startswith('pandas')]) assert len(res) <= len(res1)
def test_LinearBound(): L = [ ([], [0, 1], 10), ([], [1, 2], 10), ({'x1': 2, 'x2': 2}, [3, 3], 10), ({'x1': 2, 'x2': 2}, [0, 1], 1000), ({'x1': 1, 'x2': 2}, [0, 2], 1000), ({'x1': 2, '!x2': 2}, [0, 2], 1000), ([(1, 1), (2, 2), (3, 3)], [3, 3], 1000), ([(0, 1), (1, 2), (2, 3), (0, 4), (1, 5), (0, 6), (1, 7)], [0, 2], 1000), ([(0, 1), (1, 2), (2, 3), (0, 4), (1, 5), (0, 6), (1, 7), (3, FALSE), (2, TRUE)], [2, 4], 1000), ([(1, 15), (2, 16), (3, 17), (4, 18), (5, 6), (5, 19), (6, 7), (6, 20), (7, 8), (7, 21), (7, 28), (8, 9), (8, 22), (8, 29), (8, 41), (9, 10), (9, 23), (9, 30), (9, 42), (10, 1), (10, 11), (10, 24), (10, 31), (10, 34), (10, 37), (10, 43), (10, 46), (10, 50), (11, 2), (11, 12), (11, 25), (11, 32), (11, 35), (11, 38), (11, 44), (11, 47), (11, 51), (12, 3), (12, 4), (12, 5), (12, 13), (12, 14), (12, 26), (12, 27), (12, 33), (12, 36), (12, 39), (12, 40), (12, 45), (12, 48), (12, 49), (12, 52), (12, 53), (12, 54)], [192, 204], 100), ] for eq, rhs, max_iter in L: if isinstance(eq, dict): N = len(eq) else: N = max([0] + [a for c, a in eq if a != TRUE and a != FALSE]) C = Clauses(N) Cpos = Clauses(N) Cneg = Clauses(N) if isinstance(eq, dict): for k in range(1, N+1): nm = 'x%d' % k C.name_var(k, nm) Cpos.name_var(k, nm) Cneg.name_var(k, nm) eq2 = [(v, C.from_name(c)) for c, v in iteritems(eq)] else: eq2 = eq x = C.LinearBound(eq, rhs[0], rhs[1]) Cpos.Require(Cpos.LinearBound, eq, rhs[0], rhs[1]) Cneg.Prevent(Cneg.LinearBound, eq, rhs[0], rhs[1]) if x != FALSE: for _, sol in zip(range(max_iter), C.itersolve([] if x == TRUE else [(x,)], N)): assert rhs[0] <= my_EVAL(eq2, sol) <= rhs[1], C.as_list() if x != TRUE: for _, sol in zip(range(max_iter), C.itersolve([] if x == TRUE else [(C.Not(x),)], N)): assert not(rhs[0] <= my_EVAL(eq2, sol) <= rhs[1]), C.as_list() for _, sol in zip(range(max_iter), Cpos.itersolve([], N)): assert rhs[0] <= my_EVAL(eq2, sol) <= rhs[1], ('Cpos', Cpos.as_list()) for _, sol in zip(range(max_iter), Cneg.itersolve([], N)): assert not(rhs[0] <= my_EVAL(eq2, sol) <= rhs[1]), ('Cneg', Cneg.as_list())
def test_LinearBound(): L = [ ([], [0, 1], 10), ([], [1, 2], 10), ({'x1':2, 'x2':2}, [3, 3], 10), ({'x1':2, 'x2':2}, [0, 1], 1000), ({'x1':1, 'x2':2}, [0, 2], 1000), ({'x1':2, '!x2':2}, [0, 2], 1000), ([(1, 1), (2, 2), (3, 3)], [3, 3], 1000), ([(0, 1), (1, 2), (2, 3), (0, 4), (1, 5), (0, 6), (1, 7)], [0, 2], 1000), ([(0, 1), (1, 2), (2, 3), (0, 4), (1, 5), (0, 6), (1, 7), (3, False), (2, True)], [2, 4], 1000), ([(1, 15), (2, 16), (3, 17), (4, 18), (5, 6), (5, 19), (6, 7), (6, 20), (7, 8), (7, 21), (7, 28), (8, 9), (8, 22), (8, 29), (8, 41), (9, 10), (9, 23), (9, 30), (9, 42), (10, 1), (10, 11), (10, 24), (10, 31), (10, 34), (10, 37), (10, 43), (10, 46), (10, 50), (11, 2), (11, 12), (11, 25), (11, 32), (11, 35), (11, 38), (11, 44), (11, 47), (11, 51), (12, 3), (12, 4), (12, 5), (12, 13), (12, 14), (12, 26), (12, 27), (12, 33), (12, 36), (12, 39), (12, 40), (12, 45), (12, 48), (12, 49), (12, 52), (12, 53), (12, 54)], [192, 204], 100), ] for eq, rhs, max_iter in L: if isinstance(eq, dict): N = len(eq) else: N = max([0]+[a for c,a in eq if a is not True and a is not False]) C = Clauses(N) Cpos = Clauses(N) Cneg = Clauses(N) if isinstance(eq, dict): for k in range(1,N+1): nm = 'x%d'%k C.name_var(k, nm) Cpos.name_var(k, nm) Cneg.name_var(k, nm) eq2 = [(v,C.from_name(c)) for c,v in iteritems(eq)] else: eq2 = eq x = C.LinearBound(eq, rhs[0], rhs[1]) Cpos.Require(Cpos.LinearBound, eq, rhs[0], rhs[1]) Cneg.Prevent(Cneg.LinearBound, eq, rhs[0], rhs[1]) if x is not False: for _, sol in zip(range(max_iter), C.itersolve([] if x is True else [(x,)],N)): assert rhs[0] <= my_EVAL(eq2,sol) <= rhs[1], C.clauses if x is not True: for _, sol in zip(range(max_iter), C.itersolve([] if x is True else [(C.Not(x),)],N)): assert not(rhs[0] <= my_EVAL(eq2,sol) <= rhs[1]), C.clauses for _, sol in zip(range(max_iter), Cpos.itersolve([],N)): assert rhs[0] <= my_EVAL(eq2,sol) <= rhs[1], ('Cpos',Cpos.clauses) for _, sol in zip(range(max_iter), Cneg.itersolve([],N)): assert not(rhs[0] <= my_EVAL(eq2,sol) <= rhs[1]), ('Cneg',Cneg.clauses)
def test_optional_dependencies(): index2 = index.copy() index2['package1-1.0-0.tar.bz2'] = IndexRecord(**{ 'build': '0', 'build_number': 0, 'depends': ['package2 >1.0 (optional)'], 'name': 'package1', 'requires': ['package2'], 'version': '1.0', }) index2['package2-1.0-0.tar.bz2'] = IndexRecord(**{ 'build': '0', 'build_number': 0, 'depends': [], 'name': 'package2', 'requires': [], 'version': '1.0', }) index2['package2-2.0-0.tar.bz2'] = IndexRecord(**{ 'build': '0', 'build_number': 0, 'depends': [], 'name': 'package2', 'requires': [], 'version': '2.0', }) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) assert set(r.find_matches(MatchSpec('package1'))) == { Dist('package1-1.0-0.tar.bz2'), } assert set(r.get_reduced_index(['package1']).keys()) == { Dist('package1-1.0-0.tar.bz2'), Dist('package2-2.0-0.tar.bz2'), } assert r.install(['package1']) == [ Dist('package1-1.0-0.tar.bz2'), ] assert r.install(['package1', 'package2']) == r.install(['package1', 'package2 >1.0']) == [ Dist('package1-1.0-0.tar.bz2'), Dist('package2-2.0-0.tar.bz2'), ] assert raises(UnsatisfiableError, lambda: r.install(['package1', 'package2 <2.0'])) assert raises(UnsatisfiableError, lambda: r.install(['package1', 'package2 1.0']))
def run_conda_command(*args): # used in tests_config (31 times) and test_info (6 times) env = {str(k): str(v) for k, v in iteritems(os.environ)} p = subprocess.Popen((sys.executable, "-m", "conda") + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) stdout, stderr = [stream.strip() .decode('utf-8') .replace('\r\n', '\n') .replace('\\\\', '\\') .replace("Using Anaconda API: https://api.anaconda.org\n", "") for stream in p.communicate()] print(stdout) print(stderr, file=sys.stderr) # assert p.returncode == 0, p.returncode if args[0] == 'config': reset_context([args[2]]) return stdout, strip_expected(stderr)
def run_conda_command(*args): # used in tests_config (31 times) and test_info (6 times) # anything that uses this function is an integration test env = {str(k): str(v) for k, v in iteritems(os.environ)} p = subprocess.Popen((sys.executable, "-m", "conda") + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) stdout, stderr = [stream.strip() .decode('utf-8') .replace('\r\n', '\n') .replace('\\\\', '\\') .replace("Using Anaconda API: https://api.anaconda.org\n", "") for stream in p.communicate()] print(stdout) print(stderr, file=sys.stderr) # assert p.returncode == 0, p.returncode if args[0] == 'config': reset_context([args[2]]) return stdout, strip_expected(stderr)
def test_circular_dependencies(): index2 = index.copy() index2['package1-1.0-0.tar.bz2'] = IndexRecord( **{ "channel": "defaults", "subdir": context.subdir, "md5": "0123456789", "fn": "doesnt-matter-here", 'build': '0', 'build_number': 0, 'depends': ['package2'], 'name': 'package1', 'requires': ['package2'], 'version': '1.0', }) index2['package2-1.0-0.tar.bz2'] = IndexRecord( **{ "channel": "defaults", "subdir": context.subdir, "md5": "0123456789", "fn": "doesnt-matter-here", 'build': '0', 'build_number': 0, 'depends': ['package1'], 'name': 'package2', 'requires': ['package1'], 'version': '1.0', }) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) assert set(r.find_matches(MatchSpec('package1'))) == { Dist('package1-1.0-0.tar.bz2'), } assert set(r.get_reduced_index(['package1']).keys()) == { Dist('package1-1.0-0.tar.bz2'), Dist('package2-1.0-0.tar.bz2'), } assert r.install(['package1']) == r.install(['package2']) == \ r.install(['package1', 'package2']) == [ Dist('package1-1.0-0.tar.bz2'), Dist('package2-1.0-0.tar.bz2'), ]
def supplement_index_with_repodata(index, repodata, channel, priority): repodata_info = repodata['info'] arch = repodata_info.get('arch') platform = repodata_info.get('platform') subdir = repodata_info.get('subdir') if not subdir: subdir = "%s-%s" % (repodata_info['platform'], repodata_info['arch']) auth = channel.auth for fn, info in iteritems(repodata['packages']): rec = PackageRecord.from_objects(info, fn=fn, arch=arch, platform=platform, channel=channel, subdir=subdir, # schannel=schannel, priority=priority, # url=join_url(channel_url, fn), auth=auth) index[rec] = rec
def test_get_index_no_platform_with_offline_cache(self): import conda.core.index with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', reset_context): with patch.object(conda.core.index, 'read_mod_and_etag') as read_mod_and_etag: read_mod_and_etag.return_value = {} channel_urls = ('https://repo.continuum.io/pkgs/pro',) with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', reset_context): this_platform = context.subdir index = get_index(channel_urls=channel_urls, prepend=False) for dist, record in iteritems(index): assert platform_in_record(this_platform, record), (this_platform, record.url) with env_var('CONDA_OFFLINE', 'yes', reset_context): with patch.object(conda.core.index, 'fetch_repodata_remote_request') as remote_request: index2 = get_index(channel_urls=channel_urls, prepend=False) assert index2 == index assert remote_request.call_count == 0 with env_var('CONDA_REPODATA_TIMEOUT_SECS', '0', reset_context): with patch.object(conda.core.index, 'fetch_repodata_remote_request') as remote_request: remote_request.side_effect = Response304ContentUnchanged() index3 = get_index(channel_urls=channel_urls, prepend=False) assert index3 == index
def test_install_package_with_feature(): index2 = index.copy() index2['mypackage-1.0-featurepy33_0.tar.bz2'] = Record(**{ 'build': 'featurepy33_0', 'build_number': 0, 'depends': ['python 3.3*'], 'name': 'mypackage', 'version': '1.0', 'features': 'feature', }) index2['feature-1.0-py33_0.tar.bz2'] = Record(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['python 3.3*'], 'name': 'feature', 'version': '1.0', 'track_features': 'feature', }) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) # It should not raise r.install(['mypackage','feature 1.0'])
def test_get_index_linux64_platform(self): linux64 = 'linux-64' index = get_index(platform=linux64) for dist, record in iteritems(index): assert platform_in_record(linux64, record), (linux64, record.url)
def minimize(self, objective, bestsol, trymax=False): """ Minimize the objective function given either by (coeff, integer) tuple pairs, or a dictionary of varname: coeff values. The actual minimization is multiobjective: first, we minimize the largest active coefficient value, then we minimize the sum. """ if not objective: log.debug('Empty objective, trivial solution') return bestsol, 0 elif self.unsat: log.debug('Constraints are unsatisfiable') return bestsol, sum(abs(c) for c, a in objective) + 1 if type(objective) is dict: objective = [(v, self.varnum(k)) for k, v in iteritems(objective)] objective, offset = self.LB_Preprocess_(objective) maxval = max(c for c, a in objective) def peak_val(sol, odict): return max(odict.get(s, 0) for s in sol) def sum_val(sol, odict): return sum(odict.get(s, 0) for s in sol) lo = 0 try0 = 0 for peak in ((True, False) if maxval > 1 else (False,)): if peak: log.debug('Beginning peak minimization') objval = peak_val else: log.debug('Beginning sum minimization') objval = sum_val odict = {a: c for c, a in objective} bestval = objval(bestsol, odict) # If we got lucky and the initial solution is optimal, we still # need to generate the constraints at least once hi = bestval m_orig = self.m nz = len(self.clauses) if trymax and not peak: try0 = hi - 1 log.debug("Initial range (%d,%d)" % (lo, hi)) while True: if try0 is None: mid = (lo+hi) // 2 else: mid = try0 if peak: self.Prevent(self.Any, tuple(a for c, a in objective if c > mid)) temp = tuple(a for c, a in objective if lo <= c <= mid) if temp: self.Require(self.Any, temp) else: self.Require(self.LinearBound, objective, lo, mid, False) log.debug('Bisection attempt: (%d,%d), (%d+%d) clauses' % (lo, mid, nz, len(self.clauses)-nz)) newsol = self.sat() if newsol is None: lo = mid + 1 log.debug("Bisection failure, new range=(%d,%d)" % (lo, hi)) # If this was a failure of the first test after peak minimization, # then it means that the peak minimizer is "tight" and we don't need # any further constraints. else: done = lo == mid bestsol = newsol bestval = objval(newsol, odict) hi = bestval log.debug("Bisection success, new range=(%d,%d)" % (lo, hi)) if done: break self.m = m_orig if len(self.clauses) > nz: self.clauses = self.clauses[:nz] self.unsat = False try0 = None log.debug('Final %s objective: %d' % ('peak' if peak else 'sum', bestval)) if bestval == 0: break elif peak: # Now that we've minimized the peak value, we can drop any terms # with coefficients larger than this. Furthermore, since we know # at least one peak will be active, our lower bound for the sum # equals the peak. objective = [(c, a) for c, a in objective if c <= bestval] try0 = sum_val(bestsol, odict) lo = bestval else: log.debug('New peak objective: %d' % peak_val(bestsol, odict)) return bestsol, bestval
def test_no_features(): # Without this, there would be another solution including 'scipy-0.11.0-np16py26_p3.tar.bz2'. assert r.install(['python 2.6*', 'numpy 1.6*', 'scipy 0.11*'], returnall=True) == [[Dist(add_defaults_if_no_channel(fname)) for fname in [ 'numpy-1.6.2-py26_4.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-2.6.8-6.tar.bz2', 'readline-6.2-0.tar.bz2', 'scipy-0.11.0-np16py26_3.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]] assert r.install(['python 2.6*', 'numpy 1.6*', 'scipy 0.11*', 'mkl@'], returnall=True) == [[Dist(add_defaults_if_no_channel(fname)) for fname in [ 'mkl-rt-11.0-p0.tar.bz2', # This, 'numpy-1.6.2-py26_p4.tar.bz2', # this, 'openssl-1.0.1c-0.tar.bz2', 'python-2.6.8-6.tar.bz2', 'readline-6.2-0.tar.bz2', 'scipy-0.11.0-np16py26_p3.tar.bz2', # and this are different. 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]] index2 = index.copy() index2["defaults::pandas-0.12.0-np16py27_0.tar.bz2"] = IndexRecord(**{ "build": "np16py27_0", "build_number": 0, "depends": [ "dateutil", "numpy 1.6*", "python 2.7*", "pytz" ], "name": "pandas", "requires": [ "dateutil 1.5", "numpy 1.6", "python 2.7", "pytz" ], "version": "0.12.0" }) # Make it want to choose the pro version by having it be newer. index2["defaults::numpy-1.6.2-py27_p5.tar.bz2"] = IndexRecord(**{ "build": "py27_p5", "build_number": 5, "depends": [ "mkl-rt 11.0", "python 2.7*" ], "features": "mkl", "name": "numpy", "pub_date": "2013-04-29", "requires": [ "mkl-rt 11.0", "python 2.7" ], "version": "1.6.2" }) index2 = {Dist(key): value for key, value in iteritems(index2)} r2 = Resolve(index2) # This should not pick any mkl packages (the difference here is that none # of the specs directly have mkl versions) assert r2.solve(['pandas 0.12.0 np16py27_0', 'python 2.7*'], returnall=True) == [[Dist(add_defaults_if_no_channel(fname)) for fname in [ 'dateutil-2.1-py27_1.tar.bz2', 'numpy-1.6.2-py27_4.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'pandas-0.12.0-np16py27_0.tar.bz2', 'python-2.7.5-0.tar.bz2', 'pytz-2013b-py27_0.tar.bz2', 'readline-6.2-0.tar.bz2', 'six-1.3.0-py27_0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]] assert r2.solve(['pandas 0.12.0 np16py27_0', 'python 2.7*', 'mkl@'], returnall=True)[0] == [[Dist(add_defaults_if_no_channel(fname)) for fname in [ 'dateutil-2.1-py27_1.tar.bz2', 'mkl-rt-11.0-p0.tar.bz2', # This 'numpy-1.6.2-py27_p5.tar.bz2', # and this are different. 'openssl-1.0.1c-0.tar.bz2', 'pandas-0.12.0-np16py27_0.tar.bz2', 'python-2.7.5-0.tar.bz2', 'pytz-2013b-py27_0.tar.bz2', 'readline-6.2-0.tar.bz2', 'six-1.3.0-py27_0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]][0]
def test_get_index_osx64_platform(self): osx64 = 'osx-64' index = get_index(platform=osx64) for dist, record in iteritems(index): assert platform_in_record(osx64, record), (osx64, record.url)
def bypass_satsolver_on_install( pkg_names, conda_channel="ggd-genomics", debug=False, prefix=None ): """Method to bypass the sat solver used by conda when a cached recipe is being installed bypass_satsolver_on_install ============================ This method is used to run the conda install steps to install a ggd aws cahced reicpe. The intsallation will skip the sat solver step, ignore packages that may be additionaly installed or uninstalled, and performs other steps in order to install the data package without using the sat solver. The majority of the work is still done by conda through the use of the conda module. This method should only be used when a cached recipe is being installed. Parameters: ----------- #1) pkg_name: The name of the ggd package to install. (Example: hg19-gaps) 1) pkg_names: A list of the names of the ggd packages to install. (Example: [hg19-gaps]) 2) conda_channel: The ggd conda channel that package is being installed from. (Example: ggd-genomics) """ # ------------------------------------------------------------------------- # import statments # ------------------------------------------------------------------------- from conda.base.context import context from conda.cli import common from conda.cli import install from conda.core.solve import Solver from conda.core.solve import SolverStateContainer from conda.common.io import Spinner from conda.core.link import PrefixSetup from conda.core.link import UnlinkLinkTransaction from argparse import Namespace from conda._vendor.boltons.setutils import IndexedSet from conda.models.prefix_graph import PrefixGraph from conda.core.solve import diff_for_unlink_link_precs from conda.common.compat import iteritems, itervalues, odict, text_type from conda._vendor.toolz import concat, concatv from conda.resolve import Resolve from conda.models.match_spec import MatchSpec from conda.base.constants import UpdateModifier from conda.common.io import ProgressBar from conda.gateways.logging import set_all_logger_level, set_conda_log_level from conda.gateways.logging import VERBOSITY_LEVELS from conda.gateways.logging import log from logging import ( DEBUG, ERROR, Filter, Formatter, INFO, StreamHandler, WARN, getLogger, ) import sys print( "\n:ggd:utils:bypass: Installing %s from the %s conda channel\n" % (", ".join(pkg_names), conda_channel) ) # ------------------------------------------------------------------------- # Nested functions # ------------------------------------------------------------------------- # def bypass_sat(package_name,ssc_object): ## Package_name will be used as a key def bypass_sat(package_names, ssc_object): ## Package_name will be used as a key """Method used to extract information during sat solving, but to bypass the sat solving step bypass_sat ========== This method is used to extract and process information that would have been done during the sat solvering step, (Solving Enviroment), bypass the sat solver, and return a filtered set of packages to install. Parameters: ----------- #1) package_name: The name of the package to extract. (This is the package that will be installed) 1) package_names: A list of package names of the packages to extract. (This is the package that will be installed) 2) ssc_object: A processed conda SolverStateContainer object. Returns: +++++++ 1) The updated ssc object based off the sat bypass and package filtering. """ ## From Solver.run_sat specs_map_set = set(itervalues(ssc_object.specs_map)) ## Get the specs from ssc filtered by the package name new_odict = odict( [(p_name, ssc_object.specs_map[p_name]) for p_name in package_names] ) final_environment_specs = IndexedSet( concatv( itervalues(new_odict), ssc_object.track_features_specs, ssc_object.pinned_specs, ) ) ## Run the resolve process and get info for desired package ssc_object.solution_precs = ssc_object.r.solve(tuple(final_environment_specs)) wanted_indices = [] for i, info in enumerate(ssc_object.solution_precs): for p_name in package_names: if p_name in ssc_object.solution_precs[i].namekey: wanted_indices.append(i) filtered_ssc_solution_precs = [ ssc_object.solution_precs[x] for x in wanted_indices ] ssc_object.solution_precs = filtered_ssc_solution_precs ## Add the final environment specs to ssc ssc_object.final_environment_specs = final_environment_specs return ssc_object # ------------------------------------------------------------------------- # Run install # ------------------------------------------------------------------------- ## Set the context.always_yes to True to bypass user input context.always_yes = True target_prefix = context.target_prefix if prefix == None else prefix # Setup solver object # solve = Solver(target_prefix, (conda_channel,u'default'), context.subdirs, [pkg_name]) solve = Solver( target_prefix, (conda_channel, u"default"), context.subdirs, pkg_names ) ## Create a solver state container ### Make sure to Freeze those packages already installed in the current env in order to bypass update checking. ssc = SolverStateContainer( prefix=target_prefix, update_modifier=UpdateModifier.FREEZE_INSTALLED, deps_modifier=context.deps_modifier, prune=True, ignore_pinned=context.ignore_pinned, force_remove=context.force_remove, should_retry_solve=False, ) ## Get channel metadata with Spinner( "Collecting package metadata", not context.verbosity and not context.quiet, context.json, ): ssc = solve._collect_all_metadata(ssc) ## Set specs map to an empty map. (No need to check other specs) add_spec = [] for p_name, spec in iteritems(ssc.specs_map): for pkg_name in pkg_names: if str(p_name) in pkg_name: add_spec.append((pkg_name, MatchSpec(pkg_name))) ssc.specs_map = odict(add_spec) ## Process the data in the solver state container with Spinner( "Processing data", not context.verbosity and not context.quiet, context.json ): ssc = solve._add_specs(ssc) ssc = bypass_sat(pkg_names, ssc) ssc = solve._post_sat_handling(ssc) ## create an IndexedSet from ssc.solution_precs ssc.solution_precs = IndexedSet(PrefixGraph(ssc.solution_precs).graph) ## Get linked and unlinked unlink_precs, link_precs = diff_for_unlink_link_precs( target_prefix, ssc.solution_precs, solve.specs_to_add ) # set unlinked to empty indexed set so we do not unlink/remove any pacakges unlink_precs = IndexedSet() ## Create a PrefixSetup stp = PrefixSetup( solve.prefix, unlink_precs, link_precs, solve.specs_to_remove, solve.specs_to_add, solve.neutered_specs, ) ## Create an UnlinkLinkTransaction with stp unlink_link_transaction = UnlinkLinkTransaction(stp) # create Namespace args = Namespace( channel=None, cmd="install", deps_modifier=context.deps_modifier, json=False, packages=pkg_names, ) ## Set logger level if debug: WARN, INFO, DEBUG, TRACE = VERBOSITY_LEVELS set_all_logger_level(DEBUG) ## Install package install.handle_txn(unlink_link_transaction, solve.prefix, args, False) ## Retrun True if finished return True
def test_get_index_win64_platform(self): win64 = 'win-64' index = get_index(platform=win64) for dist, record in iteritems(index): assert platform_in_record(win64, record), (win64, record.url)
def test_generate_eq(): dists = r.get_reduced_index(['anaconda']) r2 = Resolve(dists, True, True) C = r2.gen_clauses() eqv, eqb = r2.generate_version_metrics(C, list(r2.groups.keys())) # Should satisfy the following criteria: # - lower versions of the same package should should have higher # coefficients. # - the same versions of the same package (e.g., different build strings) # should have the same coefficients. # - a package that only has one version should not appear, unless # include=True as it will have a 0 coefficient. The same is true of the # latest version of a package. eqv = {Dist(key).to_filename(): value for key, value in iteritems(eqv)} eqb = {Dist(key).to_filename(): value for key, value in iteritems(eqb)} assert eqv == { 'anaconda-1.4.0-np15py26_0.tar.bz2': 1, 'anaconda-1.4.0-np15py27_0.tar.bz2': 1, 'anaconda-1.4.0-np16py26_0.tar.bz2': 1, 'anaconda-1.4.0-np16py27_0.tar.bz2': 1, 'anaconda-1.4.0-np17py26_0.tar.bz2': 1, 'anaconda-1.4.0-np17py27_0.tar.bz2': 1, 'anaconda-1.4.0-np17py33_0.tar.bz2': 1, 'astropy-0.2-np15py26_0.tar.bz2': 1, 'astropy-0.2-np15py27_0.tar.bz2': 1, 'astropy-0.2-np16py26_0.tar.bz2': 1, 'astropy-0.2-np16py27_0.tar.bz2': 1, 'astropy-0.2-np17py26_0.tar.bz2': 1, 'astropy-0.2-np17py27_0.tar.bz2': 1, 'astropy-0.2-np17py33_0.tar.bz2': 1, 'biopython-1.60-np15py26_0.tar.bz2': 1, 'biopython-1.60-np15py27_0.tar.bz2': 1, 'biopython-1.60-np16py26_0.tar.bz2': 1, 'biopython-1.60-np16py27_0.tar.bz2': 1, 'biopython-1.60-np17py26_0.tar.bz2': 1, 'biopython-1.60-np17py27_0.tar.bz2': 1, 'bitarray-0.8.0-py26_0.tar.bz2': 1, 'bitarray-0.8.0-py27_0.tar.bz2': 1, 'bitarray-0.8.0-py33_0.tar.bz2': 1, 'boto-2.8.0-py26_0.tar.bz2': 1, 'boto-2.8.0-py27_0.tar.bz2': 1, 'conda-1.4.4-py27_0.tar.bz2': 1, 'cython-0.18-py26_0.tar.bz2': 1, 'cython-0.18-py27_0.tar.bz2': 1, 'cython-0.18-py33_0.tar.bz2': 1, 'distribute-0.6.34-py26_1.tar.bz2': 1, 'distribute-0.6.34-py27_1.tar.bz2': 1, 'distribute-0.6.34-py33_1.tar.bz2': 1, 'gevent-0.13.7-py26_0.tar.bz2': 1, 'gevent-0.13.7-py27_0.tar.bz2': 1, 'ipython-0.13.1-py26_1.tar.bz2': 1, 'ipython-0.13.1-py27_1.tar.bz2': 1, 'ipython-0.13.1-py33_1.tar.bz2': 1, 'llvmpy-0.11.1-py26_0.tar.bz2': 1, 'llvmpy-0.11.1-py27_0.tar.bz2': 1, 'llvmpy-0.11.1-py33_0.tar.bz2': 1, 'lxml-3.0.2-py26_0.tar.bz2': 1, 'lxml-3.0.2-py27_0.tar.bz2': 1, 'lxml-3.0.2-py33_0.tar.bz2': 1, 'matplotlib-1.2.0-np15py26_1.tar.bz2': 1, 'matplotlib-1.2.0-np15py27_1.tar.bz2': 1, 'matplotlib-1.2.0-np16py26_1.tar.bz2': 1, 'matplotlib-1.2.0-np16py27_1.tar.bz2': 1, 'matplotlib-1.2.0-np17py26_1.tar.bz2': 1, 'matplotlib-1.2.0-np17py27_1.tar.bz2': 1, 'matplotlib-1.2.0-np17py33_1.tar.bz2': 1, 'nose-1.2.1-py26_0.tar.bz2': 1, 'nose-1.2.1-py27_0.tar.bz2': 1, 'nose-1.2.1-py33_0.tar.bz2': 1, 'numba-0.7.0-np16py26_1.tar.bz2': 1, 'numba-0.7.0-np16py27_1.tar.bz2': 1, 'numba-0.7.0-np17py26_1.tar.bz2': 1, 'numba-0.7.0-np17py27_1.tar.bz2': 1, 'numpy-1.5.1-py26_3.tar.bz2': 3, 'numpy-1.5.1-py27_3.tar.bz2': 3, 'numpy-1.6.2-py26_3.tar.bz2': 2, 'numpy-1.6.2-py26_4.tar.bz2': 2, 'numpy-1.6.2-py26_p4.tar.bz2': 2, 'numpy-1.6.2-py27_3.tar.bz2': 2, 'numpy-1.6.2-py27_4.tar.bz2': 2, 'numpy-1.6.2-py27_p4.tar.bz2': 2, 'numpy-1.7.0-py26_0.tar.bz2': 1, 'numpy-1.7.0-py27_0.tar.bz2': 1, 'numpy-1.7.0-py33_0.tar.bz2': 1, 'pandas-0.10.0-np16py26_0.tar.bz2': 2, 'pandas-0.10.0-np16py27_0.tar.bz2': 2, 'pandas-0.10.0-np17py26_0.tar.bz2': 2, 'pandas-0.10.0-np17py27_0.tar.bz2': 2, 'pandas-0.10.1-np16py26_0.tar.bz2': 1, 'pandas-0.10.1-np16py27_0.tar.bz2': 1, 'pandas-0.10.1-np17py26_0.tar.bz2': 1, 'pandas-0.10.1-np17py27_0.tar.bz2': 1, 'pandas-0.10.1-np17py33_0.tar.bz2': 1, 'pandas-0.8.1-np16py26_0.tar.bz2': 5, 'pandas-0.8.1-np16py27_0.tar.bz2': 5, 'pandas-0.8.1-np17py26_0.tar.bz2': 5, 'pandas-0.8.1-np17py27_0.tar.bz2': 5, 'pandas-0.9.0-np16py26_0.tar.bz2': 4, 'pandas-0.9.0-np16py27_0.tar.bz2': 4, 'pandas-0.9.0-np17py26_0.tar.bz2': 4, 'pandas-0.9.0-np17py27_0.tar.bz2': 4, 'pandas-0.9.1-np16py26_0.tar.bz2': 3, 'pandas-0.9.1-np16py27_0.tar.bz2': 3, 'pandas-0.9.1-np17py26_0.tar.bz2': 3, 'pandas-0.9.1-np17py27_0.tar.bz2': 3, 'pip-1.2.1-py26_1.tar.bz2': 1, 'pip-1.2.1-py27_1.tar.bz2': 1, 'pip-1.2.1-py33_1.tar.bz2': 1, 'psutil-0.6.1-py26_0.tar.bz2': 1, 'psutil-0.6.1-py27_0.tar.bz2': 1, 'psutil-0.6.1-py33_0.tar.bz2': 1, 'pyflakes-0.6.1-py26_0.tar.bz2': 1, 'pyflakes-0.6.1-py27_0.tar.bz2': 1, 'pyflakes-0.6.1-py33_0.tar.bz2': 1, 'python-2.6.8-6.tar.bz2': 4, 'python-2.7.3-7.tar.bz2': 3, 'python-2.7.4-0.tar.bz2': 2, 'python-3.3.0-4.tar.bz2': 1, 'pytz-2012j-py26_0.tar.bz2': 1, 'pytz-2012j-py27_0.tar.bz2': 1, 'pytz-2012j-py33_0.tar.bz2': 1, 'requests-0.13.9-py26_0.tar.bz2': 1, 'requests-0.13.9-py27_0.tar.bz2': 1, 'requests-0.13.9-py33_0.tar.bz2': 1, 'scikit-learn-0.13-np15py26_1.tar.bz2': 1, 'scikit-learn-0.13-np15py27_1.tar.bz2': 1, 'scikit-learn-0.13-np16py26_1.tar.bz2': 1, 'scikit-learn-0.13-np16py27_1.tar.bz2': 1, 'scikit-learn-0.13-np17py26_1.tar.bz2': 1, 'scikit-learn-0.13-np17py27_1.tar.bz2': 1, 'scipy-0.11.0-np15py26_3.tar.bz2': 1, 'scipy-0.11.0-np15py27_3.tar.bz2': 1, 'scipy-0.11.0-np16py26_3.tar.bz2': 1, 'scipy-0.11.0-np16py27_3.tar.bz2': 1, 'scipy-0.11.0-np17py26_3.tar.bz2': 1, 'scipy-0.11.0-np17py27_3.tar.bz2': 1, 'scipy-0.11.0-np17py33_3.tar.bz2': 1, 'six-1.2.0-py26_0.tar.bz2': 1, 'six-1.2.0-py27_0.tar.bz2': 1, 'six-1.2.0-py33_0.tar.bz2': 1, 'spyder-2.1.13-py27_0.tar.bz2': 1, 'sqlalchemy-0.7.8-py26_0.tar.bz2': 1, 'sqlalchemy-0.7.8-py27_0.tar.bz2': 1, 'sqlalchemy-0.7.8-py33_0.tar.bz2': 1, 'sympy-0.7.1-py26_0.tar.bz2': 1, 'sympy-0.7.1-py27_0.tar.bz2': 1, 'tornado-2.4.1-py26_0.tar.bz2': 1, 'tornado-2.4.1-py27_0.tar.bz2': 1, 'tornado-2.4.1-py33_0.tar.bz2': 1, 'xlrd-0.9.0-py26_0.tar.bz2': 1, 'xlrd-0.9.0-py27_0.tar.bz2': 1, 'xlrd-0.9.0-py33_0.tar.bz2': 1, 'xlwt-0.7.4-py26_0.tar.bz2': 1, 'xlwt-0.7.4-py27_0.tar.bz2': 1} assert eqb == { 'cairo-1.12.2-0.tar.bz2': 1, 'cubes-0.10.2-py27_0.tar.bz2': 1, 'dateutil-2.1-py26_0.tar.bz2': 1, 'dateutil-2.1-py27_0.tar.bz2': 1, 'dateutil-2.1-py33_0.tar.bz2': 1, 'gevent-websocket-0.3.6-py26_1.tar.bz2': 1, 'gevent-websocket-0.3.6-py27_1.tar.bz2': 1, 'gevent_zeromq-0.2.5-py26_1.tar.bz2': 1, 'gevent_zeromq-0.2.5-py27_1.tar.bz2': 1, 'libnetcdf-4.2.1.1-0.tar.bz2': 1, 'numexpr-2.0.1-np16py26_1.tar.bz2': 2, 'numexpr-2.0.1-np16py26_2.tar.bz2': 1, 'numexpr-2.0.1-np16py26_ce0.tar.bz2': 3, 'numexpr-2.0.1-np16py26_p1.tar.bz2': 2, 'numexpr-2.0.1-np16py26_p2.tar.bz2': 1, 'numexpr-2.0.1-np16py26_pro0.tar.bz2': 3, 'numexpr-2.0.1-np16py27_1.tar.bz2': 2, 'numexpr-2.0.1-np16py27_2.tar.bz2': 1, 'numexpr-2.0.1-np16py27_ce0.tar.bz2': 3, 'numexpr-2.0.1-np16py27_p1.tar.bz2': 2, 'numexpr-2.0.1-np16py27_p2.tar.bz2': 1, 'numexpr-2.0.1-np16py27_pro0.tar.bz2': 3, 'numexpr-2.0.1-np17py26_1.tar.bz2': 2, 'numexpr-2.0.1-np17py26_2.tar.bz2': 1, 'numexpr-2.0.1-np17py26_ce0.tar.bz2': 3, 'numexpr-2.0.1-np17py26_p1.tar.bz2': 2, 'numexpr-2.0.1-np17py26_p2.tar.bz2': 1, 'numexpr-2.0.1-np17py26_pro0.tar.bz2': 3, 'numexpr-2.0.1-np17py27_1.tar.bz2': 2, 'numexpr-2.0.1-np17py27_2.tar.bz2': 1, 'numexpr-2.0.1-np17py27_ce0.tar.bz2': 3, 'numexpr-2.0.1-np17py27_p1.tar.bz2': 2, 'numexpr-2.0.1-np17py27_p2.tar.bz2': 1, 'numexpr-2.0.1-np17py27_pro0.tar.bz2': 3, 'numpy-1.6.2-py26_3.tar.bz2': 1, 'numpy-1.6.2-py27_3.tar.bz2': 1, 'py2cairo-1.10.0-py26_0.tar.bz2': 1, 'py2cairo-1.10.0-py27_0.tar.bz2': 1, 'pycurl-7.19.0-py26_0.tar.bz2': 1, 'pycurl-7.19.0-py27_0.tar.bz2': 1, 'pysal-1.5.0-np15py27_0.tar.bz2': 1, 'pysal-1.5.0-np16py27_0.tar.bz2': 1, 'pysal-1.5.0-np17py27_0.tar.bz2': 1, 'pytest-2.3.4-py26_0.tar.bz2': 1, 'pytest-2.3.4-py27_0.tar.bz2': 1, 'pyzmq-2.2.0.1-py26_0.tar.bz2': 1, 'pyzmq-2.2.0.1-py27_0.tar.bz2': 1, 'pyzmq-2.2.0.1-py33_0.tar.bz2': 1, 'scikit-image-0.8.2-np16py26_0.tar.bz2': 1, 'scikit-image-0.8.2-np16py27_0.tar.bz2': 1, 'scikit-image-0.8.2-np17py26_0.tar.bz2': 1, 'scikit-image-0.8.2-np17py27_0.tar.bz2': 1, 'scikit-image-0.8.2-np17py33_0.tar.bz2': 1, 'sphinx-1.1.3-py26_2.tar.bz2': 1, 'sphinx-1.1.3-py27_2.tar.bz2': 1, 'sphinx-1.1.3-py33_2.tar.bz2': 1, 'statsmodels-0.4.3-np16py26_0.tar.bz2': 1, 'statsmodels-0.4.3-np16py27_0.tar.bz2': 1, 'statsmodels-0.4.3-np17py26_0.tar.bz2': 1, 'statsmodels-0.4.3-np17py27_0.tar.bz2': 1, 'system-5.8-0.tar.bz2': 1, 'theano-0.5.0-np15py26_0.tar.bz2': 1, 'theano-0.5.0-np15py27_0.tar.bz2': 1, 'theano-0.5.0-np16py26_0.tar.bz2': 1, 'theano-0.5.0-np16py27_0.tar.bz2': 1, 'theano-0.5.0-np17py26_0.tar.bz2': 1, 'theano-0.5.0-np17py27_0.tar.bz2': 1, 'zeromq-2.2.0-0.tar.bz2': 1}
from conda.models.match_spec import MatchSpec from conda.plan import display_actions import conda.plan as plan from conda.resolve import Resolve from conda.utils import on_win from .decorators import skip_if_no_mock from .gateways.disk.test_permissions import tempdir from .helpers import captured, mock, tempdir try: from unittest.mock import patch except ImportError: from mock import patch with open(join(dirname(__file__), 'index.json')) as fi: index = {Dist(k): IndexRecord(**v) for k, v in iteritems(json.load(fi))} r = Resolve(index) def solve(specs): return [Dist.from_string(fn) for fn in r.solve(specs)] class add_unlink_TestCase(unittest.TestCase): def generate_random_dist(self): return "foobar-%s-0" % random.randint(100, 200) @contextmanager def mock_platform(self, windows=False): with mock.patch.object(plan, "sys") as sys: sys.platform = "win32" if windows else "not win32"
from conda.common.compat import iteritems # FIXME This should be a relative import from tests.helpers import captured from conda import CondaError from .decorators import skip_if_no_mock from .helpers import mock try: from unittest.mock import patch except ImportError: from mock import patch with open(join(dirname(__file__), 'index.json')) as fi: index = {Dist(k): IndexRecord(**v) for k, v in iteritems(json.load(fi))} r = Resolve(index) def solve(specs): return [Dist.from_string(fn) for fn in r.solve(specs)] class add_unlink_TestCase(unittest.TestCase): def generate_random_dist(self): return "foobar-%s-0" % random.randint(100, 200) @contextmanager def mock_platform(self, windows=False): with mock.patch.object(plan, "sys") as sys: sys.platform = "win32" if windows else "not win32"
from conda.base.constants import MAX_CHANNEL_PRIORITY from conda.base.context import reset_context from conda.common.compat import iteritems, text_type from conda.exceptions import NoPackagesFoundError, UnsatisfiableError from conda.models.dist import Dist from conda.models.record import Record from conda.resolve import MatchSpec, Package, Resolve from os.path import dirname, join import pytest from conda.resolve import MatchSpec, Package, Resolve, NoPackagesFound, Unsatisfiable from tests.helpers import raises with open(join(dirname(__file__), 'index.json')) as fi: index = {Dist(key): Record(**value) for key, value in iteritems(json.load(fi))} r = Resolve(index) f_mkl = set(['mkl']) class TestMatchSpec(unittest.TestCase): def test_match(self): for spec, res in [ ('numpy 1.7*', True), ('numpy 1.7.1', True), ('numpy 1.7', False), ('numpy 1.5*', False), ('numpy >=1.5', True), ('numpy >=1.5,<2', True), ('numpy >=1.8,<1.9', False), ('numpy >1.5,<2,!=1.7.1', False), ('numpy >1.8,<2|==1.7', False),('numpy >1.8,<2|>=1.7.1', True),
def test_nonexistent_deps(): index2 = index.copy() index2['mypackage-1.0-py33_0.tar.bz2'] = Record(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'python 3.3*', 'notarealpackage 2.0*'], 'name': 'mypackage', 'requires': ['nose 1.2.1', 'python 3.3'], 'version': '1.0', }) index2['mypackage-1.1-py33_0.tar.bz2'] = Record(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'python 3.3*'], 'name': 'mypackage', 'requires': ['nose 1.2.1', 'python 3.3'], 'version': '1.1', }) index2['anotherpackage-1.0-py33_0.tar.bz2'] = Record(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'mypackage 1.1'], 'name': 'anotherpackage', 'requires': ['nose', 'mypackage 1.1'], 'version': '1.0', }) index2['anotherpackage-2.0-py33_0.tar.bz2'] = Record(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'mypackage'], 'name': 'anotherpackage', 'requires': ['nose', 'mypackage'], 'version': '2.0', }) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) assert set(r.find_matches(MatchSpec('mypackage'))) == { Dist('mypackage-1.0-py33_0.tar.bz2'), Dist('mypackage-1.1-py33_0.tar.bz2'), } assert set(d.to_filename() for d in r.get_reduced_index(['mypackage']).keys()) == { 'mypackage-1.1-py33_0.tar.bz2', 'nose-1.1.2-py33_0.tar.bz2', 'nose-1.2.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.0-2.tar.bz2', 'python-3.3.0-3.tar.bz2', 'python-3.3.0-4.tar.bz2', 'python-3.3.0-pro0.tar.bz2', 'python-3.3.0-pro1.tar.bz2', 'python-3.3.1-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2'} assert r.install(['mypackage']) == r.install(['mypackage 1.1']) == [Dist(dname) for dname in [ 'mypackage-1.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] assert raises(NoPackagesFoundError, lambda: r.install(['mypackage 1.0'])) assert raises(NoPackagesFoundError, lambda: r.install(['mypackage 1.0', 'burgertime 1.0'])) assert r.install(['anotherpackage 1.0']) == [Dist(dname) for dname in [ 'anotherpackage-1.0-py33_0.tar.bz2', 'mypackage-1.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] assert r.install(['anotherpackage']) == [Dist(dname) for dname in [ 'anotherpackage-2.0-py33_0.tar.bz2', 'mypackage-1.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] # This time, the latest version is messed up index3 = index.copy() index3['mypackage-1.1-py33_0.tar.bz2'] = Record(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'python 3.3*', 'notarealpackage 2.0*'], 'name': 'mypackage', 'requires': ['nose 1.2.1', 'python 3.3'], 'version': '1.1', }) index3['mypackage-1.0-py33_0.tar.bz2'] = Record(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'python 3.3*'], 'name': 'mypackage', 'requires': ['nose 1.2.1', 'python 3.3'], 'version': '1.0', }) index3['anotherpackage-1.0-py33_0.tar.bz2'] = Record(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'mypackage 1.0'], 'name': 'anotherpackage', 'requires': ['nose', 'mypackage 1.0'], 'version': '1.0', }) index3['anotherpackage-2.0-py33_0.tar.bz2'] = Record(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'mypackage'], 'name': 'anotherpackage', 'requires': ['nose', 'mypackage'], 'version': '2.0', }) index3 = {Dist(key): value for key, value in iteritems(index3)} r = Resolve(index3) assert set(d.to_filename() for d in r.find_matches(MatchSpec('mypackage'))) == { 'mypackage-1.0-py33_0.tar.bz2', 'mypackage-1.1-py33_0.tar.bz2', } assert set(d.to_filename() for d in r.get_reduced_index(['mypackage']).keys()) == { 'mypackage-1.0-py33_0.tar.bz2', 'nose-1.1.2-py33_0.tar.bz2', 'nose-1.2.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.0-2.tar.bz2', 'python-3.3.0-3.tar.bz2', 'python-3.3.0-4.tar.bz2', 'python-3.3.0-pro0.tar.bz2', 'python-3.3.0-pro1.tar.bz2', 'python-3.3.1-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2'} assert r.install(['mypackage']) == r.install(['mypackage 1.0']) == [Dist(dname) for dname in [ 'mypackage-1.0-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] assert raises(NoPackagesFoundError, lambda: r.install(['mypackage 1.1'])) assert r.install(['anotherpackage 1.0']) == [Dist(dname) for dname in [ 'anotherpackage-1.0-py33_0.tar.bz2', 'mypackage-1.0-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] # If recursive checking is working correctly, this will give # anotherpackage 2.0, not anotherpackage 1.0 assert r.install(['anotherpackage']) == [Dist(dname) for dname in [ 'anotherpackage-2.0-py33_0.tar.bz2', 'mypackage-1.0-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]
from conda.base.constants import MAX_CHANNEL_PRIORITY from conda.base.context import reset_context from conda.common.compat import iteritems, text_type from conda.exceptions import NoPackagesFoundError, UnsatisfiableError from conda.models.dist import Dist from conda.models.index_record import IndexRecord from conda.resolve import MatchSpec, Resolve from os.path import dirname, join import pytest from conda.resolve import MatchSpec, Resolve, NoPackagesFound, Unsatisfiable from tests.helpers import raises with open(join(dirname(__file__), 'index.json')) as fi: index = {Dist(key): IndexRecord(**value) for key, value in iteritems(json.load(fi))} r = Resolve(index) f_mkl = set(['mkl']) class TestMatchSpec(unittest.TestCase): def test_match(self): for spec, res in [ ('numpy 1.7*', True), ('numpy 1.7.1', True), ('numpy 1.7', False), ('numpy 1.5*', False), ('numpy >=1.5', True), ('numpy >=1.5,<2', True), ('numpy >=1.8,<1.9', False), ('numpy >1.5,<2,!=1.7.1', False), ('numpy >1.8,<2|==1.7', False),('numpy >1.8,<2|>=1.7.1', True),
def test_nonexistent_deps(): index2 = index.copy() index2['mypackage-1.0-py33_0.tar.bz2'] = IndexRecord(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'python 3.3*', 'notarealpackage 2.0*'], 'name': 'mypackage', 'requires': ['nose 1.2.1', 'python 3.3'], 'version': '1.0', }) index2['mypackage-1.1-py33_0.tar.bz2'] = IndexRecord(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'python 3.3*'], 'name': 'mypackage', 'requires': ['nose 1.2.1', 'python 3.3'], 'version': '1.1', }) index2['anotherpackage-1.0-py33_0.tar.bz2'] = IndexRecord(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'mypackage 1.1'], 'name': 'anotherpackage', 'requires': ['nose', 'mypackage 1.1'], 'version': '1.0', }) index2['anotherpackage-2.0-py33_0.tar.bz2'] = IndexRecord(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'mypackage'], 'name': 'anotherpackage', 'requires': ['nose', 'mypackage'], 'version': '2.0', }) index2 = {Dist(key): value for key, value in iteritems(index2)} r = Resolve(index2) assert set(r.find_matches(MatchSpec('mypackage'))) == { Dist('mypackage-1.0-py33_0.tar.bz2'), Dist('mypackage-1.1-py33_0.tar.bz2'), } assert set(d.to_filename() for d in r.get_reduced_index(['mypackage']).keys()) == { 'mypackage-1.1-py33_0.tar.bz2', 'nose-1.1.2-py33_0.tar.bz2', 'nose-1.2.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.0-2.tar.bz2', 'python-3.3.0-3.tar.bz2', 'python-3.3.0-4.tar.bz2', 'python-3.3.0-pro0.tar.bz2', 'python-3.3.0-pro1.tar.bz2', 'python-3.3.1-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2'} target_result = r.install(['mypackage']) assert target_result == r.install(['mypackage 1.1']) assert target_result == [ Dist(add_defaults_if_no_channel(dname)) for dname in [ '<unknown>::mypackage-1.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] assert raises(NoPackagesFoundError, lambda: r.install(['mypackage 1.0'])) assert raises(NoPackagesFoundError, lambda: r.install(['mypackage 1.0', 'burgertime 1.0'])) assert r.install(['anotherpackage 1.0']) == [ Dist(add_defaults_if_no_channel(dname)) for dname in [ '<unknown>::anotherpackage-1.0-py33_0.tar.bz2', '<unknown>::mypackage-1.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] assert r.install(['anotherpackage']) == [ Dist(add_defaults_if_no_channel(dname)) for dname in [ '<unknown>::anotherpackage-2.0-py33_0.tar.bz2', '<unknown>::mypackage-1.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] # This time, the latest version is messed up index3 = index.copy() index3['mypackage-1.1-py33_0.tar.bz2'] = IndexRecord(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'python 3.3*', 'notarealpackage 2.0*'], 'name': 'mypackage', 'requires': ['nose 1.2.1', 'python 3.3'], 'version': '1.1', }) index3['mypackage-1.0-py33_0.tar.bz2'] = IndexRecord(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'python 3.3*'], 'name': 'mypackage', 'requires': ['nose 1.2.1', 'python 3.3'], 'version': '1.0', }) index3['anotherpackage-1.0-py33_0.tar.bz2'] = IndexRecord(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'mypackage 1.0'], 'name': 'anotherpackage', 'requires': ['nose', 'mypackage 1.0'], 'version': '1.0', }) index3['anotherpackage-2.0-py33_0.tar.bz2'] = IndexRecord(**{ 'build': 'py33_0', 'build_number': 0, 'depends': ['nose', 'mypackage'], 'name': 'anotherpackage', 'requires': ['nose', 'mypackage'], 'version': '2.0', }) index3 = {Dist(key): value for key, value in iteritems(index3)} r = Resolve(index3) assert set(d.to_filename() for d in r.find_matches(MatchSpec('mypackage'))) == { 'mypackage-1.0-py33_0.tar.bz2', 'mypackage-1.1-py33_0.tar.bz2', } assert set(d.to_filename() for d in r.get_reduced_index(['mypackage']).keys()) == { 'mypackage-1.0-py33_0.tar.bz2', 'nose-1.1.2-py33_0.tar.bz2', 'nose-1.2.1-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.0-2.tar.bz2', 'python-3.3.0-3.tar.bz2', 'python-3.3.0-4.tar.bz2', 'python-3.3.0-pro0.tar.bz2', 'python-3.3.0-pro1.tar.bz2', 'python-3.3.1-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2'} assert r.install(['mypackage']) == r.install(['mypackage 1.0']) == [ Dist(add_defaults_if_no_channel(dname)) for dname in [ '<unknown>::mypackage-1.0-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] assert raises(NoPackagesFoundError, lambda: r.install(['mypackage 1.1'])) assert r.install(['anotherpackage 1.0']) == [ Dist(add_defaults_if_no_channel(dname))for dname in [ '<unknown>::anotherpackage-1.0-py33_0.tar.bz2', '<unknown>::mypackage-1.0-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]] # If recursive checking is working correctly, this will give # anotherpackage 2.0, not anotherpackage 1.0 assert r.install(['anotherpackage']) == [ Dist(add_defaults_if_no_channel(dname))for dname in [ '<unknown>::anotherpackage-2.0-py33_0.tar.bz2', '<unknown>::mypackage-1.0-py33_0.tar.bz2', 'nose-1.3.0-py33_0.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-3.3.2-0.tar.bz2', 'readline-6.2-0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]
from conda.exceptions import NoPackagesFoundError, UnsatisfiableError from conda.models.dist import Dist from conda.models.index_record import IndexRecord from conda.resolve import MatchSpec, Resolve from conda.models.package import Package from os.path import dirname, join import pytest from conda.resolve import MatchSpec, Package, Resolve, NoPackagesFound, Unsatisfiable from tests.helpers import raises with open(join(dirname(__file__), 'index.json')) as fi: index = { Dist(key): IndexRecord(**value) for key, value in iteritems(json.load(fi)) } r = Resolve(index) f_mkl = set(['mkl']) class TestMatchSpec(unittest.TestCase): def test_match(self): for spec, res in [ ('numpy 1.7*', True), ('numpy 1.7.1', True), ('numpy 1.7', False), ('numpy 1.5*', False), ('numpy >=1.5', True),
def test_no_features(): # Without this, there would be another solution including 'scipy-0.11.0-np16py26_p3.tar.bz2'. assert r.install(['python 2.6*', 'numpy 1.6*', 'scipy 0.11*'], returnall=True) == [[Dist(fname) for fname in [ 'numpy-1.6.2-py26_4.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'python-2.6.8-6.tar.bz2', 'readline-6.2-0.tar.bz2', 'scipy-0.11.0-np16py26_3.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]] assert r.install(['python 2.6*', 'numpy 1.6*', 'scipy 0.11*', 'mkl@'], returnall=True) == [[Dist(fname) for fname in [ 'mkl-rt-11.0-p0.tar.bz2', # This, 'numpy-1.6.2-py26_p4.tar.bz2', # this, 'openssl-1.0.1c-0.tar.bz2', 'python-2.6.8-6.tar.bz2', 'readline-6.2-0.tar.bz2', 'scipy-0.11.0-np16py26_p3.tar.bz2', # and this are different. 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]] index2 = index.copy() index2["pandas-0.12.0-np16py27_0.tar.bz2"] = Record(**{ "build": "np16py27_0", "build_number": 0, "depends": [ "dateutil", "numpy 1.6*", "python 2.7*", "pytz" ], "name": "pandas", "requires": [ "dateutil 1.5", "numpy 1.6", "python 2.7", "pytz" ], "version": "0.12.0" }) # Make it want to choose the pro version by having it be newer. index2["numpy-1.6.2-py27_p5.tar.bz2"] = Record(**{ "build": "py27_p5", "build_number": 5, "depends": [ "mkl-rt 11.0", "python 2.7*" ], "features": "mkl", "name": "numpy", "pub_date": "2013-04-29", "requires": [ "mkl-rt 11.0", "python 2.7" ], "version": "1.6.2" }) index2 = {Dist(key): value for key, value in iteritems(index2)} r2 = Resolve(index2) # This should not pick any mkl packages (the difference here is that none # of the specs directly have mkl versions) assert r2.solve(['pandas 0.12.0 np16py27_0', 'python 2.7*'], returnall=True) == [[Dist(fname) for fname in [ 'dateutil-2.1-py27_1.tar.bz2', 'numpy-1.6.2-py27_4.tar.bz2', 'openssl-1.0.1c-0.tar.bz2', 'pandas-0.12.0-np16py27_0.tar.bz2', 'python-2.7.5-0.tar.bz2', 'pytz-2013b-py27_0.tar.bz2', 'readline-6.2-0.tar.bz2', 'six-1.3.0-py27_0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]] assert r2.solve(['pandas 0.12.0 np16py27_0', 'python 2.7*', 'mkl@'], returnall=True)[0] == [[Dist(fname) for fname in [ 'dateutil-2.1-py27_1.tar.bz2', 'mkl-rt-11.0-p0.tar.bz2', # This 'numpy-1.6.2-py27_p5.tar.bz2', # and this are different. 'openssl-1.0.1c-0.tar.bz2', 'pandas-0.12.0-np16py27_0.tar.bz2', 'python-2.7.5-0.tar.bz2', 'pytz-2013b-py27_0.tar.bz2', 'readline-6.2-0.tar.bz2', 'six-1.3.0-py27_0.tar.bz2', 'sqlite-3.7.13-0.tar.bz2', 'system-5.8-1.tar.bz2', 'tk-8.5.13-0.tar.bz2', 'zlib-1.2.7-0.tar.bz2', ]]][0]