{ "info": { "author": "Jace Browning", "author_email": "jacebrowning@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Topic :: Software Development :: Libraries" ], "description": "Comparable\n==========\n\n| |Build Status|\n| |Coverage Status|\n| |Scrutinizer Code Quality|\n| |PyPI Version|\n| |PyPI Downloads|\n\nComparable is a library providing abstract base classes that enable\nsubclasses to be compared for \"equality\" and \"similarity\" based on their\nattributes.\n\nGetting Started\n===============\n\nRequirements\n------------\n\n- Python 3.3+\n\nInstallation\n------------\n\nComparable can be installed with pip:\n\n::\n\n $ pip install comparable\n\nor directly from the source code:\n\n::\n\n $ git clone https://github.com/jacebrowning/comparable.git\n $ cd comparable\n $ python setup.py install\n\nBasic Usage\n===========\n\nAfter installation, abstract base classes can be imported from the\npackage:\n\n::\n\n $ python\n >>> import comparable\n >>> comparable.__version__\n >>> from comparable import SimpleComparable, CompoundComparable\n\nComparable classes use ``==`` as the operation for \"equality\" and ``%``\nas the operation for \"similarity\". They may also override a\n``threshold`` attribute to set the \"similarity\" ratio.\n\nSimple Comparables\n------------------\n\nSimple comparable types must override the ``equality`` and\n``similarity`` methods to return bool and Similarity objects,\nrespectively. See ``comparable.simple`` for examples.\n\nCompound Comparables\n--------------------\n\nCompound comparable types contain multiple simple comparable types. They\nmust override the ``attributes`` property to define which attributes\nshould be used for comparison. See ``comparable.compund`` for examples.\n\nExamples\n========\n\nComparable includes many generic comparable types:\n\n::\n\n $ python\n >>> from comparable.simple import Number, Text, TextEnum, TextTitle\n >>> from comparable.compound import Group\n\nA basic script might look similar to the following:\n\n::\n\n from comparable.simple import TextTitle\n from comparable import tools\n\n base = TextTitle(\"The Cat and the Hat\")\n items = [TextTitle(\"cat & hat\"), TextTitle(\"cat & the hat\")]\n\n print(\"Equality: {}\".format(base == items[0]))\n print(\"Similarity: {}\".format(base % items[0]))\n\n print(\"Duplicates: {}\".format(tools.duplicates(base, items)))\n\nFor Contributors\n================\n\nRequirements\n------------\n\n- Make:\n\n - Windows: http://cygwin.com/install.html\n - Mac: https://developer.apple.com/xcode\n - Linux: http://www.gnu.org/software/make (likely already installed)\n\n- virtualenv: https://pypi.python.org/pypi/virtualenv#installation\n- Pandoc: http://johnmacfarlane.net/pandoc/installing.html\n- Graphviz: http://www.graphviz.org/Download.php\n\nInstallation\n------------\n\nCreate a virtualenv:\n\n::\n\n $ make env\n\nRun the tests:\n\n::\n\n $ make test\n $ make tests # includes integration tests\n\nBuild the documentation:\n\n::\n\n $ make doc\n\nRun static analysis:\n\n::\n\n $ make pep8\n $ make pep257\n $ make pylint\n $ make check # includes all checks\n\nPrepare a release:\n\n::\n\n $ make dist # dry run\n $ make upload\n\n.. |Build Status| image:: http://img.shields.io/travis/jacebrowning/comparable/master.svg\n :target: https://travis-ci.org/jacebrowning/comparable\n.. |Coverage Status| image:: http://img.shields.io/coveralls/jacebrowning/comparable/master.svg\n :target: https://coveralls.io/r/jacebrowning/comparable\n.. |Scrutinizer Code Quality| image:: http://img.shields.io/scrutinizer/g/jacebrowning/comparable.svg\n :target: https://scrutinizer-ci.com/g/jacebrowning/comparable/?branch=master\n.. |PyPI Version| image:: http://img.shields.io/pypi/v/Comparable.svg\n :target: https://pypi.python.org/pypi/Comparable\n.. |PyPI Downloads| image:: http://img.shields.io/pypi/dm/Comparable.svg\n :target: https://pypi.python.org/pypi/Comparable\n\nChangelog\n=========\n\n1.0 (2015/03/19)\n----------------\n\n- Freeze public API.\n\n0.2.1 (2014/05/17)\n------------------\n\n- Added __bool__ to the base simple type.\n\n0.2 (2014/05/12)\n----------------\n\n- Added similarity assertions to the TestCase class.\n\n0.1.1 (2014/03/03)\n------------------\n\n- README cleanup.\n\n0.1 (2014/03/03)\n----------------\n\n- Code cleanup.\n\n0.0.3 (2013/10/13)\n------------------\n\n- Comparable.threshold is now an attribute (instead of property)\n- Fixed package-level imports\n\n0.0.2 (2013/10/04)\n------------------\n\n- Replaced Comparable.equality_list/similarity_dict with attributes\n- Replaced Comparable.similarity_threshold with threshold\n\n0.0.1 (2013/10/02)\n------------------\n\n- Initial release of Comparable.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jacebrowning/comparable", "keywords": null, "license": "LGPL", "maintainer": null, "maintainer_email": null, "name": "Comparable", "package_url": "https://pypi.org/project/Comparable/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/Comparable/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/jacebrowning/comparable" }, "release_url": "https://pypi.org/project/Comparable/1.0/", "requires_dist": null, "requires_python": null, "summary": "Base class to enable objects to be compared for similarity.", "version": "1.0" }, "last_serial": 1468955, "releases": { "0.0.0": [], "0.0.1": [ { "comment_text": "", "digests": { "md5": "de5946aaacba7a2ff61c22070a2a8b4f", "sha256": "5d72eeb26e4564fab015799bf8885166feac61a0c15d0d899cae6b9ea2881084" }, "downloads": -1, "filename": "Comparable-0.0.1.tar.gz", "has_sig": false, "md5_digest": "de5946aaacba7a2ff61c22070a2a8b4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13763, "upload_time": "2013-10-03T00:49:23", "url": "https://files.pythonhosted.org/packages/b7/4e/fca5478cca7c95147d7fdb601c79a047aeedce004e8ba3dc288afeb37719/Comparable-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "18beb247dad970bc2b749a024d16fa7c", "sha256": "394c9ed96838350642ae1dbb55607a20412e387750d065b20caf2687322697f5" }, "downloads": -1, "filename": "Comparable-0.0.2.tar.gz", "has_sig": false, "md5_digest": "18beb247dad970bc2b749a024d16fa7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13771, "upload_time": "2013-10-04T21:55:51", "url": "https://files.pythonhosted.org/packages/9a/82/5ff1c7c54b381ab3a8e8271426fd49dd682a0e361738d7f6746bb2ba1744/Comparable-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "3be5f44f86d7fd94b259620be789286c", "sha256": "6b7d302b478250ff5864f575187d0f617ab45192d6b2982d52ce276b3ba786f8" }, "downloads": -1, "filename": "Comparable-0.0.3.tar.gz", "has_sig": false, "md5_digest": "3be5f44f86d7fd94b259620be789286c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13882, "upload_time": "2013-10-14T00:13:01", "url": "https://files.pythonhosted.org/packages/03/17/eaa318410b10de50e48c78ea2f3a7e296f9271bb7ac50a035008a30091f8/Comparable-0.0.3.tar.gz" } ], "0.1": [ { "comment_text": "", "digests": { "md5": "d81a4473b76d0bf3a331250aed9c84ab", "sha256": "814ddf10b49633e904fdd977c7abe5907b286e1200f29eb8351c13d9552c40d7" }, "downloads": -1, "filename": "Comparable-0.1-py33-none-any.whl", "has_sig": false, "md5_digest": "d81a4473b76d0bf3a331250aed9c84ab", "packagetype": "bdist_wheel", "python_version": "3.3", "requires_python": null, "size": 17713, "upload_time": "2014-03-04T03:39:19", "url": "https://files.pythonhosted.org/packages/ad/b2/d306a83eedfa44492b38077f09f4689bebf39b8eda5896563ae97d6f40ef/Comparable-0.1-py33-none-any.whl" }, { "comment_text": "", "digests": { "md5": "de4b18ab1e66483fec3e69e43d3481e8", "sha256": "01486e5a3c00d26e3c9e9d48feb5e9748c39d3168402a35573edd33f13a9f54d" }, "downloads": -1, "filename": "Comparable-0.1.tar.gz", "has_sig": false, "md5_digest": "de4b18ab1e66483fec3e69e43d3481e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14781, "upload_time": "2014-03-04T03:39:16", "url": "https://files.pythonhosted.org/packages/59/90/7fcabeedfa814d8037523cb7b2ce18b2882c48d2109dc671bc4367bad30c/Comparable-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "3abb4c62ec2c652cd6c75dc00e6f448d", "sha256": "a29b12a272f7c609c8baa3bf98314c67fada91a63451a668e83531e416b4f374" }, "downloads": -1, "filename": "Comparable-0.1.1-py33-none-any.whl", "has_sig": false, "md5_digest": "3abb4c62ec2c652cd6c75dc00e6f448d", "packagetype": "bdist_wheel", "python_version": "3.3", "requires_python": null, "size": 17731, "upload_time": "2014-03-04T03:46:38", "url": "https://files.pythonhosted.org/packages/15/3d/5896dea8c21bf34f0f129d5cc18bda64bd7448599a152d8b40f2868dcc3c/Comparable-0.1.1-py33-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c137406be60cd6c3468d212a1f5a8526", "sha256": "13dc19716e33dd4261021bca0cb86e8ca29664cefe350bf2a4516dfb2d6b3dd9" }, "downloads": -1, "filename": "Comparable-0.1.1.tar.gz", "has_sig": false, "md5_digest": "c137406be60cd6c3468d212a1f5a8526", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14744, "upload_time": "2014-03-04T03:46:35", "url": "https://files.pythonhosted.org/packages/56/fe/b7c1420c3abf862202144752eca8c40f05b85578a2978102e245eafa7fdc/Comparable-0.1.1.tar.gz" } ], "0.1.1-rc.1": [ { "comment_text": "", "digests": { "md5": "c63662d66376be8d89d4355c41f5831d", "sha256": "0c86d1d643d002b8d67a39925a74a32febc0fd3d340486ede363ac0837bf230d" }, "downloads": -1, "filename": "Comparable-0.1.1_rc.1-py33-none-any.whl", "has_sig": false, "md5_digest": "c63662d66376be8d89d4355c41f5831d", "packagetype": "bdist_wheel", "python_version": "3.3", "requires_python": null, "size": 17815, "upload_time": "2014-03-04T03:45:43", "url": "https://files.pythonhosted.org/packages/42/26/11471f05d50750f653c84d44ffa301cb244b873cc7d7414f3ff02fb1285a/Comparable-0.1.1_rc.1-py33-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e63457db64966fef55f6b0ca7c863155", "sha256": "4aaa3206fb98b7174d9e2a2dd13cf33de2bc0a9f8d256bac4aba202548b55b9c" }, "downloads": -1, "filename": "Comparable-0.1.1-rc.1.tar.gz", "has_sig": false, "md5_digest": "e63457db64966fef55f6b0ca7c863155", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14759, "upload_time": "2014-03-04T03:45:41", "url": "https://files.pythonhosted.org/packages/39/3c/9a516eb93dac40cbc027b927fe1ecd2d344110a34569822f5379fe93e2ef/Comparable-0.1.1-rc.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "7cf8b8b17928c6bb002c296e20bf60c3", "sha256": "08295b41fee8bfd773065c82fed0b8015cd35a5e53c85f83dc6dc6e9a96cfd30" }, "downloads": -1, "filename": "Comparable-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7cf8b8b17928c6bb002c296e20bf60c3", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 17878, "upload_time": "2014-05-13T01:41:05", "url": "https://files.pythonhosted.org/packages/84/0e/98491158865d4b24f05c5dc49bc6c6b455ca6964e9aba186b7bff2ea20a8/Comparable-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f56bfe2e40dfcc3a006d0ab5e28fcc60", "sha256": "d3f8c20d9150ce4ada667cb3bf9ea886ca556507374b51d1105c5cef5037e46f" }, "downloads": -1, "filename": "Comparable-0.2.tar.gz", "has_sig": false, "md5_digest": "f56bfe2e40dfcc3a006d0ab5e28fcc60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14937, "upload_time": "2014-05-13T01:41:01", "url": "https://files.pythonhosted.org/packages/00/05/de8f1001fa7d4c1a125f09aa11ed6cbfc96104f4f3c3d5b1c0d0cfcfd851/Comparable-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "288eac1e12676a9873c6fbe782b0dbd0", "sha256": "67189b0cc3fdd853b2ec7c488d0d8f37a33c2fa6fe94c69a995e54cf733334f9" }, "downloads": -1, "filename": "Comparable-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "288eac1e12676a9873c6fbe782b0dbd0", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 17994, "upload_time": "2014-05-18T01:43:22", "url": "https://files.pythonhosted.org/packages/34/89/38638a74f1c43cdfd533e7396986aec716be2f5a9dbe4f9f0e8a76a26c59/Comparable-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8a63c63011c2684b9d876f1295bb65c7", "sha256": "5517959db99f73efc5dc576a4498f8e4c642166e8c751c28ae6d1ff453acbe86" }, "downloads": -1, "filename": "Comparable-0.2.1.tar.gz", "has_sig": false, "md5_digest": "8a63c63011c2684b9d876f1295bb65c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14966, "upload_time": "2014-05-18T01:43:19", "url": "https://files.pythonhosted.org/packages/0a/08/c8fec5d1e35f6d071490ec817f9559b96d21416b7b6fb73e0ee2655e57b8/Comparable-0.2.1.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "ee7757583edb57a4e5e04e4711b52fca", "sha256": "a878472831d741c5f4ea1276badf7eddcc33a8c2d9eca43d57890eaf3ebe5227" }, "downloads": -1, "filename": "Comparable-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ee7757583edb57a4e5e04e4711b52fca", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 18085, "upload_time": "2015-03-19T18:34:38", "url": "https://files.pythonhosted.org/packages/e9/cd/fd7fad01488f035d77079397488470189e224cb8a0d8e6505cd392880e8a/Comparable-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "908071356ee206f5e1a5e5e60f64ea95", "sha256": "78dc02f2018a391c77b770228b2c7a78dddd07ba806162aa93fb43fed6c37be8" }, "downloads": -1, "filename": "Comparable-1.0.tar.gz", "has_sig": false, "md5_digest": "908071356ee206f5e1a5e5e60f64ea95", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15298, "upload_time": "2015-03-19T18:34:34", "url": "https://files.pythonhosted.org/packages/98/58/c488f7128aaa1d830153907681eb721c11ded59793d7ed22d1d082dc27e0/Comparable-1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ee7757583edb57a4e5e04e4711b52fca", "sha256": "a878472831d741c5f4ea1276badf7eddcc33a8c2d9eca43d57890eaf3ebe5227" }, "downloads": -1, "filename": "Comparable-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ee7757583edb57a4e5e04e4711b52fca", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 18085, "upload_time": "2015-03-19T18:34:38", "url": "https://files.pythonhosted.org/packages/e9/cd/fd7fad01488f035d77079397488470189e224cb8a0d8e6505cd392880e8a/Comparable-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "908071356ee206f5e1a5e5e60f64ea95", "sha256": "78dc02f2018a391c77b770228b2c7a78dddd07ba806162aa93fb43fed6c37be8" }, "downloads": -1, "filename": "Comparable-1.0.tar.gz", "has_sig": false, "md5_digest": "908071356ee206f5e1a5e5e60f64ea95", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15298, "upload_time": "2015-03-19T18:34:34", "url": "https://files.pythonhosted.org/packages/98/58/c488f7128aaa1d830153907681eb721c11ded59793d7ed22d1d082dc27e0/Comparable-1.0.tar.gz" } ] }