howler-api 2.10.0.dev255__py3-none-any.whl → 2.13.0.dev344__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.

Potentially problematic release.


This version of howler-api might be problematic. Click here for more details.

@@ -0,0 +1,45 @@
1
+ from typing import Any, Optional, Union
2
+
3
+ from howler.common.loader import datastore
4
+ from howler.common.logging import get_logger
5
+ from howler.datastore.exceptions import SearchException
6
+ from howler.odm.models.analytic import Analytic
7
+ from howler.odm.models.hit import Hit
8
+ from howler.utils.str_utils import sanitize_lucene_query
9
+
10
+ logger = get_logger(__file__)
11
+
12
+
13
+ def get_matching_templates(
14
+ hits: Union[list[Hit], list[dict[str, Any]]], uname: Optional[str] = None, as_odm: bool = False
15
+ ) -> Union[list[dict[str, Any]], list[Analytic]]:
16
+ """Generate a list of templates matching a given list of analytic names, and optionally a user.
17
+
18
+ Args:
19
+ hits (list[Hit] | list[dict[str, Any]]]: List of hits, each containing analytic information.
20
+ uname (Optional[str], optional): Username to filter templates by owner. Defaults to None.
21
+ as_odm (bool, optional): If True, return results as ODM objects. If False, return as dicts. Defaults to False.
22
+
23
+ Returns:
24
+ list[dict[str, Any]] | list[Analytic]: List of matching templates, either as dicts or Analytic ODM objects.
25
+ """
26
+ if len(hits) < 1:
27
+ return []
28
+
29
+ analytic_names: set[str] = set()
30
+ for hit in hits:
31
+ analytic_names.add(f'"{sanitize_lucene_query(hit["howler"]["analytic"])}"')
32
+
33
+ if len(analytic_names) < 1:
34
+ return []
35
+
36
+ try:
37
+ template_candidates = datastore().template.search(
38
+ f"analytic:({' OR '.join(analytic_names)}) AND (type:global OR owner:{uname or '*'})",
39
+ as_obj=as_odm,
40
+ )["items"]
41
+
42
+ return template_candidates
43
+ except SearchException:
44
+ logger.exception("Exception on analytic matching")
45
+ return []
howler/utils/lucene.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import ipaddress
2
+ import math
2
3
  import re
3
4
  import sys
4
5
  from datetime import datetime
@@ -19,6 +20,25 @@ def try_parse_date(date: str) -> Optional[datetime]:
19
20
  return None
20
21
 
21
22
 
23
+ def try_parse_number(number: str | int | float) -> Optional[Union[int, float]]:
24
+ "Try and parse a number string into an integer or float type, or infinity. Returns None if string is invalid."
25
+ if isinstance(number, (int, float)):
26
+ return number
27
+
28
+ if number.lower() == "infinity":
29
+ return math.inf
30
+
31
+ try:
32
+ # Check if the value is an integer
33
+ return int(number)
34
+ except ValueError:
35
+ try:
36
+ # Check if the value is a float
37
+ return float(number)
38
+ except ValueError:
39
+ return None
40
+
41
+
22
42
  def try_parse_ip(ip: str) -> Optional[Union[ipaddress.IPv4Address, ipaddress.IPv6Address]]:
23
43
  "Try and parse an ipv4/ipv6 string into a date. Returns None if string is invalid."
24
44
  try:
