[Python-checkins] distutils2: added support for more metadata and files

tarek.ziade python-checkins at python.org
Fri Oct 1 23:36:37 CEST 2010


tarek.ziade pushed c7e47ada3eec to distutils2:

http://hg.python.org/distutils2/rev/c7e47ada3eec
changeset:   691:c7e47ada3eec
tag:         tip
user:        Tarek Ziade <tarek at ziade.org>
date:        Fri Oct 01 23:36:27 2010 +0200
summary:     added support for more metadata and files
files:       distutils2/config.py, distutils2/metadata.py, distutils2/tests/test_config.py

diff --git a/distutils2/config.py b/distutils2/config.py
--- a/distutils2/config.py
+++ b/distutils2/config.py
@@ -75,16 +75,58 @@
         # XXX
         return value
 
+    def _multiline(self, value):
+        if '\n' in value:
+            value = [v for v in
+                        [v.strip() for v in value.split('\n')]
+                        if v != '']
+        return value
+
     def _read_metadata(self, parser):
         if parser.has_option('global', 'setup_hook'):
             self.setup_hook = parser.get('global', 'setup_hook')
 
         metadata = self.dist.metadata
+
         # setting the metadata values
         if 'metadata' in parser.sections():
             for key, value in parser.items('metadata'):
+                key = key.replace('_', '-')
+                value = self._multiline(value)
+                if key == 'project-url':
+                    value = [(label.strip(), url.strip())
+                             for label, url in
+                             [v.split(',') for v in value]]
                 if metadata.is_metadata_field(key):
                     metadata[key] = self._convert_metadata(key, value)
+        if 'files' in parser.sections():
+            files = dict([(key, self._multiline(value))
+                          for key, value in parser.items('files')])
+            self.dist.packages = files.get('packages', [])
+            self.dist.py_modules = files.get('py_modules', [])
+            if isinstance(self.dist.py_modules, str):
+                self.dist.py_modules = [self.dist.py_modules]
+            self.dist.scripts = files.get('scripts', [])
+
+            self.dist.package_data = {}
+            for data in files.get('package_data', []):
+                data = data.split('=')
+                if len(data) != 2:
+                    continue
+                key, value = data
+                self.dist.package_data[key.strip()] = value.strip()
+
+            self.dist.data_files = []
+            for data in files.get('data_files', []):
+                data = data.split('=')
+                if len(data) != 2:
+                    continue
+                key, value = data
+                values = [v.strip() for v in value.split(',')]
+                self.dist.data_files.append((key, values))
+
+            # manifest template
+            # XXX see later
 
     def parse_config_files(self, filenames=None):
         if filenames is None:
diff --git a/distutils2/metadata.py b/distutils2/metadata.py
--- a/distutils2/metadata.py
+++ b/distutils2/metadata.py
@@ -368,7 +368,7 @@
         if ((name in _ELEMENTSFIELD or name == 'Platform') and
             not isinstance(value, (list, tuple))):
             if isinstance(value, str):
