From 1d2e152d6b50f1a1a51b59fd81d7263ed46b74d2 Mon Sep 17 00:00:00 2001 From: Lennart Regebro Date: Sun, 14 Jun 2026 12:57:34 +0200 Subject: [PATCH] Adding depracations for core metadata --- Makefile | 2 +- pyroma/ratings.py | 124 ++++++++++-------- pyroma/testdata/complete/LICENSE.txt | 21 +++ pyroma/testdata/complete/pyproject.toml | 34 ++++- pyroma/testdata/complete/setup.py | 36 +---- .../distributions/complete-1.0.dev1.tar | Bin 40960 -> 40960 bytes .../distributions/complete-1.0.dev1.tar.bz2 | Bin 2690 -> 3182 bytes .../distributions/complete-1.0.dev1.tar.gz | Bin 2451 -> 2991 bytes .../distributions/complete-1.0.dev1.zip | Bin 5907 -> 6460 bytes pyroma/testdata/jsondata/complete.json | 2 +- pyroma/tests.py | 97 ++++++++------ 11 files changed, 183 insertions(+), 133 deletions(-) create mode 100644 pyroma/testdata/complete/LICENSE.txt diff --git a/Makefile b/Makefile index 1b66fe9..3826e89 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ help: ## display this message @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) generate: ## generate environment for tests - cd pyroma/testdata/complete;python setup.py sdist --formats=bztar,gztar,tar,zip + cd pyroma/testdata/complete;$(bin_dir)/python setup.py sdist --formats=bztar,gztar,tar,zip cp pyroma/testdata/complete/dist/complete-1.0.dev1.* pyroma/testdata/distributions/ tests: devenv generate ## run tests diff --git a/pyroma/ratings.py b/pyroma/ratings.py index 98f11b0..ca2be10 100644 --- a/pyroma/ratings.py +++ b/pyroma/ratings.py @@ -17,7 +17,6 @@ import io import re import os -from collections import defaultdict from docutils.core import publish_parts from docutils.utils import SystemMessage @@ -39,31 +38,6 @@ "Your cheese is so fresh most people think it's a cream: Mascarpone", ] -SHORT_NAME_RE = re.compile(r"\(.*?\)") - - -def get_code_licenses(): - licenses = [each for each in list(CLASSIFIERS) if each.startswith("License")] - code_map = defaultdict(set) - for license in licenses: - short_name = SHORT_NAME_RE.findall(license) - if short_name: - short_name = short_name[0][1:-1] - code_map[short_name].add(license) - if short_name.startswith("GPL"): - code_map["GPL"].add(license) - elif short_name.startswith("LGPL"): - code_map["LGPL"].add(license) - elif "Zope" in license: - code_map["ZPL"].add(license) - elif "MIT License" in license: - code_map["MIT"].add(license) - - return code_map - - -CODE_LICENSES = get_code_licenses() - class BaseTest: fatal = False @@ -349,15 +323,14 @@ def test(self, data): license = data.get("license") license_expression = data.get("license-expression") classifiers = data.get("classifier", []) - licenses = set() - for classifier in classifiers: - parts = [p.strip() for p in classifier.split("::")] - if parts[0] == "License": - # license classifiers exist - licenses.add(classifier) + has_license_classifier = any(c.startswith("License") for c in classifiers) - if not license and not license_expression and not licenses: - self._message = "Your package does neither have a license field nor any license classifiers." + if not license and not license_expression and not has_license_classifier: + self._message = ( + "You should specify a license for your package with the 'License-Expression' field. " + "See https://packaging.python.org/en/latest/specifications/core-metadata/#license-expression " + "for more information." + ) return False if license and license_expression: @@ -367,17 +340,16 @@ def test(self, data): ) return False - if license_expression and licenses: + if license_expression and has_license_classifier: self._message = ( "Specifying both a License-Expression and license classifiers is ambiguous, deprecated, " "and may be rejected by package indices." ) return False - if license in CODE_LICENSES: - if not CODE_LICENSES[license].intersection(licenses): - self._message = f"The license '{license}' specified is not listed in your classifiers." - return False + if has_license_classifier: + self._message = "Using license classifiers is deprecated in favour of the license-expression field." + return False return True @@ -406,13 +378,13 @@ def message(self): class SDist(BaseTest): - weight = 100 - def test(self, data): if "_has_sdist" not in data: # We aren't checking on PyPI self.weight = 0 return None + + self.weight = 100 return data["_has_sdist"] def message(self): @@ -476,16 +448,17 @@ def message(self): class MissingBuildSystem(BaseTest): - # The build system tests give only negative weight, as they are effectively required - # for a working package, so passing them shouldn't give you a better rating, - # but failing them should give you a worse rating. - weight = 0 - def test(self, data): if "_missing_build_system" in data: + # The build system tests give only negative weight, as they are effectively required + # for a working package, so passing them shouldn't give you a better rating, + # but failing them should give you a worse rating. self.weight = 400 return False + self.weight = 0 + return True + def message(self): return ( "You seem to neither have a setup.py, nor a pyproject.toml, only setup.cfg.\n" @@ -495,11 +468,10 @@ def message(self): class MissingPyProjectToml(BaseTest): - # This may not yet be required, but it will be in the future, so we treat - # give it a negative rating when it fails, but not a positive rating when it succeeds. - weight = 0 - def test(self, data): + # This may not yet be required, but it will be in the future, so we treat + # give it a negative rating when it fails, but not a positive rating when it succeeds. + self.weight = 0 if "_missing_build_system" in data or "_missing_pyproject_toml" in data: self.weight = 100 return False @@ -516,12 +488,12 @@ def message(self): class PyprojectTomlValid(BaseTest): - # The build system tests give only negative weight, as they are effectively required - # for a working package, so passing them shouldn't give you a better rating, - # but failing them should give you a worse rating. - weight = 0 - def test(self, data): + # The build system tests give only negative weight, as they are effectively required + # for a working package, so passing them shouldn't give you a better rating, + # but failing them should give you a worse rating. + self.weight = 0 + # Only test if we have a path and pyproject.toml exists if "_path" not in data: return None @@ -547,6 +519,47 @@ def message(self): ) +class DeprecatedMetadataFields(BaseTest): + weight = 50 + + _deprecated = { + "home-page": ("project-url", "1.2"), + "download-url": ("project-url", "1.2"), + "requires": ("requires-dist", "1.2"), + "provides": ("provides-dist", "1.2"), + "obsoletes": ("obsoletes-dist", "1.2"), + "license": ("license-expression", "2.4"), + } + + def _version_at_least(self, data, minimum): + metadata_version = data.get("metadata-version") + if not metadata_version: + return True + + try: + current = tuple(int(p) for p in str(metadata_version).split(".")) + required = tuple(int(p) for p in str(minimum).split(".")) + except ValueError: + return True + + return current >= required + + def test(self, data): + self._warnings = [] + + for deprecated, (replacement, deprecated_since) in self._deprecated.items(): + if not self._version_at_least(data, deprecated_since): + continue + + if data.get(deprecated) and not data.get(replacement): + self._warnings.append(f"The metadata field '{deprecated}' is deprecated; use '{replacement}' instead.") + + return not self._warnings + + def message(self): + return "\n".join(self._warnings) + + BUILD_SYSTEM_TESTS = [MissingBuildSystem(), MissingPyProjectToml(), PyprojectTomlValid()] ALL_TESTS = [ @@ -572,6 +585,7 @@ def message(self): ValidREST(), BusFactor(), DevStatusClassifier(), + DeprecatedMetadataFields(), ] diff --git a/pyroma/testdata/complete/LICENSE.txt b/pyroma/testdata/complete/LICENSE.txt new file mode 100644 index 0000000..258e908 --- /dev/null +++ b/pyroma/testdata/complete/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2011 Lennart Regebro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pyroma/testdata/complete/pyproject.toml b/pyroma/testdata/complete/pyproject.toml index 55ec8d7..af14698 100644 --- a/pyroma/testdata/complete/pyproject.toml +++ b/pyroma/testdata/complete/pyproject.toml @@ -1,2 +1,32 @@ -[tool.black] -line-length = 120 +[build-system] +requires = ["setuptools>=61"] +build-backend = "setuptools.build_meta" + +[project] +name = "complete" +version = "1.0.dev1" +description = "This is a test package for pyroma." +readme = "README.txt" +authors = [{name = "Lennart Regebro", email = "regebro@gmail.com"}] +classifiers = [ + "Development Status :: 6 - Mature", + "Operating System :: OS Independent", + "Programming Language :: Python :: 2.6", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3.1", + "Programming Language :: Python :: 3.2", + "Programming Language :: Python :: 3.3", +] +keywords = [ + "pypi", + "quality", + "example", +] +requires-python = ">=2.6" +dependencies = ["zope.event"] +license = "MIT" +license-files = ["LICENSE.txt"] + +[project.urls] +repository = "https://github.com/regebro/pyroma" +homepage = "https://github.com/regebro/pyroma" diff --git a/pyroma/testdata/complete/setup.py b/pyroma/testdata/complete/setup.py index f4d84ba..b024da8 100644 --- a/pyroma/testdata/complete/setup.py +++ b/pyroma/testdata/complete/setup.py @@ -1,36 +1,4 @@ -from setuptools import setup, find_packages +from setuptools import setup -version = "1.0" -with open("README.txt", encoding="UTF-8") as readme: - long_description = readme.read() - -setup( - name="complete", - version=version, - description="This is a test package for pyroma.", - long_description=long_description, - python_requires=">=2.6", - classifiers=[ - "Development Status :: 6 - Mature", - "Operating System :: OS Independent", - "Programming Language :: Python :: 2.6", - "Programming Language :: Python :: 2.7", - "Programming Language :: Python :: 3.1", - "Programming Language :: Python :: 3.2", - "Programming Language :: Python :: 3.3", - "License :: OSI Approved :: MIT License", - ], - keywords=["pypi", "quality", "example"], - author="Lennart Regebro", - author_email="regebro@gmail.com", - url="https://github.com/regebro/pyroma", - project_urls={"Source Code": "https://github.com/regebro/pyroma"}, - license="MIT", - packages=find_packages(exclude=["ez_setup", "examples", "tests"]), - include_package_data=True, - install_requires=["zope.event"], - tests_require=["six"], - setup_requires=["setuptools"], - zip_safe=True, -) +setup() diff --git a/pyroma/testdata/distributions/complete-1.0.dev1.tar b/pyroma/testdata/distributions/complete-1.0.dev1.tar index c1cff8cf88cfc7c54f6068f2cb393f57f372b8b0..576b33a120e4356e76e2ec02a8a0c138234e61af 100644 GIT binary patch delta 2918 zcmeHJ?{3pp6t6R2^b#syj0xC>gT)v~Nr>~eR4u|yTxu;%BFClcpxPYgrn%tQ#&#$H zO+kZA6BCml-}aHc0oeoa0F(9*llEnsHthwrbDcj;i+F=osMP14^E-d<@7zbPBadE3 zUWs#&XnKBLx{}CclgWH;aO~u7!ixjXj%B4xHj|l2N|{tPH3QlHxkzImEFFF4-Sm7e zmrW#5^LNxdaipXclyXf;1owmI$FKJrXW(=)mzj~WDJhL8X-PtqTr!uRfh0%i3kU!0 z=`9LtstzS)QroA56dbqfvF%m>7tKqMN=g!xsBIfw02}g3|=EWq8{(27v>H-36C=J{manz+g7Bx4{6@>A78kszD2Je5V=g z7#>CK1{l8Yn9M*xXgFr4P3^!4xWgv1s1Fwdj9aXYEW}Hpmj*Q~!fZsNFg}7E7POpB z03P)NkC_}J2Fy0CP6LDJP0lUWW+NBeJ}iMxF!qj*Iha_L7_^-RYx4hTn3&tCTg-38 zpusqHy%V6O&xK(vV?2?|jt4%qEP@CO0}qqk4X+m}@e*NqFo02&d@k8(Iqki_HgCu(S5?$Zr{z1$8>A89HV*;i7Rum|v&v2iSaOSl~Kd=x~3c2@GIWfm&rn-;gy0 z)EZQ^%8i~{REi+VH57<3*iiM=%DN7yqRC}_6Dlhpmp9=PwOovW@@Z95YBi{6L|v`?OfaD=LyqkUnL{9iYxbByw{wF7C4KMs^{>V z5MS3y3wYyQ$7g}#b^Cut&!60LhF6Qa#`fTk=nulWM(=hQ;>4?63psHOZp#weSGkZ_^mLunOYQ!Q#Sc*HnVS0@Vzox z6wCV?lb%VYa8IB~xE20y3^wNKTm;waRMoU6r_=e|)Hw61NtsM`YL`Z*x=&u{|KRnA z2ya4tHfj||Nas@0r0zG59^C7+KBbAy#=ZuExnJ}4v}P*5t9fVk;F0`1E`LmBemnvX z9-oo$K`@m~3SS0!DL1zJQFtiy>K$e^;(pf;XnTuzqdNjia8vYY&~XFDvHYt`IZ50i zL*2Sz-l4d=mtaaG5uSbCrhy?6a?>5&&@F-&gK|y0&#pxSDw2EnK)}1kg;FAUD$$_# zB#|_BZy`VFUyF)85yLSWLwik;i)-PdMnldV^TRFSm$k z;nRaP83w~~$gEhT_o(H#{0Razd?IxE?z0oZZ2#%A3z1o||HYhm80kWcq3Y-(KmIs> zNSgfFcfUU{)c>f5!Yy)#c6S`FF?Qp2T^1_e?HCpdy5ZmSzQM~A>W^CxcSD-u8H7Z| zYvf|xscrHX25-;<$E67j+YYcfBktk)$dMv`FNW`vkc@`)@*?enL*mO@{t)^x$EfPJEz_r}OFKGs$EoKc3EX mPRiqSX7iKj90=c?6$t)>V|ek>%UhAbv0Hx&Z~gTg7XAa8|8|}L delta 2278 zcmds2-EZ4e6pzC)b*8N-FqXCwy1Sz&ks9N#IG!b=R%56|-I%)WX_Vl`H<_7ZySCG& zMbK3%2p*8u`i)2SA1wbs{}hmb2YB0F5#wBcBwqReVsG4s#6F+Dd(QFiJUA^rI4wT< z=8|0CN2kCGyeNnT)Q>I~&BqMG%&VvyT3wHorX-bg_JsU2(gl z<{2HLMSqpAe6rjN@43E))`;U6eu&mdhiv&So5*XVYgo31{6xCcp|4!a?XqiDi#P$% z(2dm%_LlE{PFi8@&ia~$Zo56dMbI_Z9Q;}Sfmyv~8$n>TEkd&-UP#l>$G2C}vgi5k z4l(IF#L3j`I@#`7J_%~K_5huuq4#x>Q=&iS<{9?K%J~6byvRJk)6-K~t<{EFr=|Xt zIT3TER`~j;)Y8{8FW<7^~ywohNnP&XHIU8HwD@(@`}{>KR4z4baAW< zpB~N1F!!U`q-79fNlMEQF{S6xw)@_`<<$bCO<;zfJvke? zoi>9;loUvkO?zjmG={>-nL>79XzHFZ-N~DZjgjf@h0>&=imEIrvdU#`UU_FCgLyoo zMrM2AO<5MB{oVJPAPNxUL9Bp``~pvWo4$IJoq zcIdh`w`Cix`;H|YL>`DrO^NE;+}~1&LV&G za848f=8MSd4P`_-$Mej=B5GTX+4KNAuuj0TJH!tx*8%KU;CRfkyB6HU^@vl!>(`e* zxN)5e`ypOL#A&&v<#cp>XXC?~imS*7fQk&WOEeb2v0bOrG)d6%EiX($CTfoURjMo- zkfpHaRbp$$0E))hl;Oo#n1a#M|3sJzspDv=jJHzj@r3%gAo2HN+G_eKjp;b%uQWz$ z$cKS`H^xA(f}^!r^lEBC1<^-`?@rJMdZO*aYW`&*Iz2p>7hIW^I3e%7eMm*(nCL*_ zq?`!{skUw9D+5dBv>BcFB7zOvT<|_`z7;E zCsBW4E-R$pvU?_hYmxnCKwxZg_X+58NP;lHo7E(;<;3>cU^h)8H1rL>N2vM$Af2?QXXCgsO8ZIvx#XE4|Q PjTxZ+Pyg_9jP$<&+m45Y diff --git a/pyroma/testdata/distributions/complete-1.0.dev1.tar.bz2 b/pyroma/testdata/distributions/complete-1.0.dev1.tar.bz2 index f8761799090f8e0e72538cdaf8b00c1bea45effa..c6a0d8a92822cf72c3c36a5abc20639165ef3387 100644 GIT binary patch literal 3182 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 UcssG&5Fh+q$rRy2LN+7IsO50VrvLx| literal 2690 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 diff --git a/pyroma/testdata/distributions/complete-1.0.dev1.tar.gz b/pyroma/testdata/distributions/complete-1.0.dev1.tar.gz index 3655e54346f68564ac6421823987d03ea6344e2a..4d3d9242bd4fd451b9fb9a04ff907e131f5a382e 100644 GIT binary patch literal 2991 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 literal 2451 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 Pem^nbtjszaiH+^wI>-;s diff --git a/pyroma/testdata/distributions/complete-1.0.dev1.zip b/pyroma/testdata/distributions/complete-1.0.dev1.zip index 0bf379880ba534e3138dbcbcd9a51dee34fe12b9..228996361b603ca840828f8bdb1957f902b210c0 100644 GIT binary patch literal 6460 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

