)]}'
{"keystone/common/validation/parameter_types.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"de05623a32321e1658b973700f429f0cc4d17d78","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":44,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":45,"context_line":"    \u0027maxLength\u0027: 64,"},{"line_number":46,"context_line":"    \u0027pattern\u0027: CONF.validation.id_string_regex"},{"line_number":47,"context_line":"}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"mapping_id_string \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_bb0e8138","line":46,"range":{"start_line":46,"start_character":2,"end_line":46,"end_character":46},"updated":"2016-06-30 19:42:16.000000000","message":"DO NOT reference config options on import *ever*","commit_id":"d89d550ccfde06cc0c9c27c983e5fe77bdfbf358"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c5006235ca89c59f187849bc5e2b78ceab4d4980","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":44,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":45,"context_line":"    \u0027maxLength\u0027: 64,"},{"line_number":46,"context_line":"    \u0027pattern\u0027: CONF.validation.id_string_regex"},{"line_number":47,"context_line":"}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"mapping_id_string \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_6d010005","line":46,"updated":"2016-06-30 19:42:28.000000000","message":"The actual configured value isn\u0027t going to be set at this point, since that only happens after the server is running, not at import time.","commit_id":"d89d550ccfde06cc0c9c27c983e5fe77bdfbf358"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c725c288d56511e50afca73b02a7ef86ebcb7c72","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":44,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":45,"context_line":"    \u0027maxLength\u0027: 64,"},{"line_number":46,"context_line":"    \u0027pattern\u0027: CONF.validation.id_string_regex"},{"line_number":47,"context_line":"}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"mapping_id_string \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_b9fa3b41","line":46,"in_reply_to":"1aa78d24_39976b3b","updated":"2016-07-06 14:24:24.000000000","message":"What you will have to do is create a decorator that only when called references a function like keystone.common.validation.parameter_types.get_id_string(). This way it\u0027s lazy and read the config value.","commit_id":"d89d550ccfde06cc0c9c27c983e5fe77bdfbf358"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0554e60380886018c0e4b82b71320d65ea225c3f","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":44,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":45,"context_line":"    \u0027maxLength\u0027: 64,"},{"line_number":46,"context_line":"    \u0027pattern\u0027: CONF.validation.id_string_regex"},{"line_number":47,"context_line":"}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"mapping_id_string \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_39976b3b","line":46,"in_reply_to":"3aaa91ec_6d010005","updated":"2016-07-06 14:20:39.000000000","message":"Should we pull this all out into a class so that the dictionary isn\u0027t referenced on import?","commit_id":"d89d550ccfde06cc0c9c27c983e5fe77bdfbf358"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0d3c1bf5a9e2a273a6fcd00b44499bcdd74b4ebb","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\"\"\"Common parameter types for validating a request reference.\"\"\""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import keystone.conf"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"CONF \u003d keystone.conf.CONF"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_dd4ba0af","line":15,"updated":"2016-07-12 15:57:40.000000000","message":"(nit) newline","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4e7bd66771b66d1c26d92adc36073112adcbda55","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\"\"\"Common parameter types for validating a request reference.\"\"\""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import keystone.conf"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"CONF \u003d keystone.conf.CONF"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_ed86a1b7","line":15,"in_reply_to":"1aa78d24_dd4ba0af","updated":"2016-07-12 19:41:23.000000000","message":"Done","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"}],"keystone/common/validation/validators.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0d3c1bf5a9e2a273a6fcd00b44499bcdd74b4ebb","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\"\"\"Internal implementation of request body validating middleware.\"\"\""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import jsonschema"},{"line_number":15,"context_line":"import types"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import six"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_dda7204e","line":15,"updated":"2016-07-12 15:57:40.000000000","message":"types is a builtin Python module, whereas six jsonchema and six art thirdparty","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4e7bd66771b66d1c26d92adc36073112adcbda55","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\"\"\"Internal implementation of request body validating middleware.\"\"\""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import jsonschema"},{"line_number":15,"context_line":"import types"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import six"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_0d7a0dbd","line":15,"in_reply_to":"1aa78d24_dda7204e","updated":"2016-07-12 19:41:23.000000000","message":"Done","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0d3c1bf5a9e2a273a6fcd00b44499bcdd74b4ebb","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # call the factories to resolve the now registered values from config."},{"line_number":53,"context_line":"        # The good ol\u0027 switcheroo!"},{"line_number":54,"context_line":"        for key, value in six.iteritems(schema):"},{"line_number":55,"context_line":"            if isinstance(value, types.FunctionType):"},{"line_number":56,"context_line":"                schema[key] \u003d value()"},{"line_number":57,"context_line":"            elif isinstance(value, dict):"},{"line_number":58,"context_line":"                self._resolve_config_values_in_schema(value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_13007900","line":55,"updated":"2016-07-12 15:57:40.000000000","message":"Why not just use \u0027if callable(value)\u0027 here? That way it can work for other callables too.","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4e7bd66771b66d1c26d92adc36073112adcbda55","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # call the factories to resolve the now registered values from config."},{"line_number":53,"context_line":"        # The good ol\u0027 switcheroo!"},{"line_number":54,"context_line":"        for key, value in six.iteritems(schema):"},{"line_number":55,"context_line":"            if isinstance(value, types.FunctionType):"},{"line_number":56,"context_line":"                schema[key] \u003d value()"},{"line_number":57,"context_line":"            elif isinstance(value, dict):"},{"line_number":58,"context_line":"                self._resolve_config_values_in_schema(value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_8801cb07","line":55,"in_reply_to":"1aa78d24_13007900","updated":"2016-07-12 19:41:23.000000000","message":"Done","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0d3c1bf5a9e2a273a6fcd00b44499bcdd74b4ebb","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        try:"},{"line_number":63,"context_line":"            # NOTE(lbragstad): Make sure that we resolve any configuration"},{"line_number":64,"context_line":"            # options for validation."},{"line_number":65,"context_line":"            self.validator.schema \u003d self._resolve_config_values_in_schema("},{"line_number":66,"context_line":"                self.validator.schema"},{"line_number":67,"context_line":"            )"},{"line_number":68,"context_line":"            self.validator.validate(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_53f041fd","line":65,"updated":"2016-07-12 15:57:40.000000000","message":"Should we be caching this at all so we don\u0027t have to traverse the tree every time? I\u0027ve not timed it myself so it may not actually be slow.","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4e7bd66771b66d1c26d92adc36073112adcbda55","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        try:"},{"line_number":63,"context_line":"            # NOTE(lbragstad): Make sure that we resolve any configuration"},{"line_number":64,"context_line":"            # options for validation."},{"line_number":65,"context_line":"            self.validator.schema \u003d self._resolve_config_values_in_schema("},{"line_number":66,"context_line":"                self.validator.schema"},{"line_number":67,"context_line":"            )"},{"line_number":68,"context_line":"            self.validator.validate(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_e8104f50","line":65,"in_reply_to":"1aa78d24_53f041fd","updated":"2016-07-12 19:41:23.000000000","message":"Yeah - we should.. any good recommendations on how we should do this for each schema?","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"}],"keystone/conf/validation.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"78290327552190ce1da59a2c2640fa04dfb5f8f9","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    \u0027id_string_regex\u0027,"},{"line_number":20,"context_line":"    default\u003d\u0027^[a-zA-Z0-9-]+$\u0027,"},{"line_number":21,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":22,"context_line":"Regular expression used to validate unique identifiers of resources."},{"line_number":23,"context_line":"\"\"\"))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_132012f7","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":67},"updated":"2016-06-27 21:36:47.000000000","message":"consider stating what the default validates, not everyone wants to lookup regex patterns ;)","commit_id":"d89d550ccfde06cc0c9c27c983e5fe77bdfbf358"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"74e1fdd99303ab1220a5c45fe3ab7d4c7c4c7234","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    \u0027id_string_regex\u0027,"},{"line_number":20,"context_line":"    default\u003d\u0027^[a-zA-Z0-9-]+$\u0027,"},{"line_number":21,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":22,"context_line":"Regular expression used to validate unique identifiers of resources."},{"line_number":23,"context_line":"\"\"\"))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_33cb8e20","line":22,"in_reply_to":"3aaa91ec_132012f7","updated":"2016-06-27 21:38:37.000000000","message":"++","commit_id":"d89d550ccfde06cc0c9c27c983e5fe77bdfbf358"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"ca15c91a9eeec5abc54c91ecd89d6c553cb546c0","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"id_string_regex \u003d cfg.StrOpt("},{"line_number":19,"context_line":"    \u0027id_string_regex\u0027,"},{"line_number":20,"context_line":"    default\u003d\u0027^[a-zA-Z0-9-]+$\u0027,"},{"line_number":21,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":22,"context_line":"Regular expression used to validate unique identifiers of resources. The"},{"line_number":23,"context_line":"default regular expression matches all letters between A and Z regardless of"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a89bdaa_e9e369a2","line":20,"range":{"start_line":20,"start_character":13,"end_line":20,"end_character":28},"updated":"2016-09-07 01:23:09.000000000","message":"nice, default is backwards compatible","commit_id":"07d020c3c4b3f45f040d7177f168c3c90f7f528a"}],"keystone/tests/unit/test_validation.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0d3c1bf5a9e2a273a6fcd00b44499bcdd74b4ebb","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            entity_update)"},{"line_number":139,"context_line":"        self.config_fixture \u003d self.useFixture(config_fixture.Config(CONF))"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def config_overrides(self):"},{"line_number":142,"context_line":"        super(EntityValidationTestCase, self).config_overrides()"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_create_entity_with_all_valid_parameters_validates(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_1338799f","line":141,"updated":"2016-07-12 15:57:40.000000000","message":"Do you actually need this?","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4e7bd66771b66d1c26d92adc36073112adcbda55","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            entity_update)"},{"line_number":139,"context_line":"        self.config_fixture \u003d self.useFixture(config_fixture.Config(CONF))"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def config_overrides(self):"},{"line_number":142,"context_line":"        super(EntityValidationTestCase, self).config_overrides()"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_create_entity_with_all_valid_parameters_validates(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_282ed78b","line":141,"in_reply_to":"1aa78d24_1338799f","updated":"2016-07-12 19:41:23.000000000","message":"Maybe? Let me double check.","commit_id":"8c4553cc6caa14489f0c1acdf9b4d1608f08f582"}]}
