diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b2b2bbb..9b18856e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.19.2] - 2021-11-11 + +### Fixed + +- In `set_key`, add missing newline character before new entry if necessary. (#361 by + [@bbc2]) + ## [0.19.1] - 2021-08-09 ### Added @@ -292,7 +299,8 @@ project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). [@yannham]: https://github.com/yannham [@zueve]: https://github.com/zueve -[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...HEAD +[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...HEAD +[0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2 [0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1 [0.19.0]: https://github.com/theskumar/python-dotenv/compare/v0.18.0...v0.19.0 [0.18.0]: https://github.com/theskumar/python-dotenv/compare/v0.17.1...v0.18.0 diff --git a/setup.cfg b/setup.cfg index b63622d6..d87b0a6b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.19.1 +current_version = 0.19.2 commit = True tag = True diff --git a/src/dotenv/cli.py b/src/dotenv/cli.py index b7ae24af..9e13db9d 100644 --- a/src/dotenv/cli.py +++ b/src/dotenv/cli.py @@ -82,7 +82,6 @@ def get(ctx: click.Context, key: Any) -> None: else: exit(1) - @cli.command() @click.pass_context @click.argument('key', required=True) @@ -125,6 +124,32 @@ def run(ctx: click.Context, override: bool, commandline: List[str]) -> None: ret = run_command(commandline, dotenv_as_dict) exit(ret) +@cli.command() +@click.pass_context +def example_file(ctx: click.Context) -> None: + '''Generates a .example.env file without values.''' + filedir = ctx.obj['FILE'].replace("\\", "/") + if not os.path.isfile(filedir): + raise click.BadParameter( + 'Path "%s" does not exist.' % (filedir), + ctx=ctx + ) + newFileList = [] + with open(filedir,'r') as file: + for line in file: + line = line.strip() + if line[0] != "#": + line = line.split("=", 1)[0] + "=" + newFileList.append(line + "\n") + + while newFileList[-1] == "\n": + newFileList.pop(-1) + + newFileName = f"{os.path.basename(file.name).split('.', 1)[0]}.example.env" + with open(newFileName, "w") as newFile: + for line in newFileList: + newFile.write(line) + click.echo(f"{newFileName} exported.") def run_command(command: List[str], env: Dict[str, str]) -> int: """Run command in sub process. @@ -161,4 +186,4 @@ def run_command(command: List[str], env: Dict[str, str]) -> int: if __name__ == "__main__": - cli() + cli() \ No newline at end of file diff --git a/src/dotenv/main.py b/src/dotenv/main.py index b8d0a4e0..d867f023 100644 --- a/src/dotenv/main.py +++ b/src/dotenv/main.py @@ -167,13 +167,17 @@ def set_key( with rewrite(dotenv_path) as (source, dest): replaced = False + missing_newline = False for mapping in with_warn_for_invalid_lines(parse_stream(source)): if mapping.key == key_to_set: dest.write(line_out) replaced = True else: dest.write(mapping.original.string) + missing_newline = not mapping.original.string.endswith("\n") if not replaced: + if missing_newline: + dest.write("\n") dest.write(line_out) return True, key_to_set, value_to_set diff --git a/src/dotenv/version.py b/src/dotenv/version.py index 4c1ca3c8..aa070c2c 100644 --- a/src/dotenv/version.py +++ b/src/dotenv/version.py @@ -1 +1 @@ -__version__ = "0.19.1" +__version__ = "0.19.2" diff --git a/tests/test_cli.py b/tests/test_cli.py index 223476fe..b0299307 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -205,3 +205,9 @@ def test_run_with_version(cli): assert result.exit_code == 0 assert result.output.strip().endswith(__version__) + +def test_example_file_non_existent_file(cli): + result = cli.invoke(dotenv_cli, ['--file', 'nx_file', 'example_file']) + + assert result.exit_code == 2, result.output + assert "does not exist" in result.output \ No newline at end of file diff --git a/tests/test_main.py b/tests/test_main.py index 13e2791c..541ac5ee 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -37,6 +37,7 @@ def test_set_key_no_file(tmp_path): ("a=b\nc=d", "a", "e", (True, "a", "e"), "a='e'\nc=d"), ("a=b\nc=d\ne=f", "c", "g", (True, "c", "g"), "a=b\nc='g'\ne=f"), ("a=b\n", "c", "d", (True, "c", "d"), "a=b\nc='d'\n"), + ("a=b", "c", "d", (True, "c", "d"), "a=b\nc='d'\n"), ], ) def test_set_key(dotenv_file, before, key, value, expected, after):