def format_wheel_json_metadata(data, filename, zipfile): package_data = { 'name': pop_key(data, 'name'), 'summary': pop_key(data, 'summary', None), 'license': pop_key(data, 'license', None) } description_doc = (data.get('document_names') or {}).get('description') # Metadata version 2.0 if not description_doc: description_doc = data.get('extensions', {}).get('python.details', {}).get('document_names', {}).get('description') if description_doc: description = extract_first(zipfile, '*.dist-info/%s' % description_doc).strip() else: description = None home_page = (data.get('project_urls', {})).get('Home') if not home_page: home_page = data.get('extensions', {}).get('python.details', {}).get('project_urls', {}).get('Home') release_data = { 'version': pop_key(data, 'version'), 'description': description, 'home_page': home_page } attrs = { 'packagetype': 'bdist_wheel', 'python_version': 'source', 'pypi': [{ 'key': k, 'value': v } for (k, v) in data.items()] } if data.get('run_requires', {}): dependencies = format_run_requires_metadata(data['run_requires']) else: dependencies = format_requires_metadata(data.get('requires', {})) file_data = { 'basename': path.basename(filename), 'attrs': attrs, 'dependencies': dependencies } return package_data, release_data, file_data
def format_wheel_json_metadata(data, filename, zipfile): package_data = { 'name': pop_key(data, 'name'), 'summary': pop_key(data, 'summary', None), 'license': pop_key(data, 'license', None), } description_doc = (data.get('document_names') or {}).get('description') # Metadata version 2.0 if not description_doc: description_doc = data.get('extensions', {}).get('python.details', {}).get('document_names', {}).get('description') if description_doc: description = extract_first(zipfile, '*.dist-info/%s' % description_doc).strip() else: description = None home_page = (data.get('project_urls', {})).get('Home') if not home_page: home_page = data.get('extensions', {}).get('python.details', {}).get('project_urls', {}).get('Home') release_data = { 'version': pop_key(data, 'version'), 'description': description, 'home_page': home_page, } attrs = { 'packagetype': 'bdist_wheel', 'python_version': 'source', 'pypi': [{'key': k, 'value': v} for (k, v) in data.items()] } if data.get('run_requires', {}): dependencies = format_run_requires_metadata(data['run_requires']) else: dependencies = format_requires_metadata(data.get('requires', {})) file_data = { 'basename': path.basename(filename), 'attrs': attrs, 'dependencies': dependencies, } return package_data, release_data, file_data
def inspect_pypi_package_zip(filename, fileobj): filename, fileobj tf = zipfile.ZipFile(fileobj) data = extract_first(tf, '*/PKG-INFO') if data is None: raise errors.NoMetadataError("Could not find EGG-INFO/PKG-INFO file in pypi sdist") attrs = dict(Parser().parsestr(data).items()) package_data = {'name': pop_key(attrs, 'Name'), 'summary': pop_key(attrs, 'Summary', None), 'license': pop_key(attrs, 'License', None), } release_data = { 'version': pop_key(attrs, 'Version'), 'description': pop_key(attrs, 'Description', None), 'home_page': pop_key(attrs, 'Home-page', None) } file_data = { 'basename': basename(filename), 'attrs': attrs, } attrs.update({ 'packagetype': 'bdist_egg', 'python_version': 'source', }) return package_data, release_data, file_data
def format_wheel_json_metadata(data, filename, zipfile): package_data = {'name': pop_key(data, 'name'), 'summary': pop_key(data, 'summary', None), 'license': pop_key(data, 'license', None), } description_doc = pop_key(data.get('document_names') or {}, 'description', None) if description_doc: description = extract_first(zipfile, '*.dist-info/%s' % description_doc) else: description = None release_data = { 'version': pop_key(data, 'version'), 'description': description, 'home_page': pop_key(data.get('project_urls', {}), 'Home', None) } data.update({ 'packagetype': 'bdist_wheel', 'python_version':'source', }) if data.get('run_requires', {}): dependencies = format_run_requires_metadata(data['run_requires']) else: dependencies = format_requires_metadata(data.get('requires', {})) file_data = { 'basename': path.basename(filename), 'attrs': data, 'dependencies': dependencies, } return package_data, release_data, file_data
def inspect_pypi_package_zip(filename, fileobj): filename, fileobj tf = zipfile.ZipFile(fileobj) data = extract_first(tf, '*/PKG-INFO') if data is None: raise errors.NoMetadataError("Could not find EGG-INFO/PKG-INFO file in pypi sdist") attrs = dict(Parser().parsestr(data.encode("UTF-8", "replace")).items()) package_data = {'name': pop_key(attrs, 'Name'), 'summary': pop_key(attrs, 'Summary', None), 'license': pop_key(attrs, 'License', None)} release_data = {'version': pop_key(attrs, 'Version'), 'description': pop_key(attrs, 'Description', None), 'home_page': pop_key(attrs, 'Home-page', None)} file_data = {'basename': path.basename(filename), 'attrs': { 'packagetype': 'bdist_egg', 'python_version': 'source'} } return package_data, release_data, file_data
def inspect_pypi_package_egg(filename, fileobj): tf = zipfile.ZipFile(fileobj) data = extract_first(tf, 'EGG-INFO/PKG-INFO') if data is None: raise errors.NoMetadataError("Could not find EGG-INFO/PKG-INFO file in pypi sdist") attrs = dict(Parser().parsestr(data.encode("UTF-8", "replace")).items()) package_data = {'name': pop_key(attrs, 'Name'), 'summary': pop_key(attrs, 'Summary', None), 'license': pop_key(attrs, 'License', None)} release_data = {'version': pop_key(attrs, 'Version'), 'description': pop_key(attrs, 'Description', None), 'home_page': pop_key(attrs, 'Home-page', None)} if len(filename.split('-')) == 4: _, _, python_version, platform = filename[:-4].split('-') else: python_version = 'source' platform = None file_data = {'basename': path.basename(filename), 'attrs': {'packagetype': 'bdist_egg', 'python_version': python_version}, 'platform': platform} requires_txt = extract_first(tf, 'EGG-INFO/requires.txt') if requires_txt: file_data.update(dependencies=parse_requires_txt(requires_txt)) return package_data, release_data, file_data
def inspect_pypi_package_zip(filename, fileobj): filename, fileobj tf = zipfile.ZipFile(fileobj) data = extract_first(tf, "*/PKG-INFO") if data is None: raise errors.NoMetadataError("Could not find EGG-INFO/PKG-INFO file in pypi sdist") attrs = dict(Parser().parsestr(data.encode("UTF-8", "replace")).items()) package_data = { "name": pop_key(attrs, "Name"), "summary": pop_key(attrs, "Summary", None), "license": pop_key(attrs, "License", None), } release_data = { "version": pop_key(attrs, "Version"), "description": pop_key(attrs, "Description", None), "home_page": pop_key(attrs, "Home-page", None), } file_data = {"basename": path.basename(filename), "attrs": {"packagetype": "bdist_egg", "python_version": "source"}} return package_data, release_data, file_data
def format_wheel_json_metadata(data, filename, zipfile): package_data = { "name": pop_key(data, "name"), "summary": pop_key(data, "summary", None), "license": pop_key(data, "license", None), } description_doc = (data.get("document_names") or {}).get("description") # Metadata version 2.0 if not description_doc: description_doc = ( data.get("extensions", {}).get("python.details", {}).get("document_names", {}).get("description") ) if description_doc: description = extract_first(zipfile, "*.dist-info/%s" % description_doc).strip() else: description = None home_page = (data.get("project_urls", {})).get("Home") if not home_page: home_page = data.get("extensions", {}).get("python.details", {}).get("project_urls", {}).get("Home") release_data = {"version": pop_key(data, "version"), "description": description, "home_page": home_page} attrs = { "packagetype": "bdist_wheel", "python_version": "source", "pypi": [{"key": k, "value": v} for (k, v) in data.items()], } if data.get("run_requires", {}): dependencies = format_run_requires_metadata(data["run_requires"]) else: dependencies = format_requires_metadata(data.get("requires", {})) file_data = {"basename": path.basename(filename), "attrs": attrs, "dependencies": dependencies} return package_data, release_data, file_data
def inspect_pypi_package_egg(filename, fileobj): tf = zipfile.ZipFile(fileobj) data = extract_first(tf, 'EGG-INFO/PKG-INFO') if data is None: raise errors.NoMetadataError("Could not find EGG-INFO/PKG-INFO file " "in pypi sdist") attrs = dict(python_version_check(data)) package_data = {'name': pop_key(attrs, 'Name'), 'summary': pop_key(attrs, 'Summary', None), 'license': pop_key(attrs, 'License', None)} release_data = {'version': pop_key(attrs, 'Version'), 'description': pop_key(attrs, 'Description', None), 'home_page': pop_key(attrs, 'Home-page', None)} basename = path.basename(filename) if len(basename.split('-')) == 4: _, _, python_version, platform = basename[:-4].split('-') else: python_version = 'source' platform = None file_data = {'basename': path.basename(filename), 'attrs': {'packagetype': 'bdist_egg', 'python_version': python_version}, 'platform': platform} requires_txt = extract_first(tf, 'EGG-INFO/requires.txt') if requires_txt: file_data.update(dependencies=parse_requires_txt(requires_txt)) return package_data, release_data, file_data
def inspect_pypi_package_sdist(filename, fileobj): tf = tarfile.open(filename, fileobj=fileobj) data = extract_first(tf, '*.egg-info/PKG-INFO') distrubite = False if data is None: data = extract_first(tf, '*/PKG-INFO') distrubite = True if data is None: raise errors.NoMetadataError("Could not find *.egg-info/PKG-INFO file in pypi sdist") config_items = Parser().parsestr(data).items() attrs = dict(config_items) name = pop_key(attrs, 'Name', None) if name is None: name = filename.split('-', 1)[0] package_data = {'name': name, 'summary': pop_key(attrs, 'Summary', None), 'license': pop_key(attrs, 'License', None), } release_data = { 'version': pop_key(attrs, 'Version'), 'description': pop_key(attrs, 'Description', None), 'home_page': pop_key(attrs, 'Home-page', None) } file_data = { 'basename': basename(filename), 'attrs': attrs, } if distrubite: # Distrubite does not create dep files file_data.update(dependencies=disutils_dependencies(config_items)) requires_txt = extract_first(tf, '*.egg-info/requires.txt') if requires_txt: file_data.update(dependencies=parse_requires_txt(requires_txt)) attrs.update({ 'packagetype': 'sdist', 'python_version':'source', }) return package_data, release_data, file_data
def inspect_pypi_package_sdist(filename, fileobj): tf = tarfile.open(filename, fileobj=fileobj) data = extract_first(tf, '*.egg-info/PKG-INFO') distrubite = False if data is None: data = extract_first(tf, '*/PKG-INFO') distrubite = True if data is None: raise errors.NoMetadataError( "Could not find *.egg-info/PKG-INFO file in pypi sdist") config_items = python_version_check(data) attrs = dict(config_items) name = pop_key(attrs, 'Name', None) if name is None: basename = path.basename(filename) name = basename.split('-')[0] package_data = { 'name': name, 'summary': pop_key(attrs, 'Summary', None), 'license': pop_key(attrs, 'License', None) } release_data = { 'version': pop_key(attrs, 'Version'), 'description': pop_key(attrs, 'Description', None), 'home_page': pop_key(attrs, 'Home-page', None) } file_data = { 'basename': path.basename(filename), 'attrs': { 'packagetype': 'sdist', 'python_version': 'source', } } if distrubite: # Distrubite does not create dep files file_data.update(dependencies=disutils_dependencies(config_items)) requires_txt = extract_first(tf, '*.egg-info/requires.txt') if requires_txt: file_data.update(dependencies=parse_requires_txt(requires_txt)) return package_data, release_data, file_data
def inspect_pypi_package_sdist(filename, fileobj): tf = tarfile.open(filename, fileobj=fileobj) data = extract_first(tf, "*.egg-info/PKG-INFO") distrubite = False if data is None: data = extract_first(tf, "*/PKG-INFO") distrubite = True if data is None: raise errors.NoMetadataError("Could not find *.egg-info/PKG-INFO file in pypi sdist") config_items = python_version_check(data) attrs = dict(config_items) name = pop_key(attrs, "Name", None) if name is None: basename = path.basename(filename) name = basename.split("-")[0] package_data = { "name": name, "summary": pop_key(attrs, "Summary", None), "license": pop_key(attrs, "License", None), } release_data = { "version": pop_key(attrs, "Version"), "description": pop_key(attrs, "Description", None), "home_page": pop_key(attrs, "Home-page", None), } file_data = {"basename": path.basename(filename), "attrs": {"packagetype": "sdist", "python_version": "source"}} if distrubite: # Distrubite does not create dep files file_data.update(dependencies=disutils_dependencies(config_items)) requires_txt = extract_first(tf, "*.egg-info/requires.txt") if requires_txt: file_data.update(dependencies=parse_requires_txt(requires_txt)) return package_data, release_data, file_data
def inspect_pypi_package_egg(filename, fileobj): tf = zipfile.ZipFile(fileobj) data = extract_first(tf, "EGG-INFO/PKG-INFO") if data is None: raise errors.NoMetadataError("Could not find EGG-INFO/PKG-INFO file in pypi sdist") attrs = dict(python_version_check(data)) package_data = { "name": pop_key(attrs, "Name"), "summary": pop_key(attrs, "Summary", None), "license": pop_key(attrs, "License", None), } release_data = { "version": pop_key(attrs, "Version"), "description": pop_key(attrs, "Description", None), "home_page": pop_key(attrs, "Home-page", None), } basename = path.basename(filename) if len(basename.split("-")) == 4: _, _, python_version, platform = basename[:-4].split("-") else: python_version = "source" platform = None file_data = { "basename": path.basename(filename), "attrs": {"packagetype": "bdist_egg", "python_version": python_version}, "platform": platform, } requires_txt = extract_first(tf, "EGG-INFO/requires.txt") if requires_txt: file_data.update(dependencies=parse_requires_txt(requires_txt)) return package_data, release_data, file_data
def format_sdist_header_metadata(data, filename): """ Format the metadata of pypi packages stored in email header format. Currently only used as backup on the wheel (compressed) file format. """ description = get_header_description(data) config_items = python_version_check(data) attrs = dict(config_items) name = pop_key(attrs, 'Name', None) basename = path.basename(filename) if name is None: name = basename.split('-')[0] package_data = { 'name': name, 'summary': pop_key(attrs, 'Summary', None), 'license': pop_key(attrs, 'License', None), } release_data = { 'version': pop_key(attrs, 'Version'), 'description': pop_key(attrs, 'Description', description), 'home_page': pop_key(attrs, 'Home-page', None), } file_data = { 'basename': basename, 'attrs': { 'packagetype': 'sdist', 'python_version': 'source', } } # Parse multiple keys deps = [] exts = {} environments = {} for key, val in config_items: if key in ['Requires-Dist', 'Requires']: name, extras, const, marker, url = parse_specification(val) name = norm_package_name(name) specs = const.split(',') new_specs = [] for spec in specs: pos = [i for i, c in enumerate(spec) if c in '0123456789'] if pos: pos = pos[0] comp, spec_ = spec[:pos].strip(), spec[pos:].strip() new_specs.append((comp, spec_)) # TODO: All this is to preserve the format used originally # but is this really needed? if marker: if marker.startswith('extra'): marker = marker.replace('extra', '') marker = marker.replace('==', '').strip() ext = marker.rsplit(' ')[-1] if '"' in ext or "'" in ext: ext = ext[1:-1] if ext not in exts: exts[ext] = [{'name': name, 'specs': new_specs}] else: exts[ext].append({'name': name, 'specs': new_specs}) else: if marker not in environments: environments[marker] = [{ 'name': name, 'specs': new_specs }] else: environments[marker].append({ 'name': name, 'specs': new_specs }) else: deps.append({ 'name': name, 'specs': new_specs, }) deps.sort(key=lambda o: o['name']) new_exts = [] for key, values in exts.items(): new_exts.append({'name': key, 'depends': values}) new_environments = [] for key, values in environments.items(): new_environments.append({'name': key, 'depends': values}) file_data.update( dependencies={ 'has_dep_errors': False, 'depends': deps, 'extras': new_exts, 'environments': new_environments, }) return package_data, release_data, file_data
def format_sdist_header_metadata(data, filename): """ Format the metadata of pypi packages stored in email header format. Currently only used as backup on the wheel (compressed) file format. """ description = get_header_description(data) config_items = python_version_check(data) attrs = dict(config_items) name = pop_key(attrs, 'Name', None) basename = path.basename(filename) if name is None: name = basename.split('-')[0] package_data = { 'name': name, 'summary': pop_key(attrs, 'Summary', None), 'license': pop_key(attrs, 'License', None), } release_data = { 'version': pop_key(attrs, 'Version'), 'description': pop_key(attrs, 'Description', description), 'home_page': pop_key(attrs, 'Home-page', None), } file_data = { 'basename': basename, 'attrs': { 'packagetype': 'sdist', 'python_version': 'source', } } # Parse multiple keys deps = [] exts = {} environments = {} for key, val in config_items: if key in ['Requires-Dist', 'Requires']: name, extras, const, marker, url = parse_specification(val) name = norm_package_name(name) specs = const.split(',') new_specs = [] for spec in specs: pos = [i for i, c in enumerate(spec) if c in '0123456789'] if pos: pos = pos[0] comp, spec_ = spec[:pos].strip(), spec[pos:].strip() new_specs.append((comp, spec_)) # TODO: All this is to preserve the format used originally # but is this really needed? if marker: if marker.startswith('extra'): marker = marker.replace('extra', '') marker = marker.replace('==', '').strip() ext = marker.rsplit(' ')[-1] if '"' in ext or "'" in ext: ext = ext[1:-1] if ext not in exts: exts[ext] = [{'name': name, 'specs': new_specs}] else: exts[ext].append({'name': name, 'specs': new_specs}) else: if marker not in environments: environments[marker] = [{'name': name, 'specs': new_specs}] else: environments[marker].append({'name': name, 'specs': new_specs}) else: deps.append({ 'name': name, 'specs': new_specs, }) deps.sort(key=lambda o: o['name']) new_exts = [] for key, values in exts.items(): new_exts.append({'name': key, 'depends': values}) new_environments = [] for key, values in environments.items(): new_environments.append({'name': key, 'depends': values}) file_data.update(dependencies={ 'has_dep_errors': False, 'depends': deps, 'extras': new_exts, 'environments': new_environments, }) return package_data, release_data, file_data