)]}'
{"oslo/db/sqlalchemy/test_migrations.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"de070d22494c813fa73350e605c9f237a0534044","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import os"},{"line_number":20,"context_line":"import subprocess"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import lockfile"},{"line_number":23,"context_line":"from oslotest import base as test_base"},{"line_number":24,"context_line":"from six import moves"},{"line_number":25,"context_line":"from six.moves.urllib import parse"}],"source_content_type":"text/x-python","patch_set":2,"id":"7adec928_e653fd36","side":"PARENT","line":22,"updated":"2014-05-16 13:58:01.000000000","message":"I guess, we can remove this from requirements also","commit_id":"6d211c5d7207ce6c70b918f24f46b48a1f75cc13"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"c6a5735c6e73da676fe19e0f9bcdd6d601071b35","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        @functools.wraps(f)"},{"line_number":58,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":59,"context_line":"            try:"},{"line_number":60,"context_line":"                path \u003d lock_path or os.environ.get(\"OSLO_LOCK_PATH\")"},{"line_number":61,"context_line":"                lock \u003d lockfile.FileLock(os.path.join(path, lock_prefix))"},{"line_number":62,"context_line":"                with lock:"},{"line_number":63,"context_line":"                    LOG.debug(\u0027Got lock \"%s\"\u0027 % f.__name__)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_807d44ea","side":"PARENT","line":60,"updated":"2014-05-21 07:18:14.000000000","message":"I\u0027d suggest to remove this variable from tox.ini also","commit_id":"91284be94acc7bfcf503eee7cb24fe22bedb3fa7"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"521e154cc91881eaf7170a90c7af62ce5cea5e38","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        @functools.wraps(f)"},{"line_number":58,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":59,"context_line":"            try:"},{"line_number":60,"context_line":"                path \u003d lock_path or os.environ.get(\"OSLO_LOCK_PATH\")"},{"line_number":61,"context_line":"                lock \u003d lockfile.FileLock(os.path.join(path, lock_prefix))"},{"line_number":62,"context_line":"                with lock:"},{"line_number":63,"context_line":"                    LOG.debug(\u0027Got lock \"%s\"\u0027 % f.__name__)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_e0d9a8f5","side":"PARENT","line":60,"in_reply_to":"7adec928_807d44ea","updated":"2014-05-21 07:20:14.000000000","message":"Sure. Thanks.","commit_id":"91284be94acc7bfcf503eee7cb24fe22bedb3fa7"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"497cb57897e8c53ca061e7f7e43bf2c6256a64fb","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                if check:"},{"line_number":116,"context_line":"                    check(self.engine, data)"},{"line_number":117,"context_line":"        except Exception:"},{"line_number":118,"context_line":"            LOG.error(_LE(\"Failed to migrate to version %s on engine %s\") %"},{"line_number":119,"context_line":"                      (version, self.engine))"},{"line_number":120,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_1f2e12fb","line":118,"updated":"2014-05-20 11:22:35.000000000","message":"this seems to be untested","commit_id":"e44590168fc6b0713532fd3cd11bbbb7b113835c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7e7a528c6dbf87c53aca1d5eb1e9c3d0bbc8c696","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":28,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        Determine latest version script from the repo, then"},{"line_number":31,"context_line":"        upgrade from 1 through to the latest, with no data"},{"line_number":32,"context_line":"        in the databases. This just checks that the schema itself"},{"line_number":33,"context_line":"        upgrades successfully."}],"source_content_type":"text/x-python","patch_set":6,"id":"5adbc538_ed2b5a2e","line":30,"updated":"2014-05-26 13:25:21.000000000","message":"the latest","commit_id":"ebb94105a14fee6d3554a4d608d8eef990e0f9b7"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7e7a528c6dbf87c53aca1d5eb1e9c3d0bbc8c696","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        in the databases. This just checks that the schema itself"},{"line_number":33,"context_line":"        upgrades successfully."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        :snake_walk: Boolean. Force double check if True."},{"line_number":36,"context_line":"        :downgrade: Boolean. Check downgrade behavior if True."},{"line_number":37,"context_line":"        \"\"\""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5adbc538_4d1a8e18","line":35,"updated":"2014-05-26 13:25:21.000000000","message":"this should probably be:\n\n  :param snake_walk: ...\n  :type snake_walk: bool\n\n  :param downgrade: ...\n  :type downgrade: bool","commit_id":"ebb94105a14fee6d3554a4d608d8eef990e0f9b7"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"8c357d36665443c8200c3dcfa512a646b947049d","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class WalkVersionsMixin(object):"},{"line_number":26,"context_line":"    \"\"\"Test mixin to check upgrade and downgrade ability of migration.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":29,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ae8d1ca_fcdbcc18","line":26,"updated":"2014-05-29 07:17:33.000000000","message":"We should document that:\n\n1) this is only suitable for testing of migrate migration scripts, not alembic ones\n\n2) subclasses of this mixin are required to provide a few helper attributes: REPOSITORY, INIT_VERSION, migration_api; document what they should be","commit_id":"5f22488b80e4f8ce1291c9f4cb564b667f2e1e5c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"1ae2935433ca8c26cac5e928d2d9e273c29d0e3c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class WalkVersionsMixin(object):"},{"line_number":26,"context_line":"    \"\"\"Test mixin to check upgrade and downgrade ability of migration.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":29,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ae8d1ca_f2b9332f","line":26,"in_reply_to":"3ae8d1ca_57bad9c0","updated":"2014-05-29 08:22:18.000000000","message":"So, I\u0027m not really worried that we don\u0027t initialize them to None in this class, but rather that we don\u0027t document them here. On the other hand, we could try to use abc.abstractproperty and thus require subclasses to override those properties.","commit_id":"5f22488b80e4f8ce1291c9f4cb564b667f2e1e5c"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"bb20e4491bb1fc77f2dca3d611ea8b2ad41ba44e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class WalkVersionsMixin(object):"},{"line_number":26,"context_line":"    \"\"\"Test mixin to check upgrade and downgrade ability of migration.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":29,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ae8d1ca_57bad9c0","line":26,"in_reply_to":"3ae8d1ca_fcdbcc18","updated":"2014-05-29 07:59:41.000000000","message":"Will be done. I believe that REPOSITORY and INIT_VERSION should be implemented as None attributes or as property raised NotImplementedError. It will be more obvious, what do you think about it?","commit_id":"5f22488b80e4f8ce1291c9f4cb564b667f2e1e5c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"8c357d36665443c8200c3dcfa512a646b947049d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        in the databases. This just checks that the schema itself"},{"line_number":34,"context_line":"        upgrades successfully."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        :param snake_walk: Force double check if True."},{"line_number":37,"context_line":"        :type snake_walk: bool"},{"line_number":38,"context_line":"        :param downgrade: Check downgrade behavior if True."},{"line_number":39,"context_line":"        :type downgrade: bool"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ae8d1ca_dcf3709d","line":36,"updated":"2014-05-29 07:17:33.000000000","message":"Probably, it makes sense to elaborate on what snake walk is","commit_id":"5f22488b80e4f8ce1291c9f4cb564b667f2e1e5c"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"bb20e4491bb1fc77f2dca3d611ea8b2ad41ba44e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        in the databases. This just checks that the schema itself"},{"line_number":34,"context_line":"        upgrades successfully."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        :param snake_walk: Force double check if True."},{"line_number":37,"context_line":"        :type snake_walk: bool"},{"line_number":38,"context_line":"        :param downgrade: Check downgrade behavior if True."},{"line_number":39,"context_line":"        :type downgrade: bool"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ae8d1ca_17a9317b","line":36,"in_reply_to":"3ae8d1ca_dcf3709d","updated":"2014-05-29 07:59:41.000000000","message":"Done","commit_id":"5f22488b80e4f8ce1291c9f4cb564b667f2e1e5c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7934aa42df0a66ef8101e011f4193fa215148a1b","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    .. _migrate: https://sqlalchemy-migrate.readthedocs.org/en/latest/"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    .. automethod:: _walk_versions"},{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    INIT_VERSION \u003d abc.abstractproperty(lambda: None)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_6542d011","line":37,"updated":"2014-06-02 09:16:13.000000000","message":"this shouldn\u0027t go here, but rather to docs/ instead (and I\u0027m not sure we need this anyway)","commit_id":"46cd3dbda7a01e8b7bba13915eef1ead7fda225a"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"612182063cd1a92de98044a406fb2329f6483a21","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    .. _migrate: https://sqlalchemy-migrate.readthedocs.org/en/latest/"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    .. automethod:: _walk_versions"},{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    INIT_VERSION \u003d abc.abstractproperty(lambda: None)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_19ec75ba","line":37,"in_reply_to":"1ae5cdf2_6542d011","updated":"2014-06-06 07:58:07.000000000","message":"Done","commit_id":"46cd3dbda7a01e8b7bba13915eef1ead7fda225a"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7934aa42df0a66ef8101e011f4193fa215148a1b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    INIT_VERSION \u003d abc.abstractproperty(lambda: None)"},{"line_number":41,"context_line":"    \"\"\"Initial version of a migration repository. Could be differs from 0, if"},{"line_number":42,"context_line":"    a migrations was squashed."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    REPOSITORY \u003d abc.abstractproperty(lambda: None)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_65ff3068","line":41,"updated":"2014-06-02 09:16:13.000000000","message":"nit: can be different","commit_id":"46cd3dbda7a01e8b7bba13915eef1ead7fda225a"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"612182063cd1a92de98044a406fb2329f6483a21","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    INIT_VERSION \u003d abc.abstractproperty(lambda: None)"},{"line_number":41,"context_line":"    \"\"\"Initial version of a migration repository. Could be differs from 0, if"},{"line_number":42,"context_line":"    a migrations was squashed."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    REPOSITORY \u003d abc.abstractproperty(lambda: None)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_392e91fb","line":41,"in_reply_to":"1ae5cdf2_65ff3068","updated":"2014-06-06 07:58:07.000000000","message":"Done","commit_id":"46cd3dbda7a01e8b7bba13915eef1ead7fda225a"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7934aa42df0a66ef8101e011f4193fa215148a1b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        upgrades successfully."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        :param snake_walk: Force double check if True. `snake_walk` forces\\"},{"line_number":63,"context_line":"        check ability to downgrade successful of newly upgraded migration and\\"},{"line_number":64,"context_line":"        and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":65,"context_line":"        :type snake_walk: bool"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_65365054","line":62,"updated":"2014-06-02 09:16:13.000000000","message":"why do you need \\ here and below?","commit_id":"46cd3dbda7a01e8b7bba13915eef1ead7fda225a"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"612182063cd1a92de98044a406fb2329f6483a21","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        upgrades successfully."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        :param snake_walk: Force double check if True. `snake_walk` forces\\"},{"line_number":63,"context_line":"        check ability to downgrade successful of newly upgraded migration and\\"},{"line_number":64,"context_line":"        and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":65,"context_line":"        :type snake_walk: bool"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_79af397d","line":62,"in_reply_to":"1ae5cdf2_65365054","updated":"2014-06-06 07:58:07.000000000","message":"Due to rest markup. Parameter description must be placed in one line. So, I have a choice here: or I hit the pep8 80 rule, or cut the message, or put that slash there.","commit_id":"46cd3dbda7a01e8b7bba13915eef1ead7fda225a"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"9ab13b191fce38758411ef50e92097841398821d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\"Test mixin to check upgrade and downgrade ability of migration."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    This is only suitable for testing of migrate_ migration scripts. An"},{"line_number":32,"context_line":"    abstract class mixin. `INIT_VERSION, REPOSITORY and migration_api"},{"line_number":33,"context_line":"    attributes must be implemented in a subclasses."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    .. _migrate: https://sqlalchemy-migrate.readthedocs.org/en/latest/"}],"source_content_type":"text/x-python","patch_set":20,"id":"1ae5cdf2_e90809db","line":32,"updated":"2014-06-27 12:57:03.000000000","message":"not sure what ` symbol is for","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3c241106acd83d4f5c95594f4005e6aa2e45acbb","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\"Test mixin to check upgrade and downgrade ability of migration."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    This is only suitable for testing of migrate_ migration scripts. An"},{"line_number":32,"context_line":"    abstract class mixin. `INIT_VERSION, REPOSITORY and migration_api"},{"line_number":33,"context_line":"    attributes must be implemented in a subclasses."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    .. _migrate: https://sqlalchemy-migrate.readthedocs.org/en/latest/"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_7a4b7559","line":32,"in_reply_to":"1ae5cdf2_e90809db","updated":"2014-07-01 10:33:19.000000000","message":"Done","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"9ab13b191fce38758411ef50e92097841398821d","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    This is only suitable for testing of migrate_ migration scripts. An"},{"line_number":32,"context_line":"    abstract class mixin. `INIT_VERSION, REPOSITORY and migration_api"},{"line_number":33,"context_line":"    attributes must be implemented in a subclasses."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    .. _migrate: https://sqlalchemy-migrate.readthedocs.org/en/latest/"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1ae5cdf2_69f4f9ce","line":33,"updated":"2014-06-27 12:57:03.000000000","message":"s/a//","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3c241106acd83d4f5c95594f4005e6aa2e45acbb","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    This is only suitable for testing of migrate_ migration scripts. An"},{"line_number":32,"context_line":"    abstract class mixin. `INIT_VERSION, REPOSITORY and migration_api"},{"line_number":33,"context_line":"    attributes must be implemented in a subclasses."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    .. _migrate: https://sqlalchemy-migrate.readthedocs.org/en/latest/"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_9a48495d","line":33,"in_reply_to":"1ae5cdf2_69f4f9ce","updated":"2014-07-01 10:33:19.000000000","message":"Done","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"9ab13b191fce38758411ef50e92097841398821d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    INIT_VERSION \u003d abc.abstractproperty(lambda: None)"},{"line_number":41,"context_line":"    \"\"\"Initial version of a migration repository. Could be differs from 0, if"},{"line_number":42,"context_line":"    a migrations was squashed."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    REPOSITORY \u003d abc.abstractproperty(lambda: None)"}],"source_content_type":"text/x-python","patch_set":20,"id":"1ae5cdf2_09237558","line":41,"updated":"2014-06-27 12:57:03.000000000","message":"s/Could be differs/Can be different/","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3c241106acd83d4f5c95594f4005e6aa2e45acbb","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    INIT_VERSION \u003d abc.abstractproperty(lambda: None)"},{"line_number":41,"context_line":"    \"\"\"Initial version of a migration repository. Could be differs from 0, if"},{"line_number":42,"context_line":"    a migrations was squashed."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    REPOSITORY \u003d abc.abstractproperty(lambda: None)"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_5a48712d","line":41,"in_reply_to":"1ae5cdf2_09237558","updated":"2014-07-01 10:33:19.000000000","message":"Done","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"9ab13b191fce38758411ef50e92097841398821d","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    INIT_VERSION \u003d abc.abstractproperty(lambda: None)"},{"line_number":41,"context_line":"    \"\"\"Initial version of a migration repository. Could be differs from 0, if"},{"line_number":42,"context_line":"    a migrations was squashed."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    REPOSITORY \u003d abc.abstractproperty(lambda: None)"},{"line_number":45,"context_line":"    \"\"\"`migrate.versioning.repository.Repository` subclass. Allows basic"}],"source_content_type":"text/x-python","patch_set":20,"id":"1ae5cdf2_c92c2d4d","line":42,"updated":"2014-06-27 12:57:03.000000000","message":"s/a//\n\ns/was/were/","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3c241106acd83d4f5c95594f4005e6aa2e45acbb","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    INIT_VERSION \u003d abc.abstractproperty(lambda: None)"},{"line_number":41,"context_line":"    \"\"\"Initial version of a migration repository. Could be differs from 0, if"},{"line_number":42,"context_line":"    a migrations was squashed."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    REPOSITORY \u003d abc.abstractproperty(lambda: None)"},{"line_number":45,"context_line":"    \"\"\"`migrate.versioning.repository.Repository` subclass. Allows basic"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_7a5535c5","line":42,"in_reply_to":"1ae5cdf2_c92c2d4d","updated":"2014-07-01 10:33:19.000000000","message":"Done","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"9ab13b191fce38758411ef50e92097841398821d","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    migration_api \u003d abc.abstractproperty(lambda: None)"},{"line_number":49,"context_line":"    \"\"\"Migrate.api or overloaded analog. Provides upgrade, downgrade and"},{"line_number":50,"context_line":"    version manipulation functionality."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":54,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"}],"source_content_type":"text/x-python","patch_set":20,"id":"1ae5cdf2_693a3935","line":51,"updated":"2014-06-27 12:57:03.000000000","message":"Ok, so _walk_versions() actually assumes that either subclasses or their instances also provide engine attribute. We should document this too (though, this won\u0027t be an abstract property).","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3c241106acd83d4f5c95594f4005e6aa2e45acbb","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    migration_api \u003d abc.abstractproperty(lambda: None)"},{"line_number":49,"context_line":"    \"\"\"Migrate.api or overloaded analog. Provides upgrade, downgrade and"},{"line_number":50,"context_line":"    version manipulation functionality."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":54,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_5de4eb0c","line":51,"in_reply_to":"1ae5cdf2_693a3935","updated":"2014-07-01 10:33:19.000000000","message":"I made it an abstract property and documented it.","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"9ab13b191fce38758411ef50e92097841398821d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        upgrades successfully."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        :param snake_walk: Force double check if True. `snake_walk` forces\\"},{"line_number":63,"context_line":"        check ability to downgrade successful of newly upgraded migration and\\"},{"line_number":64,"context_line":"        and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":65,"context_line":"        :type snake_walk: bool"}],"source_content_type":"text/x-python","patch_set":20,"id":"1ae5cdf2_09a8d58a","line":62,"updated":"2014-06-27 12:57:03.000000000","message":"I bet you won\u0027t need \\ here, if you fix the indentation below :)","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"3c241106acd83d4f5c95594f4005e6aa2e45acbb","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        upgrades successfully."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        :param snake_walk: Force double check if True. `snake_walk` forces\\"},{"line_number":63,"context_line":"        check ability to downgrade successful of newly upgraded migration and\\"},{"line_number":64,"context_line":"        and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":65,"context_line":"        :type snake_walk: bool"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_fdabff86","line":62,"in_reply_to":"1ae5cdf2_09a8d58a","updated":"2014-07-01 10:33:19.000000000","message":"Done","commit_id":"747b51e46c7cd008ebab93734978b387d9ac0993"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c237b69dd26aba185c57092cde72196dd767a4fc","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    \"\"\"Migrate.api or overloaded analog. Provides upgrade, downgrade and"},{"line_number":50,"context_line":"    version manipulation functionality."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    engine \u003d abc.abstractproperty(lambda: None)"},{"line_number":53,"context_line":"    \"\"\"Sqlalchemy engine instance. Should be the same instance as used by"},{"line_number":54,"context_line":"    Alembic when migrations applied.\"\"\""},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_0ea6bb10","line":52,"updated":"2014-07-01 11:37:33.000000000","message":"Perhaps, I wasn\u0027t clear here: I\u0027d like to make \u0027engine\u0027 an abstract property, but, unfortunately, this won\u0027t play nicely with base db test cases we provide in oslo.db (as they set engine *instance* attribute on a test case: engine is created per test case, not per class, as it\u0027s not meant to be shared). Right now, subclasses have to override this property and return \u0027engine\u0027 instance attribute (given the fact, that you have a class descriptor with the same name, you\u0027ll end up with something like:\n\n   @property\n   def engine(self):\n       return self.__dict__[\u0027engine\u0027]\n\n), which isn\u0027t really pretty. If they override engine property, instantiating of a test case will fail (despite the fact that it\u0027d have \u0027engine\u0027 *instance* attribute).\n\nSo you basically have two choices here:\n\n1. Rename it to something like e.g. \u0027migrate_engine\u0027, make it an abstract property and require subclasses to override this attribute, so that the ones which use our db test cases will implement it like: \n\n  @property\n  def migrate_engine(self):\n     return self.engine\n\n2. Make WalkVersionsMixin inherit DbTestCase, which would make test pass, but WalkVersionsMixin wouldn\u0027t really be a mixin anymore.","commit_id":"52e24c58bd369624a1cfe4e209bc8a55331d65af"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"f2f6a3ae568cc71993528ef738a2dc9d906bed9b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    \"\"\"Migrate.api or overloaded analog. Provides upgrade, downgrade and"},{"line_number":50,"context_line":"    version manipulation functionality."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    engine \u003d abc.abstractproperty(lambda: None)"},{"line_number":53,"context_line":"    \"\"\"Sqlalchemy engine instance. Should be the same instance as used by"},{"line_number":54,"context_line":"    Alembic when migrations applied.\"\"\""},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_af4c8a9f","line":52,"in_reply_to":"baada198_0ea6bb10","updated":"2014-07-03 14:22:59.000000000","message":"Well, if we set an engine for every test (am I correctly understood you?) \n\n  @property\n  def migrate_engine(self):\n     return self.engine\n\nlooks like an all-sufficient solution and haven\u0027t to be an abstract.","commit_id":"52e24c58bd369624a1cfe4e209bc8a55331d65af"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c237b69dd26aba185c57092cde72196dd767a4fc","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    engine \u003d abc.abstractproperty(lambda: None)"},{"line_number":53,"context_line":"    \"\"\"Sqlalchemy engine instance. Should be the same instance as used by"},{"line_number":54,"context_line":"    Alembic when migrations applied.\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":57,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_ce884325","line":54,"updated":"2014-07-01 11:37:33.000000000","message":"alembic?","commit_id":"52e24c58bd369624a1cfe4e209bc8a55331d65af"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"f2f6a3ae568cc71993528ef738a2dc9d906bed9b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":"    engine \u003d abc.abstractproperty(lambda: None)"},{"line_number":53,"context_line":"    \"\"\"Sqlalchemy engine instance. Should be the same instance as used by"},{"line_number":54,"context_line":"    Alembic when migrations applied.\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":57,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_2fdf9a6a","line":54,"in_reply_to":"baada198_ce884325","updated":"2014-07-03 14:22:59.000000000","message":"Oh, I\u0027m sorry I had been confused with all of my patches.","commit_id":"52e24c58bd369624a1cfe4e209bc8a55331d65af"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"aa7e6246bb6f9557497b014032d89a691ca41106","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    def migrate_engine(self):"},{"line_number":55,"context_line":"        \"\"\"Sqlalchemy engine instance. Should be the same instance as used"},{"line_number":56,"context_line":"        when migrations applied."},{"line_number":57,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"baada198_b92db000","line":54,"updated":"2014-07-03 15:46:14.000000000","message":"This would require users of WalkVersionsMixin to also use opportunistic test cases. If we tell people this class is a mixin and that they can use it independently of DbTestCase, we should make this an abstract property here and override it in subclasses.","commit_id":"792f65ecb7812b9a11904074714c4c56c3f3e061"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e0587a62aee7febafdd52a84f9382b7f8882313e","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    def migrate_engine(self):"},{"line_number":55,"context_line":"        \"\"\"Sqlalchemy engine instance. Should be the same instance as used"},{"line_number":56,"context_line":"        when migrations applied."},{"line_number":57,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"baada198_708a221c","line":54,"in_reply_to":"baada198_b92db000","updated":"2014-07-04 15:32:52.000000000","message":"Done","commit_id":"792f65ecb7812b9a11904074714c4c56c3f3e061"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"3dafd854a1764efd00dc82490fac1ce81d012ea4","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    Auxiliary methods"},{"line_number":50,"context_line":"    -----------------"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    `_migrate_up` and `_migrate_down` instance methods of the class can be"},{"line_number":53,"context_line":"    used with auxiliary methods named `_pre_upgrade_\u003crevision_id\u003e`,"},{"line_number":54,"context_line":"    `_check_\u003crevision_id\u003e`, `_post_downgrade_\u003crevision_id\u003e`. The methods"},{"line_number":55,"context_line":"    intended to check applied changes for correctness of data operations."}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_d4906245","line":52,"updated":"2014-07-11 18:11:54.000000000","message":"Okay, so the flow on this would be:\n\n_pre_upgrade_* -\u003e _migrate_up -\u003e _check_* -\u003e _migrate_down -\u003e _post_downgrade_*\n\nIt might be nice to include something like that here.","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"ab83884b27b3c9f9d5a13dbebfc990b4ea0cfb9e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    Auxiliary methods"},{"line_number":50,"context_line":"    -----------------"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    `_migrate_up` and `_migrate_down` instance methods of the class can be"},{"line_number":53,"context_line":"    used with auxiliary methods named `_pre_upgrade_\u003crevision_id\u003e`,"},{"line_number":54,"context_line":"    `_check_\u003crevision_id\u003e`, `_post_downgrade_\u003crevision_id\u003e`. The methods"},{"line_number":55,"context_line":"    intended to check applied changes for correctness of data operations."}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_4238ed9f","line":52,"in_reply_to":"baada198_d4906245","updated":"2014-07-14 09:47:20.000000000","message":"Done","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"3dafd854a1764efd00dc82490fac1ce81d012ea4","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def migrate_engine(self):"},{"line_number":103,"context_line":"        \"\"\"Provides engine instance."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        Should be the same instance as used"},{"line_number":106,"context_line":"        when migrations applied. Most of cases `engine` attribute provided"},{"line_number":107,"context_line":"        by test cases in a `setUp` method for an every particular test in a"},{"line_number":108,"context_line":"        test case."}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_f40ac688","line":105,"updated":"2014-07-11 18:11:54.000000000","message":"This could be rewrapped, but more importantly part of this block is difficult to parse.  I would suggest rewriting as:\n\n\"\"\"\nShould be the same instance as used when migrations are applied.  In most cases, the `engine` attribute provided by the test class in a `setUp` method will work.\n\"\"\"","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"ab83884b27b3c9f9d5a13dbebfc990b4ea0cfb9e","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def migrate_engine(self):"},{"line_number":103,"context_line":"        \"\"\"Provides engine instance."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        Should be the same instance as used"},{"line_number":106,"context_line":"        when migrations applied. Most of cases `engine` attribute provided"},{"line_number":107,"context_line":"        by test cases in a `setUp` method for an every particular test in a"},{"line_number":108,"context_line":"        test case."}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_623df18e","line":105,"in_reply_to":"baada198_f40ac688","updated":"2014-07-14 09:47:20.000000000","message":"Done","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"3dafd854a1764efd00dc82490fac1ce81d012ea4","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":120,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        Determine the latest version script from the repo, then"},{"line_number":123,"context_line":"        upgrade from 1 through to the latest, with no data"}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_d464e223","line":120,"updated":"2014-07-11 18:11:54.000000000","message":"*Check if migration upgrades and downgrades successfully","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"ab83884b27b3c9f9d5a13dbebfc990b4ea0cfb9e","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def _walk_versions(self, snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":120,"context_line":"        \"\"\"Check is migration upgrading and downgrading successfully"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        Determine the latest version script from the repo, then"},{"line_number":123,"context_line":"        upgrade from 1 through to the latest, with no data"}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_e248212f","line":120,"in_reply_to":"baada198_d464e223","updated":"2014-07-14 09:47:20.000000000","message":"Done","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"3dafd854a1764efd00dc82490fac1ce81d012ea4","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        can be called without any extra check outside of `_walk_versions`"},{"line_number":130,"context_line":"        method."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        :param snake_walk: Force double check if True. `snake_walk` forces"},{"line_number":133,"context_line":"            check ability to downgrade successful of newly upgraded migration"},{"line_number":134,"context_line":"            and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":135,"context_line":"        :type snake_walk: bool"}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_e18a0763","line":132,"updated":"2014-07-11 18:11:54.000000000","message":"*`snake_walk` enables checking that each individual migration can be upgraded/downgraded by itself.\n\nThis is another place where an example might help.  If I\u0027m understanding correctly, this means the snake_walk migration path would look something like: 1-\u003e2-\u003e1-\u003e2-\u003e3-\u003e2-\u003e3-\u003e4... and vice versa.","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"ab83884b27b3c9f9d5a13dbebfc990b4ea0cfb9e","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        can be called without any extra check outside of `_walk_versions`"},{"line_number":130,"context_line":"        method."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        :param snake_walk: Force double check if True. `snake_walk` forces"},{"line_number":133,"context_line":"            check ability to downgrade successful of newly upgraded migration"},{"line_number":134,"context_line":"            and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":135,"context_line":"        :type snake_walk: bool"}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_1059dc8d","line":132,"in_reply_to":"baada198_e18a0763","updated":"2014-07-14 09:47:20.000000000","message":"Done","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"3dafd854a1764efd00dc82490fac1ce81d012ea4","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        :param version: id of revision to downgrade."},{"line_number":174,"context_line":"        :type version: str"},{"line_number":175,"context_line":"        :keyword with_data: whether to check or not absence of changes provided"},{"line_number":176,"context_line":"            by a next revision, see :ref:`auxiliary-dynamic-methods`."},{"line_number":177,"context_line":"        :type with_data: Bool"},{"line_number":178,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_e4b85513","line":175,"updated":"2014-07-11 18:11:54.000000000","message":"Whether to verify the absence of changes from migration(s) being downgraded.","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"ab83884b27b3c9f9d5a13dbebfc990b4ea0cfb9e","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        :param version: id of revision to downgrade."},{"line_number":174,"context_line":"        :type version: str"},{"line_number":175,"context_line":"        :keyword with_data: whether to check or not absence of changes provided"},{"line_number":176,"context_line":"            by a next revision, see :ref:`auxiliary-dynamic-methods`."},{"line_number":177,"context_line":"        :type with_data: Bool"},{"line_number":178,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_f0654845","line":175,"in_reply_to":"baada198_e4b85513","updated":"2014-07-14 09:47:20.000000000","message":"Done","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"3dafd854a1764efd00dc82490fac1ce81d012ea4","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        :param version: id of revision to upgrade."},{"line_number":206,"context_line":"        :type version: str"},{"line_number":207,"context_line":"        :keyword with_data: whether to check or not applied changes with"},{"line_number":208,"context_line":"            data, see :ref:`auxiliary-dynamic-methods`."},{"line_number":209,"context_line":"        :type with_data: Bool"},{"line_number":210,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_c400b1ad","line":207,"updated":"2014-07-11 18:11:54.000000000","message":"Whether to verify the applied changes with data","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"ab83884b27b3c9f9d5a13dbebfc990b4ea0cfb9e","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        :param version: id of revision to upgrade."},{"line_number":206,"context_line":"        :type version: str"},{"line_number":207,"context_line":"        :keyword with_data: whether to check or not applied changes with"},{"line_number":208,"context_line":"            data, see :ref:`auxiliary-dynamic-methods`."},{"line_number":209,"context_line":"        :type with_data: Bool"},{"line_number":210,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"baada198_b0703009","line":207,"in_reply_to":"baada198_c400b1ad","updated":"2014-07-14 09:47:20.000000000","message":"Done","commit_id":"034cfa6791d7f48edf4854d1bf549a91e4eaf683"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"6842fe49a71c34b121b2fe9d03b3d3278c7eb582","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        can be called without any extra check outside of `_walk_versions`"},{"line_number":137,"context_line":"        method."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        :param snake_walk: Force double check if True. `snake_walk` forces"},{"line_number":140,"context_line":"            check ability to downgrade successful of newly upgraded migration"},{"line_number":141,"context_line":"            and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"baada198_96015207","line":139,"updated":"2014-07-14 17:40:32.000000000","message":"This is still a little hard to parse.  See my suggested rewording in PS 25.","commit_id":"136f1b98e434dd87a57aeaa2ebf713fa4a578561"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"bbe49acac8505aa80f5c1a7538a6ec43664e95f1","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        can be called without any extra check outside of `_walk_versions`"},{"line_number":137,"context_line":"        method."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        :param snake_walk: Force double check if True. `snake_walk` forces"},{"line_number":140,"context_line":"            check ability to downgrade successful of newly upgraded migration"},{"line_number":141,"context_line":"            and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"baada198_ac7d146f","line":139,"in_reply_to":"baada198_96015207","updated":"2014-07-15 08:31:49.000000000","message":"Done","commit_id":"136f1b98e434dd87a57aeaa2ebf713fa4a578561"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"6842fe49a71c34b121b2fe9d03b3d3278c7eb582","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            check ability to downgrade successful of newly upgraded migration"},{"line_number":141,"context_line":"            and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            If we have ordered migrations 123abc, 456def, 789ghi. If we run"},{"line_number":144,"context_line":"            upgrading with the `snake_walk` argument setted to `True`, the"},{"line_number":145,"context_line":"            migrations will be applied in the following order:"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"baada198_3637a6e4","line":143,"updated":"2014-07-14 17:40:32.000000000","message":"*If we have ordered migrations 123abc, 456def, 789ghi and we run...","commit_id":"136f1b98e434dd87a57aeaa2ebf713fa4a578561"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"bbe49acac8505aa80f5c1a7538a6ec43664e95f1","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            check ability to downgrade successful of newly upgraded migration"},{"line_number":141,"context_line":"            and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            If we have ordered migrations 123abc, 456def, 789ghi. If we run"},{"line_number":144,"context_line":"            upgrading with the `snake_walk` argument setted to `True`, the"},{"line_number":145,"context_line":"            migrations will be applied in the following order:"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"baada198_cc6ec82e","line":143,"in_reply_to":"baada198_3637a6e4","updated":"2014-07-15 08:31:49.000000000","message":"Amusingly, that this was the first version of the wording, but I declined it...\n\nDone.","commit_id":"136f1b98e434dd87a57aeaa2ebf713fa4a578561"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"6842fe49a71c34b121b2fe9d03b3d3278c7eb582","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            If we have ordered migrations 123abc, 456def, 789ghi. If we run"},{"line_number":144,"context_line":"            upgrading with the `snake_walk` argument setted to `True`, the"},{"line_number":145,"context_line":"            migrations will be applied in the following order:"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                `123abc \u003d\u003e 456def \u003d\u003e 123abc \u003d\u003e"}],"source_content_type":"text/x-python","patch_set":27,"id":"baada198_3610864d","line":144,"updated":"2014-07-14 17:40:32.000000000","message":"s/setted/set/\n\nYeah, I know, English is weird. :-)","commit_id":"136f1b98e434dd87a57aeaa2ebf713fa4a578561"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"bbe49acac8505aa80f5c1a7538a6ec43664e95f1","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            and an opposite behaviour if a migration is in downgrade cycle."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            If we have ordered migrations 123abc, 456def, 789ghi. If we run"},{"line_number":144,"context_line":"            upgrading with the `snake_walk` argument setted to `True`, the"},{"line_number":145,"context_line":"            migrations will be applied in the following order:"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                `123abc \u003d\u003e 456def \u003d\u003e 123abc \u003d\u003e"}],"source_content_type":"text/x-python","patch_set":27,"id":"baada198_8c58508b","line":144,"in_reply_to":"baada198_3610864d","updated":"2014-07-15 08:31:49.000000000","message":"Done","commit_id":"136f1b98e434dd87a57aeaa2ebf713fa4a578561"}],"oslo/db/sqlalchemy/utils.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7e7a528c6dbf87c53aca1d5eb1e9c3d0bbc8c696","unresolved":false,"context_lines":[{"line_number":373,"context_line":"        columns_for_select, group_by\u003dcolumns_for_group_by,"},{"line_number":374,"context_line":"        having\u003dfunc.count(table.c.id) \u003e 1)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    for row in migrate_engine.execute(duplicated_rows_select).fetchall():"},{"line_number":377,"context_line":"        # NOTE(boris-42): Do not remove row that has the biggest ID."},{"line_number":378,"context_line":"        delete_condition \u003d table.c.id !\u003d row[0]"},{"line_number":379,"context_line":"        is_none \u003d None  # workaround for pyflakes"}],"source_content_type":"text/x-python","patch_set":6,"id":"5adbc538_6dee6aee","line":376,"updated":"2014-05-26 13:25:21.000000000","message":"Seems like this should have gone to the patch set this one depends on.","commit_id":"ebb94105a14fee6d3554a4d608d8eef990e0f9b7"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"3256d5ef312454641f309651340bf578f7fa9709","unresolved":false,"context_lines":[{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        rows_to_delete_select \u003d sqlalchemy.sql.select("},{"line_number":385,"context_line":"            [table.c.id]).where(delete_condition)"},{"line_number":386,"context_line":"        for row in migrate_engine.execute(rows_to_delete_select):"},{"line_number":387,"context_line":"            LOG.info(_LI("},{"line_number":388,"context_line":"                \"Deleting duplicated row with id: %(id)s from table: \""},{"line_number":389,"context_line":"                \"%(table)s\") % dict(id\u003drow[0], table\u003dtable_name))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3ae8d1ca_1c17eaee","line":386,"updated":"2014-05-27 09:20:32.000000000","message":"why do we need this change here?","commit_id":"efd7fdaf6a8f5ebf05cd1da51c9b310ee40629cc"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7735a9451faa2c5119772dd0a13a85e137e50556","unresolved":false,"context_lines":[{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        rows_to_delete_select \u003d sqlalchemy.sql.select("},{"line_number":385,"context_line":"            [table.c.id]).where(delete_condition)"},{"line_number":386,"context_line":"        for row in migrate_engine.execute(rows_to_delete_select).fetchall():"},{"line_number":387,"context_line":"            LOG.info(_LI(\"Deleting duplicated row with id: %(id)s from table: \""},{"line_number":388,"context_line":"                         \"%(table)s\") % dict(id\u003drow[0], table\u003dtable_name))"},{"line_number":389,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3ae8d1ca_e82431c8","side":"PARENT","line":386,"updated":"2014-05-27 15:02:58.000000000","message":"nit: unrelated change","commit_id":"6f64c83363651a6bafcefebee4f66f3ddb722d1e"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"2b22cc0d7647e1c9e4441646118138dddf2cecf2","unresolved":false,"context_lines":[{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        rows_to_delete_select \u003d sqlalchemy.sql.select("},{"line_number":385,"context_line":"            [table.c.id]).where(delete_condition)"},{"line_number":386,"context_line":"        for row in migrate_engine.execute(rows_to_delete_select).fetchall():"},{"line_number":387,"context_line":"            LOG.info(_LI(\"Deleting duplicated row with id: %(id)s from table: \""},{"line_number":388,"context_line":"                         \"%(table)s\") % dict(id\u003drow[0], table\u003dtable_name))"},{"line_number":389,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3ae8d1ca_7b828d50","side":"PARENT","line":386,"in_reply_to":"3ae8d1ca_e82431c8","updated":"2014-05-28 07:45:08.000000000","message":"Yep","commit_id":"6f64c83363651a6bafcefebee4f66f3ddb722d1e"}],"tests/sqlalchemy/test_migrations.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7e7a528c6dbf87c53aca1d5eb1e9c3d0bbc8c696","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            self.engine, self.REPOSITORY)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_migrate_up_fail(self):"},{"line_number":42,"context_line":"        CustomException \u003d type(\u0027CustomException\u0027, (Exception,), {})"},{"line_number":43,"context_line":"        self.migration_api.upgrade.side_effect \u003d CustomException"},{"line_number":44,"context_line":"        self.assertRaises(CustomException, self._migrate_up, version\u003d141)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5adbc538_cdb4def4","line":42,"updated":"2014-05-26 13:25:21.000000000","message":"why not:\n\n   class CustomException(Exception):\n       pass\n\nhere?","commit_id":"ebb94105a14fee6d3554a4d608d8eef990e0f9b7"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"266600712f232193a73ea172fa4d870a86653e26","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            self.engine, self.REPOSITORY)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_migrate_up_fail(self):"},{"line_number":42,"context_line":"        CustomException \u003d type(\u0027CustomException\u0027, (Exception,), {})"},{"line_number":43,"context_line":"        self.migration_api.upgrade.side_effect \u003d CustomException"},{"line_number":44,"context_line":"        self.assertRaises(CustomException, self._migrate_up, version\u003d141)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3ae8d1ca_19d8dc1c","line":42,"in_reply_to":"5adbc538_cdb4def4","updated":"2014-05-27 09:00:07.000000000","message":"Just because in one line. I\u0027ll fix it.","commit_id":"ebb94105a14fee6d3554a4d608d8eef990e0f9b7"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"3256d5ef312454641f309651340bf578f7fa9709","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        class CustomException(Exception):"},{"line_number":43,"context_line":"            pass"},{"line_number":44,"context_line":"        self.migration_api.upgrade.side_effect \u003d CustomException"},{"line_number":45,"context_line":"        self.assertRaises(CustomException, self._migrate_up, version\u003d141)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_migrate_up_with_data(self):"},{"line_number":48,"context_line":"        test_value \u003d {\"a\": 1, \"b\": 2}"}],"source_content_type":"text/x-python","patch_set":7,"id":"3ae8d1ca_5c87b261","line":45,"updated":"2014-05-27 09:20:32.000000000","message":"well, if  you add this test, I\u0027d like to check log here also","commit_id":"efd7fdaf6a8f5ebf05cd1da51c9b310ee40629cc"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7735a9451faa2c5119772dd0a13a85e137e50556","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.migration_api.db_version.assert_called_with("},{"line_number":40,"context_line":"            self.engine, self.REPOSITORY)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_migrate_up_fail(self):"},{"line_number":43,"context_line":"        version \u003d 141"},{"line_number":44,"context_line":"        expected_output \u003d (u\"Failed to migrate to version %(version)s on \""},{"line_number":45,"context_line":"                           \"engine %(engine)s\\n\" %"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ae8d1ca_e85d114a","line":42,"updated":"2014-05-27 15:02:58.000000000","message":"Looks like this test case doesn\u0027t call any production code.","commit_id":"1f6d7f123a054ab475ab510cbc73dcdf042e8715"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"2b22cc0d7647e1c9e4441646118138dddf2cecf2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.migration_api.db_version.assert_called_with("},{"line_number":40,"context_line":"            self.engine, self.REPOSITORY)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_migrate_up_fail(self):"},{"line_number":43,"context_line":"        version \u003d 141"},{"line_number":44,"context_line":"        expected_output \u003d (u\"Failed to migrate to version %(version)s on \""},{"line_number":45,"context_line":"                           \"engine %(engine)s\\n\" %"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ae8d1ca_1b38a99f","line":42,"in_reply_to":"3ae8d1ca_e85d114a","updated":"2014-05-28 07:45:08.000000000","message":"Looks like mistaken push. Done","commit_id":"1f6d7f123a054ab475ab510cbc73dcdf042e8715"}],"tests/sqlalchemy/test_utils.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"22f2be43a1c5bb26c531ec2de0f4d4f7224f9709","unresolved":false,"context_lines":[{"line_number":621,"context_line":"        self.assertEqual(len(rows), 4)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"class PostgeSQLTestMigrations(TestMigrationUtils,"},{"line_number":625,"context_line":"                              db_test_base.PostgreSQLOpportunisticTestCase):"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"    \"\"\"Test migrations on PostgreSQL.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"1ae5cdf2_df5d407e","line":624,"updated":"2014-06-24 13:57:54.000000000","message":"Postgresql, I guess :)","commit_id":"d2564e57f644eae413b08e5404be6ce89f2f3eb3"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"bfdd89347e49fbaf148108090190f9e94a867067","unresolved":false,"context_lines":[{"line_number":621,"context_line":"        self.assertEqual(len(rows), 4)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"class PostgeSQLTestMigrations(TestMigrationUtils,"},{"line_number":625,"context_line":"                              db_test_base.PostgreSQLOpportunisticTestCase):"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"    \"\"\"Test migrations on PostgreSQL.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"1ae5cdf2_57b658fa","line":624,"in_reply_to":"1ae5cdf2_df5d407e","updated":"2014-06-25 08:20:54.000000000","message":"Done","commit_id":"d2564e57f644eae413b08e5404be6ce89f2f3eb3"}]}
