data-sourcerer 0.1.1__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. data_sourcerer-0.2.0/.coderabbit.yaml +49 -0
  2. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/.github/workflows/bandit.yml +1 -1
  3. data_sourcerer-0.2.0/.github/workflows/deploy_docs.yml +28 -0
  4. data_sourcerer-0.2.0/.github/workflows/run_tests.yml +23 -0
  5. data_sourcerer-0.2.0/.pre-commit-config.yaml +10 -0
  6. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/.pylintrc +5 -5
  7. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/PKG-INFO +24 -4
  8. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/README.md +8 -1
  9. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/overrides/home.html +27 -9
  10. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/roadmap.md +1 -1
  11. data_sourcerer-0.2.0/pyproject.toml +98 -0
  12. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/data_sourcerer.egg-info/PKG-INFO +24 -4
  13. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/data_sourcerer.egg-info/SOURCES.txt +9 -1
  14. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/data_sourcerer.egg-info/requires.txt +14 -0
  15. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/__init__.py +1 -1
  16. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/access_credentials/entities.py +17 -0
  17. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/access_credentials/exceptions.py +1 -1
  18. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/access_credentials/repositories.py +1 -1
  19. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/access_credentials/services.py +14 -2
  20. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/file_system/exceptions.py +1 -1
  21. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/file_system/services.py +2 -2
  22. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/shared/entities.py +1 -0
  23. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/storage_provider/entities.py +3 -4
  24. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/storage_provider/exceptions.py +1 -1
  25. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/storage_provider/services.py +13 -9
  26. data_sourcerer-0.2.0/src/sourcerer/infrastructure/access_credentials/exceptions.py +29 -0
  27. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/access_credentials/registry.py +3 -4
  28. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/access_credentials/services.py +141 -44
  29. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/db/models.py +1 -1
  30. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/file_system/exceptions.py +9 -9
  31. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/file_system/services.py +16 -16
  32. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/storage_provider/exceptions.py +28 -8
  33. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/storage_provider/registry.py +2 -3
  34. data_sourcerer-0.2.0/src/sourcerer/infrastructure/storage_provider/services/azure.py +261 -0
  35. data_sourcerer-0.2.0/src/sourcerer/infrastructure/storage_provider/services/gcp.py +277 -0
  36. data_sourcerer-0.2.0/src/sourcerer/infrastructure/storage_provider/services/s3.py +290 -0
  37. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/utils.py +2 -4
  38. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/critical_error/main.py +3 -4
  39. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/file_system_finder/main.py +4 -4
  40. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/file_system_finder/widgets/file_system_navigator.py +12 -12
  41. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/main.py +57 -33
  42. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/messages/delete_request.py +1 -2
  43. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/messages/download_request.py +1 -2
  44. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/widgets/gradient.py +2 -5
  45. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/widgets/storage_content.py +12 -13
  46. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/widgets/storage_list_sidebar.py +8 -6
  47. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/preview_content/main.py +15 -4
  48. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/preview_content/styles.tcss +2 -1
  49. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/provider_creds_list/main.py +2 -2
  50. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/provider_creds_registration/main.py +26 -11
  51. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/question/main.py +1 -1
  52. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/shared/containers.py +1 -1
  53. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/shared/widgets/labeled_input.py +1 -1
  54. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/storage_action_progress/main.py +34 -20
  55. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/storage_action_progress/styles.tcss +11 -0
  56. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/utils.py +7 -3
  57. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/settings.py +4 -0
  58. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/utils.py +2 -2
  59. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/tests/README.md +1 -1
  60. data_sourcerer-0.2.0/tests/sourcerer/access_credentials/test_services.py +461 -0
  61. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/tests/sourcerer/file_system/test_services.py +10 -10
  62. data_sourcerer-0.2.0/tests/sourcerer/storage_provider/__init__.py +0 -0
  63. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/tests/sourcerer/storage_provider/test_services.py +443 -143
  64. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/uv.lock +1143 -52
  65. data_sourcerer-0.1.1/pyproject.toml +0 -44
  66. data_sourcerer-0.1.1/src/sourcerer/infrastructure/access_credentials/exceptions.py +0 -16
  67. data_sourcerer-0.1.1/src/sourcerer/infrastructure/storage_provider/services.py +0 -509
  68. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/.github/workflows/pylint.yml +0 -0
  69. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/.github/workflows/pyright.yml +0 -0
  70. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/.github/workflows/ruff.yml +0 -0
  71. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/.gitignore +0 -0
  72. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/LICENSE +0 -0
  73. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/assets/billie-holiday.png +0 -0
  74. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/assets/creds_registration.gif +0 -0
  75. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/assets/keys_operations.gif +0 -0
  76. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/assets/layer-1.png +0 -0
  77. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/assets/layer-2.png +0 -0
  78. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/assets/layer-3.png +0 -0
  79. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/assets/layer-4.png +0 -0
  80. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/assets/layer-5.png +0 -0
  81. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/guides/register_credentials.md +0 -0
  82. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/index.md +0 -0
  83. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/js/parallax.js +0 -0
  84. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/docs/styles/styles.css +0 -0
  85. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/media/creds_registration.gif +0 -0
  86. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/media/keys_operations.gif +0 -0
  87. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/mkdocs.yml +0 -0
  88. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/setup.cfg +0 -0
  89. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/data_sourcerer.egg-info/dependency_links.txt +0 -0
  90. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/data_sourcerer.egg-info/entry_points.txt +0 -0
  91. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/data_sourcerer.egg-info/top_level.txt +0 -0
  92. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/__init__.py +0 -0
  93. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/access_credentials/__init__.py +0 -0
  94. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/file_system/__init__.py +0 -0
  95. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/file_system/entities.py +0 -0
  96. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/shared/__init__.py +0 -0
  97. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/domain/storage_provider/__init__.py +0 -0
  98. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/__init__.py +0 -0
  99. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/access_credentials/__init__.py +0 -0
  100. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/access_credentials/repositories.py +0 -0
  101. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/db/__init__.py +0 -0
  102. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/db/config.py +0 -0
  103. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/file_system/__init__.py +0 -0
  104. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/infrastructure/storage_provider/__init__.py +0 -0
  105. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens → data_sourcerer-0.2.0/src/sourcerer/infrastructure/storage_provider/services}/__init__.py +0 -0
  106. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/__init__.py +0 -0
  107. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/app.py +0 -0
  108. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/di_container.py +0 -0
  109. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/critical_error → data_sourcerer-0.2.0/src/sourcerer/presentation/screens}/__init__.py +0 -0
  110. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/file_system_finder/widgets → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/critical_error}/__init__.py +0 -0
  111. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/critical_error/styles.tcss +0 -0
  112. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/file_system_finder/styles.tcss +0 -0
  113. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/main → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/file_system_finder/widgets}/__init__.py +0 -0
  114. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/main/messages → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/main}/__init__.py +0 -0
  115. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/main/mixins → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/main/messages}/__init__.py +0 -0
  116. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/messages/preview_request.py +0 -0
  117. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/messages/resizing_rule.py +0 -0
  118. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/messages/select_storage_item.py +0 -0
  119. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/messages/uncheck_files_request.py +0 -0
  120. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/messages/upload_request.py +0 -0
  121. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/main/widgets → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/main/mixins}/__init__.py +0 -0
  122. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/mixins/resize_containers_watcher_mixin.py +3 -3
  123. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/styles.tcss +0 -0
  124. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/preview_content → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/main/widgets}/__init__.py +0 -0
  125. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/main/widgets/resizing_rule.py +1 -1
  126. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/provider_creds_list → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/preview_content}/__init__.py +0 -0
  127. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/provider_creds_registration → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/provider_creds_list}/__init__.py +0 -0
  128. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/provider_creds_list/styles.tcss +0 -0
  129. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/question → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/provider_creds_registration}/__init__.py +0 -0
  130. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/provider_creds_registration/styles.tcss +0 -0
  131. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/shared → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/question}/__init__.py +0 -0
  132. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/question/styles.tcss +0 -0
  133. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/shared/widgets → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/shared}/__init__.py +0 -0
  134. {data_sourcerer-0.1.1/src/sourcerer/presentation/screens/storage_action_progress → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/shared/widgets}/__init__.py +0 -0
  135. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/screens/shared/widgets/button.py +0 -0
  136. {data_sourcerer-0.1.1/src/sourcerer/presentation/themes → data_sourcerer-0.2.0/src/sourcerer/presentation/screens/storage_action_progress}/__init__.py +0 -0
  137. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/settings.py +0 -0
  138. {data_sourcerer-0.1.1/tests → data_sourcerer-0.2.0/src/sourcerer/presentation/themes}/__init__.py +0 -0
  139. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/src/sourcerer/presentation/themes/github_dark.py +0 -0
  140. {data_sourcerer-0.1.1/tests/sourcerer → data_sourcerer-0.2.0/tests}/__init__.py +0 -0
  141. {data_sourcerer-0.1.1/tests/sourcerer/access_credentials → data_sourcerer-0.2.0/tests/sourcerer}/__init__.py +0 -0
  142. {data_sourcerer-0.1.1/tests/sourcerer/db → data_sourcerer-0.2.0/tests/sourcerer/access_credentials}/__init__.py +0 -0
  143. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/tests/sourcerer/access_credentials/test_registry.py +0 -0
  144. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/tests/sourcerer/access_credentials/test_repositories.py +0 -0
  145. {data_sourcerer-0.1.1/tests/sourcerer/file_system → data_sourcerer-0.2.0/tests/sourcerer/db}/__init__.py +0 -0
  146. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/tests/sourcerer/db/test_models.py +0 -0
  147. {data_sourcerer-0.1.1/tests/sourcerer/storage_provider → data_sourcerer-0.2.0/tests/sourcerer/file_system}/__init__.py +0 -0
  148. {data_sourcerer-0.1.1 → data_sourcerer-0.2.0}/tests/sourcerer/storage_provider/test_registry.py +0 -0
