spaday 0.2.1__tar.gz → 0.3.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 (168) hide show
  1. {spaday-0.2.1 → spaday-0.3.0}/Cargo.lock +46 -35
  2. {spaday-0.2.1 → spaday-0.3.0}/Cargo.toml +1 -1
  3. {spaday-0.2.1 → spaday-0.3.0}/PKG-INFO +4 -2
  4. {spaday-0.2.1 → spaday-0.3.0}/README.md +3 -0
  5. {spaday-0.2.1 → spaday-0.3.0}/js/Cargo.toml +1 -1
  6. {spaday-0.2.1 → spaday-0.3.0}/js/package.json +2 -2
  7. {spaday-0.2.1 → spaday-0.3.0}/js/src/rust/lib.rs +14 -3
  8. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/actions.ts +2 -2
  9. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/signals.ts +4 -0
  10. {spaday-0.2.1 → spaday-0.3.0}/js/tests/actions.spec.js +37 -0
  11. {spaday-0.2.1 → spaday-0.3.0}/js/tests/signals.spec.js +32 -0
  12. {spaday-0.2.1 → spaday-0.3.0}/pyproject.toml +3 -4
  13. {spaday-0.2.1 → spaday-0.3.0}/rust/Cargo.toml +1 -1
  14. spaday-0.3.0/rust/coverage +1347 -0
  15. {spaday-0.2.1 → spaday-0.3.0}/rust/src/action.rs +54 -3
  16. {spaday-0.2.1 → spaday-0.3.0}/rust/src/lib.rs +1 -1
  17. {spaday-0.2.1 → spaday-0.3.0}/spaday/__init__.py +8 -1
  18. {spaday-0.2.1 → spaday-0.3.0}/spaday/actions.py +25 -6
  19. {spaday-0.2.1 → spaday-0.3.0}/spaday/backends/aiohttp.py +6 -0
  20. {spaday-0.2.1 → spaday-0.3.0}/spaday/backends/flask.py +12 -0
  21. {spaday-0.2.1 → spaday-0.3.0}/spaday/backends/starlette.py +15 -2
  22. {spaday-0.2.1 → spaday-0.3.0}/spaday/backends/tornado.py +13 -1
  23. {spaday-0.2.1 → spaday-0.3.0}/spaday/bootstrap.py +21 -3
  24. {spaday-0.2.1 → spaday-0.3.0}/spaday/components/shell.py +8 -5
  25. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/index.js +23 -13
  26. spaday-0.3.0/spaday/extension/cdn/index.js.map +7 -0
  27. spaday-0.3.0/spaday/extension/cdn/widget.js +1017 -0
  28. spaday-0.3.0/spaday/extension/cdn/widget.js.map +7 -0
  29. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/widget.webawesome.js +24 -14
  30. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/widget.webawesome.js.map +2 -2
  31. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/pkg/spaday.js +20 -12
  32. spaday-0.3.0/spaday/extension/pkg/spaday_bg.wasm +0 -0
  33. spaday-0.3.0/spaday/packages.py +103 -0
  34. spaday-0.3.0/spaday/spaday.abi3.so +0 -0
  35. spaday-0.3.0/spaday/tests/fixtures/component_package/fixture.css +1 -0
  36. spaday-0.3.0/spaday/tests/fixtures/component_package/fixture.js +1 -0
  37. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_actions.py +14 -0
  38. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_backend_aiohttp.py +12 -0
  39. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_backend_flask.py +8 -0
  40. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_backend_starlette.py +24 -0
  41. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_backend_tornado.py +12 -0
  42. spaday-0.3.0/spaday/tests/test_packages.py +68 -0
  43. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_shell.py +13 -0
  44. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_validate.py +8 -0
  45. {spaday-0.2.1 → spaday-0.3.0}/spaday/validate.py +9 -3
  46. spaday-0.2.1/rust/coverage +0 -1311
  47. spaday-0.2.1/spaday/extension/cdn/index.js.map +0 -7
  48. spaday-0.2.1/spaday/extension/cdn/widget.js +0 -1007
  49. spaday-0.2.1/spaday/extension/cdn/widget.js.map +0 -7
  50. spaday-0.2.1/spaday/extension/pkg/spaday_bg.wasm +0 -0
  51. spaday-0.2.1/spaday/spaday.abi3.so +0 -0
  52. {spaday-0.2.1 → spaday-0.3.0}/.gitignore +0 -0
  53. {spaday-0.2.1 → spaday-0.3.0}/LICENSE +0 -0
  54. {spaday-0.2.1 → spaday-0.3.0}/js/build.mjs +0 -0
  55. {spaday-0.2.1 → spaday-0.3.0}/js/playwright.config.js +0 -0
  56. {spaday-0.2.1 → spaday-0.3.0}/js/pnpm-lock.yaml +0 -0
  57. {spaday-0.2.1 → spaday-0.3.0}/js/pnpm-workspace.yaml +0 -0
  58. {spaday-0.2.1 → spaday-0.3.0}/js/src/css/index.css +0 -0
  59. {spaday-0.2.1 → spaday-0.3.0}/js/src/html/index.html +0 -0
  60. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/cem.ts +0 -0
  61. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/css.d.ts +0 -0
  62. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/examples/gateway.ts +0 -0
  63. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/handlers.ts +0 -0
  64. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/index.ts +0 -0
  65. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/runtime.ts +0 -0
  66. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/shell.ts +0 -0
  67. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/store-sync.ts +0 -0
  68. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/value.ts +0 -0
  69. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/wasm-ready.ts +0 -0
  70. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/wasm.d.ts +0 -0
  71. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/webawesome.ts +0 -0
  72. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/widget.ts +0 -0
  73. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/wrappers/lightweight-chart.ts +0 -0
  74. {spaday-0.2.1 → spaday-0.3.0}/js/src/ts/wrappers/perspective-workspace.ts +0 -0
  75. {spaday-0.2.1 → spaday-0.3.0}/js/tests/cem.spec.js +0 -0
  76. {spaday-0.2.1 → spaday-0.3.0}/js/tests/hydrate.spec.js +0 -0
  77. {spaday-0.2.1 → spaday-0.3.0}/js/tests/index.spec.js +0 -0
  78. {spaday-0.2.1 → spaday-0.3.0}/js/tests/layout.html +0 -0
  79. {spaday-0.2.1 → spaday-0.3.0}/js/tests/layout.spec.js +0 -0
  80. {spaday-0.2.1 → spaday-0.3.0}/js/tests/lightweight-chart.html +0 -0
  81. {spaday-0.2.1 → spaday-0.3.0}/js/tests/lightweight-chart.spec.js +0 -0
  82. {spaday-0.2.1 → spaday-0.3.0}/js/tests/runtime.html +0 -0
  83. {spaday-0.2.1 → spaday-0.3.0}/js/tests/runtime.spec.js +0 -0
  84. {spaday-0.2.1 → spaday-0.3.0}/js/tests/shell.spec.js +0 -0
  85. {spaday-0.2.1 → spaday-0.3.0}/js/tests/show.spec.js +0 -0
  86. {spaday-0.2.1 → spaday-0.3.0}/js/tests/store-sync.spec.js +0 -0
  87. {spaday-0.2.1 → spaday-0.3.0}/js/tests/widget-webawesome.html +0 -0
  88. {spaday-0.2.1 → spaday-0.3.0}/js/tests/widget-webawesome.spec.js +0 -0
  89. {spaday-0.2.1 → spaday-0.3.0}/js/tests/widget.html +0 -0
  90. {spaday-0.2.1 → spaday-0.3.0}/js/tests/widget.spec.js +0 -0
  91. {spaday-0.2.1 → spaday-0.3.0}/js/tools/bundle.mjs +0 -0
  92. {spaday-0.2.1 → spaday-0.3.0}/js/tools/css.mjs +0 -0
  93. {spaday-0.2.1 → spaday-0.3.0}/js/tools/externals.mjs +0 -0
  94. {spaday-0.2.1 → spaday-0.3.0}/js/tools/getarg.mjs +0 -0
  95. {spaday-0.2.1 → spaday-0.3.0}/js/tools/html.mjs +0 -0
  96. {spaday-0.2.1 → spaday-0.3.0}/js/tsconfig.json +0 -0
  97. {spaday-0.2.1 → spaday-0.3.0}/rust/.config/nextest.toml +0 -0
  98. {spaday-0.2.1 → spaday-0.3.0}/rust/Cargo.lock +0 -0
  99. {spaday-0.2.1 → spaday-0.3.0}/rust/python/example/mod.rs +0 -0
  100. {spaday-0.2.1 → spaday-0.3.0}/rust/python/lib.rs +0 -0
  101. {spaday-0.2.1 → spaday-0.3.0}/rust/python/patch/mod.rs +0 -0
  102. {spaday-0.2.1 → spaday-0.3.0}/rust/src/cem.rs +0 -0
  103. {spaday-0.2.1 → spaday-0.3.0}/rust/src/diff.rs +0 -0
  104. {spaday-0.2.1 → spaday-0.3.0}/rust/src/example.rs +0 -0
  105. {spaday-0.2.1 → spaday-0.3.0}/rust/src/json.rs +0 -0
  106. {spaday-0.2.1 → spaday-0.3.0}/rust/src/node.rs +0 -0
  107. {spaday-0.2.1 → spaday-0.3.0}/rust/src/value.rs +0 -0
  108. {spaday-0.2.1 → spaday-0.3.0}/rust/src/wire.rs +0 -0
  109. {spaday-0.2.1 → spaday-0.3.0}/spaday/backends/__init__.py +0 -0
  110. {spaday-0.2.1 → spaday-0.3.0}/spaday/cem.py +0 -0
  111. {spaday-0.2.1 → spaday-0.3.0}/spaday/component.py +0 -0
  112. {spaday-0.2.1 → spaday-0.3.0}/spaday/components/__init__.py +0 -0
  113. {spaday-0.2.1 → spaday-0.3.0}/spaday/components/form.py +0 -0
  114. {spaday-0.2.1 → spaday-0.3.0}/spaday/components/lightweight_charts.cem.json +0 -0
  115. {spaday-0.2.1 → spaday-0.3.0}/spaday/components/lightweight_charts.py +0 -0
  116. {spaday-0.2.1 → spaday-0.3.0}/spaday/components/perspective.cem.json +0 -0
  117. {spaday-0.2.1 → spaday-0.3.0}/spaday/components/perspective.py +0 -0
  118. {spaday-0.2.1 → spaday-0.3.0}/spaday/components/webawesome.py +0 -0
  119. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/README.md +0 -0
  120. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/__init__.py +0 -0
  121. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/__main__.py +0 -0
  122. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/cluster.py +0 -0
  123. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/devices.py +0 -0
  124. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/embed.py +0 -0
  125. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/form.py +0 -0
  126. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/fragment.py +0 -0
  127. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/gateway.py +0 -0
  128. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/reactive.py +0 -0
  129. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/ssr.py +0 -0
  130. {spaday-0.2.1 → spaday-0.3.0}/spaday/examples/widget.py +0 -0
  131. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/examples/gateway.js +0 -0
  132. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/examples/gateway.js.map +0 -0
  133. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/examples/webawesome.js +0 -0
  134. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/examples/webawesome.js.map +0 -0
  135. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/wrappers/lightweight-chart.js +0 -0
  136. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/wrappers/lightweight-chart.js.map +0 -0
  137. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/wrappers/perspective-workspace.js +0 -0
  138. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/cdn/wrappers/perspective-workspace.js.map +0 -0
  139. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/css/index.css +0 -0
  140. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/css/webawesome.css +0 -0
  141. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/index.html +0 -0
  142. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/pkg/spaday.d.ts +0 -0
  143. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/pkg/spaday_bg.wasm.d.ts +0 -0
  144. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/transports/cdn/index.js +0 -0
  145. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/transports/cdn/index.js.map +0 -0
  146. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/transports/pkg/transports.d.ts +0 -0
  147. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/transports/pkg/transports.js +0 -0
  148. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/transports/pkg/transports_bg.wasm +0 -0
  149. {spaday-0.2.1 → spaday-0.3.0}/spaday/extension/transports/pkg/transports_bg.wasm.d.ts +0 -0
  150. {spaday-0.2.1 → spaday-0.3.0}/spaday/render.py +0 -0
  151. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/fixtures/webawesome.3.9.0.cem.json +0 -0
  152. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/fixtures/webawesome.cem.json +0 -0
  153. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_all.py +0 -0
  154. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_bindings.py +0 -0
  155. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_bootstrap.py +0 -0
  156. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_cem.py +0 -0
  157. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_cluster.py +0 -0
  158. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_examples.py +0 -0
  159. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_form.py +0 -0
  160. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_gateway.py +0 -0
  161. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_imports.py +0 -0
  162. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_render.py +0 -0
  163. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_theme.py +0 -0
  164. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_widget.py +0 -0
  165. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_wire.py +0 -0
  166. {spaday-0.2.1 → spaday-0.3.0}/spaday/tests/test_wrappers.py +0 -0
  167. {spaday-0.2.1 → spaday-0.3.0}/spaday/theme.py +0 -0
  168. {spaday-0.2.1 → spaday-0.3.0}/spaday/widget.py +0 -0
