adhonorem 1.0.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.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +6 -0
  4. data/Rakefile +30 -0
  5. data/app/assets/javascripts/adhonorem/application.js +13 -0
  6. data/app/assets/stylesheets/adhonorem/application.css +15 -0
  7. data/app/controllers/adhonorem/application_controller.rb +5 -0
  8. data/app/views/layouts/adhonorem/application.html.erb +14 -0
  9. data/config/routes.rb +2 -0
  10. data/lib/adhonorem/engine.rb +5 -0
  11. data/lib/adhonorem/exceptions.rb +6 -0
  12. data/lib/adhonorem/generators/adhonorem_generator.rb +21 -0
  13. data/lib/adhonorem/generators/templates/achievement_migration.rb +14 -0
  14. data/lib/adhonorem/generators/templates/initializer.rb +3 -0
  15. data/lib/adhonorem/generators/templates/progress_migration.rb +11 -0
  16. data/lib/adhonorem/models/achievement.rb +10 -0
  17. data/lib/adhonorem/models/badge.rb +240 -0
  18. data/lib/adhonorem/models/configuration.rb +10 -0
  19. data/lib/adhonorem/models/objective.rb +14 -0
  20. data/lib/adhonorem/models/progress.rb +48 -0
  21. data/lib/adhonorem/railtie.rb +12 -0
  22. data/lib/adhonorem/version.rb +3 -0
  23. data/lib/adhonorem.rb +32 -0
  24. data/lib/tasks/adhonorem_tasks.rake +4 -0
  25. data/spec/adhonorem_spec.rb +5 -0
  26. data/spec/helpers/badge_instantiator.rb +14 -0
  27. data/spec/helpers/migration_has_been_run.rb +28 -0
  28. data/spec/models/badge_spec.rb +63 -0
  29. data/spec/models/badge_trigger_spec.rb +53 -0
  30. data/spec/models/meta_badge_spec.rb +44 -0
  31. data/spec/rails_helper.rb +15 -0
  32. data/spec/spec_helper.rb +23 -0
  33. data/spec/test_app/app/controllers/application_controller.rb +5 -0
  34. data/spec/test_app/app/helpers/application_helper.rb +2 -0
  35. data/spec/test_app/app/models/badges/conditionnal_badge.rb +20 -0
  36. data/spec/test_app/app/models/badges/legacy_badge.rb +20 -0
  37. data/spec/test_app/app/models/badges/meta_badge.rb +19 -0
  38. data/spec/test_app/app/models/badges/meta_children/sub_badge_one.rb +20 -0
  39. data/spec/test_app/app/models/badges/meta_children/sub_badge_two.rb +20 -0
  40. data/spec/test_app/app/models/badges/normal_badge.rb +20 -0
  41. data/spec/test_app/app/models/badges/parametered_badge.rb +33 -0
  42. data/spec/test_app/app/models/badges/two_objectives_badge.rb +25 -0
  43. data/spec/test_app/app/models/user.rb +2 -0
  44. data/spec/test_app/config/application.rb +16 -0
  45. data/spec/test_app/config/boot.rb +5 -0
  46. data/spec/test_app/config/environment.rb +5 -0
  47. data/spec/test_app/config/environments/development.rb +20 -0
  48. data/spec/test_app/config/environments/production.rb +25 -0
  49. data/spec/test_app/config/environments/test.rb +21 -0
  50. data/spec/test_app/config/initializers/adhonorem.rb +3 -0
  51. data/spec/test_app/config/initializers/assets.rb +1 -0
  52. data/spec/test_app/config/initializers/backtrace_silencers.rb +0 -0
  53. data/spec/test_app/config/initializers/cookies_serializer.rb +3 -0
  54. data/spec/test_app/config/initializers/filter_parameter_logging.rb +4 -0
  55. data/spec/test_app/config/initializers/inflections.rb +16 -0
  56. data/spec/test_app/config/initializers/mime_types.rb +4 -0
  57. data/spec/test_app/config/initializers/session_store.rb +3 -0
  58. data/spec/test_app/config/initializers/wrap_parameters.rb +3 -0
  59. data/spec/test_app/config/routes.rb +3 -0
  60. data/spec/test_app/db/migrate/20170103065319_create_users.rb +10 -0
  61. data/spec/test_app/db/migrate/20170103065400_create_adhonorem_progress.rb +10 -0
  62. data/spec/test_app/db/migrate/20170103065401_create_adhonorem_achievement.rb +12 -0
  63. data/spec/test_app/db/schema.rb +39 -0
  64. metadata +271 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9f326114945fed6499e4985c361ccea8375f8116
