all_futures 1.0.3 → 2.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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -1
  3. data/Gemfile.lock +272 -61
  4. data/LICENSE.txt +1 -1
  5. data/README.md +59 -79
  6. data/Rakefile +13 -1
  7. data/SUMMARY.md +22 -2
  8. data/bin/console +8 -0
  9. data/bin/loc +0 -0
  10. data/bin/setup +0 -0
  11. data/bin/standardize +0 -0
  12. data/lib/all_futures/association.rb +42 -0
  13. data/lib/all_futures/association_index.rb +69 -0
  14. data/lib/all_futures/attributes.rb +28 -0
  15. data/lib/all_futures/base.rb +66 -0
  16. data/lib/all_futures/callbacks.rb +71 -0
  17. data/lib/all_futures/configuration.rb +9 -0
  18. data/lib/all_futures/dirty.rb +116 -0
  19. data/lib/all_futures/embeds.rb +40 -0
  20. data/lib/all_futures/errors.rb +37 -0
  21. data/lib/all_futures/finder.rb +214 -0
  22. data/lib/all_futures/locale/en.yml +49 -0
  23. data/lib/all_futures/persistence.rb +595 -0
  24. data/lib/all_futures/presenter.rb +35 -0
  25. data/lib/all_futures/railtie.rb +26 -0
  26. data/lib/all_futures/translation.rb +22 -0
  27. data/lib/all_futures/validations.rb +10 -0
  28. data/lib/all_futures/version.rb +3 -1
  29. data/lib/all_futures/versions.rb +80 -0
  30. data/lib/all_futures.rb +24 -1
  31. data/lib/vendor/ACTIVE_ENTITY_MIT-LICENSE +42 -0
  32. data/lib/vendor/README.md +8 -0
  33. data/lib/vendor/active_entity/aggregations.rb +277 -0
  34. data/lib/vendor/active_entity/associations/embeds/association.rb +134 -0
  35. data/lib/vendor/active_entity/associations/embeds/builder/association.rb +105 -0
  36. data/lib/vendor/active_entity/associations/embeds/builder/collection_association.rb +71 -0
  37. data/lib/vendor/active_entity/associations/embeds/builder/embedded_in.rb +38 -0
  38. data/lib/vendor/active_entity/associations/embeds/builder/embeds_many.rb +13 -0
  39. data/lib/vendor/active_entity/associations/embeds/builder/embeds_one.rb +16 -0
  40. data/lib/vendor/active_entity/associations/embeds/builder/singular_association.rb +28 -0
  41. data/lib/vendor/active_entity/associations/embeds/collection_association.rb +209 -0
  42. data/lib/vendor/active_entity/associations/embeds/collection_proxy.rb +310 -0
  43. data/lib/vendor/active_entity/associations/embeds/embedded_in_association.rb +31 -0
  44. data/lib/vendor/active_entity/associations/embeds/embeds_many_association.rb +15 -0
  45. data/lib/vendor/active_entity/associations/embeds/embeds_one_association.rb +26 -0
  46. data/lib/vendor/active_entity/associations/embeds/singular_association.rb +35 -0
  47. data/lib/vendor/active_entity/associations.rb +168 -0
  48. data/lib/vendor/active_entity/attribute_assignment.rb +87 -0
  49. data/lib/vendor/active_entity/attribute_decorators.rb +90 -0
  50. data/lib/vendor/active_entity/attribute_methods/before_type_cast.rb +78 -0
  51. data/lib/vendor/active_entity/attribute_methods/dirty.rb +180 -0
  52. data/lib/vendor/active_entity/attribute_methods/primary_key.rb +96 -0
  53. data/lib/vendor/active_entity/attribute_methods/query.rb +38 -0
  54. data/lib/vendor/active_entity/attribute_methods/read.rb +44 -0
  55. data/lib/vendor/active_entity/attribute_methods/serialization.rb +90 -0
  56. data/lib/vendor/active_entity/attribute_methods/time_zone_conversion.rb +93 -0
  57. data/lib/vendor/active_entity/attribute_methods/write.rb +54 -0
  58. data/lib/vendor/active_entity/attribute_methods.rb +833 -0
  59. data/lib/vendor/active_entity/attributes.rb +240 -0
  60. data/lib/vendor/active_entity/base.rb +293 -0
  61. data/lib/vendor/active_entity/callbacks.rb +21 -0
  62. data/lib/vendor/active_entity/coders/json.rb +15 -0
  63. data/lib/vendor/active_entity/coders/yaml_column.rb +50 -0
  64. data/lib/vendor/active_entity/core.rb +348 -0
  65. data/lib/vendor/active_entity/enum.rb +260 -0
  66. data/lib/vendor/active_entity/errors.rb +69 -0
  67. data/lib/vendor/active_entity/gem_version.rb +17 -0
  68. data/lib/vendor/active_entity/inheritance.rb +176 -0
  69. data/lib/vendor/active_entity/integration.rb +78 -0
  70. data/lib/vendor/active_entity/locale/en.yml +45 -0
  71. data/lib/vendor/active_entity/model_schema.rb +118 -0
  72. data/lib/vendor/active_entity/nested_attributes.rb +554 -0
  73. data/lib/vendor/active_entity/persistence.rb +20 -0
  74. data/lib/vendor/active_entity/railtie.rb +76 -0
  75. data/lib/vendor/active_entity/readonly_attributes.rb +55 -0
  76. data/lib/vendor/active_entity/reflection.rb +447 -0
  77. data/lib/vendor/active_entity/serialization.rb +28 -0
  78. data/lib/vendor/active_entity/store.rb +291 -0
  79. data/lib/vendor/active_entity/translation.rb +24 -0
  80. data/lib/vendor/active_entity/type/date.rb +9 -0
  81. data/lib/vendor/active_entity/type/date_time.rb +9 -0
  82. data/lib/vendor/active_entity/type/internal/timezone.rb +17 -0
  83. data/lib/vendor/active_entity/type/json.rb +30 -0
  84. data/lib/vendor/active_entity/type/modifiers/array.rb +72 -0
  85. data/lib/vendor/active_entity/type/modifiers/array_without_blank.rb +19 -0
  86. data/lib/vendor/active_entity/type/registry.rb +112 -0
  87. data/lib/vendor/active_entity/type/serialized.rb +71 -0
  88. data/lib/vendor/active_entity/type/text.rb +11 -0
  89. data/lib/vendor/active_entity/type/time.rb +21 -0
  90. data/lib/vendor/active_entity/type/unsigned_integer.rb +17 -0
  91. data/lib/vendor/active_entity/type.rb +75 -0
  92. data/lib/vendor/active_entity/validate_embeds_association.rb +300 -0
  93. data/lib/vendor/active_entity/validations/absence.rb +25 -0
  94. data/lib/vendor/active_entity/validations/associated.rb +60 -0
  95. data/lib/vendor/active_entity/validations/length.rb +26 -0
  96. data/lib/vendor/active_entity/validations/presence.rb +68 -0
  97. data/lib/vendor/active_entity/validations/subset.rb +76 -0
  98. data/lib/vendor/active_entity/validations/uniqueness_in_embeds.rb +91 -0
  99. data/lib/vendor/active_entity/validations/uniqueness_on_active_record.rb +234 -0
  100. data/lib/vendor/active_entity/validations.rb +47 -0
  101. data/lib/vendor/active_entity/version.rb +10 -0
  102. data/lib/vendor/active_entity.rb +99 -0
  103. data/lib/vendor/core_ext/array_without_blank.rb +48 -0
  104. metadata +175 -21
  105. data/lib/all_futures/all_futures.rb +0 -28
  106. data/lib/all_futures/config.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27311f9ce52dd5cbeafae0312e8ccd79bcd59bd90c5bf92227d9132377cf63c2
