diff options
Diffstat (limited to 'doc/en/plugins_index.py')
-rw-r--r-- | doc/en/plugins_index.py | 109 |
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 |