Skip to content

Commit c79e56c

Browse files
committed
build: updated deps, switch to ruff for format+pyugrade, fixed lints and type issues, removed takethetime dependency
1 parent 3b83ab5 commit c79e56c

19 files changed

+434
-626
lines changed

.github/workflows/lint.yml

-7
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,3 @@ jobs:
1313
- uses: actions/checkout@v3
1414
- uses: actions/setup-python@v4
1515
- uses: jpetrucciani/ruff-check@main
16-
17-
format:
18-
runs-on: ubuntu-latest
19-
steps:
20-
- uses: actions/checkout@v3
21-
- uses: actions/setup-python@v4
22-
- uses: psf/black@stable

Makefile

+1-5
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,14 @@ typecheck:
2121
typecheck-strict:
2222
export MYPYPATH=./stubs; python -m mypy aw_core aw_datastore aw_transform aw_query --strict-optional --check-untyped-defs; echo "Not a failing step"
2323

24-
PYFILES=$(shell find . -type f -name '*.py')
25-
PYIFILES=$(shell find . -type f -name '*.pyi')
26-
2724
lint:
2825
ruff check .
2926

3027
lint-fix:
31-
pyupgrade --py37-plus ${PYFILES} && true
3228
ruff check --fix .
3329

3430
format:
35-
black ${PYFILES} ${PYIFILES}
31+
ruff format .
3632

3733
clean:
3834
rm -rf build dist

aw_core/__about__.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# Inspired by:
22
# https://github.com/pypa/pipfile/blob/master/pipfile/__about__.py
33

