[Python-checkins] commit of r41473 - in sandbox/trunk/setuptools: . setuptools.egg-info setuptools/command

phillip.eby@python.org phillip.eby at python.org
Fri Nov 18 05:37:34 CET 2005


Author: phillip.eby
Date: Fri Nov 18 05:37:31 2005
New Revision: 41473

Modified:
   sandbox/trunk/setuptools/setup.py
   sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt
   sandbox/trunk/setuptools/setuptools.txt
   sandbox/trunk/setuptools/setuptools/command/build_py.py
Log:
Added the ``include_package_data`` keyword to ``setup()``, allowing you to
automatically include any package data listed in revision control or
``MANIFEST.in``.  Now projects can manage their data files and source
manifests without having to maintain two ways to express the same file
list.  Yay!


Modified: sandbox/trunk/setuptools/setup.py
==============================================================================
--- sandbox/trunk/setuptools/setup.py	(original)
+++ sandbox/trunk/setuptools/setup.py	Fri Nov 18 05:37:31 2005
@@ -36,7 +36,7 @@
     url = "http://peak.telecommunity.com/DevCenter/setuptools",
     test_suite = 'setuptools.tests.test_suite',
     packages = find_packages(),
-    package_data = {'setuptools': ['*.exe']},
+    include_package_data = True,
     py_modules = ['pkg_resources', 'easy_install', 'site'],
 
     zip_safe = False,   # We want 'python -m easy_install' to work, for now :(
@@ -53,6 +53,7 @@
             "entry_points       = setuptools.dist:check_entry_points",
             "test_suite         = setuptools.dist:check_test_suite",
             "zip_safe           = setuptools.dist:assert_bool",
+            "include_package_data = setuptools.dist:assert_bool",
         ],
         "egg_info.writers": [
             "PKG-INFO = setuptools.command.egg_info:write_pkg_info",
@@ -66,7 +67,6 @@
         "console_scripts":
             ["easy_install = setuptools.command.easy_install:main"],
     },
