diaspora-event-sdk 0.0.4__py3-none-any.whl → 0.0.5__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.
@@ -1,4 +1,11 @@
1
+ import os
2
+
3
+
1
4
  TOKEN_EXCHANGE = "http://3.220.110.101"
2
5
  DIASPORA_RESOURCE_SERVER = '2b9d2f5c-fa32-45b5-875b-b24cd343b917'
3
6
  MSK_SCRAM_ENDPOINT = "b-1-public.diaspora.k6i387.c21.kafka.us-east-1.amazonaws.com:9196,b-2-public.diaspora.k6i387.c21.kafka.us-east-1.amazonaws.com:9196"
4
7
  MSK_IAM_ENDPOINT = "b-1-public.diaspora.k6i387.c21.kafka.us-east-1.amazonaws.com:9198,b-2-public.diaspora.k6i387.c21.kafka.us-east-1.amazonaws.com:9198"
8
+
9
+
10
+ def _get_envname():
11
+ return os.getenv("DIASPORA_SDK_ENVIRONMENT", "production")
@@ -1,8 +1,6 @@
1
1
  import json
2
2
 
3
- from diaspora_event_sdk.sdk.login_manager.manager import LoginManager
4
- from diaspora_event_sdk.sdk.login_manager import requires_login
5
- from globus_compute_sdk.sdk.login_manager import LoginManagerProtocol
3
+ from diaspora_event_sdk.sdk.login_manager import LoginManager, LoginManagerProtocol, requires_login
6
4
 
7
5
  from ._environments import TOKEN_EXCHANGE, DIASPORA_RESOURCE_SERVER
8
6
 
@@ -1,7 +1,10 @@
1
1
  from .decorators import requires_login
2
2
  from .manager import DiasporaScopes, LoginManager
3
+ from .protocol import LoginManagerProtocol
3
4
 
4
5
  __all__ = (
5
6
  "LoginManager",
6
7
  "DiasporaScopes",
7
- )
8
+ "LoginManagerProtocol",
9
+ "requires_login",
10
+ )
@@ -8,7 +8,7 @@ import typing as t
8
8
 
9
9
  import globus_sdk
10
10
  from globus_sdk.scopes import AuthScopes, ScopeBuilder
11
- from globus_compute_sdk.sdk.login_manager.tokenstore import get_token_storage_adapter
11
+ from diaspora_event_sdk.sdk.login_manager.tokenstore import get_token_storage_adapter
12
12
 
13
13
  from .._environments import DIASPORA_RESOURCE_SERVER
14
14
  from ..web_client import WebClient
