Skip to content

Commit

Permalink
Speed up language def loading.
Browse files Browse the repository at this point in the history
  • Loading branch information
jzohrab committed Dec 8, 2024
1 parent 5ff5db7 commit 0f69c23
Showing 1 changed file with 57 additions and 33 deletions.
90 changes: 57 additions & 33 deletions lute/language/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,49 +8,79 @@
from lute.book.model import Book, Repository


class Service:
"Service."
class LangDef:
"Language, built from language definition.yml, and .txt book files."

def __init__(self, session):
self.session = session
def __init__(self, directory):
"Build from files."
self.language = self._load_lang_def(directory)
self.books = self._get_books(directory, self.language.name)

def get_supported_defs(self):
"Return supported language definitions."
ret = []
def_glob = os.path.join(self._language_defs_path(), "**", "definition.yaml")
for f in glob(def_glob):
lang = None
with open(f, "r", encoding="utf-8") as df:
d = yaml.safe_load(df)
lang = Language.from_dict(d)
if lang.is_supported:
entry = {"language": lang, "books": self._get_books(f, lang.name)}
ret.append(entry)
ret.sort(key=lambda x: x["language"].name)
return ret
def _load_lang_def(self, directory):
"Load from file, must exist."
def_file = os.path.join(directory, "definition.yaml")
with open(def_file, "r", encoding="utf-8") as df:
d = yaml.safe_load(df)
return Language.from_dict(d)

def predefined_languages(self):
"Languages defined in yaml files."
return [d["language"] for d in self.get_supported_defs()]

def _get_books(self, lang_definition_filename, lang_name):
"Get the stories in the same directory as the definition.yaml."
def _get_books(self, directory, language_name):
"Get the stories."
books = []
d, f = os.path.split(lang_definition_filename)
story_glob = os.path.join(d, "*.txt")
story_glob = os.path.join(directory, "*.txt")
for filename in glob(story_glob):
with open(filename, "r", encoding="utf-8") as f:
content = f.read()
title_match = re.search(r"title:\s*(.*)\n", content)
title = title_match.group(1).strip()
content = re.sub(r"#.*\n", "", content)
b = Book()
b.language_name = lang_name
b.language_name = language_name
b.title = title
b.text = content
books.append(b)
return books


class Service:
"Service."

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

def _language_defs_path(self):
"Path to the definitions and stories."
thisdir = os.path.dirname(__file__)
d = os.path.join(thisdir, "..", "db", "language_defs")
return os.path.abspath(d)

def _load_lang_defs_cache(self):
"Cache Languages build from lang defs."
if self.language_from_lang_defs_cache is not None:
return
cache = {}
def_glob = os.path.join(self._language_defs_path(), "**", "definition.yaml")
for f in glob(def_glob):
lang_dir, def_yaml = os.path.split(f)
ld = LangDef(lang_dir)
cache[ld.language.name] = ld
self.language_from_lang_defs_cache = cache

def get_supported_defs(self):
"Return supported language definitions."
self._load_lang_defs_cache()
ret = [
{"language": ld.language, "books": ld.books}
for _, ld in self.language_from_lang_defs_cache.items()
if ld.language.is_supported
]
ret.sort(key=lambda x: x["language"].name)
return ret

def predefined_languages(self):
"Languages defined in yaml files."
return [d["language"] for d in self.get_supported_defs()]

def get_language_def(self, lang_name):
"Get a lang def and its stories."
defs = self.get_supported_defs()
Expand All @@ -72,9 +102,3 @@ def load_language_def(self, lang_name):
r.commit()

return lang.id

def _language_defs_path(self):
"Path to the definitions and stories."
thisdir = os.path.dirname(__file__)
d = os.path.join(thisdir, "..", "db", "language_defs")
return os.path.abspath(d)

0 comments on commit 0f69c23

Please sign in to comment.