@@ -0,0 +1,49 @@
1
+ # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
2
+ language: "en"
3
+ early_access: true
4
+ reviews:
5
+ profile: "chill"
6
+ request_changes_workflow: false
7
+ high_level_summary: true
8
+ poem: false
9
+ review_status: true
10
+ collapse_walkthrough: false
11
+ path_instructions:
12
+ - path: "src/sourcerer/domain/**/*.py"
13
+ instructions: |
14
+ - Ensure domain models are immutable and follow DDD principles
15
+ - Verify that domain services are interface-driven
16
+ - Check for proper exception handling and domain-specific exceptions
17
+ - Validate that domain logic is independent of infrastructure
18
+ - Ensure pythonic codestyle and best practices are followed
19
+ - path: "src/sourcerer/infrastructure/**/*.py"
20
+ instructions: |
21
+ - Verify proper implementation of domain interfaces
22
+ - Check for appropriate error handling and mapping to domain exceptions
23
+ - Ensure infrastructure concerns are properly isolated
24
+ - Validate dependency injection usage
25
+ - Ensure pythonic codestyle and best practices are followed
26
+ - path: "src/sourcerer/presentation/**/*.py"
27
+ instructions: |
28
+ - Review UI component separation and responsibility
29
+ - Check proper use of dependency injection
30
+ - Verify error handling and user feedback
31
+ - Ensure presentation logic doesn't contain business rules
32
+ - Ensure pythonic codestyle and best practices are followed
33
+ - path: "tests/**/*"
34
+ instructions: |
35
+ - Assess the integration and e2e test code assessing sufficient code coverage for the changes associated in the pull request
36
+ - Ensure pythonic codestyle and best practices are followed
37
+ - path: "**/*.md"
38
+ instructions: |
39
+ "Assess the documentation for misspellings, grammatical errors, missing documentation and correctness"
40
+ auto_review:
41
+ enabled: false
42
+ ignore_title_keywords:
43
+ - "WIP"
44
+ - "DO NOT MERGE"
45
+ drafts: false
46
+ base_branches:
47
+ - "main"
48
+ chat:
49
+ auto_reply: true
@@ -24,4 +24,4 @@ jobs:
24
24
  - name: Analysing the code with bandit
