gutentag 2.2.0 → 2.2.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 +4 -4
- data/Appraisals +1 -1
- data/CHANGELOG.md +6 -0
- data/README.md +1 -1
- data/gutentag.gemspec +1 -1
- data/lib/gutentag/active_record.rb +15 -8
- data/lib/gutentag/active_record/instance_methods.rb +41 -0
- data/lib/gutentag/active_record/{legacy_instance_methods.rb → instance_methods_3_2.rb} +4 -1
- data/lib/gutentag/active_record/instance_methods_4_2.rb +30 -0
- data/spec/acceptance/tag_names_spec.rb +7 -0
- metadata +5 -4
- data/lib/gutentag/active_record/modern_instance_methods.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 506e53c384365bbd56d66a31a5a6956955d4098c31dd9bda30c5fe4d9f6822f7
|
4
|
+
data.tar.gz: e905db1b576c5ee5cd52a834b776232b7f3339d62f8517d9d9262f7c840151c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0039255e81ca547cfe1fa5ea9591b4edaedff4982835dbe4faf1788e5661b61d2ed25622242f641b3226b8d494a7c3ff54ca34e21859418b319a7aa701c8d78
|
7
|
+
data.tar.gz: 38d36b39b9d935cc32f1e0cdc80267d0d7e347d3c747b02f6270000beae2fe4bb60206f8ef5ccab8f3179c6cdeb6983fc3c3079f3b8452b843373c98b24b704c
|
data/Appraisals
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
All notable changes to this project (at least, from v0.5.0 onwards) will be documented in this file.
|
4
4
|
|
5
|
+
## 2.2.1 - 2018-03-06
|
6
|
+
|
7
|
+
### Fixed
|
8
|
+
|
9
|
+
* Fix `tag_names` to return persisted values on a fresh load of a tagged object (which involved distinguishing Rails 4.2 behaviour from more recent approaches).
|
10
|
+
|
5
11
|
## 2.2.0 - 2018-03-04
|
6
12
|
|
7
13
|
### Added
|
data/README.md
CHANGED
@@ -80,7 +80,7 @@ These are the versions the test suite runs against. It's possible it may work on
|
|
80
80
|
Get it into your Gemfile - and don't forget the version constraint!
|
81
81
|
|
82
82
|
```Ruby
|
83
|
-
gem 'gutentag', '~> 2.2.
|
83
|
+
gem 'gutentag', '~> 2.2.1'
|
84
84
|
```
|
85
85
|
|
86
86
|
Next: your tags get persisted to your database, so let's import and run the migrations to get the tables set up:
|
data/gutentag.gemspec
CHANGED
@@ -34,7 +34,8 @@ class Gutentag::ActiveRecord
|
|
34
34
|
if legacy?
|
35
35
|
model.define_attribute_method "tag_names"
|
36
36
|
else
|
37
|
-
model.attribute "tag_names", ActiveRecord::Type::Value.new,
|
37
|
+
model.attribute "tag_names", ActiveRecord::Type::Value.new,
|
38
|
+
:default => default_tag_names
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
@@ -49,13 +50,21 @@ class Gutentag::ActiveRecord
|
|
49
50
|
end
|
50
51
|
|
51
52
|
def add_methods
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
case ActiveRecord::VERSION::STRING.to_f
|
54
|
+
when 3.2..4.1
|
55
|
+
require "gutentag/active_record/instance_methods_3_2"
|
56
|
+
when 4.2
|
57
|
+
require "gutentag/active_record/instance_methods_4_2"
|
56
58
|
else
|
57
|
-
|
59
|
+
require "gutentag/active_record/instance_methods"
|
58
60
|
end
|
61
|
+
|
62
|
+
model.send :extend, Gutentag::ActiveRecord::ClassMethods
|
63
|
+
model.send :include, Gutentag::ActiveRecord::InstanceMethods
|
64
|
+
end
|
65
|
+
|
66
|
+
def default_tag_names
|
67
|
+
ActiveRecord::VERSION::STRING.to_f <= 4.2 ? [] : nil
|
59
68
|
end
|
60
69
|
|
61
70
|
def legacy?
|
@@ -64,5 +73,3 @@ class Gutentag::ActiveRecord
|
|
64
73
|
end
|
65
74
|
|
66
75
|
require "gutentag/active_record/class_methods"
|
67
|
-
require "gutentag/active_record/legacy_instance_methods"
|
68
|
-
require "gutentag/active_record/modern_instance_methods"
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# For Rails 5.0+
|
4
|
+
module Gutentag::ActiveRecord::InstanceMethods
|
5
|
+
# If the tag_names attribute was one of the modified values, then let's just
|
6
|
+
# use the modifications, rather than overwriting the stored value.
|
7
|
+
#
|
8
|
+
# The reason we overwrite the stored value is because new tags may be added to
|
9
|
+
# the instance directly (e.g. article.tags << tag), which invokes the save
|
10
|
+
# callbacks, but the old tag_names value is stored but not updated.
|
11
|
+
def reset_tag_names
|
12
|
+
return if tag_names_previously_changed?
|
13
|
+
|
14
|
+
# Update the underlying value rather than going through the setter, to
|
15
|
+
# ensure this update doesn't get marked as a 'change'.
|
16
|
+
@attributes.write_from_database "tag_names", nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def tag_names
|
20
|
+
# If the underlying value is nil, we've not requested this from the
|
21
|
+
# database yet.
|
22
|
+
self.tag_names = tags.pluck(:name) if super.nil?
|
23
|
+
|
24
|
+
# Use ActiveRecord's underlying implementation with change tracking.
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def tag_names=(names)
|
29
|
+
# This value is about to be overwritten, but we want to make sure the change
|
30
|
+
# tracking doesn't think the original value was nil.
|
31
|
+
@attributes.write_from_database "tag_names", []
|
32
|
+
|
33
|
+
super
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def persist_tags
|
39
|
+
Gutentag::Persistence.new(Gutentag::ChangeState.new(self)).persist
|
40
|
+
end
|
41
|
+
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# For Rails <= 4.1
|
4
|
-
module Gutentag::ActiveRecord::
|
4
|
+
module Gutentag::ActiveRecord::InstanceMethods
|
5
|
+
# The reason we overwrite the stored value is because new tags may be added to
|
6
|
+
# the instance directly (e.g. article.tags << tag), which invokes the save
|
7
|
+
# callbacks, but the old tag_names value is stored but not updated.
|
5
8
|
def reset_tag_names
|
6
9
|
@tag_names = nil
|
7
10
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# For Rails 4.2 only.
|
4
|
+
module Gutentag::ActiveRecord::InstanceMethods
|
5
|
+
# The reason we overwrite the stored value is because new tags may be added to
|
6
|
+
# the instance directly (e.g. article.tags << tag), which invokes the save
|
7
|
+
# callbacks, but the old tag_names value is stored but not updated.
|
8
|
+
def reset_tag_names
|
9
|
+
# Update the underlying value rather than going through the setter, to
|
10
|
+
# ensure this update doesn't get marked as a 'change'.
|
11
|
+
self.tag_names = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def tag_names
|
15
|
+
# If the underlying value is nil, we've not requested this from the
|
16
|
+
# database yet.
|
17
|
+
if read_attribute("tag_names") { nil }.nil?
|
18
|
+
self.tag_names = tags.pluck(:name)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Use ActiveRecord's underlying implementation with change tracking.
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def persist_tags
|
28
|
+
Gutentag::Persistence.new(Gutentag::ChangeState.new(self)).persist
|
29
|
+
end
|
30
|
+
end
|
@@ -109,4 +109,11 @@ describe "Managing tags via names" do
|
|
109
109
|
it "allows overriding of tag_names=" do
|
110
110
|
expect(Article.instance_methods(false)).to_not include(:tag_names=)
|
111
111
|
end
|
112
|
+
|
113
|
+
it "returns known tag names from a freshly loaded object" do
|
114
|
+
article.tag_names << "melbourne"
|
115
|
+
article.save!
|
116
|
+
|
117
|
+
expect(Article.find(article.id).tag_names).to eq(["melbourne"])
|
118
|
+
end
|
112
119
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gutentag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pat Allan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -147,8 +147,9 @@ files:
|
|
147
147
|
- lib/gutentag.rb
|
148
148
|
- lib/gutentag/active_record.rb
|
149
149
|
- lib/gutentag/active_record/class_methods.rb
|
150
|
-
- lib/gutentag/active_record/
|
151
|
-
- lib/gutentag/active_record/
|
150
|
+
- lib/gutentag/active_record/instance_methods.rb
|
151
|
+
- lib/gutentag/active_record/instance_methods_3_2.rb
|
152
|
+
- lib/gutentag/active_record/instance_methods_4_2.rb
|
152
153
|
- lib/gutentag/change_state.rb
|
153
154
|
- lib/gutentag/dirty.rb
|
154
155
|
- lib/gutentag/engine.rb
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# For Rails 4.2+
|
4
|
-
module Gutentag::ActiveRecord::ModernInstanceMethods
|
5
|
-
def reset_tag_names
|
6
|
-
self.tag_names = nil
|
7
|
-
end
|
8
|
-
|
9
|
-
def tag_names
|
10
|
-
self.tag_names = tags.pluck(:name) if super.nil?
|
11
|
-
|
12
|
-
super
|
13
|
-
end
|
14
|
-
|
15
|
-
def tag_names=(names)
|
16
|
-
Gutentag.dirtier.call self, names if Gutentag.dirtier
|
17
|
-
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def persist_tags
|
24
|
-
Gutentag::Persistence.new(Gutentag::ChangeState.new(self)).persist
|
25
|
-
end
|
26
|
-
end
|