tagtical 1.0.7 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock ADDED
@@ -0,0 +1,97 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ abstract (1.0.0)
5
+ actionmailer (3.0.5)
6
+ actionpack (= 3.0.5)
7
+ mail (~> 2.2.15)
8
+ actionpack (3.0.5)
9
+ activemodel (= 3.0.5)
10
+ activesupport (= 3.0.5)
11
+ builder (~> 2.1.2)
12
+ erubis (~> 2.6.6)
13
+ i18n (~> 0.4)
14
+ rack (~> 1.2.1)
15
+ rack-mount (~> 0.6.13)
16
+ rack-test (~> 0.5.7)
17
+ tzinfo (~> 0.3.23)
18
+ activemodel (3.0.5)
19
+ activesupport (= 3.0.5)
20
+ builder (~> 2.1.2)
21
+ i18n (~> 0.4)
22
+ activerecord (3.0.5)
23
+ activemodel (= 3.0.5)
24
+ activesupport (= 3.0.5)
25
+ arel (~> 2.0.2)
26
+ tzinfo (~> 0.3.23)
27
+ activeresource (3.0.5)
28
+ activemodel (= 3.0.5)
29
+ activesupport (= 3.0.5)
30
+ activesupport (3.0.5)
31
+ arel (2.0.10)
32
+ builder (2.1.2)
33
+ diff-lcs (1.1.2)
34
+ erubis (2.6.6)
35
+ abstract (>= 1.0.0)
36
+ git (1.2.5)
37
+ i18n (0.6.0)
38
+ jeweler (1.6.2)
39
+ bundler (~> 1.0)
40
+ git (>= 1.2.5)
41
+ rake
42
+ mail (2.2.19)
43
+ activesupport (>= 2.3.6)
44
+ i18n (>= 0.4.0)
45
+ mime-types (~> 1.16)
46
+ treetop (~> 1.4.8)
47
+ mime-types (1.16)
48
+ mocha (0.9.12)
49
+ mysql (2.8.1)
50
+ polyglot (0.3.1)
51
+ rack (1.2.3)
52
+ rack-mount (0.6.14)
53
+ rack (>= 1.0.0)
54
+ rack-test (0.5.7)
55
+ rack (>= 1.0)
56
+ rails (3.0.5)
57
+ actionmailer (= 3.0.5)
58
+ actionpack (= 3.0.5)
59
+ activerecord (= 3.0.5)
60
+ activeresource (= 3.0.5)
61
+ activesupport (= 3.0.5)
62
+ bundler (~> 1.0)
63
+ railties (= 3.0.5)
64
+ railties (3.0.5)
65
+ actionpack (= 3.0.5)
66
+ activesupport (= 3.0.5)
67
+ rake (>= 0.8.7)
68
+ thor (~> 0.14.4)
69
+ rake (0.9.2)
70
+ rcov (0.9.9)
71
+ rspec (2.6.0)
72
+ rspec-core (~> 2.6.0)
73
+ rspec-expectations (~> 2.6.0)
74
+ rspec-mocks (~> 2.6.0)
75
+ rspec-core (2.6.4)
76
+ rspec-expectations (2.6.0)
77
+ diff-lcs (~> 1.1.2)
78
+ rspec-mocks (2.6.0)
79
+ sqlite3 (1.3.3)
80
+ sqlite3-ruby (1.3.3)
81
+ sqlite3 (>= 1.3.3)
82
+ thor (0.14.6)
83
+ treetop (1.4.9)
84
+ polyglot (>= 0.3.1)
85
+ tzinfo (0.3.29)
86
+
87
+ PLATFORMS
88
+ ruby
89
+
90
+ DEPENDENCIES
91
+ jeweler
92
+ mocha
93
+ mysql
94
+ rails (<= 3.0.5)
95
+ rcov
96
+ rspec (<= 2.6.0)
97
+ sqlite3-ruby
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.7
1
+ 1.0.8
data/lib/tagtical/tag.rb CHANGED
@@ -3,15 +3,15 @@ module Tagtical
3
3
 
4
4
  attr_accessible :value
5
5
 
6
- ### ASSOCIATIONS:
7
-
8
6
  has_many :taggings, :dependent => :destroy, :class_name => 'Tagtical::Tagging'
9
7
 
