)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"be484b11a639426704099845df3c312944829f54","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add base plugin-based Credential class."},{"line_number":10,"context_line":"Add child class for OpenStack Credentials."},{"line_number":11,"context_line":"Implements specs/in-progress/deployment_type: steps 5-8."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I74a5db3fa16a4b34cf3758cb3c5ec81d4b89d2fb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a061dce_16f4c058","line":12,"updated":"2016-04-07 14:42:11.000000000","message":"You probably want an \u0027Implements blueprint: ...\u0027 line here.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"67d51e6ae6865dcfa7eff0d2f2035d68dc69ddfa","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add base plugin-based Credential class."},{"line_number":10,"context_line":"Add child class for OpenStack Credentials."},{"line_number":11,"context_line":"Implements specs/in-progress/deployment_type: steps 5-8."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I74a5db3fa16a4b34cf3758cb3c5ec81d4b89d2fb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a061dce_75da2d18","line":12,"in_reply_to":"9a061dce_16f4c058","updated":"2016-04-08 06:53:59.000000000","message":"Yes please create blueprint on launchpad and link it here.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"}],"rally/plugins/common/credentials.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"67d51e6ae6865dcfa7eff0d2f2035d68dc69ddfa","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \"\"\""},{"line_number":34,"context_line":"    def wrapper(cls):"},{"line_number":35,"context_line":"        cls \u003d plugin.configure(name\u003dname)(cls)"},{"line_number":36,"context_line":"        cls._meta_set(\"schema\", schema)"},{"line_number":37,"context_line":"        return cls"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    return wrapper"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_9729c48c","line":36,"updated":"2016-04-08 06:53:59.000000000","message":"so we are going to unify validation mechanism for this case, can we just keep old approach here as well for now, so this will be class field.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"67d51e6ae6865dcfa7eff0d2f2035d68dc69ddfa","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":43,"context_line":"@configure(name\u003d\"base_credentials\", schema\u003dNone)"},{"line_number":44,"context_line":"class Credentials(plugin.Plugin):"},{"line_number":45,"context_line":"    \"\"\"Base credentials plugin.\"\"\""},{"line_number":46,"context_line":"    def __init__(self, credentials):"},{"line_number":47,"context_line":"        self.validate(credentials)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_ab0746c8","line":44,"updated":"2016-04-08 06:53:59.000000000","message":"This is base class for any kind of Credentials it should be a part of framework so it should go somewhere in rally/deployment/credentials.py \nbecause this is part of deployment engine.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"67d51e6ae6865dcfa7eff0d2f2035d68dc69ddfa","unresolved":false,"context_lines":[{"line_number":43,"context_line":"@configure(name\u003d\"base_credentials\", schema\u003dNone)"},{"line_number":44,"context_line":"class Credentials(plugin.Plugin):"},{"line_number":45,"context_line":"    \"\"\"Base credentials plugin.\"\"\""},{"line_number":46,"context_line":"    def __init__(self, credentials):"},{"line_number":47,"context_line":"        self.validate(credentials)"},{"line_number":48,"context_line":"        super(Credentials, self).__setattr__(\"credentials\", credentials)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_0b5c7249","line":46,"updated":"2016-04-08 06:53:59.000000000","message":"So I would like to see here **credentials instead of just credentials. \nAfter that you can just put here: \n\n   self.credentials \u003d credentials \n   for key, value in credentials.items():\n       setattr(self, key, value)","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"be484b11a639426704099845df3c312944829f54","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\"Base credentials plugin.\"\"\""},{"line_number":46,"context_line":"    def __init__(self, credentials):"},{"line_number":47,"context_line":"        self.validate(credentials)"},{"line_number":48,"context_line":"        super(Credentials, self).__setattr__(\"credentials\", credentials)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def __getattr__(self, item):"},{"line_number":51,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_36074483","line":48,"updated":"2016-04-07 14:42:11.000000000","message":"Why isn\u0027t this just:\n\n    self.credentials \u003d credentials","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"be484b11a639426704099845df3c312944829f54","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.validate(credentials)"},{"line_number":48,"context_line":"        super(Credentials, self).__setattr__(\"credentials\", credentials)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def __getattr__(self, item):"},{"line_number":51,"context_line":"        try:"},{"line_number":52,"context_line":"            if item in self.__dict__:"},{"line_number":53,"context_line":"                return self.__dict__[item]"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_f6bdcc02","line":50,"updated":"2016-04-07 14:42:11.000000000","message":"If we want this to act dict-like, seems like we could either inherit from Bunch (https://pypi.python.org/pypi/bunch/1.0.1), or from MutableMapping, to get a more full-featured dict-like object.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"67d51e6ae6865dcfa7eff0d2f2035d68dc69ddfa","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.validate(credentials)"},{"line_number":48,"context_line":"        super(Credentials, self).__setattr__(\"credentials\", credentials)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def __getattr__(self, item):"},{"line_number":51,"context_line":"        try:"},{"line_number":52,"context_line":"            if item in self.__dict__:"},{"line_number":53,"context_line":"                return self.__dict__[item]"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_eb0dbee8","line":50,"in_reply_to":"9a061dce_f6bdcc02","updated":"2016-04-08 06:53:59.000000000","message":"I would prefer just to setup in __init__ something like this.  \n\n\n  self.username \u003d ...\n  self.password \u003d ...","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"}],"rally/plugins/openstack/credentials.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"be484b11a639426704099845df3c312944829f54","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        # with default values to save backward compatibility"},{"line_number":67,"context_line":"        # with old Credentials class"},{"line_number":68,"context_line":"        credentials_with_default \u003d default_credentials_values.copy()"},{"line_number":69,"context_line":"        credentials_with_default.update(credentials_dict)"},{"line_number":70,"context_line":"        super(OpenStackCredentials, self).__init__(credentials_with_default)"},{"line_number":71,"context_line":"        self.insecure \u003d self.https_insecure"},{"line_number":72,"context_line":"        self.cacert \u003d self.https_cacert"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_7657fcc9","line":69,"updated":"2016-04-07 14:42:11.000000000","message":"Seems like setting defaults could be made part of the base class. Other credentials plugins will certainly want to use that functionality.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"67d51e6ae6865dcfa7eff0d2f2035d68dc69ddfa","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        credentials_with_default \u003d default_credentials_values.copy()"},{"line_number":69,"context_line":"        credentials_with_default.update(credentials_dict)"},{"line_number":70,"context_line":"        super(OpenStackCredentials, self).__init__(credentials_with_default)"},{"line_number":71,"context_line":"        self.insecure \u003d self.https_insecure"},{"line_number":72,"context_line":"        self.cacert \u003d self.https_cacert"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def to_dict(self, include_permission\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_773350f7","line":71,"updated":"2016-04-08 06:53:59.000000000","message":"why we need this 71 and 72 lines.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"be484b11a639426704099845df3c312944829f54","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.insecure \u003d self.https_insecure"},{"line_number":72,"context_line":"        self.cacert \u003d self.https_cacert"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def to_dict(self, include_permission\u003dFalse):"},{"line_number":75,"context_line":"        credentials_dict \u003d self.credentials.copy()"},{"line_number":76,"context_line":"        credentials_dict.pop(\"cacert\")"},{"line_number":77,"context_line":"        credentials_dict.pop(\"insecure\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_5628f832","line":74,"updated":"2016-04-07 14:42:11.000000000","message":"Deviating from the superclass function signature is an antipattern. Let\u0027s see if we can avoid that; if we can\u0027t, please comment this explaining in great detail why it\u0027s necessary.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"be484b11a639426704099845df3c312944829f54","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def to_dict(self, include_permission\u003dFalse):"},{"line_number":75,"context_line":"        credentials_dict \u003d self.credentials.copy()"},{"line_number":76,"context_line":"        credentials_dict.pop(\"cacert\")"},{"line_number":77,"context_line":"        credentials_dict.pop(\"insecure\")"},{"line_number":78,"context_line":"        if not include_permission:"},{"line_number":79,"context_line":"            credentials_dict.pop(\"permission\")"},{"line_number":80,"context_line":"        return credentials_dict"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_76dc1c46","line":77,"updated":"2016-04-07 14:42:11.000000000","message":"Please add a comment explaining why to_dict() doesn\u0027t just convert to a dict, but munges the data. Or, don\u0027t munge the data, just convert to a dict.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"67d51e6ae6865dcfa7eff0d2f2035d68dc69ddfa","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def to_dict(self, include_permission\u003dFalse):"},{"line_number":75,"context_line":"        credentials_dict \u003d self.credentials.copy()"},{"line_number":76,"context_line":"        credentials_dict.pop(\"cacert\")"},{"line_number":77,"context_line":"        credentials_dict.pop(\"insecure\")"},{"line_number":78,"context_line":"        if not include_permission:"},{"line_number":79,"context_line":"            credentials_dict.pop(\"permission\")"},{"line_number":80,"context_line":"        return credentials_dict"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_9750a40c","line":77,"in_reply_to":"9a061dce_76dc1c46","updated":"2016-04-08 06:53:59.000000000","message":"+1","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"}],"tests/unit/plugins/common/test_credentails.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"be484b11a639426704099845df3c312944829f54","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    pass"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class CredentialsTestCase(test.TestCase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_to_dict(self):"},{"line_number":43,"context_line":"        credential \u003d credentials.Credentials.get(\"fake_creds\")("}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_f675cc31","line":40,"updated":"2016-04-07 14:42:11.000000000","message":"We need a test for JSON validation failures.\n\nWe need a test case for setattr() too. Technically it\u0027s tested each time we use the constructor, but that\u0027s implementation-specific and can\u0027t be relied upon.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"be484b11a639426704099845df3c312944829f54","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_to_dict(self):"},{"line_number":43,"context_line":"        credential \u003d credentials.Credentials.get(\"fake_creds\")("},{"line_number":44,"context_line":"            dict("},{"line_number":45,"context_line":"                auth_url\u003d\"foo_url\","},{"line_number":46,"context_line":"                username\u003d\"foo_user\","},{"line_number":47,"context_line":"                password\u003d\"foo_password\","}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_96a1f096","line":44,"updated":"2016-04-07 14:42:11.000000000","message":"Use {} instead of dict(), here and elsewhere.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"}],"tests/unit/plugins/openstack/test_credentails.py":[{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"be484b11a639426704099845df3c312944829f54","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                          \"user_domain_name\": \"Default\","},{"line_number":68,"context_line":"                          \"admin_domain_name\": \"Default\"})"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_to_dict_with_kwarg_credential(self):"},{"line_number":71,"context_line":"        credential \u003d credentials.Credentials.get(\"openstack\")("},{"line_number":72,"context_line":"            dict("},{"line_number":73,"context_line":"                auth_url\u003d\"foo_url\","}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_367c64eb","line":70,"updated":"2016-04-07 14:42:11.000000000","message":"I don\u0027t understand what this function is testing.","commit_id":"a4d4fe94bfeee943e2cf5e8628886ce98ce67517"}]}