@@ -50,8 +70,8 @@ def normalize_phrase(value: str, type: Union[Literal["phrase"], Literal["word"]]
50
70
  return [value, value.lower()]
51
71
 
52
72
  if type == "word":
53
- value = re.sub(r"[^a-z0-9.,@_:/;()]", "", value.lower())
73
+ value = re.sub(r"[^a-z0-9.,@_:/;()\-]", "", value.lower())
54
74
  else:
55
- value = re.sub(r"[^a-z0-9.,@_:/;() ]", "", value, flags=re.IGNORECASE)
75
+ value = re.sub(r"[^a-z0-9.,@_:/;()\- ]", "", value, flags=re.IGNORECASE)
56
76
 
57
77
  return [value]
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 2.10.0.dev255
3
+ Version: 2.13.0.dev344
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
20
21
  Classifier: Topic :: Software Development :: Libraries
21
22
  Requires-Dist: apscheduler (==3.10.4)
22
23
  Requires-Dist: authlib (>=1.6.0,<2.0.0)
@@ -33,7 +34,6 @@ Requires-Dist: gevent (==23.9.1)
33
34
  Requires-Dist: gunicorn (==23.0.0)
34
35
  Requires-Dist: luqum (>=1.0.0,<2.0.0)
35
36
  Requires-Dist: mergedeep (>=1.3.4,<2.0.0)
36
- Requires-Dist: netifaces (==0.11.0)
37
37
  Requires-Dist: packaging (<25.0)
38
38
  Requires-Dist: passlib (==1.7.4)
39
39
  Requires-Dist: prometheus-client (==0.17.1)
@@ -54,8 +54,8 @@ Requires-Dist: requests (==2.32.4)
54
54
  Requires-Dist: typing-extensions (>=4.12.2,<5.0.0)
55
55
  Requires-Dist: validators (>=0.34.0,<0.35.0)
56
56
  Requires-Dist: wsproto (==1.2.0)
57
- Project-URL: Documentation, https://cybercentrecanada.github.io/howler-docs/developer/backend/
58
- Project-URL: Homepage, https://cybercentrecanada.github.io/howler-docs/
57
+ Project-URL: Documentation, https://cybercentrecanada.github.io/howler/developer/backend/
58
+ Project-URL: Homepage, https://cybercentrecanada.github.io/howler/
59
59
  Project-URL: Repository, https://github.com/CybercentreCanada/howler-api
60
60
  Description-Content-Type: text/markdown
61
61
 
@@ -10,28 +10,28 @@ howler/actions/promote.py,sha256=v2lFS4WkOpX47ChbSYbhJKzwAShYE3Fg2UVQ6sbr7Yw,470
10
10
  howler/actions/remove_from_bundle.py,sha256=Tt9zPZuPrplM8lvCo2sHKORY4U4z3S6RfltXRigDvF4,4251
11
11
  howler/actions/remove_label.py,sha256=I6_4KnBgvW6OwP7tNe5LMbaOZfAVf5S9ADijBt7g-9A,3325
12
12
  howler/actions/transition.py,sha256=7gGWGY0wKZjp87-BpqfMjImAz-QXHSyDJA3bWq3RTz4,6423
13
- howler/api/__init__.py,sha256=Zc5-ldSpe2GFWoL5DYMpoEdu7VZm5KMtGI03m2tnDZk,8543
13
+ howler/api/__init__.py,sha256=Z-o_fukNO9wBpx9gLNm8OPZwFOP-4xMtY0V1sfdEn8w,8539
14
14
  howler/api/base.py,sha256=i--N7f4itJBRNVayDAqOiZYIq9thXwdblRBGfePyP1c,2689
15
15
  howler/api/socket.py,sha256=6T_gpyazIbSmA2BheZ-yUWPbdxg9C50az70-rq4o-Rc,3910
16
16
  howler/api/v1/__init__.py,sha256=lupGaCMXiiVWJjWrV7AoutAcTvZUrYommD-oUf4SFgU,3857
17
17
  howler/api/v1/action.py,sha256=sZFihfJQFmzhg9Gc7o0A73pDZls_s8Xjf3mfzB2Nkr4,11112
18
18
  howler/api/v1/analytic.py,sha256=kN7YXSTaXEWusu5DjAC510qlDzAIzsV7j7QjNw1daoY,20146
19
- howler/api/v1/auth.py,sha256=mTuxh2lH6a1T2JUgT3f6Rxnek3bY-Tz7XvgGAP0po4g,14072
20
- howler/api/v1/borealis.py,sha256=Jn8rhVtDOGIOgf92OdiGai-1rmw0-5hBp5FFAbZ3LHY,3168
19
+ howler/api/v1/auth.py,sha256=fj0t6COXesgrShZQlP0zZXR12htjYlzLGGMIDsiX8nM,14069
20
+ howler/api/v1/clue.py,sha256=QaXmk9hTIkt7Cp4oAjCZuhtGeOo_C6yeNmhQY-egVsM,3042
21
21
  howler/api/v1/configs.py,sha256=cjii7WY1AtTyk56O84_WR-_JVonoXpWCrh2eMEuuGro,1921
22
- howler/api/v1/dossier.py,sha256=15g8dVAmzBtZjUg7-iMRYkyqrnCKywF08TdxZR7Z8X8,6299
22
+ howler/api/v1/dossier.py,sha256=8mfuoxAHqT9a_0BHRBO9G33KLJUa9xwcfOImb6ax8mU,5816
23
23
  howler/api/v1/help.py,sha256=hqBvzW-DYX-I4Q85dbCQgpHsXyWDXp06a1fE9zhFMH4,823
24
- howler/api/v1/hit.py,sha256=71xF-v23er_1XQ0dF6N6h9dJvmFoqXn0W14aJkW1clc,33819
24
+ howler/api/v1/hit.py,sha256=HKaI72k7VC0v4QPjE2zcAV6jizvY2ZWEpk1BiAklvgU,34031
25
25
  howler/api/v1/notebook.py,sha256=-cahdJ9u1lAB_nheztayHKtXvoPZcj04N8nqQ2U-HLo,2015
26
26
  howler/api/v1/overview.py,sha256=e-WiHuMvOPy8Y7xIGnceagdI0_jebqlgDxi6GE6tfaA,4999
27
- howler/api/v1/search.py,sha256=1wg6jk5E8Jy2yq0LwxsASrS7QhpHUDoRlHPe8-V_htI,21646
27
+ howler/api/v1/search.py,sha256=24r1vaYaxDhddzDR-c5dBdRKyag6aIggvHSWPWudqN8,26372
28
28
  howler/api/v1/template.py,sha256=oexzUpAMVdgI6IOXITPx0iEfZIVP-kvlExRdFd6QVdk,5769
29
29
  howler/api/v1/tool.py,sha256=6CN5LIXgxaAvxEHE6s4IFtAEhQo_zBLtl6ghbM8whjE,6737
30
- howler/api/v1/user.py,sha256=sFQk9xw2ypANhhgoB2GGqFduZeurpI9er9Eajwg74EY,13876
30
+ howler/api/v1/user.py,sha256=YQh6eCAi4bsC_w9eGX0ZgnLoFL4z4efEc1knJsZhj4k,13842
31
31
  howler/api/v1/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- howler/api/v1/utils/etag.py,sha256=-tljW8Cr1V-74Chd0bgTJzWuJCe8E7wXMiDOQP5d578,1496
33
- howler/api/v1/view.py,sha256=M6zffR12A9oJox_KcgbirhoVaBka0HXNLizb66mWGWw,8123
34
- howler/app.py,sha256=AJJ8TGMSi9hJGc7IR7xKsZuVwg-ih85-t0PRO0-ntHw,7063
32
+ howler/api/v1/utils/etag.py,sha256=IGB4WUkecHbBt0KKLQFCxCn0mN3T_aSPG0y45l_zT9I,3431
33
+ howler/api/v1/view.py,sha256=VyizfGehsuoPyn7iswGPKCLcbSQoO1ipRsbr91nSDKk,8228
34
+ howler/app.py,sha256=76WSFUM4UKX2UpvDHfgKP8DI3wavLpXGlk2QLHqH1x8,7043
35
35
  howler/common/README.md,sha256=lgnrAdgnOADmmfRplhbfYD7jU627nr3zO-fJ6N4Nbcs,6577
36
36
  howler/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  howler/common/classification.py,sha256=AUl33PJX6O9d9XzxHbyyJah2ffD7Q7J2yYqIwz7OqKY,39342
@@ -51,17 +51,18 @@ howler/config.py,sha256=amwf4FXJ1ZKeooHqPlC_F691tg6Yaj4osKn_ExiUSS0,2128
51
51
  howler/cronjobs/__init__.py,sha256=GEhNsxPGATumlroMa-g6z5Dt9yy0QT93s3uuNC-GwIM,909
52
52
  howler/cronjobs/retention.py,sha256=I-vXXFo2W5eHkJ-xQuywU2-KfM9xqgii9Y99Qd9E-Vk,1777
53
53
  howler/cronjobs/rules.py,sha256=ZK3FmLsEF34-3vQzXkc4J6Y0P5-JSawMSnAkH9o-PeE,10406
54
- howler/datastore/README.md,sha256=2JT3DaM7ukEYqmS9A1QmdABfxCykjMjbQsIbshXxYFI,4886
54
+ howler/cronjobs/view_cleanup.py,sha256=ULWLR1uFcRemRgkEDrMqmBamHiE0dgDvu49VK0qDkuw,3076
55
+ howler/datastore/README.md,sha256=ekWl1YJSrHlZpU5PgBkPEzPWjdbTdav6Rd2P0ccIesw,4758
55
56
  howler/datastore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
57
  howler/datastore/bulk.py,sha256=VfolZfiaBD4ZTK3j6IVVVq4GMjVXb5elrsGwwM_nONE,2829
57
- howler/datastore/collection.py,sha256=XcMqVSDF2gU9xYuBxoQlI1nI4fzey3sfzj_f2EuBuwg,91260
58
+ howler/datastore/collection.py,sha256=psNzGxHncvWFWPb_s6SGq3LBnF31FAwyePnKMZL1VME,90223
58
59
  howler/datastore/constants.py,sha256=XjIxE9za_kx6OpvulzpnYcZ9c0GqvIaAKhvonjWRgZo,2387
59
60
  howler/datastore/exceptions.py,sha256=yZvQXRI4mR50ltGFHbdZAD4TIbhdKJku6LLTPQ0JZRk,955
60
- howler/datastore/howler_store.py,sha256=5ts4IvZUqOUBZBz1RspgOgbbeJIoNF4J1hRDLog9ivo,4737
61
+ howler/datastore/howler_store.py,sha256=kW7FKM-tILcfTmrjSB1yZm-ZnumPS_tiQEZUDaQoDkg,2915
61
62
  howler/datastore/migrations/fix_process.py,sha256=J0FxqcXbQ161sgmQ5teyEcPuX7WYB9wqs0CO8m1jk0U,1218
62
63
  howler/datastore/operations.py,sha256=5WdJBewXRIG71ZexQcYASv0IYoDi1m9ia8332u5mXSs,3919
63
64
  howler/datastore/schemas.py,sha256=kuxqYVWMgqnrdU-ypkDxoSzEtECUrRCKXjU_R5Kg7X4,3158
64
- howler/datastore/store.py,sha256=MiAJO55jrkZuB572vbQJAceCNcA7PeU4tLbzkoSLLqA,6111
65
+ howler/datastore/store.py,sha256=MzIvZy8deMgpnKR-TKTTcttH6kkYy4EBSYMCh0Q-J0E,7055
65
66
  howler/datastore/support/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
67
  howler/datastore/support/build.py,sha256=5cX2Jl9vTgCWa_hiM-7LwxVm3pwHN5k0eiyGzHo11vE,7861
67
68
  howler/datastore/support/schemas.py,sha256=kuxqYVWMgqnrdU-ypkDxoSzEtECUrRCKXjU_R5Kg7X4,3158
@@ -85,9 +86,9 @@ howler/helper/workflow.py,sha256=fsYhjeZo1foM0J8AW3nMjTEJOAnh9R6L0f4ZL12pE4E,480
85
86
  howler/helper/ws.py,sha256=ONxC7DFYGQKpp0AmrFqQLeIyxOMD4nHk5i6lFyWOtqo,15911
86
87
  howler/odm/README.md,sha256=Ihc_DyjVQlLaIOEbPoQNPkum9Ecn8kn37-PMFQsX77s,5645
87
88
  howler/odm/__init__.py,sha256=1n6vgBOrFcCHSBFysqgODERvqP7s5DIeJe8N8UeE5pM,44
88
- howler/odm/base.py,sha256=KbERmZLWdkFbvbNR3CWS3ovuTG487Du0UPWofgUVEu8,51625
89
+ howler/odm/base.py,sha256=UxWDNokfNIuQK-SQz8gjIznhc8lLQe6eJTF_7aIbwqQ,51620
89
90
  howler/odm/charter.txt,sha256=-Wgrv7nqugZmeQknJk0_m6klLJStjVbuqKbi_KaDinQ,15277
90
- howler/odm/helper.py,sha256=RVa1LGeyB1JIR8HNB9qaQb_tpHh7RpC5iDFNbB0PWb8,13843
91
+ howler/odm/helper.py,sha256=EELMg3pvE7Kb9VDeKSYJQHiq6uCO2YuS095CPRgWrEM,13927
91
92
  howler/odm/howler_enum.py,sha256=JzRK3_adlhvfkoGdMZD1jgOwlneZs8-x7OxGEj3zcpY,768
92
93
  howler/odm/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
94
  howler/odm/models/action.py,sha256=V9tgMCg1ewu8mOngTcA6QAPwaR0NIT71VHglpRFYmS4,1235
@@ -96,7 +97,7 @@ howler/odm/models/assemblyline.py,sha256=_wcTiX3A6bhA2SGlK9tDF0v-uwLpIabXE8j2Fw9
96
97
  howler/odm/models/aws.py,sha256=pJVadJqubdgT27riCfp7bEKVP4XsMZB0ZUnKAbmCMd0,895
97
98
  howler/odm/models/azure.py,sha256=o7MZMMo9jh1SB8xXCajl_YSKP2nnnWsjx_DPT6LnQKg,710
98
99
  howler/odm/models/cbs.py,sha256=onUiJOGUxK3iy_-4XkGGwHxFiFq9Td_p59Kum4XaR-w,1366
99
- howler/odm/models/config.py,sha256=jviwXPvBLkOxpDzOYeVQ72-rl4jhlamcmvBrqtAJM-Y,16123
100
+ howler/odm/models/config.py,sha256=KO_-AdTLL1NPHoEHoKqwHiOYa1kCZ-7YX3IcY9-UAsI,21723
100
101
  howler/odm/models/dossier.py,sha256=Ob2qROrG2-DYzmVo2XVe4NJ8HjWGCoRAu2gPo6p9XGU,1244
101
102
  howler/odm/models/ecs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
103
  howler/odm/models/ecs/agent.py,sha256=idSooyFCLuQAB7_RyEWTYW4-x9w5a3wpy2ct_-EDRQs,713
@@ -138,15 +139,15 @@ howler/odm/models/ecs/user_agent.py,sha256=LM4ZjbdEkkF02zZu6Pg7j8JLuAyfliTC6PVAE
138
139
  howler/odm/models/ecs/vulnerability.py,sha256=iX2TUmCZTJjwyMcOmxiHg-pfoEwX8Wx-h8cxo5QsJmo,1553
139
140
  howler/odm/models/gcp.py,sha256=FLwaQVcfFeE5AbIhEB_Ge2UL-HjPdldY04Nrm9Mq7kk,675
140
141
  howler/odm/models/hit.py,sha256=kgzk3RzgKGvHdtNG0iMRxCtLPD73-BFFU9A_IxJcOHI,13396
141
- howler/odm/models/howler_data.py,sha256=HpVLFC8Z1RDVZ2wdkSP2SvqX9KuhJnXbW-6OGwLBXYk,12449
142
- howler/odm/models/lead.py,sha256=QDzX0IdSWRZgBBNtHAyXMaOJa7bP41CDYQWN_vadkV4,1107
142
+ howler/odm/models/howler_data.py,sha256=3bzKQ_vSP_rK20S_U4PkXzsmBL1uqSaIOHZmoPuRkS8,12473
143
+ howler/odm/models/lead.py,sha256=lqapGWZ4u22Asib48o7wAzramnFY9EkRybmb4olsyrA,904
143
144
  howler/odm/models/localized_label.py,sha256=G7gfQ1cngiI4KprqldHWE1KHkAgK4AG_JsfHxVRdsRs,361
144
145
  howler/odm/models/overview.py,sha256=kvZcMYPDlkJEGa0L1jq9pG0RFjLOVudC64-2GTWVu2w,684
145
- howler/odm/models/pivot.py,sha256=VuvDfBYgaunPyYKZXpo5dANjwirjiLvbO6PSKuWRInI,1592
146
+ howler/odm/models/pivot.py,sha256=ZewcGh91xbE64snZ5Ahz2So1onAqO8U9H4CFe6jBOXs,1405
146
147
  howler/odm/models/template.py,sha256=-Tqq_36qD_3nQ4jv13OPeH_EyyERKhc55wT03CU-Kbk,979
147
148
  howler/odm/models/user.py,sha256=3V7cLxxHJwWfTsEdZ7-QZT_-PQL7H_RJ3buQ8AraGzQ,3052
148
149
  howler/odm/models/view.py,sha256=kmaJOXhR4prki5o0gBirs1dqGcQK3b9ATysL_kNoku0,1308
149
- howler/odm/random_data.py,sha256=a3oJCF-vzIkp-eqCNGDbDGz8X1rR-BvbRh84vHtQfKU,28442
150
+ howler/odm/random_data.py,sha256=HHXKED3NMWF8fknrOy2JtsDfzuTWcIkK1N-dUlOLZzo,28441
150
151
  howler/odm/randomizer.py,sha256=-AG-C-FZEsZQp1bQGWLNIpx6NN6r1DcWtk6nq2Ktfwg,23595
151
152
  howler/patched.py,sha256=Br4BGU5raaqjSMDLD7ogb5A8Yn0dzecouh6uWVV2jlQ,77
152
153
  howler/plugins/__init__.py,sha256=P5P-t4KgIInOzp4NmIturNIhUbb3jPO81n55Q_b_gM0,841
@@ -165,20 +166,22 @@ howler/remote/datatypes/queues/named.py,sha256=IypPN0ZnRTlWCZ0Wm6BAyoNCoGlLxUPyG
165
166
  howler/remote/datatypes/queues/priority.py,sha256=rfIK0nVFtivY82a6Er-1CZMzvYEVGyPcUmYrks1nzfI,7554
166
167
  howler/remote/datatypes/set.py,sha256=iJ-QrrkKRhEUyOYmRz21TUTitatvrNyp5aMJwXkCdqc,3538
167
168
  howler/remote/datatypes/user_quota_tracker.py,sha256=butA5RlV0XU9y6GtqoEryaJJZq-LAgoDhCJpdbHBFm0,1920
168
- howler/security/__init__.py,sha256=gIMv9AZ6bR-442X__cMuQmfkmSh6HqFUWl6Ot9IWThk,11676
169
+ howler/security/__init__.py,sha256=v5gQi5TUA4W4vlU3Adzxw8Tq3gCBzQPSF3F9kLDnZgc,11668
169
170
  howler/security/socket.py,sha256=zEyWQh7IMINNpYMynV-PLy_-HQLpgouUvztAKrTHEfU,3714
170
171
  howler/security/utils.py,sha256=MweKs9T--Z2w6hZNUfEAik4FsvXPNCskYF1vaQVt6_8,5309
171
172
  howler/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
173
  howler/services/action_service.py,sha256=AuNRvZs7sFGUveaoptD8ouzs39jdZJidmsp-fIocZo4,3977
173
- howler/services/analytic_service.py,sha256=Ofe4QL2qnxM8xPldRjfMZayedw8QktgKWehC3yL1ClQ,3265
174
+ howler/services/analytic_service.py,sha256=pOJRCDn6I523XSVLBo49fL70Mz5VDgjJ5CBYhemQeBk,4272
174
175
  howler/services/auth_service.py,sha256=TX51z-Fu4i3JvxIdU1JsJ3vzgGPVWNL1lNQJMxKpkZ8,11678
175
- howler/services/config_service.py,sha256=R-NvCplIo-42sLwhrWkhiq8FDlTIdrpKoMy4dDGobjU,4505
176
- howler/services/dossier_service.py,sha256=RKRYuDSTZCyCo0nPWVPelHhsluRd-Xo7P_812QA2az8,4271
176
+ howler/services/config_service.py,sha256=J5FCttgsHr6kMLGAPIW-8r8aGYwmX4YzsOyBG6yoGGM,4489
177
+ howler/services/dossier_service.py,sha256=5jq7KZMgBNh165rN5pZD_oVuZP-oBsdACHDSV74ps-I,9839
177
178
  howler/services/event_service.py,sha256=4PG2iBXjh1V8QnXcbUZSiKJeHs6V9hRWT9SKrzQFIPY,2864
178
- howler/services/hit_service.py,sha256=qpN3mUUfMDKqTtXKDR5_ZrwR_xm11znP_mqPPTS2Xek,21838
179
+ howler/services/hit_service.py,sha256=VNsEhi6Tcoqkjsw8G71FWBj7xcKwdvET9mITYAKmzsM,32278
179
180
  howler/services/jwt_service.py,sha256=O-M3k5wmjUF3GzD4FJC3o-hImKu1v8K5oSuD9zURcf0,5539
180
- howler/services/lucene_service.py,sha256=7s2Bpqp2WotYwiBFWePIErm_uZtM9LOKqjulYHKQKvg,11586
181
+ howler/services/lucene_service.py,sha256=K_tS39hJCXUCfN_zgbIgbfcfM3gaQNheFXrwbV__z_0,12029
181
182
  howler/services/notebook_service.py,sha256=_MWllCnuVxt7lCcvWghXnaS926FbvBRE3DrBt--zO7U,3968
183
+ howler/services/overview_service.py,sha256=wDIm7DGjQ6Dvt4dNQ-57jbet8v6oGHxM857VezgHf7M,1539
184
+ howler/services/template_service.py,sha256=pwcHtYNoIkDuaXQ1bSXeDgxETP59PF1YCTwGzHsnXkA,1695
182
185
  howler/services/user_service.py,sha256=BWU9X75ofehRBozPrkOFlq5DIFbaPbmqC5-I-1Fv79g,12069
183
186
  howler/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
184
187
  howler/utils/annotations.py,sha256=GLuDbjbXp8esDji3qhQY_uQyOWVqfIdpF_zs2t0IaMI,878
@@ -186,12 +189,12 @@ howler/utils/chunk.py,sha256=NoVDKzZkO8O92xXk0s0Pny2g7It9BX0PqWbknmnRSFg,895
186
189
  howler/utils/dict_utils.py,sha256=EA0mq87r0RZP7SmiPZQukx3xXukM6EH2nhtQ6W2GAX4,6408
187
190
  howler/utils/isotime.py,sha256=iCGae-3OPS6PxQx76IwOpV_IRYc0wF9ezp61h7MifsY,449
188
191
  howler/utils/list_utils.py,sha256=DrpmdV5GJRw0XjoalPhP_368NUzh3L1pJT49ob6LovI,226
189
- howler/utils/lucene.py,sha256=7pjjG8IAABqJtcvVC_RTw-y-ni-WqN_GgWrHUU-XhgQ,1813
192
+ howler/utils/lucene.py,sha256=ldouSi9yoZwDBNAxGTalz81LgCHNtyg2b_mL3xYGr4E,2395
190
193
  howler/utils/path.py,sha256=DfOU4i4zSs4wchHoE8iE7aWVLkTxiC_JRGepF2hBYBk,690
191
194
  howler/utils/socket_utils.py,sha256=nz1SklC9xBHUSfHyTJjpq3mbozX1GDf01WzdGxfaUII,2212
192
195
  howler/utils/str_utils.py,sha256=HE8Hqh2HlOLaj16w0H9zKOyDJLp-f1LQ50y_WeGZaEk,8389
193
196
  howler/utils/uid.py,sha256=p9dsqyvZ-lpiAuzZWCPCeEM99kdk0Ly9czf04HNdSuw,1341
194
- howler_api-2.10.0.dev255.dist-info/METADATA,sha256=iPYL4lMOKmTyba4eYswwCYP_qQ8TJKStiKHOrIlWFz4,2800
195
- howler_api-2.10.0.dev255.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
196
- howler_api-2.10.0.dev255.dist-info/entry_points.txt,sha256=Lu9SBGvwe0wczJHmc-RudC24lmQk7tv3ZBXon9RIihg,259
197
- howler_api-2.10.0.dev255.dist-info/RECORD,,
197
+ howler_api-2.13.0.dev344.dist-info/METADATA,sha256=58wpeDQGY3EdTebmd9ImKUuDTM0fCxReECnmXr7wm6w,2805
198
+ howler_api-2.13.0.dev344.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
199
+ howler_api-2.13.0.dev344.dist-info/entry_points.txt,sha256=Lu9SBGvwe0wczJHmc-RudC24lmQk7tv3ZBXon9RIihg,259
200
+ howler_api-2.13.0.dev344.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any