4
+ data.tar.gz: c2b90be5a62154750813b7d03fad2406040ad3bd
5
+ SHA512:
6
+ metadata.gz: 685fc34c29a634a9685728168c89344d63f6bf88b555f78fcdbea9460183ca1fb190e33096c76fa5800ca79dd209a647f526ce85d8b7b63ca7e8118e6085b079
7
+ data.tar.gz: d6e57fceb122c8e2557ce35b8c4bc5b32bcfa8897c0102f3b792d2bd252c95e071ed58add556b46cb3211df585612902bedccb64d79be84577e91a6bab080c80
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2016 Hugo Chevalier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,6 @@
1
+ = AdHonorem
2
+
3
+ 1. Ensure you have a User model (name as you want)
4
+ 2. rails g adhonorem:initializer
5
+ 2. rails g adhonorem:migrations
6
+ 3. rake db:migrate
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'StaticRecord'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path('../spec/test_app/Rakefile', __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ load 'rails/tasks/statistics.rake'
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake'
25
+ require 'rspec/core/rake_task'
26
+
27
+ RSpec::Core::RakeTask.new(:spec) do |t|
28
+ t.pattern = Dir.glob('../spec/**/*_spec.rb')
29
+ end
30
+ task default: :spec
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,5 @@
1
+ module AdHonorem
2
+ class ApplicationController < ActionController::Base # :nodoc:
3
+ protect_from_forgery with: :exception
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>AdHonorem</title>
5
+ <%= stylesheet_link_tag "adhonorem/application", media: "all" %>
6
+ <%= javascript_include_tag "adhonorem/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ AdHonorem::Engine.routes.draw do
2
+ end
@@ -0,0 +1,5 @@
1
+ module AdHonorem
2
+ class Engine < ::Rails::Engine # :nodoc:
3
+ isolate_namespace AdHonorem
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module AdHonorem
2
+ class NoContext < RuntimeError; end
3
+ class ObjectiveNotFound < RuntimeError; end
4
+ class NotSuchProgressType < RuntimeError; end
5
+ class NotCompleted < RuntimeError; end
6
+ end
@@ -0,0 +1,21 @@
1
+ module Adhonorem
2
+ class MigrationsGenerator < Rails::Generators::Base # :nodoc:
3
+ source_root File.expand_path('../templates', __FILE__)
4
+
5
+ def copy_files
6
+ time = Time.zone.now.strftime('%Y%m%d%H%M')
7
+ template 'progress_migration.rb', "db/migrate/#{time}00_create_adhonorem_progress.rb"
8
+ template 'achievement_migration.rb', "db/migrate/#{time}01_create_adhonorem_achievement.rb"
9
+ end
10
+ end
11
+
12
+ class InitializerGenerator < Rails::Generators::Base # :nodoc:
13
+ source_root File.expand_path('../templates', __FILE__)
14
+
15
+ def copy_files
16
+ @model_name = ask('How is your user model called? [User]')
17
+ @model_name = 'User' if @model_name.blank?
18
+ template 'initializer.rb', 'config/initializers/adhonorem.rb', @model_name
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ # AdHonorem::Achievement will let you know easily wich badges
2
+ # have been unlocked by a user and when
3
+ class CreateAdhonoremAchievement < ActiveRecord::Migration
4
+ def change
5
+ create_table :adhonorem_achievements do |t|
6
+ t.integer :user_id
7
+ t.integer :state, default: 0
8
+ t.datetime :unlocked_at
9
+
10
+ t.timestamps null: false
11
+ end
12
+ bind_static_record :adhonorem_achievements, :badge
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ AdHonorem.configure do |config|
2
+ config.user_class = '<%= @model_name %>'
3
+ end
@@ -0,0 +1,11 @@
1
+ # AdHonorem::Progress will save the progress of your users for every badge
2
+ class CreateAdhonoremProgress < ActiveRecord::Migration
3
+ def change
4
+ create_table :adhonorem_progresses do |t|
5
+ t.integer :user_id
6
+ t.string :objective_slug
7
+ t.integer :numeric_progress, default: 0
8
+ end
9
+ bind_static_record :adhonorem_progresses, :badge
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ module AdHonorem
2
+ # Allows to get finished badges per user
3
+ class Achievement < ActiveRecord::Base
4
+ self.table_name = :adhonorem_achievements
5
+ has_static_record :badge, class_name: 'AdHonorem::Badge'
6
+ belongs_to :user, class_name: AdHonorem.configuration.user_class
7
+
8
+ enum state: [:started, :done]
9
+ end
10
+ end
@@ -0,0 +1,240 @@
1
+ module AdHonorem
2
+ # AdHonorem core class, must be inherited from
3
+ class Badge < ::StaticRecord::Base
4
+ table :badges
5
+ path Rails.root.join('app', 'models', 'badges', '**', '*.rb')
6
+ primary_key :slug
7
+
8
+ attr_reader :objectives, :user
9
+
10
+ # After all badges loading, @@hooks will look like
11
+ # {
12
+ # master_a_weapon: {
13
+ # 'ParameteredBadge' => [:checker_one, :checker_two],
14
+ # 'LegacyBadge' => [:a_checker],
15
+ # },
16
+ # other_event: {
17
+ # 'OtherBadgeResponder' => [:other_checker]
18
+ # }
19
+ # }
20
+ @@hooks = {}
21
+
22
+ def initialize
23
+ super
24
+
25
+ @sub_badges = []
26
+ @rewards = []
27
+ @objectives = {}
28
+ end
29
+
30
+ def set_context(user)
31
+ @user = user
32
+ self
33
+ end
34
+
35
+ def reload_context!
36
+ check_context
37
+ @user = AdHonorem.configuration.user_class.constantize.find(@user.id)
38
+ self
39
+ end
40
+
41
+ def add_reward; end
42
+
43
+ def add_objective(slug, name, description, amount_needed = 1)
44
+ # prevent crash when Badges are initialized before migrations were applied
45
+ return unless defined?(AdHonorem::Objective)
46
+ @objectives[slug] = AdHonorem::Objective.new(slug, name, description, amount_needed)
47
+ end
48
+
49
+ def objectives_count
50
+ objectives.keys.count
51
+ end
52
+
53
+ def progress(progress_type = :step)
54
+ check_context
55
+ return progress_meta(progress_type) if meta?
56
+
57
+ case progress_type
58
+ when :step
59
+ objectives.keys.map do |slug|
60
+ name = objectives[slug].name
61
+ "#{name} : #{get_progression_for(slug).progress(:stringified)}"
62
+ end
63
+ when :global
64
+ objectives.keys.map { |slug| get_progression_for(slug).progress(:percentage) }.sum / objectives_count
65
+ end
66
+ end
67
+
68
+ def legacy?
69
+ legacy || false
70
+ end
71
+
72
+ def self.dispatch(user, event, params = nil)
73
+ params ||= {}
74
+ result = {}
75
+
76
+ @@hooks[event] ||= {}
77
+ @@hooks[event].each do |responder, registered_checkers|
78
+ badge = find_by(klass: responder).set_context(user)
79
+ registered_checkers.each do |checker|
80
+ res = badge.trigger(checker, params)
81
+ result[res] ||= []
82
+ result[res] << "#{responder}##{checker}"
83
+ end
84
+ end
85
+
86
+ result
87
+ end
88
+
89
+ def trigger(objective_slug, params = nil)
90
+ return trigger_meta(objective_slug, params || {}) if meta?
91
+
92
+ return :already_done if complete?(objective_slug) || complete?
93
+ return :legacy_badge if legacy?
94
+
95
+ params ||= {}
96
+ proceed(objective_slug, params)
97
+ end
98
+
99
+ def complete?(objective = nil)
100
+ # Meta badges don't handle per-objective completion
101
+ return complete_meta? if meta?
102
+ check_context
103
+ selection = objectives.keys
104
+ selection.select! { |slug| slug == objective } if objective
105
+ selection.each do |slug|
106
+ objective = objectives[slug]
107
+ return false unless get_progression_for(objective).done?
108
+ end
109
+ true
110
+ end
111
+
112
+ def get_objective(objective_slug)
113
+ objective = objective_slug
114
+ unless objective.is_a?(AdHonorem::Objective)
115
+ objective = objectives[objective_slug]
116
+ raise ObjectiveNotFound, "Objective #{objective_slug} could not be found" unless objective
117
+ end
118
+
119
+ objective
120
+ end
121
+
122
+ def meta?
123
+ !@sub_badges.empty?
124
+ end
125
+
126
+ class << self
127
+ protected
128
+
129
+ def hook(event, params = nil)
130
+ params ||= {}
131
+ @@hooks[event] ||= {}
132
+ @@hooks[event][name] ||= []
133
+ @@hooks[event][name] += [params[:to] || []].flatten.uniq
134
+ end
135
+ end
136
+
137
+ protected
138
+
139
+ def add_sub_badge(badge_slug)
140
+ @sub_badges << badge_slug
141
+ end
142
+
143
+ private
144
+
145
+ def proceed(objective_slug, params)
146
+ objective = get_objective(objective_slug)
147
+ progression = get_progression_for(objective)
148
+ return :failed_check unless send(objective.slug, user, params[:data] || {})
149
+
150
+ progression.advance(params[:amount] || 1)
151
+ if complete?
152
+ unlock
153
+ reward
154
+ return :completed_badge
155
+ end
156
+
157
+ progression.done? ? :completed_step : :triggered
158
+ end
159
+
160
+ def get_progression_for(objective)
161
+ objective = get_objective(objective)
162
+
163
+ AdHonorem::Progress.find_or_initialize_by(
164
+ user: @user,
165
+ badge_static_record_type: self.class.name,
166
+ objective_slug: objective.slug.to_s
167
+ )
168
+ end
169
+
170
+ def related_achievement
171
+ AdHonorem::Achievement.find_or_initialize_by(
172
+ user: @user,
173
+ badge_static_record_type: self.class.name
174
+ )
175
+ end
176
+
177
+ def unlock
178
+ raise AdHonorem::NotCompleted unless complete?
179
+ achievement = related_achievement
180
+ achievement.done!
181
+ end
182
+
183
+ def trigger_meta(objective_slug, params)
184
+ @sub_badges.each do |sub_slug|
185
+ sub_badge = AdHonorem::Badge.find(sub_slug).set_context(@user)
186
+ next if sub_badge.complete? || !sub_badge.respond_to?(objective_slug)
187
+ sub_badge.trigger(objective_slug, params)
188
+ end
189
+ end
190
+
191
+ def complete_meta?
192
+ check_context
193
+ progress_meta(:global) == 100.0
194
+ end
195
+
196
+ def progress_meta(progress_type = :step)
197
+ check_context
198
+
199
+ case progress_type
200
+ when :step
201
+ @sub_badges.map { |sub_slug| AdHonorem::Badge.find(sub_slug).set_context(@user).progress(progress_type) }
202
+ when :global
203
+ res = @sub_badges.map do |sub_slug|
204
+ AdHonorem::Badge.find(sub_slug).set_context(@user).progress(progress_type)
205
+ end
206
+ res.sum / @sub_badges.size
207
+ end
208
+ end
209
+
210
+ def next_sub_badge
211
+ @sub_badges.each do |sub_slug|
212
+ sub = AdHonorem::Badge.find(sub_slug).set_context(@user)
213
+ return sub unless sub.complete?
214
+ end
215
+ last_sub_badge
216
+ end
217
+
218
+ def last_sub_badge
219
+ AdHonorem::Badge.find(@sub_badges.last).set_context(@user)
220
+ end
221
+
222
+ def reward
223
+ # @rewards.each do |reward|
224
+ # end
225
+ end
226
+
227
+ def check_context
228
+ raise AdHonorem::NoContext, 'No context User has been set' unless @user
229
+ end
230
+
231
+ columns slug: :string,
232
+ name: :string,
233
+ description: :string,
234
+ category: :string,
235
+ points: :integer,
236
+ icon_locked: :string,
237
+ icon_unlocked: :string,
238
+ legacy: :boolean
239
+ end
240
+ end
@@ -0,0 +1,10 @@
1
+ module AdHonorem
2
+ # Contains AdHonorem settings
3
+ class Configuration
4
+ attr_accessor :user_class
5
+
6
+ def initialize
7
+ @user_class = 'User'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module AdHonorem
2
+ # Represent a badge objective
3
+ # Re-created on-the-fly at each badge instantiation
4
+ class Objective
5
+ attr_reader :slug, :name, :description, :amount_needed
6
+
7
+ def initialize(slug, name, description, amount_needed = 1)
8
+ @slug = slug
9
+ @name = name
10
+ @description = description
11
+ @amount_needed = amount_needed
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,48 @@
1
+ module AdHonorem
2
+ # Store users' progress in database for each badge triggered at least once
3
+ class Progress < ActiveRecord::Base
4
+ self.table_name = :adhonorem_progresses
5
+ has_static_record :badge, class_name: 'AdHonorem::Badge'
6
+ belongs_to :user, class_name: AdHonorem.configuration.user_class
7
+
8
+ PROGRESS_TYPES = {
9
+ numeric: :capped_numeric_progress,
10
+ percentage: :percentage_progress,
11
+ stringified: :stringified_progress
12
+ }.freeze
13
+
14
+ def advance(amount = 1)
15
+ return if done?
16
+ self.numeric_progress += amount
17
+ save
18
+ end
19
+
20
+ def objective
21
+ badge.objectives[objective_slug.to_sym]
22
+ end
23
+
24
+ def done?
25
+ numeric_progress >= objective.amount_needed
26
+ end
27
+
28
+ def progress(progress_type = :numeric)
29
+ raise AdHonorem::NotSuchProgressType unless PROGRESS_TYPES.keys.include?(progress_type)
30
+ send(PROGRESS_TYPES[progress_type])
31
+ end
32
+
33
+ private
34
+
35
+ def percentage_progress
36
+ return 100.0 if objective.amount_needed.zero?
37
+ capped_numeric_progress.to_f / objective.amount_needed * 100.0
38
+ end
39
+
40
+ def stringified_progress
41
+ "#{capped_numeric_progress}/#{objective.amount_needed}"
42
+ end
43
+
44
+ def capped_numeric_progress
45
+ [self.numeric_progress, objective.amount_needed].min
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,12 @@
1
+ class Railtie < Rails::Railtie # :nodoc:
2
+ initializer 'adhonorem.load_static_record_dependent_files' do |_app|
3
+ ActiveSupport.on_load :static_record do
4
+ require 'adhonorem/models/objective'
5
+ require 'adhonorem/models/achievement'
6
+ require 'adhonorem/models/progress'
7
+ require 'adhonorem/models/badge'
8
+
9
+ ActiveSupport.run_load_hooks(:adhonorem, AdHonorem::Badge)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module AdHonorem
2
+ VERSION = '1.0.0'.freeze
3
+ end
data/lib/adhonorem.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'rails'
2
+
3
+ require 'adhonorem/engine'
4
+ require 'adhonorem/models/configuration'
5
+
6
+ module AdHonorem # :nodoc:
7
+ class << self
8
+ attr_writer :configuration
9
+ end
10
+
11
+ def self.configuration
12
+ @configuration ||= AdHonorem::Configuration.new
13
+ end
14
+
15
+ def self.reset
16
+ @configuration = AdHonorem::Configuration.new
17
+ end
18
+
19
+ def self.configure
20
+ yield(configuration)
21
+ end
22
+ end
23
+
24
+ require 'rails/generators'
25
+ require 'adhonorem/generators/adhonorem_generator'
26
+
27
+ require 'adhonorem/exceptions'
28
+
29
+ require 'active_record'
30
+ require 'static_record'
31
+ require 'adhonorem/railtie'
32
+ ActiveSupport.run_load_hooks(:static_record, StaticRecord::Base)
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :adhonorem do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,5 @@
1
+ RSpec.describe AdHonorem do
2
+ it 'is a module' do
3
+ expect(AdHonorem).to be_a(Module)
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ def instantiate_badges
2
+ name = (0...50).map { ('a'..'z').to_a[rand(26)] }.join
3
+ @user = User.create(name: name)
4
+
5
+ @normal_badge = AdHonorem::Badge.find('normal_badge').set_context(@user)
6
+
7
+ @two_objectives_badge = AdHonorem::Badge.find('two_objectives_badge').set_context(@user)
8
+
9
+ @conditionnal_badge = AdHonorem::Badge.find('conditionnal_badge').set_context(@user)
10
+
11
+ @legacy_badge = AdHonorem::Badge.find('legacy_badge').set_context(@user)
12
+
13
+ @parametered_badge = AdHonorem::Badge.find('parametered_badge').set_context(@user)
14
+ end
@@ -0,0 +1,28 @@
1
+ def migration_has_been_run?(version)
2
+ table_name = ActiveRecord::Migrator.schema_migrations_table_name
3
+ query = "SELECT version FROM %s WHERE version = '%s'" % [table_name, version]
4
+ ActiveRecord::Base.connection.clear_query_cache
5
+ ActiveRecord::Base.connection.execute(query).any?
6
+ end
7
+
8
+ def test_migrate(migration_class, migration_number, way, reset_classes = nil)
9
+ reset_classes ||= []
10
+
11
+ verbosity = ActiveRecord::Migration.verbose
12
+ ActiveRecord::Migration.verbose = false
13
+
14
+ migration = migration_class.new
15
+ case way
16
+ when :up
17
+ migration.migrate(:up)# unless migration_has_been_run?(migration_number)
18
+ when :down
19
+ migration.migrate(:down)# if migration_has_been_run?(migration_number)
20
+ end
21
+
22
+ reset_classes.each do |klass|
23
+ klass.connection.schema_cache.clear!
24
+ klass.reset_column_information
25
+ end
26
+
27
+ ActiveRecord::Migration.verbose = verbosity
28
+ end