Hello community,

here is the log from the commit of package python-warlock for openSUSE:Factory 
checked in at 2019-05-27 08:38:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-warlock (Old)
 and      /work/SRC/openSUSE:Factory/.python-warlock.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-warlock"

Mon May 27 08:38:26 2019 rev:16 rq:705263 version:1.3.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-warlock/python-warlock.changes    
2018-12-24 11:46:01.497205846 +0100
+++ /work/SRC/openSUSE:Factory/.python-warlock.new.5148/python-warlock.changes  
2019-05-27 08:38:26.203069773 +0200
@@ -1,0 +2,8 @@
+Fri May 24 13:56:28 UTC 2019 - Tomáš Chvátal <[email protected]>
+
+- Update to 1.3.2:
+  * README failed parsing in non utf-8 environments. Enforce encoding. #37
+  * Move unittests to tests/ directory
+  * Upstream no longer ships tests on pypi
+
+-------------------------------------------------------------------

Old:
----
  warlock-1.3.0.tar.gz

New:
----
  warlock-1.3.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-warlock.spec ++++++
--- /var/tmp/diff_new_pack.wDJXvX/_old  2019-05-27 08:38:26.787069546 +0200
+++ /var/tmp/diff_new_pack.wDJXvX/_new  2019-05-27 08:38:26.787069546 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-warlock
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,25 +18,24 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-warlock
-Version:        1.3.0
+Version:        1.3.3
 Release:        0
 Summary:        Python object model built on top of JSON schema
 License:        Apache-2.0
 Group:          Development/Languages/Python
-Url:            http://github.com/bcwaldon/warlock
+URL:            http://github.com/bcwaldon/warlock
 Source:         
https://files.pythonhosted.org/packages/source/w/warlock/warlock-%{version}.tar.gz
-BuildRequires:  %{python_module jsonpatch}
-BuildRequires:  %{python_module jsonschema}
+BuildRequires:  %{python_module jsonpatch >= 0.7}
+BuildRequires:  %{python_module jsonschema >= 0.10}
 BuildRequires:  %{python_module pytest}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  %{python_module six}
+BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
 Requires:       python-jsonpatch >= 0.7
 Requires:       python-jsonschema >= 0.10
 Requires:       python-six
-BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildArch:      noarch
-
 %python_subpackages
 
 %description
@@ -44,20 +43,21 @@
 
 %prep
 %setup -q -n warlock-%{version}
-sed -i "s|jsonschema>=0.7,<1|jsonschema>=0.7,<=1|" requirements.txt
 
 %build
 %python_build
 
 %install
 %python_install
+%python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
-%python_exec setup.py test
+# tests are not distributed by upstream and github does not
+# use setuptools anymore
 
 %files %{python_files}
-%defattr(-,root,root,-)
 %doc README.md
