nested_record 1.1.0 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 751a609790c41beec0e7d322daebcd7842f741feb3fc12ff7b102ca84dbff317
4
- data.tar.gz: 160227615a2e00b882e7b8b2f0499b71fa250f3de39626ebf4e1362b20c95351
3
+ metadata.gz: 0761ce9c739c3f58d9ee2b52552664015df2d6fb6aed4dab164dd33038fbc1fe
4
+ data.tar.gz: 2d63fb82c3be079c5de28599ca02d0d4ddeb20c5a82f554901601bbaa8b70011
5
5
  SHA512:
6
- metadata.gz: ab39393d9887e667af189a318cb68925115a67fa86a4774f8ef1694eed63ce0f41ecc397d0e1043d0c704d8765ab74cc7e1ee17d5de392f5e6b379f173c26d1e
7
- data.tar.gz: 57422022e56c3011e4cdcc641658523413c5556f7ddefa8b2a11a17d1017b9827f7d2d4cfda1a93af5be62f7bdeddc1c1eddadc99bafc43b3b6d09034edca905
6
+ metadata.gz: 8ff11ab93295ca0d08551e513f81b6f086c115c264c7c3ae7843fcb34dcae099b549f2501b9cad65425708593a018b76af00ab2e76339317dbd9ad57a759a9ef
7
+ data.tar.gz: d6cb9f2f8fcc4c7b958905e93690cb8f7e319fad664780e4e1abb311b15d66f7c6f28b756874a5f1035c31ecd2fcf03935ee35f711e66d411595a86ea66b6b65
@@ -12,17 +12,28 @@ jobs:
12
12
  strategy:
13
13
  matrix:
14
14
  ruby:
15
- - 2.5.x
16
- - 2.6.x
17
- - 2.7.x
18
- - 3.0.x
15
+ - "2.6"
16
+ - "2.7"
17
+ - "3.0"
18
+ - "3.1"
19
+ - "3.2"
19
20
  gemfile:
20
21
  - gemfiles/rails_5.2.gemfile
21
22
  - gemfiles/rails_6.0.gemfile
22
23
  - gemfiles/rails_6.1.gemfile
24
+ - gemfiles/rails_7.0.gemfile
25
+ - gemfiles/rails_7.1.gemfile
23
26
  exclude:
24
27
  - gemfile: gemfiles/rails_5.2.gemfile
25
- ruby: 3.0.x
28
+ ruby: "3.0"
29
+ - gemfile: gemfiles/rails_5.2.gemfile
30
+ ruby: "3.1"
31
+ - gemfile: gemfiles/rails_5.2.gemfile
32
+ ruby: "3.2"
33
+ - gemfile: gemfiles/rails_7.0.gemfile
34
+ ruby: "2.6"
35
+ - gemfile: gemfiles/rails_7.1.gemfile
36
+ ruby: "2.6"
26
37
  env:
27
38
  BUNDLE_GEMFILE: ${{ format('{0}/{1}', github.workspace, matrix.gemfile) }}
28
39
  BUNDLE_PATH: ${{ format('{0}/vendor/bundle', github.workspace) }}
@@ -31,23 +42,9 @@ jobs:
31
42
  - name: Checkout
32
43
  uses: actions/checkout@v1
33
44
  - name: Setup ruby
34
- uses: actions/setup-ruby@v1
45
+ uses: ruby/setup-ruby@v1
35
46
  with:
36
47
  ruby-version: ${{ matrix.ruby }}
37
- - name: Install Bundler
38
- run: gem install bundler:2.2.14
39
- - name: Cache Bundler
40
- uses: actions/cache@v1
41
- id: cache-bundler
42
- with:
43
- path: vendor/bundle
44
- key: ${{ runner.os }}-gem-${{ matrix.ruby }}-${{ hashFiles(format('{0}/{1}.lock', github.workspace, matrix.gemfile)) }}
45
- restore-keys: |
46
- ${{ runner.os }}-gem-${{ matrix.ruby }}-
47
- - name: Install Bundler dependencies
48
- if: steps.cache-bundler.outputs.cache-hit != 'true'
49
- run: bundle install --jobs=4
50
- - name: Check Bunlder dependencies
51
- run: bundle check
48
+ bundler-cache: true
52
49
  - name: RSpec
