flespi-sdk 0.1.3__py3-none-any.whl → 0.1.4__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.
flespi_sdk/account.py CHANGED
@@ -1,5 +1,7 @@
1
1
  from aiohttp import ClientSession
2
2
 
3
+ from flespi_sdk.exception import FlespiException
4
+ from flespi_sdk.modules.devices import Devices
3
5
  from flespi_sdk.modules.metadata import Metadata
4
6
  from flespi_sdk.modules.mqtt import MQTT
5
7
  from flespi_sdk.modules.realms import Realms
@@ -60,7 +62,10 @@ class Account:
60
62
  "/platform/customer", headers=dict(Authorization=f"FlespiToken {token}")
61
63
  ) as response:
62
64
  if response.status != 200:
63
- raise Exception("Failed to get account ID: " + str(response.status))
65
+ raise FlespiException(
66
+ status_code=response.status,
67
+ errors=(await response.json())["errors"],
68
+ )
64
69
  response_json = await response.json()
65
70
  result = response_json["result"]
66
71
  id = result[0]["id"]
@@ -71,7 +76,13 @@ class Account:
71
76
  self._init_modules()
72
77
 
73
78
  def _init_modules(self):
74
- self.metadata = Metadata("platform/customer", self.session, self.id)
79
+ self.metadata = Metadata(
80
+ item_path="platform/customer",
81
+ metadata=None,
82
+ session=self.session,
83
+ cid=self.id,
84
+ )
75
85
  self.subaccounts = Subaccounts(self.session, self.id)
76
86
  self.realms = Realms(self.session, self.id)
77
87
  self.mqtt = MQTT(self.session, self.id)
88
+ self.devices = Devices(self.session, self.id)
@@ -0,0 +1,41 @@
1
+ from aiohttp import ClientSession
2
+ from flespi_sdk.modules.devices.device import Device
3
+ from flespi_sdk.modules.flespi_session import FlespiSession
4
+
5
+
6
+ class Devices(FlespiSession):
7
+ def __init__(self, session: ClientSession, cid: int | None = None):
8
+ super().__init__(session=session, cid=cid)
9
+
10
+ async def get(self, id: int, fields: list[str] = []):
11
+ async with self.session.get(
12
+ f"/gw/devices/{id}",
13
+ params=dict(fields=super().prepare_fields(fields)),
14
+ headers=self.get_headers(),
15
+ ) as response:
16
+ result = await self.get_result(response)
17
+ device = result[0]
18
+ return Device(
19
+ id=device["id"],
20
+ metadata=device["metadata"],
21
+ fields={field: device[field] for field in fields},
22
+ session=self.session,
23
+ cid=self.cid,
24
+ )
25
+
26
+ async def list(self, selector: str = "all", fields: list[str] = []):
27
+ async with self.session.get(
28
+ f"/gw/devices/{selector}",
29
+ headers=self.get_headers(),
30
+ params=dict(fields=super().prepare_fields(fields)),
31
+ ) as response:
32
+ return [
33
+ Device(
34
+ id=device["id"],
35
+ metadata=device["metadata"],
36
+ fields={field: device[field] for field in fields},
37
+ session=self.session,
38
+ cid=self.cid,
39
+ )
40
+ for device in await self.get_result(response)
41
+ ]
@@ -0,0 +1,21 @@
1
+ from aiohttp import ClientSession
2
+ from flespi_sdk.modules.item_with_metadata import ItemWithMetadata
3
+
4
+
5
+ class Device(ItemWithMetadata):
6
+ def __init__(
7
+ self,
8
+ id: int,
9
+ metadata: dict,
10
+ fields: dict,
11
+ session: ClientSession,
12
+ cid: int | None,
13
+ ):
14
+ super().__init__(
15
+ id=id,
16
+ metadata=metadata,
17
+ fields=fields,
18
+ item_path=f"gw/devices/{id}",
19
+ session=session,
20
+ cid=cid,
21
+ )
@@ -24,3 +24,6 @@ class FlespiSession:
24
24
  response_json = await response.json()
25
25
  result = response_json["result"]
26
26
  return result
27
+
28
+ def prepare_fields(self, fields: list[str] = []):
29
+ return ",".join(list(set(["id", "metadata"] + fields)))
@@ -6,17 +6,20 @@ from flespi_sdk.modules.metadata import Metadata
6
6
  class ItemWithMetadata(FlespiSession):
7
7
  def __init__(
8
8
  self,
9
- parent_id: int | None,
10
9
  id: int,
11
10
  item_path: str,
12
11
  session: ClientSession,
12
+ metadata: dict | None = None,
13
+ fields: dict = {},
13
14
  cid: int | None = None,
14
15
  ):
