badgeable 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,2 +1,4 @@
1
1
  pkg
2
2
  .bundle
3
+ */.DS_Store
4
+ .DS_Store
@@ -7,3 +7,14 @@ Feature: Easily award badges to any Ruby class (given enough effort on your part
7
7
  Given a Meal awards the "Hog Wild" badge to an Diner after 3 times
8
8
  When a diner creates 3 meals
9
9
  Then the diner should have the "Hog Wild" badge
10
+
11
+ Scenario: A user gets a badge when they've completed their profile
12
+ Given a User gets the "Profile Complete" badge when their profile has been completed
13
+ When the user has completed their profile
14
+ Then the user should have the "Profile Complete" badge
15
+
16
+ Scenario: A user gets a badge when he's written 10 reviews
17
+ Given a User gets the "Guppy" badge when they have written 10 reviews
18
+ When the user has written 10 reviews
19
+ Then the user should have the "Guppy" badge
20
+
@@ -8,6 +8,27 @@ Given /^a Meal awards the "([^\"]*)" badge to an? Diner after (\d+) times$/ do |
8
8
  }
9
9
  end
10
10
 
11
+ Given /^a User gets the "([^\"]*)" badge when their profile has been completed$/ do |badge_name|
12
+ User.class_eval %Q{
13
+ badge "#{badge_name}", :after => :save do
14
+ thing User
15
+ subject :user
16
+ conditions do |user|
17
+ user.profile_completeness == 100
18
+ end
19
+ end
20
+ }
21
+ end
22
+
23
+ Given /^a User gets the "([^\"]*)" badge when they have written (\d+) reviews$/ do |badge_name, threshold|
24
+ User.class_eval %Q{
25
+ badge "#{badge_name}" do
26
+ thing Review
27
+ count #{threshold}
28
+ end
29
+ }
30
+ end
31
+
11
32
  When /^a diner creates (\d+) meals$/ do |num|
12
33
  @diner = Diner.create
13
34
  num.to_i.times do
@@ -15,6 +36,23 @@ When /^a diner creates (\d+) meals$/ do |num|
15
36
  end
16
37
  end
17
38
 
39
+ When /^the user has completed their profile$/ do
40
+ @user = User.create
41
+ @user.profile_completeness = 100
42
+ @user.save
43
+ end
44
+
45
+ When /^the user has written (\d+) reviews$/ do |num|
46
+ @user = User.create
47
+ num.to_i.times do
48
+ @user.reviews.create
49
+ end
50
+ end
51
+
18
52
  Then /^the diner should have the "([^\"]*)" badge$/ do |badge_name|
19
53
  @diner.should have_badge_named(badge_name)
20
54
  end
55
+
56
+ Then /^the user should have the "([^\"]*)" badge$/ do |badge_name|
57
+ @user.should have_badge_named(badge_name)
58
+ end
@@ -0,0 +1,5 @@
1
+ class Review
2
+ include Mongoid::Document
3
+ extend Badgeable::Award
4
+ referenced_in :user
5
+ end
@@ -0,0 +1,7 @@
1
+ class User
2
+ include Mongoid::Document
3
+ include Badgeable::Subject
4
+ extend Badgeable::Award
5
+ field :profile_completeness, :type => Integer
6
+ references_many :reviews
7
+ end
@@ -27,15 +27,16 @@ module Badgeable
27
27
  #
28
28
  # See README for usage examples
29
29
  #
30
- def badge(name, &block)
30
+ def badge(name, options = {}, &block)
31
+ after_callback = options[:after] || :create
31
32
  config = Badgeable::Config.new
32
33
  config.instance_eval(&block)
33
- method_name = name.titleize.gsub(/\s/, "").underscore
34
+ method_name = "award_#{name.titleize.gsub(/\s/, '').underscore}_badge".to_sym
34
35
  config.klass.class_eval do
35
- set_callback :create, :after, "award_#{method_name}_badge".to_sym
36
- define_method "award_#{method_name}_badge".to_sym, Proc.new {
36
+ set_callback after_callback, :after, method_name
37
+ define_method method_name, Proc.new {
37
38
  if config.conditions_array.all? {|p| p.call(self) }
38
- self.send(config.subject_name).award_badge(name)
39
+ config.subject_proc.call(self).award_badge(name)
39
40
  end
40
41
  }
41
42
  end
@@ -5,15 +5,28 @@ module Badgeable
5
5
  attr_accessor :badge_definitions
6
6
  end
7
7
 
8
- attr_reader :threshold, :klass, :conditions_array, :subject_name
8
+ attr_reader :threshold, :klass, :conditions_array, :subject_proc
9
9
 
10
10
  def initialize
11
11
  @conditions_array = [Proc.new {true}]
12
- @subject_name = :user
12
+ subject :user
13
13
  end
14
14
 
15
- def subject(sym)
15
+ def subject(sym = nil, &block)
16
16
  @subject_name = sym
17
+ if block_given?
18
+ @subject_proc = Proc.new {|instance|
19
+ block.call(instance)
20
+ }
21
+ else
22
+ @subject_proc = Proc.new { |instance|
23
+ if klass.to_s.underscore.to_sym == @subject_name
24
+ instance
25
+ else
26
+ instance.send(sym)
27
+ end
28
+ }
29
+ end
17
30
  end
18
31
 
19
32
  def count(n = 1, &block)
@@ -24,7 +37,7 @@ module Badgeable
24
37
  else
25
38
  count_proc = Proc.new { |instance|
26
39
  instance.instance_eval %Q{
27
- #{klass}.where(:#{subject_name}_id => #{subject_name}.id).count >= #{n}
40
+ #{klass}.where(:#{@subject_name}_id => #{@subject_name}.id).count >= #{n}
28
41
  }
29
42
  }
30
43
  end
@@ -21,7 +21,7 @@ module Badgeable
21
21
  }
22
22
 
23
23
  Badgeable::Badge.class_eval %Q{
24
- references_many :#{receiver.to_s.tableize}, :inverse_of => :badges, :stored_as => :array, :inverse_of => :badges
24
+ references_many :#{receiver.to_s.tableize}, :inverse_of => :badges, :stored_as => :array
25
25
 
26
26
  def recipients
27
27
  #{receiver}.where(:badge_ids => id)
@@ -1,3 +1,3 @@
1
1
  module Badgeable
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,4 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'rspec'
4
+ require 'badgeable'
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
7
  - 2
9
- version: 0.1.2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Scott Burton
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-10-14 00:00:00 -07:00
17
+ date: 2010-10-28 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -98,6 +98,8 @@ files:
98
98
  - features/support/env.rb
99
99
  - features/support/test_models/diner.rb
100
100
  - features/support/test_models/meal.rb
101
+ - features/support/test_models/review.rb
102
+ - features/support/test_models/user.rb
101
103
  - lib/badgeable.rb
102
104
  - lib/badgeable/award.rb
103
105
  - lib/badgeable/badge.rb
@@ -106,6 +108,7 @@ files:
106
108
  - lib/badgeable/railtie.rb
107
109
  - lib/badgeable/subject.rb
108
110
  - lib/badgeable/version.rb
111
+ - spec/spec_helper.rb
109
112
  has_rdoc: true
110
113
  homepage: http://rubygems.org/gems/badgeable
111
114
  licenses: []