+%license LICENSE
 %{python_sitelib}/*
 
 %changelog

++++++ warlock-1.3.0.tar.gz -> warlock-1.3.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/LICENSE new/warlock-1.3.3/LICENSE
--- old/warlock-1.3.0/LICENSE   1970-01-01 01:00:00.000000000 +0100
+++ new/warlock-1.3.3/LICENSE   2019-05-20 08:26:22.000000000 +0200
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/LICENSE.txt 
new/warlock-1.3.3/LICENSE.txt
--- old/warlock-1.3.0/LICENSE.txt       2016-06-25 19:38:50.000000000 +0200
+++ new/warlock-1.3.3/LICENSE.txt       1970-01-01 01:00:00.000000000 +0100
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/MANIFEST.in 
new/warlock-1.3.3/MANIFEST.in
--- old/warlock-1.3.0/MANIFEST.in       2016-06-25 19:38:50.000000000 +0200
+++ new/warlock-1.3.3/MANIFEST.in       2019-05-20 11:40:24.000000000 +0200
@@ -1,4 +1,4 @@
-include LICENSE.txt
+include LICENSE
 include README.md
 include requirements.txt
 include setup.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/PKG-INFO new/warlock-1.3.3/PKG-INFO
--- old/warlock-1.3.0/PKG-INFO  2016-06-25 20:13:37.000000000 +0200
+++ new/warlock-1.3.3/PKG-INFO  2019-05-20 12:10:52.000000000 +0200
@@ -1,10 +1,105 @@
-Metadata-Version: 1.0
+Metadata-Version: 2.1
 Name: warlock
-Version: 1.3.0
+Version: 1.3.3
 Summary: Python object model built on JSON schema and JSON patch.
 Home-page: http://github.com/bcwaldon/warlock
 Author: Brian Waldon
 Author-email: [email protected]
-License: UNKNOWN
-Description: UNKNOWN
+Maintainer: Jan Willhaus
+Maintainer-email: [email protected]
+License: Apache-2.0
+Description: # Warlock — self-validating Python objects using JSON schema
+        
+        [![PyPI](https://img.shields.io/pypi/v/warlock.svg)][warlock]
+        [![PyPI - Python 
Version](https://img.shields.io/pypi/pyversions/warlock.svg)][warlock]
+        [![PyPI - 
Downloads](https://img.shields.io/pypi/dw/warlock.svg)][pypistats]
+        
+        [![Build 
Status](https://travis-ci.org/bcwaldon/warlock.svg?branch=master)][ci-builds]
+        [![Coverage 
Status](https://coveralls.io/repos/github/bcwaldon/warlock/badge.svg?branch=master)][coveralls]
+        
+        ## Installation
+        
+        Warlock is [available on PyPI][warlock]:
+        
+        ```shell
+        pip install warlock
+        ```
+        
+        ## Usage
+        
+        1) Create your schema
+        
+            ```python
+            >>> schema = {
+                'name': 'Country',
+                'properties': {
+                    'name': {'type': 'string'},
+                    'abbreviation': {'type': 'string'},
+                    'population': {'type': 'integer'},
+                },
+                'additionalProperties': False,
+            }
+            ```
+        
+        2) Create a model
+        
+            ```python
+            >>> import warlock
+            >>> Country = warlock.model_factory(schema)
+            ```
+        
+        3) Create an object using your model
+        
+            ```python
+            >>> sweden = Country(name='Sweden', abbreviation='SE')
+            ```
+        
+        4) Let the object validate itself
+        
+            ```python
+            >>> sweden.name = 5
+            Traceback (most recent call last):
+            File "<stdin>", line 1, in <module>
+            File "warlock/core.py", line 53, in __setattr__
+                raise InvalidOperation(msg)
+            warlock.core.InvalidOperation: Unable to set 'name' to '5'
+        
+            >>> sweden.overlord = 'Bears'
+            Traceback (most recent call last):
+              File "<stdin>", line 1, in <module>
+              File "warlock/core.py", line 53, in __setattr__
+                raise InvalidOperation(msg)
+            warlock.core.InvalidOperation: Unable to set 'overlord' to 'Bears'
+            ```
+        
+        5) Generate a [JSON Patch 
document](http://tools.ietf.org/html/draft-ietf-appsawg-json-patch) to track 
changes
+        
+            ```python
+            >>> sweden.population=9453000
+            >>> sweden.patch
+            '[{"path": "/population", "value": 9453000, "op": "add"}]'
+            ```
+        
+        [warlock]: https://pypi.org/project/warlock/
+        [pip]: https://pip.pypa.io/en/stable/
+        [ci-builds]: https://travis-ci.org/bcwaldon/warlock
+        [coveralls]: https://coveralls.io/github/bcwaldon/warlock?branch=master
+        [pypistats]: https://pypistats.org/packages/warlock
+        
+Keywords: JSON schema,JSON patch,model validation
 Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Description-Content-Type: text/markdown
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/README.md new/warlock-1.3.3/README.md
--- old/warlock-1.3.0/README.md 2016-06-25 19:42:56.000000000 +0200
+++ new/warlock-1.3.3/README.md 2019-05-20 11:40:24.000000000 +0200
@@ -1,11 +1,25 @@
-# Warlock
+# Warlock — self-validating Python objects using JSON schema
 
-[![Build 
Status](https://travis-ci.org/bcwaldon/warlock.svg?branch=master)](https://travis-ci.org/bcwaldon/warlock)
+[![PyPI](https://img.shields.io/pypi/v/warlock.svg)][warlock]
+[![PyPI - Python 
Version](https://img.shields.io/pypi/pyversions/warlock.svg)][warlock]
+[![PyPI - Downloads](https://img.shields.io/pypi/dw/warlock.svg)][pypistats]
 
-Build self-validating python objects using JSON schemas.
+[![Build 
Status](https://travis-ci.org/bcwaldon/warlock.svg?branch=master)][ci-builds]
+[![Coverage 
Status](https://coveralls.io/repos/github/bcwaldon/warlock/badge.svg?branch=master)][coveralls]
+
+## Installation
+
+Warlock is [available on PyPI][warlock]:
+
+```shell
+pip install warlock
+```
+
+## Usage
 
 1) Create your schema
 
+    ```python
     >>> schema = {
         'name': 'Country',
         'properties': {
@@ -15,22 +29,28 @@
         },
         'additionalProperties': False,
     }
+    ```
 
 2) Create a model
 
+    ```python
     >>> import warlock
     >>> Country = warlock.model_factory(schema)
+    ```
 
 3) Create an object using your model
 
+    ```python
     >>> sweden = Country(name='Sweden', abbreviation='SE')
+    ```
 
 4) Let the object validate itself
 
+    ```python
     >>> sweden.name = 5
     Traceback (most recent call last):
-      File "<stdin>", line 1, in <module>
-      File "warlock/core.py", line 53, in __setattr__
+    File "<stdin>", line 1, in <module>
+    File "warlock/core.py", line 53, in __setattr__
         raise InvalidOperation(msg)
     warlock.core.InvalidOperation: Unable to set 'name' to '5'
 
@@ -40,9 +60,18 @@
       File "warlock/core.py", line 53, in __setattr__
         raise InvalidOperation(msg)
     warlock.core.InvalidOperation: Unable to set 'overlord' to 'Bears'
+    ```
 
 5) Generate a [JSON Patch 
document](http://tools.ietf.org/html/draft-ietf-appsawg-json-patch) to track 
changes
 
+    ```python
     >>> sweden.population=9453000
     >>> sweden.patch
     '[{"path": "/population", "value": 9453000, "op": "add"}]'
+    ```
+
+[warlock]: https://pypi.org/project/warlock/
+[pip]: https://pip.pypa.io/en/stable/
+[ci-builds]: https://travis-ci.org/bcwaldon/warlock
+[coveralls]: https://coveralls.io/github/bcwaldon/warlock?branch=master
+[pypistats]: https://pypistats.org/packages/warlock
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/requirements.txt 
new/warlock-1.3.3/requirements.txt
--- old/warlock-1.3.0/requirements.txt  2016-06-25 19:38:50.000000000 +0200
+++ new/warlock-1.3.3/requirements.txt  2019-05-20 11:40:24.000000000 +0200
@@ -1,3 +1,3 @@
-jsonschema>=0.7,<3
+jsonschema>=0.7,<4
 jsonpatch>=0.10,<2
 six
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/setup.cfg new/warlock-1.3.3/setup.cfg
--- old/warlock-1.3.0/setup.cfg 2016-06-25 20:13:37.000000000 +0200
+++ new/warlock-1.3.3/setup.cfg 2019-05-20 12:10:52.000000000 +0200
@@ -4,5 +4,4 @@
 [egg_info]
 tag_build = 
 tag_date = 0
-tag_svn_revision = 0
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/setup.py new/warlock-1.3.3/setup.py
--- old/warlock-1.3.0/setup.py  2016-06-25 20:13:05.000000000 +0200
+++ new/warlock-1.3.3/setup.py  2019-05-20 12:07:12.000000000 +0200
@@ -13,22 +13,53 @@
 # limitations under the License.
 
 import setuptools
+import io
+import os
 
 
 def parse_requirements():
-    fap = open('requirements.txt', 'r')
+    fap = io.open("requirements.txt", "r", encoding="utf-8")
     raw_req = fap.read()
     fap.close()
-    return raw_req.split('\n')
+    return raw_req.split("\n")
+
+
+def read(fname):
+    with io.open(
+        os.path.join(os.path.dirname(__file__), fname), "r", encoding="utf-8"
+    ) as fp:
+        return fp.read()
 
 
 setuptools.setup(
-    name='warlock',
-    version='1.3.0',
-    description='Python object model built on JSON schema and JSON patch.',
-    author='Brian Waldon',
-    author_email='[email protected]',
-    url='http://github.com/bcwaldon/warlock',
-    packages=['warlock'],
+    name="warlock",
+    version="1.3.3",
+    description="Python object model built on JSON schema and JSON patch.",
+    long_description=read("README.md"),
+    long_description_content_type="text/markdown",
+    keywords=["JSON schema", "JSON patch", "model validation"],
+    author="Brian Waldon",
+    author_email="[email protected]",
+    maintainer="Jan Willhaus",
+    maintainer_email="[email protected]",
+    url="http://github.com/bcwaldon/warlock";,
+    packages=["warlock"],
     install_requires=parse_requirements(),
+    license="Apache-2.0",
+    classifiers=[
+        "Development Status :: 5 - Production/Stable",
+        "Intended Audience :: Developers",
+        "Operating System :: MacOS :: MacOS X",
+        "Operating System :: Microsoft :: Windows",
+        "Operating System :: POSIX",
+        "Programming Language :: Python",
+        "Programming Language :: Python :: 2",
+        "Programming Language :: Python :: 2.7",
+        "Programming Language :: Python :: 3",
+        "Programming Language :: Python :: 3.4",
+        "Programming Language :: Python :: 3.5",
+        "Programming Language :: Python :: 3.6",
+        "Programming Language :: Python :: 3.7",
+        "Topic :: Software Development :: Libraries :: Python Modules",
+    ],
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/test/test_core.py 
new/warlock-1.3.3/test/test_core.py
--- old/warlock-1.3.0/test/test_core.py 2016-06-25 20:04:07.000000000 +0200
+++ new/warlock-1.3.3/test/test_core.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,307 +0,0 @@
-# Copyright 2012 Brian Waldon
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import copy
-import unittest
-import os
-
-import json
-
-import six
-
-import warlock
-
-
-fixture = {
-    'name': 'Country',
-    'properties': {
-        'name': {'type': 'string'},
-        'population': {'type': 'integer'},
-    },
-    'additionalProperties': False,
-}
-
-
-complex_fixture = {
-    'name': 'Mixmaster',
-    'properties': {
-        'sub': {'type': 'object',
-                'properties': {'foo': {'type': 'string'}}}
-    },
-}
-
-parent_fixture = {
-    'name': 'Parent',
-    'properties': {
-        'name': {'type': 'string'},
-        'children': {'type': 'array', 'items': [{'type': 'object'}]}
-    },
-    'required': ['name', 'children']
-}
-
-child_fixture = {
-    'name': 'Child',
-    'properties': {
-        'age': {'type': 'integer'},
-        'mother': {'type': 'object'}
-    },
-    'required': ['age', 'mother']
-}
-
-
-nameless_fixture = {
-    'properties': {
-        'name': {'type': 'string'},
-        'population': {'type': 'integer'},
-    },
-    'additionalProperties': False,
-}
-
-
-class TestCore(unittest.TestCase):
-    def test_create_invalid_object(self):
-        Country = warlock.model_factory(fixture)
-        self.assertRaises(ValueError, Country, name=1)
-
-    def test_class_name_from_unicode_schema_name(self):
-        fixture_copy = copy.deepcopy(fixture)
-        fixture_copy['name'] = six.text_type(fixture_copy['name'])
-        # Can't set class.__name__ to a unicode object, ensure warlock
-        # does some magic to make it possible
-        warlock.model_factory(fixture_copy)
-
-    def test_invalid_operations(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-
-        # Ensure a valid object was created
-        self.assertEqual(sweden.name, 'Sweden')
-        self.assertEqual(sweden.population, 9379116)
-
-        # Specific exceptions should be raised for invalid operations
-        self.assertRaises(AttributeError, getattr, sweden, 'overlord')
-        exc = warlock.InvalidOperation
-        self.assertRaises(exc, setattr, sweden, 'overlord', 'Bears')
-        self.assertRaises(exc, setattr, sweden, 'name', 5)
-        self.assertRaises(exc, setattr, sweden, 'population', 'N/A')
-
-    def test_no_mask_arbitrary_properties(self):
-        fixture_copy = copy.deepcopy(fixture)
-        fixture_copy['additionalProperties'] = {'type': 'string'}
-        Country = warlock.model_factory(fixture_copy)
-
-        # We should still depend on the schema for validation
-        self.assertRaises(ValueError, Country, GDP=56956)
-
-        # But arbitrary properties should be allowed if they check out
-        sweden = Country(overlord='Waldon')
-        sweden.abbreviation = 'SE'
-        exc = warlock.InvalidOperation
-        self.assertRaises(exc, setattr, sweden, 'abbreviation', 0)
-
-    def test_items(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-        self.assertEqual(set(list(six.iteritems(sweden))),
-                         set([('name', 'Sweden'), ('population', 9379116)]))
-        self.assertEqual(set(sweden.items()),
-                         set([('name', 'Sweden'), ('population', 9379116)]))
-
-    def test_update(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-        exc = warlock.InvalidOperation
-        self.assertRaises(exc, sweden.update, {'population': 'N/A'})
-        self.assertRaises(exc, sweden.update, {'overloard': 'Bears'})
-
-    def test_naming(self):
-        Country = warlock.model_factory(fixture)
-        self.assertEqual('Country', Country.__name__)
-
-        Country2 = warlock.model_factory(fixture, name='Country2')
-        self.assertEqual('Country2', Country2.__name__)
-
-        nameless = warlock.model_factory(nameless_fixture)
-        self.assertEqual('Model', nameless.__name__)
-
-        nameless2 = warlock.model_factory(nameless_fixture, name='Country3')
-        self.assertEqual('Country3', nameless2.__name__)
-
-    def test_deepcopy(self):
-        """Make sure we aren't leaking references."""
-        Mixmaster = warlock.model_factory(complex_fixture)
-        mike = Mixmaster(sub={'foo': 'mike'})
-
-        self.assertEquals('mike', mike.sub['foo'])
-
-        mike_1 = mike.copy()
-        mike_1['sub']['foo'] = 'james'
-        self.assertEquals('mike', mike.sub['foo'])
-
-        mike_2 = dict(six.iteritems(mike))
-        mike_2['sub']['foo'] = 'james'
-        self.assertEquals('mike', mike.sub['foo'])
-
-        mike_2 = dict(mike.items())
-        mike_2['sub']['foo'] = 'james'
-        self.assertEquals('mike', mike.sub['foo'])
-
-        mike_3_sub = list(six.itervalues(mike))[0]
-        mike_3_sub['foo'] = 'james'
-        self.assertEquals('mike', mike.sub['foo'])
-
-        mike_3_sub = list(mike.values())[0]
-        mike_3_sub['foo'] = 'james'
-        self.assertEquals('mike', mike.sub['foo'])
-
-    def test_forbidden_methods(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-        exc = warlock.InvalidOperation
-        self.assertRaises(exc, sweden.clear)
-        self.assertRaises(exc, sweden.pop, 0)
-        self.assertRaises(exc, sweden.popitem)
-
-    def test_dict_syntax(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-
-        sweden['name'] = 'Finland'
-        self.assertEqual('Finland', sweden['name'])
-
-        del sweden['name']
-        self.assertRaises(AttributeError, getattr, sweden, 'name')
-
-    def test_attr_syntax(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-
-        sweden.name = 'Finland'
-        self.assertEqual('Finland', sweden.name)
-
-        delattr(sweden, 'name')
-        self.assertRaises(AttributeError, getattr, sweden, 'name')
-
-    def test_changes(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-        self.assertEqual(sweden.changes, {})
-        sweden['name'] = 'Finland'
-        self.assertEqual(sweden.changes, {'name': 'Finland'})
-        sweden['name'] = 'Norway'
-        self.assertEqual(sweden.changes, {'name': 'Norway'})
-
-    def test_patch_no_changes(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-        self.assertEqual(sweden.patch, '[]')
-
-    def test_patch_alter_value(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-        sweden['name'] = 'Finland'
-        self.assertEqual(
-            json.loads(sweden.patch),
-            json.loads(
-                '[{"path": "/name", "value": "Finland", "op": "replace"}]'))
-
-    def test_patch_drop_attribute(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-        del sweden['name']
-        self.assertEqual(
-            json.loads(sweden.patch),
-            json.loads('[{"path": "/name", "op": "remove"}]'))
-
-    def test_patch_reduce_operations(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-
-        sweden['name'] = 'Finland'
-        self.assertEqual(
-            json.loads(sweden.patch),
-            json.loads(
-                '[{"path": "/name", "value": "Finland", "op": "replace"}]'))
-
-        sweden['name'] = 'Norway'
-        self.assertEqual(
-            json.loads(sweden.patch),
-            json.loads(
-                '[{"path": "/name", "value": "Norway", "op": "replace"}]'))
-
-    def test_patch_multiple_operations(self):
-        Country = warlock.model_factory(fixture)
-        sweden = Country(name='Sweden', population=9379116)
-
-        sweden['name'] = 'Finland'
-        sweden['population'] = 5387000
-
-        self.assertEqual(len(json.loads(sweden.patch)), 2)
-
-        patches = json.loads(
-            '[{"path": "/name", "value": "Finland", "op": "replace"}, '
-            '{"path": "/population", "value": 5387000, "op": "replace"}]')
-
-        for patch in json.loads(sweden.patch):
-            self.assertTrue(patch in patches)
-
-    def test_resolver(self):
-        from jsonschema import RefResolver
-        dirname = os.path.dirname(__file__)
-        schemas_path = 'file://' + os.path.join(dirname, 'schemas/')
-        resolver = RefResolver(schemas_path, None)
-
-        country_schema_file = \
-            open(os.path.join(dirname, 'schemas/') + 'country.json')
-        person_schema_file = \
-            open(os.path.join(dirname, 'schemas/') + 'person.json')
-
-        country_schema = json.load(country_schema_file)
-        person_schema = json.load(person_schema_file)
-        Country = warlock.model_factory(country_schema, resolver)
-        Person = warlock.model_factory(person_schema, resolver)
-
-        england = Country(
-            name="England",
-            population=53865800,
-            overlord=Person(
-                title="Queen",
-                firstname="Elizabeth",
-                lastname="Windsor"
-            )
-        )
-        expected = {
-            'name': 'England',
-            'population': 53865800,
-            'overlord': {
-                'title': 'Queen',
-                'lastname': 'Windsor',
-                'firstname': 'Elizabeth'
-             }
-        }
-        self.assertEqual(england, expected)
-
-    def test_recursive_models(self):
-        Parent = warlock.model_factory(parent_fixture)
-        Child = warlock.model_factory(child_fixture)
-
-        mom = Parent(name='Abby', children=[])
-
-        teenager = Child(age=15, mother=mom)
-        toddler = Child(age=3, mother=mom)
-
-        mom.children = [teenager, toddler]
-
-        self.assertEqual(mom.children[0].age, 15)
-        self.assertEqual(mom.children[1].age, 3)
Binary files old/warlock-1.3.0/warlock/__init__.pyc and 
new/warlock-1.3.3/warlock/__init__.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/warlock/core.py 
new/warlock-1.3.3/warlock/core.py
--- old/warlock-1.3.0/warlock/core.py   2016-06-25 19:48:59.000000000 +0200
+++ new/warlock-1.3.3/warlock/core.py   2019-05-20 08:26:22.000000000 +0200
@@ -30,8 +30,8 @@
 
     class Model(base_class):
         def __init__(self, *args, **kwargs):
-            self.__dict__['schema'] = schema
-            self.__dict__['resolver'] = resolver
+            self.__dict__["schema"] = schema
+            self.__dict__["resolver"] = resolver
             base_class.__init__(self, *args, **kwargs)
 
     if resolver is not None:
@@ -39,6 +39,6 @@
 
     if name is not None:
         Model.__name__ = name
-    elif 'name' in schema:
-        Model.__name__ = str(schema['name'])
+    elif "name" in schema:
+        Model.__name__ = str(schema["name"])
     return Model
Binary files old/warlock-1.3.0/warlock/core.pyc and 
new/warlock-1.3.3/warlock/core.pyc differ
Binary files old/warlock-1.3.0/warlock/exceptions.pyc and 
new/warlock-1.3.3/warlock/exceptions.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/warlock/model.py 
new/warlock-1.3.3/warlock/model.py
--- old/warlock-1.3.0/warlock/model.py  2016-06-25 20:08:28.000000000 +0200
+++ new/warlock-1.3.3/warlock/model.py  2019-05-20 08:26:22.000000000 +0200
@@ -25,7 +25,6 @@
 
 
 class Model(dict):
-
     def __init__(self, *args, **kwargs):
         # we overload setattr so set this manually
         d = dict(*args, **kwargs)
@@ -37,8 +36,8 @@
         else:
             dict.__init__(self, d)
 
-        self.__dict__['changes'] = {}
-        self.__dict__['__original__'] = copy.deepcopy(d)
+        self.__dict__["changes"] = {}
+        self.__dict__["__original__"] = copy.deepcopy(d)
 
     def __setitem__(self, key, value):
         mutation = dict(self.items())
@@ -46,13 +45,12 @@
         try:
             self.validate(mutation)
         except exceptions.ValidationError as exc:
-            msg = ("Unable to set '%s' to %r. Reason: %s"
-                   % (key, value, str(exc)))
+            msg = "Unable to set '%s' to %r. Reason: %s" % (key, value, 
str(exc))
             raise exceptions.InvalidOperation(msg)
 
         dict.__setitem__(self, key, value)
 
-        self.__dict__['changes'][key] = value
+        self.__dict__["changes"][key] = value
 
     def __delitem__(self, key):
         mutation = dict(self.items())
@@ -60,8 +58,7 @@
         try:
             self.validate(mutation)
         except exceptions.ValidationError as exc:
-            msg = ("Unable to delete attribute '%s'. Reason: %s"
-                   % (key, str(exc)))
+            msg = "Unable to delete attribute '%s'. Reason: %s" % (key, 
str(exc))
             raise exceptions.InvalidOperation(msg)
 
         dict.__delitem__(self, key)
@@ -124,15 +121,15 @@
     @property
     def patch(self):
         """Return a jsonpatch object representing the delta"""
-        original = self.__dict__['__original__']
+        original = self.__dict__["__original__"]
         return jsonpatch.make_patch(original, dict(self)).to_string()
 
     @property
     def changes(self):
         """Dumber version of 'patch' method"""
-        deprecation_msg = 'Model.changes will be removed in warlock v2'
+        deprecation_msg = "Model.changes will be removed in warlock v2"
         warnings.warn(deprecation_msg, DeprecationWarning, stacklevel=2)
-        return copy.deepcopy(self.__dict__['changes'])
+        return copy.deepcopy(self.__dict__["changes"])
 
     def validate(self, obj):
         """Apply a JSON schema to an object"""
Binary files old/warlock-1.3.0/warlock/model.pyc and 
new/warlock-1.3.3/warlock/model.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/warlock.egg-info/PKG-INFO 
new/warlock-1.3.3/warlock.egg-info/PKG-INFO
--- old/warlock-1.3.0/warlock.egg-info/PKG-INFO 2016-06-25 20:13:37.000000000 
+0200
+++ new/warlock-1.3.3/warlock.egg-info/PKG-INFO 2019-05-20 12:10:52.000000000 
+0200
@@ -1,10 +1,105 @@
-Metadata-Version: 1.0
+Metadata-Version: 2.1
 Name: warlock
-Version: 1.3.0
+Version: 1.3.3
 Summary: Python object model built on JSON schema and JSON patch.
 Home-page: http://github.com/bcwaldon/warlock
 Author: Brian Waldon
 Author-email: [email protected]
-License: UNKNOWN
-Description: UNKNOWN
+Maintainer: Jan Willhaus
+Maintainer-email: [email protected]
+License: Apache-2.0
+Description: # Warlock — self-validating Python objects using JSON schema
+        
+        [![PyPI](https://img.shields.io/pypi/v/warlock.svg)][warlock]
+        [![PyPI - Python 
Version](https://img.shields.io/pypi/pyversions/warlock.svg)][warlock]
+        [![PyPI - 
Downloads](https://img.shields.io/pypi/dw/warlock.svg)][pypistats]
+        
+        [![Build 
Status](https://travis-ci.org/bcwaldon/warlock.svg?branch=master)][ci-builds]
+        [![Coverage 
Status](https://coveralls.io/repos/github/bcwaldon/warlock/badge.svg?branch=master)][coveralls]
+        
+        ## Installation
+        
+        Warlock is [available on PyPI][warlock]:
+        
+        ```shell
+        pip install warlock
+        ```
+        
+        ## Usage
+        
+        1) Create your schema
+        
+            ```python
+            >>> schema = {
+                'name': 'Country',
+                'properties': {
+                    'name': {'type': 'string'},
+                    'abbreviation': {'type': 'string'},
+                    'population': {'type': 'integer'},
+                },
+                'additionalProperties': False,
+            }
+            ```
+        
+        2) Create a model
+        
+            ```python
+            >>> import warlock
+            >>> Country = warlock.model_factory(schema)
+            ```
+        
+        3) Create an object using your model
+        
+            ```python
+            >>> sweden = Country(name='Sweden', abbreviation='SE')
+            ```
+        
+        4) Let the object validate itself
+        
+            ```python
+            >>> sweden.name = 5
+            Traceback (most recent call last):
+            File "<stdin>", line 1, in <module>
+            File "warlock/core.py", line 53, in __setattr__
+                raise InvalidOperation(msg)
+            warlock.core.InvalidOperation: Unable to set 'name' to '5'
+        
+            >>> sweden.overlord = 'Bears'
+            Traceback (most recent call last):
+              File "<stdin>", line 1, in <module>
+              File "warlock/core.py", line 53, in __setattr__
+                raise InvalidOperation(msg)
+            warlock.core.InvalidOperation: Unable to set 'overlord' to 'Bears'
+            ```
+        
+        5) Generate a [JSON Patch 
document](http://tools.ietf.org/html/draft-ietf-appsawg-json-patch) to track 
changes
+        
+            ```python
+            >>> sweden.population=9453000
+            >>> sweden.patch
+            '[{"path": "/population", "value": 9453000, "op": "add"}]'
+            ```
+        
+        [warlock]: https://pypi.org/project/warlock/
+        [pip]: https://pip.pypa.io/en/stable/
+        [ci-builds]: https://travis-ci.org/bcwaldon/warlock
+        [coveralls]: https://coveralls.io/github/bcwaldon/warlock?branch=master
+        [pypistats]: https://pypistats.org/packages/warlock
+        
+Keywords: JSON schema,JSON patch,model validation
 Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Description-Content-Type: text/markdown
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/warlock.egg-info/SOURCES.txt 
new/warlock-1.3.3/warlock.egg-info/SOURCES.txt
--- old/warlock-1.3.0/warlock.egg-info/SOURCES.txt      2016-06-25 
20:13:37.000000000 +0200
+++ new/warlock-1.3.3/warlock.egg-info/SOURCES.txt      2019-05-20 
12:10:52.000000000 +0200
@@ -1,14 +1,17 @@
-LICENSE.txt
+LICENSE
 MANIFEST.in
 README.md
 requirements.txt
 setup.cfg
 setup.py
-test/test_core.py
 warlock/__init__.py
+warlock/__init__.pyc
 warlock/core.py
+warlock/core.pyc
 warlock/exceptions.py
+warlock/exceptions.pyc
 warlock/model.py
+warlock/model.pyc
 warlock.egg-info/PKG-INFO
 warlock.egg-info/SOURCES.txt
 warlock.egg-info/dependency_links.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.0/warlock.egg-info/requires.txt 
new/warlock-1.3.3/warlock.egg-info/requires.txt
--- old/warlock-1.3.0/warlock.egg-info/requires.txt     2016-06-25 
20:13:37.000000000 +0200
+++ new/warlock-1.3.3/warlock.egg-info/requires.txt     2019-05-20 
12:10:52.000000000 +0200
@@ -1,3 +1,3 @@
-jsonschema>=0.7,<3
-jsonpatch>=0.10,<2
+jsonschema<4,>=0.7
+jsonpatch<2,>=0.10
 six


Reply via email to