Skip to content

Commit

Permalink
Merge pull request #72 from OpenEnergyPlatform/feature-71-keep-null-k…
Browse files Browse the repository at this point in the history
…eys-and-values

Keep metadata fields when value `null`
  • Loading branch information
jh-RLI authored Jan 19, 2024
2 parents 962f212 + bff4a50 commit e13457e
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 5 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Changelog

current (2022-XX-XX)
--------------------
* 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)
--------------------
Expand Down
1 change: 1 addition & 0 deletions docs/oep_metadata.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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/'}}}
4 changes: 3 additions & 1 deletion src/omi/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 3 additions & 1 deletion src/omi/dialects/oep/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down
11 changes: 8 additions & 3 deletions tests/test_cli/test_cli_translation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 4 additions & 0 deletions tests/test_dialects/test_oep/test_compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions tests/test_dialects/test_oep/test_translation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit e13457e

Please sign in to comment.