2011-06-01 15:42:49 -03:00
|
|
|
:mod:`packaging.pypi.xmlrpc` --- Crawler using the PyPI XML-RPC interface
|
|
|
|
=========================================================================
|
|
|
|
|
|
|
|
.. module:: packaging.pypi.xmlrpc
|
|
|
|
:synopsis: Client using XML-RPC requests to fetch info and distributions.
|
|
|
|
|
|
|
|
|
|
|
|
Indexes can be queried using XML-RPC calls, and Packaging provides a simple
|
|
|
|
way to interface with XML-RPC.
|
|
|
|
|
|
|
|
You should **use** XML-RPC when:
|
|
|
|
|
|
|
|
* Searching the index for projects **on other fields than project
|
|
|
|
names**. For instance, you can search for projects based on the
|
|
|
|
author_email field.
|
|
|
|
* Searching all the versions that have existed for a project.
|
|
|
|
* you want to retrieve METADATAs information from releases or
|
|
|
|
distributions.
|
|
|
|
|
|
|
|
|
|
|
|
You should **avoid using** XML-RPC method calls when:
|
|
|
|
|
|
|
|
* Retrieving the last version of a project
|
|
|
|
* Getting the projects with a specific name and version.
|
|
|
|
* The simple index can match your needs
|
|
|
|
|
|
|
|
|
|
|
|
When dealing with indexes, keep in mind that the index queries will always
|
|
|
|
return you :class:`packaging.pypi.dist.ReleaseInfo` and
|
|
|
|
:class:`packaging.pypi.dist.ReleasesList` objects.
|
|
|
|
|
|
|
|
Some methods here share common APIs with the one you can find on
|
|
|
|
:class:`packaging.pypi.simple`, internally, :class:`packaging.pypi.client`
|
|
|
|
is inherited by :class:`Client`
|
|
|
|
|
|
|
|
|
|
|
|
API
|
|
|
|
---
|
|
|
|
|
|
|
|
.. class:: Client
|
|
|
|
|
|
|
|
|
|
|
|
Usage examples
|
|
|
|
--------------
|
|
|
|
|
|
|
|
Use case described here are use case that are not common to the other clients.
|
|
|
|
If you want to see all the methods, please refer to API or to usage examples
|
|
|
|
described in :class:`packaging.pypi.client.Client`
|
|
|
|
|
|
|
|
|
|
|
|
Finding releases
|
|
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
It's a common use case to search for "things" within the index. We can
|
|
|
|
basically search for projects by their name, which is the most used way for
|
|
|
|
users (eg. "give me the last version of the FooBar project").
|
|
|
|
|
|
|
|
This can be accomplished using the following syntax::
|
|
|
|
|
|
|
|
>>> client = xmlrpc.Client()
|
|
|
|
>>> client.get_release("Foobar (<= 1.3))
|
|
|
|
<FooBar 1.2.1>
|
|
|
|
>>> client.get_releases("FooBar (<= 1.3)")
|
|
|
|
[FooBar 1.1, FooBar 1.1.1, FooBar 1.2, FooBar 1.2.1]
|
|
|
|
|
|
|
|
|
|
|
|
And we also can find for specific fields::
|
|
|
|
|
|
|
|
>>> client.search_projects(field=value)
|
|
|
|
|
|
|
|
|
|
|
|
You could specify the operator to use, default is "or"::
|
|
|
|
|
|
|
|
>>> client.search_projects(field=value, operator="and")
|
|
|
|
|
|
|
|
|
|
|
|
The specific fields you can search are:
|
|
|
|
|
|
|
|
* name
|
|
|
|
* version
|
|
|
|
* author
|
|
|
|
* author_email
|
|
|
|
* maintainer
|
|
|
|
* maintainer_email
|
|
|
|
* home_page
|
|
|
|
* license
|
|
|
|
* summary
|
|
|
|
* description
|
|
|
|
* keywords
|
|
|
|
* platform
|
|
|
|
* download_url
|
|
|
|
|
|
|
|
|
|
|
|
Getting metadata information
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
2011-11-11 14:58:53 -04:00
|
|
|
XML-RPC is a preferred way to retrieve metadata information from indexes.
|
2011-06-01 15:42:49 -03:00
|
|
|
It's really simple to do so::
|
|
|
|
|
|
|
|
>>> client = xmlrpc.Client()
|
|
|
|
>>> client.get_metadata("FooBar", "1.1")
|
|
|
|
<ReleaseInfo FooBar 1.1>
|
|
|
|
|
|
|
|
|
|
|
|
Assuming we already have a :class:`packaging.pypi.ReleaseInfo` object defined,
|
|
|
|
it's possible to pass it to the xmlrpc client to retrieve and complete its
|
|
|
|
metadata::
|
|
|
|
|
|
|
|
>>> foobar11 = ReleaseInfo("FooBar", "1.1")
|
|
|
|
>>> client = xmlrpc.Client()
|
|
|
|
>>> returned_release = client.get_metadata(release=foobar11)
|
|
|
|
>>> returned_release
|
|
|
|
<ReleaseInfo FooBar 1.1>
|
|
|
|
|
|
|
|
|
|
|
|
Get all the releases of a project
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
To retrieve all the releases for a project, you can build them using
|
|
|
|
`get_releases`::
|
|
|
|
|
|
|
|
>>> client = xmlrpc.Client()
|
|
|
|
>>> client.get_releases("FooBar")
|
|
|
|
[<ReleaseInfo FooBar 0.9>, <ReleaseInfo FooBar 1.0>, <ReleaseInfo 1.1>]
|
|
|
|
|
|
|
|
|
|
|
|
Get information about distributions
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
Indexes have information about projects, releases **and** distributions.
|
|
|
|
If you're not familiar with those, please refer to the documentation of
|
|
|
|
:mod:`packaging.pypi.dist`.
|
|
|
|
|
|
|
|
It's possible to retrieve information about distributions, e.g "what are the
|
|
|
|
existing distributions for this release ? How to retrieve them ?"::
|
|
|
|
|
|
|
|
>>> client = xmlrpc.Client()
|
|
|
|
>>> release = client.get_distributions("FooBar", "1.1")
|
|
|
|
>>> release.dists
|
|
|
|
{'sdist': <FooBar 1.1 sdist>, 'bdist': <FooBar 1.1 bdist>}
|
|
|
|
|
|
|
|
As you see, this does not return a list of distributions, but a release,
|
|
|
|
because a release can be used like a list of distributions.
|