tag_tapir 0.0.2 → 0.1.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.
data/lib/tag_tapir.rb CHANGED
@@ -5,4 +5,5 @@ end
5
5
 
6
6
  # Require the rest of the gem's files
7
7
  require 'tag_tapir/active_record'
8
- require 'tag_tapir/engine'
8
+ require 'tag_tapir/engine'
9
+ require 'tag_tapir/tag_names'
@@ -3,6 +3,19 @@ module TagTapir::ActiveRecord
3
3
  # include our class methods
4
4
  base.extend TagTapir::ActiveRecord::ClassMethods
5
5
  end
6
+
7
+ def tag_names
8
+ @tag_names ||= TagTapir::TagNames.new self
9
+ end
10
+
11
+ def tag_names=(names)
12
+ if names.is_a?(TagTapir::TagNames)
13
+ @tag_names = names
14
+ else
15
+ # convert the array of strings to a TagNames object
16
+ @tag_names = TagTapir::TagNames.new_with_names self, names
17
+ end
18
+ end
6
19
 
7
20
  module ClassMethods
8
21
  # Set up the underlying tag associations in the model
@@ -0,0 +1,54 @@
1
+ class TagTapir::TagNames
2
+ include Enumerable
3
+
4
+ def initialize(taggable)
5
+ @taggable = taggable
6
+ end
7
+
8
+ def to_a
9
+ taggable.tags.collect &:name
10
+ end
11
+
12
+ def <<(name)
13
+ # find an existing tag, or create a new one
14
+ tag = TagTapir::Tag.where(:name => name).first ||
15
+ TagTapir::Tag.create(:name => name)
16
+
17
+ taggable.tags << tag
18
+ end
19
+
20
+ def delete(name)
21
+ taggable.tags.delete TagTapir::Tag.where(:name => name).first
22
+ end
23
+
24
+ def +(array)
25
+ array.each { |name| self.<< name }
26
+ self
27
+ end
28
+
29
+ def -(array)
30
+ array.each { |name| self.delete name }
31
+ self
32
+ end
33
+
34
+ # Create a new TagNames object, but clear out existing tags
35
+ # and use the provided set instead.
36
+ def self.new_with_names(taggable, names)
37
+ tag_names = new(taggable)
38
+ tag_names.clear
39
+ names.each { |name| tag_names << name }
40
+ tag_names
41
+ end
42
+
43
+ def clear
44
+ taggable.tags.clear
45
+ end
46
+
47
+ def each(&block)
48
+ to_a.each &block
49
+ end
50
+
51
+ private
52
+
53
+ attr_reader :taggable
54
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Managing tags via names" do
4
+ let(:article) { Article.create }
5
+
6
+ it "returns tag names" do
7
+ article.tags << TagTapir::Tag.create(:name => 'melbourne')
8
+
9
+ article.tag_names.to_a.should == ['melbourne']
10
+ end
11
+
12
+ it "adds tags via their names" do
13
+ article.tag_names << 'melbourne'
14
+
15
+ article.tags.collect(&:name).should == ['melbourne']
16
+ end
17
+
18
+ it "accepts a completely new set of tags" do
19
+ article.tag_names = ['portland', 'oregon']
20
+
21
+ article.tags.collect(&:name).should == ['portland', 'oregon']
22
+ end
23
+
24
+ it "enumerates through tag names" do
25
+ article.tag_names = ['melbourne', 'victoria']
26
+ names = []
27
+
28
+ article.tag_names.each do |name|
29
+ names << name
30
+ end
31
+
32
+ names.should == ['melbourne', 'victoria']
33
+ end
34
+
35
+ it "does not allow duplication of tags" do
36
+ existing = Article.create
37
+ existing.tags << TagTapir::Tag.create(:name => 'portland')
38
+
39
+ article.tag_names = ['portland']
40
+
41
+ existing.tag_ids.should == article.tag_ids
42
+ end
43
+
44
+ it "appends tag names" do
45
+ article.tag_names = ['portland']
46
+ article.tag_names += ['oregon', 'ruby']
47
+
48
+ article.tags.collect(&:name).should == ['portland', 'oregon', 'ruby']
49
+ end
50
+
51
+ it "removes a single tag name" do
52
+ article.tag_names = ['portland', 'oregon']
53
+ article.tag_names.delete 'oregon'
54
+
55
+ article.tags.collect(&:name).should == ['portland']
56
+ end
57
+
58
+ it "removes tag names" do
59
+ article.tag_names = ['portland', 'oregon', 'ruby']
60
+ article.tag_names -= ['oregon', 'ruby']
61
+
62
+ article.tags.collect(&:name).should == ['portland']
63
+ end
64
+ end
data/tag_tapir.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = 'tag_tapir'
4
- s.version = '0.0.2'
4
+ s.version = '0.1.0'
5
5
  s.authors = ['Dave Knapik']
6
6
  s.email = ['daveknapik@gmail.com']
7
7
  s.homepage = 'https://github.com/daveknapik/tag_tapir'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tag_tapir
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:
@@ -89,6 +89,8 @@ files:
89
89
  - lib/tag_tapir.rb
90
90
  - lib/tag_tapir/active_record.rb
91
91
  - lib/tag_tapir/engine.rb
92
+ - lib/tag_tapir/tag_names.rb
93
+ - spec/acceptance/tag_names_spec.rb
92
94
  - spec/acceptance/tags_spec.rb
93
95
  - spec/internal/app/models/article.rb
94
96
  - spec/internal/config/database.yml