)]}'
{"heat/engine/hot.py":[{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"591edc1dcaf2c82f51717aa2403d243b8305f7f0","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                HOTParamSchema({parameters.TYPE: parameters.STRING,"},{"line_number":318,"context_line":"                                parameters.DESCRIPTION: \u0027Stack Name\u0027,"},{"line_number":319,"context_line":"                                parameters.DEFAULT: stack_name}))"},{"line_number":320,"context_line":"            yield parameters.Parameter("},{"line_number":321,"context_line":"                self.PARAM_REGION,"},{"line_number":322,"context_line":"                HOTParamSchema({parameters.TYPE: parameters.STRING,"},{"line_number":323,"context_line":"                                parameters.DEFAULT: \u0027ap-southeast-1\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FWuA%3D","line":320,"updated":"2014-01-14 18:07:35.000000000","message":"Despite the bp, I\u0027m not sure this has a place in HOT just yet. In the end, though, this should probably match OpenStack regions and not hard-code AWS regions since different service providers will define them differently. Not sure where you\u0027d git this information, though (perhaps the user\u0027s service catalog? a config variable?). In any case, I think it might be best to leave this out for now.","commit_id":"5c87117a7423d9ca3b78ff1ee482cadd9fd1bdbb"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f1e1d28dcfe835532b8b5fa461de6ae3190251b","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    PSEUDO_PARAMETERS \u003d ("},{"line_number":303,"context_line":"        PARAM_STACK_ID, PARAM_STACK_NAME, PARAM_REGION"},{"line_number":304,"context_line":"    ) \u003d ("},{"line_number":305,"context_line":"        \u0027os_stack_id\u0027, \u0027os_stack_name\u0027, \u0027os_region\u0027"},{"line_number":306,"context_line":"    )"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def _pseudo_parameters(self, stack_name, stack_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FPRU%3D","line":305,"updated":"2014-01-16 02:01:14.000000000","message":"Why not \u0027OS::stack_id\u0027. We follow this format for resource types - and it\u0027s a lot better for namespacing parameters away from anything the user is likely to use than \u0027os_\u0027 is.","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f38ed0c849623525a9e9d0890e979d357629ef4","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    SECTIONS_INDIRECT_ACCESS \u003d (PARAMETERS, ) \u003d (\u0027parameters\u0027, )"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    SECTIONS \u003d (SECTIONS_DIRECT_ACCESS + SECTIONS_INDIRECT_ACCESS)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    _CFN_TO_HOT_SECTIONS \u003d {template.Template.VERSION: VERSION,"},{"line_number":51,"context_line":"                            template.Template.DESCRIPTION: DESCRIPTION,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B6EI%3D","line":48,"updated":"2014-01-20 22:40:01.000000000","message":"See my comments in template.py. The same applies here.","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"60d4555fb4f6463a170c23ca93dd304ffe56ed1f","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    SECTIONS_INDIRECT_ACCESS \u003d (PARAMETERS, ) \u003d (\u0027parameters\u0027, )"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    SECTIONS \u003d (SECTIONS_DIRECT_ACCESS + SECTIONS_INDIRECT_ACCESS)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    _CFN_TO_HOT_SECTIONS \u003d {template.Template.VERSION: VERSION,"},{"line_number":51,"context_line":"                            template.Template.DESCRIPTION: DESCRIPTION,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B1vw%3D","line":48,"in_reply_to":"AAAAUH%2F%2B6EI%3D","updated":"2014-01-21 20:33:13.000000000","message":"Done","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f38ed0c849623525a9e9d0890e979d357629ef4","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    def parameters(self, stack_identifier, user_params, validate_value\u003dTrue):"},{"line_number":255,"context_line":"        return HOTParameters("},{"line_number":256,"context_line":"            stack_identifier.stack_name, self,"},{"line_number":257,"context_line":"            stack_id\u003dstack_identifier[stack_identifier.STACK_ID],"},{"line_number":258,"context_line":"            user_params\u003duser_params, validate_value\u003dvalidate_value)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B54E%3D","line":257,"updated":"2014-01-20 22:40:01.000000000","message":"I\u0027d prefer\n\n  stack_id\u003dstack_identifier.stack_id,\n\nAlso, this would best be done in HOTParameters._pseudo_parameters() - i.e. pass the whole stack_identifier on to that method, via the constructor for Paramters/HOTParameters.\n\nNote that we are still inheriting set_stack_id() from template.Template, and that will have the effect of setting the stack_id to stack_identifier.arn(), which is not what we want.","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"60d4555fb4f6463a170c23ca93dd304ffe56ed1f","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    def parameters(self, stack_identifier, user_params, validate_value\u003dTrue):"},{"line_number":255,"context_line":"        return HOTParameters("},{"line_number":256,"context_line":"            stack_identifier.stack_name, self,"},{"line_number":257,"context_line":"            stack_id\u003dstack_identifier[stack_identifier.STACK_ID],"},{"line_number":258,"context_line":"            user_params\u003duser_params, validate_value\u003dvalidate_value)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B05Y%3D","line":257,"in_reply_to":"AAAAUH%2F%2B54E%3D","updated":"2014-01-21 20:33:13.000000000","message":"Done","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f38ed0c849623525a9e9d0890e979d357629ef4","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            yield parameters.Parameter("},{"line_number":337,"context_line":"                self.PARAM_REGION,"},{"line_number":338,"context_line":"                parameters.Schema(parameters.Schema.STRING,"},{"line_number":339,"context_line":"                                  default\u003d\u0027ap-southeast-1\u0027,"},{"line_number":340,"context_line":"                                  constraints\u003d"},{"line_number":341,"context_line":"                                  [constr.AllowedValues([\u0027us-east-1\u0027,"},{"line_number":342,"context_line":"                                                         \u0027us-west-1\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B59Q%3D","line":339,"updated":"2014-01-20 22:40:01.000000000","message":"This value is wrong; we need to obtain the region from the config file somehow. I would prefer to leave the region out of the HOT format until we can implement a working one, rather than just implement something broken.","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"60d4555fb4f6463a170c23ca93dd304ffe56ed1f","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            yield parameters.Parameter("},{"line_number":337,"context_line":"                self.PARAM_REGION,"},{"line_number":338,"context_line":"                parameters.Schema(parameters.Schema.STRING,"},{"line_number":339,"context_line":"                                  default\u003d\u0027ap-southeast-1\u0027,"},{"line_number":340,"context_line":"                                  constraints\u003d"},{"line_number":341,"context_line":"                                  [constr.AllowedValues([\u0027us-east-1\u0027,"},{"line_number":342,"context_line":"                                                         \u0027us-west-1\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B1Yo%3D","line":339,"in_reply_to":"AAAAUH%2F%2B59Q%3D","updated":"2014-01-21 20:33:13.000000000","message":"Done","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"}],"heat/engine/parameters.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f1e1d28dcfe835532b8b5fa461de6ae3190251b","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            pseudo_parameters \u003d parameter_generator._pseudo_parameters("},{"line_number":326,"context_line":"                stack_name, stack_id)"},{"line_number":327,"context_line":"            for param in pseudo_parameters:"},{"line_number":328,"context_line":"                yield param"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"            schemata \u003d self.tmpl.param_schemata().iteritems()"},{"line_number":331,"context_line":"            for name, schema in schemata:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FPZ0%3D","line":328,"updated":"2014-01-16 02:01:14.000000000","message":"Whoa! This is the most complicated imaginable way of writing:\n\n  return parameter_generator._pseudo_parameters(stack_name, stack_id)\n\nWhich means this function probably shouldn\u0027t even exist at all:\n\n  self.params \u003d dict((p.name, p) for p in self._pseudo_parameters(stack_name,\n                                                                  stack_id))","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"521a610585e4f491c7c390006b5ee90ec79251da","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            pseudo_parameters \u003d parameter_generator._pseudo_parameters("},{"line_number":326,"context_line":"                stack_name, stack_id)"},{"line_number":327,"context_line":"            for param in pseudo_parameters:"},{"line_number":328,"context_line":"                yield param"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"            schemata \u003d self.tmpl.param_schemata().iteritems()"},{"line_number":331,"context_line":"            for name, schema in schemata:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2B558%3D","line":328,"in_reply_to":"AAAAUH%2F%2FPZ0%3D","updated":"2014-01-20 21:38:27.000000000","message":"Ugh, I am an idiot. This comment makes no sense because I didn\u0027t see that lines 330-333 were still part of this function. Please ignore. Sorry :(","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f38ed0c849623525a9e9d0890e979d357629ef4","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        self._validate(user_params)"},{"line_number":344,"context_line":"        self.params \u003d dict("},{"line_number":345,"context_line":"            (p.name, p) for p in self._pseudo_parameters(stack_name, stack_id))"},{"line_number":346,"context_line":"        self.params.update(dict((p.name, p) for p in user_parameters()))"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def __contains__(self, key):"},{"line_number":349,"context_line":"        \u0027\u0027\u0027Return whether the specified parameter exists.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B53M%3D","line":346,"updated":"2014-01-20 22:40:01.000000000","message":"OK, I steered you badly wrong on this because I misread your previous patch. Mea maxima culpa.\n\nWhat you\u0027ve come up with is actually pretty good. Here\u0027s another idea that is hopefully less crazy than my last one:\n\n  def user_parameter(schema_item):\n      name, schema \u003d schema_item\n      return Parameter(name, schema,\n                       user_params.get(name),\n                       validate_value)\n\n  schemata \u003d self.tmpl.param_schemata()\n  user_parameters \u003d (user_parameter(si) for si in schemata.iteritems())\n  pseduo_parameters \u003d self._pseudo_parameters(stack_identifier)\n\n  self.params \u003d dict((p.name,\n                      p) for p in itertools.chain(pseudo_parameters,\n                                                  user_parameters))","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"60d4555fb4f6463a170c23ca93dd304ffe56ed1f","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        self._validate(user_params)"},{"line_number":344,"context_line":"        self.params \u003d dict("},{"line_number":345,"context_line":"            (p.name, p) for p in self._pseudo_parameters(stack_name, stack_id))"},{"line_number":346,"context_line":"        self.params.update(dict((p.name, p) for p in user_parameters()))"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def __contains__(self, key):"},{"line_number":349,"context_line":"        \u0027\u0027\u0027Return whether the specified parameter exists.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B048%3D","line":346,"in_reply_to":"AAAAUH%2F%2B53M%3D","updated":"2014-01-21 20:33:13.000000000","message":"Done","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f38ed0c849623525a9e9d0890e979d357629ef4","unresolved":false,"context_lines":[{"line_number":369,"context_line":"        return dict((n, func(p))"},{"line_number":370,"context_line":"                    for n, p in self.params.iteritems() if filter_func(p))"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def set_stack_id(self, stack_id):"},{"line_number":373,"context_line":"        \u0027\u0027\u0027"},{"line_number":374,"context_line":"        Set the StackId pseudo parameter value"},{"line_number":375,"context_line":"        \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B508%3D","line":372,"updated":"2014-01-20 22:40:01.000000000","message":"This needs to take a stack_identifier instead of a stack_id, and we\u0027ll do the conversion to an ARN in this function instead.","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"60d4555fb4f6463a170c23ca93dd304ffe56ed1f","unresolved":false,"context_lines":[{"line_number":369,"context_line":"        return dict((n, func(p))"},{"line_number":370,"context_line":"                    for n, p in self.params.iteritems() if filter_func(p))"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def set_stack_id(self, stack_id):"},{"line_number":373,"context_line":"        \u0027\u0027\u0027"},{"line_number":374,"context_line":"        Set the StackId pseudo parameter value"},{"line_number":375,"context_line":"        \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B040%3D","line":372,"in_reply_to":"AAAAUH%2F%2B508%3D","updated":"2014-01-21 20:33:13.000000000","message":"Done","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"}],"heat/engine/parser.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f1e1d28dcfe835532b8b5fa461de6ae3190251b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        resources.initialise()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.env \u003d env or environment.Environment({})"},{"line_number":102,"context_line":"        self.parameters \u003d self.t.param_builder(self.name, self.t,"},{"line_number":103,"context_line":"                                               user_params\u003dself.env.params)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        self._set_param_stackid()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FPT4%3D","line":102,"updated":"2014-01-16 02:01:14.000000000","message":"It seems really weird to pass the template to itself.","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f1e1d28dcfe835532b8b5fa461de6ae3190251b","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        # This can fail if constructor called without a valid context,"},{"line_number":161,"context_line":"        # as it is in many tests"},{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            stack_arn \u003d self.identifier().arn()"},{"line_number":164,"context_line":"        except (AttributeError, ValueError, TypeError):"},{"line_number":165,"context_line":"            logger.warning(_(\"Unable to set parameters StackId identifier\"))"},{"line_number":166,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FPTs%3D","line":163,"updated":"2014-01-16 02:01:14.000000000","message":"One thing I think you should change here (but in a separate patch) is to just pass self.identifier() to parameters.Parameters instead of the arn as stack_id. In fact, when this is done we can stop passing stack_name separately, since the identifier contains it already.\n\nThis will mean that cfn templates can define AWS::StackId as the arn, but HOT templates can just use the uuid.","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f38ed0c849623525a9e9d0890e979d357629ef4","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        except (AttributeError, ValueError, TypeError):"},{"line_number":164,"context_line":"            logger.warning(_(\"Unable to set parameters StackId identifier\"))"},{"line_number":165,"context_line":"        else:"},{"line_number":166,"context_line":"            self.parameters.set_stack_id(stack_arn)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    @staticmethod"},{"line_number":169,"context_line":"    def _get_dependencies(resources):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B5z8%3D","line":166,"updated":"2014-01-20 22:40:01.000000000","message":"We need to pass self.identifier() here, since the cfn parameters will want the ARN, but the HOT parameters will just want the uuid.","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"60d4555fb4f6463a170c23ca93dd304ffe56ed1f","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        except (AttributeError, ValueError, TypeError):"},{"line_number":164,"context_line":"            logger.warning(_(\"Unable to set parameters StackId identifier\"))"},{"line_number":165,"context_line":"        else:"},{"line_number":166,"context_line":"            self.parameters.set_stack_id(stack_arn)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    @staticmethod"},{"line_number":169,"context_line":"    def _get_dependencies(resources):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B04w%3D","line":166,"in_reply_to":"AAAAUH%2F%2B5z8%3D","updated":"2014-01-21 20:33:13.000000000","message":"Done","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"}],"heat/engine/service.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f1e1d28dcfe835532b8b5fa461de6ae3190251b","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        tmpl_params \u003d tmpl.param_builder(None, tmpl, validate_value\u003dFalse)"},{"line_number":470,"context_line":"        format_validate_parameter \u003d lambda p: dict(p.schema)"},{"line_number":471,"context_line":"        is_real_param \u003d lambda p: \\"},{"line_number":472,"context_line":"            p.name not in tmpl.param_builder.PSEUDO_PARAMETERS"},{"line_number":473,"context_line":"        params \u003d tmpl_params.map(format_validate_parameter, is_real_param)"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        result \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FPSc%3D","line":472,"updated":"2014-01-16 02:01:14.000000000","message":"Just use tmpl_params.PSEUDO_PARAMETERS.","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f38ed0c849623525a9e9d0890e979d357629ef4","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                return {\u0027Error\u0027: str(ex)}"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        tmpl_params \u003d tmpl.parameters("},{"line_number":469,"context_line":"            identifier.HeatIdentifier(\u0027\u0027, \u0027\u0027, None), {}, validate_value\u003dFalse)"},{"line_number":470,"context_line":"        is_real_param \u003d lambda p: \\"},{"line_number":471,"context_line":"            p.name not in tmpl_params.PSEUDO_PARAMETERS"},{"line_number":472,"context_line":"        params \u003d tmpl_params.map(api.format_validate_parameter, is_real_param)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B5vg%3D","line":469,"updated":"2014-01-20 22:40:01.000000000","message":"A lot of tests already pass None as the identifier (formerly, the name). I think it\u0027s probably better to allow the _pseudo_parameters() methods to define what values are used when the identifier is None, rather than creating a made-up identifier here.","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"60d4555fb4f6463a170c23ca93dd304ffe56ed1f","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                return {\u0027Error\u0027: str(ex)}"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        tmpl_params \u003d tmpl.parameters("},{"line_number":469,"context_line":"            identifier.HeatIdentifier(\u0027\u0027, \u0027\u0027, None), {}, validate_value\u003dFalse)"},{"line_number":470,"context_line":"        is_real_param \u003d lambda p: \\"},{"line_number":471,"context_line":"            p.name not in tmpl_params.PSEUDO_PARAMETERS"},{"line_number":472,"context_line":"        params \u003d tmpl_params.map(api.format_validate_parameter, is_real_param)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B028%3D","line":469,"in_reply_to":"AAAAUH%2F%2B5vg%3D","updated":"2014-01-21 20:33:13.000000000","message":"Done","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"}],"heat/engine/template.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f1e1d28dcfe835532b8b5fa461de6ae3190251b","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            default \u003d \u0027No description\u0027"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            default \u003d {}"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        return self.t.get(section, default)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def __iter__(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FPTg%3D","line":79,"updated":"2014-01-16 02:01:14.000000000","message":"Double points if you deprecate accessing the properties through the template:\n\n  if section \u003d\u003d PROPERTIES:\n      raise KeyError(\u0027Not like that!\u0027)\n\n(maybe in a follow-up patch.)","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f1e1d28dcfe835532b8b5fa461de6ae3190251b","unresolved":false,"context_lines":[{"line_number":477,"context_line":"                     parameters.ParamSchema(schema)"},{"line_number":478,"context_line":"                     ) for name, schema in params)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    @property"},{"line_number":481,"context_line":"    def param_builder(self):"},{"line_number":482,"context_line":"        return parameters.Parameters"},{"line_number":483,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FPTQ%3D","line":480,"updated":"2014-01-16 02:01:14.000000000","message":"This may be the most pointless use of @property I have yet seen. For these purposes, this is exactly the same as writing:\n\n  param_builder \u003d parameters.Parameters","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f1e1d28dcfe835532b8b5fa461de6ae3190251b","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                     ) for name, schema in params)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    @property"},{"line_number":481,"context_line":"    def param_builder(self):"},{"line_number":482,"context_line":"        return parameters.Parameters"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FPTw%3D","line":481,"updated":"2014-01-16 02:01:14.000000000","message":"This would be much better as just an instance method:\n\n  def parameters(self, stack_identifier, user_params):\n      return parameters.Parameters(stack_identifier.stack_name,\n                                   self,\n                                   stack_id\u003dstack_identifier.arn(),\n                                   user_params\u003duser_params)","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f38ed0c849623525a9e9d0890e979d357629ef4","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    SECTIONS_INDIRECT_ACCESS \u003d (PARAMETERS, ) \u003d (\u0027Parameters\u0027, )"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    SECTIONS \u003d (SECTIONS_DIRECT_ACCESS + SECTIONS_INDIRECT_ACCESS)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __new__(cls, template, *args, **kwargs):"},{"line_number":38,"context_line":"        \u0027\u0027\u0027Create a new Template of the appropriate class.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B6Lg%3D","line":35,"updated":"2014-01-20 22:40:01.000000000","message":"It might be slightly tider to list those sections where direct access is not allowed separately, e.g.:\n\n  SECTIONS \u003d (VERSION, DESCRIPTION, MAPPINGS,\t\t\n              PARAMETERS, RESOURCES, OUTPUTS) \u003d \\\t\t\n             (\u0027AWSTemplateFormatVersion\u0027, \u0027Description\u0027, \u0027Mappings\u0027,\t\t\n              \u0027Parameters\u0027, \u0027Resources\u0027, \u0027Outputs\u0027)\n\n  SECTIONS_NO_DIRECT_ACCESS \u003d set([PARAMETERS])\n\nand then later in __getitem__:\n\n  assert section not in SECTIONS_NO_DIRECT_ACCESS\n\nin __iter__:\n\n  return (s for s in self.SECTIONS if s not in SECTIONS_NO_DIRECT_ACCESS)\n\nand in __len__:\n\n  return len(self.SECTIONS) - len(self.SECTIONS_NO_DIRECT_ACCESS)\n\nOver time the plan is to move more sections into the indirect access part, until eventually there are no keys left and we can remove all of the Mapping features from the class. However, the SECTIONS list should remain constant across that set of changes. So this way should be easier to maintain throughout the transition.","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"60d4555fb4f6463a170c23ca93dd304ffe56ed1f","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    SECTIONS_INDIRECT_ACCESS \u003d (PARAMETERS, ) \u003d (\u0027Parameters\u0027, )"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    SECTIONS \u003d (SECTIONS_DIRECT_ACCESS + SECTIONS_INDIRECT_ACCESS)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __new__(cls, template, *args, **kwargs):"},{"line_number":38,"context_line":"        \u0027\u0027\u0027Create a new Template of the appropriate class.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B10k%3D","line":35,"in_reply_to":"AAAAUH%2F%2B6Lg%3D","updated":"2014-01-21 20:33:13.000000000","message":"Done","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"}],"heat/tests/test_parameters.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f1e1d28dcfe835532b8b5fa461de6ae3190251b","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    def test_pseudo_params(self):"},{"line_number":340,"context_line":"        params \u003d self.new_parameters(\u0027test_stack\u0027, {\"Parameters\": {}})"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        self.assertEqual(params[params.PARAM_STACK_NAME], \u0027test_stack\u0027)"},{"line_number":343,"context_line":"        self.assertEqual(params[params.PARAM_STACK_ID], \u0027None\u0027)"},{"line_number":344,"context_line":"        self.assertIn(params.PARAM_REGION, params)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FPSE%3D","line":342,"updated":"2014-01-16 02:01:14.000000000","message":"So, if we reuse constants in tests we fail to check the actual thing that was the point (i.e. that we get a parameter called \u0027AWS::StackName\u0027 with the value \u0027test_stack\u0027). At this point we\u0027re checking only internal consistency, which is nice but definitely not the only thing we want.\n\nUnit tests are an odd exception to the normal rules of software engineering, where you try to reduce entropy using the DRY principle. Entropy is actually a key requirement of testing.","commit_id":"aa82cd47e85efbc280b93106260cffe1321ea725"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"adde1f62cba02babbef1d5ba9dd5b5df05c5ddf7","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def new_parameter(self, name, schema, value\u003dNone,"},{"line_number":30,"context_line":"                      validate_value\u003dTrue):"},{"line_number":31,"context_line":"        tmpl \u003d template.Template({template.Template.PARAMETERS: {name:"},{"line_number":32,"context_line":"                                                                 schema}})"},{"line_number":33,"context_line":"        schema \u003d tmpl.param_schemata()[name]"},{"line_number":34,"context_line":"        return parameters.Parameter(name, schema, value,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BVgU%3D","line":31,"updated":"2014-01-27 22:26:23.000000000","message":"We should really just use a string literal in the unit tests, since we want to check for more than internal consistency. Not really your problem though...","commit_id":"fb925e5d4fb2b794e5728206b673c92e9e3be19d"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"8afeb7f01071fa513abdec8abb5b45670416ea43","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def new_parameter(self, name, schema, value\u003dNone,"},{"line_number":30,"context_line":"                      validate_value\u003dTrue):"},{"line_number":31,"context_line":"        tmpl \u003d template.Template({template.Template.PARAMETERS: {name:"},{"line_number":32,"context_line":"                                                                 schema}})"},{"line_number":33,"context_line":"        schema \u003d tmpl.param_schemata()[name]"},{"line_number":34,"context_line":"        return parameters.Parameter(name, schema, value,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BQ34%3D","line":31,"in_reply_to":"AAAAUH%2F%2BVgU%3D","updated":"2014-01-28 15:27:53.000000000","message":"Done","commit_id":"fb925e5d4fb2b794e5728206b673c92e9e3be19d"}],"heat/tests/test_parser.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"0f38ed0c849623525a9e9d0890e979d357629ef4","unresolved":false,"context_lines":[{"line_number":907,"context_line":"        exp_prefix \u003d (\u0027arn:openstack:heat::test_tenant_id\u0027"},{"line_number":908,"context_line":"                      \u0027:stacks/param_arn_test/\u0027)"},{"line_number":909,"context_line":"        self.assertEqual(self.stack.parameters["},{"line_number":910,"context_line":"                         self.stack.parameters.PARAM_STACK_ID],"},{"line_number":911,"context_line":"                         exp_prefix + \u0027None\u0027)"},{"line_number":912,"context_line":"        self.stack.store()"},{"line_number":913,"context_line":"        identifier \u003d self.stack.identifier()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B5tw%3D","line":910,"updated":"2014-01-20 22:40:01.000000000","message":"This should not have changed; we really want to test that the parameter is actually called \u0027AWS::StackId\u0027, not just that we have internal consistency.\n\nThis is also checking that the output is the ARN, which is correct for cfn but not for HOT. So you\u0027re actually going to have to override these 3 tests in test_hot.StackTest anyway.","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"60d4555fb4f6463a170c23ca93dd304ffe56ed1f","unresolved":false,"context_lines":[{"line_number":907,"context_line":"        exp_prefix \u003d (\u0027arn:openstack:heat::test_tenant_id\u0027"},{"line_number":908,"context_line":"                      \u0027:stacks/param_arn_test/\u0027)"},{"line_number":909,"context_line":"        self.assertEqual(self.stack.parameters["},{"line_number":910,"context_line":"                         self.stack.parameters.PARAM_STACK_ID],"},{"line_number":911,"context_line":"                         exp_prefix + \u0027None\u0027)"},{"line_number":912,"context_line":"        self.stack.store()"},{"line_number":913,"context_line":"        identifier \u003d self.stack.identifier()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2B0zY%3D","line":910,"in_reply_to":"AAAAUH%2F%2B5tw%3D","updated":"2014-01-21 20:33:13.000000000","message":"Done","commit_id":"83a4260557b4b89f3a061a587d41f3029681461a"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"adde1f62cba02babbef1d5ba9dd5b5df05c5ddf7","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def test_defaults(self):"},{"line_number":129,"context_line":"        empty \u003d parser.Template({})"},{"line_number":130,"context_line":"        self.assertNotIn(empty.VERSION, empty)"},{"line_number":131,"context_line":"        self.assertEqual(\u0027No description\u0027, empty[empty.DESCRIPTION])"},{"line_number":132,"context_line":"        self.assertEqual({}, empty[empty.MAPPINGS])"},{"line_number":133,"context_line":"        self.assertEqual({}, empty[empty.RESOURCES])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BVgI%3D","line":130,"updated":"2014-01-27 22:26:23.000000000","message":"Same deal, string literals would be better.","commit_id":"fb925e5d4fb2b794e5728206b673c92e9e3be19d"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"8afeb7f01071fa513abdec8abb5b45670416ea43","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def test_defaults(self):"},{"line_number":129,"context_line":"        empty \u003d parser.Template({})"},{"line_number":130,"context_line":"        self.assertNotIn(empty.VERSION, empty)"},{"line_number":131,"context_line":"        self.assertEqual(\u0027No description\u0027, empty[empty.DESCRIPTION])"},{"line_number":132,"context_line":"        self.assertEqual({}, empty[empty.MAPPINGS])"},{"line_number":133,"context_line":"        self.assertEqual({}, empty[empty.RESOURCES])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BQ3w%3D","line":130,"in_reply_to":"AAAAUH%2F%2BVgI%3D","updated":"2014-01-28 15:27:53.000000000","message":"Done","commit_id":"fb925e5d4fb2b794e5728206b673c92e9e3be19d"}],"heat/tests/test_stack_resource.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"adde1f62cba02babbef1d5ba9dd5b5df05c5ddf7","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                 MyStackResource)"},{"line_number":99,"context_line":"        resource._register_class(\u0027GenericResource\u0027,"},{"line_number":100,"context_line":"                                 generic_rsrc.GenericResource)"},{"line_number":101,"context_line":"        t \u003d parser.Template({template.Template.RESOURCES:"},{"line_number":102,"context_line":"                             {\"provider_resource\": ws_res_snippet}})"},{"line_number":103,"context_line":"        self.parent_stack \u003d parser.Stack(utils.dummy_context(), \u0027test_stack\u0027,"},{"line_number":104,"context_line":"                                         t, stack_id\u003dstr(uuid.uuid4()))"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BVgA%3D","line":101,"updated":"2014-01-27 22:26:23.000000000","message":"And here.","commit_id":"fb925e5d4fb2b794e5728206b673c92e9e3be19d"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"8afeb7f01071fa513abdec8abb5b45670416ea43","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                 MyStackResource)"},{"line_number":99,"context_line":"        resource._register_class(\u0027GenericResource\u0027,"},{"line_number":100,"context_line":"                                 generic_rsrc.GenericResource)"},{"line_number":101,"context_line":"        t \u003d parser.Template({template.Template.RESOURCES:"},{"line_number":102,"context_line":"                             {\"provider_resource\": ws_res_snippet}})"},{"line_number":103,"context_line":"        self.parent_stack \u003d parser.Stack(utils.dummy_context(), \u0027test_stack\u0027,"},{"line_number":104,"context_line":"                                         t, stack_id\u003dstr(uuid.uuid4()))"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BQ3k%3D","line":101,"in_reply_to":"AAAAUH%2F%2BVgA%3D","updated":"2014-01-28 15:27:53.000000000","message":"Done","commit_id":"fb925e5d4fb2b794e5728206b673c92e9e3be19d"}]}