-                value = value.split(',')
+                value = [v.strip() for v in value.split(',')]
             else:
                 value = []
         elif (name in _LISTFIELDS and
diff --git a/distutils2/tests/test_config.py b/distutils2/tests/test_config.py
--- a/distutils2/tests/test_config.py
+++ b/distutils2/tests/test_config.py
@@ -1,3 +1,4 @@
+# -*- encoding: utf8 -*-
 """Tests for distutils.config."""
 import sys
 import os
@@ -9,9 +10,67 @@
 
 SETUP_CFG = """
 [metadata]
-version = 1.0
-author = tarek
-author_email = tarek at ziade.org
+name = RestingParrot
+version = 0.6.4
+author = Carl Meyer
+author_email = carl at oddbird.net
+maintainer = Éric Araujo
+maintainer_email = merwok at netwok.org
+summary = A sample project demonstrating distutils2 packaging
+description = README
+keywords = distutils2, packaging, sample project
+
+classifier =
+  Development Status :: 4 - Beta
+  Environment :: Console (Text Based)
+  Environment :: X11 Applications :: GTK; python_version < '3'
+  License :: OSI Approved :: MIT License
+  Programming Language :: Python
+  Programming Language :: Python :: 2
+  Programming Language :: Python :: 3
+
+requires_python = >=2.4, <3.2
+
+requires_dist =
+  PetShoppe
+  MichaelPalin (> 1.1)
+  pywin32; sys.platform == 'win32'
+  pysqlite2; python_version < '2.5'
+  inotify (0.0.1); sys.platform == 'linux2'
+
+requires_external = libxml2
+
+provides_dist = distutils2-sample-project (0.2)
+                unittest2-sample-project
+
+project_url =
+  Main repository, http://bitbucket.org/carljm/sample-distutils2-project
+  Fork in progress, http://bitbucket.org/Merwok/sample-distutils2-project
+
+[files]
+packages = one
+           two
+           three
+py_modules = haven
+
+scripts =
+  script1.py
+  scripts/find-coconuts
+  bin/taunt
+
+package_data =
+  cheese = data/templates/*
+
+data_files =
+  bitmaps = bm/b1.gif, bm/b2.gif
+  config = cfg/data.cfg
+  /etc/init.d = init-script
+
+# Replaces MANIFEST.in
+sdist_extra =
+  include THANKS HACKING
+  recursive-include examples *.txt *.py
+  prune examples/sample?/build
 """
 
 class ConfigTestCase(support.TempdirManager,
@@ -39,9 +98,45 @@
             sys.argv[:] = old_args
 
         # check what was done
-        self.assertEqual(dist.metadata['Author'], 'tarek')
-        self.assertEqual(dist.metadata['Author-Email'], 'tarek at ziade.org')
-        self.assertEqual(dist.metadata['Version'], '1.0')
+        self.assertEqual(dist.metadata['Author'], 'Carl Meyer')
+        self.assertEqual(dist.metadata['Author-Email'], 'carl at oddbird.net')
+        self.assertEqual(dist.metadata['Version'], '0.6.4')
+
+        wanted = ['Development Status :: 4 - Beta',
+                'Environment :: Console (Text Based)',
+                "Environment :: X11 Applications :: GTK; python_version < '3'",
+                'License :: OSI Approved :: MIT License',
+                'Programming Language :: Python',
+                'Programming Language :: Python :: 2',
+                'Programming Language :: Python :: 3']
+        self.assertEqual(dist.metadata['Classifier'], wanted)
+
+        wanted = ['distutils2', 'packaging', 'sample project']
+        self.assertEqual(dist.metadata['Keywords'], wanted)
+
+        self.assertEqual(dist.metadata['Requires-Python'], '>=2.4, <3.2')
+
+        wanted = ['PetShoppe',
+                  'MichaelPalin (> 1.1)',
+                  "pywin32; sys.platform == 'win32'",
+                  "pysqlite2; python_version < '2.5'",
+                  "inotify (0.0.1); sys.platform == 'linux2'"]
+
+        self.assertEqual(dist.metadata['Requires-Dist'], wanted)
+        urls = [('Main repository',
+                 'http://bitbucket.org/carljm/sample-distutils2-project'),
+                ('Fork in progress',
+                 'http://bitbucket.org/Merwok/sample-distutils2-project')]
+        self.assertEqual(dist.metadata['Project-Url'], urls)
+
+
+        self.assertEqual(dist.packages, ['one', 'two', 'three'])
+        self.assertEqual(dist.py_modules, ['haven'])
+        self.assertEqual(dist.package_data, {'cheese': 'data/templates/*'})
+        self.assertEqual(dist.data_files,
+            [('bitmaps ', ['bm/b1.gif', 'bm/b2.gif']),
+             ('config ', ['cfg/data.cfg']),
+             ('/etc/init.d ', ['init-script'])])
 
 
 def test_suite():

--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list