)]}'
{"doc/source/cli/cli.rst":[{"author":{"_account_id":29624,"name":"Alexander Hughes","email":"Alexander.Hughes@pm.me","username":"alexanderhughes"},"change_message_id":"0d484837c6ccafa69c5e6a4cf1b3e43de6c13c70","unresolved":false,"context_lines":[{"line_number":681,"context_line":"::"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"    ./pegleg.sh site \u003coptions\u003e secrets decrypt \u003csite_name\u003e -f \u003cfile_path\u003e"},{"line_number":684,"context_line":"      [-s \u003coutput_path\u003e]"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"Examples"},{"line_number":687,"context_line":"\"\"\"\"\"\"\"\""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ffb9cba7_08820a01","line":684,"range":{"start_line":684,"start_character":6,"end_line":684,"end_character":24},"updated":"2019-04-29 15:49:44.000000000","message":"are the brackets here necessary?","commit_id":"9d1dcd78b09065fca1026ba1928dee18b6df0b67"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"20ce10cc16335de2c8eca648157678aa5ffbc89a","unresolved":false,"context_lines":[{"line_number":681,"context_line":"::"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"    ./pegleg.sh site \u003coptions\u003e secrets decrypt \u003csite_name\u003e -f \u003cfile_path\u003e"},{"line_number":684,"context_line":"      [-s \u003coutput_path\u003e]"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"Examples"},{"line_number":687,"context_line":"\"\"\"\"\"\"\"\""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ffb9cba7_a35e7f0f","line":684,"range":{"start_line":684,"start_character":6,"end_line":684,"end_character":24},"in_reply_to":"ffb9cba7_08820a01","updated":"2019-04-29 16:28:12.000000000","message":"They indicate that -s is optional. I thought it was necessary since we\u0027re using \u003c\u003e for mandatory parameters.","commit_id":"9d1dcd78b09065fca1026ba1928dee18b6df0b67"},{"author":{"_account_id":28618,"name":"Drew Walters","email":"drewwalters@microsoft.com","username":"drewwalters96"},"change_message_id":"210859c11aa1050017f243ab50a30425c13ebfb6","unresolved":false,"context_lines":[{"line_number":680,"context_line":""},{"line_number":681,"context_line":"::"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"    ./pegleg.sh site \u003coptions\u003e secrets decrypt \u003csite_name\u003e -f \u003cfile_path\u003e"},{"line_number":684,"context_line":"      [-s \u003coutput_path\u003e]"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"Examples"},{"line_number":687,"context_line":"\"\"\"\"\"\"\"\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_4cff3967","line":684,"range":{"start_line":683,"start_character":0,"end_line":684,"end_character":24},"updated":"2019-05-03 21:21:01.000000000","message":"nit: this is not valid bash. A \u0027\\\u0027 character is needed to escape the line break.","commit_id":"37f922a07e52ab4f59c29cfbfad173b21868e17c"}],"pegleg/cli.py":[{"author":{"_account_id":30173,"name":"Ian Pittwood","email":"pittwoodian@gmail.com","username":"ianp"},"change_message_id":"8937c7a34905e2c823681942c0a699263da4b510","unresolved":false,"context_lines":[{"line_number":654,"context_line":"    \u0027--filename\u0027,"},{"line_number":655,"context_line":"    \u0027file_name\u0027,"},{"line_number":656,"context_line":"    help\u003d\u0027The file to decrypt\u0027)"},{"line_number":657,"context_line":"@click.option("},{"line_number":658,"context_line":"    \u0027-s\u0027,"},{"line_number":659,"context_line":"    \u0027--save-location\u0027,"},{"line_number":660,"context_line":"    \u0027save_location\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_a62541ad","line":657,"updated":"2019-04-17 17:47:27.000000000","message":"We should set the type of the option to click.File. That way Click will check write permissions for us.\n\nhttps://click.palletsprojects.com/en/7.x/parameters/#parameter-types","commit_id":"86e610d9ded99d1f59849200f6250e72872e7614"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"cb30016dca34106590146ed840b4b1266987c50f","unresolved":false,"context_lines":[{"line_number":654,"context_line":"    \u0027--filename\u0027,"},{"line_number":655,"context_line":"    \u0027file_name\u0027,"},{"line_number":656,"context_line":"    help\u003d\u0027The file to decrypt\u0027)"},{"line_number":657,"context_line":"@click.option("},{"line_number":658,"context_line":"    \u0027-s\u0027,"},{"line_number":659,"context_line":"    \u0027--save-location\u0027,"},{"line_number":660,"context_line":"    \u0027save_location\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_2ecbd653","line":657,"in_reply_to":"3fce034c_a62541ad","updated":"2019-04-22 19:31:20.000000000","message":"I think it would make sense to keep this as is, so we can use pegleg\u0027s built-in files.write. Also, files.write will also create subdirectories if necessary.","commit_id":"86e610d9ded99d1f59849200f6250e72872e7614"},{"author":{"_account_id":30173,"name":"Ian Pittwood","email":"pittwoodian@gmail.com","username":"ianp"},"change_message_id":"0f992959e3622f49d73f50dff695f498a1efd6f8","unresolved":false,"context_lines":[{"line_number":654,"context_line":"    \u0027--filename\u0027,"},{"line_number":655,"context_line":"    \u0027file_name\u0027,"},{"line_number":656,"context_line":"    help\u003d\u0027The file to decrypt\u0027)"},{"line_number":657,"context_line":"@click.option("},{"line_number":658,"context_line":"    \u0027-s\u0027,"},{"line_number":659,"context_line":"    \u0027--save-location\u0027,"},{"line_number":660,"context_line":"    \u0027save_location\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_e6d16259","line":657,"in_reply_to":"ffb9cba7_2ecbd653","updated":"2019-04-22 21:43:02.000000000","message":"I think click might do that as well already. But since there\u0027s already a builtin LGTM","commit_id":"86e610d9ded99d1f59849200f6250e72872e7614"},{"author":{"_account_id":30173,"name":"Ian Pittwood","email":"pittwoodian@gmail.com","username":"ianp"},"change_message_id":"8937c7a34905e2c823681942c0a699263da4b510","unresolved":false,"context_lines":[{"line_number":671,"context_line":"    else:"},{"line_number":672,"context_line":"        try:"},{"line_number":673,"context_line":"            files.write(save_location, decrypted)"},{"line_number":674,"context_line":"        except OSError as e:"},{"line_number":675,"context_line":"            raise click.ClickException(\"Couldn\u0027t write decrypted data \""},{"line_number":676,"context_line":"                                       \"to {}: {}\".format(save_location, e))"},{"line_number":677,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_663759e5","line":674,"updated":"2019-04-17 17:47:27.000000000","message":"This can probably be removed in favor of typing the option and letting Click do the check for file permissions. See above.","commit_id":"86e610d9ded99d1f59849200f6250e72872e7614"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"cb30016dca34106590146ed840b4b1266987c50f","unresolved":false,"context_lines":[{"line_number":671,"context_line":"    else:"},{"line_number":672,"context_line":"        try:"},{"line_number":673,"context_line":"            files.write(save_location, decrypted)"},{"line_number":674,"context_line":"        except OSError as e:"},{"line_number":675,"context_line":"            raise click.ClickException(\"Couldn\u0027t write decrypted data \""},{"line_number":676,"context_line":"                                       \"to {}: {}\".format(save_location, e))"},{"line_number":677,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_4ec88a54","line":674,"in_reply_to":"3fce034c_663759e5","updated":"2019-04-22 19:31:20.000000000","message":"❌","commit_id":"86e610d9ded99d1f59849200f6250e72872e7614"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2e8bcafac95ea9a82d016faa45cc2d30126bd33f","unresolved":false,"context_lines":[{"line_number":669,"context_line":"    if save_location is None:"},{"line_number":670,"context_line":"        click.echo(decrypted)"},{"line_number":671,"context_line":"    else:"},{"line_number":672,"context_line":"        try:"},{"line_number":673,"context_line":"            files.write(save_location, decrypted)"},{"line_number":674,"context_line":"        except OSError as e:"},{"line_number":675,"context_line":"            raise click.ClickException(\"Couldn\u0027t write decrypted data \""},{"line_number":676,"context_line":"                                       \"to {}: {}\".format(save_location, e))"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"@main.group(help\u003d\"Miscellaneous generate commands\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_e5605b35","line":676,"range":{"start_line":672,"start_character":0,"end_line":676,"end_character":76},"updated":"2019-04-24 03:06:55.000000000","message":"I think the try/except handling should be abstracted away inside: https://github.com/openstack/airship-pegleg/blob/cecd24ed38b19f6c05a8d606d045b09639cc6989/pegleg/engine/util/files.py#L289\n\nNo need to expose this here.","commit_id":"c29b0c89f19ad914e2377550d23b8cca6a503596"},{"author":{"_account_id":26449,"name":"Scott Hussey","email":"sthussey@att.com","username":"sh8121"},"change_message_id":"1ecf33ac54ef0a98a2a0a84d97531499a6b045b0","unresolved":false,"context_lines":[{"line_number":669,"context_line":"    if save_location is None:"},{"line_number":670,"context_line":"        click.echo(decrypted)"},{"line_number":671,"context_line":"    else:"},{"line_number":672,"context_line":"        files.write(save_location, decrypted)"},{"line_number":673,"context_line":"        os.chmod(save_location, 0o600)"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"@main.group(help\u003d\"Miscellaneous generate commands\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfbec78f_8cd1b15a","line":673,"range":{"start_line":672,"start_character":0,"end_line":673,"end_character":38},"updated":"2019-05-03 20:59:32.000000000","message":"Probably pedantic, but generally you\u0027d be better off setting the permissions before the content is there, something like\n\n  1. Create\n  2. Set perms\n  3. Write\n\nBut it is a very minor concern in this context.","commit_id":"37f922a07e52ab4f59c29cfbfad173b21868e17c"}],"pegleg/engine/util/files.py":[{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"18b211c113d84e1d619742093011f3be091bf249","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    os.makedirs(os.path.dirname(file_path), exist_ok\u003dTrue)"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    with open(file_path, \u0027w\u0027) as stream:"},{"line_number":305,"context_line":"        if type(data) is str:"},{"line_number":306,"context_line":"            stream.write(data)"},{"line_number":307,"context_line":"        elif type(data) \u003d\u003d dict:"},{"line_number":308,"context_line":"            yaml.safe_dump("},{"line_number":309,"context_line":"                data,"},{"line_number":310,"context_line":"                stream,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1fcbff3d_6b3b219c","line":307,"range":{"start_line":305,"start_character":0,"end_line":307,"end_character":32},"updated":"2019-04-20 03:51:19.000000000","message":"why `is` in one instance and \u003d\u003d in another? and isinstance() in one place, and type() in another?","commit_id":"86e610d9ded99d1f59849200f6250e72872e7614"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"cb30016dca34106590146ed840b4b1266987c50f","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    os.makedirs(os.path.dirname(file_path), exist_ok\u003dTrue)"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    with open(file_path, \u0027w\u0027) as stream:"},{"line_number":305,"context_line":"        if type(data) is str:"},{"line_number":306,"context_line":"            stream.write(data)"},{"line_number":307,"context_line":"        elif type(data) \u003d\u003d dict:"},{"line_number":308,"context_line":"            yaml.safe_dump("},{"line_number":309,"context_line":"                data,"},{"line_number":310,"context_line":"                stream,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_b8dcf018","line":307,"range":{"start_line":305,"start_character":0,"end_line":307,"end_character":32},"in_reply_to":"1fcbff3d_6b3b219c","updated":"2019-04-22 19:31:20.000000000","message":"Fixed comparisions, isinstance and type are staying as is because isinstance is specifically for checking inheritance.","commit_id":"86e610d9ded99d1f59849200f6250e72872e7614"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2e8bcafac95ea9a82d016faa45cc2d30126bd33f","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    os.makedirs(os.path.dirname(file_path), exist_ok\u003dTrue)"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    with open(file_path, \u0027w\u0027) as stream:"},{"line_number":305,"context_line":"        if type(data) \u003d\u003d str:"},{"line_number":306,"context_line":"            stream.write(data)"},{"line_number":307,"context_line":"        elif type(data) \u003d\u003d dict:"},{"line_number":308,"context_line":"            yaml.safe_dump("},{"line_number":309,"context_line":"                data,"},{"line_number":310,"context_line":"                stream,"},{"line_number":311,"context_line":"                explicit_start\u003dTrue,"},{"line_number":312,"context_line":"                explicit_end\u003dTrue,"},{"line_number":313,"context_line":"                default_flow_style\u003dFalse)"},{"line_number":314,"context_line":"        elif isinstance(data, collections.abc.Iterable):"},{"line_number":315,"context_line":"            yaml.safe_dump_all("},{"line_number":316,"context_line":"                data,"},{"line_number":317,"context_line":"                stream,"},{"line_number":318,"context_line":"                explicit_start\u003dTrue,"},{"line_number":319,"context_line":"                explicit_end\u003dTrue,"},{"line_number":320,"context_line":"                default_flow_style\u003dFalse)"},{"line_number":321,"context_line":"        else:"},{"line_number":322,"context_line":"            raise ValueError(\u0027data must be str or dict, \u0027"},{"line_number":323,"context_line":"                             \u0027not {}\u0027.format(type(data)))"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"def _recurse_subdirs(search_path, depth):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_25f51358","line":323,"range":{"start_line":305,"start_character":0,"end_line":323,"end_character":57},"updated":"2019-04-24 03:06:55.000000000","message":"This can be simplified.\n\n    if isinstance(data, str):\n        stream.write(data)\n    else if isinstance(data, (dict, collections.abc.Iterable)):\n        if isinstance(data, dict):\n            data \u003d [data]\n        yaml.safe_dump_all(\n            data,\n            stream,\n            explicit_start\u003dTrue,\n            explicit_end\u003dTrue,\n            default_flow_style\u003dFalse)\n    else:\n        raise ValueError(...)","commit_id":"c29b0c89f19ad914e2377550d23b8cca6a503596"},{"author":{"_account_id":26449,"name":"Scott Hussey","email":"sthussey@att.com","username":"sh8121"},"change_message_id":"1ce81fe47597f32db4356ab18a9ace2f15546af4","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    \"\"\""},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    try:"},{"line_number":303,"context_line":"        os.makedirs(os.path.dirname(file_path), exist_ok\u003dTrue)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        with open(file_path, \u0027w\u0027) as stream:"},{"line_number":306,"context_line":"            if isinstance(data, str):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffb9cba7_2296f73f","line":303,"updated":"2019-04-30 20:55:00.000000000","message":"It seems likely that you would want to enable a \u0027secure\u0027 mode of some kind to create files with stripped down permissions such as 600 so that someone doesn\u0027t inadvertently write unencrypted credentials to a world readable file.","commit_id":"f67be9b90b0575945c236330a4b50231e79542b5"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"42da74b1229a64cd7b5c4698ecfb148a969556c3","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    \"\"\""},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    try:"},{"line_number":303,"context_line":"        os.makedirs(os.path.dirname(file_path), exist_ok\u003dTrue)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        with open(file_path, \u0027w\u0027) as stream:"},{"line_number":306,"context_line":"            if isinstance(data, str):"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfbec78f_0f45c970","line":303,"in_reply_to":"ffb9cba7_2296f73f","updated":"2019-05-02 17:33:39.000000000","message":"Done! See cli.py:673","commit_id":"f67be9b90b0575945c236330a4b50231e79542b5"},{"author":{"_account_id":30106,"name":"Matt Carter","email":"matt.coach.carter@gmail.com","username":"MattCarter"},"change_message_id":"d8e0ca225f5fdc433d10295c8e1ff1e2c029ecf5","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        os.makedirs(os.path.dirname(file_path), exist_ok\u003dTrue)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        with open(file_path, \u0027w\u0027) as stream:"},{"line_number":306,"context_line":"            if isinstance(data, str):"},{"line_number":307,"context_line":"                stream.write(data)"},{"line_number":308,"context_line":"            elif isinstance(data, (dict, collections.abc.Iterable)):"},{"line_number":309,"context_line":"                if isinstance(data, dict):"},{"line_number":310,"context_line":"                    data \u003d [data]"},{"line_number":311,"context_line":"                yaml.safe_dump_all("}],"source_content_type":"text/x-python","patch_set":5,"id":"dfbec78f_11887ec4","line":308,"range":{"start_line":306,"start_character":0,"end_line":308,"end_character":68},"updated":"2019-05-03 20:42:08.000000000","message":"Would it be better to run these checks before creating directories?","commit_id":"37f922a07e52ab4f59c29cfbfad173b21868e17c"},{"author":{"_account_id":28618,"name":"Drew Walters","email":"drewwalters@microsoft.com","username":"drewwalters96"},"change_message_id":"210859c11aa1050017f243ab50a30425c13ebfb6","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        os.makedirs(os.path.dirname(file_path), exist_ok\u003dTrue)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        with open(file_path, \u0027w\u0027) as stream:"},{"line_number":306,"context_line":"            if isinstance(data, str):"},{"line_number":307,"context_line":"                stream.write(data)"},{"line_number":308,"context_line":"            elif isinstance(data, (dict, collections.abc.Iterable)):"},{"line_number":309,"context_line":"                if isinstance(data, dict):"},{"line_number":310,"context_line":"                    data \u003d [data]"},{"line_number":311,"context_line":"                yaml.safe_dump_all("}],"source_content_type":"text/x-python","patch_set":5,"id":"dfbec78f_4c5bb986","line":308,"range":{"start_line":306,"start_character":0,"end_line":308,"end_character":68},"in_reply_to":"dfbec78f_11887ec4","updated":"2019-05-03 21:21:01.000000000","message":"\u003e Would it be better to run these checks before creating directories?\n\nFrom a logical standpoint, I think that makes sense.","commit_id":"37f922a07e52ab4f59c29cfbfad173b21868e17c"},{"author":{"_account_id":29624,"name":"Alexander Hughes","email":"Alexander.Hughes@pm.me","username":"alexanderhughes"},"change_message_id":"e465acef0e6eac492da56689bec5babbb8fd46df","unresolved":false,"context_lines":[{"line_number":315,"context_line":"                    explicit_end\u003dTrue,"},{"line_number":316,"context_line":"                    default_flow_style\u003dFalse)"},{"line_number":317,"context_line":"            else:"},{"line_number":318,"context_line":"                raise ValueError(\u0027data must be str or dict, \u0027"},{"line_number":319,"context_line":"                                 \u0027not {}\u0027.format(type(data)))"},{"line_number":320,"context_line":"    except EnvironmentError as e:"},{"line_number":321,"context_line":"        raise click.ClickError("}],"source_content_type":"text/x-python","patch_set":5,"id":"dfbec78f_3d2c8746","line":318,"range":{"start_line":318,"start_character":34,"end_line":318,"end_character":35},"updated":"2019-05-02 18:30:14.000000000","message":"nit: capitalization","commit_id":"37f922a07e52ab4f59c29cfbfad173b21868e17c"}],"tests/unit/engine/util/test_files.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2e8bcafac95ea9a82d016faa45cc2d30126bd33f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        with open(path, \"r\") as out_fi:"},{"line_number":55,"context_line":"            assert list(yaml.safe_load_all(out_fi)) \u003d\u003d [{\"a\": 1}]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        with pytest.raises(ValueError) as _:"},{"line_number":58,"context_line":"            files.write(path, object())"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def test_file_in_subdir():"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_459287f8","line":57,"range":{"start_line":57,"start_character":39,"end_line":57,"end_character":43},"updated":"2019-04-24 03:06:55.000000000","message":"This can be removed.","commit_id":"c29b0c89f19ad914e2377550d23b8cca6a503596"},{"author":{"_account_id":29624,"name":"Alexander Hughes","email":"Alexander.Hughes@pm.me","username":"alexanderhughes"},"change_message_id":"0d484837c6ccafa69c5e6a4cf1b3e43de6c13c70","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# limitations under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import os"},{"line_number":16,"context_line":"import pytest"},{"line_number":17,"context_line":"import yaml"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from pegleg import config"},{"line_number":20,"context_line":"from pegleg.engine.util import files"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_4891e246","line":17,"range":{"start_line":16,"start_character":0,"end_line":17,"end_character":11},"updated":"2019-04-29 15:49:44.000000000","message":"pytest and yaml aren\u0027t stdlib. see [0]\n\n[0] https://docs.openstack.org/hacking/latest/user/hacking.html#import-order-template","commit_id":"9d1dcd78b09065fca1026ba1928dee18b6df0b67"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"20ce10cc16335de2c8eca648157678aa5ffbc89a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# limitations under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import os"},{"line_number":16,"context_line":"import pytest"},{"line_number":17,"context_line":"import yaml"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from pegleg import config"},{"line_number":20,"context_line":"from pegleg.engine.util import files"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_63a2c7ff","line":17,"range":{"start_line":16,"start_character":0,"end_line":17,"end_character":11},"in_reply_to":"ffb9cba7_4891e246","updated":"2019-04-29 16:28:12.000000000","message":"✔️","commit_id":"9d1dcd78b09065fca1026ba1928dee18b6df0b67"},{"author":{"_account_id":28235,"name":"Aaron Sheffield","email":"ajs@sheffieldfamily.net","username":"aaronsheffield"},"change_message_id":"a2403edd8cbe07331762715d4a1b085bafb0f4d1","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                               \"site-definition.yaml\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_write(self, create_tmp_deployment_files):"},{"line_number":43,"context_line":"        path \u003d os.path.join(config.get_site_repo(), \u0027site\u0027, \u0027cicd\u0027,"},{"line_number":44,"context_line":"                            \"test_out.yaml\")"},{"line_number":45,"context_line":"        files.write(path, \"test text\")"},{"line_number":46,"context_line":"        with open(path, \"r\") as out_fi:"},{"line_number":47,"context_line":"            assert out_fi.read() \u003d\u003d \"test text\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_48a322b3","line":44,"range":{"start_line":43,"start_character":52,"end_line":44,"end_character":43},"updated":"2019-04-29 15:41:23.000000000","message":"nit: changing between single and double quotes in the same function call.","commit_id":"9d1dcd78b09065fca1026ba1928dee18b6df0b67"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"20ce10cc16335de2c8eca648157678aa5ffbc89a","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                               \"site-definition.yaml\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_write(self, create_tmp_deployment_files):"},{"line_number":43,"context_line":"        path \u003d os.path.join(config.get_site_repo(), \u0027site\u0027, \u0027cicd\u0027,"},{"line_number":44,"context_line":"                            \"test_out.yaml\")"},{"line_number":45,"context_line":"        files.write(path, \"test text\")"},{"line_number":46,"context_line":"        with open(path, \"r\") as out_fi:"},{"line_number":47,"context_line":"            assert out_fi.read() \u003d\u003d \"test text\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_c3b05346","line":44,"range":{"start_line":43,"start_character":52,"end_line":44,"end_character":43},"in_reply_to":"ffb9cba7_48a322b3","updated":"2019-04-29 16:28:12.000000000","message":"✔️","commit_id":"9d1dcd78b09065fca1026ba1928dee18b6df0b67"}]}
