2014年5月29日木曜日

PyPI XML-RPC解説

PyPIはXML-RPCに対応しており、xmlrpclibを用いることで、簡単にPyPIのデータを利用することができます。PyPIに利用可能なメソッドの説明はあるのですが、具体例は少ないので解説記事を作りました。
Updated: 本編をWebサイトからこちらに持ってきました。
基本的にこのページの和訳です。

list_packages()

PyPIに登録されちいるパッケージ一覧をパッケージ名のlistとして戻します。

>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> packageList = client.list_packages()
>>> packageList
['0x10c-asm', '1009558_nester', '131228_pytest_1', '17MonIP', '18-e', '1ee', '1pass', '1to001', '2013007_pyh', '2C.py'... ]

>>> len(packageList)
44313

package_releases(package_name, show_hidden=False)

指定されたパッケージのリリース一覧をlistとして戻します。show_hiddenがFalse(Default)の場合、隠されたリリースは含まれません。

>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.package_releases('Django')
['1.6.5', '1.6.4', '1.6.3', '1.6.2', '1.6.1', '1.6', '1.5.8', '1.5.7', '1.5.6', '1.5.5', '1.5.4', '1.5.3', '1.5.2', '1.5.1', '1.5', '1.4.13', '1.4.12', '1.4.11', '1.4.10', 
'1.4.9', '1.4.8', '1.4.7', '1.4.6', '1.4.5', '1.4.4', '1.4.3', '1.3.7', '1.3.6', '1.3.5', '1.2.7', '1.1.4', '1.0.4']
なお、show_hiddenを設定する際、「show_hidden=True」と指定するとエラーとなるため、「True」のみを設定してください。
>>> client.package_releases('Django',show_hidden=True)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: __call__() got an unexpected keyword argument 'show_hidden'

>>> client.package_releases('Django',True)
['1.6.5', '1.6.4', '1.6.3', '1.6.2', '1.6.1', '1.6', '1.5.8', '1.5.7', '1.5.6', '1.5.5', '1.5.4', '1.5.3', '1.5.2', '1.5.1', '1.5', '1.4.13', '1.4.12', '1.4.11', '1.4.10', 
'1.4.9', '1.4.8', '1.4.7', '1.4.6', '1.4.5', '1.4.4', '1.4.3', '1.4.2', '1.4.1', '1.4', '1.3.7', '1.3.6', '1.3.5', '1.3.4', '1.3.3', '1.3.2', '1.3.1', '1.3', '1.2.7', 
'1.2.6', '1.2.5', '1.2.4', '1.2.3', '1.2.2', '1.2.1', '1.2', '1.1.4', '1.1.3', '1.1.2', '1.1.1', '1.1', '1.0.4', '1.0.3', '1.0.2', '1.0.1']
また、大文字小文字が区別され、存在しないパッケージ名を指定すると空のlistが戻されます。
>>> client.package_releases('django')
[]

package_roles(package_name)

指定されたパッケージのOwnerとMaintainer一覧をlistとして取得します。

>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.package_roles('Django')
[['Owner', 'ubernostrum'], ['Owner', 'jacobian'], ['Maintainer', 'apollo13'], ['Maintainer', 'jezdez']]

user_packages(user)

指定されたユーザーのロール、パッケージ名のlistを取得します。 Package rolesがパッケージに対するロール、ユーザー一覧なのに対し、こちらはユーザーに対するロール、パッケージ一覧です。

>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.user_packages('ubernostrum')
[['Owner', 'webcolors'], ['Owner', 'pownce-api'], ['Owner', 'django-registration'], ['Owner', 'django-profiles'], ['Owner', 'django-flashpolicies'], ['Owner', 'Django'], 
['Owner', 'django-funserver'], ['Owner', 'django-contact-form'], ['Owner', 'mdn-sphinx-theme']]

release_downloads(package_name, version)

指定されたパッケージ、バージョンのダウンロードファイルとダウンロード数のlistを取得します。

>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.release_downloads('Django','1.6.5')
[['Django-1.6.5.tar.gz', 85849], ['Django-1.6.5-py2.py3-none-any.whl', 63062]]

release_urls(package_name, version)

指定されたパッケージ、バージョンのダウンロード用urlに関する情報を、dictionaryのlist形式で戻します。 dictionaryとして戻されるのは以下の項目です。

  • has_sig
  • upload_time
  • comment_text
  • python_version
  • url
  • md5_digest
  • downloads
  • filename
  • packagetype
  • size
>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.release_urls('Django','1.6.5')
[{'has_sig': False, 'upload_time': , 'comment_text': '', 'python_version': 'any', 'url': 'https://pypi.python.org/packages/any/D/Django/Django-1.6.5-py2.py3-none-any.whl', 
'md5_digest': '2bcdb4729f9f358b0925b532eef0a8ff', 'downloads': 63062, 'filename': 'Django-1.6.5-py2.py3-none-any.whl', 'packagetype': 'bdist_wheel', 'size': 6683598}, 
{'has_sig': False, 'upload_time': , 'comment_text': '', 'python_version': 'source', 'url': 'https://pypi.python.org/packages/source/D/Django/Django-1.6.5.tar.gz', 
'md5_digest': 'e4c5b2d35ecb3807317713afa70a0c77', 'downloads': 85849, 'filename': 'Django-1.6.5.tar.gz', 'packagetype': 'sdist', 'size': 6633768}]

release_data(package_name, version)

指定されたパッケージ、バージョンに関する基本情報(URLや説明、先月のダウンロード数等)を取得します。

>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.release_data('Django','1.6.5')
{'maintainer': None, 'docs_url': '', 'requires_python': None,...}

search(spec[, operator])

dictionary形式でSpecに指定された条件で検索を行い、条件にあったパッケージのdictionaryのlistを戻します。

  • 'name': パッケージ名
  • 'version': バージョン
  • 'summary': サマリー
>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.search({'name':['django']})
[{'_pypi_ordering': 0, 'version': '0.3.0', 'name': 'alpaca-django',...] 

browse(classifiers)

指定された分類(classifier)に含まれるパッケージとバージョンの一覧を戻します。 classifier一覧
https://pypi.python.org/pypi?%3Aaction=list_classifiers

>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.browse(['Programming Language :: Python'])
[['pythonweb', '0.6.0'], ['mycloud', '0.51'], ['django-ship', '0.2.1']...]

changelog(since, with_ids=False)

sinceで指定されたtimestampから最新までの変更ログのlistを戻します。1つ1つのログは(name, version, timestamp, action)です。with_ids=Trueの場合、最後にserialが追加されます。また、timestampは全てUTCベースで、sinceは整数のみです。 以下は、今から1000秒前を起点として変更ログを戻しています。

>>> import xmlrpclib
>>> import time
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.changelog(int(time.time()-1000))
[['arvados-python-client', '0.1.1401370328.82b4650', 1401370508,...] 

changelog_last_serial()

最新のchangelogのserialを戻します。

>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.changelog_last_serial()
1107680

changelog_since_serial(since_serial)

指定されたserial以降の変更ログのlistを戻します。1つ1つのログは(name, version, timestamp, action, serial)です。

>>> import xmlrpclib
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.changelog_since_serial(1107670)
[['infi.recipe.buildout_logging', '0.1.1', 1401370958,...] 

0 件のコメント:

コメントを投稿