datahike-browser-tests 1.0.0

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 (324) hide show
  1. package/.circleci/config.yml +405 -0
  2. package/.circleci/scripts/gen_ci.clj +194 -0
  3. package/.cirrus.yml +60 -0
  4. package/.clj-kondo/babashka/sci/config.edn +1 -0
  5. package/.clj-kondo/babashka/sci/sci/core.clj +9 -0
  6. package/.clj-kondo/config.edn +95 -0
  7. package/.dir-locals.el +2 -0
  8. package/.github/FUNDING.yml +3 -0
  9. package/.github/ISSUE_TEMPLATE/1-bug-report.yml +68 -0
  10. package/.github/ISSUE_TEMPLATE/2-feature-request.yml +28 -0
  11. package/.github/ISSUE_TEMPLATE/config.yml +6 -0
  12. package/.github/pull_request_template.md +24 -0
  13. package/.github/workflows/native-image.yml +84 -0
  14. package/LICENSE +203 -0
  15. package/README.md +273 -0
  16. package/bb/deps.edn +9 -0
  17. package/bb/resources/github-fingerprints +3 -0
  18. package/bb/resources/native-image-tests/run-bb-pod-tests.clj +162 -0
  19. package/bb/resources/native-image-tests/run-libdatahike-tests +12 -0
  20. package/bb/resources/native-image-tests/run-native-image-tests +74 -0
  21. package/bb/resources/native-image-tests/run-python-tests +22 -0
  22. package/bb/resources/native-image-tests/testconfig.attr-refs.edn +6 -0
  23. package/bb/resources/native-image-tests/testconfig.edn +5 -0
  24. package/bb/resources/template/.settings/org.eclipse.jdt.apt.core.prefs +2 -0
  25. package/bb/resources/template/.settings/org.eclipse.jdt.core.prefs +9 -0
  26. package/bb/resources/template/.settings/org.eclipse.m2e.core.prefs +4 -0
  27. package/bb/resources/template/pom.xml +22 -0
  28. package/bb/src/tools/build.clj +132 -0
  29. package/bb/src/tools/clj_kondo.clj +32 -0
  30. package/bb/src/tools/deploy.clj +26 -0
  31. package/bb/src/tools/examples.clj +19 -0
  32. package/bb/src/tools/npm.clj +100 -0
  33. package/bb/src/tools/python.clj +14 -0
  34. package/bb/src/tools/release.clj +94 -0
  35. package/bb/src/tools/test.clj +148 -0
  36. package/bb/src/tools/version.clj +47 -0
  37. package/bb.edn +269 -0
  38. package/benchmark/src/benchmark/cli.clj +195 -0
  39. package/benchmark/src/benchmark/compare.clj +157 -0
  40. package/benchmark/src/benchmark/config.clj +316 -0
  41. package/benchmark/src/benchmark/measure.clj +187 -0
  42. package/benchmark/src/benchmark/store.clj +190 -0
  43. package/benchmark/test/benchmark/measure_test.clj +156 -0
  44. package/build.clj +30 -0
  45. package/config.edn +49 -0
  46. package/deps.edn +138 -0
  47. package/dev/sandbox.clj +82 -0
  48. package/dev/sandbox.cljs +127 -0
  49. package/dev/sandbox_benchmarks.clj +27 -0
  50. package/dev/sandbox_client.clj +87 -0
  51. package/dev/sandbox_transact_bench.clj +109 -0
  52. package/dev/user.clj +79 -0
  53. package/doc/README.md +96 -0
  54. package/doc/adl/README.md +6 -0
  55. package/doc/adl/adr-000-adr.org +28 -0
  56. package/doc/adl/adr-001-attribute-references.org +15 -0
  57. package/doc/adl/adr-002-build-tooling.org +54 -0
  58. package/doc/adl/adr-003-db-meta-data.md +52 -0
  59. package/doc/adl/adr-004-github-flow.md +40 -0
  60. package/doc/adl/adr-XYZ-template.md +30 -0
  61. package/doc/adl/index.org +3 -0
  62. package/doc/assets/datahike-logo.svg +3 -0
  63. package/doc/assets/datahiking-invoice.org +85 -0
  64. package/doc/assets/hhtree2.png +0 -0
  65. package/doc/assets/network_topology.svg +624 -0
  66. package/doc/assets/perf.png +0 -0
  67. package/doc/assets/schema_mindmap.mm +132 -0
  68. package/doc/assets/schema_mindmap.svg +970 -0
  69. package/doc/assets/temporal_index.mm +74 -0
  70. package/doc/backend-development.md +78 -0
  71. package/doc/bb-pod.md +89 -0
  72. package/doc/benchmarking.md +360 -0
  73. package/doc/bindings/edn-conversion.md +383 -0
  74. package/doc/cli.md +162 -0
  75. package/doc/cljdoc.edn +27 -0
  76. package/doc/cljs-support.md +133 -0
  77. package/doc/config.md +406 -0
  78. package/doc/contributing.md +114 -0
  79. package/doc/datalog-vs-sql.md +210 -0
  80. package/doc/datomic_differences.md +109 -0
  81. package/doc/development/pull-api-ns.md +186 -0
  82. package/doc/development/pull-frame-state-diagram.jpg +0 -0
  83. package/doc/distributed.md +566 -0
  84. package/doc/entity_spec.md +92 -0
  85. package/doc/gc.md +273 -0
  86. package/doc/java-api.md +808 -0
  87. package/doc/javascript-api.md +421 -0
  88. package/doc/libdatahike.md +86 -0
  89. package/doc/logging_and_error_handling.md +43 -0
  90. package/doc/norms.md +66 -0
  91. package/doc/schema-migration.md +85 -0
  92. package/doc/schema.md +287 -0
  93. package/doc/storage-backends.md +363 -0
  94. package/doc/store-id-refactoring.md +596 -0
  95. package/doc/time_variance.md +325 -0
  96. package/doc/unstructured.md +167 -0
  97. package/doc/versioning.md +261 -0
  98. package/examples/basic/README.md +19 -0
  99. package/examples/basic/deps.edn +6 -0
  100. package/examples/basic/docker-compose.yml +13 -0
  101. package/examples/basic/src/examples/core.clj +60 -0
  102. package/examples/basic/src/examples/schema.clj +155 -0
  103. package/examples/basic/src/examples/store.clj +60 -0
  104. package/examples/basic/src/examples/time_travel.clj +185 -0
  105. package/examples/java/.settings/org.eclipse.core.resources.prefs +3 -0
  106. package/examples/java/.settings/org.eclipse.jdt.apt.core.prefs +2 -0
  107. package/examples/java/.settings/org.eclipse.jdt.core.prefs +9 -0
  108. package/examples/java/.settings/org.eclipse.m2e.core.prefs +4 -0
  109. package/examples/java/README.md +162 -0
  110. package/examples/java/pom.xml +62 -0
  111. package/examples/java/src/main/java/examples/QuickStart.java +115 -0
  112. package/examples/java/src/main/java/examples/SchemaExample.java +148 -0
  113. package/examples/java/src/main/java/examples/TimeTravelExample.java +121 -0
  114. package/flake.lock +27 -0
  115. package/flake.nix +27 -0
  116. package/http-server/datahike/http/middleware.clj +75 -0
  117. package/http-server/datahike/http/server.clj +269 -0
  118. package/java/src/datahike/java/Database.java +274 -0
  119. package/java/src/datahike/java/Datahike.java +281 -0
  120. package/java/src/datahike/java/DatahikeGeneratedTest.java +349 -0
  121. package/java/src/datahike/java/DatahikeTest.java +370 -0
  122. package/java/src/datahike/java/EDN.java +170 -0
  123. package/java/src/datahike/java/IEntity.java +11 -0
  124. package/java/src/datahike/java/Keywords.java +161 -0
  125. package/java/src/datahike/java/SchemaFlexibility.java +52 -0
  126. package/java/src/datahike/java/Util.java +219 -0
  127. package/karma.conf.js +19 -0
  128. package/libdatahike/compile-cpp +7 -0
  129. package/libdatahike/src/datahike/impl/LibDatahikeBase.java +203 -0
  130. package/libdatahike/src/datahike/impl/libdatahike.clj +59 -0
  131. package/libdatahike/src/test_cpp.cpp +61 -0
  132. package/npm-package/PUBLISHING.md +140 -0
  133. package/npm-package/README.md +226 -0
  134. package/npm-package/package.template.json +34 -0
  135. package/npm-package/test-isomorphic.ts +281 -0
  136. package/npm-package/test.js +557 -0
  137. package/npm-package/typescript-test.ts +70 -0
  138. package/package.json +16 -0
  139. package/pydatahike/README.md +569 -0
  140. package/pydatahike/pyproject.toml +91 -0
  141. package/pydatahike/setup.py +42 -0
  142. package/pydatahike/src/datahike/__init__.py +134 -0
  143. package/pydatahike/src/datahike/_native.py +250 -0
  144. package/pydatahike/src/datahike/_version.py +2 -0
  145. package/pydatahike/src/datahike/database.py +722 -0
  146. package/pydatahike/src/datahike/edn.py +311 -0
  147. package/pydatahike/src/datahike/py.typed +0 -0
  148. package/pydatahike/tests/conftest.py +17 -0
  149. package/pydatahike/tests/test_basic.py +170 -0
  150. package/pydatahike/tests/test_database.py +51 -0
  151. package/pydatahike/tests/test_edn_conversion.py +299 -0
  152. package/pydatahike/tests/test_query.py +99 -0
  153. package/pydatahike/tests/test_schema.py +55 -0
  154. package/resources/clj-kondo.exports/io.replikativ/datahike/config.edn +5 -0
  155. package/resources/example_server.edn +4 -0
  156. package/shadow-cljs.edn +56 -0
  157. package/src/data_readers.clj +7 -0
  158. package/src/datahike/api/impl.cljc +176 -0
  159. package/src/datahike/api/specification.cljc +633 -0
  160. package/src/datahike/api/types.cljc +261 -0
  161. package/src/datahike/api.cljc +41 -0
  162. package/src/datahike/array.cljc +99 -0
  163. package/src/datahike/cli.clj +166 -0
  164. package/src/datahike/cljs.cljs +6 -0
  165. package/src/datahike/codegen/cli.clj +406 -0
  166. package/src/datahike/codegen/clj_kondo.clj +291 -0
  167. package/src/datahike/codegen/java.clj +403 -0
  168. package/src/datahike/codegen/naming.cljc +33 -0
  169. package/src/datahike/codegen/native.clj +559 -0
  170. package/src/datahike/codegen/pod.clj +488 -0
  171. package/src/datahike/codegen/python.clj +838 -0
  172. package/src/datahike/codegen/report.clj +55 -0
  173. package/src/datahike/codegen/typescript.clj +262 -0
  174. package/src/datahike/codegen/validation.clj +145 -0
  175. package/src/datahike/config.cljc +294 -0
  176. package/src/datahike/connections.cljc +16 -0
  177. package/src/datahike/connector.cljc +265 -0
  178. package/src/datahike/constants.cljc +142 -0
  179. package/src/datahike/core.cljc +297 -0
  180. package/src/datahike/datom.cljc +459 -0
  181. package/src/datahike/db/interface.cljc +119 -0
  182. package/src/datahike/db/search.cljc +305 -0
  183. package/src/datahike/db/transaction.cljc +937 -0
  184. package/src/datahike/db/utils.cljc +338 -0
  185. package/src/datahike/db.cljc +956 -0
  186. package/src/datahike/experimental/unstructured.cljc +126 -0
  187. package/src/datahike/experimental/versioning.cljc +172 -0
  188. package/src/datahike/externs.js +31 -0
  189. package/src/datahike/gc.cljc +69 -0
  190. package/src/datahike/http/client.clj +188 -0
  191. package/src/datahike/http/writer.clj +79 -0
  192. package/src/datahike/impl/entity.cljc +218 -0
  193. package/src/datahike/index/interface.cljc +93 -0
  194. package/src/datahike/index/persistent_set.cljc +469 -0
  195. package/src/datahike/index/utils.cljc +44 -0
  196. package/src/datahike/index.cljc +32 -0
  197. package/src/datahike/js/api.cljs +172 -0
  198. package/src/datahike/js/api_macros.clj +22 -0
  199. package/src/datahike/js.cljs +163 -0
  200. package/src/datahike/json.cljc +209 -0
  201. package/src/datahike/lru.cljc +146 -0
  202. package/src/datahike/migrate.clj +39 -0
  203. package/src/datahike/norm/norm.clj +245 -0
  204. package/src/datahike/online_gc.cljc +252 -0
  205. package/src/datahike/pod.clj +155 -0
  206. package/src/datahike/pull_api.cljc +325 -0
  207. package/src/datahike/query.cljc +1945 -0
  208. package/src/datahike/query_stats.cljc +88 -0
  209. package/src/datahike/readers.cljc +62 -0
  210. package/src/datahike/remote.cljc +218 -0
  211. package/src/datahike/schema.cljc +228 -0
  212. package/src/datahike/schema_cache.cljc +42 -0
  213. package/src/datahike/spec.cljc +101 -0
  214. package/src/datahike/store.cljc +80 -0
  215. package/src/datahike/tools.cljc +308 -0
  216. package/src/datahike/transit.cljc +80 -0
  217. package/src/datahike/writer.cljc +239 -0
  218. package/src/datahike/writing.cljc +362 -0
  219. package/src/deps.cljs +1 -0
  220. package/src-hitchhiker-tree/datahike/index/hitchhiker_tree/insert.cljc +76 -0
  221. package/src-hitchhiker-tree/datahike/index/hitchhiker_tree/upsert.cljc +128 -0
  222. package/src-hitchhiker-tree/datahike/index/hitchhiker_tree.cljc +213 -0
  223. package/test/datahike/backward_compatibility_test/src/backward_test.clj +37 -0
  224. package/test/datahike/integration_test/config_record_file_test.clj +14 -0
  225. package/test/datahike/integration_test/config_record_test.clj +14 -0
  226. package/test/datahike/integration_test/depr_config_uri_test.clj +15 -0
  227. package/test/datahike/integration_test/return_map_test.clj +62 -0
  228. package/test/datahike/integration_test.cljc +67 -0
  229. package/test/datahike/norm/norm_test.clj +124 -0
  230. package/test/datahike/norm/resources/naming-and-sorting-test/001-a1-example.edn +5 -0
  231. package/test/datahike/norm/resources/naming-and-sorting-test/002-a2-example.edn +5 -0
  232. package/test/datahike/norm/resources/naming-and-sorting-test/003-tx-fn-test.edn +1 -0
  233. package/test/datahike/norm/resources/naming-and-sorting-test/004-tx-data-and-tx-fn-test.edn +5 -0
  234. package/test/datahike/norm/resources/naming-and-sorting-test/01-transact-basic-characters.edn +2 -0
  235. package/test/datahike/norm/resources/naming-and-sorting-test/02 add occupation.edn +5 -0
  236. package/test/datahike/norm/resources/naming-and-sorting-test/checksums.edn +12 -0
  237. package/test/datahike/norm/resources/simple-test/001-a1-example.edn +5 -0
  238. package/test/datahike/norm/resources/simple-test/002-a2-example.edn +5 -0
  239. package/test/datahike/norm/resources/simple-test/checksums.edn +4 -0
  240. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/001-a1-example.edn +5 -0
  241. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/002-a2-example.edn +5 -0
  242. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/003-tx-fn-test.edn +1 -0
  243. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/first/checksums.edn +6 -0
  244. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/second/004-tx-data-and-tx-fn-test.edn +5 -0
  245. package/test/datahike/norm/resources/tx-data-and-tx-fn-test/second/checksums.edn +2 -0
  246. package/test/datahike/norm/resources/tx-fn-test/first/001-a1-example.edn +5 -0
  247. package/test/datahike/norm/resources/tx-fn-test/first/002-a2-example.edn +5 -0
  248. package/test/datahike/norm/resources/tx-fn-test/first/checksums.edn +4 -0
  249. package/test/datahike/norm/resources/tx-fn-test/second/003-tx-fn-test.edn +1 -0
  250. package/test/datahike/norm/resources/tx-fn-test/second/checksums.edn +2 -0
  251. package/test/datahike/test/api_test.cljc +895 -0
  252. package/test/datahike/test/array_test.cljc +40 -0
  253. package/test/datahike/test/attribute_refs/datoms_test.cljc +140 -0
  254. package/test/datahike/test/attribute_refs/db_test.cljc +42 -0
  255. package/test/datahike/test/attribute_refs/differences_test.cljc +515 -0
  256. package/test/datahike/test/attribute_refs/entity_test.cljc +89 -0
  257. package/test/datahike/test/attribute_refs/pull_api_test.cljc +320 -0
  258. package/test/datahike/test/attribute_refs/query_find_specs_test.cljc +59 -0
  259. package/test/datahike/test/attribute_refs/query_fns_test.cljc +130 -0
  260. package/test/datahike/test/attribute_refs/query_interop_test.cljc +47 -0
  261. package/test/datahike/test/attribute_refs/query_not_test.cljc +193 -0
  262. package/test/datahike/test/attribute_refs/query_or_test.cljc +137 -0
  263. package/test/datahike/test/attribute_refs/query_pull_test.cljc +156 -0
  264. package/test/datahike/test/attribute_refs/query_rules_test.cljc +176 -0
  265. package/test/datahike/test/attribute_refs/query_test.cljc +241 -0
  266. package/test/datahike/test/attribute_refs/temporal_search.cljc +22 -0
  267. package/test/datahike/test/attribute_refs/transact_test.cljc +220 -0
  268. package/test/datahike/test/attribute_refs/utils.cljc +128 -0
  269. package/test/datahike/test/cache_test.cljc +38 -0
  270. package/test/datahike/test/components_test.cljc +92 -0
  271. package/test/datahike/test/config_test.cljc +158 -0
  272. package/test/datahike/test/core_test.cljc +105 -0
  273. package/test/datahike/test/datom_test.cljc +44 -0
  274. package/test/datahike/test/db_test.cljc +54 -0
  275. package/test/datahike/test/entity_spec_test.cljc +159 -0
  276. package/test/datahike/test/entity_test.cljc +103 -0
  277. package/test/datahike/test/explode_test.cljc +143 -0
  278. package/test/datahike/test/filter_test.cljc +75 -0
  279. package/test/datahike/test/gc_test.cljc +159 -0
  280. package/test/datahike/test/http/server_test.clj +192 -0
  281. package/test/datahike/test/http/writer_test.clj +86 -0
  282. package/test/datahike/test/ident_test.cljc +32 -0
  283. package/test/datahike/test/index_test.cljc +345 -0
  284. package/test/datahike/test/insert.cljc +125 -0
  285. package/test/datahike/test/java_bindings_test.clj +6 -0
  286. package/test/datahike/test/listen_test.cljc +41 -0
  287. package/test/datahike/test/lookup_refs_test.cljc +266 -0
  288. package/test/datahike/test/lru_test.cljc +27 -0
  289. package/test/datahike/test/migrate_test.clj +297 -0
  290. package/test/datahike/test/model/core.cljc +376 -0
  291. package/test/datahike/test/model/invariant.cljc +142 -0
  292. package/test/datahike/test/model/rng.cljc +82 -0
  293. package/test/datahike/test/model_test.clj +217 -0
  294. package/test/datahike/test/nodejs_test.cljs +262 -0
  295. package/test/datahike/test/online_gc_test.cljc +475 -0
  296. package/test/datahike/test/pod_test.clj +369 -0
  297. package/test/datahike/test/pull_api_test.cljc +474 -0
  298. package/test/datahike/test/purge_test.cljc +144 -0
  299. package/test/datahike/test/query_aggregates_test.cljc +101 -0
  300. package/test/datahike/test/query_find_specs_test.cljc +52 -0
  301. package/test/datahike/test/query_fns_test.cljc +523 -0
  302. package/test/datahike/test/query_interop_test.cljc +47 -0
  303. package/test/datahike/test/query_not_test.cljc +189 -0
  304. package/test/datahike/test/query_or_test.cljc +158 -0
  305. package/test/datahike/test/query_pull_test.cljc +147 -0
  306. package/test/datahike/test/query_rules_test.cljc +248 -0
  307. package/test/datahike/test/query_stats_test.cljc +218 -0
  308. package/test/datahike/test/query_test.cljc +984 -0
  309. package/test/datahike/test/schema_test.cljc +424 -0
  310. package/test/datahike/test/specification_test.cljc +30 -0
  311. package/test/datahike/test/store_test.cljc +78 -0
  312. package/test/datahike/test/stress_test.cljc +57 -0
  313. package/test/datahike/test/time_variance_test.cljc +518 -0
  314. package/test/datahike/test/tools_test.clj +134 -0
  315. package/test/datahike/test/transact_test.cljc +518 -0
  316. package/test/datahike/test/tuples_test.cljc +564 -0
  317. package/test/datahike/test/unstructured_test.cljc +291 -0
  318. package/test/datahike/test/upsert_impl_test.cljc +205 -0
  319. package/test/datahike/test/upsert_test.cljc +363 -0
  320. package/test/datahike/test/utils.cljc +110 -0
  321. package/test/datahike/test/validation_test.cljc +48 -0
  322. package/test/datahike/test/versioning_test.cljc +56 -0
  323. package/test/datahike/test.cljc +66 -0
  324. package/tests.edn +24 -0
