hecks 3.13.0 → 3.14.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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/examples/pizzas/bluebook/pizzas.bluebook +4 -4
  3. data/lib/hecks/bluebook/dsl/attribute_collector.rb +15 -5
  4. data/lib/hecks/bluebook/named_pattern.rb +33 -0
  5. data/lib/hecks/bluebook.rb +1 -0
  6. data/lib/hecks/cli/domain_stub.rb +1 -1
  7. data/lib/hecks/cli/interview_aggregate.rb +4 -4
  8. data/lib/hecks/deploy/bluebook/deploy.bluebook +34 -34
  9. data/lib/hecks/framework/bluebook/change.bluebook +2 -2
  10. data/lib/hecks/fuzzing/domain_generator/block_rendering.rb +1 -1
  11. data/lib/hecks/hecks/codebase.bluebook +37 -37
  12. data/lib/hecks/hecks/custodian.bluebook +14 -14
  13. data/lib/hecks/hecks/hecks.bluebook +2 -2
  14. data/lib/hecks/hecks/rehearsal.bluebook +3 -3
  15. data/lib/hecks/hecks/tooling.bluebook +22 -22
  16. data/lib/hecks/language/bluebook/aggregate.bluebook +1 -0
  17. data/lib/hecks/language/bluebook/command.bluebook +1 -0
  18. data/lib/hecks/language/bluebook/entity.bluebook +1 -0
  19. data/lib/hecks/language/bluebook/query.bluebook +1 -0
  20. data/lib/hecks/language/bluebook/shape.bluebook +8 -7
  21. data/lib/hecks/language/hecksagon/port_operation.bluebook +1 -0
  22. data/lib/hecks/quality_control/quality_control.bluebook +51 -51
  23. data/lib/hecks/site/bluebook/site.bluebook +5 -5
  24. data/lib/hecks/sme/bluebook/sme.bluebook +12 -12
  25. data/lib/hecks/tickets/bluebook/tickets.bluebook +3 -3
  26. data/lib/hecks/version.rb +1 -1
  27. data/prebuilt/{2b59737fbdbd5f44edda0fddce2611f45d76087b3a7c782d1f1a17ea58c77948.marshal → 1a6f596be124228be93eba1d86dbc9d2933190fa389b284331241cb9f27115a0.marshal} +0 -0
  28. data/prebuilt/{58208399bada10b0db99928c48e38789288fc58f7b71a72b21bfa386680e32ed.marshal → a883a7e568667aa5ac904c82daff356bdf9e996252a36af6def4a4a43efb967e.marshal} +0 -0
  29. data/prebuilt/verdicts-872993b1aa26d73fe48f28251374b8585fed145d02aab42be0f00de386b6ff80.json +1 -0
  30. data/rust/host/HECKS_RELEASE +1 -1
  31. data/rust/host/src/payments/roles.rs +159 -0
  32. data/rust/host/src/payments/tests.rs +25 -0
  33. data/rust/host/src/payments.rs +20 -11
  34. data/rust/parser/src/build/mod.rs +1 -0
  35. data/rust/parser/src/build/named_pattern.rs +23 -0
  36. data/rust/parser/src/keywords.rs +6 -0
  37. data/rust/parser/src/parse/mod.rs +22 -1
  38. metadata +7 -4
  39. data/prebuilt/verdicts-48318ca172edd21443b1ad02801c697fff100b746e828f09db987647641a5df2.json +0 -1
@@ -38,13 +38,13 @@ Hecks.bluebook "Hecks" do
38
38
  identified_by :run
39
39
 
40
40
  value_object "RunKey" do
41
- attribute :value, String, pattern: '[^ \t\n\r]'
41
+ attribute :value, String, matches: :present
42
42
 
43
43
  invariant("a run is named") { !value.to_s.empty? }
44
44
  end
45
45
 
46
46
  value_object "Operation" do
47
- attribute :value, String, pattern: '[^ \t\n\r]'
47
+ attribute :value, String, matches: :present
48
48
  end
49
49
 
50
50
  value_object "Switch" do
@@ -57,7 +57,7 @@ Hecks.bluebook "Hecks" do
57
57
 
