badgeable 0.1.2 → 0.2.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/.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: []