mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Merge.
This commit is contained in:
commit
1e88f3faa6
13 changed files with 72 additions and 31 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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( ... )
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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']
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue