attr_json 2.0.0.rc1 → 2.0.1

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: 11d5f5f1403cf8388ab7b5b14494a68ff5bdb11c1cd739ae81f78da5b97dbbbc
4
- data.tar.gz: d787c2b06cc01478cd764201a204e85312bc9204f8c54b9bdbe2c5e597ac00b1
3
+ metadata.gz: cd9c25a736bb3b1ce26527c555718efcff2967204d853962048ffc2471af243c
4
+ data.tar.gz: dc022d69b43b4576d2939bb90f2e172b65b8dd45708b361758554561dc61f44f
5
5
  SHA512:
6
- metadata.gz: 8dd9c059292d1fba076323f101f0a3445986db3b41ef6099a4f33a583dd1c8bb1dc58e42fba1f35d74fe87eeb1f3fe4253959377cb98c322fa9e22a99c5d43db
7
- data.tar.gz: d145d01c73273d4fd1f089b95287fb67adb3c1f6ed12a5c5317a879f230430b760b3abbdf0c27626a2560e612a6823e239ab849ec557a2b412564e2a6bd5ef1c
6
+ metadata.gz: 6457f06b9aed14481b7dd1543929d7010b54d232473f64cde811452083279ab72bbeb92f7a972e903d8994f21f3e263c5163044aa363db4c35a7eadd42710f24
7
+ data.tar.gz: 8dd0bad4eb89aad50ceb084ecb48a08d0f4b19d67f9421250fb808a2238c159fce891d1e07d37568b6ba6c65c284a9b2b600e1156cf32334a2c7d518d468994d
@@ -29,6 +29,12 @@ jobs:
29
29
  fail-fast: false
30
30
  matrix:
31
31
  include:
32
+ - gemfile: rails_6_0
33
+ ruby: 2.7
34
+
35
+ - gemfile: rails_6_0
36
+ ruby: '3.0'
37
+
32
38
  - gemfile: rails_6_1
33
39
  ruby: 2.7
34
40
 
data/Appraisals CHANGED
@@ -3,6 +3,7 @@ appraise "rails-6-0" do
3
3
 
4
4
  gem "rails", ">= 6.0.0", "< 6.1"
5
5
  gem "pg", "~> 1.0"
6
+ gem "rspec-rails", "~> 5.0"
6
7
  end
7
8
 
8
9
  appraise "rails-6-1" do
@@ -32,4 +33,9 @@ appraise "rails-edge" do
32
33
 
33
34
  gem "rails", git: "https://github.com/rails/rails.git", branch: "main"
34
35
  gem "pg", "~> 1.0"
36
+
37
+ # Edge rails, future Rails 7.1 currently allows rack 3 -- but rails itself
38
+ # and some of our other dependencies may not actually work with rack 3 yet,
39
+ # let's test under rack 2. (Nothing in this gem deals with levels as low as rack)
40
+ gem "rack", "~> 2.0"
35
41
  end
data/CHANGELOG.md CHANGED
@@ -4,13 +4,41 @@ 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/v3.0.0...HEAD)
7
+ ## [Unreleased](https://github.com/jrochkind/attr_json/compare/v2.0.1...HEAD)
8
8
 
9
+ ### Fixed
10
+
11
+ *
12
+
13
+ *
14
+
15
+ *
16
+
17
+ ### Added
18
+
19
+ *
20
+
21
+ *
22
+
23
+ *
24
+
25
+ ## [2.0.1](https://github.com/jrochkind/attr_json/compare/v2.0.0...v2.0.1)
26
+
27
+
28
+ ### Fixed
29
+
30
+ * You can now do a specified ActiveRecord `.select` without your json containers, to fetch an object with other attributes that you can access. https://github.com/jrochkind/attr_json/pull/193
31
+
32
+ ### Changed
33
+
34
+ * Refactor #attr_json_sync_to_rails_attributes for slightly improved performance. https://github.com/jrochkind/attr_json/pull/192
35
+
36
+ * Safety guard in sync_to_rails_attributes against unknown edge case where container is nil https://github.com/jrochkind/attr_json/pull/194
9
37
 
10
38
 
11
- ## [3.0.0.rc1](https://github.com/jrochkind/attr_json/compare/v1.5.0...v3.0.0.rc1)
39
+ ## [2.0.0](https://github.com/jrochkind/attr_json/compare/v1.5.0...v2.0.0)
12
40
 