@@ -0,0 +1,29 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+
5
+ import globus_sdk
6
+
7
+ from ..web_client import WebClient
8
+
9
+ # these were added to stdlib typing in 3.8, so the import must be conditional
10
+ # mypy and other tools expect and document a sys.version_info check
11
+ if sys.version_info >= (3, 8):
12
+ from typing import Protocol, runtime_checkable
13
+ else:
14
+ from typing_extensions import Protocol, runtime_checkable
15
+
16
+
17
+ @runtime_checkable
18
+ class LoginManagerProtocol(Protocol):
19
+ def ensure_logged_in(self) -> None:
20
+ ...
21
+
22
+ def logout(self) -> bool:
23
+ ...
24
+
25
+ def get_auth_client(self) -> globus_sdk.AuthClient:
26
+ ...
27
+
28
+ def get_web_client(self, *, base_url: str | None = None) -> WebClient:
29
+ ...
@@ -0,0 +1,100 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import pathlib
6
+
7
+ from globus_sdk.tokenstorage import SQLiteAdapter
8
+
9
+ from .._environments import _get_envname
10
+ from .client_login import get_client_login, is_client_login
11
+ from .globus_auth import internal_auth_client
12
+
13
+
14
+ def _home() -> pathlib.Path:
15
+ # this is a hook point for tests to patch over
16
+ # it just returns `pathlib.Path.home()`
17
+ # replace this with a mock to return some test directory
18
+ return pathlib.Path.home()
19
+
20
+
21
+ def invalidate_old_config() -> None:
22
+ token_file = _home() / ".funcx" / "credentials" / "funcx_sdk_tokens.json"
23
+
24
+ if token_file.exists():
25
+ try:
26
+ auth_client = internal_auth_client()
27
+ with open(token_file) as fp:
28
+ data = json.load(fp)
29
+ for token_data in data.values():
30
+ if "access_token" in token_data:
31
+ auth_client.oauth2_revoke_token(token_data["access_token"])
32
+ if "refresh_token" in token_data:
33
+ auth_client.oauth2_revoke_token(
34
+ token_data["refresh_token"])
35
+ finally:
36
+ os.remove(token_file)
37
+
38
+
39
+ def ensure_compute_dir() -> pathlib.Path:
40
+ legacy_dirname = _home() / ".funcx"
41
+ dirname = _home() / ".globus_compute"
42
+
43
+ user_dir = os.getenv("GLOBUS_COMPUTE_USER_DIR")
44
+ if user_dir:
45
+ dirname = pathlib.Path(user_dir)
46
+
47
+ if dirname.is_dir():
48
+ pass
49
+ elif dirname.is_file():
50
+ raise FileExistsError(
51
+ f"Error creating directory {dirname}, "
52
+ "please remove or rename the conflicting file"
53
+ )
54
+ elif legacy_dirname.is_dir() and not user_dir:
55
+ legacy_dirname.replace(dirname)
56
+ legacy_dirname.symlink_to(dirname, target_is_directory=True)
57
+ else:
58
+ dirname.mkdir(mode=0o700, parents=True, exist_ok=True)
59
+
60
+ return dirname
61
+
62
+
63
+ def _get_storage_filename():
64
+ datadir = ensure_compute_dir()
65
+ return os.path.join(datadir, "storage.db")
66
+
67
+
68
+ def _resolve_namespace(environment: str | None) -> str:
69
+ """
70
+ Return the namespace used to save tokens. This will check
71
+ if a client login is being used and return either:
72
+ user/<envname>
73
+ or
74
+ clientprofile/<envname>/<clientid>
75
+
76
+ e.g.
77
+
78
+ user/production
79
+ """
80
+ env = environment if environment is not None else _get_envname()
81
+
82
+ if is_client_login():
83
+ client_id = get_client_login().client_id
84
+ return f"clientprofile/{env}/{client_id}"
85
+
86
+ return f"user/{env}"
87
+
88
+
89
+ def get_token_storage_adapter(*, environment: str | None = None) -> SQLiteAdapter:
90
+ # when initializing the token storage adapter, check if the storage file exists
91
+ # if it does not, then use this as a flag to clean the old config
92
+ fname = _get_storage_filename()
93
+ if not os.path.exists(fname):
94
+ invalidate_old_config()
95
+ # namespace is equal to the current environment
96
+ return SQLiteAdapter(
97
+ fname,
98
+ namespace=_resolve_namespace(environment),
99
+ connect_params={"check_same_thread": False},
100
+ )
File without changes
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+
3
+ import typing as t
4
+ import uuid
5
+
6
+ # older pythons don't like aliases using |, even with a __future__ import
7
+ UUID_LIKE_T = t.Union[uuid.UUID, str]
8
+
9
+
10
+ def as_uuid(uuid_like: UUID_LIKE_T) -> uuid.UUID:
11
+ return uuid_like if isinstance(uuid_like, uuid.UUID) else uuid.UUID(uuid_like)
12
+
13
+
14
+ def as_optional_uuid(optional_uuid_like: UUID_LIKE_T | None) -> uuid.UUID | None:
15
+ return as_uuid(optional_uuid_like) if optional_uuid_like else None
@@ -2,8 +2,8 @@
2
2
  import typing as t
3
3
 
4
4
  import globus_sdk
