<div dir="ltr">+1 on the proposal. <div><br></div><div>I would suggest to state where it is posted (somewhere obvious) on pypi, and possibly some kind of automated notification to pypi uploaders be provided about the new policy. </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 13, 2017 at 10:08 AM, Lukasz Langa <span dir="ltr"><<a href="mailto:lukasz@langa.pl" target="_blank">lukasz@langa.pl</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello distutils-sig,<br>
I'd like to get some comments on this. I was asked by Donald to work on it. It removes ambiguity from some of the situations that crop up increasingly often with regards to package names on the PyPI. Looking forward to hearing what you have to say!<br>
- Ł<br>
<br>
<br>
PEP: 541<br>
Title: Package Index Name Retention<br>
Version: $Revision$<br>
Last-Modified: $Date$<br>
Author: Łukasz Langa <<a href="mailto:lukasz@langa.pl">lukasz@langa.pl</a>><br>
Status: Draft<br>
Type: Process<br>
Content-Type: text/x-rst<br>
Created: 12-January-2017<br>
<br>
<br>
Abstract<br>
========<br>
<br>
This PEP proposes an extension to the Terms of Use [1]_ of the Package<br>
Index [2]_, clarifying expectations of package owners regarding<br>
ownership of a package name on the Package Index, specifically with<br>
regards to conflict resolution.<br>
<br>
Existing package repositories such as CPAN [3]_, NPM [4]_, and<br>
GitHub [5]_ will be investigated as prior art in this field.<br>
<br>
<br>
Rationale<br>
=========<br>
<br>
Given that package names on the Index are sharing a single flat<br>
namespace, a unique name is a finite resource. The growing age of<br>
the Package Index causes a constant rise of situations of conflict<br>
between the current use of the name and a different suggested use of<br>
the same name.<br>
<br>
This document aims to provide general guidelines for solving the<br>
most typical cases of such conflicts.<br>
<br>
<br>
Specification<br>
=============<br>
<br>
The main idea behind this document is that the Package Index serves the<br>
community. Every user is invited to upload content to the Package Index<br>
under the Terms of Use, understanding that it is at the sole risk of<br>
the user.<br>
<br>
While the Package Index is not a backup service, the maintainers of the<br>
Package Index do their best to keep that content accessible indefinitely<br>
in its published form. However, in certain edge cases the greater<br>
community's needs might overweigh the individual's expectation of<br>
ownership of a package name.<br>
<br>
The use cases covered by this document are:<br>
<br>
* Abandoned projects:<br>
<br>
* continued maintenance by a different set of users; or<br>
* removal from the Index for use with a different project.<br>
<br>
* Active projects:<br>
<br>
* resolving disputes over a name.<br>
<br>
* Invalid projects.<br>
<br>
<br>
Implementation<br>
==============<br>
<br>
Reachability<br>
------------<br>
<br>
The user of the Package Index is solely responsible for being reachable<br>
by the Package Index maintainers for matters concerning projects that<br>
the user owns. In every case where contacting the user is necessary,<br>
the maintainers will try to do so at least three times, using the<br>
following means of contact:<br>
<br>
* the e-mail address on file in the user's profile on the Package Index;<br>
* the e-mail address listed in the Author field for a given project<br>
uploaded to the Index; and<br>
* any e-mail addresses found in the given project's documentation<br>
on the Index or on the listed Home Page.<br>
<br>
The maintainers stop trying to reach the user after six weeks.<br>
<br>
<br>
Abandoned projects<br>
------------------<br>
<br>
A project is considered *abandoned* when ALL of the following are met:<br>
<br>
* owner not reachable (see Reachability above);<br>
* no releases within the past twelve months; and<br>
* no activity from the owner on the project's home page (or no<br>
home page listed).<br>
<br>
All other projects are considered *active*.<br>
<br>
<br>
Continued maintenance of an abandoned project<br>
------------------------------<wbr>---------------<br>
<br>
If a candidate appears willing to continue maintenance on an *abandoned*<br>
project, ownership of the name is transferred when ALL of the following<br>
are met:<br>
<br>
* the project has been determined *abandoned* by the rules described<br>
above;<br>
* the candidate is able to demonstrate own failed attempts to contact<br>
the existing owner;<br>
* the candidate is able to demonstrate skin in the game (improvements<br>
made on the candidate's own fork of the project);<br>
* the candidate is able to demonstrate why a fork under a different name<br>
is not an acceptable workaround; and<br>
* the maintainers of the Package Index don't have any additional<br>
reservations.<br>
<br>
Under no circumstances will a name be reassigned against the wishes of<br>
a reachable owner.<br>
<br>
<br>
Removal of an abandoned project<br>
------------------------------<wbr>-<br>
<br>
Projects are never removed from the Package Index solely on the basis<br>
of abandonment. Artifacts uploaded to the Package Index hold inherent<br>
historical value.<br>
<br>
An *abandoned* project can be transferred to a new owner for purposes<br>
of reusing the name when ALL of the following are met:<br>
<br>
* the project has been determined *abandoned* by the rules described<br>
above;<br>
* the candidate is able to demonstrate own failed attempts to contact<br>
the existing owner;<br>
* the candidate is able to demonstrate skin in the game (the other<br>
project suggested to reuse the name already exists and meets<br>
notability requirements);<br>
* the candidate is able to demonstrate why a fork under a different name<br>
is not an acceptable workaround;<br>
* download statistics on the Package Index for the existing package<br>
indicate project is not being used; and<br>
* the maintainers of the Package Index don't have any additional<br>
reservations.<br>
<br>
<br>
Name conflict resolution for active projects<br>
------------------------------<wbr>--------------<br>
<br>
The maintainers of the Package Index are not arbiters in disputes<br>
around *active* projects. There are many possible scenarios here,<br>
a non-exclusive list describing some real-world examples is presented<br>
below. None of the following qualify for package name ownership<br>
transfer:<br>
<br>
1. User A and User B share project X. After some time they part ways<br>
and each of them wants to continue the project under name X.<br>
2. User A owns a project X outside the Package Index. User B creates<br>
a package under the name X on the Index. After some time, User A<br>
wants to publish project X on the Index but realizes name is taken.<br>
This is true even if User A's project X gains notability and the<br>
User B's project X is not notable.<br>
3. User A publishes project X to the Package Index. After some time<br>
User B proposes bug fixes to the project but no new release is<br>
published by User A. This is true even if User A agrees to publish<br>
a new version and later doesn't, even if User B's changes are merged<br>
to the source code repository for project X.<br>
<br>
Again, the list above is not exclusive. The maintainers of the Package<br>
Index recommend users to get in touch with each other and solve the<br>
issue by respectful communication (see the PSF Code of Conduct [6]_).<br>
<br>
<br>
Invalid projects<br>
----------------<br>
<br>
A project published on the Package Index meeting ANY of the following<br>
is considered invalid and will be removed from the Index:<br>
<br>
* project does not conform to Terms of Use;<br>
* project is malware (designed to exploit or harm systems or users);<br>
* project contains illegal content;<br>
* project violates copyright or licenses;<br>
* project is name squatting (package has no functionality or is<br>
empty);<br>
* project name, description, or content violates the Code of Conduct;<br>
or<br>
* project is abusing the Package Index for purposes it was not<br>
intended.<br>
<br>
If you find a project that might be considered invalid, create<br>
a support request [7]_.<br>
<br>
<br>
Prior art<br>
=========<br>
<br>
NPM contains a separate section linked from the front page called<br>
`Package Name Disputes <<a href="https://www.npmjs.com/policies/disputes" rel="noreferrer" target="_blank">https://www.npmjs.com/<wbr>policies/disputes</a>>`_.<br>
It is described as a "living document", as of January 2017 its<br>
contents might be summarized as follows:<br>
<br>
* package name squatting is prohibited;<br>
* users wanting to reuse a project name are required to contact the<br>
existing author, with cc to <a href="mailto:support@npmjs.com">support@npmjs.com</a>;<br>
* all contact must conform to the NPM Code of Conduct;<br>
* in case of no resolution after a few weeks, npm inc. holds the right<br>
to the final decision in the matter.<br>
<br>
CPAN lets any user upload modules with the same name. PAUSE, a related<br>
index, only lists modules uploaded by the primary maintainer or listed<br>
co-maintainers. CPAN documentation doesn't address disputes otherwise.<br>
<br>
GitHub's terms of service contain an exhaustive list of behavior<br>
not meeting general conditions of use. While not codified anywhere,<br>
GitHub does agree for users to reclaim abandoned account names by<br>
archiving the abandoned account and letting the other user or<br>
organization rename their account. This is done on a case-by-case<br>
basis.<br>
<br>
<br>
Rejected Proposals<br>
==================<br>
<br>
The original approach was to hope for the best and solve issues as they<br>
arise without written policy. This is not sustainable. The lack of<br>
generally available guidelines in writing on package name conflict<br>
resolution is causing unnecessary tensions. From the perspective of<br>
users, decisions made by the Package Index maintainers without written<br>
guidelines may appear arbitrary. From the perspective of the Package<br>
Index maintainers, solving name conflicts is a stressful task due to<br>
risk of unintentional harm due to lack of defined policy.<br>
<br>
<br>
References<br>
==========<br>
<br>
.. [1] Terms of Use of the Python Package Index<br>
(<a href="https://pypi.org/policy/terms-of-use/" rel="noreferrer" target="_blank">https://pypi.org/policy/<wbr>terms-of-use/</a>)<br>
<br>
.. [2] The Python Package Index<br>
(<a href="https://pypi.python.org/" rel="noreferrer" target="_blank">https://pypi.python.org/</a>)<br>
<br>
.. [3] The Comprehensive Perl Archive Network<br>
(<a href="http://www.cpan.org/" rel="noreferrer" target="_blank">http://www.cpan.org/</a>)<br>
<br>
.. [4] Node Package Manager<br>
(<a href="https://www.npmjs.com/package/left-pad" rel="noreferrer" target="_blank">https://www.npmjs.com/<wbr>package/left-pad</a>)<br>
<br>
.. [5] GitHub<br>
(<a href="https://github.com/" rel="noreferrer" target="_blank">https://github.com/</a>)<br>
<br>
.. [6] Python Community Code of Conduct<br>
(<a href="https://www.python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">https://www.python.org/psf/<wbr>codeofconduct/</a>)<br>
<br>
.. [7] PyPI Support Requests<br>
(<a href="https://sourceforge.net/p/pypi/support-requests/" rel="noreferrer" target="_blank">https://sourceforge.net/p/<wbr>pypi/support-requests/</a>)<br>
<br>
<br>
Copyright<br>
=========<br>
<br>
This document has been placed in the public domain.<br>
<br>
<br>
Acknowledgements<br>
================<br>
<br>
The many participants of the Distutils and Catalog SIGs for their<br>
ideas over the years.<br>
<br>
..<br>
Local Variables:<br>
mode: indented-text<br>
indent-tabs-mode: nil<br>
sentence-end-double-space: t<br>
fill-column: 70<br>
End:<br>
<br>
<br>
______________________________<wbr>_________________<br>
Distutils-SIG maillist - <a href="mailto:Distutils-SIG@python.org">Distutils-SIG@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/distutils-sig" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/distutils-sig</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">cordially,<br>Anna</div>
</div>