4
- data.tar.gz: c046ac9eb008984c72c053943b416243e438ab4789254bb192fced0ce269ace4
3
+ metadata.gz: 7454c3fb8e37a7b7754c266c9856737b31b217ada0c4d62f896c3ca82451280f
4
+ data.tar.gz: 40cc91c58547f9cfdf03a0fc9ab2623d49a763ea7b674c9a1454e0cd2e0f2d7c
5
5
  SHA512:
6
- metadata.gz: 5284a0ebc8318139627824a9c610912669d689266a8bca2ca88e9f4f6c0f27a1cc0cb253b6feae76711f66146089e33b45778b6a5399c74c46fddb713a61c818
7
- data.tar.gz: 52b4c725601cff3a8f4a0ed8c90a485d730cc58dc348c3d946b33752256e005d297a14dbda7a83b16493401f96e568ce414f11a9b0b10ee54cd4b74ba45ffc0e
6
+ metadata.gz: 5e19c322c95496442a15aa693442288134749959496b4f5b8bcc5e2214f2f1be6e7ee10796a4fceedbb8574c7e321be66002a59eccc15dea42b9c480dc8fa6a4
7
+ data.tar.gz: dd542ff48fe734d2f9aa419dc1e1e0e323e644e8162e0443f56d60371f44942a7a29c20e1d3bf99a8e7c49c4b3b020495f45f87ca63517e597b0fa4423dc015f
data/Gemfile CHANGED
@@ -2,5 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- # Specify your gem's dependencies in cable_ready.gemspec
5
+ # Specify your gem's dependencies in all_futures.gemspec
6
6
  gemspec
7
+
8
+ # json 3.0 broke ActiveSupport::JSON.decode until a Rails release ships the fix
9
+ gem "json", "< 3"
data/Gemfile.lock CHANGED
@@ -1,86 +1,297 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- all_futures (1.0.3)
5
- activeentity (~> 6.1)
6
- kredis (~> 0.4)
4
+ all_futures (2.0.0)
5
+ activemodel (>= 7.1)
6
+ activerecord (>= 7.1)
7
+ activesupport (>= 7.1)
8
+ kredis (~> 1.8)
9
+ ulid (~> 1.3)
7
10
 
8
11
  GEM
9
12
  remote: https://rubygems.org/
10
13
  specs:
