This commit is contained in:
Stefan Krah 2012-03-05 17:48:21 +01:00
commit 1e88f3faa6
13 changed files with 72 additions and 31 deletions

View file

@ -264,8 +264,7 @@ the organizations that use Python.
**What are the restrictions on Python's use?** **What are the restrictions on Python's use?**
They're practically nonexistent. Consult the :file:`Misc/COPYRIGHT` file in the They're practically nonexistent. Consult :ref:`history-and-license` for the full
source distribution, or the section :ref:`history-and-license` for the full
language, but it boils down to three conditions: language, but it boils down to three conditions:
* You have to leave the copyright notice on the software; if you don't include * You have to leave the copyright notice on the software; if you don't include

View file

@ -261,8 +261,8 @@ behave slightly differently from real Capsules. Specifically:
copy as you see fit.) copy as you see fit.)
You can find :file:`capsulethunk.h` in the Python source distribution You can find :file:`capsulethunk.h` in the Python source distribution
in the :file:`Doc/includes` directory. We also include it here for as :source:`Doc/includes/capsulethunk.h`. We also include it here for
your reference; here is :file:`capsulethunk.h`: your convenience:
.. literalinclude:: ../includes/capsulethunk.h .. literalinclude:: ../includes/capsulethunk.h

View file

@ -360,7 +360,7 @@ and more.
You can learn about this by interactively experimenting with the :mod:`re` You can learn about this by interactively experimenting with the :mod:`re`
module. If you have :mod:`tkinter` available, you may also want to look at module. If you have :mod:`tkinter` available, you may also want to look at
:file:`Tools/demo/redemo.py`, a demonstration program included with the :source:`Tools/demo/redemo.py`, a demonstration program included with the
Python distribution. It allows you to enter REs and strings, and displays Python distribution. It allows you to enter REs and strings, and displays
whether the RE matches or fails. :file:`redemo.py` can be quite useful when whether the RE matches or fails. :file:`redemo.py` can be quite useful when
trying to debug a complicated RE. Phil Schwartz's `Kodos trying to debug a complicated RE. Phil Schwartz's `Kodos
@ -495,7 +495,7 @@ more convenient. If a program contains a lot of regular expressions, or re-uses
the same ones in several locations, then it might be worthwhile to collect all the same ones in several locations, then it might be worthwhile to collect all
the definitions in one place, in a section of code that compiles all the REs the definitions in one place, in a section of code that compiles all the REs
ahead of time. To take an example from the standard library, here's an extract ahead of time. To take an example from the standard library, here's an extract
from the now deprecated :file:`xmllib.py`:: from the now-defunct Python 2 standard :mod:`xmllib` module::
ref = re.compile( ... ) ref = re.compile( ... )
entityref = re.compile( ... ) entityref = re.compile( ... )

View file

@ -23,7 +23,7 @@ definition of the Python bindings for the DOM and SAX interfaces.
html.rst html.rst
html.parser.rst html.parser.rst
html.entities.rst html.entities.rst
pyexpat.rst xml.etree.elementtree.rst
xml.dom.rst xml.dom.rst
xml.dom.minidom.rst xml.dom.minidom.rst
xml.dom.pulldom.rst xml.dom.pulldom.rst
@ -31,4 +31,4 @@ definition of the Python bindings for the DOM and SAX interfaces.
xml.sax.handler.rst xml.sax.handler.rst
xml.sax.utils.rst xml.sax.utils.rst
xml.sax.reader.rst xml.sax.reader.rst
xml.etree.elementtree.rst pyexpat.rst

View file

@ -15,6 +15,11 @@ Installed Python distributions are represented by instances of
Most functions also provide an extra argument ``use_egg_info`` to take legacy Most functions also provide an extra argument ``use_egg_info`` to take legacy
distributions into account. distributions into account.
For the purpose of this module, "installed" means that the distribution's
:file:`.dist-info`, :file:`.egg-info` or :file:`egg` directory or file is found
on :data:`sys.path`. For example, if the parent directory of a
:file:`dist-info` directory is added to :envvar:`PYTHONPATH`, then it will be
available in the database.
Classes representing installed distributions Classes representing installed distributions
-------------------------------------------- --------------------------------------------
@ -128,7 +133,7 @@ Functions to work with the database
for the first installed distribution matching *name*. Egg distributions are for the first installed distribution matching *name*. Egg distributions are
considered only if *use_egg_info* is true; if both a dist-info and an egg considered only if *use_egg_info* is true; if both a dist-info and an egg
file are found, the dist-info prevails. The directories to be searched are file are found, the dist-info prevails. The directories to be searched are
given in *paths*, which defaults to :data:`sys.path`. Return ``None`` if no given in *paths*, which defaults to :data:`sys.path`. Returns ``None`` if no
matching distribution is found. matching distribution is found.
.. FIXME param should be named use_egg .. FIXME param should be named use_egg
@ -200,20 +205,23 @@ functions:
Examples Examples
-------- --------
Print all information about a distribution Printing all information about a distribution
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Given a path to a ``.dist-info`` distribution, we shall print out all Given the name of an installed distribution, we shall print out all
information that can be obtained using functions provided in this module:: information that can be obtained using functions provided in this module::
import sys import sys
import packaging.database import packaging.database
path = input()
# first create the Distribution instance
try: try:
name = sys.argv[1]
except ValueError:
sys.exit('Not enough arguments')
# first create the Distribution instance
dist = packaging.database.Distribution(path) dist = packaging.database.Distribution(path)
except FileNotFoundError: if dist is None:
sys.exit('No such distribution') sys.exit('No such distribution')
print('Information about %r' % dist.name) print('Information about %r' % dist.name)
@ -244,7 +252,7 @@ information from a :file:`.dist-info` directory. By typing in the console:
.. code-block:: sh .. code-block:: sh
$ echo /tmp/choxie/choxie-2.0.0.9.dist-info | python3 print_info.py python print_info.py choxie
we get the following output: we get the following output:
@ -299,10 +307,23 @@ we get the following output:
* It was installed as a dependency * It was installed as a dependency
Find out obsoleted distributions Getting metadata about a distribution
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Now, we take tackle a different problem, we are interested in finding out Sometimes you're not interested about the packaging information contained in a
full :class:`Distribution` object but just want to do something with its
:attr:`~Distribution.metadata`::
>>> from packaging.database import get_distribution
>>> info = get_distribution('chocolate').metadata
>>> info['Keywords']
['cooking', 'happiness']
Finding out obsoleted distributions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Now, we tackle a different problem, we are interested in finding out
which distributions have been obsoleted. This can be easily done as follows:: which distributions have been obsoleted. This can be easily done as follows::
import packaging.database import packaging.database

View file

@ -260,7 +260,7 @@ class bdist_msi(Command):
self.db.Commit() self.db.Commit()
if hasattr(self.distribution, 'dist_files'): if hasattr(self.distribution, 'dist_files'):
tup = 'bdist_msi', self.target_version or 'any', fullname tup = 'bdist_msi', self.target_version or 'any', installer_name
self.distribution.dist_files.append(tup) self.distribution.dist_files.append(tup)
if not self.keep_temp: if not self.keep_temp:

View file

@ -1,12 +1,12 @@
"""Tests for distutils.command.bdist_msi.""" """Tests for distutils.command.bdist_msi."""
import unittest import os
import sys import sys
import unittest
from test.support import run_unittest from test.support import run_unittest
from distutils.tests import support from distutils.tests import support
@unittest.skipUnless(sys.platform=="win32", "These tests are only for win32")
@unittest.skipUnless(sys.platform == 'win32', 'these tests require Windows')
class BDistMSITestCase(support.TempdirManager, class BDistMSITestCase(support.TempdirManager,
support.LoggingSilencer, support.LoggingSilencer,
unittest.TestCase): unittest.TestCase):
@ -14,9 +14,18 @@ class BDistMSITestCase(support.TempdirManager,
def test_minimal(self): def test_minimal(self):
# minimal test XXX need more tests # minimal test XXX need more tests
from distutils.command.bdist_msi import bdist_msi from distutils.command.bdist_msi import bdist_msi
pkg_pth, dist = self.create_dist() project_dir, dist = self.create_dist()
cmd = bdist_msi(dist) cmd = bdist_msi(dist)
cmd.ensure_finalized() cmd.ensure_finalized()
cmd.run()
bdists = os.listdir(os.path.join(project_dir, 'dist'))
self.assertEqual(bdists, ['foo-0.1.msi'])
# bug #13719: upload ignores bdist_msi files
self.assertEqual(dist.dist_files,
[('bdist_msi', 'any', 'dist/foo-0.1.msi')])
def test_suite(): def test_suite():
return unittest.makeSuite(BDistMSITestCase) return unittest.makeSuite(BDistMSITestCase)

View file

@ -261,7 +261,7 @@ class bdist_msi(Command):
self.db.Commit() self.db.Commit()
if hasattr(self.distribution, 'dist_files'): if hasattr(self.distribution, 'dist_files'):
tup = 'bdist_msi', self.target_version or 'any', fullname tup = 'bdist_msi', self.target_version or 'any', installer_name
self.distribution.dist_files.append(tup) self.distribution.dist_files.append(tup)
if not self.keep_temp: if not self.keep_temp:

View file

@ -19,6 +19,7 @@ __all__ = [
'get_distributions', 'get_distribution', 'get_file_users', 'get_distributions', 'get_distribution', 'get_file_users',
'provides_distribution', 'obsoletes_distribution', 'provides_distribution', 'obsoletes_distribution',
'enable_cache', 'disable_cache', 'clear_cache', 'enable_cache', 'disable_cache', 'clear_cache',
# XXX these functions' names look like get_file_users but are not related
'get_file_path', 'get_file'] 'get_file_path', 'get_file']

View file

@ -1,20 +1,29 @@
"""Tests for distutils.command.bdist_msi.""" """Tests for distutils.command.bdist_msi."""
import os
import sys import sys
from packaging.tests import unittest, support from packaging.tests import unittest, support
@unittest.skipUnless(sys.platform == 'win32', 'these tests require Windows')
class BDistMSITestCase(support.TempdirManager, class BDistMSITestCase(support.TempdirManager,
support.LoggingCatcher, support.LoggingCatcher,
unittest.TestCase): unittest.TestCase):
@unittest.skipUnless(sys.platform == "win32", "runs only on win32")
def test_minimal(self): def test_minimal(self):
# minimal test XXX need more tests # minimal test XXX need more tests
from packaging.command.bdist_msi import bdist_msi from packaging.command.bdist_msi import bdist_msi
pkg_pth, dist = self.create_dist() project_dir, dist = self.create_dist()
cmd = bdist_msi(dist) cmd = bdist_msi(dist)
cmd.ensure_finalized() cmd.ensure_finalized()
cmd.run()
bdists = os.listdir(os.path.join(project_dir, 'dist'))
self.assertEqual(bdists, ['foo-0.1.msi'])
# bug #13719: upload ignores bdist_msi files
self.assertEqual(dist.dist_files,
[('bdist_msi', 'any', 'dist/foo-0.1.msi')])
def test_suite(): def test_suite():

View file

@ -1,4 +1,4 @@
"""XML-RPC Servers. r"""XML-RPC Servers.
This module can be used to create simple XML-RPC servers This module can be used to create simple XML-RPC servers
by creating a server and either installing functions, a by creating a server and either installing functions, a

View file

@ -13,6 +13,9 @@ Core and Builtins
Library Library
------- -------
- Issue #13719: Make the distutils and packaging upload commands aware of
bdist_msi products.
- Issue #14007: Accept incomplete TreeBuilder objects (missing start, end, - Issue #14007: Accept incomplete TreeBuilder objects (missing start, end,
data or close method) for the Python implementation as well. data or close method) for the Python implementation as well.
Drop the no-op TreeBuilder().xml() method from the C implementation. Drop the no-op TreeBuilder().xml() method from the C implementation.

View file

@ -20,7 +20,6 @@ static PyMemberDef frame_memberlist[] = {
{"f_builtins", T_OBJECT, OFF(f_builtins), READONLY}, {"f_builtins", T_OBJECT, OFF(f_builtins), READONLY},
{"f_globals", T_OBJECT, OFF(f_globals), READONLY}, {"f_globals", T_OBJECT, OFF(f_globals), READONLY},
{"f_lasti", T_INT, OFF(f_lasti), READONLY}, {"f_lasti", T_INT, OFF(f_lasti), READONLY},
{"f_yieldfrom", T_OBJECT, OFF(f_yieldfrom), READONLY},
{NULL} /* Sentinel */ {NULL} /* Sentinel */
}; };