58
58
  # A keyword of the language, or the keyword an argument belongs to.
59
59
  value_object "Word" do
60
- attribute :value, String, pattern: '[^ \t\n\r]'
60
+ attribute :value, String, matches: :present
61
61
 
62
62
  invariant("a word is named") { !value.to_s.empty? }
63
63
  end
@@ -94,7 +94,7 @@ Hecks.bluebook "Hecks" do
94
94
 
95
95
  # How a pairs argument is read, such as verbatim.
96
96
  value_object "Shape" do
97
- attribute :value, String, pattern: '[^ \t\n\r]'
97
+ attribute :value, String, matches: :present
98
98
  end
99
99
 
100
100
  lifecycle :status, default: "requested" do
@@ -641,13 +641,13 @@ Hecks.bluebook "Hecks" do
641
641
  identified_by :run
642
642
 
643
643
  value_object "RunKey" do
644
- attribute :value, String, pattern: '[^ \t\n\r]'
644
+ attribute :value, String, matches: :present
645
645
 
646
646
  invariant("a run is named") { !value.to_s.empty? }
647
647
  end
648
648
 
649
649
  value_object "Operation" do
650
- attribute :value, String, pattern: '[^ \t\n\r]'
650
+ attribute :value, String, matches: :present
651
651
  end
652
652
 
653
653
  value_object "Switch" do
@@ -796,13 +796,13 @@ Hecks.bluebook "Hecks" do
796
796
  identified_by :run
797
797
 
798
798
  value_object "RunKey" do
799
- attribute :value, String, pattern: '[^ \t\n\r]'
799
+ attribute :value, String, matches: :present
800
800
 
801
801
  invariant("a run is named") { !value.to_s.empty? }
802
802
  end
803
803
 
804
804
  value_object "Operation" do
805
- attribute :value, String, pattern: '[^ \t\n\r]'
805
+ attribute :value, String, matches: :present
806
806
  end
807
807
 
808
808
  value_object "Switch" do
@@ -971,13 +971,13 @@ Hecks.bluebook "Hecks" do
971
971
  identified_by :run
972
972
 
973
973
  value_object "RunKey" do
974
- attribute :value, String, pattern: '[^ \t\n\r]'
974
+ attribute :value, String, matches: :present
975
975
 
976
976
  invariant("a run is named") { !value.to_s.empty? }
977
977
  end
978
978
 
979
979
  value_object "Operation" do
980
- attribute :value, String, pattern: '[^ \t\n\r]'
980
+ attribute :value, String, matches: :present
981
981
  end
982
982
 
983
983
  value_object "Switch" do
@@ -990,7 +990,7 @@ Hecks.bluebook "Hecks" do
990
990
 
991
991
  # A `CiGate` row of the Vocabulary chapter, by name.
992
992
  value_object "GateName" do
993
- attribute :value, String, pattern: '[^ \t\n\r]'
993
+ attribute :value, String, matches: :present
994
994
  end
995
995
 
996
996
  lifecycle :status, default: "requested" do
@@ -1201,17 +1201,17 @@ Hecks.bluebook "Hecks" do
1201
1201
  identified_by :run
1202
1202
 
1203
1203
  value_object "RunKey" do
1204
- attribute :value, String, pattern: '[^ \t\n\r]'
1204
+ attribute :value, String, matches: :present
1205
1205
 
1206
1206
  invariant("a run is named") { !value.to_s.empty? }
1207
1207
  end
1208
1208
 
1209
1209
  value_object "Operation" do
1210
- attribute :value, String, pattern: '[^ \t\n\r]'
1210
+ attribute :value, String, matches: :present
1211
1211
  end
1212
1212
 
1213
1213
  value_object "Stage" do
1214
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
1214
+ attribute :value, String, matches: :snake_name
1215
1215
 
1216
1216
  invariant("a stage is named") { !value.to_s.empty? }
1217
1217
  end
@@ -1355,13 +1355,13 @@ Hecks.bluebook "Hecks" do
1355
1355
  identified_by :run
1356
1356
 
1357
1357
  value_object "RunKey" do
1358
- attribute :value, String, pattern: '[^ \t\n\r]'
1358
+ attribute :value, String, matches: :present
1359
1359
 