25
25
  run: |
26
26
  echo $PWD
27
- bandit -a file $(git ls-files '*.py')
27
+ bandit -a file $(git ls-files 'src/*.py')
@@ -0,0 +1,28 @@
1
+ name: deploy_docs
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ permissions:
7
+ contents: write
8
+ jobs:
9
+ deploy:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - name: Configure Git Credentials
14
+ run: |
15
+ git config user.name github-actions[bot]
16
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
17
+ - uses: actions/setup-python@v5
18
+ with:
19
+ python-version: 3.x
20
+ - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
21
+ - uses: actions/cache@v4
22
+ with:
23
+ key: mkdocs-material-${{ env.cache_id }}
24
+ path: .cache
25
+ restore-keys: |
26
+ mkdocs-material-
27
+ - run: pip install mkdocs-material
28
+ - run: mkdocs gh-deploy --force
@@ -0,0 +1,23 @@
1
+ name: Unit tests
2
+
3
+ on: [push]
4
+
5
+ permissions:
6
+ contents: read
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - name: Set up Python 3.12
14
+ uses: actions/setup-python@v5
15
+ with:
16
+ python-version: "3.12"
17
+ - name: Install dependencies
18
+ run: |
19
+ python -m pip install --upgrade pip
20
+ pip install .[dev]
21
+ - name: Run tests
22
+ run: |
23
+ export PYTHONPATH="$PYTHONPATH:$PWD/src" && coverage run -m unittest && coverage report -m
@@ -0,0 +1,10 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ # Ruff version.
4
+ rev: v0.9.3
5
+ hooks:
6
+ # Run the linter.
7
+ - id: ruff
8
+ args: [ --fix ]
9
+ # Run the formatter.
10
+ - id: ruff-format
@@ -283,17 +283,17 @@ valid-metaclass-classmethod-first-arg=mcs
283
283
 