10
- ### VALIDATIONS:
11
-
12
- validates :value, :uniqueness => {:scope => :type}, :presence => true # type is not required, it can be blank
8
+ scope(:type, lambda do |context, *args|
9
+ options = args.extract_options!
10
+ options[:type] = args[0] if args[0]
11
+ Type[context].scoping(options)
12
+ end)
13
13
 
14
- ## POSSIBLE_VALUES SUPPORT:
14
+ validates :value, :uniqueness => {:scope => :type}, :presence => true # type is not required, it can be blank
15
15
 
16
16
  class_attribute :possible_values
17
17
  validate :validate_possible_values
@@ -63,12 +63,8 @@ module Tagtical
63
63
  @sti_name = Tagtical::Tag==self ? nil : Type[name.demodulize].to_sti_name
64
64
  end
65
65
 
66
- def define_methods_for_type(tag_type)
67
- (@define_methods_for_type ||= {})[tag_type] ||= begin
68
- scope(tag_type.scope_name, Proc.new { |options| tag_type.scoping(options || {}) })
69
- define_method(:"#{tag_type}?") { is_a?(tag_type.klass!) }
70
- true
71
- end
66
+ def define_scope_for_type(tag_type)
67
+ scope(tag_type.scope_name, lambda { |*args| type(tag_type, *args) }) unless respond_to?(tag_type.scope_name)
72
68
  end
73
69
 
74
70
  protected
@@ -120,7 +116,7 @@ module Tagtical
120
116
 
121
117
  def inspect
122
118
  super.tap do |str|
123
- str[-2] = "relevance: #{attribute_for_inspect(:relevance)}" if has_attribute?(:relevance)
119
+ str[-1] = ", relevance: #{relevance}>" if relevance
124
120
  end
125
121
  end
126
122
 
@@ -135,6 +131,18 @@ module Tagtical
135
131
 
136
132
  private
137
133
 
134
+ def method_missing(method_name, *args, &block)
135
+ if method_name[-1]=="?"
136
+ lambda = (klass = Type.new(method_name[0..-2]).klass) ?
137
+ lambda { is_a?(klass) } :
138
+ lambda { method_name[0..-2]==type }
139
+ self.class.send(:define_method, method_name, &lambda)
140
+ send(method_name)
141
+ else
142
+ super
143
+ end
144
+ end
145
+
138
146
  def validate_possible_values
139
147
  if possible_values && !possible_values.include?(value)