1360
1360
  invariant("a run is named") { !value.to_s.empty? }
1361
1361
  end
1362
1362
 
1363
1363
  value_object "Operation" do
1364
- attribute :value, String, pattern: '[^ \t\n\r]'
1364
+ attribute :value, String, matches: :present
1365
1365
  end
1366
1366
 
1367
1367
  value_object "Switch" do
@@ -1391,12 +1391,12 @@ Hecks.bluebook "Hecks" do
1391
1391
 
1392
1392
  # A revision a code comparison is made against.
1393
1393
  value_object "Ref" do
1394
- attribute :value, String, pattern: '^[^ \t\n\r]+$'
1394
+ attribute :value, String, matches: :no_whitespace
1395
1395
  end
1396
1396
 
1397
1397
  # A JSON file.
1398
1398
  value_object "FilePath" do
1399
- attribute :value, String, pattern: '[^\t\n\r]'
1399
+ attribute :value, String, matches: :not_empty
1400
1400
 
1401
1401
  invariant("a file is named") { !value.to_s.empty? }
1402
1402
  end
@@ -1676,13 +1676,13 @@ Hecks.bluebook "Hecks" do
1676
1676
  identified_by :run
1677
1677
 
1678
1678
  value_object "RunKey" do
1679
- attribute :value, String, pattern: '[^ \t\n\r]'
1679
+ attribute :value, String, matches: :present
1680
1680
 
1681
1681
  invariant("a run is named") { !value.to_s.empty? }
1682
1682
  end
1683
1683
 
1684
1684
  value_object "Operation" do
1685
- attribute :value, String, pattern: '[^ \t\n\r]'
1685
+ attribute :value, String, matches: :present
1686
1686
  end
1687
1687
 
1688
1688
  value_object "Switch" do
@@ -1891,13 +1891,13 @@ Hecks.bluebook "Hecks" do
1891
1891
  identified_by :run
1892
1892
 
1893
1893
  value_object "RunKey" do
1894
- attribute :value, String, pattern: '[^ \t\n\r]'
1894
+ attribute :value, String, matches: :present
1895
1895
 
1896
1896
  invariant("a run is named") { !value.to_s.empty? }
1897
1897
  end
1898
1898
 
1899
1899
  value_object "Operation" do
1900
- attribute :value, String, pattern: '[^ \t\n\r]'
1900
+ attribute :value, String, matches: :present
1901
1901
  end
1902
1902
 
1903
1903
  value_object "Switch" do
@@ -2064,13 +2064,13 @@ Hecks.bluebook "Hecks" do
2064
2064
  identified_by :run
2065
2065
 
2066
2066
  value_object "RunKey" do
2067
- attribute :value, String, pattern: '[^ \t\n\r]'
2067
+ attribute :value, String, matches: :present
2068
2068
 
2069
2069
  invariant("a run is named") { !value.to_s.empty? }
2070
2070
  end
2071
2071
 
2072
2072
  value_object "Operation" do
2073
- attribute :value, String, pattern: '[^ \t\n\r]'
2073
+ attribute :value, String, matches: :present
2074
2074
  end
2075
2075
 
2076
2076
  value_object "Switch" do
@@ -2090,19 +2090,19 @@ Hecks.bluebook "Hecks" do
2090
2090
 
2091
2091
  # A CI run's number.
2092
2092
  value_object "RunId" do
2093
- attribute :value, String, pattern: '^[0-9]+$'
2093
+ attribute :value, String, matches: :digits
2094
2094
  end
2095
2095
 
2096
2096
  # A file, relative to the checkout or absolute.
2097
2097
  value_object "FilePath" do
2098
- attribute :value, String, pattern: '[^\t\n\r]'
2098
+ attribute :value, String, matches: :not_empty
2099
2099
 
2100
2100
  invariant("a file is named") { !value.to_s.empty? }
2101
2101
  end
2102
2102
 
2103
2103
  # Part of an example's description.
2104
2104
  value_object "ExampleText" do
2105
- attribute :value, String, pattern: '[^\t\n\r]'
2105
+ attribute :value, String, matches: :not_empty
2106
2106
 
