Hello community, here is the log from the commit of package python-warlock for openSUSE:Factory checked in at 2017-12-04 10:01:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-warlock (Old) and /work/SRC/openSUSE:Factory/.python-warlock.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-warlock" Mon Dec 4 10:01:18 2017 rev:14 rq:544314 version:1.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-warlock/python-warlock.changes 2017-09-05 15:14:45.145182263 +0200 +++ /work/SRC/openSUSE:Factory/.python-warlock.new/python-warlock.changes 2017-12-04 10:01:19.850691987 +0100 @@ -1,0 +2,7 @@ +Tue Nov 14 23:25:58 UTC 2017 - [email protected] + +- update to 1.3.0: + * Allow resolver to be set in model + * flake8 compliance + +------------------------------------------------------------------- Old: ---- warlock-1.2.0.tar.gz New: ---- warlock-1.3.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-warlock.spec ++++++ --- /var/tmp/diff_new_pack.PEBx2Y/_old 2017-12-04 10:01:20.858655402 +0100 +++ /var/tmp/diff_new_pack.PEBx2Y/_new 2017-12-04 10:01:20.862655257 +0100 @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-warlock -Version: 1.2.0 +Version: 1.3.0 Release: 0 Summary: Python object model built on top of JSON schema License: Apache-2.0 @@ -28,7 +28,7 @@ BuildRequires: %{python_module devel} BuildRequires: %{python_module jsonpatch} BuildRequires: %{python_module jsonschema} -BuildRequires: %{python_module nose} +BuildRequires: %{python_module pytest} BuildRequires: %{python_module setuptools} BuildRequires: %{python_module six} BuildRequires: python-rpm-macros @@ -54,7 +54,7 @@ %python_install %check -%python_exec %{_bindir}/nosetests +%python_exec setup.py test %files %{python_files} %defattr(-,root,root,-) ++++++ warlock-1.2.0.tar.gz -> warlock-1.3.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/warlock-1.2.0/PKG-INFO new/warlock-1.3.0/PKG-INFO --- old/warlock-1.2.0/PKG-INFO 2015-10-12 19:09:45.000000000 +0200 +++ new/warlock-1.3.0/PKG-INFO 2016-06-25 20:13:37.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: warlock -Version: 1.2.0 +Version: 1.3.0 Summary: Python object model built on JSON schema and JSON patch. Home-page: http://github.com/bcwaldon/warlock Author: Brian Waldon diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/warlock-1.2.0/README.md new/warlock-1.3.0/README.md --- old/warlock-1.2.0/README.md 2015-10-12 18:48:26.000000000 +0200 +++ new/warlock-1.3.0/README.md 2016-06-25 19:42:56.000000000 +0200 @@ -1,5 +1,7 @@ # Warlock +[](https://travis-ci.org/bcwaldon/warlock) + Build self-validating python objects using JSON schemas. 1) Create your schema diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/warlock-1.2.0/setup.py new/warlock-1.3.0/setup.py --- old/warlock-1.2.0/setup.py 2015-10-12 19:08:55.000000000 +0200 +++ new/warlock-1.3.0/setup.py 2016-06-25 20:13:05.000000000 +0200 @@ -24,7 +24,7 @@ setuptools.setup( name='warlock', - version='1.2.0', + version='1.3.0', description='Python object model built on JSON schema and JSON patch.', author='Brian Waldon', author_email='[email protected]', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/warlock-1.2.0/test/test_core.py new/warlock-1.3.0/test/test_core.py --- old/warlock-1.2.0/test/test_core.py 2015-10-12 18:48:26.000000000 +0200 +++ new/warlock-1.3.0/test/test_core.py 2016-06-25 20:04:07.000000000 +0200 @@ -14,6 +14,7 @@ import copy import unittest +import os import json @@ -40,6 +41,24 @@ }, } +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': { @@ -105,46 +124,46 @@ 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.__name__, 'Country') - + self.assertEqual('Country', Country.__name__) + Country2 = warlock.model_factory(fixture, name='Country2') - self.assertEqual(Country2.__name__, 'Country2') - + self.assertEqual('Country2', Country2.__name__) + nameless = warlock.model_factory(nameless_fixture) - self.assertEqual(nameless.__name__, 'Model') - + self.assertEqual('Model', nameless.__name__) + nameless2 = warlock.model_factory(nameless_fixture, name='Country3') - self.assertEqual(nameless2.__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.sub['foo'], 'mike') + self.assertEquals('mike', mike.sub['foo']) mike_1 = mike.copy() mike_1['sub']['foo'] = 'james' - self.assertEquals(mike.sub['foo'], 'mike') + self.assertEquals('mike', mike.sub['foo']) mike_2 = dict(six.iteritems(mike)) mike_2['sub']['foo'] = 'james' - self.assertEquals(mike.sub['foo'], 'mike') + self.assertEquals('mike', mike.sub['foo']) mike_2 = dict(mike.items()) mike_2['sub']['foo'] = 'james' - self.assertEquals(mike.sub['foo'], 'mike') + self.assertEquals('mike', mike.sub['foo']) mike_3_sub = list(six.itervalues(mike))[0] mike_3_sub['foo'] = 'james' - self.assertEquals(mike.sub['foo'], 'mike') + self.assertEquals('mike', mike.sub['foo']) mike_3_sub = list(mike.values())[0] mike_3_sub['foo'] = 'james' - self.assertEquals(mike.sub['foo'], 'mike') + self.assertEquals('mike', mike.sub['foo']) def test_forbidden_methods(self): Country = warlock.model_factory(fixture) @@ -159,7 +178,7 @@ sweden = Country(name='Sweden', population=9379116) sweden['name'] = 'Finland' - self.assertEqual(sweden['name'], 'Finland') + self.assertEqual('Finland', sweden['name']) del sweden['name'] self.assertRaises(AttributeError, getattr, sweden, 'name') @@ -169,7 +188,7 @@ sweden = Country(name='Sweden', population=9379116) sweden.name = 'Finland' - self.assertEqual(sweden.name, 'Finland') + self.assertEqual('Finland', sweden.name) delattr(sweden, 'name') self.assertRaises(AttributeError, getattr, sweden, 'name') @@ -236,3 +255,53 @@ 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) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/warlock-1.2.0/warlock/__init__.py new/warlock-1.3.0/warlock/__init__.py --- old/warlock-1.2.0/warlock/__init__.py 2015-10-12 18:48:26.000000000 +0200 +++ new/warlock-1.3.0/warlock/__init__.py 2016-06-25 20:01:00.000000000 +0200 @@ -14,6 +14,5 @@ """Public-facing Warlock API""" -# pylint: disable=W0611 -from warlock.core import model_factory -from warlock.exceptions import InvalidOperation +from warlock.core import model_factory # NOQA +from warlock.exceptions import InvalidOperation # NOQA diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/warlock-1.2.0/warlock/core.py new/warlock-1.3.0/warlock/core.py --- old/warlock-1.2.0/warlock/core.py 2015-10-12 18:48:26.000000000 +0200 +++ new/warlock-1.3.0/warlock/core.py 2016-06-25 19:48:59.000000000 +0200 @@ -19,19 +19,24 @@ from . import model -def model_factory(schema, base_class=model.Model, name=None): +def model_factory(schema, resolver=None, base_class=model.Model, name=None): """Generate a model class based on the provided JSON Schema :param schema: dict representing valid JSON schema :param name: A name to give the class, if `name` is not in `schema` """ schema = copy.deepcopy(schema) + resolver = resolver class Model(base_class): def __init__(self, *args, **kwargs): self.__dict__['schema'] = schema + self.__dict__['resolver'] = resolver base_class.__init__(self, *args, **kwargs) + if resolver is not None: + Model.resolver = resolver + if name is not None: Model.__name__ = name elif 'name' in schema: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/warlock-1.2.0/warlock/model.py new/warlock-1.3.0/warlock/model.py --- old/warlock-1.2.0/warlock/model.py 2015-10-12 18:48:26.000000000 +0200 +++ new/warlock-1.3.0/warlock/model.py 2016-06-25 20:08:28.000000000 +0200 @@ -25,6 +25,7 @@ class Model(dict): + def __init__(self, *args, **kwargs): # we overload setattr so set this manually d = dict(*args, **kwargs) @@ -45,7 +46,7 @@ try: self.validate(mutation) except exceptions.ValidationError as exc: - msg = ("Unable to set '%s' to '%s'. Reason: %s" + msg = ("Unable to set '%s' to %r. Reason: %s" % (key, value, str(exc))) raise exceptions.InvalidOperation(msg) @@ -77,7 +78,7 @@ def __delattr__(self, key): self.__delitem__(key) - ### BEGIN dict compatibility methods ### + # BEGIN dict compatibility methods def clear(self): raise exceptions.InvalidOperation() @@ -91,6 +92,12 @@ def copy(self): return copy.deepcopy(dict(self)) + def __copy__(self): + return self.copy() + + def __deepcopy__(self, memo): + return copy.deepcopy(dict(self), memo) + def update(self, other): mutation = dict(self.items()) mutation.update(other) @@ -112,7 +119,7 @@ def values(self): return copy.deepcopy(dict(self)).values() - ### END dict compatibility methods ### + # END dict compatibility methods @property def patch(self): @@ -130,6 +137,9 @@ def validate(self, obj): """Apply a JSON schema to an object""" try: - jsonschema.validate(obj, self.schema) + if self.resolver is not None: + jsonschema.validate(obj, self.schema, resolver=self.resolver) + else: + jsonschema.validate(obj, self.schema) except jsonschema.ValidationError as exc: raise exceptions.ValidationError(str(exc)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/warlock-1.2.0/warlock.egg-info/PKG-INFO new/warlock-1.3.0/warlock.egg-info/PKG-INFO --- old/warlock-1.2.0/warlock.egg-info/PKG-INFO 2015-10-12 19:09:45.000000000 +0200 +++ new/warlock-1.3.0/warlock.egg-info/PKG-INFO 2016-06-25 20:13:37.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: warlock -Version: 1.2.0 +Version: 1.3.0 Summary: Python object model built on JSON schema and JSON patch. Home-page: http://github.com/bcwaldon/warlock Author: Brian Waldon