140
148
  errors.add(:value, %{Value "#{value}" not found in list: #{possible_values.inspect}})
@@ -308,7 +316,7 @@ module Tagtical
308
316
  return constant
309
317
  end
310
318
  end
311
-
319
+
312
320
  # Logic comes from ActiveRecord::Base#compute_type.
313
321
  candidates.each do |candidate|
314
322
  begin
@@ -24,7 +24,7 @@ module Tagtical::Taggable
24
24
  # This keeps your reflections cleaner.
25
25
 
26
26
  # In the case of the base tag type, it will just use the :tags association defined above.
27
- Tagtical::Tag.define_methods_for_type(tag_type)
27
+ Tagtical::Tag.define_scope_for_type(tag_type)
28
28
 
29
29
  # If the tag_type is base? (type=="tag"), then we add additional functionality to the AR
30
30
  # has_many :tags.
@@ -57,7 +57,17 @@ describe Tagtical::Tag do
57
57
 
58
58
  end
59
59
 
60
- describe "tag scopes Type#finder_type_conditions" do
60
+ describe ".type" do
61
+
62
+ it "should accept :type condition as argument" do
63
+ @klass::Type.any_instance.expects(:scoping).with(:key => :value, :type => :>=)
64
+ @klass.type(:skills, :">=", :key => :value)
65
+ end
66
+
67
+ end
68
+
69
+ describe "dynamic type scopes" do
70
+
61
71
  before do
62
72
  Tagtical::Tag.create(:value => "Plane")
63
73
  Tag::Skill.create(:value => "Kung Fu")
@@ -65,6 +75,12 @@ describe Tagtical::Tag do
65
75
  NeedTag.create(:value => "chair")
66
76
  end
67
77
 
78
+ it "should accept :type condition separately from the options" do
79
+ Tagtical::Tag.skills(:current).should have_tag_values ["Kung Fu"]
80
+ Tagtical::Tag.skills(:==).should have_tag_values ["Kung Fu"]
81
+ Tagtical::Tag.crafts(:>).should have_tag_values ["Kung Fu", "Plane"]
82
+ end
83
+
68
84
  context "when :type => :current or the alias :==" do
69
85
  it "should retrieve current STI level tags" do
70
86
  Tagtical::Tag.skills.should have_tag_values ["Kung Fu", "Painting"]
@@ -79,7 +95,7 @@ describe Tagtical::Tag do
79
95
  Tagtical::Tag.crafts(:type => :parents).should have_tag_values ["Kung Fu", "Plane"]
80
96
  Tagtical::Tag.crafts(:type => :>).should have_tag_values ["Kung Fu", "Plane"]
81
97
  Tagtical::Tag.skills(:type => :>).should have_tag_values ["Plane"]
82
- end
98
+ end
83
99
  end
84
100
 
85
101
  context "when :type => :childern or the alias :<" do
@@ -112,7 +128,7 @@ describe Tagtical::Tag do
112
128
  end
113
129
  end
114
130
 
115
- describe ".define_methods_for_type" do
131
+ describe ".define_scope_for_type" do
116
132
  before do
117
133
  @skill = Tag::Skill.new(:value => "baskeball")
118
134
  @craft = Tag::Craft.new(:value => "pottery")
@@ -129,7 +145,7 @@ describe Tagtical::Tag do
129
145
  @craft.skill?.should be_true
130
146
  @craft.craft?.should be_true
131
147
  end
132
-
148
+
133
149
  end
134
150
 
135
151
  it "should refresh @value on value setter" do
@@ -139,14 +155,24 @@ describe Tagtical::Tag do
139
155
  @tag.value.should == "bar"
140
156
  end
141
157
 
158
+ describe "#inspect" do
159
+
160
+ it "should append relevance when provided" do
161
+ @tag["relevance"] = "0.45"
162
+ @tag.inspect.should == "#<Tagtical::Tag id: nil, value: \"train\", type: nil, relevance: 0.45>"
163
+ end
164
+
165
+ end
166
+
142
167
  describe "sort" do
168
+
143
169
  before do
144
170
  @tag1 = @klass.new(:value => "car").tap { |x| x["relevance"] = "2.5" }
145
171
  @tag2 = @klass.new(:value => "plane").tap { |x| x["relevance"] = "1.7" }
146
172
  @tag3 = @klass.new(:value => "bike").tap { |x| x["relevance"] = "1.1" }
147
173
  @tags = [@tag1, @tag2, @tag3]
148
174
  end
149
-
175
+
150
176
  it "should sort by relevance if all tags have them" do
151
177
  @tags.sort.map(&:value).should == ["bike", "plane", "car"]
152
178
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tagtical
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-07-12 00:00:00.000000000Z
12
+ date: 2011-07-14 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &2152043280 !ruby/object:Gem::Requirement
16
+ requirement: &2158000180 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - <=
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.0.5
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152043280
24
+ version_requirements: *2158000180
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &2152042800 !ruby/object:Gem::Requirement
27
+ requirement: &2157999700 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - <=
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.6.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2152042800
35
+ version_requirements: *2157999700
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sqlite3-ruby
38
- requirement: &2152042320 !ruby/object:Gem::Requirement
38
+ requirement: &2157999220 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2152042320
46
+ version_requirements: *2157999220
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: mysql
49
- requirement: &2152041840 !ruby/object:Gem::Requirement
49
+ requirement: &2157998740 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2152041840
57
+ version_requirements: *2157998740
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &2152041360 !ruby/object:Gem::Requirement
60
+ requirement: &2157998260 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *2152041360
68
+ version_requirements: *2157998260
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rcov
71
- requirement: &2152040880 !ruby/object:Gem::Requirement
71
+ requirement: &2157997780 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *2152040880
79
+ version_requirements: *2157997780
80
80
  description: Tagtical allows you do create subclasses for Tag and add additional functionality
81
81
  in an STI fashion. For example. You could do Tag::Color.find_by_name('blue').to_rgb.
82
82
  It also supports storing weights or relevance on the taggings.
@@ -88,6 +88,7 @@ extra_rdoc_files:
88
88
  files:
89
89
  - CHANGELOG
90
90
  - Gemfile
91
+ - Gemfile.lock
91
92
  - MIT-LICENSE
92
93
  - README.rdoc
93
94
  - Rakefile