badgeable 0.3.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -70,7 +70,9 @@ in Rails.root/lib/badges.rb
70
70
 
71
71
  == Requirements
72
72
 
73
- Currently Mongoid is the only ORM supported. Watch this space.
73
+ === Supported ORMs
74
+ * Mongoid
75
+ * ActiveRecord
74
76
 
75
77
  = License
76
78
 
@@ -94,4 +96,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
94
96
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
95
97
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
96
98
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
97
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
99
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -37,18 +37,22 @@ When /^a diner creates (\d+) meals$/ do |num|
37
37
  end
38
38
 
39
39
  When /^the user has completed their profile$/ do
40
- @user = User.create
40
+ Given %Q{I am a user}
41
41
  @user.profile_completeness = 100
42
42
  @user.save
43
43
  end
44
44
 
45
45
  When /^the user has written (\d+) reviews$/ do |num|
46
- @user = User.create
46
+ Given %Q{I am a user}
47
47
  num.to_i.times do
48
48
  @user.reviews.create
49
49
  end
50
50
  end
51
51
 
52
+ Given /^I am a user$/ do
53
+ @user = User.create
54
+ end
55
+
52
56
  Then /^the diner should have the "([^\"]*)" badge$/ do |badge_name|
53
57
  @diner.should have_badge_named(badge_name)
54
58
  end
@@ -56,3 +60,32 @@ end
56
60
  Then /^the user should have the "([^\"]*)" badge$/ do |badge_name|
57
61
  @user.should have_badge_named(badge_name)
58
62
  end
