gutentag 0.9.0 → 1.0.0
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/.gitignore +2 -0
- data/.rubocop.yml +21 -0
- data/.travis.yml +6 -5
- data/Appraisals +20 -26
- data/Gemfile +13 -8
- data/README.md +5 -1
- data/Rakefile +9 -5
- data/app/models/gutentag/tag.rb +7 -4
- data/app/models/gutentag/tagging.rb +5 -3
- data/bin/literals +9 -0
- data/db/migrate/1_gutentag_tables.rb +5 -3
- data/db/migrate/2_gutentag_cache_counter.rb +2 -0
- data/db/migrate/3_no_null_counters.rb +8 -4
- data/gutentag.gemspec +18 -18
- data/lib/gutentag.rb +13 -13
- data/lib/gutentag/active_record.rb +11 -6
- data/lib/gutentag/active_record/class_methods.rb +4 -16
- data/lib/gutentag/active_record/instance_methods.rb +3 -1
- data/lib/gutentag/change_state.rb +32 -0
- data/lib/gutentag/dirty.rb +4 -1
- data/lib/gutentag/engine.rb +2 -4
- data/lib/gutentag/persistence.rb +13 -16
- data/lib/gutentag/tag_validations.rb +4 -1
- data/lib/gutentag/tagged_with.rb +5 -3
- data/lib/gutentag/tagged_with/id_query.rb +2 -0
- data/lib/gutentag/tagged_with/name_query.rb +2 -0
- data/lib/gutentag/tagged_with/query.rb +2 -0
- data/spec/acceptance/tag_names_spec.rb +40 -38
- data/spec/acceptance/tags_spec.rb +8 -6
- data/spec/gutentag/active_record_spec.rb +69 -112
- data/spec/gutentag_spec.rb +5 -3
- data/spec/internal/app/models/article.rb +2 -0
- data/spec/internal/db/schema.rb +2 -0
- data/spec/models/gutentag/tag_spec.rb +24 -22
- data/spec/models/gutentag/tagging_spec.rb +5 -3
- data/spec/spec_helper.rb +4 -2
- metadata +11 -43
- data/gemfiles/rails_3_2.gemfile +0 -11
- data/gemfiles/rails_4_0.gemfile +0 -11
- data/gemfiles/rails_4_1.gemfile +0 -11
- data/gemfiles/rails_4_2.gemfile +0 -10
- data/gemfiles/rails_5_0.gemfile +0 -8
- data/gemfiles/rails_5_1.gemfile +0 -8
- data/lib/gutentag/has_many_tags.rb +0 -10
data/spec/gutentag_spec.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
2
4
|
|
3
5
|
describe Gutentag do
|
4
|
-
describe
|
6
|
+
describe ".normalizer" do
|
5
7
|
it "downcases the provided name" do
|
6
|
-
expect(Gutentag.normaliser.call(
|
8
|
+
expect(Gutentag.normaliser.call("Tasty Pancakes")).to eq("tasty pancakes")
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
data/spec/internal/db/schema.rb
CHANGED
@@ -1,64 +1,66 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
2
4
|
|
3
5
|
describe Gutentag::Tag, :type => :model do
|
4
|
-
describe
|
6
|
+
describe ".find_by_name" do
|
5
7
|
it "returns a tag with the same name" do
|
6
|
-
existing = Gutentag::Tag.create! :name =>
|
8
|
+
existing = Gutentag::Tag.create! :name => "pancakes"
|
7
9
|
|
8
|
-
expect(Gutentag::Tag.find_by_name(
|
10
|
+
expect(Gutentag::Tag.find_by_name("pancakes")).to eq(existing)
|
9
11
|
end
|
10
12
|
|
11
13
|
it "returns a tag with the same normalised name" do
|
12
|
-
existing = Gutentag::Tag.create! :name =>
|
14
|
+
existing = Gutentag::Tag.create! :name => "pancakes"
|
13
15
|
|
14
|
-
expect(Gutentag::Tag.find_by_name(
|
16
|
+
expect(Gutentag::Tag.find_by_name("Pancakes")).to eq(existing)
|
15
17
|
end
|
16
18
|
|
17
19
|
it "otherwise returns nil" do
|
18
|
-
expect(Gutentag::Tag.find_by_name(
|
20
|
+
expect(Gutentag::Tag.find_by_name("pancakes")).to be_nil
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
|
-
describe
|
24
|
+
describe ".find_or_create" do
|
23
25
|
it "returns a tag with the same name" do
|
24
|
-
existing = Gutentag::Tag.create! :name =>
|
26
|
+
existing = Gutentag::Tag.create! :name => "pancakes"
|
25
27
|
|
26
|
-
expect(Gutentag::Tag.find_or_create(
|
28
|
+
expect(Gutentag::Tag.find_or_create("pancakes")).to eq(existing)
|
27
29
|
end
|
28
30
|
|
29
31
|
it "returns a tag with the same normalised name" do
|
30
|
-
existing = Gutentag::Tag.create! :name =>
|
32
|
+
existing = Gutentag::Tag.create! :name => "pancakes"
|
31
33
|
|
32
|
-
expect(Gutentag::Tag.find_or_create(
|
34
|
+
expect(Gutentag::Tag.find_or_create("Pancakes")).to eq(existing)
|
33
35
|
end
|
34
36
|
|
35
37
|
it "creates a new tag if no matches exist" do
|
36
|
-
expect(Gutentag::Tag.find_or_create(
|
38
|
+
expect(Gutentag::Tag.find_or_create("pancakes")).to be_persisted
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
40
|
-
describe
|
42
|
+
describe "#name" do
|
41
43
|
before :each do
|
42
|
-
allow(Gutentag.normaliser).to receive(:call).and_return(
|
44
|
+
allow(Gutentag.normaliser).to receive(:call).and_return("waffles")
|
43
45
|
end
|
44
46
|
|
45
47
|
it "normalises the provided name" do
|
46
|
-
allow(Gutentag.normaliser).to receive(:call).with(
|
47
|
-
and_return(
|
48
|
+
allow(Gutentag.normaliser).to receive(:call).with("Pancakes").
|
49
|
+
and_return("waffles")
|
48
50
|
|
49
|
-
Gutentag::Tag.create!(:name =>
|
51
|
+
Gutentag::Tag.create!(:name => "Pancakes")
|
50
52
|
end
|
51
53
|
|
52
54
|
it "saves the normalised name" do
|
53
|
-
expect(Gutentag::Tag.create!(:name =>
|
55
|
+
expect(Gutentag::Tag.create!(:name => "Pancakes").name).to eq("waffles")
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
57
|
-
describe
|
59
|
+
describe "#valid?" do
|
58
60
|
it "ignores case when enforcing uniqueness" do
|
59
|
-
Gutentag::Tag.create! :name =>
|
61
|
+
Gutentag::Tag.create! :name => "pancakes"
|
60
62
|
|
61
|
-
tag = Gutentag::Tag.create(:name =>
|
63
|
+
tag = Gutentag::Tag.create(:name => "Pancakes")
|
62
64
|
expect(tag.errors[:name].length).to eq(1)
|
63
65
|
end
|
64
66
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
2
4
|
|
3
5
|
describe Gutentag::Tagging, :type => :model do
|
4
|
-
describe
|
5
|
-
let(:tag) { Gutentag::Tag.create! :name =>
|
6
|
+
describe "#valid?" do
|
7
|
+
let(:tag) { Gutentag::Tag.create! :name => "pancakes" }
|
6
8
|
let(:taggable) { Article.create! }
|
7
9
|
|
8
10
|
it "ensures tags are unique for any given taggable" do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bundler/setup"
|
2
4
|
|
3
5
|
Bundler.require :default, :development
|
4
6
|
|
5
7
|
Combustion.initialize! :active_record
|
6
8
|
|
7
|
-
require
|
9
|
+
require "rspec/rails"
|
8
10
|
|
9
11
|
RSpec.configure do |config|
|
10
12
|
if config.respond_to?(:use_transactional_tests)
|
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: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pat Allan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -58,42 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.7.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: mysql2
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: pg
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
68
|
+
version: 0.7.0
|
97
69
|
- !ruby/object:Gem::Dependency
|
98
70
|
name: rails
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,19 +95,19 @@ dependencies:
|
|
123
95
|
- !ruby/object:Gem::Version
|
124
96
|
version: '3.1'
|
125
97
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
98
|
+
name: rubocop
|
127
99
|
requirement: !ruby/object:Gem::Requirement
|
128
100
|
requirements:
|
129
101
|
- - "~>"
|
130
102
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
103
|
+
version: 0.51.0
|
132
104
|
type: :development
|
133
105
|
prerelease: false
|
134
106
|
version_requirements: !ruby/object:Gem::Requirement
|
135
107
|
requirements:
|
136
108
|
- - "~>"
|
137
109
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
110
|
+
version: 0.51.0
|
139
111
|
description: A good, simple, solid tagging extension for ActiveRecord
|
140
112
|
email:
|
141
113
|
- pat@freelancing-gods.com
|
@@ -144,6 +116,7 @@ extensions: []
|
|
144
116
|
extra_rdoc_files: []
|
145
117
|
files:
|
146
118
|
- ".gitignore"
|
119
|
+
- ".rubocop.yml"
|
147
120
|
- ".travis.yml"
|
148
121
|
- Appraisals
|
149
122
|
- Gemfile
|
@@ -152,23 +125,18 @@ files:
|
|
152
125
|
- Rakefile
|
153
126
|
- app/models/gutentag/tag.rb
|
154
127
|
- app/models/gutentag/tagging.rb
|
128
|
+
- bin/literals
|
155
129
|
- db/migrate/1_gutentag_tables.rb
|
156
130
|
- db/migrate/2_gutentag_cache_counter.rb
|
157
131
|
- db/migrate/3_no_null_counters.rb
|
158
|
-
- gemfiles/rails_3_2.gemfile
|
159
|
-
- gemfiles/rails_4_0.gemfile
|
160
|
-
- gemfiles/rails_4_1.gemfile
|
161
|
-
- gemfiles/rails_4_2.gemfile
|
162
|
-
- gemfiles/rails_5_0.gemfile
|
163
|
-
- gemfiles/rails_5_1.gemfile
|
164
132
|
- gutentag.gemspec
|
165
133
|
- lib/gutentag.rb
|
166
134
|
- lib/gutentag/active_record.rb
|
167
135
|
- lib/gutentag/active_record/class_methods.rb
|
168
136
|
- lib/gutentag/active_record/instance_methods.rb
|
137
|
+
- lib/gutentag/change_state.rb
|
169
138
|
- lib/gutentag/dirty.rb
|
170
139
|
- lib/gutentag/engine.rb
|
171
|
-
- lib/gutentag/has_many_tags.rb
|
172
140
|
- lib/gutentag/persistence.rb
|
173
141
|
- lib/gutentag/tag_validations.rb
|
174
142
|
- lib/gutentag/tagged_with.rb
|
@@ -206,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
174
|
version: '0'
|
207
175
|
requirements: []
|
208
176
|
rubyforge_project:
|
209
|
-
rubygems_version: 2.6.
|
177
|
+
rubygems_version: 2.6.13
|
210
178
|
signing_key:
|
211
179
|
specification_version: 4
|
212
180
|
summary: Good Tags
|
data/gemfiles/rails_3_2.gemfile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "test-unit", :platform => :ruby_22
|
6
|
-
gem "rack", "~> 1.0", :platforms => [:ruby_20, :ruby_21]
|
7
|
-
gem "rails", "~> 3.2.22.5"
|
8
|
-
gem "nokogiri", "~> 1.6.0", :platforms => [:ruby_20]
|
9
|
-
gem "mysql2", "~> 0.3.10"
|
10
|
-
|
11
|
-
gemspec :path => "../"
|
data/gemfiles/rails_4_0.gemfile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "test-unit", :platform => :ruby_22
|
6
|
-
gem "rails", "~> 4.0.13"
|
7
|
-
gem "rack", "~> 1.0", :platforms => [:ruby_20, :ruby_21]
|
8
|
-
gem "nokogiri", "~> 1.6.0", :platforms => [:ruby_20]
|
9
|
-
gem "mysql2", "~> 0.3.10"
|
10
|
-
|
11
|
-
gemspec :path => "../"
|
data/gemfiles/rails_4_1.gemfile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "test-unit", :platform => :ruby_22
|
6
|
-
gem "rails", "~> 4.1.16"
|
7
|
-
gem "rack", "~> 1.0", :platforms => [:ruby_20, :ruby_21]
|
8
|
-
gem "nokogiri", "~> 1.6.0", :platforms => [:ruby_20]
|
9
|
-
gem "mysql2", "~> 0.3.13"
|
10
|
-
|
11
|
-
gemspec :path => "../"
|
data/gemfiles/rails_4_2.gemfile
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "test-unit", :platform => :ruby_22
|
6
|
-
gem "rails", "~> 4.2.7"
|
7
|
-
gem "rack", "~> 1.0", :platforms => [:ruby_20, :ruby_21]
|
8
|
-
gem "nokogiri", "~> 1.6.0", :platforms => [:ruby_20]
|
9
|
-
|
10
|
-
gemspec :path => "../"
|
data/gemfiles/rails_5_0.gemfile
DELETED
data/gemfiles/rails_5_1.gemfile
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
module Gutentag::HasManyTags
|
2
|
-
def has_many_tags
|
3
|
-
ActiveSupport::Deprecation.warn <<-TXT
|
4
|
-
has_many_tags is now deprecated, and will be removed in Gutentag v1.0.0.
|
5
|
-
Replace it with Gutentag::ActiveRecord.call(self), and everything will continue
|
6
|
-
to work as expected.
|
7
|
-
TXT
|
8
|
-
Gutentag::ActiveRecord.call self
|
9
|
-
end
|
10
|
-
end
|