Skip to content

Commit

Permalink
Merge b112aeb into ee15610
Browse files Browse the repository at this point in the history
  • Loading branch information
crungehottman committed Feb 1, 2021
2 parents ee15610 + b112aeb commit 201dda5
Show file tree
Hide file tree
Showing 10 changed files with 140 additions and 40 deletions.
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
requests
5 changes: 3 additions & 2 deletions src/cdn_definitions/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from ._impl import PathAlias, origin_aliases, rhui_aliases
from ._impl import PathAlias, load_data
from ._impl.cdn_data import CdnData

__all__ = ["PathAlias", "origin_aliases", "rhui_aliases"]
__all__ = ["PathAlias", "load_data", "CdnData"]
58 changes: 24 additions & 34 deletions src/cdn_definitions/_impl/__init__.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
import json
import os


def load_data():
# Load data from first existing of these
candidate_paths = [
os.path.join(os.path.dirname(os.path.dirname(__file__)), "data.json"),
"/usr/share/cdn-definitions/data.json",
]

# If env var is set, it takes highest precedence
if "CDN_DEFINITIONS_PATH" in os.environ:
candidate_paths.insert(0, os.environ["CDN_DEFINITIONS_PATH"])

existing_paths = [p for p in candidate_paths if os.path.exists(p)]
return json.load(open(existing_paths[0]))


DATA = load_data()
import requests


def load_data(source=None):
if source is None:
# Load data from first existing of these
candidate_paths = [
os.path.join(os.path.dirname(os.path.dirname(__file__)), "data.json"),
"/usr/share/cdn-definitions/data.json",
]

# If env var is set, it takes highest precedence
if "CDN_DEFINITIONS_PATH" in os.environ:
cdn_definitions_path = os.environ["CDN_DEFINITIONS_PATH"]
candidate_paths.insert(0, cdn_definitions_path)
if cdn_definitions_path.startswith("http"):
return requests.get(cdn_definitions_path)
existing_paths = [p for p in candidate_paths if os.path.exists(p)]
return json.load(open(existing_paths[0]))
if os.path.exists(source):
return json.load(open(source))
if source.startswith("http"):
return requests.get(source)
raise RuntimeError("Could not load data")


class PathAlias(object):
Expand All @@ -39,19 +45,3 @@ def __init__(self, **kwargs):
# Equal src/dest is nonsensical
if self.src == self.dest:
raise ValueError("%s cannot alias itself!" % self.src)


def rhui_aliases():
"""Returns:
list[:class:`~PathAlias`]
A list of aliases relating to RHUI paths.
"""
return [PathAlias(**elem) for elem in DATA["rhui_alias"]]


def origin_aliases():
"""Returns:
list[:class:`~PathAlias`]
A list of aliases relating to origin paths.
"""
return [PathAlias(**elem) for elem in DATA["origin_alias"]]
26 changes: 26 additions & 0 deletions src/cdn_definitions/_impl/cdn_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from . import load_data, PathAlias


class CdnData(object):
def __init__(self, source=None):
self._source = source
self._data = None

def data(self):
if not self._data:
self._data = load_data(self._source)
return self._data

def rhui_aliases(self):
"""Returns:
list[:class:`~PathAlias`]
A list of aliases relating to RHUI paths.
"""
return [PathAlias(**elem) for elem in self.data()["rhui_alias"]]

def origin_aliases(self):
"""Returns:
list[:class:`~PathAlias`]
A list of aliases relating to origin paths.
"""
return [PathAlias(**elem) for elem in self.data()["origin_alias"]]
14 changes: 14 additions & 0 deletions src/cdn_definitions/api/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import os
import json
from .. import load_data


def schema():
with open(
os.path.join(os.path.dirname(os.path.dirname(__file__)), "schema.json")
) as f:
return json.load(f)


def data(source=None):
return load_data(source)
1 change: 1 addition & 0 deletions test-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pytest
jsonschema
PyYAML
mock
8 changes: 5 additions & 3 deletions tests/test_alias.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import pytest

from cdn_definitions import PathAlias, origin_aliases, rhui_aliases
from cdn_definitions import PathAlias, CdnData


def test_rhui_sanity():
"""rhui_aliases must exist with expected properties"""
paths = rhui_aliases()
data = CdnData()
paths = data.rhui_aliases()

# There should be some items
assert paths
Expand All @@ -18,7 +19,8 @@ def test_rhui_sanity():

def test_origin_sanity():
"""origin_aliases must exist with expected properties"""
paths = origin_aliases()
data = CdnData()
paths = data.origin_aliases()

# There should be some items
assert paths
Expand Down
25 changes: 25 additions & 0 deletions tests/test_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import json
import os

from cdn_definitions import api


def test_load_schema_api():
schema = api.schema()
with open(
os.path.join(
os.path.dirname(os.path.dirname(__file__)),
"src",
"cdn_definitions",
"schema.json",
)
) as f:
local_schema = json.load(f)
assert schema == local_schema


def test_load_data_api(tmpdir):
json_file = tmpdir.join("myfile.json")
json_file.write('{"hello": "world"}')
data = api.data(source=str(json_file))
assert data == {"hello": "world"}
35 changes: 35 additions & 0 deletions tests/test_load.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
from cdn_definitions._impl import load_data
from mock import patch
import pytest
import requests


def test_can_load_custom_data(monkeypatch, tmpdir):
Expand All @@ -11,3 +14,35 @@ def test_can_load_custom_data(monkeypatch, tmpdir):
data = load_data()

assert data == {"hello": "world"}


def test_can_load_custom_data_from_source(monkeypatch, tmpdir):
json_file = tmpdir.join("myfile.json")
json_file.write('{"hello": "world"}')

# If we set an env var pointing at the above JSON file, the library
# should load it instead of the bundled data
data = load_data(source=str(json_file))

assert data == {"hello": "world"}


def test_can_load_url_from_env_var(monkeypatch):
with patch("cdn_definitions._impl.requests.get") as r:
r.return_value = {"hello": "world"}
monkeypatch.setenv("CDN_DEFINITIONS_PATH", "https://example")
data = load_data()
assert data == {"hello": "world"}


def test_can_load_url_from_source_arg(monkeypatch):
with patch("cdn_definitions._impl.requests.get") as r:
r.return_value = {"hello": "world"}
data = load_data("https://example.com")

assert data == {"hello": "world"}


def test_invalid_source(monkeypatch, tmpdir):
with pytest.raises(RuntimeError, match="Could not load data"):
data = load_data(source="test")
7 changes: 6 additions & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@
envlist = py27,py38,static,docs

[testenv]
deps=-rtest-requirements.txt
deps=
-rrequirements.txt
-rtest-requirements.txt
commands=pytest -v {posargs}
whitelist_externals=sh

[testenv:static]
deps=
-rrequirements.txt
-rtest-requirements.txt
black
pylint
Expand All @@ -17,6 +20,7 @@ commands=

[testenv:cov]
deps=
-rrequirements.txt
-rtest-requirements.txt
pytest-cov
usedevelop=true
Expand All @@ -26,6 +30,7 @@ commands=
[testenv:cov-travis]
passenv = TRAVIS TRAVIS_*
deps=
-rrequirements.txt
-rtest-requirements.txt
pytest-cov
coveralls
Expand Down

0 comments on commit 201dda5

Please sign in to comment.