data-sourcerer 0.1.1__py3-none-any.whl → 0.2.0__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.
- {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.0.dist-info}/METADATA +24 -4
- {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.0.dist-info}/RECORD +53 -50
- {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.0.dist-info}/WHEEL +1 -1
- sourcerer/__init__.py +1 -1
- sourcerer/domain/access_credentials/entities.py +17 -0
- sourcerer/domain/access_credentials/exceptions.py +1 -1
- sourcerer/domain/access_credentials/repositories.py +1 -1
- sourcerer/domain/access_credentials/services.py +14 -2
- sourcerer/domain/file_system/exceptions.py +1 -1
- sourcerer/domain/file_system/services.py +2 -2
- sourcerer/domain/shared/entities.py +1 -0
- sourcerer/domain/storage_provider/entities.py +3 -4
- sourcerer/domain/storage_provider/exceptions.py +1 -1
- sourcerer/domain/storage_provider/services.py +13 -9
- sourcerer/infrastructure/access_credentials/exceptions.py +15 -2
- sourcerer/infrastructure/access_credentials/registry.py +3 -4
- sourcerer/infrastructure/access_credentials/services.py +141 -44
- sourcerer/infrastructure/db/models.py +1 -1
- sourcerer/infrastructure/file_system/exceptions.py +9 -9
- sourcerer/infrastructure/file_system/services.py +16 -16
- sourcerer/infrastructure/storage_provider/exceptions.py +28 -8
- sourcerer/infrastructure/storage_provider/registry.py +2 -3
- sourcerer/infrastructure/storage_provider/services/__init__.py +0 -0
- sourcerer/infrastructure/storage_provider/services/azure.py +261 -0
- sourcerer/infrastructure/storage_provider/services/gcp.py +277 -0
- sourcerer/infrastructure/storage_provider/services/s3.py +290 -0
- sourcerer/infrastructure/utils.py +2 -4
- sourcerer/presentation/screens/critical_error/main.py +3 -4
- sourcerer/presentation/screens/file_system_finder/main.py +4 -4
- sourcerer/presentation/screens/file_system_finder/widgets/file_system_navigator.py +12 -12
- sourcerer/presentation/screens/main/main.py +57 -33
- sourcerer/presentation/screens/main/messages/delete_request.py +1 -2
- sourcerer/presentation/screens/main/messages/download_request.py +1 -2
- sourcerer/presentation/screens/main/mixins/resize_containers_watcher_mixin.py +3 -3
- sourcerer/presentation/screens/main/widgets/gradient.py +2 -5
- sourcerer/presentation/screens/main/widgets/resizing_rule.py +1 -1
- sourcerer/presentation/screens/main/widgets/storage_content.py +12 -13
- sourcerer/presentation/screens/main/widgets/storage_list_sidebar.py +8 -6
- sourcerer/presentation/screens/preview_content/main.py +15 -4
- sourcerer/presentation/screens/preview_content/styles.tcss +2 -1
- sourcerer/presentation/screens/provider_creds_list/main.py +2 -2
- sourcerer/presentation/screens/provider_creds_registration/main.py +26 -11
- sourcerer/presentation/screens/question/main.py +1 -1
- sourcerer/presentation/screens/shared/containers.py +1 -1
- sourcerer/presentation/screens/shared/widgets/labeled_input.py +1 -1
- sourcerer/presentation/screens/storage_action_progress/main.py +34 -20
- sourcerer/presentation/screens/storage_action_progress/styles.tcss +11 -0
- sourcerer/presentation/utils.py +7 -3
- sourcerer/settings.py +4 -0
- sourcerer/utils.py +2 -2
- sourcerer/infrastructure/storage_provider/services.py +0 -509
- {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.0.dist-info}/entry_points.txt +0 -0
- {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.0.dist-info}/licenses/LICENSE +0 -0
- {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.0.dist-info}/top_level.txt +0 -0
@@ -1,11 +1,11 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: data-sourcerer
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.2.0
|
4
4
|
Summary: Sourcerer is a terminal cloud storage navigator.
|
5
5
|
Author-email: Bohdana Kuzmenko <bohdana.kuzmenko.dev@gmail.com>
|
6
6
|
License: MIT
|
7
|
-
Keywords: cloud,s3,gcp,cli,
|
8
|
-
Requires-Python: >=3.
|
7
|
+
Keywords: cloud,s3,gcp,cli,terminal,storage,textual,ui
|
8
|
+
Requires-Python: >=3.9
|
9
9
|
Description-Content-Type: text/markdown
|
10
10
|
License-File: LICENSE
|
11
11
|
Requires-Dist: boto3<2.0.0,>=1.26.0
|
@@ -17,6 +17,19 @@ Requires-Dist: sqlalchemy<3.0.0,>=2.0.38
|
|
17
17
|
Requires-Dist: sqlalchemy-utils<1.0.0,>=0.41.2
|
18
18
|
Requires-Dist: textual[syntax]<4.0.0,>=2.0.0
|
19
19
|
Requires-Dist: pyOpenSSL>=22.1.0; sys_platform == "linux"
|
20
|
+
Requires-Dist: azure-storage-blob<13.0.0,>=12.25.1
|
21
|
+
Requires-Dist: azure-identity<2.0.0,>=1.22.0
|
22
|
+
Requires-Dist: azure-mgmt-storage<23.0.0,>=22.2.0
|
23
|
+
Provides-Extra: dev
|
24
|
+
Requires-Dist: bandit>=1.8.3; extra == "dev"
|
25
|
+
Requires-Dist: black>=25.1.0; extra == "dev"
|
26
|
+
Requires-Dist: coverage>=7.8.0; extra == "dev"
|
27
|
+
Requires-Dist: mkdocs-material>=9.6.12; extra == "dev"
|
28
|
+
Requires-Dist: pre-commit>=4.2.0; extra == "dev"
|
29
|
+
Requires-Dist: pylint>=3.3.6; extra == "dev"
|
30
|
+
Requires-Dist: pyright>=1.1.400; extra == "dev"
|
31
|
+
Requires-Dist: ruff>=0.11.7; extra == "dev"
|
32
|
+
Requires-Dist: textual-dev>=1.7.0; extra == "dev"
|
20
33
|
Dynamic: license-file
|
21
34
|
|
22
35
|
# 🧙♂️ Sourcerer
|
@@ -42,7 +55,14 @@ engineers to view and manage files across multiple cloud providers like
|
|
42
55
|
## 🪄 Installation
|
43
56
|
|
44
57
|
```bash
|
45
|
-
pip install sourcerer
|
58
|
+
pip install data-sourcerer
|
59
|
+
```
|
60
|
+
--
|
61
|
+
|
62
|
+
## 🪄 Run
|
63
|
+
|
64
|
+
```bash
|
65
|
+
sourcerer
|
46
66
|
```
|
47
67
|
|
48
68
|
|
@@ -1,95 +1,98 @@
|
|
1
|
-
data_sourcerer-0.
|
2
|
-
sourcerer/__init__.py,sha256=
|
3
|
-
sourcerer/settings.py,sha256=
|
4
|
-
sourcerer/utils.py,sha256=
|
1
|
+
data_sourcerer-0.2.0.dist-info/licenses/LICENSE,sha256=HjZ7RAG3i6izxvitGfY4feHfvW5F8DPj5eF0YBSf2rI,1073
|
2
|
+
sourcerer/__init__.py,sha256=EjDDEplny6MYdZdi-SpLg0b_I4GZ0Q12MTHkE_4f2ag,585
|
3
|
+
sourcerer/settings.py,sha256=dwY2GoaWD1CsAoVtWzaAhP7_e3KUugmBr2E624JSedc,1388
|
4
|
+
sourcerer/utils.py,sha256=1VzKResV28-BlNlvEQ694WcxOZCK-NBR9uTbopl_slE,872
|
5
5
|
sourcerer/domain/__init__.py,sha256=rV21d-dD-e0q4EQ2LfWDSDLlrUOjnHnWBtWPujoue0o,556
|
6
6
|
sourcerer/domain/access_credentials/__init__.py,sha256=pFAwnr74uy09e7kubYsuaqzkVPkTA66dwjKzpIGQkAY,217
|
7
|
-
sourcerer/domain/access_credentials/entities.py,sha256=
|
8
|
-
sourcerer/domain/access_credentials/exceptions.py,sha256=
|
9
|
-
sourcerer/domain/access_credentials/repositories.py,sha256=
|
10
|
-
sourcerer/domain/access_credentials/services.py,sha256=
|
7
|
+
sourcerer/domain/access_credentials/entities.py,sha256=UVjNbxTuXyaywG7RxxTADe67wRB8xlo3GO0bnij1Srs,2030
|
8
|
+
sourcerer/domain/access_credentials/exceptions.py,sha256=jo3vhGpIaEsDl68uV8JLDqPvfVZMi7H6MA0qsRL0QXQ,546
|
9
|
+
sourcerer/domain/access_credentials/repositories.py,sha256=KVD9P_-wYelt2_40Vyh-G6uyrNjtbDyKmD9gO8EiStY,2408
|
10
|
+
sourcerer/domain/access_credentials/services.py,sha256=MHTcz2OajQbQypbL082gXA7kqs4klCBUdKlguhWpLgQ,2791
|
11
11
|
sourcerer/domain/file_system/__init__.py,sha256=5diScp5Q8Hw8e_4vqacVocQBw0KA7fPs_YERoNwSEzM,184
|
12
12
|
sourcerer/domain/file_system/entities.py,sha256=5W2_I1lng8J2foSJN-FqNZPR6n151VntiD_vkssAqgQ,2069
|
13
|
-
sourcerer/domain/file_system/exceptions.py,sha256=
|
14
|
-
sourcerer/domain/file_system/services.py,sha256=
|
13
|
+
sourcerer/domain/file_system/exceptions.py,sha256=TairaMaLkSHgbiq3pImkmVZAACoVHy-1vQMl7Ox24cQ,509
|
14
|
+
sourcerer/domain/file_system/services.py,sha256=kQeEM1Lt28UBVT9uG4M2iFDSxSvQdaJw4QzM9giUdjY,2208
|
15
15
|
sourcerer/domain/shared/__init__.py,sha256=pkCn6PfBLIlYT5q4xWq3cNtOfbUrrePiH06TduLq6_o,148
|
16
|
-
sourcerer/domain/shared/entities.py,sha256=
|
16
|
+
sourcerer/domain/shared/entities.py,sha256=jJR1PhJBWrSeJyEFvauEYJ1UXG7BcT6pi2oFpmglu4I,497
|
17
17
|
sourcerer/domain/storage_provider/__init__.py,sha256=P3RUH9LFkWez3ehCczgVbnbp0tZZepPeOQf9spsC8FQ,192
|
18
|
-
sourcerer/domain/storage_provider/entities.py,sha256=
|
19
|
-
sourcerer/domain/storage_provider/exceptions.py,sha256=
|
20
|
-
sourcerer/domain/storage_provider/services.py,sha256=
|
18
|
+
sourcerer/domain/storage_provider/entities.py,sha256=08ueb1KXHfU_nyeY6GnQJ0-JxJEEW-WxKlIMWYY0T4A,1946
|
19
|
+
sourcerer/domain/storage_provider/exceptions.py,sha256=6xK5r62Bhedx3vV0_i7Eu5ZG5IExxeiuaGHG5sX17i4,508
|
20
|
+
sourcerer/domain/storage_provider/services.py,sha256=Zm6nrKqQJW-9ZaqTp9wQaQuwMeH6hkLJZCkhQ_sTRF0,3997
|
21
21
|
sourcerer/infrastructure/__init__.py,sha256=HQoqA8S9Vx2dr1Eua86wu_YxwXyY6jqa4IfEoZJcXcQ,616
|
22
|
-
sourcerer/infrastructure/utils.py,sha256=
|
22
|
+
sourcerer/infrastructure/utils.py,sha256=ZN8X2raaz_0mwYxz5gE9TgnuI8haSfYkuO_DadsAKgg,3000
|
23
23
|
sourcerer/infrastructure/access_credentials/__init__.py,sha256=7BSXnI9n59_PuGxHjOra6PG82R_6JlrU4S1tsJx4WGM,249
|
24
|
-
sourcerer/infrastructure/access_credentials/exceptions.py,sha256=
|
25
|
-
sourcerer/infrastructure/access_credentials/registry.py,sha256=
|
24
|
+
sourcerer/infrastructure/access_credentials/exceptions.py,sha256=usad48RTA7ub8AfnUs2EzbD-fiUwpmnRGjJluBjd3m4,1101
|
25
|
+
sourcerer/infrastructure/access_credentials/registry.py,sha256=KNhjocRCb5yQ0BzETPGauBoqUx3xnpBdRfTHFW-QD4A,3432
|
26
26
|
sourcerer/infrastructure/access_credentials/repositories.py,sha256=og5kAgUlNNGbCQYCMTJ7DE1GotmqLc7owpnXIfOSnng,3839
|
27
|
-
sourcerer/infrastructure/access_credentials/services.py,sha256=
|
27
|
+
sourcerer/infrastructure/access_credentials/services.py,sha256=Hbzubm1oN5-sVunzcRb11F31GpWGiiCyFNvMSy2fzEk,15628
|
28
28
|
sourcerer/infrastructure/db/__init__.py,sha256=sjx2F0aDnxej7-FAjhFJYIQQ5d2apmItkquKbvGYIBc,175
|
29
29
|
sourcerer/infrastructure/db/config.py,sha256=VUh4S4bEh9GSx3ZDfQTI-ZGdkWNs_KdO9zDjRCGDjPQ,1808
|
30
|
-
sourcerer/infrastructure/db/models.py,sha256=
|
30
|
+
sourcerer/infrastructure/db/models.py,sha256=U7Ocdup4KHyCRGvTTxHY2kF1FES3oaU2-hT7vU8pFIw,1743
|
31
31
|
sourcerer/infrastructure/file_system/__init__.py,sha256=Swx8arwXeZ4E40ViDSpQglmUrIlpuEvZY6crcWpGC2g,219
|
32
|
-
sourcerer/infrastructure/file_system/exceptions.py,sha256=
|
33
|
-
sourcerer/infrastructure/file_system/services.py,sha256=
|
32
|
+
sourcerer/infrastructure/file_system/exceptions.py,sha256=obx0NxVuhVzLgL5K2MA5d4rNImlRHJ4Gr-2RrIuKJqk,2944
|
33
|
+
sourcerer/infrastructure/file_system/services.py,sha256=J0XHv-zF8WblE6bzzEpKkqU_k3gefMj_OArWBRFtGHA,5649
|
34
34
|
sourcerer/infrastructure/storage_provider/__init__.py,sha256=GONjDCsTmd6f_fF3lzxDAfLlyuSQDhO4bz0eF9a35tI,229
|
35
|
-
sourcerer/infrastructure/storage_provider/exceptions.py,sha256=
|
36
|
-
sourcerer/infrastructure/storage_provider/registry.py,sha256=
|
37
|
-
sourcerer/infrastructure/storage_provider/services.py,sha256=
|
35
|
+
sourcerer/infrastructure/storage_provider/exceptions.py,sha256=acx3IIXD2yWlzLvD2asJBEpKEa6eJW31uKkzzr8MrR4,3336
|
36
|
+
sourcerer/infrastructure/storage_provider/registry.py,sha256=8dbRLOx1jLK_i18uuh_JnKvId9NJBECKg4nG9F_dFH4,2249
|
37
|
+
sourcerer/infrastructure/storage_provider/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
|
+
sourcerer/infrastructure/storage_provider/services/azure.py,sha256=u5yr1xFZwhqSCXcaQMygpOVhuNSabqLBZ_MpB8tmWV4,9785
|
39
|
+
sourcerer/infrastructure/storage_provider/services/gcp.py,sha256=_iVNf8OESVynGHKt68ZmudQtS6qU-UWZMhFa3v0Sm7Y,9102
|
40
|
+
sourcerer/infrastructure/storage_provider/services/s3.py,sha256=lSpf5SPyTZGl19ChgYBtf3IR6uUWULuAvLBEdD-oarM,9277
|
38
41
|
sourcerer/presentation/__init__.py,sha256=kzOeaTpy9hm61MLl_nybdooRrawFUd1uEX4f3Y-84ZU,472
|
39
42
|
sourcerer/presentation/app.py,sha256=ROu3vSWzo6d8W30A9Zqi5zdLcVeHJsGLDJMLTKrthHE,1018
|
40
43
|
sourcerer/presentation/di_container.py,sha256=mbK8tDY0LgVRfQfXVZ5tGXPHSfr_8JraCMIQlZn0hBc,1641
|
41
44
|
sourcerer/presentation/settings.py,sha256=OcNrvwqHwAq3ZqWOfEmZ0PqyvQpAY1fmBpMc9lBNfgI,1062
|
42
|
-
sourcerer/presentation/utils.py,sha256=
|
45
|
+
sourcerer/presentation/utils.py,sha256=aM5eCNEmIzCyfg8Egb2rFfOlXQ5pFTXzbRVwQGSOdjY,2638
|
43
46
|
sourcerer/presentation/screens/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
47
|
sourcerer/presentation/screens/critical_error/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
|
-
sourcerer/presentation/screens/critical_error/main.py,sha256=
|
48
|
+
sourcerer/presentation/screens/critical_error/main.py,sha256=DEYFNBqm-KE-TB09aJHMGBA0SVeFaOy4Zd9q3rcBpb4,2224
|
46
49
|
sourcerer/presentation/screens/critical_error/styles.tcss,sha256=mURvbf0_npkRtzVBs2bVBybbyNK9cO_6Ar2Muk1Mpv8,604
|
47
|
-
sourcerer/presentation/screens/file_system_finder/main.py,sha256=
|
50
|
+
sourcerer/presentation/screens/file_system_finder/main.py,sha256=DnzAz--JcfRxeBzNLk0qA9EuTkSK26IbIkMErV2t1nE,10121
|
48
51
|
sourcerer/presentation/screens/file_system_finder/styles.tcss,sha256=fZkdwXFsDkjXkaIskLxoQ_YHsLWKjgrn6hYseugg_68,718
|
49
52
|
sourcerer/presentation/screens/file_system_finder/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
50
|
-
sourcerer/presentation/screens/file_system_finder/widgets/file_system_navigator.py,sha256=
|
53
|
+
sourcerer/presentation/screens/file_system_finder/widgets/file_system_navigator.py,sha256=Le_76mA12dN8UhWddJexnb3Qqm-f4kqQdAaiyvIfxYQ,30878
|
51
54
|
sourcerer/presentation/screens/main/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
52
|
-
sourcerer/presentation/screens/main/main.py,sha256=
|
55
|
+
sourcerer/presentation/screens/main/main.py,sha256=OOczA6lem6JSdJCq-Nd2TtXmFA1R-xeVdqbM7I5QHTM,20440
|
53
56
|
sourcerer/presentation/screens/main/styles.tcss,sha256=Ruv2vBKzM8njH7OS2TCpZqCmRVEp7XQLeBN4XhVB5AU,381
|
54
57
|
sourcerer/presentation/screens/main/messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
55
|
-
sourcerer/presentation/screens/main/messages/delete_request.py,sha256=
|
56
|
-
sourcerer/presentation/screens/main/messages/download_request.py,sha256=
|
58
|
+
sourcerer/presentation/screens/main/messages/delete_request.py,sha256=puaU1UtbDErfYi8ViPEawhSbycnUpwdE81zZfzlslNE,203
|
59
|
+
sourcerer/presentation/screens/main/messages/download_request.py,sha256=3urSTrvNbod1FrXfu-C1UDZqOu5D0OC-NJsKJhhprXE,205
|
57
60
|
sourcerer/presentation/screens/main/messages/preview_request.py,sha256=px8N3E2VEexKmpZESb9nYDQvhXUThPxM0dU41B533tM,184
|
58
61
|
sourcerer/presentation/screens/main/messages/resizing_rule.py,sha256=ws7lzS08h6qqeihF66XV5FsX26YkjQOje_4vgCw2mqI,332
|
59
62
|
sourcerer/presentation/screens/main/messages/select_storage_item.py,sha256=xBu0UH5A6iyZPJECt_f_vfWVaCmE0bJo5hq2FJXMHQo,237
|
60
63
|
sourcerer/presentation/screens/main/messages/uncheck_files_request.py,sha256=CMpYVwos1JHknqDcqru1hG8RJy5f1Lwjsxtrse1ZDGw,140
|
61
64
|
sourcerer/presentation/screens/main/messages/upload_request.py,sha256=KXPTliqdvRvtMwob5bQUuBDxCjWmFcSjt-eUgQoRv7g,185
|
62
65
|
sourcerer/presentation/screens/main/mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
63
|
-
sourcerer/presentation/screens/main/mixins/resize_containers_watcher_mixin.py,sha256=
|
66
|
+
sourcerer/presentation/screens/main/mixins/resize_containers_watcher_mixin.py,sha256=wZnTbJHjHDJbKFkfbyT0CR3GWlVupyiSotgnumBiEoI,5647
|
64
67
|
sourcerer/presentation/screens/main/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
65
|
-
sourcerer/presentation/screens/main/widgets/gradient.py,sha256=
|
66
|
-
sourcerer/presentation/screens/main/widgets/resizing_rule.py,sha256
|
67
|
-
sourcerer/presentation/screens/main/widgets/storage_content.py,sha256=
|
68
|
-
sourcerer/presentation/screens/main/widgets/storage_list_sidebar.py,sha256=
|
68
|
+
sourcerer/presentation/screens/main/widgets/gradient.py,sha256=LThG7XSIUhJeXnONgArWuabosv9UiGHoHd95jKrT6rk,1226
|
69
|
+
sourcerer/presentation/screens/main/widgets/resizing_rule.py,sha256=-SIqnXtQNM80t73nsyUx02bz8I6dAHJiSxWL0Aki2Bo,2040
|
70
|
+
sourcerer/presentation/screens/main/widgets/storage_content.py,sha256=fXHBfrZ5db7rzF4MfDwUDO8cQSeyVa73smJFw-qzaj0,21863
|
71
|
+
sourcerer/presentation/screens/main/widgets/storage_list_sidebar.py,sha256=CFzNpnhEJ0TZHOVxaVGl2AsvYcRF3VvNhKAbD0KGuCg,4670
|
69
72
|
sourcerer/presentation/screens/preview_content/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
70
|
-
sourcerer/presentation/screens/preview_content/main.py,sha256=
|
71
|
-
sourcerer/presentation/screens/preview_content/styles.tcss,sha256=
|
73
|
+
sourcerer/presentation/screens/preview_content/main.py,sha256=hvJpiHZD3fuT6qPauSgPIMj7uaUUVSUKp1KnmaSQr5E,2546
|
74
|
+
sourcerer/presentation/screens/preview_content/styles.tcss,sha256=Qk0nZtUfp-mCFaUXtkjwimAnshXnhEgh719aT4_lDPQ,374
|
72
75
|
sourcerer/presentation/screens/provider_creds_list/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
73
|
-
sourcerer/presentation/screens/provider_creds_list/main.py,sha256=
|
76
|
+
sourcerer/presentation/screens/provider_creds_list/main.py,sha256=gs35uG4mC0vWD_-TcQB3Wr6XnLyDFvtkPItj-qq_B9E,6203
|
74
77
|
sourcerer/presentation/screens/provider_creds_list/styles.tcss,sha256=PmO_JKNR7NhYhT9CXLSZqh_q3rxFJ1HkSzVxOjJs_P8,904
|
75
78
|
sourcerer/presentation/screens/provider_creds_registration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
76
|
-
sourcerer/presentation/screens/provider_creds_registration/main.py,sha256=
|
79
|
+
sourcerer/presentation/screens/provider_creds_registration/main.py,sha256=TUPw2E54-ALfEk2YSU7DpzuyJ24oDj3jHEfQQsH6n_g,11079
|
77
80
|
sourcerer/presentation/screens/provider_creds_registration/styles.tcss,sha256=gd1SNeRoHTYwNzdGxK-2aDqNPeY5b2wFWajtoNn5--Y,612
|
78
81
|
sourcerer/presentation/screens/question/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
79
|
-
sourcerer/presentation/screens/question/main.py,sha256=
|
82
|
+
sourcerer/presentation/screens/question/main.py,sha256=XftOcA6gDpK1Tc9WqE_jK5q0CLNvZuVuW88hp4X_kZM,901
|
80
83
|
sourcerer/presentation/screens/question/styles.tcss,sha256=fJl0Votob2sfRQP4s8Oqd5P2OQ0WiGMdoLpTsMgISfw,418
|
81
84
|
sourcerer/presentation/screens/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
82
|
-
sourcerer/presentation/screens/shared/containers.py,sha256=
|
85
|
+
sourcerer/presentation/screens/shared/containers.py,sha256=9Tkl5SbPNgycZlfp5Pq50pHnJqbP0EckmxayXPPuhFs,378
|
83
86
|
sourcerer/presentation/screens/shared/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
84
87
|
sourcerer/presentation/screens/shared/widgets/button.py,sha256=MpzxKZ7KGe5g4aNkNnFN6novnXv1au3WdgsVN-ITOns,1558
|
85
|
-
sourcerer/presentation/screens/shared/widgets/labeled_input.py,sha256=
|
88
|
+
sourcerer/presentation/screens/shared/widgets/labeled_input.py,sha256=H_v62jpcZD0iuaKlTtKvOy_0GKCugibR7n6weGK-Upk,2750
|
86
89
|
sourcerer/presentation/screens/storage_action_progress/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
87
|
-
sourcerer/presentation/screens/storage_action_progress/main.py,sha256=
|
88
|
-
sourcerer/presentation/screens/storage_action_progress/styles.tcss,sha256=
|
90
|
+
sourcerer/presentation/screens/storage_action_progress/main.py,sha256=F33lL4NEqrw8B_xORSoQWVdUCldFTPPdqUsn2_YgEKM,17973
|
91
|
+
sourcerer/presentation/screens/storage_action_progress/styles.tcss,sha256=ffvDxRWhckE5tjEG4jwlhQNqeQsYpdF71104StWCGWU,818
|
89
92
|
sourcerer/presentation/themes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
90
93
|
sourcerer/presentation/themes/github_dark.py,sha256=9E1mEOr701nU-ZDSKBccMl3GYchroCEsxEVelm5oI-E,497
|
91
|
-
data_sourcerer-0.
|
92
|
-
data_sourcerer-0.
|
93
|
-
data_sourcerer-0.
|
94
|
-
data_sourcerer-0.
|
95
|
-
data_sourcerer-0.
|
94
|
+
data_sourcerer-0.2.0.dist-info/METADATA,sha256=ZbbpumnqYrw9JDSlgRQN8fYY5Yn55rlPO4QtEB1gRBU,2388
|
95
|
+
data_sourcerer-0.2.0.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
|
96
|
+
data_sourcerer-0.2.0.dist-info/entry_points.txt,sha256=CyD02GehPW6QuhR5oDY5tLLRHQ9qbPXe0v3aT1pK3N8,62
|
97
|
+
data_sourcerer-0.2.0.dist-info/top_level.txt,sha256=_9Nul_xiROuGIUDltaPqy-HyRzvv80MF_uquhggP9So,10
|
98
|
+
data_sourcerer-0.2.0.dist-info/RECORD,,
|
sourcerer/__init__.py
CHANGED
@@ -9,6 +9,7 @@ from dataclasses import dataclass
|
|
9
9
|
from datetime import datetime
|
10
10
|
|
11
11
|
import boto3
|
12
|
+
from azure.identity import ClientSecretCredential
|
12
13
|
|
13
14
|
|
14
15
|
@dataclass
|
@@ -51,3 +52,19 @@ class Boto3Credentials:
|
|
51
52
|
session: boto3.Session
|
52
53
|
endpoint_url: str | None = None
|
53
54
|
signature_version: str | None = None
|
55
|
+
|
56
|
+
|
57
|
+
@dataclass
|
58
|
+
class AzureCredentials:
|
59
|
+
"""
|
60
|
+
Represents Azure credentials.
|
61
|
+
|
62
|
+
Attributes:
|
63
|
+
credentials (ClientSecretCredential): Azure identity credential object for authentication.
|
64
|
+
subscription_id (str): The Azure subscription ID.
|
65
|
+
cloud_suffix (str): The Azure cloud storage suffix (e.g., blob.core.windows.net).
|
66
|
+
"""
|
67
|
+
|
68
|
+
credentials: ClientSecretCredential
|
69
|
+
subscription_id: str
|
70
|
+
cloud_suffix: str
|
@@ -5,7 +5,7 @@ This module defines the abstract base class for credentials repositories,
|
|
5
5
|
providing a common interface for different storage implementations.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from abc import
|
8
|
+
from abc import ABCMeta, abstractmethod
|
9
9
|
|
10
10
|
from sourcerer.domain.access_credentials.entities import Credentials
|
11
11
|
|
@@ -8,7 +8,6 @@ authentication methods.
|
|
8
8
|
|
9
9
|
from abc import abstractmethod
|
10
10
|
from dataclasses import dataclass
|
11
|
-
from typing import List
|
12
11
|
|
13
12
|
from sourcerer.domain.access_credentials.repositories import BaseCredentialsRepository
|
14
13
|
|
@@ -82,10 +81,23 @@ class BaseAccessCredentialsService:
|
|
82
81
|
|
83
82
|
@classmethod
|
84
83
|
@abstractmethod
|
85
|
-
def auth_fields(cls) ->
|
84
|
+
def auth_fields(cls) -> list[AuthField]:
|
86
85
|
"""
|
87
86
|
Get list of authentication fields.
|
88
87
|
|
89
88
|
Returns:
|
90
89
|
List[AuthField]: List of authentication field definitions
|
91
90
|
"""
|
91
|
+
|
92
|
+
@classmethod
|
93
|
+
def validate_auth_fields_values(cls, auth_fields: dict) -> None:
|
94
|
+
"""
|
95
|
+
Validate authentication fields.
|
96
|
+
|
97
|
+
Args:
|
98
|
+
auth_fields (dict): Dictionary containing authentication field,
|
99
|
+
where keys are field names and values are field values
|
100
|
+
|
101
|
+
Raises:
|
102
|
+
MissingAuthFieldsError: If any required authentication fields are missing
|
103
|
+
"""
|
@@ -37,7 +37,7 @@ class BaseFileSystemService(metaclass=abc.ABCMeta):
|
|
37
37
|
str: The processed data extracted from the file.
|
38
38
|
|
39
39
|
Raises:
|
40
|
-
|
40
|
+
ReadFileError: An error occurred during the file read operation.
|
41
41
|
"""
|
42
42
|
raise NotImplementedError
|
43
43
|
|
@@ -59,6 +59,6 @@ class BaseFileSystemService(metaclass=abc.ABCMeta):
|
|
59
59
|
- directories (list[Path]): Sorted list of directory paths
|
60
60
|
|
61
61
|
Raises:
|
62
|
-
|
62
|
+
ListDirError: If the path is invalid, directory doesn't exist, or path is not a directory.
|
63
63
|
"""
|
64
64
|
raise NotImplementedError
|
@@ -7,7 +7,6 @@ such as storage containers, files, folders, and permissions.
|
|
7
7
|
|
8
8
|
from dataclasses import dataclass
|
9
9
|
from datetime import datetime
|
10
|
-
from typing import List
|
11
10
|
|
12
11
|
|
13
12
|
@dataclass
|
@@ -37,7 +36,7 @@ class StoragePermissions:
|
|
37
36
|
"""
|
38
37
|
|
39
38
|
user: str
|
40
|
-
permissions:
|
39
|
+
permissions: list[str]
|
41
40
|
|
42
41
|
|
43
42
|
@dataclass
|
@@ -82,5 +81,5 @@ class StorageContent:
|
|
82
81
|
folders (List[Folder]): List of folders in the location
|
83
82
|
"""
|
84
83
|
|
85
|
-
files:
|
86
|
-
folders:
|
84
|
+
files: list[File]
|
85
|
+
folders: list[Folder]
|
@@ -6,13 +6,13 @@ providing a common interface for cloud storage operations.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
from abc import ABC, abstractmethod
|
9
|
+
from collections.abc import Callable
|
9
10
|
from pathlib import Path
|
10
|
-
from typing import List, Callable
|
11
11
|
|
12
12
|
from sourcerer.domain.storage_provider.entities import (
|
13
|
-
StoragePermissions,
|
14
|
-
StorageContent,
|
15
13
|
Storage,
|
14
|
+
StorageContent,
|
15
|
+
StoragePermissions,
|
16
16
|
)
|
17
17
|
|
18
18
|
|
@@ -27,7 +27,7 @@ class BaseStorageProviderService(ABC):
|
|
27
27
|
"""
|
28
28
|
|
29
29
|
@abstractmethod
|
30
|
-
def list_storages(self) ->
|
30
|
+
def list_storages(self) -> list[Storage]:
|
31
31
|
"""
|
32
32
|
Return a list of available storages.
|
33
33
|
|
@@ -36,7 +36,7 @@ class BaseStorageProviderService(ABC):
|
|
36
36
|
"""
|
37
37
|
|
38
38
|
@abstractmethod
|
39
|
-
def get_storage_permissions(self, storage: str) ->
|
39
|
+
def get_storage_permissions(self, storage: str) -> list[StoragePermissions]:
|
40
40
|
"""
|
41
41
|
Return the permissions for the specified storage.
|
42
42
|
|
@@ -75,7 +75,6 @@ class BaseStorageProviderService(ABC):
|
|
75
75
|
Returns:
|
76
76
|
bytes: The content of the storage item
|
77
77
|
"""
|
78
|
-
pass
|
79
78
|
|
80
79
|
@abstractmethod
|
81
80
|
def delete_storage_item(self, storage: str, key: str) -> None:
|
@@ -89,13 +88,18 @@ class BaseStorageProviderService(ABC):
|
|
89
88
|
|
90
89
|
@abstractmethod
|
91
90
|
def upload_storage_item(
|
92
|
-
self,
|
91
|
+
self,
|
92
|
+
storage: str,
|
93
|
+
storage_path: str,
|
94
|
+
source_path: Path,
|
95
|
+
dest_path: str | None = None,
|
93
96
|
) -> None:
|
94
97
|
"""
|
95
98
|
Upload a file to the specified storage path.
|
96
99
|
|
97
100
|
Args:
|
98
101
|
storage (str): The storage identifier
|
102
|
+
storage_path (str): The path within the storage to upload
|
99
103
|
source_path (Path): Local file path to upload
|
100
104
|
dest_path (str, optional): Destination path in storage. Defaults to None.
|
101
105
|
"""
|
@@ -117,7 +121,7 @@ class BaseStorageProviderService(ABC):
|
|
117
121
|
"""
|
118
122
|
|
119
123
|
@abstractmethod
|
120
|
-
def get_file_size(self, storage: str, key: str) ->
|
124
|
+
def get_file_size(self, storage: str, key: str) -> int:
|
121
125
|
"""
|
122
126
|
Get metadata for a storage item without downloading content.
|
123
127
|
|
@@ -126,5 +130,5 @@ class BaseStorageProviderService(ABC):
|
|
126
130
|
key (str): The key/path of the item
|
127
131
|
|
128
132
|
Returns:
|
129
|
-
|
133
|
+
int: Size of the storage item in bytes
|
130
134
|
"""
|
@@ -1,9 +1,9 @@
|
|
1
1
|
from sourcerer.domain.access_credentials.exceptions import (
|
2
|
-
|
2
|
+
BaseAccessCredentialsError,
|
3
3
|
)
|
4
4
|
|
5
5
|
|
6
|
-
class CredentialsAuthError(
|
6
|
+
class CredentialsAuthError(BaseAccessCredentialsError):
|
7
7
|
"""
|
8
8
|
Exception raised when there is an error parsing access credentials.
|
9
9
|
|
@@ -14,3 +14,16 @@ class CredentialsAuthError(BaseAccessCredentialsException):
|
|
14
14
|
or any other authentication process that relies on the provided
|
15
15
|
credentials.
|
16
16
|
"""
|
17
|
+
|
18
|
+
|
19
|
+
class MissingAuthFieldsError(CredentialsAuthError):
|
20
|
+
"""
|
21
|
+
Exception raised when there are missing authentication fields.
|
22
|
+
|
23
|
+
This exception is raised when the required authentication fields
|
24
|
+
are missing from the provided credentials. It indicates that the
|
25
|
+
authentication process cannot proceed without the necessary
|
26
|
+
credentials. This can occur during operations such as login,
|
27
|
+
token validation, or any other authentication process that relies
|
28
|
+
on the provided credentials.
|
29
|
+
"""
|
@@ -7,7 +7,6 @@ access credential services for various cloud providers.
|
|
7
7
|
|
8
8
|
import functools
|
9
9
|
from dataclasses import dataclass
|
10
|
-
from typing import Type, Dict
|
11
10
|
|
12
11
|
from sourcerer.domain.access_credentials.services import BaseAccessCredentialsService
|
13
12
|
from sourcerer.infrastructure.utils import Singleton
|
@@ -38,19 +37,19 @@ class AccessCredentialsRegistry(metaclass=Singleton):
|
|
38
37
|
def __init__(self, *args, **kwargs):
|
39
38
|
"""Initialize the registry with an empty dictionary."""
|
40
39
|
super().__init__(*args, **kwargs)
|
41
|
-
self._items_:
|
40
|
+
self._items_: dict[str, dict[str, type]] = {} # type: ignore
|
42
41
|
|
43
42
|
def register(
|
44
43
|
self,
|
45
44
|
access_credentials_method: AccessCredentialsMethod,
|
46
|
-
cls:
|
45
|
+
cls: type[BaseAccessCredentialsService],
|
47
46
|
):
|
48
47
|
"""
|
49
48
|
Register a credential service implementation.
|
50
49
|
|
51
50
|
Args:
|
52
51
|
access_credentials_method (AccessCredentialsMethod): The method descriptor
|
53
|
-
cls (
|
52
|
+
cls (type[BaseAccessCredentialsService]): The service class to register
|
54
53
|
"""
|
55
54
|
if access_credentials_method.provider not in self._items_:
|
56
55
|
self._items_[access_credentials_method.provider] = {}
|