Skip to content

Commit

Permalink
Feat client unit tests (#11)
Browse files Browse the repository at this point in the history
* docs: set line length to 88

* tests: adds test coverage
  • Loading branch information
jtyoung84 authored Jun 14, 2024
1 parent 3d0100c commit 06cc5cb
Show file tree
Hide file tree
Showing 17 changed files with 2,314 additions and 70 deletions.
1 change: 1 addition & 0 deletions .flake8
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ exclude =
__pycache__,
build
max-complexity = 10
max-line-length = 88
2 changes: 1 addition & 1 deletion .github/workflows/test_and_lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [ '3.8', '3.9', '3.10' ]
python-version: [ '3.10', '3.11', '3.12' ]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
Expand Down
7 changes: 5 additions & 2 deletions doc_template/source/conf.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
"""Configuration file for the Sphinx documentation builder."""

#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html

from datetime import date

# -- Path Setup --------------------------------------------------------------
from os.path import dirname, abspath
from os.path import abspath, dirname
from pathlib import Path
from datetime import date

from aind_slims_api import __version__ as package_version

INSTITUTE_NAME = "Allen Institute for Neural Dynamics"
Expand Down
8 changes: 4 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
name = "aind-slims-api"
description = "Generated from aind-library-template"
license = {text = "MIT"}
requires-python = ">=3.7"
requires-python = ">=3.10"
authors = [
{name = "Allen Institute for Neural Dynamics"}
]
Expand Down Expand Up @@ -40,8 +40,8 @@ where = ["src"]
version = {attr = "aind_slims_api.__version__"}

[tool.black]
line-length = 79
target_version = ['py36']
line-length = 88
target_version = ['py310']
exclude = '''
(
Expand Down Expand Up @@ -74,7 +74,7 @@ exclude_lines = [
fail_under = 100

[tool.isort]
line_length = 79
line_length = 88
profile = "black"

[tool.interrogate]
Expand Down
4 changes: 2 additions & 2 deletions src/aind_slims_api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

__version__ = "0.0.0"

from .configuration import AindSlimsApiSettings
from aind_slims_api.configuration import AindSlimsApiSettings

config = AindSlimsApiSettings()

from .core import SlimsClient # noqa
from aind_slims_api.core import SlimsClient # noqa
19 changes: 9 additions & 10 deletions src/aind_slims_api/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@
methods and integration with SlimsBaseModel subtypes
"""

from functools import lru_cache
import logging
from functools import lru_cache
from typing import Literal, Optional

from slims.slims import Slims, _SlimsApiException
from slims.internal import (
Record as SlimsRecord,
)
from slims.criteria import Criterion, conjunction, equals
from slims.internal import Record as SlimsRecord
from slims.slims import Slims, _SlimsApiException

from aind_slims_api import config

Expand All @@ -41,7 +39,7 @@ class SlimsClient:
def __init__(self, url=None, username=None, password=None):
"""Create object and try to connect to database"""
self.url = url or config.slims_url
self.db: Slims = None
self.db: Optional[Slims] = None

self.connect(
self.url,
Expand Down Expand Up @@ -95,9 +93,10 @@ def fetch(
start=start,
end=end,
)
except _SlimsApiException:
raise
return None # TODO: Raise or return empty list?
except _SlimsApiException as e:
# TODO: Add better error handling
# Let's just raise error for the time being
raise e

return records

Expand All @@ -124,7 +123,7 @@ def update(self, table: SLIMSTABLES, pk: int, data: dict):
"""Update a SLIMS record"""
record = self.db.fetch_by_pk(table, pk)
if record is None:
raise ValueError('No data in SLIMS "{table}" table for pk "{pk}"')
raise ValueError(f'No data in SLIMS "{table}" table for pk "{pk}"')
new_record = record.update(data)
logger.info(f"SLIMS Update: {table}/{pk}")
return new_record
Expand Down
11 changes: 6 additions & 5 deletions src/aind_slims_api/mouse.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
"""Contains a model for the mouse content, and a method for fetching it"""

import logging
from typing import Optional

from .core import SlimsClient
from aind_slims_api.core import SlimsClient

logger = logging.getLogger()


def fetch_mouse_content(
client: SlimsClient,
mouse_name: str,
) -> dict:
) -> Optional[dict]:
"""Fetches mouse information for a mouse with labtracks id {mouse_name}"""
mice = client.fetch(
"Content",
Expand All @@ -23,10 +24,10 @@ def fetch_mouse_content(
if len(mice) > 1:
logger.warning(
f"Warning, Multiple mice in SLIMS with barcode "
f"{mouse_name}, using pk={mouse_details.cntn_pk}"
f"{mouse_name}, using pk={mouse_details.cntn_pk.value}"
)
else:
logger.warning("Warning, Mouse not in SLIMS")
return
mouse_details = None

return mouse_details
return None if mouse_details is None else mouse_details.json_entity
12 changes: 7 additions & 5 deletions src/aind_slims_api/user.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
"""Contains a model for a user, and a method for fetching it"""

import logging
from typing import Optional

from .core import SlimsClient
from aind_slims_api.core import SlimsClient

logger = logging.getLogger()


def fetch_user(
client: SlimsClient,
username: str,
) -> dict:
) -> Optional[dict]:
"""Fetches user information for a user with username {username}"""
users = client.fetch(
"User",
Expand All @@ -22,10 +23,11 @@ def fetch_user(
if len(users) > 1:
logger.warning(
f"Warning, Multiple users in SLIMS with "
f"username {users}, using pk={user_details.pk}"
f"username {[u.json_entity for u in users]}, "
f"using pk={user_details.pk()}"
)
else:
logger.warning("Warning, User not in SLIMS")
return
user_details = None

return user_details
return None if user_details is None else user_details.json_entity
Loading

0 comments on commit 06cc5cb

Please sign in to comment.