hscida 0.1.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 (196) hide show
  1. hscida-0.1.0/.github/workflows/tests.yml +29 -0
  2. hscida-0.1.0/.gitignore +4 -0
  3. hscida-0.1.0/.history/.github/workflows/publish_20260605151839.yml +56 -0
  4. hscida-0.1.0/.history/.github/workflows/tests_20260605151436.yml +29 -0
  5. hscida-0.1.0/.history/.github/workflows/tests_20260605151454.yml +29 -0
  6. hscida-0.1.0/.history/README_20260605151243.md +15 -0
  7. hscida-0.1.0/.history/README_20260605151302.md +15 -0
  8. hscida-0.1.0/.history/README_20260605151839.md +37 -0
  9. hscida-0.1.0/.history/README_20260605151903.md +39 -0
  10. hscida-0.1.0/.history/README_20260605151949.md +41 -0
  11. hscida-0.1.0/.history/README_20260605152141.md +39 -0
  12. hscida-0.1.0/.history/README_20260605152217.md +39 -0
  13. hscida-0.1.0/.history/hscida_20260605143229.py +82 -0
  14. hscida-0.1.0/.history/hscida_20260605151106.py +81 -0
  15. hscida-0.1.0/.history/hscida_20260605151110.py +78 -0
  16. hscida-0.1.0/.history/hscida_20260605151111.py +77 -0
  17. hscida-0.1.0/.history/hscida_20260605151120.py +77 -0
  18. hscida-0.1.0/.history/hscida_20260605151131.py +77 -0
  19. hscida-0.1.0/.history/hscida_20260605151134.py +77 -0
  20. hscida-0.1.0/.history/hscida_20260605151227.py +77 -0
  21. hscida-0.1.0/.history/hscida_20260605151228.py +77 -0
  22. hscida-0.1.0/.history/pyproject_20260605151240.toml +32 -0
  23. hscida-0.1.0/.history/pyproject_20260605151302.toml +32 -0
  24. hscida-0.1.0/.history/pyproject_20260605151310.toml +33 -0
  25. hscida-0.1.0/.history/pyproject_20260605151419.toml +33 -0
  26. hscida-0.1.0/.history/pyproject_20260605151903.toml +37 -0
  27. hscida-0.1.0/.history/pyproject_20260605151948.toml +37 -0
  28. hscida-0.1.0/.history/pyproject_20260605152141.toml +33 -0
  29. hscida-0.1.0/.history/pyproject_20260605152217.toml +33 -0
  30. hscida-0.1.0/.history/pyproject_20260605152709.toml +33 -0
  31. hscida-0.1.0/.history/scripts/publish_20260605151907.sh +24 -0
  32. hscida-0.1.0/.history/src/hscida/__init___20260605151235.py +133 -0
  33. hscida-0.1.0/.history/src/hscida/__init___20260605151302.py +133 -0
  34. hscida-0.1.0/.history/src/hscida/__init___20260605152315.py +82 -0
  35. hscida-0.1.0/.history/src/hscida/__init___20260605152318.py +81 -0
  36. hscida-0.1.0/.history/src/hscida/__init___20260605152326.py +77 -0
  37. hscida-0.1.0/.history/src/hscida/__init___20260605152330.py +77 -0
  38. hscida-0.1.0/.history/src/hscida/__init___20260605152519.py +77 -0
  39. hscida-0.1.0/.history/src/hscida/__init___20260605152521.py +77 -0
  40. hscida-0.1.0/.history/src/hscida/__init___20260605152526.py +77 -0
  41. hscida-0.1.0/.history/src/hscida/__init___20260605152528.py +77 -0
  42. hscida-0.1.0/.history/src/hscida/__init___20260605152532.py +77 -0
  43. hscida-0.1.0/.history/src/hscida/__init___20260605152534.py +77 -0
  44. hscida-0.1.0/.history/src/hscida/__init___20260605152537.py +77 -0
  45. hscida-0.1.0/.history/src/hscida/__init___20260605152542.py +77 -0
  46. hscida-0.1.0/.history/src/hscida/__init___20260605152557.py +77 -0
  47. hscida-0.1.0/.history/src/hscida/__init___20260605152559.py +77 -0
  48. hscida-0.1.0/.history/tests/test_hscida_20260605151235.py +57 -0
  49. hscida-0.1.0/.history/tests/test_hscida_20260605151302.py +57 -0
  50. hscida-0.1.0/.history/tests/test_hscida_20260605152430.py +56 -0
  51. hscida-0.1.0/PKG-INFO +53 -0
  52. hscida-0.1.0/README.md +39 -0
  53. hscida-0.1.0/hscida.R +56 -0
  54. hscida-0.1.0/pyproject.toml +33 -0
  55. hscida-0.1.0/rproject.toml +13 -0
  56. hscida-0.1.0/rv/library/4.6/arm64/DBI/DESCRIPTION +46 -0
  57. hscida-0.1.0/rv/library/4.6/arm64/DBI/INDEX +69 -0
  58. hscida-0.1.0/rv/library/4.6/arm64/DBI/Meta/Rd.rds +0 -0
  59. hscida-0.1.0/rv/library/4.6/arm64/DBI/Meta/features.rds +0 -0
  60. hscida-0.1.0/rv/library/4.6/arm64/DBI/Meta/hsearch.rds +0 -0
  61. hscida-0.1.0/rv/library/4.6/arm64/DBI/Meta/links.rds +0 -0
  62. hscida-0.1.0/rv/library/4.6/arm64/DBI/Meta/nsInfo.rds +0 -0
  63. hscida-0.1.0/rv/library/4.6/arm64/DBI/Meta/package.rds +0 -0
  64. hscida-0.1.0/rv/library/4.6/arm64/DBI/Meta/vignette.rds +0 -0
  65. hscida-0.1.0/rv/library/4.6/arm64/DBI/NAMESPACE +134 -0
  66. hscida-0.1.0/rv/library/4.6/arm64/DBI/NEWS.md +590 -0
  67. hscida-0.1.0/rv/library/4.6/arm64/DBI/R/DBI +27 -0
  68. hscida-0.1.0/rv/library/4.6/arm64/DBI/R/DBI.rdb +0 -0
  69. hscida-0.1.0/rv/library/4.6/arm64/DBI/R/DBI.rdx +0 -0
  70. hscida-0.1.0/rv/library/4.6/arm64/DBI/README.md +170 -0
  71. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-1.Rmd +706 -0
  72. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-1.html +1099 -0
  73. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-advanced.R +197 -0
  74. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-advanced.Rmd +346 -0
  75. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-advanced.html +809 -0
  76. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-arrow.R +87 -0
  77. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-arrow.Rmd +196 -0
  78. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-arrow.html +582 -0
  79. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-history.Rmd +21 -0
  80. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-history.html +335 -0
  81. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-proposal.Rmd +757 -0
  82. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI-proposal.html +1166 -0
  83. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI.R +66 -0
  84. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI.Rmd +184 -0
  85. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/DBI.html +594 -0
  86. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/backend.R +111 -0
  87. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/backend.Rmd +267 -0
  88. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/backend.html +633 -0
  89. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/index.html +65 -0
  90. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/spec.R +3 -0
  91. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/spec.Rmd +28 -0
  92. hscida-0.1.0/rv/library/4.6/arm64/DBI/doc/spec.html +5552 -0
  93. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/AnIndex +221 -0
  94. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/DBI.rdb +0 -0
  95. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/DBI.rdx +0 -0
  96. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/aliases.rds +0 -0
  97. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/figures/lifecycle-archived.svg +21 -0
  98. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/figures/lifecycle-defunct.svg +21 -0
  99. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/figures/lifecycle-deprecated.svg +21 -0
  100. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/figures/lifecycle-experimental.svg +21 -0
  101. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/figures/lifecycle-maturing.svg +21 -0
  102. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/figures/lifecycle-questioning.svg +21 -0
  103. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/figures/lifecycle-soft-deprecated.svg +21 -0
  104. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/figures/lifecycle-stable.svg +29 -0
  105. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/figures/lifecycle-superseded.svg +21 -0
  106. hscida-0.1.0/rv/library/4.6/arm64/DBI/help/paths.rds +0 -0
  107. hscida-0.1.0/rv/library/4.6/arm64/DBI/html/00Index.html +170 -0
  108. hscida-0.1.0/rv/library/4.6/arm64/DBI/html/R.css +142 -0
  109. hscida-0.1.0/rv/library/4.6/arm64/dotenv/DESCRIPTION +19 -0
  110. hscida-0.1.0/rv/library/4.6/arm64/dotenv/INDEX +4 -0
  111. hscida-0.1.0/rv/library/4.6/arm64/dotenv/LICENSE +2 -0
  112. hscida-0.1.0/rv/library/4.6/arm64/dotenv/Meta/Rd.rds +0 -0
  113. hscida-0.1.0/rv/library/4.6/arm64/dotenv/Meta/features.rds +0 -0
  114. hscida-0.1.0/rv/library/4.6/arm64/dotenv/Meta/hsearch.rds +0 -0
  115. hscida-0.1.0/rv/library/4.6/arm64/dotenv/Meta/links.rds +0 -0
  116. hscida-0.1.0/rv/library/4.6/arm64/dotenv/Meta/nsInfo.rds +0 -0
  117. hscida-0.1.0/rv/library/4.6/arm64/dotenv/Meta/package.rds +0 -0
  118. hscida-0.1.0/rv/library/4.6/arm64/dotenv/NAMESPACE +3 -0
  119. hscida-0.1.0/rv/library/4.6/arm64/dotenv/NEWS.md +16 -0
  120. hscida-0.1.0/rv/library/4.6/arm64/dotenv/R/dotenv +27 -0
  121. hscida-0.1.0/rv/library/4.6/arm64/dotenv/R/dotenv.rdb +0 -0
  122. hscida-0.1.0/rv/library/4.6/arm64/dotenv/R/dotenv.rdx +0 -0
  123. hscida-0.1.0/rv/library/4.6/arm64/dotenv/README.md +67 -0
  124. hscida-0.1.0/rv/library/4.6/arm64/dotenv/help/AnIndex +2 -0
  125. hscida-0.1.0/rv/library/4.6/arm64/dotenv/help/aliases.rds +0 -0
  126. hscida-0.1.0/rv/library/4.6/arm64/dotenv/help/dotenv.rdb +0 -0
  127. hscida-0.1.0/rv/library/4.6/arm64/dotenv/help/dotenv.rdx +0 -0
  128. hscida-0.1.0/rv/library/4.6/arm64/dotenv/help/paths.rds +0 -0
  129. hscida-0.1.0/rv/library/4.6/arm64/dotenv/html/00Index.html +31 -0
  130. hscida-0.1.0/rv/library/4.6/arm64/dotenv/html/R.css +142 -0
  131. hscida-0.1.0/rv/library/4.6/arm64/duckdb/DESCRIPTION +94 -0
  132. hscida-0.1.0/rv/library/4.6/arm64/duckdb/INDEX +9 -0
  133. hscida-0.1.0/rv/library/4.6/arm64/duckdb/LICENSE +2 -0
  134. hscida-0.1.0/rv/library/4.6/arm64/duckdb/Meta/Rd.rds +0 -0
  135. hscida-0.1.0/rv/library/4.6/arm64/duckdb/Meta/features.rds +0 -0
  136. hscida-0.1.0/rv/library/4.6/arm64/duckdb/Meta/hsearch.rds +0 -0
  137. hscida-0.1.0/rv/library/4.6/arm64/duckdb/Meta/links.rds +0 -0
  138. hscida-0.1.0/rv/library/4.6/arm64/duckdb/Meta/nsInfo.rds +0 -0
  139. hscida-0.1.0/rv/library/4.6/arm64/duckdb/Meta/package.rds +0 -0
  140. hscida-0.1.0/rv/library/4.6/arm64/duckdb/NAMESPACE +61 -0
  141. hscida-0.1.0/rv/library/4.6/arm64/duckdb/NEWS.md +1118 -0
  142. hscida-0.1.0/rv/library/4.6/arm64/duckdb/R/duckdb +27 -0
  143. hscida-0.1.0/rv/library/4.6/arm64/duckdb/R/duckdb.rdb +0 -0
  144. hscida-0.1.0/rv/library/4.6/arm64/duckdb/R/duckdb.rdx +0 -0
  145. hscida-0.1.0/rv/library/4.6/arm64/duckdb/README.md +101 -0
  146. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/AnIndex +97 -0
  147. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/aliases.rds +0 -0
  148. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/duckdb.rdb +0 -0
  149. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/duckdb.rdx +0 -0
  150. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/figures/lifecycle-deprecated.svg +21 -0
  151. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/figures/lifecycle-experimental.svg +21 -0
  152. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/figures/lifecycle-stable.svg +29 -0
  153. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/figures/lifecycle-superseded.svg +21 -0
  154. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/figures/logo.png +0 -0
  155. hscida-0.1.0/rv/library/4.6/arm64/duckdb/help/paths.rds +0 -0
  156. hscida-0.1.0/rv/library/4.6/arm64/duckdb/html/00Index.html +73 -0
  157. hscida-0.1.0/rv/library/4.6/arm64/duckdb/html/R.css +142 -0
  158. hscida-0.1.0/rv/library/4.6/arm64/duckdb/icons/duckdb.png +0 -0
  159. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/R.hpp +137 -0
  160. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/altrep.hpp +8 -0
  161. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/as.hpp +338 -0
  162. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/attribute_proxy.hpp +50 -0
  163. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/data_frame.hpp +104 -0
  164. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/declarations.hpp +63 -0
  165. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/doubles.hpp +100 -0
  166. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/environment.hpp +58 -0
  167. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/external_pointer.hpp +180 -0
  168. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/function.hpp +149 -0
  169. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/integers.hpp +106 -0
  170. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/list.hpp +104 -0
  171. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/list_of.hpp +73 -0
  172. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/logicals.hpp +79 -0
  173. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/matrix.hpp +232 -0
  174. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/named_arg.hpp +50 -0
  175. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/protect.hpp +332 -0
  176. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/r_bool.hpp +83 -0
  177. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/r_string.hpp +105 -0
  178. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/r_vector.hpp +1459 -0
  179. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/raws.hpp +87 -0
  180. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/sexp.hpp +79 -0
  181. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11/strings.hpp +150 -0
  182. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/cpp11.hpp +26 -0
  183. hscida-0.1.0/rv/library/4.6/arm64/duckdb/include/duckdb_types.hpp +12 -0
  184. hscida-0.1.0/rv/library/4.6/arm64/duckdb/libs/duckdb.so +0 -0
  185. hscida-0.1.0/rv/library/4.6/arm64/duckdb/libs/symbols.rds +0 -0
  186. hscida-0.1.0/rv/library/4.6/arm64/duckdb/rstudio/connections/DuckDB.R +12 -0
  187. hscida-0.1.0/rv/library/4.6/arm64/duckdb/rstudio/connections.dcf +3 -0
  188. hscida-0.1.0/rv.lock +27 -0
  189. hscida-0.1.0/src/hsci_da.egg-info/PKG-INFO +29 -0
  190. hscida-0.1.0/src/hsci_da.egg-info/SOURCES.txt +9 -0
  191. hscida-0.1.0/src/hsci_da.egg-info/dependency_links.txt +1 -0
  192. hscida-0.1.0/src/hsci_da.egg-info/requires.txt +7 -0
  193. hscida-0.1.0/src/hsci_da.egg-info/top_level.txt +1 -0
  194. hscida-0.1.0/src/hscida/__init__.py +77 -0
  195. hscida-0.1.0/tests/test_hscida.py +56 -0
  196. hscida-0.1.0/uv.lock +882 -0