11
- activeentity (6.1.1)
12
- activemodel (~> 6.0, < 7.0)
13
- activesupport (~> 6.0, < 7.0)
14
- activemodel (6.1.4.1)
15
- activesupport (= 6.1.4.1)
16
- activesupport (6.1.4.1)
17
- concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ actionpack (8.1.3.1)
15
+ actionview (= 8.1.3.1)
16
+ activesupport (= 8.1.3.1)
17
+ nokogiri (>= 1.8.5)
18
+ rack (>= 2.2.4)
19
+ rack-session (>= 1.0.1)
20
+ rack-test (>= 0.6.3)
21
+ rails-dom-testing (~> 2.2)
22
+ rails-html-sanitizer (~> 1.6)
23
+ useragent (~> 0.16)
24
+ actionview (8.1.3.1)
25
+ activesupport (= 8.1.3.1)
26
+ builder (~> 3.1)
27
+ erubi (~> 1.11)
28
+ rails-dom-testing (~> 2.2)
29
+ rails-html-sanitizer (~> 1.6)
30
+ activemodel (8.1.3.1)
31
+ activesupport (= 8.1.3.1)
32
+ activerecord (8.1.3.1)
33
+ activemodel (= 8.1.3.1)
34
+ activesupport (= 8.1.3.1)
35
+ timeout (>= 0.4.0)
36
+ activesupport (8.1.3.1)
37
+ base64
38
+ bigdecimal
39
+ concurrent-ruby (~> 1.0, >= 1.3.1)
40
+ connection_pool (>= 2.2.5)
41
+ drb
18
42
  i18n (>= 1.6, < 2)
43
+ json
44
+ logger (>= 1.4.2)
19
45
  minitest (>= 5.1)
20
- tzinfo (~> 2.0)
21
- zeitwerk (~> 2.3)
22
- ast (2.4.2)
23
- byebug (11.1.3)
24
- coderay (1.1.3)
25
- concurrent-ruby (1.1.9)
26
- i18n (1.8.10)
46
+ securerandom (>= 0.3)
47
+ tzinfo (~> 2.0, >= 2.0.5)
48
+ uri (>= 0.13.1)
49
+ ast (2.4.3)
50
+ base64 (0.3.0)
51
+ bigdecimal (4.1.3)
52
+ builder (3.3.0)
53
+ concurrent-ruby (1.3.8)
54
+ connection_pool (3.0.2)
55
+ crass (1.0.7)
56
+ drb (2.2.3)
57
+ erb (6.0.7)
58
+ erubi (1.13.1)
59
+ faker (2.23.0)
60
+ i18n (>= 1.8.11, < 2)
61
+ i18n (1.15.2)
27
62
  concurrent-ruby (~> 1.0)
28
- kredis (0.4.0)
63
+ io-console (0.9.4)
64
+ irb (1.18.0)
65
+ pp (>= 0.6.0)
66
+ prism (>= 1.3.0)
67
+ rdoc (>= 4.0.0)
68
+ reline (>= 0.4.2)
69
+ json (2.21.2)
70
+ kredis (1.8.0)
71
+ activemodel (>= 6.0.0)
29
72
  activesupport (>= 6.0.0)
30
- redis (~> 4.2)
73
+ redis (>= 4.2, < 6)
74
+ language_server-protocol (3.17.0.6)
75
+ lint_roller (1.1.0)
76
+ logger (1.7.0)
77
+ loofah (2.25.2)
78
+ crass (~> 1.0.2)
79
+ nokogiri (>= 1.12.0)
31
80
  magic_frozen_string_literal (1.2.0)
32
- method_source (1.0.0)
33
- minitest (5.14.4)
34
- parallel (1.21.0)
35
- parser (3.0.2.0)
81
+ minitest (6.0.6)
82
+ drb (~> 2.0)
83
+ prism (~> 1.5)
84
+ nokogiri (1.19.4-aarch64-linux-gnu)
85
+ racc (~> 1.4)
86
+ nokogiri (1.19.4-aarch64-linux-musl)
87
+ racc (~> 1.4)
88
+ nokogiri (1.19.4-arm-linux-gnu)
89
+ racc (~> 1.4)
90
+ nokogiri (1.19.4-arm-linux-musl)
91
+ racc (~> 1.4)
92
+ nokogiri (1.19.4-arm64-darwin)
93
+ racc (~> 1.4)
94
+ nokogiri (1.19.4-x86_64-darwin)
95
+ racc (~> 1.4)
96
+ nokogiri (1.19.4-x86_64-linux-gnu)
97
+ racc (~> 1.4)
98
+ nokogiri (1.19.4-x86_64-linux-musl)
99
+ racc (~> 1.4)
100
+ parallel (2.2.0)
101
+ parser (3.3.12.0)
36
102
  ast (~> 2.4.1)
37
- pry (0.13.1)
38
- coderay (~> 1.1)
39
- method_source (~> 1.0)
40
- rainbow (3.0.0)
41
- rake (13.0.6)
42
- redis (4.4.0)
43
- regexp_parser (2.1.1)
44
- rexml (3.2.5)
45
- rubocop (1.20.0)
46
- parallel (~> 1.10)
47
- parser (>= 3.0.0.0)
103
+ racc
104
+ pp (0.6.4)
105
+ prettyprint
106
+ prettyprint (0.2.0)
107
+ prism (1.9.0)
108
+ racc (1.8.1)
109
+ rack (3.2.7)
110
+ rack-session (2.1.2)
111
+ base64 (>= 0.1.0)
112
+ rack (>= 3.0.0)
113
+ rack-test (2.2.0)
114
+ rack (>= 1.3)
115
+ rackup (2.3.1)
116
+ rack (>= 3)
117
+ rails-dom-testing (2.3.0)
118
+ activesupport (>= 5.0.0)
119
+ minitest
120
+ nokogiri (>= 1.6)
121
+ rails-html-sanitizer (1.7.1)
122
+ loofah (~> 2.25, >= 2.25.2)
123
+ nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
124
+ railties (8.1.3.1)
125
+ actionpack (= 8.1.3.1)
126
+ activesupport (= 8.1.3.1)
127
+ irb (~> 1.13)
128
+ rackup (>= 1.0.0)
129
+ rake (>= 12.2)
130
+ thor (~> 1.0, >= 1.2.2)
131
+ tsort (>= 0.2)
132
+ zeitwerk (~> 2.6)
133
+ rainbow (3.1.1)
134
+ rake (13.4.2)
135
+ rbs (4.2.0)
136
+ logger
137
+ prism (>= 1.6.0)
138
+ tsort
139
+ rdoc (8.0.0)
140
+ erb
141
+ prism (>= 1.6.0)
142
+ rbs (>= 4.0.0)
143
+ tsort
144
+ redis (5.4.1)
145
+ redis-client (>= 0.22.0)
146
+ redis-client (0.30.1)
147
+ connection_pool
148
+ regexp_parser (2.12.0)
149
+ reline (0.7.0)
150
+ io-console (~> 0.5)
151
+ rubocop (1.88.2)
152
+ json (~> 2.3)
153
+ language_server-protocol (~> 3.17.0.2)
154
+ lint_roller (~> 1.1.0)
155
+ parallel (>= 1.10)
156
+ parser (>= 3.3.0.2)
48
157
  rainbow (>= 2.2.2, < 4.0)
