Skip to content

Commit

Permalink
Merge branch 'release-1.0.0' into api-docs
Browse files Browse the repository at this point in the history
  • Loading branch information
lbeckman314 authored Jan 9, 2024
2 parents e2e8f13 + 93ad675 commit d4caff7
Show file tree
Hide file tree
Showing 9 changed files with 516 additions and 180 deletions.
7 changes: 6 additions & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,9 @@ jobs:
run: flake8 --max-line-length=120 .

- name: Run unit tests
run: coverage run --source tes -m pytest -W ignore::DeprecationWarning
run: |
pytest \
--cov=tes/ \
--cov-branch \
--cov-report=term-missing \
--cov-fail-under=99
6 changes: 3 additions & 3 deletions tes/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,7 @@ def check_success(data: Task) -> bool:
time.sleep(0.5)

def _request_params(
self, data: Optional[str] = None,
params: Optional[Dict] = None
self, data: Optional[str] = None, params: Optional[Dict] = None
) -> Dict[str, Any]:
"""Compile request parameters.
Expand All @@ -263,7 +262,8 @@ def _request_params(
kwargs['timeout'] = self.timeout
kwargs['headers'] = {}
kwargs['headers']['Content-type'] = 'application/json'
kwargs['auth'] = (self.user, self.password)
if self.user is not None and self.password is not None:
kwargs['auth'] = (self.user, self.password)
if data:
kwargs['data'] = data
if params:
Expand Down
23 changes: 12 additions & 11 deletions tes/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,20 @@
from typing import Any, Dict, List, Optional, Tuple, Type, Union


@attrs
@attrs(repr=False)
class _ListOfValidator(object):
"""`attrs` validator class for lists."""

type: Type = attrib()

def __call__(self, inst, attr, value):
"""We use a callable class to be able to change the ``__repr__``."""
def __call__(self, inst, attr, value) -> None:
"""We use a callable class to be able to change the ``__repr__``."""
if not all([isinstance(n, self.type) for n in value]):
raise TypeError(
"'{attr.name}' must be a list of {self.type!r} (got {value!r} "
"that is a list of {values[0].__class__!r}).",
attr, self.type, value,
f"'{attr.name}' must be a list of {self.type!r} (got "
f"{value!r}", attr
)

def __repr__(self) -> str:
Expand Down Expand Up @@ -109,9 +110,9 @@ def timestampconv(value: Optional[str]) -> Optional[datetime]:
Returns:
Converted value.
"""
if value is not None:
return dateutil.parser.parse(value)
return value
if value is None:
return value
return dateutil.parser.parse(value)


def datetime_json_handler(x: Any) -> str:
Expand Down Expand Up @@ -372,7 +373,7 @@ def is_valid(self) -> Tuple[bool, Union[None, TypeError]]:
for e in self.executors:
if e.image is None:
errs.append("Executor image must be provided")
if len(e.command) == 0:
if e.command is None or len(e.command) == 0:
errs.append("Executor command must be provided")
if e.stdin is not None:
if not os.path.isabs(e.stdin):
Expand All @@ -384,8 +385,8 @@ def is_valid(self) -> Tuple[bool, Union[None, TypeError]]:
if not os.path.isabs(e.stderr):
errs.append("Executor stderr must be an absolute path")
if e.env is not None:
for k, v in e.env:
if not isinstance(k, str) and not isinstance(k, str):
for k, v in e.env.items():
if not isinstance(k, str) and not isinstance(v, str):
errs.append(
"Executor env keys and values must be StrType"
)
Expand Down Expand Up @@ -417,7 +418,7 @@ def is_valid(self) -> Tuple[bool, Union[None, TypeError]]:
errs.append("Volume paths must be absolute")

if self.tags is not None:
for k, v in self.tags:
for k, v in self.tags.items():
if not isinstance(k, str) and not isinstance(k, str):
errs.append(
"Tag keys and values must be StrType"
Expand Down
26 changes: 12 additions & 14 deletions tes/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,20 @@ def unmarshal(j: Any, o: Type, convert_camel_case=True) -> Any:
Raises:
UnmarshalError: If `j` cannot be unmarshalled to `o`.
"""
m: Any = None
if isinstance(j, str):
m = json.loads(j)
elif isinstance(j, dict):
m = j
try:
m = json.loads(j)
except json.decoder.JSONDecodeError:
pass
elif j is None:
return None
else:
raise TypeError("j must be a str, a dict or None")
m = j

if not isinstance(m, dict):
raise TypeError("j must be a dictionary, a JSON string evaluation to "
"a dictionary, or None")

d: Dict[str, Any] = {}
if convert_camel_case:
Expand Down Expand Up @@ -101,16 +107,8 @@ def _unmarshal(v: Any, obj: Type) -> Any:
field = v
omap = fullOmap.get(o.__name__, {})
if k in omap:
if isinstance(omap[k], tuple):
try:
obj = omap[k][0]
field = _unmarshal(v, obj)
except Exception:
obj = omap[k][1]
field = _unmarshal(v, obj)
else:
obj = omap[k]
field = _unmarshal(v, obj)
obj = omap[k]
field = _unmarshal(v, obj)
r[k] = field

try:
Expand Down
Empty file added tests/__init__.py
Empty file.
1 change: 1 addition & 0 deletions tests/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ coverage>=6.5.0
coveralls>=3.3.1
flake8>=5.0.4
pytest>=7.2.1
pytest-cov>=4.0.0
requests_mock>=1.10.0
Loading

0 comments on commit d4caff7

Please sign in to comment.