Skip to content

Commit 7467243

Browse files
committed
Add types to infobase db/server modules
1 parent f70607a commit 7467243

File tree

6 files changed

+49
-34
lines changed

6 files changed

+49
-34
lines changed

infogami/infobase/_dbstore/store.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ def index(self, doc):
3939
class Store:
4040
"""JSON Store."""
4141

42-
def __init__(self, db):
42+
def __init__(self, db: web.DB):
4343
self.db = db
4444
self.indexer = StoreIndexer()
4545
self.listener = None
4646

47-
def get_row(self, key, for_update=False):
47+
def get_row(self, key: str, for_update: bool = False):
4848
q = "SELECT * FROM store WHERE key=$key"
4949
if for_update:
5050
q += " FOR UPDATE NOWAIT"

infogami/infobase/client.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ class Connection:
6969
def __init__(self):
7070
self.auth_token = None
7171

72-
def set_auth_token(self, token):
72+
def set_auth_token(self, token: str) -> None:
7373
self.auth_token = token
7474

75-
def get_auth_token(self):
75+
def get_auth_token(self) -> str | None:
7676
return self.auth_token
7777

7878
def request(self, sitename, path, method='GET', data=None):
@@ -223,11 +223,11 @@ def __iter__(self):
223223

224224

225225
class Site:
226-
def __init__(self, conn, sitename):
226+
def __init__(self, conn: Connection, sitename: str):
227227
self._conn = conn
228228
self.name = sitename
229229
# cache for storing pages requested in this HTTP request
230-
self._cache = {}
230+
self._cache: dict[tuple[str, int | None], web.storage] = {}
231231

232232
self.store = Store(conn, sitename)
233233
self.seq = Sequence(conn, sitename)

infogami/infobase/core.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,15 +165,15 @@ class Store:
165165
Store manages one or many SiteStores.
166166
"""
167167

168-
def create(self, sitename):
168+
def create(self, sitename: str) -> "SiteStore":
169169
"""Creates a new site with the given name and returns store for it."""
170170
raise NotImplementedError
171171

172-
def get(self, sitename):
172+
def get(self, sitename: str) -> "SiteStore | None":
173173
"""Returns store object for the given sitename."""
174174
raise NotImplementedError
175175

176-
def delete(self, sitename):
176+
def delete(self, sitename: str):
177177
"""Deletes the store for the specified sitename."""
178178
raise NotImplementedError
179179

infogami/infobase/dbstore.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import datetime
44
import logging
55
import time
6+
from typing import TYPE_CHECKING, cast
67

78
import web
89

@@ -12,7 +13,10 @@
1213
from infogami.infobase._dbstore.indexer import Indexer
1314
from infogami.infobase._dbstore.read import RecentChanges, get_bot_users
1415
from infogami.infobase._dbstore.save import PropertyManager, SaveImpl
15-
from infogami.infobase._dbstore.schema import Schema # noqa: F401
16+
from infogami.infobase._dbstore.schema import Schema
17+
18+
if TYPE_CHECKING:
19+
from infogami.infobase.cache import Cache
1620

1721
default_schema = None
1822

@@ -25,21 +29,21 @@ def process_json(key, json_data):
2529

2630

2731
class DBSiteStore(common.SiteStore):
28-
def __init__(self, db, schema):
32+
def __init__(self, db: web.DB, schema: Schema):
2933
self.db = db
3034
self.schema = schema
3135
self.sitename = None
3236
self.indexer = Indexer()
3337
self.store = store.Store(self.db)
3438
self.seq = sequence.SequenceImpl(self.db)
3539

36-
self.cache = None
40+
self.cache: "Cache | None" = None
3741
self.property_manager = PropertyManager(self.db)
3842

3943
def get_store(self):
4044
return self.store
4145

42-
def set_cache(self, cache):
46+
def set_cache(self, cache: "Cache"):
4347
self.cache = cache
4448

4549
def get_metadata(self, key, for_update=False):
@@ -657,9 +661,9 @@ class DBStore(common.Store):
657661
It always returns a the same site irrespective of the sitename.
658662
"""
659663

660-
def __init__(self, schema):
664+
def __init__(self, schema: Schema):
661665
self.schema = schema
662-
self.sitestore = None
666+
self.sitestore: DBSiteStore | None = None
663667
self.db = create_database(**web.config.db_parameters)
664668

665669
def has_initialized(self):
@@ -669,7 +673,7 @@ def has_initialized(self):
669673
except Exception:
670674
return False
671675

672-
def create(self, sitename):
676+
def create(self, sitename: str) -> DBSiteStore:
673677
if self.sitestore is None:
674678
self.sitestore = DBSiteStore(self.db, self.schema)
675679
if not self.has_initialized():
@@ -678,7 +682,7 @@ def create(self, sitename):
678682
self.sitestore.initialize()
679683
return self.sitestore
680684