53
50
  run: bundle exec rspec
data/Appraisals CHANGED
@@ -1,11 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  appraise "rails-5.2" do
2
- gem 'activemodel', '~> 5.2.4'
4
+ gem 'activemodel', '~> 5.2.8.1'
3
5
  end
4
6
 
5
7
  appraise "rails-6.0" do
6
- gem 'activemodel', '~> 6.0.3'
8
+ gem 'activemodel', '~> 6.0.6.1'
7
9
  end
8
10
 
9
11
  appraise "rails-6.1" do
10
- gem 'activemodel', '~> 6.1.3'
12
+ gem 'activemodel', '~> 6.1.7.6'
13
+ end
14
+
15
+ appraise "rails-7.0" do
16
+ gem 'activemodel', '~> 7.0.8'
17
+ end
18
+
19
+ appraise "rails-7.1" do
20
+ gem 'activemodel', '~> 7.1.1'
11
21
  end
data/Gemfile.lock CHANGED
@@ -1,47 +1,57 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nested_record (1.1.0)
5
- activemodel (>= 4.2, < 6.2)
4
+ nested_record (1.1.1)
5
+ activemodel (> 5.2, < 7.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (6.1.3)
11
- activesupport (= 6.1.3)
12
- activesupport (6.1.3)
10
+ activemodel (7.1.1)
11
+ activesupport (= 7.1.1)
12
+ activesupport (7.1.1)
13
+ base64
14
+ bigdecimal
13
15
  concurrent-ruby (~> 1.0, >= 1.0.2)
16
+ connection_pool (>= 2.2.5)
17
+ drb
14
18
  i18n (>= 1.6, < 2)
15
19
  minitest (>= 5.1)
20
+ mutex_m
16
21
  tzinfo (~> 2.0)
17
- zeitwerk (~> 2.3)
18
- appraisal (2.4.0)
22
+ appraisal (2.5.0)
19
23
  bundler
20
24
  rake
21
25
  thor (>= 0.14.0)
22
- concurrent-ruby (1.1.8)
23
- diff-lcs (1.4.4)
24
- i18n (1.8.9)
26
+ base64 (0.1.1)
27
+ bigdecimal (3.1.4)
28
+ concurrent-ruby (1.2.2)
29
+ connection_pool (2.4.1)
30
+ diff-lcs (1.5.0)
31
+ drb (2.1.1)
32
+ ruby2_keywords
33
+ i18n (1.14.1)
25
34
  concurrent-ruby (~> 1.0)
26
- minitest (5.14.4)
27
- rake (13.0.3)
28
- rspec (3.10.0)
29
- rspec-core (~> 3.10.0)
30
- rspec-expectations (~> 3.10.0)
31
- rspec-mocks (~> 3.10.0)
32
- rspec-core (3.10.1)
33
- rspec-support (~> 3.10.0)
34
- rspec-expectations (3.10.1)
35
+ minitest (5.20.0)
36
+ mutex_m (0.1.2)
37
+ rake (13.0.6)
38
+ rspec (3.12.0)
39
+ rspec-core (~> 3.12.0)
40
+ rspec-expectations (~> 3.12.0)
41
+ rspec-mocks (~> 3.12.0)
42
+ rspec-core (3.12.2)
43
+ rspec-support (~> 3.12.0)
44
+ rspec-expectations (3.12.3)
35
45
  diff-lcs (>= 1.2.0, < 2.0)
36
- rspec-support (~> 3.10.0)
37
- rspec-mocks (3.10.2)
46
+ rspec-support (~> 3.12.0)
47
+ rspec-mocks (3.12.6)
38
48
  diff-lcs (>= 1.2.0, < 2.0)
39
- rspec-support (~> 3.10.0)
40
- rspec-support (3.10.2)
41
- thor (1.1.0)
42
- tzinfo (2.0.4)
49
+ rspec-support (~> 3.12.0)
50
+ rspec-support (3.12.1)
51
+ ruby2_keywords (0.0.5)
52
+ thor (1.2.2)
53
+ tzinfo (2.0.6)
43
54
  concurrent-ruby (~> 1.0)
44
- zeitwerk (2.4.2)
45
55
 
46
56
  PLATFORMS
47
57
  ruby
data/README.md CHANGED
@@ -105,6 +105,124 @@ user.profile_attributes = {
105
105
  }
106
106
  ```
107
107
 
108
+ ## Advanced usage
109
+
110
+ `nested_record` can do many different things for you!
111
+
112
+ ### Validations
113
+
114
+ Every `NestedRecord::Base` descendant in fact is an `ActiveModel::Model` so standard validations are also supported.
115
+
116
+ ```ruby
117
+ class Profile < NestedRecord::Base
118
+ attribute :age, :integer
119
+ attribute :active, :boolean
120
+
121
+ validates :age, presence: true
122
+ end
123
+ ```
124
+
125
+ ### Don't bother with defining record micro-classes
126
+
127
+ If you want so, you can rewrite the above example this way:
128
+
129
+ ```ruby
130
+ class User < ApplicationRecord
131
+ has_one_nested :profile do
132
+ attribute :age, :integer
133
+ attribute :active, :boolean
134
+ has_one_nested :contacts do
135
+ attribute :email, :string
136
+ attribute :phone, :string
137
+ has_many_nested :socials do
138
+ attribute :name
139
+ attribute :url
140
+ end
141
+ end
142
+ end
143
+ end
144
+ ```
145
+
146
+ Record classes then available under _local types_ namespace module e.g. `User::LocalTypes::Profile`.
147
+
148
+ ### Concerns
149
+
150
+ Common attributes, validations and other settings can be DRY-ed to modules called _concerns_.
151
+
152
+ ```ruby
153
+ module TitleAndDescription
154
+ extend NestedRecord::Concern
155
+
156
+ attribute :title
157
+ attribute :description
158
+
159
+ validates :title, presence: true
160
+ end
161
+
162
+ class Article < NestedRecord::Base
163
+ has_one_nested :foo do
164
+ include TitleAndDescription
165
+ end
166
+ end
167
+ ```
168
+
169
+ ### `:class_name` option
170
+
171
+ By default, class name of nested record is automatically inferred from the association name but of course it's all customizable. There's a `:class_name` option for this!
172
+
173
+ Depending on what form do you use — `has_* :foo` or `has_* :foo do ... end`, the `:class_name` option means different things.
174
+
175
+ #### `:class_name` option when referring an external model
176
+
177
+ In a non-`&block` form, the `:class_name` behaves similar to the option with same name in ActiveRecord's `has_one`/`has_many` associations.
178
+
179
+ ```ruby
180
+ class User < ApplicationRecord
181
+ has_one_nested :profile, class_name: 'SomeNamespace::Profile'
182
+ end
183
+
184
+ class SomeNamespace::Profile < NestedRecord::Base
185
+ attribute :age, :integer
186
+ attribute :active, :boolean
187
+ end
188
+ ```
189
+
190
+ #### `:class_name` option when using with an embedded _local types_
191
+
192
+ When record definition is embedded, `:class_name` option denotes the name of the class in _local types_ namespace module under which it's defined.
193
+
194
+ ```ruby
195
+ class User < ApplicationRecord
196
+ has_one_nested :profile, class_name: 'ProfileRecord' do
197
+ attribute :age, :integer
198
+ attribute :active, :boolean
199
+ end
200
+ end
201
+ ```
202
+
203
+ Then the profile model is available under `User::LocalTypes::ProfileRecord` name.
204
+
205
+ You can also disable the const naming at all, passing `class_name: false`. In this case, the _local type_ is anonymous so no constant in _local types_ namespace is set.
206
+
207
+ `class_name: true` (the default) means infer the class name from association name e.g. `User::LocalTypes::Profile` constant is set by default.
208
+
209
+ ### `nested_accessors`
210
+
211
+ This is the `store_accessor` on steroids! Unlike `store_accessor` it's support nesting, type coercions and all other things this library can do. Think of it as a `has_one_nested` association with accessors lifted up one level.
212
+
213
+ ```ruby
214
+ class User < ApplicationRecord
215
+ nested_accessors from: :profile do
216
+ attribute :age, :integer
217
+ attribute :active, :integer
218
+ end
219
+ end
220
+
221
+ user = User.new
222
+ user.age = 33
223
+ user.active = true
224
+ ```
225
+
108
226
  ## Development
109
227
 
110
228
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activemodel", "~> 5.2.4"
5
+ gem "activemodel", "~> 5.2.8.1"
6
6
 
7
7
  gemspec path: "../"
@@ -1,52 +1,52 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- nested_record (1.1.0)
5
- activemodel (>= 4.2, < 6.2)
4
+ nested_record (1.1.1)
5
+ activemodel (> 5.2, < 7.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (5.2.4.5)
11
- activesupport (= 5.2.4.5)
12
- activesupport (5.2.4.5)
10
+ activemodel (5.2.8.1)
11
+ activesupport (= 5.2.8.1)
12
+ activesupport (5.2.8.1)
13
13
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
14
  i18n (>= 0.7, < 2)
15
15
  minitest (~> 5.1)
16
16
  tzinfo (~> 1.1)
17
- appraisal (2.4.0)
17
+ appraisal (2.5.0)
18
18
  bundler
19
19
  rake
20
20
  thor (>= 0.14.0)
21
- concurrent-ruby (1.1.8)
22
- diff-lcs (1.4.4)
23
- i18n (1.8.9)
21
+ concurrent-ruby (1.2.2)
22
+ diff-lcs (1.5.0)
23
+ i18n (1.14.1)
24
24
  concurrent-ruby (~> 1.0)
25
- minitest (5.14.4)
26
- rake (13.0.3)
27
- rspec (3.10.0)
28
- rspec-core (~> 3.10.0)
29
- rspec-expectations (~> 3.10.0)
30
- rspec-mocks (~> 3.10.0)
31
- rspec-core (3.10.1)
32
- rspec-support (~> 3.10.0)
33
- rspec-expectations (3.10.1)
25
+ minitest (5.20.0)
26
+ rake (13.0.6)
27
+ rspec (3.12.0)
28
+ rspec-core (~> 3.12.0)
29
+ rspec-expectations (~> 3.12.0)
30
+ rspec-mocks (~> 3.12.0)
31
+ rspec-core (3.12.2)
32
+ rspec-support (~> 3.12.0)
33
+ rspec-expectations (3.12.3)
34
34
  diff-lcs (>= 1.2.0, < 2.0)
35
- rspec-support (~> 3.10.0)
36
- rspec-mocks (3.10.2)
35
+ rspec-support (~> 3.12.0)
36
+ rspec-mocks (3.12.6)
37
37
  diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.10.0)
39
- rspec-support (3.10.2)
40
- thor (1.1.0)
38
+ rspec-support (~> 3.12.0)
39
+ rspec-support (3.12.1)
40
+ thor (1.3.0)
41
41
  thread_safe (0.3.6)
42
- tzinfo (1.2.9)
42
+ tzinfo (1.2.11)
43
43
  thread_safe (~> 0.1)
44
44
 
45
45
  PLATFORMS
46
46
  ruby
47
47
 
48
48
  DEPENDENCIES
49
- activemodel (~> 5.2.4)
49
+ activemodel (~> 5.2.8.1)
50
50
  appraisal
51
51
  bundler (>= 2)
52
52
  nested_record!
@@ -54,4 +54,4 @@ DEPENDENCIES
54
54
  rspec (~> 3.0)
55
55
 
56
56
  BUNDLED WITH
57
- 2.2.14
57
+ 2.3.22
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activemodel", "~> 6.0.3"
5
+ gem "activemodel", "~> 6.0.6.1"
6
6
 
7
7
  gemspec path: "../"
@@ -1,54 +1,54 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- nested_record (1.1.0)
5
- activemodel (>= 4.2, < 6.2)
4
+ nested_record (1.1.1)
5
+ activemodel (> 5.2, < 7.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (6.0.3.5)
11
- activesupport (= 6.0.3.5)
12
- activesupport (6.0.3.5)
10
+ activemodel (6.0.6.1)
11
+ activesupport (= 6.0.6.1)
12
+ activesupport (6.0.6.1)
13
13
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
14
  i18n (>= 0.7, < 2)
15
15
  minitest (~> 5.1)
16
16
  tzinfo (~> 1.1)
17
17
  zeitwerk (~> 2.2, >= 2.2.2)
18
- appraisal (2.4.0)
18
+ appraisal (2.5.0)
19
19
  bundler
20
20
  rake
21
21
  thor (>= 0.14.0)
22
- concurrent-ruby (1.1.8)
23
- diff-lcs (1.4.4)
24
- i18n (1.8.9)
22
+ concurrent-ruby (1.2.2)
23
+ diff-lcs (1.5.0)
24
+ i18n (1.14.1)
25
25
  concurrent-ruby (~> 1.0)
26
- minitest (5.14.4)
27
- rake (13.0.3)
28
- rspec (3.10.0)
29
- rspec-core (~> 3.10.0)
30
- rspec-expectations (~> 3.10.0)
31
- rspec-mocks (~> 3.10.0)
32
- rspec-core (3.10.1)
33
- rspec-support (~> 3.10.0)
34
- rspec-expectations (3.10.1)
26
+ minitest (5.20.0)
27
+ rake (13.0.6)
28
+ rspec (3.12.0)
29
+ rspec-core (~> 3.12.0)
30
+ rspec-expectations (~> 3.12.0)
31
+ rspec-mocks (~> 3.12.0)
32
+ rspec-core (3.12.2)
33
+ rspec-support (~> 3.12.0)
34
+ rspec-expectations (3.12.3)
35
35
  diff-lcs (>= 1.2.0, < 2.0)
36
- rspec-support (~> 3.10.0)
37
- rspec-mocks (3.10.2)
36
+ rspec-support (~> 3.12.0)
37
+ rspec-mocks (3.12.6)
38
38
  diff-lcs (>= 1.2.0, < 2.0)
39
- rspec-support (~> 3.10.0)
40
- rspec-support (3.10.2)
41
- thor (1.1.0)
39
+ rspec-support (~> 3.12.0)
40
+ rspec-support (3.12.1)
41
+ thor (1.3.0)
42
42
  thread_safe (0.3.6)
43
- tzinfo (1.2.9)
43
+ tzinfo (1.2.11)
44
44
  thread_safe (~> 0.1)
45
- zeitwerk (2.4.2)
45
+ zeitwerk (2.6.12)
46
46
 
47
47
  PLATFORMS
48
48
  ruby
49
49
 
50
50
  DEPENDENCIES
51
- activemodel (~> 6.0.3)
51
+ activemodel (~> 6.0.6.1)
52
52
  appraisal
53
53
  bundler (>= 2)
54
54
  nested_record!
@@ -56,4 +56,4 @@ DEPENDENCIES
56
56
  rspec (~> 3.0)
57
57
 
58
58
  BUNDLED WITH
59
- 2.2.14
59
+ 2.4.20
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activemodel", "~> 6.1.3"
5
+ gem "activemodel", "~> 6.1.7.6"
6
6
 
7
7
  gemspec path: "../"
@@ -1,53 +1,53 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- nested_record (1.1.0)
5
- activemodel (>= 4.2, < 6.2)
4
+ nested_record (1.1.1)
5
+ activemodel (> 5.2, < 7.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (6.1.3)
11
- activesupport (= 6.1.3)
12
- activesupport (6.1.3)
10
+ activemodel (6.1.7.6)
11
+ activesupport (= 6.1.7.6)
12
+ activesupport (6.1.7.6)
13
13
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
14
  i18n (>= 1.6, < 2)
15
15
  minitest (>= 5.1)
16
16
  tzinfo (~> 2.0)
17
17
  zeitwerk (~> 2.3)
18
- appraisal (2.4.0)
18
+ appraisal (2.5.0)
19
19
  bundler
20
20
  rake
21
21
  thor (>= 0.14.0)
22
- concurrent-ruby (1.1.8)
23
- diff-lcs (1.4.4)
24
- i18n (1.8.9)
22
+ concurrent-ruby (1.2.2)
23
+ diff-lcs (1.5.0)
24
+ i18n (1.14.1)
25
25
  concurrent-ruby (~> 1.0)
26
- minitest (5.14.4)
27
- rake (13.0.3)
28
- rspec (3.10.0)
29
- rspec-core (~> 3.10.0)
30
- rspec-expectations (~> 3.10.0)
31
- rspec-mocks (~> 3.10.0)
32
- rspec-core (3.10.1)
33
- rspec-support (~> 3.10.0)
34
- rspec-expectations (3.10.1)
26
+ minitest (5.20.0)
27
+ rake (13.0.6)
28
+ rspec (3.12.0)
29
+ rspec-core (~> 3.12.0)
30
+ rspec-expectations (~> 3.12.0)
31
+ rspec-mocks (~> 3.12.0)
32
+ rspec-core (3.12.2)
33
+ rspec-support (~> 3.12.0)
34
+ rspec-expectations (3.12.3)
35
35
  diff-lcs (>= 1.2.0, < 2.0)
36
- rspec-support (~> 3.10.0)
37
- rspec-mocks (3.10.2)
36
+ rspec-support (~> 3.12.0)
37
+ rspec-mocks (3.12.6)
38
38
  diff-lcs (>= 1.2.0, < 2.0)
39
- rspec-support (~> 3.10.0)
40
- rspec-support (3.10.2)
41
- thor (1.1.0)
42
- tzinfo (2.0.4)
39
+ rspec-support (~> 3.12.0)
40
+ rspec-support (3.12.1)
41
+ thor (1.3.0)
42
+ tzinfo (2.0.6)
43
43
  concurrent-ruby (~> 1.0)
44
- zeitwerk (2.4.2)
44
+ zeitwerk (2.6.12)
45
45
 
46
46
  PLATFORMS
47
47
  ruby
48
48
 
49
49
  DEPENDENCIES
50
- activemodel (~> 6.1.3)
50
+ activemodel (~> 6.1.7.6)
51
51
  appraisal
52
52
  bundler (>= 2)
53
53
  nested_record!
@@ -55,4 +55,4 @@ DEPENDENCIES
55
55
  rspec (~> 3.0)
56
56
 
57
57
  BUNDLED WITH
58
- 2.2.14
58
+ 2.4.20
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activemodel", "~> 7.0.8"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ nested_record (1.1.1)
5
+ activemodel (> 5.2, < 7.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activemodel (7.0.8)
11
+ activesupport (= 7.0.8)
12
+ activesupport (7.0.8)
13
+ concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ i18n (>= 1.6, < 2)
15
+ minitest (>= 5.1)
16
+ tzinfo (~> 2.0)
17
+ appraisal (2.5.0)
18
+ bundler
19
+ rake
20
+ thor (>= 0.14.0)
21
+ concurrent-ruby (1.2.2)
22
+ diff-lcs (1.5.0)
23
+ i18n (1.14.1)
24
+ concurrent-ruby (~> 1.0)
25
+ minitest (5.20.0)
26
+ rake (13.0.6)
27
+ rspec (3.12.0)
28
+ rspec-core (~> 3.12.0)
29
+ rspec-expectations (~> 3.12.0)
30
+ rspec-mocks (~> 3.12.0)
31
+ rspec-core (3.12.2)
32
+ rspec-support (~> 3.12.0)
33
+ rspec-expectations (3.12.3)
34
+ diff-lcs (>= 1.2.0, < 2.0)
35
+ rspec-support (~> 3.12.0)
36
+ rspec-mocks (3.12.6)
37
+ diff-lcs (>= 1.2.0, < 2.0)
38
+ rspec-support (~> 3.12.0)
39
+ rspec-support (3.12.1)
40
+ thor (1.3.0)
41
+ tzinfo (2.0.6)
42
+ concurrent-ruby (~> 1.0)
43
+
44
+ PLATFORMS
45
+ ruby
46
+
47
+ DEPENDENCIES
48
+ activemodel (~> 7.0.8)
49
+ appraisal
50
+ bundler (>= 2)
51
+ nested_record!
52
+ rake (~> 13.0)
53
+ rspec (~> 3.0)
54
+
55
+ BUNDLED WITH
56
+ 2.4.20
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activemodel", "~> 7.1.1"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,68 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ nested_record (1.1.1)
5
+ activemodel (> 5.2, < 7.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activemodel (7.1.1)
11
+ activesupport (= 7.1.1)
12
+ activesupport (7.1.1)
13
+ base64
14
+ bigdecimal
15
+ concurrent-ruby (~> 1.0, >= 1.0.2)
16
+ connection_pool (>= 2.2.5)
17
+ drb
18
+ i18n (>= 1.6, < 2)
19
+ minitest (>= 5.1)
20
+ mutex_m
21
+ tzinfo (~> 2.0)
22
+ appraisal (2.5.0)
23
+ bundler
24
+ rake
25
+ thor (>= 0.14.0)
26
+ base64 (0.1.1)
27
+ bigdecimal (3.1.4)
28
+ concurrent-ruby (1.2.2)
29
+ connection_pool (2.4.1)
30
+ diff-lcs (1.5.0)
31
+ drb (2.1.1)
32
+ ruby2_keywords
33
+ i18n (1.14.1)
34
+ concurrent-ruby (~> 1.0)
35
+ minitest (5.20.0)
36
+ mutex_m (0.1.2)
37
+ rake (13.0.6)
38
+ rspec (3.12.0)
39
+ rspec-core (~> 3.12.0)
40
+ rspec-expectations (~> 3.12.0)
41
+ rspec-mocks (~> 3.12.0)
42
+ rspec-core (3.12.2)
43
+ rspec-support (~> 3.12.0)
44
+ rspec-expectations (3.12.3)
45
+ diff-lcs (>= 1.2.0, < 2.0)
46
+ rspec-support (~> 3.12.0)
47
+ rspec-mocks (3.12.6)
48
+ diff-lcs (>= 1.2.0, < 2.0)
49
+ rspec-support (~> 3.12.0)
50
+ rspec-support (3.12.1)
51
+ ruby2_keywords (0.0.5)
52
+ thor (1.3.0)
53
+ tzinfo (2.0.6)
54
+ concurrent-ruby (~> 1.0)
55
+
56
+ PLATFORMS
57
+ ruby
58
+
59
+ DEPENDENCIES
60
+ activemodel (~> 7.1.1)
61
+ appraisal
62
+ bundler (>= 2)
63
+ nested_record!
64
+ rake (~> 13.0)
65
+ rspec (~> 3.0)
66
+
67
+ BUNDLED WITH
68
+ 2.4.20
@@ -143,11 +143,11 @@ class NestedRecord::Base
143
143
  subclass ||=
144
144
  begin
145
145
  if type_name.start_with?('::')
146
- ActiveSupport::Dependencies.constantize(type_name)
146
+ NestedRecord.constantize(type_name)
147
147
  elsif subtypes_store_full?
148
- ActiveSupport::Dependencies.constantize(type_name)
148
+ NestedRecord.constantize(type_name)
149
149
  elsif subtypes_namespace
150
- ActiveSupport::Dependencies.safe_constantize("#{subtypes_namespace}::#{type_name}") || ActiveSupport::Dependencies.constantize(type_name)
150
+ NestedRecord.safe_constantize("#{subtypes_namespace}::#{type_name}") || NestedRecord.constantize(type_name)
151
151
  else
152
152
  NestedRecord.lookup_const(self, type_name)
153
153
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class NestedRecord::CollectionProxy
2
4
  extend Forwardable
3
5
  include Enumerable
@@ -1,18 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NestedRecord
4
- # Derived from Rails source: https://github.com/rails/rails/blob/98a57aa5f610bc66af31af409c72173cdeeb3c9e/activerecord/lib/active_record/inheritance.rb#L181-L207
4
+ # TODO: Remove this when we drop support for Rails < 7.0
5
+ if ActiveSupport::VERSION::MAJOR < 7
6
+ def self.constantize(type_name)
7
+ ActiveSupport::Dependencies.constantize(type_name)
8
+ end
9
+
10
+ def self.safe_constantize(type_name)
11
+ ActiveSupport::Dependencies.safe_constantize(type_name)
12
+ end
13
+ else
14
+ def self.constantize(type_name)
15
+ type_name.constantize
16
+ end
5
17
 
18
+ def self.safe_constantize(type_name)
19
+ type_name.safe_constantize
20
+ end
21
+ end
22
+
23
+ # Derived from Rails source: https://github.com/rails/rails/blob/98a57aa5f610bc66af31af409c72173cdeeb3c9e/activerecord/lib/active_record/inheritance.rb#L181-L207
6
24
  def self.lookup_const(owner, type_name)
7
25
  if type_name.start_with?('::')
8
- ActiveSupport::Dependencies.constantize(type_name)
26
+ NestedRecord.constantize(type_name)
9
27
  else
10
28
  candidates = []
11
29
  owner.name.scan(/::|$/) { candidates.unshift "#{$`}::#{type_name}" }
