Differences between revisions 36 and 81 (spanning 45 versions)
Revision 36 as of 2006-07-17 01:13:00
Size: 4573
Editor: RichardJones
Comment:
Revision 81 as of 2019-06-27 21:39:45
Size: 7293
Comment: Warehouse
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
This page documents the development of the Python Cheese Shop: This page is about development of [[http://pypi.org|Python Package Index]] (formerly known as Cheeseshop):
Line 3: Line 3:
  http://cheeseshop.python.org  * More Info: CheeseShop
 * PyPI APIs: [[PyPIJSON|JSON]], [[PyPIXmlRpc|XMLRPC]]
Line 5: Line 6:
= How to submit packages = = Developing the Package Index =
Line 7: Line 8:
This page isn't about submitting packages. You want to see CheeseShopTutorial instead. == PyPI.nextgen: ==

Currently, as of 2019-06-27, PyPI has undergone a complete rewrite from scratch, and as a result much of the information on this page is not up-to-date.

The development moved from Mercurial (Python) to Git (C, shell). License changed from BSD-3 to Apache 2.0. Project code named 'warehouse' can be downloaded from:

 https://github.com/pypa/warehouse
Line 10: Line 17:
= Requests for new Trove categories = == Previous PyPI version ==
Line 12: Line 19:
Python frameworks with plugins or packages that target the framework
can get their own category. The category should only be added *after*
such packages exist. Complimentary packages can link to each other
from their descriptions, they do not need a category to link them
together; only when packages are provided by different people does a
category need to be created. To ask for a category email
catalog-sig@python.org.
"previous" version of PyPI is the code that was running on http://pypi.python.org from ... till mid-2018. It was originally written by ... and was running on ... . [[https://lwn.net/Articles/751458/|This LWN article goes into the history.]] The information below should help you get around the code.
Line 20: Line 21:
= XML-RPC Interface =  .
 The PyPI code was hosted under the Python Packaging Authority project: https://bitbucket.org/pypa/pypi and is now on GItHub: https://github.com/pypa/pypi-legacy
Line 22: Line 24:
The Cheese Shop has an XML-RPC interface which may be used by any 3rd-party application developer. See CheeseShopXmlRpc for details.  .
 Bug and patch tracker https://github.com/pypa/pypi-legacy/issues
Line 24: Line 27:
= Developing the Cheese Shop =  .
 [[http://mail.python.org/mailman/listinfo/distutils-sig|Mailing List]] ([[http://dir.gmane.org/gmane.comp.python.distutils|Gmane]] web interface)
Line 26: Line 30:
This information is for developers working on the PyPI code. The PyPI (packages index, Cheese Shop web interface) code resides in SVN at:  .
 API that is used by easy_install http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api
Line 28: Line 33:
  https://svn.python.org/packages/ (trunk,features,branches)  * [[PyPIOAuth]] - authentication library for Google and Launchpad logins
Line 30: Line 35:
Developers with access may use this URL:
Line 32: Line 36:
  svn+ssh://svn.python.org/data/repos/packages/trunk/pypi
Line 34: Line 37:
Patches and bug reports should be submitted to: == PyPI architecture and endpoints ==
Line 36: Line 39:
  http://sourceforge.net/tracker/?group_id=66150&atid=513503
Line 38: Line 40:
Discussion about the Cheese Shop should be had on the Catalog SIG mailing list: PyPI is a WSGI application that can be executed standalone using `python pypi.wsgi` command if all requirements are met. `pypi.wsgi` contains usual WSGI wrapper code and delegates request processing to `WebUI.run()` method from `webui.py`. This method just opens DB and handles exceptions, actual request processing is done in `WebUI.inner_run()`. This method analyzes URL endpoint and executes appropriate handler. As of 2011-04, the rules to match endpoints to handlers are the following:
Line 40: Line 42:
  http://mail.python.org/mailman/listinfo/catalog-sig

||/simple ||WebUI.run_simple() ||dump all package names on single html page ||
||/simple/(.+)/ ||WebUI.run_simple() ||dump all links for a package in html list ||
||/serversig/(.+)/ ||.run_simple_sign() ||save as above, but signed by server ||
||/mirrors ||.mirrors() ||display static page with a list of mirrors ||
||/daytime ||.daytime() ||display current server time ||





...


XML-RPC requests are detected by CONTENT_TYPE=`text/xml` variable in CGI environment and processed by `rpc.RequestHandler().__call__()`. List of XML-RPC "endpoints" is available on [[PyPIXmlRpc]] page.


== Testing Your Stuff Against PyPI ==


If you need to test stuff against PyPI (registration, uploading, API activities) then please use the alternative server "testpypi.python.org".
Line 45: Line 68:
 * [http://www.python.org/peps/pep-0345.html PEP for metadata 1.2] -- not finished and needs more catalog-sig discussion)
 * command-line tool to query pypi and fetch entries

 * A dump of download counts.
 * A big structured dump of all package meta-data.
 * A link from package to RTFD.
 * [
[http://www.python.org/peps/pep-0345.html|PEP for metadata 1.2]] -- not finished and needs more catalog-sig discussion)
Line 50: Line 76:
 * auto-compute [http://pycheesecake.org Cheesecake] scores
 * moderated user reviews and ratings (this would require quite a lot of support from volunteers though)
Line 53: Line 77:
 * screenshot images (with thumbnailing and a "latest screenshot" on the front page?)  * screenshot images (with thumbnailing and a "latest screenshot" on the front page?) - or perhaps icons instead of thumbnails for some packages?
Line 55: Line 79:
Something that's been requested, but needs much more thought and analysis to see whether it causes any problems: the ability to treat project names and versions as case-insensitive, while removing extraneous characters (as in pkg_resources.safe_name()) for
purposes both of searching and determining name uniqueness when registering.

Something that's been requested, but needs much more thought and analysis to see whether it causes any problems: the ability to treat project names and versions as case-insensitive, while removing extraneous characters (as in pkg_resources.safe_name()) for purposes both of searching and determining name uniqueness when registering.


=== Done ===


 * command-line tool to query pypi and fetch entries: [[http://pypi.python.org/pypi/yolk|yolk]]
Line 60: Line 91:
 * Edit [http://www.python.org/peps/pep-0243.html PEP 243] to reflect reality. The interface is implemented in the distutils register and upload commands. This code is good enough for documentation, especially because it's the only implementation necessary.
* Edit [[http://www.python.org/peps/pep-0243.html|PEP 243]] to reflect reality. The interface is implemented in the distutils register and upload commands. This code is good enough for documentation, especially because it's the only implementation necessary.
 * moderated user reviews and ratings (this would require quite a lot of support from volunteers though)


== Proposals ==


 * [[http://wiki.python.org/moin/EnhancedPyPI|EnhancedPyPI]] Enhance multiple package index servers support in Distutils.
Line 64: Line 104:

WARNING: Most of the information in here are out of date, see the instruction on the PyPI-legacy GitHub repository for more information, and most likely ask the developers for hints before trying to work on PyPI locally on your own !

PyPI uses postgresql 9.5 as a database, with a roll it yourself web framework based on different python modules. It uses apache2 as the web server.


It can run using wsgi, cgi, fcgi and mod_python.

Line 65: Line 114:



Line 70: Line 123:
Line 71: Line 125:



Line 78: Line 136:
Ask RichardJones if you need a database dump.
Line 80: Line 137:
PageTemplates are obtained from: Ask [[RichardJones|RichardJones]] if you need a database dump. Note that dumps should not be imported into an existing database that has had the pkdump_schema.sql DDL script run against it. The pg_dump file will create all of the database tables, columns, indexes, foreign keys, etc. that are required.




[[PageTemplates|PageTemplates]] are obtained from:



Line 83: Line 149:
  svn co svn://svn.zope.org/repos/main/zope.pagetemplate/trunk zope. pagetemplate   svn co svn://svn.zope.org/repos/main/zope.pagetemplate/trunk zope.pagetemplate
Line 90: Line 156:
We also need to install ez_setup and docutils.
We also need to install ez_setup, celementtree, docutils, psycopg2, and [[M2Crypto|M2Crypto]].


# For debian, this should get you most of the dependencies. apt-get install zope3 python-celementtree python-psycopg
Line 93: Line 164:



Line 98: Line 173:
if your config.ini isn't in /tmp/pypi.ini. You can leave it as 'config.ini' if it's in the same directory as pypi.py.
Line 100: Line 174:
If you wish to test functionality that requires login, then you will need to configure your apache to pass through basic auth. You do this by adding lines '''similar''' to the following to your apache2 conf file: if your config.ini isn't in /tmp/pypi.ini. You can leave it as 'config.ini' if it's in the same directory as pypi.py.


You will need to add cheesecake_password=yourpasshere into the config.ini in the webui section.


To integrate it with Apache, we recommend to use WSGI through mod_wsgi. Your configuration should look like this:



Line 103: Line 187:
  RewriteCond %{HTTP:Authorization} ^(.+)$

  RewriteRule ^/cgi-bin/pypi.cgi(.*) /Library/WebServer/CGI-Executables/pypi.cgi$1 [e=HTTP_CGI_AUTHORIZATION:%1,t=application/x-httpd-cgi,l]
   WSGIDaemonProcess pypi display-name=wsgi-pypi python-path=/usr/lib/zope2.9/lib/python processes=4 threads=1
   WSGIProcessGroup pypi
   WSGIPassAuthorization On
   WSGIScriptAlias /pypi /data/pypi/src/pypi/pypi.wsgi
   WSGIScriptAlias /simple /data/pypi/src/pypi/pypi.wsgi
Line 108: Line 194:
If this doesn't work, then you can use these lines to debug:
Line 110: Line 195:
{{{
  RewriteLog /var/log/httpd/rewrite.log
----
Line 113: Line 197:
  RewriteLogLevel 9
}}}
[[CategoryDevelopmentProcess|CategoryDevelopmentProcess]]

This page is about development of Python Package Index (formerly known as Cheeseshop):

Developing the Package Index

PyPI.nextgen:

Currently, as of 2019-06-27, PyPI has undergone a complete rewrite from scratch, and as a result much of the information on this page is not up-to-date.

The development moved from Mercurial (Python) to Git (C, shell). License changed from BSD-3 to Apache 2.0. Project code named 'warehouse' can be downloaded from:

Previous PyPI version

"previous" version of PyPI is the code that was running on http://pypi.python.org from ... till mid-2018. It was originally written by ... and was running on ... . This LWN article goes into the history. The information below should help you get around the code.

PyPI architecture and endpoints

PyPI is a WSGI application that can be executed standalone using python pypi.wsgi command if all requirements are met. pypi.wsgi contains usual WSGI wrapper code and delegates request processing to WebUI.run() method from webui.py. This method just opens DB and handles exceptions, actual request processing is done in WebUI.inner_run(). This method analyzes URL endpoint and executes appropriate handler. As of 2011-04, the rules to match endpoints to handlers are the following:

/simple

WebUI.run_simple()

dump all package names on single html page

/simple/(.+)/

WebUI.run_simple()

dump all links for a package in html list

/serversig/(.+)/

.run_simple_sign()

save as above, but signed by server

/mirrors

.mirrors()

display static page with a list of mirrors

/daytime

.daytime()

display current server time

...

XML-RPC requests are detected by CONTENT_TYPE=text/xml variable in CGI environment and processed by rpc.RequestHandler().__call__(). List of XML-RPC "endpoints" is available on PyPIXmlRpc page.

Testing Your Stuff Against PyPI

If you need to test stuff against PyPI (registration, uploading, API activities) then please use the alternative server "testpypi.python.org".

TO-DO list

  • A dump of download counts.
  • A big structured dump of all package meta-data.
  • A link from package to RTFD.
  • PEP for metadata 1.2 -- not finished and needs more catalog-sig discussion)

  • documented procedures for "taking over" entries should the original owner of the entry go away (and any required system support)
  • tooltips for field labels
  • change notification emails
  • per-classifier "wiki" content to allow description and discussion around each classifier (perhaps what packages are available and how they relate to one another)
  • screenshot images (with thumbnailing and a "latest screenshot" on the front page?) - or perhaps icons instead of thumbnails for some packages?

Something that's been requested, but needs much more thought and analysis to see whether it causes any problems: the ability to treat project names and versions as case-insensitive, while removing extraneous characters (as in pkg_resources.safe_name()) for purposes both of searching and determining name uniqueness when registering.

Done

  • command-line tool to query pypi and fetch entries: yolk

Not Going TO-DO

  • Edit PEP 243 to reflect reality. The interface is implemented in the distutils register and upload commands. This code is good enough for documentation, especially because it's the only implementation necessary.

  • moderated user reviews and ratings (this would require quite a lot of support from volunteers though)

Proposals

  • EnhancedPyPI Enhance multiple package index servers support in Distutils.

Development Environment Hints

WARNING: Most of the information in here are out of date, see the instruction on the PyPI-legacy GitHub repository for more information, and most likely ask the developers for hints before trying to work on PyPI locally on your own !

PyPI uses postgresql 9.5 as a database, with a roll it yourself web framework based on different python modules. It uses apache2 as the web server.

It can run using wsgi, cgi, fcgi and mod_python.

Before restoring database, "pypi" role must exists:

  createuser pypi

These are notes so we can remember how to dump / restore the packages database:

  pg_dump -Fc -b packages >packages-20060706.dump
  createdb packages
  pg_restore -O -d packages -Fc packages-20060706.dump

Ask RichardJones if you need a database dump. Note that dumps should not be imported into an existing database that has had the pkdump_schema.sql DDL script run against it. The pg_dump file will create all of the database tables, columns, indexes, foreign keys, etc. that are required.

PageTemplates are obtained from:

  svn co svn://svn.zope.org/repos/main/zope.pagetemplate/trunk zope.pagetemplate
  svn co svn://svn.zope.org/repos/main/zope.tal/trunk zope.tal
  svn co svn://svn.zope.org/repos/main/zope.interface/trunk zope.interface
  svn co svn://svn.zope.org/repos/main/zope.i18nmessageid/trunk zope.i18nmessageid
  svn co svn://svn.zope.org/repos/main/zope.tales/trunk zope.tales

We also need to install ez_setup, celementtree, docutils, psycopg2, and M2Crypto.

# For debian, this should get you most of the dependencies. apt-get install zope3 python-celementtree python-psycopg

Then go ahead and edit pypi.ini and this line in pypi.cgi:

  cfg = config.Config('/tmp/pypi.ini', 'webui')

if your config.ini isn't in /tmp/pypi.ini. You can leave it as 'config.ini' if it's in the same directory as pypi.py.

You will need to add cheesecake_password=yourpasshere into the config.ini in the webui section.

To integrate it with Apache, we recommend to use WSGI through mod_wsgi. Your configuration should look like this:

   WSGIDaemonProcess pypi display-name=wsgi-pypi python-path=/usr/lib/zope2.9/lib/python processes=4 threads=1
   WSGIProcessGroup pypi
   WSGIPassAuthorization On
   WSGIScriptAlias /pypi /data/pypi/src/pypi/pypi.wsgi
   WSGIScriptAlias /simple /data/pypi/src/pypi/pypi.wsgi


CategoryDevelopmentProcess

CheeseShopDev (last edited 2019-08-23 10:57:11 by SumanaHarihareswara)

Unable to edit the page? See the FrontPage for instructions.