From 584c61ee32452da43bafa3f45db72d3d741a397e Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Thu, 31 Oct 2024 08:46:21 +0100 Subject: [PATCH 01/17] Added NONE error level --- yml2block/__main__.py | 44 ++++++++++++++++++++++++------------------- yml2block/rules.py | 1 + 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/yml2block/__main__.py b/yml2block/__main__.py index d6edfc7..f295daf 100644 --- a/yml2block/__main__.py +++ b/yml2block/__main__.py @@ -57,27 +57,33 @@ def __iter__(self): for filename, violations in self.violations.items(): yield (filename, violations, min(violations, key=lambda x: x.level).level) + + def max_severity(self, file_path): + try: + violation_list = self.violations[file_path] + if len(violation_list) == 0: + # Catch empty violation lists for well-behaved files + return Level.NONE + else: + return min(violation_list, key=lambda x: x.level).level + except KeyError: + print(f"The file {file_path} is not present in this list of files.") + raise + def safe_conversion_possible(self, file_path, strict=False): """Check if the file can be safely converted to tsv.""" - if self.violations: - try: - max_severity = min( - self.violations[file_path], key=lambda x: x.level - ).level - if max_severity == Level.ERROR: - return False - elif max_severity == Level.WARNING: - if strict: - return False - else: - return True - else: - return True - except KeyError: - print(f"The file {file_path} is not present in this list of files.") - raise - else: - return True + + max_severity = self.max_severity(file_path) + + match max_severity: + case Level.NONE: + return True + case Level.WARNING: + return False if strict else True + case Level.ERROR: + return False + case _: + raise ValueError(f"Unexpected severity level {max_severity}.") def guess_input_type(input_path): diff --git a/yml2block/rules.py b/yml2block/rules.py index 6e48ada..dda29a6 100644 --- a/yml2block/rules.py +++ b/yml2block/rules.py @@ -137,6 +137,7 @@ def skip(self, lint): class Level(IntEnum): """Provide numeric error levels.""" + NONE = 3 WARNING = 2 ERROR = 1 From a2cc0d3277ddd49d93053140bd4fbe083aa21ea6 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Mon, 25 Mar 2024 09:52:41 +0100 Subject: [PATCH 02/17] Added tests for conversion command --- tests/integration_tests.py | 29 +++++++++++++++++-- .../minimal_working_example_expected.tsv | 9 ++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 tests/valid/minimal_working_example_expected.tsv diff --git a/tests/integration_tests.py b/tests/integration_tests.py index d0aa4b7..f76ffaf 100644 --- a/tests/integration_tests.py +++ b/tests/integration_tests.py @@ -8,9 +8,15 @@ def test_basic_execution_works(): result = runner.invoke(yml2block.__main__.main, ["--help"]) assert result.exit_code == 0, result + result = runner.invoke(yml2block.__main__.main, ["check", "--help"]) + assert result.exit_code == 0, result -def test_minimal_valid_example(): - """This test ensures that a valid file is translated without throwing an error.""" + result = runner.invoke(yml2block.__main__.main, ["convert", "--help"]) + assert result.exit_code == 0, result + + +def test_minimal_valid_example_check(): + """This test ensures that a valid files do not throw errors during check.""" runner = CliRunner() result = runner.invoke( yml2block.__main__.main, ["check", "tests/valid/minimal_working_example.yml"] @@ -18,6 +24,25 @@ def test_minimal_valid_example(): assert result.exit_code == 0, result +def test_minimal_valid_example_convert(): + """This test ensures that a valid file is translated without throwing an error.""" + runner = CliRunner() + path_expected = "tests/valid/minimal_working_example_expected.tsv" + path_output = "/tmp/y2b_mwe.tsv" + result = runner.invoke( + yml2block.__main__.main, ["convert", "tests/valid/minimal_working_example.yml", "-o", path_output] + ) + print(result) + print(result.stdout) + assert result.exit_code == 0, result.stdout + with open(path_output, "r") as converted_file, open(path_expected, "r") as expected_file: + converted_tsv = converted_file.read() + expected_tsv = expected_file.read() + assert converted_tsv == expected_tsv + assert len(converted_tsv) > 0 + assert len(expected_tsv) > 0 + + def test_duplicate_names_detected(): """This test ensures that duplicate names are detected.""" runner = CliRunner() diff --git a/tests/valid/minimal_working_example_expected.tsv b/tests/valid/minimal_working_example_expected.tsv new file mode 100644 index 0000000..22d1122 --- /dev/null +++ b/tests/valid/minimal_working_example_expected.tsv @@ -0,0 +1,9 @@ +#metadataBlock name dataverseAlias displayName + ValidExample Valid +#datasetField name title description watermark fieldType displayOrder displayFormat advancedSearchField allowControlledVocabulary allowmultiples facetable displayoncreate required parent metadatablock_id + Description Description This field describes. textbox TRUE FALSE FALSE FALSE TRUE TRUE ValidExample + Answer Answer text TRUE TRUE TRUE TRUE TRUE TRUE ValidExample +#controlledVocabulary DatasetField Value identifier displayOrder + AnswerYes Yes answer_positive + AnswerNo No answer_negative + AnswerMaybeSo Maybe answer_unclear From 4b110100dd42ae83cd6b58c9fea2c0d289472eb4 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Mon, 25 Mar 2024 20:33:42 +0100 Subject: [PATCH 03/17] Fixed None severity variable casing and improved output --- yml2block/__main__.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/yml2block/__main__.py b/yml2block/__main__.py index f295daf..65a2411 100644 --- a/yml2block/__main__.py +++ b/yml2block/__main__.py @@ -123,7 +123,7 @@ def return_violations(lint_violations, warn_ec, verbose): if len(lint_violations) == 0: if verbose: - print("\nAll Checks passed!\n\n") + print("\nAll Checks passed! 🎉\n\n") sys.exit(0) else: max_severity = None @@ -133,15 +133,23 @@ def return_violations(lint_violations, warn_ec, verbose): print() print(file_path) print(100 * "-") - print(f"A total of {len(violations)} lint(s) failed.") - print(f"Highest error level was '{max_severity.name}'") - for violation in violations: - print(violation) - print("Errors detected. File(s) cannot safely be converted to TSV.") + if violations: + print(f"A total of {len(violations)} lint(s) failed.") + print(f"Highest error level was '{max_severity.name}'") + for violation in violations: + print(violation) + else: + print(f"All checks passed for {file_path}! 🎉") + if max_severity == Level.ERROR: + print("Errors detected. File(s) cannot safely be converted to TSV.") sys.exit(1) elif max_severity == Level.WARNING: + print("Warnings detected. File(s) can probably not be safely converted to TSV.") sys.exit(warn_ec) + elif max_severity == Level.NONE: + print("\nAll Checks passed! 🎉 Safe covnersion is possible.\n\n") + sys.exit(0) else: sys.exit(1) From 6002668e9fdaf8888b9d3ebcb93f3c10ec6335c8 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Mon, 25 Mar 2024 20:34:23 +0100 Subject: [PATCH 04/17] Formatted with black --- tests/integration_tests.py | 7 +++++-- yml2block/__main__.py | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/integration_tests.py b/tests/integration_tests.py index f76ffaf..d34b53c 100644 --- a/tests/integration_tests.py +++ b/tests/integration_tests.py @@ -30,12 +30,15 @@ def test_minimal_valid_example_convert(): path_expected = "tests/valid/minimal_working_example_expected.tsv" path_output = "/tmp/y2b_mwe.tsv" result = runner.invoke( - yml2block.__main__.main, ["convert", "tests/valid/minimal_working_example.yml", "-o", path_output] + yml2block.__main__.main, + ["convert", "tests/valid/minimal_working_example.yml", "-o", path_output], ) print(result) print(result.stdout) assert result.exit_code == 0, result.stdout - with open(path_output, "r") as converted_file, open(path_expected, "r") as expected_file: + with open(path_output, "r") as converted_file, open( + path_expected, "r" + ) as expected_file: converted_tsv = converted_file.read() expected_tsv = expected_file.read() assert converted_tsv == expected_tsv diff --git a/yml2block/__main__.py b/yml2block/__main__.py index 65a2411..d0f057c 100644 --- a/yml2block/__main__.py +++ b/yml2block/__main__.py @@ -145,7 +145,9 @@ def return_violations(lint_violations, warn_ec, verbose): print("Errors detected. File(s) cannot safely be converted to TSV.") sys.exit(1) elif max_severity == Level.WARNING: - print("Warnings detected. File(s) can probably not be safely converted to TSV.") + print( + "Warnings detected. File(s) can probably not be safely converted to TSV." + ) sys.exit(warn_ec) elif max_severity == Level.NONE: print("\nAll Checks passed! 🎉 Safe covnersion is possible.\n\n") From 151335ebe4e421d1e192fdbc3974b9ca2348b0a9 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Mon, 25 Mar 2024 20:37:10 +0100 Subject: [PATCH 05/17] Updated gitignore to include test folder --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b4b0d43..90f6681 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ build yml2block.egg-info poetry.lock yml2block/__pycache__/ -tests/__pycache__/ +tests/__pychache__/ From f9424fe057167a2f59714930e5d344c6bfc53a1d Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Mon, 25 Mar 2024 20:38:21 +0100 Subject: [PATCH 06/17] Fixed typo --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 90f6681..b4b0d43 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ build yml2block.egg-info poetry.lock yml2block/__pycache__/ -tests/__pychache__/ +tests/__pycache__/ From 637b6fb639d1b0d4274d5758950e3192a5aee350 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Mon, 25 Mar 2024 20:40:33 +0100 Subject: [PATCH 07/17] Added files converted during tests to gitignire --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b4b0d43..6ad61a4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ yml2block.egg-info poetry.lock yml2block/__pycache__/ tests/__pycache__/ +tests/valid/*_converted.tsv From 283b9cccdcfc017d4aeb1d34da6b1fd9320a5eb1 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Wed, 27 Mar 2024 15:09:54 +0100 Subject: [PATCH 08/17] Added skeleton for suggested fixes in TSV parsing --- yml2block/suggestions.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/yml2block/suggestions.py b/yml2block/suggestions.py index 92d5e8d..af08bad 100644 --- a/yml2block/suggestions.py +++ b/yml2block/suggestions.py @@ -58,3 +58,24 @@ def fix_required_keys_present(missing_keys, list_item, tsv_keyword): """Return list of missing keys.""" name = identify_entry(list_item, tsv_keyword) return f"Missing keys '{missing_keys}' for '{name}' in block '{tsv_keyword}'." + + +def fix_identify_breaking_points(full_file, break_points): + """Suggest fixes for too little or too many detected blocks.""" + match len(break_points): + case 0: + # No line starts with # + # are you passing the right file? + ... + case 1: + # Only one line starts with # + # At least two blocks are required for a reasonable metadata schema + ... + case 2 | 3: + # This case should never be reached, those files are fine + # Raise an exception if I get here in error handling + ... + case _: + # More than the required number of blocks is present. + # Identify what is going on. + ... From 3153a22c9cfbb883b821ad11dda665acfbbcdb22 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Mon, 8 Apr 2024 09:56:25 +0200 Subject: [PATCH 09/17] Fixed lint --- tests/unit_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit_tests.py b/tests/unit_tests.py index e6a1b2b..d638592 100644 --- a/tests/unit_tests.py +++ b/tests/unit_tests.py @@ -116,4 +116,4 @@ def test_input_guessing_invalid_extension(): guessed_type, violations = guess_input_type(path) assert len(violations) == 1 assert violations[0].level == Level.ERROR - assert guessed_type == False + assert guessed_type is False From 48ca9408c4ec6c31a6ded08e4b051413ca10636e Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Mon, 8 Apr 2024 23:48:23 +0200 Subject: [PATCH 10/17] Minimal unit test case for breakpoint identification --- tests/unit_tests.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/unit_tests.py b/tests/unit_tests.py index d638592..aede8f9 100644 --- a/tests/unit_tests.py +++ b/tests/unit_tests.py @@ -1,5 +1,6 @@ from yml2block.__main__ import guess_input_type from yml2block.rules import Level +from yml2block.tsv_input import _identify_break_points def test_input_guessing_valid_tsv(): @@ -117,3 +118,32 @@ def test_input_guessing_invalid_extension(): assert len(violations) == 1 assert violations[0].level == Level.ERROR assert guessed_type is False + + +def test_breakpoint_identification(): + """ """ + test_cases = [ + { + "file": "tests/valid/minimal_working_example_expected.tsv", + "expected_blocks": ( + "#metadataBlock\tname\tdataverseAlias\tdisplayName\t\t\t\t\t\t\t\t\t\t\t\t\n\tValidExample\t\tValid\t\t\t\t\t\t\t\t\t\t\t\t\n", + "#datasetField\tname\ttitle\tdescription\twatermark\tfieldType\tdisplayOrder\tdisplayFormat\tadvancedSearchField\tallowControlledVocabulary\tallowmultiples\tfacetable\tdisplayoncreate\trequired\tparent\tmetadatablock_id\n\tDescription\tDescription\tThis field describes.\t\ttextbox\t\t\tTRUE\tFALSE\tFALSE\tFALSE\tTRUE\tTRUE\t\tValidExample\n\tAnswer\tAnswer\t\t\ttext\t\t\tTRUE\tTRUE\tTRUE\tTRUE\tTRUE\tTRUE\t\tValidExample\n", + "#controlledVocabulary\tDatasetField\tValue\tidentifier\tdisplayOrder\t\t\t\t\t\t\t\t\t\t\t\n\tAnswerYes\tYes\tanswer_positive\t\t\t\t\t\t\t\t\t\t\t\t\n\tAnswerNo\tNo\tanswer_negative\t\t\t\t\t\t\t\t\t\t\t\t\n\tAnswerMaybeSo\tMaybe\tanswer_unclear\t\t\t\t\t\t\t\t\t\t\t\t\n", + ), + "expected_violations": [], + }, + # TODO more test cases + ] + + for test_case in test_cases: + with open(test_case["file"], "r") as case_file: + split_blocks, violations = _identify_break_points(case_file.read()) + assert split_blocks == test_case["expected_blocks"] + assert len(violations) == len(test_case["expected_violations"]) + for vio, exp_vio in zip(violations, test_case["expected_violations"]): + assert vio == exp_vio + + +def test_breakpoint_suggestions(): + """ """ + raise NotImplemented From 54107580f01eb15b04d5d2130945c8ab421e578b Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Thu, 11 Apr 2024 11:05:18 +0200 Subject: [PATCH 11/17] Added unit test for tsv input --- tests/snippets/four_item_snippet.tsv | 4 +++ tests/snippets/minimal_snippet.tsv | 2 ++ tests/snippets/one_item_snippet.tsv | 1 + tests/snippets/three_item_snippet.tsv | 3 ++ tests/unit_tests.py | 42 +++++++++++++++++++++++++-- 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 tests/snippets/four_item_snippet.tsv create mode 100644 tests/snippets/minimal_snippet.tsv create mode 100644 tests/snippets/one_item_snippet.tsv create mode 100644 tests/snippets/three_item_snippet.tsv diff --git a/tests/snippets/four_item_snippet.tsv b/tests/snippets/four_item_snippet.tsv new file mode 100644 index 0000000..64df4a1 --- /dev/null +++ b/tests/snippets/four_item_snippet.tsv @@ -0,0 +1,4 @@ +#metadataBlock +#datasetField +#controlledVocabulary +#controlledVocabulary diff --git a/tests/snippets/minimal_snippet.tsv b/tests/snippets/minimal_snippet.tsv new file mode 100644 index 0000000..f5755c1 --- /dev/null +++ b/tests/snippets/minimal_snippet.tsv @@ -0,0 +1,2 @@ +#metadataBlock +#datasetField diff --git a/tests/snippets/one_item_snippet.tsv b/tests/snippets/one_item_snippet.tsv new file mode 100644 index 0000000..c1eecb9 --- /dev/null +++ b/tests/snippets/one_item_snippet.tsv @@ -0,0 +1 @@ +#metadataBlock diff --git a/tests/snippets/three_item_snippet.tsv b/tests/snippets/three_item_snippet.tsv new file mode 100644 index 0000000..cea5488 --- /dev/null +++ b/tests/snippets/three_item_snippet.tsv @@ -0,0 +1,3 @@ +#metadataBlock +#datasetField +#controlledVocabulary diff --git a/tests/unit_tests.py b/tests/unit_tests.py index aede8f9..c292e96 100644 --- a/tests/unit_tests.py +++ b/tests/unit_tests.py @@ -132,7 +132,44 @@ def test_breakpoint_identification(): ), "expected_violations": [], }, - # TODO more test cases + { + "file": "tests/snippets/minimal_snippet.tsv", + "expected_blocks": ( + "#metadataBlock\n", + "#datasetField\n", + None, + ), + "expected_violations": [], + }, + { + "file": "tests/snippets/three_item_snippet.tsv", + "expected_blocks": ( + "#metadataBlock\n", + "#datasetField\n", + "#controlledVocabulary\n", + ), + "expected_violations": [], + }, + { + "file": "tests/snippets/one_item_snippet.tsv", + "expected_blocks": "#metadataBlock\n", + "expected_violations": [ + { + "level": Level.WARNING, + "rule": "identify_break_points", + } + ], + }, + { + "file": "tests/snippets/four_item_snippet.tsv", + "expected_blocks": "#metadataBlock\n#datasetField\n#controlledVocabulary\n#controlledVocabulary\n", + "expected_violations": [ + { + "level": Level.WARNING, + "rule": "identify_break_points", + } + ], + }, ] for test_case in test_cases: @@ -141,7 +178,8 @@ def test_breakpoint_identification(): assert split_blocks == test_case["expected_blocks"] assert len(violations) == len(test_case["expected_violations"]) for vio, exp_vio in zip(violations, test_case["expected_violations"]): - assert vio == exp_vio + assert vio.level == exp_vio["level"] + assert vio.rule == exp_vio["rule"] def test_breakpoint_suggestions(): From f1c94ee6585151739f8d9e915fe812e0ca5e68b3 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Thu, 11 Apr 2024 11:05:44 +0200 Subject: [PATCH 12/17] Removed skeleton for hard to test case --- tests/unit_tests.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/unit_tests.py b/tests/unit_tests.py index c292e96..6fa3480 100644 --- a/tests/unit_tests.py +++ b/tests/unit_tests.py @@ -180,8 +180,3 @@ def test_breakpoint_identification(): for vio, exp_vio in zip(violations, test_case["expected_violations"]): assert vio.level == exp_vio["level"] assert vio.rule == exp_vio["rule"] - - -def test_breakpoint_suggestions(): - """ """ - raise NotImplemented From abd3d8adf3e48d57b10cc58bfd9a530087e3ca99 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Thu, 25 Apr 2024 12:34:39 +0200 Subject: [PATCH 13/17] Docs --- tests/unit_tests.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/unit_tests.py b/tests/unit_tests.py index 6fa3480..bb2654a 100644 --- a/tests/unit_tests.py +++ b/tests/unit_tests.py @@ -175,8 +175,13 @@ def test_breakpoint_identification(): for test_case in test_cases: with open(test_case["file"], "r") as case_file: split_blocks, violations = _identify_break_points(case_file.read()) + + # Ensure the expected blocks are returned + # and that the correct number is returned assert split_blocks == test_case["expected_blocks"] assert len(violations) == len(test_case["expected_violations"]) + + # Ensure the expected error are detected for vio, exp_vio in zip(violations, test_case["expected_violations"]): assert vio.level == exp_vio["level"] assert vio.rule == exp_vio["rule"] From 6c212adf14a38fce93cb73ee5b24cbbf1898862a Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Thu, 5 Dec 2024 17:03:57 +0100 Subject: [PATCH 14/17] Use max_severity consistently --- tests/integration_tests.py | 2 -- yml2block/__main__.py | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/integration_tests.py b/tests/integration_tests.py index d34b53c..8ef8103 100644 --- a/tests/integration_tests.py +++ b/tests/integration_tests.py @@ -33,8 +33,6 @@ def test_minimal_valid_example_convert(): yml2block.__main__.main, ["convert", "tests/valid/minimal_working_example.yml", "-o", path_output], ) - print(result) - print(result.stdout) assert result.exit_code == 0, result.stdout with open(path_output, "r") as converted_file, open( path_expected, "r" diff --git a/yml2block/__main__.py b/yml2block/__main__.py index d0f057c..38acbe3 100644 --- a/yml2block/__main__.py +++ b/yml2block/__main__.py @@ -55,10 +55,12 @@ def total_violations(self): def __iter__(self): """Iterate over violations and max severity level per file.""" for filename, violations in self.violations.items(): - yield (filename, violations, min(violations, key=lambda x: x.level).level) - + yield (filename, violations, self.max_severity(filename)) def max_severity(self, file_path): + """Get the highest error severity level for the file and Level.NONE + if the file has no violations. + """ try: violation_list = self.violations[file_path] if len(violation_list) == 0: From 7a1eebea6a85699bc1f088cdf218eba570be2cb9 Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Thu, 5 Dec 2024 17:09:13 +0100 Subject: [PATCH 15/17] Updated changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e55187e..74f1928 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,11 @@ # Changelog -## Version 0.7.0 (2024-11-??) +## Version 0.7.0 (2024-12-??) - Fixed bug where converting files without lint violations would result in an error (#T16). Thanks @Athemis +- Added minimal test for conversion function. +- Add tests to PRs. +- Add lint `b003` that checks if all titles within the DatasetField block are unique. ## Version 0.6.0 (2024-03-18) From 068800be26ad5b5d12db2a2bede3f12f8f66f15b Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Tue, 10 Dec 2024 08:32:13 +0100 Subject: [PATCH 16/17] Fixed typo Co-authored-by: Alexander Minges --- yml2block/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yml2block/__main__.py b/yml2block/__main__.py index 38acbe3..7270ad0 100644 --- a/yml2block/__main__.py +++ b/yml2block/__main__.py @@ -152,7 +152,7 @@ def return_violations(lint_violations, warn_ec, verbose): ) sys.exit(warn_ec) elif max_severity == Level.NONE: - print("\nAll Checks passed! 🎉 Safe covnersion is possible.\n\n") + print("\nAll Checks passed! 🎉 Safe conversion is possible.\n\n") sys.exit(0) else: sys.exit(1) From 33d0fa8a9582effa74549721de8046f5029fd9ad Mon Sep 17 00:00:00 2001 From: Henning Timm Date: Tue, 10 Dec 2024 16:07:12 +0100 Subject: [PATCH 17/17] Bump version number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b892ee3..44957e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Version 0.7.0 (2024-12-??) +## Version 0.7.0 (2024-12-10) - Fixed bug where converting files without lint violations would result in an error (#16). Thanks @Athemis - Fixed bug where non-string watermarks caused an error (#19). Thanks @Athemis