gutentag 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/models/gutentag/tag.rb +10 -0
- data/gutentag.gemspec +2 -2
- data/lib/gutentag/tag_names.rb +9 -9
- data/spec/models/gutentag/tag_spec.rb +36 -0
- data/spec/models/gutentag/tagging_spec.rb +8 -4
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33f154c781133dc5cc122ae754f11216f6034916
|
4
|
+
data.tar.gz: 39d23400e618e07ec79d5ae0c211bedcaf8a78be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab28289725aecf21bbf6d620e83abb8acf90c579604e54c1bdaa851b888284380e0b3e031003fe621d30af8b31dc6fbe1dd12ee8fd7a118e8c67650c4991253c
|
7
|
+
data.tar.gz: ec3a116528231a1b3ddb9574c03df3e35b4592d88249b65d49ce992e2a4058cce9dc8316cdbdd2c613a4be986e6cd88370ab33ef3d6cce1b5c9d586005df8881
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@ This was built partly as a proof-of-concept, and partly to see how a tagging gem
|
|
11
11
|
|
12
12
|
Get it into your Gemfile - and don't forget the version constraint!
|
13
13
|
|
14
|
-
gem 'gutentag', '~> 0.2.
|
14
|
+
gem 'gutentag', '~> 0.2.1'
|
15
15
|
|
16
16
|
Next: your tags get persisted to your database, so let's import and run the migrations to get the tables set up:
|
17
17
|
|
data/app/models/gutentag/tag.rb
CHANGED
@@ -2,10 +2,20 @@ class Gutentag::Tag < ActiveRecord::Base
|
|
2
2
|
has_many :taggings, :class_name => 'Gutentag::Tagging',
|
3
3
|
:dependent => :destroy
|
4
4
|
|
5
|
+
attr_accessible :name
|
6
|
+
|
5
7
|
validates :name, :presence => true, :uniqueness => {:case_sensitive => false}
|
6
8
|
|
7
9
|
before_validation :normalise_name
|
8
10
|
|
11
|
+
def self.find_by_name(name)
|
12
|
+
where(:name => Gutentag::TagName.normalise(name)).first
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.find_or_create(name)
|
16
|
+
find_by_name(name) || create(:name => name)
|
17
|
+
end
|
18
|
+
|
9
19
|
private
|
10
20
|
|
11
21
|
def normalise_name
|
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.2.
|
4
|
+
s.version = '0.2.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', '~> 0.
|
17
|
+
s.add_development_dependency 'combustion', '~> 0.5.0'
|
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/tag_names.rb
CHANGED
@@ -2,10 +2,7 @@ class Gutentag::TagNames
|
|
2
2
|
include Enumerable
|
3
3
|
|
4
4
|
def self.new_with_names(taggable, names)
|
5
|
-
|
6
|
-
tag_names.clear
|
7
|
-
names.each { |name| tag_names << Gutentag::TagName.normalise(name) }
|
8
|
-
tag_names
|
5
|
+
new(taggable).replace names
|
9
6
|
end
|
10
7
|
|
11
8
|
def initialize(taggable)
|
@@ -17,7 +14,7 @@ class Gutentag::TagNames
|
|
17
14
|
end
|
18
15
|
|
19
16
|
def +(array)
|
20
|
-
|
17
|
+
normalised(array).each { |name| self.<< name }
|
21
18
|
|
22
19
|
self
|
23
20
|
end
|
@@ -29,9 +26,7 @@ class Gutentag::TagNames
|
|
29
26
|
end
|
30
27
|
|
31
28
|
def <<(name)
|
32
|
-
|
33
|
-
tag = Gutentag::Tag.where(:name => name).first ||
|
34
|
-
Gutentag::Tag.create(:name => name)
|
29
|
+
tag = Gutentag::Tag.find_or_create name
|
35
30
|
|
36
31
|
taggable.tags << tag unless taggable.tags.include?(tag)
|
37
32
|
end
|
@@ -49,13 +44,18 @@ class Gutentag::TagNames
|
|
49
44
|
end
|
50
45
|
|
51
46
|
def delete(name)
|
52
|
-
taggable.tags.delete Gutentag::Tag.
|
47
|
+
taggable.tags.delete Gutentag::Tag.find_by_name(name)
|
53
48
|
end
|
54
49
|
|
55
50
|
def each(&block)
|
56
51
|
to_a.each &block
|
57
52
|
end
|
58
53
|
|
54
|
+
def replace(names)
|
55
|
+
clear
|
56
|
+
self.+ names
|
57
|
+
end
|
58
|
+
|
59
59
|
private
|
60
60
|
|
61
61
|
attr_reader :taggable
|
@@ -1,6 +1,42 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Gutentag::Tag do
|
4
|
+
describe '.find_by_name' do
|
5
|
+
it "returns a tag with the same name" do
|
6
|
+
existing = Gutentag::Tag.create! :name => 'pancakes'
|
7
|
+
|
8
|
+
Gutentag::Tag.find_by_name('pancakes').should == existing
|
9
|
+
end
|
10
|
+
|
11
|
+
it "returns a tag with the same normalised name" do
|
12
|
+
existing = Gutentag::Tag.create! :name => 'pancakes'
|
13
|
+
|
14
|
+
Gutentag::Tag.find_by_name('Pancakes').should == existing
|
15
|
+
end
|
16
|
+
|
17
|
+
it "otherwise returns nil" do
|
18
|
+
Gutentag::Tag.find_by_name('pancakes').should be_nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.find_or_create' do
|
23
|
+
it "returns a tag with the same name" do
|
24
|
+
existing = Gutentag::Tag.create! :name => 'pancakes'
|
25
|
+
|
26
|
+
Gutentag::Tag.find_or_create('pancakes').should == existing
|
27
|
+
end
|
28
|
+
|
29
|
+
it "returns a tag with the same normalised name" do
|
30
|
+
existing = Gutentag::Tag.create! :name => 'pancakes'
|
31
|
+
|
32
|
+
Gutentag::Tag.find_or_create('Pancakes').should == existing
|
33
|
+
end
|
34
|
+
|
35
|
+
it "creates a new tag if no matches exist" do
|
36
|
+
Gutentag::Tag.find_or_create('pancakes').should be_persisted
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
4
40
|
describe '#name' do
|
5
41
|
before :each do
|
6
42
|
Gutentag::TagName.stub :normalise => 'waffles'
|
@@ -6,11 +6,15 @@ describe Gutentag::Tagging do
|
|
6
6
|
let(:taggable) { Article.create! }
|
7
7
|
|
8
8
|
it "ensures tags are unique for any given taggable" do
|
9
|
-
Gutentag::Tagging.
|
9
|
+
tagging = Gutentag::Tagging.new
|
10
|
+
tagging.tag = tag
|
11
|
+
tagging.taggable = taggable
|
12
|
+
tagging.save!
|
10
13
|
|
11
|
-
Gutentag::Tagging.
|
12
|
-
|
13
|
-
|
14
|
+
tagging = Gutentag::Tagging.new
|
15
|
+
tagging.tag = tag
|
16
|
+
tagging.taggable = taggable
|
17
|
+
tagging.should have(1).error_on(:tag_id)
|
14
18
|
end
|
15
19
|
end
|
16
20
|
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: 0.2.
|
4
|
+
version: 0.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: 2013-07-
|
11
|
+
date: 2013-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.5.0
|
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
|
-
version: 0.
|
40
|
+
version: 0.5.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec-rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|