diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 1dbc687..0000000 --- a/.gitignore +++ /dev/null @@ -1,62 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover -.hypothesis/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -#Ipython Notebook -.ipynb_checkpoints diff --git a/.gitreview b/.gitreview deleted file mode 100644 index 34d7632..0000000 --- a/.gitreview +++ /dev/null @@ -1,4 +0,0 @@ -[gerrit] -host=review.openstack.org -port=29418 -project=openstack/microversion-parse.git diff --git a/.testr.conf b/.testr.conf deleted file mode 100644 index ac83491..0000000 --- a/.testr.conf +++ /dev/null @@ -1,4 +0,0 @@ -[DEFAULT] -test_command=${PYTHON:-python} -m subunit.run discover -t . ${OS_TEST_PATH:-microversion_parse} $LISTOPT $IDOPTION -test_id_option=--load-list $IDFILE -test_list_option=--list diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8dada3e..0000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Makefile b/Makefile deleted file mode 100644 index 642b9d7..0000000 --- a/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# simple Makefile for some common tasks -.PHONY: clean test dist release pypi tagv docs - -clean: - find . -name "*.pyc" |xargs rm || true - rm -r dist || true - rm -r build || true - rm -r .tox || true - rm -r .testrepository || true - rm -r cover .coverage || true - rm -r .eggs || true - rm -r microversion_parse.egg-info || true - -tagv: - git tag \ - -m `python -c 'import microversion_parse; print microversion_parse.__version__'` \ - `python -c 'import microversion_parse; print microversion_parse.__version__'` - git push origin master --tags - -cleanagain: - find . -name "*.pyc" |xargs rm || true - rm -r dist || true - rm -r build || true - rm -r .tox || true - rm -r .testrepository || true - rm -r cover .coverage || true - rm -r .eggs || true - rm -r microversion_parse.egg-info || true - -docs: - cd docs ; $(MAKE) html - -test: - tox --skip-missing-interpreters - -dist: test - python setup.py sdist - -release: clean test cleanagain tagv pypi - -pypi: - python setup.py sdist upload diff --git a/README b/README new file mode 100644 index 0000000..8fcd2b2 --- /dev/null +++ b/README @@ -0,0 +1,14 @@ +This project is no longer maintained. + +The contents of this repository are still available in the Git +source code management system. To see the contents of this +repository before it reached its end of life, please check out the +previous commit with "git checkout HEAD^1". + +For ongoing work on maintaining OpenStack packages in the Debian +distribution, please see the Debian OpenStack packaging team at +https://wiki.debian.org/OpenStack/. + +For any further questions, please email +openstack-dev@lists.openstack.org or join #openstack-dev on +Freenode. diff --git a/README.rst b/README.rst deleted file mode 100644 index da3c697..0000000 --- a/README.rst +++ /dev/null @@ -1,28 +0,0 @@ -microversion_parse -================== - -A simple parser for OpenStack microversion headers:: - - import microversion_parse - - # headers is a dict of headers with folded (comma-separated - # values) or a list of header, value tuples - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['x-openstack-nova-api-version']) - -It processes microversion headers with the standard form:: - - OpenStack-API-Version: compute 2.1 - -If provided with a ``legacy_headers`` argument, this is treated as -a list of headers to check for microversions. Some examples of -headers include:: - - OpenStack-telemetry-api-version: 2.1 - OpenStack-nova-api-version: 2.1 - X-OpenStack-nova-api-version: 2.1 - -If a version string cannot be found, ``None`` will be returned. If -the input is incorrect usual Python exceptions (ValueError, -TypeError) are allowed to raise to the caller. diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100644 index a9d4157..0000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,291 +0,0 @@ -# -*- coding: utf-8 -*- -# -# microversion-parse documentation build configuration file, created by -# sphinx-quickstart on Thu Mar 31 11:40:03 2016. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os -import shlex - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'microversion-parse' -copyright = u'2016, OpenStack' -author = u'OpenStack' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = u'0.1.0' -# The full version, including alpha/beta/rc tags. -release = u'0.1.0' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = [] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# html_theme = 'alabaster' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -#html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# Now only 'ja' uses this config value -#html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. -htmlhelp_basename = 'microversion-parsedoc' - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', - -# Latex figure (float) alignment -#'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'microversion-parse.tex', u'microversion-parse Documentation', - u'OpenStack', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'microversion-parse', u'microversion-parse Documentation', - [author], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'microversion-parse', u'microversion-parse Documentation', - author, 'microversion-parse', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'https://docs.python.org/': None} diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index 4af8707..0000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,18 +0,0 @@ -.. microversion-parse documentation master file, created by - sphinx-quickstart on Thu Mar 31 11:40:03 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -.. include:: ../../README.rst - -.. toctree:: - :maxdepth: 2 - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff --git a/microversion_parse/__init__.py b/microversion_parse/__init__.py deleted file mode 100644 index cb3fe63..0000000 --- a/microversion_parse/__init__.py +++ /dev/null @@ -1,102 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -__version__ = '0.1.1' - -import collections - - -STANDARD_HEADER = 'openstack-api-version' - - -def get_version(headers, service_type, legacy_headers=None): - """Parse a microversion out of headers - - :param headers: The headers of a request, dict or list - :param service_type: The service type being looked for in the headers - :param legacy_headers: Other headers to look at for a version - :returns: a version string or "latest" - :raises: ValueError - - If headers is not a dict we assume is an iterator of - tuple-like headers, which we will fold into a dict. - - The flow is that we first look for the new standard singular - header: - - * openstack-api-version: - - If that's not present we fall back to the headers listed in - legacy_headers. These often look like this: - - * openstack--api-version: - * openstack--api-version: - * x-openstack--api-version: - - Folded headers are joined by ','. - """ - - folded_headers = fold_headers(headers) - - version = check_standard_header(folded_headers, service_type) - if version: - return version - - if legacy_headers: - version = check_legacy_headers(folded_headers, legacy_headers) - return version - - return None - - -def check_legacy_headers(headers, legacy_headers): - """Gather values from old headers.""" - for legacy_header in legacy_headers: - try: - value = headers[legacy_header.lower()] - return value.split(',')[-1].strip() - except KeyError: - pass - return None - - -def check_standard_header(headers, service_type): - """Parse the standard header to get value for service.""" - try: - header = headers[STANDARD_HEADER] - for header_value in reversed(header.split(',')): - try: - service, version = header_value.strip().split(None, 1) - if service.lower() == service_type.lower(): - return version.strip() - except ValueError: - pass - except (KeyError, ValueError): - return None - - -def fold_headers(headers): - """Turn a list of headers into a folded dict.""" - # If it behaves like a dict, return it. Webob uses objects which - # are not dicts, but behave like them. - if hasattr(headers, 'keys'): - return dict((k.lower(), v) for k, v in headers.items()) - header_dict = collections.defaultdict(list) - for header, value in headers: - header_dict[header.lower()].append(value.strip()) - - folded_headers = {} - for header, value in header_dict.items(): - folded_headers[header] = ','.join(value) - - return folded_headers diff --git a/microversion_parse/tests/__init__.py b/microversion_parse/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/microversion_parse/tests/test_get_version.py b/microversion_parse/tests/test_get_version.py deleted file mode 100644 index fa16681..0000000 --- a/microversion_parse/tests/test_get_version.py +++ /dev/null @@ -1,227 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import testtools - -import microversion_parse - - -class TestFoldHeaders(testtools.TestCase): - - def test_dict_headers(self): - headers = { - 'header-one': 'alpha', - 'header-two': 'beta', - 'header-three': 'gamma', - } - - folded_headers = microversion_parse.fold_headers(headers) - self.assertEqual(3, len(folded_headers)) - self.assertEqual(set(headers.keys()), set(folded_headers.keys())) - self.assertEqual('gamma', folded_headers['header-three']) - - def test_listed_tuple_headers(self): - headers = [ - ('header-one', 'alpha'), - ('header-two', 'beta'), - ('header-one', 'gamma'), - ] - - folded_headers = microversion_parse.fold_headers(headers) - self.assertEqual(2, len(folded_headers)) - self.assertEqual(set(['header-one', 'header-two']), - set(folded_headers.keys())) - self.assertEqual('alpha,gamma', folded_headers['header-one']) - - def test_bad_headers(self): - headers = 'wow this is not a headers' - self.assertRaises(ValueError, microversion_parse.fold_headers, - headers) - - # TODO(cdent): Test with request objects from frameworks. - - -class TestStandardHeader(testtools.TestCase): - - def test_simple_match(self): - headers = { - 'header-one': 'alpha', - 'openstack-api-version': 'compute 2.1', - 'header-two': 'beta', - } - version = microversion_parse.check_standard_header(headers, 'compute') - # TODO(cdent): String or number. Choosing string for now - # since 'latest' is always a string. - self.assertEqual('2.1', version) - - def test_match_extra_whitespace(self): - headers = { - 'header-one': 'alpha', - 'openstack-api-version': ' compute 2.1 ', - 'header-two': 'beta', - } - version = microversion_parse.check_standard_header(headers, 'compute') - self.assertEqual('2.1', version) - - def test_no_match_no_value(self): - headers = { - 'header-one': 'alpha', - 'openstack-api-version': 'compute ', - 'header-two': 'beta', - } - version = microversion_parse.check_standard_header(headers, 'compute') - self.assertEqual(None, version) - - def test_no_match_wrong_service(self): - headers = { - 'header-one': 'alpha', - 'openstack-api-version': 'network 5.9 ', - 'header-two': 'beta', - } - version = microversion_parse.check_standard_header( - headers, 'compute') - self.assertEqual(None, version) - - def test_match_multiple_services(self): - headers = { - 'header-one': 'alpha', - 'openstack-api-version': 'network 5.9 ,compute 2.1,telemetry 7.8', - 'header-two': 'beta', - } - version = microversion_parse.check_standard_header( - headers, 'compute') - self.assertEqual('2.1', version) - version = microversion_parse.check_standard_header( - headers, 'telemetry') - self.assertEqual('7.8', version) - - def test_match_multiple_same_service(self): - headers = { - 'header-one': 'alpha', - 'openstack-api-version': 'compute 5.9 ,compute 2.1,compute 7.8', - 'header-two': 'beta', - } - version = microversion_parse.check_standard_header( - headers, 'compute') - self.assertEqual('7.8', version) - - -class TestLegacyHeaders(testtools.TestCase): - - def test_legacy_headers_straight(self): - headers = { - 'header-one': 'alpha', - 'openstack-compute-api-version': ' 2.1 ', - 'header-two': 'beta', - } - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['openstack-CoMpUte-api-version']) - self.assertEqual('2.1', version) - - def test_legacy_headers_folded(self): - headers = { - 'header-one': 'alpha', - 'openstack-compute-api-version': ' 2.1, 9.2 ', - 'header-two': 'beta', - } - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['openstack-compute-api-version']) - self.assertEqual('9.2', version) - - def test_older_legacy_headers(self): - headers = { - 'header-one': 'alpha', - 'x-openstack-nova-api-version': ' 2.1, 9.2 ', - 'header-two': 'beta', - } - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['openstack-nova-api-version', - 'x-openstack-nova-api-version']) - # We don't do x- for service types. - self.assertEqual('9.2', version) - - def test_legacy_headers_prefer(self): - headers = { - 'header-one': 'alpha', - 'openstack-compute-api-version': '3.7', - 'x-openstack-nova-api-version': ' 2.1, 9.2 ', - 'header-two': 'beta', - } - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['openstack-compute-api-version', - 'x-openstack-nova-api-version']) - self.assertEqual('3.7', version) - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['x-openstack-nova-api-version', - 'openstack-compute-api-version']) - self.assertEqual('9.2', version) - - -class TestGetHeaders(testtools.TestCase): - - def test_preference(self): - headers = { - 'header-one': 'alpha', - 'openstack-api-version': 'compute 11.12, telemetry 9.7', - 'openstack-compute-api-version': '3.7', - 'x-openstack-nova-api-version': ' 2.1, 9.2 ', - 'header-two': 'beta', - } - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['openstack-compute-api-version', - 'x-openstack-nova-api-version']) - self.assertEqual('11.12', version) - - def test_no_headers(self): - headers = {} - version = microversion_parse.get_version( - headers, service_type='compute') - self.assertEqual(None, version) - - def test_unfolded_service(self): - headers = [ - ('header-one', 'alpha'), - ('openstack-api-version', 'compute 1.0'), - ('openstack-api-version', 'compute 2.0'), - ('openstack-api-version', '3.0'), - ] - version = microversion_parse.get_version( - headers, service_type='compute') - self.assertEqual('2.0', version) - - def test_unfolded_in_name(self): - headers = [ - ('header-one', 'alpha'), - ('x-openstack-nova-api-version', '1.0'), - ('x-openstack-nova-api-version', '2.0'), - ('openstack-telemetry-api-version', '3.0'), - ] - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['x-openstack-nova-api-version']) - self.assertEqual('2.0', version) - - def test_capitalized_headers(self): - headers = { - 'X-Openstack-Ironic-Api-Version': '123.456' - } - version = microversion_parse.get_version( - headers, service_type='ironic', - legacy_headers=['X-Openstack-Ironic-Api-Version']) - self.assertEqual('123.456', version) diff --git a/microversion_parse/tests/test_webob.py b/microversion_parse/tests/test_webob.py deleted file mode 100644 index a2e36c8..0000000 --- a/microversion_parse/tests/test_webob.py +++ /dev/null @@ -1,80 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import testtools - -from webob import headers as wb_headers - -import microversion_parse - - -class TestWebobHeaders(testtools.TestCase): - """Webob uses a dict-like header which is not actually a dict.""" - - def test_simple_headers(self): - headers = wb_headers.EnvironHeaders({ - 'HTTP_HEADER_ONE': 'alpha', - 'HTTP_HEADER_TWO': 'beta', - 'HTTP_HEADER_THREE': 'gamma', - }) - - folded_headers = microversion_parse.fold_headers(headers) - self.assertEqual(3, len(folded_headers)) - self.assertEqual(set(['header-one', 'header-three', 'header-two']), - set(folded_headers.keys())) - self.assertEqual('gamma', folded_headers['header-three']) - - def test_simple_match(self): - headers = wb_headers.EnvironHeaders({ - 'HTTP_HEADER_ONE': 'alpha', - 'HTTP_OPENSTACK_API_VERSION': 'compute 2.1', - 'HTTP_HEADER_TWO': 'beta', - }) - version = microversion_parse.check_standard_header(headers, 'compute') - self.assertEqual('2.1', version) - - def test_match_multiple_services(self): - headers = wb_headers.EnvironHeaders({ - 'HTTP_HEADER_ONE': 'alpha', - 'HTTP_OPENSTACK_API_VERSION': - 'network 5.9 ,compute 2.1,telemetry 7.8', - 'HTTP_HEADER_TWO': 'beta', - }) - version = microversion_parse.check_standard_header( - headers, 'compute') - self.assertEqual('2.1', version) - version = microversion_parse.check_standard_header( - headers, 'telemetry') - self.assertEqual('7.8', version) - - def test_legacy_headers_straight(self): - headers = wb_headers.EnvironHeaders({ - 'HTTP_HEADER_ONE': 'alpha', - 'HTTP_X_OPENSTACK_NOVA_API_VERSION': ' 2.1 ', - 'HTTP_HEADER_TWO': 'beta', - }) - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['x-openstack-nova-api-version']) - self.assertEqual('2.1', version) - - def test_legacy_headers_folded(self): - headers = wb_headers.EnvironHeaders({ - 'HTTP_HEADER_ONE': 'alpha', - 'HTTP_X_OPENSTACK_NOVA_API_VERSION': ' 2.1, 9.2 ', - 'HTTP_HEADER_TWO': 'beta', - }) - version = microversion_parse.get_version( - headers, service_type='compute', - legacy_headers=['x-openstack-nova-api-version']) - self.assertEqual('9.2', version) diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 8b13789..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index df49ffa..0000000 --- a/setup.cfg +++ /dev/null @@ -1,27 +0,0 @@ -[metadata] -name = microversion_parse -summary = OpenStack microversion header parser -description-file = README.rst -author = OpenStack -author-email = openstack-dev@lists.openstack.org -home-page = http://www.openstack.org/ -classifier = - Environment :: OpenStack - Intended Audience :: Information Technology - License :: OSI Approved :: Apache Software License - Operating System :: POSIX :: Linux - Programming Language :: Python - Programming Language :: Python :: 2 - Programming Language :: Python :: 2.7 - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.4 - Programming Language :: Python :: 3.5 - -[files] -packages = - microversion_parse - -[build_sphinx] -all_files = 1 -build-dir = doc/build -source-dir = doc/source diff --git a/setup.py b/setup.py deleted file mode 100644 index 7f1bbe8..0000000 --- a/setup.py +++ /dev/null @@ -1,18 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import setuptools - -setuptools.setup( - setup_requires=['pbr'], - pbr=True) diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index a5c8577..0000000 --- a/test-requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -hacking>=0.10.2,<0.11 # Apache-2.0 -coverage>=3.6 # Apache-2.0 -sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 # BSD -oslosphinx!=3.4.0,>=2.5.0 # Apache-2.0 -testrepository>=0.0.18 # Apache-2.0/BSD -testtools>=1.4.0 # MIT -WebOb>=1.2.3 # MIT diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 008c5a5..0000000 --- a/tox.ini +++ /dev/null @@ -1,40 +0,0 @@ -[tox] -minversion = 2.0 -skipsdist = True -# If you want pypy or pypy3, do 'tox -epypy,pypy3', it might work! -# And you can get coverage with 'tox -ecover'. -envlist = py27,py34,py35,pep8 - -[testenv] -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -install_command = pip install -U {opts} {packages} -setenv = OS_TEST_PATH=microversion_parse/tests/ -usedevelop = True -commands = python setup.py testr --testr-args="{posargs}" - -[testenv:venv] -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -commands = {posargs} - -[testenv:pep8] -deps = hacking -usedevelop = False -commands = - flake8 - -[testenv:cover] -commands = python setup.py testr --coverage --testr-args="{posargs}" - -[testenv:docs] -commands = - rm -rf doc/build - python setup.py build_sphinx -whitelist_externals = - rm - -[flake8] -ignore = H405,E126 -exclude=.venv,.git,.tox,dist,*egg,*.egg-info,build,examples,doc -show-source = True