From 2a7e04b502f3844ec05b54312bce3bff059dcb56 Mon Sep 17 00:00:00 2001 From: FunJim Date: Wed, 28 Feb 2024 15:32:59 +0800 Subject: [PATCH 1/2] support serialization and deserialization for SarifLog --- sarif_om/__init__.py | 59 ++++++++++++++++++++++++++++++++++++++++++++ setup.cfg | 1 + setup.py | 2 +- 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/sarif_om/__init__.py b/sarif_om/__init__.py index c7c074b..b742320 100644 --- a/sarif_om/__init__.py +++ b/sarif_om/__init__.py @@ -1,5 +1,11 @@ # This file was generated by jschema_to_python version 1.2.3. +import json +from typing import Dict +from attrs import has, fields +from cattrs import Converter +from cattrs.gen import make_dict_unstructure_fn, make_dict_structure_fn, override + from ._sarif_log import SarifLog from ._address import Address from ._artifact import Artifact @@ -53,3 +59,56 @@ from ._version_control_details import VersionControlDetails from ._web_request import WebRequest from ._web_response import WebResponse + + +def _generate_sarif_report_cattrs_converter() -> Converter: + converter = Converter() + + def _unstructure(cls): + return make_dict_unstructure_fn( + cls, + converter, + **{ + a.name: override( + rename=a.metadata["schema_property_name"], + omit_if_default=True, + ) + for a in fields(cls) + }, + ) + + def _structure(cls): + return make_dict_structure_fn( + cls, + converter, + **{ + a.name: override( + rename=a.metadata["schema_property_name"], + ) + for a in fields(cls) + }, + ) + + converter.register_unstructure_hook_factory(has, _unstructure) + converter.register_structure_hook_factory(has, _structure) + return converter + + +_converter = _generate_sarif_report_cattrs_converter() + + +def to_dict(sarif_log: SarifLog) -> Dict: + return _converter.unstructure(sarif_log, SarifLog) + + +def to_json(sarif_log: SarifLog, indent=2) -> str: + obj = to_dict(sarif_log) + return json.dumps(obj, indent=indent) + + +def from_dict(data: Dict) -> SarifLog: + return _converter.structure(data, SarifLog) + + +def from_json(data: str) -> SarifLog: + return from_dict(json.loads(data)) diff --git a/setup.cfg b/setup.cfg index 9338bba..2207515 100644 --- a/setup.cfg +++ b/setup.cfg @@ -20,6 +20,7 @@ classifier = python_requires = >= 2.7 install_requires = attrs + cattrs pbr [files] diff --git a/setup.py b/setup.py index 78b91d7..c7ead35 100644 --- a/setup.py +++ b/setup.py @@ -2,4 +2,4 @@ from setuptools import setup -setup(setup_requires=["pbr"], pbr=True) +setup(setup_requires=["pbr"], install_requires=["attrs", "cattrs"], pbr=True) From 32f1f24abc021f9dd89c4bd340c80d5a77509b24 Mon Sep 17 00:00:00 2001 From: FunJim Date: Wed, 28 Feb 2024 16:54:34 +0800 Subject: [PATCH 2/2] update README --- README.rst | 61 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index 2f14b8f..d19d947 100644 --- a/README.rst +++ b/README.rst @@ -27,18 +27,65 @@ How to use .. code-block:: python - import cattrs - import json - import sys + from sarif_om import SarifLog, Run, Tool, ToolComponent, Result, Message + + + sarif_log = SarifLog( + version="2.1.0", + runs=[ + Run( + tool=Tool( + driver=ToolComponent( + name="My Static Analyzer", + version="1.0.0", + ) + ), + results=[ + Result( + rule_id="R001", + message=Message(text="Use of uninitialized variable 'x'"), + ) + ], + ) + ], + ) + + print(sarif_log) + +To serialize it to plain dict or JSON: - from sarif_om import SarifLog +.. code-block:: python + + from sarif_om import to_dict, to_json + print(to_json(sarif_log)) + print(to_dict(sarif_log)) - with open(sys.argv[1]) as fp: - data = json.load(fp) +To deserialize dict/JSON data to ``sarif_om.SarifLog``: - sarif_log = cattrs.structure(data, SarifLog) +.. code-block:: python + import json + from sarif_om import from_dict, from_json + + + sarif_log_dict = { + "runs": [ + { + "tool": {"driver": {"name": "My Static Analyzer", "version": "1.0.0"}}, + "results": [ + { + "message": {"text": "Use of uninitialized variable 'x'"}, + "ruleId": "R001", + } + ], + } + ], + "version": "2.1.0", + } + + print(from_dict(sarif_log_dict)) + print(from_json(json.dumps(sarif_log_dict))) Generation ==========