49
- regexp_parser (>= 1.8, < 3.0)
50
- rexml
51
- rubocop-ast (>= 1.9.1, < 2.0)
158
+ regexp_parser (>= 2.9.3, < 3.0)
159
+ rubocop-ast (>= 1.49.0, < 2.0)
52
160
  ruby-progressbar (~> 1.7)
53
- unicode-display_width (>= 1.4.0, < 3.0)
54
- rubocop-ast (1.11.0)
55
- parser (>= 3.0.1.1)
56
- rubocop-performance (1.11.5)
57
- rubocop (>= 1.7.0, < 2.0)
58
- rubocop-ast (>= 0.4.0)
59
- ruby-progressbar (1.11.0)
60
- ruby_jard (0.3.1)
61
- byebug (>= 9.1, < 12.0)
62
- pry (~> 0.13.0)
63
- tty-screen (~> 0.8.1)
64
- standard (1.3.0)
65
- rubocop (= 1.20.0)
66
- rubocop-performance (= 1.11.5)
67
- standardrb (1.0.0)
68
- standard
69
- tty-screen (0.8.1)
70
- tzinfo (2.0.4)
161
+ unicode-display_width (>= 2.4.0, < 4.0)
162
+ rubocop-ast (1.50.0)
163
+ parser (>= 3.3.7.2)
164
+ prism (~> 1.7)
165
+ rubocop-performance (1.26.1)
166
+ lint_roller (~> 1.1)
167
+ rubocop (>= 1.75.0, < 2.0)
168
+ rubocop-ast (>= 1.47.1, < 2.0)
169
+ ruby-progressbar (1.13.0)
170
+ securerandom (0.4.1)
171
+ standard (1.56.0)
172
+ language_server-protocol (~> 3.17.0.2)
173
+ lint_roller (~> 1.0)
174
+ rubocop (~> 1.88.0)
175
+ standard-custom (~> 1.0.0)
176
+ standard-performance (~> 1.8)
177
+ standard-custom (1.0.2)
178
+ lint_roller (~> 1.0)
179
+ rubocop (~> 1.50)
180
+ standard-performance (1.9.0)
181
+ lint_roller (~> 1.1)
182
+ rubocop-performance (~> 1.26.0)
183
+ thor (1.5.0)
184
+ timeout (0.6.1)
185
+ tsort (0.2.0)
186
+ tzinfo (2.0.6)
71
187
  concurrent-ruby (~> 1.0)
72
- unicode-display_width (2.1.0)
73
- zeitwerk (2.4.2)
188
+ ulid (1.4.0)
189
+ unicode-display_width (3.2.0)
190
+ unicode-emoji (~> 4.1)
191
+ unicode-emoji (4.2.0)
192
+ uri (1.1.1)
193
+ useragent (0.16.11)
194
+ warning (1.6.0)
195
+ zeitwerk (2.8.3)
74
196
 
75
197
  PLATFORMS
76
- x86_64-linux
198
+ aarch64-linux-gnu
199
+ aarch64-linux-musl
200
+ arm-linux-gnu
201
+ arm-linux-musl
202
+ arm64-darwin
203
+ x86_64-darwin
204
+ x86_64-linux-gnu
205
+ x86_64-linux-musl
77
206
 
78
207
  DEPENDENCIES
79
208
  all_futures!
209
+ faker (~> 2.20)
210
+ json (< 3)
80
211
  magic_frozen_string_literal (~> 1.2.0)
212
+ railties (>= 7.1)
81
213
  rake (~> 13.0, >= 13.0.3)
