triumph 0.1.4 → 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/README.rdoc +14 -5
- data/VERSION +1 -1
- data/app/controllers/triumph/achievements_controller.rb +90 -0
- data/app/models/triumph/achievement.rb +31 -0
- data/app/models/triumph/achievement_condition.rb +33 -0
- data/app/models/triumph/completed_achievement.rb +10 -0
- data/app/views/triumph/achievements/_form.html.erb +40 -0
- data/app/views/triumph/achievements/edit.html.erb +6 -0
- data/app/views/triumph/achievements/index.html.erb +31 -0
- data/app/views/triumph/achievements/new.html.erb +5 -0
- data/app/views/triumph/achievements/show.html.erb +30 -0
- data/config/routes.rb +5 -0
- data/lib/{generators → rails/generators}/achievement_observer/achievement_observer_generator.rb +4 -5
- data/lib/{generators → rails/generators}/achievement_observer/templates/achievement_observer.rb +0 -0
- data/lib/{db/migrate → rails/generators/triumph/templates}/20110711040135_create_achievements.rb +1 -1
- data/lib/{db/migrate → rails/generators/triumph/templates}/20110712025245_create_completed_achievements.rb +0 -0
- data/lib/{db/migrate → rails/generators/triumph/templates}/20110712033351_create_achievement_conditions.rb +1 -1
- data/lib/rails/generators/triumph/templates/initializer.rb +8 -0
- data/lib/rails/generators/triumph/triumph_generator.rb +19 -0
- data/lib/rails/railties/tasks.rake +8 -0
- data/lib/triumph.rb +12 -4
- data/lib/triumph/achievements.rb +25 -0
- data/lib/triumph/engine.rb +8 -0
- data/triumph.gemspec +26 -22
- metadata +50 -84
- data/lib/.DS_Store +0 -0
- data/lib/achievements.rb +0 -23
- data/lib/app/controllers/achievements_controller.rb +0 -0
- data/lib/app/models/achievement.rb +0 -19
- data/lib/app/models/completed_achievement.rb +0 -6
- data/lib/app/views/achievements/index.html.erb +0 -0
- data/lib/app/views/achievements/new.html.erb +0 -0
- data/lib/db/.DS_Store +0 -0
- data/lib/generators/.DS_Store +0 -0
- data/lib/generators/triumph/.DS_Store +0 -0
- data/lib/generators/triumph/triumph_generator.rb +0 -12
data/README.rdoc
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
=
|
1
|
+
= Triumph
|
2
2
|
|
3
3
|
Triumph is a gem that not only lets you add achievements to your rails app, but lets you dynamically define new achievements (e.g. by an admin) at runtime.
|
4
4
|
|
5
|
-
==
|
5
|
+
== Installing
|
6
6
|
|
7
7
|
To use Triumph, simply do the following:
|
8
8
|
|
@@ -12,13 +12,22 @@ To use Triumph, simply do the following:
|
|
12
12
|
* rails generate triumph
|
13
13
|
* rake db:migrate
|
14
14
|
* Add an observer on any objects you want to count for your users' achevements
|
15
|
-
*
|
16
|
-
*
|
15
|
+
* rails generate achievement_observer Post
|
16
|
+
* rails generate achievement_observer Comment
|
17
17
|
* add those observers to the 'config.active_record.observers' variable in config/application.rb
|
18
18
|
* In your users model, add:
|
19
19
|
* include Achievements
|
20
|
+
* Restart your App!
|
20
21
|
|
21
|
-
|
22
|
+
== Using
|
23
|
+
|
24
|
+
Once you've installed Triumph, you can visit the achievements controller to add new achievement definitions. Each achievement must have:
|
25
|
+
|
26
|
+
* A name
|
27
|
+
* A description
|
28
|
+
* A set of conditions
|
29
|
+
|
30
|
+
That's it. You can now create new Achievements, and when a post is saved, for example, Triumph will check if the conditions are met.
|
22
31
|
|
23
32
|
For more info, see the sample app at http://github.com/adambray/triumph-sample.git
|
24
33
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Triumph
|
2
|
+
class AchievementsController < ApplicationController
|
3
|
+
# GET /achievements
|
4
|
+
# GET /achievements.xml
|
5
|
+
def index
|
6
|
+
@achievements = Achievement.all
|
7
|
+
|
8
|
+
respond_to do |format|
|
9
|
+
format.html # index.html.erb
|
10
|
+
format.xml { render :xml => @achievements }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# GET /achievements/1
|
15
|
+
# GET /achievements/1.xml
|
16
|
+
def show
|
17
|
+
@achievement = Achievement.find(params[:id])
|
18
|
+
|
19
|
+
respond_to do |format|
|
20
|
+
format.html # show.html.erb
|
21
|
+
format.xml { render :xml => @achievement }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# GET /achievements/new
|
26
|
+
# GET /achievements/new.xml
|
27
|
+
def new
|
28
|
+
@achievement = Achievement.new
|
29
|
+
|
30
|
+
respond_to do |format|
|
31
|
+
format.html # new.html.erb
|
32
|
+
format.xml { render :xml => @achievement }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# GET /achievements/1/edit
|
37
|
+
def edit
|
38
|
+
@achievement = Achievement.find(params[:id])
|
39
|
+
end
|
40
|
+
|
41
|
+
# POST /achievements
|
42
|
+
# POST /achievements.xml
|
43
|
+
def create
|
44
|
+
@achievement = Achievement.new(params[:triumph_achievement])
|
45
|
+
@achievement.observe_class.downcase!
|
46
|
+
|
47
|
+
if @achievement.save
|
48
|
+
achievement_condition = AchievementCondition.new(params[:achievement_condition])
|
49
|
+
achievement_condition.achievement_id = @achievement.id
|
50
|
+
if achievement_condition.save
|
51
|
+
redirect_to(@achievement, :notice => 'Achievement was successfully created.')
|
52
|
+
else
|
53
|
+
flash[:error] = "Failed to save achievement conditions"
|
54
|
+
end
|
55
|
+
else
|
56
|
+
render :action => "new"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# PUT /achievements/1
|
61
|
+
# PUT /achievements/1.xml
|
62
|
+
def update
|
63
|
+
@achievement = Achievement.find(params[:id])
|
64
|
+
@achievement.observe_class.downcase!
|
65
|
+
|
66
|
+
respond_to do |format|
|
67
|
+
if @achievement.update_attributes(params[:triumph_achievement])
|
68
|
+
format.html { redirect_to(@achievement, :notice => 'Achievement was successfully updated.') }
|
69
|
+
format.xml { head :ok }
|
70
|
+
else
|
71
|
+
format.html { render :action => "edit" }
|
72
|
+
format.xml { render :xml => @achievement.errors, :status => :unprocessable_entity }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# DELETE /achievements/1
|
78
|
+
# DELETE /achievements/1.xml
|
79
|
+
def destroy
|
80
|
+
@achievement = Achievement.find(params[:id])
|
81
|
+
@achievement.destroy
|
82
|
+
|
83
|
+
respond_to do |format|
|
84
|
+
format.html { redirect_to(triumph_achievements_url) }
|
85
|
+
format.xml { head :ok }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Triumph
|
2
|
+
class Achievement < ActiveRecord::Base
|
3
|
+
|
4
|
+
unloadable
|
5
|
+
|
6
|
+
has_many :completed_achievements, :class_name => "Triumph::CompletedAchievement"
|
7
|
+
has_many :achievement_conditions, :class_name => "Triumph::AchievementCondition"
|
8
|
+
|
9
|
+
|
10
|
+
# This method is currently long, and I plan to refactor much of it tomorrow
|
11
|
+
# I plan to move much of the checking logic into the CompletedAchievement class
|
12
|
+
def self.check_achievements_for(object)
|
13
|
+
|
14
|
+
user = object.user
|
15
|
+
object_class = object.class.to_s.underscore.downcase
|
16
|
+
potential_achievements = Triumph::Achievement.where("observe_class = ?", object_class)
|
17
|
+
|
18
|
+
potential_achievements.each do |achievement|
|
19
|
+
total = user.send(object.class.to_s.pluralize.underscore.to_sym).count
|
20
|
+
if total >= achievement.quantity
|
21
|
+
condition_results = []
|
22
|
+
achievement.achievement_conditions.each do |condition|
|
23
|
+
condition.check(object)
|
24
|
+
end
|
25
|
+
user.grant_achievement(achievement) unless condition_results.include? false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Triumph
|
2
|
+
class AchievementCondition < ActiveRecord::Base
|
3
|
+
|
4
|
+
unloadable
|
5
|
+
|
6
|
+
belongs_to :achievement
|
7
|
+
|
8
|
+
def check(object)
|
9
|
+
user = object.user
|
10
|
+
object_class = object.class.to_s.underscore.downcase
|
11
|
+
objects = user.send(object.class.to_s.pluralize.underscore.to_sym)
|
12
|
+
|
13
|
+
unless objects.empty?
|
14
|
+
case objects.first.send(comparison_attribute)
|
15
|
+
when Integer
|
16
|
+
comparison_value = comparison_value.to_i
|
17
|
+
when Float
|
18
|
+
comparison_value = comparison_value.to_f
|
19
|
+
when TrueClass, FalseClass
|
20
|
+
comparison_value = comparison_value == "true" ? true : false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
valid_objects = objects.select{|o| o.send(comparison_attribute).
|
25
|
+
send(comparison_operator, comparison_value)}
|
26
|
+
num_valid_objects = valid_objects.count
|
27
|
+
if !num_valid_objects.send(total_operator.to_s, total_value)
|
28
|
+
false
|
29
|
+
end
|
30
|
+
true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<%= form_for(@achievement) do |f| %>
|
2
|
+
<% if @achievement.errors.any? %>
|
3
|
+
<div id="error_explanation">
|
4
|
+
<h2><%= pluralize(@achievement.errors.count, "error") %> prohibited this achievement from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% @achievement.errors.full_messages.each do |msg| %>
|
8
|
+
<li><%= msg %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div class="field">
|
15
|
+
<%= f.label :name %><br />
|
16
|
+
<%= f.text_field :name %>
|
17
|
+
</div>
|
18
|
+
<div class="field">
|
19
|
+
<%= f.label :description %><br />
|
20
|
+
<%= f.text_area :description %>
|
21
|
+
</div>
|
22
|
+
<div class="field">
|
23
|
+
<%= f.label :observe_class %><br />
|
24
|
+
<%= f.text_field :observe_class %>
|
25
|
+
</div>
|
26
|
+
<div class="field">
|
27
|
+
Grant this achievement when a user has more than
|
28
|
+
<%= f.text_field :quantity %> objects and
|
29
|
+
<br />
|
30
|
+
<%= select_tag "achievement_condition[total_operator]", options_for_select([["more than", ">"],["exactly", "=="],["less than", "<"]]) %>
|
31
|
+
<%= text_field_tag "achievement_condition[total_value]" %>
|
32
|
+
where <%= text_field_tag "achievement_condition[comparison_attribute]" %>
|
33
|
+
is
|
34
|
+
<%= select_tag "achievement_condition[comparison_operator]", options_for_select([["more than", ">"],["exactly", "=="],["less than", "<"]]) %>
|
35
|
+
<%= text_field_tag "achievement_condition[comparison_value]" %>
|
36
|
+
</div>
|
37
|
+
<div class="actions">
|
38
|
+
<%= f.submit %>
|
39
|
+
</div>
|
40
|
+
<% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<h1>Listing achievements</h1>
|
2
|
+
|
3
|
+
<table>
|
4
|
+
<tr>
|
5
|
+
<th>Name</th>
|
6
|
+
<th>Description</th>
|
7
|
+
<th>Observe class</th>
|
8
|
+
<th>Conditions</th>
|
9
|
+
<th>Quantity</th>
|
10
|
+
<th></th>
|
11
|
+
<th></th>
|
12
|
+
<th></th>
|
13
|
+
</tr>
|
14
|
+
|
15
|
+
<% @achievements.each do |achievement| %>
|
16
|
+
<tr>
|
17
|
+
<td><%= achievement.name %></td>
|
18
|
+
<td><%= achievement.description %></td>
|
19
|
+
<td><%= achievement.observe_class %></td>
|
20
|
+
<td><%= achievement.conditions %></td>
|
21
|
+
<td><%= achievement.quantity %></td>
|
22
|
+
<td><%= link_to 'Show', achievement %></td>
|
23
|
+
<td><%= link_to 'Edit', edit_triumph_achievement_path(achievement) %></td>
|
24
|
+
<td><%= link_to 'Destroy', achievement, :confirm => 'Are you sure?', :method => :delete %></td>
|
25
|
+
</tr>
|
26
|
+
<% end %>
|
27
|
+
</table>
|
28
|
+
|
29
|
+
<br />
|
30
|
+
|
31
|
+
<%= link_to 'New Achievement', new_triumph_achievement_path %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<p id="notice"><%= notice %></p>
|
2
|
+
|
3
|
+
<p>
|
4
|
+
<b>Name:</b>
|
5
|
+
<%= @achievement.name %>
|
6
|
+
</p>
|
7
|
+
|
8
|
+
<p>
|
9
|
+
<b>Description:</b>
|
10
|
+
<%= @achievement.description %>
|
11
|
+
</p>
|
12
|
+
|
13
|
+
<p>
|
14
|
+
<b>Observe class:</b>
|
15
|
+
<%= @achievement.observe_class %>
|
16
|
+
</p>
|
17
|
+
|
18
|
+
<p>
|
19
|
+
<b>Conditions:</b>
|
20
|
+
<%= @achievement.conditions %>
|
21
|
+
</p>
|
22
|
+
|
23
|
+
<p>
|
24
|
+
<b>Quantity:</b>
|
25
|
+
<%= @achievement.quantity %>
|
26
|
+
</p>
|
27
|
+
|
28
|
+
|
29
|
+
<%= link_to 'Edit', edit_triumph_achievement_path(@achievement) %> |
|
30
|
+
<%= link_to 'Back', triumph_achievements_path %>
|
data/config/routes.rb
ADDED
data/lib/{generators → rails/generators}/achievement_observer/achievement_observer_generator.rb
RENAMED
@@ -2,12 +2,11 @@ require 'rails/generators'
|
|
2
2
|
|
3
3
|
class AchievementObserverGenerator < Rails::Generators::Base
|
4
4
|
source_root File.expand_path('../templates', __FILE__)
|
5
|
-
|
5
|
+
|
6
6
|
argument :model_name, :type => :string, :description => "The name of the model to observe."
|
7
|
-
|
7
|
+
|
8
8
|
def generate
|
9
|
-
empty_directory "app/models"
|
10
|
-
template "achievement_observer.rb", "app/models
|
9
|
+
empty_directory "app/models/"
|
10
|
+
template "achievement_observer.rb", "app/models/#{model_name.underscore}_observer.rb"
|
11
11
|
end
|
12
|
-
|
13
12
|
end
|
data/lib/{generators → rails/generators}/achievement_observer/templates/achievement_observer.rb
RENAMED
File without changes
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
class TriumphGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
source_root File.expand_path('../templates', __FILE__)
|
6
|
+
|
7
|
+
def generate
|
8
|
+
copy_file "20110711040135_create_achievements.rb", "db/migrate/#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_create_achievements.rb"
|
9
|
+
copy_file "20110712025245_create_completed_achievements.rb", "db/migrate/#{(Time.now + 5.seconds).utc.strftime("%Y%m%d%H%M%S")}_create_completed_achievements.rb"
|
10
|
+
copy_file "20110712033351_create_achievement_conditions.rb", "db/migrate/#{(Time.now + 10.seconds).utc.strftime("%Y%m%d%H%M%S")}_create_achievement_conditions.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
# Every method that is declared below will be automatically executed when the generator is run
|
14
|
+
def copy_initializer_file
|
15
|
+
copy_file 'initializer.rb', 'config/initializers/triumph.rb'
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
end
|
data/lib/triumph.rb
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
1
|
+
module Triumph
|
2
|
+
|
3
|
+
require 'triumph/engine' if defined?(Rails)
|
4
|
+
require 'triumph/achievements'
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
# require File.dirname(__FILE__) + '/achievements'
|
9
|
+
# require File.dirname(__FILE__) + '/app/models/achievement'
|
10
|
+
# require File.dirname(__FILE__) + '/app/models/completed_achievement'
|
11
|
+
# require File.dirname(__FILE__) + '/app/controllers/achievements_controller'
|
12
|
+
# require File.dirname(__FILE__) + '/generators/triumph/triumph_generator'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Triumph
|
2
|
+
module Achievements
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.class_eval do
|
6
|
+
#for some reason, this is not adding the proper association to the users model
|
7
|
+
# when I do 'include Achievemnts', though everything else works as expected.
|
8
|
+
# For now, I'm manually adding the 'has_many :completed_achievements' to the user
|
9
|
+
# model in my sample app, but I need to figure this out.
|
10
|
+
has_many :completed_achievements, :class_name => 'Triumph::CompletedAchievement'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def grant_achievement(achievement)
|
15
|
+
unless self.has_achievement?(achievement)
|
16
|
+
CompletedAchievement.create!(:achievement_id => achievement.id, :user_id => self.id)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def has_achievement?(achievement)
|
21
|
+
CompletedAchievement.where("achievement_id = ? AND user_id = ?", achievement.id, self.id).count >= 1
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/triumph.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{triumph}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date = %q{2011-07-
|
11
|
+
s.authors = ["Adam Bray"]
|
12
|
+
s.date = %q{2011-07-28}
|
13
13
|
s.description = %q{Triumph makes it easy to add achievements to your app, even dynamically at runtime.}
|
14
14
|
s.email = %q{adam.bray@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -23,32 +23,36 @@ Gem::Specification.new do |s|
|
|
23
23
|
"README.rdoc",
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION",
|
26
|
-
"
|
27
|
-
"
|
28
|
-
"
|
29
|
-
"
|
30
|
-
"
|
31
|
-
"
|
32
|
-
"
|
33
|
-
"
|
34
|
-
"
|
35
|
-
"
|
36
|
-
"lib/
|
37
|
-
"lib/generators
|
38
|
-
"lib/generators/
|
39
|
-
"lib/generators/
|
40
|
-
"lib/generators/triumph
|
41
|
-
"lib/generators/triumph/
|
26
|
+
"app/controllers/triumph/achievements_controller.rb",
|
27
|
+
"app/models/triumph/achievement.rb",
|
28
|
+
"app/models/triumph/achievement_condition.rb",
|
29
|
+
"app/models/triumph/completed_achievement.rb",
|
30
|
+
"app/views/triumph/achievements/_form.html.erb",
|
31
|
+
"app/views/triumph/achievements/edit.html.erb",
|
32
|
+
"app/views/triumph/achievements/index.html.erb",
|
33
|
+
"app/views/triumph/achievements/new.html.erb",
|
34
|
+
"app/views/triumph/achievements/show.html.erb",
|
35
|
+
"config/routes.rb",
|
36
|
+
"lib/rails/generators/achievement_observer/achievement_observer_generator.rb",
|
37
|
+
"lib/rails/generators/achievement_observer/templates/achievement_observer.rb",
|
38
|
+
"lib/rails/generators/triumph/templates/20110711040135_create_achievements.rb",
|
39
|
+
"lib/rails/generators/triumph/templates/20110712025245_create_completed_achievements.rb",
|
40
|
+
"lib/rails/generators/triumph/templates/20110712033351_create_achievement_conditions.rb",
|
41
|
+
"lib/rails/generators/triumph/templates/initializer.rb",
|
42
|
+
"lib/rails/generators/triumph/triumph_generator.rb",
|
43
|
+
"lib/rails/railties/tasks.rake",
|
42
44
|
"lib/triumph.rb",
|
45
|
+
"lib/triumph/achievements.rb",
|
46
|
+
"lib/triumph/engine.rb",
|
43
47
|
"rails/init.rb",
|
44
48
|
"test/helper.rb",
|
45
49
|
"test/test_triumph.rb",
|
46
50
|
"triumph.gemspec"
|
47
51
|
]
|
48
52
|
s.homepage = %q{http://github.com/adambray/triumph}
|
49
|
-
s.licenses = [
|
50
|
-
s.require_paths = [
|
51
|
-
s.rubygems_version = %q{1.
|
53
|
+
s.licenses = ["MIT"]
|
54
|
+
s.require_paths = ["lib"]
|
55
|
+
s.rubygems_version = %q{1.6.2}
|
52
56
|
s.summary = %q{Trimuph helps you add achievements to your app}
|
53
57
|
|
54
58
|
if s.respond_to? :specification_version then
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: triumph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 19
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 4
|
10
|
-
version: 0.1.4
|
5
|
+
version: 0.2.0
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Adam Bray
|
@@ -15,128 +10,97 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date: 2011-07-
|
13
|
+
date: 2011-07-28 00:00:00 -04:00
|
14
|
+
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
21
|
-
|
17
|
+
name: rails
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
22
19
|
none: false
|
23
20
|
requirements:
|
24
21
|
- - ">="
|
25
22
|
- !ruby/object:Gem::Version
|
26
|
-
hash: 7
|
27
|
-
segments:
|
28
|
-
- 3
|
29
|
-
- 0
|
30
|
-
- 0
|
31
23
|
version: 3.0.0
|
32
24
|
type: :runtime
|
33
|
-
requirement: *id001
|
34
25
|
prerelease: false
|
35
|
-
|
26
|
+
version_requirements: *id001
|
36
27
|
- !ruby/object:Gem::Dependency
|
37
|
-
|
28
|
+
name: rails3-generators
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
30
|
none: false
|
39
31
|
requirements:
|
40
32
|
- - ">="
|
41
33
|
- !ruby/object:Gem::Version
|
42
|
-
hash: 3
|
43
|
-
segments:
|
44
|
-
- 0
|
45
34
|
version: "0"
|
46
35
|
type: :runtime
|
47
|
-
requirement: *id002
|
48
36
|
prerelease: false
|
49
|
-
|
37
|
+
version_requirements: *id002
|
50
38
|
- !ruby/object:Gem::Dependency
|
51
|
-
|
39
|
+
name: shoulda
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
41
|
none: false
|
53
42
|
requirements:
|
54
43
|
- - ">="
|
55
44
|
- !ruby/object:Gem::Version
|
56
|
-
hash: 3
|
57
|
-
segments:
|
58
|
-
- 0
|
59
45
|
version: "0"
|
60
46
|
type: :development
|
61
|
-
requirement: *id003
|
62
47
|
prerelease: false
|
63
|
-
|
48
|
+
version_requirements: *id003
|
64
49
|
- !ruby/object:Gem::Dependency
|
65
|
-
|
50
|
+
name: bundler
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
52
|
none: false
|
67
53
|
requirements:
|
68
54
|
- - ~>
|
69
55
|
- !ruby/object:Gem::Version
|
70
|
-
hash: 23
|
71
|
-
segments:
|
72
|
-
- 1
|
73
|
-
- 0
|
74
|
-
- 0
|
75
56
|
version: 1.0.0
|
76
57
|
type: :development
|
77
|
-
requirement: *id004
|
78
58
|
prerelease: false
|
79
|
-
|
59
|
+
version_requirements: *id004
|
80
60
|
- !ruby/object:Gem::Dependency
|
81
|
-
|
61
|
+
name: jeweler
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
82
63
|
none: false
|
83
64
|
requirements:
|
84
65
|
- - ~>
|
85
66
|
- !ruby/object:Gem::Version
|
86
|
-
hash: 7
|
87
|
-
segments:
|
88
|
-
- 1
|
89
|
-
- 6
|
90
|
-
- 4
|
91
67
|
version: 1.6.4
|
92
68
|
type: :development
|
93
|
-
requirement: *id005
|
94
69
|
prerelease: false
|
95
|
-
|
70
|
+
version_requirements: *id005
|
96
71
|
- !ruby/object:Gem::Dependency
|
97
|
-
|
72
|
+
name: rcov
|
73
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
98
74
|
none: false
|
99
75
|
requirements:
|
100
76
|
- - ">="
|
101
77
|
- !ruby/object:Gem::Version
|
102
|
-
hash: 3
|
103
|
-
segments:
|
104
|
-
- 0
|
105
78
|
version: "0"
|
106
79
|
type: :development
|
107
|
-
requirement: *id006
|
108
80
|
prerelease: false
|
109
|
-
|
81
|
+
version_requirements: *id006
|
110
82
|
- !ruby/object:Gem::Dependency
|
111
|
-
|
83
|
+
name: rdoc
|
84
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
112
85
|
none: false
|
113
86
|
requirements:
|
114
87
|
- - ">="
|
115
88
|
- !ruby/object:Gem::Version
|
116
|
-
hash: 3
|
117
|
-
segments:
|
118
|
-
- 0
|
119
89
|
version: "0"
|
120
90
|
type: :development
|
121
|
-
requirement: *id007
|
122
91
|
prerelease: false
|
123
|
-
|
92
|
+
version_requirements: *id007
|
124
93
|
- !ruby/object:Gem::Dependency
|
125
|
-
|
94
|
+
name: rails
|
95
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
126
96
|
none: false
|
127
97
|
requirements:
|
128
98
|
- - ">="
|
129
99
|
- !ruby/object:Gem::Version
|
130
|
-
hash: 7
|
131
|
-
segments:
|
132
|
-
- 3
|
133
|
-
- 0
|
134
|
-
- 0
|
135
100
|
version: 3.0.0
|
136
101
|
type: :development
|
137
|
-
requirement: *id008
|
138
102
|
prerelease: false
|
139
|
-
|
103
|
+
version_requirements: *id008
|
140
104
|
description: Triumph makes it easy to add achievements to your app, even dynamically at runtime.
|
141
105
|
email: adam.bray@gmail.com
|
142
106
|
executables: []
|
@@ -153,27 +117,32 @@ files:
|
|
153
117
|
- README.rdoc
|
154
118
|
- Rakefile
|
155
119
|
- VERSION
|
156
|
-
-
|
157
|
-
-
|
158
|
-
-
|
159
|
-
-
|
160
|
-
-
|
161
|
-
-
|
162
|
-
-
|
163
|
-
-
|
164
|
-
-
|
165
|
-
-
|
166
|
-
- lib/
|
167
|
-
- lib/generators
|
168
|
-
- lib/generators/
|
169
|
-
- lib/generators/
|
170
|
-
- lib/generators/triumph
|
171
|
-
- lib/generators/triumph/
|
120
|
+
- app/controllers/triumph/achievements_controller.rb
|
121
|
+
- app/models/triumph/achievement.rb
|
122
|
+
- app/models/triumph/achievement_condition.rb
|
123
|
+
- app/models/triumph/completed_achievement.rb
|
124
|
+
- app/views/triumph/achievements/_form.html.erb
|
125
|
+
- app/views/triumph/achievements/edit.html.erb
|
126
|
+
- app/views/triumph/achievements/index.html.erb
|
127
|
+
- app/views/triumph/achievements/new.html.erb
|
128
|
+
- app/views/triumph/achievements/show.html.erb
|
129
|
+
- config/routes.rb
|
130
|
+
- lib/rails/generators/achievement_observer/achievement_observer_generator.rb
|
131
|
+
- lib/rails/generators/achievement_observer/templates/achievement_observer.rb
|
132
|
+
- lib/rails/generators/triumph/templates/20110711040135_create_achievements.rb
|
133
|
+
- lib/rails/generators/triumph/templates/20110712025245_create_completed_achievements.rb
|
134
|
+
- lib/rails/generators/triumph/templates/20110712033351_create_achievement_conditions.rb
|
135
|
+
- lib/rails/generators/triumph/templates/initializer.rb
|
136
|
+
- lib/rails/generators/triumph/triumph_generator.rb
|
137
|
+
- lib/rails/railties/tasks.rake
|
172
138
|
- lib/triumph.rb
|
139
|
+
- lib/triumph/achievements.rb
|
140
|
+
- lib/triumph/engine.rb
|
173
141
|
- rails/init.rb
|
174
142
|
- test/helper.rb
|
175
143
|
- test/test_triumph.rb
|
176
144
|
- triumph.gemspec
|
145
|
+
has_rdoc: true
|
177
146
|
homepage: http://github.com/adambray/triumph
|
178
147
|
licenses:
|
179
148
|
- MIT
|
@@ -187,7 +156,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
187
156
|
requirements:
|
188
157
|
- - ">="
|
189
158
|
- !ruby/object:Gem::Version
|
190
|
-
hash:
|
159
|
+
hash: -1814513464805021718
|
191
160
|
segments:
|
192
161
|
- 0
|
193
162
|
version: "0"
|
@@ -196,14 +165,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
196
165
|
requirements:
|
197
166
|
- - ">="
|
198
167
|
- !ruby/object:Gem::Version
|
199
|
-
hash: 3
|
200
|
-
segments:
|
201
|
-
- 0
|
202
168
|
version: "0"
|
203
169
|
requirements: []
|
204
170
|
|
205
171
|
rubyforge_project:
|
206
|
-
rubygems_version: 1.
|
172
|
+
rubygems_version: 1.6.2
|
207
173
|
signing_key:
|
208
174
|
specification_version: 3
|
209
175
|
summary: Trimuph helps you add achievements to your app
|
data/lib/.DS_Store
DELETED
Binary file
|
data/lib/achievements.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Achievements
|
2
|
-
|
3
|
-
def self.included(base)
|
4
|
-
base.class_eval do
|
5
|
-
#for some reason, this is not adding the proper association to the users model
|
6
|
-
# when I do 'include Achievemnts', though everything else works as expected.
|
7
|
-
# For now, I'm manually adding the 'has_many :completed_achievements' to the user
|
8
|
-
# model in my sample app, but I need to figure this out.
|
9
|
-
has_many :completed_achievements
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def grant_achievement(achievement)
|
14
|
-
unless self.has_achievement?(achievement)
|
15
|
-
CompletedAchievement.create!(:achievement_id => achievement.id, :user_id => self.id)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def has_achievement?(achievement)
|
20
|
-
CompletedAchievement.where("achievement_id = ?", achievement.id).count >= 1
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
File without changes
|
@@ -1,19 +0,0 @@
|
|
1
|
-
class Achievement < ActiveRecord::Base
|
2
|
-
|
3
|
-
has_many :completed_achievements
|
4
|
-
|
5
|
-
def self.check_achievements_for(object)
|
6
|
-
|
7
|
-
user = object.user
|
8
|
-
object_class = object.class.to_s.underscore.downcase
|
9
|
-
potential_achievements = Achievement.where("observe_class = ?", object_class)
|
10
|
-
|
11
|
-
potential_achievements.each do |achievement|
|
12
|
-
total = user.send(object.class.to_s.pluralize.underscore.to_sym).where(achievement.conditions).count
|
13
|
-
if total >= achievement.quantity
|
14
|
-
user.grant_achievement(achievement)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
File without changes
|
File without changes
|
data/lib/db/.DS_Store
DELETED
Binary file
|
data/lib/generators/.DS_Store
DELETED
Binary file
|
Binary file
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'rails/generators'
|
2
|
-
|
3
|
-
class TriumphGenerator < Rails::Generators::Base
|
4
|
-
|
5
|
-
source_root File.expand_path('../../../../lib/db/migrate', __FILE__)
|
6
|
-
|
7
|
-
def generate
|
8
|
-
copy_file "20110711040135_create_achievements.rb", "db/migrate/#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_create_achievements.rb"
|
9
|
-
copy_file "20110712025245_create_completed_achievements.rb", "db/migrate/#{(Time.now + 1.minute).utc.strftime("%Y%m%d%H%M%S")}_create_completed_achievements.rb"
|
10
|
-
copy_file "20110712033351_create_achievement_conditions.rb", "db/migrate/#{(Time.now + 2.minutes).utc.strftime("%Y%m%d%H%M%S")}_create_achievement_conditions.rb"
|
11
|
-
end
|
12
|
-
end
|