284
284
  # List of regular expressions of class ancestor names to ignore when counting
285
285
  # public methods (see R0903)
286
- exclude-too-few-public-methods=
286
+ exclude-too-few-public-methods=True
287
287
 
288
288
  # List of qualified class names to ignore when counting class parents (see
289
289
  # R0901)
290
290
  ignored-parents=
291
291
 
292
292
  # Maximum number of arguments for function / method.
293
- max-args=5
293
+ max-args=7
294
294
 
295
295
  # Maximum number of attributes for a class (see R0902).
296
- max-attributes=7
296
+ max-attributes=10
297
297
 
298
298
  # Maximum number of boolean expressions in an if statement (see R0916).
299
299
  max-bool-expr=5
@@ -308,7 +308,7 @@ max-locals=15
308
308
  max-parents=7
309
309
 
310
310
  # Maximum number of positional arguments for function / method.
311
- max-positional-arguments=5
311
+ max-positional-arguments=7
312
312
 
313
313
  # Maximum number of public methods for a class (see R0904).
314
314
  max-public-methods=20
@@ -320,7 +320,7 @@ max-returns=6
320
320
  max-statements=50
321
321
 
322
322
  # Minimum number of public methods for a class (see R0903).
323
- min-public-methods=2
323
+ min-public-methods=0
324
324
 
325
325
 
326
326
  [EXCEPTIONS]
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-sourcerer
3
- Version: 0.1.1
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
@@ -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
 
@@ -21,7 +21,14 @@ engineers to view and manage files across multiple cloud providers like
21
21
  ## 🪄 Installation
22
22
 
23
23
  ```bash
24
- pip install sourcerer
24
+ pip install data-sourcerer
25
+ ```
26
+ --
27
+
28
+ ## 🪄 Run
29
+
30
+ ```bash
31
+ sourcerer
25
32
  ```
26
33
 
27
34
 
@@ -13,7 +13,8 @@
13
13
  background-color: transparent;
14
14
  backdrop-filter: blur(10px);
15
15
  z-index: 10;
16
- position: absolute;
16
+ position: fixed;
17
+ box-shadow: 0 0 0 transparent;
17
18
  }
18
19
 