@@ -0,0 +1,29 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - "**"
7
+ pull_request:
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v4
16
+
17
+ - name: Set up Python
18
+ uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+
22
+ - name: Install uv
23
+ uses: astral-sh/setup-uv@v4
24
+
25
+ - name: Sync dependencies
26
+ run: uv sync --dev
27
+
28
+ - name: Run tests
29
+ run: uv run pytest -q
@@ -0,0 +1,4 @@
1
+ .Rproj.user
2
+ .Rhistory
3
+ .RData
4
+ .Ruserdata
@@ -0,0 +1,56 @@
1
+ name: Publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "3.12"
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v4
23
+
24
+ - name: Sync dependencies
25
+ run: uv sync --dev
26
+
27
+ - name: Run tests
28
+ run: uv run pytest -q
29
+
30
+ - name: Build package
31
+ run: uv build
32
+
33
+ - name: Upload artifacts
34
+ uses: actions/upload-artifact@v4
35
+ with:
36
+ name: dist
37
+ path: dist/
38
+
39
+ publish:
40
+ runs-on: ubuntu-latest
41
+ needs: build
42
+ permissions:
43
+ id-token: write
44
+
45
+ environment:
46
+ name: pypi
47
+
48
+ steps:
49
+ - name: Download artifacts
50
+ uses: actions/download-artifact@v4
51
+ with:
52
+ name: dist
53
+ path: dist/
54
+
55
+ - name: Publish to PyPI
56
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,29 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - '**'
7
+ pull_request:
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v4
16
+
17
+ - name: Set up Python
18
+ uses: actions/setup-python@v5
19
+ with:
20
+ python-version: '3.12'
21
+
22
+ - name: Install uv
23
+ uses: astral-sh/setup-uv@v4
24
+
25
+ - name: Sync dependencies
26
+ run: uv sync --dev
27
+
28
+ - name: Run tests
29
+ run: uv run pytest -q
@@ -0,0 +1,29 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - "**"
7
+ pull_request:
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v4
16
+
17
+ - name: Set up Python
18
+ uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+
22
+ - name: Install uv
23
+ uses: astral-sh/setup-uv@v4
24
+
25
+ - name: Sync dependencies
26
+ run: uv sync --dev
27
+
28
+ - name: Run tests
29
+ run: uv run pytest -q
@@ -0,0 +1,15 @@
1
+ # hsci-da
2
+
3
+ Installable Python package for HSCI data access utilities built on DuckDB and Narwhals.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install .
9
+ ```
10
+
11
+ ## Run tests
12
+
13
+ ```bash
14
+ pytest
15
+ ```
@@ -0,0 +1,15 @@
1
+ # hsci-da
2
+
3
+ Installable Python package for HSCI data access utilities built on DuckDB and Narwhals.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install .
9
+ ```
10
+
11
+ ## Run tests
12
+
13
+ ```bash
14
+ pytest
15
+ ```
@@ -0,0 +1,37 @@
1
+ # hsci-da
2
+
3
+ Installable Python package for HSCI data access utilities built on DuckDB and Narwhals.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install .
9
+ ```
10
+
11
+ ## Run tests
12
+
13
+ ```bash
14
+ pytest
15
+ ```
16
+
17
+ ## Publish To PyPI
18
+
19
+ This repository includes GitHub Actions publishing in [.github/workflows/publish.yml](.github/workflows/publish.yml) using PyPI Trusted Publishing.
20
+
21
+ One-time setup on PyPI:
22
+
23
+ 1. Create a PyPI project named `hsci-da`.
24
+ 2. In PyPI project settings, add a Trusted Publisher for this GitHub repository and workflow file `.github/workflows/publish.yml`.
25
+
26
+ Release flow:
27
+
28
+ ```bash
29
+ uv run pytest -q
30
+ # bump version in pyproject.toml
31
+ git add pyproject.toml
32
+ git commit -m "Release v0.1.1"
33
+ git tag v0.1.1
34
+ git push && git push --tags
35
+ ```
36
+
37
+ Pushing a tag like `v0.1.1` will run tests, build artifacts, and publish to PyPI.
@@ -0,0 +1,39 @@
1
+ # hsci-da
2
+
3
+ Installable Python package for HSCI data access utilities built on DuckDB and Narwhals.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install .
9
+ ```
10
+
11
+ ## Run tests
12
+
13
+ ```bash
14
+ pytest
15
+ ```
16
+
17
+ ## Publish To PyPI (Local)
18
+
19
+ Set your token once in your shell profile:
20
+
21
+ ```bash
22
+ export TWINE_USERNAME=__token__
23
+ export TWINE_PASSWORD=pypi-xxxx
24
+ ```
25
+
26
+ Release flow from your machine:
27
+
28
+ ```bash
29
+ # bump version in pyproject.toml first
30
+ uv sync --group publish --dev
31
+ uv run pytest -q
32
+ ./scripts/publish.sh pypi
33
+ ```
34
+
35
+ Dry-run against TestPyPI:
36
+
37
+ ```bash
38
+ ./scripts/publish.sh testpypi
39
+ ```
@@ -0,0 +1,41 @@
1
+ # hsci-da
2
+
3
+ Installable Python package for HSCI data access utilities built on DuckDB and Narwhals.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install .
9
+ ```
10
+
11
+ ## Run tests
12
+
13
+ ```bash
14
+ pytest
15
+ ```
16
+
17
+ ## Publish To PyPI (Local)
18
+
19
+ Set your token once in your shell profile:
20
+
21
+ ```bash
22
+ export TWINE_USERNAME=__token__
23
+ export TWINE_PASSWORD=pypi-xxxx
24
+ ```
25
+
26
+ Release flow from your machine:
27
+
28
+ ```bash
29
+ # bump version in pyproject.toml first
30
+ uv sync --group publish --dev
31
+ uv run pytest -q
32
+ uv run --group publish python -m build
33
+ uv run --group publish twine check dist/*
34
+ uv run --group publish twine upload dist/*
35
+ ```
36
+
37
+ Dry-run against TestPyPI:
38
+
39
+ ```bash
40
+ uv run --group publish twine upload --repository testpypi dist/*
41
+ ```
@@ -0,0 +1,39 @@
1
+ # hsci-da
2
+
3
+ Installable Python package for HSCI data access utilities built on DuckDB and Narwhals.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install .
9
+ ```
10
+
11
+ ## Run tests
12
+
13
+ ```bash
14
+ pytest
15
+ ```
16
+
17
+ ## Publish To PyPI (Local)
18
+
19
+ Set your token once in your shell profile:
20
+
21
+ ```bash
22
+ export UV_PUBLISH_TOKEN=pypi-xxxx
23
+ ```
24
+
25
+ Release flow from your machine:
26
+
27
+ ```bash
28
+ # bump version in pyproject.toml first
29
+ uv sync --dev
30
+ uv run pytest -q
31
+ uv build
32
+ uv publish
33
+ ```
34
+
35
+ Dry-run against TestPyPI:
36
+
37
+ ```bash
38
+ uv publish --publish-url https://test.pypi.org/legacy/
39
+ ```
@@ -0,0 +1,39 @@
1
+ # hsci-da
2
+
3
+ Installable Python package for HSCI data access utilities built on DuckDB and Narwhals.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install .
9
+ ```
10
+
11
+ ## Run tests
12
+
13
+ ```bash
14
+ pytest
15
+ ```
16
+
17
+ ## Publish To PyPI (Local)
18
+
19
+ Set your token once in your shell profile:
20
+
21
+ ```bash
22
+ export UV_PUBLISH_TOKEN=pypi-xxxx
23
+ ```
24
+
25
+ Release flow from your machine:
26
+
27
+ ```bash
28
+ # bump version in pyproject.toml first
29
+ uv sync --dev
30
+ uv run pytest -q
31
+ uv build
32
+ uv publish
33
+ ```
34
+
35
+ Dry-run against TestPyPI:
36
+
37
+ ```bash
38
+ uv publish --publish-url https://test.pypi.org/legacy/
39
+ ```
@@ -0,0 +1,82 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Any, cast
3
+ from hereutil import here
4
+ import narwhals as nw
5
+ import duckdb
6
+ import sqlglot
7
+ import os
8
+ import polars as pl
9
+
10
+ from dotenv import dotenv_values
11
+
12
+ _DEFAULT_DUCKDB_CONFIG = dict(parquet_metadata_cache="true", preserve_insertion_order="false", enable_fsst_vectors="true")
13
+ _PROJROOT = str(here())
14
+
15
+ @dataclass
16
+ class DataAccessConfig:
17
+ glob_pattern: str
18
+ init_sql: str
19
+ duckdb_config: dict[str, Any] = field(default_factory=lambda: _DEFAULT_DUCKDB_CONFIG)
20
+ projroot: str = _PROJROOT
21
+
22
+ def config_from_env() -> DataAccessConfig:
23
+ c = {
24
+ **dotenv_values(),
25
+ **os.environ,
26
+ }
27
+ return DataAccessConfig(
28
+ glob_pattern=c['GLOB_PATTERN'],
29
+ init_sql=c['INIT_SQL'],
30
+ duckdb_config={k: v for k, v in [pair.split('=') for pair in c['DUCKDB_CONFIG'].split(',')] } if 'DUCKDB_CONFIG' in c else _DEFAULT_DUCKDB_CONFIG,
31
+ projroot=c.get('PROJROOT', _PROJROOT)
32
+ )
33
+
34
+ class DataAccess:
35
+ def __init__(self, config: DataAccessConfig = config_from_env()) -> None:
36
+ self.con = duckdb.connect(config=config.duckdb_config)
37
+ self.con.sql(config.init_sql)
38
+ self.datasets = dict[str, nw.LazyFrame[duckdb.DuckDBPyRelation]]()
39
+ self.config = config
40
+
41
+ def register_files_as_view(self, table_name: str, *paths: str, replace: bool = False) -> None:
42
+ self.con.sql(f"CREATE {('OR REPLACE' if replace else '')} VIEW {'IF NOT EXISTS' if not replace else ''} {table_name} AS FROM read_{'parquet' if paths[0].endswith('.parquet') else 'csv'}(['{"', '".join(paths)}'], hive_partitioning=true);")
43
+
44
+ def f(self, dataset: str, *paths: str,replace: bool = False, debug: bool = False) -> nw.LazyFrame[duckdb.DuckDBPyRelation]:
45
+ if dataset not in self.datasets or replace:
46
+ if not paths:
47
+ paths = tuple(path[0] for path in self.con.sql("FROM "+self.config.glob_pattern.format(dataset=dataset,projroot=self.config.projroot)).fetchall())
48
+ if debug:
49
+ print(f"DEBUG: Found paths for dataset {dataset}: {paths}")
50
+ if not paths:
51
+ print(f"No files found for dataset {dataset} in {self.config.glob_pattern.format(dataset=dataset,projroot=self.config.projroot)}")
52
+ return cast(nw.LazyFrame[duckdb.DuckDBPyRelation], None)
53
+ self.register_files_as_view(dataset, *paths, replace=replace)
54
+ self.datasets[dataset] = nw.from_native(self.con.sql(f'FROM {dataset}'))
55
+ return self.datasets[dataset]
56
+
57
+ c = nw.col
58
+ l = nw.lit
59
+
60
+ def to_narwhals(duckdb_relation: duckdb.DuckDBPyRelation) -> nw.LazyFrame[duckdb.DuckDBPyRelation]:
61
+ return nw.from_native(duckdb_relation)
62
+
63
+ n = to_narwhals
64
+
65
+ def to_duckdb(lnf: nw.LazyFrame[duckdb.DuckDBPyRelation]) -> duckdb.DuckDBPyRelation:
66
+ return lnf.to_native()
67
+
68
+ d = to_duckdb
69
+
70
+ def to_polars(lnf: nw.LazyFrame[duckdb.DuckDBPyRelation]) -> pl.DataFrame:
71
+ return lnf.collect(backend='polars').to_native()
72
+
73
+ p = to_polars
74
+
75
+ def to_pandas(lnf: nw.LazyFrame[duckdb.DuckDBPyRelation]):
76
+ return d(lnf).df()
77
+
78
+ def format_sql(query: str, read:str = 'duckdb', write:str = 'duckb') -> str:
79
+ return sqlglot.transpile(query, read=read, write=write, pretty=True)[0]
80
+
81
+
82
+ __all__ = [ "DataAccess", "c", "l", "to_narwhals", "n", "to_duckdb", "d", "to_polars", "p","to_pandas", "format_sql" ]
@@ -0,0 +1,81 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Any, cast
3
+ from hereutil import here
4
+ import narwhals as nw
5
+ import duckdb
6
+ import os
7
+ import polars as pl
8
+
9
+ from dotenv import dotenv_values
10
+
11
+ _DEFAULT_DUCKDB_CONFIG = dict(parquet_metadata_cache="true", preserve_insertion_order="false", enable_fsst_vectors="true")
12
+ _PROJROOT = str(here())
13
+
14
+ @dataclass
15
+ class DataAccessConfig:
16
+ glob_pattern: str
17
+ init_sql: str
18
+ duckdb_config: dict[str, Any] = field(default_factory=lambda: _DEFAULT_DUCKDB_CONFIG)
19
+ projroot: str = _PROJROOT
20
+
21
+ def config_from_env() -> DataAccessConfig:
22
+ c = {
23
+ **dotenv_values(),
24
+ **os.environ,
25
+ }
26
+ return DataAccessConfig(
27
+ glob_pattern=c['GLOB_PATTERN'],
28
+ init_sql=c['INIT_SQL'],
29
+ duckdb_config={k: v for k, v in [pair.split('=') for pair in c['DUCKDB_CONFIG'].split(',')] } if 'DUCKDB_CONFIG' in c else _DEFAULT_DUCKDB_CONFIG,
30
+ projroot=c.get('PROJROOT', _PROJROOT)
31
+ )
32
+
33
+ class DataAccess:
34
+ def __init__(self, config: DataAccessConfig = config_from_env()) -> None:
35
+ self.con = duckdb.connect(config=config.duckdb_config)
36
+ self.con.sql(config.init_sql)
37
+ self.datasets = dict[str, nw.LazyFrame[duckdb.DuckDBPyRelation]]()
38
+ self.config = config
39
+
40
+ def register_files_as_view(self, table_name: str, *paths: str, replace: bool = False) -> None:
41
+ self.con.sql(f"CREATE {('OR REPLACE' if replace else '')} VIEW {'IF NOT EXISTS' if not replace else ''} {table_name} AS FROM read_{'parquet' if paths[0].endswith('.parquet') else 'csv'}(['{"', '".join(paths)}'], hive_partitioning=true);")
42
+
43
+ def f(self, dataset: str, *paths: str,replace: bool = False, debug: bool = False) -> nw.LazyFrame[duckdb.DuckDBPyRelation]:
44
+ if dataset not in self.datasets or replace:
45
+ if not paths:
46
+ paths = tuple(path[0] for path in self.con.sql("FROM "+self.config.glob_pattern.format(dataset=dataset,projroot=self.config.projroot)).fetchall())
47
+ if debug:
48
+ print(f"DEBUG: Found paths for dataset {dataset}: {paths}")
49
+ if not paths:
50
+ print(f"No files found for dataset {dataset} in {self.config.glob_pattern.format(dataset=dataset,projroot=self.config.projroot)}")
51
+ return cast(nw.LazyFrame[duckdb.DuckDBPyRelation], None)
52
+ self.register_files_as_view(dataset, *paths, replace=replace)
53
+ self.datasets[dataset] = nw.from_native(self.con.sql(f'FROM {dataset}'))
54
+ return self.datasets[dataset]
55
+
56
+ c = nw.col
57
+ l = nw.lit
58
+
59
+ def to_narwhals(duckdb_relation: duckdb.DuckDBPyRelation) -> nw.LazyFrame[duckdb.DuckDBPyRelation]:
60
+ return nw.from_native(duckdb_relation)
61
+
62
+ n = to_narwhals
63
+
64
+ def to_duckdb(lnf: nw.LazyFrame[duckdb.DuckDBPyRelation]) -> duckdb.DuckDBPyRelation:
65
+ return lnf.to_native()
66
+
67
+ d = to_duckdb
68
+
69
+ def to_polars(lnf: nw.LazyFrame[duckdb.DuckDBPyRelation]) -> pl.DataFrame:
70
+ return lnf.collect(backend='polars').to_native()
71
+
72
+ p = to_polars
73
+
74
+ def to_pandas(lnf: nw.LazyFrame[duckdb.DuckDBPyRelation]):
75
+ return d(lnf).df()
76
+
77
+ def format_sql(query: str, read:str = 'duckdb', write:str = 'duckb') -> str:
78
+ return sqlglot.transpile(query, read=read, write=write, pretty=True)[0]
79
+
80
+
81
+ __all__ = [ "DataAccess", "c", "l", "to_narwhals", "n", "to_duckdb", "d", "to_polars", "p","to_pandas", "format_sql" ]
@@ -0,0 +1,78 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Any, cast
3
+ from hereutil import here
4
+ import narwhals as nw
5
+ import duckdb
6
+ import os
7
+ import polars as pl
8
+
9
+ from dotenv import dotenv_values
10
+
11
+ _DEFAULT_DUCKDB_CONFIG = dict(parquet_metadata_cache="true", preserve_insertion_order="false", enable_fsst_vectors="true")
12
+ _PROJROOT = str(here())
13
+
14
+ @dataclass
15
+ class DataAccessConfig:
16
+ glob_pattern: str
17
+ init_sql: str
18
+ duckdb_config: dict[str, Any] = field(default_factory=lambda: _DEFAULT_DUCKDB_CONFIG)
19
+ projroot: str = _PROJROOT
20
+
21
+ def config_from_env() -> DataAccessConfig:
22
+ c = {
23
+ **dotenv_values(),
24
+ **os.environ,
25
+ }
26
+ return DataAccessConfig(
27
+ glob_pattern=c['GLOB_PATTERN'],
28
+ init_sql=c['INIT_SQL'],
29
+ duckdb_config={k: v for k, v in [pair.split('=') for pair in c['DUCKDB_CONFIG'].split(',')] } if 'DUCKDB_CONFIG' in c else _DEFAULT_DUCKDB_CONFIG,
30
+ projroot=c.get('PROJROOT', _PROJROOT)
31
+ )
32
+
33
+ class DataAccess:
34
+ def __init__(self, config: DataAccessConfig = config_from_env()) -> None:
35
+ self.con = duckdb.connect(config=config.duckdb_config)
36
+ self.con.sql(config.init_sql)
37
+ self.datasets = dict[str, nw.LazyFrame[duckdb.DuckDBPyRelation]]()
38
+ self.config = config
39
+
40
+ def register_files_as_view(self, table_name: str, *paths: str, replace: bool = False) -> None:
41
+ self.con.sql(f"CREATE {('OR REPLACE' if replace else '')} VIEW {'IF NOT EXISTS' if not replace else ''} {table_name} AS FROM read_{'parquet' if paths[0].endswith('.parquet') else 'csv'}(['{"', '".join(paths)}'], hive_partitioning=true);")
42
+
43
+ def f(self, dataset: str, *paths: str,replace: bool = False, debug: bool = False) -> nw.LazyFrame[duckdb.DuckDBPyRelation]:
44
+ if dataset not in self.datasets or replace:
45
+ if not paths:
46
+ paths = tuple(path[0] for path in self.con.sql("FROM "+self.config.glob_pattern.format(dataset=dataset,projroot=self.config.projroot)).fetchall())
47
+ if debug:
48
+ print(f"DEBUG: Found paths for dataset {dataset}: {paths}")
49
+ if not paths:
50
+ print(f"No files found for dataset {dataset} in {self.config.glob_pattern.format(dataset=dataset,projroot=self.config.projroot)}")
51
+ return cast(nw.LazyFrame[duckdb.DuckDBPyRelation], None)
52
+ self.register_files_as_view(dataset, *paths, replace=replace)
53
+ self.datasets[dataset] = nw.from_native(self.con.sql(f'FROM {dataset}'))
54
+ return self.datasets[dataset]
55
+
56
+ c = nw.col
57
+ l = nw.lit
58
+
59
+ def to_narwhals(duckdb_relation: duckdb.DuckDBPyRelation) -> nw.LazyFrame[duckdb.DuckDBPyRelation]:
60
+ return nw.from_native(duckdb_relation)
61
+
62
+ n = to_narwhals
63
+
64
+ def to_duckdb(lnf: nw.LazyFrame[duckdb.DuckDBPyRelation]) -> duckdb.DuckDBPyRelation:
65
+ return lnf.to_native()
66
+
67
+ d = to_duckdb
68
+
69
+ def to_polars(lnf: nw.LazyFrame[duckdb.DuckDBPyRelation]) -> pl.DataFrame:
70
+ return lnf.collect(backend='polars').to_native()
71
+
72
+ p = to_polars
73
+
74
+ def to_pandas(lnf: nw.LazyFrame[duckdb.DuckDBPyRelation]):
75
+ return d(lnf).df()
76
+
77
+
78
+ __all__ = [ "DataAccess", "c", "l", "to_narwhals", "n", "to_duckdb", "d", "to_polars", "p","to_pandas", "format_sql" ]