Skip to content

Commit

Permalink
Add type annotations to ORM methods
Browse files Browse the repository at this point in the history
  • Loading branch information
jacebrowning committed May 12, 2019
1 parent 587aba4 commit 27d89ea
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 38 deletions.
64 changes: 35 additions & 29 deletions datafiles/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import os
from pathlib import Path
from typing import Any, Dict, Optional
from typing_extensions import Protocol

import log
from cached_property import cached_property
Expand All @@ -18,35 +19,6 @@
Missing = dataclasses._MISSING_TYPE


class Manager:
def __init__(self, cls):
self.model = cls

def all(self):
raise NotImplementedError

def get_or_none(self, *args, **kwargs):
original_manual = self.model.Meta.datafile_manual

self.model.Meta.datafile_manual = True
instance = self.model(*args, **kwargs)
self.model.Meta.datafile_manual = original_manual

if instance.datafile.exists:
instance.datafile._manual = original_manual
return instance

return None

def get_or_create(self, *args, **kwargs):
instance = self.model(*args, **kwargs)

if not instance.datafile.exists:
instance.datafile.save()

return instance


class Datafile:
def __init__(
self,
Expand Down Expand Up @@ -368,3 +340,37 @@ def _write(self, text: str):
log.debug('=' * len(message) + '\n\n' + (text or '<nothing>\n'))
self.path.parent.mkdir(parents=True, exist_ok=True)
self.path.write_text(text)


class HasDatafile(Protocol):

datafile: Datafile


class Manager:
def __init__(self, cls):
self.model = cls

def all(self):
raise NotImplementedError

def get_or_none(self, *args, **kwargs) -> Optional[HasDatafile]:
original_manual = self.model.Meta.datafile_manual

self.model.Meta.datafile_manual = True
instance = self.model(*args, **kwargs)
self.model.Meta.datafile_manual = original_manual

if instance.datafile.exists:
instance.datafile._manual = original_manual
return instance

return None

def get_or_create(self, *args, **kwargs) -> HasDatafile:
instance = self.model(*args, **kwargs)

if not instance.datafile.exists:
instance.datafile.save()

return instance
40 changes: 31 additions & 9 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ minilog = "^1.2.3"
classproperties = "~0.1.3"
cached_property = "^1.5"

# Typing
typing-extensions = "^3.7"

[tool.poetry.dev-dependencies]

# Formatters
Expand Down

0 comments on commit 27d89ea

Please sign in to comment.