From afc542aecb6cd138926730b3459707a568577955 Mon Sep 17 00:00:00 2001 From: Ivo Spijkerman Date: Wed, 15 Sep 2021 16:34:29 +0200 Subject: [PATCH] NOJIRA more restructuring --- .gitignore | 2 +- pack.sh | 10 +++--- run-locally.sh | 2 ++ src/__init__.py | 0 main.py => src/main.py | 33 +++++++++----------- {models => src/models}/dto.py | 0 {models => src/models}/item.py | 0 {models => src/models}/order.py | 0 src/repository.py | 27 ++++++++++++++++ requirements.txt => src/requirements.txt | 0 {templates => src/templates}/frietlijst.html | 0 test/__init__.py | 0 test.py => test/test_anonymize_name.py | 4 +-- 13 files changed, 50 insertions(+), 28 deletions(-) create mode 100644 src/__init__.py rename main.py => src/main.py (56%) rename {models => src/models}/dto.py (100%) rename {models => src/models}/item.py (100%) rename {models => src/models}/order.py (100%) create mode 100644 src/repository.py rename requirements.txt => src/requirements.txt (100%) rename {templates => src/templates}/frietlijst.html (100%) create mode 100644 test/__init__.py rename test.py => test/test_anonymize_name.py (77%) diff --git a/.gitignore b/.gitignore index f4eee1c..7c5f4dc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ __pycache__/ .idea/ .venv deployable.zip -token.json \ No newline at end of file +src/token.json \ No newline at end of file diff --git a/pack.sh b/pack.sh index 53ccb85..a203aae 100755 --- a/pack.sh +++ b/pack.sh @@ -1,7 +1,5 @@ #!/bin/bash -zip deployable.zip \ - templates/*.html \ - models/*.py \ - main.py \ - token.json \ - requirements.txt \ No newline at end of file +cd "$(dirname "$0")" +cd src +rm ../deployable.zip +zip ../deployable.zip -r * -x '*__pycache__*' \ No newline at end of file diff --git a/run-locally.sh b/run-locally.sh index 68590e2..420b00f 100755 --- a/run-locally.sh +++ b/run-locally.sh @@ -1,2 +1,4 @@ #!/bin/bash +cd "$(dirname "$0")" +cd src functions_framework --target process \ No newline at end of file diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/main.py b/src/main.py similarity index 56% rename from main.py rename to src/main.py index 3f498c8..b3db7c8 100644 --- a/main.py +++ b/src/main.py @@ -1,25 +1,29 @@ import datetime -from typing import List +from typing import Optional from flask import render_template -from google.oauth2.service_account import Credentials -from googleapiclient.discovery import build from models.dto import DTO +from repository import Repository -_SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'] - -_SHEET_ID = "18vCgc5DGUiFZN1NX_GBmxSBCb47KdsBkV6Glf9Sx-wE" -_RANGE = 'Friet bestelling!A2:F' +_repository: Optional[Repository] = None _cache_moment = datetime.datetime.now() - datetime.timedelta(days=1) _cache_value = DTO() def process(_) -> str: + global _repository global _cache_value global _cache_moment + if not _repository: + _repository = Repository( + sa_file_name='token.json', + spreadsheet_id='18vCgc5DGUiFZN1NX_GBmxSBCb47KdsBkV6Glf9Sx-wE', + spreadsheet_range='Friet bestelling!A2:F', + ) + rerun_if_later_than = _cache_moment + datetime.timedelta(seconds=10) now = datetime.datetime.now() if now > rerun_if_later_than: @@ -28,7 +32,7 @@ def process(_) -> str: return render_template('frietlijst.html', dto=_cache_value) -def _anonymize_name(name: str) -> str: +def anonymize_name(name: str) -> str: parts = name.split(" ") result = parts[0] for part in parts[1:]: @@ -37,26 +41,17 @@ def _anonymize_name(name: str) -> str: return result -def _load_values() -> List[List[str]]: - credentials: Credentials = Credentials.from_service_account_file('token.json', scopes=_SCOPES) - service = build('sheets', 'v4', credentials=credentials) - sheets = service.spreadsheets() - result = sheets.values().get(spreadsheetId=_SHEET_ID, range=_RANGE).execute() - values = result.get('values', []) - return values - - def _get_data() -> DTO: cutoff = datetime.datetime.now() - datetime.timedelta(days=4) - rows_to_process = [row for row in _load_values() + rows_to_process = [row for row in _repository.load_rows() if row and datetime.datetime.strptime(row[0], '%d-%m-%Y %H:%M:%S') > cutoff] result = DTO() for row in rows_to_process: result.add( - applicant_name=_anonymize_name(row[1]), + applicant_name=anonymize_name(row[1]), item_names=[item_name.lower().strip() for item_name in row[2:]], ) diff --git a/models/dto.py b/src/models/dto.py similarity index 100% rename from models/dto.py rename to src/models/dto.py diff --git a/models/item.py b/src/models/item.py similarity index 100% rename from models/item.py rename to src/models/item.py diff --git a/models/order.py b/src/models/order.py similarity index 100% rename from models/order.py rename to src/models/order.py diff --git a/src/repository.py b/src/repository.py new file mode 100644 index 0000000..d0bf0f5 --- /dev/null +++ b/src/repository.py @@ -0,0 +1,27 @@ +from typing import List + +from google.oauth2.service_account import Credentials +from googleapiclient.discovery import build + + +class Repository: + def __init__(self, + sa_file_name: str, + spreadsheet_id: str, + spreadsheet_range: str, + ): + credentials = Credentials.from_service_account_file( + filename=sa_file_name, + scopes=['https://www.googleapis.com/auth/spreadsheets.readonly'], + ) + service = build('sheets', 'v4', credentials=credentials) + self.__sheets = service.spreadsheets() + self.__spreadsheet_id = spreadsheet_id + self.__spreadsheet_range = spreadsheet_range + + def load_rows(self) -> List[List[str]]: + result = self.__sheets.values().get( + spreadsheetId=self.__spreadsheet_id, + range=self.__spreadsheet_range, + ).execute() + return result.get('values', []) diff --git a/requirements.txt b/src/requirements.txt similarity index 100% rename from requirements.txt rename to src/requirements.txt diff --git a/templates/frietlijst.html b/src/templates/frietlijst.html similarity index 100% rename from templates/frietlijst.html rename to src/templates/frietlijst.html diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test.py b/test/test_anonymize_name.py similarity index 77% rename from test.py rename to test/test_anonymize_name.py index c799481..ca5ca15 100644 --- a/test.py +++ b/test/test_anonymize_name.py @@ -1,13 +1,13 @@ import unittest -from main import _anonymize_name +from main import anonymize_name class TestMain(unittest.TestCase): def test_anonymize_name(self): given = "Alice Bobbington Charlie" expected = "Alice B C" - actual = _anonymize_name(given) + actual = anonymize_name(given) self.assertEqual(expected, actual)