कैसे सेटअप लेखक में कई लेखक (एस) / ईमेल (एस) निर्दिष्ट करने के लिए


83

हमने एक ट्विटर ऐप पर एक छोटा रैपर लिखा और http://pypi.python.org को यह जानकारी प्रकाशित की । लेकिन setup.py में ईमेल / लेखक के नाम को निर्दिष्ट करने के लिए केवल एक फ़ील्ड शामिल था। निम्नलिखित क्षेत्रों में मैं कई योगदानकर्ताओं / ईमेल सूची को कैसे निर्दिष्ट करूं, क्योंकि हम चाहेंगे कि यह पैकेज हमारे नामों के तहत सूचीबद्ध हो, यह http://rubygems.org में कैसे दिखता है ।

   author='foo',
   author_email='foo.bar@gmail.com',

1
क्या वे अल्पविराम या अर्ध-विच्छेदित ईमेल स्वीकार करते हैं?
हेल्टनबिकर

जवाबों:


84

जहां तक ​​मुझे पता है, setuptoolsकई लेखकों को निर्दिष्ट करने के लिए तार की एक सूची का उपयोग करने का समर्थन नहीं करता है। आपका सबसे अच्छा दांव लेखकों को एक स्ट्रिंग में सूचीबद्ध करना है:

author='Foo Bar, Spam Eggs',
author_email='foobar@baz.com, spameggs@joe.org',

मुझे यकीन नहीं है कि अगर PyPI author_emailक्षेत्र को मान्य करता है , तो आप उस समस्या से परेशान हो सकते हैं। किसी भी मामले में, मैं आपको एक ही लेखक तक सीमित करने और प्रलेखन या विवरण में सभी योगदानकर्ताओं का उल्लेख करने की सलाह दूंगा।

[संपादित करें] कुछ स्रोत:

यह वास्तव में बग के रूप में पंजीकृत किया गया है , लेकिन ऐसा लगता है कि कई लेखकों के लिए समर्थन लागू नहीं किया गया था। यहाँ एक वैकल्पिक समाधान है। यहां कई लेखकों के साथ एक परियोजना के लिए संपर्क ईमेल प्रदान करने के लिए एक विचार है।


1
+1 संपादित और संबंधित लिंक के लिए ... बग में चर्चा वास्तव में दिलचस्प है, लेकिन यह दुखद है कि कोई आम सहमति नहीं मिली है और पीईपी 345 अभी भी सर्वोत्तम प्रथाओं और कई लेखकों की बात नहीं करता है
स्टेफानो

1

अगर आप कुछ बारीकियाँ चाहते हैं, तो मैं @ modocache के उत्तर से सिर्फ गुल्लक की तरह हूँ।

इस उत्तर के दौरान, मैं FOO-PYTHON-ENV\Lib\distutils\dist.pyफ़ाइल के एक python3.6 संस्करण का उल्लेख करूंगा

दोहराना करने के लिए, आप authorक्षेत्र में एक सूची का उपयोग नहीं कर सकते । यहाँ पर क्यों:

स्पॉयलर: DistributionMetadataकक्षा से संबंधित दो विधियाँ इसका कारण हैं -

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

यदि आप authorफ़ील्ड में सूची बनाने की कोशिश करते हैं तो यहां एक त्रुटि होगी :

class DistributionMetadata:

#*...(R E D A C T E D)...*#

    def read_pkg_file(self, file):
        """Reads the metadata values from a file object."""
    #*...(R E D A C T E D)...*#
        # ####################################
        # Note the usage of _read_field() here
        # ####################################
        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 = _read_field('home-page')
        self.license = _read_field('license')
    #*...(R E D A C T E D)...*#
        # ###################################
        # Note the usage of _read_list() here
        # ###################################
        self.platforms = _read_list('platform')
        self.classifiers = _read_list('classifier')
    #*...(R E D A C T E D)...*#

यहाँ पूरी बात है:

class DistributionMetadata:
        """Dummy class to hold the distribution meta-data: name, version,
        author, and so forth.
        """

        _METHOD_BASENAMES = ("name", "version", "author", "author_email",
                     "maintainer", "maintainer_email", "url",
                     "license", "description", "long_description",
                     "keywords", "platforms", "fullname", "contact",
                     "contact_email", "classifiers", "download_url",
                     # PEP 314
                     "provides", "requires", "obsoletes",
                     )

    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 = _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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.