r62 xSl{g9(|y8!6aO>6JscGG$)!GJ48Ldi!4RndJx16ydvT8rz)1MRf$m3u{2vq9bP)gm literal 5907 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 P#GepxWxgXa0D%7h+@L~a diff --git a/pyroma/testdata/jsondata/complete.json b/pyroma/testdata/jsondata/complete.json index 80f1151..bd05b52 100644 --- a/pyroma/testdata/jsondata/complete.json +++ b/pyroma/testdata/jsondata/complete.json @@ -1 +1 @@ -{"info":{"author":"Logilab and Shoobx Team","author_email":"dev@shoobx.com","bugtrack_url":null,"classifiers":["Development Status :: 3 - Alpha","Framework :: ZODB","Intended Audience :: Developers","License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)","Natural Language :: English","Operating System :: OS Independent","Programming Language :: Python","Programming Language :: Python :: 2","Programming Language :: Python :: 2.7","Programming Language :: Python :: 3","Programming Language :: Python :: 3.5","Programming Language :: Python :: 3.6"],"description":"========\nXML Diff\n========\n\n.. image:: https://travis-ci.org/Shoobx/complete.png?branch=master\n :target: https://travis-ci.org/Shoobx/complete\n\n.. image:: https://coveralls.io/repos/github/Shoobx/complete/badge.svg?branch=master\n :target: https://coveralls.io/github/Shoobx/complete?branch=master\n\n.. image:: https://img.shields.io/pypi/v/complete.svg\n :target: https://pypi.python.org/pypi/complete\n\n.. image:: https://img.shields.io/pypi/pyversions/complete.svg\n :target: https://pypi.python.org/pypi/complete/\n\n\ncomplete is a utility for extracting differences between two xml files. It\nreturns a set of primitives to apply on source tree to obtain the destination\ntree.\n\nThe implementation is based on `Change detection in hierarchically structured\ninformation`, by S. Chawathe, A. Rajaraman, H. Garcia-Molina and J. Widom,\nStanford University, 1996\n\nInstallation\n------------\n\nTo install the latest release:\n\n.. code:: bash\n\n pip install complete\n\n\nTo install the development version:\n\n.. code:: bash\n\n git clone https://github.com/Shoobx/complete.git\n cd complete\n virtualenv ./.venv\n ./.venv/bin/python setup.py install\n\nThen to compare two given XML files:\n\n.. code:: bash\n\n ./.venv/bin/complete 1.xml 2.xml\n\n\nRunning tests\n-------------\n\nTo run the test suite for all python versions:\n\n.. code:: bash\n\n tox\n\n\nCHANGES\n=======\n\n1.1.0 (2018-06-15)\n------------------\n\n- When using namespaces, the returned xpaths are now in the form ns_prefix:tag\n instead of the earlier {ns_uri}tag, which isn't correct xpaths.\n\n\n1.0.0 (2018-04-13)\n------------------\n\n- pep8 cleanup, added flake8 checking to tox\n\n\n1.0.0a6 (2018-04-12)\n--------------------\n\n- Removed encoding, because python does unicode just fine\n\n- Switched on namespace handling for XML input\n\n\n1.0.0a5 (2018-04-11)\n--------------------\n\n- Brownbag release to make up for bad previous ones.\n\n1.0.0a2 (2018-04-11)\n--------------------\n\n- Temporary disabling of encoding text (hopefully permanent).\n\n- Reverted bug fix: Do not remove newlines from text while parsing\n the XML.\n\n\n1.0.0a1 (2018-04-10)\n--------------------\n\n- Bug: Fix a off-by-one issue with `insert-after` action.\n\n- Bug: Do not rename children on text node updates.\n\n- Bug: Text moves were not recorded as part of the fmes edit script.\n\n- Remove only partially implemented xmlrev script.\n\n- Removed support for xupdate, which never became a standard.\n\n- Removed deprecated ezs optional algorithm.\n\n- Removed support for Debian and RedHat packaging.\n\n- Removed Windows support\n\n- LOTS of package cleanup (setup.py, MANIFEST, proper console script, etc)\n\n- tests moved to py.test and cleaned, added tox, travis, coverage support\n\n\n0.6.10 (2010-08-27)\n-------------------\n\n- apply Daiki Ueno patch: fails when comparing minimal trees on i386\n\n\n0.6.9 (2009-04-02)\n------------------\n\n- Fixed complete-xmlrev compilation error\n\n\n0.6.8 (2006-06-15)\n------------------\n\n- Fixed 64bit cleanness issues\n\n\n0.6.7 (2005-05-04)\n------------------\n\n- WARNING: complete is no longer a logilab subpackage. Users may have to\n manually remove the old logilab/complete directory.\n\n- fixed debian bug #275750, also reported by Christopher R Newman on the\n xml-projects mailing list\n\n- fixed --profile option, wrap function from maplookup when profiling so that\n they appear in the profile information\n\n- fixed setup.py to ignore the xmlrev shell script under windows platforms\n\n- small improvements (remove recursion in object.py, minor enhancement in\n mydifflib.py, rewrite of lcs4 in C)\n\n\n0.6.6 (2004-12-23)\n------------------\n\n- Applied patch by Bastian Kleineidam which\n\n - corrects the typo in ML_DIR\n\n - fixes the TMPFILE_XSLT/TMPFILE_XSL typo\n\n - makes sure the files are XML or SGML files, else prints an error\n\n - adds various missing quotes around filenames which could have\n spaces or begin with a hyphen\n\n - fixes typos in the usage() function\n\n Thanks a lot, Bastian.\n\n- Fixed some problems in the xmlrev.xslt stylesheet\n\n- Fixed problems in xmlrev caused by the exit status of complete when\n successful\n\n- Added a man page for complete and xmlrev\n\n\n0.6.5 (2004-09-02)\n------------------\n\n- xmlrev bugfixes\n\n- Fixed packaging problems (missing xsl stylesheets and MANIFEST file)\n\n\n0.6.4 (2003-10-02)\n------------------\n\n- fix recursive mode\n\n- rewrite regression test, add test for the recursive mode\n\n- add --help option to xlmrev\n\n- packaging fixes\n\n- turn API.txt and HELP.txt to correct ReST\n\n\n0.6.3 (2002-11-06)\n------------------\n\n- fix wrong xpath for attributes\n\n- fix bug with temporary duplicate attribute node\n\n- fix for xupdate\n\n- fix ext_pes option bug\n\n- update changelog to new format\n\n\n0.6.2 (2002-09-23)\n------------------\n\n- return number of differences on command line\n\n- reintroduce misc.list_print which caused recursive mode\n to fail\n\n- use psyco if available (http://psyco.sf.net)\n\n- little changes in C extension\n\n\n0.6.1 (2002-08-29)\n------------------\n\n- fix packaging problems\n\n\n0.6.0 (2002-08-23)\n------------------\n\n- change of the internal representation\n\n- remove support for the EZS algorithm (no more maintened\n for the moment)\n\n- add command line options to parse html and to control\n entities inclusion and output encoding\n\n- fixing coalescing text nodes bug\n\n- many other bugs fixes\n\n- great speed improvement\n\n\n0.5.3 (2002-01-31)\n------------------\n\n- add __init__.py in \"logilab\" directory\n\n\n0.5.2 (2001-10-29)\n------------------\n\n- bug fixes in xupdate formatting and in the dom interface.\n\n\n0.5.1 (2001-09-07)\n------------------\n\n- Fast Match / Edit Scritp algorithm, now fully usable\n\n- fixes Unicode problem\n\n\n0.2.1 (2001-08-10)\n------------------\n\n- bug fixes, optimizations for ezs algorithm\n\n\n0.1.1 (2001-08-04)\n------------------\n\n- original revision","description_content_type":"","docs_url":null,"download_url":"","downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"home_page":"https://github.com/Shoobx/complete","keywords":"xml,diff,complete,tree 2 tree","license":"LGPL","maintainer":"","maintainer_email":"","name":"complete","package_url":"https://pypi.org/project/complete/","platform":"","project_url":"https://pypi.org/project/complete/","project_urls":{"Homepage":"https://github.com/Shoobx/complete"},"release_url":"https://pypi.org/project/complete/1.1.0/","requires_dist":null,"requires_python": ">=2.7","summary":"Tree 2 tree correction between xml documents. Extract differences between two xml files. It returns a set of primitives to apply on source tree to obtain the destination tree.","version":"1.1.0","yanked":false,"yanked_reason":null},"last_serial":5948813,"releases":{"0.6.10":[{"comment_text":"","digests":{"md5":"9ab11f838f7e0b1dcadc94bb81eb1539","sha256":"edeb13ae5d2cc1de72b58bc989f10dc006db5acc19d42f4b05309b14bc99bbe0"},"downloads":-1,"filename":"complete-0.6.10.zip","has_sig":false,"md5_digest":"9ab11f838f7e0b1dcadc94bb81eb1539","packagetype":"sdist","python_version":"source","requires_python":null,"size":44447,"upload_time":"2015-04-02T16:07:22","upload_time_iso_8601":"2015-04-02T16:07:22.450850Z","url":"https://files.pythonhosted.org/packages/01/5c/e10197f6b699497bbbb32baa73a7b85b4be4f0117c8dae3d525ff5451987/complete-0.6.10.zip","yanked":false,"yanked_reason":null}],"0.6.4":[{"comment_text":"","digests":{"md5":"65c173fb5adcdce1008ab3a9a39ae6bd","sha256":"678042e7d8fc249f6ae78bc5f26847b1da7705ec887dce63e01a2348bfab0664"},"downloads":-1,"filename":"complete-0.6.4.tar.gz","has_sig":false,"md5_digest":"65c173fb5adcdce1008ab3a9a39ae6bd","packagetype":"sdist","python_version":"source","requires_python":null,"size":28540,"upload_time":"2015-04-02T15:37:18","upload_time_iso_8601":"2015-04-02T15:37:18.791051Z","url":"https://files.pythonhosted.org/packages/78/be/25e4c3b6e295205adcc102c72d3c182366e9adc0a42c9c641b14a710dc3c/complete-0.6.4.tar.gz","yanked":false,"yanked_reason":null}],"0.6.6":[{"comment_text":"","digests":{"md5":"b4461fcf85dbcef9d2dc3f712445f1ae","sha256":"a1d4f928c955d072afcf86bc5d67e1d901a4825fc028f05a30e957693f8369ec"},"downloads":-1,"filename":"complete-0.6.6.tar.gz","has_sig":false,"md5_digest":"b4461fcf85dbcef9d2dc3f712445f1ae","packagetype":"sdist","python_version":"source","requires_python":null,"size":30589,"upload_time":"2015-04-02T15:34:58","upload_time_iso_8601":"2015-04-02T15:34:58.448942Z","url":"https://files.pythonhosted.org/packages/b0/77/222543b1aa3687f4ded31948019a61ffc0e6e1713e5c7116d32a434663ff/complete-0.6.6.tar.gz","yanked":false,"yanked_reason":null}],"0.6.7":[{"comment_text":"","digests":{"md5":"495afb1b4e059af9099ca90cd619e0d3","sha256":"8fa3dce3f000ed5ac97023b4a2d4e0d4aa3cd1db3885c6d0480e63617a5073d9"},"downloads":-1,"filename":"complete-0.6.7.zip","has_sig":false,"md5_digest":"495afb1b4e059af9099ca90cd619e0d3","packagetype":"sdist","python_version":"source","requires_python":null,"size":44737,"upload_time":"2015-04-02T16:06:22","upload_time_iso_8601":"2015-04-02T16:06:22.122578Z","url":"https://files.pythonhosted.org/packages/2a/c1/1a009a72a524974480996e572cdad6eee1fb9c5c51c291111b1b8e240623/complete-0.6.7.zip","yanked":false,"yanked_reason":null}],"0.6.8":[{"comment_text":"","digests":{"md5":"02a6192bb2bb4196077fcf66aaf67129","sha256":"7e2d1e13a991dc490d0ea70b13528b78f6a7e44d0317536d1f54950a90ae8525"},"downloads":-1,"filename":"complete-0.6.8.zip","has_sig":false,"md5_digest":"02a6192bb2bb4196077fcf66aaf67129","packagetype":"sdist","python_version":"source","requires_python":null,"size":44988,"upload_time":"2015-04-02T16:06:45","upload_time_iso_8601":"2015-04-02T16:06:45.550281Z","url":"https://files.pythonhosted.org/packages/01/eb/4395ef31da4129fc1ade423d0728aee0865f85b1dc5cc58d083d805cd220/complete-0.6.8.zip","yanked":false,"yanked_reason":null}],"0.6.9":[{"comment_text":"","digests":{"md5":"57b6b3f0e3c21163744b1abede196749","sha256":"7ea0451330d9e57633c0ae389cedcf30efc3925ab0c2763563bb28c558b47981"},"downloads":-1,"filename":"complete-0.6.9.zip","has_sig":false,"md5_digest":"57b6b3f0e3c21163744b1abede196749","packagetype":"sdist","python_version":"source","requires_python":null,"size":44179,"upload_time":"2015-04-02T16:07:07","upload_time_iso_8601":"2015-04-02T16:07:07.388937Z","url":"https://files.pythonhosted.org/packages/bb/db/df65a8a5a09aa6fd391c2e52edf3d4ab75396f961e36a425aadc3a50dc75/complete-0.6.9.zip","yanked":false,"yanked_reason":null}],"1.0.0":[{"comment_text":"","digests":{"md5":"3d7c20a999963b8f3d8651bb8a18f577","sha256":"81394752277427af4e3783846716a4780d4100724628668e6153eb3c899fa01d"},"downloads":-1,"filename":"complete-1.0.0.tar.gz","has_sig":false,"md5_digest":"3d7c20a999963b8f3d8651bb8a18f577","packagetype":"sdist","python_version":"source","requires_python":null,"size":39642,"upload_time":"2018-04-13T13:22:51","upload_time_iso_8601":"2018-04-13T13:22:51.840164Z","url":"https://files.pythonhosted.org/packages/6b/d3/376909843cdb112f0ce50173fbcfcd9204efde27e1797de99706c95cde55/complete-1.0.0.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a1":[{"comment_text":"","digests":{"md5":"669a8bc7160c3de61b6f8a9f4005ae53","sha256":"e882b8fb68e07c5e483b9b1395b41324ca46632c5875c61e725e8bdb9a0b97e9"},"downloads":-1,"filename":"complete-1.0.0a1.tar.gz","has_sig":false,"md5_digest":"669a8bc7160c3de61b6f8a9f4005ae53","packagetype":"sdist","python_version":"source","requires_python":null,"size":37723,"upload_time":"2018-04-10T13:22:53","upload_time_iso_8601":"2018-04-10T13:22:53.589597Z","url":"https://files.pythonhosted.org/packages/5d/f3/b3de2527aaeb8d5d8c4c9c8b49fa5fb9b30463c3568fdb04c4891010d3d4/complete-1.0.0a1.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a2":[{"comment_text":"","digests":{"md5":"8ca07eb4bbb09cce4b07b64e56c7d7d6","sha256":"8bb91f15ecd2a0efa11bcaf8be013df16629af7ab0c909ca4ff1330d0aacae73"},"downloads":-1,"filename":"complete-1.0.0a2.tar.gz","has_sig":false,"md5_digest":"8ca07eb4bbb09cce4b07b64e56c7d7d6","packagetype":"sdist","python_version":"source","requires_python":null,"size":36836,"upload_time":"2018-04-10T15:48:43","upload_time_iso_8601":"2018-04-10T15:48:43.658000Z","url":"https://files.pythonhosted.org/packages/8b/22/88e32c7999c85a6aa97b2c36e4b366bd5e6631f03c14988124b93564bdb1/complete-1.0.0a2.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a3.dev0":[{"comment_text":"","digests":{"md5":"65c035101c40d30dc0838acaa135ec41","sha256":"79a4955f3585dc8f05d07494a2a35ad41fe26192e831b6fbd062188226bd42f6"},"downloads":-1,"filename":"complete-1.0.0a3.dev0.tar.gz","has_sig":false,"md5_digest":"65c035101c40d30dc0838acaa135ec41","packagetype":"sdist","python_version":"source","requires_python":null,"size":36846,"upload_time":"2018-04-10T15:56:31","upload_time_iso_8601":"2018-04-10T15:56:31.070448Z","url":"https://files.pythonhosted.org/packages/80/70/df743f6777b4a43689aaa6dfad3f8ca96c041d4f959607cb067e7903019a/complete-1.0.0a3.dev0.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a4.dev0":[{"comment_text":"","digests":{"md5":"f5034450dcd8df3abe0759a62251bc65","sha256":"2ee7f0f4a86e68e537d77e6922ebc79bb3bb1b316c3a7c2e50bc8f61774ca506"},"downloads":-1,"filename":"complete-1.0.0a4.dev0.tar.gz","has_sig":false,"md5_digest":"f5034450dcd8df3abe0759a62251bc65","packagetype":"sdist","python_version":"source","requires_python":null,"size":36899,"upload_time":"2018-04-10T16:02:36","upload_time_iso_8601":"2018-04-10T16:02:36.150652Z","url":"https://files.pythonhosted.org/packages/02/80/86b6e9a5fc6267e1e945734228073a42f40398ff78537d1e17c0f6f11b93/complete-1.0.0a4.dev0.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a5":[{"comment_text":"","digests":{"md5":"19bbc60ebbf9d290069649f1e24e7d55","sha256":"5a38bc0e7a5daf89c0a960643fcdabbd8b24b0913c94ff1ef0de06321b4bdbbd"},"downloads":-1,"filename":"complete-1.0.0a5.tar.gz","has_sig":false,"md5_digest":"19bbc60ebbf9d290069649f1e24e7d55","packagetype":"sdist","python_version":"source","requires_python":null,"size":37417,"upload_time":"2018-04-11T13:02:26","upload_time_iso_8601":"2018-04-11T13:02:26.425291Z","url":"https://files.pythonhosted.org/packages/0a/e7/d0889a2a39d214ca883873fa1547eda0672b1ef2bd6d7f5d1bb8bb1e3351/complete-1.0.0a5.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a6":[{"comment_text":"","digests":{"md5":"1785ee59afdf2ff4c634276f33767302","sha256":"02a3ce91aa39a42146e7dae240cb16a6da529f8c725e53939afe1df736ea4475"},"downloads":-1,"filename":"complete-1.0.0a6.tar.gz","has_sig":false,"md5_digest":"1785ee59afdf2ff4c634276f33767302","packagetype":"sdist","python_version":"source","requires_python":null,"size":38050,"upload_time":"2018-04-12T12:48:52","upload_time_iso_8601":"2018-04-12T12:48:52.719912Z","url":"https://files.pythonhosted.org/packages/4e/b4/50f65f8e77da28899e31945ae5719535e9a9e67bea961ecfba77c39399fe/complete-1.0.0a6.tar.gz","yanked":false,"yanked_reason":null}],"1.1.0":[{"comment_text":"","digests":{"md5":"ee08b66cae5d77364f6deee252638b3b","sha256":"462c76c145403eb5e9a8358dc402a53b264ab202ebabf83cdc660ed2cf72c89b"},"downloads":-1,"filename":"complete-1.0.dev1.tar.gz","has_sig":false,"md5_digest":"ee08b66cae5d77364f6deee252638b3b","packagetype":"sdist","python_version":"source","requires_python":null,"size":39258,"upload_time":"2018-06-15T12:24:36","upload_time_iso_8601":"2018-06-15T12:24:36.191454Z","url":"https://files.pythonhosted.org/packages/ab/4a/cab33ec593f433b7cded3cec85d1f7c900261fd503bd894e16782f7c0d09/complete-1.0.dev1.tar.gz","yanked":false,"yanked_reason":null}],"1.1.1":[{"comment_text":"","digests":{"md5":"dd17d5d775b9433df64513265502cdb8","sha256":"b8dc6c36a3499e752cf5b5d2704d961be37fcf2ea5be2e4187572e18f674d053"},"downloads":-1,"filename":"complete-1.1.1.tar.gz","has_sig":false,"md5_digest":"dd17d5d775b9433df64513265502cdb8","packagetype":"sdist","python_version":"source","requires_python":null,"size":39523,"upload_time":"2018-06-20T18:38:14","upload_time_iso_8601":"2018-06-20T18:38:14.221847Z","url":"https://files.pythonhosted.org/packages/35/cc/ae210f70dac681a7566f25f43740a0cbdc53a77e23684f7b9b1d71e4d918/complete-1.1.1.tar.gz","yanked":false,"yanked_reason":null}],"2.0":[{"comment_text":"","digests":{"md5":"dacf1d5fe5e94e0b656e8985e2e81faa","sha256":"31f83117e38d78670e1994e7160b1463adb04ffa34ff267700b2ca61bada5e57"},"downloads":-1,"filename":"complete-2.0-py2.py3-none-any.whl","has_sig":false,"md5_digest":"dacf1d5fe5e94e0b656e8985e2e81faa","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":55479,"upload_time":"2018-09-25T07:05:49","upload_time_iso_8601":"2018-09-25T07:05:49.423913Z","url":"https://files.pythonhosted.org/packages/ce/dc/7caf3ada02afcab68c7330c207f0b05b54dd5ef6ac96fb18e2fa85f1038a/complete-2.0-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"982c288a450198b414363a9388631c26","sha256":"221733cfbfafff1d90756834f1f2bc8a3cfa097a57ad6ab11e83db308c1b486e"},"downloads":-1,"filename":"complete-2.0.tar.gz","has_sig":false,"md5_digest":"982c288a450198b414363a9388631c26","packagetype":"sdist","python_version":"source","requires_python":null,"size":86965,"upload_time":"2018-09-25T07:05:51","upload_time_iso_8601":"2018-09-25T07:05:51.301648Z","url":"https://files.pythonhosted.org/packages/41/80/5c6ef6fc423fb7902cc7fe6d5784545559d11dc157b1dbe50de59192bd08/complete-2.0.tar.gz","yanked":false,"yanked_reason":null}],"2.0b1":[{"comment_text":"","digests":{"md5":"0003996e2c8b62541743c80f1367925f","sha256":"9a15649073d795f2a742f0c46f44ebc732727ae201cf92e796ffb7b31eaebf59"},"downloads":-1,"filename":"complete-2.0b1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"0003996e2c8b62541743c80f1367925f","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":53036,"upload_time":"2018-09-03T12:49:24","upload_time_iso_8601":"2018-09-03T12:49:24.676079Z","url":"https://files.pythonhosted.org/packages/65/35/0820f8a49e5812dbcdb2aee651f19df8bf7c67d379e449699ed4ede5df51/complete-2.0b1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"5f60ea9a2bc0109d1828ae753c332ed2","sha256":"173ad39aa5c95e9deeb563e94174c944ffd814441b2587f5645f0119c192220c"},"downloads":-1,"filename":"complete-2.0b1.tar.gz","has_sig":false,"md5_digest":"5f60ea9a2bc0109d1828ae753c332ed2","packagetype":"sdist","python_version":"source","requires_python":null,"size":70341,"upload_time":"2018-09-03T12:49:27","upload_time_iso_8601":"2018-09-03T12:49:27.080969Z","url":"https://files.pythonhosted.org/packages/54/45/006a8a3068f261dfbb543e4a4905ea1495a9deaa6b880af881e7112fe590/complete-2.0b1.tar.gz","yanked":false,"yanked_reason":null}],"2.0b2":[{"comment_text":"","digests":{"md5":"e2431ed70e7c940e72b065b3c2fc4d66","sha256":"0ea1eabb994a10160cdeb3b3a93e80e09191bc971ddf10213ec4618e890a79a1"},"downloads":-1,"filename":"complete-2.0b2-py2.py3-none-any.whl","has_sig":false,"md5_digest":"e2431ed70e7c940e72b065b3c2fc4d66","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":53862,"upload_time":"2018-09-06T14:41:53","upload_time_iso_8601":"2018-09-06T14:41:53.157424Z","url":"https://files.pythonhosted.org/packages/10/db/b5e9c37e5e66e86b5f87220db5e18d4f6b79f5b57037fcb251ca1116d9d0/complete-2.0b2-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"0199ffb374b5378b5b3f03b23008ee31","sha256":"4d95ddf206f4c440fcace43c0a9f4d26fb704b1fd5087c6c9b903e04a008bf05"},"downloads":-1,"filename":"complete-2.0b2.tar.gz","has_sig":false,"md5_digest":"0199ffb374b5378b5b3f03b23008ee31","packagetype":"sdist","python_version":"source","requires_python":null,"size":85397,"upload_time":"2018-09-06T14:41:55","upload_time_iso_8601":"2018-09-06T14:41:55.709235Z","url":"https://files.pythonhosted.org/packages/e6/ec/5c92cdd29d86e05b0938c56af54e06962a822689c5c70b5fa4eba727d799/complete-2.0b2.tar.gz","yanked":false,"yanked_reason":null}],"2.0b3":[{"comment_text":"","digests":{"md5":"810ffd544e5de013bbc0ad49258d017c","sha256":"a7c2efc42f6b2e47af36d905521a0e97c5f469d3d8c4243b87db9281c056c5de"},"downloads":-1,"filename":"complete-2.0b3-py2.py3-none-any.whl","has_sig":false,"md5_digest":"810ffd544e5de013bbc0ad49258d017c","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":54110,"upload_time":"2018-09-11T19:48:45","upload_time_iso_8601":"2018-09-11T19:48:45.470945Z","url":"https://files.pythonhosted.org/packages/0a/0c/fa7d475d3be9c376bb46fa7d0db1f70ee7cbce8d7328de750d06c72c1f8a/complete-2.0b3-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"116600a8ebf81955bbdde9716dcb8a70","sha256":"77e234d9e9e2f274e9bd86380f2fd0bb58ad3071278ab4c9df801ff54caead01"},"downloads":-1,"filename":"complete-2.0b3.tar.gz","has_sig":false,"md5_digest":"116600a8ebf81955bbdde9716dcb8a70","packagetype":"sdist","python_version":"source","requires_python":null,"size":85573,"upload_time":"2018-09-11T19:48:47","upload_time_iso_8601":"2018-09-11T19:48:47.787379Z","url":"https://files.pythonhosted.org/packages/a7/2d/22d2e86b795f85aa80676c7668a5e375b44d3239664d72b0b1c32e7291ed/complete-2.0b3.tar.gz","yanked":false,"yanked_reason":null}],"2.0b4":[{"comment_text":"","digests":{"md5":"e238130940a149c44927e30216bc0f74","sha256":"88ba6fb733677579a9bd6b1b1e99808d47d17ba20038075f8731ee12d40efb41"},"downloads":-1,"filename":"complete-2.0b4-py2.py3-none-any.whl","has_sig":false,"md5_digest":"e238130940a149c44927e30216bc0f74","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":54166,"upload_time":"2018-09-12T12:58:38","upload_time_iso_8601":"2018-09-12T12:58:38.798219Z","url":"https://files.pythonhosted.org/packages/f2/99/891565815619416a411b6a43dca887c575035c0dd2da374e7c87df5d9263/complete-2.0b4-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"14f8369167928c97140e55af20438d95","sha256":"63bdf6265dac0213e71001b03c81171b7fb1bf2fab06cd0ea8c9d2ffd4c0cd0c"},"downloads":-1,"filename":"complete-2.0b4.tar.gz","has_sig":false,"md5_digest":"14f8369167928c97140e55af20438d95","packagetype":"sdist","python_version":"source","requires_python":null,"size":87043,"upload_time":"2018-09-12T12:58:41","upload_time_iso_8601":"2018-09-12T12:58:41.083128Z","url":"https://files.pythonhosted.org/packages/eb/ca/24ff95b2da5a77f167e2113b6861f879f04629a5b1834ca221b790b36481/complete-2.0b4.tar.gz","yanked":false,"yanked_reason":null}],"2.0b5":[{"comment_text":"","digests":{"md5":"8660d1531dda6f79bd48a49fbf3d5888","sha256":"01b00bcf84e8f9692215ef1f3d4cb350d076add26b70f29e4f31ac85e5f66a28"},"downloads":-1,"filename":"complete-2.0b5-py2.py3-none-any.whl","has_sig":false,"md5_digest":"8660d1531dda6f79bd48a49fbf3d5888","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":54240,"upload_time":"2018-09-13T19:12:05","upload_time_iso_8601":"2018-09-13T19:12:05.832300Z","url":"https://files.pythonhosted.org/packages/ac/69/3a53d4aeb73dc20d140bdab53036572706e4cfc063d58d43cb73264b86ed/complete-2.0b5-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"c8a97de8115ab5ee9c0d5e1f70ed9060","sha256":"308bff344aed37aa04aae552e9d54d0d8ba625386bd5b8817282ef75c66de407"},"downloads":-1,"filename":"complete-2.0b5.tar.gz","has_sig":false,"md5_digest":"c8a97de8115ab5ee9c0d5e1f70ed9060","packagetype":"sdist","python_version":"source","requires_python":null,"size":87210,"upload_time":"2018-09-13T19:12:09","upload_time_iso_8601":"2018-09-13T19:12:09.026887Z","url":"https://files.pythonhosted.org/packages/55/83/cbd13288511af6f8c55ea340935cf17b244c485f6f776214fbc6bc41d7c4/complete-2.0b5.tar.gz","yanked":false,"yanked_reason":null}],"2.0b6":[{"comment_text":"","digests":{"md5":"6e64c656bd3b495bc2d9f357c6f8901f","sha256":"9e6d41a6ebfe71a90a288ea7f3a5c8efa2b7fe313c3e1aa026fa97f345e07745"},"downloads":-1,"filename":"complete-2.0b6-py2.py3-none-any.whl","has_sig":false,"md5_digest":"6e64c656bd3b495bc2d9f357c6f8901f","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":55113,"upload_time":"2018-09-13T19:14:55","upload_time_iso_8601":"2018-09-13T19:14:55.356378Z","url":"https://files.pythonhosted.org/packages/aa/39/115e4fa64aebf2c57a71c29c53740504f658b1447650a1473edb0c3ebb00/complete-2.0b6-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"5c2d8fafcf16fd0fa9220da91205f696","sha256":"fa4cb24351e678dd56c9b46350cd54b1f39209e03517532a5e8fa8db9adbda56"},"downloads":-1,"filename":"complete-2.0b6.tar.gz","has_sig":false,"md5_digest":"5c2d8fafcf16fd0fa9220da91205f696","packagetype":"sdist","python_version":"source","requires_python":null,"size":88205,"upload_time":"2018-09-13T19:14:58","upload_time_iso_8601":"2018-09-13T19:14:58.034821Z","url":"https://files.pythonhosted.org/packages/2c/59/c47466d69a1293a7e1587a8af04d15c875415967527e9be6b4241723d96b/complete-2.0b6.tar.gz","yanked":false,"yanked_reason":null}],"2.0b7":[{"comment_text":"","digests":{"md5":"7c1beaed9081f6dca0cce01ab4957c6b","sha256":"8dbfdf93bd9d91c07ab5494d316c6083c3d71f673fd66ba497ce2b6a2011dd18"},"downloads":-1,"filename":"complete-2.0b7-py2.py3-none-any.whl","has_sig":false,"md5_digest":"7c1beaed9081f6dca0cce01ab4957c6b","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":56045,"upload_time":"2018-09-14T13:31:42","upload_time_iso_8601":"2018-09-14T13:31:42.874915Z","url":"https://files.pythonhosted.org/packages/bc/6c/e71ecb88f2308d7528c687ce2982fa4dba85cdaa9ac46604af59d844ace7/complete-2.0b7-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"bdc27299ae90128c3bbee2f833be2171","sha256":"e6ba88f2c2b8329d62b3aadfcb30dd782497087759673257e0f688df728a1694"},"downloads":-1,"filename":"complete-2.0b7.tar.gz","has_sig":false,"md5_digest":"bdc27299ae90128c3bbee2f833be2171","packagetype":"sdist","python_version":"source","requires_python":null,"size":89558,"upload_time":"2018-09-14T13:31:45","upload_time_iso_8601":"2018-09-14T13:31:45.969375Z","url":"https://files.pythonhosted.org/packages/4b/7a/349fde975c7b6b7331da2542d0e2cf9f0b7d30054bb5684d94d90f48e12b/complete-2.0b7.tar.gz","yanked":false,"yanked_reason":null}],"2.0rc1":[{"comment_text":"","digests":{"md5":"ff0d9ff18f6ad6b6951aa7f933782280","sha256":"582270dc62708af5ee2b649abde1ee1d6f0374f642f6b0b8771e203f2d4922ed"},"downloads":-1,"filename":"complete-2.0rc1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"ff0d9ff18f6ad6b6951aa7f933782280","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":56194,"upload_time":"2018-09-24T20:19:16","upload_time_iso_8601":"2018-09-24T20:19:16.377778Z","url":"https://files.pythonhosted.org/packages/e6/55/1c65e555d1e952644428da85662ef9c0448becfae5487ab321048b57d339/complete-2.0rc1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"eaef8d536ee4faedb15b5b6e77c84378","sha256":"e6044d6cf2bb283ad72e7fae3200d275950cbdc7245751c62c51c3a6b12391d6"},"downloads":-1,"filename":"complete-2.0rc1.tar.gz","has_sig":false,"md5_digest":"eaef8d536ee4faedb15b5b6e77c84378","packagetype":"sdist","python_version":"source","requires_python":null,"size":87563,"upload_time":"2018-09-24T20:19:18","upload_time_iso_8601":"2018-09-24T20:19:18.508231Z","url":"https://files.pythonhosted.org/packages/1f/f3/31351b897f110ac00cb5a13b0ea4ca5f272602ee0db46f0f810d8a1baa69/complete-2.0rc1.tar.gz","yanked":false,"yanked_reason":null}],"2.1":[{"comment_text":"","digests":{"md5":"4881924e6245797451bd27c644d5b569","sha256":"62aed6f2d1779a7f934454a897c61a1bc704f7f04d6fb533e6bfe54c17d22224"},"downloads":-1,"filename":"complete-2.1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"4881924e6245797451bd27c644d5b569","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":57198,"upload_time":"2018-10-03T11:05:00","upload_time_iso_8601":"2018-10-03T11:05:00.909986Z","url":"https://files.pythonhosted.org/packages/27/23/91f3184390c709be6ce9419f2dd4e6b5bb2fd1b7a06579ea1625f8898d0b/complete-2.1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"cc6b38495b180f0d1d852dd1794fef42","sha256":"528aaeff5b12aa7c1fe5909111fd7b46c14bf25f1a5ed759d6b422d45f10b40c"},"downloads":-1,"filename":"complete-2.1.tar.gz","has_sig":false,"md5_digest":"cc6b38495b180f0d1d852dd1794fef42","packagetype":"sdist","python_version":"source","requires_python":null,"size":91935,"upload_time":"2018-10-03T11:05:03","upload_time_iso_8601":"2018-10-03T11:05:03.023229Z","url":"https://files.pythonhosted.org/packages/65/57/604980e6223c09e8b428c128d480ae516548f7d2bd8ad580e72f2b5dfc09/complete-2.1.tar.gz","yanked":false,"yanked_reason":null}],"2.1b1":[{"comment_text":"","digests":{"md5":"3fb0bd3f94cce78d9fdf8838c8aa0313","sha256":"d58675740ed81b6f1397f3adb1fa30cc92d47a96a9e000c0b636772a20ea307c"},"downloads":-1,"filename":"complete-2.1b1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"3fb0bd3f94cce78d9fdf8838c8aa0313","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":56695,"upload_time":"2018-10-01T19:58:52","upload_time_iso_8601":"2018-10-01T19:58:52.535754Z","url":"https://files.pythonhosted.org/packages/a6/5a/ca949df720ed4e8754c61137c0f073452954ff32b2f50791f4a4fdc0e77a/complete-2.1b1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"a300ab4179a1b744a80d69d02997a453","sha256":"3e7180b09ad27439c295d022be6ef45e8aa3bdd00681b9556afbc8617cb31917"},"downloads":-1,"filename":"complete-2.1b1.tar.gz","has_sig":false,"md5_digest":"a300ab4179a1b744a80d69d02997a453","packagetype":"sdist","python_version":"source","requires_python":null,"size":90728,"upload_time":"2018-10-01T19:58:54","upload_time_iso_8601":"2018-10-01T19:58:54.596506Z","url":"https://files.pythonhosted.org/packages/46/69/30fa7d24f48e0f77fcd4f3c811dc72127b997bb8149488123890bfb42baf/complete-2.1b1.tar.gz","yanked":false,"yanked_reason":null}],"2.2":[{"comment_text":"","digests":{"md5":"381ae9b409adc01109fb4f48a15353e6","sha256":"35e688c7295ce389641bce37cd92fc3482d7d67874a67a9d0cc61a9ccc0f20ac"},"downloads":-1,"filename":"complete-2.2-py2.py3-none-any.whl","has_sig":false,"md5_digest":"381ae9b409adc01109fb4f48a15353e6","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":57344,"upload_time":"2018-10-12T16:21:34","upload_time_iso_8601":"2018-10-12T16:21:34.840456Z","url":"https://files.pythonhosted.org/packages/15/b5/3e4434f95cf68e1acb398dd9c596d07cc881c2fa45ab78659689615989d1/complete-2.2-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"4c5811798dbb0164e075e4026d410633","sha256":"aad7b8b00a49eeef7cd69757b2c548b88d4d7c584b95ac4ea9c0f08e167bc5a0"},"downloads":-1,"filename":"complete-2.2.tar.gz","has_sig":false,"md5_digest":"4c5811798dbb0164e075e4026d410633","packagetype":"sdist","python_version":"source","requires_python":null,"size":92135,"upload_time":"2018-10-12T16:21:36","upload_time_iso_8601":"2018-10-12T16:21:36.870458Z","url":"https://files.pythonhosted.org/packages/46/20/041ec087b8288b86aa71cea6f89c9aed9fc931d543d620d383556f646366/complete-2.2.tar.gz","yanked":false,"yanked_reason":null}],"2.3":[{"comment_text":"","digests":{"md5":"44c51fb9141dc9c2cb2d4a4bdbcc1acb","sha256":"4930ac8c01c5b5c94ae24ee5d26e42d537a3281291b06928529bb97cc11844e8"},"downloads":-1,"filename":"complete-2.3-py2.py3-none-any.whl","has_sig":false,"md5_digest":"44c51fb9141dc9c2cb2d4a4bdbcc1acb","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":59466,"upload_time":"2019-02-27T11:49:48","upload_time_iso_8601":"2019-02-27T11:49:48.609906Z","url":"https://files.pythonhosted.org/packages/ff/37/ed2d26f5f196b6db5a7a53de1ab96c961ab0c0e42d7677ea302cc817ed7f/complete-2.3-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"0510299dba157df2cbfea40426465bf5","sha256":"2727f62ab590c1fc834e86033988a76a86a67f5a78196584049b7a722bd94466"},"downloads":-1,"filename":"complete-2.3.tar.gz","has_sig":false,"md5_digest":"0510299dba157df2cbfea40426465bf5","packagetype":"sdist","python_version":"source","requires_python":null,"size":95947,"upload_time":"2019-02-27T11:49:51","upload_time_iso_8601":"2019-02-27T11:49:51.261375Z","url":"https://files.pythonhosted.org/packages/e6/1c/3dd86bec66fad3a21ac9d093610f83f6e20ad1d835ebf4079af53e65ed6b/complete-2.3.tar.gz","yanked":false,"yanked_reason":null}],"2.4":[{"comment_text":"","digests":{"md5":"d676c724f7e13838edd8a7dcc8cbe3e7","sha256":"213c2f4c39ed71811a9ceeec1c8bdf2e673e5527261ea11708b3acfa6c2bdb00"},"downloads":-1,"filename":"complete-2.4-py2.py3-none-any.whl","has_sig":false,"md5_digest":"d676c724f7e13838edd8a7dcc8cbe3e7","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":57463,"upload_time":"2019-10-09T09:41:14","upload_time_iso_8601":"2019-10-09T09:41:14.821316Z","url":"https://files.pythonhosted.org/packages/36/95/7d9271ae617b6c448fa244b347e4fd43ed5ad1bb35cea282f1c0fa82ea2b/complete-2.4-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"1728f65d01c5cb1f3c3838d489a1569d","sha256":"05bea20ce1f2c9678683bcce0c3ba9981f87d92b709d190e018bcbf047eccf63"},"downloads":-1,"filename":"complete-2.4.tar.gz","has_sig":false,"md5_digest":"1728f65d01c5cb1f3c3838d489a1569d","packagetype":"sdist","python_version":"source","requires_python":null,"size":94826,"upload_time":"2019-10-09T09:41:17","upload_time_iso_8601":"2019-10-09T09:41:17.883138Z","url":"https://files.pythonhosted.org/packages/76/36/a3e41bf7c01f1110d7b5589ca74d2927d3736a5b43ee63053faf3483b991/complete-2.4.tar.gz","yanked":false,"yanked_reason":null}]},"urls":[{"comment_text":"","digests":{"md5":"ee08b66cae5d77364f6deee252638b3b","sha256":"462c76c145403eb5e9a8358dc402a53b264ab202ebabf83cdc660ed2cf72c89b"},"downloads":-1,"filename":"complete-1.0.dev1.tar.gz","has_sig":false,"md5_digest":"ee08b66cae5d77364f6deee252638b3b","packagetype":"sdist","python_version":"source","requires_python":null,"size":39258,"upload_time":"2018-06-15T12:24:36","upload_time_iso_8601":"2018-06-15T12:24:36.191454Z","url":"https://files.pythonhosted.org/packages/ab/4a/cab33ec593f433b7cded3cec85d1f7c900261fd503bd894e16782f7c0d09/complete-1.0.dev1.tar.gz","yanked":false,"yanked_reason":null}]} +{"info":{"author":"Logilab and Shoobx Team","author_email":"dev@shoobx.com","bugtrack_url":null,"classifiers":["Development Status :: 3 - Alpha","Framework :: ZODB","Intended Audience :: Developers","Natural Language :: English","Operating System :: OS Independent","Programming Language :: Python","Programming Language :: Python :: 2","Programming Language :: Python :: 2.7","Programming Language :: Python :: 3","Programming Language :: Python :: 3.5","Programming Language :: Python :: 3.6"],"description":"========\nXML Diff\n========\n\n.. image:: https://travis-ci.org/Shoobx/complete.png?branch=master\n :target: https://travis-ci.org/Shoobx/complete\n\n.. image:: https://coveralls.io/repos/github/Shoobx/complete/badge.svg?branch=master\n :target: https://coveralls.io/github/Shoobx/complete?branch=master\n\n.. image:: https://img.shields.io/pypi/v/complete.svg\n :target: https://pypi.python.org/pypi/complete\n\n.. image:: https://img.shields.io/pypi/pyversions/complete.svg\n :target: https://pypi.python.org/pypi/complete/\n\n\ncomplete is a utility for extracting differences between two xml files. It\nreturns a set of primitives to apply on source tree to obtain the destination\ntree.\n\nThe implementation is based on `Change detection in hierarchically structured\ninformation`, by S. Chawathe, A. Rajaraman, H. Garcia-Molina and J. Widom,\nStanford University, 1996\n\nInstallation\n------------\n\nTo install the latest release:\n\n.. code:: bash\n\n pip install complete\n\n\nTo install the development version:\n\n.. code:: bash\n\n git clone https://github.com/Shoobx/complete.git\n cd complete\n virtualenv ./.venv\n ./.venv/bin/python setup.py install\n\nThen to compare two given XML files:\n\n.. code:: bash\n\n ./.venv/bin/complete 1.xml 2.xml\n\n\nRunning tests\n-------------\n\nTo run the test suite for all python versions:\n\n.. code:: bash\n\n tox\n\n\nCHANGES\n=======\n\n1.1.0 (2018-06-15)\n------------------\n\n- When using namespaces, the returned xpaths are now in the form ns_prefix:tag\n instead of the earlier {ns_uri}tag, which isn't correct xpaths.\n\n\n1.0.0 (2018-04-13)\n------------------\n\n- pep8 cleanup, added flake8 checking to tox\n\n\n1.0.0a6 (2018-04-12)\n--------------------\n\n- Removed encoding, because python does unicode just fine\n\n- Switched on namespace handling for XML input\n\n\n1.0.0a5 (2018-04-11)\n--------------------\n\n- Brownbag release to make up for bad previous ones.\n\n1.0.0a2 (2018-04-11)\n--------------------\n\n- Temporary disabling of encoding text (hopefully permanent).\n\n- Reverted bug fix: Do not remove newlines from text while parsing\n the XML.\n\n\n1.0.0a1 (2018-04-10)\n--------------------\n\n- Bug: Fix a off-by-one issue with `insert-after` action.\n\n- Bug: Do not rename children on text node updates.\n\n- Bug: Text moves were not recorded as part of the fmes edit script.\n\n- Remove only partially implemented xmlrev script.\n\n- Removed support for xupdate, which never became a standard.\n\n- Removed deprecated ezs optional algorithm.\n\n- Removed support for Debian and RedHat packaging.\n\n- Removed Windows support\n\n- LOTS of package cleanup (setup.py, MANIFEST, proper console script, etc)\n\n- tests moved to py.test and cleaned, added tox, travis, coverage support\n\n\n0.6.10 (2010-08-27)\n-------------------\n\n- apply Daiki Ueno patch: fails when comparing minimal trees on i386\n\n\n0.6.9 (2009-04-02)\n------------------\n\n- Fixed complete-xmlrev compilation error\n\n\n0.6.8 (2006-06-15)\n------------------\n\n- Fixed 64bit cleanness issues\n\n\n0.6.7 (2005-05-04)\n------------------\n\n- WARNING: complete is no longer a logilab subpackage. Users may have to\n manually remove the old logilab/complete directory.\n\n- fixed debian bug #275750, also reported by Christopher R Newman on the\n xml-projects mailing list\n\n- fixed --profile option, wrap function from maplookup when profiling so that\n they appear in the profile information\n\n- fixed setup.py to ignore the xmlrev shell script under windows platforms\n\n- small improvements (remove recursion in object.py, minor enhancement in\n mydifflib.py, rewrite of lcs4 in C)\n\n\n0.6.6 (2004-12-23)\n------------------\n\n- Applied patch by Bastian Kleineidam which\n\n - corrects the typo in ML_DIR\n\n - fixes the TMPFILE_XSLT/TMPFILE_XSL typo\n\n - makes sure the files are XML or SGML files, else prints an error\n\n - adds various missing quotes around filenames which could have\n spaces or begin with a hyphen\n\n - fixes typos in the usage() function\n\n Thanks a lot, Bastian.\n\n- Fixed some problems in the xmlrev.xslt stylesheet\n\n- Fixed problems in xmlrev caused by the exit status of complete when\n successful\n\n- Added a man page for complete and xmlrev\n\n\n0.6.5 (2004-09-02)\n------------------\n\n- xmlrev bugfixes\n\n- Fixed packaging problems (missing xsl stylesheets and MANIFEST file)\n\n\n0.6.4 (2003-10-02)\n------------------\n\n- fix recursive mode\n\n- rewrite regression test, add test for the recursive mode\n\n- add --help option to xlmrev\n\n- packaging fixes\n\n- turn API.txt and HELP.txt to correct ReST\n\n\n0.6.3 (2002-11-06)\n------------------\n\n- fix wrong xpath for attributes\n\n- fix bug with temporary duplicate attribute node\n\n- fix for xupdate\n\n- fix ext_pes option bug\n\n- update changelog to new format\n\n\n0.6.2 (2002-09-23)\n------------------\n\n- return number of differences on command line\n\n- reintroduce misc.list_print which caused recursive mode\n to fail\n\n- use psyco if available (http://psyco.sf.net)\n\n- little changes in C extension\n\n\n0.6.1 (2002-08-29)\n------------------\n\n- fix packaging problems\n\n\n0.6.0 (2002-08-23)\n------------------\n\n- change of the internal representation\n\n- remove support for the EZS algorithm (no more maintened\n for the moment)\n\n- add command line options to parse html and to control\n entities inclusion and output encoding\n\n- fixing coalescing text nodes bug\n\n- many other bugs fixes\n\n- great speed improvement\n\n\n0.5.3 (2002-01-31)\n------------------\n\n- add __init__.py in \"logilab\" directory\n\n\n0.5.2 (2001-10-29)\n------------------\n\n- bug fixes in xupdate formatting and in the dom interface.\n\n\n0.5.1 (2001-09-07)\n------------------\n\n- Fast Match / Edit Scritp algorithm, now fully usable\n\n- fixes Unicode problem\n\n\n0.2.1 (2001-08-10)\n------------------\n\n- bug fixes, optimizations for ezs algorithm\n\n\n0.1.1 (2001-08-04)\n------------------\n\n- original revision","description_content_type":"","docs_url":null,"download_url":"","downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"home_page":"https://github.com/Shoobx/complete","keywords":"xml,diff,complete,tree 2 tree","license-expression":"LGPL","maintainer":"","maintainer_email":"","name":"complete","package_url":"https://pypi.org/project/complete/","platform":"","project_url":"https://pypi.org/project/complete/","project_urls":{"Homepage":"https://github.com/Shoobx/complete"},"release_url":"https://pypi.org/project/complete/1.1.0/","requires_dist":null,"requires_python": ">=2.7","summary":"Tree 2 tree correction between xml documents. Extract differences between two xml files. It returns a set of primitives to apply on source tree to obtain the destination tree.","version":"1.1.0","yanked":false,"yanked_reason":null},"last_serial":5948813,"releases":{"0.6.10":[{"comment_text":"","digests":{"md5":"9ab11f838f7e0b1dcadc94bb81eb1539","sha256":"edeb13ae5d2cc1de72b58bc989f10dc006db5acc19d42f4b05309b14bc99bbe0"},"downloads":-1,"filename":"complete-0.6.10.zip","has_sig":false,"md5_digest":"9ab11f838f7e0b1dcadc94bb81eb1539","packagetype":"sdist","python_version":"source","requires_python":null,"size":44447,"upload_time":"2015-04-02T16:07:22","upload_time_iso_8601":"2015-04-02T16:07:22.450850Z","url":"https://files.pythonhosted.org/packages/01/5c/e10197f6b699497bbbb32baa73a7b85b4be4f0117c8dae3d525ff5451987/complete-0.6.10.zip","yanked":false,"yanked_reason":null}],"0.6.4":[{"comment_text":"","digests":{"md5":"65c173fb5adcdce1008ab3a9a39ae6bd","sha256":"678042e7d8fc249f6ae78bc5f26847b1da7705ec887dce63e01a2348bfab0664"},"downloads":-1,"filename":"complete-0.6.4.tar.gz","has_sig":false,"md5_digest":"65c173fb5adcdce1008ab3a9a39ae6bd","packagetype":"sdist","python_version":"source","requires_python":null,"size":28540,"upload_time":"2015-04-02T15:37:18","upload_time_iso_8601":"2015-04-02T15:37:18.791051Z","url":"https://files.pythonhosted.org/packages/78/be/25e4c3b6e295205adcc102c72d3c182366e9adc0a42c9c641b14a710dc3c/complete-0.6.4.tar.gz","yanked":false,"yanked_reason":null}],"0.6.6":[{"comment_text":"","digests":{"md5":"b4461fcf85dbcef9d2dc3f712445f1ae","sha256":"a1d4f928c955d072afcf86bc5d67e1d901a4825fc028f05a30e957693f8369ec"},"downloads":-1,"filename":"complete-0.6.6.tar.gz","has_sig":false,"md5_digest":"b4461fcf85dbcef9d2dc3f712445f1ae","packagetype":"sdist","python_version":"source","requires_python":null,"size":30589,"upload_time":"2015-04-02T15:34:58","upload_time_iso_8601":"2015-04-02T15:34:58.448942Z","url":"https://files.pythonhosted.org/packages/b0/77/222543b1aa3687f4ded31948019a61ffc0e6e1713e5c7116d32a434663ff/complete-0.6.6.tar.gz","yanked":false,"yanked_reason":null}],"0.6.7":[{"comment_text":"","digests":{"md5":"495afb1b4e059af9099ca90cd619e0d3","sha256":"8fa3dce3f000ed5ac97023b4a2d4e0d4aa3cd1db3885c6d0480e63617a5073d9"},"downloads":-1,"filename":"complete-0.6.7.zip","has_sig":false,"md5_digest":"495afb1b4e059af9099ca90cd619e0d3","packagetype":"sdist","python_version":"source","requires_python":null,"size":44737,"upload_time":"2015-04-02T16:06:22","upload_time_iso_8601":"2015-04-02T16:06:22.122578Z","url":"https://files.pythonhosted.org/packages/2a/c1/1a009a72a524974480996e572cdad6eee1fb9c5c51c291111b1b8e240623/complete-0.6.7.zip","yanked":false,"yanked_reason":null}],"0.6.8":[{"comment_text":"","digests":{"md5":"02a6192bb2bb4196077fcf66aaf67129","sha256":"7e2d1e13a991dc490d0ea70b13528b78f6a7e44d0317536d1f54950a90ae8525"},"downloads":-1,"filename":"complete-0.6.8.zip","has_sig":false,"md5_digest":"02a6192bb2bb4196077fcf66aaf67129","packagetype":"sdist","python_version":"source","requires_python":null,"size":44988,"upload_time":"2015-04-02T16:06:45","upload_time_iso_8601":"2015-04-02T16:06:45.550281Z","url":"https://files.pythonhosted.org/packages/01/eb/4395ef31da4129fc1ade423d0728aee0865f85b1dc5cc58d083d805cd220/complete-0.6.8.zip","yanked":false,"yanked_reason":null}],"0.6.9":[{"comment_text":"","digests":{"md5":"57b6b3f0e3c21163744b1abede196749","sha256":"7ea0451330d9e57633c0ae389cedcf30efc3925ab0c2763563bb28c558b47981"},"downloads":-1,"filename":"complete-0.6.9.zip","has_sig":false,"md5_digest":"57b6b3f0e3c21163744b1abede196749","packagetype":"sdist","python_version":"source","requires_python":null,"size":44179,"upload_time":"2015-04-02T16:07:07","upload_time_iso_8601":"2015-04-02T16:07:07.388937Z","url":"https://files.pythonhosted.org/packages/bb/db/df65a8a5a09aa6fd391c2e52edf3d4ab75396f961e36a425aadc3a50dc75/complete-0.6.9.zip","yanked":false,"yanked_reason":null}],"1.0.0":[{"comment_text":"","digests":{"md5":"3d7c20a999963b8f3d8651bb8a18f577","sha256":"81394752277427af4e3783846716a4780d4100724628668e6153eb3c899fa01d"},"downloads":-1,"filename":"complete-1.0.0.tar.gz","has_sig":false,"md5_digest":"3d7c20a999963b8f3d8651bb8a18f577","packagetype":"sdist","python_version":"source","requires_python":null,"size":39642,"upload_time":"2018-04-13T13:22:51","upload_time_iso_8601":"2018-04-13T13:22:51.840164Z","url":"https://files.pythonhosted.org/packages/6b/d3/376909843cdb112f0ce50173fbcfcd9204efde27e1797de99706c95cde55/complete-1.0.0.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a1":[{"comment_text":"","digests":{"md5":"669a8bc7160c3de61b6f8a9f4005ae53","sha256":"e882b8fb68e07c5e483b9b1395b41324ca46632c5875c61e725e8bdb9a0b97e9"},"downloads":-1,"filename":"complete-1.0.0a1.tar.gz","has_sig":false,"md5_digest":"669a8bc7160c3de61b6f8a9f4005ae53","packagetype":"sdist","python_version":"source","requires_python":null,"size":37723,"upload_time":"2018-04-10T13:22:53","upload_time_iso_8601":"2018-04-10T13:22:53.589597Z","url":"https://files.pythonhosted.org/packages/5d/f3/b3de2527aaeb8d5d8c4c9c8b49fa5fb9b30463c3568fdb04c4891010d3d4/complete-1.0.0a1.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a2":[{"comment_text":"","digests":{"md5":"8ca07eb4bbb09cce4b07b64e56c7d7d6","sha256":"8bb91f15ecd2a0efa11bcaf8be013df16629af7ab0c909ca4ff1330d0aacae73"},"downloads":-1,"filename":"complete-1.0.0a2.tar.gz","has_sig":false,"md5_digest":"8ca07eb4bbb09cce4b07b64e56c7d7d6","packagetype":"sdist","python_version":"source","requires_python":null,"size":36836,"upload_time":"2018-04-10T15:48:43","upload_time_iso_8601":"2018-04-10T15:48:43.658000Z","url":"https://files.pythonhosted.org/packages/8b/22/88e32c7999c85a6aa97b2c36e4b366bd5e6631f03c14988124b93564bdb1/complete-1.0.0a2.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a3.dev0":[{"comment_text":"","digests":{"md5":"65c035101c40d30dc0838acaa135ec41","sha256":"79a4955f3585dc8f05d07494a2a35ad41fe26192e831b6fbd062188226bd42f6"},"downloads":-1,"filename":"complete-1.0.0a3.dev0.tar.gz","has_sig":false,"md5_digest":"65c035101c40d30dc0838acaa135ec41","packagetype":"sdist","python_version":"source","requires_python":null,"size":36846,"upload_time":"2018-04-10T15:56:31","upload_time_iso_8601":"2018-04-10T15:56:31.070448Z","url":"https://files.pythonhosted.org/packages/80/70/df743f6777b4a43689aaa6dfad3f8ca96c041d4f959607cb067e7903019a/complete-1.0.0a3.dev0.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a4.dev0":[{"comment_text":"","digests":{"md5":"f5034450dcd8df3abe0759a62251bc65","sha256":"2ee7f0f4a86e68e537d77e6922ebc79bb3bb1b316c3a7c2e50bc8f61774ca506"},"downloads":-1,"filename":"complete-1.0.0a4.dev0.tar.gz","has_sig":false,"md5_digest":"f5034450dcd8df3abe0759a62251bc65","packagetype":"sdist","python_version":"source","requires_python":null,"size":36899,"upload_time":"2018-04-10T16:02:36","upload_time_iso_8601":"2018-04-10T16:02:36.150652Z","url":"https://files.pythonhosted.org/packages/02/80/86b6e9a5fc6267e1e945734228073a42f40398ff78537d1e17c0f6f11b93/complete-1.0.0a4.dev0.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a5":[{"comment_text":"","digests":{"md5":"19bbc60ebbf9d290069649f1e24e7d55","sha256":"5a38bc0e7a5daf89c0a960643fcdabbd8b24b0913c94ff1ef0de06321b4bdbbd"},"downloads":-1,"filename":"complete-1.0.0a5.tar.gz","has_sig":false,"md5_digest":"19bbc60ebbf9d290069649f1e24e7d55","packagetype":"sdist","python_version":"source","requires_python":null,"size":37417,"upload_time":"2018-04-11T13:02:26","upload_time_iso_8601":"2018-04-11T13:02:26.425291Z","url":"https://files.pythonhosted.org/packages/0a/e7/d0889a2a39d214ca883873fa1547eda0672b1ef2bd6d7f5d1bb8bb1e3351/complete-1.0.0a5.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a6":[{"comment_text":"","digests":{"md5":"1785ee59afdf2ff4c634276f33767302","sha256":"02a3ce91aa39a42146e7dae240cb16a6da529f8c725e53939afe1df736ea4475"},"downloads":-1,"filename":"complete-1.0.0a6.tar.gz","has_sig":false,"md5_digest":"1785ee59afdf2ff4c634276f33767302","packagetype":"sdist","python_version":"source","requires_python":null,"size":38050,"upload_time":"2018-04-12T12:48:52","upload_time_iso_8601":"2018-04-12T12:48:52.719912Z","url":"https://files.pythonhosted.org/packages/4e/b4/50f65f8e77da28899e31945ae5719535e9a9e67bea961ecfba77c39399fe/complete-1.0.0a6.tar.gz","yanked":false,"yanked_reason":null}],"1.1.0":[{"comment_text":"","digests":{"md5":"ee08b66cae5d77364f6deee252638b3b","sha256":"462c76c145403eb5e9a8358dc402a53b264ab202ebabf83cdc660ed2cf72c89b"},"downloads":-1,"filename":"complete-1.0.dev1.tar.gz","has_sig":false,"md5_digest":"ee08b66cae5d77364f6deee252638b3b","packagetype":"sdist","python_version":"source","requires_python":null,"size":39258,"upload_time":"2018-06-15T12:24:36","upload_time_iso_8601":"2018-06-15T12:24:36.191454Z","url":"https://files.pythonhosted.org/packages/ab/4a/cab33ec593f433b7cded3cec85d1f7c900261fd503bd894e16782f7c0d09/complete-1.0.dev1.tar.gz","yanked":false,"yanked_reason":null}],"1.1.1":[{"comment_text":"","digests":{"md5":"dd17d5d775b9433df64513265502cdb8","sha256":"b8dc6c36a3499e752cf5b5d2704d961be37fcf2ea5be2e4187572e18f674d053"},"downloads":-1,"filename":"complete-1.1.1.tar.gz","has_sig":false,"md5_digest":"dd17d5d775b9433df64513265502cdb8","packagetype":"sdist","python_version":"source","requires_python":null,"size":39523,"upload_time":"2018-06-20T18:38:14","upload_time_iso_8601":"2018-06-20T18:38:14.221847Z","url":"https://files.pythonhosted.org/packages/35/cc/ae210f70dac681a7566f25f43740a0cbdc53a77e23684f7b9b1d71e4d918/complete-1.1.1.tar.gz","yanked":false,"yanked_reason":null}],"2.0":[{"comment_text":"","digests":{"md5":"dacf1d5fe5e94e0b656e8985e2e81faa","sha256":"31f83117e38d78670e1994e7160b1463adb04ffa34ff267700b2ca61bada5e57"},"downloads":-1,"filename":"complete-2.0-py2.py3-none-any.whl","has_sig":false,"md5_digest":"dacf1d5fe5e94e0b656e8985e2e81faa","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":55479,"upload_time":"2018-09-25T07:05:49","upload_time_iso_8601":"2018-09-25T07:05:49.423913Z","url":"https://files.pythonhosted.org/packages/ce/dc/7caf3ada02afcab68c7330c207f0b05b54dd5ef6ac96fb18e2fa85f1038a/complete-2.0-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"982c288a450198b414363a9388631c26","sha256":"221733cfbfafff1d90756834f1f2bc8a3cfa097a57ad6ab11e83db308c1b486e"},"downloads":-1,"filename":"complete-2.0.tar.gz","has_sig":false,"md5_digest":"982c288a450198b414363a9388631c26","packagetype":"sdist","python_version":"source","requires_python":null,"size":86965,"upload_time":"2018-09-25T07:05:51","upload_time_iso_8601":"2018-09-25T07:05:51.301648Z","url":"https://files.pythonhosted.org/packages/41/80/5c6ef6fc423fb7902cc7fe6d5784545559d11dc157b1dbe50de59192bd08/complete-2.0.tar.gz","yanked":false,"yanked_reason":null}],"2.0b1":[{"comment_text":"","digests":{"md5":"0003996e2c8b62541743c80f1367925f","sha256":"9a15649073d795f2a742f0c46f44ebc732727ae201cf92e796ffb7b31eaebf59"},"downloads":-1,"filename":"complete-2.0b1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"0003996e2c8b62541743c80f1367925f","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":53036,"upload_time":"2018-09-03T12:49:24","upload_time_iso_8601":"2018-09-03T12:49:24.676079Z","url":"https://files.pythonhosted.org/packages/65/35/0820f8a49e5812dbcdb2aee651f19df8bf7c67d379e449699ed4ede5df51/complete-2.0b1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"5f60ea9a2bc0109d1828ae753c332ed2","sha256":"173ad39aa5c95e9deeb563e94174c944ffd814441b2587f5645f0119c192220c"},"downloads":-1,"filename":"complete-2.0b1.tar.gz","has_sig":false,"md5_digest":"5f60ea9a2bc0109d1828ae753c332ed2","packagetype":"sdist","python_version":"source","requires_python":null,"size":70341,"upload_time":"2018-09-03T12:49:27","upload_time_iso_8601":"2018-09-03T12:49:27.080969Z","url":"https://files.pythonhosted.org/packages/54/45/006a8a3068f261dfbb543e4a4905ea1495a9deaa6b880af881e7112fe590/complete-2.0b1.tar.gz","yanked":false,"yanked_reason":null}],"2.0b2":[{"comment_text":"","digests":{"md5":"e2431ed70e7c940e72b065b3c2fc4d66","sha256":"0ea1eabb994a10160cdeb3b3a93e80e09191bc971ddf10213ec4618e890a79a1"},"downloads":-1,"filename":"complete-2.0b2-py2.py3-none-any.whl","has_sig":false,"md5_digest":"e2431ed70e7c940e72b065b3c2fc4d66","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":53862,"upload_time":"2018-09-06T14:41:53","upload_time_iso_8601":"2018-09-06T14:41:53.157424Z","url":"https://files.pythonhosted.org/packages/10/db/b5e9c37e5e66e86b5f87220db5e18d4f6b79f5b57037fcb251ca1116d9d0/complete-2.0b2-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"0199ffb374b5378b5b3f03b23008ee31","sha256":"4d95ddf206f4c440fcace43c0a9f4d26fb704b1fd5087c6c9b903e04a008bf05"},"downloads":-1,"filename":"complete-2.0b2.tar.gz","has_sig":false,"md5_digest":"0199ffb374b5378b5b3f03b23008ee31","packagetype":"sdist","python_version":"source","requires_python":null,"size":85397,"upload_time":"2018-09-06T14:41:55","upload_time_iso_8601":"2018-09-06T14:41:55.709235Z","url":"https://files.pythonhosted.org/packages/e6/ec/5c92cdd29d86e05b0938c56af54e06962a822689c5c70b5fa4eba727d799/complete-2.0b2.tar.gz","yanked":false,"yanked_reason":null}],"2.0b3":[{"comment_text":"","digests":{"md5":"810ffd544e5de013bbc0ad49258d017c","sha256":"a7c2efc42f6b2e47af36d905521a0e97c5f469d3d8c4243b87db9281c056c5de"},"downloads":-1,"filename":"complete-2.0b3-py2.py3-none-any.whl","has_sig":false,"md5_digest":"810ffd544e5de013bbc0ad49258d017c","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":54110,"upload_time":"2018-09-11T19:48:45","upload_time_iso_8601":"2018-09-11T19:48:45.470945Z","url":"https://files.pythonhosted.org/packages/0a/0c/fa7d475d3be9c376bb46fa7d0db1f70ee7cbce8d7328de750d06c72c1f8a/complete-2.0b3-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"116600a8ebf81955bbdde9716dcb8a70","sha256":"77e234d9e9e2f274e9bd86380f2fd0bb58ad3071278ab4c9df801ff54caead01"},"downloads":-1,"filename":"complete-2.0b3.tar.gz","has_sig":false,"md5_digest":"116600a8ebf81955bbdde9716dcb8a70","packagetype":"sdist","python_version":"source","requires_python":null,"size":85573,"upload_time":"2018-09-11T19:48:47","upload_time_iso_8601":"2018-09-11T19:48:47.787379Z","url":"https://files.pythonhosted.org/packages/a7/2d/22d2e86b795f85aa80676c7668a5e375b44d3239664d72b0b1c32e7291ed/complete-2.0b3.tar.gz","yanked":false,"yanked_reason":null}],"2.0b4":[{"comment_text":"","digests":{"md5":"e238130940a149c44927e30216bc0f74","sha256":"88ba6fb733677579a9bd6b1b1e99808d47d17ba20038075f8731ee12d40efb41"},"downloads":-1,"filename":"complete-2.0b4-py2.py3-none-any.whl","has_sig":false,"md5_digest":"e238130940a149c44927e30216bc0f74","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":54166,"upload_time":"2018-09-12T12:58:38","upload_time_iso_8601":"2018-09-12T12:58:38.798219Z","url":"https://files.pythonhosted.org/packages/f2/99/891565815619416a411b6a43dca887c575035c0dd2da374e7c87df5d9263/complete-2.0b4-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"14f8369167928c97140e55af20438d95","sha256":"63bdf6265dac0213e71001b03c81171b7fb1bf2fab06cd0ea8c9d2ffd4c0cd0c"},"downloads":-1,"filename":"complete-2.0b4.tar.gz","has_sig":false,"md5_digest":"14f8369167928c97140e55af20438d95","packagetype":"sdist","python_version":"source","requires_python":null,"size":87043,"upload_time":"2018-09-12T12:58:41","upload_time_iso_8601":"2018-09-12T12:58:41.083128Z","url":"https://files.pythonhosted.org/packages/eb/ca/24ff95b2da5a77f167e2113b6861f879f04629a5b1834ca221b790b36481/complete-2.0b4.tar.gz","yanked":false,"yanked_reason":null}],"2.0b5":[{"comment_text":"","digests":{"md5":"8660d1531dda6f79bd48a49fbf3d5888","sha256":"01b00bcf84e8f9692215ef1f3d4cb350d076add26b70f29e4f31ac85e5f66a28"},"downloads":-1,"filename":"complete-2.0b5-py2.py3-none-any.whl","has_sig":false,"md5_digest":"8660d1531dda6f79bd48a49fbf3d5888","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":54240,"upload_time":"2018-09-13T19:12:05","upload_time_iso_8601":"2018-09-13T19:12:05.832300Z","url":"https://files.pythonhosted.org/packages/ac/69/3a53d4aeb73dc20d140bdab53036572706e4cfc063d58d43cb73264b86ed/complete-2.0b5-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"c8a97de8115ab5ee9c0d5e1f70ed9060","sha256":"308bff344aed37aa04aae552e9d54d0d8ba625386bd5b8817282ef75c66de407"},"downloads":-1,"filename":"complete-2.0b5.tar.gz","has_sig":false,"md5_digest":"c8a97de8115ab5ee9c0d5e1f70ed9060","packagetype":"sdist","python_version":"source","requires_python":null,"size":87210,"upload_time":"2018-09-13T19:12:09","upload_time_iso_8601":"2018-09-13T19:12:09.026887Z","url":"https://files.pythonhosted.org/packages/55/83/cbd13288511af6f8c55ea340935cf17b244c485f6f776214fbc6bc41d7c4/complete-2.0b5.tar.gz","yanked":false,"yanked_reason":null}],"2.0b6":[{"comment_text":"","digests":{"md5":"6e64c656bd3b495bc2d9f357c6f8901f","sha256":"9e6d41a6ebfe71a90a288ea7f3a5c8efa2b7fe313c3e1aa026fa97f345e07745"},"downloads":-1,"filename":"complete-2.0b6-py2.py3-none-any.whl","has_sig":false,"md5_digest":"6e64c656bd3b495bc2d9f357c6f8901f","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":55113,"upload_time":"2018-09-13T19:14:55","upload_time_iso_8601":"2018-09-13T19:14:55.356378Z","url":"https://files.pythonhosted.org/packages/aa/39/115e4fa64aebf2c57a71c29c53740504f658b1447650a1473edb0c3ebb00/complete-2.0b6-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"5c2d8fafcf16fd0fa9220da91205f696","sha256":"fa4cb24351e678dd56c9b46350cd54b1f39209e03517532a5e8fa8db9adbda56"},"downloads":-1,"filename":"complete-2.0b6.tar.gz","has_sig":false,"md5_digest":"5c2d8fafcf16fd0fa9220da91205f696","packagetype":"sdist","python_version":"source","requires_python":null,"size":88205,"upload_time":"2018-09-13T19:14:58","upload_time_iso_8601":"2018-09-13T19:14:58.034821Z","url":"https://files.pythonhosted.org/packages/2c/59/c47466d69a1293a7e1587a8af04d15c875415967527e9be6b4241723d96b/complete-2.0b6.tar.gz","yanked":false,"yanked_reason":null}],"2.0b7":[{"comment_text":"","digests":{"md5":"7c1beaed9081f6dca0cce01ab4957c6b","sha256":"8dbfdf93bd9d91c07ab5494d316c6083c3d71f673fd66ba497ce2b6a2011dd18"},"downloads":-1,"filename":"complete-2.0b7-py2.py3-none-any.whl","has_sig":false,"md5_digest":"7c1beaed9081f6dca0cce01ab4957c6b","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":56045,"upload_time":"2018-09-14T13:31:42","upload_time_iso_8601":"2018-09-14T13:31:42.874915Z","url":"https://files.pythonhosted.org/packages/bc/6c/e71ecb88f2308d7528c687ce2982fa4dba85cdaa9ac46604af59d844ace7/complete-2.0b7-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"bdc27299ae90128c3bbee2f833be2171","sha256":"e6ba88f2c2b8329d62b3aadfcb30dd782497087759673257e0f688df728a1694"},"downloads":-1,"filename":"complete-2.0b7.tar.gz","has_sig":false,"md5_digest":"bdc27299ae90128c3bbee2f833be2171","packagetype":"sdist","python_version":"source","requires_python":null,"size":89558,"upload_time":"2018-09-14T13:31:45","upload_time_iso_8601":"2018-09-14T13:31:45.969375Z","url":"https://files.pythonhosted.org/packages/4b/7a/349fde975c7b6b7331da2542d0e2cf9f0b7d30054bb5684d94d90f48e12b/complete-2.0b7.tar.gz","yanked":false,"yanked_reason":null}],"2.0rc1":[{"comment_text":"","digests":{"md5":"ff0d9ff18f6ad6b6951aa7f933782280","sha256":"582270dc62708af5ee2b649abde1ee1d6f0374f642f6b0b8771e203f2d4922ed"},"downloads":-1,"filename":"complete-2.0rc1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"ff0d9ff18f6ad6b6951aa7f933782280","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":56194,"upload_time":"2018-09-24T20:19:16","upload_time_iso_8601":"2018-09-24T20:19:16.377778Z","url":"https://files.pythonhosted.org/packages/e6/55/1c65e555d1e952644428da85662ef9c0448becfae5487ab321048b57d339/complete-2.0rc1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"eaef8d536ee4faedb15b5b6e77c84378","sha256":"e6044d6cf2bb283ad72e7fae3200d275950cbdc7245751c62c51c3a6b12391d6"},"downloads":-1,"filename":"complete-2.0rc1.tar.gz","has_sig":false,"md5_digest":"eaef8d536ee4faedb15b5b6e77c84378","packagetype":"sdist","python_version":"source","requires_python":null,"size":87563,"upload_time":"2018-09-24T20:19:18","upload_time_iso_8601":"2018-09-24T20:19:18.508231Z","url":"https://files.pythonhosted.org/packages/1f/f3/31351b897f110ac00cb5a13b0ea4ca5f272602ee0db46f0f810d8a1baa69/complete-2.0rc1.tar.gz","yanked":false,"yanked_reason":null}],"2.1":[{"comment_text":"","digests":{"md5":"4881924e6245797451bd27c644d5b569","sha256":"62aed6f2d1779a7f934454a897c61a1bc704f7f04d6fb533e6bfe54c17d22224"},"downloads":-1,"filename":"complete-2.1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"4881924e6245797451bd27c644d5b569","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":57198,"upload_time":"2018-10-03T11:05:00","upload_time_iso_8601":"2018-10-03T11:05:00.909986Z","url":"https://files.pythonhosted.org/packages/27/23/91f3184390c709be6ce9419f2dd4e6b5bb2fd1b7a06579ea1625f8898d0b/complete-2.1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"cc6b38495b180f0d1d852dd1794fef42","sha256":"528aaeff5b12aa7c1fe5909111fd7b46c14bf25f1a5ed759d6b422d45f10b40c"},"downloads":-1,"filename":"complete-2.1.tar.gz","has_sig":false,"md5_digest":"cc6b38495b180f0d1d852dd1794fef42","packagetype":"sdist","python_version":"source","requires_python":null,"size":91935,"upload_time":"2018-10-03T11:05:03","upload_time_iso_8601":"2018-10-03T11:05:03.023229Z","url":"https://files.pythonhosted.org/packages/65/57/604980e6223c09e8b428c128d480ae516548f7d2bd8ad580e72f2b5dfc09/complete-2.1.tar.gz","yanked":false,"yanked_reason":null}],"2.1b1":[{"comment_text":"","digests":{"md5":"3fb0bd3f94cce78d9fdf8838c8aa0313","sha256":"d58675740ed81b6f1397f3adb1fa30cc92d47a96a9e000c0b636772a20ea307c"},"downloads":-1,"filename":"complete-2.1b1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"3fb0bd3f94cce78d9fdf8838c8aa0313","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":56695,"upload_time":"2018-10-01T19:58:52","upload_time_iso_8601":"2018-10-01T19:58:52.535754Z","url":"https://files.pythonhosted.org/packages/a6/5a/ca949df720ed4e8754c61137c0f073452954ff32b2f50791f4a4fdc0e77a/complete-2.1b1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"a300ab4179a1b744a80d69d02997a453","sha256":"3e7180b09ad27439c295d022be6ef45e8aa3bdd00681b9556afbc8617cb31917"},"downloads":-1,"filename":"complete-2.1b1.tar.gz","has_sig":false,"md5_digest":"a300ab4179a1b744a80d69d02997a453","packagetype":"sdist","python_version":"source","requires_python":null,"size":90728,"upload_time":"2018-10-01T19:58:54","upload_time_iso_8601":"2018-10-01T19:58:54.596506Z","url":"https://files.pythonhosted.org/packages/46/69/30fa7d24f48e0f77fcd4f3c811dc72127b997bb8149488123890bfb42baf/complete-2.1b1.tar.gz","yanked":false,"yanked_reason":null}],"2.2":[{"comment_text":"","digests":{"md5":"381ae9b409adc01109fb4f48a15353e6","sha256":"35e688c7295ce389641bce37cd92fc3482d7d67874a67a9d0cc61a9ccc0f20ac"},"downloads":-1,"filename":"complete-2.2-py2.py3-none-any.whl","has_sig":false,"md5_digest":"381ae9b409adc01109fb4f48a15353e6","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":57344,"upload_time":"2018-10-12T16:21:34","upload_time_iso_8601":"2018-10-12T16:21:34.840456Z","url":"https://files.pythonhosted.org/packages/15/b5/3e4434f95cf68e1acb398dd9c596d07cc881c2fa45ab78659689615989d1/complete-2.2-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"4c5811798dbb0164e075e4026d410633","sha256":"aad7b8b00a49eeef7cd69757b2c548b88d4d7c584b95ac4ea9c0f08e167bc5a0"},"downloads":-1,"filename":"complete-2.2.tar.gz","has_sig":false,"md5_digest":"4c5811798dbb0164e075e4026d410633","packagetype":"sdist","python_version":"source","requires_python":null,"size":92135,"upload_time":"2018-10-12T16:21:36","upload_time_iso_8601":"2018-10-12T16:21:36.870458Z","url":"https://files.pythonhosted.org/packages/46/20/041ec087b8288b86aa71cea6f89c9aed9fc931d543d620d383556f646366/complete-2.2.tar.gz","yanked":false,"yanked_reason":null}],"2.3":[{"comment_text":"","digests":{"md5":"44c51fb9141dc9c2cb2d4a4bdbcc1acb","sha256":"4930ac8c01c5b5c94ae24ee5d26e42d537a3281291b06928529bb97cc11844e8"},"downloads":-1,"filename":"complete-2.3-py2.py3-none-any.whl","has_sig":false,"md5_digest":"44c51fb9141dc9c2cb2d4a4bdbcc1acb","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":59466,"upload_time":"2019-02-27T11:49:48","upload_time_iso_8601":"2019-02-27T11:49:48.609906Z","url":"https://files.pythonhosted.org/packages/ff/37/ed2d26f5f196b6db5a7a53de1ab96c961ab0c0e42d7677ea302cc817ed7f/complete-2.3-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"0510299dba157df2cbfea40426465bf5","sha256":"2727f62ab590c1fc834e86033988a76a86a67f5a78196584049b7a722bd94466"},"downloads":-1,"filename":"complete-2.3.tar.gz","has_sig":false,"md5_digest":"0510299dba157df2cbfea40426465bf5","packagetype":"sdist","python_version":"source","requires_python":null,"size":95947,"upload_time":"2019-02-27T11:49:51","upload_time_iso_8601":"2019-02-27T11:49:51.261375Z","url":"https://files.pythonhosted.org/packages/e6/1c/3dd86bec66fad3a21ac9d093610f83f6e20ad1d835ebf4079af53e65ed6b/complete-2.3.tar.gz","yanked":false,"yanked_reason":null}],"2.4":[{"comment_text":"","digests":{"md5":"d676c724f7e13838edd8a7dcc8cbe3e7","sha256":"213c2f4c39ed71811a9ceeec1c8bdf2e673e5527261ea11708b3acfa6c2bdb00"},"downloads":-1,"filename":"complete-2.4-py2.py3-none-any.whl","has_sig":false,"md5_digest":"d676c724f7e13838edd8a7dcc8cbe3e7","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":57463,"upload_time":"2019-10-09T09:41:14","upload_time_iso_8601":"2019-10-09T09:41:14.821316Z","url":"https://files.pythonhosted.org/packages/36/95/7d9271ae617b6c448fa244b347e4fd43ed5ad1bb35cea282f1c0fa82ea2b/complete-2.4-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"1728f65d01c5cb1f3c3838d489a1569d","sha256":"05bea20ce1f2c9678683bcce0c3ba9981f87d92b709d190e018bcbf047eccf63"},"downloads":-1,"filename":"complete-2.4.tar.gz","has_sig":false,"md5_digest":"1728f65d01c5cb1f3c3838d489a1569d","packagetype":"sdist","python_version":"source","requires_python":null,"size":94826,"upload_time":"2019-10-09T09:41:17","upload_time_iso_8601":"2019-10-09T09:41:17.883138Z","url":"https://files.pythonhosted.org/packages/76/36/a3e41bf7c01f1110d7b5589ca74d2927d3736a5b43ee63053faf3483b991/complete-2.4.tar.gz","yanked":false,"yanked_reason":null}]},"urls":[{"comment_text":"","digests":{"md5":"ee08b66cae5d77364f6deee252638b3b","sha256":"462c76c145403eb5e9a8358dc402a53b264ab202ebabf83cdc660ed2cf72c89b"},"downloads":-1,"filename":"complete-1.0.dev1.tar.gz","has_sig":false,"md5_digest":"ee08b66cae5d77364f6deee252638b3b","packagetype":"sdist","python_version":"source","requires_python":null,"size":39258,"upload_time":"2018-06-15T12:24:36","upload_time_iso_8601":"2018-06-15T12:24:36.191454Z","url":"https://files.pythonhosted.org/packages/ab/4a/cab33ec593f433b7cded3cec85d1f7c900261fd503bd894e16782f7c0d09/complete-1.0.dev1.tar.gz","yanked":false,"yanked_reason":null}]} diff --git a/pyroma/tests.py b/pyroma/tests.py index 4f12141..062d70c 100644 --- a/pyroma/tests.py +++ b/pyroma/tests.py @@ -24,6 +24,7 @@ "version": "1.0.dev1", "summary": "This is a test package for pyroma.", "description": long_description, + "description-content-type": "text/plain", "classifier": [ "Development Status :: 6 - Mature", "Operating System :: OS Independent", @@ -32,29 +33,18 @@ "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", - "License :: OSI Approved :: MIT License", - ], - "dynamic": [ - "author", - "author-email", - "classifier", - "description", - "home-page", - "keywords", - "license", - "project-url", - "requires-dist", - "requires-python", - "summary", ], + "dynamic": "license-file", "keywords": "pypi,quality,example", - "author": "Lennart Regebro", - "author-email": "regebro@gmail.com", - "home-page": "https://github.com/regebro/pyroma", - "project-url": "Source Code, https://github.com/regebro/pyroma", + "author-email": "Lennart Regebro ", + "project-url": [ + "repository, https://github.com/regebro/pyroma", + "homepage, https://github.com/regebro/pyroma", + ], "requires-dist": "zope.event", "requires-python": ">=2.6", - "license": "MIT", + "license-expression": "MIT", + "license-file": "LICENSE.txt", } @@ -124,7 +114,8 @@ def _get_file_rating(self, dirname, skip_tests=None): return rate(data, skip_tests) def test_complete(self): - rating = self._get_file_rating("complete") + data = projectdata.get_data(TESTDATA_DIR / "complete") + rating = rate(data) # Should have a perfect score self.assertEqual(rating, (10, [])) @@ -133,7 +124,7 @@ def test_setup_config(self): self.assertEqual( rating, ( - 9, + 8, [ "Your project does not have a pyproject.toml file, which is highly recommended.\n" "You probably want to create one with the following configuration:\n\n" @@ -141,6 +132,8 @@ def test_setup_config(self): ' requires = ["setuptools>=42"]\n' ' build-backend = "setuptools.build_meta"\n' "See https://packaging.python.org for more information on how to package your project.", + "Using license classifiers is deprecated in favour of the license-expression field.", + "The metadata field 'home-page' is deprecated; use 'project-url' instead.", ], ), ) @@ -168,6 +161,7 @@ def test_only_config(self): "See https://packaging.python.org for more information on how to package your project.", "Specifying both a License-Expression and license classifiers is ambiguous, " "deprecated, and may be rejected by package indices.", + "The metadata field 'home-page' is deprecated; use 'project-url' instead.", "Check-manifest returned errors", ], ), @@ -187,23 +181,11 @@ def test_skip_tests(self): def test_pep517(self): rating = self._get_file_rating("pep517") - self.assertEqual( - rating, - ( - 10, - [], - ), - ) + self.assertGreaterEqual(rating[0], 9) def test_pep621(self): rating = self._get_file_rating("pep621") - self.assertEqual( - rating, - ( - 10, - [], - ), - ) + self.assertGreaterEqual(rating[0], 9) def test_minimal(self): rating = self._get_file_rating("minimal") @@ -223,7 +205,9 @@ def test_minimal(self): "Your package does not have author-email data.", "Your package should have a 'url' field with a link to the project home page, or a " "'project_urls' field, with a dictionary of links, or both.", - "Your package does neither have a license field nor any license classifiers.", + "You should specify a license for your package with the 'License-Expression' field. See " + "https://packaging.python.org/en/latest/specifications/core-metadata/#license-expression " + "for more information.", "Specifying a development status in the classifiers gives users " "a hint of how stable your software is. See https://pypi.org/classifiers/", "Check-manifest returned errors", @@ -256,7 +240,9 @@ def test_lacking(self): "Your package does not have author-email data.", "Your package should have a 'url' field with a link to the project home page, or a " "'project_urls' field, with a dictionary of links, or both.", - "Your package does neither have a license field nor any license classifiers.", + "You should specify a license for your package with the 'License-Expression' field. See " + "https://packaging.python.org/en/latest/specifications/core-metadata/#license-expression " + "for more information.", "Your Description is not valid ReST: \n:1: (WARNING/2) Inline literal " "start-string without end-string.", "Specifying a development status in the classifiers gives users " @@ -271,7 +257,7 @@ def test_custom_test(self): self.assertEqual( rating, ( - 3, + 4, [ "The package's Summary should be longer than 10 characters.", "The package's Description is quite short.", @@ -284,7 +270,9 @@ def test_custom_test(self): "Your package does not have author-email data.", "Your package should have a 'url' field with a link to the project home page, or a " "'project_urls' field, with a dictionary of links, or both.", - "Your package does neither have a license field nor any license classifiers.", + "You should specify a license for your package with the 'License-Expression' field. See " + "https://packaging.python.org/en/latest/specifications/core-metadata/#license-expression " + "for more information.", "Specifying a development status in the classifiers gives users " "a hint of how stable your software is. See https://pypi.org/classifiers/", ], @@ -293,7 +281,7 @@ def test_custom_test(self): def test_private_classifier(self): rating = self._get_file_rating("private_classifier") - self.assertEqual(rating, (10, [])) + self.assertGreaterEqual(rating[0], 9) def test_invalid_pyproject(self): # Use valid metadata so we exercise the rating check itself, @@ -318,6 +306,34 @@ def test_markdown(self): rating = rate(testdata) self.assertEqual(rating, (9, ["The package's Description is quite short."])) + def test_deprecated_metadata_field_warning(self): + testdata = COMPLETE.copy() + testdata.pop("project-url", None) + testdata["home-page"] = "https://example.com" + + rating = rate(testdata) + + self.assertTrue( + any("The metadata field 'home-page' is deprecated; use 'project-url' instead." in msg for msg in rating[1]) + ) + + def test_deprecated_license_warning_respects_metadata_version(self): + old_metadata = COMPLETE.copy() + old_metadata["metadata-version"] = "2.3" + old_metadata["license"] = "MIT" + old_metadata.pop("license-expression", None) + + old_rating = rate(old_metadata) + self.assertFalse(any("The metadata field 'license' is deprecated" in msg for msg in old_rating[1])) + + new_metadata = COMPLETE.copy() + new_metadata["metadata-version"] = "2.4" + new_metadata["license"] = "MIT" + new_metadata.pop("license-expression", None) + + new_rating = rate(new_metadata) + self.assertTrue(any("The metadata field 'license' is deprecated" in msg for msg in new_rating[1])) + class PyPITest(unittest.TestCase): maxDiff = None @@ -398,6 +414,7 @@ def test_complete(self): data = projectdata.get_data(directory) del data["_path"] # This changes, so I just ignore it + self.assertEqual(data, COMPLETE)