2107
2107
  invariant("an example is named") { !value.to_s.empty? }
2108
2108
  end
@@ -2114,7 +2114,7 @@ Hecks.bluebook "Hecks" do
2114
2114
 
2115
2115
  # A regular expression naming the specs to leave out.
2116
2116
  value_object "ExcludePattern" do
2117
- attribute :value, String, pattern: '[^\t\n\r]'
2117
+ attribute :value, String, matches: :not_empty
2118
2118
  end
2119
2119
 
2120
2120
  # The tag filter, as the test runner spells it.
@@ -2390,13 +2390,13 @@ Hecks.bluebook "Hecks" do
2390
2390
  identified_by :run
2391
2391
 
2392
2392
  value_object "RunKey" do
2393
- attribute :value, String, pattern: '[^ \t\n\r]'
2393
+ attribute :value, String, matches: :present
2394
2394
 
2395
2395
  invariant("a run is named") { !value.to_s.empty? }
2396
2396
  end
2397
2397
 
2398
2398
  value_object "Operation" do
2399
- attribute :value, String, pattern: '[^ \t\n\r]'
2399
+ attribute :value, String, matches: :present
2400
2400
  end
2401
2401
 
2402
2402
  value_object "Switch" do
@@ -2424,7 +2424,7 @@ Hecks.bluebook "Hecks" do
2424
2424
 
2425
2425
  # The name of one field of a construct.
2426
2426
  value_object "FieldName" do
2427
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
2427
+ attribute :value, String, matches: :snake_name
2428
2428
  end
2429
2429
 
2430
2430
  # A local port a server listens on.
@@ -2633,13 +2633,13 @@ Hecks.bluebook "Hecks" do
2633
2633
  identified_by :run
2634
2634
 
2635
2635
  value_object "RunKey" do
2636
- attribute :value, String, pattern: '[^ \t\n\r]'
2636
+ attribute :value, String, matches: :present
2637
2637
 
2638
2638
  invariant("a run is named") { !value.to_s.empty? }
2639
2639
  end
2640
2640
 
2641
2641
  value_object "Operation" do
2642
- attribute :value, String, pattern: '[^ \t\n\r]'
2642
+ attribute :value, String, matches: :present
2643
2643
  end
2644
2644
 
2645
2645
  value_object "Switch" do
@@ -2652,7 +2652,7 @@ Hecks.bluebook "Hecks" do
2652
2652
 
2653
2653
  # One word of a fact: a branch, a commit, whether a tag stands.
2654
2654
  value_object "Word" do
2655
- attribute :value, String, pattern: '[^ \t\n\r]'
2655
+ attribute :value, String, matches: :present
2656
2656
  end
2657
2657
 
2658
2658
  value_object "Version" do
@@ -2968,13 +2968,13 @@ Hecks.bluebook "Hecks" do
2968
2968
  identified_by :run
2969
2969
 
2970
2970
  value_object "RunKey" do
2971
- attribute :value, String, pattern: '[^ \t\n\r]'
2971
+ attribute :value, String, matches: :present
2972
2972
 
2973
2973
  invariant("a run is named") { !value.to_s.empty? }
2974
2974
  end
2975
2975
 
2976
2976
  value_object "Operation" do
2977
- attribute :value, String, pattern: '[^ \t\n\r]'
2977
+ attribute :value, String, matches: :present
2978
2978
  end
2979
2979
 
2980
2980
  value_object "Switch" do
@@ -2987,7 +2987,7 @@ Hecks.bluebook "Hecks" do
2987
2987
 
2988
2988
  # A branch name, or a commit.
2989
2989
  value_object "Word" do
2990
- attribute :value, String, pattern: '[^ \t\n\r]'
2990
+ attribute :value, String, matches: :present
2991
2991
  end
2992
2992
 
2993
2993
  # How long a lane has stood behind the lane it follows, or how long its row lets it.
@@ -27,14 +27,14 @@ Hecks.bluebook "Hecks" do
27
27
  identified_by :run
28
28
 
29
29
  value_object "OperationKey" do
30
- attribute :value, String, pattern: '[^ \t\n\r]'
30
+ attribute :value, String, matches: :present
31
31
 
