)]}'
{"heat/engine/api.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c2deb165f7aea2699035eb23f3dba2ae9f0ede80","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # be treated separately"},{"line_number":251,"context_line":"    exclude_keys \u003d (param.schema.TYPE, param.schema.CONSTRAINTS)"},{"line_number":252,"context_line":"    res \u003d dict((schema_to_api_keys.get(k, k), v)"},{"line_number":253,"context_line":"               for k, v in param.schema.iteritems() if k not in exclude_keys)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    # set translated type"},{"line_number":256,"context_line":"    res[api.PARAM_TYPE] \u003d schema_to_api_types.get(param.schema.type,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B6cU%3D","line":253,"updated":"2014-01-20 20:49:24.000000000","message":"As per my comment on the previous patch in the series, I would prefer we get away from dictionaries altogether.","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"ac2646a514e605751c8ac89943e6a1dd00deaa0c","unresolved":false,"context_lines":[{"line_number":250,"context_line":"    # be treated separately"},{"line_number":251,"context_line":"    exclude_keys \u003d (param.schema.TYPE, param.schema.CONSTRAINTS)"},{"line_number":252,"context_line":"    res \u003d dict((schema_to_api_keys.get(k, k), v)"},{"line_number":253,"context_line":"               for k, v in param.schema.iteritems() if k not in exclude_keys)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    # set translated type"},{"line_number":256,"context_line":"    res[api.PARAM_TYPE] \u003d schema_to_api_types.get(param.schema.type,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B2TE%3D","line":253,"in_reply_to":"AAAAUH%2F%2B6cU%3D","updated":"2014-01-21 13:31:25.000000000","message":"Done","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"2a3235f76e57aede33debd91b30e633f61833e8a","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                res[api.PARAM_MAX_LENGTH] \u003d c.max"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        elif isinstance(c, constr.Range):"},{"line_number":262,"context_line":"            if c.min:"},{"line_number":263,"context_line":"                res[api.PARAM_MIN_VALUE] \u003d c.min"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"            if c.max:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2By88%3D","line":262,"updated":"2014-01-22 03:15:08.000000000","message":"Should be:\n\n  if c.min is not None:\n\n0 is a valid value for c.min/c.max. Less so for the length constraints above, but probably worth changing there too.","commit_id":"2f365ab3aa0bf0acbd96af3d1324df4c7fd14974"}],"heat/engine/constraints.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c2deb165f7aea2699035eb23f3dba2ae9f0ede80","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                                           \u0027%(default)s (%(exc)s)\u0027) %"},{"line_number":124,"context_line":"                                         dict(default\u003dself.default, exc\u003dexc))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def set_default(self, default\u003dNone):"},{"line_number":127,"context_line":"        \"\"\"Set the default value for this Schema object.\"\"\""},{"line_number":128,"context_line":"        self.default \u003d default"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B6aU%3D","line":126,"updated":"2014-01-20 20:49:24.000000000","message":"Theoretically, we should override this in parameters.Schema to also set self.required \u003d default is not None. (In practice, it\u0027s not important for the one place we are calling this.)","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"ac2646a514e605751c8ac89943e6a1dd00deaa0c","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                                           \u0027%(default)s (%(exc)s)\u0027) %"},{"line_number":124,"context_line":"                                         dict(default\u003dself.default, exc\u003dexc))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def set_default(self, default\u003dNone):"},{"line_number":127,"context_line":"        \"\"\"Set the default value for this Schema object.\"\"\""},{"line_number":128,"context_line":"        self.default \u003d default"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B20c%3D","line":126,"in_reply_to":"AAAAUH%2F%2B6aU%3D","updated":"2014-01-21 13:31:25.000000000","message":"Done","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c2deb165f7aea2699035eb23f3dba2ae9f0ede80","unresolved":false,"context_lines":[{"line_number":338,"context_line":"        }"},{"line_number":339,"context_line":"    \"\"\""},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    valid_types \u003d (Schema.STRING_TYPE, Schema.LIST_TYPE, Schema.MAP_TYPE,)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def __init__(self, min\u003dNone, max\u003dNone, description\u003dNone):"},{"line_number":344,"context_line":"        super(Length, self).__init__(min, max, description)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B6Zs%3D","line":341,"updated":"2014-01-20 20:49:24.000000000","message":"Hmmm, I don\u0027t think a length constraint on a Map makes a lot of sense. I would be happy to see this dropped, along with whatever tests are requiring it.","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"eabceddab7fc168b62fc2405f6b80b416988ef29","unresolved":false,"context_lines":[{"line_number":338,"context_line":"        }"},{"line_number":339,"context_line":"    \"\"\""},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    valid_types \u003d (Schema.STRING_TYPE, Schema.LIST_TYPE, Schema.MAP_TYPE,)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def __init__(self, min\u003dNone, max\u003dNone, description\u003dNone):"},{"line_number":344,"context_line":"        super(Length, self).__init__(min, max, description)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BzAI%3D","line":341,"in_reply_to":"AAAAUH%2F%2B20g%3D","updated":"2014-01-22 02:32:40.000000000","message":"OK, I don\u0027t feel that strongly about it ;)\n\nI really hope people won\u0027t use this for Property schemata, and once we have proper nested schema support for Parameters too then we should strongly discourage this in favour of including an actual schema for Maps. But I guess it is theoretically possible that people are using it already.","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"ac2646a514e605751c8ac89943e6a1dd00deaa0c","unresolved":false,"context_lines":[{"line_number":338,"context_line":"        }"},{"line_number":339,"context_line":"    \"\"\""},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    valid_types \u003d (Schema.STRING_TYPE, Schema.LIST_TYPE, Schema.MAP_TYPE,)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def __init__(self, min\u003dNone, max\u003dNone, description\u003dNone):"},{"line_number":344,"context_line":"        super(Length, self).__init__(min, max, description)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B20g%3D","line":341,"in_reply_to":"AAAAUH%2F%2B6Zs%3D","updated":"2014-01-21 13:31:25.000000000","message":"Well, it does not *really* make sense, but since test cases exist, I was assuming that there could be people using it. The current semantics is that this constrains the number of entries in a map/dict ... which could be a fine constraint.\n\nUnless someone strongly disagrees, I would opt to just leave it as is.","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"}],"heat/engine/hot.py":[{"author":{"_account_id":7714,"name":"Tim Schnell","email":"tim.schnell@rackspace.com","username":"timductive"},"change_message_id":"b4ec823eaf5a15b4dd32615aaeaa81d9a255f3e3","unresolved":false,"context_lines":[{"line_number":240,"context_line":"    def param_schemata(self):"},{"line_number":241,"context_line":"        params \u003d self[PARAMETERS].iteritems()"},{"line_number":242,"context_line":"        return dict((name, HOTParamSchema.from_dict(schema))"},{"line_number":243,"context_line":"                    for name, schema in params)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"class HOTParamSchema(parameters.Schema):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2BzkY%3D","line":243,"updated":"2014-01-21 22:22:14.000000000","message":"Same as other comment, instantiating the schema object here would allow for a place to store attributes attached to the schema object instead of relying on passing in arguments to future methods.","commit_id":"2f365ab3aa0bf0acbd96af3d1324df4c7fd14974"}],"heat/engine/parameters.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c2deb165f7aea2699035eb23f3dba2ae9f0ede80","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def has_default(self):"},{"line_number":205,"context_line":"        \u0027\u0027\u0027Return whether the parameter has a default value.\u0027\u0027\u0027"},{"line_number":206,"context_line":"        return self.schema.default is not None"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def default(self):"},{"line_number":209,"context_line":"        \u0027\u0027\u0027Return the default value of the parameter.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B6Og%3D","line":206,"updated":"2014-01-20 20:49:24.000000000","message":"Even better:\n\n  return not self.schema.required","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"eabceddab7fc168b62fc2405f6b80b416988ef29","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def has_default(self):"},{"line_number":205,"context_line":"        \u0027\u0027\u0027Return whether the parameter has a default value.\u0027\u0027\u0027"},{"line_number":206,"context_line":"        return self.schema.default is not None"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def default(self):"},{"line_number":209,"context_line":"        \u0027\u0027\u0027Return the default value of the parameter.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BzAk%3D","line":206,"in_reply_to":"AAAAUH%2F%2B2s8%3D","updated":"2014-01-22 02:32:40.000000000","message":"\"What if in the future, we have required parameters that don\u0027t have a default?\"\n\nThat\u0027s how it works now - a parameter is required iff it doesn\u0027t have a default.\n\nThe question could be \"What if in the future, we have required parameters that have a default?\" That doesn\u0027t make sense, because if a parameter is required then the default is never used.\n\nSo the real question is \"What if in the future, we have parameters that are not required but don\u0027t have a default?\" I\u0027d say they have to resolve to _something_, and that thing is probably going to be stored in self.schema.default.\n\nThe reason I suggested changing it is \"What if in the future, we allow None as a legit default value?\" If we return not self.schema.required here, then we limit the scope of the change to setting the required arg in Schema.__init__. Otherwise, we have to go through the code and check for places that we assumed default is None had a special meaning.","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"ac2646a514e605751c8ac89943e6a1dd00deaa0c","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def has_default(self):"},{"line_number":205,"context_line":"        \u0027\u0027\u0027Return whether the parameter has a default value.\u0027\u0027\u0027"},{"line_number":206,"context_line":"        return self.schema.default is not None"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def default(self):"},{"line_number":209,"context_line":"        \u0027\u0027\u0027Return the default value of the parameter.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B2s8%3D","line":206,"in_reply_to":"AAAAUH%2F%2B6Og%3D","updated":"2014-01-21 13:31:25.000000000","message":"Hmmm, I find it kind of risky to bind has_default to self.schema.required in that way. What if in the future, we have required parameters that don\u0027t have a default?\n\nI would opt for keeping this as is; I also think this is easier to understand for somebody how reads the code.","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"2a3235f76e57aede33debd91b30e633f61833e8a","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def description(self):"},{"line_number":205,"context_line":"        \u0027\u0027\u0027Return the description of the parameter.\u0027\u0027\u0027"},{"line_number":206,"context_line":"        return self.schema.get(self.schema.DESCRIPTION, \u0027\u0027)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def has_default(self):"},{"line_number":209,"context_line":"        \u0027\u0027\u0027Return whether the parameter has a default value.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2By3g%3D","line":206,"updated":"2014-01-22 03:15:08.000000000","message":"I think this can be just:\n\n  return self.schema.description or \u0027\u0027\n\nOr even just\n\n  return self.schema.description\n\nif we set the default in Schema.__init__","commit_id":"2f365ab3aa0bf0acbd96af3d1324df4c7fd14974"}],"heat/engine/properties.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c2deb165f7aea2699035eb23f3dba2ae9f0ede80","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # as the template should deal with this."},{"line_number":138,"context_line":"        return cls(data_type\u003dparam_type_map.get(param.type, cls.MAP),"},{"line_number":139,"context_line":"                   description\u003dparam.description,"},{"line_number":140,"context_line":"                   required\u003dparam.default is None,"},{"line_number":141,"context_line":"                   constraints\u003dparam.constraints,"},{"line_number":142,"context_line":"                   update_allowed\u003dTrue)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B6Xk%3D","line":140,"updated":"2014-01-20 20:49:24.000000000","message":"I know I originally suggest this, but now it occurs to me that \u0027required\u0027 works in all constraints.Schema objects (not just properties.Schema ones), so we should pass required\u003dparam.required. That way we can encapsulate the code to determine whether a parameter is required in one place (perhaps one day we might want to allow a default of None).","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"ac2646a514e605751c8ac89943e6a1dd00deaa0c","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # as the template should deal with this."},{"line_number":138,"context_line":"        return cls(data_type\u003dparam_type_map.get(param.type, cls.MAP),"},{"line_number":139,"context_line":"                   description\u003dparam.description,"},{"line_number":140,"context_line":"                   required\u003dparam.default is None,"},{"line_number":141,"context_line":"                   constraints\u003dparam.constraints,"},{"line_number":142,"context_line":"                   update_allowed\u003dTrue)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B2so%3D","line":140,"in_reply_to":"AAAAUH%2F%2B6Xk%3D","updated":"2014-01-21 13:31:25.000000000","message":"Done","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"}],"heat/engine/template.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c2deb165f7aea2699035eb23f3dba2ae9f0ede80","unresolved":false,"context_lines":[{"line_number":472,"context_line":"                        s, transform)"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    def param_schemata(self):"},{"line_number":475,"context_line":"        parameters \u003d self[PARAMETERS].iteritems()"},{"line_number":476,"context_line":"        return dict((name, params.Schema.from_dict(schema))"},{"line_number":477,"context_line":"                    for name, schema in parameters)"},{"line_number":478,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B6WU%3D","line":475,"updated":"2014-01-20 20:49:24.000000000","message":"This is the only place where the name parameters conflicts, and there is only one other place that it\u0027s shadowed. I\u0027d prefer to rename a couple of local variables than to import a module with a different name to usual.","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"ac2646a514e605751c8ac89943e6a1dd00deaa0c","unresolved":false,"context_lines":[{"line_number":472,"context_line":"                        s, transform)"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    def param_schemata(self):"},{"line_number":475,"context_line":"        parameters \u003d self[PARAMETERS].iteritems()"},{"line_number":476,"context_line":"        return dict((name, params.Schema.from_dict(schema))"},{"line_number":477,"context_line":"                    for name, schema in parameters)"},{"line_number":478,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B2rc%3D","line":475,"in_reply_to":"AAAAUH%2F%2B6WU%3D","updated":"2014-01-21 13:31:25.000000000","message":"Done","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":7714,"name":"Tim Schnell","email":"tim.schnell@rackspace.com","username":"timductive"},"change_message_id":"b4ec823eaf5a15b4dd32615aaeaa81d9a255f3e3","unresolved":false,"context_lines":[{"line_number":474,"context_line":"    def param_schemata(self):"},{"line_number":475,"context_line":"        params \u003d self[PARAMETERS].iteritems()"},{"line_number":476,"context_line":"        return dict((name, parameters.Schema.from_dict(schema))"},{"line_number":477,"context_line":"                    for name, schema in params)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"def _resolve(match, handle, snippet, transform\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2Bzk4%3D","line":477,"updated":"2014-01-21 22:22:14.000000000","message":"Is it possible to restructure this method call to actually instantiate the Schema object like it used to? For my dependent patch I was relying on being able to pass the parameter name into __init__ and set it as an attribute.\n\nI could probably pass name as an argument to the label() method but I feel like instantiating the object here is better will provide more versatility for future enhancements.","commit_id":"2f365ab3aa0bf0acbd96af3d1324df4c7fd14974"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"2a3235f76e57aede33debd91b30e633f61833e8a","unresolved":false,"context_lines":[{"line_number":474,"context_line":"    def param_schemata(self):"},{"line_number":475,"context_line":"        params \u003d self[PARAMETERS].iteritems()"},{"line_number":476,"context_line":"        return dict((name, parameters.Schema.from_dict(schema))"},{"line_number":477,"context_line":"                    for name, schema in params)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"def _resolve(match, handle, snippet, transform\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2By%2Bo%3D","line":477,"in_reply_to":"AAAAUH%2F%2Bzk4%3D","updated":"2014-01-22 03:15:08.000000000","message":"So, this _is_ instantiating the object, but it\u0027s using a classmethod as a poor-man\u0027s overloaded constructor. I think the solution here is for you to add \u0027name\u0027 as a parameter to from_dict() and \u0027label\u0027 as a parameter to __init__. That way parameters.Schema.from_dict() can just pass the name as the label, and hot.HOTParamSchema.from_dict() can pass either the name or the label if it is available. parameters.Schema.__init__() can just do self.label \u003d label and there would be no label() method required.\n\nAlternatively maybe the __init__ method should have *both* name and label parameters, and label would get set to the name if the value passed was None. That would guarantee that the label would always get set to something even if instantiated directly in code rather than from a template, assuming the name was a required parameter.","commit_id":"2f365ab3aa0bf0acbd96af3d1324df4c7fd14974"}],"heat/tests/test_hot.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c2deb165f7aea2699035eb23f3dba2ae9f0ede80","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            hot.HOTParamSchema.from_dict(schema)"},{"line_number":409,"context_line":"            return True"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        err \u003d self.assertRaises(constraints.InvalidSchemaError, param_schema)"},{"line_number":412,"context_line":"        self.assertIn(range_desc, str(err))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B6Qs%3D","line":411,"updated":"2014-01-20 20:49:24.000000000","message":"It\u0027s easier, and I think in this case better, to just pass function arguments to assertRaises than to create a closure:\n\n        err \u003d self.assertRaises(constraints.InvalidSchemaError,\n                                hot.HOTParamSchema.from_dict,\n                                param_schema)","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"ac2646a514e605751c8ac89943e6a1dd00deaa0c","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            hot.HOTParamSchema.from_dict(schema)"},{"line_number":409,"context_line":"            return True"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        err \u003d self.assertRaises(constraints.InvalidSchemaError, param_schema)"},{"line_number":412,"context_line":"        self.assertIn(range_desc, str(err))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B2oQ%3D","line":411,"in_reply_to":"AAAAUH%2F%2B6Qs%3D","updated":"2014-01-21 13:31:25.000000000","message":"Done","commit_id":"bb63e4d5909e8923e84e4530b790ed8b6b92957b"}]}
