attr_json 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2f8a06eaf0058564901292a35bf15fd56c24b0eb8cb784ab1b1e9adc94b87e5
4
- data.tar.gz: eb4917f0eb8304b8261536ae75a5abd64dfc29aed52d82c190bb9b48a738ff08
3
+ metadata.gz: 3cd2566fed014325bee56f5c062080d3c929a790dbb3b287e92b086c2fa3180f
4
+ data.tar.gz: ffa8e7b471dce27a2708b12e6a2bf27edb5b20d1345656ca026ecc4b263a01a7
5
5
  SHA512:
6
- metadata.gz: 599a5e752e187a9e511b766efffda2bbf546c6940f42e58c2f0cb883ef835c017e4ec8b9a4fbc2a3236fde733ae6c77c8d27e4728b0fff53dc993b209a3d7882
7
- data.tar.gz: 84dac19bcebedf7979ad3299b28ecc175fec59887cc9e6d761d708f0dbb240f8443aba52aca89a434ab8040f5ff64288ce4a428a659c61e8ff11d128399b5974
6
+ metadata.gz: f8db6d4211a2dd9f4b9d8a5482b723597958082617e139157c325e8e3b9dddf15216d21bd56daece5d5b3674acdc8e099a22998ad452473a4bf0834774b7a21f
7
+ data.tar.gz: 13e2cd5b4b10f67f4ecfc1be8732c6a33a7f7a7fdb561b6d8f4f89ae39c74e4b0b153ae10fdf5d650a239534f5b28cd33750aaff90009eeec8877677e765a935
@@ -54,15 +54,22 @@ jobs:
54
54
  ruby: 2.7
55
55
 
56
56
  - gemfile: rails_6_1
57
- ruby: 3.0
57
+ ruby: '3.0'
58
58
 
59
59
  - gemfile: rails_7_0
60
- ruby: 3.0
60
+ ruby: '3.0'
61
+
62
+ - gemfile: rails_7_0
63
+ ruby: 3.1
64
+
65
+ - gemfile: rails_7_0
66
+ ruby: 3.2
67
+
61
68
 
62
69
  name: ${{ matrix.gemfile }}, ruby ${{ matrix.ruby }}
63
70
 
64
71
  steps:
65
- - uses: actions/checkout@v2
72
+ - uses: actions/checkout@v3
66
73
 
67
74
  - name: Set up Ruby
68
75
  uses: ruby/setup-ruby@v1
@@ -45,12 +45,12 @@ jobs:
45
45
  include:
46
46
 
47
47
  - gemfile: rails_edge
48
- ruby: 2.7
48
+ ruby: '3.1'
49
49
 
50
50
  name: ${{ matrix.gemfile }}, ruby ${{ matrix.ruby }}
51
51
 
52
52
  steps:
53
- - uses: actions/checkout@v2
53
+ - uses: actions/checkout@v3
54
54
 
55
55
  - name: Set up Ruby
56
56
  uses: ruby/setup-ruby@v1
data/Appraisals CHANGED
@@ -37,6 +37,11 @@ appraise "rails-6-1" do
37
37
 
38
38
  gem "rails", "~> 6.1.0"
39
39
  gem "pg", "~> 1.0"
40
+
41
+ # sprockets-rails is already a rails 6.1 dependency, but combustion is failing
42
+ # to require it, this is one way to get it required.
43
+ # https://github.com/pat/combustion/issues/128
44
+ gem "sprockets-rails"
40
45
  end
41
46
 
42
47
  appraise "rails-7-0" do
@@ -44,21 +49,14 @@ appraise "rails-7-0" do
44
49
 
45
50
  gem "rails", "~> 7.0.0"
46
51
  gem "pg", "~> 1.0"
47
-
48
- # to make our integration tests using simple_form work as-is,
49
- # this works. Don't totally underestand the actual simple_form
50
- # setup paths in Rails 7....
51
- gem "sprockets-rails"
52
52
  end
