aboutsummaryrefslogtreecommitdiffstats
path: root/python-packages/json_schemas/src
diff options
context:
space:
mode:
Diffstat (limited to 'python-packages/json_schemas/src')
-rw-r--r--python-packages/json_schemas/src/conf.py54
-rw-r--r--python-packages/json_schemas/src/doc_static/.gitkeep0
-rw-r--r--python-packages/json_schemas/src/index.rst18
-rw-r--r--python-packages/json_schemas/src/zero_ex/__init__.py2
-rw-r--r--python-packages/json_schemas/src/zero_ex/json_schemas/__init__.py83
-rw-r--r--python-packages/json_schemas/src/zero_ex/json_schemas/py.typed0
l---------python-packages/json_schemas/src/zero_ex/json_schemas/schemas1
7 files changed, 158 insertions, 0 deletions
diff --git a/python-packages/json_schemas/src/conf.py b/python-packages/json_schemas/src/conf.py
new file mode 100644
index 000000000..1ae1493e3
--- /dev/null
+++ b/python-packages/json_schemas/src/conf.py
@@ -0,0 +1,54 @@
+"""Configuration file for the Sphinx documentation builder."""
+
+# Reference: http://www.sphinx-doc.org/en/master/config
+
+from typing import List
+import pkg_resources
+
+
+# pylint: disable=invalid-name
+# because these variables are not named in upper case, as globals should be.
+
+project = "0x-json-schemas"
+# pylint: disable=redefined-builtin
+copyright = "2018, ZeroEx, Intl."
+author = "F. Eugene Aumson"
+version = pkg_resources.get_distribution("0x-json-schemas").version
+release = "" # The full version, including alpha/beta/rc tags
+
+extensions = [
+ "sphinx.ext.autodoc",
+ "sphinx.ext.doctest",
+ "sphinx.ext.intersphinx",
+ "sphinx.ext.coverage",
+ "sphinx.ext.viewcode",
+]
+
+templates_path = ["doc_templates"]
+
+source_suffix = ".rst"
+# eg: source_suffix = [".rst", ".md"]
+
+master_doc = "index" # The master toctree document.
+
+language = None
+
+exclude_patterns: List[str] = []
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = None
+
+html_theme = "alabaster"
+
+html_static_path = ["doc_static"]
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = "json_schemaspydoc"
+
+# -- Extension configuration:
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {"https://docs.python.org/": None}
diff --git a/python-packages/json_schemas/src/doc_static/.gitkeep b/python-packages/json_schemas/src/doc_static/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/python-packages/json_schemas/src/doc_static/.gitkeep
diff --git a/python-packages/json_schemas/src/index.rst b/python-packages/json_schemas/src/index.rst
new file mode 100644
index 000000000..3de809aa3
--- /dev/null
+++ b/python-packages/json_schemas/src/index.rst
@@ -0,0 +1,18 @@
+.. source for the sphinx-generated build/docs/web/index.html
+
+Python zero_ex.json_schemas
+===========================
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents:
+
+.. automodule:: zero_ex.json_schemas
+ :members:
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/python-packages/json_schemas/src/zero_ex/__init__.py b/python-packages/json_schemas/src/zero_ex/__init__.py
new file mode 100644
index 000000000..e90d833db
--- /dev/null
+++ b/python-packages/json_schemas/src/zero_ex/__init__.py
@@ -0,0 +1,2 @@
+"""0x Python API."""
+__import__("pkg_resources").declare_namespace(__name__)
diff --git a/python-packages/json_schemas/src/zero_ex/json_schemas/__init__.py b/python-packages/json_schemas/src/zero_ex/json_schemas/__init__.py
new file mode 100644
index 000000000..10c564b99
--- /dev/null
+++ b/python-packages/json_schemas/src/zero_ex/json_schemas/__init__.py
@@ -0,0 +1,83 @@
+"""JSON schemas and associated utilities."""
+
+from os import path
+import json
+from typing import Mapping
+
+from pkg_resources import resource_string
+import jsonschema
+from stringcase import snakecase
+
+
+class _LocalRefResolver(jsonschema.RefResolver):
+ """Resolve package-local JSON schema id's."""
+
+ def __init__(self):
+ """Initialize a new instance."""
+ jsonschema.RefResolver.__init__(self, "", "")
+
+ @staticmethod
+ def resolve_from_url(url: str) -> str:
+ """Resolve the given URL.
+
+ :param url: a string representing the URL of the JSON schema to fetch.
+ :returns: a string representing the deserialized JSON schema
+ :raises jsonschema.ValidationError: when the resource associated with
+ `url` does not exist.
+ """
+ ref = url.replace("file://", "")
+ return json.loads(
+ resource_string(
+ "zero_ex.json_schemas",
+ f"schemas/{snakecase(ref.lstrip('/'))}.json",
+ )
+ )
+
+
+# Instantiate the `_LocalRefResolver()` only once so that `assert_valid()` can
+# perform multiple schema validations without reading from disk the schema
+# every time.
+_LOCAL_RESOLVER = _LocalRefResolver()
+
+
+def assert_valid(data: Mapping, schema_id: str) -> None:
+ """Validate the given `data` against the specified `schema`.
+
+ :param data: Python dictionary to be validated as a JSON object.
+ :param schema_id: id property of the JSON schema to validate against. Must
+ be one of those listed in `the 0x JSON schema files
+ <https://github.com/0xProject/0x-monorepo/tree/development/packages/json-schemas/schemas>`_.
+
+ Raises an exception if validation fails.
+
+ >>> assert_valid(
+ ... {'v': 27, 'r': '0x'+'f'*64, 's': '0x'+'f'*64},
+ ... '/ecSignatureSchema',
+ ... )
+ """
+ # noqa
+
+ _, schema = _LOCAL_RESOLVER.resolve(schema_id)
+ jsonschema.validate(data, schema, resolver=_LOCAL_RESOLVER)
+
+
+def assert_valid_json(data: str, schema_id: str) -> None:
+ """Validate the given `data` against the specified `schema`.
+
+ :param data: JSON string to be validated.
+ :param schema_id: id property of the JSON schema to validate against. Must
+ be one of those listed in `the 0x JSON schema files
+ <https://github.com/0xProject/0x-monorepo/tree/development/packages/json-schemas/schemas>`_.
+
+ Raises an exception if validation fails.
+
+ >>> assert_valid_json(
+ ... r'''{
+ ... "v": 27,
+ ... "r": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ ... "s": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ ... }''',
+ ... '/ecSignatureSchema',
+ ... )
+ """ # noqa: E501 (line too long)
+ assert_valid(json.loads(data), schema_id)
diff --git a/python-packages/json_schemas/src/zero_ex/json_schemas/py.typed b/python-packages/json_schemas/src/zero_ex/json_schemas/py.typed
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/python-packages/json_schemas/src/zero_ex/json_schemas/py.typed
diff --git a/python-packages/json_schemas/src/zero_ex/json_schemas/schemas b/python-packages/json_schemas/src/zero_ex/json_schemas/schemas
new file mode 120000
index 000000000..b8257372c
--- /dev/null
+++ b/python-packages/json_schemas/src/zero_ex/json_schemas/schemas
@@ -0,0 +1 @@
+../../../../../packages/json-schemas/schemas/ \ No newline at end of file