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 +4 -4
- data/.github/workflows/ci.yml +6 -0
- data/Appraisals +6 -0
- data/CHANGELOG.md +31 -3
- data/README.md +9 -2
- data/gemfiles/rails_6_0.gemfile +2 -2
- data/gemfiles/rails_6_1.gemfile +2 -2
- data/gemfiles/rails_7_0.gemfile +2 -2
- data/gemfiles/rails_edge.gemfile +3 -2
- data/lib/attr_json/record.rb +23 -13
- data/lib/attr_json/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd9c25a736bb3b1ce26527c555718efcff2967204d853962048ffc2471af243c
|
4
|
+
data.tar.gz: dc022d69b43b4576d2939bb90f2e172b65b8dd45708b361758554561dc61f44f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6457f06b9aed14481b7dd1543929d7010b54d232473f64cde811452083279ab72bbeb92f7a972e903d8994f21f3e263c5163044aa363db4c35a7eadd42710f24
|
7
|
+
data.tar.gz: 8dd0bad4eb89aad50ceb084ecb48a08d0f4b19d67f9421250fb808a2238c159fce891d1e07d37568b6ba6c65c284a9b2b600e1156cf32334a2c7d518d468994d
|
data/.github/workflows/ci.yml
CHANGED
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/
|
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
|
-
## [
|
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
|
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
|
549
|
+
## Acknowledements, Prior Art, alternatives
|
545
550
|
|
546
|
-
* The excellent work [
|
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.
|
data/gemfiles/rails_6_0.gemfile
CHANGED
@@ -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", "~>
|
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", "~>
|
15
|
+
gem "webdrivers", "~> 5.0"
|
16
16
|
gem "selenium-webdriver"
|
17
17
|
gem "byebug"
|
18
18
|
|
data/gemfiles/rails_6_1.gemfile
CHANGED
@@ -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", "~>
|
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", "~>
|
15
|
+
gem "webdrivers", "~> 5.0"
|
16
16
|
gem "selenium-webdriver"
|
17
17
|
gem "byebug"
|
18
18
|
|
data/gemfiles/rails_7_0.gemfile
CHANGED
@@ -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", "~>
|
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", "~>
|
15
|
+
gem "webdrivers", "~> 5.0"
|
16
16
|
gem "selenium-webdriver"
|
17
17
|
gem "byebug"
|
18
18
|
|
data/gemfiles/rails_edge.gemfile
CHANGED
@@ -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", "~>
|
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", "~>
|
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: "../"
|
data/lib/attr_json/record.rb
CHANGED
@@ -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.
|
51
|
+
self.class.attr_json_registry.definitions.group_by(&:container_attribute).each_pair do |container_attribute, definitions|
|
52
52
|
begin
|
53
|
-
|
54
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
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.
|
data/lib/attr_json/version.rb
CHANGED
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.
|
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-
|
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:
|
207
|
+
version: '0'
|
208
208
|
requirements: []
|
209
|
-
rubygems_version: 3.
|
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.
|