53
53
 
54
54
  appraise "rails-edge" do
55
- gem 'combustion', "~> 1.0"
55
+ # need combustion edge to work with rails edge, will no longer
56
+ # be true on next combustion release, probably no later than Rails 7.1
57
+ # https://github.com/pat/combustion/pull/126
58
+ gem 'combustion', "~> 1.0", github: "pat/combustion"
56
59
 
57
60
  gem "rails", git: "https://github.com/rails/rails.git", branch: "main"
58
61
  gem "pg", "~> 1.0"
59
-
60
- # We do some tests using cocoon, currently via sprockets-rails,
61
- # which is not automatically available in Rails 7. Not sure
62
- # the future of cocoon in general. https://github.com/nathanvda/cocoon/issues/555
63
- gem "sprockets-rails"
64
62
  end
data/CHANGELOG.md CHANGED
@@ -4,10 +4,24 @@ Notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased](https://github.com/jrochkind/attr_json/compare/v1.4.0...HEAD)
7
+ ## [Unreleased](https://github.com/jrochkind/attr_json/compare/v1.4.1...HEAD)
8
8
 
9
9
 
10
+ ## [1.5.0](https://github.com/jrochkind/attr_json/compare/v1.4.1...v1.5.0)
10
11
 
12
+ ### Added
13
+
14
+ * AttrJson::Model#dup will properly deep-dup attributes https://github.com/jrochkind/attr_json/pull/169
15
+
16
+ * AttrJson::Model#freeze will freeze attributes -- but not deep-freeze. https://github.com/jrochkind/attr_json/pull/169
17
+
18
+ * AttrJson::Model has some methods conventional in ActiveModel classes: Klass.attribute_types, Klass.attribute_names, and instance.attribute_names. https://github.com/jrochkind/attr_json/pull/169
19
+
20
+ ## [1.4.1](https://github.com/jrochkind/attr_json/compare/v1.4.0...v1.4.1)
21
+
22
+ ### Fixed
23
+
24
+ * Fixed an obscure bug involving a conflict between attribute defaults and accepts_nested_attributes, in which defaults could overwrite assigned attributes. The `.fill_in_defaults` class method, which was never intended as public API and was commented accordingly, is gone. https://github.com/jrochkind/attr_json/pull/160
11
25
 
12
26
  ## [1.4.0](https://github.com/jrochkind/attr_json/compare/v1.3.0...v1.4.0)
13
27
 
data/Gemfile CHANGED
@@ -19,7 +19,7 @@ gem 'combustion', '~> 1.1'
19
19
  gem 'rails'
20
20
 
21
21
  gem "pg"
22
- gem "rspec-rails", "~> 4.0"
22
+ gem "rspec-rails", "~> 6.0"
23
23
  gem "simple_form", ">= 4.0"
24
24
  gem 'cocoon', ">= 1.2"
25
25
  gem 'jquery-rails'
@@ -29,8 +29,15 @@ gem 'jquery-rails'
29
29
  # don't understand, so we need to depend on it.
30
30
  gem "coffee-rails"
31
31
 
32
+ # We do some tests using cocoon via sprockets, which needs sprockets-rails,
33
+ # which is not automatically available in Rails 7. We add it explicitly,
34
+ # which will duplciate dependences in rails pre-7, but add for rails 7. Not sure
35
+ # the future of cocoon in general. https://github.com/nathanvda/cocoon/issues/555
36
+ gem "sprockets-rails"
37
+
38
+
32
39
  gem 'capybara', "~> 3.0"
33
- gem 'webdrivers', '~> 4.0'
40
+ gem 'webdrivers', '~> 5.0'
34
41
  gem "selenium-webdriver"
35
42
 
36
43
  gem "byebug"
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![Gem Version](https://badge.fury.io/rb/attr_json.svg)](https://badge.fury.io/rb/attr_json)
5
5
 
6
6
 
7
- ActiveRecord attributes stored serialized in a json column, super smooth. For Rails 5.0 through 6.1. Ruby 2.4+.
7
+ ActiveRecord attributes stored serialized in a json column, super smooth. For Rails 5.0 through 7.0. Ruby 2.4+.
8
8
 
9
9
  Typed and cast like Active Record. Supporting [nested models](#nested), [dirty tracking](#dirty), some [querying](#querying) (with postgres [jsonb](https://www.postgresql.org/docs/9.5/static/datatype-json.html) contains), and [working smoothy with form builders](#forms).
10
10
 
@@ -478,15 +478,15 @@ to prevent overwriting other updates from processes.
478
478
 
479
479
  ## State of Code, and To Be Done
480
480
 
481
- This code is solid and stable and is being used in production by at least a handful of people, including the primary maintainer, jrochkind.
481
+ This code is solid and stable and is being used in production by at least a handful of people, including the primary maintainer, jrochkind.
482
482
 
483
- The project is currently getting very little maintainance -- and is still working reliably through Rails releases. It is tested on edge rails and ruby (and has needed very few if any changes with subsequent releases), and I endeavor to keep it working as Rails keeps releasing.
483
+ The project is currently getting very little maintainance -- and is still working reliably through Rails releases. It is tested on edge rails and ruby (and has needed very few if any changes with subsequent releases), and I endeavor to keep it working as Rails keeps releasing.
484
484
 
485
- In order to keep the low-maintenace scenario sustainable, I am *very* cautious accepting new features, especially if they increase code complexity at all. Even if you have a working PR, I may be reluctant to accept it. I'm prioritizing sustainability and stability over new features, and so far this is working out well. However, discussion is always welcome! Especially when paired with code (failing tests for the bugfix or feature you want are super helpful on their own!).
485
+ In order to keep the low-maintenace scenario sustainable, I am *very* cautious accepting new features, especially if they increase code complexity at all. Even if you have a working PR, I may be reluctant to accept it. I'm prioritizing sustainability and stability over new features, and so far this is working out well. However, discussion is always welcome! Especially when paired with code (failing tests for the bugfix or feature you want are super helpful on their own!).
486
486
 
487
487
  We are committed to [semantic versioning](https://semver.org/) and will endeavor to release no backwards breaking changes without a major version. We are also serious about minimizing backwards incompat releases altogether (ie minimiing major version releases).
488
488
 
489
- Feedback of any kind of _very welcome_, please feel free to use the issue tracker. It is hard to get a sense of how many people are actually using this, which is helpful both for my own sense of reward and for anyone to get a sense of the size of the userbase -- feel free to say hi and let us know how you are using it!
489
+ Feedback of any kind of _very welcome_, please feel free to use the issue tracker. It is hard to get a sense of how many people are actually using this, which is helpful both for my own sense of reward and for anyone to get a sense of the size of the userbase -- feel free to say hi and let us know how you are using it!
490
490
 
491
491
  Except for the jsonb_contains stuff using postgres jsonb contains operator, I don't believe any postgres-specific features are used. It ought to work with MySQL, testing and feedback welcome. (Or a PR to test on MySQL?). My own interest is postgres.
492
492
 
data/attr_json.gemspec CHANGED
@@ -51,7 +51,6 @@ attributes use as much of the existing ActiveRecord architecture as we can.}
51
51
  spec.add_development_dependency "bundler"
52
52
  spec.add_development_dependency "rake", ">= 10.0"
53
53
  spec.add_development_dependency "rspec", "~> 3.7"
54
- spec.add_development_dependency "database_cleaner", "~> 1.5"
55
54
  spec.add_development_dependency "yard-activesupport-concern"
56
55
  spec.add_development_dependency "appraisal", "~> 2.2"
57
56
 
@@ -10,6 +10,7 @@ gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
+ gem "sprockets-rails"
13
14
  gem "capybara", "~> 3.0"
14
15
  gem "webdrivers", "~> 4.0"
15
16
  gem "selenium-webdriver"
@@ -10,6 +10,7 @@ gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
+ gem "sprockets-rails"
13
14
  gem "capybara", "~> 3.0"
14
15
  gem "webdrivers", "~> 4.0"
15
16
  gem "selenium-webdriver"
@@ -10,6 +10,7 @@ gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
+ gem "sprockets-rails"
13
14
  gem "capybara", "~> 3.0"
14
15
  gem "webdrivers", "~> 4.0"
15
16
  gem "selenium-webdriver"
@@ -10,6 +10,7 @@ gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
+ gem "sprockets-rails"
13
14
  gem "capybara", "~> 3.0"
14
15
  gem "webdrivers", "~> 4.0"
15
16
  gem "selenium-webdriver"
@@ -10,6 +10,7 @@ gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
+ gem "sprockets-rails"
13
14
  gem "capybara", "~> 3.0"
14
15
  gem "webdrivers", "~> 4.0"
15
16
  gem "selenium-webdriver"
@@ -10,10 +10,10 @@ gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
+ gem "sprockets-rails"
13
14
  gem "capybara", "~> 3.0"
14
15
  gem "webdrivers", "~> 4.0"
15
16
  gem "selenium-webdriver"
16
17
  gem "byebug"
17
- gem "sprockets-rails"
18
18
 
19
19
  gemspec path: "../"
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "combustion", "~> 1.0"
5
+ gem "combustion", "~> 1.0", github: "pat/combustion"
6
6
  gem "rails", git: "https://github.com/rails/rails.git", branch: "main"
7
7
  gem "pg", "~> 1.0"
8
8
  gem "rspec-rails", "~> 4.0"
@@ -10,10 +10,10 @@ gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
+ gem "sprockets-rails"
13
14
  gem "capybara", "~> 3.0"
14
15
  gem "webdrivers", "~> 4.0"
15
16
  gem "selenium-webdriver"
16
17
  gem "byebug"
17
- gem "sprockets-rails"
18
18
 
19
19
  gemspec path: "../"
@@ -135,6 +135,17 @@ module AttrJson
135
135
  @serialization_coder ||= AttrJson::SerializationCoderFromType.new(to_type)
136
136
  end
137
137
 
138
+ # like the ActiveModel::Attributes method
139
+ def attribute_names
140
+ attr_json_registry.attribute_names
141
+ end
142
+
143
+ # like the ActiveModel::Attributes method, hash with name keys, and ActiveModel::Type values
144
+ def attribute_types
145
+ attribute_names.collect { |name| [name.to_s, attr_json_registry.type_for_attribute(name)]}.to_h
146
+ end
147
+
148
+
138
149
  # Type can be an instance of an ActiveModel::Type::Value subclass, or a symbol that will
139
150
  # be looked up in `ActiveModel::Type.lookup`
140
151
  #
@@ -177,27 +188,6 @@ module AttrJson
177
188
  end
178
189
  end
179
190
 
180
- # This should kind of be considered 'protected', but the semantics
181
- # of how we want to call it don't give us a visibility modifier that works.
182
- # Prob means refactoring called for. TODO?
183
- def fill_in_defaults(hash)
184
- # Only if we need to mutate it to add defaults, we'll dup it first. deep_dup not neccesary
185
- # since we're only modifying top-level here.
186
- duped = false
187
- attr_json_registry.definitions.each do |definition|
188
- if definition.has_default? && ! (hash.has_key?(definition.store_key.to_s) || hash.has_key?(definition.store_key.to_sym))
189
- unless duped
190
- hash = hash.dup
191
- duped = true
192
- end
193
-
194
- hash[definition.store_key] = definition.provide_default!
195
- end
196
- end
197
-
198
- hash
199
- end
200
-
201
191
  private
202
192
 
203
193
  # Define an anonymous module and include it, so can still be easily
@@ -213,11 +203,15 @@ module AttrJson
213
203
  end
214
204
 
215
205
  def initialize(attributes = {})
216
- if !attributes.respond_to?(:transform_keys)
217
- raise ArgumentError, "When assigning attributes, you must pass a hash as an argument."
218
- end
206
+ super
207
+
208
+ fill_in_defaults!
209
+ end
219
210
 
220
- super(self.class.fill_in_defaults(attributes))
211
+ # inspired by https://github.com/rails/rails/blob/8015c2c2cf5c8718449677570f372ceb01318a32/activemodel/lib/active_model/attributes.rb
212
+ def initialize_dup(other) # :nodoc:
213
+ @attributes = @attributes.deep_dup
214
+ super
221
215
  end
222
216
 
223
217
  def attributes
@@ -255,6 +249,11 @@ module AttrJson
255
249
  self.class.attr_json_registry.has_attribute?(str)
256
250
  end
257
251
 
252
+ # like the ActiveModel::Attributes method
253
+ def attribute_names
254
+ self.class.attribute_names
255
+ end
256
+
258
257
  # Override from ActiveModel::Serialization to #serialize
259
258
  # by type to make sure any values set directly on hash still
260
259
  # get properly type-serialized.
@@ -301,8 +300,25 @@ module AttrJson
301
300
  false
302
301
  end
303
302
 
303
+ # like ActiveModel::Attributes at
304
+ # https://github.com/rails/rails/blob/8015c2c2cf5c8718449677570f372ceb01318a32/activemodel/lib/active_model/attributes.rb#L120
305
+ #
306
+ # is not a full deep freeze
307
+ def freeze
308
+ attributes.freeze unless frozen?
309
+ super
310
+ end
311
+
304
312
  private
305
313
 
314
+ def fill_in_defaults!
315
+ self.class.attr_json_registry.definitions.each do |definition|
316
+ if definition.has_default? && !attributes.has_key?(definition.name.to_s)
317
+ self.send("#{definition.name.to_s}=", definition.provide_default!)
318
+ end
319
+ end
320
+ end
321
+
306
322
  def _attr_json_write(key, value)
307
323
  if attribute_def = self.class.attr_json_registry[key.to_sym]
308
324
  attributes[key.to_s] = attribute_def.cast(value)
@@ -270,7 +270,13 @@ module AttrJson
270
270
  # find it from currently declared attributes.
271
271
  # https://github.com/rails/rails/blob/6aa5cf03ea8232180ffbbae4c130b051f813c670/activemodel/lib/active_model/attribute_methods.rb#L463-L468
272
272
  def matched_attribute_method(method_name)
273
- matches = self.class.send(:attribute_method_matchers_matching, method_name)
273
+ if self.class.respond_to?(:attribute_method_patterns_matching, true)
274
+ # Rails 7.1+
275
+ matches = self.class.send(:attribute_method_patterns_matching, method_name)
276
+ else
277
+ matches = self.class.send(:attribute_method_matchers_matching, method_name)
278
+ end
279
+
274
280
  matches.detect do |match|
275
281
  registry.has_attribute?(match.attr_name)
276
282
  end
@@ -1,3 +1,3 @@
1
1
  module AttrJson
2
- VERSION = "1.4.0"
2
+ VERSION = "1.5.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attr_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Rochkind
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-22 00:00:00.000000000 Z
11
+ date: 2023-01-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -72,20 +72,6 @@ dependencies:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '3.7'
75
- - !ruby/object:Gem::Dependency
76
- name: database_cleaner
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: '1.5'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: '1.5'
89
75
  - !ruby/object:Gem::Dependency
90
76
  name: yard-activesupport-concern
91
77
  requirement: !ruby/object:Gem::Requirement
@@ -225,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
211
  - !ruby/object:Gem::Version
226
212
  version: '0'
227
213
  requirements: []
228
- rubygems_version: 3.1.6
214
+ rubygems_version: 3.2.33
229
215
  signing_key:
230
216
  specification_version: 4
231
217
  summary: ActiveRecord attributes stored serialized in a json column, super smooth.