tag_dangelo 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/tag_dangelo.rb CHANGED
@@ -6,3 +6,4 @@ end
6
6
  # require the rest of the gem's files
7
7
  require 'tag_dangelo/active_record'
8
8
  require 'tag_dangelo/engine'
9
+ require 'tag_dangelo/tag_names'
@@ -4,6 +4,18 @@ module TagDangelo::ActiveRecord
4
4
  base.extend TagDangelo::ActiveRecord::ClassMethods
5
5
  end
6
6
 
7
+ def tag_names
8
+ @tag_names ||= TagDangelo::TagNames.new self
9
+ end
10
+
11
+ def tag_names=(names)
12
+ @tag_names = if names.is_a?(TagDangelo::TagNames)
13
+ names
14
+ else
15
+ TagDangelo::TagNames.new_with_names self, names
16
+ end
17
+ end
18
+
7
19
  module ClassMethods
8
20
  # set up the underlying tag associations in the model
9
21
  def has_many_tags
@@ -0,0 +1,54 @@
1
+ class TagDangelo::TagNames
2
+ include Enumerable
3
+
4
+ def initialize(taggable)
5
+ @taggable = taggable
6
+ end
7
+
8
+ def self.new_with_names(taggable, names)
9
+ tag_names = new(taggable)
10
+ tag_names.clear
11
+ names.each { |name| tag_names << name }
12
+ tag_names
13
+ end
14
+
15
+ def clear
16
+ taggable.tags.clear
17
+ end
18
+
19
+ def to_a
20
+ taggable.tags.map(&:name)
21
+ end
22
+
23
+ def each(&block)
24
+ to_a.each &block
25
+ end
26
+
27
+ def <<(name)
28
+ tag = TagDangelo::Tag.where(name: name).first ||
29
+ TagDangelo::Tag.create(name: name)
30
+
31
+ taggable.tags << tag
32
+ end
33
+
34
+ def delete(name)
35
+ taggable.tags.delete TagDangelo::Tag.where(name: name).first
36
+ end
37
+
38
+ def +(names)
39
+ names.each { |name| self << name }
40
+ self
41
+ end
42
+
43
+ def -(names)
44
+ names.each { |name| self.delete name }
45
+ self
46
+ end
47
+
48
+ private
49
+
50
+ attr_reader :taggable
51
+
52
+
53
+ end
54
+
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Managing tags via names" do
4
+
5
+ let(:article) { Article.create }
6
+
7
+ it "returns tag names" do
8
+ article.tags << TagDangelo::Tag.create(name: 'melbourne')
9
+ expect(article.tag_names.to_a).to eq ['melbourne']
10
+ end
11
+
12
+ it "adds tags via their names" do
13
+ article.tag_names << 'melbourne'
14
+ expect(article.tags.map(&:name)).to eq ['melbourne']
15
+ end
16
+
17
+ it "accepts a completely new set of tags" do
18
+ article.tag_names = ['portland', 'oregon']
19
+ expect(article.tags.map(&:name)).to eq ['portland', 'oregon']
20
+ end
21
+
22
+ it "does not allow duplication of tags" do
23
+ existing = Article.create
24
+ existing.tags << TagDangelo::Tag.create(name: 'portland')
25
+ article.tag_names = ['portland']
26
+ expect(existing.tag_ids).to eq article.tag_ids
27
+ end
28
+
29
+ it "appends tag names" do
30
+ article.tag_names = ['ruby']
31
+ article.tag_names += ['portland', 'oregon']
32
+ expect(article.tags.map(&:name)).to eq ['ruby', 'portland', 'oregon']
33
+ end
34
+
35
+ it "removes a single tag name" do
36
+ article.tag_names = ['ruby']
37
+ article.tag_names.delete('ruby')
38
+ expect(article.tags.map(&:name)).to eq []
39
+ # does not delete the tag completely
40
+ expect(TagDangelo::Tag.all.map(&:name)).to eq ['ruby']
41
+ end
42
+
43
+ it "removes tag names" do
44
+ article.tag_names = ['devils', 'pie']
45
+ article.tag_names -= 'devils'
46
+ expect(article.tags.map(&:name)).to eq ['pie']
47
+ end
48
+
49
+ end
data/tag_dangelo.gemspec CHANGED
@@ -1,11 +1,11 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'tag_dangelo'
3
- s.version = '0.0.2'
3
+ s.version = '0.1.0'
4
4
  s.authors = ['Jim Harvey']
5
5
  s.email = ['jimrharvey@gmail.com']
6
6
  s.homepage = 'https://github.com/harvj/tag_dangelo'
7
- s.summary = 'Tags with some soul'
8
- s.description = 'Add tags to your Rails classes'
7
+ s.summary = 'Tags with soul'
8
+ s.description = 'Add tags to your ActiveRecord models.'
9
9
 
10
10
  s.files = `git ls-files`.split("\n")
11
11
  s.test_files = `git ls-files -- {spec}/*`.split("\n")
@@ -15,4 +15,5 @@ Gem::Specification.new do |s|
15
15
  s.add_development_dependency 'combustion', '~> 0.4.0'
16
16
  s.add_development_dependency 'rspec-rails', '~> 2.13'
17
17
  s.add_development_dependency 'sqlite3', '~> 1.3.7'
18
+ s.add_development_dependency 'pry', '~> 0.9'
18
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tag_dangelo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-02 00:00:00.000000000 Z
12
+ date: 2013-05-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -75,7 +75,23 @@ dependencies:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
77
  version: 1.3.7
78
- description: Add tags to your Rails classes
78
+ - !ruby/object:Gem::Dependency
79
+ name: pry
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '0.9'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '0.9'
94
+ description: Add tags to your ActiveRecord models.
79
95
  email:
80
96
  - jimrharvey@gmail.com
81
97
  executables: []
@@ -90,6 +106,8 @@ files:
90
106
  - lib/tag_dangelo.rb
91
107
  - lib/tag_dangelo/active_record.rb
92
108
  - lib/tag_dangelo/engine.rb
109
+ - lib/tag_dangelo/tag_names.rb
110
+ - spec/acceptance/tag_names_spec.rb
93
111
  - spec/acceptance/tags_spec.rb
94
112
  - spec/internal/app/models/article.rb
95
113
  - spec/internal/config/database.yml
@@ -120,5 +138,5 @@ rubyforge_project:
120
138
  rubygems_version: 1.8.25
121
139
  signing_key:
122
140
  specification_version: 3
123
- summary: Tags with some soul
141
+ summary: Tags with soul
124
142
  test_files: []