Merge pull request #18 from wackywendell/master

Make 'name' optional
This commit is contained in:
Brian Waldon 2015-08-03 10:12:27 -07:00
commit 3811a1e742
3 changed files with 29 additions and 3 deletions

View File

@ -41,6 +41,15 @@ complex_fixture = {
}
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)
@ -96,6 +105,19 @@ class TestCore(unittest.TestCase):
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')
Country2 = warlock.model_factory(fixture, name='Country2')
self.assertEqual(Country2.__name__, 'Country2')
nameless = warlock.model_factory(nameless_fixture)
self.assertEqual(nameless.__name__, 'Model')
nameless2 = warlock.model_factory(nameless_fixture, name='Country3')
self.assertEqual(nameless2.__name__, 'Country3')
def test_deepcopy(self):
"""Make sure we aren't leaking references."""

View File

@ -1,5 +1,5 @@
[tox]
envlist = py26,py27,py33,pep8
envlist = py26,py27,py33,py34,pep8
[testenv]
deps=pytest

View File

@ -19,10 +19,11 @@ import copy
from . import model
def model_factory(schema, base_class=model.Model):
def model_factory(schema, 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)
@ -31,5 +32,8 @@ def model_factory(schema, base_class=model.Model):
self.__dict__['schema'] = schema
base_class.__init__(self, *args, **kwargs)
Model.__name__ = str(schema['name'])
if name is not None:
Model.__name__ = name
elif 'name' in schema:
Model.__name__ = str(schema['name'])
return Model