681-
def get(self, sitename):
685+
def get(self, sitename: str) -> DBSiteStore | None:
682686
if self.sitestore is None:
683687
sitestore = DBSiteStore(self.db, self.schema)
684688
if not self.has_initialized():
@@ -699,9 +703,9 @@ def delete(self, sitename):
699703
class MultiDBStore(DBStore):
700704
"""DBStore that works with multiple sites."""
701705

702-
def __init__(self, schema):
706+
def __init__(self, schema: Schema):
703707
self.schema = schema
704-
self.sitestores = {}
708+
self.sitestores: dict[str, MultiDBSiteStore] = {}
705709
self.db = create_database(**web.config.db_parameters)
706710

707711
def create(self, sitename):
@@ -783,8 +787,8 @@ def delete(self):
783787
pass
784788

785789

786-
def create_database(**params):
787-
db = web.database(**params)
790+
def create_database(**params) -> web.DB:
791+
db = cast("web.DB", web.database(**params))
788792

789793
# monkey-patch query method to collect stats
790794
_query = db.query

infogami/infobase/infobase.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import datetime
99
import json
10+
from collections.abc import Callable
11+
from typing import TYPE_CHECKING
1012

1113
import web
1214

@@ -20,48 +22,51 @@
2022
writequery,
2123
)
2224

25+
if TYPE_CHECKING:
26+
from infogami.infobase.dbstore import DBSiteStore, DBStore
27+
2328

2429
class Infobase:
2530
"""Infobase contains multiple sites."""
2631

27-
def __init__(self, store, secret_key):
32+
def __init__(self, store: "DBStore", secret_key: str):
2833
self.store = store
2934
self.secret_key = secret_key
30-
self.sites = {}
31-
self.event_listeners = []
35+
self.sites: "dict[str, Site]" = {}
36+
self.event_listeners: "list[Callable]" = []
3237

3338
if config.startup_hook:
3439
config.startup_hook(self)
3540

36-
def create(self, sitename):
41+
def create(self, sitename: str) -> "Site":
3742
"""Creates a new site with the sitename."""
3843
site = Site(self, sitename, self.store.create(sitename), self.secret_key)
3944
site.bootstrap()
4045
self.sites[sitename] = site
4146
return site
4247

43-
def get(self, sitename):
48+
def get(self, sitename: str) -> "Site | None":
4449
"""Returns the site with the given name."""
4550
if sitename in self.sites:
4651
site = self.sites[sitename]
4752
else:
4853
store = self.store.get(sitename)
4954
if store is None:
5055
return None
51-
site = Site(self, sitename, self.store.get(sitename), self.secret_key)
56+
site = Site(self, sitename, store, self.secret_key)
5257
self.sites[sitename] = site
5358
return site
5459

55-
def delete(self, sitename):
60+
def delete(self, sitename: str):
5661
"""Deletes the site with the given name."""
5762
if sitename in self.sites:
5863
del self.sites[sitename]
5964
return self.store.delete(sitename)
6065

61-
def add_event_listener(self, listener):
66+
def add_event_listener(self, listener: Callable):
6267
self.event_listeners.append(listener)
6368

64-
def remove_event_listener(self, listener):
69+
def remove_event_listener(self, listener: Callable):
6570
try:
6671
self.event_listeners.remove(listener)
6772
except ValueError:
@@ -78,15 +83,21 @@ def fire_event(self, event):
7883
class Site:
7984
"""A site of infobase."""
8085

81-
def __init__(self, _infobase, sitename, store, secret_key):
86+
def __init__(
87+
self,
88+
_infobase: Infobase,
89+
sitename: str,
90+
store: "DBSiteStore",
91+
secret_key: str,
92+
):
8293
self._infobase = _infobase
8394
self.sitename = sitename
8495
self.store = store
8596
self.cache = cache.Cache()
8697
self.store.set_cache(self.cache)
8798
self.account_manager = account.AccountManager(self, secret_key)
8899

89-
self._triggers = {}
100+
self._triggers: dict[str, list[Callable]] = {}
90101
store.store.set_listener(self._log_store_action)
91102
store.seq.set_listener(self._log_store_action)
92103

infogami/infobase/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,10 @@ def from_json(s):
187187
raise common.BadData(message="Bad JSON: " + str(e))
188188

189189

190-
_infobase = None
190+
_infobase: infobase.Infobase | None = None
191191

192192

193-
def get_site(sitename):
193+
def get_site(sitename: str) -> infobase.Site | None:
194194
global _infobase
195195
if not _infobase:
196196
schema = dbstore.default_schema or dbstore.Schema()

0 commit comments

Comments
 (0)