32
32
  invariant("an operation is named") { !value.to_s.empty? }
33
33
  end
34
34
 
35
35
  # What the operation acts on: a domain directory, or a behaviors file or directory.
36
36
  value_object "Subject" do
37
- attribute :value, String, pattern: '[^\t\n\r]'
37
+ attribute :value, String, matches: :not_empty
38
38
  end
39
39
 
40
40
  value_object "Script" do
@@ -42,7 +42,7 @@ Hecks.bluebook "Hecks" do
42
42
  end
43
43
 
44
44
  value_object "Verb" do
45
- attribute :value, String, pattern: '[^ \t\n\r]'
45
+ attribute :value, String, matches: :present
46
46
  end
47
47
 
48
48
  # One `name=value` word of the verb a run dispatches.
@@ -59,7 +59,7 @@ Hecks.bluebook "Hecks" do
59
59
  end
60
60
 
61
61
  value_object "HeaderName" do
62
- attribute :value, String, pattern: '[^ \t\n\r]'
62
+ attribute :value, String, matches: :present
63
63
  end
64
64
 
65
65
  value_object "Scheme" do
@@ -71,7 +71,7 @@ Hecks.bluebook "Hecks" do
71
71
  end
72
72
 
73
73
  value_object "PayloadFile" do
74
- attribute :value, String, pattern: '[^\t\n\r]'
74
+ attribute :value, String, matches: :not_empty
75
75
  end
76
76
 
77
77
  value_object "Output" do
@@ -84,11 +84,11 @@ Hecks.bluebook "Hecks" do
84
84
  end
85
85
 
86
86
  value_object "PersonName" do
87
- attribute :value, String, pattern: '[^\t\n\r]'
87
+ attribute :value, String, matches: :not_empty
88
88
  end
89
89
 
90
90
  value_object "RoleName" do
91
- attribute :value, String, pattern: '^[^ \t\n\r]+$'
91
+ attribute :value, String, matches: :no_whitespace
92
92
  end
93
93
 
94
94
  lifecycle :status, default: "requested" do
@@ -361,7 +361,7 @@ Hecks.bluebook "Hecks" do
361
361
 
362
362
  # The file listing the eras that should be running, one per line.
363
363
  value_object "ExpectedFile" do
364
- attribute :value, String, pattern: '[^\t\n\r]'
364
+ attribute :value, String, matches: :not_empty
365
365
  end
366
366
 
367
367
  value_object "Seconds" do
@@ -371,7 +371,7 @@ Hecks.bluebook "Hecks" do
371
371
  end
372
372
 
373
373
  value_object "EraId" do
374
- attribute :value, String, pattern: '[^ \t\n\r]'
374
+ attribute :value, String, matches: :present
375
375
  end
376
376
 
377
377
  value_object "VersionText" do
@@ -546,14 +546,14 @@ policy "RecordTheEra" do
546
546
  identified_by :run
547
547
 
548
548
  value_object "RunKey" do
549
- attribute :value, String, pattern: '[^ \t\n\r]'
549
+ attribute :value, String, matches: :present
550
550
 
551
551
  invariant("a change is named") { !value.to_s.empty? }
552
552
  end
553
553
 
554
554
  # The domain whose journal is changed: its directory.
555
555
  value_object "DomainPath" do
556
- attribute :value, String, pattern: '[^\t\n\r]'
556
+ attribute :value, String, matches: :not_empty
557
557
  end
558
558
 
559
559
  value_object "OperationName" do
@@ -574,7 +574,7 @@ policy "RecordTheEra" do
574
574
 
575
575
  # Aggregate names, comma separated; every aggregate that keeps a journal when absent.
576
576
  value_object "AggregateList" do
577
- attribute :value, String, pattern: '[^\t\n\r]'
577
+ attribute :value, String, matches: :not_empty
578
578
  end
579
579
 
580
580
  value_object "Switch" do
@@ -588,11 +588,11 @@ policy "RecordTheEra" do
588
588
  # The rehearsal a compute or rekey edge is approved on: the snapshot it ran against, the host
589
589
  # that ran it, whether it passed, and when.
590
590
  value_object "Snapshot" do
