From aa2b442bdccf68c191a0023084b1160804fb5e4c Mon Sep 17 00:00:00 2001 From: Jeremy Kloth Date: Mon, 12 Sep 2011 11:12:42 -0600 Subject: [PATCH] Factor out the distribution file-system safe name functions from install_distinfo to allow all metadata consumers access to them. --- Lib/packaging/command/install_distinfo.py | 32 +---------------------- Lib/packaging/dist.py | 4 +-- Lib/packaging/metadata.py | 16 +++++++++--- 3 files changed, 16 insertions(+), 36 deletions(-) diff --git a/Lib/packaging/command/install_distinfo.py b/Lib/packaging/command/install_distinfo.py index 1f48eedab73..c1f85eddf0c 100644 --- a/Lib/packaging/command/install_distinfo.py +++ b/Lib/packaging/command/install_distinfo.py @@ -63,9 +63,7 @@ class install_distinfo(Command): metadata = self.distribution.metadata - basename = "%s-%s.dist-info" % ( - to_filename(safe_name(metadata['Name'])), - to_filename(safe_version(metadata['Version']))) + basename = metadata.get_fullname(filesafe=True) + ".dist-info" self.distinfo_dir = os.path.join(self.distinfo_dir, basename) @@ -145,31 +143,3 @@ class install_distinfo(Command): def get_outputs(self): return self.outfiles - - -# The following functions are taken from setuptools' pkg_resources module. - -def safe_name(name): - """Convert an arbitrary string to a standard distribution name - - Any runs of non-alphanumeric/. characters are replaced with a single '-'. - """ - return re.sub('[^A-Za-z0-9.]+', '-', name) - - -def safe_version(version): - """Convert an arbitrary string to a standard version string - - Spaces become dots, and all other non-alphanumeric characters become - dashes, with runs of multiple dashes condensed to a single dash. - """ - version = version.replace(' ', '.') - return re.sub('[^A-Za-z0-9.]+', '-', version) - - -def to_filename(name): - """Convert a project or version name to its filename-escaped form - - Any '-' characters are currently replaced with '_'. - """ - return name.replace('-', '_') diff --git a/Lib/packaging/dist.py b/Lib/packaging/dist.py index f1441d14cb8..de718ccdacd 100644 --- a/Lib/packaging/dist.py +++ b/Lib/packaging/dist.py @@ -228,8 +228,8 @@ Common commands: (see '--help-commands' for more) d = self.command_options[command] = {} return d - def get_fullname(self): - return self.metadata.get_fullname() + def get_fullname(self, filesafe=False): + return self.metadata.get_fullname(filesafe) def dump_option_dicts(self, header=None, commands=None, indent=""): from pprint import pformat diff --git a/Lib/packaging/metadata.py b/Lib/packaging/metadata.py index dbb53b265c3..a3db51c1124 100644 --- a/Lib/packaging/metadata.py +++ b/Lib/packaging/metadata.py @@ -182,6 +182,7 @@ _UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') _MISSING = object() +_FILESAFE = re.compile('[^A-Za-z0-9.]+') class Metadata: """The metadata of a release. @@ -285,9 +286,18 @@ class Metadata: # # Public API # - def get_fullname(self): - """Return the distribution name with version""" - return '%s-%s' % (self['Name'], self['Version']) + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + name, version = self['Name'], self['Version'] + if filesafe: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) def is_metadata_field(self, name): """return True if name is a valid metadata key"""