4+
45
__all__ = [
56
"__title__",
67
"__summary__",
78
"__uri__",
8-
"__version__",
99
"__author__",
1010
"__email__",
1111
"__license__",
@@ -16,10 +16,8 @@
1616
__summary__ = "Core library for ActivityWatch"
1717
__uri__ = "https://github.com/ActivityWatch/aw-core"
1818

19-
__version__ = "0.4.2"
20-
2119
__author__ = "Erik Bjäreholt, Johan Bjäreholt"
2220
2321

2422
__license__ = "MPL2"
25-
__copyright__ = "Copyright 2017 %s" % __author__
23+
__copyright__ = f"Copyright 2017 {__author__}"

aw_core/config.py

-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from deprecation import deprecated
77

88
from aw_core import dirs
9-
from aw_core.__about__ import __version__
109

1110
logger = logging.getLogger(__name__)
1211

@@ -81,7 +80,6 @@ def save_config_toml(appname: str, config: str) -> None:
8180
@deprecated(
8281
details="Use the load_config_toml function instead",
8382
deprecated_in="0.5.3",
84-
current_version=__version__,
8583
)
8684
def load_config(appname, default_config):
8785
"""
@@ -107,7 +105,6 @@ def load_config(appname, default_config):
107105
@deprecated(
108106
details="Use the save_config_toml function instead",
109107
deprecated_in="0.5.3",
110-
current_version=__version__,
111108
)
112109
def save_config(appname, config):
113110
config_dir = dirs.get_config_dir(appname)

aw_core/decorators.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ def g(*args, **kwargs):
2222
if not warned_for:
2323
warnings.simplefilter("always", DeprecationWarning) # turn off filter
2424
warnings.warn(
25-
"Call to deprecated function {}, "
26-
"this warning will only show once per function.".format(f.__name__),
25+
f"Call to deprecated function {f.__name__}, "
26+
"this warning will only show once per function.",
2727
category=DeprecationWarning,
2828
stacklevel=2,
2929
)

aw_core/models.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def __init__(
5050
id: Optional[Id] = None,
5151
timestamp: Optional[ConvertibleTimestamp] = None,
5252
duration: Duration = 0,
53-
data: Data = dict(),
53+
data: Optional[Data] = None,
5454
) -> None:
5555
self.id = id
5656
if timestamp is None:
@@ -65,7 +65,7 @@ def __init__(
6565
# (lacks support for properties)
6666
self.timestamp = _timestamp_parse(timestamp)
6767
self.duration = duration # type: ignore
68-
self.data = data
68+
self.data = data or {}
6969

7070
def __eq__(self, other: object) -> bool:
7171
if isinstance(other, Event):
@@ -76,19 +76,15 @@ def __eq__(self, other: object) -> bool:
7676
)
7777
else:
7878
raise TypeError(
79-
"operator not supported between instances of '{}' and '{}'".format(
80-
type(self), type(other)
81-
)
79+
f"operator not supported between instances of '{type(self)}' and '{type(other)}'"
8280
)
8381

8482
def __lt__(self, other: object) -> bool:
8583
if isinstance(other, Event):
8684
return self.timestamp < other.timestamp
8785
else:
8886
raise TypeError(
89-
"operator not supported between instances of '{}' and '{}'".format(
90-
type(self), type(other)
91-
)
87+
f"operator not supported between instances of '{type(self)}' and '{type(other)}'"
9288
)
9389

9490
def to_json_dict(self) -> dict:

aw_datastore/benchmark.py

+55-53
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
#!/usr/bin/env python3
22
import sys
3-
from typing import Callable
4-
from datetime import datetime, timedelta, timezone
53
from contextlib import contextmanager
4+
from datetime import datetime, timedelta, timezone
5+
from typing import Callable
66

77
from aw_core.models import Event
88

9-
from takethetime import ttt
10-
11-
from aw_datastore import get_storage_methods, Datastore
9+
from aw_datastore import get_storage_methods
1210
from aw_datastore.storages import AbstractStorage
1311

1412
td1s = timedelta(seconds=1)
@@ -39,54 +37,58 @@ def temporary_bucket(ds):
3937

4038

4139
def benchmark(storage: Callable[..., AbstractStorage]):
42-
if storage.__name__ == "PeeweeStorage":
43-
ds = Datastore(storage, testing=True, filepath="test.db")
44-
else:
45-
ds = Datastore(storage, testing=True)
46-
47-
num_single_events = 50
48-
num_replace_events = 50
49-
num_bulk_events = 20_000
50-
num_events = num_single_events + num_replace_events + num_bulk_events + 1
51-
num_final_events = num_single_events + num_bulk_events + 1
52-
53-
events = create_test_events(num_events)
54-
single_events = events[:num_single_events]
55-
replace_events = events[num_single_events : num_single_events + num_replace_events]
56-
bulk_events = events[num_single_events + num_replace_events : -1]
57-
58-
print(storage.__name__)
59-
60-
with temporary_bucket(ds) as bucket:
61-
with ttt(" sum"):
62-
with ttt(f" single insert {num_single_events} events"):
63-
for event in single_events:
64-
bucket.insert(event)
65-
66-
with ttt(f" bulk insert {num_bulk_events} events"):
67-
bucket.insert(bulk_events)
68-
69-
with ttt(f" replace last {num_replace_events}"):
70-
for e in replace_events:
71-
bucket.replace_last(e)
72-
73-
with ttt(" insert 1 event"):
74-
bucket.insert(events[-1])
75-
76-
with ttt(" get one"):
77-
events_tmp = bucket.get(limit=1)
78-
79-
with ttt(" get all"):
80-
events_tmp = bucket.get(limit=-1)
81-
assert len(events_tmp) == num_final_events
82-
83-
with ttt(" get range"):
84-
events_tmp = bucket.get(
85-
limit=-1,
86-
starttime=events[1].timestamp + 0.01 * td1s,
87-
endtime=events[-1].timestamp + events[-1].duration,
88-
)
89-
assert len(events_tmp) == num_final_events - 1
40+
raise NotImplementedError(
41+
"No longer implemented as ttt/takethetime dependency is removed"
42+
)
43+
44+
# if storage.__name__ == "PeeweeStorage":
45+
# ds = Datastore(storage, testing=True, filepath="test.db")
46+
# else:
47+
# ds = Datastore(storage, testing=True)
48+
49+
# num_single_events = 50
50+
# num_replace_events = 50
51+
# num_bulk_events = 20_000
52+
# num_events = num_single_events + num_replace_events + num_bulk_events + 1
53+
# num_final_events = num_single_events + num_bulk_events + 1
54+
55+
# events = create_test_events(num_events)
56+
# single_events = events[:num_single_events]
57+
# replace_events = events[num_single_events : num_single_events + num_replace_events]
58+
# bulk_events = events[num_single_events + num_replace_events : -1]
59+
60+
# print(storage.__name__)
61+
62+
# with temporary_bucket(ds) as bucket:
63+
# with ttt(" sum"):
64+
# with ttt(f" single insert {num_single_events} events"):
65+
# for event in single_events:
66+
# bucket.insert(event)
67+
68+
# with ttt(f" bulk insert {num_bulk_events} events"):
69+
# bucket.insert(bulk_events)
70+
71+
# with ttt(f" replace last {num_replace_events}"):
72+
# for e in replace_events:
73+
# bucket.replace_last(e)
74+
75+
# with ttt(" insert 1 event"):
76+
# bucket.insert(events[-1])
77+
78+
# with ttt(" get one"):
79+
# events_tmp = bucket.get(limit=1)
80+
81+
# with ttt(" get all"):
82+
# events_tmp = bucket.get(limit=-1)
83+
# assert len(events_tmp) == num_final_events
84+
85+
# with ttt(" get range"):
86+
# events_tmp = bucket.get(
87+
# limit=-1,
88+
# starttime=events[1].timestamp + 0.01 * td1s,
89+
# endtime=events[-1].timestamp + events[-1].duration,
90+
# )
91+
# assert len(events_tmp) == num_final_events - 1
9092

9193

9294
if __name__ == "__main__":

aw_datastore/datastore.py

+8-15
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ def __init__(
2828
self.storage_strategy = storage_strategy(testing=testing, **kwargs)
2929

3030
def __repr__(self):
31-
return "<Datastore object using {}>".format(
32-
self.storage_strategy.__class__.__name__
33-
)
31+
return f"<Datastore object using {self.storage_strategy.__class__.__name__}>"
3432

3533
def __getitem__(self, bucket_id: str) -> "Bucket":
3634
# If this bucket doesn't have a initialized object, create it
@@ -41,9 +39,7 @@ def __getitem__(self, bucket_id: str) -> "Bucket":
4139
self.bucket_instances[bucket_id] = bucket
4240
else:
4341
self.logger.error(
44-
"Cannot create a Bucket object for {} because it doesn't exist in the database".format(
45-
bucket_id
46-
)
42+
f"Cannot create a Bucket object for {bucket_id} because it doesn't exist in the database"
4743
)
4844
raise KeyError
4945

@@ -55,10 +51,11 @@ def create_bucket(
5551
type: str,
5652
client: str,
5753
hostname: str,
58-
created: datetime = datetime.now(timezone.utc),
54+
created: Optional[datetime] = None,
5955
name: Optional[str] = None,
6056
data: Optional[dict] = None,
6157
) -> "Bucket":
58+
created = created or datetime.now(timezone.utc)
6259
self.logger.info(f"Creating bucket '{bucket_id}'")
6360
self.storage_strategy.create_bucket(
6461
bucket_id, type, client, hostname, created.isoformat(), name=name, data=data
@@ -106,8 +103,8 @@ def get(
106103
milliseconds = 1 + int(endtime.microsecond / 1000)
107104
second_offset = int(milliseconds / 1000) # usually 0, rarely 1
108105
microseconds = (
109-
1000 * milliseconds
110-
) % 1000000 # will likely just be 1000 * milliseconds, if it overflows it would become zero
106+
(1000 * milliseconds) % 1000000
107+
) # will likely just be 1000 * milliseconds, if it overflows it would become zero
111108
endtime = endtime.replace(microsecond=microseconds) + timedelta(
112109
seconds=second_offset
113110
)
@@ -153,9 +150,7 @@ def insert(self, events: Union[Event, List[Event]]) -> Optional[Event]:
153150
oldest_event: Optional[Event] = events
154151
if events.timestamp + events.duration > now:
155152
self.logger.warning(
156-
"Event inserted into bucket {} reaches into the future. Current UTC time: {}. Event data: {}".format(
157-
self.bucket_id, str(now), str(events)
158-
)
153+
f"Event inserted into bucket {self.bucket_id} reaches into the future. Current UTC time: {str(now)}. Event data: {str(events)}"
159154
)
160155
inserted = self.ds.storage_strategy.insert_one(self.bucket_id, events)
161156
# assert inserted
@@ -167,9 +162,7 @@ def insert(self, events: Union[Event, List[Event]]) -> Optional[Event]:
167162
for event in events:
168163
if event.timestamp + event.duration > now:
169164
self.logger.warning(
170-
"Event inserted into bucket {} reaches into the future. Current UTC time: {}. Event data: {}".format(
171-
self.bucket_id, str(now), str(event)
172-
)
165+
f"Event inserted into bucket {self.bucket_id} reaches into the future. Current UTC time: {str(now)}. Event data: {str(event)}"
173166
)
174167
self.ds.storage_strategy.insert_many(self.bucket_id, events)
175168
else:

aw_datastore/storages/memory.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ def update_bucket(
6464
if data:
6565
self._metadata[bucket_id]["data"] = data
6666
else:
67-
raise Exception("Bucket did not exist, could not update")
67+
raise ValueError("Bucket did not exist, could not update")
6868

6969
def delete_bucket(self, bucket_id: str) -> None:
7070
if bucket_id in self.db:
7171
del self.db[bucket_id]
7272
if bucket_id in self._metadata:
7373
del self._metadata[bucket_id]
7474
else:
75-
raise Exception("Bucket did not exist, could not delete")
75+
raise ValueError("Bucket did not exist, could not delete")
7676

7777
def buckets(self):
7878
buckets = dict()
@@ -134,7 +134,7 @@ def get_metadata(self, bucket_id: str):
134134
if bucket_id in self._metadata:
135135
return self._metadata[bucket_id]
136136
else:
137-
raise Exception("Bucket did not exist, could not get metadata")
137+
raise ValueError("Bucket did not exist, could not get metadata")
138138

139139
def insert_one(self, bucket: str, event: Event) -> Event:
140140
if event.id is not None:

aw_datastore/storages/peewee.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ def update_bucket(
215215

216216
bucket.save()
217217
else:
218-
raise Exception("Bucket did not exist, could not update")
218+
raise ValueError("Bucket did not exist, could not update")
219219

220220
def delete_bucket(self, bucket_id: str) -> None:
221221
if bucket_id in self.bucket_keys:
@@ -227,7 +227,7 @@ def delete_bucket(self, bucket_id: str) -> None:
227227
).execute()
228228
self.update_bucket_keys()
229229
else:
230-
raise Exception("Bucket did not exist, could not delete")
230+
raise ValueError("Bucket did not exist, could not delete")
231231

232232
def get_metadata(self, bucket_id: str):
233233
if bucket_id in self.bucket_keys:
@@ -236,7 +236,7 @@ def get_metadata(self, bucket_id: str):
236236
).json()
237237
return bucket
238238
else:
239-
raise Exception("Bucket did not exist, could not get metadata")
239+
raise ValueError("Bucket did not exist, could not get metadata")
240240

241241
def insert_one(self, bucket_id: str, event: Event) -> Event:
242242
e = EventModel.from_event(self.bucket_keys[bucket_id], event)

0 commit comments

Comments
 (0)