data-sourcerer 0.1.1__py3-none-any.whl → 0.2.1__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.1.dist-info → data_sourcerer-0.2.1.dist-info}/METADATA +29 -10
  2. {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.1.dist-info}/RECORD +52 -50
  3. {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.1.dist-info}/WHEEL +1 -2
  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. data_sourcerer-0.1.1.dist-info/top_level.txt +0 -1
  52. sourcerer/infrastructure/storage_provider/services.py +0 -509
  53. {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.1.dist-info}/entry_points.txt +0 -0
  54. {data_sourcerer-0.1.1.dist-info → data_sourcerer-0.2.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,29 +1,41 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-sourcerer
3
- Version: 0.1.1
3
+ Version: 0.2.1
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
9
- Description-Content-Type: text/markdown
10
7
  License-File: LICENSE
8
+ Keywords: cli,cloud,gcp,s3,storage,terminal,textual,ui
9
+ Requires-Python: >=3.9
10
+ Requires-Dist: azure-identity<2.0.0,>=1.22.0
11
+ Requires-Dist: azure-mgmt-storage<23.0.0,>=22.2.0
12
+ Requires-Dist: azure-storage-blob<13.0.0,>=12.25.1
11
13
  Requires-Dist: boto3<2.0.0,>=1.26.0
12
14
  Requires-Dist: cryptography<45.0.0,>=44.0.2
13
15
  Requires-Dist: dependency-injector<5.0.0,>=4.43.0
14
16
  Requires-Dist: google-cloud-storage<4.0.0,>=3.1.0
15
17
  Requires-Dist: humanize<5.0.0,>=4.12.1
16
- Requires-Dist: sqlalchemy<3.0.0,>=2.0.38
18
+ Requires-Dist: pyopenssl>=22.1.0; sys_platform == 'linux'
17
19
  Requires-Dist: sqlalchemy-utils<1.0.0,>=0.41.2
20
+ Requires-Dist: sqlalchemy<3.0.0,>=2.0.38
18
21
  Requires-Dist: textual[syntax]<4.0.0,>=2.0.0
19
- Requires-Dist: pyOpenSSL>=22.1.0; sys_platform == "linux"
20
- Dynamic: license-file
22
+ Provides-Extra: dev
23
+ Requires-Dist: bandit>=1.8.3; extra == 'dev'
24
+ Requires-Dist: black>=25.1.0; extra == 'dev'
25
+ Requires-Dist: coverage>=7.8.0; extra == 'dev'
26
+ Requires-Dist: mkdocs-material>=9.6.12; extra == 'dev'
27
+ Requires-Dist: pre-commit>=4.2.0; extra == 'dev'
28
+ Requires-Dist: pylint>=3.3.6; extra == 'dev'
29
+ Requires-Dist: pyright>=1.1.400; extra == 'dev'
30
+ Requires-Dist: ruff>=0.11.7; extra == 'dev'
31
+ Requires-Dist: textual-dev>=1.7.0; extra == 'dev'
32
+ Description-Content-Type: text/markdown
21
33
 
22
34
  # 🧙‍♂️ Sourcerer
23
35
 
24
36
  **Sourcerer** is a CLI-based cloud storage explorer that provides a unified interface for developers and DevOps
25
37
  engineers to view and manage files across multiple cloud providers like
26
- **GCP**, **AWS S3**, and **S3-compatible services**.
38
+ **GCP Storage**, **Azure Storage**, **AWS S3**, and **S3-compatible services**.
27
39
 
28
40
  > Your terminal. Your storages. Your control.
29
41
 
@@ -31,7 +43,7 @@ engineers to view and manage files across multiple cloud providers like
31
43
 
32
44
  ## ✨ Features
33
45
 
34
- - 🔍 Unified file browser for GCP, AWS S3, and S3-compatible services
46
+ - 🔍 Unified file browser for GCP Storage, Azure Storage, AWS S3, and S3-compatible services
35
47
  - 🧭 Terminal UI (TUI) built with [Textual](https://github.com/Textualize/textual)
36
48
  - 🗂️ Explore buckets and objects seamlessly
37
49
  - 🔄 Upload, download, and delete files
@@ -42,7 +54,14 @@ engineers to view and manage files across multiple cloud providers like
42
54
  ## 🪄 Installation
43
55
 
44
56
  ```bash
45
- pip install sourcerer
57
+ pip install data-sourcerer
58
+ ```
59
+ --
60
+
61
+ ## 🪄 Run
62
+
63
+ ```bash
64
+ sourcerer
46
65
  ```
47
66
 
48
67
 
@@ -1,95 +1,97 @@
1
- data_sourcerer-0.1.1.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
+ sourcerer/__init__.py,sha256=cZLeIuWVmh6AIGlima_d3udNCth5hJG-VZOj0AoCShE,585
2
+ sourcerer/settings.py,sha256=dwY2GoaWD1CsAoVtWzaAhP7_e3KUugmBr2E624JSedc,1388
3
+ sourcerer/utils.py,sha256=1VzKResV28-BlNlvEQ694WcxOZCK-NBR9uTbopl_slE,872
5
4
  sourcerer/domain/__init__.py,sha256=rV21d-dD-e0q4EQ2LfWDSDLlrUOjnHnWBtWPujoue0o,556
6
5
  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
6
+ sourcerer/domain/access_credentials/entities.py,sha256=UVjNbxTuXyaywG7RxxTADe67wRB8xlo3GO0bnij1Srs,2030
7
+ sourcerer/domain/access_credentials/exceptions.py,sha256=jo3vhGpIaEsDl68uV8JLDqPvfVZMi7H6MA0qsRL0QXQ,546
8
+ sourcerer/domain/access_credentials/repositories.py,sha256=KVD9P_-wYelt2_40Vyh-G6uyrNjtbDyKmD9gO8EiStY,2408
9
+ sourcerer/domain/access_credentials/services.py,sha256=MHTcz2OajQbQypbL082gXA7kqs4klCBUdKlguhWpLgQ,2791
11
10
  sourcerer/domain/file_system/__init__.py,sha256=5diScp5Q8Hw8e_4vqacVocQBw0KA7fPs_YERoNwSEzM,184
12
11
  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
12
+ sourcerer/domain/file_system/exceptions.py,sha256=TairaMaLkSHgbiq3pImkmVZAACoVHy-1vQMl7Ox24cQ,509
13
+ sourcerer/domain/file_system/services.py,sha256=kQeEM1Lt28UBVT9uG4M2iFDSxSvQdaJw4QzM9giUdjY,2208
15
14
  sourcerer/domain/shared/__init__.py,sha256=pkCn6PfBLIlYT5q4xWq3cNtOfbUrrePiH06TduLq6_o,148
16
- sourcerer/domain/shared/entities.py,sha256=kZ4F2ExhYIVC6FNtHzvk6n71KaCMgZdf-JL7M1eVOTs,462
15
+ sourcerer/domain/shared/entities.py,sha256=jJR1PhJBWrSeJyEFvauEYJ1UXG7BcT6pi2oFpmglu4I,497
17
16
  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
17
+ sourcerer/domain/storage_provider/entities.py,sha256=08ueb1KXHfU_nyeY6GnQJ0-JxJEEW-WxKlIMWYY0T4A,1946
18
+ sourcerer/domain/storage_provider/exceptions.py,sha256=6xK5r62Bhedx3vV0_i7Eu5ZG5IExxeiuaGHG5sX17i4,508
19
+ sourcerer/domain/storage_provider/services.py,sha256=Zm6nrKqQJW-9ZaqTp9wQaQuwMeH6hkLJZCkhQ_sTRF0,3997
21
20
  sourcerer/infrastructure/__init__.py,sha256=HQoqA8S9Vx2dr1Eua86wu_YxwXyY6jqa4IfEoZJcXcQ,616
22
- sourcerer/infrastructure/utils.py,sha256=OnIaA2TKzN2yA8YasWEcrWV8ZC4xO0n0vJ7hgKCpbUQ,3042
21
+ sourcerer/infrastructure/utils.py,sha256=ZN8X2raaz_0mwYxz5gE9TgnuI8haSfYkuO_DadsAKgg,3000
23
22
  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
23
+ sourcerer/infrastructure/access_credentials/exceptions.py,sha256=usad48RTA7ub8AfnUs2EzbD-fiUwpmnRGjJluBjd3m4,1101
24
+ sourcerer/infrastructure/access_credentials/registry.py,sha256=KNhjocRCb5yQ0BzETPGauBoqUx3xnpBdRfTHFW-QD4A,3432
26
25
  sourcerer/infrastructure/access_credentials/repositories.py,sha256=og5kAgUlNNGbCQYCMTJ7DE1GotmqLc7owpnXIfOSnng,3839
27
- sourcerer/infrastructure/access_credentials/services.py,sha256=LBoRsE-CauSrcEduhkRR6DhfFT2QZqS5ErvPw4c83wg,12254
26
+ sourcerer/infrastructure/access_credentials/services.py,sha256=Hbzubm1oN5-sVunzcRb11F31GpWGiiCyFNvMSy2fzEk,15628
28
27
  sourcerer/infrastructure/db/__init__.py,sha256=sjx2F0aDnxej7-FAjhFJYIQQ5d2apmItkquKbvGYIBc,175
29
28
  sourcerer/infrastructure/db/config.py,sha256=VUh4S4bEh9GSx3ZDfQTI-ZGdkWNs_KdO9zDjRCGDjPQ,1808
30
- sourcerer/infrastructure/db/models.py,sha256=yABQtOG7FE8r8nfyg5mIAAZjmH4lj9TQzCV206-YCfY,1743
29
+ sourcerer/infrastructure/db/models.py,sha256=U7Ocdup4KHyCRGvTTxHY2kF1FES3oaU2-hT7vU8pFIw,1743
31
30
  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
31
+ sourcerer/infrastructure/file_system/exceptions.py,sha256=obx0NxVuhVzLgL5K2MA5d4rNImlRHJ4Gr-2RrIuKJqk,2944
32
+ sourcerer/infrastructure/file_system/services.py,sha256=J0XHv-zF8WblE6bzzEpKkqU_k3gefMj_OArWBRFtGHA,5649
34
33
  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
34
+ sourcerer/infrastructure/storage_provider/exceptions.py,sha256=acx3IIXD2yWlzLvD2asJBEpKEa6eJW31uKkzzr8MrR4,3336
35
+ sourcerer/infrastructure/storage_provider/registry.py,sha256=8dbRLOx1jLK_i18uuh_JnKvId9NJBECKg4nG9F_dFH4,2249
36
+ sourcerer/infrastructure/storage_provider/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ sourcerer/infrastructure/storage_provider/services/azure.py,sha256=u5yr1xFZwhqSCXcaQMygpOVhuNSabqLBZ_MpB8tmWV4,9785
38
+ sourcerer/infrastructure/storage_provider/services/gcp.py,sha256=_iVNf8OESVynGHKt68ZmudQtS6qU-UWZMhFa3v0Sm7Y,9102
39
+ sourcerer/infrastructure/storage_provider/services/s3.py,sha256=lSpf5SPyTZGl19ChgYBtf3IR6uUWULuAvLBEdD-oarM,9277
38
40
  sourcerer/presentation/__init__.py,sha256=kzOeaTpy9hm61MLl_nybdooRrawFUd1uEX4f3Y-84ZU,472
39
41
  sourcerer/presentation/app.py,sha256=ROu3vSWzo6d8W30A9Zqi5zdLcVeHJsGLDJMLTKrthHE,1018
40
42
  sourcerer/presentation/di_container.py,sha256=mbK8tDY0LgVRfQfXVZ5tGXPHSfr_8JraCMIQlZn0hBc,1641
41
43
  sourcerer/presentation/settings.py,sha256=OcNrvwqHwAq3ZqWOfEmZ0PqyvQpAY1fmBpMc9lBNfgI,1062
42
- sourcerer/presentation/utils.py,sha256=9kXYKV2ECCWzDuz4bIdjCsM4Q1ycvUPFI_YUWAtEsx8,2474
44
+ sourcerer/presentation/utils.py,sha256=aM5eCNEmIzCyfg8Egb2rFfOlXQ5pFTXzbRVwQGSOdjY,2638
43
45
  sourcerer/presentation/screens/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
46
  sourcerer/presentation/screens/critical_error/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- sourcerer/presentation/screens/critical_error/main.py,sha256=eRKR4xTpgf9AMPz2K9mVUGN_8MauVbTBb7v0JfhT6Ck,2242
47
+ sourcerer/presentation/screens/critical_error/main.py,sha256=DEYFNBqm-KE-TB09aJHMGBA0SVeFaOy4Zd9q3rcBpb4,2224
46
48
  sourcerer/presentation/screens/critical_error/styles.tcss,sha256=mURvbf0_npkRtzVBs2bVBybbyNK9cO_6Ar2Muk1Mpv8,604
47
- sourcerer/presentation/screens/file_system_finder/main.py,sha256=sCTwuAFV8VxN2VsT6JkSfw292lE9GQAz9rJZ693WV2Y,10118
49
+ sourcerer/presentation/screens/file_system_finder/main.py,sha256=DnzAz--JcfRxeBzNLk0qA9EuTkSK26IbIkMErV2t1nE,10121
48
50
  sourcerer/presentation/screens/file_system_finder/styles.tcss,sha256=fZkdwXFsDkjXkaIskLxoQ_YHsLWKjgrn6hYseugg_68,718
49
51
  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
52
+ sourcerer/presentation/screens/file_system_finder/widgets/file_system_navigator.py,sha256=Le_76mA12dN8UhWddJexnb3Qqm-f4kqQdAaiyvIfxYQ,30878
51
53
  sourcerer/presentation/screens/main/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- sourcerer/presentation/screens/main/main.py,sha256=jLexn2hiJlQEXK2Yy9y6Ex_doyR-2LzC9CHKs1Q4pgI,19466
54
+ sourcerer/presentation/screens/main/main.py,sha256=OOczA6lem6JSdJCq-Nd2TtXmFA1R-xeVdqbM7I5QHTM,20440
53
55
  sourcerer/presentation/screens/main/styles.tcss,sha256=Ruv2vBKzM8njH7OS2TCpZqCmRVEp7XQLeBN4XhVB5AU,381
54
56
  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
57
+ sourcerer/presentation/screens/main/messages/delete_request.py,sha256=puaU1UtbDErfYi8ViPEawhSbycnUpwdE81zZfzlslNE,203
58
+ sourcerer/presentation/screens/main/messages/download_request.py,sha256=3urSTrvNbod1FrXfu-C1UDZqOu5D0OC-NJsKJhhprXE,205
57
59
  sourcerer/presentation/screens/main/messages/preview_request.py,sha256=px8N3E2VEexKmpZESb9nYDQvhXUThPxM0dU41B533tM,184
58
60
  sourcerer/presentation/screens/main/messages/resizing_rule.py,sha256=ws7lzS08h6qqeihF66XV5FsX26YkjQOje_4vgCw2mqI,332
59
61
  sourcerer/presentation/screens/main/messages/select_storage_item.py,sha256=xBu0UH5A6iyZPJECt_f_vfWVaCmE0bJo5hq2FJXMHQo,237
60
62
  sourcerer/presentation/screens/main/messages/uncheck_files_request.py,sha256=CMpYVwos1JHknqDcqru1hG8RJy5f1Lwjsxtrse1ZDGw,140
61
63
  sourcerer/presentation/screens/main/messages/upload_request.py,sha256=KXPTliqdvRvtMwob5bQUuBDxCjWmFcSjt-eUgQoRv7g,185
62
64
  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
65
+ sourcerer/presentation/screens/main/mixins/resize_containers_watcher_mixin.py,sha256=wZnTbJHjHDJbKFkfbyT0CR3GWlVupyiSotgnumBiEoI,5647
64
66
  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
67
+ sourcerer/presentation/screens/main/widgets/gradient.py,sha256=LThG7XSIUhJeXnONgArWuabosv9UiGHoHd95jKrT6rk,1226
68
+ sourcerer/presentation/screens/main/widgets/resizing_rule.py,sha256=-SIqnXtQNM80t73nsyUx02bz8I6dAHJiSxWL0Aki2Bo,2040
69
+ sourcerer/presentation/screens/main/widgets/storage_content.py,sha256=fXHBfrZ5db7rzF4MfDwUDO8cQSeyVa73smJFw-qzaj0,21863
70
+ sourcerer/presentation/screens/main/widgets/storage_list_sidebar.py,sha256=CFzNpnhEJ0TZHOVxaVGl2AsvYcRF3VvNhKAbD0KGuCg,4670
69
71
  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
72
+ sourcerer/presentation/screens/preview_content/main.py,sha256=hvJpiHZD3fuT6qPauSgPIMj7uaUUVSUKp1KnmaSQr5E,2546
73
+ sourcerer/presentation/screens/preview_content/styles.tcss,sha256=Qk0nZtUfp-mCFaUXtkjwimAnshXnhEgh719aT4_lDPQ,374
72
74
  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
75
+ sourcerer/presentation/screens/provider_creds_list/main.py,sha256=gs35uG4mC0vWD_-TcQB3Wr6XnLyDFvtkPItj-qq_B9E,6203
74
76
  sourcerer/presentation/screens/provider_creds_list/styles.tcss,sha256=PmO_JKNR7NhYhT9CXLSZqh_q3rxFJ1HkSzVxOjJs_P8,904
75
77
  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
78
+ sourcerer/presentation/screens/provider_creds_registration/main.py,sha256=TUPw2E54-ALfEk2YSU7DpzuyJ24oDj3jHEfQQsH6n_g,11079
77
79
  sourcerer/presentation/screens/provider_creds_registration/styles.tcss,sha256=gd1SNeRoHTYwNzdGxK-2aDqNPeY5b2wFWajtoNn5--Y,612
78
80
  sourcerer/presentation/screens/question/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
- sourcerer/presentation/screens/question/main.py,sha256=2hhFhVf52IIuIgeiQPfBRQEP9hSuXxnJD55TFl4rYug,901
81
+ sourcerer/presentation/screens/question/main.py,sha256=XftOcA6gDpK1Tc9WqE_jK5q0CLNvZuVuW88hp4X_kZM,901
80
82
  sourcerer/presentation/screens/question/styles.tcss,sha256=fJl0Votob2sfRQP4s8Oqd5P2OQ0WiGMdoLpTsMgISfw,418
81
83
  sourcerer/presentation/screens/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- sourcerer/presentation/screens/shared/containers.py,sha256=n2eGBb-lGZoMBNV1e0HdAfCkCObZuaVusfRVvosVAfo,378
84
+ sourcerer/presentation/screens/shared/containers.py,sha256=9Tkl5SbPNgycZlfp5Pq50pHnJqbP0EckmxayXPPuhFs,378
83
85
  sourcerer/presentation/screens/shared/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
86
  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
87
+ sourcerer/presentation/screens/shared/widgets/labeled_input.py,sha256=H_v62jpcZD0iuaKlTtKvOy_0GKCugibR7n6weGK-Upk,2750
86
88
  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
89
+ sourcerer/presentation/screens/storage_action_progress/main.py,sha256=F33lL4NEqrw8B_xORSoQWVdUCldFTPPdqUsn2_YgEKM,17973
90
+ sourcerer/presentation/screens/storage_action_progress/styles.tcss,sha256=ffvDxRWhckE5tjEG4jwlhQNqeQsYpdF71104StWCGWU,818
89
91
  sourcerer/presentation/themes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
92
  sourcerer/presentation/themes/github_dark.py,sha256=9E1mEOr701nU-ZDSKBccMl3GYchroCEsxEVelm5oI-E,497
91
- data_sourcerer-0.1.1.dist-info/METADATA,sha256=raBv_9thRry5XGrovjAk9YkZa-W8zjnYpGAmfG869vM,1750
92
- data_sourcerer-0.1.1.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
93
- data_sourcerer-0.1.1.dist-info/entry_points.txt,sha256=CyD02GehPW6QuhR5oDY5tLLRHQ9qbPXe0v3aT1pK3N8,62
94
- data_sourcerer-0.1.1.dist-info/top_level.txt,sha256=_9Nul_xiROuGIUDltaPqy-HyRzvv80MF_uquhggP9So,10
95
- data_sourcerer-0.1.1.dist-info/RECORD,,
93
+ data_sourcerer-0.2.1.dist-info/METADATA,sha256=1xiV9NxnzOG-ZWqB02EvzAos7nmfM21bJMuX8SYVAXQ,2416
94
+ data_sourcerer-0.2.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
95
+ data_sourcerer-0.2.1.dist-info/entry_points.txt,sha256=CyD02GehPW6QuhR5oDY5tLLRHQ9qbPXe0v3aT1pK3N8,62
96
+ data_sourcerer-0.2.1.dist-info/licenses/LICENSE,sha256=HjZ7RAG3i6izxvitGfY4feHfvW5F8DPj5eF0YBSf2rI,1073
97
+ data_sourcerer-0.2.1.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
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.1"
@@ -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] = {}