)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add IntRange type for lists"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It\u0027s common to abbrieviate a list of integers with a \u0027-\u0027"},{"line_number":10,"context_line":"character. Unfortunately, the best way to store integers for"},{"line_number":11,"context_line":"this case is to use strings. This patch aims to add a new type"},{"line_number":12,"context_line":"to validate lists that allow this abbrieviation."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1aa78d24_db0f7fdf","line":9,"range":{"start_line":9,"start_character":15,"end_line":9,"end_character":26},"updated":"2016-07-11 09:55:43.000000000","message":"nit abbreviate","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add IntRange type for lists"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It\u0027s common to abbrieviate a list of integers with a \u0027-\u0027"},{"line_number":10,"context_line":"character. Unfortunately, the best way to store integers for"},{"line_number":11,"context_line":"this case is to use strings. This patch aims to add a new type"},{"line_number":12,"context_line":"to validate lists that allow this abbrieviation."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fad55976_c02fd7f4","line":9,"range":{"start_line":9,"start_character":15,"end_line":9,"end_character":26},"in_reply_to":"1aa78d24_db0f7fdf","updated":"2016-07-15 18:50:59.000000000","message":"Done","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":9,"context_line":"It\u0027s common to abbrieviate a list of integers with a \u0027-\u0027"},{"line_number":10,"context_line":"character. Unfortunately, the best way to store integers for"},{"line_number":11,"context_line":"this case is to use strings. This patch aims to add a new type"},{"line_number":12,"context_line":"to validate lists that allow this abbrieviation."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I9a2727522f25535a25c53ac89cd5e0096c87fef9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1aa78d24_5b042fbf","line":12,"range":{"start_line":12,"start_character":34,"end_line":12,"end_character":47},"updated":"2016-07-11 09:55:43.000000000","message":"nit","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"It\u0027s common to abbrieviate a list of integers with a \u0027-\u0027"},{"line_number":10,"context_line":"character. Unfortunately, the best way to store integers for"},{"line_number":11,"context_line":"this case is to use strings. This patch aims to add a new type"},{"line_number":12,"context_line":"to validate lists that allow this abbrieviation."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I9a2727522f25535a25c53ac89cd5e0096c87fef9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fad55976_20351346","line":12,"range":{"start_line":12,"start_character":34,"end_line":12,"end_character":47},"in_reply_to":"1aa78d24_5b042fbf","updated":"2016-07-15 18:50:59.000000000","message":"Done","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"}],"oslo_config/cfg.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"                                     **kwargs)"},{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"class IntListOpt(Opt):"},{"line_number":1155,"context_line":""},{"line_number":1156,"context_line":"    \"\"\"Option with IntRange type"},{"line_number":1157,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_96c78e11","line":1154,"range":{"start_line":1154,"start_character":17,"end_line":1154,"end_character":20},"updated":"2016-07-11 09:55:43.000000000","message":"Could we avoid the addition in the next file if we inherited from ListOpt?","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"                                     **kwargs)"},{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"class IntListOpt(Opt):"},{"line_number":1155,"context_line":""},{"line_number":1156,"context_line":"    \"\"\"Option with IntRange type"},{"line_number":1157,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_3bc4c35d","line":1154,"range":{"start_line":1154,"start_character":6,"end_line":1154,"end_character":16},"updated":"2016-07-11 09:55:43.000000000","message":"I see what you\u0027re doing but I\u0027d rather this was IntRangeOpt or IntRangeListOpt","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"                                     **kwargs)"},{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"class IntListOpt(Opt):"},{"line_number":1155,"context_line":""},{"line_number":1156,"context_line":"    \"\"\"Option with IntRange type"},{"line_number":1157,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fad55976_ed594190","line":1154,"range":{"start_line":1154,"start_character":6,"end_line":1154,"end_character":16},"in_reply_to":"1aa78d24_3bc4c35d","updated":"2016-07-15 18:50:59.000000000","message":"Done","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"                                     **kwargs)"},{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"class IntListOpt(Opt):"},{"line_number":1155,"context_line":""},{"line_number":1156,"context_line":"    \"\"\"Option with IntRange type"},{"line_number":1157,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fad55976_cdd55dba","line":1154,"range":{"start_line":1154,"start_character":17,"end_line":1154,"end_character":20},"in_reply_to":"1aa78d24_96c78e11","updated":"2016-07-15 18:50:59.000000000","message":"Done","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":1155,"context_line":""},{"line_number":1156,"context_line":"    \"\"\"Option with IntRange type"},{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"    Option with ``type`` :class:`oslo_config.types.IntList`"},{"line_number":1159,"context_line":""},{"line_number":1160,"context_line":"    :param name: the option\u0027s name"},{"line_number":1161,"context_line":"    :param min: minimum value the integer can take"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_b6860ad9","line":1158,"range":{"start_line":1158,"start_character":51,"end_line":1158,"end_character":58},"updated":"2016-07-11 09:55:43.000000000","message":"IntRange","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":1155,"context_line":""},{"line_number":1156,"context_line":"    \"\"\"Option with IntRange type"},{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"    Option with ``type`` :class:`oslo_config.types.IntList`"},{"line_number":1159,"context_line":""},{"line_number":1160,"context_line":"    :param name: the option\u0027s name"},{"line_number":1161,"context_line":"    :param min: minimum value the integer can take"}],"source_content_type":"text/x-python","patch_set":1,"id":"fad55976_2ddb59ef","line":1158,"range":{"start_line":1158,"start_character":51,"end_line":1158,"end_character":58},"in_reply_to":"1aa78d24_b6860ad9","updated":"2016-07-15 18:50:59.000000000","message":"Done","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"fc82802313e9de6ac41d1af91b9435f84276f634","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"    :param bounds: if True the value should be inside \"[\" and \"]\" pair"},{"line_number":1200,"context_line":"    :param \\*\\*kwargs: arbitrary keyword arguments passed to :class:`ListOpt`"},{"line_number":1201,"context_line":"    \"\"\""},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"    def __init__(self, name, min\u003dNone, max\u003dNone, bounds\u003dNone, **kwargs):"},{"line_number":1204,"context_line":"        super(IntRangeListOpt, self).__init__(name,"},{"line_number":1205,"context_line":"                                              item_type\u003dtypes.IntRange(min,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fad55976_3ed1b3ce","line":1202,"updated":"2016-07-15 21:18:01.000000000","message":"Please add versionadded:: 3.14","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1540b99dfaf699c84e9ecda70c076384bc9e8617","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"    :param bounds: if True the value should be inside \"[\" and \"]\" pair"},{"line_number":1200,"context_line":"    :param \\*\\*kwargs: arbitrary keyword arguments passed to :class:`ListOpt`"},{"line_number":1201,"context_line":"    \"\"\""},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"    def __init__(self, name, min\u003dNone, max\u003dNone, bounds\u003dNone, **kwargs):"},{"line_number":1204,"context_line":"        super(IntRangeListOpt, self).__init__(name,"},{"line_number":1205,"context_line":"                                              item_type\u003dtypes.IntRange(min,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_9886d8b7","line":1202,"in_reply_to":"fad55976_3ed1b3ce","updated":"2016-07-18 17:55:21.000000000","message":"Done","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"9b69bff9a8f4d5693692b74566c5fed561b8b1f5","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"    :param bounds: if True the value should be inside \"[\" and \"]\" pair"},{"line_number":1200,"context_line":"    :param \\*\\*kwargs: arbitrary keyword arguments passed to :class:`ListOpt`"},{"line_number":1201,"context_line":""},{"line_number":1202,"context_line":"    .. versionadded:: 3.14"},{"line_number":1203,"context_line":"    \"\"\""},{"line_number":1204,"context_line":""},{"line_number":1205,"context_line":"    def __init__(self, name, min\u003dNone, max\u003dNone, bounds\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_375b8d30","line":1202,"range":{"start_line":1202,"start_character":22,"end_line":1202,"end_character":26},"updated":"2016-08-02 18:40:04.000000000","message":"Sorry, 3.15 now","commit_id":"b778f01fb8413184032bd335698407aca58482b2"}],"oslo_config/tests/test_generator.py":[{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1540b99dfaf699c84e9ecda70c076384bc9e8617","unresolved":false,"context_lines":[{"line_number":573,"context_line":"# Maximum value: 0"},{"line_number":574,"context_line":"#int_opt_max_0 \u003d -1"},{"line_number":575,"context_line":"\u0027\u0027\u0027)),"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        (\u0027float_opt\u0027,"},{"line_number":578,"context_line":"         dict(opts\u003d[(\u0027test\u0027, [(None, [opts[\u0027float_opt\u0027]])])],"},{"line_number":579,"context_line":"              expected\u003d\u0027\u0027\u0027[DEFAULT]"}],"source_content_type":"text/x-python","patch_set":2,"id":"fad55976_bbedb827","side":"PARENT","line":576,"updated":"2016-07-18 17:55:21.000000000","message":"None of the other sections had a new line here so I removed it along with my old test.","commit_id":"7539018066b3dfb288497ca2686dabcb5329e05d"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"fc82802313e9de6ac41d1af91b9435f84276f634","unresolved":false,"context_lines":[{"line_number":573,"context_line":"# Maximum value: 0"},{"line_number":574,"context_line":"#int_opt_max_0 \u003d -1"},{"line_number":575,"context_line":"\u0027\u0027\u0027)),"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        (\u0027float_opt\u0027,"},{"line_number":578,"context_line":"         dict(opts\u003d[(\u0027test\u0027, [(None, [opts[\u0027float_opt\u0027]])])],"},{"line_number":579,"context_line":"              expected\u003d\u0027\u0027\u0027[DEFAULT]"}],"source_content_type":"text/x-python","patch_set":2,"id":"fad55976_feed5b8f","side":"PARENT","line":576,"updated":"2016-07-15 21:18:01.000000000","message":"Please undo the unrelated change","commit_id":"7539018066b3dfb288497ca2686dabcb5329e05d"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1540b99dfaf699c84e9ecda70c076384bc9e8617","unresolved":false,"context_lines":[{"line_number":573,"context_line":"# Maximum value: 0"},{"line_number":574,"context_line":"#int_opt_max_0 \u003d -1"},{"line_number":575,"context_line":"\u0027\u0027\u0027)),"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        (\u0027float_opt\u0027,"},{"line_number":578,"context_line":"         dict(opts\u003d[(\u0027test\u0027, [(None, [opts[\u0027float_opt\u0027]])])],"},{"line_number":579,"context_line":"              expected\u003d\u0027\u0027\u0027[DEFAULT]"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_b83f5c24","side":"PARENT","line":576,"in_reply_to":"fad55976_feed5b8f","updated":"2016-07-18 17:55:21.000000000","message":"Done","commit_id":"7539018066b3dfb288497ca2686dabcb5329e05d"}],"oslo_config/tests/test_types.py":[{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"fc82802313e9de6ac41d1af91b9435f84276f634","unresolved":false,"context_lines":[{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def test_int(self):"},{"line_number":379,"context_line":"        v \u003d self.type_instance(\u0027-1\u0027)"},{"line_number":380,"context_line":"        self.assertEqual(v, \u0027-1\u0027)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def test_range_is_negative(self):"},{"line_number":383,"context_line":"        v \u003d self.type_instance(\u0027-3--1\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fad55976_def2176f","line":380,"range":{"start_line":380,"start_character":13,"end_line":380,"end_character":24},"updated":"2016-07-15 21:18:01.000000000","message":"assertEqual(expected, actual)","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1540b99dfaf699c84e9ecda70c076384bc9e8617","unresolved":false,"context_lines":[{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def test_int(self):"},{"line_number":379,"context_line":"        v \u003d self.type_instance(\u0027-1\u0027)"},{"line_number":380,"context_line":"        self.assertEqual(v, \u0027-1\u0027)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def test_range_is_negative(self):"},{"line_number":383,"context_line":"        v \u003d self.type_instance(\u0027-3--1\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_b8547c54","line":380,"range":{"start_line":380,"start_character":13,"end_line":380,"end_character":24},"in_reply_to":"fad55976_def2176f","updated":"2016-07-18 17:55:21.000000000","message":"Done","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"fc82802313e9de6ac41d1af91b9435f84276f634","unresolved":false,"context_lines":[{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def test_range_is_negative(self):"},{"line_number":383,"context_line":"        v \u003d self.type_instance(\u0027-3--1\u0027)"},{"line_number":384,"context_line":"        self.assertEqual(v, \u0027-3--1\u0027)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def test_range_format(self):"},{"line_number":387,"context_line":"        v \u003d self.type_instance(\u00271-3\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fad55976_3ee8937c","line":384,"range":{"start_line":384,"start_character":13,"end_line":384,"end_character":24},"updated":"2016-07-15 21:18:01.000000000","message":"assertEqual(expected, actual)","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1540b99dfaf699c84e9ecda70c076384bc9e8617","unresolved":false,"context_lines":[{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def test_range_is_negative(self):"},{"line_number":383,"context_line":"        v \u003d self.type_instance(\u0027-3--1\u0027)"},{"line_number":384,"context_line":"        self.assertEqual(v, \u0027-3--1\u0027)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def test_range_format(self):"},{"line_number":387,"context_line":"        v \u003d self.type_instance(\u00271-3\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_f84ef4bf","line":384,"range":{"start_line":384,"start_character":13,"end_line":384,"end_character":24},"in_reply_to":"fad55976_3ee8937c","updated":"2016-07-18 17:55:21.000000000","message":"Done","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"fc82802313e9de6ac41d1af91b9435f84276f634","unresolved":false,"context_lines":[{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def test_range_format(self):"},{"line_number":387,"context_line":"        v \u003d self.type_instance(\u00271-3\u0027)"},{"line_number":388,"context_line":"        self.assertEqual(v, \u00271-3\u0027)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def test_range_empty(self):"},{"line_number":391,"context_line":"        v \u003d self.type_instance(\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fad55976_1eedcf8b","line":388,"range":{"start_line":388,"start_character":13,"end_line":388,"end_character":24},"updated":"2016-07-15 21:18:01.000000000","message":"assertEqual(expected, actual)","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1540b99dfaf699c84e9ecda70c076384bc9e8617","unresolved":false,"context_lines":[{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def test_range_format(self):"},{"line_number":387,"context_line":"        v \u003d self.type_instance(\u00271-3\u0027)"},{"line_number":388,"context_line":"        self.assertEqual(v, \u00271-3\u0027)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def test_range_empty(self):"},{"line_number":391,"context_line":"        v \u003d self.type_instance(\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_18cca834","line":388,"range":{"start_line":388,"start_character":13,"end_line":388,"end_character":24},"in_reply_to":"fad55976_1eedcf8b","updated":"2016-07-18 17:55:21.000000000","message":"Done","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"fc82802313e9de6ac41d1af91b9435f84276f634","unresolved":false,"context_lines":[{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def test_range_empty(self):"},{"line_number":391,"context_line":"        v \u003d self.type_instance(\u0027\u0027)"},{"line_number":392,"context_line":"        self.assertEqual(v, \u0027\u0027)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    def test_range_is_invalid(self):"},{"line_number":395,"context_line":"        self.assertInvalid(\u00273-1\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fad55976_7e020b40","line":392,"range":{"start_line":392,"start_character":13,"end_line":392,"end_character":24},"updated":"2016-07-15 21:18:01.000000000","message":"assertEqual(expected, actual)","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1540b99dfaf699c84e9ecda70c076384bc9e8617","unresolved":false,"context_lines":[{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def test_range_empty(self):"},{"line_number":391,"context_line":"        v \u003d self.type_instance(\u0027\u0027)"},{"line_number":392,"context_line":"        self.assertEqual(v, \u0027\u0027)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    def test_range_is_invalid(self):"},{"line_number":395,"context_line":"        self.assertInvalid(\u00273-1\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_78d164cd","line":392,"range":{"start_line":392,"start_character":13,"end_line":392,"end_character":24},"in_reply_to":"fad55976_7e020b40","updated":"2016-07-18 17:55:21.000000000","message":"Done","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"e4dca0456d43002f7a46c9e8de478698498fbce4","unresolved":false,"context_lines":[{"line_number":549,"context_line":"    type \u003d types.Range()"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    def test_range(self):"},{"line_number":552,"context_line":"        self.assertConvertedValue(\u0027-3--1\u0027, range(-3, 0))"},{"line_number":553,"context_line":"        self.assertConvertedValue(\u0027-1--3\u0027, range(-1, -4, -1))"},{"line_number":554,"context_line":"        self.assertConvertedValue(\u0027-1\u0027, range(-1, 0))"},{"line_number":555,"context_line":"        self.assertInvalid(\u0027--1\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_2f620817","line":552,"updated":"2016-08-12 20:05:37.000000000","message":"Are these negative range cases supported because we need them, or just for completeness?","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"}],"oslo_config/types.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def __call__(self, value):"},{"line_number":365,"context_line":"        if not isinstance(value, str):"},{"line_number":366,"context_line":"            value \u003d str(value)"},{"line_number":367,"context_line":"        values \u003d value.split(\u0027-\u0027, 1)"},{"line_number":368,"context_line":"        parsed_value \u003d super(IntRange, self).__call__(values[0])"},{"line_number":369,"context_line":"        if values[0] \u003d\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_7bcacb1b","line":366,"updated":"2016-07-11 09:55:43.000000000","message":"probably best to just str() everything, it\u0027s a noop on actual strings","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def __call__(self, value):"},{"line_number":365,"context_line":"        if not isinstance(value, str):"},{"line_number":366,"context_line":"            value \u003d str(value)"},{"line_number":367,"context_line":"        values \u003d value.split(\u0027-\u0027, 1)"},{"line_number":368,"context_line":"        parsed_value \u003d super(IntRange, self).__call__(values[0])"},{"line_number":369,"context_line":"        if values[0] \u003d\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_d3cbe348","line":366,"in_reply_to":"1aa78d24_7bcacb1b","updated":"2016-07-15 18:50:59.000000000","message":"Done","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"fd1c8d4b96401c835c0ec908375b81e5d2ad52c8","unresolved":false,"context_lines":[{"line_number":364,"context_line":"    def __call__(self, value):"},{"line_number":365,"context_line":"        if not isinstance(value, str):"},{"line_number":366,"context_line":"            value \u003d str(value)"},{"line_number":367,"context_line":"        values \u003d value.split(\u0027-\u0027, 1)"},{"line_number":368,"context_line":"        parsed_value \u003d super(IntRange, self).__call__(values[0])"},{"line_number":369,"context_line":"        if values[0] \u003d\u003d \u0027\u0027:"},{"line_number":370,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_83049bc6","line":367,"range":{"start_line":367,"start_character":23,"end_line":367,"end_character":32},"updated":"2016-07-08 19:58:43.000000000","message":"Since this is a list of integers, would negative numbers with \u0027-\u0027 cause parsing problem?  I.e., is \u0027-1,0,1\u0027 is a valid list of integers, but based on the test, -1 would fail the \"No lower bound found.\"","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"22b7f5680ceee9ff1cca8abce00d8201b02de58a","unresolved":false,"context_lines":[{"line_number":364,"context_line":"    def __call__(self, value):"},{"line_number":365,"context_line":"        if not isinstance(value, str):"},{"line_number":366,"context_line":"            value \u003d str(value)"},{"line_number":367,"context_line":"        values \u003d value.split(\u0027-\u0027, 1)"},{"line_number":368,"context_line":"        parsed_value \u003d super(IntRange, self).__call__(values[0])"},{"line_number":369,"context_line":"        if values[0] \u003d\u003d \u0027\u0027:"},{"line_number":370,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_c30b437c","line":367,"range":{"start_line":367,"start_character":23,"end_line":367,"end_character":32},"in_reply_to":"1aa78d24_83049bc6","updated":"2016-07-08 20:24:29.000000000","message":"Good point, I will update this for only positive numbers and change this to PortRange or UIntRange for unsigned.","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":364,"context_line":"    def __call__(self, value):"},{"line_number":365,"context_line":"        if not isinstance(value, str):"},{"line_number":366,"context_line":"            value \u003d str(value)"},{"line_number":367,"context_line":"        values \u003d value.split(\u0027-\u0027, 1)"},{"line_number":368,"context_line":"        parsed_value \u003d super(IntRange, self).__call__(values[0])"},{"line_number":369,"context_line":"        if values[0] \u003d\u003d \u0027\u0027:"},{"line_number":370,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_f3f7ff89","line":367,"range":{"start_line":367,"start_character":23,"end_line":367,"end_character":32},"in_reply_to":"1aa78d24_b6856a08","updated":"2016-07-15 18:50:59.000000000","message":"I didn\u0027t exactly do what Alexis said here. What I do now is duck type it as an integer. I do this instead of using regex so I can call Interger\u0027s __call__method, calling this supports choices option. If we don\u0027t want to support choices, we can use what Alexis proposed.","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":364,"context_line":"    def __call__(self, value):"},{"line_number":365,"context_line":"        if not isinstance(value, str):"},{"line_number":366,"context_line":"            value \u003d str(value)"},{"line_number":367,"context_line":"        values \u003d value.split(\u0027-\u0027, 1)"},{"line_number":368,"context_line":"        parsed_value \u003d super(IntRange, self).__call__(values[0])"},{"line_number":369,"context_line":"        if values[0] \u003d\u003d \u0027\u0027:"},{"line_number":370,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_b6856a08","line":367,"range":{"start_line":367,"start_character":23,"end_line":367,"end_character":32},"in_reply_to":"1aa78d24_c30b437c","updated":"2016-07-11 09:55:43.000000000","message":"If you used a little parser, negative numbers wouldn\u0027t be a problem, see https://review.openstack.org/#/c/313699\n\n NUM \u003d \u0027-\u0027? [1-9][0-9]*\n RANGE \u003d NUM \u0027-\u0027 NUM\n\nGranted \"-4--1\" looks a bit weird but it\u0027s easy enough to parse really. You could also offer \u0027..\u0027 and \u0027...\u0027 like Python.","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        if not isinstance(value, str):"},{"line_number":366,"context_line":"            value \u003d str(value)"},{"line_number":367,"context_line":"        values \u003d value.split(\u0027-\u0027, 1)"},{"line_number":368,"context_line":"        parsed_value \u003d super(IntRange, self).__call__(values[0])"},{"line_number":369,"context_line":"        if values[0] \u003d\u003d \u0027\u0027:"},{"line_number":370,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, \u0027"},{"line_number":371,"context_line":"                             \u0027No lower bound found\u0027 % value)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_2121364e","line":368,"range":{"start_line":368,"start_character":23,"end_line":368,"end_character":64},"updated":"2016-07-11 09:55:43.000000000","message":"is this doing more than int(values[0]) ?","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        if not isinstance(value, str):"},{"line_number":366,"context_line":"            value \u003d str(value)"},{"line_number":367,"context_line":"        values \u003d value.split(\u0027-\u0027, 1)"},{"line_number":368,"context_line":"        parsed_value \u003d super(IntRange, self).__call__(values[0])"},{"line_number":369,"context_line":"        if values[0] \u003d\u003d \u0027\u0027:"},{"line_number":370,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, \u0027"},{"line_number":371,"context_line":"                             \u0027No lower bound found\u0027 % value)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_c17e7269","line":368,"range":{"start_line":368,"start_character":23,"end_line":368,"end_character":64},"in_reply_to":"1aa78d24_2121364e","updated":"2016-07-15 18:50:59.000000000","message":"Yes. This call also supports min, max, and choices options.","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        if values[1] \u003d\u003d \u0027\u0027:"},{"line_number":375,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, \u0027"},{"line_number":376,"context_line":"                             \u0027No upper bound found\u0027 % value)"},{"line_number":377,"context_line":"        temp_min \u003d self.min"},{"line_number":378,"context_line":"        try:"},{"line_number":379,"context_line":"            # Updating min here enforces the first value is smaller"},{"line_number":380,"context_line":"            self.min \u003d parsed_value"},{"line_number":381,"context_line":"            super(IntRange, self).__call__(values[1])"},{"line_number":382,"context_line":"            self.min \u003d temp_min"},{"line_number":383,"context_line":"        except ValueError:"},{"line_number":384,"context_line":"            self.min \u003d temp_min"},{"line_number":385,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, %s Should be greater than\u0027"},{"line_number":386,"context_line":"                             \u0027 %d\u0027 % (value, values[1], parsed_value))"},{"line_number":387,"context_line":"        return value"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def __repr__(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_e1e72ee2","line":386,"range":{"start_line":377,"start_character":8,"end_line":386,"end_character":70},"updated":"2016-07-11 09:55:43.000000000","message":"this block seems convoluted, just:\n\n  a, b \u003d values\n  if a \u003e b:\n    a, b \u003d b, a\n  if a \u003c self.min or a \u003e self.max or b \u003c self.min or b \u003e self.max:\n    raise ValueError","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        if values[1] \u003d\u003d \u0027\u0027:"},{"line_number":375,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, \u0027"},{"line_number":376,"context_line":"                             \u0027No upper bound found\u0027 % value)"},{"line_number":377,"context_line":"        temp_min \u003d self.min"},{"line_number":378,"context_line":"        try:"},{"line_number":379,"context_line":"            # Updating min here enforces the first value is smaller"},{"line_number":380,"context_line":"            self.min \u003d parsed_value"},{"line_number":381,"context_line":"            super(IntRange, self).__call__(values[1])"},{"line_number":382,"context_line":"            self.min \u003d temp_min"},{"line_number":383,"context_line":"        except ValueError:"},{"line_number":384,"context_line":"            self.min \u003d temp_min"},{"line_number":385,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, %s Should be greater than\u0027"},{"line_number":386,"context_line":"                             \u0027 %d\u0027 % (value, values[1], parsed_value))"},{"line_number":387,"context_line":"        return value"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def __repr__(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_334ea7c1","line":386,"range":{"start_line":377,"start_character":8,"end_line":386,"end_character":70},"in_reply_to":"1aa78d24_e1e72ee2","updated":"2016-07-15 18:50:59.000000000","message":"By using Integer\u0027s __call__ method we are supporting the choices option, and min and max range is covered here too. Also the format should be interger-biggerinteger, I don\u0027t think we want to allow swapping the range do we?","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"88eec0fabde428f863098fc7823c1b5a88d7de36","unresolved":false,"context_lines":[{"line_number":384,"context_line":"            self.min \u003d temp_min"},{"line_number":385,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, %s Should be greater than\u0027"},{"line_number":386,"context_line":"                             \u0027 %d\u0027 % (value, values[1], parsed_value))"},{"line_number":387,"context_line":"        return value"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def __repr__(self):"},{"line_number":390,"context_line":"        return super(IntRange,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_7c02c10a","line":387,"range":{"start_line":387,"start_character":15,"end_line":387,"end_character":20},"updated":"2016-07-11 09:55:43.000000000","message":"I\u0027m confused why you\u0027re returning a single int here. Shouldn\u0027t we return a generator over the acceptable numbers? Are you trying to pick the lowest number available? if so you\u0027re actually just picking min(values[0], self.min) which doesn\u0027t feel very useful! I am confused as to your intent.","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c2342a657266c661cde24e9c1df473da08d8886e","unresolved":false,"context_lines":[{"line_number":384,"context_line":"            self.min \u003d temp_min"},{"line_number":385,"context_line":"            raise ValueError(\u0027Invalid IntRange: %s, %s Should be greater than\u0027"},{"line_number":386,"context_line":"                             \u0027 %d\u0027 % (value, values[1], parsed_value))"},{"line_number":387,"context_line":"        return value"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def __repr__(self):"},{"line_number":390,"context_line":"        return super(IntRange,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_013a3a34","line":387,"range":{"start_line":387,"start_character":15,"end_line":387,"end_character":20},"in_reply_to":"1aa78d24_7c02c10a","updated":"2016-07-15 18:50:59.000000000","message":"Value here is a string. This method validates the values in the string by parsing them, then discarding the parsed values and returning string version of what was passed into the function.","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"fd1c8d4b96401c835c0ec908375b81e5d2ad52c8","unresolved":false,"context_lines":[{"line_number":389,"context_line":"    def __repr__(self):"},{"line_number":390,"context_line":"        return super(IntRange,"},{"line_number":391,"context_line":"                     self).__repr__().replace(\u0027Integer\u0027, \u0027IntRange\u0027, 1)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"class Float(ConfigType):"},{"line_number":395,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_83365bb2","line":392,"updated":"2016-07-08 19:58:43.000000000","message":"For consistencies, can you add __eq__ and _formater as well?","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"22b7f5680ceee9ff1cca8abce00d8201b02de58a","unresolved":false,"context_lines":[{"line_number":389,"context_line":"    def __repr__(self):"},{"line_number":390,"context_line":"        return super(IntRange,"},{"line_number":391,"context_line":"                     self).__repr__().replace(\u0027Integer\u0027, \u0027IntRange\u0027, 1)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"class Float(ConfigType):"},{"line_number":395,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_2374c7fb","line":392,"in_reply_to":"1aa78d24_83365bb2","updated":"2016-07-08 20:24:29.000000000","message":"__eq__ should be the same as Integer. Although _formatter, I\u0027m not sure if I need it or not.","commit_id":"c391cd8c15da4b454248e03d937c6715569120df"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"fc82802313e9de6ac41d1af91b9435f84276f634","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"class IntRange(Integer):"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    \"\"\"IntRange type."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    Converts value to an integer optionally doing range checking."},{"line_number":348,"context_line":"    If value is whitespace or empty string will return None."}],"source_content_type":"text/x-python","patch_set":2,"id":"fad55976_de997721","line":345,"range":{"start_line":345,"start_character":7,"end_line":345,"end_character":15},"updated":"2016-07-15 21:18:01.000000000","message":"Integer range","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1540b99dfaf699c84e9ecda70c076384bc9e8617","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"class IntRange(Integer):"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    \"\"\"IntRange type."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    Converts value to an integer optionally doing range checking."},{"line_number":348,"context_line":"    If value is whitespace or empty string will return None."}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_186828f5","line":345,"range":{"start_line":345,"start_character":7,"end_line":345,"end_character":15},"in_reply_to":"fad55976_de997721","updated":"2016-07-18 17:55:21.000000000","message":"Done","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"fc82802313e9de6ac41d1af91b9435f84276f634","unresolved":false,"context_lines":[{"line_number":354,"context_line":"    :param type_name: Type name to be used in the sample config file."},{"line_number":355,"context_line":"    :param choices: Optional sequence of valid values. Mutually exclusive"},{"line_number":356,"context_line":"                    with \u0027min/max\u0027."},{"line_number":357,"context_line":"    \"\"\""},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def __init__(self, min\u003dNone, max\u003dNone, type_name\u003d\u0027int range value\u0027,"},{"line_number":360,"context_line":"                 choices\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fad55976_9ef9bf50","line":357,"range":{"start_line":357,"start_character":4,"end_line":357,"end_character":7},"updated":"2016-07-15 21:18:01.000000000","message":"Please add versionchanged:: 3.14","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"1540b99dfaf699c84e9ecda70c076384bc9e8617","unresolved":false,"context_lines":[{"line_number":354,"context_line":"    :param type_name: Type name to be used in the sample config file."},{"line_number":355,"context_line":"    :param choices: Optional sequence of valid values. Mutually exclusive"},{"line_number":356,"context_line":"                    with \u0027min/max\u0027."},{"line_number":357,"context_line":"    \"\"\""},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def __init__(self, min\u003dNone, max\u003dNone, type_name\u003d\u0027int range value\u0027,"},{"line_number":360,"context_line":"                 choices\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_786de403","line":357,"range":{"start_line":357,"start_character":4,"end_line":357,"end_character":7},"in_reply_to":"fad55976_9ef9bf50","updated":"2016-07-18 17:55:21.000000000","message":"Done","commit_id":"a484e5fbc073220abfc44bc9b0bf7fb491b2d86d"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"38dbe2bbb9aff23804187b1ef8b5871dfb1f260b","unresolved":false,"context_lines":[{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    \"\"\"Integer range type."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    Converts value to an integer optionally doing range checking."},{"line_number":348,"context_line":"    If value is whitespace or empty string will return None."},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    :param min: Optional check that value is greater than or equal to min."}],"source_content_type":"text/x-python","patch_set":3,"id":"dada55a8_439b1e66","line":347,"range":{"start_line":347,"start_character":4,"end_line":347,"end_character":32},"updated":"2016-07-21 16:10:06.000000000","message":"pretty convinced this is a lie. From your tests:\n\n  v \u003d self.type_instance(\u0027-3--1\u0027)\n  self.assertEqual(\u0027-3--1\u0027, v)\n\n\u0027-3--1\u0027 is not an integer.","commit_id":"b778f01fb8413184032bd335698407aca58482b2"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"c0c83047f609aef7044c3589a670405e7f38c792","unresolved":false,"context_lines":[{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    \"\"\"Integer range type."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    Converts value to an integer optionally doing range checking."},{"line_number":348,"context_line":"    If value is whitespace or empty string will return None."},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    :param min: Optional check that value is greater than or equal to min."}],"source_content_type":"text/x-python","patch_set":3,"id":"dada55a8_8c93835a","line":347,"range":{"start_line":347,"start_character":4,"end_line":347,"end_character":32},"in_reply_to":"dada55a8_439b1e66","updated":"2016-07-21 17:01:40.000000000","message":"I need to rephrase that better. The part that says \u0027optionally doing range checking\u0027 meant that both integers and int rages are acceptable.\n\n\u0027-3--1\u0027 is not an integer but an integer range. This is equivalent to a list of integers that looks like [-3, -2, -1]","commit_id":"b778f01fb8413184032bd335698407aca58482b2"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"e53c77fa86a354291429d0611a28eb31b571931a","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    :param max: Optional check that value is less than or equal to max."},{"line_number":353,"context_line":"                Mutually exclusive with \u0027choices\u0027."},{"line_number":354,"context_line":"    :param type_name: Type name to be used in the sample config file."},{"line_number":355,"context_line":"    :param choices: Optional sequence of valid values. Mutually exclusive"},{"line_number":356,"context_line":"                    with \u0027min/max\u0027."},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    ..versionchanged:: 3.14"},{"line_number":359,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"dada55a8_137e4be4","line":356,"range":{"start_line":355,"start_character":5,"end_line":356,"end_character":34},"updated":"2016-07-18 18:01:08.000000000","message":"Although a sequence of integers will work, a sequence containing an Integer range will not. I think there is some value in keeping this option and updating the code to perform it, what do others think?","commit_id":"b778f01fb8413184032bd335698407aca58482b2"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"9b69bff9a8f4d5693692b74566c5fed561b8b1f5","unresolved":false,"context_lines":[{"line_number":355,"context_line":"    :param choices: Optional sequence of valid values. Mutually exclusive"},{"line_number":356,"context_line":"                    with \u0027min/max\u0027."},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    ..versionchanged:: 3.14"},{"line_number":359,"context_line":"    \"\"\""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    def __init__(self, min\u003dNone, max\u003dNone, type_name\u003d\u0027int range value\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_b7477d4a","line":358,"range":{"start_line":358,"start_character":23,"end_line":358,"end_character":27},"updated":"2016-08-02 18:40:04.000000000","message":"Sorry, 3.15 now","commit_id":"b778f01fb8413184032bd335698407aca58482b2"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"9d7545261d7b881775ef667f8ad9beab7f58629f","unresolved":false,"context_lines":[{"line_number":379,"context_line":"    :param type_name: Type name to be used in the sample config file."},{"line_number":380,"context_line":"    :param num_type: the type of number used for casting (i.e int, float)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    .. versionadded:: 3.15"},{"line_number":383,"context_line":"    \"\"\""},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    def __init__(self, num_type, min\u003dNone, max\u003dNone, type_name\u003d\u0027range value\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_deae0fe5","line":382,"range":{"start_line":382,"start_character":22,"end_line":382,"end_character":26},"updated":"2016-08-10 15:55:15.000000000","message":"Should be 3.16 now","commit_id":"2bbad1820e3170c1329d5cd21bdc863482bda61c"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"14df3b1857235068393f70924865662662f1aaf8","unresolved":false,"context_lines":[{"line_number":477,"context_line":"    \"\"\"Range type."},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    Represents a range of integers. A range is identified by an integer both"},{"line_number":480,"context_line":"    sides of a \u0027-\u0027 character. Negatives are allowed. A single number is also a"},{"line_number":481,"context_line":"    valid range."},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    :param min: Optional check that lower bound is greater than or equal to"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_4598541c","line":480,"range":{"start_line":480,"start_character":15,"end_line":480,"end_character":18},"updated":"2016-08-11 15:38:53.000000000","message":"Wouldn\u0027t it be better to replace \u0027-\u0027 by \u0027:\u0027? I think that \u0027:\u0027 as a separator looks better (especially with negative numbers), and also it is more Pythonic way to represent ranges (i.e. slices).","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"54e145c55feed85a0735e73e47e8c0e4dc76e873","unresolved":false,"context_lines":[{"line_number":477,"context_line":"    \"\"\"Range type."},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    Represents a range of integers. A range is identified by an integer both"},{"line_number":480,"context_line":"    sides of a \u0027-\u0027 character. Negatives are allowed. A single number is also a"},{"line_number":481,"context_line":"    valid range."},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    :param min: Optional check that lower bound is greater than or equal to"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_3b88afc6","line":480,"range":{"start_line":480,"start_character":15,"end_line":480,"end_character":18},"in_reply_to":"9ad45d7e_3b254f0a","updated":"2016-08-12 09:46:55.000000000","message":"Trevor what\u0027s your thought?","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"e4dca0456d43002f7a46c9e8de478698498fbce4","unresolved":false,"context_lines":[{"line_number":477,"context_line":"    \"\"\"Range type."},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    Represents a range of integers. A range is identified by an integer both"},{"line_number":480,"context_line":"    sides of a \u0027-\u0027 character. Negatives are allowed. A single number is also a"},{"line_number":481,"context_line":"    valid range."},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    :param min: Optional check that lower bound is greater than or equal to"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_6fe7e0ac","line":480,"range":{"start_line":480,"start_character":15,"end_line":480,"end_character":18},"in_reply_to":"9ad45d7e_3b88afc6","updated":"2016-08-12 20:05:37.000000000","message":"I tend to agree that something like -1--3 is going to look odd in config files. On the other hand, how often does that come up in reality?","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"8a42b1bcc3c5b31255a74b15cb9f1c29f9e38d3d","unresolved":false,"context_lines":[{"line_number":477,"context_line":"    \"\"\"Range type."},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    Represents a range of integers. A range is identified by an integer both"},{"line_number":480,"context_line":"    sides of a \u0027-\u0027 character. Negatives are allowed. A single number is also a"},{"line_number":481,"context_line":"    valid range."},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    :param min: Optional check that lower bound is greater than or equal to"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_3b254f0a","line":480,"range":{"start_line":480,"start_character":15,"end_line":480,"end_character":18},"in_reply_to":"9ad45d7e_4598541c","updated":"2016-08-12 09:45:05.000000000","message":"I\u0027m tempted to agree, let\u0027s get some chatter here","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"79e77c27dec917e773d2bce22fabc7dfd0444d22","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        self.inclusive \u003d inclusive"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def __call__(self, value):"},{"line_number":500,"context_line":"        num \u003d pp.Combine(pp.Optional(\u0027-\u0027) + pp.Word(pp.nums))"},{"line_number":501,"context_line":"        num.setParseAction(lambda _s, _l, toks: [int(toks[0])])"},{"line_number":502,"context_line":"        arange \u003d num + pp.Suppress(\u0027-\u0027) + num"},{"line_number":503,"context_line":"        single \u003d pp.Combine(num)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_292184b5","line":500,"range":{"start_line":500,"start_character":36,"end_line":500,"end_character":41},"updated":"2016-08-12 11:57:49.000000000","message":"I also think it should be allowed for positive numbers to also have an optional unary plus, because now ranges like \u0027+1-+2\u0027 are not valid.","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2518e64163f544156913cfe9740999ab0e3c0ee0","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        self.inclusive \u003d inclusive"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def __call__(self, value):"},{"line_number":500,"context_line":"        num \u003d pp.Combine(pp.Optional(\u0027-\u0027) + pp.Word(pp.nums))"},{"line_number":501,"context_line":"        num.setParseAction(lambda _s, _l, toks: [int(toks[0])])"},{"line_number":502,"context_line":"        arange \u003d num + pp.Suppress(\u0027-\u0027) + num"},{"line_number":503,"context_line":"        single \u003d pp.Combine(num)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_64af232c","line":500,"range":{"start_line":500,"start_character":36,"end_line":500,"end_character":41},"in_reply_to":"9ad45d7e_292184b5","updated":"2016-08-12 12:11:18.000000000","message":"What benefit does this offer?","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"e4dca0456d43002f7a46c9e8de478698498fbce4","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        self.inclusive \u003d inclusive"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def __call__(self, value):"},{"line_number":500,"context_line":"        num \u003d pp.Combine(pp.Optional(\u0027-\u0027) + pp.Word(pp.nums))"},{"line_number":501,"context_line":"        num.setParseAction(lambda _s, _l, toks: [int(toks[0])])"},{"line_number":502,"context_line":"        arange \u003d num + pp.Suppress(\u0027-\u0027) + num"},{"line_number":503,"context_line":"        single \u003d pp.Combine(num)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_cff88c4c","line":500,"range":{"start_line":500,"start_character":36,"end_line":500,"end_character":41},"in_reply_to":"9ad45d7e_64af232c","updated":"2016-08-12 20:05:37.000000000","message":"Right, think about what this is going to be used for. What are operators going to be expressing as +2 instead of simply 2?","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"e4dca0456d43002f7a46c9e8de478698498fbce4","unresolved":false,"context_lines":[{"line_number":518,"context_line":"            step \u003d -1"},{"line_number":519,"context_line":"        if self.inclusive:"},{"line_number":520,"context_line":"            right +\u003d step"},{"line_number":521,"context_line":"        return range(left, right, step)"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def __eq__(self, other):"},{"line_number":524,"context_line":"        return ("}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_af0b982a","line":521,"updated":"2016-08-12 20:05:37.000000000","message":"I would prefer not to add PyParsing as a dependency if we can skip it. It\u0027s a rather heavy library to process these strings. If we can agree to drop support for negatives, we only need to split on -. If we need negatives, we should be able to use a regex.","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"},{"author":{"_account_id":20864,"name":"Gevorg Davoian","email":"gdavoian@gmail.com","username":"gdavoian"},"change_message_id":"559236a4d56853480b771e1878682b12c1f0091c","unresolved":false,"context_lines":[{"line_number":498,"context_line":"    def __call__(self, value):"},{"line_number":499,"context_line":"        value \u003d str(value)"},{"line_number":500,"context_line":"        num \u003d \"-?[1-9][0-9]*\""},{"line_number":501,"context_line":"        m \u003d re.match(\"^(%s)(?:-(%s))?$\" % (num, num), value)"},{"line_number":502,"context_line":"        if not m:"},{"line_number":503,"context_line":"            raise ValueError(\u0027Invalid Range: %s\u0027 % value)"},{"line_number":504,"context_line":"        left \u003d int(m.group(1))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3ac371cc_1605afc1","line":501,"range":{"start_line":501,"start_character":59,"end_line":501,"end_character":60},"updated":"2016-08-15 10:13:13.000000000","message":"It seems, that ranges 0-n or -n-0 (n is a positive integer) are not valid.","commit_id":"2b9a1f54b52cdd4178fe06e44c3c345adb543650"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"95d4f93cfb9ae76498b5d0827e92bc232ab48de8","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        self.max \u003d max"},{"line_number":496,"context_line":"        self.inclusive \u003d inclusive"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    def __call__(self, value):"},{"line_number":499,"context_line":"        value \u003d str(value)"},{"line_number":500,"context_line":"        num \u003d \"0|-?[1-9][0-9]*\""},{"line_number":501,"context_line":"        m \u003d re.match(\"^(%s)(?:-(%s))?$\" % (num, num), value)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_11651d1d","line":498,"updated":"2016-08-17 19:02:21.000000000","message":"So instead of all this regex and int validation and ... can we just switch to (or something like it):\n\nhttp://paste.openstack.org/show/559087/\n\nThen at least we aren\u0027t trying to validate integers ourself and we have a nice testable routine that is the splitting into a two integer range.\n\nThat\u0027d make me feel more comfortable than a regex that is trying to do the same...","commit_id":"1125448bb964c1e70225e879447dd7a130697cf9"},{"author":{"_account_id":20378,"name":"Trevor McCasland","email":"TM2086@att.com","username":"twm2016"},"change_message_id":"e712977d8784fcc030c43dc7e383427d348171bb","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        self.max \u003d max"},{"line_number":496,"context_line":"        self.inclusive \u003d inclusive"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    def __call__(self, value):"},{"line_number":499,"context_line":"        value \u003d str(value)"},{"line_number":500,"context_line":"        num \u003d \"0|-?[1-9][0-9]*\""},{"line_number":501,"context_line":"        m \u003d re.match(\"^(%s)(?:-(%s))?$\" % (num, num), value)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_e813f262","line":498,"in_reply_to":"3ac371cc_11651d1d","updated":"2016-08-18 16:45:56.000000000","message":"Hi Joshua, I wrote something similar to what you are proposing on patch set 5. I\u0027m okay with either solution but if you feel strongly about not using regex, I\u0027m sure we can combine your paste with this patch somehow.","commit_id":"1125448bb964c1e70225e879447dd7a130697cf9"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"95d4f93cfb9ae76498b5d0827e92bc232ab48de8","unresolved":false,"context_lines":[{"line_number":514,"context_line":"            step \u003d -1"},{"line_number":515,"context_line":"        if self.inclusive:"},{"line_number":516,"context_line":"            right +\u003d step"},{"line_number":517,"context_line":"        return range(left, right, step)"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def __eq__(self, other):"},{"line_number":520,"context_line":"        return ("}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_712451c4","line":517,"updated":"2016-08-17 19:02:21.000000000","message":"Why usage of range here, that usage expands the range in py2.\n\nIf u just did the following I think this would still work and wouldn\u0027t fully expand the range...\n\n  from six.moves import range as compat_range\n\nThen just use compat_range here.","commit_id":"1125448bb964c1e70225e879447dd7a130697cf9"}],"requirements.txt":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"e4dca0456d43002f7a46c9e8de478698498fbce4","unresolved":false,"context_lines":[{"line_number":8,"context_line":"stevedore\u003e\u003d1.16.0 # Apache-2.0"},{"line_number":9,"context_line":"oslo.i18n\u003e\u003d2.1.0 # Apache-2.0"},{"line_number":10,"context_line":"rfc3986\u003e\u003d0.2.0 # Apache-2.0"},{"line_number":11,"context_line":"pyparsing\u003e\u003d2.0.1 # MIT"}],"source_content_type":"text/plain","patch_set":6,"id":"9ad45d7e_0fc0e4df","line":11,"updated":"2016-08-12 20:05:37.000000000","message":"This is a pretty heavy requirement to add just to split numbers on -.","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"792f489c9bdac1e8c64a012ec48495008f7e40ba","unresolved":false,"context_lines":[{"line_number":8,"context_line":"stevedore\u003e\u003d1.16.0 # Apache-2.0"},{"line_number":9,"context_line":"oslo.i18n\u003e\u003d2.1.0 # Apache-2.0"},{"line_number":10,"context_line":"rfc3986\u003e\u003d0.2.0 # Apache-2.0"},{"line_number":11,"context_line":"pyparsing\u003e\u003d2.0.1 # MIT"}],"source_content_type":"text/plain","patch_set":6,"id":"3ac371cc_ddadfa89","line":11,"in_reply_to":"9ad45d7e_0fc0e4df","updated":"2016-08-15 08:58:47.000000000","message":"OK let me change it back","commit_id":"bd03ce9fc98025b069268468a8bf8a0e04e487f0"}]}