-
     classifiers = [f.strip() for f in """
     Development Status :: 3 - Alpha
     Intended Audience :: Developers

Modified: sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt
==============================================================================
--- sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt	(original)
+++ sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt	Fri Nov 18 05:37:31 2005
@@ -2,6 +2,7 @@
 entry_points = setuptools.dist:check_entry_points
 extras_require = setuptools.dist:check_extras
 install_requires = setuptools.dist:check_install_requires
+include_package_data = setuptools.dist:assert_bool
 namespace_packages = setuptools.dist:check_nsp
 test_suite = setuptools.dist:check_test_suite
 eager_resources = setuptools.dist:assert_string_list

Modified: sandbox/trunk/setuptools/setuptools.txt
==============================================================================
--- sandbox/trunk/setuptools/setuptools.txt	(original)
+++ sandbox/trunk/setuptools/setuptools.txt	Fri Nov 18 05:37:31 2005
@@ -189,6 +189,13 @@
 ``setuptools``.  All of them are optional; you do not have to supply them
 unless you need the associated ``setuptools`` feature.
 
+``include_package_data``
+    If set to ``True``, this tells ``setuptools`` to automatically include any
+    data files it finds inside your package directories, that are either under
+    CVS or Subversion control, or which are specified by your ``MANIFEST.in``
+    file.  For more information, see the section below on `Including Data
+    Files`_.
+    
 ``package_data``
     A dictionary mapping package names to lists of glob patterns.  For a
     complete description and examples, see the section below on `Including
@@ -514,8 +521,26 @@
 The distutils have traditionally allowed installation of "data files", which
 are placed in a platform-specific location.  However, the most common use case
 for data files distributed with a package is for use *by* the package, usually
-by including the data files in the package directory.  Setuptools supports this
-by allowing a ``package_data`` argument to ``setup()``, e.g.::
+by including the data files in the package directory.
+
+Setuptools offers two ways to specify data files to be included in your
+packages.  First, you can simply use the ``include_package_data`` keyword,
+e.g.::
+
+    from setuptools import setup, find_packages
+    setup(
+        ...
+        include_package_data = True
+    )
+
+This tells setuptools to install any data files it finds in your packages.  The
+data files must be under CVS or Subversion control, or else they must be
+specified via the distutils' ``MANIFEST.in`` file.
+
+If you want finer-grained control over what files are included (for example, if
+you have documentation files in your package directories and want to exclude
+them from installation), then you can use the ``package_data`` keyword instead,
+e.g.::
 
     from setuptools import setup, find_packages
     setup(
@@ -576,7 +601,6 @@
 __ http://docs.python.org/dist/node11.html 
 
 
-
 Accessing Data Files at Runtime
 -------------------------------
 
@@ -1982,6 +2006,10 @@
    the project's ``.egg-info`` directory as ``SOURCES.txt``, and it is rebuilt
    every time the ``egg_info`` command is run.
 
+ * Added the ``include_package_data`` keyword to ``setup()``, allowing you to
+   automatically include any package data listed in revision control or
+   ``MANIFEST.in``.
+
 0.6a8
  * Fixed some problems building extensions when Pyrex was installed, especially
    with Python 2.4 and/or packages using SWIG.

Modified: sandbox/trunk/setuptools/setuptools/command/build_py.py
==============================================================================
--- sandbox/trunk/setuptools/setuptools/command/build_py.py	(original)
+++ sandbox/trunk/setuptools/setuptools/command/build_py.py	Fri Nov 18 05:37:31 2005
@@ -3,7 +3,6 @@
 from distutils.util import convert_path
 from glob import glob
 
-
 class build_py(_build_py):
     """Enhanced 'build_py' command that includes data files with packages
 
@@ -17,7 +16,7 @@
     def finalize_options(self):
         _build_py.finalize_options(self)
         self.package_data = self.distribution.package_data
-        self.data_files = self.get_data_files()
+        if 'data_files' in self.__dict__: del self.__dict__['data_files']
 
     def run(self):
         """Build modules, packages, and copy data files to build directory"""
@@ -35,12 +34,14 @@
         # output files are.
         self.byte_compile(_build_py.get_outputs(self, include_bytecode=0))
 
+    def __getattr__(self,attr):
+        if attr=='data_files':  # lazily compute data files
+            self.data_files = files = self._get_data_files(); return files
+        return _build_py.__getattr__(self,attr)
 
-
-
-
-    def get_data_files(self):
+    def _get_data_files(self):
         """Generate list of '(package,src_dir,build_dir,filenames)' tuples"""
+        self.analyze_manifest()
         data = []
         for package in self.packages or ():
             # Locate package source directory
@@ -63,7 +64,7 @@
         """Return filenames for package's data files in 'src_dir'"""
         globs = (self.package_data.get('', [])
                  + self.package_data.get(package, []))
-        files = []
+        files = self.manifest_files.get(package, [])[:]
         for pattern in globs:
             # Each pattern has to be converted to a platform-specific path
             files.extend(glob(os.path.join(src_dir, convert_path(pattern))))
@@ -79,45 +80,44 @@
                 self.copy_file(os.path.join(src_dir, filename), target)
 
 
+    def analyze_manifest(self):
+        self.manifest_files = mf = {}
+        if not self.distribution.include_package_data:
+            return
 
-    def get_outputs(self, include_bytecode=1):
-        """Return complete list of files copied to the build directory
-
-        This includes both '.py' files and data files, as well as '.pyc' and
-        '.pyo' files if 'include_bytecode' is true.  (This method is needed for
-        the 'install_lib' command to do its job properly, and to generate a
-        correct installation manifest.)
-        """
-        return _build_py.get_outputs(self, include_bytecode) + [
-            os.path.join(build_dir, filename)
-            for package, src_dir, build_dir,filenames in self.data_files
-            for filename in filenames
-            ]
-
-
-if sys.version>="2.4":
-    # Python 2.4 already has the above code
-    build_py = _build_py
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+        src_dirs = {}
+        for package in self.packages or ():
+            # Locate package source directory
+            src_dirs[self.get_package_dir(package)] = package
 
+        self.run_command('egg_info')
+        ei_cmd = self.get_finalized_command('egg_info')
+        for path in ei_cmd.filelist.files:
+            if path.endswith('.py'): continue
+            d,f = os.path.split(path)
+            while d and d not in src_dirs:
+                d, df = os.path.split(d)
+                f = os.path.join(df, f)
+            if d in src_dirs:
+                mf.setdefault(src_dirs[d],[]).append(path)
+
+
+    def get_data_files(self): pass  # kludge 2.4 for lazy computation
+
+    if sys.version<"2.4":    # Python 2.4 already has this code
+        def get_outputs(self, include_bytecode=1):
+            """Return complete list of files copied to the build directory
+
+            This includes both '.py' files and data files, as well as '.pyc'
+            and '.pyo' files if 'include_bytecode' is true.  (This method is
+            needed for the 'install_lib' command to do its job properly, and to
+            generate a correct installation manifest.)
+            """
+            return _build_py.get_outputs(self, include_bytecode) + [
+                os.path.join(build_dir, filename)
+                for package, src_dir, build_dir,filenames in self.data_files
+                for filename in filenames
+                ]
 
 
 


More information about the Python-checkins mailing list