summaryrefslogtreecommitdiff
path: root/doc/en/plugins_index.py
diff options
context:
space:
mode:
Diffstat (limited to 'doc/en/plugins_index.py')
-rw-r--r--doc/en/plugins_index.py109
1 files changed, 75 insertions, 34 deletions
diff --git a/doc/en/plugins_index.py b/doc/en/plugins_index.py
index 8a31a6d73..0e6caa1ec 100644
--- a/doc/en/plugins_index.py
+++ b/doc/en/plugins_index.py
@@ -1,4 +1,11 @@
+'''
+Script to generate the file `plugins_index.txt` with information about pytest plugins taken directly
+from a live pypi server.
+
+This will evolve to include test compatibility (pythons and pytest versions) information also.
+'''
from collections import namedtuple
+import datetime
from distutils.version import LooseVersion
import itertools
import os
@@ -7,10 +14,16 @@ import xmlrpclib
#===================================================================================================
-# iter_pypi_plugins
+# iter_plugins
#===================================================================================================
-def iter_pypi_plugins(client):
- for plug_data in client.search({'name' : 'pytest-'}):
+def iter_plugins(client, search='pytest-'):
+ '''
+ Returns an iterator of (name, version) from pypi.
+
+ :param client: xmlrpclib.ServerProxy
+ :param search: package names to search for
+ '''
+ for plug_data in client.search({'name' : search}):
yield plug_data['name'], plug_data['version']
@@ -18,6 +31,11 @@ def iter_pypi_plugins(client):
# get_latest_versions
#===================================================================================================
def get_latest_versions(plugins):
+ '''
+ Returns an iterator of (name, version) from the given list of (name, version), but returning
+ only the latest version of the package. Uses distutils.LooseVersion to ensure compatibility
+ with PEP386.
+ '''
plugins = [(name, LooseVersion(version)) for (name, version) in plugins]
for name, grouped_plugins in itertools.groupby(plugins, key=lambda x: x[0]):
name, loose_version = list(grouped_plugins)[-1]
@@ -28,19 +46,27 @@ def get_latest_versions(plugins):
# obtain_plugins_table
#===================================================================================================
def obtain_plugins_table(plugins, client):
+ '''
+ Returns information to populate a table of plugins, their versions, authors, etc.
+
+ The returned information is a list of columns of `ColumnData` namedtuples(text, link). Link
+ can be None if the text for that column should not be linked to anything.
+
+ :param plugins: list of (name, version)
+ :param client: xmlrpclib.ServerProxy
+
+ '''
rows = []
- RowData = namedtuple('RowData', 'text link')
+ ColumnData = namedtuple('ColumnData', 'text link')
headers = ['Name', 'Version', 'Author', 'Summary']
- # pluginname and latest version, pypi link, maintainer/author, repository link,
- # one-line description, test status py27/py33
for package_name, version in plugins:
release_data = client.release_data(package_name, version)
row = (
- RowData(package_name, release_data['package_url']),
- RowData(version, release_data['release_url']),
- RowData(release_data['author'], release_data['author_email']),
- RowData(release_data['summary'], None),
+ ColumnData(package_name, release_data['package_url']),
+ ColumnData(version, release_data['release_url']),
+ ColumnData(release_data['author'], release_data['author_email']),
+ ColumnData(release_data['summary'], None),
)
assert len(row) == len(headers)
rows.append(row)
@@ -51,56 +77,71 @@ def obtain_plugins_table(plugins, client):
#===================================================================================================
# generate_plugins_index_from_table
#===================================================================================================
-def generate_plugins_index_from_table(headers, rows, basename):
-
- def get_row_limiter(char):
- return ' '.join(char * length for length in column_lengths)
-
- def ref(s, link):
- return s + '_' if link else s
-
+def generate_plugins_index_from_table(filename, headers, rows):
+ '''
+ Generates a RST file with the table data given.
+
+ :param filename: output filename
+ :param headers: see `obtain_plugins_table`
+ :param rows: see `obtain_plugins_table`
+ '''
+ # creates a list of rows, each being a str containing appropriate column text and link
table_texts = []
for row in rows:
- row_texts = []
- for i, row_data in enumerate(row):
- text = '`%s <%s>`_' % (row_data.text, row_data.link) if row_data.link else row_data.text
- row_texts.append(text)
- table_texts.append(row_texts)
+ column_texts = []
+ for i, col_data in enumerate(row):
+ text = '`%s <%s>`_' % (col_data.text, col_data.link) if col_data.link else col_data.text
+ column_texts.append(text)
+ table_texts.append(column_texts)
+ # compute max length of each column so we can build the rst table
column_lengths = [len(x) for x in headers]
- for row_texts in table_texts:
- for i, row_text in enumerate(row_texts):
+ for column_texts in table_texts:
+ for i, row_text in enumerate(column_texts):
column_lengths[i] = max(column_lengths[i], len(row_text) + 2)
- with file(basename, 'w') as f:
+ def get_row_limiter(char):
+ return ' '.join(char * length for length in column_lengths)
+
+ with file(filename, 'w') as f:
+ # write welcome
print >> f, '.. _plugins_index:'
print >> f
print >> f, 'List of Third-Party Plugins'
print >> f, '==========================='
print >> f
- print >> f
+
+ # table
print >> f, get_row_limiter('=')
for i, header in enumerate(headers):
print >> f, '{:^{fill}}'.format(header, fill=column_lengths[i]),
print >> f
print >> f, get_row_limiter('=')
- for row_texts in table_texts:
- for i, row_text in enumerate(row_texts):
+ for column_texts in table_texts:
+ for i, row_text in enumerate(column_texts):
print >> f, '{:^{fill}}'.format(row_text, fill=column_lengths[i]),
print >> f
print >> f
print >> f, get_row_limiter('=')
print >> f
+
+ print >> f, '*(Last updated: %s)*' % datetime.date.today().strftime('%Y-%m-%d')
#===================================================================================================
# generate_plugins_index
#===================================================================================================
-def generate_plugins_index(client, basename):
- plugins = get_latest_versions(iter_pypi_plugins(client))
+def generate_plugins_index(client, filename):
+ '''
+ Generates an RST file with a table of the latest pytest plugins found in pypi.
+
+ :param client: xmlrpclib.ServerProxy
+ :param filename: output filename
+ '''
+ plugins = get_latest_versions(iter_plugins(client))
headers, rows = obtain_plugins_table(plugins, client)
- generate_plugins_index_from_table(headers, rows, basename)
+ generate_plugins_index_from_table(filename, headers, rows)
#===================================================================================================
@@ -108,8 +149,8 @@ def generate_plugins_index(client, basename):
#===================================================================================================
def main(argv):
client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
- basename = os.path.join(os.path.dirname(__file__), 'plugins_index.txt')
- generate_plugins_index(client, basename)
+ filename = os.path.join(os.path.dirname(__file__), 'plugins_index.txt')
+ generate_plugins_index(client, filename)
print 'OK'
return 0