Skip to content

Commit 75fbcb3

Browse files
committed
adds deepdiff
1 parent 94f0fed commit 75fbcb3

File tree

4 files changed

+21
-22
lines changed

4 files changed

+21
-22
lines changed

services/web/server/requirements/_base.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ aiosmtplib # email
3232
asyncpg # db
3333
captcha
3434
cryptography # security
35+
deepdiff[optimize] # diffs data-structures
3536
faker # Only used in dev-mode for proof-of-concepts
3637
gunicorn[setproctitle]
3738
httpx

services/web/server/requirements/_base.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ cryptography==41.0.7
189189
# -c requirements/../../../../requirements/constraints.txt
190190
# -r requirements/_base.in
191191
# aiohttp-session
192+
deepdiff==8.1.1
193+
# via -r requirements/_base.in
192194
deprecated==1.2.14
193195
# via
194196
# opentelemetry-api
@@ -455,6 +457,8 @@ opentelemetry-util-http==0.48b0
455457
# opentelemetry-instrumentation-aiohttp-client
456458
# opentelemetry-instrumentation-aiohttp-server
457459
# opentelemetry-instrumentation-requests
460+
orderly-set==5.2.3
461+
# via deepdiff
458462
orjson==3.10.0
459463
# via
460464
# -c requirements/../../../../packages/common-library/requirements/../../../requirements/constraints.txt
@@ -504,6 +508,7 @@ orjson==3.10.0
504508
# -r requirements/../../../../packages/simcore-sdk/requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in
505509
# -r requirements/../../../../packages/simcore-sdk/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in
506510
# -r requirements/_base.in
511+
# deepdiff
507512
packaging==24.1
508513
# via
509514
# -r requirements/../../../../packages/simcore-sdk/requirements/_base.in

services/web/server/src/simcore_service_webserver/licenses/_licensed_items_service.py

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from typing import NamedTuple
88

99
from aiohttp import web
10+
from deepdiff import DeepDiff
1011
from models_library.licensed_items import (
1112
LicensedItemDB,
1213
LicensedItemID,
@@ -48,18 +49,6 @@ class RegistrationResult(NamedTuple):
4849
message: str | None
4950

5051

51-
def _compute_difference(old_data: dict, new_data: dict):
52-
differences = {
53-
k: {"old": old_data[k], "new": new_data[k]}
54-
for k in old_data
55-
if old_data[k] != new_data.get(k)
56-
}
57-
differences.update(
58-
{k: {"old": None, "new": new_data[k]} for k in new_data if k not in old_data}
59-
)
60-
return differences
61-
62-
6352
async def register_resource_as_licensed_item(
6453
app: web.Application,
6554
*,
@@ -77,6 +66,8 @@ async def register_resource_as_licensed_item(
7766
#
7867
# This approach not only reduces unnecessary error logs but also helps prevent race conditions
7968
# when multiple concurrent calls attempt to register the same resource.
69+
70+
resource_key = f"{licensed_resource_type}, {licensed_resource_name}"
8071
new_licensed_resource_data = licensed_resource_data.model_dump(
8172
mode="json", exclude_unset=True
8273
)
@@ -89,20 +80,21 @@ async def register_resource_as_licensed_item(
8980
)
9081

9182
if licensed_item.licensed_resource_data != new_licensed_resource_data:
92-
# differences = _compute_difference(
93-
# licensed_item.licensed_resource_data or {},
94-
# new_licensed_resource_data,
95-
# )
96-
differences = "there are differences TMP"
97-
msg = f"DIFFERENT_RESOURCE: {licensed_resource_name}, {licensed_resource_type}. Difference:\n{pformat(differences)}"
83+
ddiff = DeepDiff(
84+
licensed_item.licensed_resource_data, new_licensed_resource_data
85+
)
86+
msg = (
87+
f"DIFFERENT_RESOURCE: {resource_key=} found in licensed_item_id={licensed_item.licensed_item_id} with different data. "
88+
f"Diff:\n\t{pformat(ddiff, indent=2, width=200)}"
89+
)
9890
return RegistrationResult(
9991
licensed_item, RegistrationState.DIFFERENT_RESOURCE, msg
10092
)
10193

10294
return RegistrationResult(
10395
licensed_item,
10496
RegistrationState.ALREADY_REGISTERED,
105-
f"ALREADY_REGISTERED: {licensed_resource_name}, {licensed_resource_type}",
97+
f"ALREADY_REGISTERED: {resource_key=} found in licensed_item_id={licensed_item.licensed_item_id}",
10698
)
10799

108100
except LicensedItemNotFoundError:
@@ -119,7 +111,7 @@ async def register_resource_as_licensed_item(
119111
return RegistrationResult(
120112
licensed_item,
121113
RegistrationState.NEWLY_REGISTERED,
122-
f"NEWLY_REGISTERED: {licensed_resource_name}, {licensed_resource_type}",
114+
f"NEWLY_REGISTERED: {resource_key=} registered with licensed_item_id={licensed_item.licensed_item_id}",
123115
)
124116

125117

services/web/server/tests/unit/with_dbs/04/licenses/test_itis_vip_service.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ async def test_sync_itis_vip_as_licensed_items(
189189
(
190190
licensed_item3,
191191
state3,
192-
_,
192+
msg,
193193
) = await _licensed_items_service.register_resource_as_licensed_item(
194194
client.app,
195195
licensed_resource_name=f"{category}/{vip.id}",
@@ -204,9 +204,10 @@ async def test_sync_itis_vip_as_licensed_items(
204204
),
205205
licensed_item_display_name="foo",
206206
)
207-
208207
assert state3 == RegistrationState.DIFFERENT_RESOURCE
209208
assert licensed_item2 == licensed_item3
209+
# {'values_changed': {"root['features']['functionality']": {'new_value': 'Non-Posable', 'old_value': 'Posable'}}}
210+
assert "functionality" in msg
210211

211212

212213
async def test_itis_vip_syncer_service(

0 commit comments

Comments
 (0)