)]}'
{"specs/kilo/object-dependency-lifecycle.rst":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"51b1461928bff304fcb7f8c04a1a8f80dc762fc1","unresolved":false,"context_lines":[{"line_number":38,"context_line":" * DI is about dynamically buiding object graphs where different"},{"line_number":39,"context_line":"   implementations of some interface can be used. We don\u0027t really do that."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Constrants:"},{"line_number":42,"context_line":" * Keep APIs as backward compatible as possible (drivers for sure, managers and"},{"line_number":43,"context_line":"   controllers to a lesser extent)"},{"line_number":44,"context_line":" * Compatibility with Stevedore ( http://stevedore.readthedocs.org/en/latest/ )"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_68f62dfb","line":41,"updated":"2014-11-20 16:52:43.000000000","message":"typo here","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f797ed1585e8a3c6d570cbd1c0c7a130f1c7a6c6","unresolved":false,"context_lines":[{"line_number":38,"context_line":" * DI is about dynamically buiding object graphs where different"},{"line_number":39,"context_line":"   implementations of some interface can be used. We don\u0027t really do that."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Constrants:"},{"line_number":42,"context_line":" * Keep APIs as backward compatible as possible (drivers for sure, managers and"},{"line_number":43,"context_line":"   controllers to a lesser extent)"},{"line_number":44,"context_line":" * Compatibility with Stevedore ( http://stevedore.readthedocs.org/en/latest/ )"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_fca58747","line":41,"in_reply_to":"5a890539_68f62dfb","updated":"2014-12-09 19:55:08.000000000","message":"Done","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"51b1461928bff304fcb7f8c04a1a8f80dc762fc1","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"1. Phase I - Manual DI"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":" * Go through and fix classes to expect dependencies to be provides in via"},{"line_number":53,"context_line":"   their __init__"},{"line_number":54,"context_line":" * This will remove the magic and make dependencies a part of the actual"},{"line_number":55,"context_line":"   object definition (poc: http://paste.openstack.org/show/129171/)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_a89d7559","line":52,"updated":"2014-11-20 16:52:43.000000000","message":"provided*","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f797ed1585e8a3c6d570cbd1c0c7a130f1c7a6c6","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"1. Phase I - Manual DI"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":" * Go through and fix classes to expect dependencies to be provides in via"},{"line_number":53,"context_line":"   their __init__"},{"line_number":54,"context_line":" * This will remove the magic and make dependencies a part of the actual"},{"line_number":55,"context_line":"   object definition (poc: http://paste.openstack.org/show/129171/)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_3c670f27","line":52,"in_reply_to":"5a890539_a89d7559","updated":"2014-12-09 19:55:08.000000000","message":"Done","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"a4afe915707f89962a68c4740954b35f0b3a860c","unresolved":false,"context_lines":[{"line_number":63,"context_line":" * Implement optional dependencies using the __init__ as optional kwargs"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"  * This will keep the internal code of the objects the same. We would still"},{"line_number":66,"context_line":"    \u0027if  self.mydep\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":" * Pitfalls:"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_73846a0b","line":66,"updated":"2014-12-01 10:10:24.000000000","message":"nit: two spaces here","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f797ed1585e8a3c6d570cbd1c0c7a130f1c7a6c6","unresolved":false,"context_lines":[{"line_number":63,"context_line":" * Implement optional dependencies using the __init__ as optional kwargs"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"  * This will keep the internal code of the objects the same. We would still"},{"line_number":66,"context_line":"    \u0027if  self.mydep\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":" * Pitfalls:"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_7c7197df","line":66,"in_reply_to":"5a890539_73846a0b","updated":"2014-12-09 19:55:08.000000000","message":"Done","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"a4afe915707f89962a68c4740954b35f0b3a860c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"  * Is there enough need of some of a DI framework\u0027s features to use it?"},{"line_number":79,"context_line":"  * Keystone may not be complicated enough to need anything more."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":" * There are a few exsting frameworks like inject and snake-guice"},{"line_number":82,"context_line":" * Do we need objects that are scoped differently? request scoped, other..."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"3. Phase III - Fix up the model of optional dependencies"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_1649548e","line":81,"updated":"2014-12-01 10:10:24.000000000","message":"s/exsting/existing/","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f797ed1585e8a3c6d570cbd1c0c7a130f1c7a6c6","unresolved":false,"context_lines":[{"line_number":78,"context_line":"  * Is there enough need of some of a DI framework\u0027s features to use it?"},{"line_number":79,"context_line":"  * Keystone may not be complicated enough to need anything more."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":" * There are a few exsting frameworks like inject and snake-guice"},{"line_number":82,"context_line":" * Do we need objects that are scoped differently? request scoped, other..."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"3. Phase III - Fix up the model of optional dependencies"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_bc721fe1","line":81,"in_reply_to":"5a890539_1649548e","updated":"2014-12-09 19:55:08.000000000","message":"Done","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"51b1461928bff304fcb7f8c04a1a8f80dc762fc1","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":" * I think that optional dependencies should be implemented on top of the"},{"line_number":87,"context_line":"   existing object using composition. Having code doing \u0027if self.dep\u0027 is a"},{"line_number":88,"context_line":"   bad smell."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"  * e.g. The optional thingee_api dependency in"},{"line_number":91,"context_line":"    keystone.assignment.core.Manager could be implemented as a wrapper around"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_08a129a9","line":88,"updated":"2014-11-20 16:52:43.000000000","message":"++","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"a4afe915707f89962a68c4740954b35f0b3a860c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"Alternatives"},{"line_number":96,"context_line":"------------"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* We could go all in using a complicated framework with too many features."},{"line_number":99,"context_line":"* We could do nothing and continue to grow the magic."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Security Impact"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_f9983977","line":98,"updated":"2014-12-01 10:10:24.000000000","message":"IMO, \"complicated framework with too many features\" is a little biased for python-inject. It might have some features that we shall not use, but it looks good. AFAI understand, it could prevent https://review.openstack.org/#/c/124599/ by design. I\u0027d suggest to have a better look at it.","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f797ed1585e8a3c6d570cbd1c0c7a130f1c7a6c6","unresolved":false,"context_lines":[{"line_number":95,"context_line":"Alternatives"},{"line_number":96,"context_line":"------------"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"* We could go all in using a complicated framework with too many features."},{"line_number":99,"context_line":"* We could do nothing and continue to grow the magic."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Security Impact"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_6a80e946","line":98,"in_reply_to":"5a890539_f9983977","updated":"2014-12-09 19:55:08.000000000","message":"I\u0027ve had lots of time in the python-inject code already. It\u0027s not really a DI framework at all and is conceptually similar to our current DI. It does a part of the job, but falls short IMO.\n\nI\u0027ve read through most other frameworks and wrote one of my own and I really do think if you don\u0027t need one then don\u0027t use one. This is why I\u0027ve included a phase II.","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"51b1461928bff304fcb7f8c04a1a8f80dc762fc1","unresolved":false,"context_lines":[{"line_number":141,"context_line":"Work Items"},{"line_number":142,"context_line":"----------"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"Work items or tasks -- break the feature up into the things that need to be"},{"line_number":145,"context_line":"done to implement it. Those parts might end up being done by different people,"},{"line_number":146,"context_line":"but we\u0027re mostly trying to understand the timeline for implementation."},{"line_number":147,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_485891fa","line":144,"updated":"2014-11-20 16:52:43.000000000","message":"update this part?","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"31640f73220af28e7e1b01be2369a5421cf2ebb4","unresolved":false,"context_lines":[{"line_number":141,"context_line":"Work Items"},{"line_number":142,"context_line":"----------"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"Work items or tasks -- break the feature up into the things that need to be"},{"line_number":145,"context_line":"done to implement it. Those parts might end up being done by different people,"},{"line_number":146,"context_line":"but we\u0027re mostly trying to understand the timeline for implementation."},{"line_number":147,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_536daecb","line":144,"in_reply_to":"5a890539_485891fa","updated":"2014-12-01 08:16:02.000000000","message":"++","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f797ed1585e8a3c6d570cbd1c0c7a130f1c7a6c6","unresolved":false,"context_lines":[{"line_number":141,"context_line":"Work Items"},{"line_number":142,"context_line":"----------"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"Work items or tasks -- break the feature up into the things that need to be"},{"line_number":145,"context_line":"done to implement it. Those parts might end up being done by different people,"},{"line_number":146,"context_line":"but we\u0027re mostly trying to understand the timeline for implementation."},{"line_number":147,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_7fa3494f","line":144,"in_reply_to":"5a890539_485891fa","updated":"2014-12-09 19:55:08.000000000","message":"Updated. It is surprisingly simple. I didn\u0027t want to break it up by subsystem (ks.identity, ks.assignment, etc) in this list here, but that is how I have been working on it.","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"51b1461928bff304fcb7f8c04a1a8f80dc762fc1","unresolved":false,"context_lines":[{"line_number":155,"context_line":"Documentation Impact"},{"line_number":156,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"None. This spec is about internal modifications to the code structure."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5a890539_c85481cc","line":158,"updated":"2014-11-20 16:52:43.000000000","message":"still might have to update the dev docs, i\u0027m not sure if we mention the current DI mechanisms","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f797ed1585e8a3c6d570cbd1c0c7a130f1c7a6c6","unresolved":false,"context_lines":[{"line_number":155,"context_line":"Documentation Impact"},{"line_number":156,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"None. This spec is about internal modifications to the code structure."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_5c3cdbe2","line":158,"in_reply_to":"5a890539_c85481cc","updated":"2014-12-09 19:55:08.000000000","message":"There are definitely examples of using DI in docs.","commit_id":"bd16cc821c322a13ea19c16756e33ce64db8b80f"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e7cbaad23bda3011f85a8fc2c6ee0e138b8e38df","unresolved":false,"context_lines":[{"line_number":35,"context_line":" * Optional dependencies are currently not implemented in a very OO way; we use"},{"line_number":36,"context_line":"   the existence of the dependency as a sort of feature flag"},{"line_number":37,"context_line":" * Better seams for testing; specifically optional dependencies"},{"line_number":38,"context_line":" * DI is about dynamically buiding object graphs where different"},{"line_number":39,"context_line":"   implementations of some interface can be used. We don\u0027t really do that."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Constraints:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a961159_ab681322","line":38,"updated":"2014-12-09 21:38:35.000000000","message":"s/buiding/building/","commit_id":"f4bdae1064cdb1004307520819e1c25155d1aaca"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"65b83d39f9e7d7a081d0d17f9131b6219e17d9de","unresolved":false,"context_lines":[{"line_number":35,"context_line":" * Optional dependencies are currently not implemented in a very OO way; we use"},{"line_number":36,"context_line":"   the existence of the dependency as a sort of feature flag"},{"line_number":37,"context_line":" * Better seams for testing; specifically optional dependencies"},{"line_number":38,"context_line":" * DI is about dynamically buiding object graphs where different"},{"line_number":39,"context_line":"   implementations of some interface can be used. We don\u0027t really do that."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Constraints:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3a961159_33d4951f","line":38,"in_reply_to":"3a961159_ab681322","updated":"2014-12-09 22:53:11.000000000","message":"Done","commit_id":"f4bdae1064cdb1004307520819e1c25155d1aaca"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"273344fa90c306e776396037ab5e48a78db6067c","unresolved":false,"context_lines":[{"line_number":19,"context_line":" * How do we deal with Optional dependencies?"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"This is based off of a Kilo Summit session"},{"line_number":22,"context_line":"    Pre-session Reading: https://www.morganfainberg.com/blog/2014/10/21/openstack-kilo-summit-pre-summit-thoughts/#objectlifecycle"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Problem Description"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a961159_e5d79521","line":22,"updated":"2014-12-10 11:35:58.000000000","message":"Maybe a not naked link ? :)","commit_id":"354035c87f4af7a58ab286e0028d9f4d60d79690"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0a6bfe5b713376b7251280ab99ea01d40541d17e","unresolved":false,"context_lines":[{"line_number":19,"context_line":" * How do we deal with Optional dependencies?"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"This is based off of a Kilo Summit session"},{"line_number":22,"context_line":"    Pre-session Reading: https://www.morganfainberg.com/blog/2014/10/21/openstack-kilo-summit-pre-summit-thoughts/#objectlifecycle"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Problem Description"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a961159_23142ef4","line":22,"in_reply_to":"3a961159_e5d79521","updated":"2014-12-10 16:17:52.000000000","message":"Fixed. This is an artifact of copy-pate from etherpad.","commit_id":"354035c87f4af7a58ab286e0028d9f4d60d79690"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"273344fa90c306e776396037ab5e48a78db6067c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"Goals:"},{"line_number":28,"context_line":" * What does a DI pattern look like for Keystone?"},{"line_number":29,"context_line":" * What do we do about optional dependencies?"},{"line_number":30,"context_line":" * What type of scoping do we need for our objects?"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Motivation"},{"line_number":33,"context_line":" * Remove the magic of just adding attributes on to an object without really"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a961159_c5bb79e3","line":30,"updated":"2014-12-10 11:35:58.000000000","message":"These bullet points are basically repeating information from the main description above.","commit_id":"354035c87f4af7a58ab286e0028d9f4d60d79690"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0a6bfe5b713376b7251280ab99ea01d40541d17e","unresolved":false,"context_lines":[{"line_number":27,"context_line":"Goals:"},{"line_number":28,"context_line":" * What does a DI pattern look like for Keystone?"},{"line_number":29,"context_line":" * What do we do about optional dependencies?"},{"line_number":30,"context_line":" * What type of scoping do we need for our objects?"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Motivation"},{"line_number":33,"context_line":" * Remove the magic of just adding attributes on to an object without really"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a961159_63f556ca","line":30,"in_reply_to":"3a961159_c5bb79e3","updated":"2014-12-10 16:17:52.000000000","message":"Fixed. This is an artifact of copy-pate from etherpad.","commit_id":"354035c87f4af7a58ab286e0028d9f4d60d79690"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"273344fa90c306e776396037ab5e48a78db6067c","unresolved":false,"context_lines":[{"line_number":35,"context_line":" * Optional dependencies are currently not implemented in a very"},{"line_number":36,"context_line":"   object oriented way; we use the existence of the dependency as a sort of"},{"line_number":37,"context_line":"   feature flag"},{"line_number":38,"context_line":" * Better seams for testing; specifically optional dependencies"},{"line_number":39,"context_line":" * DI is about dynamically building object graphs where different"},{"line_number":40,"context_line":"   implementations of some interface can be used. We don\u0027t really do that."},{"line_number":41,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a961159_05b661fa","line":38,"updated":"2014-12-10 11:35:58.000000000","message":"Great idea!\n\n\nI understand optional dependencies as something that will only be added if the a test really need it.\nIt\u0027s like a lazy evaluation of dependencies, am I right?","commit_id":"354035c87f4af7a58ab286e0028d9f4d60d79690"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0a6bfe5b713376b7251280ab99ea01d40541d17e","unresolved":false,"context_lines":[{"line_number":35,"context_line":" * Optional dependencies are currently not implemented in a very"},{"line_number":36,"context_line":"   object oriented way; we use the existence of the dependency as a sort of"},{"line_number":37,"context_line":"   feature flag"},{"line_number":38,"context_line":" * Better seams for testing; specifically optional dependencies"},{"line_number":39,"context_line":" * DI is about dynamically building object graphs where different"},{"line_number":40,"context_line":"   implementations of some interface can be used. We don\u0027t really do that."},{"line_number":41,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a961159_1481264a","line":38,"in_reply_to":"3a961159_05b661fa","updated":"2014-12-10 16:17:52.000000000","message":"Optional dependencies is an oxymoron. If you depend on it can it really be optional?","commit_id":"354035c87f4af7a58ab286e0028d9f4d60d79690"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"2ec0d0c2a10f6570d4c493ec6b5457c87305ead0","unresolved":false,"context_lines":[{"line_number":35,"context_line":" * Optional dependencies are currently not implemented in a very"},{"line_number":36,"context_line":"   object oriented way; we use the existence of the dependency as a sort of"},{"line_number":37,"context_line":"   feature flag"},{"line_number":38,"context_line":" * Better seams for testing; specifically optional dependencies"},{"line_number":39,"context_line":" * DI is about dynamically building object graphs where different"},{"line_number":40,"context_line":"   implementations of some interface can be used. We don\u0027t really do that."},{"line_number":41,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a961159_6f4c5771","line":38,"in_reply_to":"3a961159_1481264a","updated":"2014-12-10 16:32:27.000000000","message":"What I meant was lazy loading of dependencies. \n\nFor example, if XTestCase needs x_api that, in turn, depends on 4 other api\u0027s, those 4 api\u0027s would just be loaded when any test effectively need them, i.e. making any call that needs those api\u0027s. If no test calls any method of x_api that need those api\u0027s, they won\u0027t be loaded.\n\nMakes sense?","commit_id":"354035c87f4af7a58ab286e0028d9f4d60d79690"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"273344fa90c306e776396037ab5e48a78db6067c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"Constraints:"},{"line_number":43,"context_line":" * Keep APIs as backward compatible as possible (drivers for sure, managers and"},{"line_number":44,"context_line":"   controllers to a lesser extent)"},{"line_number":45,"context_line":" * Compatibility with Stevedore ( http://stevedore.readthedocs.org/en/latest/ )"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Proposed Change"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a961159_456ea930","line":45,"updated":"2014-12-10 11:35:58.000000000","message":"What about\n\n\n`Stevedore \u003chttp://stevedore.readthedocs.org/en/latest/\u003e`_","commit_id":"354035c87f4af7a58ab286e0028d9f4d60d79690"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0a6bfe5b713376b7251280ab99ea01d40541d17e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"Constraints:"},{"line_number":43,"context_line":" * Keep APIs as backward compatible as possible (drivers for sure, managers and"},{"line_number":44,"context_line":"   controllers to a lesser extent)"},{"line_number":45,"context_line":" * Compatibility with Stevedore ( http://stevedore.readthedocs.org/en/latest/ )"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Proposed Change"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3a961159_e33066a0","line":45,"in_reply_to":"3a961159_456ea930","updated":"2014-12-10 16:17:52.000000000","message":"Fixed. This is an artifact of copy-pate from etherpad.","commit_id":"354035c87f4af7a58ab286e0028d9f4d60d79690"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"942bae4eebd15f0619a47e0ec4621d08af48d212","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Object Dependency Lifecycle"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"`object-dependency-lifecycle \u003chttps://blueprints.launchpad.net/keystone/+spec/object-dependency-lifecycle\u003e`_"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The way dependency injection (DI) is currently implemented in Keystone is not"},{"line_number":14,"context_line":"really using the \"dependency injection\" pattern. This spec is focused on"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_949b5671","line":11,"updated":"2014-12-11 21:41:20.000000000","message":"(nit): Line wrap at 79 columns","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d29af7b2531e45974cc4fb6efa8cafe6216cd2d6","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Object Dependency Lifecycle"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"`object-dependency-lifecycle \u003chttps://blueprints.launchpad.net/keystone/+spec/object-dependency-lifecycle\u003e`_"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The way dependency injection (DI) is currently implemented in Keystone is not"},{"line_number":14,"context_line":"really using the \"dependency injection\" pattern. This spec is focused on"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_c177503a","line":11,"in_reply_to":"3a961159_7214cce8","updated":"2014-12-15 20:46:14.000000000","message":"Done","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d29af7b2531e45974cc4fb6efa8cafe6216cd2d6","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Object Dependency Lifecycle"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"`object-dependency-lifecycle \u003chttps://blueprints.launchpad.net/keystone/+spec/object-dependency-lifecycle\u003e`_"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The way dependency injection (DI) is currently implemented in Keystone is not"},{"line_number":14,"context_line":"really using the \"dependency injection\" pattern. This spec is focused on"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_61813cfb","line":11,"in_reply_to":"3a961159_949b5671","updated":"2014-12-15 20:46:14.000000000","message":"Done","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"70f91e302395ebcf9a078e9d9e3e722d1a70c31a","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Object Dependency Lifecycle"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"`object-dependency-lifecycle \u003chttps://blueprints.launchpad.net/keystone/+spec/object-dependency-lifecycle\u003e`_"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The way dependency injection (DI) is currently implemented in Keystone is not"},{"line_number":14,"context_line":"really using the \"dependency injection\" pattern. This spec is focused on"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_7214cce8","line":11,"in_reply_to":"3a961159_949b5671","updated":"2014-12-14 19:55:20.000000000","message":"In addition, add \u0027bp\u0027 before \u0027object-dependency-lifecycle\u0027","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"6e9c7f1ba6d48e2fd23451c85bd5c4155f5216a5","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"`object-dependency-lifecycle \u003chttps://blueprints.launchpad.net/keystone/+spec/object-dependency-lifecycle\u003e`_"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The way dependency injection (DI) is currently implemented in Keystone is not"},{"line_number":14,"context_line":"really using the \"dependency injection\" pattern. This spec is focused on"},{"line_number":15,"context_line":"improving the internal-to-Keystone object lifecycle (including dependencies)."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_6a333462","line":13,"updated":"2014-12-11 22:33:16.000000000","message":"So happy to see this spec!!!","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"6e9c7f1ba6d48e2fd23451c85bd5c4155f5216a5","unresolved":false,"context_lines":[{"line_number":11,"context_line":"`object-dependency-lifecycle \u003chttps://blueprints.launchpad.net/keystone/+spec/object-dependency-lifecycle\u003e`_"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The way dependency injection (DI) is currently implemented in Keystone is not"},{"line_number":14,"context_line":"really using the \"dependency injection\" pattern. This spec is focused on"},{"line_number":15,"context_line":"improving the internal-to-Keystone object lifecycle (including dependencies)."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This is based off of a Kilo Summit session:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_6a8174c2","line":14,"updated":"2014-12-11 22:33:16.000000000","message":"Is there an online reference that describes the actual dependency injection pattern?  Can you include it here","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d29af7b2531e45974cc4fb6efa8cafe6216cd2d6","unresolved":false,"context_lines":[{"line_number":11,"context_line":"`object-dependency-lifecycle \u003chttps://blueprints.launchpad.net/keystone/+spec/object-dependency-lifecycle\u003e`_"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The way dependency injection (DI) is currently implemented in Keystone is not"},{"line_number":14,"context_line":"really using the \"dependency injection\" pattern. This spec is focused on"},{"line_number":15,"context_line":"improving the internal-to-Keystone object lifecycle (including dependencies)."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This is based off of a Kilo Summit session:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_41e1a0cf","line":14,"in_reply_to":"3a961159_6a8174c2","updated":"2014-12-15 20:46:14.000000000","message":"Done","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f9d3132fb61638310061d6a211c7bf419e6129ad","unresolved":false,"context_lines":[{"line_number":11,"context_line":"`object-dependency-lifecycle \u003chttps://blueprints.launchpad.net/keystone/+spec/object-dependency-lifecycle\u003e`_"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The way dependency injection (DI) is currently implemented in Keystone is not"},{"line_number":14,"context_line":"really using the \"dependency injection\" pattern. This spec is focused on"},{"line_number":15,"context_line":"improving the internal-to-Keystone object lifecycle (including dependencies)."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This is based off of a Kilo Summit session:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_a6709a74","line":14,"in_reply_to":"3a961159_6a8174c2","updated":"2014-12-15 19:48:36.000000000","message":"I\u0027m sure i can find something for the next push.","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"942bae4eebd15f0619a47e0ec4621d08af48d212","unresolved":false,"context_lines":[{"line_number":15,"context_line":"improving the internal-to-Keystone object lifecycle (including dependencies)."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This is based off of a Kilo Summit session:"},{"line_number":18,"context_line":"`Pre-session Reading \u003chttps://www.morganfainberg.com/blog/2014/10/21/openstack-kilo-summit-pre-summit-thoughts/#objectlifecycle\u003e`_"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Problem Description"},{"line_number":21,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_20b86bc7","line":18,"updated":"2014-12-11 21:41:20.000000000","message":"(nit): same as above","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"6e9c7f1ba6d48e2fd23451c85bd5c4155f5216a5","unresolved":false,"context_lines":[{"line_number":26,"context_line":" * What is the lifecycle of objects (controllers, managers, etc.)?"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Motivation"},{"line_number":29,"context_line":" * Remove the magic of just adding attributes on to an object without really"},{"line_number":30,"context_line":"   having them defined in the API"},{"line_number":31,"context_line":" * Optional dependencies are currently not implemented in a very"},{"line_number":32,"context_line":"   object oriented way; we use the existence of the dependency as a sort of"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_ca3d082d","line":29,"updated":"2014-12-11 22:33:16.000000000","message":"YES!!! I hated that magic","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7e2282dd71d0cecc80cae4a339d2f78afb445cfc","unresolved":false,"context_lines":[{"line_number":38,"context_line":"Constraints:"},{"line_number":39,"context_line":" * Keep APIs as backward compatible as possible (drivers for sure, managers and"},{"line_number":40,"context_line":"   controllers to a lesser extent)"},{"line_number":41,"context_line":" * Compatibility with `Stevedore`_"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_c191109c","line":41,"updated":"2014-12-15 20:10:00.000000000","message":"what does stevedore have to do with this? It\u0027s not mentioned elsewhere. Are you planning to use stevedore to load the drivers?","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d29af7b2531e45974cc4fb6efa8cafe6216cd2d6","unresolved":false,"context_lines":[{"line_number":38,"context_line":"Constraints:"},{"line_number":39,"context_line":" * Keep APIs as backward compatible as possible (drivers for sure, managers and"},{"line_number":40,"context_line":"   controllers to a lesser extent)"},{"line_number":41,"context_line":" * Compatibility with `Stevedore`_"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_e1a8cc22","line":41,"in_reply_to":"3a961159_c191109c","updated":"2014-12-15 20:46:14.000000000","message":"Added more descriptive text.","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"6e9c7f1ba6d48e2fd23451c85bd5c4155f5216a5","unresolved":false,"context_lines":[{"line_number":52,"context_line":"   object definition"},{"line_number":53,"context_line":"   (proof of concept http://paste.openstack.org/show/129171/)"},{"line_number":54,"context_line":" * Construct object graphs in a new uber factory"},{"line_number":55,"context_line":"   (proof of concept http://paste.openstack.org/show/129179/)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"  * This keeps the object lifecycle of the injected objects as singleton"},{"line_number":58,"context_line":"  * This also keeps to a global registry"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_db523866","line":55,"updated":"2014-12-11 22:33:16.000000000","message":"So the example in 129179 looks very java like.  Where is the new uber factory?  Can you in the spec include a code snippet that makes it clear what you mean by an uber factory?","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"33f34d4b23fc71c16eda2bf0598dce73e370e2f2","unresolved":false,"context_lines":[{"line_number":52,"context_line":"   object definition"},{"line_number":53,"context_line":"   (proof of concept http://paste.openstack.org/show/129171/)"},{"line_number":54,"context_line":" * Construct object graphs in a new uber factory"},{"line_number":55,"context_line":"   (proof of concept http://paste.openstack.org/show/129179/)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"  * This keeps the object lifecycle of the injected objects as singleton"},{"line_number":58,"context_line":"  * This also keeps to a global registry"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_13452bb3","line":55,"in_reply_to":"3a961159_c61be61a","updated":"2014-12-15 20:52:07.000000000","message":"Excellent. Sounds good!","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f9d3132fb61638310061d6a211c7bf419e6129ad","unresolved":false,"context_lines":[{"line_number":52,"context_line":"   object definition"},{"line_number":53,"context_line":"   (proof of concept http://paste.openstack.org/show/129171/)"},{"line_number":54,"context_line":" * Construct object graphs in a new uber factory"},{"line_number":55,"context_line":"   (proof of concept http://paste.openstack.org/show/129179/)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"  * This keeps the object lifecycle of the injected objects as singleton"},{"line_number":58,"context_line":"  * This also keeps to a global registry"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_c61be61a","line":55,"in_reply_to":"3a961159_db523866","updated":"2014-12-15 19:48:36.000000000","message":"I can rephase because I made that term up. The factory patter is usually used to construct an instance including dependencies. We\u0027ll basically have a single place where these things are constructed. Or at least start out with a minimal amount of factories.","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7e2282dd71d0cecc80cae4a339d2f78afb445cfc","unresolved":false,"context_lines":[{"line_number":54,"context_line":" * Construct object graphs in a new uber factory"},{"line_number":55,"context_line":"   (proof of concept http://paste.openstack.org/show/129179/)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"  * This keeps the object lifecycle of the injected objects as singleton"},{"line_number":58,"context_line":"  * This also keeps to a global registry"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":" * Keep singleton scope on the current object graphs"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_013078e7","line":57,"updated":"2014-12-15 20:10:00.000000000","message":"they\u0027re actually not a singleton now, really, see https://review.openstack.org/#/c/124599/","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d29af7b2531e45974cc4fb6efa8cafe6216cd2d6","unresolved":false,"context_lines":[{"line_number":54,"context_line":" * Construct object graphs in a new uber factory"},{"line_number":55,"context_line":"   (proof of concept http://paste.openstack.org/show/129179/)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"  * This keeps the object lifecycle of the injected objects as singleton"},{"line_number":58,"context_line":"  * This also keeps to a global registry"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":" * Keep singleton scope on the current object graphs"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_e1044c1a","line":57,"in_reply_to":"3a961159_013078e7","updated":"2014-12-15 20:46:14.000000000","message":"It\u0027s not enforced by my understanding it that was the design. The implementation just doesn\u0027t do a complete job of enforcing.","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7e2282dd71d0cecc80cae4a339d2f78afb445cfc","unresolved":false,"context_lines":[{"line_number":55,"context_line":"   (proof of concept http://paste.openstack.org/show/129179/)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"  * This keeps the object lifecycle of the injected objects as singleton"},{"line_number":58,"context_line":"  * This also keeps to a global registry"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":" * Keep singleton scope on the current object graphs"},{"line_number":61,"context_line":" * Implement optional dependencies using the __init__ as optional kwargs"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_a13fa4b4","line":58,"updated":"2014-12-15 20:10:00.000000000","message":"change \"to a\" to \"a\" -- why have a global registry or any globals?","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d29af7b2531e45974cc4fb6efa8cafe6216cd2d6","unresolved":false,"context_lines":[{"line_number":55,"context_line":"   (proof of concept http://paste.openstack.org/show/129179/)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"  * This keeps the object lifecycle of the injected objects as singleton"},{"line_number":58,"context_line":"  * This also keeps to a global registry"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":" * Keep singleton scope on the current object graphs"},{"line_number":61,"context_line":" * Implement optional dependencies using the __init__ as optional kwargs"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_930d9b3a","line":58,"in_reply_to":"3a961159_a13fa4b4","updated":"2014-12-15 20:46:14.000000000","message":"I am hoping to mostly phase that out, but I don\u0027t want to commit doing that now.","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7e2282dd71d0cecc80cae4a339d2f78afb445cfc","unresolved":false,"context_lines":[{"line_number":57,"context_line":"  * This keeps the object lifecycle of the injected objects as singleton"},{"line_number":58,"context_line":"  * This also keeps to a global registry"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":" * Keep singleton scope on the current object graphs"},{"line_number":61,"context_line":" * Implement optional dependencies using the __init__ as optional kwargs"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"  * This will keep the internal code of the objects the same. We would still"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_2173b4b5","line":60,"updated":"2014-12-15 20:10:00.000000000","message":"a singleton is globally scoped... if it\u0027s not globally scoped then it\u0027s not a singleton.","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"6e9c7f1ba6d48e2fd23451c85bd5c4155f5216a5","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":" * Pitfalls:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"  * We need to add something to the wire up next things. Right now through the"},{"line_number":69,"context_line":"    magic or the decorator this just happens."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"2. Phase II - Evaluate Manual DI"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_5bc3a8ec","line":68,"updated":"2014-12-11 22:33:16.000000000","message":"So the code is more readable, but some may view this as a step backwards if its not clear that there is an easy way to wire stuff up.  What\u0027s to keep someone from saying, you made the code more readable but wiring up got tougher?","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d29af7b2531e45974cc4fb6efa8cafe6216cd2d6","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":" * Pitfalls:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"  * We need to add something to the wire up next things. Right now through the"},{"line_number":69,"context_line":"    magic or the decorator this just happens."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"2. Phase II - Evaluate Manual DI"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_9324bbb0","line":68,"in_reply_to":"3a961159_015eb812","updated":"2014-12-15 20:46:14.000000000","message":"++","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f9d3132fb61638310061d6a211c7bf419e6129ad","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":" * Pitfalls:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"  * We need to add something to the wire up next things. Right now through the"},{"line_number":69,"context_line":"    magic or the decorator this just happens."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"2. Phase II - Evaluate Manual DI"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_e6ef02e8","line":68,"in_reply_to":"3a961159_5bc3a8ec","updated":"2014-12-15 19:48:36.000000000","message":"There will always be complainers. All I can say is that this makes my happy. Right now we don\u0027t actually have a wire to wire anything up. It\u0027s all very implicit and not configurable.","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"5b0d55900f3b0f029ec9abcd2642898df16a1c24","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":" * Pitfalls:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"  * We need to add something to the wire up next things. Right now through the"},{"line_number":69,"context_line":"    magic or the decorator this just happens."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"2. Phase II - Evaluate Manual DI"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_26490a8f","line":68,"in_reply_to":"3a961159_e6ef02e8","updated":"2014-12-15 20:00:51.000000000","message":"Great discussion on this on IRC. I\u0027m good now and looking forward to your proposed changes","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7e2282dd71d0cecc80cae4a339d2f78afb445cfc","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":" * Pitfalls:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"  * We need to add something to the wire up next things. Right now through the"},{"line_number":69,"context_line":"    magic or the decorator this just happens."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"2. Phase II - Evaluate Manual DI"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_015eb812","line":68,"in_reply_to":"3a961159_e6ef02e8","updated":"2014-12-15 20:10:00.000000000","message":"haters gonna hate.","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7e2282dd71d0cecc80cae4a339d2f78afb445cfc","unresolved":false,"context_lines":[{"line_number":66,"context_line":" * Pitfalls:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"  * We need to add something to the wire up next things. Right now through the"},{"line_number":69,"context_line":"    magic or the decorator this just happens."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"2. Phase II - Evaluate Manual DI"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_c163d0db","line":69,"updated":"2014-12-15 20:10:00.000000000","message":"change \"magic or\" to \"magic of\"","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d29af7b2531e45974cc4fb6efa8cafe6216cd2d6","unresolved":false,"context_lines":[{"line_number":66,"context_line":" * Pitfalls:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"  * We need to add something to the wire up next things. Right now through the"},{"line_number":69,"context_line":"    magic or the decorator this just happens."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"2. Phase II - Evaluate Manual DI"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_731f4f5c","line":69,"in_reply_to":"3a961159_c163d0db","updated":"2014-12-15 20:46:14.000000000","message":"Done","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7e2282dd71d0cecc80cae4a339d2f78afb445cfc","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":" * I think that optional dependencies should be implemented on top of the"},{"line_number":85,"context_line":"   existing object using composition. Having code doing \u0027if self.dep\u0027 is a"},{"line_number":86,"context_line":"   bad smell."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"  * e.g. The optional thingee_api dependency in"},{"line_number":89,"context_line":"    keystone.assignment.core.Manager could be implemented as a wrapper around"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a961159_2181f44d","line":86,"updated":"2014-12-15 20:10:00.000000000","message":"this is what null objects are for.","commit_id":"667c419dea669ae36d74b77256be1f05016c91dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1a745e8ddeb88e7e9cf8bee7cf43e6003457f50e","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Goals:"},{"line_number":26,"context_line":" * What should the dependency injection pattern in Keystone look like?"},{"line_number":27,"context_line":" * How do we deal with Optional dependencies?"},{"line_number":28,"context_line":" * What is the lifecycle of objects (controllers, managers, etc.)?"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Motivation"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a961159_d32003b3","line":27,"updated":"2014-12-15 21:13:34.000000000","message":"(nit) lowercase optional.","commit_id":"13e2008e818ba7d6334ccec08ac2550199efbea3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1a745e8ddeb88e7e9cf8bee7cf43e6003457f50e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"Goals:"},{"line_number":26,"context_line":" * What should the dependency injection pattern in Keystone look like?"},{"line_number":27,"context_line":" * How do we deal with Optional dependencies?"},{"line_number":28,"context_line":" * What is the lifecycle of objects (controllers, managers, etc.)?"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Motivation"},{"line_number":31,"context_line":" * Remove the magic of just adding attributes on to an object without really"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a961159_531c1378","line":28,"updated":"2014-12-15 21:13:34.000000000","message":"not sure what it means to put a question as a goal, or if it\u0027s useful to put \"etc\" in the list... does that mean everything in keystone?\n\nthe answer today is they\u0027re all created when the server starts and are never destroyed... seems pretty simple and I assume this isn\u0027t changing it.\n\nHow about \"Define the lifecycle of controllers and managers.\" ?","commit_id":"13e2008e818ba7d6334ccec08ac2550199efbea3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1a745e8ddeb88e7e9cf8bee7cf43e6003457f50e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"1. Phase I - Manual DI"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":" * Go through and fix classes to expect dependencies to be provided in via"},{"line_number":65,"context_line":"   their __init__"},{"line_number":66,"context_line":" * This will remove the magic and make dependencies a part of the actual"},{"line_number":67,"context_line":"   object definition"},{"line_number":68,"context_line":"   (proof of concept http://paste.openstack.org/show/129171/)"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a961159_76dc9d47","line":65,"updated":"2014-12-15 21:13:34.000000000","message":"In the case of the auth plugins, different plugins have different dependencies:\n\n mapped: \u0027federation_api\u0027, \u0027identity_api\u0027, \u0027token_provider_api\u0027\n oauth1: \u0027oauth_api\u0027 (optional??)\n password: \u0027assignment_api\u0027, \u0027identity_api\u0027\n ...\n\nso when creating the auth plugin manager, you\u0027ll need to know what plugin is used so you can pass the right arguments to its init... how is this going to work?","commit_id":"13e2008e818ba7d6334ccec08ac2550199efbea3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1a745e8ddeb88e7e9cf8bee7cf43e6003457f50e","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":" * Pitfalls:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"  * We need to add something to the wire up next things. Right now through the"},{"line_number":84,"context_line":"    magic of the decorator this just happens."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"2. Phase II - Evaluate Manual DI"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a961159_d6d8f181","line":83,"updated":"2014-12-15 21:13:34.000000000","message":"what does this mean? to the wire up next things?","commit_id":"13e2008e818ba7d6334ccec08ac2550199efbea3"}]}