15
16
  super().__init__(session, cid)
16
- self.parent_id = parent_id
17
17
  self.id = id
18
18
  self.item_path = item_path
19
- self.metadata = Metadata(item_path, session, cid)
19
+ self.initial_fields = fields
20
+ self.metadata = Metadata(
21
+ item_path=item_path, metadata=metadata, session=session, cid=cid
22
+ )
20
23
 
21
24
  async def get_name(self) -> str:
22
25
  """
@@ -29,3 +32,19 @@ class ItemWithMetadata(FlespiSession):
29
32
  ) as response:
30
33
  result = await self.get_result(response)
31
34
  return result[0]["name"]
35
+
36
+ def get_initial_fields(self):
37
+ return self.initial_fields
38
+
39
+ async def get_fields(self, fields: list[str]) -> dict:
40
+ """
41
+ Get fields for the current device.
42
+ :return: Dictionary with fields.
43
+ """
44
+ async with self.session.get(
45
+ self.item_path,
46
+ params=dict(fields=fields),
47
+ headers=self.get_headers(),
48
+ ) as response:
49
+ result = await self.get_result(response)
50
+ return result[0]
@@ -5,28 +5,39 @@ from flespi_sdk.modules.flespi_session import FlespiSession
5
5
 
6
6
  class Metadata(FlespiSession):
7
7
  def __init__(
8
- self, item_path, session: aiohttp.ClientSession, cid: int | None = None
8
+ self,
9
+ item_path,
10
+ metadata: dict | None,
11
+ session: aiohttp.ClientSession,
12
+ cid: int | None,
9
13
  ):
10
14
  super().__init__(session, cid)
11
15
  self.item_path = item_path
16
+ self.metadata_cache = metadata
12
17
 
13
- async def get(self) -> dict:
18
+ async def get(self, use_cache: bool = True) -> dict:
14
19
  """
15
20
  Get metadata for the current account.
16
21
  :return: Metadata as a dictionary.
17
22
  """
23
+ if self.metadata_cache and use_cache:
24
+ return self.metadata_cache
25
+
18
26
  params = {"fields": "metadata"}
19
27
  async with self.session.get(
20
28
  self.item_path, params=params, headers=self.get_headers()
21
29
  ) as response:
22
30
  result = await self.get_result(response)
23
- return result[0]["metadata"]
31
+ metadata = result[0]["metadata"]
32
+ self.metadata_cache = metadata
33
+ return metadata
24
34
 
25
35
  async def set(self, metadata: dict) -> None:
26
36
  """ "
27
37
  "Set metadata for the current account.
28
38
  :param metadata: Metadata as a dictionary.
29
39
  """
40
+ self.metadata_cache = None
30
41
  async with self.session.put(
31
42
  self.item_path,
32
43
  json={"metadata": metadata},
@@ -34,13 +45,13 @@ class Metadata(FlespiSession):
34
45
  ) as response:
35
46
  await self.get_result(response)
36
47
 
37
- async def get_value(self, key_path: str):
48
+ async def get_value(self, key_path: str, use_cache: bool = True):
38
49
  """
39
50
  Get a specific value from the metadata.
40
51
  :param key_path: The key path to the value in the metadata.
41
52
  :return: The value from the metadata.
42
53
  """
43
- metadata = await self.get()
54
+ metadata = await self.get(use_cache=use_cache)
44
55
  if not metadata:
45
56
  return None
46
57
  keys = key_path.split(".")
@@ -58,7 +69,7 @@ class Metadata(FlespiSession):
58
69
  :param key_path: The key path to the value in the metadata.
59
70
  :param value: The value to set.
60
71
  """
61
- metadata = await self.get() or {}
72
+ metadata = await self.get(use_cache=False) or {}
62
73
  keys = key_path.split(".")
63
74
  metadata_level = metadata
64
75
  for key in keys[:-1]:
@@ -73,7 +84,7 @@ class Metadata(FlespiSession):
73
84
  Delete a specific key from the metadata.
74
85
  :param key_path: The key path to the value in the metadata.
