Skip to content

Commit 75ae591

Browse files
committed
feat: default to using server-side categories for queries
1 parent 6b04bd5 commit 75ae591

File tree

3 files changed

+46
-9
lines changed

3 files changed

+46
-9
lines changed

Diff for: aw_client/classes.py

+28-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,18 @@
33
44
Taken from default classes in aw-webui
55
"""
6+
import logging
7+
import random
8+
from typing import (
9+
Any,
10+
Dict,
11+
List,
12+
Tuple,
13+
)
614

7-
from typing import List, Dict, Any, Tuple
15+
import aw_client
16+
17+
logger = logging.getLogger(__name__)
818

919
CategoryId = List[str]
1020
CategorySpec = Dict[str, Any]
@@ -52,3 +62,20 @@
5262
{"type": "regex", "regex": "Gmail|Thunderbird|mutt|alpine"},
5363
),
5464
]
65+
66+
67+
def get_classes() -> List[Tuple[List[str], dict]]:
68+
"""
69+
Get classes from server-side settings.
70+
Might throw a 404 if not set yet, in which case we use the default classes as a fallback.
71+
"""
72+
awc = aw_client.ActivityWatchClient(f"get-setting-{random.randint(0, 10000)}")
73+
try:
74+
classes = awc.get_setting("classes")
75+
except Exception:
76+
logger.warning(
77+
"Failed to get classes from server, using default classes as fallback"
78+
)
79+
return default_classes
80+
# map into list of tuples
81+
return [(v["name"], v["rule"]) for v in classes]

Diff for: aw_client/client.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -341,12 +341,11 @@ def query(
341341
# Settings
342342
#
343343

344-
def get_setting(self, key=None) -> dict:
345-
# TODO: explicitly fetch key from server, instead of fetching all settings
346-
settings = self._get("settings").json()
344+
def get_setting(self, key: Optional[str] = None) -> dict:
347345
if key:
348-
return settings.get(key, None)
349-
return settings
346+
return self._get(f"settings/{key}").json()
347+
else:
348+
return self._get("settings").json()
350349

351350
def set_setting(self, key: str, value: str) -> None:
352351
self._post(f"settings/{key}", value)

Diff for: aw_client/queries.py

+14-3
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,24 @@
33
44
Most of these are from: https://github.com/ActivityWatch/aw-webui/blob/master/src/queries.ts
55
"""
6-
6+
import dataclasses
77
import json
88
import re
9-
import dataclasses
109
from dataclasses import dataclass, field
1110
from datetime import datetime, timedelta, timezone
11+
from typing import (
12+
List,
13+
Optional,
14+
Tuple,
15+
Union,
16+
)
1217

13-
from typing import List, Union, Tuple, Optional
1418
from typing_extensions import TypeGuard
1519

1620
import aw_client
1721

22+
from .classes import get_classes
23+
1824

1925
class EnhancedJSONEncoder(json.JSONEncoder):
2026
"""For encoding dataclasses into JSON"""
@@ -75,6 +81,11 @@ def isAndroidParams(params: QueryParams) -> TypeGuard[AndroidQueryParams]:
7581

7682

7783
def canonicalEvents(params: Union[DesktopQueryParams, AndroidQueryParams]) -> str:
84+
if not params.classes:
85+
# if categories not explicitly set,
86+
# get categories from server settings
87+
params.classes = get_classes()
88+
7889
# Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unnecessary escaping)
7990
classes_str = json.dumps(params.classes, cls=EnhancedJSONEncoder)
8091
classes_str = re.sub(r"\\\\", r"\\", classes_str)

0 commit comments

Comments
 (0)