82
- ruby_jard (~> 0.3)
83
- standardrb (~> 1.0)
214
+ standard (~> 1.56)
215
+ warning (~> 1.0)
216
+
217
+ CHECKSUMS
218
+ actionpack (8.1.3.1) sha256=974cb7154548e81f470b1b0f247b99cb38e87825899dca58610596e2817723d0
219
+ actionview (8.1.3.1) sha256=2da68b8414c47b43bfbed1ce69c5afe1c04f78c267aacb5660a4cab5ca12cfb6
220
+ activemodel (8.1.3.1) sha256=99cc02ce2faec371d14440949d85787ebd23a907c9baef0a9d4bcd4d21888f88
221
+ activerecord (8.1.3.1) sha256=0a2fb6c28f4938f6b013a3a549bec0a7e37d535f3dc8990e804bcc3258c0403b
222
+ activesupport (8.1.3.1) sha256=85458765f25ea48b9019c46b6bb3fa5683197bf4280d9f06710a6e8d7a831376
223
+ all_futures (2.0.0)
224
+ ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
225
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
226
+ bigdecimal (4.1.3) sha256=61ebe1e5e559bdc3cc6f2c0ee7f427321fc838f59611c294356eb04d6e21cf66
227
+ builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f
228
+ bundler (4.0.21) sha256=7cbf5499b426076aa16c8d28a59e4c2c3aad5a438402abcd961f0119f29f1dd0
229
+ concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1
230
+ connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
231
+ crass (1.0.7) sha256=94868719948664c89ddcaf0a37c65048413dfcb1c869470a5f7a7ceb5390b295
232
+ drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
233
+ erb (6.0.7) sha256=c5ca6dc25b0ef974a44dc8f59fe847577122483b1968a38dec305c60bf91ee92
234
+ erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
235
+ faker (2.23.0) sha256=8754e4bb3bc45641d276123060286a001ea5fa49a4b5daa162bf8c015fe154f3
236
+ i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5
237
+ io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1
238
+ irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
239
+ json (2.21.2) sha256=1f1d3b7cf2b3ba1a69beca0bb6db13d5438b80bff3cd54cdaaa620b9b07c1c6a
240
+ kredis (1.8.0) sha256=34b72a0bc242d7aaea98e82b6a5a8c293a27e1b26f2c729a8d4e1e1409886150
241
+ language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
242
+ lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
243
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
244
+ loofah (2.25.2) sha256=2007f746959ac65552456e04b433e83deb22759ab38c838b4445c70e43425918
245
+ magic_frozen_string_literal (1.2.0) sha256=ba2014401bdd571339960c122f7bafe98f2dee6bcc2fe2600548666f65042eb7
246
+ minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1
247
+ nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
248
+ nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
249
+ nokogiri (1.19.4-arm-linux-gnu) sha256=a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca
250
+ nokogiri (1.19.4-arm-linux-musl) sha256=588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb
251
+ nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527
252
+ nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551
253
+ nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a
254
+ nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b
255
+ parallel (2.2.0) sha256=e1059c5fd7b649558a0aec38a769f06a42942bdb40503d005a59c352fe011cd8
256
+ parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
257
+ pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
258
+ prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
259
+ prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
260
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
261
+ rack (3.2.7) sha256=93e13e1c24f93556671d85d2d79fa228c3485815c50d7e2f265b5330c6528fb7
262
+ rack-session (2.1.2) sha256=595434f8c0c3473ae7d7ac56ecda6cc6dfd9d37c0b2b5255330aa1576967ffe8
263
+ rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
264
+ rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868
265
+ rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d
266
+ rails-html-sanitizer (1.7.1) sha256=e797a7c9b01e567307e317c576b49ab4168017e63eea4dba9ce3cb587e2f22c2
267
+ railties (8.1.3.1) sha256=2388a232579a00cefea4487de66c8553c3408c1300abdc6cf1799d86ffb04487
268
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
269
+ rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
270
+ rbs (4.2.0) sha256=51f7b886dcc05bc09e10b901daa6a81829f6adc03101d6ca9ea4aac6103e0674
271
+ rdoc (8.0.0) sha256=03bf8c08a9639658855a0cfd77c0abca8325c227693f7f33f82957811348c469
272
+ redis (5.4.1) sha256=b5e675b57ad22b15c9bcc765d5ac26f60b675408af916d31527af9bd5a81faae
273
+ redis-client (0.30.1) sha256=5151bc5c7bbfe48623732cdae3b900d8a22dc691cc7cdfacfb351ac55116522d
274
+ regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
275
+ reline (0.7.0) sha256=5b012d8e55dbf9d450f12bde2cf7d15ff546ae80b3f8f3b30e570d431815583d
276
+ rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf
277
+ rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db
278
+ rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
279
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
280
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
281
+ standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
282
+ standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
283
+ standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
284
+ thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
285
+ timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb
286
+ tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
287
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
288
+ ulid (1.4.0) sha256=04e89db22dca21be8c5005e6e98a964fd64d5df18ff17197cd00d27fc5c1d710
289
+ unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
290
+ unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
291
+ uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
292
+ useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844
293
+ warning (1.6.0) sha256=a49cdfae19fb77d19afff2efbe45f8ab759e9cd25b4e4ce2c79dbaf46bdb6c9e
294
+ zeitwerk (2.8.3) sha256=2c85125a8467ce069e20123d1e709a08955c9d29c118c25b46b7b7fafdbb92e5
84
295
 
85
296
  BUNDLED WITH
