canonicalwebteam.store-api 6.9.0__py3-none-any.whl → 7.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -132,7 +132,6 @@ class DeviceGW(Base):
132
132
  if featured:
133
133
  params["featured"] = featured
134
134
  response = self.session.get(url, params=params, headers=headers)
135
- # pprint(response.json())
136
135
  return self.process_response(response)
137
136
 
138
137
  def get_all_items(self, size: int, api_version: int = 1) -> dict:
File without changes
@@ -0,0 +1,93 @@
1
+ import os
2
+ from cachetools import TTLCache
3
+ import redis
4
+ import json
5
+ import logging
6
+ from typing import Optional, Any
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+ host = os.getenv("REDIS_DB_HOSTNAME", "localhost")
11
+ port = os.getenv("REDIS_DB_PORT", "6379")
12
+ password = os.getenv("REDIS_DB_PASSWORD", None)
13
+
14
+
15
+ class RedisCache:
16
+ def __init__(self, namespace: str, maxsize: int, ttl: int = 300):
17
+ self.namespace = namespace
18
+ self.fallback = TTLCache(maxsize=maxsize, ttl=ttl)
19
+ try:
20
+ self.client = redis.Redis(
21
+ host=host,
22
+ port=int(port),
23
+ password=password,
24
+ decode_responses=True,
25
+ )
26
+ self.client.ping()
27
+ self.redis_available = True
28
+ except redis.RedisError as e:
29
+ logger.warning("Redis unavailable: %s", e)
30
+ self.redis_available = False
31
+
32
+ def _build_key(self, base_key: str, **parts) -> str:
33
+ key_parts = ":".join(f"{k}-{v}" for k, v in parts.items() if v)
34
+ key = (
35
+ f"{self.namespace}:{base_key}:{key_parts}"
36
+ if key_parts
37
+ else f"{self.namespace}:{base_key}"
38
+ )
39
+ return key
40
+
41
+ def _serialize(self, value: Any) -> str:
42
+ if isinstance(value, str):
43
+ return value
44
+ try:
45
+ return json.dumps(value)
46
+ except (TypeError, ValueError) as e:
47
+ logger.error("Serialization error: %s", e)
48
+ raise
49
+
50
+ def _deserialize(
51
+ self, value: Optional[str], expected_type: type = str
52
+ ) -> Any:
53
+ if value is None:
54
+ return None
55
+ if expected_type is str:
56
+ return value
57
+ try:
58
+ return json.loads(value)
59
+ except (TypeError, ValueError) as e:
60
+ logger.error("Deserialization error: %s", e)
61
+ raise
62
+
63
+ def get(self, key: str, expected_type: type = str) -> Any:
64
+ if self.redis_available:
65
+ full_key = self._build_key(key)
66
+ try:
67
+ value = self.client.get(full_key)
68
+ return self._deserialize(value, expected_type)
69
+ except redis.RedisError as e:
70
+ logger.error("Redis get error: %s", e)
71
+ value = self.fallback.get(key)
72
+ return value
73
+
74
+ def set(self, key: str, value: Any, ttl=300):
75
+ if self.redis_available:
76
+ full_key = self._build_key(key)
77
+ try:
78
+ serialized = self._serialize(value)
79
+ self.client.setex(full_key, ttl, serialized)
80
+ return
81
+ except redis.RedisError as e:
82
+ logger.error("Redis set error: %s", e)
83
+ self.fallback[key] = value
84
+
85
+ def delete(self, key: str):
86
+ if self.redis_available:
87
+ full_key = self._build_key(key)
88
+ try:
89
+ self.client.delete(full_key)
90
+ except redis.RedisError as e:
91
+ logger.error("Redis delete error: %s", e)
92
+ else:
93
+ self.fallback.pop(key, None)
@@ -1,22 +1,23 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: canonicalwebteam.store-api
3
- Version: 6.9.0
3
+ Version: 7.1.0
4
4
  Summary:
5
5
  License: LGPL-3.0
6
6
  Author: Canonical Web Team
7
7
  Author-email: webteam@canonical.com
8
- Requires-Python: >=3.8,<4.0
8
+ Requires-Python: >=3.9,<4.0
9
9
  Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
10
10
  Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.8
12
11
  Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Programming Language :: Python :: 3.12
16
15
  Classifier: Programming Language :: Python :: 3.13
16
+ Requires-Dist: cachetools (>=6.2.0,<7.0.0)
17
17
  Requires-Dist: coverage (>=7.0,<8.0)
18
18
  Requires-Dist: mypy (>=1.14.1,<2.0.0)
19
19
  Requires-Dist: pymacaroons (==0.13.0)
20
+ Requires-Dist: redis (>=6.4.0,<7.0.0)
20
21
  Requires-Dist: requests (>=2.32.2,<3.0.0)
21
22
  Description-Content-Type: text/markdown
22
23
 
@@ -4,9 +4,11 @@ canonicalwebteam/retry_utils.py,sha256=zGGabWzHyoXPNdwXBS_gbz3W0Qpdg3wN1G6aNy_xe
4
4
  canonicalwebteam/store_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  canonicalwebteam/store_api/base.py,sha256=_kx3_hPQHJPUtdf3z4NXmcwHlswV1g1mw483fZXD5LM,3331
6
6
  canonicalwebteam/store_api/dashboard.py,sha256=M5JLjTTahN-bfiVz9SuP6ahLjqEvOalwmNim6X5Ky6o,22796
7
- canonicalwebteam/store_api/devicegw.py,sha256=hRyAsX8ncuZBvmtndgDrqIF_Nbtv7H6MhaclyA7yeTY,10661
7
+ canonicalwebteam/store_api/devicegw.py,sha256=i42fnc29-CF3vM_tm7mwoOjQraDhu41EDkxILle1pQ4,10627
8
8
  canonicalwebteam/store_api/publishergw.py,sha256=u2D2Y76xC8ms16XTZcUe_KmRdcyzqOV2g0aN9HYZBrQ,29702
9
- canonicalwebteam_store_api-6.9.0.dist-info/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
10
- canonicalwebteam_store_api-6.9.0.dist-info/METADATA,sha256=s4r6eLl-i1URl04CpAHOQcyducvklHim4vjjfVrJyVY,2253
11
- canonicalwebteam_store_api-6.9.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
12
- canonicalwebteam_store_api-6.9.0.dist-info/RECORD,,
9
+ canonicalwebteam/stores_web_redis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ canonicalwebteam/stores_web_redis/utility.py,sha256=3bqTU1z9XWWeJdDdTjYxf6wxpUHwJKx_t2O58XkZeFI,3005
11
+ canonicalwebteam_store_api-7.1.0.dist-info/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
12
+ canonicalwebteam_store_api-7.1.0.dist-info/METADATA,sha256=UTfEh5py8vsIv8saK_FppLoTDpYSkRYgbu7ZVUyZHVQ,2284
13
+ canonicalwebteam_store_api-7.1.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
14
+ canonicalwebteam_store_api-7.1.0.dist-info/RECORD,,