13
- While it has some backwards incompat changes, this is expected not to be a challenging upgrade, please let us know by filing an issue if it's giving you troubles, maybe we can make things easier for you. No changes to data stored in your DB should be needed when upgrading, the persisted data should be compatible between 2.x and 3.x.
41
+ While it has some backwards incompat changes, this is expected not to be a challenging upgrade, please let us know by filing an issue if it's giving you troubles, maybe we can make things easier for you. No changes to data stored in your DB should be needed when upgrading, the persisted data should be compatible between 1.x and 2.x.
14
42
 
15
43
  ### Removed
16
44
 
data/README.md CHANGED
@@ -256,6 +256,11 @@ m.attr_jsons_before_type_cast
256
256
 
257
257
  You can nest AttrJson::Model objects inside each other, as deeply as you like.
258
258
 
259
+ You *can* edit nested models "in place", they will be properly saved.
260
+
261
+ m.lang_and_value.lang = "de"
262
+ m.save! # no problem!
263
+
259
264
  For use with Rails forms, you may want to use `attr_json_accepts_nested_attributes_for` (like Rails `accepts_nested_attributes_for`, see doc page on [Use with Forms and Form Builders](https://github.com/jrochkind/attr_json/blob/master/doc_src/forms.md).
260
265
 
261
266
  ### Model-type defaults
@@ -541,9 +546,9 @@ We use [appraisal](https://github.com/thoughtbot/appraisal) to test with multipl
541
546
 
542
547
  There is a `./bin/console` that will give you a console in the context of attr_json and all it's dependencies, including the combustion rails app, and the models defined there.
543
548
 
544
- ## Acknowledements and Prior Art
549
+ ## Acknowledements, Prior Art, alternatives
545
550
 
546
- * The excellent work [Sean Griffin](https://twitter.com/sgrif) did on ActiveModel::Type
551
+ * The excellent work [sgrif](https://twitter.com/sgrif) did on ActiveModel::Type
547
552
  really lays the groundwork and makes this possible. Plus many other Rails developers.
548
553
  Rails has a reputation for being composed of messy or poorly designed code, but
549
554
  it's some really nice design in Rails that allows us to do some pretty powerful
@@ -563,3 +568,5 @@ There is a `./bin/console` that will give you a console in the context of attr_j
563
568
  haven't looked at it too much.
564
569
 
565
570
  * [store_model](https://github.com/DmitryTsepelev/store_model) was created after `attr_json`, and has some overlapping functionality.
571
+
572
+ * [store_attribute](https://github.com/palkan/store_attribute) is also a more recent addition. while it's not specifically about JSON, it could be used with an underlying JSON coder to give you typed json attributes.
@@ -5,14 +5,14 @@ source "https://rubygems.org"
5
5
  gem "combustion", "~> 1.0"
6
6
  gem "rails", ">= 6.0.0", "< 6.1"
7
7
  gem "pg", "~> 1.0"
8
- gem "rspec-rails", "~> 4.0"
8
+ gem "rspec-rails", "~> 5.0"
9
9
  gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
13
  gem "sprockets-rails"
14
14
  gem "capybara", "~> 3.0"
15
- gem "webdrivers", "~> 4.0"
15
+ gem "webdrivers", "~> 5.0"
16
16
  gem "selenium-webdriver"
17
17
  gem "byebug"
18
18
 
@@ -5,14 +5,14 @@ source "https://rubygems.org"
5
5
  gem "combustion", "~> 1.0"
6
6
  gem "rails", "~> 6.1.0"
7
7
  gem "pg", "~> 1.0"
8
- gem "rspec-rails", "~> 4.0"
8
+ gem "rspec-rails", "~> 6.0"
9
9
  gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
13
  gem "sprockets-rails"
14
14
  gem "capybara", "~> 3.0"
15
- gem "webdrivers", "~> 4.0"
15
+ gem "webdrivers", "~> 5.0"
16
16
  gem "selenium-webdriver"
17
17
  gem "byebug"
18
18
 
@@ -5,14 +5,14 @@ source "https://rubygems.org"
5
5
  gem "combustion", "~> 1.0"
6
6
  gem "rails", "~> 7.0.0"
7
7
  gem "pg", "~> 1.0"
8
- gem "rspec-rails", "~> 4.0"
8
+ gem "rspec-rails", "~> 6.0"
9
9
  gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
13
  gem "sprockets-rails"
14
14
  gem "capybara", "~> 3.0"
15
- gem "webdrivers", "~> 4.0"
15
+ gem "webdrivers", "~> 5.0"
16
16
  gem "selenium-webdriver"
17
17
  gem "byebug"
18
18
 
@@ -5,15 +5,16 @@ source "https://rubygems.org"
5
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
- gem "rspec-rails", "~> 4.0"
8
+ gem "rspec-rails", "~> 6.0"
9
9
  gem "simple_form", ">= 4.0"
10
10
  gem "cocoon", ">= 1.2"
11
11
  gem "jquery-rails"
12
12
  gem "coffee-rails"
13
13
  gem "sprockets-rails"
14
14
  gem "capybara", "~> 3.0"
15
- gem "webdrivers", "~> 4.0"
15
+ gem "webdrivers", "~> 5.0"
16
16
  gem "selenium-webdriver"
17
17
  gem "byebug"
18
+ gem "rack", "~> 2.0"
18
19
 
19
20
  gemspec path: "../"
@@ -48,23 +48,33 @@ module AttrJson
48
48
  # mutation of mutable object will effect both places, for instance for dirty
49
49
  # tracking.
50
50
  def attr_json_sync_to_rails_attributes
51
- self.class.attr_json_registry.attribute_names.each do |attr_name|
51
+ self.class.attr_json_registry.definitions.group_by(&:container_attribute).each_pair do |container_attribute, definitions|
52
52
  begin
53
- attribute_def = self.class.attr_json_registry.fetch(attr_name.to_sym)
54
- json_value = public_send(attribute_def.container_attribute)
55
- value = json_value[attribute_def.store_key]
53
+ # column may have eg been left out of an explicit 'select'
54
+ next unless has_attribute?(container_attribute)
56
55
 
57
- if value
58
- # TODO, can we just make this use the setter?
59
- write_attribute(attr_name, value)
56
+ container_value = public_send(container_attribute)
60
57
 
61
- clear_attribute_change(attr_name) if persisted?
58
+ # isn't expected to be possible to be nil rather than empty hash, but
59
+ # if it is from some edge case, well, we don't have values to sync, fine
60
+ next if container_value.nil?
62
61
 
63
- # writing and clearning will result in a new object stored in
64
- # rails attributes, we want
65
- # to make sure the exact same object is in the json attribute,
66
- # so in-place mutation changes to it are reflected in both places.
67
- json_value[attribute_def.store_key] = read_attribute(attr_name)
62
+ definitions.each do |attribute_def|
63
+ attr_name = attribute_def.name
64
+ value = container_value[attribute_def.store_key]
65
+
66
+ if value
67
+ # TODO, can we just make this use the setter?
68
+ write_attribute(attr_name, value)
69
+
70
+ clear_attribute_change(attr_name) if persisted?
71
+
72
+ # writing and clearning will result in a new object stored in
73
+ # rails attributes, we want
74
+ # to make sure the exact same object is in the json attribute,
75
+ # so in-place mutation changes to it are reflected in both places.
76
+ container_value[attribute_def.store_key] = read_attribute(attr_name)
77
+ end
68
78
  end
69
79
  rescue AttrJson::Type::Model::BadCast, AttrJson::Type::PolymorphicModel::TypeError => e
70
80
  # There was bad data in the DB, we're just going to skip the Rails attribute sync.
@@ -1,3 +1,3 @@
1
1
  module AttrJson
2
- VERSION = "2.0.0.rc1"
2
+ VERSION = "2.0.1"
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: 2.0.0.rc1
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Rochkind
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-19 00:00:00.000000000 Z
11
+ date: 2023-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -202,11 +202,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
202
202
  version: 2.6.0
203
203
  required_rubygems_version: !ruby/object:Gem::Requirement
204
204
  requirements:
205
- - - ">"
205
+ - - ">="
206
206
  - !ruby/object:Gem::Version
207
- version: 1.3.1
207
+ version: '0'
208
208
  requirements: []
209
- rubygems_version: 3.2.33
209
+ rubygems_version: 3.3.26
210
210
  signing_key:
211
211
  specification_version: 4
212
212
  summary: ActiveRecord attributes stored serialized in a json column, super smooth.