from distutils.core import Command import os import sys import pkg_resources try:
import json
except ImportError:
import simplejson as json
PY3 = sys.version_info == 3
if PY3:
def u(s): return s
else:
def u(s): if isinstance(u, unicode): return u return s.decode('utf-8')
# Note, the last time I coded python daily was at Google, so it's entirely # possible some of my techniques below are outdated or bad. # If you have fixes, let me know.
class get_metadata(Command):
description = "get package metadata" user_options = [ ('load-requirements-txt', 'l', "load dependencies from requirements.txt"), ("output=", "o", "output destination for metadata json") ] boolean_options = ['load-requirements-txt'] def initialize_options(self): self.load_requirements_txt = False self.cwd = None self.output = None def finalize_options(self): self.cwd = os.getcwd() self.requirements_txt = os.path.join(self.cwd, "requirements.txt") # make sure we have a requirements.txt if self.load_requirements_txt: self.load_requirements_txt = os.path.exists(self.requirements_txt) def process_dep(self, dep): deps = [] if dep.specs: for operator, version in dep.specs: deps.append("%s %s %s" % (dep.project_name, operator, version)) else: deps.append(dep.project_name) return deps def run(self): data = { "name": self.distribution.get_name(), "version": self.distribution.get_version(), "author": u("%s <%s>") % ( u(self.distribution.get_author()), u(self.distribution.get_author_email()), ), "description": self.distribution.get_description(), "license": self.distribution.get_license(), "url": self.distribution.get_url(), } if self.distribution.has_ext_modules(): data["architecture"] = "native" else: data["architecture"] = "all" final_deps = [] if self.load_requirements_txt: requirement = open(self.requirements_txt).readlines() for dep in pkg_resources.parse_requirements(requirement): final_deps.extend(self.process_dep(dep)) else: if getattr(self.distribution, 'install_requires', None): for dep in pkg_resources.parse_requirements( self.distribution.install_requires): final_deps.extend(self.process_dep(dep)) data["dependencies"] = final_deps output = open(self.output, "w") if hasattr(json, 'dumps'): output.write(json.dumps(data, indent=2)) else: # For Python 2.5 and Debian's python-json output.write(json.write(data))