75
86
  """
76
- metadata = await self.get()
87
+ metadata = await self.get(use_cache=False)
77
88
  if not metadata:
78
89
  return
79
90
  keys = key_path.split(".")
@@ -8,25 +8,36 @@ class Realms(FlespiSession):
8
8
  def __init__(self, session: aiohttp.ClientSession, cid: int | None = None):
9
9
  super().__init__(session, cid)
10
10
 
11
- async def get(self, id: int):
11
+ async def get(self, id: int, fields: list[str] = []):
12
12
  async with self.session.get(
13
- f"/platform/realms/{id}", headers=self.get_headers()
13
+ f"/platform/realms/{id}",
14
+ params=dict(fields=super().prepare_fields(fields)),
15
+ headers=self.get_headers(),
14
16
  ) as response:
15
17
  result = await self.get_result(response)
16
18
  realm = result[0]
17
19
  return Realm(
18
- realm_id=realm["id"],
20
+ id=realm["id"],
21
+ metadata=realm["metadata"],
22
+ fields={field: realm[field] for field in fields},
19
23
  session=self.session,
20
24
  cid=self.cid,
21
25
  )
22
26
 
23
- async def list(self, selector: str = "all"):
27
+ async def list(self, selector: str = "all", fields: list[str] = []):
24
28
  async with self.session.get(
25
29
  f"/platform/realms/{selector}",
30
+ params=dict(fields=super().prepare_fields(fields)),
26
31
  headers=self.get_headers(),
27
32
  ) as response:
28
33
  result = await self.get_result(response)
29
34
  return [
30
- Realm(realm_id=realm["id"], session=self.session, cid=self.cid)
35
+ Realm(
36
+ id=realm["id"],
37
+ metadata=realm["metadata"],
38
+ fields={field: realm[field] for field in fields},
39
+ session=self.session,
40
+ cid=self.cid,
41
+ )
31
42
  for realm in result
32
43
  ]
@@ -11,18 +11,27 @@ class Realm(ItemWithMetadata):
11
11
  Represents a realm in the Flespi system.
12
12
  """
13
13
 
14
- def __init__(self, realm_id: int, session: ClientSession, cid: int | None = None):
15
- item_path = f"platform/realms/{realm_id}"
14
+ def __init__(
15
+ self,
16
+ id: int,
17
+ metadata: dict,
18
+ fields: dict,
19
+ session: ClientSession,
20
+ cid: int | None = None,
21
+ ):
16
22
  super().__init__(
17
- parent_id=None, id=realm_id, item_path=item_path, session=session, cid=cid
23
+ id=id,
24
+ item_path=f"platform/realms/{id}",
25
+ metadata=metadata,
26
+ fields=fields,
27
+ session=session,
28
+ cid=cid,
18
29
  )
19
30
  self.users = Users(
20
- realm_id=realm_id,
31
+ realm_id=id,
21
32
  client_session=session,
22
33
  cid=cid,
23
34
  )
24
35
 
25
- self.home = RealmHome(realm_id=realm_id, session=session, cid=cid)
26
- self.token_params = RealmTokenParams(
27
- realm_id=realm_id, session=session, cid=cid
28
- )
36
+ self.home = RealmHome(realm_id=id, session=session, cid=cid)
37
+ self.token_params = RealmTokenParams(realm_id=id, session=session, cid=cid)
@@ -23,20 +23,29 @@ class Users(FlespiSession):
23
23
  super().__init__(client_session, cid)
24
24
  self.realm_id = realm_id
25
25
 
26
- async def get(self, user_id: int) -> User:
26
+ async def get(self, id: int, fields: list[str] = []) -> User:
27
27
  """
28
28
  Get a user by ID.
29
29
  :param user_id: The ID of the user to retrieve.
30
30
  :return: A User object.
31
31
  """
32
32
  async with self.session.get(
33
- f"/platform/realms/{self.realm_id}/users/{user_id}",
33
+ f"/platform/realms/{self.realm_id}/users/{id}",
34
+ params=dict(fields=super().prepare_fields(fields)),
34
35
  headers=self.get_headers(),
35
36
  ) as response:
36
37
  result = await self.get_result(response)
37
- return User(self.realm_id, result[0]["id"], self.session, self.cid)
38
+ user = result[0]
39
+ return User(
40
+ id=user["id"],
41
+ realm_id=self.realm_id,
42
+ metadata=user["metadata"],
43
+ fields={field: user[field] for field in fields},
44
+ session=self.session,
45
+ cid=self.cid,
46
+ )
38
47
 
39
- async def list(self, selector: str = "all") -> list[User]:
48
+ async def list(self, selector: str = "all", fields: list[str] = []) -> list[User]:
40
49
  """
41
50
  List all users in the realm.
42
51
  :param selector: The selector to filter users.
@@ -44,10 +53,18 @@ class Users(FlespiSession):
44
53
  """
