data-sourcerer 0.1.0__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.
Files changed (54) hide show
  1. {data_sourcerer-0.1.0.dist-info → data_sourcerer-0.2.0.dist-info}/METADATA +25 -4
  2. {data_sourcerer-0.1.0.dist-info → data_sourcerer-0.2.0.dist-info}/RECORD +53 -50
  3. {data_sourcerer-0.1.0.dist-info → data_sourcerer-0.2.0.dist-info}/WHEEL +1 -1
  4. sourcerer/__init__.py +1 -1
  5. sourcerer/domain/access_credentials/entities.py +17 -0
  6. sourcerer/domain/access_credentials/exceptions.py +1 -1
  7. sourcerer/domain/access_credentials/repositories.py +1 -1
  8. sourcerer/domain/access_credentials/services.py +14 -2
  9. sourcerer/domain/file_system/exceptions.py +1 -1
  10. sourcerer/domain/file_system/services.py +2 -2
  11. sourcerer/domain/shared/entities.py +1 -0
  12. sourcerer/domain/storage_provider/entities.py +3 -4
  13. sourcerer/domain/storage_provider/exceptions.py +1 -1
  14. sourcerer/domain/storage_provider/services.py +13 -9
  15. sourcerer/infrastructure/access_credentials/exceptions.py +15 -2
  16. sourcerer/infrastructure/access_credentials/registry.py +3 -4
  17. sourcerer/infrastructure/access_credentials/services.py +141 -44
  18. sourcerer/infrastructure/db/models.py +1 -1
  19. sourcerer/infrastructure/file_system/exceptions.py +9 -9
  20. sourcerer/infrastructure/file_system/services.py +16 -16
  21. sourcerer/infrastructure/storage_provider/exceptions.py +28 -8
  22. sourcerer/infrastructure/storage_provider/registry.py +2 -3
  23. sourcerer/infrastructure/storage_provider/services/__init__.py +0 -0
  24. sourcerer/infrastructure/storage_provider/services/azure.py +261 -0
  25. sourcerer/infrastructure/storage_provider/services/gcp.py +277 -0
  26. sourcerer/infrastructure/storage_provider/services/s3.py +290 -0
  27. sourcerer/infrastructure/utils.py +2 -4
  28. sourcerer/presentation/screens/critical_error/main.py +3 -4
  29. sourcerer/presentation/screens/file_system_finder/main.py +4 -4
  30. sourcerer/presentation/screens/file_system_finder/widgets/file_system_navigator.py +12 -12
  31. sourcerer/presentation/screens/main/main.py +57 -33
  32. sourcerer/presentation/screens/main/messages/delete_request.py +1 -2
  33. sourcerer/presentation/screens/main/messages/download_request.py +1 -2
  34. sourcerer/presentation/screens/main/mixins/resize_containers_watcher_mixin.py +3 -3
  35. sourcerer/presentation/screens/main/widgets/gradient.py +2 -5
  36. sourcerer/presentation/screens/main/widgets/resizing_rule.py +1 -1
  37. sourcerer/presentation/screens/main/widgets/storage_content.py +12 -13
  38. sourcerer/presentation/screens/main/widgets/storage_list_sidebar.py +8 -6
  39. sourcerer/presentation/screens/preview_content/main.py +15 -4
  40. sourcerer/presentation/screens/preview_content/styles.tcss +2 -1
  41. sourcerer/presentation/screens/provider_creds_list/main.py +2 -2
  42. sourcerer/presentation/screens/provider_creds_registration/main.py +26 -11
  43. sourcerer/presentation/screens/question/main.py +1 -1
  44. sourcerer/presentation/screens/shared/containers.py +1 -1
  45. sourcerer/presentation/screens/shared/widgets/labeled_input.py +1 -1
  46. sourcerer/presentation/screens/storage_action_progress/main.py +34 -20
  47. sourcerer/presentation/screens/storage_action_progress/styles.tcss +11 -0
  48. sourcerer/presentation/utils.py +7 -3
  49. sourcerer/settings.py +4 -0
  50. sourcerer/utils.py +2 -2
  51. sourcerer/infrastructure/storage_provider/services.py +0 -509
  52. {data_sourcerer-0.1.0.dist-info → data_sourcerer-0.2.0.dist-info}/entry_points.txt +0 -0
  53. {data_sourcerer-0.1.0.dist-info → data_sourcerer-0.2.0.dist-info}/licenses/LICENSE +0 -0
  54. {data_sourcerer-0.1.0.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.1.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,termanal,storage,textual,ui
8
- Requires-Python: >=3.8
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
@@ -16,6 +16,20 @@ Requires-Dist: humanize<5.0.0,>=4.12.1
16
16
  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
+ 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"
19
33
  Dynamic: license-file
20
34
 
21
35
  # 🧙‍♂️ Sourcerer
@@ -41,7 +55,14 @@ engineers to view and manage files across multiple cloud providers like
41
55
  ## 🪄 Installation
42
56
 
43
57
  ```bash
44
- pip install sourcerer
58
+ pip install data-sourcerer
59
+ ```
60
+ --
61
+
62
+ ## 🪄 Run
63
+
64
+ ```bash
65
+ sourcerer
45
66
  ```
46
67
 
47
68
 
@@ -1,95 +1,98 @@
1
- data_sourcerer-0.1.0.dist-info/licenses/LICENSE,sha256=HjZ7RAG3i6izxvitGfY4feHfvW5F8DPj5eF0YBSf2rI,1073
2
- sourcerer/__init__.py,sha256=h7QH2R5-hJCjx1Yn7krJm8SThocxrzReoc5j7Pae-LI,585
3
- sourcerer/settings.py,sha256=GebQXsEsiiFKBWsmRO5RToCYzTKpr8hOYipBP5WqzG4,1319
4
- sourcerer/utils.py,sha256=udr1T2hObYPEchsVyBQvzPuEJcQptLfwF4BnjvvOnvE,841
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=0jLhLGjst42TbhnWYVL9wnN8K1KmL8H_vhG2DavaQd0,1541
8
- sourcerer/domain/access_credentials/exceptions.py,sha256=g7m7zrgEKdtNNynn049vEc6W_V-8yhS4hLOAOaK_NeM,550
9
- sourcerer/domain/access_credentials/repositories.py,sha256=FDbpbQZd_I0FHUuySYbBlBByvVci1fNIJvN_P63sN0g,2408
10
- sourcerer/domain/access_credentials/services.py,sha256=Ze2s-w6BB231A8cGziC88o-wyNTyaPAIq-HPy8RP-YA,2383
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=pE_Z3gzbPO3JHU3WonBEoMOtPhuHSKr7ABGo-xyp8NY,513
14
- sourcerer/domain/file_system/services.py,sha256=CTBVL98E7eMNNzQsekzlyrxfJWw_cIzTROhBM5LgV_E,2216
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=kZ4F2ExhYIVC6FNtHzvk6n71KaCMgZdf-JL7M1eVOTs,462
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=So3mdAfM65W_J9hV78PzQS1R-i7g9LsKYiH-a1ui4XM,1970
19
- sourcerer/domain/storage_provider/exceptions.py,sha256=0sZuwDfjRDCX7Jdh39xVzEemZoYL_CWzZw2E7cc1AZc,512
20
- sourcerer/domain/storage_provider/services.py,sha256=3-JVtG3a7U-UCloO8nEguxA1E8Sr-HM0IsJxQ4xuWjE,3885
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=OnIaA2TKzN2yA8YasWEcrWV8ZC4xO0n0vJ7hgKCpbUQ,3042
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=WGOOH5NFR9sFtOqX-g9KasYSa6tzmaFStzfrTwtPqN8,601
25
- sourcerer/infrastructure/access_credentials/registry.py,sha256=KLaNQSQBGJ6QEvO8Q63QAjIUIfx3jLH_5sp_eD0xymw,3462
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=LBoRsE-CauSrcEduhkRR6DhfFT2QZqS5ErvPw4c83wg,12254
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=yABQtOG7FE8r8nfyg5mIAAZjmH4lj9TQzCV206-YCfY,1743
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=kNTQE24Z440igtiXnmWmhyKM8WMyBVXSXW9uWAqnL1A,3012
33
- sourcerer/infrastructure/file_system/services.py,sha256=OsNDLPBmjT9ps640ZPv9S_G1bCK3ThdAaR5Z_PdYgoI,5694
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=LLtDv0Qrrjjw9NWeGOLFSpI4NkXEtLPKRQbXA4aINMM,2702
36
- sourcerer/infrastructure/storage_provider/registry.py,sha256=8mNrOemCvFPO71nOSCY4s0QtGnXNWk8GnwhwpalOVzo,2279
37
- sourcerer/infrastructure/storage_provider/services.py,sha256=26tOuuLwugtn3L17qUOBaM_Xzg4Ptrbj74VkgXbVCkM,16756
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=9kXYKV2ECCWzDuz4bIdjCsM4Q1ycvUPFI_YUWAtEsx8,2474
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=eRKR4xTpgf9AMPz2K9mVUGN_8MauVbTBb7v0JfhT6Ck,2242
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=sCTwuAFV8VxN2VsT6JkSfw292lE9GQAz9rJZ693WV2Y,10118
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=f2w4rTkUMRMFCG4_W3xrsE4T5QqdJALObtIHT3fa2FQ,30875
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=jLexn2hiJlQEXK2Yy9y6Ex_doyR-2LzC9CHKs1Q4pgI,19466
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=b8rjpe2E0p-BNYQTwuT0yD9qGzHat23N7ip_FbzhRaY,227
56
- sourcerer/presentation/screens/main/messages/download_request.py,sha256=PpLtx3A-s_sq7ThavtwR-2EkSjM0_NevZ5xvJ8JaCN8,229
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=PMtPFwEuxRaeFsaELzOEwOw6m30yMbIUTVkxkMbNRqU,5647
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=aaKg0rMlMhiZzwss_qVFNKMBSMh6rZHE4C6goo5CpNc,1268
66
- sourcerer/presentation/screens/main/widgets/resizing_rule.py,sha256=nn-Yucvq7DK9RM7hcgkfPpqLjPq5qfswm2X7Y3XMw5k,2040
67
- sourcerer/presentation/screens/main/widgets/storage_content.py,sha256=mOg13MdCPextpu4El1SY6huMPUWEcSnUC0njF74Stlc,21880
68
- sourcerer/presentation/screens/main/widgets/storage_list_sidebar.py,sha256=xYDW6S9GSn747s06WbE691mogLKg0JrK9bh1T7Nf-5o,4588
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=DGbiplvxZIE3gHKWZPsw3imqQWESO0Ej-YvN6t1j3uI,2267
71
- sourcerer/presentation/screens/preview_content/styles.tcss,sha256=wuLIX9UyniZ8EUBEqQ-_vn-CZ45q0PNxnbQFNG4QTxE,356
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=tU8Vi7OxUIjiC1pxZk3dIJh71zOWnu9VGaOSl8LWDoE,6203
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=CGBNZ2asPupanb7Ds1x4WLuunYdIMBKJisjlEQKZHa0,10613
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=2hhFhVf52IIuIgeiQPfBRQEP9hSuXxnJD55TFl4rYug,901
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=n2eGBb-lGZoMBNV1e0HdAfCkCObZuaVusfRVvosVAfo,378
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=q1y5XGWOtP9buk_hkLvc2QwDEd5XtK-_hFk_WQCARa8,2750
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=1Y7zemJlgJ_twZI_bJYZ4r_7NHU7qS9hCtzLOPpkXJk,17298
88
- sourcerer/presentation/screens/storage_action_progress/styles.tcss,sha256=auV7H_JT68--Ry5SMLxsGamOcAnPhHul4NkIj2WOht0,667
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.1.0.dist-info/METADATA,sha256=7UC4aOLGSz3TxMMN8xPXlOrIYJSN5mBKRsJEKaLMaIM,1692
92
- data_sourcerer-0.1.0.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
93
- data_sourcerer-0.1.0.dist-info/entry_points.txt,sha256=CyD02GehPW6QuhR5oDY5tLLRHQ9qbPXe0v3aT1pK3N8,62
94
- data_sourcerer-0.1.0.dist-info/top_level.txt,sha256=_9Nul_xiROuGIUDltaPqy-HyRzvv80MF_uquhggP9So,10
95
- data_sourcerer-0.1.0.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: setuptools (80.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
sourcerer/__init__.py CHANGED
@@ -12,4 +12,4 @@ The application is structured using a clean architecture approach with:
12
12
  - Presentation layer: User interface components
13
13
  """
14
14
 
15
- __version__ = "0.1.0"
15
+ __version__ = "0.2.0"
@@ -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
@@ -6,7 +6,7 @@ access credentials operations.
6
6
  """
7
7
 
8
8
 
9
- class BaseAccessCredentialsException(Exception):
9
+ class BaseAccessCredentialsError(Exception):
10
10
  """
11
11
  Base exception class for access credentials-related errors.
12
12
 
@@ -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 abstractmethod, ABCMeta
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) -> List[AuthField]:
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
+ """
@@ -6,7 +6,7 @@ file system operations.
6
6
  """
7
7
 
8
8
 
9
- class BaseFileSystemException(Exception):
9
+ class BaseFileSystemError(Exception):
10
10
  """
11
11
  Base exception class for filesystem-related errors.
12
12
 
@@ -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
- ReadFileException: An error occurred during the file read operation.
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
- ListDirException: If the path is invalid, directory doesn't exist, or path is not a directory.
62
+ ListDirError: If the path is invalid, directory doesn't exist, or path is not a directory.
63
63
  """
64
64
  raise NotImplementedError
@@ -16,3 +16,4 @@ class StorageProvider:
16
16
 
17
17
  S3 = "S3"
18
18
  GoogleCloudStorage = "Google Cloud Storage"
19
+ AzureStorage = "Azure Storage"
@@ -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: List[str]
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: List[File]
86
- folders: List[Folder]
84
+ files: list[File]
85
+ folders: list[Folder]
@@ -6,7 +6,7 @@ cloud storage provider operations.
6
6
  """
7
7
 
8
8
 
9
- class BaseStorageProviderException(Exception):
9
+ class BaseStorageProviderError(Exception):
10
10
  """
11
11
  Base exception class for cloud storage provider-related errors.
12
12
 
@@ -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) -> List[Storage]:
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) -> List[StoragePermissions]:
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, storage: str, source_path: Path, dest_path: str | None = None
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) -> dict:
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
- dict: Metadata for the specified item
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
- BaseAccessCredentialsException,
2
+ BaseAccessCredentialsError,
3
3
  )
4
4
 
5
5
 
6
- class CredentialsAuthError(BaseAccessCredentialsException):
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_: Dict[str, Dict[str, type]] = {} # type: ignore
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: Type[BaseAccessCredentialsService],
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 (Type[BaseAccessCredentialsService]): The service class to register
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] = {}