From 794e6bf8fa89ed453d68bb9274ff0edfb4e2814a Mon Sep 17 00:00:00 2001 From: Daniel Tomlinson Date: Mon, 25 Oct 2021 04:24:28 +0100 Subject: [PATCH] adding latest --- TODO.todo | 2 + tembo/journal/pages.py | 124 +++++++++-------------------------------- 2 files changed, 29 insertions(+), 97 deletions(-) diff --git a/TODO.todo b/TODO.todo index cfa36ec..0f5c56b 100644 --- a/TODO.todo +++ b/TODO.todo @@ -46,3 +46,5 @@ Logging: ☐ ~/tembo/.templates ☐ ~/tembo/logs ☐ Document how to overwrite these with ENV vars + ☐ have a git repo with all the above already configured and walk user through + clone the repo, delete .git, git init, configure and add git origin diff --git a/tembo/journal/pages.py b/tembo/journal/pages.py index 98a8379..8609377 100644 --- a/tembo/journal/pages.py +++ b/tembo/journal/pages.py @@ -3,7 +3,7 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod import pathlib import re -from typing import Tuple, Literal +from typing import Tuple import jinja2 import pendulum @@ -69,9 +69,6 @@ class ScopedPageCreator(PageCreator): self.filename = "" self.extension = "" self._all_input_tokens: list[str] = [] - # TODO: rename these to input tokens + more sensible - self.path_input_token_counts = {"config": 0, "user": 0} - self.template_input_token_counts = {"config": 0, "user": 0} def create_page( self, @@ -88,10 +85,10 @@ class ScopedPageCreator(PageCreator): self.filename = filename self.extension = extension - # verify the user input matches the number of input tokens in the + # verify the user input length matches the number of input tokens in the # config/templates - self._all_input_tokens = self.__get_input_tokens(template_filename) - self.__verify_input_tokens(user_input) + self._all_input_tokens = self._get_input_tokens(template_filename) + self._verify_input_tokens(user_input) # get the path of the scoped page path = self._convert_to_path( @@ -100,7 +97,7 @@ class ScopedPageCreator(PageCreator): # substitute tokens in the filepath path = pathlib.Path( - self._substitute_tokens(str(path), user_input, name, "path") + self._substitute_tokens(str(path), user_input, name) ) # get the template file @@ -108,15 +105,14 @@ class ScopedPageCreator(PageCreator): # load the template file contents and substitute tokens template_contents = self._load_template(self.base_path, template_filename) template_contents = self._substitute_tokens( - template_contents, user_input, name, "template" + template_contents, user_input, name ) else: template_contents = "" - self.__check_input_token_mismatch() return ScopedPage(path, template_contents) - def __get_input_tokens(self, template_filename: str | None) -> list[str]: + def _get_input_tokens(self, template_filename: str | None) -> list[str]: path = str( pathlib.Path( self.base_path, self.page_path, self.filename, self.extension @@ -132,7 +128,7 @@ class ScopedPageCreator(PageCreator): all_input_tokens.extend(re.findall(r"(\{input\d*\})", tokenified_string)) return sorted(all_input_tokens) - def __verify_input_tokens(self, user_input: Tuple[str, ...] | Tuple[()]) -> None: + def _verify_input_tokens(self, user_input: Tuple[str, ...] | Tuple[()]) -> None: if len(self._all_input_tokens) != len(user_input): logger.critical( "Your config/template specifies %s input tokens, you gave %s", @@ -141,7 +137,25 @@ class ScopedPageCreator(PageCreator): ) raise SystemExit(1) - def __substitute_input_tokens__( + def _substitute_tokens( + self, + tokenified_string: str, + user_input: Tuple[str, ...] | Tuple[()], + name: str, + ) -> str: + """For a tokened string, substitute input, name and date tokens.""" + # TODO: fn to get tokens from file and template + # tokenified_string = self.__substitute_input_tokens( + # tokenified_string, user_input, input_token_type + # ) + tokenified_string = self.__substitute_input_tokens( + tokenified_string, user_input + ) + tokenified_string = self.__substitute_name_tokens(tokenified_string, name) + tokenified_string = self.__substitute_date_tokens(tokenified_string) + return tokenified_string + + def __substitute_input_tokens( self, tokenified_string: str, user_input: Tuple[str, ...] | Tuple[()], @@ -150,49 +164,6 @@ class ScopedPageCreator(PageCreator): tokenified_string = tokenified_string.replace(extracted_token, input_value) return tokenified_string - def __check_input_token_mismatch(self) -> None: - _max_config_input_token_count = max( - self.path_input_token_counts["config"], - self.template_input_token_counts["config"], - ) - _max_user_input_token_count = max( - self.path_input_token_counts["user"], - self.template_input_token_counts["user"], - ) - if _max_user_input_token_count < _max_config_input_token_count: - logger.critical( - "Your config/template specifies %s input tokens, you gave %s " - "- exiting", - _max_config_input_token_count, - _max_user_input_token_count, - ) - raise SystemExit(1) - if _max_user_input_token_count > _max_config_input_token_count: - logger.warning( - "Your config/template specifies %s input tokens, you gave %s", - _max_config_input_token_count, - _max_user_input_token_count, - ) - - def _substitute_tokens( - self, - tokenified_string: str, - user_input: Tuple[str, ...] | Tuple[()], - name: str, - input_token_type: Literal["path", "template"], - ) -> str: - """For a tokened string, substitute input, name and date tokens.""" - # TODO: fn to get tokens from file and template - # tokenified_string = self.__substitute_input_tokens( - # tokenified_string, user_input, input_token_type - # ) - tokenified_string = self.__substitute_input_tokens__( - tokenified_string, user_input - ) - tokenified_string = self.__substitute_name_tokens(tokenified_string, name) - tokenified_string = self.__substitute_date_tokens(tokenified_string) - return tokenified_string - @staticmethod def __substitute_name_tokens(tokenified_string: str, name: str) -> str: # find any {name} tokens and substitute for the name value @@ -201,47 +172,6 @@ class ScopedPageCreator(PageCreator): tokenified_string = tokenified_string.replace(extracted_input, name) return tokenified_string - # @staticmethod - def __substitute_input_tokens( - self, - tokenified_string: str, - user_input: Tuple[str, ...] | Tuple[()], - input_token_type: Literal["path", "template"], - ) -> str: - """Find `{inputN}` tokens in string.""" - - input_extraction = re.findall(r"(\{input\d*\})", tokenified_string) - # if there is no user input - if len(user_input) == 0: - if len(input_extraction) > 0: - # if the regex matches, save the number of input tokens found - if input_token_type == "path": # noqa: bandit 105 - # TODO: change this to a dict instead of tuple - self.path_input_token_counts["config"] = len(input_extraction) - self.path_input_token_counts["user"] = 0 - if input_token_type == "template": # noqa: bandit 105 - self.template_input_token_counts["config"] = len(input_extraction) - self.template_input_token_counts["user"] = 0 - # if there aren't any tokens in the string, return the string - return tokenified_string - - # if there is user input - if len(user_input) > 0: - # save the number of input tokens, and the number of user inputs - if input_token_type == "path": # noqa: bandit 105 - self.path_input_token_counts["config"] = len(input_extraction) - self.path_input_token_counts["user"] = len(user_input) - elif input_token_type == "template": # noqa: bandit 105 - self.template_input_token_counts["config"] = len(input_extraction) - self.template_input_token_counts["user"] = len(user_input) - - # sbustitute the input token for the user's input - for extracted_input, input_value in zip(input_extraction, user_input): - tokenified_string = tokenified_string.replace( - extracted_input, input_value - ) - return tokenified_string - @staticmethod def __substitute_date_tokens(tokenified_string: str) -> str: """Find any {d:%d-%M-%Y} tokens."""