def test_meta_sorting_version_strip(): m1 = MetaData.fromdict({'package': {'name': 'a'}, 'requirements': {'build': ['b > 1.2']}}) m2 = MetaData.fromdict({'package': {'name': 'b'}}) metas = sort_dependency_order([m1, m2]) assert_equal([meta.name() for meta in metas], ['b', 'a'])
def testing_metadata(request): d = defaultdict(dict) d['package']['name'] = request.function.__name__ d['package']['version'] = '1.0' d['build']['number'] = '1' d['build']['entry_points'] = [] # MetaData does the auto stuff if the build string is None d['build']['string'] = None d['requirements']['build'] = ['build_requirement'] d['requirements']['run'] = ['run_requirement 1.0'] d['requirements']['host'] = ['python'] d['test']['requires'] = ['test_requirement'] d['test']['commands'] = ['echo "A-OK"', 'exit 0'] d['about']['home'] = "sweet home" d['about']['license'] = "contract in blood" d['about']['summary'] = "a test package" m = MetaData.fromdict(d) m.config.variant = {'python': '3.6', 'numpy': '1.11'} m.config.variants = [{ 'python': '2.7', 'numpy': '1.11' }, { 'python': '3.6', 'numpy': '1.11' }] return m
def create_metapackage(name, version, entry_points=(), build_string=None, build_number=0, dependencies=(), home=None, license_name=None, summary=None, config=None): # local import to avoid circular import, we provid create_metapackage in api from conda_build.api import build if not config: config = Config() d = defaultdict(dict) d['package']['name'] = name d['package']['version'] = version d['build']['number'] = build_number d['build']['entry_points'] = entry_points # MetaData does the auto stuff if the build string is None d['build']['string'] = build_string d['requirements']['run'] = dependencies d['about']['home'] = home d['about']['license'] = license_name d['about']['summary'] = summary d = dict(d) m = MetaData.fromdict(d, config=config) config.compute_build_id(m.name(), m.version()) return build(m, config=config, need_source_download=False)
def test_add_intradependencies(): a_meta = MetaData.fromdict({'package': {'name': 'a', 'version': '1.0'}}) b_meta = MetaData.fromdict({ 'package': { 'name': 'b', 'version': '1.0' }, 'requirements': { 'build': ['a'] } }) g = nx.DiGraph() g.add_node('a', meta=a_meta) g.add_node('b', meta=b_meta) compute_build_graph.add_intradependencies(g) assert ('b', 'a') in g.edges()
def testing_metadata(request, testing_config): d = defaultdict(dict) d['package']['name'] = request.function.__name__ d['package']['version'] = '1.0' d['build']['number'] = '1' d['build']['entry_points'] = [] d['requirements']['build'] = ['python'] d['requirements']['run'] = ['python'] d['test']['commands'] = ['echo "A-OK"', 'exit 0'] d['about']['home'] = "sweet home" d['about']['license'] = "contract in blood" d['about']['summary'] = "a test package" testing_config.variant = get_default_variants()[0] return MetaData.fromdict(d, config=testing_config)
def testing_metadata(request, testing_config): d = defaultdict(dict) d['package']['name'] = request.function.__name__ d['package']['version'] = '1.0' d['build']['number'] = '1' d['build']['entry_points'] = [] d['requirements']['build'] = [] d['requirements']['run'] = [] d['test']['commands'] = ['echo "A-OK"', 'exit 0'] d['about']['home'] = "sweet home" d['about']['license'] = "contract in blood" d['about']['summary'] = "a test package" testing_config.variant = get_default_variant(testing_config) return MetaData.fromdict(d, config=testing_config)
def test_metadata(request, test_config): d = defaultdict(dict) d['package']['name'] = request.function.__name__ d['package']['version'] = '1.0' d['build']['number'] = '1' d['build']['entry_points'] = [] # MetaData does the auto stuff if the build string is None d['build']['string'] = None d['requirements']['build'] = ['python'] d['requirements']['run'] = ['python'] d['test']['commands'] = ['echo "A-OK"', 'exit 0'] d['about']['home'] = "sweet home" d['about']['license'] = "contract in blood" d['about']['summary'] = "a test package" return MetaData.fromdict(d, config=test_config)
def execute(args, parser): d = defaultdict(dict) d['package']['name'] = args.name d['package']['version'] = args.version d['build']['number'] = args.build_number d['build']['entry_points'] = args.entry_points # MetaData does the auto stuff if the build string is None d['build']['string'] = args.build_string d['requirements']['run'] = args.dependencies d['about']['home'] = args.home d['about']['license'] = args.license d['about']['summary'] = args.summary m = MetaData.fromdict(d) build(m) handle_binstar_upload(bldpkg_path(m), args)
def execute(args, parser): d = defaultdict(dict) d['package']['name'] = args.name d['package']['version'] = args.version d['build']['number'] = args.build_number d['build']['entry_points'] = args.entry_points # MetaData does the auto stuff if the build string is None d['build']['string'] = args.build_string d['requirements']['run'] = args.dependencies d['about']['home'] = args.home d['about']['license'] = args.license d['about']['summary'] = args.summary d = dict(d) m = MetaData.fromdict(d) build(m) handle_binstar_upload(bldpkg_path(m), args)
def main(environment, version='0.1.0', build_number=0, home=None, license=None, summary=None): environment = conda_env.from_file(environment) metapackage = environment.name + '-' + uuid.uuid4().hex subprocess.check_output([ 'conda', 'env', 'create', '-n', metapackage, '-f=' + environment.filename ]) packages = subprocess.check_output( ['conda', 'list', '-n', metapackage, '-e']) packages = [ package for package in packages.splitlines() if not package.startswith("#") ] subprocess.check_output( ['conda', 'env', 'remove', '-n', metapackage, '-y']) metadata = defaultdict(dict) metadata['package']['name'] = environment.name metadata['package']['version'] = version metadata['build']['number'] = build_number metadata['requirements']['run'] = packages if home is not None: metadata['about']['home'] = home if license is not None: metadata['about']['license'] = license if summary is not None: metadata['about']['summary'] = summary metadata = dict(metadata) config = get_or_merge_config(None, channel_urls=environment.channels) metadata = MetaData.fromdict(metadata, config=config) config.compute_build_id(metadata.name()) output_file_path = str( conda_build.get_output_file_path(metadata, config=config).pop()) if not inspect_conda_bld_directory or not os.path.exists(output_file_path): conda_build.build(metadata, config=config) return output_file_path
def create_metapackage(name, version, entry_points=(), build_string=None, build_number=0, dependencies=(), home=None, license_name=None, summary=None, config=None): # local import to avoid circular import, we provid create_metapackage in api from conda_build.api import build if not config: config = Config() d = defaultdict(dict) d['package']['name'] = name d['package']['version'] = version d['build']['number'] = build_number d['build']['entry_points'] = entry_points # MetaData does the auto stuff if the build string is None d['build']['string'] = build_string d['requirements']['run'] = dependencies d['about']['home'] = home d['about']['license'] = license_name d['about']['summary'] = summary d = dict(d) m = MetaData.fromdict(d, config=config) config.compute_build_id(m.name()) return build(m, config=config, need_source_download=False)
def run(self): # Make sure the metadata has the conda attributes, even if the # distclass isn't CondaDistribution. We primarily do this to simplify # the code below. metadata = self.distribution.metadata for attr in CondaDistribution.conda_attrs: if not hasattr(metadata, attr): setattr(metadata, attr, CondaDistribution.conda_attrs[attr]) # The command line takes precedence if self.buildnum is not None: metadata.conda_buildnum = self.buildnum with Locked(config.croot): d = defaultdict(dict) # PyPI allows uppercase letters but conda does not, so we fix the # name here. d['package']['name'] = metadata.name.lower() d['package']['version'] = metadata.version d['build']['number'] = metadata.conda_buildnum # MetaData does the auto stuff if the build string is None d['build']['string'] = metadata.conda_buildstr d['build']['binary_relocation'] = metadata.conda_binary_relocation d['build']['preserve_egg_dir'] = metadata.conda_preserve_egg_dir d['build']['features'] = metadata.conda_features d['build']['track_features'] = metadata.conda_track_features # XXX: I'm not really sure if it is correct to combine requires # and install_requires d['requirements']['run'] = d['requirements']['build'] = \ [spec_from_line(i) for i in (metadata.requires or []) + (getattr(self.distribution, 'install_requires', []) or [])] + ['python'] if hasattr(self.distribution, 'tests_require'): # A lot of packages use extras_require['test'], but # tests_require is the one that is officially supported by # setuptools. d['test']['requires'] = [spec_from_line(i) for i in self.distribution.tests_require or []] d['about']['home'] = metadata.url # Don't worry about classifiers. This isn't skeleton pypi. We # don't need to make this work with random stuff in the wild. If # someone writes their setup.py wrong and this doesn't work, it's # their fault. d['about']['license'] = metadata.license d['about']['summary'] = metadata.description # This is similar logic from conda skeleton pypi entry_points = getattr(self.distribution, 'entry_points', []) if entry_points: if isinstance(entry_points, string_types): # makes sure it is left-shifted newstr = "\n".join(x.strip() for x in entry_points.splitlines()) c = configparser.ConfigParser() entry_points = {} try: c.readfp(StringIO(newstr)) except Exception as err: # This seems to be the best error here raise DistutilsGetoptError("ERROR: entry-points not understood: " + str(err) + "\nThe string was" + newstr) else: for section in config.sections(): if section in ['console_scripts', 'gui_scripts']: value = ['%s=%s' % (option, config.get(section, option)) for option in config.options(section)] entry_points[section] = value else: # Make sure setuptools is added as a dependency below entry_points[section] = None if not isinstance(entry_points, dict): raise DistutilsGetoptError("ERROR: Could not add entry points. They were:\n" + entry_points) else: rs = entry_points.get('scripts', []) cs = entry_points.get('console_scripts', []) gs = entry_points.get('gui_scripts', []) # We have *other* kinds of entry-points so we need # setuptools at run-time if not rs and not cs and not gs and len(entry_points) > 1: d['requirements']['run'].append('setuptools') d['requirements']['build'].append('setuptools') entry_list = rs + cs + gs if gs and conda.config.platform == 'osx': d['build']['osx_is_app'] = True if len(cs + gs) != 0: d['build']['entry_points'] = entry_list if metadata.conda_command_tests is True: d['test']['commands'] = list(map(unicode, pypi.make_entry_tests(entry_list))) if 'setuptools' in d['requirements']['run']: d['build']['preserve_egg_dir'] = True if metadata.conda_import_tests: if metadata.conda_import_tests is True: d['test']['imports'] = ((self.distribution.packages or []) + (self.distribution.py_modules or [])) else: d['test']['imports'] = metadata.conda_import_tests if (metadata.conda_command_tests and not isinstance(metadata.conda_command_tests, bool)): d['test']['commands'] = list(map(unicode, metadata.conda_command_tests)) d = dict(d) m = MetaData.fromdict(d) # Shouldn't fail, but do you really trust the code above? m.check_fields() build.build(m, post=False) # Do the install if not PY3: # Command is an old-style class in Python 2 install.run(self) else: super().run() build.build(m, post=True) build.test(m) if self.binstar_upload: class args: binstar_upload = self.binstar_upload handle_binstar_upload(render.bldpkg_path(m), args) else: no_upload_message = """\ # If you want to upload this package to anaconda.org later, type: # # $ anaconda upload %s """ % render.bldpkg_path(m) print(no_upload_message)
def main(directory, run=True, build=True, test=True, use_local=True, channel_urls=[], config=None): config = get_or_merge_config(config, channel_urls=channel_urls) metapackage = 'conda-tools-' + uuid.uuid4().hex version = "0.1.0" build_number = 0 entry_points = () build_string = None home = None license = None summary = None packages = list_packages(directory, channel_urls=channel_urls, config=config) dependencies = set() if run: for package in packages: for dependency in package.meta.get("requirements", {}).get("run", []): dependencies.add(dependency.split()[0]) if build: for package in packages: for dependency in package.meta.get("requirements", {}).get("run", []): dependencies.add(dependency.split()[0]) if test: for package in packages: for dependency in package.meta.get("test", {}).get("requires", []): dependencies.add(dependency.split()[0]) packages = {package.meta['package']['name'] for package in packages} import pdb pdb.set_trace() dependencies = [ dependency for dependency in dependencies if not dependency in packages ] metapackage = 'conda-tools-' + uuid.uuid4().hex metadata = defaultdict(dict) metadata['package']['name'] = metapackage metadata['package']['version'] = version metadata['build']['number'] = build_number metadata['build']['entry_points'] = entry_points metadata['build']['string'] = build_string metadata['requirements']['run'] = dependencies metadata['about']['home'] = home metadata['about']['license'] = license metadata['about']['summary'] = summary metadata['test']['commands'] = ['ls [unix]', 'dir [win]'] metadata = dict(metadata) metadata = MetaData.fromdict(metadata, config=config) config.compute_build_id(metadata.name()) conda_build.build(metadata, channel_urls=channel_urls, config=config, need_source_download=False)
def setUp(self): self.meta = MetaData.fromdict({'package': {'name': 'test_pkg'}, 'requirements': {'build': []}})
def run(self): # Make sure the metadata has the conda attributes, even if the # distclass isn't CondaDistribution. We primarily do this to simplify # the code below. metadata = self.distribution.metadata for attr in CondaDistribution.conda_attrs: if not hasattr(metadata, attr): setattr(metadata, attr, CondaDistribution.conda_attrs[attr]) # The command line takes precedence if self.buildnum is not None: metadata.conda_buildnum = self.buildnum with Locked(config.croot): d = defaultdict(dict) # Needs to be lowercase d['package']['name'] = metadata.name d['package']['version'] = metadata.version d['build']['number'] = metadata.conda_buildnum # MetaData does the auto stuff if the build string is None d['build']['string'] = metadata.conda_buildstr d['build']['binary_relocation'] = metadata.conda_binary_relocation d['build']['preserve_egg_dir'] = metadata.conda_preserve_egg_dir d['build']['features'] = metadata.conda_features d['build']['track_features'] = metadata.conda_track_features # XXX: I'm not really sure if it is correct to combine requires # and install_requires d['requirements']['run'] = d['requirements']['build'] = \ [spec_from_line(i) for i in (metadata.requires or []) + (getattr(self.distribution, 'install_requires', []) or [])] + ['python'] if hasattr(self.distribution, 'tests_require'): # A lot of packages use extras_require['test'], but # tests_require is the one that is officially supported by # setuptools. d['test']['requires'] = [ spec_from_line(i) for i in self.distribution.tests_require or [] ] d['about']['home'] = metadata.url # Don't worry about classifiers. This isn't skeleton pypi. We # don't need to make this work with random stuff in the wild. If # someone writes their setup.py wrong and this doesn't work, it's # their fault. d['about']['license'] = metadata.license d['about']['summary'] = self.distribution.description # This is similar logic from conda skeleton pypi entry_points = getattr(self.distribution, 'entry_points', []) if entry_points: if isinstance(entry_points, string_types): # makes sure it is left-shifted newstr = "\n".join(x.strip() for x in entry_points.split('\n')) c = configparser.ConfigParser() entry_points = {} try: c.readfp(StringIO(newstr)) except Exception as err: # This seems to be the best error here raise DistutilsGetoptError( "ERROR: entry-points not understood: " + str(err) + "\nThe string was" + newstr) else: for section in config.sections(): if section in ['console_scripts', 'gui_scripts']: value = [ '%s=%s' % (option, config.get(section, option)) for option in config.options(section) ] entry_points[section] = value else: # Make sure setuptools is added as a dependency below entry_points[section] = None if not isinstance(entry_points, dict): raise DistutilsGetoptError( "ERROR: Could not add entry points. They were:\n" + entry_points) else: cs = entry_points.get('console_scripts', []) gs = entry_points.get('gui_scripts', []) # We have *other* kinds of entry-points so we need # setuptools at run-time if not cs and not gs and len(entry_points) > 1: d['requirements']['run'].append('setuptools') d['requirements']['build'].append('setuptools') entry_list = cs + gs if gs and conda.config.platform == 'osx': d['build']['osx_is_app'] = True if len(cs + gs) != 0: d['build']['entry_points'] = entry_list if metadata.conda_command_tests is True: d['test']['commands'] = list( map(unicode, pypi.make_entry_tests(entry_list))) if 'setuptools' in d['requirements']['run']: d['build']['preserve_egg_dir'] = True if metadata.conda_import_tests: if metadata.conda_import_tests is True: d['test']['imports'] = ( (self.distribution.packages or []) + (self.distribution.py_modules or [])) else: d['test']['imports'] = metadata.conda_import_tests if (metadata.conda_command_tests and not isinstance(metadata.conda_command_tests, bool)): d['test']['commands'] = list( map(unicode, metadata.conda_command_tests)) d = dict(d) m = MetaData.fromdict(d) # Shouldn't fail, but do you really trust the code above? m.check_fields() build.build(m, post=False) # Do the install if not PY3: # Command is an old-style class in Python 2 install.run(self) else: super().run() build.build(m, post=True) build.test(m) if self.binstar_upload: class args: binstar_upload = self.binstar_upload handle_binstar_upload(build.bldpkg_path(m), args) else: no_upload_message = """\ # If you want to upload this package to binstar.org later, type: # # $ binstar upload %s """ % build.bldpkg_path(m) print(no_upload_message)
def get_noarch_python_meta(meta): d = meta.meta d['build']['noarch'] = "python" return MetaData.fromdict(d, config=meta.config)