fmartingr
/
jeeves
Archived
1
0
Fork 0

Added TOML parsing

This commit is contained in:
Felipe Martín 2019-10-06 15:11:26 +00:00
parent d577ed5499
commit 5eb202759d
4 changed files with 88 additions and 11 deletions

View File

@ -1,3 +1,5 @@
import os.path
import click import click
from jeeves.cli.echo import info, error, title, success from jeeves.cli.echo import info, error, title, success
@ -20,9 +22,15 @@ def main():
help="Display output for flow", help="Display output for flow",
) )
def execute(defintinion_file, print_output): def execute(defintinion_file, print_output):
extension = os.path.splitext(defintinion_file.name)[1][1:]
if not hasattr(FlowParser, f"from_{extension}"):
error(f"Extension {extension} is not supported")
exit(1)
info(f"Running flow from {defintinion_file.name}") info(f"Running flow from {defintinion_file.name}")
flow = FlowParser.from_json(defintinion_file.read()) flow = getattr(FlowParser, f"from_{extension}")(defintinion_file.read())
title(f"Running flow: {flow.name}") title(f"Running flow: {flow.name}")
executor = Executor(flow) executor = Executor(flow)

View File

@ -1,12 +1,12 @@
from typing import Any, Dict, List, Text, Optional from typing import Any, Dict, List, Text, Optional
from dataclasses import field from dataclasses import field
from pydantic import BaseModel import pydantic
from jeeves.core.registry import ActionRegistry from jeeves.core.registry import ActionRegistry
class BaseObject(BaseModel): class BaseObject(pydantic.BaseModel):
pass pass
@ -18,7 +18,7 @@ class Result(BaseObject):
class Task(BaseObject): class Task(BaseObject):
name: Text name: Text
type: Text type: Text
parameters: Dict[Any, Any] parameters: Optional[Dict[Any, Any]] = None
@property @property
def action(self): def action(self):

View File

@ -1,4 +1,6 @@
import json
from typing import Any, Text, MutableMapping from typing import Any, Text, MutableMapping
from pathlib import Path
import toml import toml
@ -8,13 +10,25 @@ from jeeves.core.objects import Flow, BaseObject
class ObjectParser: class ObjectParser:
object: BaseObject = None object: BaseObject = None
@classmethod
def from_dict(cls, serialized: MutableMapping[str, Any]) -> BaseObject:
return cls.object.parse_obj(serialized)
@classmethod
def to_dict(cls, obj: BaseObject) -> dict:
return obj.dict()
@classmethod @classmethod
def from_json(cls, serialized: Text) -> BaseObject: def from_json(cls, serialized: Text) -> BaseObject:
return cls.object.parse_raw(serialized) return cls.object.parse_raw(serialized)
@classmethod @classmethod
def from_dict(cls, serialized: MutableMapping[str, Any]) -> BaseObject: def from_json_file(cls, path: Path) -> BaseObject:
return cls.object.parse_obj(serialized) return cls.object.parse_file(path)
@classmethod
def to_json(cls, obj: BaseObject) -> Text:
return json.dumps(cls.to_dict(obj))
@classmethod @classmethod
def from_toml(cls, serialized: Text) -> BaseObject: def from_toml(cls, serialized: Text) -> BaseObject:
@ -27,8 +41,8 @@ class ObjectParser:
return cls.from_dict(dct) return cls.from_dict(dct)
@classmethod @classmethod
def to_dict(cls, obj: BaseObject) -> dict: def to_toml(cls, obj: BaseObject) -> Text:
return obj.dict() return toml.dumps(cls.to_dict(obj))
class FlowParser(ObjectParser): class FlowParser(ObjectParser):

View File

@ -1,4 +1,11 @@
from jeeves.core.objects import BaseObject # pylint: disable=no-member
import os
import json
import tempfile
import toml
from jeeves.core.objects import Flow, BaseObject
from jeeves.core.parsers import FlowParser from jeeves.core.parsers import FlowParser
from .factories import FlowFactory from .factories import FlowFactory
@ -15,11 +22,59 @@ EXPORTED_FLOW = {
def test_parser_object_to_dict_ok(): def test_parser_object_to_dict_ok():
obj = FlowFactory() obj: Flow = FlowFactory()
result = FlowParser.to_dict(obj) result = FlowParser.to_dict(obj)
obj = FlowParser.from_dict(result) assert set(obj.fields).issubset(set(result))
def test_parser_dict_to_object_ok(): def test_parser_dict_to_object_ok():
obj = FlowParser.from_dict(EXPORTED_FLOW) obj = FlowParser.from_dict(EXPORTED_FLOW)
assert isinstance(obj, Flow)
########
# JSON #
########
def test_parser_json_to_object_ok():
obj = FlowParser.from_json(json.dumps(EXPORTED_FLOW))
assert isinstance(obj, BaseObject) assert isinstance(obj, BaseObject)
def test_parser_json_file_to_object_ok():
export_file = tempfile.NamedTemporaryFile(delete=False, mode="w")
with export_file as handler:
handler.write(json.dumps(EXPORTED_FLOW))
obj = FlowParser.from_json_file(export_file.name)
assert isinstance(obj, BaseObject)
os.unlink(export_file.name)
def test_parser_obj_to_json_ok():
obj: Flow = FlowFactory()
result = FlowParser.to_json(obj)
assert set(obj.fields).issubset(set(json.loads(result)))
########
# TOML #
########
def test_parser_toml_to_object_ok():
obj = FlowParser.from_toml(toml.dumps(EXPORTED_FLOW))
assert isinstance(obj, BaseObject)
def test_parser_toml_file_to_object_ok():
export_file = tempfile.NamedTemporaryFile(delete=False, mode="w")
with export_file as handler:
handler.write(toml.dumps(EXPORTED_FLOW))
obj = FlowParser.from_toml_file(export_file.name)
assert isinstance(obj, BaseObject)
os.unlink(export_file.name)
def test_parser_obj_to_toml_ok():
obj: Flow = FlowFactory()
result = FlowParser.to_toml(obj)
assert set(obj.fields).issubset(set(toml.loads(result)))