45
54
  async with self.session.get(
46
55
  f"/platform/realms/{self.realm_id}/users/{selector}",
56
+ params=dict(fields=super().prepare_fields(fields)),
47
57
  headers=self.get_headers(),
48
58
  ) as response:
49
59
  result = await self.get_result(response)
50
60
  return [
51
- User(self.realm_id, user["id"], self.session, self.cid)
61
+ User(
62
+ id=user["id"],
63
+ realm_id=self.realm_id,
64
+ metadata=user["metadata"],
65
+ fields={field: user[field] for field in fields},
66
+ session=self.session,
67
+ cid=self.cid,
68
+ )
52
69
  for user in result
53
70
  ]
@@ -5,8 +5,10 @@ from flespi_sdk.modules.item_with_metadata import ItemWithMetadata
5
5
  class User(ItemWithMetadata):
6
6
  def __init__(
7
7
  self,
8
+ id: int,
8
9
  realm_id: int,
9
- user_id: int,
10
+ metadata: dict,
11
+ fields: dict,
10
12
  session: ClientSession,
11
13
  cid: int | None = None,
12
14
  ):
@@ -15,11 +17,12 @@ class User(ItemWithMetadata):
15
17
 
16
18
  :param client: The client instance used to make API requests.
17
19
  """
18
- item_path = f"platform/realms/{realm_id}/users/{user_id}"
20
+ self.realm_id = realm_id
19
21
  super().__init__(
20
- parent_id=realm_id,
21
- id=user_id,
22
- item_path=item_path,
22
+ id=id,
23
+ item_path=f"platform/realms/{realm_id}/users/{id}",
24
+ metadata=metadata,
25
+ fields=fields,
23
26
  session=session,
24
27
  cid=cid,
25
28
  )
@@ -37,7 +40,7 @@ class User(ItemWithMetadata):
37
40
  raise ValueError("Password must be at least 16 characters long")
38
41
 
39
42
  async with self.session.put(
40
- f"/platform/realms/{self.parent_id}/users/{self.id}",
43
+ self.item_path,
41
44
  json={"password": password},
42
45
  headers=self.get_headers(),
43
46
  ) as response:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flespi-sdk
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: Add your description here
5
5
  Author-email: Sergey Shevchik <sergey.shevchik@gmail.com>
6
6
  Requires-Python: >=3.11
@@ -0,0 +1,22 @@
1
+ flespi_sdk/__init__.py,sha256=INx-TmKYpKi9SC0-UMqtqKwnMnHK88oXyvh3tTFY668,1462
2
+ flespi_sdk/account.py,sha256=fotm0kL36R5aHWSs-lh5VkZQKh21TJA4OjckBQgvzto,3103
3
+ flespi_sdk/cli.py,sha256=6OcRQAu-LLFTYGGY_S0SNTXgHlazr3NaMDqPQ7QLg_E,1346
4
+ flespi_sdk/exception.py,sha256=cffPxxMtUCyPO121XBzSzQ2yxUlJ75e18YaD3ikBZlg,356
5
+ flespi_sdk/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ flespi_sdk/modules/flespi_session.py,sha256=L4mewq3zpHT5C5xq57kJXGvszfJGARDI0zxfd9jswEY,918
7
+ flespi_sdk/modules/item_with_metadata.py,sha256=7jxVvDMpYinHINgxEzXIvnoYvuCchLMGJQkUAklhX54,1493
8
+ flespi_sdk/modules/items_container.py,sha256=5c8ov35NQ8dVmDGpq68ROaVIj8VtySaE0Rlrk0JUsLc,1440
9
+ flespi_sdk/modules/devices/__init__.py,sha256=OAt-9F5yGcxcdvYi94l30DXpHohLzObtR76fTrCDEuU,1545
10
+ flespi_sdk/modules/devices/device.py,sha256=kvQRGcJaV3Fdy6C6uSMbKDVKBa1dh0LsvcX6KX_rU2U,499
11
+ flespi_sdk/modules/metadata/__init__.py,sha256=5e5svwrt-CY2bHr7dVbxeFJ-fyQMQHAtAQmBNUQC4a4,3173
12
+ flespi_sdk/modules/mqtt/__init__.py,sha256=nLUQxrNpJ2E8l-OGyOAE-dfyOpQ4_-bjC-fkUEj_8As,2714
13
+ flespi_sdk/modules/realms/__init__.py,sha256=cVdYLJF3lMNBWgQxvxGpbI2sNebZeUR1ldQ7ZOx6CJ4,1547
14
+ flespi_sdk/modules/realms/realm.py,sha256=XOogurRt5jXm5srFzWak7asQTFIP3GcZAuXlGm44fE8,1030
15
+ flespi_sdk/modules/realms/realm_home.py,sha256=WICjpFfNqW35iZYzLeWgPgg39ZdBwlI2SUClBWvgxEk,1488
16
+ flespi_sdk/modules/realms/realm_token_params.py,sha256=dCQUAdDtzKoYbvSAatJsAdxomM267sZYC2BuE_O90w8,2835
17
+ flespi_sdk/modules/realms/users/__init__.py,sha256=YpUM5IMIJQo2-0quKZI_ZZTjoYRDsVFj3um9BZR9Qwc,2438
18
+ flespi_sdk/modules/realms/users/user.py,sha256=_BFKKGvv-J-3FD2DBU3uJtZd-yD-40aoFbB0SAcrDwE,1271
19
+ flespi_sdk/modules/subaccounts/__init__.py,sha256=PhS91e9FoV3m6VkfrANoq0_Zf-v139VsShGBXoPaJ-I,1044
20
+ flespi_sdk-0.1.4.dist-info/METADATA,sha256=xNrALQsmqn6gqO-xTIfcSppKiUaSI6lZvZQNkT-HtXc,2267
21
+ flespi_sdk-0.1.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
22
+ flespi_sdk-0.1.4.dist-info/RECORD,,
@@ -1,20 +0,0 @@
1
- flespi_sdk/__init__.py,sha256=INx-TmKYpKi9SC0-UMqtqKwnMnHK88oXyvh3tTFY668,1462
2
- flespi_sdk/account.py,sha256=tu4JX4Qh8Sf25BbX4RMvXjWs5DJg2W_LeasaBSYzAzo,2774
3
- flespi_sdk/cli.py,sha256=6OcRQAu-LLFTYGGY_S0SNTXgHlazr3NaMDqPQ7QLg_E,1346
4
- flespi_sdk/exception.py,sha256=cffPxxMtUCyPO121XBzSzQ2yxUlJ75e18YaD3ikBZlg,356
5
- flespi_sdk/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- flespi_sdk/modules/flespi_session.py,sha256=TdYYfLaXpU4eeKODNCtUYvm0-1Ka5V32MRHc7bojUqo,799
7
- flespi_sdk/modules/item_with_metadata.py,sha256=_J1dvU_aFg6yTeiKFuQPNMFEZnFkP5Li6NePXpyqRzY,906
8
- flespi_sdk/modules/items_container.py,sha256=5c8ov35NQ8dVmDGpq68ROaVIj8VtySaE0Rlrk0JUsLc,1440
9
- flespi_sdk/modules/metadata/__init__.py,sha256=3-FNhSeWFQIlUZH8jnCAVbiJvQI7emAz3I8LRB92VPU,2792
10
- flespi_sdk/modules/mqtt/__init__.py,sha256=nLUQxrNpJ2E8l-OGyOAE-dfyOpQ4_-bjC-fkUEj_8As,2714
11
- flespi_sdk/modules/realms/__init__.py,sha256=U3nT0Zwz7Y6knmEsL3jDqxwRntM3GgmMqJUERCJJsTs,1063
12
- flespi_sdk/modules/realms/realm.py,sha256=cXhEnfzSiV1ZMJWTYqG90Whon0-qUYmZ_rEf_xPc7Mw,954
13
- flespi_sdk/modules/realms/realm_home.py,sha256=WICjpFfNqW35iZYzLeWgPgg39ZdBwlI2SUClBWvgxEk,1488
14
- flespi_sdk/modules/realms/realm_token_params.py,sha256=dCQUAdDtzKoYbvSAatJsAdxomM267sZYC2BuE_O90w8,2835
15
- flespi_sdk/modules/realms/users/__init__.py,sha256=hHv5R_eySJ_ioQIfYjYHbnbcMm1NhSKBKBpsNILHfbE,1798
16
- flespi_sdk/modules/realms/users/user.py,sha256=Y6Z3WZuzyl9-IOvKl4_OkBXBT2nIiq8L_dWF6MhD-IY,1249
17
- flespi_sdk/modules/subaccounts/__init__.py,sha256=PhS91e9FoV3m6VkfrANoq0_Zf-v139VsShGBXoPaJ-I,1044
18
- flespi_sdk-0.1.3.dist-info/METADATA,sha256=7chNQ96JQ9T-WiFPWa9QJ5VmU1A_JCX1IGxamif0H1M,2267
19
- flespi_sdk-0.1.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
- flespi_sdk-0.1.3.dist-info/RECORD,,