diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 1edc535..92ea326 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.0.2 +current_version = 0.2.0 commit = True tag = True @@ -18,4 +18,3 @@ replace = version = release = "{new_version}" [bumpversion:file:src/omi/__init__.py] search = __version__ = "{current_version}" replace = __version__ = "{new_version}" - diff --git a/.github/workflows/test-pypi-publish.yml b/.github/workflows/test-pypi-publish.yml index d6f3cb5..28e68b5 100644 --- a/.github/workflows/test-pypi-publish.yml +++ b/.github/workflows/test-pypi-publish.yml @@ -5,6 +5,7 @@ on: branches: - test-release - 'release/*' + - 'release-*' jobs: build-n-publish: diff --git a/.gitignore b/.gitignore index 03ec9cc..16a8eda 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ venv*/ pyvenv*/ /0_env /1_env +env*/ # Installer logs pip-log.txt @@ -76,3 +77,7 @@ docs/_build # Mypy Cache .mypy_cache/ + + +# manual testing scripts +/local_test \ No newline at end of file diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 71fe4a0..ad5dc31 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,8 +2,13 @@ Changelog ========= -current (2022-XX-XX) +current (2024-XX-XX) -------------------- +* + +0.2.0 (2024-01-25) +-------------------- +* Introduce OMIT_NONE_FIELDS in JSONCompiler class to ease removing / keeping none values in the metadata. By default None values are kept. (#72)[https://github.com/OpenEnergyPlatform/omi/pull/72] 0.1.2 (2023-01-27) -------------------- diff --git a/README.rst b/README.rst index 37c37a8..0bce937 100644 --- a/README.rst +++ b/README.rst @@ -42,9 +42,9 @@ Overview :alt: PyPI Package latest release :target: https://pypi.org/project/omi -.. |commits-since| image:: https://img.shields.io/github/commits-since/OpenEnergyPlatform/omi/v0.0.2.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/OpenEnergyPlatform/omi/v0.2.0.svg :alt: Commits since latest release - :target: https://github.com/OpenEnergyPlatform/omi/compare/v0.0.2...master + :target: https://github.com/OpenEnergyPlatform/omi/compare/v0.2.0...master .. |wheel| image:: https://img.shields.io/pypi/wheel/omi.svg :alt: PyPI Wheel diff --git a/docs/conf.py b/docs/conf.py index ed03c32..a3ade30 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -28,7 +28,7 @@ year = "2019" author = "Martin Glauer" copyright = "{0}, {1}".format(year, author) -version = release = "0.0.2" +version = release = "0.2.0" pygments_style = "trac" templates_path = ["."] diff --git a/docs/oep_metadata.rst b/docs/oep_metadata.rst index 19b926e..05dd42e 100644 --- a/docs/oep_metadata.rst +++ b/docs/oep_metadata.rst @@ -50,5 +50,6 @@ new metadata format by using the respective dialect .. doctest:: >>> dialect1_4 = OEP_V_1_4_Dialect() + >>> dialect1_4._compiler.OMIT_NONE_FIELDS = True >>> dialect1_4.compile(parsed) {'id': 'unique_id', 'metaMetadata': {'metadataVersion': 'OEP-1.4.0', 'metadataLicense': {'name': 'CC0-1.0', 'title': 'Creative Commons Zero v1.0 Universal', 'path': 'https://creativecommons.org/publicdomain/zero/1.0/'}}} diff --git a/setup.py b/setup.py index 69a5ac5..7aed5d9 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ def read(*names, **kwargs): setup( name="omi", - version="0.1.2", + version="0.2.0", license="AGPL-3.0", description="A library to process and translate open energy metadata.", long_description="%s\n%s" diff --git a/src/omi/__init__.py b/src/omi/__init__.py index 3b93d0b..d3ec452 100644 --- a/src/omi/__init__.py +++ b/src/omi/__init__.py @@ -1 +1 @@ -__version__ = "0.0.2" +__version__ = "0.2.0" diff --git a/src/omi/cli.py b/src/omi/cli.py index 72bb009..024d35e 100644 --- a/src/omi/cli.py +++ b/src/omi/cli.py @@ -29,12 +29,14 @@ def grp(): @click.option("-f", help="Dialect identifier of the input") @click.option("-t", default="oep-v1.5", help="Dialect identifier to translate to") @click.option("-o", default=None, help="Output file") +@click.option("-omit_nones", default=True, help="Use to either keep or omit all null / none values from the json.") @click.argument("file_path") -def translate(f, t, o, file_path): +def translate(f, t, o, omit_nones, file_path): with open(file_path, "r", encoding="utf-8") as infile: from_dialect = get_dialect(f)() obj = from_dialect.parse(infile.read()) to_dialect = get_dialect(t)() + to_dialect._compiler.OMIT_NONE_FIELDS = omit_nones s = to_dialect.compile_and_render(obj) if o: with open(o, "w", encoding="utf-8") as outfile: diff --git a/src/omi/dialects/oep/compiler.py b/src/omi/dialects/oep/compiler.py index 1dbcbe4..50e2742 100644 --- a/src/omi/dialects/oep/compiler.py +++ b/src/omi/dialects/oep/compiler.py @@ -17,8 +17,9 @@ def compile_date_or_none(x, format=None): class JSONCompiler(Compiler): __METADATA_VERSION = "OEP-1.4.0" + OMIT_NONE_FIELDS = False - def _construct_dict(self, *args, omit_none=True, **kwargs): + def _construct_dict(self, *args, omit_none=None, **kwargs): """ Accepts a list of arguments of shape (name: str, field: Compileable) and returns a dictionary that maps name -> self.visit(field). If `omit_none` is true, fields that are `None` are ignored. @@ -32,6 +33,7 @@ def _construct_dict(self, *args, omit_none=True, **kwargs): ------- """ + omit_none = self.OMIT_NONE_FIELDS d = { field_name: self.visit(field) for field_name, field in args diff --git a/tests/test_cli/test_cli_translation.py b/tests/test_cli/test_cli_translation.py index 8df1680..6ec50ae 100644 --- a/tests/test_cli/test_cli_translation.py +++ b/tests/test_cli/test_cli_translation.py @@ -3,15 +3,20 @@ from omi.cli import translate import json + def test_cli_translation(): @click.command() - @click.argument('name') + @click.argument("name") def hello(name): - click.echo('Hello %s!' % name) + click.echo("Hello %s!" % name) runner = CliRunner() - result = runner.invoke(translate, ["-f", "oep-v1.3", "-t", "oep-v1.4", "tests/data/metadata_v13.json"]) + result = runner.invoke( + translate, + ["-f", "oep-v1.3", "-t", "oep-v1.4", "-omit_nones", "True", "tests/data/metadata_v13.json"], + ) with open("tests/data/metadata_v13_converted.json") as expected_file: expected = json.loads(expected_file.read()) + print(result) assert result.exit_code == 0 assert json.loads(result.output) == expected diff --git a/tests/test_dialects/test_oep/test_compiler.py b/tests/test_dialects/test_oep/test_compiler.py index 7916548..13eaaa4 100644 --- a/tests/test_dialects/test_oep/test_compiler.py +++ b/tests/test_dialects/test_oep/test_compiler.py @@ -7,6 +7,8 @@ def test_compiler_v1_5(): compiler = JSONCompilerOEM15() + # omit none values as expected result also does not include None´s + compiler.OMIT_NONE_FIELDS = True with open("tests/data/metadata_v15.json", "r", encoding="utf-8") as _input_file: expected_result = json.load(_input_file) result = compiler.visit(metadata_v_1_5) @@ -15,6 +17,8 @@ def test_compiler_v1_5(): def test_compiler_v1_4(): compiler = JSONCompiler() + # omit none values as expected result also does not include None´s + compiler.OMIT_NONE_FIELDS = True with open("tests/data/metadata_v14.json", "r", encoding="utf-8") as _input_file: expected_result = json.load(_input_file) result = compiler.visit(metadata_v_1_4) diff --git a/tests/test_dialects/test_oep/test_translation.py b/tests/test_dialects/test_oep/test_translation.py index 4a958b6..1448ebd 100644 --- a/tests/test_dialects/test_oep/test_translation.py +++ b/tests/test_dialects/test_oep/test_translation.py @@ -10,6 +10,8 @@ def test_translation_1_3_to_1_4(): parser = JSONParser_1_3() compiler = JSONCompiler() + # omit none values as expected result also does not include None´s + compiler.OMIT_NONE_FIELDS = True with open("tests/data/metadata_v13_minimal.json", "r") as _input_file: input_string = _input_file.read() # Step 1: Parse JSON to internal structure