Skip to content

Commit

Permalink
add option for renderer
Browse files Browse the repository at this point in the history
- max_property: render all properties of a Schema object
- max_parameter: render all parameters of an Operation object
  • Loading branch information
mission-liao committed Nov 27, 2015
1 parent ab07c00 commit a3f9fc7
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 3 deletions.
10 changes: 8 additions & 2 deletions pyswagger/primitives/render.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ def _generate(self, obj, opt):
template = opt['object_template']
out = None
if type_ == 'object':
max_p = opt['max_property']
out = {}
max_ = obj.maxProperties if obj.maxProperties else opt['max_prop_count']
min_ = obj.minProperties if obj.minProperties else None
Expand All @@ -194,7 +195,7 @@ def _generate(self, obj, opt):
if name in template:
out[name] = template[name]
continue
if not name in obj.required:
if not max_p and not name in obj.required:
if random.randint(0, 1) == 0 or opt['minimal_property']:
continue
out[name] = self._generate(prop, opt)
Expand Down Expand Up @@ -250,6 +251,8 @@ def default():
- files: registered file object: refer to pyswagger.primitives.File for details
- object_template: dict of default values assigned for properties when 'name' matched
- parameter_template: dict of default values assigned for parameters when 'name matched
- max_property: all properties are generated, ignore 'required'
- max_parameter: all parameters are generated, ignore 'required'
:return: options
:rtype: dict
Expand All @@ -266,6 +269,8 @@ def default():
files=[],
object_template={},
parameter_template={},
max_property=False,
max_parameter=False,
)

def render(self, obj, opt=None):
Expand Down Expand Up @@ -304,14 +309,15 @@ def render_all(self, op, exclude=[], opt=None):
raise ValueError('Not a dict: {0}'.format(opt))

template = opt['parameter_template']
max_p = opt['max_parameter']
out = {}
for p in op.parameters:
if p.name in exclude:
continue
if p.name in template:
out.update({p.name: template[p.name]})
continue
if not p.required:
if not max_p and not p.required:
if random.randint(0, 1) == 0 or opt['minimal_parameter']:
continue
out.update({p.name: self.render(p, opt=opt)})
Expand Down
18 changes: 18 additions & 0 deletions pyswagger/tests/data/v2_0/render/object/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,24 @@

},
"definitions":{
"user2":{
"type":"object",
"properties":{
"id":{
"type":"integer",
"format":"int32",
"maximum":100,
"minimum":1
},
"name":{
"type":"string"
},
"email":{
"type":"string",
"format":"email"
}
}
},
"user":{
"type":"object",
"properties":{
Expand Down
32 changes: 31 additions & 1 deletion pyswagger/tests/data/v2_0/render/operation/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,36 @@
"description":"successful operation"
}
}
},
"get":{
"parameters":[
{
"name":"p1",
"in":"query",
"required":false,
"type":"string",
"format":"email"
},
{
"name":"p2",
"in":"query",
"required":false,
"type":"string",
"format":"email"
},
{
"name":"p3",
"in":"query",
"required":false,
"type":"string",
"format":"email"
}
],
"responses":{
"default":{
"description":"successful operation"
}
}
}
}
},
Expand All @@ -147,4 +177,4 @@
]
}
}
}
}
26 changes: 26 additions & 0 deletions pyswagger/tests/test_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,21 @@ def test_template(self):
self.assertTrue(validate_email(o['comment']))
self.assertTrue(isinstance(o['time'], datetime.datetime), 'should be a datetime, not {0}'.format(str(type(o['time']))))

def test_max_property(self):
""" make sure max_property works """
opt = self.rnd.default()
opt['max_property'] = True
obj = self.app.resolve('#/definitions/user2')
for _ in six.moves.xrange(50):
o = self.rnd.render(
obj,
opt=opt
)
self.assertTrue('id' in o, 'should have id')
self.assertTrue('name' in o, 'should have name')
self.assertTrue('email' in o, 'should have email')


class ParameterTestCase(unittest.TestCase):
""" test case for rendering a single Parameter,
type/format specific tests are covered by other
Expand Down Expand Up @@ -552,6 +567,17 @@ def test_minimal(self):
self.assertTrue('p3' in ps, 'p3 should exist')
self.assertTrue(count > 0, 'count should be larger than zero, not {0}'.format(count))

def test_max_parameter(self):
""" make sure max_parameter works """
op = self.app.s('api.2').get
opt = self.rnd.default()
opt['max_parameter'] = True
for _ in six.moves.xrange(50):
ps = self.rnd.render_all(op, opt=opt)
self.assertTrue('p1' in ps, 'p1 should exists')
self.assertTrue('p2' in ps, 'p2 should exists')
self.assertTrue('p2' in ps, 'p3 should exists')

def test_exclude(self):
""" make sure exclude works """
op = self.app.s('api.1').get
Expand Down

0 comments on commit a3f9fc7

Please sign in to comment.