gioco 0.1.0 → 0.1.7
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/lib/generators/gioco/setup_generator.rb +98 -96
- data/lib/generators/templates/gioco.rb +2 -2
- data/lib/gioco.rb +88 -44
- metadata +34 -2
@@ -1,130 +1,132 @@
|
|
1
1
|
module Gioco
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
3
|
+
class SetupGenerator < Rails::Generators::NamedBase
|
4
|
+
source_root File.expand_path("../../templates", __FILE__)
|
5
|
+
|
6
|
+
desc "Setup Gioco for some resource"
|
7
|
+
class_option :points, :type => :boolean, :default => false, :desc => "Setup gioco with points-system based"
|
8
|
+
|
9
|
+
def generate_models
|
10
|
+
generate("model", "badge name:string #{(options[:points]) ? "points:integer" : ""} default:boolean")
|
11
|
+
generate("model", "level badge_id:integer #{file_name}_id:integer")
|
12
|
+
generate("migration", "add_points_to_#{file_name.pluralize} points:integer") if options[:points]
|
13
|
+
end
|
14
|
+
|
15
|
+
def creating_templates
|
16
|
+
@points = ( options[:points] ) ? true : false
|
17
|
+
template "gioco.rb", "config/initializers/gioco.rb"
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup_relations
|
21
|
+
add_relationship( "badge", "levels", "has_many", false, "destroy" )
|
22
|
+
add_relationship( "badge", file_name.pluralize, "has_many", "levels" )
|
23
|
+
|
24
|
+
add_relationship( file_name, "levels", "has_many" )
|
25
|
+
add_relationship( file_name, "badges", "has_many", "levels" )
|
26
|
+
|
27
|
+
add_relationship( "level", file_name, "belongs_to" )
|
28
|
+
add_relationship( "level", "badge", "belongs_to" )
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_rakes
|
32
|
+
rakefile("gioco.rake") do
|
33
|
+
<<-EOS
|
34
34
|
# -*- encoding: utf-8 -*-
|
35
35
|
namespace :gioco do
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
36
|
+
|
37
|
+
desc "Used to add a new badge at Gioco scheme"
|
38
|
+
|
39
|
+
task :add_badge, [:name, #{(options[:points]) ? ":points, " : ""}:default] => :environment do |t, args|
|
40
|
+
args.default = ( args.default ) ? eval(args.default) : false
|
41
|
+
|
42
|
+
if !args.name #{(options[:points]) ? "&& !args.points" : ""}
|
43
|
+
puts "There are missing some arguments"
|
44
|
+
|
45
|
+
else
|
46
|
+
badge = Badge.create({
|
47
|
+
:name => args.name,
|
48
|
+
#{(options[:points]) ? ":points => args.points," : ""}
|
49
|
+
:default => args.default
|
50
|
+
})
|
51
|
+
|
52
|
+
if args.default
|
53
|
+
resources = #{file_name.capitalize}.find(:all)
|
54
|
+
resources.each do |r|
|
55
|
+
#{(options[:points]) ? "r.points = args.points" : ""}
|
56
|
+
r.badges << badge
|
57
|
+
r.save
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
desc "Used to remove an old badge at Gioco scheme"
|
66
|
+
|
67
|
+
task :remove_badge, [:name] => :environment do |t, args|
|
68
|
+
|
69
|
+
if !args.name
|
70
|
+
puts "There are missing some arguments"
|
71
|
+
|
72
|
+
else
|
73
|
+
badge = Badge.find_by_name( args.name )
|
74
|
+
badge.destroy
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
76
78
|
|
77
79
|
end
|
78
|
-
|
79
|
-
|
80
|
-
|
80
|
+
EOS
|
81
|
+
end
|
82
|
+
end
|
81
83
|
|
82
|
-
|
83
|
-
|
84
|
+
def migrating
|
85
|
+
puts <<-EOS
|
84
86
|
|
85
87
|
=======================================
|
86
88
|
> Now is time to run rake db:migrate
|
87
89
|
=======================================
|
88
90
|
|
89
|
-
|
90
|
-
|
91
|
-
|
91
|
+
EOS
|
92
|
+
rake("db:migrate")
|
93
|
+
end
|
92
94
|
|
93
|
-
|
94
|
-
|
95
|
+
def instructions
|
96
|
+
puts <<-EOS
|
95
97
|
|
96
98
|
=======================================================
|
97
99
|
|
98
100
|
Gioco successfully installed.
|
99
101
|
|
100
102
|
Now you are able to add Badges using:
|
101
|
-
|
103
|
+
rake gioco:add_badge[BADGE_NAME,POINTS,DEFAULT]
|
102
104
|
|
103
105
|
If you installed gioco without points option:
|
104
|
-
|
106
|
+
rake gioco:add_badge[BADGE_NAME,DEFAULT]
|
105
107
|
|
106
108
|
And to remove Badges using:
|
107
|
-
|
109
|
+
rake gioco:remove_badge[BADGE_NAME]
|
108
110
|
|
109
111
|
For usage and more infomation go to the documentation:
|
110
112
|
http://joaomdmoura.github.com/gioco/
|
111
113
|
|
112
114
|
=======================================================
|
113
115
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
116
|
+
EOS
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
118
120
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
121
|
+
def add_relationship ( model, related, relation, through = false, dependent = false )
|
122
|
+
gsub_file "app/models/#{model}.rb", get_class_header(model), "#{get_class_header(model)}
|
123
|
+
#{relation} :#{related} #{(through) ? ", :through => :#{through}" : ""} #{(dependent) ? ", :dependent => :#{dependent}" : ""}"
|
124
|
+
end
|
123
125
|
|
124
|
-
|
125
|
-
|
126
|
-
|
126
|
+
def get_class_header ( model_name )
|
127
|
+
"class #{model_name.capitalize} < ActiveRecord::Base"
|
128
|
+
end
|
127
129
|
|
128
|
-
|
130
|
+
end
|
129
131
|
|
130
132
|
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
Gioco::
|
2
|
-
Gioco::
|
1
|
+
Gioco::Core::RESOURCE_NAME = "<%= file_name %>"
|
2
|
+
Gioco::Core::POINTS = <%= @points %>
|
data/lib/gioco.rb
CHANGED
@@ -1,68 +1,112 @@
|
|
1
1
|
module Gioco
|
2
2
|
|
3
|
-
|
3
|
+
class Core
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
def self.get_resource( rid )
|
6
|
+
eval(RESOURCE_NAME.capitalize).find( rid )
|
7
|
+
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
def self.get_badge( bid )
|
10
|
+
Badge.find( bid )
|
11
|
+
end
|
12
12
|
|
13
|
-
|
14
|
-
Level.where( "#{Gioco::Resources::NAME}_id = #{rid} AND badge_id = #{bid}" )[0]
|
15
|
-
end
|
13
|
+
def self.ranking
|
16
14
|
|
17
|
-
|
15
|
+
if POINTS
|
18
16
|
|
19
|
-
|
17
|
+
eval(RESOURCE_NAME.capitalize).order( "points DESC" )
|
20
18
|
|
21
|
-
|
22
|
-
resource = get_resource( rid ) if !resource
|
23
|
-
new_pontuation = resource.points.to_i + points
|
24
|
-
old_pontuation = resource.points.to_i
|
25
|
-
status = nil
|
19
|
+
else
|
26
20
|
|
27
|
-
|
21
|
+
eval(RESOURCE_NAME.capitalize).all(
|
22
|
+
:select => "#{eval(RESOURCE_NAME.capitalize).table_name}.*,
|
23
|
+
COUNT(levels.badge_id) AS number_of_levels",
|
24
|
+
:joins => :levels,
|
25
|
+
:group => "#{RESOURCE_NAME}_id",
|
26
|
+
:order => "number_of_levels DESC")
|
28
27
|
|
29
|
-
|
28
|
+
end
|
30
29
|
|
31
|
-
|
30
|
+
end
|
32
31
|
|
33
|
-
|
34
|
-
Badges.add( nil, nil, resource, badge )
|
35
|
-
end
|
36
|
-
|
37
|
-
else
|
32
|
+
def self.sync_resource_by_points( resource, points )
|
38
33
|
|
39
|
-
|
34
|
+
old_pontuation = resource.points.to_i
|
40
35
|
|
41
|
-
|
42
|
-
Badges.remove( resource.id, badge.id )
|
43
|
-
end
|
36
|
+
related_badges = Badge.where( ( old_pontuation < points ) ? "points <= #{points}" : "points > #{points} AND points <= #{old_pontuation}" )
|
44
37
|
|
45
|
-
|
38
|
+
Badge.transaction do
|
46
39
|
|
47
|
-
|
40
|
+
resource.update_attributes( {:points => points } )
|
48
41
|
|
49
|
-
|
42
|
+
related_badges.each do |badge|
|
50
43
|
|
51
|
-
|
44
|
+
if old_pontuation < points
|
52
45
|
|
53
|
-
|
54
|
-
resource = get_resource( rid ) if !resource
|
55
|
-
badge = get_badge( badge_id ) if !badge
|
46
|
+
resource.badges << badge if !resource.badges.include?(badge)
|
56
47
|
|
57
|
-
|
58
|
-
resource.badges << badge if !resource.badges.include?(badge)
|
59
|
-
end
|
48
|
+
elsif old_pontuation > points
|
60
49
|
|
61
|
-
|
62
|
-
level = get_level( rid, badge_id )
|
63
|
-
level.destroy
|
64
|
-
end
|
50
|
+
resource.levels.where( :badge_id => badge.id )[0].destroy
|
65
51
|
|
66
|
-
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
class Resources < Core
|
63
|
+
|
64
|
+
def self.change_points( rid, points, resource = false )
|
65
|
+
|
66
|
+
resource = get_resource( rid ) if !resource
|
67
|
+
new_pontuation = resource.points.to_i + points
|
68
|
+
|
69
|
+
sync_resource_by_points( resource, new_pontuation )
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
class Badges < Core
|
76
|
+
|
77
|
+
def self.add( rid, badge_id, resource = false, badge = false )
|
78
|
+
resource = get_resource( rid ) if !resource
|
79
|
+
badge = get_badge( badge_id ) if !badge
|
80
|
+
|
81
|
+
if POINTS && !resource.badges.include?(badge)
|
82
|
+
|
83
|
+
sync_resource_by_points( resource, badge.points )
|
84
|
+
|
85
|
+
elsif !resource.badges.include?(badge)
|
86
|
+
|
87
|
+
resource.badges << badge
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.remove( rid, badge_id, resource = false, badge = false )
|
94
|
+
|
95
|
+
resource = get_resource( rid ) if !resource
|
96
|
+
badge = get_badge( badge_id ) if !badge
|
97
|
+
|
98
|
+
if POINTS && resource.badges.include?(badge)
|
99
|
+
|
100
|
+
sync_resource_by_points( resource, Badge.where( "points < #{badge.points}" )[0].points )
|
101
|
+
|
102
|
+
elsif resource.badges.include?(badge)
|
103
|
+
|
104
|
+
resource.levels.where( :badge_id => badge.id )[0].destroy
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
67
111
|
|
68
112
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gioco
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,39 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
date: 2012-04-25 00:00:00.000000000Z
|
13
|
-
dependencies:
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.0.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activerecord
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 3.0.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.0.0
|
14
46
|
description: Gioco is a easy to implement gamification gem based on plug and play
|
15
47
|
concept.Doesn't matter if you already have a full and functional database, Gioco
|
16
48
|
will smoothly integrateeverything and provide all methods that you might need.
|