qalam_merit 4.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +21 -0
- data/README.md +358 -0
- data/RELEASING.md +16 -0
- data/Rakefile +44 -0
- data/TESTING.txt +12 -0
- data/config/locales/en.yml +5 -0
- data/lib/merit.rb +95 -0
- data/lib/merit/badge_rules_methods.rb +30 -0
- data/lib/merit/base_target_finder.rb +31 -0
- data/lib/merit/class_methods.rb +41 -0
- data/lib/merit/controller_extensions.rb +71 -0
- data/lib/merit/generators/active_record/install_generator.rb +40 -0
- data/lib/merit/generators/active_record/merit_generator.rb +25 -0
- data/lib/merit/generators/active_record/remove_generator.rb +30 -0
- data/lib/merit/generators/active_record/templates/add_merit_fields_to_model.erb +7 -0
- data/lib/merit/generators/active_record/templates/create_badges_sashes.erb +14 -0
- data/lib/merit/generators/active_record/templates/create_merit_actions.erb +16 -0
- data/lib/merit/generators/active_record/templates/create_merit_activity_logs.erb +12 -0
- data/lib/merit/generators/active_record/templates/create_merit_badges.erb +17 -0
- data/lib/merit/generators/active_record/templates/create_sashes.erb +8 -0
- data/lib/merit/generators/active_record/templates/create_scores_and_points.erb +16 -0
- data/lib/merit/generators/active_record/templates/remove_merit_fields_from_model.erb +7 -0
- data/lib/merit/generators/active_record/templates/remove_merit_tables.erb +12 -0
- data/lib/merit/generators/install_generator.rb +30 -0
- data/lib/merit/generators/merit_generator.rb +33 -0
- data/lib/merit/generators/remove_generator.rb +23 -0
- data/lib/merit/generators/templates/badge.erb +69 -0
- data/lib/merit/generators/templates/merit.erb +18 -0
- data/lib/merit/generators/templates/merit_badge_rules.erb +50 -0
- data/lib/merit/generators/templates/merit_point_rules.erb +31 -0
- data/lib/merit/generators/templates/merit_rank_rules.erb +32 -0
- data/lib/merit/generators/templates/qalam_badge_sash.erb +20 -0
- data/lib/merit/generators/templates/qalam_sash.erb +14 -0
- data/lib/merit/judge.rb +102 -0
- data/lib/merit/models/action_concern.rb +50 -0
- data/lib/merit/models/active_record/action.rb +11 -0
- data/lib/merit/models/active_record/activity_log.rb +11 -0
- data/lib/merit/models/active_record/badges_sash.rb +13 -0
- data/lib/merit/models/active_record/sash.rb +32 -0
- data/lib/merit/models/active_record/score.rb +25 -0
- data/lib/merit/models/badges_sash_concern.rb +13 -0
- data/lib/merit/models/base/badges_sash.rb +15 -0
- data/lib/merit/models/base/sash.rb +55 -0
- data/lib/merit/models/sash_concern.rb +53 -0
- data/lib/merit/point_rules_methods.rb +33 -0
- data/lib/merit/rank_rules_methods.rb +58 -0
- data/lib/merit/reputation_change_observer.rb +19 -0
- data/lib/merit/rule.rb +35 -0
- data/lib/merit/rules_matcher.rb +24 -0
- data/lib/merit/sash_finder.rb +15 -0
- data/lib/merit/target_finder.rb +43 -0
- data/qalam_merit.gemspec +23 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/controllers/admin/users_controller.rb +9 -0
- data/test/dummy/app/controllers/api/comments_controller.rb +5 -0
- data/test/dummy/app/controllers/api/users_controller.rb +5 -0
- data/test/dummy/app/controllers/application_controller.rb +7 -0
- data/test/dummy/app/controllers/comments_controller.rb +56 -0
- data/test/dummy/app/controllers/registrations_controller.rb +21 -0
- data/test/dummy/app/controllers/users_controller.rb +38 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/address.rb +3 -0
- data/test/dummy/app/models/comment.rb +13 -0
- data/test/dummy/app/models/dummy_observer.rb +3 -0
- data/test/dummy/app/models/merit/badge_rules.rb +66 -0
- data/test/dummy/app/models/merit/point_rules.rb +44 -0
- data/test/dummy/app/models/merit/rank_rules.rb +24 -0
- data/test/dummy/app/models/user.rb +23 -0
- data/test/dummy/app/views/admin/users/index.html.erb +26 -0
- data/test/dummy/app/views/comments/_form.html.erb +29 -0
- data/test/dummy/app/views/comments/edit.html.erb +6 -0
- data/test/dummy/app/views/comments/index.html.erb +35 -0
- data/test/dummy/app/views/comments/new.html.erb +5 -0
- data/test/dummy/app/views/comments/show.html.erb +23 -0
- data/test/dummy/app/views/layouts/application.html.erb +24 -0
- data/test/dummy/app/views/users/_form.html.erb +22 -0
- data/test/dummy/app/views/users/edit.html.erb +6 -0
- data/test/dummy/app/views/users/index.html.erb +27 -0
- data/test/dummy/app/views/users/new.html.erb +5 -0
- data/test/dummy/app/views/users/show.html.erb +18 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/application_api_only.rb +28 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +22 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environment_api_only.rb +7 -0
- data/test/dummy/config/environments/development.rb +24 -0
- data/test/dummy/config/environments/production.rb +51 -0
- data/test/dummy/config/environments/test.rb +36 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/merit.rb +47 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/new_framework_defaults.rb +3 -0
- data/test/dummy/config/initializers/secret_token.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/mongoid.yml +13 -0
- data/test/dummy/config/routes.rb +16 -0
- data/test/dummy/db/migrate/20110421191249_create_users.rb +12 -0
- data/test/dummy/db/migrate/20110421191250_create_comments.rb +16 -0
- data/test/dummy/db/migrate/20120318022220_add_fields_to_users.rb +11 -0
- data/test/dummy/db/migrate/20130321082817_add_fields_to_comments.rb +11 -0
- data/test/dummy/db/migrate/20130329224406_create_merit_actions.rb +18 -0
- data/test/dummy/db/migrate/20130329224407_create_merit_activity_logs.rb +15 -0
- data/test/dummy/db/migrate/20130329224408_create_sashes.rb +11 -0
- data/test/dummy/db/migrate/20130329224409_create_badges_sashes.rb +16 -0
- data/test/dummy/db/migrate/20130329224410_create_scores_and_points.rb +20 -0
- data/test/dummy/db/migrate/20140211144001_create_addresses.rb +11 -0
- data/test/dummy/db/migrate/20140819133931_add_target_data_to_merit_actions.rb +5 -0
- data/test/dummy/db/schema.rb +89 -0
- data/test/dummy/db/seeds.rb +19 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/rails.js +404 -0
- data/test/dummy/public/stylesheets/.gitkeep +0 -0
- data/test/dummy/public/stylesheets/scaffold.css +56 -0
- data/test/dummy/script/rails +6 -0
- data/test/integration/navigation_test.rb +332 -0
- data/test/support/integration_case.rb +5 -0
- data/test/test_helper.rb +40 -0
- data/test/unit/action_test.rb +12 -0
- data/test/unit/base_target_finder_test.rb +64 -0
- data/test/unit/merit_unit_test.rb +33 -0
- data/test/unit/rule_unit_test.rb +57 -0
- data/test/unit/rules_matcher_test.rb +37 -0
- data/test/unit/sash_finder_test.rb +27 -0
- data/test/unit/sash_test.rb +104 -0
- data/test/unit/score_test.rb +13 -0
- data/test/unit/target_finder_test.rb +98 -0
- metadata +360 -0
data/RELEASING.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Releasing
|
2
|
+
|
3
|
+
1. Update `NEWS.md` to reflect the changes since last release.
|
4
|
+
1. Tag the release: `git tag vVERSION -a -s`. The tag message should contain the
|
5
|
+
appropriate `NEWS.md` subsection.
|
6
|
+
1. Push changes: `git push --tags`
|
7
|
+
1. Build and publish to rubygems:
|
8
|
+
```bash
|
9
|
+
gem build merit.gemspec
|
10
|
+
gem push merit-*.gem
|
11
|
+
```
|
12
|
+
|
13
|
+
1. Add a new GitHub release:
|
14
|
+
https://github.com/merit-gem/merit/releases/new?tag=vVERSION
|
15
|
+
1. Announce the new release, making sure to say "thank you" to the contributors
|
16
|
+
who helped shape this version!
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'rake/testtask'
|
9
|
+
|
10
|
+
desc 'Default: run tests for all ORMs.'
|
11
|
+
task default: [:setup, :test, :api_test]
|
12
|
+
|
13
|
+
task :setup do
|
14
|
+
system "cd test/dummy && rake db:migrate && rake db:test:prepare"
|
15
|
+
end
|
16
|
+
|
17
|
+
Rake::TestTask.new(:test) do |t|
|
18
|
+
t.libs << 'lib'
|
19
|
+
t.libs << 'test'
|
20
|
+
t.pattern = 'test/**/*_test.rb'
|
21
|
+
t.verbose = true
|
22
|
+
end
|
23
|
+
|
24
|
+
Rake::TestTask.new(:api_test) do |t|
|
25
|
+
t.libs << 'lib'
|
26
|
+
t.libs << 'test'
|
27
|
+
t.test_files = FileList['test/**/*_test.rb'].exclude(/navigation_test.rb/)
|
28
|
+
t.verbose = true
|
29
|
+
t.options = '-- -api-only'
|
30
|
+
end
|
31
|
+
|
32
|
+
begin
|
33
|
+
require 'rdoc/task'
|
34
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
35
|
+
rdoc.rdoc_dir = 'rdoc'
|
36
|
+
rdoc.title = 'Merit'
|
37
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
38
|
+
rdoc.rdoc_files.include('README.md')
|
39
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
40
|
+
end
|
41
|
+
rescue LoadError
|
42
|
+
puts 'This platform does not support RDocTask'
|
43
|
+
end
|
44
|
+
|
data/TESTING.txt
ADDED
data/lib/merit.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'zeitwerk'
|
2
|
+
|
3
|
+
module Merit
|
4
|
+
def self.setup
|
5
|
+
@config ||= Configuration.new
|
6
|
+
yield @config if block_given?
|
7
|
+
end
|
8
|
+
|
9
|
+
# Check rules on each request
|
10
|
+
def self.checks_on_each_request
|
11
|
+
@config.checks_on_each_request
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.orm
|
15
|
+
@config.orm || :active_record
|
16
|
+
end
|
17
|
+
|
18
|
+
# Define user_model_name
|
19
|
+
def self.user_model
|
20
|
+
@config.user_model_name.constantize
|
21
|
+
end
|
22
|
+
|
23
|
+
# Define current_user_method
|
24
|
+
def self.current_user_method
|
25
|
+
@config.current_user_method ||
|
26
|
+
"current_#{@config.user_model_name.downcase}".to_sym
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.observers
|
30
|
+
@config.observers
|
31
|
+
end
|
32
|
+
|
33
|
+
# @param class_name [String] The string version of observer class
|
34
|
+
def self.add_observer(class_name)
|
35
|
+
@config.add_observer(class_name)
|
36
|
+
end
|
37
|
+
|
38
|
+
class Configuration
|
39
|
+
attr_accessor :checks_on_each_request, :orm, :user_model_name, :observers,
|
40
|
+
:current_user_method
|
41
|
+
|
42
|
+
def initialize
|
43
|
+
@checks_on_each_request = true
|
44
|
+
@orm = :active_record
|
45
|
+
@user_model_name = 'User'
|
46
|
+
@observers = []
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_observer(class_name)
|
50
|
+
@observers << class_name
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
setup
|
55
|
+
add_observer('Merit::ReputationChangeObserver')
|
56
|
+
|
57
|
+
class BadgeNotFound < StandardError; end
|
58
|
+
class RankAttributeNotDefined < StandardError; end
|
59
|
+
|
60
|
+
class Engine < Rails::Engine
|
61
|
+
config.app_generators.orm Merit.orm
|
62
|
+
|
63
|
+
initializer 'merit.controller' do |app|
|
64
|
+
extend_orm_with_has_merit
|
65
|
+
ActiveSupport.on_load(action_controller_hook) do
|
66
|
+
begin
|
67
|
+
# Load app rules on boot up
|
68
|
+
Merit::AppBadgeRules = Merit::BadgeRules.new.defined_rules
|
69
|
+
Merit::AppPointRules = Merit::PointRules.new.defined_rules
|
70
|
+
include Merit::ControllerExtensions
|
71
|
+
rescue NameError => e
|
72
|
+
# Trap NameError if installing/generating files
|
73
|
+
raise e unless
|
74
|
+
e.to_s =~ /uninitialized constant Merit::(BadgeRules|PointRules)/
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def extend_orm_with_has_merit
|
80
|
+
ActiveRecord::Base.include(Merit)
|
81
|
+
end
|
82
|
+
|
83
|
+
def action_controller_hook
|
84
|
+
if Rails.application.config.api_only
|
85
|
+
:action_controller_api
|
86
|
+
else
|
87
|
+
:action_controller_base
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
loader = Zeitwerk::Loader.for_gem
|
94
|
+
loader.setup
|
95
|
+
loader.eager_load
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Merit
|
2
|
+
module BadgeRulesMethods
|
3
|
+
# Define rule for granting badges
|
4
|
+
def grant_on(actions, *args, &block)
|
5
|
+
options = args.extract_options!
|
6
|
+
|
7
|
+
actions = Array.wrap(actions)
|
8
|
+
|
9
|
+
rule = Rule.new
|
10
|
+
rule.badge_id = options[:badge_id]
|
11
|
+
rule.badge_name = options[:badge]
|
12
|
+
rule.level = options[:level]
|
13
|
+
rule.to = options[:to] || :action_user
|
14
|
+
rule.multiple = options[:multiple] || false
|
15
|
+
rule.temporary = options[:temporary] || false
|
16
|
+
rule.model_name = options[:model_name] || actions.first.split('#').first
|
17
|
+
rule.block = block
|
18
|
+
|
19
|
+
actions.each do |action|
|
20
|
+
defined_rules[action] ||= []
|
21
|
+
defined_rules[action] << rule
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Currently defined rules
|
26
|
+
def defined_rules
|
27
|
+
@defined_rules ||= {}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Merit
|
2
|
+
class BaseTargetFinder
|
3
|
+
def self.find(*args)
|
4
|
+
new(*args).find
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(rule, action)
|
8
|
+
@rule = rule
|
9
|
+
@action = action
|
10
|
+
end
|
11
|
+
|
12
|
+
def find
|
13
|
+
get_target_from_database || reanimate_target_from_action
|
14
|
+
rescue => e
|
15
|
+
Rails.logger.warn "[merit] no target found: #{e}. #{caller.first}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_target_from_database
|
19
|
+
model_class.find_by_id(@action.target_id)
|
20
|
+
end
|
21
|
+
|
22
|
+
def model_class
|
23
|
+
klass_name = (@rule.model_name || @action.target_model).singularize
|
24
|
+
klass_name.camelize.constantize
|
25
|
+
end
|
26
|
+
|
27
|
+
def reanimate_target_from_action
|
28
|
+
YAML.load(@action.target_data)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Merit
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
module ClassMethods
|
5
|
+
def has_merit(options = {})
|
6
|
+
# MeritableModel#sash_id is more stable than Sash#meritable_model_id
|
7
|
+
# That's why MeritableModel belongs_to Sash. Can't use
|
8
|
+
# dependent: destroy as it may raise FK constraint exceptions. See:
|
9
|
+
# https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1079-belongs_to-dependent-destroy-should-destroy-self-before-assocation
|
10
|
+
belongs_to :sash, class_name: 'Merit::Sash', inverse_of: nil, optional: true
|
11
|
+
|
12
|
+
_merit_delegate_methods_to_sash
|
13
|
+
_merit_define_badge_related_entries_method
|
14
|
+
_merit_sash_initializer
|
15
|
+
end
|
16
|
+
|
17
|
+
# Delegate methods from meritable models to their sash
|
18
|
+
def _merit_delegate_methods_to_sash
|
19
|
+
methods = %w(badge_ids badges points add_badge rm_badge
|
20
|
+
add_points subtract_points score_points)
|
21
|
+
methods.each { |method| delegate method, to: :_sash }
|
22
|
+
end
|
23
|
+
|
24
|
+
def _merit_define_badge_related_entries_method
|
25
|
+
meritable_class_name = name.demodulize
|
26
|
+
Merit::Badge._define_related_entries_method(meritable_class_name)
|
27
|
+
end
|
28
|
+
|
29
|
+
# _sash initializes a sash if doesn't have one yet.
|
30
|
+
# From Rails 3.2 we can override association methods to do so
|
31
|
+
# transparently, but merit supports Rails ~> 3.0.0. See:
|
32
|
+
# http://blog.hasmanythrough.com/2012/1/20/modularized-association-methods-in-rails-3-2
|
33
|
+
def _merit_sash_initializer
|
34
|
+
define_method(:_sash) do
|
35
|
+
# TODO: reload.sash is not regression tested
|
36
|
+
sash || reload.sash || update(sash: Sash.create)
|
37
|
+
sash
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Merit
|
2
|
+
# Sets up an app-wide after_filter, and inserts merit_action entries if
|
3
|
+
# there are defined rules (for badges or points) for current
|
4
|
+
# 'controller_path#action_name'
|
5
|
+
module ControllerExtensions
|
6
|
+
def self.included(base)
|
7
|
+
base.after_action :log_and_process
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def log_and_process
|
13
|
+
if rules_defined?
|
14
|
+
Merit::Action.create(merit_action_hash)
|
15
|
+
|
16
|
+
if Merit.checks_on_each_request
|
17
|
+
Merit::Action.check_unprocessed
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def merit_action_hash
|
23
|
+
{
|
24
|
+
user_id: send(Merit.current_user_method).try(:id),
|
25
|
+
action_method: action_name,
|
26
|
+
action_value: params[:value],
|
27
|
+
had_errors: had_errors?,
|
28
|
+
target_model: controller_path,
|
29
|
+
target_id: target_id,
|
30
|
+
target_data: target_object.to_yaml,
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def rules_defined?
|
35
|
+
RulesMatcher.new(controller_path, action_name).any_matching?
|
36
|
+
end
|
37
|
+
|
38
|
+
def had_errors?
|
39
|
+
target_object.respond_to?(:errors) && target_object.errors.try(:present?)
|
40
|
+
end
|
41
|
+
|
42
|
+
def target_object
|
43
|
+
variable_name = :"@#{controller_name.singularize}"
|
44
|
+
if instance_variable_defined?(variable_name)
|
45
|
+
if target_obj = instance_variable_get(variable_name)
|
46
|
+
target_obj
|
47
|
+
else
|
48
|
+
warn_no_object_found
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def warn_no_object_found
|
54
|
+
str = '[merit] No object found, you might need a ' \
|
55
|
+
"'@#{controller_name.singularize}' variable in " \
|
56
|
+
"'#{controller_path}_controller' if no reputation is applied. " \
|
57
|
+
'If you are using `model_name` option in the rule this is ok.'
|
58
|
+
Rails.logger.warn str
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
|
62
|
+
def target_id
|
63
|
+
target_id = target_object.try(:id)
|
64
|
+
# If target_id is nil use (only digits of) params[:id]
|
65
|
+
if target_id.nil? && params[:id].to_s =~ /^[0-9]+$/
|
66
|
+
target_id = params[:id]
|
67
|
+
end
|
68
|
+
target_id
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
|
3
|
+
module Merit
|
4
|
+
module Generators::ActiveRecord
|
5
|
+
class InstallGenerator < ::Rails::Generators::Base
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
|
8
|
+
source_root File.expand_path('../templates', __FILE__)
|
9
|
+
desc 'add active_record merit migrations for the root objects'
|
10
|
+
|
11
|
+
def self.next_migration_number(path)
|
12
|
+
ActiveRecord::Generators::Base.next_migration_number(path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def copy_migrations_and_model
|
16
|
+
migration_template 'create_merit_actions.erb',
|
17
|
+
'db/migrate/create_merit_actions.rb'
|
18
|
+
sleep 1.1
|
19
|
+
migration_template 'create_merit_activity_logs.erb',
|
20
|
+
'db/migrate/create_merit_activity_logs.rb'
|
21
|
+
sleep 1.1
|
22
|
+
migration_template 'create_merit_badges.erb',
|
23
|
+
'db/migrate/create_merit_badges.rb'
|
24
|
+
sleep 1.1
|
25
|
+
migration_template 'create_sashes.erb',
|
26
|
+
'db/migrate/create_sashes.rb'
|
27
|
+
sleep 1.1
|
28
|
+
migration_template 'create_badges_sashes.erb',
|
29
|
+
'db/migrate/create_badges_sashes.rb'
|
30
|
+
sleep 1.1
|
31
|
+
migration_template 'create_scores_and_points.erb',
|
32
|
+
'db/migrate/create_scores_and_points.rb'
|
33
|
+
end
|
34
|
+
|
35
|
+
def migration_version
|
36
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
|
3
|
+
module Merit
|
4
|
+
module Generators::ActiveRecord
|
5
|
+
class MeritGenerator < ::ActiveRecord::Generators::Base
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
|
8
|
+
source_root File.expand_path('../templates', __FILE__)
|
9
|
+
desc 'add active_record merit migrations'
|
10
|
+
|
11
|
+
def self.next_migration_number(path)
|
12
|
+
ActiveRecord::Generators::Base.next_migration_number(path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def copy_migrations_and_model
|
16
|
+
migration_template 'add_merit_fields_to_model.erb',
|
17
|
+
"db/migrate/add_merit_fields_to_#{table_name}.rb"
|
18
|
+
end
|
19
|
+
|
20
|
+
def migration_version
|
21
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
|
3
|
+
module Merit
|
4
|
+
module Generators::ActiveRecord
|
5
|
+
class RemoveGenerator < ::ActiveRecord::Generators::Base
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
|
8
|
+
source_root File.expand_path('../templates', __FILE__)
|
9
|
+
desc 'Creates a migration file to remove all traces of Merit on the DB'
|
10
|
+
|
11
|
+
def self.next_migration_number(path)
|
12
|
+
ActiveRecord::Generators::Base.next_migration_number(path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def copy_migrations_and_model
|
16
|
+
migration_template 'remove_merit_tables.erb',
|
17
|
+
'db/migrate/remove_merit_tables.rb'
|
18
|
+
|
19
|
+
migration_template(
|
20
|
+
'remove_merit_fields_from_model.erb',
|
21
|
+
"db/migrate/remove_merit_fields_from_#{table_name}.rb"
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def migration_version
|
26
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|