gutentag 2.2.0 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|