gioco 1.0.1 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,15 +8,15 @@ module GeneratorInstructions
8
8
  Gioco successfully installed.
9
9
 
10
10
  Now you are able to add Badges using:
11
- rake gioco:add_badge[BADGE_NAME#{",POINTS" if options[:points]}#{",TYPE_NAME" if options[:types]},DEFAULT]
11
+ rake gioco:add_badge[BADGE_NAME#{",POINTS" if options[:points]}#{",KIND_NAME" if options[:kinds]},DEFAULT]
12
12
 
13
13
  To remove Badges using:
14
- rake gioco:remove_badge[BADGE_NAME#{",TYPE_NAME" if options[:types]}]
14
+ rake gioco:remove_badge[BADGE_NAME#{",KIND_NAME" if options[:kinds]}]
15
15
 
16
16
  #{
17
- if options[:types]
18
- "And to remove Types using:
19
- rake gioco:remove_type[TYPE_NAME]"
17
+ if options[:kinds]
18
+ "And to remove Kinds using:
19
+ rake gioco:remove_kind[KIND_NAME]"
20
20
  end
21
21
  }
22
22
 
@@ -1,10 +1,10 @@
1
1
  module ModelGenerator
2
2
  def generate_models
3
3
  generate("model", "level badge_id:integer #{@model_name}_id:integer")
4
- if options[:types]
5
- generate("model", "point user_id:integer type_id:integer value:integer")
6
- generate("model", "type name:string")
7
- generate("model", "badge name:string type_id:integer #{(options[:points]) ? "points:integer" : ""} default:boolean")
4
+ if options[:kinds]
5
+ generate("model", "point user_id:integer kind_id:integer value:integer")
6
+ generate("model", "kind name:string")
7
+ generate("model", "badge name:string kind_id:integer #{(options[:points]) ? "points:integer" : ""} default:boolean")
8
8
  else
9
9
  generate("migration", "add_points_to_#{@model_name.pluralize} points:integer") if options[:points]
10
10
  generate("model", "badge name:string #{(options[:points]) ? "points:integer" : ""} default:boolean")
@@ -13,7 +13,7 @@ module ModelGenerator
13
13
 
14
14
  def creating_templates
15
15
  @points = (options[:points] ) ? true : false
16
- @types = (options[:types] ) ? true : false
16
+ @kinds = (options[:kinds] ) ? true : false
17
17
  template "gioco.rb", "config/initializers/gioco.rb"
18
18
  end
19
19
 
@@ -34,19 +34,19 @@ module ModelGenerator
34
34
  add_relationship("level", @model_name, "belongs_to")
35
35
  add_relationship("level", "badge", "belongs_to")
36
36
 
37
- if options[:types]
37
+ if options[:kinds]
38
38
  add_relationship(@model_name, "points", "has_many")
39
- add_relationship("type", "points", "has_many")
40
- add_relationship("type", "badges", "has_many")
41
- add_relationship("badge", "type", "belongs_to")
39
+ add_relationship("kind", "points", "has_many")
40
+ add_relationship("kind", "badges", "has_many")
41
+ add_relationship("badge", "kind", "belongs_to")
42
42
  add_relationship("point", @model_name, "belongs_to")
43
- add_relationship("point", "type", "belongs_to")
43
+ add_relationship("point", "kind", "belongs_to")
44
44
  end
45
45
  end
46
46
 
47
47
  def add_validations
48
48
  add_validation("badge", "name", [["presence", "true"]])
49
- add_validation("type", "name", [["uniqueness", "true"], ["presence", "true"]]) if options[:types]
49
+ add_validation("kind", "name", [["uniqueness", "true"], ["presence", "true"]]) if options[:kinds]
50
50
  end
51
51
 
52
52
  private
@@ -7,19 +7,19 @@ namespace :gioco do
7
7
 
8
8
  desc "Used to add a new badge at Gioco scheme"
9
9
 
10
- task :add_badge, [:name, #{":points, " if options[:points]}#{":type, " if options[:types]}:default] => :environment do |t, args|
10
+ task :add_badge, [:name, #{":points, " if options[:points]}#{":kind, " if options[:kinds]}:default] => :environment do |t, args|
11
11
  arg_default = ( args.default ) ? eval(args.default) : false
12
12
 
13
13
 
14
- if !args.name #{"|| !args.points" if options[:points]}#{" || !args.type" if options[:types]}
14
+ if !args.name #{"|| !args.points" if options[:points]}#{" || !args.kind" if options[:kinds]}
15
15
  raise "There are missing some arguments"
16
16
  else
17
- badge_string = "#{options[:types] ? 'type = Type.find_or_create_by_name(\'#{args.type}\')\n' : ''}"
17
+ badge_string = "#{options[:kinds] ? 'kind = Kind.find_or_create_by(name: \'#{args.kind}\')\n' : ''}"
18
18
 
19
19
  badge_string = badge_string + "badge = Badge.create({
20
20
  :name => \'\#\{args.name\}\',
21
21
  #{":points => \'\#\{args.points\}\'," if options[:points]}
22
- #{":type_id => type.id," if options[:types]}
22
+ #{":kind_id => kind.id," if options[:kinds]}
23
23
  :default => \'\#\{arg_default\}\'
24
24
  })\n"
25
25
 
@@ -27,8 +27,8 @@ namespace :gioco do
27
27
  badge_string = badge_string + 'resources = #{@model_name.capitalize}.find(:all)\n'
28
28
  badge_string = badge_string + "resources.each do |r|
29
29
  #{
30
- if options[:points] && options[:types]
31
- "r.points << Point.create({ :type_id => type.id, :value => \'\#\{args.points\}\'})"
30
+ if options[:points] && options[:kinds]
31
+ "r.points << Point.create({ :kind_id => kinds.id, :value => \'\#\{args.points\}\'})"
32
32
  elsif options[:points]
33
33
  "r.points = \'\#\{args.points\}\'"
34
34
  end
@@ -42,7 +42,7 @@ namespace :gioco do
42
42
 
43
43
  eval badge_string
44
44
 
45
- file_path = "/db/gioco/create_badge_\#\{args.name\}#{"_\#\{args.type\}" if options[:types]}.rb"
45
+ file_path = "/db/gioco/create_badge_\#\{args.name\}#{"_\#\{args.kind\}" if options[:kinds]}.rb"
46
46
  File.open("\#\{Rails.root\}\#\{file_path\}", 'w') { |f| f.write badge_string }
47
47
  File.open("\#\{Rails.root\}/db/gioco/db.rb", 'a') { |f| f.write "require \\"\\#\\{Rails.root\\}\#\{file_path\}\\"\n" }
48
48
 
@@ -52,12 +52,12 @@ namespace :gioco do
52
52
 
53
53
  desc "Used to remove an old badge at Gioco scheme"
54
54
 
55
- task :remove_badge, [:name#{", :type" if options[:types]}] => :environment do |t, args|
56
- if !args.name#{" || !args.type" if options[:types]}
55
+ task :remove_badge, [:name#{", :kind" if options[:kinds]}] => :environment do |t, args|
56
+ if !args.name#{" || !args.kind" if options[:kinds]}
57
57
  raise "There are missing some arguments"
58
58
  else
59
- badge_string = "#{"type = Type.find_by_name('\#\{args.type\}')" if options[:types]}
60
- badge = Badge.where( :name => '\#\{args.name\}'#{", :type_id => type.id" if options[:types]} ).first
59
+ badge_string = "#{"kind = Kind.find_by_name('\#\{args.kind\}')" if options[:kinds]}
60
+ badge = Badge.where( :name => '\#\{args.name\}'#{", :kind_id => kind.id" if options[:kinds]} ).first
61
61
  badge.destroy\n"
62
62
  end
63
63
 
@@ -70,25 +70,25 @@ namespace :gioco do
70
70
  File.open("\#\{Rails.root\}/db/gioco/db.rb", 'a') { |f| f.write "require \\"\\#\\{Rails.root\\}\#\{file_path\}\\"\n" }
71
71
  end
72
72
  #{
73
- if options[:types]
73
+ if options[:kinds]
74
74
  '
75
- desc "Removes a given type"
76
- task :remove_type, [:name] => :environment do |t, args|
75
+ desc "Removes a given kind"
76
+ task :remove_kind, [:name] => :environment do |t, args|
77
77
  if !args.name
78
78
  raise "There are missing some arguments"
79
79
  else
80
- type_string = "type = Type.find_by_name( \'#{args.name}\' )\n"
81
- type_string = type_string + "if type.badges.empty?
82
- type.destroy
80
+ kind_string = "kind = Kind.find_by_name( \'#{args.name}\' )\n"
81
+ kind_string = kind_string + "if kind.badges.empty?
82
+ kind.destroy
83
83
  else
84
- raise \'Aborted! There are badges related with this type.\'
84
+ raise \'Aborted! There are badges related with this kind.\'
85
85
  end\n"
86
86
  end
87
- type_string = type_string + "puts \'> Type successfully removed\'"
88
- eval type_string
87
+ kind_string = kind_string + "puts \'> Kind successfully removed\'"
88
+ eval kind_string
89
89
 
90
- file_path = "/db/gioco/remove_type_#{args.name}.rb"
91
- File.open("#{Rails.root}#{file_path}", "w") { |f| f.write type_string }
90
+ file_path = "/db/gioco/remove_kind_#{args.name}.rb"
91
+ File.open("#{Rails.root}#{file_path}", "w") { |f| f.write kind_string }
92
92
  File.open("#{Rails.root}/db/gioco/db.rb", "a") { |f| f.write "require \\"\\#\\{Rails.root\\}#{file_path}\\"\n" }
93
93
  end
94
94
  '
@@ -13,8 +13,8 @@ class Gioco
13
13
  source_root File.expand_path("../../templates", __FILE__)
14
14
 
15
15
  desc "Setup Gioco for some resource"
16
- class_option :points, :type => :boolean, :default => false, :desc => "Setup gioco with points-system based"
17
- class_option :types, :type => :boolean, :default => false, :desc => "Setup gioco with multiples types(categories) of badges."
16
+ class_option :points, :kind => :boolean, :default => false, :desc => "Setup gioco with points-system based"
17
+ class_option :kinds, :kind => :boolean, :default => false, :desc => "Setup gioco with multiples kinds(categories) of badges."
18
18
 
19
19
 
20
20
  def execute
@@ -2,8 +2,8 @@ def add(resource_id)
2
2
  resource = Gioco::Core.get_resource(resource_id)
3
3
 
4
4
  if Gioco::Core::POINTS && !resource.badges.include?(self)
5
- if Gioco::Core::TYPES
6
- Gioco::Core.sync_resource_by_points(resource, self.points, self.type)
5
+ if Gioco::Core::KINDS
6
+ Gioco::Core.sync_resource_by_points(resource, self.points, self.kind)
7
7
  else
8
8
  Gioco::Core.sync_resource_by_points(resource, self.points)
9
9
  end
@@ -17,10 +17,10 @@ def remove(resource_id)
17
17
  resource = Gioco::Core.get_resource(resource_id)
18
18
 
19
19
  if Gioco::Core::POINTS && resource.badges.include?(self)
20
- if Gioco::Core::TYPES
21
- type = self.type
22
- badges_gap = Badge.where( "points < #{self.points} AND type_id = #{type.id}" ).order('points DESC')[0]
23
- Gioco::Core.sync_resource_by_points( resource, ( badges_gap.nil? ) ? 0 : badges_gap.points, type)
20
+ if Gioco::Core::KINDS
21
+ kind = self.kind
22
+ badges_gap = Badge.where( "points < #{self.points} AND kind_id = #{kind.id}" ).order('points DESC')[0]
23
+ Gioco::Core.sync_resource_by_points( resource, ( badges_gap.nil? ) ? 0 : badges_gap.points, kind)
24
24
  else
25
25
  badges_gap = Badge.where( "points < #{self.points}" ).order('points DESC')[0]
26
26
  Gioco::Core.sync_resource_by_points( resource, ( badges_gap.nil? ) ? 0 : badges_gap.points)
@@ -1,3 +1,3 @@
1
1
  Gioco::Core::RESOURCE_NAME = "<%= @model_name %>"
2
2
  Gioco::Core::POINTS = <%= @points %>
3
- Gioco::Core::TYPES = <%= @types %>
3
+ Gioco::Core::KINDS = <%= @kinds %>
@@ -1,29 +1,28 @@
1
1
  def change_points(options)
2
- if Gioco::Core::TYPES
3
- type_id = options[:type]
4
- points = options[:points]
2
+ if Gioco::Core::KINDS
3
+ points = options[:points]
4
+ kind = Kind.find(options[:kind])
5
5
  else
6
- points = options
6
+ points = options
7
+ kind = false
7
8
  end
8
- type = (type_id) ? Type.find(type_id) : false
9
9
 
10
- if Gioco::Core::TYPES
11
- raise "Missing Type Identifier argument" if !type_id
12
- old_pontuation = self.points.where(:type_id => type_id).sum(:value)
10
+ if Gioco::Core::KINDS
11
+ raise "Missing Kind Identifier argument" if !kind
12
+ old_pontuation = self.points.where(:kind_id => kind.id).sum(:value)
13
13
  else
14
- old_pontuation = self.points.to_i
14
+ old_pontuation = self.points.to_i
15
15
  end
16
- new_pontuation = old_pontuation + points
17
- Gioco::Core.sync_resource_by_points(self, new_pontuation, type)
16
+ new_pontuation = old_pontuation + points
17
+ Gioco::Core.sync_resource_by_points(self, new_pontuation, kind)
18
18
  end
19
19
 
20
- def next_badge?(type_id = false)
21
- type = (type_id) ? Type.find(type_id) : false
22
- if Gioco::Core::TYPES
23
- raise "Missing Type Identifier argument" if !type_id
24
- old_pontuation = self.points.where(:type_id => type_id).sum(:value)
20
+ def next_badge?(kind_id = false)
21
+ if Gioco::Core::KINDS
22
+ raise "Missing Kind Identifier argument" if !kind_id
23
+ old_pontuation = self.points.where(:kind_id => kind_id).sum(:value)
25
24
  else
26
- old_pontuation = self.points.to_i
25
+ old_pontuation = self.points.to_i
27
26
  end
28
27
  next_badge = Badge.where("points > #{old_pontuation}").order("points ASC").first
29
28
  last_badge_point = self.badges.last.try('points')
@@ -32,7 +31,7 @@ def next_badge?(type_id = false)
32
31
  if next_badge
33
32
  percentage = (old_pontuation - last_badge_point)*100/(next_badge.points - last_badge_point)
34
33
  points = next_badge.points - old_pontuation
35
- next_badge_info = {
34
+ next_badge_info = {
36
35
  :badge => next_badge,
37
36
  :points => points,
38
37
  :percentage => percentage
@@ -4,28 +4,36 @@ class Gioco
4
4
  RESOURCE_NAME.capitalize.constantize.find(rid)
5
5
  end
6
6
 
7
- def self.sync_resource_by_points(resource, points, type = false)
8
-
9
- badges = {}
10
- if TYPES && type
11
- old_pontuation = resource.points.where(:type_id => type.id).sum(:value)
12
- related_badges = Badge.where(((old_pontuation < points) ? "points <= #{points}" : "points > #{points} AND points <= #{old_pontuation}") + " AND type_id = #{type.id}")
7
+ def self.related_info(resource, points, kind)
8
+ if KINDS && kind
9
+ old_pontuation = resource.points.where(:kind_id => kind.id).sum(:value)
10
+ related_badges = Badge.where(((old_pontuation < points) ? "points <= #{points}" : "points > #{points} AND points <= #{old_pontuation}") + " AND kind_id = #{kind.id}")
13
11
  else
14
12
  old_pontuation = resource.points.to_i
15
13
  related_badges = Badge.where((old_pontuation < points) ? "points <= #{points}" : "points > #{points} AND points <= #{old_pontuation}")
16
14
  end
17
-
18
15
  new_pontuation = ( old_pontuation < points ) ? points - old_pontuation : - (old_pontuation - points)
19
16
 
17
+ { old_pontuation: old_pontuation, related_badges: related_badges, new_pontuation: new_pontuation }
18
+ end
19
+
20
+ def self.sync_resource_by_points(resource, points, kind = false)
21
+
22
+ badges = {}
23
+ info = self.related_info(resource, points, kind)
24
+ old_pontuation = info[:old_pontuation]
25
+ related_badges = info[:related_badges]
26
+ new_pontuation = info[:new_pontuation]
27
+
20
28
  Badge.transaction do
21
- if TYPES && type
22
- resource.points << Point.create({ :type_id => type.id, :value => new_pontuation })
29
+ if KINDS && kind
30
+ resource.points << Point.create({ :kind_id => kind.id, :value => new_pontuation })
23
31
  elsif POINTS
24
32
  resource.update_attribute( :points, points )
25
33
  end
26
34
  related_badges.each do |badge|
27
35
  if old_pontuation < points
28
- if !resource.badges.include?(badge)
36
+ unless resource.badges.include?(badge)
29
37
  resource.badges << badge
30
38
  badges[:added] = [] if badges[:added].nil?
31
39
  badges[:added] << badge
@@ -39,6 +47,5 @@ class Gioco
39
47
  badges
40
48
  end
41
49
  end
42
-
43
50
  end
44
51
  end
@@ -1,36 +1,40 @@
1
1
  class Gioco
2
2
  class Ranking < Core
3
3
 
4
- def self.generate
4
+ def self.with_kind_and_points
5
5
  ranking = []
6
-
7
- if POINTS && TYPES
8
- Type.find(:all).each do |t|
9
- data = RESOURCE_NAME.capitalize.constantize
10
- .select("#{RESOURCE_NAME.capitalize.constantize.table_name}.*,
11
- points.type_id, SUM(points.value) AS type_points")
12
- .where("points.type_id = #{t.id}")
13
- .joins(:points)
14
- .group("type_id, #{RESOURCE_NAME}_id")
15
- .order("type_points DESC")
6
+ Kind.all.each do |t|
7
+ data = RESOURCE_NAME.capitalize.constantize
8
+ .select("#{RESOURCE_NAME.capitalize.constantize.table_name}.*,
9
+ points.kind_id, SUM(points.value) AS kind_points")
10
+ .where("points.kind_id = #{t.id}")
11
+ .joins(:points)
12
+ .group("kind_id, #{RESOURCE_NAME}_id")
13
+ .order("kind_points DESC")
16
14
 
17
- ranking << { :type => t, :ranking => data }
18
-
19
- end
20
-
21
- elsif POINTS && !TYPES
22
- ranking = RESOURCE_NAME.capitalize.constantize.order("points DESC")
15
+ ranking << { :kind => t, :ranking => data }
16
+ end
17
+ ranking
18
+ end
23
19
 
24
- elsif !POINTS && !TYPES
25
- ranking = RESOURCE_NAME.capitalize.constantize
26
- .select("#{RESOURCE_NAME.capitalize.constantize.table_name}.*,
27
- COUNT(levels.badge_id) AS number_of_levels")
28
- .joins(:levels)
29
- .group("#{RESOURCE_NAME}_id")
30
- .order("number_of_levels DESC")
20
+ def self.without_kind_and_points
21
+ ranking = RESOURCE_NAME.capitalize.constantize
22
+ .select("#{RESOURCE_NAME.capitalize.constantize.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")
27
+ end
31
28
 
29
+ def self.generate
30
+ ranking = []
31
+ if POINTS && KINDS
32
+ ranking = self.with_kind_and_points
33
+ elsif POINTS && !KINDS
34
+ ranking = RESOURCE_NAME.capitalize.constantize.order("points DESC")
35
+ elsif !POINTS && !KINDS
36
+ ranking = without_kind_and_points
32
37
  end
33
-
34
38
  ranking
35
39
  end
36
40
  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: 1.0.1
4
+ version: 1.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-15 00:00:00.000000000Z
12
+ date: 2013-09-13 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Gioco is a easy to implement gamification gem based on plug and play
15
15
  concept. Doesn't matter if you already have a full and functional database, Gioco
@@ -51,7 +51,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
51
51
  version: '0'
52
52
  requirements: []
53
53
  rubyforge_project:
54
- rubygems_version: 1.8.18
54
+ rubygems_version: 1.8.15
55
55
  signing_key:
56
56
  specification_version: 3
57
57
  summary: A gamification gem to Ruby on Rails applications.