@@ -0,0 +1,132 @@
1
+ (ns tools.build
2
+ (:refer-clojure :exclude [compile])
3
+ (:require
4
+ [babashka.fs :as fs]
5
+ [babashka.process :as p]
6
+ [cheshire.core :as json]
7
+ [clojure.string :as str]
8
+ [clojure.tools.build.api :as b]
9
+ [selmer.parser :refer [render]]
10
+ [tools.version :as version :refer [read-edn-file]]))
11
+
12
+ (defn clean [{:keys [target-dir] :as _project-config}]
13
+ (print (str "Cleaning up target directory '" target-dir "'..."))
14
+ (fs/delete-tree target-dir)
15
+ (println "Done."))
16
+
17
+ (defn basis [{:keys [deps-file aliases] :as _project-config}]
18
+ (b/create-basis (cond-> {:project deps-file}
19
+ aliases (assoc :aliases aliases))))
20
+
21
+ (defn write-version-resource
22
+ "Writes version string to resources/DATAHIKE_VERSION for embedding in builds"
23
+ [repo-config]
24
+ (print "Writing version resource file...")
25
+ (fs/create-dirs "resources")
26
+ (spit "resources/DATAHIKE_VERSION" (version/string repo-config))
27
+ (println "Done. Version:" (version/string repo-config)))
28
+
29
+ (defn compile-java
30
+ ([] (compile-java (read-edn-file "config.edn")))
31
+ ([{:keys [class-dir java-src-dirs] :as project-config}]
32
+ (print (str "Compiling Java classes saving them to '" class-dir "'..."))
33
+ (b/javac {:src-dirs java-src-dirs
34
+ :class-dir class-dir
35
+ :basis (basis project-config)
36
+ :javac-opts ["--release" "8"
37
+ "-Xlint:deprecation"]})
38
+ (println "Done.")))
39
+
40
+ (defn compile-clojure [{:keys [class-dir src-dirs] :as project-config}]
41
+ (print (str "Compiling Clojure namespaces saving them to '" class-dir "'..."))
42
+ (b/compile-clj {:src-dirs src-dirs
43
+ :class-dir class-dir
44
+ :basis (basis project-config)})
45
+ (println "Done."))
46
+
47
+ (defn pom-path [{:keys [class-dir lib] :as _project-config}]
48
+ (b/pom-path {:lib lib
49
+ :class-dir class-dir}))
50
+
51
+ (defn pom [{:keys [pom-template scm] :as repo-config}
52
+ {:keys [class-dir lib src-dirs] :as project-config}]
53
+ (print (str "Creating pom file from template at '" pom-template "'..."))
54
+ (b/write-pom {:src-pom pom-template
55
+ :src-dirs src-dirs
56
+ :class-dir class-dir
57
+ :lib lib
58
+ :version (version/string repo-config)
59
+ :basis (basis project-config)
60
+ :scm (assoc scm :tag (version/sha))})
61
+ (println "Done." "Saved to" (pom-path project-config)))
62
+
63
+ (defn jar-path [repo-config {:keys [target-dir jar-pattern] :as project-config}]
64
+ (str target-dir "/" (render jar-pattern {:project project-config
65
+ :repo repo-config
66
+ :version-str (version/string repo-config)})))
67
+
68
+ (defn lib-path [repo-config {:keys [target-dir jar-pattern] :as project-config}]
69
+ (str target-dir "/" (render jar-pattern {:project project-config
70
+ :repo repo-config
71
+ :version-str (version/string repo-config)})))
72
+
73
+ (defn jar
74
+ "Builds jar file"
75
+ [repo-config {:keys [class-dir target-dir src-dirs resource-dir] :as project-config}]
76
+ (print (str "Packaging jar at '" target-dir "'..."))
77
+ (b/copy-dir {:src-dirs (filter identity (conj src-dirs resource-dir))
78
+ :target-dir class-dir})
79
+ (b/jar {:class-dir class-dir
80
+ :jar-file (jar-path repo-config project-config)})
81
+ (println "Done."))
82
+
83
+ (defn uber
84
+ "Builds uber jar file"
85
+ [repo-config {:keys [class-dir target-dir src-dirs resource-dir main] :as project-config}]
86
+ (print (str "Packaging uber jar at '" target-dir "'..."))
87
+ (b/copy-dir {:src-dirs (filter identity (conj src-dirs resource-dir))
88
+ :target-dir class-dir})
89
+ (b/uber {:class-dir class-dir
90
+ :uber-file (jar-path repo-config project-config)
91
+ :basis (basis project-config)
92
+ :main main})
93
+ (println "Done."))
94
+
95
+ (defn native-compile [repo-config {:keys [project-target-dir class-path project-name java-interface] :as project-config}]
96
+ (if-let [graalvm-dir (System/getenv "GRAALVM_HOME")]
97
+ (let [native-jar (jar-path repo-config project-config)
98
+ svm-jar (str graalvm-dir "/lib/svm/builder/svm.jar")
99
+ java-base-file (str/replace java-interface #"LibDatahike\.java$" "LibDatahikeBase.java")]
100
+ (println "Compiling native bindings Java classes.")
101
+ (p/shell (str graalvm-dir "/bin/javac")
102
+ "-cp" (str native-jar ":" svm-jar)
103
+ "-d" class-path
104
+ java-base-file java-interface)
105
+ (println "Compiling shared library through native image.")
106
+ (p/shell (str graalvm-dir "/bin/native-image")
107
+ "-jar" native-jar
108
+ "-cp" class-path
109
+ (str "-o " project-name)
110
+ "--shared"
111
+ "-H:+ReportExceptionStackTraces"
112
+ "-H:+GenerateBuildArtifactsFile"
113
+ "-J-Dclojure.spec.skip-macros=true"
114
+ "-J-Dclojure.compiler.direct-linking=true"
115
+ (str "-H:IncludeResources=" (version/string repo-config))
116
+ "--initialize-at-build-time"
117
+ "-H:Log=registerResource:"
118
+ "--verbose"
119
+ "--no-fallback"
120
+ "--no-server"
121
+ "-J-Xmx5g")
122
+ (fs/delete-tree project-target-dir)
123
+ (fs/create-dir project-target-dir)
124
+ (->> (slurp "build-artifacts.json")
125
+ (json/parse-string)
126
+ vals
127
+ (apply concat)
128
+ (cons "build-artifacts.json")
129
+ (run! #(fs/move % project-target-dir))))
130
+ (do (println "GRAALVM_HOME not set!")
131
+ (println "Please set GRAALVM_HOME to the root of the graalvm directory on your system.")
132
+ (System/exit 1))))
@@ -0,0 +1,32 @@
1
+ (ns tools.clj-kondo
2
+ "Generate clj-kondo export configuration for dynamically generated API."
3
+ (:require [babashka.process :as p]))
4
+
5
+ (defn generate-clj-kondo-config!
6
+ "Generate clj-kondo configuration from api-specification.
7
+
8
+ This:
9
+ 1. Generates export config at resources/clj-kondo.exports/io.replikativ/datahike/config.edn
10
+ (packaged in jar, auto-imported by consuming projects)
11
+ 2. Copies to .clj-kondo/datahike/datahike/config.edn
12
+ (for local development via :config-paths)
13
+ 3. Updates main config at .clj-kondo/config.edn with type-mismatch linter
14
+ (for Datahike's own project)
15
+
16
+ This allows clj-kondo to understand the dynamically expanded API functions
17
+ from the emit-api macro, providing IDE autocomplete, signature hints, and
18
+ type checking."
19
+ [export-path local-path main-path]
20
+ (println "Generating clj-kondo configuration...")
21
+ (let [clj-code (str "(require '[datahike.codegen.clj-kondo :as clj-kondo]) "
22
+ "(clj-kondo/write-config! \"" export-path "\") "
23
+ "(clj-kondo/copy-export-to-local! \"" export-path "\" \"" local-path "\") "
24
+ "(clj-kondo/update-main-config! \"" main-path "\")")
25
+ result (p/shell {:out :string
26
+ :err :string}
27
+ "clojure" "-M" "-e" clj-code)]
28
+ (when-not (zero? (:exit result))
29
+ (println "Error generating clj-kondo config:")
30
+ (println (:err result))
31
+ (throw (ex-info "clj-kondo config generation failed" result)))
32
+ (println (:out result))))
@@ -0,0 +1,26 @@
1
+ (ns tools.deploy
2
+ (:require [babashka.process :refer [shell]]
3
+ [tools.build :refer [pom-path jar-path]]))
4
+
5
+ (defn clj [& args] (apply shell "clojure" args))
6
+ (defn quoted [s] (str \" s \"))
7
+
8
+ (defn remote
9
+ "Deploy library to clojars"
10
+ [repo-config project-config]
11
+ (if-not (System/getenv "CLOJARS_USERNAME")
12
+ (println "Environment variable CLOJARS_USERNAME not set!")
13
+ (if-not (System/getenv "CLOJARS_PASSWORD")
14
+ (println "Environment variable CLOJARS_PASSWORD not set!")
15
+ (clj "-X:deploy" "deps-deploy.deps-deploy/deploy"
16
+ :installer :remote
17
+ :artifact (jar-path repo-config project-config)
18
+ :pom-file (quoted (pom-path project-config))))))
19
+
20
+ (defn local
21
+ "Install library locally"
22
+ [repo-config project-config]
23
+ (clj "-X:deploy" "deps-deploy.deps-deploy/deploy"
24
+ :installer :local
25
+ :artifact (jar-path repo-config project-config)
26
+ :pom-file (quoted (pom-path project-config))))
@@ -0,0 +1,19 @@
1
+ (ns tools.examples
2
+ "Tools for managing example projects"
3
+ (:require [clojure.string :as str]
4
+ [tools.version :as version]))
5
+
6
+ (defn update-java-examples-version!
7
+ "Update the datahike.version property in examples/java/pom.xml to match current version"
8
+ [config]
9
+ (let [pom-file "examples/java/pom.xml"
10
+ current-version (version/string config)
11
+ pom-content (slurp pom-file)
12
+ updated-content (str/replace
13
+ pom-content
14
+ #"<datahike\.version>[^<]+</datahike\.version>"
15
+ (str "<datahike.version>" current-version "</datahike.version>"))]
16
+ (when (not= pom-content updated-content)
17
+ (println (str "Updating examples/java/pom.xml datahike.version to " current-version))
18
+ (spit pom-file updated-content)
19
+ true)))
@@ -0,0 +1,100 @@
1
+ (ns tools.npm
2
+ "Build and version management for npm package."
3
+ (:require [babashka.fs :as fs]
4
+ [babashka.process :as p]
5
+ [cheshire.core :as json]
6
+ [clojure.string :as str]
7
+ [tools.version :as version]))
8
+
9
+ (defn clean-npm-package!
10
+ "Remove compiled JS files from npm package directory (both Node and browser builds)"
11
+ [npm-package-path]
12
+ (println "Cleaning npm package directory...")
13
+ (let [js-files (fs/glob npm-package-path "*.js")
14
+ js-map-files (fs/glob npm-package-path "*.js.map")
15
+ all-files (concat js-files js-map-files)
16
+ files-to-keep #{"test.js" "test-final.js" "test-config-keys.js" "test-key-duplication.js"}
17
+ files-to-delete (remove #(contains? files-to-keep (str (fs/file-name %))) all-files)]
18
+ (doseq [file files-to-delete]
19
+ (fs/delete file))
20
+ (println (str "Removed " (count files-to-delete) " compiled files from " npm-package-path))
21
+ (when (fs/exists? (str npm-package-path "/browser"))
22
+ (fs/delete-tree (str npm-package-path "/browser"))
23
+ (println "Removed browser build directory"))))
24
+
25
+ (defn update-package-json-version!
26
+ "Generate npm package.json from template with version from config.edn"
27
+ [config npm-package-path]
28
+ (let [version-str (version/string config)
29
+ package-json-path (str npm-package-path "/package.json")
30
+ template-path (str npm-package-path "/package.template.json")
31
+ template-content (slurp template-path)
32
+ generated-content (str/replace template-content "{{VERSION}}" version-str)]
33
+ (spit package-json-path generated-content)
34
+ (println (str "Generated " package-json-path " from template with version: " version-str))))
35
+
36
+ (defn generate-typescript-definitions!
37
+ "Generate TypeScript definitions for npm package"
38
+ [output-path]
39
+ (println "Generating TypeScript definitions...")
40
+ (let [clj-code (str "(require '[datahike.codegen.typescript :as ts]) "
41
+ "(ts/write-type-definitions! \"" output-path "\")")
42
+ result (p/shell {:out :string
43
+ :err :string}
44
+ "clojure" "-M" "-e" clj-code)]
45
+ (when-not (zero? (:exit result))
46
+ (println "Error generating TypeScript definitions:")
47
+ (println (:err result))
48
+ (throw (ex-info "TypeScript generation failed" result)))
49
+ (println (str "TypeScript definitions written to: " output-path))))
50
+
51
+ (defn build-npm-package!
52
+ "Build npm package: clean, update version, generate types, compile ClojureScript for Node and Browser"
53
+ [config npm-package-path]
54
+ (println "Building npm package...")
55
+ (println "")
56
+
57
+ (println "Step 1/6: Cleaning old compiled files")
58
+ (clean-npm-package! npm-package-path)
59
+ (println "")
60
+
61
+ (println "Step 2/6: Updating package.json version")
62
+ (update-package-json-version! config npm-package-path)
63
+ (println "")
64
+
65
+ (println "Step 3/6: Generating TypeScript definitions")
66
+ (generate-typescript-definitions! (str npm-package-path "/index.d.ts"))
67
+ (println "")
68
+
69
+ (println "Step 4/6: Compiling Node.js build with shadow-cljs")
70
+ (let [result (p/shell {:out :inherit
71
+ :err :inherit}
72
+ "npx shadow-cljs compile npm-release")]
73
+ (when-not (zero? (:exit result))
74
+ (throw (ex-info "Shadow-cljs Node.js compilation failed" result)))
75
+ (println ""))
76
+
77
+ (println "Step 5/6: Compiling Browser build with shadow-cljs")
78
+ (let [result (p/shell {:out :inherit
79
+ :err :inherit}
80
+ "npx shadow-cljs compile browser-release")]
81
+ (when-not (zero? (:exit result))
82
+ (throw (ex-info "Shadow-cljs browser compilation failed" result)))
83
+ (println ""))
84
+
85
+ (println "Step 6/6: Running npm package tests")
86
+ (let [test-result (p/shell {:dir npm-package-path
87
+ :out :inherit
88
+ :err :inherit}
89
+ "node test.js")]
90
+ (when-not (zero? (:exit test-result))
91
+ (throw (ex-info "npm package tests failed" test-result)))
92
+ (println "")
93
+ (println "✓ npm package build complete!")
94
+ (println (str " Version: " (version/string config)))
95
+ (println (str " Node.js: " npm-package-path "/datahike.js.api.js"))
96
+ (println (str " Browser: " npm-package-path "/browser/main.js"))
97
+ (println "")
98
+ (println "Next steps:")
99
+ (println (str " 1. Verify: cd " npm-package-path " && npm pack --dry-run"))
100
+ (println " 2. Publish: npm publish")))
@@ -0,0 +1,14 @@
1
+ (ns tools.python
2
+ "Python package utilities."
3
+ (:require [clojure.string :as str]
4
+ [tools.version :as version]))
5
+
6
+ (defn update-python-version!
7
+ "Generate Python version file from config.edn"
8
+ [config python-package-path]
9
+ (let [version-str (version/string config)
10
+ version-file-path (str python-package-path "/src/datahike/_version.py")
11
+ content (str "\"\"\"Auto-generated version file from config.edn.\"\"\"\n"
12
+ "__version__ = \"" version-str "\"\n")]
13
+ (spit version-file-path content)
14
+ (println (str "Generated " version-file-path " with version: " version-str))))
@@ -0,0 +1,94 @@
1
+ (ns tools.release
2
+ (:require
3
+ [babashka.fs :as fs]
4
+ [borkdude.gh-release-artifact :as gh]
5
+ [selmer.parser :refer [render]]
6
+ [tools.build :as build]
7
+ [tools.version :as version])
8
+ (:import
9
+ [clojure.lang ExceptionInfo]))
10
+
11
+ (defn fib [a b]
12
+ (lazy-seq (cons a (fib b (+ a b)))))
13
+
14
+ (defn retry-with-fib-backoff [retries exec-fn fail-test-fn]
15
+ (loop [idle-times (take retries (fib 1 2))]
16
+ (let [result (exec-fn)]
17
+ (if (fail-test-fn result)
18
+ (do (println "Returned: " result)
19
+ (if-let [sleep-ms (first idle-times)]
20
+ (do (println "Retrying with remaining back-off times (in s): " idle-times)
21
+ (Thread/sleep (* 1000 sleep-ms))
22
+ (recur (rest idle-times)))
23
+ result))
24
+ result))))
25
+
26
+ (defn try-release [file repo-config]
27
+ (try (gh/release-artifact
28
+ {:org (:org repo-config)
29
+ :repo (:lib repo-config)
30
+ :tag (version/string repo-config)
31
+ :commit (version/current-commit)
32
+ :file file
33
+ :content-type "application/java-archive"
34
+ :draft false})
35
+ (catch ExceptionInfo e
36
+ (assoc (ex-data e) :failure? true))))
37
+
38
+ (defn gh-release
39
+ "Create a GitHub release and upload the library jar"
40
+ [repo-config file]
41
+ (println "Trying to release artifact" file "...")
42
+ (let [_ (when-not (fs/exists? file)
43
+ (println "Release file at" file "doesn't exist!")
44
+ (System/exit 1))
45
+ ret (retry-with-fib-backoff 10 #(try-release file repo-config) :failure?)]
46
+ (if (:failure? ret)
47
+ (do (println "GitHub release failed!")
48
+ (System/exit 1))
49
+ (println (:url ret)))))
50
+
51
+ (defn zip-path [lib version target-dir zip-pattern]
52
+ (let [platform (System/getenv "DTHK_PLATFORM")
53
+ arch (System/getenv "DTHK_ARCH")]
54
+ (if-not (and platform arch)
55
+ (do (println "ERROR: Environment variables DTHK_PLATFORM and DTHK_ARCH need to be set")
56
+ (System/exit 1))
57
+ (str target-dir "/" (render zip-pattern {:platform platform
58
+ :arch arch
59
+ :lib lib
60
+ :version version})))))
61
+
62
+ (defn zip-lib [config project]
63
+ (let [{:keys [target-dir zip-pattern]} (-> config :release project) lib "libdatahike"
64
+ version (version/string config)]
65
+ (if-not (fs/exists? target-dir)
66
+ (do (println (str "ERROR: " target-dir " path not found, please compile first."))
67
+ (System/exit 1))
68
+ (let [zip-name (zip-path lib version "." zip-pattern)]
69
+ (fs/zip zip-name [target-dir])
70
+ zip-name))))
71
+
72
+ (defn zip-cli [config project]
73
+ (let [{:keys [target-dir binary-name zip-pattern]} (-> config :release project)
74
+ lib (:lib config)
75
+ version (version/string config)
76
+ binary-path (str target-dir "/" binary-name)]
77
+ (if-not (fs/exists? binary-path)
78
+ (do (println (str "ERROR: " binary-path " executable not found, please compile first."))
79
+ (System/exit 1))
80
+ (let [zip-name (zip-path lib version target-dir zip-pattern)]
81
+ (fs/zip zip-name [binary-name])
82
+ zip-name))))
83
+
84
+ (defn -main [config args]
85
+ (let [cmd (first args)]
86
+ (case cmd
87
+ "jar" (->> (build/jar-path config (-> config :build :clj))
88
+ (gh-release config))
89
+ "native-image" (->> (zip-cli config :native-cli)
90
+ (gh-release config))
91
+ "libdatahike" (->> (zip-lib config :libdatahike)
92
+ (gh-release config))
93
+ (do (println "ERROR: Command not found: " cmd)
94
+ (System/exit 1)))))
@@ -0,0 +1,148 @@
1
+ (ns tools.test
2
+ (:refer-clojure :exclude [test])
3
+ (:require [babashka.fs :as fs]
4
+ [babashka.process :as p]
5
+ [clojure.java.io :as io]
6
+ [tools.build :as build]))
7
+
8
+ (defn clj [opts & args] (apply p/shell opts "clojure" args))
9
+ (defn git [opts & args] (apply p/shell opts "git" args))
10
+
11
+ (defn kaocha [& args]
12
+ (apply clj {:extra-env {"TIMBRE_LEVEL" ":warn"}}
13
+ "-M:test" "-m" "kaocha.runner" args))
14
+
15
+ (defn back-compat [config]
16
+ (println "Testing backwards compatibility")
17
+ (let [old-version-dir "datahike-old"
18
+ ssh-dir (fs/expand-home "~/.ssh")
19
+ known-hosts-file (fs/expand-home "~/.ssh/known_hosts")]
20
+ (println "WRITING TEST DATA TO TEST-DB")
21
+ (when-not (fs/exists? ssh-dir)
22
+ (fs/create-dirs ssh-dir))
23
+ (fs/delete-on-exit old-version-dir)
24
+ (let [output (:out (p/shell {:out :string}
25
+ "ssh-keyscan" "github.com"))]
26
+ (when-not (fs/exists? known-hosts-file)
27
+ (fs/create-file known-hosts-file))
28
+ (fs/write-lines known-hosts-file [output] {:append true}))
29
+ (fs/delete-tree old-version-dir)
30
+ (git {:dir "."}
31
+ "clone" "--depth" "1" (:git-url config) old-version-dir)
32
+
33
+ ;; Generate Java API bindings before compiling
34
+ (println "Generating Java API for old version...")
35
+ (let [old-dir old-version-dir
36
+ cp (:out (p/shell {:out :string :dir old-dir}
37
+ "clojure" "-Spath"))]
38
+ ;; First compile Java dependencies
39
+ (println "Compiling Java dependencies...")
40
+ (p/shell {:dir old-dir}
41
+ "javac" "-cp" cp "-d" "target/classes"
42
+ "java/src/datahike/java/IEntity.java"
43
+ "java/src/datahike/java/Util.java")
44
+ ;; Generate DatahikeGenerated.java
45
+ (println "Generating DatahikeGenerated.java...")
46
+ (p/shell {:dir old-dir}
47
+ "clojure" "-M" "-m" "datahike.codegen.java" "java/src-generated"))
48
+
49
+ (build/compile-java {:class-dir (str old-version-dir "/target/classes")
50
+ :java-src-dirs [(str old-version-dir "/java")
51
+ (str old-version-dir "/java/src-generated")]
52
+ :deps-file (str old-version-dir "/deps.edn")})
53
+
54
+ (clj {:dir old-version-dir}
55
+ "-Sdeps" (str "{:deps {io.replikativ/datahike {:local/root \".\"}}"
56
+ " :paths [\"test/datahike/backward_compatibility_test/src\"]}")
57
+ "-X" "backward-test/write")
58
+ (fs/delete-tree old-version-dir)
59
+
60
+ (println "READING TEST DATA FROM TEST-DB")
61
+ (clj {:dir "."}
62
+ "-Sdeps" (str "{:deps {io.replikativ/datahike {:local/root \".\"}}"
63
+ " :paths [\"test/datahike/backward_compatibility_test/src\"]}")
64
+ "-X" "backward-test/read")))
65
+
66
+ (defn native-image []
67
+ (if (fs/exists? "./dthk")
68
+ (p/shell "./bb/resources/native-image-tests/run-native-image-tests")
69
+ (println "Native image cli missing. Please run 'bb ni-cli' and try again.")))
70
+
71
+ (defn libdatahike []
72
+ (if (fs/exists? "./libdatahike/target")
73
+ (p/shell "./bb/resources/native-image-tests/run-libdatahike-tests")
74
+ (println "libdatahike binaries missing. Please run 'bb ni-compile' and try again.")))
75
+
76
+ (defn bb-pod []
77
+ (if (fs/exists? "./dthk")
78
+ (p/shell "./bb/resources/native-image-tests/run-bb-pod-tests.clj")
79
+ (do (println "Native image cli missing. Please run 'bb ni-cli' and try again.")
80
+ (System/exit 1))))
81
+
82
+ (defn python []
83
+ (if (fs/exists? "./libdatahike/target")
84
+ (p/shell "./bb/resources/native-image-tests/run-python-tests")
85
+ (println "libdatahike binaries missing. Please run 'bb ni-compile' and try again.")))
86
+
87
+ (defn specs []
88
+ (kaocha "--focus" "specs" "--plugin" "kaocha.plugin/orchestra"))
89
+
90
+ (defn kabel []
91
+ (kaocha "--focus" "kabel"))
92
+
93
+ (defn cljs-node-test []
94
+ (p/shell "clj -M:cljs -m shadow.cljs.devtools.cli compile :node-test")
95
+ (p/shell "node target/out/node-test.js"))
96
+
97
+ (defn cljs-browser-test []
98
+ (println "Installing npm dependencies...")
99
+ (p/shell "npm install")
100
+ (println "Starting Kabel test server...")
101
+ (let [server-process (p/process "clojure -M:test -e \"(require 'datahike.kabel.browser-test-server) (datahike.kabel.browser-test-server/start-test-server!) (Thread/sleep Long/MAX_VALUE)\"")]
102
+ (try
103
+ (println "Waiting for server startup...")
104
+ (Thread/sleep 5000)
105
+ (println "Compiling browser tests...")
106
+ (p/shell "npx shadow-cljs compile :browser-ci")
107
+ (println "Running tests with Karma...")
108
+ ;; Set CHROME_BIN to chromium if available
109
+ (let [chrome-bin (or (System/getenv "CHROME_BIN")
110
+ (first (keep #(when (.exists (io/file %)) %)
111
+ ["/snap/bin/chromium"
112
+ "/usr/bin/chromium"
113
+ "/usr/bin/chromium-browser"
114
+ "/usr/bin/google-chrome"])))
115
+ env (if chrome-bin
116
+ (assoc (into {} (System/getenv)) "CHROME_BIN" chrome-bin)
117
+ (into {} (System/getenv)))]
118
+ (p/shell {:env env} "npx karma start --single-run"))
119
+ (finally
120
+ (println "Stopping test server...")
121
+ (p/destroy server-process)))))
122
+
123
+ (defn all [config]
124
+ (kaocha "--skip" "specs")
125
+ (specs)
126
+ (kabel)
127
+ (back-compat config)
128
+ (native-image)
129
+ (libdatahike)
130
+ (python)
131
+ (bb-pod)
132
+ (cljs-node-test)
133
+ (cljs-browser-test))
134
+
135
+ (defn -main [config & args]
136
+ (if (seq args)
137
+ (case (first args)
138
+ "native-image" (native-image)
139
+ "libdatahike" (libdatahike)
140
+ "python" (python)
141
+ "bb-pod" (bb-pod)
142
+ "back-compat" (back-compat config)
143
+ "specs" (specs)
144
+ "kabel" (kabel)
145
+ "cljs-node" (cljs-node-test)
146
+ "cljs-browser" (cljs-browser-test)
147
+ (apply kaocha "--focus" args))
148
+ (all config)))
@@ -0,0 +1,47 @@
1
+ (ns tools.version
2
+ "Update the project version."
3
+ (:refer-clojure :exclude [inc])
4
+ (:require [clojure.edn :as edn]
5
+ [clojure.string :as str]
6
+ [clojure.tools.build.api :as b]))
7
+
8
+ (defn read-edn-file [filename]
9
+ (edn/read-string (slurp filename)))
10
+
11
+ (defn commit-nr []
12
+ (b/git-count-revs {:dir "."}))
13
+
14
+ (defn current-commit []
15
+ (str/trim (b/git-process {:git-args "rev-parse HEAD"})))
16
+
17
+ (defn sha []
18
+ (-> (b/git-process {:git-args "log -1"})
19
+ (str/split #"\s+")
20
+ second))
21
+
22
+ (defn string [config]
23
+ (let [{:keys [major minor]} (:version config)]
24
+ (str major "." minor "." (commit-nr))))
25
+
26
+ (defn- update-in-settings [config-file ks fn]
27
+ (spit config-file (update-in (read-edn-file config-file) ks fn)))
28
+
29
+ (defn show
30
+ "Show the version string of a library"
31
+ [config]
32
+ (println (string config)))
33
+
34
+ (defn inc
35
+ "Increment the library version.
36
+ The version part can be 'major' or 'minor'."
37
+ ([config-file]
38
+ (println "Current library version: ")
39
+ (show (read-edn-file config-file))
40
+ (println "Call this function with :major or :minor to increase the respective version part!"))
41
+ ([config-file part]
42
+ (case (name part)
43
+ "major" (update-in-settings config-file [:version :major] inc)
44
+ "minor" (update-in-settings config-file [:version :minor] inc))))
45
+
46
+ (defn as-tag [config]
47
+ (str "v" (string config)))