)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"547908ccea82cf953fce3c2adad1b6611b8961a3","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"TODO:"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":" * propose a spec to oslo-specs"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":" * unit testing"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1ae5cdf2_4c72197d","line":44,"updated":"2014-06-18 19:24:20.000000000","message":"You can probably take over https://blueprints.launchpad.net/oslo/+spec/graduate-config-generator","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"544d6fba7d8ab65fcd81416e6e9c08fe83c92011","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"TODO:"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":" * propose a spec to oslo-specs"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":" * unit testing"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1ae5cdf2_d2824051","line":44,"in_reply_to":"1ae5cdf2_4c72197d","updated":"2014-06-18 20:03:08.000000000","message":"Cool, will do","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"547908ccea82cf953fce3c2adad1b6611b8961a3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"   address or hostname"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":" * a demo of e.g. Glance and Nova using this, mostly to see how"},{"line_number":52,"context_line":"   burdensome the explicit listing of options is"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":" * PBR support for this?"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1ae5cdf2_ec0a05d1","line":52,"updated":"2014-06-18 19:24:20.000000000","message":"Heat was another project that needed something special. They generate different groups with the same options in them. I think they have that implemented in master now.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"544d6fba7d8ab65fcd81416e6e9c08fe83c92011","unresolved":false,"context_lines":[{"line_number":49,"context_line":"   address or hostname"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":" * a demo of e.g. Glance and Nova using this, mostly to see how"},{"line_number":52,"context_line":"   burdensome the explicit listing of options is"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":" * PBR support for this?"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1ae5cdf2_928c3882","line":52,"in_reply_to":"1ae5cdf2_ec0a05d1","updated":"2014-06-18 20:03:08.000000000","message":"Thanks, will take a look","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"547908ccea82cf953fce3c2adad1b6611b8961a3","unresolved":false,"context_lines":[{"line_number":51,"context_line":" * a demo of e.g. Glance and Nova using this, mostly to see how"},{"line_number":52,"context_line":"   burdensome the explicit listing of options is"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":" * PBR support for this?"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"Closes-Bug: #1300546"},{"line_number":57,"context_line":"Change-Id: I15686708fc9460948a58cfea3d18dae40ba1fda9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1ae5cdf2_acc1dd4f","line":54,"updated":"2014-06-18 19:24:20.000000000","message":"pbr runs at a point where the other dependencies aren\u0027t installed, so I\u0027m not sure that\u0027s the best place to trigger it\n\nWe could theoretically add a setuptools command directly to oslo.config, but again that assumes the dependencies for an app are installed when the command is run.\n\nWe could make it easy for a project to define their own console script command to run the generator code and produce whatever output they want.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"0a8be05396f7df9bdcb07f319c3a4836157bfd16","unresolved":false,"context_lines":[{"line_number":51,"context_line":" * a demo of e.g. Glance and Nova using this, mostly to see how"},{"line_number":52,"context_line":"   burdensome the explicit listing of options is"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":" * PBR support for this?"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"Closes-Bug: #1300546"},{"line_number":57,"context_line":"Change-Id: I15686708fc9460948a58cfea3d18dae40ba1fda9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1ae5cdf2_c4ec99be","line":54,"in_reply_to":"1ae5cdf2_32f524ed","updated":"2014-06-24 13:42:39.000000000","message":"Ah, that makes more sense.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"544d6fba7d8ab65fcd81416e6e9c08fe83c92011","unresolved":false,"context_lines":[{"line_number":51,"context_line":" * a demo of e.g. Glance and Nova using this, mostly to see how"},{"line_number":52,"context_line":"   burdensome the explicit listing of options is"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":" * PBR support for this?"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"Closes-Bug: #1300546"},{"line_number":57,"context_line":"Change-Id: I15686708fc9460948a58cfea3d18dae40ba1fda9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1ae5cdf2_32f524ed","line":54,"in_reply_to":"1ae5cdf2_acc1dd4f","updated":"2014-06-18 20:03:08.000000000","message":"Yeah, I\u0027m thinking something like the build_sphinx setuptools command - you need the deps installed for that too","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"}],"oslo/config/generator.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":53,"context_line":"  def list_opts():"},{"line_number":54,"context_line":"      return [(\u0027blaa\u0027, copy.deepcopy(opts))]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"A single codebase might have multiple programs, each which use a subset of the"},{"line_number":57,"context_line":"total set of options registered by the codebase. In that case, you can register"},{"line_number":58,"context_line":"multiple entry points::"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_936a2beb","line":56,"updated":"2014-06-20 20:41:29.000000000","message":"change \"each which\" to \"each of which\"","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":53,"context_line":"  def list_opts():"},{"line_number":54,"context_line":"      return [(\u0027blaa\u0027, copy.deepcopy(opts))]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"A single codebase might have multiple programs, each which use a subset of the"},{"line_number":57,"context_line":"total set of options registered by the codebase. In that case, you can register"},{"line_number":58,"context_line":"multiple entry points::"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_d4a33941","line":56,"in_reply_to":"1ae5cdf2_936a2beb","updated":"2014-06-25 14:56:20.000000000","message":"Done","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                           --namespace nova.compute \u003e nova-compute.conf"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"To make this more convenient, you can use config files to describe your config"},{"line_number":76,"context_line":"files!::"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"  $\u003e cat \u003e config-generator/api.conf \u003c\u003cEOF"},{"line_number":79,"context_line":"  [DEFAULT]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_b3448773","line":76,"updated":"2014-06-20 20:41:29.000000000","message":"suggest move the :: to its own line or remove the !","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                           --namespace nova.compute \u003e nova-compute.conf"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"To make this more convenient, you can use config files to describe your config"},{"line_number":76,"context_line":"files!::"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"  $\u003e cat \u003e config-generator/api.conf \u003c\u003cEOF"},{"line_number":79,"context_line":"  [DEFAULT]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_346c5d08","line":76,"in_reply_to":"1ae5cdf2_b3448773","updated":"2014-06-25 14:56:20.000000000","message":"Done","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":89,"context_line":"  namespace \u003d nova.compute"},{"line_number":90,"context_line":"  namespace \u003d nova.compute"},{"line_number":91,"context_line":"  EOF"},{"line_number":92,"context_line":"  $\u003e oslo-config-generator --config-file config-generator/api.conf"},{"line_number":93,"context_line":"  $\u003e oslo-config-generator --config-file config-generator/compute.conf"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_13553b1d","line":92,"updated":"2014-06-20 20:41:29.000000000","message":"is there a default config file name?","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":89,"context_line":"  namespace \u003d nova.compute"},{"line_number":90,"context_line":"  namespace \u003d nova.compute"},{"line_number":91,"context_line":"  EOF"},{"line_number":92,"context_line":"  $\u003e oslo-config-generator --config-file config-generator/api.conf"},{"line_number":93,"context_line":"  $\u003e oslo-config-generator --config-file config-generator/compute.conf"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_effdc009","line":92,"in_reply_to":"1ae5cdf2_13553b1d","updated":"2014-06-25 14:56:20.000000000","message":"Nope, for a few different reasons - it would probably be a relative path since I don\u0027t think you\u0027d install these in e.g. /etc, I think you\u0027ll typically have a file for each service in the project so a default would be of limited use (I guess you could load all config files which conform to a certain pattern?) and I don\u0027t have a good feel yet for how we\u0027ll name these files or where we\u0027ll store them\n\nSomething for the future, perhaps","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"_generator_opts \u003d ["},{"line_number":108,"context_line":"    cfg.StrOpt(\u0027output-file\u0027,"},{"line_number":109,"context_line":"               help\u003d\u0027Path of the file to write to. Defaults to stdout\u0027),"},{"line_number":110,"context_line":"    cfg.IntOpt(\u0027wrap-width\u0027,"},{"line_number":111,"context_line":"               default\u003d70,"},{"line_number":112,"context_line":"               help\u003d\u0027The maximum length of help lines\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_13037b10","line":109,"updated":"2014-06-20 20:41:29.000000000","message":"add a . at the end of the help text (applies to all these)","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"_generator_opts \u003d ["},{"line_number":108,"context_line":"    cfg.StrOpt(\u0027output-file\u0027,"},{"line_number":109,"context_line":"               help\u003d\u0027Path of the file to write to. Defaults to stdout\u0027),"},{"line_number":110,"context_line":"    cfg.IntOpt(\u0027wrap-width\u0027,"},{"line_number":111,"context_line":"               default\u003d70,"},{"line_number":112,"context_line":"               help\u003d\u0027The maximum length of help lines\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_8f335cf6","line":109,"in_reply_to":"1ae5cdf2_13037b10","updated":"2014-06-25 14:56:20.000000000","message":"Done","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"0a8be05396f7df9bdcb07f319c3a4836157bfd16","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"_generator_opts \u003d ["},{"line_number":108,"context_line":"    cfg.StrOpt(\u0027output-file\u0027,"},{"line_number":109,"context_line":"               help\u003d\u0027Path of the file to write to. Defaults to stdout\u0027),"},{"line_number":110,"context_line":"    cfg.IntOpt(\u0027wrap-width\u0027,"},{"line_number":111,"context_line":"               default\u003d70,"},{"line_number":112,"context_line":"               help\u003d\u0027The maximum length of help lines\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_440fa988","line":109,"in_reply_to":"1ae5cdf2_13037b10","updated":"2014-06-24 13:42:39.000000000","message":"Ending the help text with a \u0027.\u0027 is part of the help style guide. I\u0027m not sure where that is published, though.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"_generator_opts \u003d ["},{"line_number":108,"context_line":"    cfg.StrOpt(\u0027output-file\u0027,"},{"line_number":109,"context_line":"               help\u003d\u0027Path of the file to write to. Defaults to stdout\u0027),"},{"line_number":110,"context_line":"    cfg.IntOpt(\u0027wrap-width\u0027,"},{"line_number":111,"context_line":"               default\u003d70,"},{"line_number":112,"context_line":"               help\u003d\u0027The maximum length of help lines\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_cf164449","line":109,"in_reply_to":"1ae5cdf2_440fa988","updated":"2014-06-25 14:56:20.000000000","message":"Here: http://docs.openstack.org/developer/oslo.config/styleguide.html","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"0a8be05396f7df9bdcb07f319c3a4836157bfd16","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    cfg.IntOpt(\u0027wrap-width\u0027,"},{"line_number":111,"context_line":"               default\u003d70,"},{"line_number":112,"context_line":"               help\u003d\u0027The maximum length of help lines\u0027),"},{"line_number":113,"context_line":"    cfg.MultiStrOpt(\u0027namespace\u0027,"},{"line_number":114,"context_line":"                    help\u003d\u0027Option namespace in which to query for options\u0027),"},{"line_number":115,"context_line":"]"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_c41ad9c5","line":113,"updated":"2014-06-24 13:42:39.000000000","message":"The namespaces are required arguments, aren\u0027t they? Is there a way to indicate that and not use \"--namespace\" to prefix each?","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"519b37e7200178fb6ad1178dbd136c38d06ed99c","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    cfg.IntOpt(\u0027wrap-width\u0027,"},{"line_number":111,"context_line":"               default\u003d70,"},{"line_number":112,"context_line":"               help\u003d\u0027The maximum length of help lines\u0027),"},{"line_number":113,"context_line":"    cfg.MultiStrOpt(\u0027namespace\u0027,"},{"line_number":114,"context_line":"                    help\u003d\u0027Option namespace in which to query for options\u0027),"},{"line_number":115,"context_line":"]"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_18d1effa","line":113,"in_reply_to":"1ae5cdf2_2f7b287c","updated":"2014-06-27 20:05:32.000000000","message":"Ah, I didn\u0027t consider the case of this tool using the config file to drive itself.. :-)","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    cfg.IntOpt(\u0027wrap-width\u0027,"},{"line_number":111,"context_line":"               default\u003d70,"},{"line_number":112,"context_line":"               help\u003d\u0027The maximum length of help lines\u0027),"},{"line_number":113,"context_line":"    cfg.MultiStrOpt(\u0027namespace\u0027,"},{"line_number":114,"context_line":"                    help\u003d\u0027Option namespace in which to query for options\u0027),"},{"line_number":115,"context_line":"]"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_2f7b287c","line":113,"in_reply_to":"1ae5cdf2_c41ad9c5","updated":"2014-06-25 14:56:20.000000000","message":"Practically speaking, I think people will always supply at least one namespace argument ... but I wouldn\u0027t go so far as to say it\u0027s required. It\u0027ll generate an empty config file with just [DEFAULT]\n\nNot having to use --namespace for each one : sure, we could do that but I want to avoid:\n\n  [DEFAULT]\n  output_file \u003d nova.conf.sample\n  namespaces \u003d nova,keystoneclient.auth_token,oslo.messaging\n\nsince the MultiStr option is more readable and maintenance friendly","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class OptFormatter(object):"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    \"\"\"Format configuration option descriptions to a file."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    This class is available for applications to subclass in order to fine-tune"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_e60e4f31","line":131,"updated":"2014-06-20 20:41:29.000000000","message":"there\u0027s an extra blank line here","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class OptFormatter(object):"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    \"\"\"Format configuration option descriptions to a file."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    This class is available for applications to subclass in order to fine-tune"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_af8e5877","line":131,"in_reply_to":"1ae5cdf2_e60e4f31","updated":"2014-06-25 14:56:20.000000000","message":"I like it :)","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    This class is available for applications to subclass in order to fine-tune"},{"line_number":135,"context_line":"    the sample configuration files generated by oslo.config.generator."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    Currently, the main hook for customization is the sanitize_defaults()"},{"line_number":138,"context_line":"    method which can be used to munge the default value for an option before"},{"line_number":139,"context_line":"    outputting it to the sample file::"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_66515f0d","line":137,"updated":"2014-06-20 20:41:29.000000000","message":"can I change the help text? for example to say that keystone doesn\u0027t use the option.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"0a8be05396f7df9bdcb07f319c3a4836157bfd16","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    This class is available for applications to subclass in order to fine-tune"},{"line_number":135,"context_line":"    the sample configuration files generated by oslo.config.generator."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    Currently, the main hook for customization is the sanitize_defaults()"},{"line_number":138,"context_line":"    method which can be used to munge the default value for an option before"},{"line_number":139,"context_line":"    outputting it to the sample file::"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_a44b0db0","line":137,"in_reply_to":"1ae5cdf2_66515f0d","updated":"2014-06-24 13:42:39.000000000","message":"Brant, our goal is to hide the actual use of most options defined in libraries within the libraries themselves because they aren\u0027t part of the public API of the library. So keystone wouldn\u0027t define any options it doesn\u0027t use, and it wouldn\u0027t control how options defined in libraries are used. We\u0027re not there yet, but that\u0027s the goal.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    This class is available for applications to subclass in order to fine-tune"},{"line_number":135,"context_line":"    the sample configuration files generated by oslo.config.generator."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    Currently, the main hook for customization is the sanitize_defaults()"},{"line_number":138,"context_line":"    method which can be used to munge the default value for an option before"},{"line_number":139,"context_line":"    outputting it to the sample file::"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_cfb72420","line":137,"in_reply_to":"1ae5cdf2_a44b0db0","updated":"2014-06-25 14:56:20.000000000","message":"I think what Brant is getting at is more like \"keystone just uses notifications from oslo.messaging, so some options aren\u0027t relevant\"\n\nFor that, I think we could add more fine-grained option sets to the oslo.config.opts entry points - e.g. oslo.messaging.notifier","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    \"\"\""},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    _TYPE_DESCRIPTIONS \u003d {"},{"line_number":159,"context_line":"        cfg.StrOpt: \u0027string value\u0027,"},{"line_number":160,"context_line":"        cfg.BoolOpt: \u0027boolean value\u0027,"},{"line_number":161,"context_line":"        cfg.IntOpt: \u0027integer value\u0027,"},{"line_number":162,"context_line":"        cfg.FloatOpt: \u0027floating point value\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_265af71d","line":159,"updated":"2014-06-20 20:41:29.000000000","message":"seems like these should be in StrOpt, etc?","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"0a8be05396f7df9bdcb07f319c3a4836157bfd16","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    \"\"\""},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    _TYPE_DESCRIPTIONS \u003d {"},{"line_number":159,"context_line":"        cfg.StrOpt: \u0027string value\u0027,"},{"line_number":160,"context_line":"        cfg.BoolOpt: \u0027boolean value\u0027,"},{"line_number":161,"context_line":"        cfg.IntOpt: \u0027integer value\u0027,"},{"line_number":162,"context_line":"        cfg.FloatOpt: \u0027floating point value\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_84fc5141","line":159,"in_reply_to":"1ae5cdf2_265af71d","updated":"2014-06-24 13:42:39.000000000","message":"Good point. We should move these into the Opt or type classes. If we put them in the types, we can have help text like \"an integer value between 0 and 1024\" based on the constraints defined in the type. That change can come later, though.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    \"\"\""},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    _TYPE_DESCRIPTIONS \u003d {"},{"line_number":159,"context_line":"        cfg.StrOpt: \u0027string value\u0027,"},{"line_number":160,"context_line":"        cfg.BoolOpt: \u0027boolean value\u0027,"},{"line_number":161,"context_line":"        cfg.IntOpt: \u0027integer value\u0027,"},{"line_number":162,"context_line":"        cfg.FloatOpt: \u0027floating point value\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_cf6564b0","line":159,"in_reply_to":"1ae5cdf2_84fc5141","updated":"2014-06-25 14:56:20.000000000","message":"Yeah","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def __init__(self, output_file\u003dNone, wrap_width\u003d70):"},{"line_number":169,"context_line":"        \"\"\"Construct an OutputFormatter object."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :param output_file: a writeable file object"},{"line_number":172,"context_line":"        :param wrap_width: The maximum length of help lines"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_e6aacfd0","line":169,"updated":"2014-06-20 20:41:29.000000000","message":"change \"OutputFormatter\" to \"OptFormatter\"","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    }"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def __init__(self, output_file\u003dNone, wrap_width\u003d70):"},{"line_number":169,"context_line":"        \"\"\"Construct an OutputFormatter object."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :param output_file: a writeable file object"},{"line_number":172,"context_line":"        :param wrap_width: The maximum length of help lines"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_4f115403","line":169,"in_reply_to":"1ae5cdf2_e6aacfd0","updated":"2014-06-25 14:56:20.000000000","message":"Done","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"547908ccea82cf953fce3c2adad1b6611b8961a3","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        opt_type \u003d self._TYPE_DESCRIPTIONS.get(type(opt), \u0027unknown type\u0027)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        lines \u003d [textwrap.fill(u\u0027%s (%s)\u0027 % (opt.help or \u0027\u0027, opt_type),"},{"line_number":196,"context_line":"                               self.wrap_width,"},{"line_number":197,"context_line":"                               initial_indent\u003d\u0027# \u0027,"},{"line_number":198,"context_line":"                               subsequent_indent\u003d\u0027# \u0027) + \u0027\\n\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_6c3c3530","line":195,"updated":"2014-06-18 19:24:20.000000000","message":"We\u0027ve had some requests to stop wrapping the output of the help text. At least one project had a multi-line help string that was nicely formatted, and this wrapping breaks it. We should address that separately, but I did want to mention it.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"544d6fba7d8ab65fcd81416e6e9c08fe83c92011","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        opt_type \u003d self._TYPE_DESCRIPTIONS.get(type(opt), \u0027unknown type\u0027)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        lines \u003d [textwrap.fill(u\u0027%s (%s)\u0027 % (opt.help or \u0027\u0027, opt_type),"},{"line_number":196,"context_line":"                               self.wrap_width,"},{"line_number":197,"context_line":"                               initial_indent\u003d\u0027# \u0027,"},{"line_number":198,"context_line":"                               subsequent_indent\u003d\u0027# \u0027) + \u0027\\n\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_5272b07c","line":195,"in_reply_to":"1ae5cdf2_3770b6a3","updated":"2014-06-18 20:03:08.000000000","message":"I think wrapping is sane default behavior for most help text, but I\u0027m interested in hearing specific examples of where it\u0027s causing problems\n\nThere is a --wrap-width option and we could support e.g. --wrap-width\u003d0 or something, but I think it\u0027s unlikely people would generally use it","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"544d6fba7d8ab65fcd81416e6e9c08fe83c92011","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        opt_type \u003d self._TYPE_DESCRIPTIONS.get(type(opt), \u0027unknown type\u0027)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        lines \u003d [textwrap.fill(u\u0027%s (%s)\u0027 % (opt.help or \u0027\u0027, opt_type),"},{"line_number":196,"context_line":"                               self.wrap_width,"},{"line_number":197,"context_line":"                               initial_indent\u003d\u0027# \u0027,"},{"line_number":198,"context_line":"                               subsequent_indent\u003d\u0027# \u0027) + \u0027\\n\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_92ba7809","line":195,"in_reply_to":"1ae5cdf2_6c3c3530","updated":"2014-06-18 20:03:08.000000000","message":"Oh, the help string had newlines embedded ... interesting, and unusual\n\nCan you point me at this concrete example?","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"5794251347caa3dff1796d7c34bc5aef01ddcb35","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        opt_type \u003d self._TYPE_DESCRIPTIONS.get(type(opt), \u0027unknown type\u0027)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        lines \u003d [textwrap.fill(u\u0027%s (%s)\u0027 % (opt.help or \u0027\u0027, opt_type),"},{"line_number":196,"context_line":"                               self.wrap_width,"},{"line_number":197,"context_line":"                               initial_indent\u003d\u0027# \u0027,"},{"line_number":198,"context_line":"                               subsequent_indent\u003d\u0027# \u0027) + \u0027\\n\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_3770b6a3","line":195,"in_reply_to":"1ae5cdf2_6c3c3530","updated":"2014-06-18 19:29:15.000000000","message":"Please don\u0027t wrap the help, or at least provide a way for us to specify that it shouldn\u0027t be wrapped. The current behavior discourages people from providing long form meaningful comments in the log options because they get scrambled when generated.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        opt_type \u003d self._TYPE_DESCRIPTIONS.get(type(opt), \u0027unknown type\u0027)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        lines \u003d [textwrap.fill(u\u0027%s (%s)\u0027 % (opt.help or \u0027\u0027, opt_type),"},{"line_number":196,"context_line":"                               self.wrap_width,"},{"line_number":197,"context_line":"                               initial_indent\u003d\u0027# \u0027,"},{"line_number":198,"context_line":"                               subsequent_indent\u003d\u0027# \u0027) + \u0027\\n\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_8fe0bcf9","line":195,"in_reply_to":"1ae5cdf2_92ba7809","updated":"2014-06-25 14:56:20.000000000","message":"I\u0027ve added support for wrap_width\u003d0 but I don\u0027t think that\u0027s what we\u0027re looking for here - I\u0027d still like to see Sean\u0027s concrete example","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        default_str \u003d \u0027\u0027"},{"line_number":205,"context_line":"        if opt.default is None:"},{"line_number":206,"context_line":"            default_str \u003d \u0027\u003cNone\u003e\u0027"},{"line_number":207,"context_line":"        elif isinstance(opt, cfg.StrOpt):"},{"line_number":208,"context_line":"            default_str \u003d opt.default"},{"line_number":209,"context_line":"        elif isinstance(opt, cfg.BoolOpt):"},{"line_number":210,"context_line":"            default_str \u003d str(opt.default).lower()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_663b1f9c","line":207,"updated":"2014-06-20 20:41:29.000000000","message":"How about put this in StrOpt, BoolOpt, etc?","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        default_str \u003d \u0027\u0027"},{"line_number":205,"context_line":"        if opt.default is None:"},{"line_number":206,"context_line":"            default_str \u003d \u0027\u003cNone\u003e\u0027"},{"line_number":207,"context_line":"        elif isinstance(opt, cfg.StrOpt):"},{"line_number":208,"context_line":"            default_str \u003d opt.default"},{"line_number":209,"context_line":"        elif isinstance(opt, cfg.BoolOpt):"},{"line_number":210,"context_line":"            default_str \u003d str(opt.default).lower()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_0fbcacda","line":207,"in_reply_to":"1ae5cdf2_663b1f9c","updated":"2014-06-25 14:56:20.000000000","message":"Good idea, but can come later","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        elif isinstance(opt, cfg.ListOpt):"},{"line_number":215,"context_line":"            default_str \u003d \u0027,\u0027.join(opt.default)"},{"line_number":216,"context_line":"        elif isinstance(opt, cfg.DictOpt):"},{"line_number":217,"context_line":"            default_str \u003d \u0027,\u0027.join([\u0027%s:%s\u0027 % i for i in opt.default.items()])"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        defaults \u003d [default_str]"},{"line_number":220,"context_line":"        if isinstance(opt, cfg.MultiStrOpt) and opt.default:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_863e6b89","line":217,"updated":"2014-06-20 20:41:29.000000000","message":"should handle case where the option type is unexpected.","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        elif isinstance(opt, cfg.ListOpt):"},{"line_number":215,"context_line":"            default_str \u003d \u0027,\u0027.join(opt.default)"},{"line_number":216,"context_line":"        elif isinstance(opt, cfg.DictOpt):"},{"line_number":217,"context_line":"            default_str \u003d \u0027,\u0027.join([\u0027%s:%s\u0027 % i for i in opt.default.items()])"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        defaults \u003d [default_str]"},{"line_number":220,"context_line":"        if isinstance(opt, cfg.MultiStrOpt) and opt.default:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_ef8dc02b","line":217,"in_reply_to":"1ae5cdf2_863e6b89","updated":"2014-06-25 14:56:20.000000000","message":"Done","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1bbaab4a41033dc7a558e85c5a33905f8fa128ce","unresolved":false,"context_lines":[{"line_number":260,"context_line":"    configuration and write a description of them to the specified output file."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    :param conf: a ConfigOpts instance containing the generator\u0027s configuration"},{"line_number":263,"context_line":"    :param formatter_cls: a subclass of oslo.config.generator.OptFormatter"},{"line_number":264,"context_line":"    \"\"\""},{"line_number":265,"context_line":"    conf.register_opts(_generator_opts)"},{"line_number":266,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_a60fe7de","line":263,"updated":"2014-06-20 20:41:29.000000000","message":"suggest reference with :py:class:`oslo.config.generator.OptFormatter`","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"e03cc379620d620cea4d8c24a100ec726fa89133","unresolved":false,"context_lines":[{"line_number":260,"context_line":"    configuration and write a description of them to the specified output file."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    :param conf: a ConfigOpts instance containing the generator\u0027s configuration"},{"line_number":263,"context_line":"    :param formatter_cls: a subclass of oslo.config.generator.OptFormatter"},{"line_number":264,"context_line":"    \"\"\""},{"line_number":265,"context_line":"    conf.register_opts(_generator_opts)"},{"line_number":266,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_afd9f823","line":263,"in_reply_to":"1ae5cdf2_a60fe7de","updated":"2014-06-25 14:56:20.000000000","message":"Not relevant anymore","commit_id":"8a9e5fb286dd1f0c7f593ebdd5b9f0a7423a25d7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"649f05837db90146dd8cc13453e350ddfb751d9d","unresolved":false,"context_lines":[{"line_number":99,"context_line":"facilitate this, applications can supply their own \u0027sanitizer\u0027 function via"},{"line_number":100,"context_line":"the \u0027oslo.config.sanitizer\u0027 entry point namespace. For example::"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def sanitize_default(self, opt, default_str):"},{"line_number":103,"context_line":"        if opt.dest \u003d\u003d \u0027base_dir\u0027 and default_str \u003d\u003d os.getcwd():"},{"line_number":104,"context_line":"            return \u0027.\u0027"},{"line_number":105,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_ac7ae1b7","line":102,"updated":"2014-06-25 16:01:19.000000000","message":"seems like it would be handy to have the original default value, too. Then I wouldn\u0027t have to deal with a default_str like \u0027[\u0027abc\u0027, \u0027def\u0027]\u0027 for multivalued or \u00271\u0027 for a number. I don\u0027t have a use case so could be added easily enough later.","commit_id":"014ed7c3e5e3c2ab8ac49f19f01cf0e63078df2e"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"63331bedf9dd2785ac62ada035d50bd446cc7bba","unresolved":false,"context_lines":[{"line_number":99,"context_line":"facilitate this, applications can supply their own \u0027sanitizer\u0027 function via"},{"line_number":100,"context_line":"the \u0027oslo.config.sanitizer\u0027 entry point namespace. For example::"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def sanitize_default(self, opt, default_str):"},{"line_number":103,"context_line":"        if opt.dest \u003d\u003d \u0027base_dir\u0027 and default_str \u003d\u003d os.getcwd():"},{"line_number":104,"context_line":"            return \u0027.\u0027"},{"line_number":105,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_e8303aa0","line":102,"in_reply_to":"1ae5cdf2_ac7ae1b7","updated":"2014-06-26 06:35:15.000000000","message":"The original default is available via opt.default","commit_id":"014ed7c3e5e3c2ab8ac49f19f01cf0e63078df2e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"649f05837db90146dd8cc13453e350ddfb751d9d","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        \"\"\"Construct an OptFormatter object."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param output_file: a writeable file object"},{"line_number":180,"context_line":"        :param sanitize_default: a callable for sanitize defaults"},{"line_number":181,"context_line":"        :param wrap_width: The maximum length of help lines, 0 to not wrap"},{"line_number":182,"context_line":"        \"\"\""},{"line_number":183,"context_line":"        self.output_file \u003d output_file or sys.stdout"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_cc800d4c","line":180,"updated":"2014-06-25 16:01:19.000000000","message":"should document what the function will be called with and what it should return.","commit_id":"014ed7c3e5e3c2ab8ac49f19f01cf0e63078df2e"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"63331bedf9dd2785ac62ada035d50bd446cc7bba","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        \"\"\"Construct an OptFormatter object."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param output_file: a writeable file object"},{"line_number":180,"context_line":"        :param sanitize_default: a callable for sanitize defaults"},{"line_number":181,"context_line":"        :param wrap_width: The maximum length of help lines, 0 to not wrap"},{"line_number":182,"context_line":"        \"\"\""},{"line_number":183,"context_line":"        self.output_file \u003d output_file or sys.stdout"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_08a726bd","line":180,"in_reply_to":"1ae5cdf2_cc800d4c","updated":"2014-06-26 06:35:15.000000000","message":"Done","commit_id":"014ed7c3e5e3c2ab8ac49f19f01cf0e63078df2e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"649f05837db90146dd8cc13453e350ddfb751d9d","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        opt_type \u003d self._TYPE_DESCRIPTIONS.get(type(opt), \u0027unknown type\u0027)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        help_text \u003d u\u0027%s(%s)\u0027 % (opt.help + \u0027 \u0027 if opt.help else \u0027\u0027, opt_type)"},{"line_number":198,"context_line":"        if self.wrap_width is not None and self.wrap_width \u003e 0:"},{"line_number":199,"context_line":"            lines \u003d [textwrap.fill(help_text,"},{"line_number":200,"context_line":"                                   self.wrap_width,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_ec5f89e2","line":197,"updated":"2014-06-25 16:01:19.000000000","message":"is it just the opt.help that they don\u0027t want wrapped? Seems like users would expect the \"(opt_type)\" on its own line if they were formatting the help themselves.","commit_id":"014ed7c3e5e3c2ab8ac49f19f01cf0e63078df2e"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"63331bedf9dd2785ac62ada035d50bd446cc7bba","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        opt_type \u003d self._TYPE_DESCRIPTIONS.get(type(opt), \u0027unknown type\u0027)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        help_text \u003d u\u0027%s(%s)\u0027 % (opt.help + \u0027 \u0027 if opt.help else \u0027\u0027, opt_type)"},{"line_number":198,"context_line":"        if self.wrap_width is not None and self.wrap_width \u003e 0:"},{"line_number":199,"context_line":"            lines \u003d [textwrap.fill(help_text,"},{"line_number":200,"context_line":"                                   self.wrap_width,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_28830204","line":197,"in_reply_to":"1ae5cdf2_ec5f89e2","updated":"2014-06-26 06:35:15.000000000","message":"Yeah, I\u0027m not really convinced either way but would prefer to stick with the behavior of the oslo-incubator generator for now","commit_id":"014ed7c3e5e3c2ab8ac49f19f01cf0e63078df2e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"649f05837db90146dd8cc13453e350ddfb751d9d","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            default_str \u003d \u0027,\u0027.join(opt.default)"},{"line_number":221,"context_line":"        elif isinstance(opt, cfg.DictOpt):"},{"line_number":222,"context_line":"            default_str \u003d \u0027,\u0027.join([\u0027%s:%s\u0027 % i for i in opt.default.items()])"},{"line_number":223,"context_line":"        else:"},{"line_number":224,"context_line":"            default_str \u003d str(opt.default)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        defaults \u003d [default_str]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_ec2dc946","line":223,"updated":"2014-06-25 16:01:19.000000000","message":"might want to log a warning for an unexpected option type so the tool can get updated.","commit_id":"014ed7c3e5e3c2ab8ac49f19f01cf0e63078df2e"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"63331bedf9dd2785ac62ada035d50bd446cc7bba","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            default_str \u003d \u0027,\u0027.join(opt.default)"},{"line_number":221,"context_line":"        elif isinstance(opt, cfg.DictOpt):"},{"line_number":222,"context_line":"            default_str \u003d \u0027,\u0027.join([\u0027%s:%s\u0027 % i for i in opt.default.items()])"},{"line_number":223,"context_line":"        else:"},{"line_number":224,"context_line":"            default_str \u003d str(opt.default)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        defaults \u003d [default_str]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_e8bafabe","line":223,"in_reply_to":"1ae5cdf2_ec2dc946","updated":"2014-06-26 06:35:15.000000000","message":"Done","commit_id":"014ed7c3e5e3c2ab8ac49f19f01cf0e63078df2e"}],"tests/test_generator.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"649f05837db90146dd8cc13453e350ddfb751d9d","unresolved":false,"context_lines":[{"line_number":491,"context_line":"        if sanitizer is not None:"},{"line_number":492,"context_line":"            driver_mgr.assert_called_once_with(\u0027oslo.config.sanitizer\u0027,"},{"line_number":493,"context_line":"                                               name\u003d\u0027test_sanitizer\u0027)"},{"line_number":494,"context_line":"            pass"},{"line_number":495,"context_line":"        else:"},{"line_number":496,"context_line":"            self.assertFalse(driver_mgr.called)"},{"line_number":497,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_0fdca745","line":494,"updated":"2014-06-25 16:01:19.000000000","message":"remove this line it doesn\u0027t do anything.","commit_id":"014ed7c3e5e3c2ab8ac49f19f01cf0e63078df2e"}]}
