pyvider-components 0.0.0.post1__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 (151) hide show
  1. pyvider_components-0.0.0.post1/PKG-INFO +16 -0
  2. pyvider_components-0.0.0.post1/README.md +3 -0
  3. pyvider_components-0.0.0.post1/pyproject.toml +53 -0
  4. pyvider_components-0.0.0.post1/setup.cfg +4 -0
  5. pyvider_components-0.0.0.post1/src/pyvider/__init__.py +10 -0
  6. pyvider_components-0.0.0.post1/src/pyvider/components/__init__.py +9 -0
  7. pyvider_components-0.0.0.post1/src/pyvider/components/capabilities/__init__.py +7 -0
  8. pyvider_components-0.0.0.post1/src/pyvider/components/capabilities/api.py +58 -0
  9. pyvider_components-0.0.0.post1/src/pyvider/components/capabilities/lens.py +70 -0
  10. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/__init__.py +26 -0
  11. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/env_variables.garnish/docs/env_variables.tmpl.md +15 -0
  12. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/env_variables.garnish/docs/pyvider_env_variables.tmpl.md +17 -0
  13. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/env_variables.garnish/examples/example.tf +8 -0
  14. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/env_variables.py +138 -0
  15. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/file_info.garnish/docs/file_info.tmpl.md +15 -0
  16. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/file_info.garnish/docs/pyvider_file_info.tmpl.md +17 -0
  17. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/file_info.garnish/examples/example.tf +8 -0
  18. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/file_info.py +138 -0
  19. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/http_api.garnish/docs/http_api.tmpl.md +15 -0
  20. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/http_api.garnish/docs/pyvider_http_api.tmpl.md +17 -0
  21. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/http_api.garnish/examples/example.tf +8 -0
  22. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/http_api.py +107 -0
  23. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/docs/lens_jq.tmpl.md +15 -0
  24. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/docs/pyvider_lens_jq.tmpl.md +17 -0
  25. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/advanced_audit.tf +115 -0
  26. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/example.tf +8 -0
  27. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/complex_data.json +111 -0
  28. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/financial_cost_centers.json +1 -0
  29. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/master_audit.jq +49 -0
  30. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/master_audit_v3.jq +31 -0
  31. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/materials_properties.json +1 -0
  32. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/personnel_records.json +34 -0
  33. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/project_apollo_schematics.json +20 -0
  34. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/security_audits.json +1 -0
  35. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/simple_tally.jq +9 -0
  36. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/software_deployment_manifest.json +1 -0
  37. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/supply_chain_database.json +1 -0
  38. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.garnish/examples/fixtures/test_and_validation_logs.json +1 -0
  39. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/lens_jq.py +89 -0
  40. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/mixed_map_test.garnish/examples/example.tf +30 -0
  41. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/docs/pyvider_mixed_map_test.tmpl.md +17 -0
  42. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/docs/pyvider_nested_data_processor.tmpl.md +27 -0
  43. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/docs/pyvider_nested_resource_test.tmpl.md +23 -0
  44. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/docs/pyvider_simple_map_test.tmpl.md +17 -0
  45. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/docs/pyvider_structured_object_test.tmpl.md +17 -0
  46. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/examples/example.tf +10 -0
  47. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/mixed_map_test/docs/mixed_map_test.tmpl.md +15 -0
  48. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/mixed_map_test/examples/example.tf +2 -0
  49. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/nested_data_processor/docs/nested_data_processor.tmpl.md +17 -0
  50. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/nested_data_processor/examples/example.tf +2 -0
  51. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/nested_resource_test/docs/nested_resource_test.tmpl.md +19 -0
  52. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/nested_resource_test/examples/example.tf +30 -0
  53. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/simple_map_test/docs/simple_map_test.tmpl.md +15 -0
  54. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/simple_map_test/examples/example.tf +2 -0
  55. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/structured_object_test/docs/structured_object_test.tmpl.md +15 -0
  56. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.garnish/structured_object_test/examples/example.tf +2 -0
  57. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/nested_data_test_suite.py +352 -0
  58. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/provider_config_reader.garnish/docs/provider_config_reader.tmpl.md +15 -0
  59. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/provider_config_reader.garnish/docs/pyvider_provider_config_reader.tmpl.md +17 -0
  60. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/provider_config_reader.garnish/examples/example.tf +8 -0
  61. pyvider_components-0.0.0.post1/src/pyvider/components/data_sources/provider_config_reader.py +68 -0
  62. pyvider_components-0.0.0.post1/src/pyvider/components/functions/__init__.py +6 -0
  63. pyvider_components-0.0.0.post1/src/pyvider/components/functions/collection_functions.garnish/contains/docs/contains.tmpl.md +17 -0
  64. pyvider_components-0.0.0.post1/src/pyvider/components/functions/collection_functions.garnish/contains/examples/example.tf +2 -0
  65. pyvider_components-0.0.0.post1/src/pyvider/components/functions/collection_functions.garnish/length/docs/length.tmpl.md +17 -0
  66. pyvider_components-0.0.0.post1/src/pyvider/components/functions/collection_functions.garnish/length/examples/example.tf +2 -0
  67. pyvider_components-0.0.0.post1/src/pyvider/components/functions/collection_functions.garnish/lookup/docs/lookup.tmpl.md +17 -0
  68. pyvider_components-0.0.0.post1/src/pyvider/components/functions/collection_functions.garnish/lookup/examples/example.tf +2 -0
  69. pyvider_components-0.0.0.post1/src/pyvider/components/functions/collection_functions.py +44 -0
  70. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/docs/lens_jq.tmpl.md +17 -0
  71. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/advanced_audit.tf +106 -0
  72. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/example.tf +12 -0
  73. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/complex_data.json +111 -0
  74. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/financial_cost_centers.json +1 -0
  75. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/master_audit.jq +49 -0
  76. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/master_audit_v3.jq +31 -0
  77. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/materials_properties.json +1 -0
  78. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/personnel_records.json +34 -0
  79. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/project_apollo_schematics.json +20 -0
  80. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/security_audits.json +1 -0
  81. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/simple_tally.jq +9 -0
  82. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/software_deployment_manifest.json +1 -0
  83. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/supply_chain_database.json +1 -0
  84. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.garnish/examples/fixtures/test_and_validation_logs.json +1 -0
  85. pyvider_components-0.0.0.post1/src/pyvider/components/functions/lens_jq.py +65 -0
  86. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/add/docs/add.tmpl.md +17 -0
  87. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/add/examples/example.tf +42 -0
  88. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/divide/docs/divide.tmpl.md +17 -0
  89. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/divide/examples/example.tf +2 -0
  90. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/max/docs/max.tmpl.md +17 -0
  91. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/max/examples/example.tf +49 -0
  92. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/min/docs/min.tmpl.md +17 -0
  93. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/min/examples/example.tf +49 -0
  94. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/multiply/docs/multiply.tmpl.md +17 -0
  95. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/multiply/examples/example.tf +51 -0
  96. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/round/docs/round.tmpl.md +17 -0
  97. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/round/examples/example.tf +2 -0
  98. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/subtract/docs/subtract.tmpl.md +17 -0
  99. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/subtract/examples/example.tf +51 -0
  100. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/sum/docs/sum.tmpl.md +17 -0
  101. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.garnish/sum/examples/example.tf +2 -0
  102. pyvider_components-0.0.0.post1/src/pyvider/components/functions/numeric_functions.py +102 -0
  103. pyvider_components-0.0.0.post1/src/pyvider/components/functions/replace.garnish/examples/example.tf +16 -0
  104. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/format/docs/format.tmpl.md +17 -0
  105. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/format/examples/example.tf +2 -0
  106. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/join/docs/join.tmpl.md +17 -0
  107. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/join/examples/example.tf +60 -0
  108. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/lower/docs/lower.tmpl.md +17 -0
  109. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/lower/examples/example.tf +2 -0
  110. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/replace/docs/replace.tmpl.md +17 -0
  111. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/replace/examples/example.tf +2 -0
  112. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/split/docs/split.tmpl.md +17 -0
  113. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/split/examples/example.tf +60 -0
  114. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/upper/docs/upper.tmpl.md +17 -0
  115. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.garnish/upper/examples/example.tf +49 -0
  116. pyvider_components-0.0.0.post1/src/pyvider/components/functions/string_manipulation.py +69 -0
  117. pyvider_components-0.0.0.post1/src/pyvider/components/functions/type_conversion_functions.garnish/docs/tostring.tmpl.md +27 -0
  118. pyvider_components-0.0.0.post1/src/pyvider/components/functions/type_conversion_functions.garnish/examples/example.tf +10 -0
  119. pyvider_components-0.0.0.post1/src/pyvider/components/functions/type_conversion_functions.py +19 -0
  120. pyvider_components-0.0.0.post1/src/pyvider/components/helpers/__init__.py +7 -0
  121. pyvider_components-0.0.0.post1/src/pyvider/components/resources/__init__.py +26 -0
  122. pyvider_components-0.0.0.post1/src/pyvider/components/resources/file_content.garnish/docs/file_content.tmpl.md +19 -0
  123. pyvider_components-0.0.0.post1/src/pyvider/components/resources/file_content.garnish/docs/pyvider_file_content.tmpl.md +23 -0
  124. pyvider_components-0.0.0.post1/src/pyvider/components/resources/file_content.garnish/examples/example.tf +8 -0
  125. pyvider_components-0.0.0.post1/src/pyvider/components/resources/file_content.py +116 -0
  126. pyvider_components-0.0.0.post1/src/pyvider/components/resources/local_directory.garnish/docs/local_directory.tmpl.md +19 -0
  127. pyvider_components-0.0.0.post1/src/pyvider/components/resources/local_directory.garnish/docs/pyvider_local_directory.tmpl.md +23 -0
  128. pyvider_components-0.0.0.post1/src/pyvider/components/resources/local_directory.garnish/examples/example.tf +8 -0
  129. pyvider_components-0.0.0.post1/src/pyvider/components/resources/local_directory.py +142 -0
  130. pyvider_components-0.0.0.post1/src/pyvider/components/resources/private_state_verifier.garnish/docs/private_state_verifier.tmpl.md +21 -0
  131. pyvider_components-0.0.0.post1/src/pyvider/components/resources/private_state_verifier.garnish/docs/pyvider_private_state_verifier.tmpl.md +23 -0
  132. pyvider_components-0.0.0.post1/src/pyvider/components/resources/private_state_verifier.garnish/examples/example.tf +8 -0
  133. pyvider_components-0.0.0.post1/src/pyvider/components/resources/private_state_verifier.py +76 -0
  134. pyvider_components-0.0.0.post1/src/pyvider/components/resources/timed_token.garnish/docs/pyvider_timed_token.tmpl.md +23 -0
  135. pyvider_components-0.0.0.post1/src/pyvider/components/resources/timed_token.garnish/docs/timed_token.tmpl.md +21 -0
  136. pyvider_components-0.0.0.post1/src/pyvider/components/resources/timed_token.garnish/examples/example.tf +8 -0
  137. pyvider_components-0.0.0.post1/src/pyvider/components/resources/timed_token.py +104 -0
  138. pyvider_components-0.0.0.post1/src/pyvider/components/resources/warning_example.garnish/docs/pyvider_warning_example.tmpl.md +23 -0
  139. pyvider_components-0.0.0.post1/src/pyvider/components/resources/warning_example.garnish/docs/warning_example.tmpl.md +43 -0
  140. pyvider_components-0.0.0.post1/src/pyvider/components/resources/warning_example.garnish/examples/example.tf +8 -0
  141. pyvider_components-0.0.0.post1/src/pyvider/components/resources/warning_example.py +90 -0
  142. pyvider_components-0.0.0.post1/src/pyvider_components.egg-info/PKG-INFO +16 -0
  143. pyvider_components-0.0.0.post1/src/pyvider_components.egg-info/SOURCES.txt +149 -0
  144. pyvider_components-0.0.0.post1/src/pyvider_components.egg-info/dependency_links.txt +1 -0
  145. pyvider_components-0.0.0.post1/src/pyvider_components.egg-info/requires.txt +6 -0
  146. pyvider_components-0.0.0.post1/src/pyvider_components.egg-info/top_level.txt +1 -0
  147. pyvider_components-0.0.0.post1/tests/test_e2e_encryption_lifecycle.py +55 -0
  148. pyvider_components-0.0.0.post1/tests/test_local_directory_lifecycle.py +71 -0
  149. pyvider_components-0.0.0.post1/tests/test_resource_lifecycle_contract.py +88 -0
  150. pyvider_components-0.0.0.post1/tests/test_tdd_function_semantics.py +72 -0
  151. pyvider_components-0.0.0.post1/tests/test_tdd_stdlib_functions.py +81 -0
