Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add docstring enforcement #67

Merged
merged 1 commit into from
Dec 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/python-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
run: |
hatch run typing:test
hatch run lint:style
pipx run 'validate-pyproject[all]' pyproject.toml
pipx run interrogate -v .

test_minimum_versions:
name: Test Minimum Versions
Expand Down
12 changes: 6 additions & 6 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: end-of-file-fixer
- id: check-case-conflict
- id: check-ast
- id: check-docstring-first
- id: check-executables-have-shebangs
- id: requirements-txt-fixer
- id: check-added-large-files
- id: check-case-conflict
- id: check-merge-conflict
- id: check-json
- id: check-toml
- id: check-yaml
- id: debug-statements
- id: forbid-new-submodules
- id: check-builtin-literals
- id: end-of-file-fixer
- id: trailing-whitespace

- repo: https://github.com/python-jsonschema/check-jsonschema
Expand All @@ -36,7 +36,7 @@ repos:
- id: black

- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: v0.0.165
rev: v0.0.189
hooks:
- id: ruff
args: ["--fix"]
1 change: 1 addition & 0 deletions jupyter_server_synchronizer/gateway.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
"""Gateway utils."""
from jupyter_server.gateway.gateway_client import gateway_request
from tornado.escape import json_decode

Expand Down
7 changes: 7 additions & 0 deletions jupyter_server_synchronizer/kernel_db.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
"""Kernel database managment."""
import pathlib
import sqlite3
from typing import Any, List
Expand Down Expand Up @@ -89,6 +90,7 @@ def query(self, query_string: str, **identifiers: Any) -> None:
raise Exception(err_message)

def save(self, record: KernelRecord) -> None:
"""Save a record."""
fields = {k: v for k, v in record.get_active_fields().items() if k in self._table_columns}
columns = ",".join(fields.keys())
values_tuple = tuple(fields.values())
Expand All @@ -110,6 +112,7 @@ def exists(self, **identifier: Any) -> bool:
return False

def update(self, record: KernelRecord) -> None:
"""Update a record."""
found = False
for record_field in record.get_identifier_fields():
record_id = getattr(record, record_field)
Expand All @@ -134,18 +137,22 @@ def update(self, record: KernelRecord) -> None:
self.cursor.execute(x)

def delete(self, **identifier: Any) -> None:
"""Delete a record."""
self.query("DELETE FROM {table} WHERE {0}=?", **identifier)

def row_to_record(self, row: sqlite3.Row) -> KernelRecord:
"""Convert a row to a record."""
items = {field: row[field] for field in self._table_columns}
return self.kernel_record_class(**items) # type:ignore[no-any-return]

def list(self) -> List[KernelRecord]: # noqa
"""List all records."""
self.cursor.execute(f"SELECT * FROM {self._table_name}")
rows = self.cursor.fetchall()
return [self.row_to_record(row) for row in rows]

def get(self, **identifier: Any) -> KernelRecord:
"""Get a record."""
self.query("SELECT * FROM {table} WHERE {0}=?", **identifier)
row = self.cursor.fetchone()
if not row:
Expand Down
6 changes: 6 additions & 0 deletions jupyter_server_synchronizer/kernel_records.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
"""Kernel records management."""
from dataclasses import dataclass, fields
from typing import List, Union

Expand Down Expand Up @@ -32,6 +33,7 @@ class KernelRecord:

@classmethod
def fields(cls):
"""Get the fields."""
return [f.name for f in fields(cls)]

@classmethod
Expand Down Expand Up @@ -132,11 +134,13 @@ class KernelRecordList:
"""

def __init__(self, *records):
"""Initialize the record list."""
self._records: List[KernelRecord] = []
for record in records:
self.update(record)

def __str__(self):
"""Str repr of the record list."""
return str(self._records)

def __contains__(self, record: Union[KernelRecord, str]) -> bool:
Expand All @@ -151,9 +155,11 @@ def __contains__(self, record: Union[KernelRecord, str]) -> bool:
return False

def __len__(self):
"""Length of the record list."""
return len(self._records)

def get(self, record: Union[KernelRecord, str]) -> KernelRecord:
"""get a record."""
if isinstance(record, str):
for r in self._records:
if record in r.get_identifier_values():
Expand Down
5 changes: 4 additions & 1 deletion jupyter_server_synchronizer/manager.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
"""A Jupyter Server Session Manager that rehydrates sessions/kernels on server restart."""
import asyncio
import uuid

Expand Down Expand Up @@ -36,6 +37,7 @@ class SynchronizerSessionManager(SessionManager):
kernel_table = Instance(klass=KernelTable)

def __init__(self, *args, **kwargs):
"""Initialize the manager."""
super().__init__(*args, **kwargs)
self._pending_sessions = KernelSessionRecordList()
self.kernel_table = self.kernel_table_class(
Expand All @@ -56,7 +58,7 @@ def _default_kernel_remote_table(self): # pragma: no cover
).tag(config=True)

@default("fetch_running_kernels")
def default_fetch_running_kernels(self):
def _default_fetch_running_kernels(self):
return fetch_gateway_kernels

def fetch_recorded_kernels(self) -> None:
Expand Down Expand Up @@ -222,6 +224,7 @@ async def sync_managers(self):
await self.sync_sessions()

async def list_sessions(self):
"""List the sessions."""
# Run the synchronizer loop
try:
await self.sync_managers()
Expand Down
3 changes: 3 additions & 0 deletions jupyter_server_synchronizer/traits.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
"""Trait utils."""
import inspect

from traitlets import TraitType


class Awaitable(TraitType):
"""An awaitable object trait."""

info_text = "an awaitable"

def validate(self, obj, value):
"""Validate the object"""
if not inspect.iscoroutinefunction(value) and not inspect.isawaitable(value):
raise self.error(obj, value)
return value
28 changes: 19 additions & 9 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,6 @@ test = [
"pytest-jupyter[server]>=0.4.1",
"pytest>=7.0",
]
lint = [
"black[jupyter]>=22.6.0",
"mdformat>0.7",
"mdformat-gfm>=0.3.5",
"ruff>=0.0.156"
]
typing = ["mypy>=0.990"]

[tool.hatch.version]
path = "jupyter_server_synchronizer/_version.py"
Expand All @@ -73,12 +66,19 @@ test = "python -m pytest -vv --cov jupyter_server_synchronizer --cov-branch --co
nowarn = "test -W default {args}"

[tool.hatch.envs.typing]
features = ["typing", "test"]
features = ["test"]
dependencies = ["mypy>=0.990"]
[tool.hatch.envs.typing.scripts]
test = "mypy --install-types --non-interactive {args:jupyter_server_synchronizer tests}"

[tool.hatch.envs.lint]
features = ["lint"]
dependencies = [
"black[jupyter]==22.10.0",
"mdformat>0.7",
"mdformat-gfm>=0.3.5",
"ruff==0.0.189"
]
detached = true
[tool.hatch.envs.lint.scripts]
style = [
"ruff {args:.}",
Expand Down Expand Up @@ -157,3 +157,13 @@ unfixable = [
[tool.ruff.per-file-ignores]
# S101 Use of `assert` detected
"tests/*" = ["S101"]

[tool.interrogate]
ignore-init-module=true
ignore-private=true
ignore-semiprivate=true
ignore-property-decorators=true
ignore-nested-functions=true
ignore-nested-classes=true
fail-under=100
exclude = ["tests"]