63
+
64
+ Given /^I have (\d+) badges already$/ do |num|
65
+ Given %Q{I am a user}
66
+ num.to_i.times do |n|
67
+ badging = @user.award_badge("Badge #{n}")
68
+ badging.update_attributes(:seen => true)
69
+ end
70
+ end
71
+
72
+ Given /^I have just been awarded (\d+) badges$/ do |num|
73
+ Given %Q{I am a user}
74
+ num.to_i.times do |n|
75
+ @user.award_badge("Unseen Badge #{n}")
76
+ end
77
+ end
78
+
79
+ Then /^I should have (\d+) unseen badges$/ do |num|
80
+ @user.badgings.unseen.count.should eql(num.to_i)
81
+ end
82
+
83
+ Given /^I have (\d+) badges$/ do |num|
84
+ Given %Q{I have #{num} badges already}
85
+ end
86
+
87
+ When /^my unseen badges are marked as seen$/ do
88
+ @user.badgings.each do |badging|
89
+ badging.mark_as_seen
90
+ end
91
+ end
@@ -0,0 +1,18 @@
1
+ Feature: Badges are marked as unseen until a user sees that they've won them
2
+ So that I know which badges I've been awarded
3
+ As a user who just had badges awarded
4
+ I want to see my unseen badges, and once I've seen them, they should go away
5
+
6
+ Scenario: Unseen badges
7
+ Given I have 3 badges already
8
+ And I have just been awarded 2 badges
9
+ When I should have 2 unseen badges
10
+
11
+ Scenario: Mark badges as seen
12
+ Given I have 0 badges
13
+ And I have just been awarded 2 badges
14
+ When my unseen badges are marked as seen
15
+ Then I should have 0 unseen badges
16
+
17
+
18
+
data/lib/badgeable.rb CHANGED
@@ -3,7 +3,17 @@ require 'active_support/callbacks'
3
3
  require 'active_support/inflector'
4
4
  require 'active_support/dependencies'
5
5
  require 'active_support/concern'
6
- require 'badgeable/railtie' if defined?(Rails)
6
+
7
+ # if defined?(Mongoid)
8
+ autoload :Badge, 'badgeable/adapters/mongoid_adapter/badge'
9
+ autoload :Badging, 'badgeable/adapters/mongoid_adapter/badging'
10
+ # end
11
+ #
12
+ # if defined?(ActiveRecord)
13
+ # autoload :Badge, 'badgeable/adapters/active_record/badge'
14
+ # autoload :Badging, 'badgeable/adapters/active_record/badging'
15
+ # end
16
+
7
17
 
8
18
  module Badgeable
9
19
  autoload :Adapters, 'badgeable/adapters'
@@ -18,4 +28,6 @@ module Badgeable
18
28
  end
19
29
  end
20
30
 
31
+ require 'badgeable/railtie' if defined?(Rails)
32
+
21
33
  module Badgeable; end
@@ -25,6 +25,11 @@ end
25
25
 
26
26
  class Badging < ActiveRecord::Base
27
27
  belongs_to :badge
28
+ scope :unseen, {:where => {:seen => false}}
29
+
30
+ def mark_as_seen
31
+ update_attributes(:seen => true)
32
+ end
28
33
  end
29
34
 
30
35
  class Badge < ActiveRecord::Base
@@ -33,6 +38,6 @@ class Badge < ActiveRecord::Base
33
38
  end
34
39
 
35
40
  def icon
36
- "/images/#{name}"
41
+ "/images/#{name.parameterize}.jpg"
37
42
  end
38
43
  end
@@ -2,34 +2,39 @@ module Badgeable
2
2
  module Adapters
3
3
  module MongoidAdapter
4
4
  def self.included(receiver)
5
- receiver.class_eval %Q{
6
- references_many :badges, :stored_as => :array, :class_name => "Badge", :inverse_of => :#{receiver.to_s.tableize}
7
- }
5
+ receiver.class_eval do
6
+ embeds_many :badgings
7
+ end
8
8
 
9
- Badge.class_eval %Q{
10
- references_many :#{receiver.to_s.tableize}, :inverse_of => :badges, :stored_as => :array
9
+ ::Badging.class_eval %Q{
10
+ embedded_in :#{receiver.to_s.underscore}, :inverse_of => :badgings
11
+ def receiver
12
+ #{receiver.to_s.underscore}
13
+ end
14
+ }
11
15
 
16
+ ::Badge.class_eval %Q{
12
17
  def recipients
13
- #{receiver}.where(:badge_ids => id)
18
+ #{receiver}.where("badgings.badge_id" => id)
14
19
  end
15
20
  }
21
+ receiver.send(:include, InstanceMethods)
22
+ end
23
+ end
24
+
25
+ module InstanceMethods
26
+ def award_badge(name)
27
+ badge = Badge.find_or_create_by_name(name)
28
+ badgings.create(:badge_id => badge.id) unless has_badge?(badge)
29
+ end
30
+
31
+ def badges
32
+ Badge.where(:_id.in => badgings.map(&:badge_id))
33
+ end
34
+
35
+ def unseen_badges
36
+ Badge.where(:_id.in => badgings.unseen.map(&:badge_id))
16
37
  end
17
38
  end
18
39
  end
19
- end
20
-
21
- class Badge
22
- include Mongoid::Document
23
- include Mongoid::Timestamps
24
-
25
- field :name
26
- index :name
27
-
28
- def self.find_or_create_by_name(name)
29
- criteria.where(:name => name).first || create(:name => name)
30
- end
31
-
32
- def icon
33
- "/images/#{name}"
34
- end
35
- end
40
+ end
@@ -0,0 +1,15 @@
1
+ class Badge
2
+ include Mongoid::Document
3
+ include Mongoid::Timestamps
4
+
5
+ field :name
6
+ index :name
7
+
8
+ def self.find_or_create_by_name(name)
9
+ criteria.where(:name => name).first || create(:name => name)
10
+ end
11
+
12
+ def icon
13
+ "#{name.parameterize}.png"
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ class Badging
2
+ include Mongoid::Document
3
+ include Mongoid::Timestamps
4
+ referenced_in :badge
5
+ field :seen, :type => Boolean, :default => false
6
+ scope :unseen, {:where => {:seen => false}}
7
+
8
+ def mark_as_seen
9
+ update_attributes(:seen => true)
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module Badgeable
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.2"
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 0
9
- version: 0.3.0
8
+ - 2
9
+ version: 0.3.2
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-11-01 00:00:00 -07:00
17
+ date: 2010-11-03 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -100,10 +100,13 @@ files:
100
100
  - features/support/test_models/meal.rb
101
101
  - features/support/test_models/review.rb
102
102
  - features/support/test_models/user.rb
103
+ - features/unseen_badges.feature
103
104
  - lib/badgeable.rb
104
105
  - lib/badgeable/adapters.rb
105
106
  - lib/badgeable/adapters/active_record_adapter.rb
106
107
  - lib/badgeable/adapters/mongoid_adapter.rb
108
+ - lib/badgeable/adapters/mongoid_adapter/badge.rb
109
+ - lib/badgeable/adapters/mongoid_adapter/badging.rb
107
110
  - lib/badgeable/award.rb
108
111
  - lib/badgeable/config.rb
109
112
  - lib/badgeable/dsl.rb