12
30
  candidates << type_name
13
31
 
14
32
  candidates.each do |candidate|
15
- constant = ActiveSupport::Dependencies.safe_constantize(candidate)
33
+ constant = NestedRecord.safe_constantize(candidate)
16
34
  return constant if candidate == constant.to_s
17
35
  end
18
36
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NestedRecord
4
- VERSION = '1.1.0'
4
+ VERSION = '1.1.1'
5
5
  end
data/lib/nested_record.rb CHANGED
@@ -5,6 +5,7 @@ module NestedRecord
5
5
 
6
6
  require 'active_model'
7
7
  require 'active_support/dependencies'
8
+ require 'active_support/inflector'
8
9
  require 'active_support/concern'
9
10
  require 'active_support/json'
10
11
 
@@ -27,5 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "rspec", "~> 3.0"
28
28
  spec.add_development_dependency "appraisal"
29
29
 
30
- spec.add_dependency "activemodel", ">= 4.2", "< 6.2"
30
+ spec.add_dependency "activemodel", "> 5.2", "< 7.2"
31
31
  end
@@ -64,9 +64,19 @@ module TestModel
64
64
  module Erase
65
65
  def erase_test_consts
66
66
  Array(@test_consts).reverse_each do |klass|
67
- ActiveSupport::Dependencies.remove_constant(klass.name)
67
+ remove_constant(klass.name)
68
+ end
69
+ ActiveSupport::Dependencies.clear unless zeitwerk?
70
+ end
71
+
72
+ def remove_constant(klass_name)
73
+ if ActiveSupport::Dependencies.respond_to?(:remove_constant)
74
+ ActiveSupport::Dependencies.remove_constant(klass_name)
75
+ else
76
+ base, _, object = klass_name.to_s.rpartition('::')
77
+ base = base.empty? ? Object : NestedRecord.constantize(base)
78
+ base.send :remove_const, object
68
79
  end
