tagtical 1.4.9 → 1.4.10

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.4.9
1
+ 1.4.10
data/lib/tagtical/tag.rb CHANGED
@@ -18,6 +18,8 @@ module Tagtical
18
18
  before_validation :ensure_possible_values
19
19
  validate :validate_possible_values
20
20
 
21
+ class_attribute :relevance_range
22
+
21
23
  ### CLASS METHODS:
22
24
 
23
25
  class << self
@@ -64,10 +64,9 @@ module Tagtical::Taggable
64
64
 
65
65
  scope "has_no_#{tag_type.has_many_name}", lambda { |*args|
66
66
  args << args.extract_options!.update(:sql => :append)
67
-
68
- select("*").
69
- joins("LEFT JOIN #{tagging_table} ON #{table_name}.`id` = #{tagging_table}.`taggable_id` AND #{tagging_table}.`taggable_type` = '#{sti_name}'").
70
- joins(%{LEFT JOIN #{tag_table} ON #{tag_table}.`id` = #{tagging_table}.`tag_id` #{tag_type.finder_type_condition(*args)}}).
67
+ select("#{table_name}.*").
68
+ joins("LEFT OUTER JOIN #{tagging_table} ON ( #{tagging_table}.taggable_id = #{table_name}.id )").
69
+ joins(%{LEFT OUTER JOIN #{tag_table} ON ( #{tag_table}.id = #{tagging_table}.tag_id #{tag_type.finder_type_condition(*args)} )}).
71
70
  where("#{tag_table}.id IS NULL").
72
71
  group("#{table_name}.id")
73
72
  }
@@ -320,7 +319,7 @@ module Tagtical::Taggable
320
319
  end
321
320
 
322
321
  new_tags.each do |tag|
323
- taggings.create!(:tag_id => tag.id, :taggable => self, :relevance => tag_value_lookup[tag].relevance) # Create new taggings:
322
+ taggings.create!(:tag => tag, :taggable => self, :relevance => tag_value_lookup[tag].relevance) # Create new taggings:
324
323
  end
325
324
  end
326
325
 
@@ -3,33 +3,38 @@ module Tagtical
3
3
  include Tagtical::ActiveRecord::Backports if ::ActiveRecord::VERSION::MAJOR < 3
4
4
 
5
5
  attr_accessible :tag,
6
- :tag_id,
7
- :taggable,
8
- :taggable_type,
9
- :taggable_id,
10
- :tagger,
11
- :tagger_id,
12
- :relevance
6
+ :tag_id,
7
+ :taggable,
8
+ :taggable_type,
9
+ :taggable_id,
10
+ :tagger,
11
+ :tagger_id,
12
+ :relevance
13
13
 
14
14
  belongs_to :tag, :class_name => 'Tagtical::Tag'
15
15
  belongs_to :taggable, :polymorphic => true
16
16
 
17
- validates_presence_of :tag_id
17
+ before_validation { |record| record.relevance ||= default_relevance }
18
+
19
+ validates_presence_of :tag_id, :relevance
18
20
  validates_uniqueness_of :tag_id, :scope => [:taggable_type, :taggable_id, :tagger_id]
19
21
 
22
+ validate :validate_relevance
23
+
20
24
  if Tagtical.config.polymorphic_tagger?
21
25
  attr_accessible :tagger_type
22
- belongs_to :tagger, :polymorphic => true
26
+ belongs_to :tagger, :polymorphic => true
23
27
  else
24
28
  belongs_to :tagger, case Tagtical.config.tagger
25
- when Hash then Tagtical.config.tagger
26
- when true then {:class_name => "User"} # default to using User class.
27
- when String then {:class_name => Tagtical.config.tagger}
29
+ when Hash then
30
+ Tagtical.config.tagger
31
+ when true then
32
+ {:class_name => "User"} # default to using User class.
33
+ when String then
34
+ {:class_name => Tagtical.config.tagger}
28
35
  end
29
36
  end
30
37
 
31
- before_create { |record| record.relevance ||= default_relevance }
32
-
33
38
  class_attribute :default_relevance, :instance_writer => false
34
39
  self.default_relevance = 1
35
40
 
@@ -45,7 +50,16 @@ module Tagtical
45
50
  end
46
51
  set_tag_target_without_relevance(tag)
47
52
  end
53
+
48
54
  alias_method_chain :set_tag_target, :relevance
49
55
 
56
+ private
57
+
58
+ def validate_relevance
59
+ if range = Tagtical::Tag.relevance_range
60
+ errors[:relevance] = "must be between #{range.begin} and #{range.end}" unless range.include?(relevance)
61
+ end
62
+ end
63
+
50
64
  end
51
65
  end
@@ -88,11 +88,11 @@ describe Tagtical::Taggable do
88
88
  @taggables[1].update_attributes!(:language_list => "Spanish, French", :craft_list => "Pottery", :need_list => "Food")
89
89
  end
90
90
 
91
- # These *should* be working, but we are having trouble in sqlite3, perhaps in mysql it will preform better.
92
- #it "should omit the classes we don't want" do
93
- # TaggableModel.has_no_needs.all.should==[@taggables[0]]
94
- # TaggableModel.has_no_tags(:needs, :<).all.should==[]
95
- #end
91
+ # These *should* be working, but we are having trouble in sqlite3, but we've confirmed it works in mysql
92
+ # it "should omit the classes we don't want" do
93
+ # TaggableModel.has_no_needs.all.should==[@taggables[0]]
94
+ # TaggableModel.has_no_tags(:needs, :<).all.should==[]
95
+ # end
96
96
 
97
97
  end
98
98
 
@@ -12,12 +12,12 @@ describe Tagtical::Tagging do
12
12
  context "when no relevance set" do
13
13
  before do
14
14
  @tagging.relevance = nil
15
- @tagging.run_callbacks(:create)
15
+ @tagging.run_callbacks(:validation)
16
16
  end
17
17
  its(:relevance) { should == @klass.default_relevance }
18
18
  end
19
19
  context "when relevance set" do
20
- before { @tagging.run_callbacks(:create) }
20
+ before { @tagging.run_callbacks(:validation) }
21
21
  its(:relevance) { should == @tagging.relevance }
22
22
  end
23
23
  end
@@ -60,4 +60,17 @@ describe Tagtical::Tagging do
60
60
  end
61
61
  end
62
62
 
63
+ describe "relevance_range" do
64
+ before do
65
+ @taggable = TaggableModel.create(:name => "Bob Jones")
66
+ Tagtical::Tag.relevance_range = (0..10)
67
+ end
68
+
69
+ it "should throw an error if the relevance is out of range" do
70
+ @taggable.set_tag_list "car:11"
71
+
72
+ expect { @taggable.save }.to raise_error
73
+ end
74
+ end
75
+
63
76
  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.4.9
4
+ version: 1.4.10
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-28 00:00:00.000000000Z
12
+ date: 2011-07-30 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &2155971940 !ruby/object:Gem::Requirement
16
+ requirement: &2164277000 !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: *2155971940
24
+ version_requirements: *2164277000
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &2155971460 !ruby/object:Gem::Requirement
27
+ requirement: &2164276520 !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: *2155971460
35
+ version_requirements: *2164276520
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sqlite3-ruby
38
- requirement: &2155970980 !ruby/object:Gem::Requirement
38
+ requirement: &2164276040 !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: *2155970980
46
+ version_requirements: *2164276040
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: mysql
49
- requirement: &2155970500 !ruby/object:Gem::Requirement
49
+ requirement: &2164275560 !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: *2155970500
57
+ version_requirements: *2164275560
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &2155970020 !ruby/object:Gem::Requirement
60
+ requirement: &2164275080 !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: *2155970020
68
+ version_requirements: *2164275080
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rcov
71
- requirement: &2155969540 !ruby/object:Gem::Requirement
71
+ requirement: &2164303500 !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: *2155969540
79
+ version_requirements: *2164303500
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.