Skip to content

Commit

Permalink
ProfileBuilder: Add embed argument to release_package_schema and reco…
Browse files Browse the repository at this point in the history
…rd_package_schema, closes #27
  • Loading branch information
jpmckinney committed Jul 22, 2020
1 parent 4facb9f commit 789db8a
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 13 deletions.
9 changes: 5 additions & 4 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ Changelog

- The ``extension_versions`` argument to :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.__init__` can be a list of extensions' local directories.
- :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.__init__`: Add a ``standard_base_url`` argument, which can be a ``file://`` URL to the standard's directory.
- :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.release_package_schema`: Add a ``embed`` argument to indicate whether to embed the patched release schema in the release package schema, which a JSON Schema validator can then use.
- Add :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.record_package_schema` method, to match :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.release_package_schema`.

- :class:`~ocdsextensionregistry.extension_version.ExtensionVersion`:

- Remove :meth:`~ocdsextensionregistry.extension_version.ExtensionVersion.available_in_bulk` method.
- Remove :meth:`~ocdsextensionregistry.extension_version.ExtensionVersion.directory` property (overload ``download_url`` instead).

- Add a ``standard_base_url`` parameter to :meth:`ocdsextensionregistry.api.build_profile` to modify the standard base URL.
- Add a ``standard_base_url`` argument to :meth:`ocdsextensionregistry.api.build_profile` to modify the standard base URL.

0.0.20 (2020-06-08)
~~~~~~~~~~~~~~~~~~~
Expand Down Expand Up @@ -53,7 +54,7 @@ Changelog
0.0.15 (2019-09-30)
~~~~~~~~~~~~~~~~~~~

- Add a ``update_codelist_urls`` parameter to :meth:`ocdsextensionregistry.api.build_profile` to modify codelist reference URLs.
- Add a ``update_codelist_urls`` argument to :meth:`ocdsextensionregistry.api.build_profile` to modify codelist reference URLs.

0.0.14 (2019-09-18)
~~~~~~~~~~~~~~~~~~~
Expand All @@ -63,13 +64,13 @@ Changelog
0.0.13 (2019-08-29)
~~~~~~~~~~~~~~~~~~~

- :class:`~ocdsextensionregistry.profile_builder.ProfileBuilder`: Add a ``schema`` parameter to :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.patched_release_schema` and :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.release_package_schema` methods to override the release schema or release package schema.
- :class:`~ocdsextensionregistry.profile_builder.ProfileBuilder`: Add a ``schema`` argument to :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.patched_release_schema` and :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.release_package_schema` methods to override the release schema or release package schema.

0.0.12 (2019-08-29)
~~~~~~~~~~~~~~~~~~~

- :class:`~ocdsextensionregistry.profile_builder.ProfileBuilder`: Unregistered extensions are now supported by the profile builder. The ``extension_versions`` argument to :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.__init__` can be a list of extensions' metadata URLs, base URLs and/or download URLs.
- :class:`~ocdsextensionregistry.profile_builder.ProfileBuilder`: Add an ``extension_field`` parameter to :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.release_schema_patch` and :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.patched_release_schema` methods to annotate all definitions and properties with extension names.
- :class:`~ocdsextensionregistry.profile_builder.ProfileBuilder`: Add an ``extension_field`` argument to :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.release_schema_patch` and :meth:`~ocdsextensionregistry.profile_builder.ProfileBuilder.patched_release_schema` methods to annotate all definitions and properties with extension names.
- Add :meth:`ocdsextensionregistry.utils.get_latest_version`, to return the identifier of the latest version from a list of versions of the same extension.

0.0.11 (2019-06-26)
Expand Down
35 changes: 26 additions & 9 deletions ocdsextensionregistry/profile_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
from urllib.parse import urljoin, urlparse

import json_merge_patch
from jsonref import JsonRef

from .codelist import Codelist
from .extension_registry import ExtensionRegistry
Expand Down Expand Up @@ -143,36 +144,52 @@ def patched_release_schema(self, schema=None, extension_field=None):

return schema

def release_package_schema(self, schema=None):
def _dereferenced_patched_release_schema(self):
return JsonRef.replace_refs(self.patched_release_schema())

def release_package_schema(self, schema=None, embed=False):
"""
Returns a release package schema. If `schema_base_url` was provided, updates schema URLs.
Returns a release package schema. If the profile builder was initialized with ``schema_base_url``, updates
schema URLs.
:param dict schema: the release schema
:param bool embed: whether to embed or ``$ref``erence the patched release schema
"""
if not schema:
schema = json.loads(self.get_standard_file_contents('release-package-schema.json'))

if self.schema_base_url:
url = urljoin(self.schema_base_url, 'release-schema.json')
schema['id'] = urljoin(self.schema_base_url, 'release-package-schema.json')
schema['properties']['releases']['items']['$ref'] = url
if embed:
patched = self._dereferenced_patched_release_schema()
schema['properties']['releases']['items'] = patched
else:
url = urljoin(self.schema_base_url, 'release-schema.json')
schema['properties']['releases']['items']['$ref'] = url

return schema

def record_package_schema(self, schema=None):
def record_package_schema(self, schema=None, embed=False):
"""
Returns a record package schema. If `schema_base_url` was provided, updates schema URLs.
Returns a record package schema. If the profile builder was initialized with ``schema_base_url``, updates
schema URLs.
:param dict schema: the record schema
:param bool embed: whether to embed or ``$ref``erence the patched release schema
"""
if not schema:
schema = json.loads(self.get_standard_file_contents('record-package-schema.json'))

if self.schema_base_url:
url = urljoin(self.schema_base_url, 'release-schema.json')
schema['id'] = urljoin(self.schema_base_url, 'record-package-schema.json')
schema['definitions']['record']['properties']['compiledRelease']['$ref'] = url
schema['definitions']['record']['properties']['releases']['oneOf'][1]['items']['$ref'] = url
if embed:
patched = self._dereferenced_patched_release_schema()
schema['definitions']['record']['properties']['compiledRelease'] = patched
schema['definitions']['record']['properties']['releases']['oneOf'][1]['items'] = patched
else:
url = urljoin(self.schema_base_url, 'release-schema.json')
schema['definitions']['record']['properties']['compiledRelease']['$ref'] = url
schema['definitions']['record']['properties']['releases']['oneOf'][1]['items']['$ref'] = url

return schema

Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
long_description=long_description,
install_requires=[
'json-merge-patch',
'jsonref',
'requests',
'requests-cache',
],
Expand Down
24 changes: 24 additions & 0 deletions tests/test_profile_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,17 @@ def test_release_package_schema_with_schema_base_url():
assert result['properties']['releases']['items']['$ref'] == 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/release-schema.json' # noqa


def test_dereferened_release_package_schema_with_schema_base_url():
schema_base_url = 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/'
builder = ProfileBuilder('1__1__3', {}, schema_base_url=schema_base_url)
result = builder.release_package_schema(dereferenced=True)

# Changes `id` and `$ref`.
assert result['id'] == 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/release-package-schema.json' # noqa
assert result['properties']['releases']['items']['id'] == 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/release-schema.json' # noqa
assert '$ref' not in result['properties']['releases']['items']


def test_record_package_schema_with_schema_base_url():
schema_base_url = 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/'
builder = ProfileBuilder('1__1__3', {}, schema_base_url=schema_base_url)
Expand All @@ -168,6 +179,19 @@ def test_record_package_schema_with_schema_base_url():
assert result['definitions']['record']['properties']['releases']['oneOf'][1]['items']['$ref'] == 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/release-schema.json' # noqa


def test_dereferenced_record_package_schema_with_schema_base_url():
schema_base_url = 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/'
builder = ProfileBuilder('1__1__3', {}, schema_base_url=schema_base_url)
result = builder.record_package_schema(dereferenced=True)

# Changes `id` and `$ref`.
assert result['id'] == 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/record-package-schema.json' # noqa
assert result['definitions']['record']['properties']['compiledRelease']['id'] == 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/release-schema.json' # noqa
assert result['definitions']['record']['properties']['releases']['oneOf'][1]['items']['id'] == 'https://standard.open-contracting.org/profiles/ppp/schema/1__0__0__beta/release-schema.json' # noqa
assert '$ref' not in result['definitions']['record']['properties']['compiledRelease']
assert '$ref' not in result['definitions']['record']['properties']['releases']['oneOf'][1]['items']


def test_standard_codelists():
builder = ProfileBuilder('1__1__3', {})
result = builder.standard_codelists()
Expand Down

0 comments on commit 789db8a

Please sign in to comment.