CINXE.COM

Mailman 3 PEP 376 - Python-Dev - python.org

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="ROBOTS" content="INDEX, FOLLOW" /> <title>Mailman 3 PEP 376 - Python-Dev - python.org </title> <meta name="author" content="" /> <meta name="dc.language" content="en" /> <link rel="shortcut icon" href="/static/hyperkitty/img/favicon.ico" /> <link rel="stylesheet" href="/static/hyperkitty/libs/jquery/smoothness/jquery-ui-1.13.1.min.css" type="text/css" media="all" /> <link rel="stylesheet" href="/static/hyperkitty/libs/fonts/font-awesome/css/font-awesome.min.css" type="text/css" media="all" /> <link rel="stylesheet" href="/static/CACHE/css/output.07067ad77a36.css" type="text/css" media="all"><link rel="stylesheet" href="/static/CACHE/css/output.e68c4908b3de.css" type="text/css"><link rel="stylesheet" href="/static/CACHE/css/output.3e1fcd906323.css" type="text/css" media="all"> </head> <body> <nav class="navbar sticky-top navbar-expand-md mb-2" id="navbar-main"> <div class="container-xxl"> <div class="navbar-header"> <!--part of navbar that's always present--> <button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target=".navbar-collapse"> <span class="fa fa-bars"></span> </button> <a class="navbar-brand" href="/archives/">Mailman 3 python.org</a> </div> <!-- /navbar-header --> <div class="d-flex"> <div class="auth dropdown d-md-none"> </div> <a href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/" class="nav-link d-md-none"> <span class="fa fa-sign-in"></span> Sign In </a> <a href="/accounts/signup/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/" class="nav-link d-md-none"> <span class="fa fa-user-plus"></span> Sign Up </a> </div> <div class="navbar-collapse collapse justify-content-end"> <!--part of navbar that's collapsed on small screens--> <!-- show dropdown for smaller viewports b/c login name/email may be too long --> <!-- only show this extra button/dropdown if we're in small screen sizes --> <a href="/mailman3/lists/python-dev.python.org/" class="nav-link"> <span class="fa fa-cog"></span> Manage this list </a> <a href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/" class="nav-link d-none d-md-block"> <span class="fa fa-sign-in"></span> Sign In </a> <a href="/accounts/signup/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/" class="nav-link d-none d-md-block"> <span class="fa fa-user-plus"></span> Sign Up </a> <form name="search" method="get" action="/archives/search" class="navbar-form navbar-right my-2 my-lg-2 ms-2" role="search"> <input type="hidden" name="mlist" value="python-dev@python.org" /> <div class="input-group"> <input name="q" type="text" class="form-control rounded-4 search" placeholder="Search this list" aria-label="Search this list" /> <button class="btn search-button" aria-label="Search"><span class="fa fa-search"></span></button> </div> </form> <!-- larger viewports --> <ul class="nav navbar-nav auth d-none d-md-flex"> </ul> </div> <!--/navbar-collapse --> </div><!-- /container for navbar --> </nav> <div class="modal fade" tabindex="-1" role="dialog" id="keyboard-shortcuts"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> <h4 class="modal-title">Keyboard Shortcuts</h4> </div> <div class="modal-body"> <h3>Thread View</h3> <ul> <li><code>j</code>: Next unread message </li> <li><code>k</code>: Previous unread message </li> <li><code>j a</code>: Jump to all threads <li><code>j l</code>: Jump to MailingList overview </ul> </div> </div><!-- /.modal-content --> </div><!-- /.modal-dialog --> </div><!-- /.modal --> <div class="container-xxl" role="main"> <div class="row view-thread d-flex"> <!-- thread header: navigation (older/newer), thread title --> <div class="thread-header"> <div class="d-flex"> <div> <a id="next-thread" class="btn btn-secondary btn-sm " title="Re: [Python-Dev] PEP 376" href="/archives/list/python-dev@python.org/thread/XHSTXM3WYHCY2JCSMPMBP54B6ME23VCT/"> <span class="fa fa-chevron-left"></span> <span class="d-none d-md-inline">newer</span> </a> <br /> <a href="/archives/list/python-dev@python.org/thread/XHSTXM3WYHCY2JCSMPMBP54B6ME23VCT/" title="Re: [Python-Dev] PEP 376" class="thread-titles d-none d-md-block"> Re: [Python-Dev] PEP 376 </a> </div> <div class="flex-grow-1"> <h3>PEP 376</h3> </div> <div class="right"> <a id="prev-thread" class="btn btn-secondary btn-sm " title="Summary of Python tracker Issues" href="/archives/list/python-dev@python.org/thread/3IA5TGKI4WG4WY42P2C7NRUX2DOBYJUY/" > <span class="fa fa-chevron-right"></span> <span class="d-none d-md-inline">older</span> </a><br /> <a href="/archives/list/python-dev@python.org/thread/3IA5TGKI4WG4WY42P2C7NRUX2DOBYJUY/" title="Summary of Python tracker Issues" class="thread-titles d-none d-md-block"> Summary of Python tracker Issues </a> </div> </div> </div> </div> <!-- /thread-header --> <div class="row"> <div class="col-sm-12 col-md-9"> <!-- main section, the email thread --> <div id="thread-content"> <!-- Start first email --> <div class="email email-first"> <div id="ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/5e5142d6a1a578f02e2d94c4d6d31088.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/245387869534797578142516163600938898838/" title="See the profile for Tarek Ziad茅" >Tarek Ziad茅</a> </h2> </div> </div> <div class="email-date right"> <span class="date"> June 22, 2009 </span> <div class="time"> <span title="Sender's time: June 22, 2009, 3:23 p.m.">1:23 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>Hello, We have polished out PEP 376 and its code prototype at Distutils-SIG. It seems to fullfill now all the requirements, so I am mailing it here again, for a new round of feedback, if needed. - the pep : <a target="_blank" href="http://svn.python.org/projects/peps/trunk/pep-0376.txt">http://svn.python.org/projects/peps/trunk/pep-0376.txt</a> - the code prototype : <a target="_blank" href="http://bitbucket.org/tarek/pep376/src/tip/pkgutil.py">http://bitbucket.org/tarek/pep376/src/tip/pkgutil.py</a> Notice that if the PEP is accepted at this point, I will : - focus on making the code work as fast as possible, for directories browsing - work on the backport and the required patches for setuptools and pip at the same time, and see if I can get some beta-testers that are willing to switch to this new version to test it extensively before 2.7/3.2 are out. Regards Tarek -- Tarek Ziad茅 | <a target="_blank" href="http://ziade.org">http://ziade.org</a></p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;94bdd2610906220623k301e7924i5abc0a97d54741ba%40mail.gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End first email --> <p class="sort-mode"> <a href="/archives/list/python-dev@python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/?sort=date" >Show replies by date</a> </p> <div class="anchor-link"> <a id="replies"></a> </div> <div class="replies"> <div class="odd "> <!-- Start email --> <div class="email"> <div id="OTFCD5UIRQA4EVQHZJE4WU5CXE32D7CK" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/db5f70d2f2520ef725839f046bdc32fb.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/e365900b3526428a894bce23962aecad/" title="See the profile for Antoine Pitrou" >Antoine Pitrou</a> </h2> </div> </div> <div class="email-date right"> <span class="date"> June 2009 </span> <div class="time"> <span title="Sender's time: June 22, 2009, 2:59 p.m.">2:59 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>Hello, Tarek Ziad茅 &lt;ziade.tarek &lt;at> gmail.com> writes:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>so I am mailing it here again, for a new round of feedback, if needed.</p> <p>- the pep : <a target="_blank" href="http://svn.python.org/projects/peps/trunk/pep-0376.txt">http://svn.python.org/projects/peps/trunk/pep-0376.txt</a></p> </blockquote><p>Some comments: - the **MD5** hash of the file, encoded in hex. Notice that `pyc` and `pyo` generated files will not have a hash. Why the exception for pyc and pyo files? - `zlib` and `zlib-2.5.2.egg-info` are located in `site-packages` so the file paths are relative to it. Is it a general rule? That is, the paths in RECORD are always relative to its grandparent directory? The RECORD format ----------------- The `RECORD` file is a CSV file, composed of records, one line per installed file. The ``csv`` module is used to read the file, with the `excel` dialect, which uses these options to read the file: - field delimiter : `,` - quoting char : `"`. - line terminator : `\r\n` Wouldn't it be better to use the native line terminator on the current platform? (someone might want to edit or at least view the file) What is the character encoding for non-ASCII filenames? UTF-8? Are the RECORD file's contents somehow part of the DistributionMetadata? - ``DistributionDirectories``: manages ``EggInfoDirectory`` instances. What is an EggInfoDirectory ? A plural class name looks strange (I think it's the first time I see one in the CPython codebase). How about another name? (DistributionPool, DistributionMap, WorkingSet etc.). - ``get_egginfo_file(path, binary=False)`` -> file object Returns a file located under the `.egg-info` directory. Returns a ``file`` instance for the file pointed by ``path``. Is it always a file instance or just a file-like object? (zipped distributions come to mind). Is it opened read-only? - ``owner(path)`` -> ``Distribution`` instance or None If ``path`` is used by only one ``Distribution`` instance, returns it. Otherwise returns None. This is a bit confusing. If it returns None, it doesn't distinguish between the case where several Distributions refer to the path, and the case where no distributions refer to it, does it? Is there any reason to have this method while file_users(path) already exists? A new class called ``DistributionDirectories`` is created. It's a collection of ``DistributionDirectory`` and ``ZippedDistributionDirectory`` instances. The constructor takes one optional argument ``use_cache`` set to ``True`` by default. You forgot to describe the constructor's signature and what it does exactly. ``EggInfoDirectories`` also provides the following methods besides the ones from ``dict``:: What is EggInfoDirectories? - ``append(path)`` Creates an ``DistributionDirectory`` (or ``ZippedDistributionDirectory``) instance for ``path`` and adds it in the mapping. - ``load(paths)`` Creates and adds ``DistributionDirectory`` (or ``ZippedDistributionDirectory``) instances corresponding to ``paths``. Why are these methods named completely differently although they do almost the same thing? Besides, append() makes it look like ordering matters. Does it? (for a naming suggestion, e.g. load(path) and load_all(paths). Or, even simpler, load(*paths) or load(paths)) - ``get_file_users(path)`` -> Iterator of ``Distribution`` (or ``ZippedDistribution``) instances. This method is named file_users in another class. Perhaps the naming should be consistent? All these functions use the same global instance of ``DistributionDirectories`` to use the cache. Is the global instance available to users? >>> for path, hash, size in dist.get_installed_files():: ... print '%s %s %d %s' % (path, hash, size) There's one too many "%s" here. Thanks for your work! Antoine.</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/OTFCD5UIRQA4EVQHZJE4WU5CXE32D7CK/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/OTFCD5UIRQA4EVQHZJE4WU5CXE32D7CK/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;loom.20090622T142204-980%40post.gmane.org&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="even reply-level-1"> <!-- Start email --> <div class="email"> <div id="6YTUQYYZVDRV6XVEXYS3CX4CUD3HPZJH" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/5e5142d6a1a578f02e2d94c4d6d31088.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/245387869534797578142516163600938898838/" title="See the profile for Tarek Ziad茅" >Tarek Ziad茅</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: June 22, 2009, 5:42 p.m.">3:42 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>On Mon, Jun 22, 2009 at 4:59 PM, Antoine Pitrou &lt;solipsis@pitrou.net> wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>- the **MD5** hash of the file, encoded in hex. Notice that `pyc` and `pyo` generated files will not have a hash.</p> <p>Why the exception for pyc and pyo files?</p> </blockquote><p>As in PEP 262, since they are produced automatically from a py file, checking the py file is enough to decide if the file has changed.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>- `zlib` and `zlib-2.5.2.egg-info` are located in `site-packages` so the file paths are relative to it.</p> <p>Is it a general rule? That is, the paths in RECORD are always relative to its grandparent directory?</p> </blockquote><p>no, they can be located anywhere on the system. But when the paths are located in the same directory where the .egg-info directory is located, a relative path is used. (see the section before this example) I'll add an example that contains files located elswhere in the system (like a script and a data file)</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>The RECORD format -----------------</p> <p>The `RECORD` file is a CSV file, composed of records, one line per installed file. The ``csv`` module is used to read the file, with the `excel` dialect, which uses these options to read the file:</p> <p>- field delimiter : `,` - quoting char : `"`. - line terminator : `\r\n`</p> <p>Wouldn't it be better to use the native line terminator on the current platform? (someone might want to edit or at least view the file)</p> </blockquote><p>Good idea, I'll change that,</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>What is the character encoding for non-ASCII filenames? UTF-8?</p> </blockquote><p>Yes, there's a constant in Distutils, called PKG_INFO_ENCODING that will be used for the file generation.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Are the RECORD file's contents somehow part of the DistributionMetadata?</p> </blockquote><p>The DistributionMetadata correspond to the fields defined in PEP 345, e.g. written in the PKG-INFO file, which is mentioned in the RECORD file. We are reworking PEP 345 as well, to add some fields. What did you have in mind ?</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>- ``DistributionDirectories``: manages ``EggInfoDirectory`` instances.</p> <p>What is an EggInfoDirectory ?</p> </blockquote><p>Typo (old name), fixing this..</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>A plural class name looks strange (I think it's the first time I see one in the CPython codebase). How about another name? (DistributionPool, DistributionMap, WorkingSet etc.).</p> </blockquote><p>Sure, WorkingSet is nice, it's the name used in setuptools,</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>- ``get_egginfo_file(path, binary=False)`` -> file object</p> <p>Returns a file located under the `.egg-info` directory.</p> <p>Returns a ``file`` instance for the file pointed by ``path``.</p> <p>Is it always a file instance or just a file-like object? (zipped distributions come to mind). Is it opened read-only?</p> </blockquote><p>It's in read-only mode, either "r" either "rb" and in case of a zip file, it returns a file-like object using zipfile.ZipFile.open.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>- ``owner(path)`` -> ``Distribution`` instance or None</p> <p>If ``path`` is used by only one ``Distribution`` instance, returns it. Otherwise returns None.</p> <p>This is a bit confusing. If it returns None, it doesn't distinguish between the case where several Distributions refer to the path, and the case where no distributions refer to it, does it?</p> </blockquote><p>The idea of this API is to find out of a distribution "owns" a file, e.g. is the only distribution that uses it, so it can be safely removed.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Is there any reason to have this method while file_users(path) already exists?</p> </blockquote><p>Its just a helper for uninstallers, but file_users() could probably be enough, I can remove "owns" if people find it confusing,</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>A new class called ``DistributionDirectories`` is created. It's a collection of ``DistributionDirectory`` and ``ZippedDistributionDirectory`` instances. The constructor takes one optional argument ``use_cache`` set to ``True`` by default.</p> <p>You forgot to describe the constructor's signature and what it does exactly.</p> </blockquote><p>I'll add that,</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>``EggInfoDirectories`` also provides the following methods besides the ones from ``dict``::</p> <p>What is EggInfoDirectories?</p> </blockquote><p>This is a DistributionDirectories, one more instance I forgot to rename, I'll fix that</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>- ``append(path)``</p> <p>Creates an ``DistributionDirectory`` (or ``ZippedDistributionDirectory``) instance for ``path`` and adds it in the mapping.</p> <p>- ``load(paths)``</p> <p>Creates and adds ``DistributionDirectory`` (or ``ZippedDistributionDirectory``) instances corresponding to ``paths``.</p> <p>Why are these methods named completely differently although they do almost the same thing? Besides, append() makes it look like ordering matters. Does it? (for a naming suggestion, e.g. load(path) and load_all(paths). Or, even simpler, load(*paths) or load(paths))</p> </blockquote><p>Right, I'll fix that,</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>- ``get_file_users(path)`` -> Iterator of ``Distribution`` (or ``ZippedDistribution``) instances.</p> <p>This method is named file_users in another class. Perhaps the naming should be consistent?</p> </blockquote><p>Right, it used to be get_*, that's a typo. I'll fix it,</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>All these functions use the same global instance of ``DistributionDirectories`` to use the cache.</p> <p>Is the global instance available to users?</p> </blockquote><p>No I didn't made it available to avoid concurrency problems,</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>>>> for path, hash, size in dist.get_installed_files():: ... print '%s %s %d %s' % (path, hash, size)</p> <p>There's one too many "%s" here.</p> </blockquote><p>Fixing it too,</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Thanks for your work!</p> </blockquote><p>Thanks for the feedback, I'll commit the fixes asap. Tarek</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/6YTUQYYZVDRV6XVEXYS3CX4CUD3HPZJH/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/6YTUQYYZVDRV6XVEXYS3CX4CUD3HPZJH/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <div class="attachments dropdown"> <a class="attachments" data-bs-toggle="dropdown" href="#"> attachment <span class="caret"></span> <!-- <i class="fa fa-caret-right"></i> --> </a> <ul class="attachments-list list-unstyled dropdown-menu"> <li><a href="/archives/list/python-dev@python.org/message/6YTUQYYZVDRV6XVEXYS3CX4CUD3HPZJH/attachment/2/attachment.htm" title="text/html, 8.6聽KB" >attachment.htm </a> </li> </ul> </div> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;94bdd2610906220842y475aad09l27f5be4b185718a4%40mail.gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="odd reply-level-2"> <!-- Start email --> <div class="email"> <div id="67RP6TD4ZCUMUUOUBQ7HGRKMZJM2EOSQ" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/35aa6fee222660ce1382d45a7a9a92fd.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/128121048094600186315886437921989660729/" title="See the profile for Kevin Teague" >Kevin Teague</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: June 22, 2009, 6:41 p.m.">1:41 a.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>A plural class name looks strange (I think it's the first time I see one in the CPython codebase). How about another name? (DistributionPool, DistributionMap, WorkingSet etc.).</p> <p>Sure, WorkingSet is nice, it's the name used in setuptools,</p> </blockquote><p>A WorkingSet and a DistributionDirectories (or whatever it gets named to) are different things though, no? A WorkingSet is "a collection of active distributions", where each distribution might come from different distribution directories: <a target="_blank" href="http://peak.telecommunity.com/DevCenter/PkgResources#workingset-objects">http://peak.telecommunity.com/DevCenter/PkgResources#workingset-objects</a> Where as DistributionDirectories is a dictionary of locations where distributions are installed. The WorkingSet may be comprised of distributions from several different locations, and each location may contain the same or different versions of the same distribution. (as far as I understand things ...) I can't really think of a better name for a dict of distribution locations ... but then I'm not averse to a pluralized class name. Overall though, I think PEP 376 is starting to look very good!</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/67RP6TD4ZCUMUUOUBQ7HGRKMZJM2EOSQ/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/67RP6TD4ZCUMUUOUBQ7HGRKMZJM2EOSQ/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;A315E325-654E-4827-978A-5B417185F220%40bud.ca&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="even reply-level-3"> <!-- Start email --> <div class="email"> <div id="X75L6OW6RZAX35ZLWKCNFPNAKU72HBTM" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/5e5142d6a1a578f02e2d94c4d6d31088.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/245387869534797578142516163600938898838/" title="See the profile for Tarek Ziad茅" >Tarek Ziad茅</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: June 23, 2009, 10:38 a.m.">8:38 a.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>On Tue, Jun 23, 2009 at 3:41 AM, Kevin Teague&lt;kevin@bud.ca> wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>A plural class name looks strange (I think it's the first time I see one in the CPython codebase). How about another name? (DistributionPool, DistributionMap, WorkingSet etc.).</p> <p>Sure, WorkingSet is nice, it's the name used in setuptools,</p> </blockquote><p>A WorkingSet and a DistributionDirectories (or whatever it gets named to) are different things though, no?</p> <p>A WorkingSet is "a collection of active distributions", where each distribution might come from different distribution directories:</p> <p><a target="_blank" href="http://peak.telecommunity.com/DevCenter/PkgResources#workingset-objects">http://peak.telecommunity.com/DevCenter/PkgResources#workingset-objects</a></p> <p>Where as DistributionDirectories is a dictionary of locations where distributions are installed. The WorkingSet may be comprised of distributions from several different locations, and each location may contain the same or different versions of the same distribution.</p> </blockquote><p>DistributionDirectories can contain directories that are not located in the same parent directory, so I find it rather similar besides the "active" feature in Python doesn't exist (yet) In any case, maybe picking up a name that is not from setuptools will be less confusing for people that uses WorkingSet classes nowadays. What about using the same names used in Python's site module: "sitedir" is the name used for a directory we named DistributionDirectory. So what about : DistributionDirectory -> SiteDir DistributionDirectories -> SiteDirMap ++ Tarek</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/X75L6OW6RZAX35ZLWKCNFPNAKU72HBTM/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/X75L6OW6RZAX35ZLWKCNFPNAKU72HBTM/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;94bdd2610906230138o186c5fa5h27ed7d857cd9284b%40mail.gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="odd reply-level-4"> <!-- Start email --> <div class="email"> <div id="ARDU5AI6FLCVYQVB7NOREMON5OYDGX6O" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/f3ba3ecffd20251d73749afbfa636786.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/79f3104fc1de42819297c3f846e4b38a/" title="See the profile for Nick Coghlan" >Nick Coghlan</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: June 23, 2009, 7:57 p.m.">9:57 a.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>Tarek Ziad茅 wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>So what about :</p> <p>DistributionDirectory -> SiteDir DistributionDirectories -> SiteDirMap</p> </blockquote><p>'site' has too many connections to existing concepts for my liking (site.py, sitesetup.py, site-packages). Something like DistributionDirectoryMap should cover it. You could probably get away with shortening "Directory" to "Dir" in the class names though: - Distribution - ZippedDistribution - DistributionDir - ZippedDistributionDir - DistributionDirMap (Shortening Distribution to Dist might also be a possibility, but I don't think that works well for the two basic classes, and if those use the long form then shortening it for the *Dir and *DirMap classes would just look odd) Cheers, Nick. -- Nick Coghlan | ncoghlan@gmail.com | Brisbane, Australia ---------------------------------------------------------------</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/ARDU5AI6FLCVYQVB7NOREMON5OYDGX6O/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/ARDU5AI6FLCVYQVB7NOREMON5OYDGX6O/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;4A40A721.6090204%40gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="even reply-level-5"> <!-- Start email --> <div class="email"> <div id="OXF67LVRSYZWP3OQYAK7ENMKGFMVZ4Z4" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/4053d6caab18829c4e8d393b6afa8ad8.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> Sridhar Ratnakumar </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: June 23, 2009, 12:45 p.m.">7:45 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>On 09-06-23 02:57 AM, Nick Coghlan wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Something like DistributionDirectoryMap should cover it.</p> <p>You could probably get away with shortening "Directory" to "Dir" in the class names though:</p> <p>- Distribution - ZippedDistribution - DistributionDir - ZippedDistributionDir - DistributionDirMap</p> </blockquote><p>'Map' reminds me of an associated hash (or is it the actual map?). Hence I suggest: DistributionSet -srid</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/OXF67LVRSYZWP3OQYAK7ENMKGFMVZ4Z4/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/OXF67LVRSYZWP3OQYAK7ENMKGFMVZ4Z4/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;4A4130D9.5040108%40activestate.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="odd reply-level-5"> <!-- Start email --> <div class="email"> <div id="RPJJDLZFNBX32QEIMFKQCLLRZS2KXRK5" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/db5f70d2f2520ef725839f046bdc32fb.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/e365900b3526428a894bce23962aecad/" title="See the profile for Antoine Pitrou" >Antoine Pitrou</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: June 24, 2009, 9:18 a.m.">9:18 a.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>Sridhar Ratnakumar &lt;sridharr &lt;at> activestate.com> writes:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>On 09-06-23 02:57 AM, Nick Coghlan wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Something like DistributionDirectoryMap should cover it.</p> <p>You could probably get away with shortening "Directory" to "Dir" in the class names though:</p> <p>- Distribution - ZippedDistribution - DistributionDir - ZippedDistributionDir - DistributionDirMap</p> </blockquote><p>'Map' reminds me of an associated hash (or is it the actual map?).</p> </blockquote><p>Good thing, because it is a dict subclass if you read the PEP :) +1 with Nick's proposal. (we are good at finding bikesheds everywhere aren't we?)</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/RPJJDLZFNBX32QEIMFKQCLLRZS2KXRK5/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/RPJJDLZFNBX32QEIMFKQCLLRZS2KXRK5/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;loom.20090624T091739-378%40post.gmane.org&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="even reply-level-5"> <!-- Start email --> <div class="email"> <div id="THVXVOWTHKKRSOKTDYLL53VDUFYIQZ3E" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/5e5142d6a1a578f02e2d94c4d6d31088.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/245387869534797578142516163600938898838/" title="See the profile for Tarek Ziad茅" >Tarek Ziad茅</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: June 24, 2009, 9:54 p.m.">7:54 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>On Wed, Jun 24, 2009 at 11:18 AM, Antoine Pitrou&lt;solipsis@pitrou.net> wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Sridhar Ratnakumar &lt;sridharr &lt;at> activestate.com> writes:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>On 09-06-23 02:57 AM, Nick Coghlan wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Something like DistributionDirectoryMap should cover it.</p> <p>You could probably get away with shortening "Directory" to "Dir" in the class names though:</p> <p>聽 - Distribution 聽 - ZippedDistribution 聽 - DistributionDir 聽 - ZippedDistributionDir 聽 - DistributionDirMap</p> </blockquote><p>'Map' reminds me of an associated hash (or is it the actual map?).</p> </blockquote><p>Good thing, because it is a dict subclass if you read the PEP :)</p> <p>+1 with Nick's proposal.</p> </blockquote><p>I've changed using these names. Any other feedback with this PEP or we're good to go ? :) Regards Tarek</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/THVXVOWTHKKRSOKTDYLL53VDUFYIQZ3E/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/THVXVOWTHKKRSOKTDYLL53VDUFYIQZ3E/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;94bdd2610906241254m60d39c2cs99d255dc5223af91%40mail.gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="odd "> <!-- Start email --> <div class="email"> <div id="MNO7TGICA6UIH6LS43WTIXY3RAZG6IGO" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/2ee41cc7bcaacf6fcdcb7a2269e97b86.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> 艁ukasz Langa </h2> </div> </div> <div class="email-date right"> <span class="date"> July 2009 </span> <div class="time"> <span title="Sender's time: July 3, 2009, 1:57 p.m.">12:57 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>On 2009-06-22 at 14:23, Tarek Ziad茅 wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Hello,</p> <p>We have polished out PEP 376 and its code prototype at Distutils-SIG. It seems to fullfill now all the requirements, so I am mailing it here again, for a new round of feedback, if needed.</p> </blockquote><p>Hello. I have read the current version of the PEP from trunk and would like to make some comments about it. The .egg-info as a directory ============================ At our company, after much fiddling about the current distutils and setuptools, we have developed a solution that enables us to serve pseudo-eggs. What I mean by that is that by plugging into the PEP 302 infrastructure, we were able to make non-filesystem-based repositories behave like `.egg` files. There are a couple of use cases for that implementation, the most important ones being: * being able to deploy encrypted and sealed blobs with a binary loader, to discourage fiddling around the source code by its users * being able to serve modules from a database back-end instead of the filesystem This solution depends on the `EGG-INFO` to be fetched from the `.egg` itself. We wouldn't want to use a static filesystem-based folder because it breaks the encryption use-case by revealing the `SOURCES.txt` information. It also breaks the database back-end usecase by presenting static versioning information whereas the whole point of using a database backed "egg" is to have the newest version installed at all times. Moreover, the proposed ``egginfo_dirname()`` routine is a step-back from the ``pkg_resources`` approach where we don't enforce resources to reside on a traditional filesystem. The uninstall feature ===================== This is a great feature but I don't seem to understand why there seems to be a consensus here that it's good for it not to even warn about dependencies, let alone manage them. ``easy_install`` and co. does manage dependencies while installing, why shouldn't it be symmetrical in that regard? Moreover, wouldn't dependency management be useful while using ``easy_install`` to *upgrade* an installation of a package? The second issue is that while having ``python -m distutils.uninstall`` is the preferred way to go, I would argue that enabling an ``uninstall`` entry-point in ``setup.py`` is desirable as well, if only for retaining an intuitive symmetrical system where I can do ``python setup.py install`` and ``python setup.py uninstall`` as well. I'm not forced to download the sources just to uninstall the package (``distutils.uninstall`` covers this use case) but if I do have the source code available, it would feel very natural to use the ``setup.py`` provided. There already is the precedent of ``setup.py develop --uninstall``. Having a ``setup.py uninstall`` could handle this use case as well. More high-level remarks ======================= This isn't probably the best place to cover this but may serve as a rationale for the above .egg-info problems we have with the proposed changes. It's great that you push the metadata functionality to core distutils. At the same time, it would be feasible to think over the whole `egg` concept. We would argue that having the `egg` format as a container more-less agnostic to the underlying data storage structure would be **very** useful. Imagine installable `egg` support packages which would enable you to: * use other compression formats beside ZIP * use other means of module storage beside the filesystem * use sealed and encrypted archives for deployment * use programmatic `egg`s for licensing, etc. * ``easy_install`` from different protocols, archive formats, etc. Decoupling the `egg` format from the concrete "zip-based" or "directory-based" implementations is a step forward in that direction. In that regard, the solution PEP 376 is proposing isn't ultimately solving the issues we're having. Thanks for your time. -- Best regards, 艁ukasz Langa Senior Developer STX-Next Sp. z o.o. tel: +48 791 080 144 skype: lukaszlanga</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/MNO7TGICA6UIH6LS43WTIXY3RAZG6IGO/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/MNO7TGICA6UIH6LS43WTIXY3RAZG6IGO/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;A1CA249E-D1AF-4963-9BF3-60DC1BA7A9BE%40stxnext.pl&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="even reply-level-1"> <!-- Start email --> <div class="email"> <div id="IK4BYNEASUGJFTCL3OHUHJBD47ZOKJEO" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/d995b462a98fea412efa79d17ba3787a.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/ad93c40b318f49d5b592f4b459c5a91d/" title="See the profile for Paul Moore" >Paul Moore</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: July 3, 2009, 2:54 p.m.">1:54 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>2009/7/3 艁ukasz Langa &lt;lukasz.langa@stxnext.pl>:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>On 2009-06-22 at 14:23, Tarek Ziad茅 wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Hello,</p> <p>We have polished out PEP 376 and its code prototype at Distutils-SIG. It seems to fullfill now all the requirements, so I am mailing it here again, for a new round of feedback, if needed.</p> </blockquote><p>Hello. I have read the current version of the PEP from trunk and would like to make some comments about it.</p> <p>The .egg-info as a directory ============================ At our company, after much fiddling about the current distutils and setuptools, we have developed a solution that enables us to serve pseudo-eggs. What I mean by that is that by plugging into the PEP 302 infrastructure, we were able to make non-filesystem-based repositories behave like `.egg` files. There are a couple of use cases for that implementation, the most important ones being: * being able to deploy encrypted and sealed blobs with a binary loader, to discourage fiddling around the source code by its users * being able to serve modules from a database back-end instead of the filesystem</p> <p>This solution depends on the `EGG-INFO` to be fetched from the `.egg` itself. We wouldn't want to use a static filesystem-based folder because it breaks the encryption use-case by revealing the `SOURCES.txt` information. It also breaks the database back-end usecase by presenting static versioning information whereas the whole point of using a database backed "egg" is to have the newest version installed at all times.</p> </blockquote><p>This is a good point. Distutils only installs files in the filesystem - it has no facilities for installing packages based on any other sort of PEP 302 based importers. Hence, PEP 376 in principle should only relate to filesystem-based distributions. But it also mentions zipfile-based distributions: "Notice that the API is organized in five classes that work with directories and Zip files (so it works with files included in Zip files, see PEP 273 for more details [8])." This is wrong. The PEP should either (1) restrict itself to filesystem based implementations (leaving the problem of other PEP 302 loaders to systems that manage these) or (2) be defined in a sufficiently general way that it can be implemented for *any* PEP 302 based loader - which probably means extending the PEP 302 protocols - and supplying zipfile functions as an example of how this is used. I believe that (1) is unlikely to be sufficient for real world use. Zip files (eggs, py2exe embedded modules, etc) are far too important a real world use case to ignore. The problem with (2) is that it requires significant extra work. But special-casing zip files (as the present implementation appears to do) will break as soon as any other PEP 302 compliant format becomes popular.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Moreover, the proposed ``egginfo_dirname()`` routine is a step-back from the ``pkg_resources`` approach where we don't enforce resources to reside on a traditional filesystem.</p> </blockquote><p>On the other hand, pkgutil.get_data is the standard library means of reading resources from a package. This is PEP 302 compliant now. This new PEP doesn't affect that.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>The uninstall feature ===================== This is a great feature but I don't seem to understand why there seems to be a consensus here that it's good for it not to even warn about dependencies, let alone manage them. ``easy_install`` and co. does manage dependencies while installing, why shouldn't it be symmetrical in that regard? Moreover, wouldn't dependency management be useful while using ``easy_install`` to *upgrade* an installation of a package?</p> </blockquote><p>easy_install is not a standard library feature - the fact that it has no uninstall facility is not relevant. python setup.py install is the standard library feature. The new uninstall is intended to correspond to that.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>More high-level remarks ======================= This isn't probably the best place to cover this but may serve as a rationale for the above .egg-info problems we have with the proposed changes.</p> <p>It's great that you push the metadata functionality to core distutils. At the same time, it would be feasible to think over the whole `egg` concept. We would argue that having the `egg` format as a container more-less agnostic to the underlying data storage structure would be **very** useful. Imagine installable `egg` support packages which would enable you to: * use other compression formats beside ZIP * use other means of module storage beside the filesystem * use sealed and encrypted archives for deployment * use programmatic `egg`s for licensing, etc.</p> </blockquote><p>PEP 302 gives you (in theory) all of this now. I'd recommend you look at it - and at Brett's importlib, which will make experimenting with such things far easier. What PEP 302 doesn't provide is package management. But Python itself doesn't provide package management, except in the form of distutils setup.py install - which is solely filesystem based. Maybe there's a case for extending PEP 302 and distutils to allow integrated management of other forms of importer format, but that's a huge other project, which no-one to my knowledge is even looking at.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>* ``easy_install`` from different protocols, archive formats, etc.</p> </blockquote><p>easy_install is not a standard library feature, so is not relevant here.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Decoupling the `egg` format from the concrete "zip-based" or "directory-based" implementations is a step forward in that direction. In that regard, the solution PEP 376 is proposing isn't ultimately solving the issues we're having.</p> </blockquote><p>Eggs are fundamentally a PEP 302 zip file format. There are some extra bits of metadata for setuptools/easy_install in there (as I understand things) but essentially they are zip files. When you say "decoupling the egg format", I assume you mean "decoupling the egg metadata" - which is fine, but to properly decouple, you need API level access to the metadata. PEP 376 offers read-only access, but as you rightly point out, it is only for filesystem data (and some form of zip file, which appears to be limited in some way, as it isn't PEP 302 based, and the actual format isn't defined anywhere). The basic point here is that PEP 376 needs to define precisely how pkgutil.get_distributions() scans sys.path looking for ".egg-info directories". What does it do for sys.path entries that don't correspond to filesystem directories? (Note - these may or may not be zip files. Even if they are zip files, an earlier entry on sys.path_hooks could have taken precedence. At the very least, you should only process path entries as zip files if their importer - in sys.path_importer_cache or via an explicit path hook scan - is a zipimporter object.). To be honest, this is a major can of worms. But if PEP 376 is not going to support PEP 302, then it must state that fact explicitly, to avoid giving people false expectations - particularly with Brett's importlib in Python 3.1, which will make it far easier for people to experiment with new packaging formats such as the ones Lukasz mentions above. And it MUST fail gracefully in the face of unsupported importer types. Paul.</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/IK4BYNEASUGJFTCL3OHUHJBD47ZOKJEO/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/IK4BYNEASUGJFTCL3OHUHJBD47ZOKJEO/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;79990c6b0907030654w5698e609qaf10a13eb237a430%40mail.gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="odd reply-level-2"> <!-- Start email --> <div class="email"> <div id="P2OXNZV5ECPRN2SSJGJKGISO63D5YWXZ" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/f3ba3ecffd20251d73749afbfa636786.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/79f3104fc1de42819297c3f846e4b38a/" title="See the profile for Nick Coghlan" >Nick Coghlan</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: July 4, 2009, 12:28 a.m.">2:28 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>Paul Moore wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>To be honest, this is a major can of worms. But if PEP 376 is not going to support PEP 302, then it must state that fact explicitly, to avoid giving people false expectations - particularly with Brett's importlib in Python 3.1, which will make it far easier for people to experiment with new packaging formats such as the ones Lukasz mentions above. And it MUST fail gracefully in the face of unsupported importer types.</p> </blockquote><p>importlib is in 2.7 as well. I agree that even if the reference implementation of PEP 376 only handles normal directories and zipfiles, the PEP itself needs to explain how the developer of a custom PEP 302 importer or loader can hook into the mechanism in order to provide metadata that distutils can understand. Or, as you suggest, state explicitly that the proposal at this stage is specifically limited to filesystem and zipfile packages and defer extension to arbitrary PEP 302 importers and loaders to a later PEP. To be honest, I'd personally be OK with the latter strategy - while other PEP 302 loaders and importers do exist (as Lukasz'z post shows), it would be unfortunate to unduly hold up improved installation metadata for the vast majority of typical use cases while we try to figure out ways to support the more esoteric use cases. Supporting both would obviously be better, but given the choice between the status quo and partial support, I believe this is a case where the partial support would still be worthwhile. I will note (and I believe this is also the main point that Lukasz was making) that having the distribution metadata outside the distribution as currently proposed in PEP 376 is going to make any eventual PEP 302 integration much harder - 302 importers only provide a mechanism for accessing files inside the distribution, not "adjacent" to them, so the mechanism in the PEP doesn't generalise properly. I suspect this limitation of the PEP 302 APIs is the origin of the setuptools format that embeds the metadata inside the distribution - it lets you get at the metadata without having to assume that it exists directly on the filesystem anywhere. Cheers, Nick. -- Nick Coghlan | ncoghlan@gmail.com | Brisbane, Australia ---------------------------------------------------------------</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/P2OXNZV5ECPRN2SSJGJKGISO63D5YWXZ/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/P2OXNZV5ECPRN2SSJGJKGISO63D5YWXZ/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;4A4E1572.3000801%40gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="even reply-level-3"> <!-- Start email --> <div class="email"> <div id="QHSC2HOPLURTHU2R3UAYMUHSCYVX63XS" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/5e5142d6a1a578f02e2d94c4d6d31088.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/245387869534797578142516163600938898838/" title="See the profile for Tarek Ziad茅" >Tarek Ziad茅</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: July 3, 2009, 4:44 p.m.">2:44 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>On Fri, Jul 3, 2009 at 4:28 PM, Nick Coghlan&lt;ncoghlan@gmail.com> wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>I will note (and I believe this is also the main point that Lukasz was making) that having the distribution metadata outside the distribution as currently proposed in PEP 376 is going to make any eventual PEP 302 integration much harder - 302 importers only provide a mechanism for accessing files inside the distribution, not "adjacent" to them, so the mechanism in the PEP doesn't generalise properly.</p> <p>I suspect this limitation of the PEP 302 APIs is the origin of the setuptools format that embeds the metadata inside the distribution - it lets you get at the metadata without having to assume that it exists directly on the filesystem anywhere.</p> </blockquote><p>Maybe we could rework the pkgutil classes for PEP 376 so they look like an implementation of the PEP 302 protocol for directories and zip files, with an extra "get_metadata()" API and state that it could be an extension for PEP 302 later.</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/QHSC2HOPLURTHU2R3UAYMUHSCYVX63XS/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/QHSC2HOPLURTHU2R3UAYMUHSCYVX63XS/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;94bdd2610907030744p6cc1fbbavd5fcc723c5a8917b%40mail.gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="odd reply-level-4"> <!-- Start email --> <div class="email"> <div id="BLSQMM2IWEUARE3SMOGXRA77SONLXUI7" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/d995b462a98fea412efa79d17ba3787a.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/ad93c40b318f49d5b592f4b459c5a91d/" title="See the profile for Paul Moore" >Paul Moore</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: July 3, 2009, 5:45 p.m.">4:45 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>2009/7/3 Tarek Ziad茅 &lt;ziade.tarek@gmail.com>:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>On Fri, Jul 3, 2009 at 4:28 PM, Nick Coghlan&lt;ncoghlan@gmail.com> wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>I will note (and I believe this is also the main point that Lukasz was making) that having the distribution metadata outside the distribution as currently proposed in PEP 376 is going to make any eventual PEP 302 integration much harder - 302 importers only provide a mechanism for accessing files inside the distribution, not "adjacent" to them, so the mechanism in the PEP doesn't generalise properly.</p> <p>I suspect this limitation of the PEP 302 APIs is the origin of the setuptools format that embeds the metadata inside the distribution - it lets you get at the metadata without having to assume that it exists directly on the filesystem anywhere.</p> </blockquote><p>Maybe we could rework the pkgutil classes for PEP 376 so they look like an implementation of the PEP 302 protocol for directories and zip files, with an extra "get_metadata()" API and state that it could be an extension for PEP 302 later.</p> </blockquote><p>That sounds like an excellent approach And given that PEP 302 is nothing more than an API spec, it's nice and easy to extend PEP 302 to say that importers can/should implement this (after all, the only 2 "real" cases in the wild are done, via PEP 376). Warning: I've not thought all this through fully, so I may be missing some subtleties! The ultimate spec needs to be clearly worded, and as a consequence of this discussion it occurs to me that the current PEP 376 is very far from clear in defining exactly what the naming, layout and location of egg-info directories is - it makes a lot of assumptions that may break for more general path importers I'll do some thinking, and maybe come up with some examples of PEP 302 edge cases, so that we can at least be sure that they've not been ignored (rejected as to stupid to care about, on the other hand, I'm happy with :-)) Paul.</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/BLSQMM2IWEUARE3SMOGXRA77SONLXUI7/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/BLSQMM2IWEUARE3SMOGXRA77SONLXUI7/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;79990c6b0907030945u1ed6e358o7847a08e39fa0c58%40mail.gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="even reply-level-3"> <!-- Start email --> <div class="email"> <div id="BVPHRHCUQOT2436JLOYFDKN6ZRNTAQOY" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/d995b462a98fea412efa79d17ba3787a.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/ad93c40b318f49d5b592f4b459c5a91d/" title="See the profile for Paul Moore" >Paul Moore</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: July 3, 2009, 6:01 p.m.">5:01 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>2009/7/3 Nick Coghlan &lt;ncoghlan@gmail.com>:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>I agree that even if the reference implementation of PEP 376 only handles normal directories and zipfiles, the PEP itself needs to explain how the developer of a custom PEP 302 importer or loader can hook into the mechanism in order to provide metadata that distutils can understand. Or, as you suggest, state explicitly that the proposal at this stage is specifically limited to filesystem and zipfile packages and defer extension to arbitrary PEP 302 importers and loaders to a later PEP.</p> <p>To be honest, I'd personally be OK with the latter strategy - while other PEP 302 loaders and importers do exist (as Lukasz'z post shows), it would be unfortunate to unduly hold up improved installation metadata for the vast majority of typical use cases while we try to figure out ways to support the more esoteric use cases. Supporting both would obviously be better, but given the choice between the status quo and partial support, I believe this is a case where the partial support would still be worthwhile.</p> </blockquote><p>You put it more clearly than I did. That's basically what I think, with the one proviso that we should make sure that PEP 376 doesn't specify something that out and out breaks the more esoteric PEP 302 cases. When Just and I were developing PEP 302, we found that the best way to do that was to leave anything that didn't need to be specified, as unspecified (hence the fact that there's so little defined in PEP 302!). It's easier to add things later than to remove or change them. That's why I was recommending to Tarek that he take out of the PEP any details about classes or APIs that couldn't be directly obtained from the core API. The same applies here (just talking in terms of a duck-typed notional Distribution class, allows people to implement their own URLDistribution or SqliteDistribution, or whatever, and not have to emulate any more of a filesystem than necessary).</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>I will note (and I believe this is also the main point that Lukasz was making) that having the distribution metadata outside the distribution as currently proposed in PEP 376 is going to make any eventual PEP 302 integration much harder - 302 importers only provide a mechanism for accessing files inside the distribution, not "adjacent" to them, so the mechanism in the PEP doesn't generalise properly.</p> <p>I suspect this limitation of the PEP 302 APIs is the origin of the setuptools format that embeds the metadata inside the distribution - it lets you get at the metadata without having to assume that it exists directly on the filesystem anywhere.</p> </blockquote><p>Again, agreed. But remember that PEP 302 is driven by looking up a module or package name. PEP 376 is looking up a *distribution* name. The docutils example in the PEP shows this: - docutils/ - roman.py - docutils-0.5-py2.6.egg-info/ There are 3 things here: a package (docutils), a module (roman) and a distribution (also named docutils, but could be called George for all it matters). So none of the PEP 302 lookup mechanisms (which work on package/module name) apply. The need for a separate concept (a "distribution") is unfortunate, as it adds complexity, but there are enough real life cases that make it clear that it's necessary. Hmm, I suspect that the implication here is that PEP 302 could do with an overhaul, to extend it to encompass the concept of a distribution. I'd be willing to have a look at that. Paul.</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/BVPHRHCUQOT2436JLOYFDKN6ZRNTAQOY/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/BVPHRHCUQOT2436JLOYFDKN6ZRNTAQOY/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;79990c6b0907031001h39caea63j98f500afdcc05fbf%40mail.gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="odd reply-level-3"> <!-- Start email --> <div class="email"> <div id="46LWTLRG4BMC34IB5YROZ2VNGHSNCHW6" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/eaa875d37f5e9ca7d663f1372efa1317.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/321733791008333740350902882913636256722/" title="See the profile for P.J. Eby" >P.J. Eby</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: July 3, 2009, 1:10 p.m.">5:10 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>At 12:28 AM 7/4/2009 +1000, Nick Coghlan wrote:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>I suspect this limitation of the PEP 302 APIs is the origin of the setuptools format that embeds the metadata inside the distribution - it lets you get at the metadata without having to assume that it exists directly on the filesystem anywhere.</p> </blockquote><p>I think you have this backwards; it's setuptools that doesn't care where (or whether) the metadata exists on the file system; it delegates metadata operations to a "metadata provider" that's usually an adapter over a PEP 302 "loader". See <a target="_blank" href="http://peak.telecommunity.com/DevCenter/PkgResources#supporting-custom-importers">http://peak.telecommunity.com/DevCenter/PkgResources#supporting-custom-impor...</a> for the API details of how to register support for arbitrary PEP 302 importers and loaders. (Which presumably, Lukasz is using. I didn't know that anybody was actually using it, but it's nice to know that the documentation is apparently sufficient for *some* people. ;-) )</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/46LWTLRG4BMC34IB5YROZ2VNGHSNCHW6/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/46LWTLRG4BMC34IB5YROZ2VNGHSNCHW6/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;20090703170748.818B73A4109%40sparrow.telecommunity.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> <div class="even reply-level-2"> <!-- Start email --> <div class="email"> <div id="DNI5D3SYVYRWX5GCVFOYULOR6VWKT7EG" class="email-header"> <div class="gravatar-wrapper d-flex"> <div class="gravatar circle"> <img class="gravatar" src="https://secure.gravatar.com/avatar/5e5142d6a1a578f02e2d94c4d6d31088.jpg?s=120&amp;d=mm&amp;r=g" width="120" height="120" alt="" /> </div> <div class="email-author d-flex"> <h2 class="name"> <a href="/archives/users/245387869534797578142516163600938898838/" title="See the profile for Tarek Ziad茅" >Tarek Ziad茅</a> </h2> </div> </div> <div class="email-date right"> <div class="time"> <span title="Sender's time: July 3, 2009, 4:31 p.m.">2:31 p.m.</span> </div> </div> </div> <!-- /email-header: gravatar, author-info, date, peramlink, changed_subject --> <div class="email-body "> <p>2009/7/3 Paul Moore &lt;p.f.moore@gmail.com>:</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>This is a good point. Distutils only installs files in the filesystem - it has no facilities for installing packages based on any other sort of PEP 302 based importers. Hence, PEP 376 in principle should only relate to filesystem-based distributions. But it also mentions zipfile-based distributions: "Notice that the API is organized in five classes that work with directories and Zip files (so it works with files included in Zip files, see PEP 273 for more details [8])."</p> <p>This is wrong. The PEP should either (1) restrict itself to filesystem based implementations (leaving the problem of other PEP 302 loaders to systems that manage these) or (2) be defined in a sufficiently general way that it can be implemented for *any* PEP 302 based loader - which probably means extending the PEP 302 protocols - and supplying zipfile functions as an example of how this is used.</p> <p>I believe that (1) is unlikely to be sufficient for real world use. Zip files (eggs, py2exe embedded modules, etc) are far too important a real world use case to ignore. The problem with (2) is that it requires significant extra work. But special-casing zip files (as the present implementation appears to do) will break as soon as any other PEP 302 compliant format becomes popular.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Moreover, the proposed ``egginfo_dirname()`` routine is a step-back from the ``pkg_resources`` approach where we don't enforce resources to reside on a traditional filesystem.</p> </blockquote><p>On the other hand, pkgutil.get_data is the standard library means of reading resources from a package. This is PEP 302 compliant now. This new PEP doesn't affect that.</p> </blockquote><p>Right. While it would be feasible to make pgutil works with PEP 302 loaders, we would still need to define in a generic way the content of the RECORD files. Right now it works for directory and zipped files since it's expressed with '/' separated paths. And if I understand PEP 302 right, any backend would be able to handle these paths no matter how they are stored, as long as the implement APIs like get_data()</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>What PEP 302 doesn't provide is package management. But Python itself doesn't provide package management, except in the form of distutils setup.py install - which is solely filesystem based.</p> <p>Maybe there's a case for extending PEP 302 and distutils to allow integrated management of other forms of importer format, but that's a huge other project, which no-one to my knowledge is even looking at.</p> </blockquote><p>Sounds like a fully-featured packaging managment system, which is imho, out of scope. And I don't see PEP 376 making it impossible for someone to build such a packaging system on the top of distutils. I've started one myself for the sake of experimentation, with built-in multiversion support, for a full replacement of site-packages.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>Eggs are fundamentally a PEP 302 zip file format. There are some extra bits of metadata for setuptools/easy_install in there (as I understand things) but essentially they are zip files. When you say "decoupling the egg format", I assume you mean "decoupling the egg metadata" - which is fine, but to properly decouple, you need API level access to the metadata. PEP 376 offers read-only access, but as you rightly point out, it is only for filesystem data (and some form of zip file, which appears to be limited in some way, as it isn't PEP 302 based, and the actual format isn't defined anywhere).</p> </blockquote><p>And also PEP 376 goal is to define a single standard location of egg-info files for filesystem data. The zip form was built so it could work with zipped site-packages directories, like what the py2app project uses.</p> <div class="quoted-switch"><a href="#">...</a></div><blockquote class="blockquote quoted-text"><p>The basic point here is that PEP 376 needs to define precisely how pkgutil.get_distributions() scans sys.path looking for ".egg-info directories". What does it do for sys.path entries that don't correspond to filesystem directories? (Note - these may or may not be zip files. Even if they are zip files, an earlier entry on sys.path_hooks could have taken precedence. At the very least, you should only process path entries as zip files if their importer - in sys.path_importer_cache or via an explicit path hook scan - is a zipimporter object.).</p> </blockquote><p>I'll add more details on that part. right now it visits directories and zip files. Tarek</p> </div> <div class="email-info"> <div class="likeform-wrapper right"> <div class="messagelink pull-right"> <button class="toggle-font btn btn-sm" title="Display in fixed font" data-bs-toggle="tooltip" data-placement="bottom"> <i class="fa fa-font"></i> </button> <a href="/archives/list/python-dev@python.org/message/DNI5D3SYVYRWX5GCVFOYULOR6VWKT7EG/" title="Permalink for this message" data-bs-toggle="tooltip" data-placement="bottom"><i class="fa fa-link"></i></a> </div> <form method="post" class="likeform" action="/archives/list/python-dev@python.org/message/DNI5D3SYVYRWX5GCVFOYULOR6VWKT7EG/vote"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <a class="youlike vote disabled" title="You must be logged-in to vote." href="#like" data-vote="1" aria-label="Like thread"> <i class="fa fa-thumbs-o-up"></i> 0 </a> <a class="youdislike vote disabled" title="You must be logged-in to vote." href="#dislike" data-vote="-1" aria-label="Dislike thread"> <i class="fa fa-thumbs-o-down"></i> 0 </a> </form> </div> <!-- Reply link --> <a class="reply reply-mailto" title="Reply" href="#"> <i class="fa fa-reply"></i> Reply </a> <!-- Attachments --> <!-- Reply form --> <div class="reply-form-unauthenticated"> <a class="btn btn-sm btn-primary" href="/accounts/login/?next=/archives/list/python-dev%40python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/#"> Sign in to reply online </a> <a class="btn btn-sm btn-secondary reply-mailto" href="mailto:python-dev@python.org?Subject=Re%3A%20%5BPython-Dev%5D%20PEP%20376&amp;In-Reply-To=&lt;94bdd2610907030731s395a962byced058b97c2ef6d%40mail.gmail.com&gt;" >Use email software</a></li> </div> </div> </div> <!-- End of email --> </div> </div> </div> </div> <div class="col-12 col-md-3"> <div class="anchor-link"> <a id="stats"></a> </div> <!-- right column --> <section id="thread-overview-info"> <!-- Start stats re: dates --> <div id="thread-date-info" class="row"> <div class="col"> <span class="days-num">5712</span> <div class="days-text"> Age (days ago) </div> </div> <div class="col"> <span class="days-num">5723</span> <div class="days-text"> Last active (days ago) </div> </div> </div> <!-- /Stats re: dates --> <p> <a href="/archives/list/python-dev@python.org/" class="btn btn-outline-primary btn-sm"> List overview </a> </p> <a href="/archives/list/python-dev@python.org/export/python-dev@python.org-ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ.mbox.gz?thread=ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ" title="This thread in gzipped mbox format" class="btn btn-outline-primary"> <i class="fa fa-download"></i> Download</a> <p class="thread-overview-details"> <div> <i class="fa fa-fw fa-comment"></i> 16 comments </div> <div> <i class="fa fa-fw fa-user"></i> 8 participants </div> </p> <form id="fav_form" name="favorite" method="post" class="favorite" action="/archives/list/python-dev@python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/favorite"> <input type="hidden" name="csrfmiddlewaretoken" value="MMtrfo9toa8hto6ICpIucOe1PGbp4HqZydqwr2CJfcd8KBjzJrsIfjNQAb0KIfQG"> <input type="hidden" name="action" value="add" /> <p> <a href="#AddFav" class="notsaved disabled" title="You must be logged-in to have favorites."> <i class="fa fa-fw fa-star"></i>Add to favorites</a> <a href="#RmFav" class="saved"> <i class="fa fa-fw fa-star"></i>Remove from favorites</a> </p> </form> <div id="tags"> <h3 id="tag-title">tags </h3> </div> <div id="participants"> <h3 id="participants_title">participants (8)</h3> <ul class="list-unstyled"> <li class="d-flex"> <div class="participant-gravatar circle"><img class="gravatar" src="https://secure.gravatar.com/avatar/db5f70d2f2520ef725839f046bdc32fb.jpg?s=48&amp;d=mm&amp;r=g" width="48" height="48" alt="" /></div> <div class="participant-name d-flex align-items-center"> <span>Antoine Pitrou</span> </div> </li> <li class="d-flex"> <div class="participant-gravatar circle"><img class="gravatar" src="https://secure.gravatar.com/avatar/35aa6fee222660ce1382d45a7a9a92fd.jpg?s=48&amp;d=mm&amp;r=g" width="48" height="48" alt="" /></div> <div class="participant-name d-flex align-items-center"> <span>Kevin Teague</span> </div> </li> <li class="d-flex"> <div class="participant-gravatar circle"><img class="gravatar" src="https://secure.gravatar.com/avatar/f3ba3ecffd20251d73749afbfa636786.jpg?s=48&amp;d=mm&amp;r=g" width="48" height="48" alt="" /></div> <div class="participant-name d-flex align-items-center"> <span>Nick Coghlan</span> </div> </li> <li class="d-flex"> <div class="participant-gravatar circle"><img class="gravatar" src="https://secure.gravatar.com/avatar/eaa875d37f5e9ca7d663f1372efa1317.jpg?s=48&amp;d=mm&amp;r=g" width="48" height="48" alt="" /></div> <div class="participant-name d-flex align-items-center"> <span>P.J. Eby</span> </div> </li> <li class="d-flex"> <div class="participant-gravatar circle"><img class="gravatar" src="https://secure.gravatar.com/avatar/d995b462a98fea412efa79d17ba3787a.jpg?s=48&amp;d=mm&amp;r=g" width="48" height="48" alt="" /></div> <div class="participant-name d-flex align-items-center"> <span>Paul Moore</span> </div> </li> <li class="d-flex"> <div class="participant-gravatar circle"><img class="gravatar" src="https://secure.gravatar.com/avatar/4053d6caab18829c4e8d393b6afa8ad8.jpg?s=48&amp;d=mm&amp;r=g" width="48" height="48" alt="" /></div> <div class="participant-name d-flex align-items-center"> <span>Sridhar Ratnakumar</span> </div> </li> <li class="d-flex"> <div class="participant-gravatar circle"><img class="gravatar" src="https://secure.gravatar.com/avatar/5e5142d6a1a578f02e2d94c4d6d31088.jpg?s=48&amp;d=mm&amp;r=g" width="48" height="48" alt="" /></div> <div class="participant-name d-flex align-items-center"> <span>Tarek Ziad茅</span> </div> </li> <li class="d-flex"> <div class="participant-gravatar circle"><img class="gravatar" src="https://secure.gravatar.com/avatar/2ee41cc7bcaacf6fcdcb7a2269e97b86.jpg?s=48&amp;d=mm&amp;r=g" width="48" height="48" alt="" /></div> <div class="participant-name d-flex align-items-center"> <span>艁ukasz Langa</span> </div> </li> </ul> </div> </section> </div> </div> </div> <!-- end of content --> </div> <!-- /container for content --> <footer class="footer"> <div class="container"> <p class="text-muted"> <img class="logo" alt="HyperKitty" src="/static/hyperkitty/img/logo.png" /> Powered by <a href="http://hyperkitty.readthedocs.org">HyperKitty</a> version 1.3.12. </p> </div> </footer> <script src="/static/hyperkitty/libs/jquery/jquery-3.6.0.min.js"></script> <script src="/static/hyperkitty/libs/jquery/jquery-ui-1.13.1.min.js"></script> <script src="/static/CACHE/js/output.3aaa7705d68a.js"></script> <script> // Add the .js-enabled class to the body so we can style the elements // depending on whether Javascript is enabled. $(document).ready(function(){ $("body").addClass("js-enabled"); $(".gravatar").addClass("rounded-circle"); }); </script> <script type="text/javascript"> $(document).ready(function() { //enable tooltips for thread buttons $("btn#next-thread").tooltip(); $("btn#prev-thread").tooltip(); setup_category(); setup_tags(); setup_favorites(); // Hide quotes by default in the thread view fold_quotes("div.container-xxl"); // Load the replies update_thread_replies("/archives/list/python-dev@python.org/thread/ILLTIOZAULMDY5CAS6GOITEYJ4HNFATQ/replies?sort=thread&last_view="); setup_unreadnavbar("#unreadnavbar"); setup_thread_keyboard_shortcuts(); }); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10