591
- attribute :value, String, pattern: '[^\t\n\r]'
591
+ attribute :value, String, matches: :not_empty
592
592
  end
593
593
 
594
594
  value_object "HostVersion" do
595
- attribute :value, String, pattern: '[^ \t\n\r]'
595
+ attribute :value, String, matches: :present
596
596
  end
597
597
 
598
598
  value_object "Verdict" do
@@ -14,7 +14,7 @@ Hecks.bluebook "Hecks" do
14
14
  identified_by :version
15
15
 
16
16
  value_object "FindingKey" do
17
- attribute :value, String, pattern: '[^ \t\n\r]'
17
+ attribute :value, String, matches: :present
18
18
  end
19
19
 
20
20
  value_object "Version" do
@@ -94,7 +94,7 @@ Hecks.bluebook "Hecks" do
94
94
  identified_by :digest
95
95
 
96
96
  value_object "Digest" do
97
- attribute :value, String, pattern: '[^ \t\n\r]'
97
+ attribute :value, String, matches: :present
98
98
 
99
99
  invariant("a digest is present") { !value.to_s.empty? }
100
100
  end
@@ -53,14 +53,14 @@ Hecks.bluebook "Hecks" do
53
53
  identified_by :run
54
54
 
55
55
  value_object "RunKey" do
56
- attribute :value, String, pattern: '[^ \t\n\r]'
56
+ attribute :value, String, matches: :present
57
57
 
58
58
  invariant("a rehearsal is named") { !value.to_s.empty? }
59
59
  end
60
60
 
61
61
  # The domain's directory: where its bluebooks and its `.world` stand.
62
62
  value_object "DomainPath" do
63
- attribute :value, String, pattern: '[^\t\n\r]'
63
+ attribute :value, String, matches: :not_empty
64
64
  end
65
65
 
66
66
  # The Hecks the rehearsal must run on: a release (`3.9.0`) or a commit, whole or a prefix.
@@ -69,7 +69,7 @@ Hecks.bluebook "Hecks" do
69
69
  end
70
70
 
71
71
  value_object "HostVersion" do
72
- attribute :value, String, pattern: '[^ \t\n\r]'
72
+ attribute :value, String, matches: :present
73
73
  end
74
74
 
75
75
  # Which strategy the subject's world named for the copy of its data.
@@ -10,19 +10,19 @@ Hecks.bluebook "Hecks" do
10
10
  identified_by :domain
11
11
 
12
12
  value_object "DomainPath" do
13
- attribute :value, String, pattern: '[^\t\n\r]'
13
+ attribute :value, String, matches: :not_empty
14
14
 
15
15
  invariant("a domain is named by its path") { !value.to_s.empty? }
16
16
  end
17
17
 
18
18
  value_object "ChapterName" do
19
- attribute :value, String, pattern: '[^ \t\n\r]'
19
+ attribute :value, String, matches: :present
20
20
 
21
21
  invariant("a chapter is named") { !value.to_s.empty? }
22
22
  end
23
23
 
24
24
  value_object "AggregateName" do
25
- attribute :value, String, pattern: '[^ \t\n\r]'
25
+ attribute :value, String, matches: :present
26
26
 
27
27
  invariant("an aggregate is named") { !value.to_s.empty? }
28
28
  end
@@ -128,13 +128,13 @@ Hecks.bluebook "Hecks" do
128
128
  identified_by :run
129
129
 
130
130
  value_object "RunKey" do
131
- attribute :value, String, pattern: '[^ \t\n\r]'
131
+ attribute :value, String, matches: :present
132
132
 
133
133
  invariant("a run is named") { !value.to_s.empty? }
134
134
  end
135
135
 
136
136
  value_object "DomainList" do
137
- attribute :value, String, pattern: '[^\t\n\r]'
137
+ attribute :value, String, matches: :not_empty
138
138
  end
139
139
 
140
140
  value_object "ProfileName" do
@@ -254,7 +254,7 @@ Hecks.bluebook "Hecks" do
254
254
 
255
255
  # A directory: the source repository (`from`), or the project the files land in (`root`).
256
256
  value_object "Location" do
257
- attribute :value, String, pattern: '[^\t\n\r]'
257
+ attribute :value, String, matches: :not_empty
258
258
  end