86
- 2.2.20
297
+ 4.0.21
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2021 leastbad
3
+ Copyright (c) 2021-2022 leastbad
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,18 +1,16 @@
1
- # All Futures
2
-
3
- The [all\_futures](https://github.com/leastbad/all_futures) gem offers Rails developers a way to **gather attributes** on an unsaved model **across multiple requests**.
4
-
5
- It's perfect for [StimulusReflex](https://docs.stimulusreflex.com/) users that are building faceted search interfaces, real-time input validation and persisting the display state of low-stakes UI elements.
1
+ ---
2
+ description: A Redis ORM for reactive applications. Quacks just like Active Record. 🦆
3
+ ---
6
4
 
7
- Try a demo, here: 👉 [Beast Mode StimulusReflex](https://beastmode.leastbad.com/) 👈
5
+ # All Futures
8
6
 
9
- [![GitHub stars](https://img.shields.io/github/stars/leastbad/all_futures?style=social)](https://github.com/leastbad/all_futures) [![GitHub forks](https://img.shields.io/github/forks/leastbad/all_futures?style=social)](https://github.com/leastbad/all_futures) [![Twitter follow](https://img.shields.io/twitter/follow/theleastbad?style=social)](https://twitter.com/theleastbad) [![Discord](https://img.shields.io/discord/681373845323513862)](https://discord.gg/GnweR3)
7
+ Rails developers can use the [all\_futures](https://github.com/leastbad/all\_futures) gem to persist data **across multiple requests**. It leverages Redis to provide an ephemeral model that you can use just like an Active Record model.
10
8
 
11
- ## Why use All Futures?
9
+ It's perfect for building faceted search interfaces, multi-step forms, real-time input validation and persisting the display state of UI elements.
12
10
 
13
- Many reactive UI concepts are a pain in the ass to implement using the classic Rails request/response pattern, which was created at a time before developers started using Ajax to update portions of a page. ActionController is designed to mutate state in response to form submissions, leading to abuse of the session object and awkward hacks to validate and persist models across multiple requests.
11
+ Try a demo, here: 👉 [Beast Mode StimulusReflex](https://beastmode.leastbad.com) 👈
14
12
 
15
- All Futures presents a flexible and lightweight mechanism to refine a model that persists its attributes across multiple updates, and even multiple servers.
13
+ [![GitHub stars](https://img.shields.io/github/stars/leastbad/all\_futures?style=social)](https://github.com/leastbad/all\_futures) [![GitHub forks](https://img.shields.io/github/forks/leastbad/all\_futures?style=social)](https://github.com/leastbad/all\_futures) [![Twitter follow](https://img.shields.io/twitter/follow/theleastbad?style=social)](https://twitter.com/theleastbad) [![Discord](https://img.shields.io/discord/629472241427415060)](https://discord.gg/stimulus-reflex)
16
14
 
17
15
  ## Is All Futures for you?
18
16
 
@@ -23,106 +21,88 @@ Do you ever find yourself:
23
21
  * frustrated by the limitations of classic form submission
24
22
  * wanting to save data even if the model is currently invalid
25
23
  * reinventing the wheel every time you need field validation
24
+ * needing granular dirty checking and state management for every attribute
26
25
 
27
26
  If you answered yes to any of the above... you are every Rails developer, and you're not crazy. This functionality has been a blind-spot in the framework for a long time.
28
27
 
29
28
  Yes, All Futures is for **you**.
30
29
 
31
- ## Key features and advantages
30
+ ## Why use All Futures?
32
31
 
33
- * A natural fit with [StimulusReflex](https://docs.stimulusreflex.com/) and [Stimulus](https://stimulus.hotwire.dev/)
34
- * No reliance on sessions, so it works across servers
35
- * Easy to learn, quick to implement
36
- * Supports model attributes with defaults, arrays and dirty checking
37
- * Model validations and errors
38
- * No need to mess around with temporary records
32
+ Many reactive UI concepts are a pain in the ass to implement using the classic Rails request/response pattern, which was created at a time before developers started using Ajax to update portions of a page. ActionController is amazing, but if a user interaction doesn't fit cleanly into a single form submission, the developer now has to maintain UI state across multiple atomic requests. Naturally, this leads to abuse of the session object and awkward hacks to validate and persist models.
39
33
 
40
- ## How does All Futures work?
34
+ {% hint style="danger" %}
35
+ In vanilla Rails, it's very difficult to incrementally save models that require the presence of multiple attributes to be valid.
36
+ {% endhint %}
41
37
 
42
- First, set up an All Futures class that defines some [attributes](https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute). Your class will inherit from `AllFutures`, which is aptly-named:
38
+ The combination of ActionCable and Turbo Drive creates a persistent Connection that blurs the line between session and request, forcing a new mental model that is poorly served by ActionDispatch and the conventions which drove Rails to success... in 2005.
43
39
 
44
- ```ruby
45
- class ExampleModel < AllFutures
46
- attribute :name, :string
47
- attribute :age, :integer, default: 21
48
- end
49
- ```
40
+ Moving forward, new tooling is required to take full advantage of reactive possibilities.
50
41
 
51
- Then create an instance and assign it to an instance variable in the controller responsible for your initial page load:
42
+ All Futures presents a flexible and lightweight mechanism to refine a model that persists its attributes across multiple updates, and even multiple servers.
52
43
 
53
- ```ruby
54
- class ExampleController < ApplicationController
55
- def index
56
- @filter = ExampleModel.new
57
- end
58
- end
59
- ```
44
+ ## Key features and advantages
60
45
 
61
- Emit the instance id as a data attribute on every element which can update your model:
46
+ * A natural fit with [StimulusReflex](https://stimulusreflex.com), [Stimulus](https://stimulus.hotwired.dev), [Turbo Drive](https://turbo.hotwired.dev/handbook/drive) and [mrujs](https://mrujs.com)
47
+ * No reliance on sessions, so it works across servers
48
+ * Easy to learn, quick to implement
49
+ * Supports model attributes with defaults, arrays and associations
50
+ * Per-attribute dirty checking and state management with rollbacks
51
+ * Remembers previous model state across multiple requests
52
+ * Automatic versioning allows time travel views
53
+ * Model validations, errors and associations
54
+ * Can be added as attributes in your Active Record model classes
55
+ * No more temporary database tables that need to be purged later
62
56
 
63
- ```text
64
- Name: <input type="text" data-filter="<%= @filter.id %>" data-reflex="input->Example#name" /><br/>
65
- Age: <input type="text" data-filter="<%= @filter.id %>" data-reflex="input->Example#age" placeholder="<%= @filter.age %>" />
66
- ```
57
+ ## How does All Futures work?
67
58
 
68
- Since all attributes are gathered and sent to the server during a Reflex operation, it's easy to retrieve the instance id from the Reflex element accessor and use it to call up the correct All Futures object and make changes to it:
59
+ All Futures stands on the shoulders of [Active Entity](https://github.com/jasl/activeentity) (now **vendored** inside this gem — upstream is abandoned) and [Kredis](https://github.com/rails/kredis). It is similar to using a **properly juiced** [ActiveModel::Model](https://api.rubyonrails.org/classes/ActiveModel/Model.html), except that it has full support for [Attributes](https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute), including arrays and nested attributes. All Futures classes behave like Active Record model instances as much as possible.
60
+
61
+ {% hint style="info" %}
62
+ **v2** needs **Ruby 3.1+** and **Rails 7.1+** (green on 8.1). Coming from 1.0.x? Read [Updating from v1](usage/upgrading.md).
63
+ {% endhint %}
69
64
 
70
65
  ```ruby
71
- class ExampleReflex < ApplicationReflex
72
- def name
73
- model = ExampleModel.find(element.dataset.filter)
74
- model[:name] = element.value
75
- end
76
-
77
- def age
78
- model = ExampleModel.find(element.dataset.filter)
79
- model[:age] = element.value
80
- end
66
+ class Example < AllFutures::Base
67
+ attribute :name, :string
68
+ validates :name, presence: true
81
69
  end
70
+
71
+ example = Example.create
72
+ example.valid? # false
73
+ example.errors # @errors=[#<ActiveModel::Error attribute=name, type=blank, options={}>]
82
74
  ```
83
75
 
84
- The current state of the attributes is persisted every time you set the value of an attribute using bracket notation. You can use standard setter assignments, but the model state will not be persisted until you manually call `save`:
76
+ Unlike an Active Record model, All Futures instances can persist their attributes even if the attributes are currently invalid. This design allows you to resolve any errors present, even if it takes several distinct operations to do so.
85
77
 
86
- ```ruby
87
- model[:name] = "Helen" # saved
88
- model.name = "Helen" # not saved
89
- model.save # saved
90
- ```
78
+ Once the state of your attributes is valid, you can pass the `attributes` from your All Futures model right into the constructor of a real Active Record model.
91
79
 
92
- {% hint style="warning" %}
93
- All Futures class attributes are persisted in Redis via the excellent [Kredis](https://github.com/rails/kredis) gem, which must be set up and running in your project before you can use All Futures.
80
+ {% hint style="danger" %}
81
+ All Futures v1 persisted the attributes every time you set the value of an attribute using bracket notation. **This behavior has been removed.** An explicit `save` operation is now required to persist changes.
94
82
  {% endhint %}
95
83
 
96
- All Futures is based on [Active Entity](https://github.com/jasl/activeentity). It is similar to using [ActiveModel::Model](https://api.rubyonrails.org/classes/ActiveModel/Model.html), except that it has full support for [Attributes](https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute), including arrays and nested attributes. All Futures classes behave like ActiveModel classes, so you can inspect `valid?` and the `errors` accessor.
84
+ ## Who makes this?
97
85
 
98
- ```ruby
99
- class ExampleModel < AllFutures
100
- attribute :name, :string
101
- validates :name, presence: true
102
- end
86
+ First, All Futures wouldn't exist without [Active Entity](https://github.com/jasl/activeentity) and [Kredis](https://github.com/rails/kredis). Thank you, [Jun Jiang](https://twitter.com/jasl9187) and [Kasper Timm Hansen](https://twitter.com/kaspth).
103
87
 
104
- model = ExampleModel.new
105
- model.valid? # false
106
- model.errors # @errors=[#<ActiveModel::Error attribute=name, type=blank, options={}>]
107
- ```
88
+ All Futures was originally created by [leastbad](https://twitter.com/theleastbad), who continues to serve as the primary developer and writer of words. :wave:
108
89
 
109
- {% hint style="info" %}
110
- Unlike an ActiveRecord model, All Futures instances can persist their attributes even if the attributes are currently invalid. This design allows you to resolve any errors present, even if it takes several distinct operations to do so.
111
- {% endhint %}
90
+ v2 welcomes pivotal contributions from key members of the [StimulusReflex](https://stimulusreflex.com) core and moderation teams. [Stephen Margheim](https://twitter.com/fractaledmind) heroically made sure that callbacks work as expected, _twice_. [Julian Rubisch](https://twitter.com/julian\_rubisch) is the reason All Futures models are usually interchangeable with Active Record models. [Nate Hopkins](https://twitter.com/hopsoft/), [Marco Roth](https://twitter.com/marcoroth\_) and [Konnor Rogers](https://twitter.com/rogerskonnor/) have been generous with their feedback and suggestions.
112
91
 
113
- {% hint style="success" %}
114
- Once the state of your attributes is valid, you can pass the `attributes` from your All Futures model right into the constructor of a real ActiveRecord model. It should work perfectly.
115
- {% endhint %}
92
+ We realized that this library needed to exist and had a deep understanding of how it should work _only_ because we have spent years helping thousands of Rails developers figure out the right way to develop reactive UIs.
116
93
 
117
- ## Try it now
94
+ All Futures truly was born in fire. :fire::hammer:
118
95
 
119
- You can experiment with [Beast Mode StimulusReflex](https://beastmode.leastbad.com/), a live demonstration of using All Futures to drill down into a tabular dataset, [**right now**](https://beastmode.leastbad.com/). 👈
96
+ ## Try it now
120
97
 
121
- The Beast Mode [codebase](https://github.com/leastbad/beast_mode) [![GitHub stars](https://img.shields.io/github/stars/leastbad/beast_mode?style=social)](https://github.com/leastbad/beast_mode) [![GitHub forks](https://img.shields.io/github/forks/leastbad/beast_mode?style=social)](https://github.com/leastbad/beast_mode) is set up as a **template repo** which I recommend that you clone and experiment with.
98
+ You can experiment with [Beast Mode StimulusReflex](https://beastmode.leastbad.com), a live demonstration of using All Futures to drill down into a tabular dataset, [**right now**](https://beastmode.leastbad.com). 👈
122
99
 
123
- The three key files are the [Filter](https://github.com/leastbad/beast_mode/blob/master/app/filters/customer_filter.rb), the [Reflex](https://github.com/leastbad/beast_mode/blob/master/app/reflexes/customers_reflex.rb) and the [Model](https://github.com/leastbad/beast_mode/blob/master/app/models/customer.rb). You can read the tutorial post behind this example on my blog [here](https://leastbad.com/beast-mode/).
100
+ The Beast Mode [codebase](https://github.com/leastbad/beast\_mode) [![GitHub stars](https://img.shields.io/github/stars/leastbad/beast\_mode?style=social)](https://github.com/leastbad/beast\_mode) [![GitHub forks](https://img.shields.io/github/forks/leastbad/beast\_mode?style=social)](https://github.com/leastbad/beast\_mode) is set up as a **template repo** which I recommend that you clone and experiment with.
124
101
 
125
- Assuming you're running Ruby 2.7.3, Postgres and have Redis running on your system, you can just run `bin/setup` to install it, including migrations and the DB seed file.
102
+ The three key files are the [CustomerFilter](https://github.com/leastbad/beast\_mode/blob/master/app/models/customer\_filter.rb), the [Reflex](https://github.com/leastbad/beast\_mode/blob/master/app/reflexes/customers\_reflex.rb) and the [Model](https://github.com/leastbad/beast\_mode/blob/master/app/models/customer.rb). You can read the tutorial post behind this example on my blog [here](https://leastbad.com/beast-mode/).
126
103
 
127
- {% embed url="https://www.youtube.com/watch?v=Fbo21aWFbhQ" caption="Did they meet at the gym?" %}
104
+ Assuming you're running at least Ruby 2.7.3, Postgres and have Redis running on your system, you can just run `bin/setup` to install it, including migrations and the DB seed file.
128
105
 
106
+ {% embed url="https://www.youtube.com/watch?v=Fbo21aWFbhQ" %}
107
+ REFRACT
108
+ {% endembed %}
data/Rakefile CHANGED
@@ -1,4 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bundler/gem_tasks"
4
- require "pry"
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "test"
8
+ t.libs << "lib"
9
+ t.test_files = FileList["test/**/*_test.rb"]
10
+ end
11
+
12
+ require "rubocop/rake_task"
13
+
14
+ RuboCop::RakeTask.new
15
+
16
+ task default: %i[test]
data/SUMMARY.md CHANGED
@@ -2,5 +2,25 @@
2
2
 
3
3
  * [All Futures](README.md)
4
4
  * [Setup](setup.md)
5
- * [Usage](usage.md)
6
-
5
+ * [Usage](usage/README.md)
6
+ * [Updating from v1](usage/upgrading.md)
7
+ * [Active Record](usage/active-record.md)
8
+ * [Attributes](usage/attributes.md)
9
+ * [Associations](usage/associations.md)
10
+ * [Aggressions](usage/aggressions.md)
11
+ * [Callbacks](usage/callbacks.md)
12
+ * [Dirty](usage/dirty.md)
13
+ * [Errors](usage/errors.md)
14
+ * [Readonly](usage/readonly.md)
15
+ * [Validations](usage/validations.md)
16
+ * [Versioning](usage/versioning.md)
17
+ * [API Reference](api-reference/README.md)
18
+ * [Class Methods](api-reference/class-methods.md)
19
+ * [Instance Methods](api-reference/instance-methods.md)
20
+ * [Getter Methods](api-reference/getter-methods.md)
21
+ * [Overwritable Methods](api-reference/overwritable-methods.md)
22
+ * [Examples](examples/README.md)
23
+ * [Faceted Search](examples/faceted-search.md)
24
+ * [Multi-step form](examples/multi-step-form.md)
25
+ * [Versioned draft](examples/versioned-draft.md)
26
+ * [Embedded associations](examples/embedded-associations.md)