gutentag 0.5.0 → 0.5.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/README.md +10 -6
- data/app/models/gutentag/tag.rb +2 -2
- data/gutentag.gemspec +2 -2
- data/lib/gutentag.rb +8 -1
- data/lib/gutentag/active_record.rb +2 -0
- data/lib/gutentag/dirty.rb +25 -0
- data/lib/gutentag/persistence.rb +1 -1
- data/lib/gutentag/tag_name.rb +1 -1
- data/spec/acceptance/tag_names_spec.rb +41 -13
- data/spec/acceptance/tags_spec.rb +7 -7
- data/spec/gutentag/tag_name_spec.rb +2 -2
- data/spec/models/gutentag/tag_spec.rb +11 -10
- data/spec/models/gutentag/tagging_spec.rb +3 -1
- metadata +16 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6d5be313a5546f19c11c2c5a74b0164665c795e
|
4
|
+
data.tar.gz: e9dee9503ecbae393676a9d5d897e79b12876236
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d353d61f4c35f34c56c4545cac40eef7a6a187da84515bcc99c883de01892a01823f746cedf5e7a1f8b26878023fddef5bb4ae09d48c8e262a761968a4324ca
|
7
|
+
data.tar.gz: d22d8a4f863229adeda019d80919f63fe55adf653e0be3cd813190e529474e9d7b86f247909506debead2ad69a5b940d81fc3954fd3752896563d7b4a13be6ff
|
data/README.md
CHANGED
@@ -10,20 +10,24 @@ This was built partly as a proof-of-concept, and partly to see how a tagging gem
|
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
13
|
-
**Upgrading?** Gutentag has recently switched table names from `tags` and `taggings` to `gutentag_tags` and `gutentag_taggings`, to avoid conflicting with the more generic table names that may exist in Rails apps already. If you already have been using Gutentag, you'll need to create a migration manually that renames these tables:
|
14
|
-
|
15
|
-
rename_table :tags, :gutentag_tags
|
16
|
-
rename_table :taggings, :gutentag_taggings
|
17
|
-
|
18
13
|
Get it into your Gemfile - and don't forget the version constraint!
|
19
14
|
|
20
|
-
gem 'gutentag', '~> 0.5.
|
15
|
+
gem 'gutentag', '~> 0.5.1'
|
21
16
|
|
22
17
|
Next: your tags get persisted to your database, so let's import and run the migrations to get the tables set up:
|
23
18
|
|
24
19
|
rake gutentag:install:migrations
|
25
20
|
rake db:migrate
|
26
21
|
|
22
|
+
## Upgrading
|
23
|
+
|
24
|
+
Between 0.4.0 and 0.5.0, Gutentag switched table names from `tags` and `taggings` to `gutentag_tags` and `gutentag_taggings`. This has been done to avoid conflicting with the more generic table names that may exist in Rails apps already.
|
25
|
+
|
26
|
+
If you were using Gutentag 0.4.0 (or older) and now want to upgrade, you'll need to create a migration manually that renames these tables:
|
27
|
+
|
28
|
+
rename_table :tags, :gutentag_tags
|
29
|
+
rename_table :taggings, :gutentag_taggings
|
30
|
+
|
27
31
|
## Usage
|
28
32
|
|
29
33
|
The first step is easy: add the tag associations to whichever models should have tags (in these examples, the Article model):
|
data/app/models/gutentag/tag.rb
CHANGED
@@ -13,7 +13,7 @@ class Gutentag::Tag < ActiveRecord::Base
|
|
13
13
|
before_validation :normalise_name
|
14
14
|
|
15
15
|
def self.find_by_name(name)
|
16
|
-
where(:name => Gutentag
|
16
|
+
where(:name => Gutentag.normaliser.call(name)).first
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.find_or_create(name)
|
@@ -23,6 +23,6 @@ class Gutentag::Tag < ActiveRecord::Base
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def normalise_name
|
26
|
-
self.name = Gutentag
|
26
|
+
self.name = Gutentag.normaliser.call name
|
27
27
|
end
|
28
28
|
end
|
data/gutentag.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = 'gutentag'
|
4
|
-
s.version = '0.5.
|
4
|
+
s.version = '0.5.1'
|
5
5
|
s.authors = ['Pat Allan']
|
6
6
|
s.email = ['pat@freelancing-gods.com']
|
7
7
|
s.homepage = 'https://github.com/pat/gutentag'
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.require_paths = ['lib']
|
15
15
|
|
16
16
|
s.add_runtime_dependency 'activerecord', '>= 3.2.0'
|
17
|
-
s.add_development_dependency 'combustion', '
|
17
|
+
s.add_development_dependency 'combustion', '0.5.1'
|
18
18
|
s.add_development_dependency 'rspec-rails', '~> 2.13'
|
19
19
|
s.add_development_dependency 'sqlite3', '~> 1.3.7'
|
20
20
|
end
|
data/lib/gutentag.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
module Gutentag
|
2
|
-
|
2
|
+
def self.normaliser
|
3
|
+
@normaliser ||= Gutentag::TagName
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.normaliser=(normaliser)
|
7
|
+
@normaliser = normaliser
|
8
|
+
end
|
3
9
|
end
|
4
10
|
|
5
11
|
require 'gutentag/active_record'
|
12
|
+
require 'gutentag/dirty'
|
6
13
|
require 'gutentag/engine'
|
7
14
|
require 'gutentag/persistence'
|
8
15
|
require 'gutentag/tag_name'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Gutentag::Dirty
|
2
|
+
def self.call(instance, tag_names)
|
3
|
+
new(instance, tag_names).call
|
4
|
+
end
|
5
|
+
|
6
|
+
def initialize(instance, tag_names)
|
7
|
+
@instance, @tag_names = instance, tag_names
|
8
|
+
end
|
9
|
+
|
10
|
+
def call
|
11
|
+
instance.changed_attributes[:tag_names] = existing if changes.present?
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
attr_reader :instance, :tag_names
|
17
|
+
|
18
|
+
def changes
|
19
|
+
(existing + tag_names).uniq - (existing & tag_names)
|
20
|
+
end
|
21
|
+
|
22
|
+
def existing
|
23
|
+
instance.tag_names
|
24
|
+
end
|
25
|
+
end
|
data/lib/gutentag/persistence.rb
CHANGED
data/lib/gutentag/tag_name.rb
CHANGED
@@ -8,14 +8,42 @@ describe "Managing tags via names" do
|
|
8
8
|
|
9
9
|
article.tags << melbourne
|
10
10
|
|
11
|
-
article.tag_names.
|
11
|
+
expect(article.tag_names).to eq(['melbourne'])
|
12
12
|
end
|
13
13
|
|
14
14
|
it "adds tags via their names" do
|
15
15
|
article.tag_names << 'melbourne'
|
16
16
|
article.save!
|
17
17
|
|
18
|
-
article.tags.collect(&:name).
|
18
|
+
expect(article.tags.collect(&:name)).to eq(['melbourne'])
|
19
|
+
end
|
20
|
+
|
21
|
+
it "makes model dirty when changing through tag_names" do
|
22
|
+
article.tag_names << 'melbourne'
|
23
|
+
article.save!
|
24
|
+
|
25
|
+
article.tag_names = ['sydney']
|
26
|
+
|
27
|
+
expect(article.changed_attributes.stringify_keys).
|
28
|
+
to eq('tag_names' => ['melbourne'])
|
29
|
+
end
|
30
|
+
|
31
|
+
it "does not make model dirty when changing through tag_names" do
|
32
|
+
article.tag_names << 'melbourne'
|
33
|
+
article.save!
|
34
|
+
|
35
|
+
article.tag_names = ['melbourne']
|
36
|
+
|
37
|
+
expect(article.changed_attributes).to eq({})
|
38
|
+
end
|
39
|
+
|
40
|
+
it "allows for different tag normalisation" do
|
41
|
+
Gutentag.normaliser = lambda { |name| name.upcase }
|
42
|
+
|
43
|
+
tag = Gutentag::Tag.create(:name => 'melbourne')
|
44
|
+
expect(tag.name).to eq('MELBOURNE')
|
45
|
+
|
46
|
+
Gutentag.normaliser = nil
|
19
47
|
end
|
20
48
|
|
21
49
|
it "doesn't complain when adding an existing tag" do
|
@@ -23,14 +51,14 @@ describe "Managing tags via names" do
|
|
23
51
|
article.tag_names << 'melbourne'
|
24
52
|
article.save!
|
25
53
|
|
26
|
-
article.tags.collect(&:name).
|
54
|
+
expect(article.tags.collect(&:name)).to eq(['melbourne'])
|
27
55
|
end
|
28
56
|
|
29
57
|
it "accepts a completely new set of tags" do
|
30
58
|
article.tag_names = ['portland', 'oregon']
|
31
59
|
article.save!
|
32
60
|
|
33
|
-
article.tags.collect(&:name).
|
61
|
+
expect(article.tags.collect(&:name)).to eq(['portland', 'oregon'])
|
34
62
|
end
|
35
63
|
|
36
64
|
it "does not allow duplication of tags" do
|
@@ -40,7 +68,7 @@ describe "Managing tags via names" do
|
|
40
68
|
article.tag_names = ['portland']
|
41
69
|
article.save!
|
42
70
|
|
43
|
-
existing.tag_ids.
|
71
|
+
expect(existing.tag_ids).to eq(article.tag_ids)
|
44
72
|
end
|
45
73
|
|
46
74
|
it "appends tag names" do
|
@@ -48,7 +76,7 @@ describe "Managing tags via names" do
|
|
48
76
|
article.tag_names += ['oregon', 'ruby']
|
49
77
|
article.save!
|
50
78
|
|
51
|
-
article.tags.collect(&:name).
|
79
|
+
expect(article.tags.collect(&:name)).to eq(['portland', 'oregon', 'ruby'])
|
52
80
|
end
|
53
81
|
|
54
82
|
it "does not repeat appended names that already exist" do
|
@@ -56,7 +84,7 @@ describe "Managing tags via names" do
|
|
56
84
|
article.tag_names += ['oregon', 'ruby']
|
57
85
|
article.save!
|
58
86
|
|
59
|
-
article.tags.collect(&:name).
|
87
|
+
expect(article.tags.collect(&:name)).to eq(['portland', 'oregon', 'ruby'])
|
60
88
|
end
|
61
89
|
|
62
90
|
it "removes a single tag name" do
|
@@ -64,7 +92,7 @@ describe "Managing tags via names" do
|
|
64
92
|
article.tag_names.delete 'oregon'
|
65
93
|
article.save!
|
66
94
|
|
67
|
-
article.tags.collect(&:name).
|
95
|
+
expect(article.tags.collect(&:name)).to eq(['portland'])
|
68
96
|
end
|
69
97
|
|
70
98
|
it "removes tag names" do
|
@@ -72,7 +100,7 @@ describe "Managing tags via names" do
|
|
72
100
|
article.tag_names -= ['oregon', 'ruby']
|
73
101
|
article.save!
|
74
102
|
|
75
|
-
article.tags.collect(&:name).
|
103
|
+
expect(article.tags.collect(&:name)).to eq(['portland'])
|
76
104
|
end
|
77
105
|
|
78
106
|
it "matches tag names ignoring case" do
|
@@ -80,22 +108,22 @@ describe "Managing tags via names" do
|
|
80
108
|
article.tag_names += ['Portland']
|
81
109
|
article.save!
|
82
110
|
|
83
|
-
article.tags.collect(&:name).
|
111
|
+
expect(article.tags.collect(&:name)).to eq(['portland'])
|
84
112
|
|
85
113
|
article.tag_names << 'Portland'
|
86
114
|
article.save!
|
87
115
|
|
88
|
-
article.tags.collect(&:name).
|
116
|
+
expect(article.tags.collect(&:name)).to eq(['portland'])
|
89
117
|
end
|
90
118
|
|
91
119
|
it "allows setting of tag names on unpersisted objects" do
|
92
120
|
article = Article.new :tag_names => ['melbourne', 'pancakes']
|
93
121
|
article.save!
|
94
122
|
|
95
|
-
article.tag_names.
|
123
|
+
expect(article.tag_names).to eq(['melbourne', 'pancakes'])
|
96
124
|
end
|
97
125
|
|
98
126
|
it "allows overriding of tag_names=" do
|
99
|
-
Article.instance_methods(false).
|
127
|
+
expect(Article.instance_methods(false)).to_not include(:tag_names=)
|
100
128
|
end
|
101
129
|
end
|
@@ -7,7 +7,7 @@ describe 'Adding and removing tags' do
|
|
7
7
|
it "stores new tags" do
|
8
8
|
article.tags << pancakes
|
9
9
|
|
10
|
-
article.tags.reload.
|
10
|
+
expect(article.tags.reload).to eq([pancakes])
|
11
11
|
end
|
12
12
|
|
13
13
|
it "removes existing tags" do
|
@@ -15,7 +15,7 @@ describe 'Adding and removing tags' do
|
|
15
15
|
|
16
16
|
article.tags.delete pancakes
|
17
17
|
|
18
|
-
article.tags.reload.
|
18
|
+
expect(article.tags.reload).to eq([])
|
19
19
|
end
|
20
20
|
|
21
21
|
it "removes taggings when an article is deleted" do
|
@@ -23,9 +23,9 @@ describe 'Adding and removing tags' do
|
|
23
23
|
|
24
24
|
article.destroy
|
25
25
|
|
26
|
-
Gutentag::Tagging.where(
|
26
|
+
expect(Gutentag::Tagging.where(
|
27
27
|
:taggable_type => 'Article', :taggable_id => article.id
|
28
|
-
).count.
|
28
|
+
).count).to be_zero
|
29
29
|
end
|
30
30
|
|
31
31
|
it "removes taggings when a tag is deleted" do
|
@@ -33,7 +33,7 @@ describe 'Adding and removing tags' do
|
|
33
33
|
|
34
34
|
pancakes.destroy
|
35
35
|
|
36
|
-
Gutentag::Tagging.where(:tag_id => pancakes.id).count.
|
36
|
+
expect(Gutentag::Tagging.where(:tag_id => pancakes.id).count).to be_zero
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'should have a mean tag cloud' do
|
@@ -41,10 +41,10 @@ describe 'Adding and removing tags' do
|
|
41
41
|
another_article = Article.create
|
42
42
|
|
43
43
|
article.tags << pancakes
|
44
|
-
Gutentag::Tag.by_weight.first.
|
44
|
+
expect(Gutentag::Tag.by_weight.first).to eq(pancakes)
|
45
45
|
|
46
46
|
article.tags << gorillas
|
47
47
|
another_article.tags << gorillas
|
48
|
-
Gutentag::Tag.by_weight.first.
|
48
|
+
expect(Gutentag::Tag.by_weight.first).to eq(gorillas)
|
49
49
|
end
|
50
50
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Gutentag::TagName do
|
4
|
-
describe '.
|
4
|
+
describe '.call' do
|
5
5
|
it "downcases the provided name" do
|
6
|
-
Gutentag::TagName.
|
6
|
+
expect(Gutentag::TagName.call('Tasty Pancakes')).to eq('tasty pancakes')
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
@@ -5,17 +5,17 @@ describe Gutentag::Tag do
|
|
5
5
|
it "returns a tag with the same name" do
|
6
6
|
existing = Gutentag::Tag.create! :name => 'pancakes'
|
7
7
|
|
8
|
-
Gutentag::Tag.find_by_name('pancakes').
|
8
|
+
expect(Gutentag::Tag.find_by_name('pancakes')).to eq(existing)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "returns a tag with the same normalised name" do
|
12
12
|
existing = Gutentag::Tag.create! :name => 'pancakes'
|
13
13
|
|
14
|
-
Gutentag::Tag.find_by_name('Pancakes').
|
14
|
+
expect(Gutentag::Tag.find_by_name('Pancakes')).to eq(existing)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "otherwise returns nil" do
|
18
|
-
Gutentag::Tag.find_by_name('pancakes').
|
18
|
+
expect(Gutentag::Tag.find_by_name('pancakes')).to be_nil
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -23,34 +23,34 @@ describe Gutentag::Tag do
|
|
23
23
|
it "returns a tag with the same name" do
|
24
24
|
existing = Gutentag::Tag.create! :name => 'pancakes'
|
25
25
|
|
26
|
-
Gutentag::Tag.find_or_create('pancakes').
|
26
|
+
expect(Gutentag::Tag.find_or_create('pancakes')).to eq(existing)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "returns a tag with the same normalised name" do
|
30
30
|
existing = Gutentag::Tag.create! :name => 'pancakes'
|
31
31
|
|
32
|
-
Gutentag::Tag.find_or_create('Pancakes').
|
32
|
+
expect(Gutentag::Tag.find_or_create('Pancakes')).to eq(existing)
|
33
33
|
end
|
34
34
|
|
35
35
|
it "creates a new tag if no matches exist" do
|
36
|
-
Gutentag::Tag.find_or_create('pancakes').
|
36
|
+
expect(Gutentag::Tag.find_or_create('pancakes')).to be_persisted
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
describe '#name' do
|
41
41
|
before :each do
|
42
|
-
Gutentag::TagName.
|
42
|
+
allow(Gutentag::TagName).to receive(:call).and_return('waffles')
|
43
43
|
end
|
44
44
|
|
45
45
|
it "normalises the provided name" do
|
46
|
-
Gutentag::TagName.
|
46
|
+
expect(Gutentag::TagName).to receive(:call).with('Pancakes').
|
47
47
|
and_return('waffles')
|
48
48
|
|
49
49
|
Gutentag::Tag.create!(:name => 'Pancakes')
|
50
50
|
end
|
51
51
|
|
52
52
|
it "saves the normalised name" do
|
53
|
-
Gutentag::Tag.create!(:name => 'Pancakes').name.
|
53
|
+
expect(Gutentag::Tag.create!(:name => 'Pancakes').name).to eq('waffles')
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -58,7 +58,8 @@ describe Gutentag::Tag do
|
|
58
58
|
it "ignores case when enforcing uniqueness" do
|
59
59
|
Gutentag::Tag.create! :name => 'pancakes'
|
60
60
|
|
61
|
-
Gutentag::Tag.create(:name => 'Pancakes')
|
61
|
+
tag = Gutentag::Tag.create(:name => 'Pancakes')
|
62
|
+
expect(tag.errors[:name].length).to eq(1)
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gutentag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.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:
|
11
|
+
date: 2014-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 3.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: combustion
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.5.1
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.5.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec-rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '2.13'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2.13'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: sqlite3
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 1.3.7
|
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
68
|
version: 1.3.7
|
69
69
|
description: A good, simple, solid tagging extension for ActiveRecord
|
@@ -73,8 +73,8 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .gitignore
|
77
|
-
- .travis.yml
|
76
|
+
- ".gitignore"
|
77
|
+
- ".travis.yml"
|
78
78
|
- Gemfile
|
79
79
|
- LICENCE
|
80
80
|
- README.md
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- gutentag.gemspec
|
88
88
|
- lib/gutentag.rb
|
89
89
|
- lib/gutentag/active_record.rb
|
90
|
+
- lib/gutentag/dirty.rb
|
90
91
|
- lib/gutentag/engine.rb
|
91
92
|
- lib/gutentag/persistence.rb
|
92
93
|
- lib/gutentag/tag_name.rb
|
@@ -110,17 +111,17 @@ require_paths:
|
|
110
111
|
- lib
|
111
112
|
required_ruby_version: !ruby/object:Gem::Requirement
|
112
113
|
requirements:
|
113
|
-
- -
|
114
|
+
- - ">="
|
114
115
|
- !ruby/object:Gem::Version
|
115
116
|
version: '0'
|
116
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
118
|
requirements:
|
118
|
-
- -
|
119
|
+
- - ">="
|
119
120
|
- !ruby/object:Gem::Version
|
120
121
|
version: '0'
|
121
122
|
requirements: []
|
122
123
|
rubyforge_project:
|
123
|
-
rubygems_version: 2.
|
124
|
+
rubygems_version: 2.3.0
|
124
125
|
signing_key:
|
125
126
|
specification_version: 4
|
126
127
|
summary: Good Tags
|