diff --git a/azure-pipelines.yml b/azure-pipelines.yml index dc0a03d..2625b5d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -62,7 +62,7 @@ jobs: python_version: '3.6' python_architecture: 'x86' py37: - python_version: '3.7.4' + python_version: '3.7' python_architecture: 'x86' - template: etc/ci/azure-win.yml diff --git a/configure b/configure index 4f9fdcc..28a24ed 100755 --- a/configure +++ b/configure @@ -6,9 +6,7 @@ # change these variables to customize this script locally ################################ # you can define one or more thirdparty dirs, each prefixed with TPP_DIR -export TPP_DIR_BASE="thirdparty/base" -export TPP_DIR_DEV="thirdparty/dev" -export TPP_DIR_PROD="thirdparty/prod" +export TPP_DIR_BASE="thirdparty" # default configurations for dev CONF_DEFAULT="etc/conf/dev" diff --git a/configure.bat b/configure.bat index 87e471c..5d216df 100755 --- a/configure.bat +++ b/configure.bat @@ -1,58 +1,54 @@ -@echo ON -setlocal -@rem Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. - -@rem ################################ -@rem # Defaults. change these variables to customize this script locally -@rem ################################ -@rem # you can define one or more thirdparty dirs, each prefixed with TPP_DIR -set TPP_DIR_BASE=thirdparty/base -set TPP_DIR_DEV=thirdparty/dev -set TPP_DIR_PROD=thirdparty/prod - -set DEFAULT_PYTHON=python - -@rem # default configurations -set CONF_DEFAULT="etc/conf/dev" -@rem ################################# - -@rem this always has a trailing backslash -set CFG_ROOT_DIR=%~dp0 - -@rem a possible alternative way and simpler way to slurp args -@rem set CFG_CMD_LINE_ARGS=%* - -@rem Collect all command line arguments in a variable -set CFG_CMD_LINE_ARGS= - -:collectarg - if ""%1""=="""" goto continue - set CFG_CMD_LINE_ARGS=%CFG_CMD_LINE_ARGS% %1 - shift -goto collectarg - -:continue - - -@rem Set defaults -if "%CFG_CMD_LINE_ARGS%"=="" set CFG_CMD_LINE_ARGS=%CONF_DEFAULT% -if "%PYTHON_EXE%"=="" set PYTHON_EXE=%DEFAULT_PYTHON% - - -call "%PYTHON_EXE%" %CFG_ROOT_DIR%\etc\configure.py %CFG_CMD_LINE_ARGS% - - -@rem Return a proper return code on failure -if %errorlevel% neq 0 ( - exit /b %errorlevel% -) - - -@rem Activate the virtualenv -endlocal -if exist "%CFG_ROOT_DIR%bin\activate" ( - "%CFG_ROOT_DIR%bin\activate" -) -goto EOS - -:EOS \ No newline at end of file +@echo OFF +setlocal +@rem Copyright (c) nexB Inc. http://www.nexb.com/ - All rights reserved. + +@rem ################################ +@rem # Defaults. change these variables to customize this script locally +@rem ################################ +@rem # you can define one or more thirdparty dirs, each prefixed with TPP_DIR +set TPP_DIR=thirdparty + +set DEFAULT_PYTHON=python + +@rem # default configurations for dev +set CONF_DEFAULT="etc/conf/dev" +@rem ################################# + +set CFG_ROOT_DIR=%~dp0 + +@rem Collect all command line arguments in a variable +set CFG_CMD_LINE_ARGS= + +@rem a possible alternative way and simpler way to slurp args +@rem set CFG_CMD_LINE_ARGS=%* + + +:collectarg + if ""%1""=="""" goto continue + call set CFG_CMD_LINE_ARGS=%CFG_CMD_LINE_ARGS% %1 + shift + goto collectarg + +:continue + +@rem Set defaults when no args are passed +if "%CFG_CMD_LINE_ARGS%"=="" set CFG_CMD_LINE_ARGS="%CONF_DEFAULT%" +if "%PYTHON_EXE%"=="" set PYTHON_EXE=%DEFAULT_PYTHON% + + +call "%PYTHON_EXE%" "%CFG_ROOT_DIR%etc\configure.py" %CFG_CMD_LINE_ARGS% +@rem Return a proper return code on failure + +if %errorlevel% neq 0 ( + exit /b %errorlevel% +) + + +@rem Activate the virtualenv +endlocal +if exist "%CFG_ROOT_DIR%bin\activate" ( + "%CFG_ROOT_DIR%bin\activate" +) +goto EOS + +:EOS diff --git a/setup.py b/setup.py index 0b91f1b..2dd7867 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='license-expression', - version='1.1', + version='1.2', license='apache-2.0', description=desc, long_description=desc, diff --git a/src/license_expression/__init__.py b/src/license_expression/__init__.py index f856e82..e16cb67 100644 --- a/src/license_expression/__init__.py +++ b/src/license_expression/__init__.py @@ -128,7 +128,7 @@ class ExpressionParseError(ParseError, ExpressionError): # mapping of lowercase operator strings to an operator object OPERATORS = {'and': KW_AND, 'or': KW_OR, 'with': KW_WITH} -_simple_tokenizer = re.compile(''' +_simple_tokenizer = re.compile(r''' (?P[^\s\(\)]+) | (?P\s+) @@ -827,6 +827,19 @@ def render(self, template='{symbol.key}', *args, **kwargs): """ return NotImplementedError + def render_as_readable(self, template='{symbol.key}', *args, **kwargs): + """ + Return a formatted string rendering for this expression using the + `template` format string to render each symbol. Add extra parenthesis + around WITH sub-expressions for improved readbility. See `render()` for + other arguments. + """ + if isinstance(self, LicenseWithExceptionSymbol): + return self.render( + template=template, wrap_with_in_parens=False, *args, **kwargs) + else: + return self.render(template=template, wrap_with_in_parens=True, *args, **kwargs) + class BaseSymbol(Renderable, boolean.Symbol): """ @@ -1075,10 +1088,19 @@ def decompose(self): yield self.license_symbol yield self.exception_symbol - def render(self, template='{symbol.key}', *args, **kwargs): + def render(self, template='{symbol.key}', wrap_with_in_parens=False, *args, **kwargs): + """ + Return a formatted WITH expression. If `wrap_with_in_parens`, wrap in + parens a WITH expression, unless it is alone and not used with other AND + or OR sub-expressions. + """ lic = self.license_symbol.render(template, *args, **kwargs) exc = self.exception_symbol.render(template, *args, **kwargs) - return '%(lic)s WITH %(exc)s' % locals() + if wrap_with_in_parens: + temp = '(%(lic)s WITH %(exc)s)' + else: + temp = '%(lic)s WITH %(exc)s' + return temp % locals() def __hash__(self, *args, **kwargs): return hash((self.license_symbol, self.exception_symbol,)) diff --git a/src/license_expression/_pyahocorasick.py b/src/license_expression/_pyahocorasick.py index fefe51f..655de94 100644 --- a/src/license_expression/_pyahocorasick.py +++ b/src/license_expression/_pyahocorasick.py @@ -608,7 +608,7 @@ def overlap(self, other): # tokenize to separate text from parens -_tokenizer = re.compile(''' +_tokenizer = re.compile(r''' (?P[^\s\(\)]+) | (?P\s+) diff --git a/tests/test_license_expression.py b/tests/test_license_expression.py index 57d9d6e..e349b0c 100644 --- a/tests/test_license_expression.py +++ b/tests/test_license_expression.py @@ -1665,6 +1665,30 @@ def test_primary_license_symbol_and_primary_license_key(self): assert expected == licensing.primary_license_symbol( parsed, decompose=False).render('{symbol.key}') + def test_render_plain(self): + l = Licensing() + result = l.parse('gpl-2.0 WITH exception-gpl-2.0-plus or MIT').render() + expected = 'gpl-2.0 WITH exception-gpl-2.0-plus OR MIT' + assert expected == result + + def test_render_as_readable_does_not_wrap_in_parens_single_with(self): + l = Licensing() + result = l.parse('gpl-2.0 WITH exception-gpl-2.0-plus').render_as_readable() + expected = 'gpl-2.0 WITH exception-gpl-2.0-plus' + assert expected == result + + def test_render_as_readable_wraps_in_parens_with_and_other_subexpressions(self): + l = Licensing() + result = l.parse('mit AND gpl-2.0 WITH exception-gpl-2.0-plus').render_as_readable() + expected = 'mit AND (gpl-2.0 WITH exception-gpl-2.0-plus)' + assert expected == result + + def test_render_as_readable_does_not_wrap_in_parens_if_no_with(self): + l = Licensing() + result1 = l.parse('gpl-2.0 and exception OR that').render_as_readable() + result2 = l.parse('gpl-2.0 and exception OR that').render() + assert result1 == result2 + class SplitAndTokenizeTest(TestCase): diff --git a/thirdparty/dev/Jinja2-2.10-py2.py3-none-any.whl b/thirdparty/Jinja2-2.10-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/Jinja2-2.10-py2.py3-none-any.whl rename to thirdparty/Jinja2-2.10-py2.py3-none-any.whl diff --git a/thirdparty/dev/Jinja2-2.10-py2.py3-none-any.whl.ABOUT b/thirdparty/Jinja2-2.10-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/dev/Jinja2-2.10-py2.py3-none-any.whl.ABOUT rename to thirdparty/Jinja2-2.10-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/dev/Jinja2.LICENSE b/thirdparty/Jinja2.LICENSE similarity index 100% rename from thirdparty/dev/Jinja2.LICENSE rename to thirdparty/Jinja2.LICENSE diff --git a/thirdparty/dev/MarkupSafe-1.0.tar.gz b/thirdparty/MarkupSafe-1.0.tar.gz similarity index 100% rename from thirdparty/dev/MarkupSafe-1.0.tar.gz rename to thirdparty/MarkupSafe-1.0.tar.gz diff --git a/thirdparty/dev/MarkupSafe.ABOUT b/thirdparty/MarkupSafe.ABOUT similarity index 100% rename from thirdparty/dev/MarkupSafe.ABOUT rename to thirdparty/MarkupSafe.ABOUT diff --git a/thirdparty/dev/MarkupSafe.LICENSE b/thirdparty/MarkupSafe.LICENSE similarity index 100% rename from thirdparty/dev/MarkupSafe.LICENSE rename to thirdparty/MarkupSafe.LICENSE diff --git a/thirdparty/base/PSF.LICENSE b/thirdparty/PSF.LICENSE similarity index 100% rename from thirdparty/base/PSF.LICENSE rename to thirdparty/PSF.LICENSE diff --git a/thirdparty/dev/PyYAML-3.12-py2-none-any.whl b/thirdparty/PyYAML-3.12-py2-none-any.whl similarity index 100% rename from thirdparty/dev/PyYAML-3.12-py2-none-any.whl rename to thirdparty/PyYAML-3.12-py2-none-any.whl diff --git a/thirdparty/dev/PyYAML-3.12-py3-none-any.whl b/thirdparty/PyYAML-3.12-py3-none-any.whl similarity index 100% rename from thirdparty/dev/PyYAML-3.12-py3-none-any.whl rename to thirdparty/PyYAML-3.12-py3-none-any.whl diff --git a/thirdparty/dev/PyYAML-3.12.tar.gz b/thirdparty/PyYAML-3.12.tar.gz similarity index 100% rename from thirdparty/dev/PyYAML-3.12.tar.gz rename to thirdparty/PyYAML-3.12.tar.gz diff --git a/thirdparty/dev/aboutcode_toolkit-4.0.1-py2.py3-none-any.whl b/thirdparty/aboutcode_toolkit-4.0.1-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/aboutcode_toolkit-4.0.1-py2.py3-none-any.whl rename to thirdparty/aboutcode_toolkit-4.0.1-py2.py3-none-any.whl diff --git a/thirdparty/dev/aboutcode_toolkit-4.0.1-py2.py3-none-any.whl.ABOUT b/thirdparty/aboutcode_toolkit-4.0.1-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/dev/aboutcode_toolkit-4.0.1-py2.py3-none-any.whl.ABOUT rename to thirdparty/aboutcode_toolkit-4.0.1-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/dev/apache-2.0.LICENSE b/thirdparty/apache-2.0.LICENSE similarity index 100% rename from thirdparty/dev/apache-2.0.LICENSE rename to thirdparty/apache-2.0.LICENSE diff --git a/thirdparty/dev/atomicwrites-1.1.5-py2.py3-none-any.whl b/thirdparty/atomicwrites-1.1.5-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/atomicwrites-1.1.5-py2.py3-none-any.whl rename to thirdparty/atomicwrites-1.1.5-py2.py3-none-any.whl diff --git a/thirdparty/dev/atomicwrites-1.1.5-py2.py3-none-any.whl.ABOUT b/thirdparty/atomicwrites-1.1.5-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/dev/atomicwrites-1.1.5-py2.py3-none-any.whl.ABOUT rename to thirdparty/atomicwrites-1.1.5-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/dev/atomicwrites.LICENSE b/thirdparty/atomicwrites.LICENSE similarity index 100% rename from thirdparty/dev/atomicwrites.LICENSE rename to thirdparty/atomicwrites.LICENSE diff --git a/thirdparty/dev/attrs-18.1.0-py2.py3-none-any.whl b/thirdparty/attrs-18.1.0-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/attrs-18.1.0-py2.py3-none-any.whl rename to thirdparty/attrs-18.1.0-py2.py3-none-any.whl diff --git a/thirdparty/dev/attrs.ABOUT b/thirdparty/attrs.ABOUT similarity index 100% rename from thirdparty/dev/attrs.ABOUT rename to thirdparty/attrs.ABOUT diff --git a/thirdparty/dev/attrs.LICENSE b/thirdparty/attrs.LICENSE similarity index 100% rename from thirdparty/dev/attrs.LICENSE rename to thirdparty/attrs.LICENSE diff --git a/thirdparty/dev/backports.csv-1.0.6-py2.py3-none-any.whl b/thirdparty/backports.csv-1.0.6-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/backports.csv-1.0.6-py2.py3-none-any.whl rename to thirdparty/backports.csv-1.0.6-py2.py3-none-any.whl diff --git a/thirdparty/dev/backports.csv.ABOUT b/thirdparty/backports.csv.ABOUT similarity index 100% rename from thirdparty/dev/backports.csv.ABOUT rename to thirdparty/backports.csv.ABOUT diff --git a/thirdparty/dev/backports.csv.NOTICE b/thirdparty/backports.csv.NOTICE similarity index 100% rename from thirdparty/dev/backports.csv.NOTICE rename to thirdparty/backports.csv.NOTICE diff --git a/thirdparty/prod/boolean.py-3.7-py2.py3-none-any.whl b/thirdparty/boolean.py-3.7-py2.py3-none-any.whl similarity index 100% rename from thirdparty/prod/boolean.py-3.7-py2.py3-none-any.whl rename to thirdparty/boolean.py-3.7-py2.py3-none-any.whl diff --git a/thirdparty/prod/boolean.py-3.7-py2.py3-none-any.whl.ABOUT b/thirdparty/boolean.py-3.7-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/prod/boolean.py-3.7-py2.py3-none-any.whl.ABOUT rename to thirdparty/boolean.py-3.7-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/prod/boolean.py-3.7-py2.py3-none-any.whl.NOTICE b/thirdparty/boolean.py-3.7-py2.py3-none-any.whl.NOTICE similarity index 100% rename from thirdparty/prod/boolean.py-3.7-py2.py3-none-any.whl.NOTICE rename to thirdparty/boolean.py-3.7-py2.py3-none-any.whl.NOTICE diff --git a/thirdparty/prod/bsd-simplified.LICENSE b/thirdparty/bsd-simplified.LICENSE similarity index 100% rename from thirdparty/prod/bsd-simplified.LICENSE rename to thirdparty/bsd-simplified.LICENSE diff --git a/thirdparty/base/certifi-2018.4.16-py2.py3-none-any.whl b/thirdparty/certifi-2018.4.16-py2.py3-none-any.whl similarity index 100% rename from thirdparty/base/certifi-2018.4.16-py2.py3-none-any.whl rename to thirdparty/certifi-2018.4.16-py2.py3-none-any.whl diff --git a/thirdparty/base/certifi-2018.4.16-py2.py3-none-any.whl.ABOUT b/thirdparty/certifi-2018.4.16-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/base/certifi-2018.4.16-py2.py3-none-any.whl.ABOUT rename to thirdparty/certifi-2018.4.16-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/base/certifi.NOTICE b/thirdparty/certifi.NOTICE similarity index 100% rename from thirdparty/base/certifi.NOTICE rename to thirdparty/certifi.NOTICE diff --git a/thirdparty/dev/click-6.7-py2.py3-none-any.whl b/thirdparty/click-6.7-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/click-6.7-py2.py3-none-any.whl rename to thirdparty/click-6.7-py2.py3-none-any.whl diff --git a/thirdparty/dev/click-6.7-py2.py3-none-any.whl.ABOUT b/thirdparty/click-6.7-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/dev/click-6.7-py2.py3-none-any.whl.ABOUT rename to thirdparty/click-6.7-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/dev/click.LICENSE b/thirdparty/click.LICENSE similarity index 100% rename from thirdparty/dev/click.LICENSE rename to thirdparty/click.LICENSE diff --git a/thirdparty/dev/colorama-0.3.9-py2.py3-none-any.whl b/thirdparty/colorama-0.3.9-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/colorama-0.3.9-py2.py3-none-any.whl rename to thirdparty/colorama-0.3.9-py2.py3-none-any.whl diff --git a/thirdparty/dev/colorama.ABOUT b/thirdparty/colorama.ABOUT similarity index 100% rename from thirdparty/dev/colorama.ABOUT rename to thirdparty/colorama.ABOUT diff --git a/thirdparty/dev/colorama.LICENSE b/thirdparty/colorama.LICENSE similarity index 100% rename from thirdparty/dev/colorama.LICENSE rename to thirdparty/colorama.LICENSE diff --git a/thirdparty/dev/.keep b/thirdparty/dev/.keep deleted file mode 100644 index 5b81efe..0000000 --- a/thirdparty/dev/.keep +++ /dev/null @@ -1 +0,0 @@ -DO NOT DELETE \ No newline at end of file diff --git a/thirdparty/dev/PSF.LICENSE b/thirdparty/dev/PSF.LICENSE deleted file mode 100644 index b6bddd8..0000000 --- a/thirdparty/dev/PSF.LICENSE +++ /dev/null @@ -1,48 +0,0 @@ -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017 Python Software Foundation; All Rights -Reserved" are retained in Python alone or in any derivative version prepared by -Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. diff --git a/thirdparty/dev/funcsigs-1.0.2-py2.py3-none-any.whl b/thirdparty/funcsigs-1.0.2-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/funcsigs-1.0.2-py2.py3-none-any.whl rename to thirdparty/funcsigs-1.0.2-py2.py3-none-any.whl diff --git a/thirdparty/dev/funcsigs.ABOUT b/thirdparty/funcsigs.ABOUT similarity index 100% rename from thirdparty/dev/funcsigs.ABOUT rename to thirdparty/funcsigs.ABOUT diff --git a/thirdparty/dev/funcsigs.LICENSE b/thirdparty/funcsigs.LICENSE similarity index 100% rename from thirdparty/dev/funcsigs.LICENSE rename to thirdparty/funcsigs.LICENSE diff --git a/thirdparty/dev/more-itertools-py2.ABOUT b/thirdparty/more-itertools-py2.ABOUT similarity index 100% rename from thirdparty/dev/more-itertools-py2.ABOUT rename to thirdparty/more-itertools-py2.ABOUT diff --git a/thirdparty/dev/more-itertools-py3.ABOUT b/thirdparty/more-itertools-py3.ABOUT similarity index 100% rename from thirdparty/dev/more-itertools-py3.ABOUT rename to thirdparty/more-itertools-py3.ABOUT diff --git a/thirdparty/dev/more-itertools.NOTICE b/thirdparty/more-itertools.NOTICE similarity index 100% rename from thirdparty/dev/more-itertools.NOTICE rename to thirdparty/more-itertools.NOTICE diff --git a/thirdparty/dev/more_itertools-4.2.0-py2-none-any.whl b/thirdparty/more_itertools-4.2.0-py2-none-any.whl similarity index 100% rename from thirdparty/dev/more_itertools-4.2.0-py2-none-any.whl rename to thirdparty/more_itertools-4.2.0-py2-none-any.whl diff --git a/thirdparty/dev/more_itertools-4.2.0-py3-none-any.whl b/thirdparty/more_itertools-4.2.0-py3-none-any.whl similarity index 100% rename from thirdparty/dev/more_itertools-4.2.0-py3-none-any.whl rename to thirdparty/more_itertools-4.2.0-py3-none-any.whl diff --git a/thirdparty/base/mpl-2.0.LICENSE b/thirdparty/mpl-2.0.LICENSE similarity index 100% rename from thirdparty/base/mpl-2.0.LICENSE rename to thirdparty/mpl-2.0.LICENSE diff --git a/thirdparty/base/pip-10.0.1-py2.py3-none-any.whl b/thirdparty/pip-10.0.1-py2.py3-none-any.whl similarity index 100% rename from thirdparty/base/pip-10.0.1-py2.py3-none-any.whl rename to thirdparty/pip-10.0.1-py2.py3-none-any.whl diff --git a/thirdparty/base/pip-10.0.1-py2.py3-none-any.whl.ABOUT b/thirdparty/pip-10.0.1-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/base/pip-10.0.1-py2.py3-none-any.whl.ABOUT rename to thirdparty/pip-10.0.1-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/base/pip.LICENSE b/thirdparty/pip.LICENSE similarity index 100% rename from thirdparty/base/pip.LICENSE rename to thirdparty/pip.LICENSE diff --git a/thirdparty/dev/pluggy-0.6.0-py2-none-any.whl b/thirdparty/pluggy-0.6.0-py2-none-any.whl similarity index 100% rename from thirdparty/dev/pluggy-0.6.0-py2-none-any.whl rename to thirdparty/pluggy-0.6.0-py2-none-any.whl diff --git a/thirdparty/dev/pluggy-0.6.0-py3-none-any.whl b/thirdparty/pluggy-0.6.0-py3-none-any.whl similarity index 100% rename from thirdparty/dev/pluggy-0.6.0-py3-none-any.whl rename to thirdparty/pluggy-0.6.0-py3-none-any.whl diff --git a/thirdparty/dev/pluggy-py2.ABOUT b/thirdparty/pluggy-py2.ABOUT similarity index 100% rename from thirdparty/dev/pluggy-py2.ABOUT rename to thirdparty/pluggy-py2.ABOUT diff --git a/thirdparty/dev/pluggy-py3.ABOUT b/thirdparty/pluggy-py3.ABOUT similarity index 100% rename from thirdparty/dev/pluggy-py3.ABOUT rename to thirdparty/pluggy-py3.ABOUT diff --git a/thirdparty/dev/pluggy.LICENSE b/thirdparty/pluggy.LICENSE similarity index 100% rename from thirdparty/dev/pluggy.LICENSE rename to thirdparty/pluggy.LICENSE diff --git a/thirdparty/dev/py-1.5.3-py2.py3-none-any.whl b/thirdparty/py-1.5.3-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/py-1.5.3-py2.py3-none-any.whl rename to thirdparty/py-1.5.3-py2.py3-none-any.whl diff --git a/thirdparty/dev/py.ABOUT b/thirdparty/py.ABOUT similarity index 100% rename from thirdparty/dev/py.ABOUT rename to thirdparty/py.ABOUT diff --git a/thirdparty/dev/py.LICENSE b/thirdparty/py.LICENSE similarity index 100% rename from thirdparty/dev/py.LICENSE rename to thirdparty/py.LICENSE diff --git a/thirdparty/dev/pytest-3.5.1-py2.py3-none-any.whl b/thirdparty/pytest-3.5.1-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/pytest-3.5.1-py2.py3-none-any.whl rename to thirdparty/pytest-3.5.1-py2.py3-none-any.whl diff --git a/thirdparty/dev/pytest.ABOUT b/thirdparty/pytest.ABOUT similarity index 100% rename from thirdparty/dev/pytest.ABOUT rename to thirdparty/pytest.ABOUT diff --git a/thirdparty/dev/pytest.LICENSE b/thirdparty/pytest.LICENSE similarity index 100% rename from thirdparty/dev/pytest.LICENSE rename to thirdparty/pytest.LICENSE diff --git a/thirdparty/dev/pyyaml.LICENSE b/thirdparty/pyyaml.LICENSE similarity index 100% rename from thirdparty/dev/pyyaml.LICENSE rename to thirdparty/pyyaml.LICENSE diff --git a/thirdparty/dev/pyyaml.py2.ABOUT b/thirdparty/pyyaml.py2.ABOUT similarity index 100% rename from thirdparty/dev/pyyaml.py2.ABOUT rename to thirdparty/pyyaml.py2.ABOUT diff --git a/thirdparty/dev/pyyaml.py3.ABOUT b/thirdparty/pyyaml.py3.ABOUT similarity index 100% rename from thirdparty/dev/pyyaml.py3.ABOUT rename to thirdparty/pyyaml.py3.ABOUT diff --git a/thirdparty/dev/pyyaml.tar.ABOUT b/thirdparty/pyyaml.tar.ABOUT similarity index 100% rename from thirdparty/dev/pyyaml.tar.ABOUT rename to thirdparty/pyyaml.tar.ABOUT diff --git a/thirdparty/dev/saneyaml-0.1-py2.py3-none-any.whl b/thirdparty/saneyaml-0.1-py2.py3-none-any.whl similarity index 100% rename from thirdparty/dev/saneyaml-0.1-py2.py3-none-any.whl rename to thirdparty/saneyaml-0.1-py2.py3-none-any.whl diff --git a/thirdparty/dev/saneyaml-0.1-py2.py3-none-any.whl.ABOUT b/thirdparty/saneyaml-0.1-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/dev/saneyaml-0.1-py2.py3-none-any.whl.ABOUT rename to thirdparty/saneyaml-0.1-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/base/setuptools-39.2.0-py2.py3-none-any.whl b/thirdparty/setuptools-39.2.0-py2.py3-none-any.whl similarity index 100% rename from thirdparty/base/setuptools-39.2.0-py2.py3-none-any.whl rename to thirdparty/setuptools-39.2.0-py2.py3-none-any.whl diff --git a/thirdparty/base/setuptools-39.2.0-py2.py3-none-any.whl.ABOUT b/thirdparty/setuptools-39.2.0-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/base/setuptools-39.2.0-py2.py3-none-any.whl.ABOUT rename to thirdparty/setuptools-39.2.0-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/base/setuptools.NOTICE b/thirdparty/setuptools.NOTICE similarity index 100% rename from thirdparty/base/setuptools.NOTICE rename to thirdparty/setuptools.NOTICE diff --git a/thirdparty/base/six-1.11.0-py2.py3-none-any.whl b/thirdparty/six-1.11.0-py2.py3-none-any.whl similarity index 100% rename from thirdparty/base/six-1.11.0-py2.py3-none-any.whl rename to thirdparty/six-1.11.0-py2.py3-none-any.whl diff --git a/thirdparty/base/six-1.11.0-py2.py3-none-any.whl.ABOUT b/thirdparty/six-1.11.0-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/base/six-1.11.0-py2.py3-none-any.whl.ABOUT rename to thirdparty/six-1.11.0-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/base/six.LICENSE b/thirdparty/six.LICENSE similarity index 100% rename from thirdparty/base/six.LICENSE rename to thirdparty/six.LICENSE diff --git a/thirdparty/base/virtualenv-16.0.0-py2.py3-none-any.whl b/thirdparty/virtualenv-16.0.0-py2.py3-none-any.whl similarity index 100% rename from thirdparty/base/virtualenv-16.0.0-py2.py3-none-any.whl rename to thirdparty/virtualenv-16.0.0-py2.py3-none-any.whl diff --git a/thirdparty/base/virtualenv.ABOUT b/thirdparty/virtualenv.ABOUT similarity index 100% rename from thirdparty/base/virtualenv.ABOUT rename to thirdparty/virtualenv.ABOUT diff --git a/thirdparty/base/virtualenv.LICENSE b/thirdparty/virtualenv.LICENSE similarity index 100% rename from thirdparty/base/virtualenv.LICENSE rename to thirdparty/virtualenv.LICENSE diff --git a/thirdparty/base/virtualenv.py b/thirdparty/virtualenv.py similarity index 100% rename from thirdparty/base/virtualenv.py rename to thirdparty/virtualenv.py diff --git a/thirdparty/base/virtualenv.py.ABOUT b/thirdparty/virtualenv.py.ABOUT similarity index 100% rename from thirdparty/base/virtualenv.py.ABOUT rename to thirdparty/virtualenv.py.ABOUT diff --git a/thirdparty/base/wheel-0.31.1-py2.py3-none-any.whl b/thirdparty/wheel-0.31.1-py2.py3-none-any.whl similarity index 100% rename from thirdparty/base/wheel-0.31.1-py2.py3-none-any.whl rename to thirdparty/wheel-0.31.1-py2.py3-none-any.whl diff --git a/thirdparty/base/wheel-0.31.1-py2.py3-none-any.whl.ABOUT b/thirdparty/wheel-0.31.1-py2.py3-none-any.whl.ABOUT similarity index 100% rename from thirdparty/base/wheel-0.31.1-py2.py3-none-any.whl.ABOUT rename to thirdparty/wheel-0.31.1-py2.py3-none-any.whl.ABOUT diff --git a/thirdparty/base/wheel.LICENSE b/thirdparty/wheel.LICENSE similarity index 100% rename from thirdparty/base/wheel.LICENSE rename to thirdparty/wheel.LICENSE diff --git a/thirdparty/base/wincertstore-0.2-py2.py3-none-any.whl b/thirdparty/wincertstore-0.2-py2.py3-none-any.whl similarity index 100% rename from thirdparty/base/wincertstore-0.2-py2.py3-none-any.whl rename to thirdparty/wincertstore-0.2-py2.py3-none-any.whl diff --git a/thirdparty/base/wincertstore.ABOUT b/thirdparty/wincertstore.ABOUT similarity index 100% rename from thirdparty/base/wincertstore.ABOUT rename to thirdparty/wincertstore.ABOUT diff --git a/thirdparty/base/wincertstore.LICENSE b/thirdparty/wincertstore.LICENSE similarity index 100% rename from thirdparty/base/wincertstore.LICENSE rename to thirdparty/wincertstore.LICENSE