@@ -22,21 +22,21 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
22
22
 
23
23
  [[package]]
24
24
  name = "futures-core"
25
- version = "0.3.32"
25
+ version = "0.3.33"
26
26
  source = "registry+https://github.com/rust-lang/crates.io-index"
27
- checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
27
+ checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7"
28
28
 
29
29
  [[package]]
30
30
  name = "futures-task"
31
- version = "0.3.32"
31
+ version = "0.3.33"
32
32
  source = "registry+https://github.com/rust-lang/crates.io-index"
33
- checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
33
+ checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109"
34
34
 
35
35
  [[package]]
36
36
  name = "futures-util"
37
- version = "0.3.32"
37
+ version = "0.3.33"
38
38
  source = "registry+https://github.com/rust-lang/crates.io-index"
39
- checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
39
+ checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa"
40
40
  dependencies = [
41
41
  "futures-core",
42
42
  "futures-task",
@@ -84,9 +84,9 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
84
84
 
85
85
  [[package]]
86
86
  name = "memchr"
87
- version = "2.8.2"
87
+ version = "2.8.3"
88
88
  source = "registry+https://github.com/rust-lang/crates.io-index"
89
- checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
89
+ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
90
90
 
91
91
  [[package]]
92
92
  name = "num-traits"
@@ -111,15 +111,15 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
111
111
 
112
112
  [[package]]
113
113
  name = "portable-atomic"
114
- version = "1.13.1"
114
+ version = "1.14.0"
115
115
  source = "registry+https://github.com/rust-lang/crates.io-index"
116
- checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
116
+ checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3"
117
117
 
118
118
  [[package]]
119
119
  name = "proc-macro2"
120
- version = "1.0.106"
120
+ version = "1.0.107"
121
121
  source = "registry+https://github.com/rust-lang/crates.io-index"
122
- checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
122
+ checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
123
123
  dependencies = [
124
124
  "unicode-ident",
125
125
  ]
@@ -167,7 +167,7 @@ dependencies = [
167
167
  "proc-macro2",
168
168
  "pyo3-macros-backend",
169
169
  "quote",
170
- "syn",
170
+ "syn 2.0.119",
171
171
  ]
172
172
 
173
173
  [[package]]
@@ -179,14 +179,14 @@ dependencies = [
179
179
  "heck",
180
180
  "proc-macro2",
181
181
  "quote",
182
- "syn",
182
+ "syn 2.0.119",
183
183
  ]
184
184
 
185
185
  [[package]]
186
186
  name = "quote"
187
- version = "1.0.45"
187
+ version = "1.0.47"
188
188
  source = "registry+https://github.com/rust-lang/crates.io-index"
189
- checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
189
+ checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
190
190
  dependencies = [
191
191
  "proc-macro2",
192
192
  ]
@@ -212,15 +212,15 @@ dependencies = [
212
212
 
213
213
  [[package]]
214
214
  name = "rustversion"
215
- version = "1.0.22"
215
+ version = "1.0.23"
216
216
  source = "registry+https://github.com/rust-lang/crates.io-index"
217
- checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
217
+ checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
218
218
 
219
219
  [[package]]
220
220
  name = "serde"
221
- version = "1.0.228"
221
+ version = "1.0.229"
222
222
  source = "registry+https://github.com/rust-lang/crates.io-index"
223
- checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
223
+ checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
224
224
  dependencies = [
225
225
  "serde_core",
226
226
  "serde_derive",
@@ -239,29 +239,29 @@ dependencies = [
239
239
 
240
240
  [[package]]
241
241
  name = "serde_core"
242
- version = "1.0.228"
242
+ version = "1.0.229"
243
243
  source = "registry+https://github.com/rust-lang/crates.io-index"
244
- checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
244
+ checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
245
245
  dependencies = [
246
246
  "serde_derive",
247
247
  ]
248
248
 
249
249
  [[package]]
250
250
  name = "serde_derive"
251
- version = "1.0.228"
251
+ version = "1.0.229"
252
252
  source = "registry+https://github.com/rust-lang/crates.io-index"
253
- checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
253
+ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
254
254
  dependencies = [
255
255
  "proc-macro2",
256
256
  "quote",
257
- "syn",
257
+ "syn 3.0.2",
258
258
  ]
259
259
 
260
260
  [[package]]
261
261
  name = "serde_json"
262
- version = "1.0.150"
262
+ version = "1.0.151"
263
263
  source = "registry+https://github.com/rust-lang/crates.io-index"
264
- checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
264
+ checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
265
265
  dependencies = [
266
266
  "itoa",
267
267
  "memchr",
@@ -278,7 +278,7 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
278
278
 
279
279
  [[package]]
280
280
  name = "spaday"
281
- version = "0.2.1"
281
+ version = "0.3.0"
282
282
  dependencies = [
283
283
  "serde",
284
284
  "serde_json",
@@ -287,7 +287,7 @@ dependencies = [
287
287
 
288
288
  [[package]]
289
289
  name = "spaday_js"
290
- version = "0.2.1"
290
+ version = "0.3.0"
291
291
  dependencies = [
292
292
  "js-sys",
293
293
  "serde",
@@ -298,7 +298,7 @@ dependencies = [
298
298
 
299
299
  [[package]]
300
300
  name = "spaday_py"
301
- version = "0.2.1"
301
+ version = "0.3.0"
302
302
  dependencies = [
303
303
  "pyo3",
304
304
  "spaday",
@@ -306,9 +306,20 @@ dependencies = [
306
306
 
307
307
  [[package]]
308
308
  name = "syn"
309
- version = "2.0.118"
309
+ version = "2.0.119"
310
310
  source = "registry+https://github.com/rust-lang/crates.io-index"
311
- checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
311
+ checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
312
+ dependencies = [
313
+ "proc-macro2",
314
+ "quote",
315
+ "unicode-ident",
316
+ ]
317
+
318
+ [[package]]
319
+ name = "syn"
320
+ version = "3.0.2"
321
+ source = "registry+https://github.com/rust-lang/crates.io-index"
322
+ checksum = "a207d6d6a2b7fc470b80443726053f18a2481b7e1eee970597051596567987a3"
312
323
  dependencies = [
313
324
  "proc-macro2",
314
325
  "quote",
@@ -370,7 +381,7 @@ dependencies = [
370
381
  "bumpalo",
371
382
  "proc-macro2",
372
383
  "quote",
373
- "syn",
384
+ "syn 2.0.119",
374
385
  "wasm-bindgen-shared",
375
386
  ]
376
387
 
@@ -385,6 +396,6 @@ dependencies = [
385
396
 
386
397
  [[package]]
387
398
  name = "zmij"
388
- version = "1.0.21"
399
+ version = "1.0.23"
389
400
  source = "registry+https://github.com/rust-lang/crates.io-index"
390
- checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
401
+ checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "spaday_py"
3
- version = "0.2.1"
3
+ version = "0.3.0"
4
4
  edition = "2021"
5
5
  publish = false
6
6
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaday
3
- Version: 0.2.1
3
+ Version: 0.3.0
4
4
  Summary: Build reactive web-component UIs configured in Python, executed in the browser
5
5
  Project-URL: Repository, https://github.com/1kbgz/spaday
6
6
  Project-URL: Homepage, https://github.com/1kbgz/spaday
@@ -10,7 +10,6 @@ License-File: LICENSE
10
10
  Classifier: Development Status :: 3 - Alpha
11
11
  Classifier: Programming Language :: Python
12
12
  Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Programming Language :: Python :: 3.12
16
15
  Classifier: Programming Language :: Python :: 3.13
@@ -133,3 +132,6 @@ pip install "spaday[widget]" # + the Jupyter / anywidget host
133
132
  [generate typed classes from a manifest](docs/src/cem.md).
134
133
  - **[API reference](docs/src/api.md)** — the Python surface.
135
134
  - **[How spaday works](docs/src/concepts.md)** — the architecture and the reasoning behind it.
135
+
136
+ > [!NOTE]
137
+ > This library was generated using [copier](https://copier.readthedocs.io/en/stable/) from the [Base Python Project Template repository](https://github.com/python-project-templates/base)
@@ -53,3 +53,6 @@ pip install "spaday[widget]" # + the Jupyter / anywidget host
53
53
  [generate typed classes from a manifest](docs/src/cem.md).
54
54
  - **[API reference](docs/src/api.md)** — the Python surface.
55
55
  - **[How spaday works](docs/src/concepts.md)** — the architecture and the reasoning behind it.
56
+
57
+ > [!NOTE]
58
+ > This library was generated using [copier](https://copier.readthedocs.io/en/stable/) from the [Base Python Project Template repository](https://github.com/python-project-templates/base)
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "spaday_js"
3
- version = "0.2.1"
3
+ version = "0.3.0"
4
4
  edition = "2021"
5
5
  publish = false
6
6
  keywords = ["experimental"]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spaday",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "",
5
5
  "repository": "git@github.com:1kbgz/spaday.git",
6
6
  "author": "1kbgz <dev@1kbgz.com>",
@@ -28,7 +28,7 @@
28
28
  "scripts": {
29
29
  "setup": "cargo install -f wasm-bindgen-cli --version 0.2.126 --locked",
30
30
  "build:debug": "node build.mjs --debug",
31
- "build:rust": "cargo build --release --all-features --target wasm32-unknown-unknown",
31
+ "build:rust": "cargo build --release --all-features --target wasm32-unknown-unknown --target-dir ../target",
32
32
  "build:wasm-bindgen": "wasm-bindgen ../target/wasm32-unknown-unknown/release/spaday.wasm --out-dir ./dist/pkg --target web",
33
33
  "build:prod": "node build.mjs",
34
34
  "build": "npm-run-all build:rust build:wasm-bindgen build:prod",
@@ -25,7 +25,7 @@ extern "C" {
25
25
  #[wasm_bindgen(method, js_name = sendPatch)]
26
26
  fn send_patch(this: &Host, model: &str, field: &str, value: JsValue);
27
27
  #[wasm_bindgen(method, js_name = callEndpoint)]
28
- fn call_endpoint(this: &Host, method: &str, url: &str, body: JsValue, result: Option<&str>);
28
+ fn call_endpoint(this: &Host, method: &str, url: JsValue, body: JsValue, result: Option<&str>);
29
29
  #[wasm_bindgen(method, js_name = callNamed)]
30
30
  fn call_named(this: &Host, handler: &str);
31
31
  }
@@ -100,15 +100,19 @@ fn run(action: &spaday::Action, host: &Host) {
100
100
  body,
101
101
  result,
102
102
  } => {
103
+ let u = match url {
104
+ spaday::EndpointUrl::Static(value) => JsValue::from_str(value),
105
+ spaday::EndpointUrl::Expr(expr) => eval(expr, host),
106
+ };
103
107
  let b = body.as_ref().map_or(JsValue::UNDEFINED, |e| eval(e, host));
104
- host.call_endpoint(method, url, b, result.as_deref());
108
+ host.call_endpoint(method, u, b, result.as_deref());
105
109
  }
106
110
  NamedJs { handler } => host.call_named(handler),
107
111
  }
108
112
  }
109
113
 
110
114
  fn eval(expr: &spaday::Expr, host: &Host) -> JsValue {
111
- use spaday::Expr::{Event, Field, Lit, Not, Obj, Prop};
115
+ use spaday::Expr::{Concat, Event, Field, Lit, Not, Obj, Prop};
112
116
  match expr {
113
117
  // json_compatible: JSON objects become plain JS objects (not Maps), so they round-trip through
114
118
  // `JSON.stringify` (e.g. a CallEndpoint body) and set cleanly as props.
@@ -130,6 +134,13 @@ fn eval(expr: &spaday::Expr, host: &Host) -> JsValue {
130
134
  }
131
135
  obj.into()
132
136
  }
137
+ Concat { parts } => {
138
+ let values = js_sys::Array::new();
139
+ for part in parts {
140
+ values.push(&eval(part, host));
141
+ }
142
+ values.join("").into()
143
+ }
133
144
  }
134
145
  }
135
146
 
@@ -68,11 +68,11 @@ function host(ctx: ActionContext) {
68
68
  // UI, e.g. show a 422 validation error); without one it stays fire-and-forget.
69
69
  callEndpoint: (
70
70
  method: string,
71
- url: string,
71
+ url: unknown,
72
72
  body: unknown,
73
73
  result?: string,
74
74
  ) => {
75
- const request = fetch(url, {
75
+ const request = fetch(String(url), {
76
76
  method,
77
77
  headers:
78
78
  body === undefined
@@ -126,6 +126,10 @@ export function evalExpr(expr: unknown, store: Store): unknown {
126
126
  out[k] = evalExpr(v, store);
127
127
  return out;
128
128
  }
129
+ case "concat":
130
+ return (e.parts as unknown[])
131
+ .map((part) => String(evalExpr(part, store)))
132
+ .join("");
129
133
  default:
130
134
  return undefined;
131
135
  }
@@ -357,6 +357,43 @@ test("CallEndpoint composes a body from the signal store via field exprs", async
357
357
  expect(JSON.parse(seen[0])).toEqual({ symbol: "AAPL", qty: 250 });
358
358
  });
359
359
 
360
+ test("CallEndpoint composes its URL from signal-store fields", async ({
361
+ page,
362
+ }) => {
363
+ const seen = [];
364
+ await page.route("**/send/basket/*", (route) => {
365
+ seen.push(new URL(route.request().url()).pathname);
366
+ return route.fulfill({ status: 200, body: "ok" });
367
+ });
368
+ await page.evaluate(() => {
369
+ const { mount, Store } = window.__spaday;
370
+ const store = new Store({ key: "B" });
371
+ const btn = mount(
372
+ document.body,
373
+ {
374
+ tag: "button",
375
+ events: {
376
+ click: {
377
+ kind: "call",
378
+ method: "POST",
379
+ url: {
380
+ expr: "concat",
381
+ parts: [
382
+ { expr: "lit", value: "/send/basket/" },
383
+ { expr: "field", name: "key" },
384
+ ],
385
+ },
386
+ },
387
+ },
388
+ },
389
+ store,
390
+ );
391
+ btn.click();
392
+ });
393
+ await page.waitForTimeout(150);
394
+ expect(seen).toEqual(["/send/basket/B"]);
395
+ });
396
+
360
397
  test("SetField writes a store field (a plain button drives reactive state)", async ({
361
398
  page,
362
399
  }) => {
@@ -234,6 +234,38 @@ test("a cond expr selects between two values by a field, reactively", async ({
234
234
  expect(result.after).toBe("dark");
235
235
  });
236
236
 
237
+ test("a concat expr composes strings from fields reactively", async ({
238
+ page,
239
+ }) => {
240
+ const result = await page.evaluate(() => {
241
+ const { mount, Store } = window.__spaday;
242
+ const store = new Store({ key: "A" });
243
+ const root = mount(
244
+ document.createElement("div"),
245
+ {
246
+ tag: "span",
247
+ bindings: {
248
+ textContent: {
249
+ compute: {
250
+ expr: "concat",
251
+ parts: [
252
+ { expr: "lit", value: "Basket " },
253
+ { expr: "field", name: "key" },
254
+ ],
255
+ },
256
+ mode: "one-way",
257
+ },
258
+ },
259
+ },
260
+ store,
261
+ );
262
+ const initial = root.textContent;
263
+ store.set("key", "B");
264
+ return { initial, after: root.textContent };
265
+ });
266
+ expect(result).toEqual({ initial: "Basket A", after: "Basket B" });
267
+ });
268
+
237
269
  test("a root-class binding toggles a class on <html> from a field", async ({
238
270
  page,
239
271
  }) => {
@@ -14,7 +14,7 @@ authors = [
14
14
  description = "Build reactive web-component UIs configured in Python, executed in the browser"
15
15
  readme = "README.md"
16
16
  license = { text = "Apache-2.0" }
17
- version = "0.2.1"
17
+ version = "0.3.0"
18
18
  requires-python = ">=3.10"
19
19
  keywords = []
20
20
 
@@ -25,7 +25,6 @@ classifiers = [
25
25
  "Programming Language :: Python :: Implementation :: CPython",
26
26
  "Programming Language :: Python :: Implementation :: PyPy",
27
27
  "Programming Language :: Python :: 3",
28
- "Programming Language :: Python :: 3.10",
29
28
  "Programming Language :: Python :: 3.11",
30
29
  "Programming Language :: Python :: 3.12",
31
30
  "Programming Language :: Python :: 3.13",
@@ -79,7 +78,7 @@ Repository = "https://github.com/1kbgz/spaday"
79
78
  Homepage = "https://github.com/1kbgz/spaday"
80
79
 
81
80
  [tool.bumpversion]
82
- current_version = "0.2.1"
81
+ current_version = "0.3.0"
83
82
  commit = true
84
83
  tag = false
85
84
  commit_args = "-s"
@@ -115,7 +114,7 @@ search = 'version = "{current_version}"'
115
114
  replace = 'version = "{new_version}"'
116
115
 
117
116
  [tool.cibuildwheel]
118
- build = "cp310-*"
117
+ build = "cp311-*"
119
118
  test-command = "pytest -vvv {project}/spaday/tests"
120
119
  test-extras = "develop"
121
120
 
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "spaday"
3
- version = "0.2.1"
3
+ version = "0.3.0"
4
4
  authors = ["1kbgz <dev@1kbgz.com>"]
5
5
  edition = "2021"
6
6
  license = "Apache-2.0"