Skip to content

Commit

Permalink
Add LanguageRepository.
Browse files Browse the repository at this point in the history
  • Loading branch information
jzohrab committed Oct 30, 2024
1 parent 32cebc7 commit 2bececf
Show file tree
Hide file tree
Showing 8 changed files with 49 additions and 28 deletions.
7 changes: 4 additions & 3 deletions lute/book/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"""

from lute.models.book import Book as DBBook, BookTag, BookTagRepository, BookRepository
from lute.models.language import Language
from lute.models.language import LanguageRepository


class Book: # pylint: disable=too-many-instance-attributes
Expand Down Expand Up @@ -91,11 +91,12 @@ def commit(self):
def _build_db_book(self, book):
"Convert a book business object to a DBBook."

lang_repo = LanguageRepository(self.session)
lang = None
if book.language_id:
lang = Language.find(book.language_id)
lang = lang_repo.find(book.language_id)
elif book.language_name:
lang = Language.find_by_name(book.language_name)
lang = lang_repo.find_by_name(book.language_name)

b = None
if book.id is None:
Expand Down
5 changes: 3 additions & 2 deletions lute/book/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import lute.utils.formutils
from lute.db import db

from lute.models.language import Language
from lute.models.language import Language, LanguageRepository
from lute.models.book import BookRepository
from lute.models.setting import UserSetting
from lute.book.model import Book, Repository
Expand Down Expand Up @@ -147,7 +147,8 @@ def edit(bookid):
flash(f"{b.title} updated.")
return redirect("/", 302)

lang = Language.find(b.language_id)
lang_repo = LanguageRepository(db.session)
lang = lang_repo.find(b.language_id)
return render_template(
"book/edit.html",
book=b,
Expand Down
6 changes: 4 additions & 2 deletions lute/cli/import_books.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from lute.book.model import Book, Repository
from lute.db import db
from lute.models.language import Language
from lute.models.language import LanguageRepository


def import_books_from_csv(file, language, tags, commit):
Expand All @@ -27,6 +27,8 @@ def import_books_from_csv(file, language, tags, commit):
printed out, but no changes will be made.
"""
repo = Repository(db.session)
lang_repo = LanguageRepository(db.session)

count = 0
with open(file, newline="", encoding="utf-8") as f:
r = csv.DictReader(f)
Expand All @@ -37,7 +39,7 @@ def import_books_from_csv(file, language, tags, commit):
if not book.language_name:
print(f"Skipping book with unspecified language: {book.title}")
continue
lang = Language.find_by_name(book.language_name)
lang = lang_repo.find_by_name(book.language_name)
if not lang:
print(
f"Skipping book with unknown language ({book.language_name}): {book.title}"
Expand Down
29 changes: 20 additions & 9 deletions lute/models/language.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,20 +167,12 @@ def get_parsed_tokens(self, s):
def get_lowercase(self, s) -> str:
return self.parser.get_lowercase(s)

# TODO remove this!!!
@staticmethod
def find(language_id):
"Get by ID."
return db.session.query(Language).filter(Language.id == language_id).first()

@staticmethod
def find_by_name(name):
"Get by name."
return (
db.session.query(Language)
.filter(func.lower(Language.name) == func.lower(name))
.first()
)

def to_dict(self):
"Return dictionary of data, for serialization."
ret = {}
Expand Down Expand Up @@ -259,3 +251,22 @@ def load(key, method):
lang.dictionaries.append(ld)

return lang


class LanguageRepository:
"Repository."

def __init__(self, session):
self.session = session

def find(self, language_id):
"Get by ID."
return self.session.query(Language).filter(Language.id == language_id).first()

def find_by_name(self, name):
"Get by name."
return (
self.session.query(Language)
.filter(func.lower(Language.name) == func.lower(name))
.first()
)
2 changes: 1 addition & 1 deletion lute/read/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from lute.read.forms import TextForm
from lute.term.model import Repository
from lute.term.routes import handle_term_form
from lute.models.book import Book, Text, BookRepository
from lute.models.book import Text, BookRepository
from lute.models.setting import UserSetting
from lute.db import db

Expand Down
5 changes: 3 additions & 2 deletions lute/termimport/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from lute.db import db
from lute.models.term import Status
from lute.models.language import Language
from lute.models.language import LanguageRepository
from lute.term.model import Term, Repository


Expand Down Expand Up @@ -92,10 +92,11 @@ def _validate_data(import_data):

def _create_langs_dict(import_data):
"Create dictionary of language name to Language."
repo = LanguageRepository(db.session)
lang_dict = {}
langs = [hsh["language"].strip() for hsh in import_data]
for lang_name in list(set(langs)):
lang_dict[lang_name] = Language.find_by_name(lang_name)
lang_dict[lang_name] = repo.find_by_name(lang_name)
return lang_dict


Expand Down
7 changes: 4 additions & 3 deletions tests/features/test_term_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@

from pytest_bdd import given, when, then, scenarios, parsers

from lute.models.language import Language
from lute.db import db
from lute.models.language import Language, LanguageRepository
from lute.models.term import Term

from lute.termimport.service import import_file, BadImportFileError

from tests.dbasserts import assert_sql_result
Expand Down Expand Up @@ -110,7 +110,8 @@ def then_words_table_contains_WoTextLC(text_lc_content):

@then(parsers.parse('{language} term "{term}" should be:\n{expected}'))
def then_term_tags(language, term, expected):
lang = Language.find_by_name(language)
repo = LanguageRepository(db.session)
lang = repo.find_by_name(language)
spec = Term(lang, term)
t = Term.find_by_spec(spec)
pstring = ", ".join([p.text for p in t.parents])
Expand Down
16 changes: 10 additions & 6 deletions tests/unit/models/test_Language.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
Low value but ensure that the db mapping is correct.
"""

from lute.models.language import Language
from lute.db import db
from lute.models.language import Language, LanguageRepository
from tests.dbasserts import assert_sql_result


Expand Down Expand Up @@ -40,13 +41,14 @@ def test_can_find_lang_by_name(app_context):
"""
Returns lang if found, or None
"""
e = Language.find_by_name("English")
repo = LanguageRepository(db.session)
e = repo.find_by_name("English")
assert e.name == "English", "case match"

e_lc = Language.find_by_name("english")
e_lc = repo.find_by_name("english")
assert e_lc.name == "English", "case-insensitive"

nf = Language.find_by_name("notfound")
nf = repo.find_by_name("notfound")
assert nf is None, "not found"


Expand All @@ -61,7 +63,8 @@ def test_language_word_char_regex_returns_python_compatible_regex(app_context):
u0600-u06FFuFE70-uFEFC (where u = backslash-u)
"""
a = Language.find_by_name("Arabic")
repo = LanguageRepository(db.session)
a = repo.find_by_name("Arabic")
assert a.word_characters == r"\u0600-\u06FF\uFE70-\uFEFC"


Expand All @@ -71,7 +74,8 @@ def test_lang_to_dict_from_dict_returns_same_thing(app_context):
A dictionary is used as the intermediary form, so the
same language should return the same data.
"""
e = Language.find_by_name("English")
repo = LanguageRepository(db.session)
e = repo.find_by_name("English")
e_dict = e.to_dict()
e_from_dict = Language.from_dict(e_dict)
e_back_to_dict = e_from_dict.to_dict()
Expand Down

0 comments on commit 2bececf

Please sign in to comment.