tag_giraffe 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0168967fbd7ee0ec8fdbfa61e4140c2e7ee1aa39
4
- data.tar.gz: f76390b35b352f988352c5e1c2cb4b4f344c668a
3
+ metadata.gz: d652c8d5f084eb19f1047f7887b0d8f97af20af3
4
+ data.tar.gz: e5d839fcb07db2112d162578f665addb329e29a2
5
5
  SHA512:
6
- metadata.gz: c852ac1b8d2d753ec99ac23b4fc516a6ef548ea2cc4c9ff6d2302141305aae62b718a1763f79987f3f8d8d677f0d5f95eccfc4469f42976b18da6cbeffd4de97
7
- data.tar.gz: 532d6d3f782860ce1865cc53cd94c88f2903fb0d29506a246cfef16aa5341af9e16a346cdff3b06670253eebb878e2706834686cb97b3d275fd793404e75dba7
6
+ metadata.gz: e010a4c0d441c33833e2bf80e0fca00089a965ad8428ef79e505a113d7b56f350234c2050b101973b773020d5de4b21a58755e3d3b0ee081b10a04359c534c5c
7
+ data.tar.gz: e1e5e81f53976cf72f813aa003dd3d3a94e58067f053c93cf3d7d03203ab1b532f8ad4f09f0360aa295f891e5faca24ef1ac272d8c7e8dd97639e5322b8315d1
data/lib/tag_giraffe.rb CHANGED
@@ -5,4 +5,5 @@ end
5
5
 
6
6
  # Require the rest of the gem's files
7
7
  require 'tag_giraffe/active_record'
8
- require 'tag_giraffe/engine'
8
+ require 'tag_giraffe/engine'
9
+ require 'tag_giraffe/tag_names'
@@ -4,6 +4,19 @@ module TagGiraffe::ActiveRecord
4
4
  base.extend TagGiraffe::ActiveRecord::ClassMethods
5
5
  end
6
6
 
7
+ def tag_names
8
+ @tag_names ||= TagGiraffe::TagNames.new self
9
+ end
10
+
11
+ def tag_names=(names)
12
+ if names.is_a?(TagGiraffe::TagNames)
13
+ @tag_names = names
14
+ else
15
+ # convert the array of strings to a TagNames object
16
+ @tag_names = TagGiraffe::TagNames.new_with_names self, names
17
+ end
18
+ end
19
+
7
20
  module ClassMethods
8
21
  # set up the underlying tag assocations in the model
9
22
  def has_many_tags
@@ -13,5 +26,4 @@ module TagGiraffe::ActiveRecord
13
26
  through: :taggings
14
27
  end
15
28
  end
16
- end
17
-
29
+ end
@@ -0,0 +1,51 @@
1
+ class TagGiraffe::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 = TagGiraffe::Tag.where(name: name).first ||
15
+ TagGiraffe::Tag.create(name: name)
16
+
17
+ taggable.tags << tag
18
+ end
19
+
20
+ def delete(name)
21
+ taggable.tags.delete TagGiraffe::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
+ def each(&block)
35
+ to_a.each &block
36
+ end
37
+
38
+ def clear
39
+ taggable.tags.clear
40
+ end
41
+
42
+ def self.new_with_names(taggable, names)
43
+ tag_names = new(taggable)
44
+ tag_names.clear
45
+ names.each { |name| tag_names << name }
46
+ tag_names
47
+ end
48
+
49
+ private
50
+ attr_reader :taggable
51
+ 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 << TagGiraffe::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 << TagGiraffe::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_giraffe.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'tag_giraffe'
3
- s.version = '0.0.2'
3
+ s.version = '0.1.0'
4
4
  s.authors = [ 'Scott Kennedy' ]
5
5
  s.email = [ 'skennedy84@gmail.com' ]
6
6
  s.homepage = 'https://github.com/scott-kennedy/tag_giraffe'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tag_giraffe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Kennedy
@@ -81,6 +81,8 @@ files:
81
81
  - lib/tag_giraffe.rb
82
82
  - lib/tag_giraffe/active_record.rb
83
83
  - lib/tag_giraffe/engine.rb
84
+ - lib/tag_giraffe/tag_names.rb
85
+ - spec/acceptance/tag_names_spec.rb
84
86
  - spec/acceptance/tags_spec.rb
85
87
  - spec/internal/app/models/article.rb
86
88
  - spec/internal/config/database.yml