259
259
 
260
260
  value_object "Report" do
@@ -383,18 +383,18 @@ Hecks.bluebook "Hecks" do
383
383
  identified_by :run
384
384
 
385
385
  value_object "RegistryKey" do
386
- attribute :value, String, pattern: '[^ \t\n\r]'
386
+ attribute :value, String, matches: :present
387
387
 
388
388
  invariant("a release is named") { !value.to_s.empty? }
389
389
  end
390
390
 
391
391
  value_object "PackageName" do
392
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
392
+ attribute :value, String, matches: :snake_name
393
393
  end
394
394
 
395
395
  # The registry repository: the current directory when absent.
396
396
  value_object "Location" do
397
- attribute :value, String, pattern: '[^\t\n\r]'
397
+ attribute :value, String, matches: :not_empty
398
398
  end
399
399
 
400
400
  value_object "Report" do
@@ -520,14 +520,14 @@ Hecks.bluebook "Hecks" do
520
520
  identified_by :run
521
521
 
522
522
  value_object "LaunchKey" do
523
- attribute :value, String, pattern: '[^ \t\n\r]'
523
+ attribute :value, String, matches: :present
524
524
 
525
525
  invariant("a launch is named") { !value.to_s.empty? }
526
526
  end
527
527
 
528
528
  # Domain directories under the project, comma separated.
529
529
  value_object "DomainList" do
530
- attribute :value, String, pattern: '[^\t\n\r]'
530
+ attribute :value, String, matches: :not_empty
531
531
  end
532
532
 
533
533
  value_object "Switch" do
@@ -546,12 +546,12 @@ Hecks.bluebook "Hecks" do
546
546
 
547
547
  # Where the new domain goes; the domain's snake-cased name under the current directory when absent.
548
548
  value_object "TargetDir" do
549
- attribute :value, String, pattern: '[^\t\n\r]'
549
+ attribute :value, String, matches: :not_empty
550
550
  end
551
551
 
552
552
  # Who is interviewed; asked for at the terminal when absent.
553
553
  value_object "ExpertName" do
554
- attribute :value, String, pattern: '[^\t\n\r]'
554
+ attribute :value, String, matches: :not_empty
555
555
  end
556
556
 
557
557
  value_object "Note" do
@@ -724,7 +724,7 @@ Hecks.bluebook "Hecks" do
724
724
  identified_by :run
725
725
 
726
726
  value_object "BuildKey" do
727
- attribute :value, String, pattern: '[^ \t\n\r]'
727
+ attribute :value, String, matches: :present
728
728
 
729
729
  invariant("a build is named") { !value.to_s.empty? }
730
730
  end
@@ -737,18 +737,18 @@ Hecks.bluebook "Hecks" do
737
737
 
738
738
  # A generated module: the directory name a domain was built as.
739
739
  value_object "ModuleName" do
740
- attribute :value, String, pattern: '^[a-z][a-z0-9_]*$'
740
+ attribute :value, String, matches: :snake_name
741
741
  end
742
742
 
743
743
  # A JSON file of steps for a domain to replay.
744
744
  value_object "ScriptPath" do
745
- attribute :value, String, pattern: '[^\t\n\r]'
745
+ attribute :value, String, matches: :not_empty
746
746
  end
747
747
 
748
748
  # What a build is replayed through: `native`, `build` (the domain's own feature), a `.wasm`
749
749
  # module, or a binary.
750
750
  value_object "Artifact" do
751
- attribute :value, String, pattern: '[^ \t\n\r]'
751
+ attribute :value, String, matches: :present
752
752
  end
753
753
 
754
754
  # A Rust target triple: `<arch>-<vendor>-<os>` with an optional `-<env>`. The toolchain
@@ -759,7 +759,7 @@ Hecks.bluebook "Hecks" do
759
759
 
760
760
  # The directory a host build stages its files in.
761
761
  value_object "StagePath" do
762
- attribute :value, String, pattern: '[^\t\n\r]'
762
+ attribute :value, String, matches: :not_empty
763
763
  end
764
764
 
765
765
  value_object "Count" do
