Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
050fb34fb0 | ||
|
|
b86a12e5df | ||
|
|
2f04c82c89 | ||
|
|
00449916a3 | ||
|
|
41db6093e5 | ||
|
|
572dfc200c | ||
|
|
955a33609a | ||
|
|
9b96111916 | ||
|
|
f2fc5097f7 | ||
|
|
f2ca00b309 | ||
|
|
ac4af4395a | ||
|
|
1e7245b062 | ||
|
|
a847d0defa | ||
|
|
57b733e606 | ||
|
|
3923d4d0dc | ||
|
|
00db014eae | ||
|
|
d2450fcb75 |
@@ -3,6 +3,66 @@
|
|||||||
One line per change, grouped by the release that shipped it. Newest
|
One line per change, grouped by the release that shipped it. Newest
|
||||||
first. Each release names the portal tag it is built against.
|
first. Each release names the portal tag it is built against.
|
||||||
|
|
||||||
|
## 0.5.10 (2026-09-30) - portal v0.5.10
|
||||||
|
|
||||||
|
- Matches portal v0.5.10 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.5.9 (2026-09-30) - portal v0.5.9
|
||||||
|
|
||||||
|
- Matches portal v0.5.9 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.5.8 (2026-09-30) - portal v0.5.8
|
||||||
|
|
||||||
|
- Matches portal v0.5.8 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.5.7 (2026-09-30) - portal v0.5.7
|
||||||
|
|
||||||
|
- Matches portal v0.5.7 (released by portal's publish job).
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
- The effort budget counts what a person fills in: a `type: record` field (the case an answer is about, carried on the link) and a `hidden` preset are not asked and no longer count. An objection page whose form carried the application's id used to be one field over.
|
||||||
|
|
||||||
|
## 0.5.6 (2026-09-30) - portal v0.5.6
|
||||||
|
|
||||||
|
- Matches portal v0.5.6 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.5.5 (2026-09-30) - portal v0.5.5
|
||||||
|
|
||||||
|
- Matches portal v0.5.5 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.5.4 (2026-09-29) - portal v0.5.4
|
||||||
|
|
||||||
|
- Matches portal v0.5.4 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.5.3 (2026-09-29) - portal v0.5.3
|
||||||
|
|
||||||
|
- Matches portal v0.5.3 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.5.2 (2026-09-28) - portal v0.5.2
|
||||||
|
|
||||||
|
- Matches portal v0.5.2 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.5.1 (2026-09-28) - portal v0.5.1
|
||||||
|
|
||||||
|
- Matches portal v0.5.1 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.5.0 (2026-09-28) - portal v0.5.0
|
||||||
|
|
||||||
|
- Matches portal v0.5.0 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.4.0 (2026-09-24) - portal v0.4.0
|
||||||
|
|
||||||
|
- Matches portal v0.4.0 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.3.47 (2026-09-24) - portal v0.3.47
|
||||||
|
|
||||||
|
- Matches portal v0.3.47 (released by portal's publish job).
|
||||||
|
|
||||||
|
## 0.3.46 (2026-09-23) - portal v0.3.46
|
||||||
|
|
||||||
|
- Matches portal v0.3.46 (released by portal's publish job).
|
||||||
|
|
||||||
## 0.3.45 (2026-09-23) - portal v0.3.45
|
## 0.3.45 (2026-09-23) - portal v0.3.45
|
||||||
|
|
||||||
- Matches portal v0.3.45 (released by portal's publish job).
|
- Matches portal v0.3.45 (released by portal's publish job).
|
||||||
|
|||||||
Generated
+224
-4
@@ -798,7 +798,7 @@ dependencies = [
|
|||||||
"linked-hash-map",
|
"linked-hash-map",
|
||||||
"linked_hash_set",
|
"linked_hash_set",
|
||||||
"miette",
|
"miette",
|
||||||
"nonempty",
|
"nonempty 0.12.0",
|
||||||
"ref-cast",
|
"ref-cast",
|
||||||
"regex",
|
"regex",
|
||||||
"rustc-literal-escaper",
|
"rustc-literal-escaper",
|
||||||
@@ -1060,6 +1060,12 @@ dependencies = [
|
|||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-utils"
|
||||||
|
version = "0.8.23"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crypto-bigint"
|
name = "crypto-bigint"
|
||||||
version = "0.5.5"
|
version = "0.5.5"
|
||||||
@@ -1161,6 +1167,20 @@ dependencies = [
|
|||||||
"syn 3.0.6",
|
"syn 3.0.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dashmap"
|
||||||
|
version = "6.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"crossbeam-utils",
|
||||||
|
"hashbrown 0.14.5",
|
||||||
|
"lock_api",
|
||||||
|
"once_cell",
|
||||||
|
"parking_lot_core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "data-encoding"
|
name = "data-encoding"
|
||||||
version = "2.11.1"
|
version = "2.11.1"
|
||||||
@@ -1523,6 +1543,16 @@ dependencies = [
|
|||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "forwarded-header-value"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9"
|
||||||
|
dependencies = [
|
||||||
|
"nonempty 0.7.0",
|
||||||
|
"thiserror 1.0.69",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fs_extra"
|
name = "fs_extra"
|
||||||
version = "1.3.0"
|
version = "1.3.0"
|
||||||
@@ -1600,6 +1630,12 @@ version = "0.3.34"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
|
checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-timer"
|
||||||
|
version = "3.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-util"
|
name = "futures-util"
|
||||||
version = "0.3.34"
|
version = "0.3.34"
|
||||||
@@ -1648,9 +1684,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
|
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
|
"js-sys",
|
||||||
"libc",
|
"libc",
|
||||||
"r-efi 5.3.0",
|
"r-efi 5.3.0",
|
||||||
"wasip2",
|
"wasip2",
|
||||||
|
"wasm-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1701,6 +1739,29 @@ dependencies = [
|
|||||||
"web-sys",
|
"web-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "governor"
|
||||||
|
version = "0.10.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9efcab3c1958580ff1f25a2a41be1668f7603d849bb63af523b208a3cc1223b8"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"dashmap",
|
||||||
|
"futures-sink",
|
||||||
|
"futures-timer",
|
||||||
|
"futures-util",
|
||||||
|
"getrandom 0.3.4",
|
||||||
|
"hashbrown 0.16.1",
|
||||||
|
"nonzero_ext",
|
||||||
|
"parking_lot",
|
||||||
|
"portable-atomic",
|
||||||
|
"quanta",
|
||||||
|
"rand 0.9.5",
|
||||||
|
"smallvec",
|
||||||
|
"spinning_top",
|
||||||
|
"web-time",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "group"
|
name = "group"
|
||||||
version = "0.13.0"
|
version = "0.13.0"
|
||||||
@@ -1762,6 +1823,23 @@ version = "0.12.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.14.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.16.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
||||||
|
dependencies = [
|
||||||
|
"allocator-api2",
|
||||||
|
"equivalent",
|
||||||
|
"foldhash 0.2.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hashbrown"
|
name = "hashbrown"
|
||||||
version = "0.17.1"
|
version = "0.17.1"
|
||||||
@@ -1993,6 +2071,19 @@ dependencies = [
|
|||||||
"webpki-roots",
|
"webpki-roots",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hyper-timeout"
|
||||||
|
version = "0.5.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0"
|
||||||
|
dependencies = [
|
||||||
|
"hyper 1.11.1",
|
||||||
|
"hyper-util",
|
||||||
|
"pin-project-lite",
|
||||||
|
"tokio",
|
||||||
|
"tower-service",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper-util"
|
name = "hyper-util"
|
||||||
version = "0.1.20"
|
version = "0.1.20"
|
||||||
@@ -2196,7 +2287,7 @@ checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iris"
|
name = "iris"
|
||||||
version = "0.3.45"
|
version = "0.5.10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-nats",
|
"async-nats",
|
||||||
@@ -2925,6 +3016,12 @@ dependencies = [
|
|||||||
"signatory",
|
"signatory",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nonempty"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nonempty"
|
name = "nonempty"
|
||||||
version = "0.12.0"
|
version = "0.12.0"
|
||||||
@@ -2934,6 +3031,12 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nonzero_ext"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nu-ansi-term"
|
name = "nu-ansi-term"
|
||||||
version = "0.50.3"
|
version = "0.50.3"
|
||||||
@@ -3303,12 +3406,13 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "portal"
|
name = "portal"
|
||||||
version = "0.3.45"
|
version = "0.5.10"
|
||||||
source = "git+https://project.uhhm.no/uhhm/portal.git?tag=v0.3.45#3c6881403062d3ba44c6093575b94238900448e8"
|
source = "git+https://project.uhhm.no/uhhm/portal.git?tag=v0.5.10#cb31995299a61fd3bf8a245e5b1d943e3c073043"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
"async-nats",
|
"async-nats",
|
||||||
|
"async-trait",
|
||||||
"aws-sdk-s3",
|
"aws-sdk-s3",
|
||||||
"axum",
|
"axum",
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
@@ -3333,6 +3437,7 @@ dependencies = [
|
|||||||
"tower",
|
"tower",
|
||||||
"tower-http",
|
"tower-http",
|
||||||
"tower-sessions",
|
"tower-sessions",
|
||||||
|
"tower_governor",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
"url",
|
"url",
|
||||||
@@ -3482,6 +3587,21 @@ version = "0.11.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae"
|
checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quanta"
|
||||||
|
version = "0.12.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-utils",
|
||||||
|
"libc",
|
||||||
|
"once_cell",
|
||||||
|
"raw-cpuid",
|
||||||
|
"wasi",
|
||||||
|
"web-sys",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quinn"
|
name = "quinn"
|
||||||
version = "0.11.12"
|
version = "0.11.12"
|
||||||
@@ -3666,6 +3786,15 @@ dependencies = [
|
|||||||
"rand_core 0.10.1",
|
"rand_core 0.10.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "raw-cpuid"
|
||||||
|
version = "11.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.13.2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "reactive_graph"
|
name = "reactive_graph"
|
||||||
version = "0.2.14"
|
version = "0.2.14"
|
||||||
@@ -4566,6 +4695,15 @@ version = "0.10.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3"
|
checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spinning_top"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300"
|
||||||
|
dependencies = [
|
||||||
|
"lock_api",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "spki"
|
name = "spki"
|
||||||
version = "0.7.3"
|
version = "0.7.3"
|
||||||
@@ -4865,6 +5003,17 @@ dependencies = [
|
|||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-stream"
|
||||||
|
version = "0.1.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
"pin-project-lite",
|
||||||
|
"tokio",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-tungstenite"
|
name = "tokio-tungstenite"
|
||||||
version = "0.29.0"
|
version = "0.29.0"
|
||||||
@@ -4943,6 +5092,35 @@ dependencies = [
|
|||||||
"winnow",
|
"winnow",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tonic"
|
||||||
|
version = "0.14.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef"
|
||||||
|
dependencies = [
|
||||||
|
"async-trait",
|
||||||
|
"axum",
|
||||||
|
"base64 0.22.1",
|
||||||
|
"bytes",
|
||||||
|
"h2 0.4.19",
|
||||||
|
"http 1.5.0",
|
||||||
|
"http-body 1.1.0",
|
||||||
|
"http-body-util",
|
||||||
|
"hyper 1.11.1",
|
||||||
|
"hyper-timeout",
|
||||||
|
"hyper-util",
|
||||||
|
"percent-encoding",
|
||||||
|
"pin-project",
|
||||||
|
"socket2 0.6.5",
|
||||||
|
"sync_wrapper",
|
||||||
|
"tokio",
|
||||||
|
"tokio-stream",
|
||||||
|
"tower",
|
||||||
|
"tower-layer",
|
||||||
|
"tower-service",
|
||||||
|
"tracing",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower"
|
name = "tower"
|
||||||
version = "0.5.3"
|
version = "0.5.3"
|
||||||
@@ -4951,9 +5129,12 @@ checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
|
"indexmap 2.14.2",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
|
"slab",
|
||||||
"sync_wrapper",
|
"sync_wrapper",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"tokio-util",
|
||||||
"tower-layer",
|
"tower-layer",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
"tracing",
|
"tracing",
|
||||||
@@ -5065,6 +5246,23 @@ dependencies = [
|
|||||||
"tower-sessions-core",
|
"tower-sessions-core",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tower_governor"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "44de9b94d849d3c46e06a883d72d408c2de6403367b39df2b1c9d9e7b6736fe6"
|
||||||
|
dependencies = [
|
||||||
|
"axum",
|
||||||
|
"forwarded-header-value",
|
||||||
|
"governor",
|
||||||
|
"http 1.5.0",
|
||||||
|
"pin-project",
|
||||||
|
"thiserror 2.0.20",
|
||||||
|
"tonic",
|
||||||
|
"tower",
|
||||||
|
"tracing",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing"
|
name = "tracing"
|
||||||
version = "0.1.44"
|
version = "0.1.44"
|
||||||
@@ -5472,6 +5670,22 @@ dependencies = [
|
|||||||
"rustls-pki-types",
|
"rustls-pki-types",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-i686-pc-windows-gnu",
|
||||||
|
"winapi-x86_64-pc-windows-gnu",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-i686-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi-util"
|
name = "winapi-util"
|
||||||
version = "0.1.11"
|
version = "0.1.11"
|
||||||
@@ -5481,6 +5695,12 @@ dependencies = [
|
|||||||
"windows-sys 0.61.2",
|
"windows-sys 0.61.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-core"
|
name = "windows-core"
|
||||||
version = "0.62.2"
|
version = "0.62.2"
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "iris"
|
name = "iris"
|
||||||
version = "0.3.45"
|
version = "0.5.10"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "The iris over a portal site: nothing from a content repo comes through until it checks out"
|
description = "The iris over a portal site: nothing from a content repo comes through until it checks out"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
@@ -10,7 +10,7 @@ repository = "https://project.uhhm.no/uhhm/iris"
|
|||||||
# The site's own content types and loaders, so iris reads a repo exactly
|
# The site's own content types and loaders, so iris reads a repo exactly
|
||||||
# the way the running site does. Pinned to the portal release it
|
# the way the running site does. Pinned to the portal release it
|
||||||
# matches; bumping this tag is what a new iris release is.
|
# matches; bumping this tag is what a new iris release is.
|
||||||
portal = { git = "https://project.uhhm.no/uhhm/portal.git", tag = "v0.3.45", features = ["ssr"] }
|
portal = { git = "https://project.uhhm.no/uhhm/portal.git", tag = "v0.5.10", features = ["ssr"] }
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
|
|||||||
+67
-4
@@ -73,6 +73,11 @@ pub struct Need {
|
|||||||
/// as a warning, so the gap stays visible without failing CI.
|
/// as a warning, so the gap stays visible without failing CI.
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub planned: bool,
|
pub planned: bool,
|
||||||
|
/// Each state of the bucket in plain words, in the site's
|
||||||
|
/// language, for the scorer: state ids are ASCII, and a Norwegian
|
||||||
|
/// `ikke_lost` reads as English to a model.
|
||||||
|
#[serde(default)]
|
||||||
|
pub stage_words: std::collections::BTreeMap<String, String>,
|
||||||
/// The finished states that are a good outcome for the business -
|
/// The finished states that are a good outcome for the business -
|
||||||
/// a subset of `done_when`. "lost" is finished; "won" is success.
|
/// a subset of `done_when`. "lost" is finished; "won" is success.
|
||||||
/// What a simulation or a live bucket report counts toward.
|
/// What a simulation or a live bucket report counts toward.
|
||||||
@@ -152,11 +157,14 @@ fn visible(q: &Question, as_group: Option<&str>) -> bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// What a person has to fill in: required fields, less the ones that
|
||||||
|
/// carry rather than ask - a `record` naming the case an answer is
|
||||||
|
/// about, a `hidden` preset - which cost nobody anything.
|
||||||
fn required_fields(alt: &Alternative) -> usize {
|
fn required_fields(alt: &Alternative) -> usize {
|
||||||
alt.features
|
alt.features
|
||||||
.iter()
|
.iter()
|
||||||
.flat_map(|f| &f.requirements)
|
.flat_map(|f| &f.requirements)
|
||||||
.filter(|r| !r.optional)
|
.filter(|r| !r.optional && r.kind != "record" && r.kind != "hidden")
|
||||||
.count()
|
.count()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -571,7 +579,8 @@ pub fn sim_model(
|
|||||||
json!({
|
json!({
|
||||||
"page": step.page,
|
"page": step.page,
|
||||||
"question": page.name,
|
"question": page.name,
|
||||||
"options": page.alternatives.iter().filter(|a| !a.disabled).map(|a| json!({
|
"context": page_context(page),
|
||||||
|
"options": page.alternatives.iter().filter(|a| !a.disabled && leads_somewhere(a)).map(|a| json!({
|
||||||
"name": a.name,
|
"name": a.name,
|
||||||
"description": plain(&a.description),
|
"description": plain(&a.description),
|
||||||
})).collect::<Vec<_>>(),
|
})).collect::<Vec<_>>(),
|
||||||
@@ -597,6 +606,7 @@ pub fn sim_model(
|
|||||||
json!({
|
json!({
|
||||||
"initial": schema.initial,
|
"initial": schema.initial,
|
||||||
"transitions": schema.transitions,
|
"transitions": schema.transitions,
|
||||||
|
"words": need.stage_words,
|
||||||
"desks": desks_over(questions, &need.lands_in).iter().map(|d| json!({
|
"desks": desks_over(questions, &need.lands_in).iter().map(|d| json!({
|
||||||
"page": d.page,
|
"page": d.page,
|
||||||
"group": d.group,
|
"group": d.group,
|
||||||
@@ -646,6 +656,41 @@ fn plain(text: &str) -> String {
|
|||||||
text.split_whitespace().collect::<Vec<_>>().join(" ")
|
text.split_whitespace().collect::<Vec<_>>().join(" ")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A card a visitor can act on: it leads to a page, records an
|
||||||
|
/// answer, or moves a record. A card with none of those is read, not
|
||||||
|
/// picked - the opener that says what the business does, the look
|
||||||
|
/// around - and is context on the page, never an option.
|
||||||
|
pub fn leads_somewhere(a: &Alternative) -> bool {
|
||||||
|
a.action.is_some() || a.record_as.is_some() || a.self_transition.is_some()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// What the page says before its options: every card that leads
|
||||||
|
/// nowhere, its heading, description and features, as one line each.
|
||||||
|
pub fn page_context(page: &Question) -> String {
|
||||||
|
page.alternatives
|
||||||
|
.iter()
|
||||||
|
.filter(|a| !a.disabled && !leads_somewhere(a))
|
||||||
|
.map(|a| {
|
||||||
|
let mut line = a.name.clone();
|
||||||
|
let description = plain(&a.description);
|
||||||
|
if !description.is_empty() {
|
||||||
|
line.push_str(&format!(": {description}"));
|
||||||
|
}
|
||||||
|
for f in &a.features {
|
||||||
|
let text = plain(&f.description);
|
||||||
|
match (f.name.trim().is_empty(), text.is_empty()) {
|
||||||
|
(true, true) => {}
|
||||||
|
(true, false) => line.push_str(&format!(" {text}")),
|
||||||
|
(false, true) => line.push_str(&format!(" {}.", f.name.trim())),
|
||||||
|
(false, false) => line.push_str(&format!(" {}: {text}", f.name.trim())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
line
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join("\n")
|
||||||
|
}
|
||||||
|
|
||||||
/// Every (persona, page-on-their-path) pair with a real choice on it.
|
/// Every (persona, page-on-their-path) pair with a real choice on it.
|
||||||
/// `skim` shows the engine only each alternative's heading - what a
|
/// `skim` shows the engine only each alternative's heading - what a
|
||||||
/// visitor who never reads the description has to go on.
|
/// visitor who never reads the description has to go on.
|
||||||
@@ -660,10 +705,11 @@ pub fn tasks(file: &NeedsFile, questions: &Questions, skim: bool) -> Vec<Task> {
|
|||||||
};
|
};
|
||||||
for (i, step) in path.iter().enumerate() {
|
for (i, step) in path.iter().enumerate() {
|
||||||
let page = &questions[&step.page];
|
let page = &questions[&step.page];
|
||||||
let open: Vec<&Alternative> = page.alternatives.iter().filter(|a| !a.disabled).collect();
|
let open: Vec<&Alternative> = page.alternatives.iter().filter(|a| !a.disabled && leads_somewhere(a)).collect();
|
||||||
if open.len() < 2 {
|
if open.len() < 2 {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
let context = page_context(page);
|
||||||
let mut trail: Vec<String> = path[..=i].iter().map(|s| s.page.clone()).collect();
|
let mut trail: Vec<String> = path[..=i].iter().map(|s| s.page.clone()).collect();
|
||||||
let expect: Vec<String> = viable(questions, need, page, need.max_steps - i, i == 0, false, &mut trail)
|
let expect: Vec<String> = viable(questions, need, page, need.max_steps - i, i == 0, false, &mut trail)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
@@ -684,7 +730,11 @@ pub fn tasks(file: &NeedsFile, questions: &Questions, skim: bool) -> Vec<Task> {
|
|||||||
persona: persona.id.clone(),
|
persona: persona.id.clone(),
|
||||||
need: need.id.clone(),
|
need: need.id.clone(),
|
||||||
page: step.page.clone(),
|
page: step.page.clone(),
|
||||||
state: BTreeMap::from([("body", plain(&persona.text))]),
|
state: if context.is_empty() {
|
||||||
|
BTreeMap::from([("body", plain(&persona.text))])
|
||||||
|
} else {
|
||||||
|
BTreeMap::from([("body", plain(&persona.text)), ("page", context)])
|
||||||
|
},
|
||||||
questions: BTreeMap::from([(
|
questions: BTreeMap::from([(
|
||||||
"pick",
|
"pick",
|
||||||
ChoiceQuestion {
|
ChoiceQuestion {
|
||||||
@@ -813,6 +863,19 @@ mod tests {
|
|||||||
let (questions, aggregates) = site(FULL_DESK);
|
let (questions, aggregates) = site(FULL_DESK);
|
||||||
let findings = check(&needs(" max_fields: 1\n"), &questions, &aggregates);
|
let findings = check(&needs(" max_fields: 1\n"), &questions, &aggregates);
|
||||||
assert_eq!(fails(&findings), vec!["the path asks for 2 required field(s), over the budget of 1"]);
|
assert_eq!(fails(&findings), vec!["the path asks for 2 required field(s), over the budget of 1"]);
|
||||||
|
// A field that carries rather than asks is not effort: the
|
||||||
|
// record an answer is about arrives on the link.
|
||||||
|
let (mut questions, aggregates) = site(FULL_DESK);
|
||||||
|
let front = questions.get_mut("/").unwrap();
|
||||||
|
let brief = &mut front.alternatives[0].features[0].requirements;
|
||||||
|
let mut carrier = brief[0].clone();
|
||||||
|
carrier.name = "case".into();
|
||||||
|
carrier.kind = "record".into();
|
||||||
|
carrier.of = Some("projects".into());
|
||||||
|
carrier.optional = false;
|
||||||
|
brief.push(carrier);
|
||||||
|
let findings = check(&needs(" max_fields: 2\n"), &questions, &aggregates);
|
||||||
|
assert!(fails(&findings).is_empty(), "{findings:?}");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user