@@ -0,0 +1,16 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyvider-components
3
+ Version: 0.0.0.post1
4
+ Summary: Standard Components for the Pyvider Framework
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: pyvider-telemetry
8
+ Requires-Dist: pyvider-rpcplugin
9
+ Requires-Dist: attrs>=25.3.0
10
+ Requires-Dist: httpx>=0.28.1
11
+ Requires-Dist: jq>=1.9.1
12
+ Requires-Dist: jinja2>=3.1.6
13
+
14
+ # Pyvider Provider Components
15
+
16
+ There's always room for improvement.
@@ -0,0 +1,3 @@
1
+ # Pyvider Provider Components
2
+
3
+ There's always room for improvement.
@@ -0,0 +1,53 @@
1
+ [project]
2
+ name = "pyvider-components"
3
+ version = "0.0.0-1"
4
+ description = "Standard Components for the Pyvider Framework"
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ dependencies = [
8
+ "pyvider-telemetry",
9
+ "pyvider-rpcplugin",
10
+ "attrs>=25.3.0",
11
+ "httpx>=0.28.1",
12
+ "jq>=1.9.1",
13
+ "jinja2>=3.1.6",
14
+ ]
15
+
16
+ [build-system]
17
+ requires = ["setuptools>=61.0"]
18
+ build-backend = "setuptools.build_meta"
19
+
20
+ [tool.setuptools]
21
+ package-dir = {"" = "src"}
22
+
23
+ [tool.setuptools.packages.find]
24
+ where = ["src"]
25
+
26
+ [tool.setuptools.package-data]
27
+ "*" = ["*.garnish/**/*"]
28
+
29
+ [tool.pytest.ini_options]
30
+ asyncio_mode = "auto"
31
+
32
+ [dependency-groups]
33
+ dev = [
34
+ "bandit>=1.8.3",
35
+ "grpc-stubs>=1.53.0.6",
36
+ "grpcio-tools>=1.73.0",
37
+ "hypothesis>=6.131.0",
38
+ "mypy>=1.9.0",
39
+ "psutil>=7.0.0",
40
+ "pyright>=1.1.401",
41
+ "pytest>=8.3.0",
42
+ "pytest-asyncio>=0.25.0",
43
+ "pytest-cov>=6.0.0",
44
+ "pytest-mock>=3.14.0",
45
+ "pytest-xdist>=3.6.0",
46
+ "ruff>=0.9.0",
47
+ "twine>=6.0.0",
48
+ "types-protobuf>=6.30.2.20250516",
49
+ "memray>=1.17.2",
50
+ "pytest-benchmark>=5.1.0",
51
+ ]
52
+
53
+ [tool.uv.sources]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,10 @@
1
+ #
2
+ # pyvider/__init__.py
3
+ #
4
+
5
+ # This file declares 'pyvider' as a namespace package, allowing it to be
6
+ # extended across multiple directories.
7
+ __path__ = __import__("pkgutil").extend_path(__path__, __name__)
8
+
9
+
10
+ # đŸ“Ļ🔧🐍
@@ -0,0 +1,9 @@
1
+ #
2
+ # pyvider/components/__init__.py
3
+ #
4
+
5
+ # This file makes pyvider.components a package.
6
+ # Autodiscovery will scan from here.
7
+
8
+
9
+ # 🧩đŸ“Ļ🔍
@@ -0,0 +1,7 @@
1
+ #
2
+ # pyvider/components/capabilities/__init__.py
3
+ #
4
+
5
+ # This file makes this directory a Python package.
6
+
7
+ # đŸ“Ļ🚀🐍
@@ -0,0 +1,58 @@
1
+ #
2
+ # pyvider/components/capabilities/api.py
3
+ #
4
+
5
+ from pyvider.capabilities import BaseCapability, register_capability
6
+ from pyvider.schema import PvsAttribute, a_bool, a_map, a_num, a_str
7
+
8
+
9
+ class AbstractApiCapability(BaseCapability):
10
+ """
11
+ Provides a standard set of API configuration attributes for a provider.
12
+ """
13
+
14
+ @staticmethod
15
+ def get_schema_contribution() -> dict[str, PvsAttribute]:
16
+ return {
17
+ "api_endpoint": a_str(
18
+ optional=True, description="The base URL for the API endpoint."
19
+ ),
20
+ "api_token": a_str(
21
+ optional=True,
22
+ sensitive=True,
23
+ description="The authentication token for the API.",
24
+ ),
25
+ "api_timeout": a_num(
26
+ optional=True,
27
+ default=30,
28
+ description="Timeout in seconds for API requests.",
29
+ ),
30
+ "api_retries": a_num(
31
+ optional=True,
32
+ default=3,
33
+ description="Number of retries for failed API requests.",
34
+ ),
35
+ "api_insecure_skip_verify": a_bool(
36
+ optional=True,
37
+ default=False,
38
+ description="If true, TLS certificate verification is skipped.",
39
+ ),
40
+ "api_headers": a_map(
41
+ element_type_def=a_str(),
42
+ optional=True,
43
+ description="Custom headers to send with every API request.",
44
+ ),
45
+ }
46
+
47
+
48
+ @register_capability("api")
49
+ class ApiCapability(AbstractApiCapability):
50
+ """
51
+ The Pyvider API capability.
52
+ """
53
+
54
+ def __init__(self, **kwargs):
55
+ super().__init__(**kwargs)
56
+
57
+
58
+ # đŸ”ŒđŸŒđŸ› ī¸
@@ -0,0 +1,70 @@
1
+ #
2
+ # pyvider/components/capabilities/lens.py
3
+ #
4
+
5
+ from typing import Any
6
+
7
+ import jq
8
+
9
+ from pyvider.capabilities import BaseCapability, register_capability
10
+ from pyvider.cty import CtyValue
11
+ from pyvider.cty.conversion import infer_cty_type_from_raw
12
+ from pyvider.exceptions import FunctionError
13
+ from pyvider.schema import PvsAttribute, a_bool, a_str
14
+ from pyvider.telemetry import logger
15
+
16
+
17
+ @register_capability("lens")
18
+ class LensCapability(BaseCapability):
19
+ """
20
+ Provides schema and services for enabling and configuring lens (jq) components.
21
+ """
22
+
23
+ def __init__(self, config: Any | None = None) -> None:
24
+ super().__init__(config)
25
+ self._config = config
26
+
27
+ @property
28
+ def is_enabled(self) -> bool:
29
+ if self._config and hasattr(self._config, "lens_enabled"):
30
+ return self._config.lens_enabled
31
+ return True
32
+
33
+ def jq(self, query: str, input_data: Any) -> CtyValue:
34
+ """
35
+ Executes a JQ query and converts the raw Python result to a CtyValue.
36
+ """
37
+ logger.debug(
38
+ "âš™ī¸ LENS-JQ ✅ Applying jq query via LensCapability service", query=query
39
+ )
40
+ try:
41
+ # THE FIX: Use the correct `compile(...).transform(...)` API.
42
+ compiled_query = jq.compile(query)
43
+ final_raw_result = compiled_query.transform(input_data)
44
+
45
+ inferred_type = infer_cty_type_from_raw(final_raw_result)
46
+ return inferred_type.validate(final_raw_result)
47
+ except Exception as e:
48
+ logger.error(
49
+ "âš™ī¸ LENS-JQ ❌ JQ processing failed in capability",
50
+ error=str(e),
51
+ exc_info=True,
52
+ )
53
+ raise FunctionError(f"jq query failed: {e}") from e
54
+
55
+ @staticmethod
56
+ def get_schema_contribution() -> dict[str, PvsAttribute]:
57
+ return {
58
+ "lens_enabled": a_bool(
59
+ optional=True,
60
+ default=True,
61
+ description="Enables or disables all lens (jq) related components.",
62
+ ),
63
+ "lens_jq_path": a_str(
64
+ optional=True,
65
+ description="Specifies a custom path to the 'jq' executable.",
66
+ ),
67
+ }
68
+
69
+
70
+ # đŸ”đŸ‘ī¸đŸ› ī¸
@@ -0,0 +1,26 @@
1
+ #
2
+ # pyvider/components/data_sources/__init__.py
3
+ #
4
+
5
+ # pyvider/components/data_sources/__init__.py
6
+ """
7
+ Pyvider Data Sources Components
8
+ ==============================
9
+ This package contains all data source components that are automatically discovered
10
+ and registered by the Pyvider framework.
11
+
12
+ Components in this package must use the @register_data_source decorator.
13
+ """
14
+
15
+ # This file intentionally contains no explicit imports.
16
+ # All data source components are discovered automatically by scanning this package.
17
+
18
+ __all__ = [
19
+ # No explicit exports - autodiscovery handles registration
20
+ ]
21
+
22
+ # Metadata for the autodiscovery system
23
+ __component_type__ = "data_source"
24
+ __autodiscovery__ = True
25
+
26
+ # đŸ“Ļ🚀🐍
@@ -0,0 +1,15 @@
1
+ ---
2
+ page_title: "DataSource: pyvider_env_variables"
3
+ description: |-
4
+ {{ schema.description or "Provides a pyvider_env_variables DataSource." }}
5
+ ---
6
+
7
+ # pyvider_env_variables (DataSource)
8
+
9
+ {{ schema.description or "Provides a pyvider_env_variables DataSource." }}
10
+
11
+ {{ example("example") }}
12
+
13
+ ## Argument Reference
14
+
15
+ {{ schema() }}
@@ -0,0 +1,17 @@
1
+ ---
2
+ page_title: "Data Source: pyvider_env_variables"
3
+ description: |-
4
+ Terraform data source for pyvider_env_variables
5
+ ---
6
+
7
+ # pyvider_env_variables (Data Source)
8
+
9
+ Terraform data source for pyvider_env_variables
10
+
11
+ ## Example Usage
12
+
13
+ {{ example("example") }}
14
+
15
+ ## Argument Reference
16
+
17
+ {{ schema() }}
@@ -0,0 +1,8 @@
1
+ data "pyvider_env_variables" "example" {
2
+ # Configuration options here
3
+ }
4
+
5
+ output "example_data" {
6
+ description = "Data from pyvider_env_variables"
7
+ value = data.pyvider_env_variables.example
8
+ }
@@ -0,0 +1,138 @@
1
+ #
2
+ # pyvider/components/data_sources/env_variables.py
3
+ #
4
+
5
+ import os
6
+ import re
7
+ from typing import cast
8
+
9
+ import attrs
10
+
11
+ from pyvider.data_sources.base import BaseDataSource
12
+ from pyvider.data_sources.decorators import register_data_source
13
+ from pyvider.exceptions import DataSourceError
14
+ from pyvider.resources.context import ResourceContext
15
+ from pyvider.schema import PvsSchema, a_bool, a_list, a_map, a_str, s_data_source
16
+
17
+
18
+ @attrs.define(frozen=True)
19
+ class EnvVariablesConfig:
20
+ keys: list[str] | None = None
21
+ prefix: str | None = None
22
+ regex: str | None = None
23
+ exclude_empty: bool | None = None
24
+ transform_keys: str | None = None
25
+ transform_values: str | None = None
26
+ case_sensitive: bool | None = None
27
+ sensitive_keys: list[str] | None = None
28
+
29
+
30
+ @attrs.define(frozen=True)
31
+ class EnvVariablesState:
32
+ values: dict[str, str] = attrs.field(factory=dict)
33
+ sensitive_values: dict[str, str] = attrs.field(factory=dict)
34
+ all_values: dict[str, str] = attrs.field(factory=dict)
35
+ all_environment: dict[str, str] = attrs.field(factory=dict)
36
+
37
+
38
+ @register_data_source("pyvider_env_variables")
39
+ class EnvVariablesDataSource(
40
+ BaseDataSource["pyvider_env_variables", EnvVariablesState, EnvVariablesConfig]
41
+ ):
42
+ config_class = EnvVariablesConfig
43
+ state_class = EnvVariablesState
44
+
45
+ @classmethod
46
+ def get_schema(cls) -> PvsSchema:
47
+ return s_data_source(
48
+ attributes={
49
+ "keys": a_list(a_str(), optional=True),
50
+ "prefix": a_str(optional=True),
51
+ "regex": a_str(optional=True),
52
+ "exclude_empty": a_bool(optional=True, default=True),
53
+ "transform_keys": a_str(optional=True),
54
+ "transform_values": a_str(optional=True),
55
+ "case_sensitive": a_bool(optional=True, default=True),
56
+ "sensitive_keys": a_list(a_str(), optional=True),
57
+ "values": a_map(a_str(), computed=True),
58
+ "sensitive_values": a_map(a_str(), computed=True, sensitive=True),
59
+ "all_values": a_map(a_str(), computed=True),
60
+ "all_environment": a_map(a_str(), computed=True),
61
+ }
62
+ )
63
+
64
+ async def _validate_config(self, config: EnvVariablesConfig) -> list[str]:
65
+ if (
66
+ sum(1 for v in [config.keys, config.prefix, config.regex] if v is not None)
67
+ > 1
68
+ ):
69
+ return ["Only one of 'keys', 'prefix', or 'regex' can be specified."]
70
+ return []
71
+
72
+ async def read(self, ctx: ResourceContext) -> EnvVariablesState:
73
+ if not ctx.config:
74
+ raise DataSourceError("Configuration is required.")
75
+ config = cast(EnvVariablesConfig, ctx.config)
76
+ exclude_empty = config.exclude_empty is not False
77
+ case_sensitive = config.case_sensitive is not False
78
+ source_vars = os.environ.copy()
79
+ filtered_vars = {}
80
+ if config.keys is not None:
81
+ for key in config.keys:
82
+ if (value := source_vars.get(key)) is not None:
83
+ if exclude_empty and not value:
84
+ continue
85
+ filtered_vars[key] = value
86
+ elif config.prefix is not None:
87
+ prefix_to_match = config.prefix if case_sensitive else config.prefix.lower()
88
+ for key, value in source_vars.items():
89
+ key_to_check = key if case_sensitive else key.lower()
90
+ if key_to_check.startswith(prefix_to_match):
91
+ if exclude_empty and not value:
92
+ continue
93
+ filtered_vars[key] = value
94
+ elif config.regex is not None:
95
+ flags = 0 if case_sensitive else re.IGNORECASE
96
+ try:
97
+ compiled_regex = re.compile(config.regex, flags)
98
+ for key, value in source_vars.items():
99
+ if compiled_regex.match(key):
100
+ if exclude_empty and not value:
101
+ continue
102
+ filtered_vars[key] = value
103
+ except re.error as e:
104
+ raise DataSourceError(f"Invalid regex provided: {e}") from e
105
+ else:
106
+ for key, value in source_vars.items():
107
+ if exclude_empty and not value:
108
+ continue
109
+ filtered_vars[key] = value
110
+ transformed_vars = {}
111
+ for key, value in filtered_vars.items():
112
+ final_key = (
113
+ key.upper()
114
+ if config.transform_keys == "upper"
115
+ else (key.lower() if config.transform_keys == "lower" else key)
116
+ )
117
+ final_value = (
118
+ value.upper()
119
+ if config.transform_values == "upper"
120
+ else (value.lower() if config.transform_values == "lower" else value)
121
+ )
122
+ transformed_vars[final_key] = final_value
123
+ sensitive_keys_set = set(config.sensitive_keys or [])
124
+ sensitive_vals = {
125
+ k: v for k, v in transformed_vars.items() if k in sensitive_keys_set
126
+ }
127
+ non_sensitive_vals = {
128
+ k: v for k, v in transformed_vars.items() if k not in sensitive_keys_set
129
+ }
130
+ return EnvVariablesState(
131
+ values=non_sensitive_vals,
132
+ sensitive_values=sensitive_vals,
133
+ all_values=transformed_vars,
134
+ all_environment=source_vars,
135
+ )
136
+
137
+
138
+ # 🌍🔤📊
@@ -0,0 +1,15 @@
1
+ ---
2
+ page_title: "DataSource: pyvider_file_info"
3
+ description: |-
4
+ {{ schema.description or "Provides a pyvider_file_info DataSource." }}
5
+ ---
6
+
7
+ # pyvider_file_info (DataSource)
8
+
9
+ {{ schema.description or "Provides a pyvider_file_info DataSource." }}
10
+
11
+ {{ example("example") }}
12
+
13
+ ## Argument Reference
14
+
15
+ {{ schema() }}
@@ -0,0 +1,17 @@
1
+ ---
2
+ page_title: "Data Source: pyvider_file_info"
3
+ description: |-
4
+ Terraform data source for pyvider_file_info
5
+ ---
6
+
7
+ # pyvider_file_info (Data Source)
8
+
9
+ Terraform data source for pyvider_file_info
10
+
11
+ ## Example Usage
12
+
13
+ {{ example("example") }}
14
+
15
+ ## Argument Reference
16
+
17
+ {{ schema() }}
@@ -0,0 +1,8 @@
1
+ data "pyvider_file_info" "example" {
2
+ # Configuration options here
3
+ }
4
+
5
+ output "example_data" {
6
+ description = "Data from pyvider_file_info"
7
+ value = data.pyvider_file_info.example
8
+ }
@@ -0,0 +1,138 @@
1
+ #
2
+ # pyvider/components/data_sources/file_info.py
3
+ #
4
+
5
+ # components/data_sources/file_info.py
6
+ import datetime
7
+ from pathlib import Path
8
+ import stat
9
+ from typing import cast
10
+
11
+ import attrs
12
+
13
+ from pyvider.data_sources.base import BaseDataSource
14
+ from pyvider.data_sources.decorators import register_data_source
15
+ from pyvider.exceptions import DataSourceError
16
+ from pyvider.resources.context import ResourceContext
17
+ from pyvider.schema import PvsSchema, a_bool, a_num, a_str, s_data_source
18
+
19
+
20
+ @attrs.define(frozen=True)
21
+ class FileInfoConfig:
22
+ path: str = attrs.field()
23
+
24
+
25
+ @attrs.define(frozen=True)
26
+ class FileInfoState:
27
+ path: str = attrs.field()
28
+ exists: bool = attrs.field(default=False)
29
+ size: int = attrs.field(default=0)
30
+ is_dir: bool = attrs.field(default=False)
31
+ is_file: bool = attrs.field(default=False)
32
+ is_symlink: bool = attrs.field(default=False)
33
+ modified_time: str = attrs.field(default="")
34
+ access_time: str = attrs.field(default="")
35
+ creation_time: str = attrs.field(default="")
36
+ permissions: str = attrs.field(default="")
37
+ owner: str = attrs.field(default="")
38
+ group: str = attrs.field(default="")
39
+ mime_type: str = attrs.field(default="")
40
+
41
+
42
+ @register_data_source("pyvider_file_info")
43
+ class FileInfoDataSource(
44
+ BaseDataSource["pyvider_file_info", FileInfoState, FileInfoConfig]
45
+ ):
46
+ config_class = FileInfoConfig
47
+ state_class = FileInfoState
48
+
49
+ @classmethod
50
+ def get_schema(cls) -> PvsSchema:
51
+ return s_data_source(
52
+ {
53
+ "path": a_str(required=True, description="Path to inspect."),
54
+ "exists": a_bool(computed=True, description="Whether path exists."),
55
+ "size": a_num(computed=True, description="Size in bytes."),
56
+ "is_dir": a_bool(computed=True, description="Is it a directory."),
57
+ "is_file": a_bool(computed=True, description="Is it a regular file."),
58
+ "is_symlink": a_bool(
59
+ computed=True, description="Is it a symbolic link."
60
+ ),
61
+ "modified_time": a_str(
62
+ computed=True, description="Last modification time."
63
+ ),
64
+ "access_time": a_str(computed=True, description="Last access time."),
65
+ "creation_time": a_str(computed=True, description="Creation time."),
66
+ "permissions": a_str(computed=True, description="File permissions."),
67
+ "owner": a_str(
68
+ computed=True,
69
+ description="Owner username, or numeric UID on non-Unix systems.",
70
+ ),
71
+ "group": a_str(
72
+ computed=True,
73
+ description="Group name, or numeric GID on non-Unix systems.",
74
+ ),
75
+ "mime_type": a_str(computed=True, description="MIME type."),
76
+ }
77
+ )
78
+
79
+ async def _validate_config(self, config: FileInfoConfig) -> list[str]:
80
+ return []
81
+
82
+ async def read(self, ctx: ResourceContext) -> FileInfoState:
83
+ if not ctx.config:
84
+ raise DataSourceError("Configuration is missing.")
85
+ config = cast(FileInfoConfig, ctx.config)
86
+ path = Path(config.path)
87
+
88
+ if not path.exists():
89
+ return FileInfoState(path=config.path, exists=False)
90
+
91
+ stat_info = path.stat()
92
+ owner, group = str(stat_info.st_uid), str(stat_info.st_gid)
93
+ try:
94
+ import pwd
95
+
96
+ owner = pwd.getpwuid(stat_info.st_uid).pw_name
97
+ except (ImportError, KeyError):
98
+ pass
99
+ try:
100
+ import grp
101
+
102
+ group = grp.getgrgid(stat_info.st_gid).gr_name
103
+ except (ImportError, KeyError):
104
+ pass
105
+
106
+ mime_type = ""
107
+ if path.is_file():
108
+ try:
109
+ import mimetypes
110
+
111
+ mime_type = mimetypes.guess_type(config.path)[0] or ""
112
+ except ImportError:
113
+ pass
114
+
115
+ return FileInfoState(
116
+ path=config.path,
117
+ exists=True,
118
+ size=stat_info.st_size,
119
+ is_dir=path.is_dir(),
120
+ is_file=path.is_file(),
121
+ is_symlink=path.is_symlink(),
122
+ modified_time=datetime.datetime.fromtimestamp(
123
+ stat_info.st_mtime, tz=datetime.UTC
124
+ ).isoformat(),
125
+ access_time=datetime.datetime.fromtimestamp(
126
+ stat_info.st_atime, tz=datetime.UTC
127
+ ).isoformat(),
128
+ creation_time=datetime.datetime.fromtimestamp(
129
+ stat_info.st_ctime, tz=datetime.UTC
130
+ ).isoformat(),
131
+ permissions=oct(stat.S_IMODE(stat_info.st_mode)),
132
+ owner=owner,
133
+ group=group,
134
+ mime_type=mime_type,
135
+ )
136
+
137
+
138
+ # đŸ“„â„šī¸đŸ“Š
@@ -0,0 +1,15 @@
1
+ ---
2
+ page_title: "DataSource: pyvider_http_api"
3
+ description: |-
4
+ {{ schema.description or "Provides a pyvider_http_api DataSource." }}
5
+ ---
6
+
7
+ # pyvider_http_api (DataSource)
8
+
9
+ {{ schema.description or "Provides a pyvider_http_api DataSource." }}
10
+
11
+ {{ example("example") }}
12
+
13
+ ## Argument Reference
14
+
15
+ {{ schema() }}
@@ -0,0 +1,17 @@
1
+ ---
2
+ page_title: "Data Source: pyvider_http_api"
3
+ description: |-
4
+ Terraform data source for pyvider_http_api
5
+ ---
6
+
7
+ # pyvider_http_api (Data Source)
8
+
9
+ Terraform data source for pyvider_http_api
10
+
11
+ ## Example Usage
12
+
13
+ {{ example("example") }}
14
+
15
+ ## Argument Reference
16
+
17
+ {{ schema() }}
@@ -0,0 +1,8 @@
1
+ data "pyvider_http_api" "example" {
2
+ # Configuration options here
3
+ }
4
+
5
+ output "example_data" {
6
+ description = "Data from pyvider_http_api"
7
+ value = data.pyvider_http_api.example
8
+ }