@@ -1014,14 +1014,14 @@ Hecks.bluebook "Hecks" do
1014
1014
  identified_by :run
1015
1015
 
1016
1016
  value_object "FuzzKey" do
1017
- attribute :value, String, pattern: '[^ \t\n\r]'
1017
+ attribute :value, String, matches: :present
1018
1018
 
1019
1019
  invariant("a sweep is named") { !value.to_s.empty? }
1020
1020
  end
1021
1021
 
1022
1022
  # A domain directory; a sweep with none covers every domain of a hecks checkout.
1023
1023
  value_object "DomainPath" do
1024
- attribute :value, String, pattern: '[^\t\n\r]'
1024
+ attribute :value, String, matches: :not_empty
1025
1025
 
1026
1026
  invariant("a domain is named by its path") { !value.to_s.empty? }
1027
1027
  end
@@ -1054,7 +1054,7 @@ Hecks.bluebook "Hecks" do
1054
1054
  end
1055
1055
 
1056
1056
  value_object "BinaryPath" do
1057
- attribute :value, String, pattern: '[^\t\n\r]'
1057
+ attribute :value, String, matches: :not_empty
1058
1058
  end
1059
1059
 
1060
1060
  value_object "Format" do
@@ -1062,7 +1062,7 @@ Hecks.bluebook "Hecks" do
1062
1062
  end
1063
1063
 
1064
1064
  value_object "OutputPath" do
1065
- attribute :value, String, pattern: '[^\t\n\r]'
1065
+ attribute :value, String, matches: :not_empty
1066
1066
  end
1067
1067
 
1068
1068
  value_object "Report" do
@@ -440,6 +440,7 @@ Hecks.bluebook "Bluebook" do
440
440
  member keyword: "attribute", context: "Aggregate", at: "", named: "default", kind: "literal", required: "false", fills: "default"
441
441
  member keyword: "attribute", context: "Aggregate", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
442
442
  member keyword: "attribute", context: "Aggregate", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
443
+ member keyword: "attribute", context: "Aggregate", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
443
444
  member keyword: "attribute", context: "Aggregate", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
444
445
  member keyword: "attribute", context: "Aggregate", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
445
446
  member keyword: "invariant", context: "Aggregate", at: "1", named: "", kind: "text", required: "true", fills: "description"
@@ -368,6 +368,7 @@ Hecks.bluebook "Bluebook" do
368
368
  member keyword: "attribute", context: "Command", at: "", named: "default", kind: "literal", required: "false", fills: "default"
369
369
  member keyword: "attribute", context: "Command", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
370
370
  member keyword: "attribute", context: "Command", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
371
+ member keyword: "attribute", context: "Command", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
371
372
  member keyword: "attribute", context: "Command", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
372
373
  member keyword: "attribute", context: "Command", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
373
374
  # `reason` is required in practice; CommandBuilder#corrects_impl refuses its absence.
@@ -319,6 +319,7 @@ Hecks.bluebook "Bluebook" do
319
319
  member keyword: "attribute", context: "Entity", at: "", named: "default", kind: "literal", required: "false", fills: "default"
320
320
  member keyword: "attribute", context: "Entity", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
321
321
  member keyword: "attribute", context: "Entity", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
322
+ member keyword: "attribute", context: "Entity", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
322
323
  member keyword: "attribute", context: "Entity", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
323
324
  member keyword: "attribute", context: "Entity", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
324
325
  member keyword: "reference_to", context: "Entity", at: "1", named: "", kind: "constant", required: "true", fills: "type"
@@ -229,6 +229,7 @@ Hecks.bluebook "Bluebook" do
229
229
  member keyword: "attribute", context: "Query", at: "", named: "default", kind: "literal", required: "false", fills: "default"
230
230
  member keyword: "attribute", context: "Query", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
231
231
  member keyword: "attribute", context: "Query", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
232
+ member keyword: "attribute", context: "Query", at: "", named: "matches", kind: "symbol", required: "false", fills: "matches"
232
233
  member keyword: "attribute", context: "Query", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
233
234
  member keyword: "attribute", context: "Query", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
234
235
  member keyword: "reference_to", context: "Query", at: "1", named: "", kind: "constant", required: "true", fills: "type"