19
20
  .md-main {
@@ -243,7 +244,7 @@
243
244
  <div class="hero-content">
244
245
  <h1>Sourcerer</h1>
245
246
  <p>Your unified cloud storages interface</p>
246
- <button class="cta-button">Try the Demo</button>
247
+ <button class="cta-button">Try it out</button>
247
248
  </div>
248
249
  </section>
249
250
 
@@ -262,14 +263,21 @@
262
263
  </div>
263
264
  </section>
264
265
 
265
- <section class="demo">
266
+ <section class="demo" id="install">
266
267
  <h2>Install</h2>
267
268
  <pre>
268
- <button class="copy-button" onclick="copyToClipboard()">🧙</button>
269
- <code id="install-code">
270
- pip install sourcerer
271
- </code>
272
- </pre>
269
+ <button class="copy-button" onclick="copyToClipboard('install-code')">🧙</button>
270
+ <code id="install-code">
271
+ pip install data-sourcerer
272
+ </code>
273
+ </pre>
274
+ <h2>Run</h2>
275
+ <pre>
276
+ <button class="copy-button" onclick="copyToClipboard('run-code')">🧙</button>
277
+ <code id="run-code">
278
+ sourcerer
279
+ </code>
280
+ </pre>
273
281
  </section>
274
282
 
275
283
  <section class="demo">
@@ -285,7 +293,17 @@ pip install sourcerer
285
293
  </footer>
286
294
 
287
295
  </div>
288
-
296
+ <script>
297
+ document.querySelector('.cta-button').addEventListener('click', () => {
298
+ document.getElementById('install').scrollIntoView({
299
+ behavior: 'smooth'
300
+ });
301
+ });
302
+ function copyToClipboard(blockId) {
303
+ const codeBlock = document.getElementById(blockId).innerText.trim();
304
+ navigator.clipboard.writeText(codeBlock).catch(err => console.error('Error copying text:', err))
305
+ }
306
+ </script>
289
307
 
290
308
  {% endblock %}
291
309
  {% block content %}
@@ -8,7 +8,7 @@ Our roadmap unveils the features, improvements, and integrations designed to emp
8
8
 
9
9
  ## 🗺️ The Roadmap
10
10
 
11
- - [ ] **Initial release**
11
+ - **Initial release**
12
12
 
13
13
  - ✅ **Multi-cloud storage viewing** – Navigate files and folders from:
14
14
  - ✅ Google Cloud Storage (GCS)
@@ -0,0 +1,98 @@
1
+ [project]
2
+
3
+ name = "data-sourcerer"
4
+ version = "0.2.0"
5
+ description = "Sourcerer is a terminal cloud storage navigator."
6
+ requires-python = ">=3.9"
7
+
8
+ keywords = ["cloud", "s3", "gcp", "cli", "terminal", "storage", "textual", "ui"]
9
+ license = {text = "MIT"}
10
+
11
+ authors = [
12
+ {name = "Bohdana Kuzmenko", email = "bohdana.kuzmenko.dev@gmail.com"},
13
+ ]
14
+
15
+ readme = {file = "README.md", content-type = "text/markdown"}
16
+
17
+ dependencies = [
18
+ "boto3>=1.26.0,<2.0.0",
19
+ "cryptography>=44.0.2,<45.0.0",
20
+ "dependency-injector>=4.43.0,<5.0.0",
21
+ "google-cloud-storage>=3.1.0,<4.0.0",
22
+ "humanize>=4.12.1,<5.0.0",
23
+ "sqlalchemy>=2.0.38,<3.0.0",
24
+ "sqlalchemy-utils>=0.41.2,<1.0.0",
25
+ "textual[syntax]>=2.0.0,<4.0.0",
26
+ "pyOpenSSL>=22.1.0; sys_platform == 'linux'",
27
+ "azure-storage-blob>=12.25.1,<13.0.0",
28
+ "azure-identity>=1.22.0,<2.0.0",
29
+ "azure-mgmt-storage>=22.2.0,<23.0.0",
30
+ ]
31
+
32
+ [project.scripts]
33
+ sourcerer = "sourcerer.presentation.app:main"
34
+
35
+ [build-system]
36
+ requires = ["setuptools >= 61.0", "setuptools-scm"]
37
+ build-backend = "setuptools.build_meta"
38
+
39
+ [dependency-groups]
40
+ dev = [
41
+ "bandit>=1.8.3",
42
+ "black>=25.1.0",
43
+ "coverage>=7.8.0",
44
+ "mkdocs-material>=9.6.12",
45
+ "pre-commit>=4.2.0",
46
+ "pylint>=3.3.6",
47
+ "pyright>=1.1.400",
48
+ "ruff>=0.11.7",
49
+ "textual-dev>=1.7.0",
50
+ ]
51
+
52
+ [project.optional-dependencies]
53
+ dev = [
54
+ "bandit>=1.8.3",
55
+ "black>=25.1.0",
56
+ "coverage>=7.8.0",
57
+ "mkdocs-material>=9.6.12",
58
+ "pre-commit>=4.2.0",
59
+ "pylint>=3.3.6",
60
+ "pyright>=1.1.400",
61
+ "ruff>=0.11.7",
62
+ "textual-dev>=1.7.0",
63
+ ]
64
+
65
+ [tool.coverage.run]
66
+ branch = true
67
+ source = [
68
+ "src/sourcerer/infrastructure",
69
+ ]
70
+
71
+ [tool.coverage.report]
72
+ fail_under = 75
73
+
74
+ [tool.ruff]
75
+ line-length = 120
76
+ target-version = "py312"
77
+
78
+ # Enable these rules
79
+ select = [
80
+ "E", # pycodestyle
81
+ "F", # pyflakes
82
+ "I", # isort
83
+ "N", # pep8-naming
84
+ "UP", # pyupgrade
85
+ "C90", # mccabe (complexity)
86
+ "B", # flake8-bugbear
87
+ "SIM", # flake8-simplify
88
+ ]
89
+
90
+ # Allow autofix for these rule sets
91
+ fixable = ["ALL"]
92
+
93
+ # Disallow autofix for these
94
+ unfixable = ["F401"] # unused imports - maybe you want to catch it manually
95
+
96
+
97
+ [tool.ruff.mccabe]
98
+ max-complexity = 10
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-sourcerer
3
- Version: 0.1.1
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
@@ -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,4 +1,6 @@
1
+ .coderabbit.yaml
1
2
  .gitignore
3
+ .pre-commit-config.yaml
2
4
  .pylintrc
3
5
  LICENSE
4
6
  README.md
@@ -6,9 +8,11 @@ mkdocs.yml
6
8
  pyproject.toml
7
9
  uv.lock
8
10
  .github/workflows/bandit.yml
11
+ .github/workflows/deploy_docs.yml
9
12
  .github/workflows/pylint.yml
10
13
  .github/workflows/pyright.yml
11
14
  .github/workflows/ruff.yml
15
+ .github/workflows/run_tests.yml
12
16
  docs/index.md
13
17
  docs/roadmap.md
14
18
  docs/assets/billie-holiday.png
@@ -66,7 +70,10 @@ src/sourcerer/infrastructure/file_system/services.py
66
70
  src/sourcerer/infrastructure/storage_provider/__init__.py
67
71
  src/sourcerer/infrastructure/storage_provider/exceptions.py
68
72
  src/sourcerer/infrastructure/storage_provider/registry.py
69
- src/sourcerer/infrastructure/storage_provider/services.py
73
+ src/sourcerer/infrastructure/storage_provider/services/__init__.py
74
+ src/sourcerer/infrastructure/storage_provider/services/azure.py
75
+ src/sourcerer/infrastructure/storage_provider/services/gcp.py
76
+ src/sourcerer/infrastructure/storage_provider/services/s3.py
70
77
  src/sourcerer/presentation/__init__.py
71
78
  src/sourcerer/presentation/app.py
72
79
  src/sourcerer/presentation/di_container.py
@@ -126,6 +133,7 @@ tests/sourcerer/__init__.py
126
133
  tests/sourcerer/access_credentials/__init__.py
127
134
  tests/sourcerer/access_credentials/test_registry.py
128
135
  tests/sourcerer/access_credentials/test_repositories.py
136
+ tests/sourcerer/access_credentials/test_services.py
129
137
  tests/sourcerer/db/__init__.py
130
138
  tests/sourcerer/db/test_models.py
131
139
  tests/sourcerer/file_system/__init__.py
@@ -6,6 +6,20 @@ humanize<5.0.0,>=4.12.1
6
6
  sqlalchemy<3.0.0,>=2.0.38
7
7
  sqlalchemy-utils<1.0.0,>=0.41.2
8
8
  textual[syntax]<4.0.0,>=2.0.0
9
+ azure-storage-blob<13.0.0,>=12.25.1
10
+ azure-identity<2.0.0,>=1.22.0
11
+ azure-mgmt-storage<23.0.0,>=22.2.0
9
12
 
10
13
  [:sys_platform == "linux"]
11
14
  pyOpenSSL>=22.1.0
15
+
16
+ [dev]
17
+ bandit>=1.8.3
18
+ black>=25.1.0
19
+ coverage>=7.8.0
20
+ mkdocs-material>=9.6.12
21
+ pre-commit>=4.2.0
22
+ pylint>=3.3.6
23
+ pyright>=1.1.400
24
+ ruff>=0.11.7
25
+ textual-dev>=1.7.0
@@ -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