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.
- checksums.yaml +4 -4
- data/Gemfile +4 -1
- data/Gemfile.lock +272 -61
- data/LICENSE.txt +1 -1
- data/README.md +59 -79
- data/Rakefile +13 -1
- data/SUMMARY.md +22 -2
- data/bin/console +8 -0
- data/bin/loc +0 -0
- data/bin/setup +0 -0
- data/bin/standardize +0 -0
- data/lib/all_futures/association.rb +42 -0
- data/lib/all_futures/association_index.rb +69 -0
- data/lib/all_futures/attributes.rb +28 -0
- data/lib/all_futures/base.rb +66 -0
- data/lib/all_futures/callbacks.rb +71 -0
- data/lib/all_futures/configuration.rb +9 -0
- data/lib/all_futures/dirty.rb +116 -0
- data/lib/all_futures/embeds.rb +40 -0
- data/lib/all_futures/errors.rb +37 -0
- data/lib/all_futures/finder.rb +214 -0
- data/lib/all_futures/locale/en.yml +49 -0
- data/lib/all_futures/persistence.rb +595 -0
- data/lib/all_futures/presenter.rb +35 -0
- data/lib/all_futures/railtie.rb +26 -0
- data/lib/all_futures/translation.rb +22 -0
- data/lib/all_futures/validations.rb +10 -0
- data/lib/all_futures/version.rb +3 -1
- data/lib/all_futures/versions.rb +80 -0
- data/lib/all_futures.rb +24 -1
- data/lib/vendor/ACTIVE_ENTITY_MIT-LICENSE +42 -0
- data/lib/vendor/README.md +8 -0
- data/lib/vendor/active_entity/aggregations.rb +277 -0
- data/lib/vendor/active_entity/associations/embeds/association.rb +134 -0
- data/lib/vendor/active_entity/associations/embeds/builder/association.rb +105 -0
- data/lib/vendor/active_entity/associations/embeds/builder/collection_association.rb +71 -0
- data/lib/vendor/active_entity/associations/embeds/builder/embedded_in.rb +38 -0
- data/lib/vendor/active_entity/associations/embeds/builder/embeds_many.rb +13 -0
- data/lib/vendor/active_entity/associations/embeds/builder/embeds_one.rb +16 -0
- data/lib/vendor/active_entity/associations/embeds/builder/singular_association.rb +28 -0
- data/lib/vendor/active_entity/associations/embeds/collection_association.rb +209 -0
- data/lib/vendor/active_entity/associations/embeds/collection_proxy.rb +310 -0
- data/lib/vendor/active_entity/associations/embeds/embedded_in_association.rb +31 -0
- data/lib/vendor/active_entity/associations/embeds/embeds_many_association.rb +15 -0
- data/lib/vendor/active_entity/associations/embeds/embeds_one_association.rb +26 -0
- data/lib/vendor/active_entity/associations/embeds/singular_association.rb +35 -0
- data/lib/vendor/active_entity/associations.rb +168 -0
- data/lib/vendor/active_entity/attribute_assignment.rb +87 -0
- data/lib/vendor/active_entity/attribute_decorators.rb +90 -0
- data/lib/vendor/active_entity/attribute_methods/before_type_cast.rb +78 -0
- data/lib/vendor/active_entity/attribute_methods/dirty.rb +180 -0
- data/lib/vendor/active_entity/attribute_methods/primary_key.rb +96 -0
- data/lib/vendor/active_entity/attribute_methods/query.rb +38 -0
- data/lib/vendor/active_entity/attribute_methods/read.rb +44 -0
- data/lib/vendor/active_entity/attribute_methods/serialization.rb +90 -0
- data/lib/vendor/active_entity/attribute_methods/time_zone_conversion.rb +93 -0
- data/lib/vendor/active_entity/attribute_methods/write.rb +54 -0
- data/lib/vendor/active_entity/attribute_methods.rb +833 -0
- data/lib/vendor/active_entity/attributes.rb +240 -0
- data/lib/vendor/active_entity/base.rb +293 -0
- data/lib/vendor/active_entity/callbacks.rb +21 -0
- data/lib/vendor/active_entity/coders/json.rb +15 -0
- data/lib/vendor/active_entity/coders/yaml_column.rb +50 -0
- data/lib/vendor/active_entity/core.rb +348 -0
- data/lib/vendor/active_entity/enum.rb +260 -0
- data/lib/vendor/active_entity/errors.rb +69 -0
- data/lib/vendor/active_entity/gem_version.rb +17 -0
- data/lib/vendor/active_entity/inheritance.rb +176 -0
- data/lib/vendor/active_entity/integration.rb +78 -0
- data/lib/vendor/active_entity/locale/en.yml +45 -0
- data/lib/vendor/active_entity/model_schema.rb +118 -0
- data/lib/vendor/active_entity/nested_attributes.rb +554 -0
- data/lib/vendor/active_entity/persistence.rb +20 -0
- data/lib/vendor/active_entity/railtie.rb +76 -0
- data/lib/vendor/active_entity/readonly_attributes.rb +55 -0
- data/lib/vendor/active_entity/reflection.rb +447 -0
- data/lib/vendor/active_entity/serialization.rb +28 -0
- data/lib/vendor/active_entity/store.rb +291 -0
- data/lib/vendor/active_entity/translation.rb +24 -0
- data/lib/vendor/active_entity/type/date.rb +9 -0
- data/lib/vendor/active_entity/type/date_time.rb +9 -0
- data/lib/vendor/active_entity/type/internal/timezone.rb +17 -0
- data/lib/vendor/active_entity/type/json.rb +30 -0
- data/lib/vendor/active_entity/type/modifiers/array.rb +72 -0
- data/lib/vendor/active_entity/type/modifiers/array_without_blank.rb +19 -0
- data/lib/vendor/active_entity/type/registry.rb +112 -0
- data/lib/vendor/active_entity/type/serialized.rb +71 -0
- data/lib/vendor/active_entity/type/text.rb +11 -0
- data/lib/vendor/active_entity/type/time.rb +21 -0
- data/lib/vendor/active_entity/type/unsigned_integer.rb +17 -0
- data/lib/vendor/active_entity/type.rb +75 -0
- data/lib/vendor/active_entity/validate_embeds_association.rb +300 -0
- data/lib/vendor/active_entity/validations/absence.rb +25 -0
- data/lib/vendor/active_entity/validations/associated.rb +60 -0
- data/lib/vendor/active_entity/validations/length.rb +26 -0
- data/lib/vendor/active_entity/validations/presence.rb +68 -0
- data/lib/vendor/active_entity/validations/subset.rb +76 -0
- data/lib/vendor/active_entity/validations/uniqueness_in_embeds.rb +91 -0
- data/lib/vendor/active_entity/validations/uniqueness_on_active_record.rb +234 -0
- data/lib/vendor/active_entity/validations.rb +47 -0
- data/lib/vendor/active_entity/version.rb +10 -0
- data/lib/vendor/active_entity.rb +99 -0
- data/lib/vendor/core_ext/array_without_blank.rb +48 -0
- metadata +175 -21
- data/lib/all_futures/all_futures.rb +0 -28
- data/lib/all_futures/config.rb +0 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7454c3fb8e37a7b7754c266c9856737b31b217ada0c4d62f896c3ca82451280f
|
|
4
|
+
data.tar.gz: 40cc91c58547f9cfdf03a0fc9ab2623d49a763ea7b674c9a1454e0cd2e0f2d7c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
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 (
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
activesupport (
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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 (>=
|
|
50
|
-
|
|
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 (>=
|
|
54
|
-
rubocop-ast (1.
|
|
55
|
-
parser (>= 3.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
rubocop
|
|
67
|
-
|
|
68
|
-
standard
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
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
|
-
|
|
297
|
+
4.0.21
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
5
|
+
# All Futures
|
|
8
6
|
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
11
|
+
Try a demo, here: 👉 [Beast Mode StimulusReflex](https://beastmode.leastbad.com) 👈
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
[](https://github.com/leastbad/all\_futures) [](https://github.com/leastbad/all\_futures) [](https://twitter.com/theleastbad) [](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
|
-
##
|
|
30
|
+
## Why use All Futures?
|
|
32
31
|
|
|
33
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
54
|
-
class ExampleController < ApplicationController
|
|
55
|
-
def index
|
|
56
|
-
@filter = ExampleModel.new
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
```
|
|
44
|
+
## Key features and advantages
|
|
60
45
|
|
|
61
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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="
|
|
93
|
-
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
|
-
|
|
84
|
+
## Who makes this?
|
|
97
85
|
|
|
98
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
94
|
+
All Futures truly was born in fire. :fire::hammer:
|
|
118
95
|
|
|
119
|
-
|
|
96
|
+
## Try it now
|
|
120
97
|
|
|
121
|
-
|
|
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
|
|
100
|
+
The Beast Mode [codebase](https://github.com/leastbad/beast\_mode) [](https://github.com/leastbad/beast\_mode) [](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
|
-
|
|
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
|
-
|
|
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 "
|
|
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)
|