5
- from globus_compute_sdk.sdk.utils.uuid_like import UUID_LIKE_T
6
5
  from globus_sdk.exc.api import GlobusAPIError
6
+ from diaspora_event_sdk.sdk.utils.uuid_like import UUID_LIKE_T
7
7
 
8
8
  from ._environments import TOKEN_EXCHANGE
9
9
 
@@ -1 +1 @@
1
- __version__ = "0.0.4"
1
+ __version__ = "0.0.5"
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: diaspora-event-sdk
3
- Version: 0.0.4
3
+ Version: 0.0.5
4
4
  Summary: SDK of Diaspora Event Fabric: Resilience-enabling services for science from HPC to edge
5
5
  Home-page: https://github.com/globus-labs/diaspora-event-sdk
6
6
  License: LICENSE
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
9
- Requires-Dist: globus-compute-sdk
9
+ Requires-Dist: globus-sdk
10
10
  Requires-Dist: kafka-python
11
11
 
12
12
  # Diaspora Event Fabric: Resilience-enabling services for science from HPC to edge
@@ -0,0 +1,23 @@
1
+ diaspora_event_sdk/__init__.py,sha256=qLu5r-LxlQuJRJySWbiDGoaBL1A3STX9v5IrwvN1vtE,477
2
+ diaspora_event_sdk/version.py,sha256=S7u1lbuWmM3A3ajykBialmPoJUK6Jg-WmNqM-9OZFdk,22
3
+ diaspora_event_sdk/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ diaspora_event_sdk/sdk/_environments.py,sha256=X5TekWUUJ_cmgb3jdhK90dDlqj_AmAP5CnXw5ABjh_w,511
5
+ diaspora_event_sdk/sdk/client.py,sha256=s3QrXcPb64oSgOaGGODTH9eV_1IVeZWi1ZDh6-dBIO4,3051
6
+ diaspora_event_sdk/sdk/decorators.py,sha256=Gel8AyhIjbf4-FNintTNcOqvC9hHH_YwbOH257Nfmf0,884
7
+ diaspora_event_sdk/sdk/kafka_client.py,sha256=xy-b7ZfNkgExwa5d65IlUOaAZYAqibyJLQ1v0ruJzV8,1457
8
+ diaspora_event_sdk/sdk/web_client.py,sha256=rHYeEltujO191SksBXAMNrS6C_qasdf0xrFfBEcGhtQ,1349
9
+ diaspora_event_sdk/sdk/login_manager/__init__.py,sha256=yeqVgjeHLMX0WZJu2feJmq-fbeXvSxWghVV81ygfY-w,239
10
+ diaspora_event_sdk/sdk/login_manager/client_login.py,sha256=gvR4PkIqQpIywNieJQ_u11PHUmdLxQ0Ho-QgPSfu8bw,1798
11
+ diaspora_event_sdk/sdk/login_manager/decorators.py,sha256=EFEp71d0oJ7vo2H8W7DJ2gPrDfGzeNXUNxri1C0l8h0,1047
12
+ diaspora_event_sdk/sdk/login_manager/globus_auth.py,sha256=9Hymp0tv91OI5dBMUgh4rGv_5xLVLhFEK7Hu0t8CJFQ,389
13
+ diaspora_event_sdk/sdk/login_manager/login_flow.py,sha256=2TodgsvlEYPoZPQPkp6FHOC9IkSM07pS7MIVGS4MZNE,954
14
+ diaspora_event_sdk/sdk/login_manager/manager.py,sha256=uJHosI7ipqGt5KiL-iv2IGB4bNyZ6jQZQi7g4ka0pts,7052
15
+ diaspora_event_sdk/sdk/login_manager/protocol.py,sha256=RCuo2jy_XkpZvbxnKlDfTKs-L6b9_8_JR-Kq9wHwhoM,710
16
+ diaspora_event_sdk/sdk/login_manager/tokenstore.py,sha256=7jRm01rzsbvniaCfYtDDWE3det_1_b6oQkS-YQ2Qjg4,3037
17
+ diaspora_event_sdk/sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ diaspora_event_sdk/sdk/utils/uuid_like.py,sha256=xbxf0YXpDhdii16lwPLWRN21qFekHrNrqODSToMPtCg,470
19
+ diaspora_event_sdk-0.0.5.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
20
+ diaspora_event_sdk-0.0.5.dist-info/METADATA,sha256=c1OJRiA1CgaM_Hmn-SFjHF6Xvbho4MBQhCgUC6pyEW4,2927
21
+ diaspora_event_sdk-0.0.5.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
22
+ diaspora_event_sdk-0.0.5.dist-info/top_level.txt,sha256=_5Wx8F5rc9mpB093wvCXa6CArtWNXwek2T1LnmkS2vE,19
23
+ diaspora_event_sdk-0.0.5.dist-info/RECORD,,
@@ -1,19 +0,0 @@
1
- diaspora_event_sdk/__init__.py,sha256=qLu5r-LxlQuJRJySWbiDGoaBL1A3STX9v5IrwvN1vtE,477
2
- diaspora_event_sdk/version.py,sha256=1mptEzQihbdyqqzMgdns_j5ZGK9gz7hR2bsgA_TnjO4,22
3
- diaspora_event_sdk/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- diaspora_event_sdk/sdk/_environments.py,sha256=4hJIrrdAHOt9qY74jnD5i2UvpBKkKqJ7Ys-bygGrP9k,414
5
- diaspora_event_sdk/sdk/client.py,sha256=94iWoxHaxibzIEJfZlUOzV7jJwt-AQnbFf2jZ1cwsyA,3155
6
- diaspora_event_sdk/sdk/decorators.py,sha256=Gel8AyhIjbf4-FNintTNcOqvC9hHH_YwbOH257Nfmf0,884
7
- diaspora_event_sdk/sdk/kafka_client.py,sha256=xy-b7ZfNkgExwa5d65IlUOaAZYAqibyJLQ1v0ruJzV8,1457
8
- diaspora_event_sdk/sdk/web_client.py,sha256=AbFJt9ZhG2l15qxxjpGY5DPq2P12THEAw2yjkWfJxvo,1349
9
- diaspora_event_sdk/sdk/login_manager/__init__.py,sha256=ErCNru31j_sSl_10uTXv8jsa16VW1LbPG-k3zxgAxZo,145
10
- diaspora_event_sdk/sdk/login_manager/client_login.py,sha256=gvR4PkIqQpIywNieJQ_u11PHUmdLxQ0Ho-QgPSfu8bw,1798
11
- diaspora_event_sdk/sdk/login_manager/decorators.py,sha256=EFEp71d0oJ7vo2H8W7DJ2gPrDfGzeNXUNxri1C0l8h0,1047
12
- diaspora_event_sdk/sdk/login_manager/globus_auth.py,sha256=9Hymp0tv91OI5dBMUgh4rGv_5xLVLhFEK7Hu0t8CJFQ,389
13
- diaspora_event_sdk/sdk/login_manager/login_flow.py,sha256=2TodgsvlEYPoZPQPkp6FHOC9IkSM07pS7MIVGS4MZNE,954
14
- diaspora_event_sdk/sdk/login_manager/manager.py,sha256=ocrDlu_LITKGWV7kUAiMXdtnfTF9sDelniNc-06yux0,7052
15
- diaspora_event_sdk-0.0.4.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
16
- diaspora_event_sdk-0.0.4.dist-info/METADATA,sha256=jLeUkQliQbIQP-rCkvjmrbK63z5Mb_ZZ7iIot6l3q1g,2935
17
- diaspora_event_sdk-0.0.4.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
18
- diaspora_event_sdk-0.0.4.dist-info/top_level.txt,sha256=_5Wx8F5rc9mpB093wvCXa6CArtWNXwek2T1LnmkS2vE,19
19
- diaspora_event_sdk-0.0.4.dist-info/RECORD,,