pysmarlaapi 0.6.0__tar.gz → 0.6.2__tar.gz

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.

Potentially problematic release.


This version of pysmarlaapi might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pysmarlaapi
3
- Version: 0.6.0
3
+ Version: 0.6.2
4
4
  Summary: Swing2Sleep Smarla API
5
5
  Author-email: Robin Lintermann <robin.lintermann@explicatis.com>
6
6
  Requires-Python: >=3.11
@@ -1,4 +1,4 @@
1
- __version__ = "0.6.0"
1
+ __version__ = "0.6.2"
2
2
 
3
3
  from .classes import Connection
4
4
  from .federwiege import Federwiege
@@ -1,4 +1,5 @@
1
1
  import base64
2
+ import json
2
3
  from dataclasses import dataclass
3
4
  from typing import Self
4
5
 
@@ -16,16 +17,16 @@ class AuthToken:
16
17
  appCulture: str
17
18
 
18
19
  @classmethod
19
- def from_json(cls, value) -> Self:
20
+ def from_json(cls, value: dict) -> Self:
20
21
  value["py/object"] = "pysmarlaapi.classes.auth_token.AuthToken"
21
- return jsonpickle.decode(str(value))
22
+ return jsonpickle.decode(json.dumps(value))
22
23
 
23
24
  @classmethod
24
- def from_string(cls, value) -> Self:
25
- return AuthToken.from_json(jsonpickle.decode(value))
25
+ def from_string(cls, value: str) -> Self:
26
+ return AuthToken.from_json(json.loads(value))
26
27
 
27
28
  @classmethod
28
- def from_base64(cls, value) -> Self:
29
+ def from_base64(cls, value: str) -> Self:
29
30
  token = base64.b64decode(value.encode()).decode()
30
31
  return AuthToken.from_string(token)
31
32
 
@@ -0,0 +1,41 @@
1
+ import aiohttp
2
+ import jsonpickle
3
+
4
+ from . import AuthToken
5
+
6
+
7
+ class Connection:
8
+
9
+ def __init__(self, url: str, token: AuthToken = None, token_str=None, token_json=None, token_b64=None):
10
+ self.url = url
11
+ if token is not None:
12
+ self.token = token
13
+ elif token_json is not None:
14
+ self.token = AuthToken.from_json(token_json)
15
+ elif token_str is not None:
16
+ self.token = AuthToken.from_string(token_str)
17
+ elif token_b64 is not None:
18
+ self.token = AuthToken.from_base64(token_b64)
19
+ else:
20
+ self.token = None
21
+
22
+ def get_token(self) -> str:
23
+ return self.token.token
24
+
25
+ async def refresh_token(self) -> bool:
26
+ async with aiohttp.ClientSession(self.url) as session:
27
+ async with session.post(
28
+ "/api/AppParing/getToken",
29
+ headers={"accept": "*/*", "Content-Type": "application/json"},
30
+ data=jsonpickle.encode(self.token, unpicklable=False),
31
+ ) as response:
32
+ if response.status != 200:
33
+ return False
34
+ json_body = await response.json()
35
+
36
+ try:
37
+ self.token = AuthToken.from_json(json_body)
38
+ except ValueError:
39
+ return False
40
+
41
+ return True
@@ -123,9 +123,8 @@ class ConnectionHub:
123
123
  asyncio.run_coroutine_threadsafe(self.client._transport._ws.close(), self._loop)
124
124
 
125
125
  async def refresh_token(self):
126
- await self.connection.get_token()
127
- auth_token = self.connection.token.token
128
- self.client._transport._headers["Authorization"] = f"Bearer {auth_token}"
126
+ await self.connection.refresh_token()
127
+ self.client._transport._headers["Authorization"] = f"Bearer {self.connection.get_token()}"
129
128
  self.logger.info("Auth token refreshed")
130
129
 
131
130
  def send_serialized_data(self, event, value=None):
@@ -139,9 +138,9 @@ class ConnectionHub:
139
138
 
140
139
  self.logger.debug(f"Sending data, Event: {event}, Payload: {str(serialized_result)}")
141
140
 
142
- asyncio.run_coroutine_threadsafe(self.send_data(event, [serialized_result]), self._loop)
141
+ asyncio.run_coroutine_threadsafe(self.async_send_data(event, [serialized_result]), self._loop)
143
142
 
144
- async def send_data(self, event, data):
143
+ async def async_send_data(self, event, data):
145
144
  try:
146
145
  await self.client.send(event, data)
147
146
  except Exception:
@@ -36,10 +36,16 @@ class Federwiege:
36
36
 
37
37
  self.available = False
38
38
 
39
- def get_service(self, service: str):
40
- if service not in self.services:
39
+ def get_service(self, key: str):
40
+ if key not in self.services:
41
41
  return None
42
- return self.services[service]
42
+ return self.services[key]
43
+
44
+ def get_property(self, service_key: str, prop_key: str):
45
+ service = self.get_service(service_key)
46
+ if not service:
47
+ return None
48
+ return service.get_property(prop_key)
43
49
 
44
50
  def connect(self):
45
51
  with self._lock:
@@ -1,40 +0,0 @@
1
- import aiohttp
2
- import jsonpickle
3
-
4
- from . import AuthToken
5
-
6
-
7
- class Connection:
8
-
9
- def __init__(self, url: str, token: AuthToken = None, token_str=None, token_json=None, token_b64=None):
10
- self.url = url
11
- if token is not None:
12
- self.token = token
13
- elif token_json is not None:
14
- self.token = AuthToken.from_json(token_json)
15
- elif token_str is not None:
16
- self.token = AuthToken.from_string(token_str)
17
- elif token_b64 is not None:
18
- self.token = AuthToken.from_base64(token_b64)
19
- else:
20
- self.token = None
21
-
22
- async def get_token(self) -> AuthToken:
23
- try:
24
- async with aiohttp.ClientSession(self.url) as session:
25
- async with session.post(
26
- "/api/AppParing/getToken",
27
- headers={"accept": "*/*", "Content-Type": "application/json"},
28
- data=jsonpickle.encode(self.token, unpicklable=False),
29
- ) as response:
30
- if response.status != 200:
31
- return None
32
- json_body = await response.json()
33
- except ValueError:
34
- return None
35
- try:
36
- new_token = AuthToken.from_json(json_body)
37
- except ValueError:
38
- return None
39
- self.token = new_token
40
- return self.token
File without changes
File without changes
File without changes