Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
375dc9b8
Kaydet (Commit)
375dc9b8
authored
Kas 10, 2013
tarafından
Jason R. Coombs
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Sade Fark
Merge with 3.3 for Issue #19544 and Issue #7457
üst
711e91b2
3492e39b
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
147 additions
and
18 deletions
+147
-18
examples.rst
Doc/distutils/examples.rst
+42
-0
dist.py
Lib/distutils/dist.py
+73
-17
test_dist.py
Lib/distutils/tests/test_dist.py
+28
-1
NEWS
Misc/NEWS
+4
-0
No files found.
Doc/distutils/examples.rst
Dosyayı görüntüle @
375dc9b8
...
...
@@ -284,6 +284,48 @@ by using the :mod:`docutils` parser::
warning: check: Title underline too short. (line 2)
warning: check: Could not finish the parsing.
Reading the metadata
=====================
The :func:`distutils.core.setup` function provides a command-line interface
that allows you to query the metadata fields of a project through the
`setup.py` script of a given project::
$ python setup.py --name
distribute
This call reads the `name` metadata by running the
:func:`distutils.core.setup` function. Although, when a source or binary
distribution is created with Distutils, the metadata fields are written
in a static file called :file:`PKG-INFO`. When a Distutils-based project is
installed in Python, the :file:`PKG-INFO` file is copied alongside the modules
and packages of the distribution under :file:`NAME-VERSION-pyX.X.egg-info`,
where `NAME` is the name of the project, `VERSION` its version as defined
in the Metadata, and `pyX.X` the major and minor version of Python like
`2.7` or `3.2`.
You can read back this static file, by using the
:class:`distutils.dist.DistributionMetadata` class and its
:func:`read_pkg_file` method::
>>> from distutils.dist import DistributionMetadata
>>> metadata = DistributionMetadata()
>>> metadata.read_pkg_file(open('
distribute
-
0.6.8
-
py2
.7
.
egg
-
info
'))
>>> metadata.name
'
distribute
'
>>> metadata.version
'
0.6.8
'
>>> metadata.description
'
Easily
download
,
build
,
install
,
upgrade
,
and
uninstall
Python
packages
'
Notice that the class can also be instanciated with a metadata file path to
loads its values::
>>> pkg_info_path = '
distribute
-
0.6.8
-
py2
.7
.
egg
-
info
'
>>> DistributionMetadata(pkg_info_path).name
'
distribute
'
.. % \section{Multiple extension modules}
.. % \label{multiple-ext}
...
...
Lib/distutils/dist.py
Dosyayı görüntüle @
375dc9b8
...
...
@@ -5,6 +5,7 @@ being built/installed/distributed.
"""
import
sys
,
os
,
re
from
email
import
message_from_file
try
:
import
warnings
...
...
@@ -999,25 +1000,80 @@ class DistributionMetadata:
"provides"
,
"requires"
,
"obsoletes"
,
)
def
__init__
(
self
):
self
.
name
=
None
self
.
version
=
None
self
.
author
=
None
self
.
author_email
=
None
def
__init__
(
self
,
path
=
None
):
if
path
is
not
None
:
self
.
read_pkg_file
(
open
(
path
))
else
:
self
.
name
=
None
self
.
version
=
None
self
.
author
=
None
self
.
author_email
=
None
self
.
maintainer
=
None
self
.
maintainer_email
=
None
self
.
url
=
None
self
.
license
=
None
self
.
description
=
None
self
.
long_description
=
None
self
.
keywords
=
None
self
.
platforms
=
None
self
.
classifiers
=
None
self
.
download_url
=
None
# PEP 314
self
.
provides
=
None
self
.
requires
=
None
self
.
obsoletes
=
None
def
read_pkg_file
(
self
,
file
):
"""Reads the metadata values from a file object."""
msg
=
message_from_file
(
file
)
def
_read_field
(
name
):
value
=
msg
[
name
]
if
value
==
'UNKNOWN'
:
return
None
return
value
def
_read_list
(
name
):
values
=
msg
.
get_all
(
name
,
None
)
if
values
==
[]:
return
None
return
values
metadata_version
=
msg
[
'metadata-version'
]
self
.
name
=
_read_field
(
'name'
)
self
.
version
=
_read_field
(
'version'
)
self
.
description
=
_read_field
(
'summary'
)
# we are filling author only.
self
.
author
=
_read_field
(
'author'
)
self
.
maintainer
=
None
self
.
author_email
=
_read_field
(
'author-email'
)
self
.
maintainer_email
=
None
self
.
url
=
None
self
.
license
=
None
self
.
description
=
None
self
.
long_description
=
None
self
.
keywords
=
None
self
.
platforms
=
None
self
.
classifiers
=
None
self
.
download_url
=
None
# PEP 314
self
.
provides
=
None
self
.
requires
=
None
self
.
obsoletes
=
None
self
.
url
=
_read_field
(
'home-page'
)
self
.
license
=
_read_field
(
'license'
)
if
'download-url'
in
msg
:
self
.
download_url
=
_read_field
(
'download-url'
)
else
:
self
.
download_url
=
None
self
.
long_description
=
_read_field
(
'description'
)
self
.
description
=
_read_field
(
'summary'
)
if
'keywords'
in
msg
:
self
.
keywords
=
_read_field
(
'keywords'
)
.
split
(
','
)
self
.
platforms
=
_read_list
(
'platform'
)
self
.
classifiers
=
_read_list
(
'classifier'
)
# PEP 314 - these fields only exist in 1.1
if
metadata_version
==
'1.1'
:
self
.
requires
=
_read_list
(
'requires'
)
self
.
provides
=
_read_list
(
'provides'
)
self
.
obsoletes
=
_read_list
(
'obsoletes'
)
else
:
self
.
requires
=
None
self
.
provides
=
None
self
.
obsoletes
=
None
def
write_pkg_info
(
self
,
base_dir
):
"""Write the PKG-INFO file into the release tree.
...
...
Lib/distutils/tests/test_dist.py
Dosyayı görüntüle @
375dc9b8
...
...
@@ -8,7 +8,7 @@ import textwrap
from
unittest
import
mock
from
distutils.dist
import
Distribution
,
fix_help_options
from
distutils.dist
import
Distribution
,
fix_help_options
,
DistributionMetadata
from
distutils.cmd
import
Command
from
test.support
import
TESTFN
,
captured_stdout
,
run_unittest
...
...
@@ -388,6 +388,33 @@ class MetadataTestCase(support.TempdirManager, support.EnvironGuard,
self
.
assertTrue
(
output
)
def
test_read_metadata
(
self
):
attrs
=
{
"name"
:
"package"
,
"version"
:
"1.0"
,
"long_description"
:
"desc"
,
"description"
:
"xxx"
,
"download_url"
:
"http://example.com"
,
"keywords"
:
[
'one'
,
'two'
],
"requires"
:
[
'foo'
]}
dist
=
Distribution
(
attrs
)
metadata
=
dist
.
metadata
# write it then reloads it
PKG_INFO
=
io
.
StringIO
()
metadata
.
write_pkg_file
(
PKG_INFO
)
PKG_INFO
.
seek
(
0
)
metadata
.
read_pkg_file
(
PKG_INFO
)
self
.
assertEquals
(
metadata
.
name
,
"package"
)
self
.
assertEquals
(
metadata
.
version
,
"1.0"
)
self
.
assertEquals
(
metadata
.
description
,
"xxx"
)
self
.
assertEquals
(
metadata
.
download_url
,
'http://example.com'
)
self
.
assertEquals
(
metadata
.
keywords
,
[
'one'
,
'two'
])
self
.
assertEquals
(
metadata
.
platforms
,
[
'UNKNOWN'
])
self
.
assertEquals
(
metadata
.
obsoletes
,
None
)
self
.
assertEquals
(
metadata
.
requires
,
[
'foo'
])
def
test_suite
():
suite
=
unittest
.
TestSuite
()
suite
.
addTest
(
unittest
.
makeSuite
(
DistributionTestCase
))
...
...
Misc/NEWS
Dosyayı görüntüle @
375dc9b8
...
...
@@ -34,6 +34,10 @@ Core and Builtins
Library
-------
- Issue #19544 and Issue #7457: Restore the read_pkg_file method to
distutils.dist.DistributionMetadata accidentally removed in the undo of
distutils2.
- Issue #16685: Added support for any bytes-like objects in the audioop module.
Removed support for strings.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment