personal_knowledge_library 3.2.1__tar.gz → 3.2.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 personal_knowledge_library might be problematic. Click here for more details.

Files changed (46) hide show
  1. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/PKG-INFO +1 -1
  2. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/__init__.py +1 -1
  3. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/asyncio/graph.py +55 -0
  4. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/base.py +6 -2
  5. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/graph.py +65 -10
  6. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/search.py +4 -1
  7. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/pyproject.toml +1 -1
  8. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/LICENSE +0 -0
  9. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/README.md +0 -0
  10. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/base/__init__.py +0 -0
  11. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/base/access.py +0 -0
  12. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/base/entity.py +0 -0
  13. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/base/language.py +0 -0
  14. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/base/ontology.py +0 -0
  15. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/base/response.py +0 -0
  16. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/base/search.py +0 -0
  17. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/base/tenant.py +0 -0
  18. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/nel/__init__.py +0 -0
  19. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/nel/base.py +0 -0
  20. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/nel/engine.py +0 -0
  21. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/ontomapping/__init__.py +0 -0
  22. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/ontomapping/manager.py +0 -0
  23. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/public/__init__.py +0 -0
  24. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/public/cache.py +0 -0
  25. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/public/client.py +0 -0
  26. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/public/helper.py +0 -0
  27. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/public/relations.py +0 -0
  28. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/public/wikidata.py +0 -0
  29. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/__init__.py +0 -0
  30. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/asyncio/__init__.py +0 -0
  31. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/asyncio/base.py +0 -0
  32. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/asyncio/group.py +0 -0
  33. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/asyncio/search.py +0 -0
  34. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/asyncio/users.py +0 -0
  35. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/group.py +0 -0
  36. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/helper.py +0 -0
  37. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/ontology.py +0 -0
  38. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/session.py +0 -0
  39. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/tenant.py +0 -0
  40. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/services/users.py +0 -0
  41. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/utils/__init__.py +0 -0
  42. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/utils/diff.py +0 -0
  43. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/utils/graph.py +0 -0
  44. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/utils/import_format.py +0 -0
  45. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/utils/wikidata.py +0 -0
  46. {personal_knowledge_library-3.2.1 → personal_knowledge_library-3.2.2}/knowledge/utils/wikipedia.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: personal_knowledge_library
3
- Version: 3.2.1
3
+ Version: 3.2.2
4
4
  Summary: Library to access Wacom's Personal Knowledge graph.
5
5
  License: Apache-2.0
6
6
  Keywords: semantic-knowledge,knowledge-graph
@@ -17,7 +17,7 @@ __license__ = "Wacom"
17
17
  __maintainer__ = ["Markus Weber"]
18
18
  __email__ = "markus.weber@wacom.com"
19
19
  __status__ = "beta"
20
- __version__ = "3.2.1"
20
+ __version__ = "3.2.2"
21
21
 
22
22
  import loguru
23
23
 
@@ -180,6 +180,61 @@ class AsyncWacomKnowledgeService(AsyncServiceAPIClient):
180
180
  thing: ThingObject = ThingObject.from_dict(e)
181
181
  return thing
182
182
 
183
+ async def entities(self, uris: List[str], locale: Optional[LocaleCode] = None, auth_key: Optional[str] = None) \
184
+ -> List[ThingObject]:
185
+ """
186
+ Retrieve entities information from personal knowledge, using the URI as identifier.
187
+
188
+ **Remark:** Object properties (relations) must be requested separately.
189
+
190
+ Parameters
191
+ ----------
192
+ uris: List[str]
193
+ List of URIs of the entities
194
+ locale: LocaleCode
195
+ ISO-3166 Country Codes and ISO-639 Language Codes in the format <language_code>_<country>, e.g., en_US.
196
+ auth_key: Optional[str]
197
+ Use a different auth key than the one from the client
198
+
199
+ Returns
200
+ -------
201
+ things: List[ThingObject]
202
+ Entities with is type URI, description, an image/icon, and tags (labels).
203
+
204
+ Raises
205
+ ------
206
+ WacomServiceException
207
+ If the graph service returns an error code or the entity is not found in the knowledge graph
208
+ """
209
+ if auth_key is None:
210
+ auth_key, _ = await self.handle_token()
211
+ url: str = f"{self.service_base_url}{AsyncWacomKnowledgeService.ENTITY_ENDPOINT}/"
212
+ headers: Dict[str, str] = {
213
+ USER_AGENT_HEADER_FLAG: self.user_agent,
214
+ AUTHORIZATION_HEADER_FLAG: f"Bearer {auth_key}",
215
+ }
216
+ things: List[ThingObject] = []
217
+ params: Dict[str, Any] = {
218
+ URIS_TAG: uris
219
+ }
220
+ if locale:
221
+ params[LOCALE_TAG] = locale
222
+ async with AsyncServiceAPIClient.__async_session__() as session:
223
+ async with session.get(url, headers=headers, params=params, verify_ssl=self.verify_calls) as response:
224
+ if response.ok:
225
+ entities: List[Dict[str, Any]] = await response.json()
226
+ for e in entities:
227
+ thing: ThingObject = ThingObject.from_dict(e)
228
+ things.append(thing)
229
+ else:
230
+ raise await handle_error(
231
+ f"Retrieving of entities content failed. List of URIs: {uris}.", response,
232
+ headers=headers
233
+ )
234
+ await asyncio.sleep(0.25 if self.use_graceful_shutdown else 0.0)
235
+ # Create ThingObject
236
+ return things
237
+
183
238
  async def set_entity_image_local(self, entity_uri: str, path: Path, auth_key: Optional[str] = None) -> str:
184
239
  """Setting the image of the entity.
185
240
  The image is stored locally.
@@ -300,7 +300,8 @@ class WacomServiceAPIClient(RESTAPIClient):
300
300
  raise WacomServiceException(f"Unknown session id:= {self.__current_session_id}. Please login first.")
301
301
  return session
302
302
 
303
- def request_user_token(self, tenant_api_key: str, external_id: str) -> Tuple[str, str, datetime]:
303
+ def request_user_token(self, tenant_api_key: str, external_id: str, timeout: int = DEFAULT_TIMEOUT) \
304
+ -> Tuple[str, str, datetime]:
304
305
  """
305
306
  Login as user by using the tenant key and its external user id.
306
307
 
@@ -310,6 +311,8 @@ class WacomServiceAPIClient(RESTAPIClient):
310
311
  Tenant API key
311
312
  external_id: str
312
313
  External id.
314
+ timeout: int (Default:= DEFAULT_TIMEOUT)
315
+ Timeout for the request in seconds.
313
316
 
314
317
  Returns
315
318
  -------
@@ -333,7 +336,8 @@ class WacomServiceAPIClient(RESTAPIClient):
333
336
  }
334
337
  payload: dict = {EXTERNAL_USER_ID: external_id}
335
338
  response: Response = requests.post(
336
- url, headers=headers, json=payload, timeout=DEFAULT_TIMEOUT, verify=self.verify_calls
339
+ url, headers=headers, json=payload, timeout=timeout, verify=self.verify_calls,
340
+ allow_redirects=True
337
341
  )
338
342
  if response.ok:
339
343
  try:
@@ -18,7 +18,6 @@ from knowledge.base.entity import (
18
18
  DATA_PROPERTIES_TAG,
19
19
  TYPE_TAG,
20
20
  LABELS_TAG,
21
- IS_MAIN_TAG,
22
21
  RELATIONS_TAG,
23
22
  LOCALE_TAG,
24
23
  EntityStatus,
@@ -226,18 +225,74 @@ class WacomKnowledgeService(WacomServiceAPIClient):
226
225
  response: Response = session.get(url, headers=headers, timeout=timeout, verify=self.verify_calls)
227
226
  if response.ok:
228
227
  e: Dict[str, Any] = response.json()
229
- pref_label: List[Label] = []
230
- aliases: List[Label] = []
231
- # Extract labels and alias
232
- for label in e[LABELS_TAG]:
233
- if label[IS_MAIN_TAG]: # Labels
234
- pref_label.append(Label.create_from_dict(label))
235
- else: # Alias
236
- aliases.append(Label.create_from_dict(label))
237
228
  thing: ThingObject = ThingObject.from_dict(e)
238
229
  return thing
239
230
  raise handle_error(f"Retrieving of entity content failed. URI:={uri}.", response)
240
231
 
232
+ def entities(self,
233
+ uris: List[str],
234
+ locale: Optional[LocaleCode] = None,
235
+ auth_key: Optional[str] = None,
236
+ timeout: int = DEFAULT_TIMEOUT,
237
+ max_retries: int = DEFAULT_MAX_RETRIES,
238
+ backoff_factor: float = DEFAULT_BACKOFF_FACTOR,
239
+ ) -> List[ThingObject]:
240
+ """
241
+ Retrieve entity information from personal knowledge, using the URI as identifier.
242
+
243
+ **Remark:** Object properties (relations) must be requested separately.
244
+
245
+ Parameters
246
+ ----------
247
+ uris: List[str]
248
+ List of URIs of entities
249
+ locale: Optional[LocaleCode]
250
+ ISO-3166 Country Codes and ISO-639 Language Codes in the format <language_code>_<country>, e.g., en_US.
251
+ auth_key: Optional[str]
252
+ If the auth key is set the logged-in user (if any) will be ignored and the auth key will be used.
253
+ timeout: int
254
+ Timeout for the request (default: 60 seconds)
255
+ max_retries: int
256
+ Maximum number of retries (default: 3)
257
+ backoff_factor: float
258
+ A backoff factor to apply between attempts after the second try (most errors are resolved immediately by a
259
+ second try without a delay) (default: 0.1)
260
+
261
+ Returns
262
+ -------
263
+ things: List[ThingObject]
264
+ Entities with is type URI, description, an image/icon, and tags (labels).
265
+
266
+ Raises
267
+ ------
268
+ WacomServiceException
269
+ If the graph service returns an error code or the entity is not found in the knowledge graph
270
+ """
271
+ if auth_key is None:
272
+ auth_key, _ = self.handle_token()
273
+ url: str = f"{self.service_base_url}{WacomKnowledgeService.ENTITY_ENDPOINT}/"
274
+ headers: Dict[str, str] = {
275
+ USER_AGENT_HEADER_FLAG: self.user_agent,
276
+ AUTHORIZATION_HEADER_FLAG: f"Bearer {auth_key}",
277
+ }
278
+ params: Dict[str, Any] = {URIS_TAG: uris}
279
+ if locale is not None:
280
+ params[LOCALE_TAG] = locale
281
+ mount_point: str = "https://" if self.service_url.startswith("https") else "http://"
282
+ with requests.Session() as session:
283
+ retries: Retry = Retry(total=max_retries, backoff_factor=backoff_factor, status_forcelist=STATUS_FORCE_LIST)
284
+ session.mount(mount_point, HTTPAdapter(max_retries=retries))
285
+ response: Response = session.get(url, params=params, headers=headers, timeout=timeout,
286
+ verify=self.verify_calls)
287
+ if response.ok:
288
+ things: List[ThingObject] = []
289
+ entities: List[Dict[str, Any]] = response.json()
290
+ for e in entities:
291
+ thing: ThingObject = ThingObject.from_dict(e)
292
+ things.append(thing)
293
+ return things
294
+ raise handle_error(f"Retrieving of entity content failed. URIs:={uris}.", response)
295
+
241
296
  def delete_entities(
242
297
  self,
243
298
  uris: List[str],
@@ -2017,7 +2072,7 @@ class WacomKnowledgeService(WacomServiceAPIClient):
2017
2072
 
2018
2073
  def rebuild_nel_index(
2019
2074
  self,
2020
- nel_index: Literal["western", "japanese"],
2075
+ nel_index: Literal["Western", "Japanese"],
2021
2076
  prune: bool = False,
2022
2077
  auth_key: Optional[str] = None,
2023
2078
  timeout: int = DEFAULT_TIMEOUT,
@@ -263,6 +263,7 @@ class SemanticSearchClient(WacomServiceAPIClient):
263
263
  locale: LocaleCode,
264
264
  concept_type: Optional[str] = None,
265
265
  auth_key: Optional[str] = None,
266
+ timeout: float = DEFAULT_TIMEOUT,
266
267
  max_retries: int = 3,
267
268
  backoff_factor: float = 0.1,
268
269
  ) -> int:
@@ -275,6 +276,8 @@ class SemanticSearchClient(WacomServiceAPIClient):
275
276
  ISO-3166 Country Codes and ISO-639 Language Codes in the format '<language_code>_<country>', e.g., en_US.
276
277
  concept_type: Optional[str] (Default:= None)
277
278
  Concept type.
279
+ timeout: int (Default:= DEFAULT_TIMEOUT)
280
+ Timeout for the request in seconds.
278
281
  max_retries: int
279
282
  Maximum number of retries
280
283
  backoff_factor: float
@@ -306,7 +309,7 @@ class SemanticSearchClient(WacomServiceAPIClient):
306
309
  with requests.Session() as session:
307
310
  retries: Retry = Retry(total=max_retries, backoff_factor=backoff_factor, status_forcelist=STATUS_FORCE_LIST)
308
311
  session.mount(mount_point, HTTPAdapter(max_retries=retries))
309
- response = session.get(url, params=params, headers=headers)
312
+ response = session.get(url, params=params, headers=headers, timeout=timeout)
310
313
  if response.ok:
311
314
  return response.json().get("count", 0)
312
315
  raise handle_error("Counting labels failed.", response, headers=headers, parameters={"locale": locale})
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "personal_knowledge_library"
3
- version = "3.2.1"
3
+ version = "3.2.2"
4
4
  description = "Library to access Wacom's Personal Knowledge graph."
5
5
  authors = [{ name = "Markus Weber", email = "markus.weber@wacom.com" }]
6
6
  license = "Apache-2.0"