69
- ActiveSupport::Dependencies.clear
70
80
  end
71
81
 
72
82
  def test_const_dig_name!(name)
@@ -85,5 +95,9 @@ module TestModel
85
95
  end
86
96
  [namespace, name]
87
97
  end
98
+
99
+ def zeitwerk?
100
+ ActiveSupport::VERSION::MAJOR >= 7
101
+ end
88
102
  end
89
103
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nested_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Kochnev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-13 00:00:00.000000000 Z
11
+ date: 2023-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,22 +70,22 @@ dependencies:
70
70
  name: activemodel
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - ">"
74
74
  - !ruby/object:Gem::Version
75
- version: '4.2'
75
+ version: '5.2'
76
76
  - - "<"
77
77
  - !ruby/object:Gem::Version
78
- version: '6.2'
78
+ version: '7.2'
79
79
  type: :runtime
80
80
  prerelease: false
81
81
  version_requirements: !ruby/object:Gem::Requirement
82
82
  requirements:
83
- - - ">="
83
+ - - ">"
84
84
  - !ruby/object:Gem::Version
85
- version: '4.2'
85
+ version: '5.2'
86
86
  - - "<"
87
87
  - !ruby/object:Gem::Version
88
- version: '6.2'
88
+ version: '7.2'
89
89
  description:
90
90
  email:
91
91
  - hashtable@yandex.ru
@@ -110,6 +110,10 @@ files:
110
110
  - gemfiles/rails_6.0.gemfile.lock
111
111
  - gemfiles/rails_6.1.gemfile
112
112
  - gemfiles/rails_6.1.gemfile.lock
113
+ - gemfiles/rails_7.0.gemfile
114
+ - gemfiles/rails_7.0.gemfile.lock
115
+ - gemfiles/rails_7.1.gemfile
116
+ - gemfiles/rails_7.1.gemfile.lock
113
117
  - lib/nested_record.rb
114
118
  - lib/nested_record/base.rb
115
119
  - lib/nested_record/collection.rb
@@ -157,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
161
  - !ruby/object:Gem::Version
158
162
  version: '0'
159
163
  requirements: []
160
- rubygems_version: 3.1.4
164
+ rubygems_version: 3.4.20
161
165
  signing_key:
162
166
  specification_version: 4
163
167
  summary: ActiveModel mapper for JSON fields