shoulda_matchmakers 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +21 -0
- data/lib/controller/action_controller/action_controller_controller_sm_model.rb +53 -0
- data/lib/controller/action_controller/action_controller_controller_sm_model_helper.rb +73 -0
- data/lib/controller/action_controller/matchmakers/callbacks.rb +56 -0
- data/lib/controller/action_controller/matchmakers/filter_param.rb +69 -0
- data/lib/controller/action_controller/matchmakers/permit.rb +510 -0
- data/lib/controller/action_controller/matchmakers/redirect_to.rb +126 -0
- data/lib/controller/action_controller/matchmakers/render_template.rb +198 -0
- data/lib/controller/action_controller/matchmakers/render_with_layout.rb +72 -0
- data/lib/controller/action_controller/matchmakers/rescue_from.rb +96 -0
- data/lib/controller/action_controller/matchmakers/respond_with.rb +71 -0
- data/lib/controller/action_controller/matchmakers/route.rb +586 -0
- data/lib/controller/action_controller/matchmakers/set_flash.rb +136 -0
- data/lib/controller/action_controller/matchmakers/set_session.rb +115 -0
- data/lib/controller/action_controller/permitted_params_definition.rb +60 -0
- data/lib/generators/shoulda_matchmakers/controller_matcher_generator.rb +87 -0
- data/lib/generators/shoulda_matchmakers/controller_matcher_generator_helper.rb +92 -0
- data/lib/generators/shoulda_matchmakers/factory_generator.rb +86 -0
- data/lib/generators/shoulda_matchmakers/install_generator.rb +10 -0
- data/lib/generators/shoulda_matchmakers/model_matcher_generator.rb +87 -0
- data/lib/generators/shoulda_matchmakers/model_matcher_generator_helper.rb +107 -0
- data/lib/model/active_record/active_record_model_sm_model.rb +50 -0
- data/lib/model/active_record/active_record_model_sm_model_helper.rb +206 -0
- data/lib/model/active_record/factory_sm_model.rb +28 -0
- data/lib/model/active_record/factory_sm_model_helper.rb +124 -0
- data/lib/model/active_record/matchmakers/accept_nested_attributes_for.rb +66 -0
- data/lib/model/active_record/matchmakers/allow_value.rb +137 -0
- data/lib/model/active_record/matchmakers/associations.rb +52 -0
- data/lib/model/active_record/matchmakers/define_enum_for.rb +53 -0
- data/lib/model/active_record/matchmakers/delegate_method.rb +101 -0
- data/lib/model/active_record/matchmakers/have_db_column.rb +33 -0
- data/lib/model/active_record/matchmakers/have_db_index.rb +39 -0
- data/lib/model/active_record/matchmakers/have_readonly_attribute.rb +32 -0
- data/lib/model/active_record/matchmakers/have_secure_password.rb +32 -0
- data/lib/model/active_record/matchmakers/serialize.rb +67 -0
- data/lib/model/active_record/matchmakers/validations.rb +169 -0
- data/lib/model/active_record/options_definition.rb +160 -0
- data/lib/shoulda_matchmakers.rb +48 -0
- data/lib/shoulda_matchmakers/version.rb +3 -0
- data/lib/support/command_line_interface.rb +100 -0
- data/lib/support/controller_generator.rb +198 -0
- data/lib/support/indefinite_article.rb +70 -0
- data/lib/support/to_discard/belong_to.rb +94 -0
- data/lib/support/to_discard/have_and_belong_to_many.rb +83 -0
- data/lib/support/to_discard/have_many.rb +96 -0
- data/lib/support/to_discard/have_one.rb +98 -0
- data/lib/support/to_discard/permit_refactor.rb +270 -0
- data/lib/support/to_discard/render_template_new.rb +204 -0
- data/lib/support/to_discard/render_template_reconstruction.rb +188 -0
- data/lib/support/to_discard/use_around_action.rb +20 -0
- data/lib/support/to_discard/use_before_action.rb +20 -0
- data/lib/support/to_discard/validate_absence_of.rb +16 -0
- data/lib/support/to_discard/validate_acceptance_of.rb +16 -0
- data/lib/support/to_discard/validate_confirmation_of.rb +16 -0
- data/lib/support/to_discard/validate_exclusion_of.rb +145 -0
- data/lib/support/to_discard/validate_inclusion_of.rb +94 -0
- data/lib/support/to_discard/validate_length_of.rb +16 -0
- data/lib/support/to_discard/validate_numericality_of.rb +16 -0
- data/lib/support/to_discard/validate_presence_of.rb +16 -0
- data/lib/support/to_discard/validate_uniqueness_of.rb +16 -0
- data/lib/support/to_discard/validation_old.rb +37 -0
- data/lib/support/to_discard/validations.rb +41 -0
- data/lib/support/to_discard/validations_conditional.rb +146 -0
- data/lib/support/trace_debug_lines.txt +319 -0
- data/lib/support/util.rb +15 -0
- data/lib/templates/controller/action_controller/controller_spec_template.haml +146 -0
- data/lib/templates/factory/active_record/factory_template.haml +13 -0
- data/lib/templates/model/active_record/model_spec_template.haml +233 -0
- data/lib/templates/shoulda_matchmakers.rb +112 -0
- metadata +263 -0
@@ -0,0 +1,136 @@
|
|
1
|
+
module ShouldaMatchmakers
|
2
|
+
module Controller
|
3
|
+
module ActionController
|
4
|
+
module Matchmaker
|
5
|
+
module SetFlash
|
6
|
+
|
7
|
+
|
8
|
+
def set_flash_matcher_tests
|
9
|
+
set_flash_occurrences = get_set_flash_occurrences(@app_controller_name)
|
10
|
+
if set_flash_occurrences.present?
|
11
|
+
generate_set_flash_matcher_tests(@app_controller_name, set_flash_occurrences)
|
12
|
+
else
|
13
|
+
[]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def get_set_flash_occurrences(app_controller_name)
|
21
|
+
app_controller_file_path = compose_extended_app_controller_file_path(app_controller_name)
|
22
|
+
if File.exists?(app_controller_file_path)
|
23
|
+
set_flash_occurrences = parse_controller_for_set_flash_occurrences(app_controller_name, app_controller_file_path)
|
24
|
+
else
|
25
|
+
set_flash_occurrences = []
|
26
|
+
end
|
27
|
+
set_flash_occurrences
|
28
|
+
end
|
29
|
+
|
30
|
+
def parse_controller_for_set_flash_occurrences(app_controller_name, app_controller_file_path)
|
31
|
+
set_flash_occurrences = []
|
32
|
+
current_app_controller_method = nil
|
33
|
+
File.open(app_controller_file_path, 'r') do |app_controller_file|
|
34
|
+
app_controller_file.each_line do |app_controller_file_line|
|
35
|
+
flash_key_value_option = {}
|
36
|
+
if app_controller_file_line =~ /\s+def\s[A-Za-z0-9_][A-Za-z0-9_!\?=]+/
|
37
|
+
current_app_controller_method = app_controller_file_line.scan(/\s+def\s([A-Za-z0-9_][A-Za-z0-9_!\?=]+)/).flatten.first
|
38
|
+
elsif app_controller_file_line =~ /^\s+flash\[:[A-Za-z0-9_]+\]\s*=/ || app_controller_file_line =~ /^\s+flash.now\[:[A-Za-z0-9_]+\]\s*=/
|
39
|
+
flash_key_value_option = get_flash_key_value_option(app_controller_file_line)
|
40
|
+
elsif app_controller_file_line =~ /^\s+set_flash_message[\s\(]\s*:[A-Za-z0-9_]+\s*,/
|
41
|
+
flash_key_value_option = get_set_flash_message_key_and_value(app_controller_file_line)
|
42
|
+
end
|
43
|
+
if current_app_controller_method.present? && containing_method_is_action(app_controller_name, current_app_controller_method) && flash_key_value_option[:flash_key].present?
|
44
|
+
set_flash_occurrences << { controller_action: current_app_controller_method, flash_hash: flash_key_value_option }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
consolidate_set_flash_occurrences(set_flash_occurrences) if set_flash_occurrences.present?
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_flash_key_value_option(app_controller_file_line)
|
52
|
+
flash_key = ""
|
53
|
+
flash_value = ""
|
54
|
+
flash_option = ""
|
55
|
+
if app_controller_file_line =~ /^\s+flash\[(:[A-Za-z0-9_]+)\]\s*=\s*('.+')(?:\s+[^(\s\?)].*$|\s*$)/
|
56
|
+
flash_key, flash_value = app_controller_file_line.match(/^\s+flash\[(:[A-Za-z0-9_]+)\]\s*=\s*('.+')(?:\s+[^(\s\?)].*$|\s*$)/).captures
|
57
|
+
elsif app_controller_file_line =~ /^\s+flash\[(:[A-Za-z0-9_]+)\]\s*=\s*(".+")(?:\s+[^(\s\?)].*$|\s*$)/
|
58
|
+
flash_key, flash_value = app_controller_file_line.match(/^\s+flash\[(:[A-Za-z0-9_]+)\]\s*=\s*(".+")(?:\s+[^(\s\?)].*$|\s*$)/).captures
|
59
|
+
elsif app_controller_file_line =~ /^\s+flash\[(:[A-Za-z0-9_]+)\]\s*=\s*([a-zA-Z0-9_:]+)(\s+[^(\s\?)].*$|\s*$)/
|
60
|
+
flash_key, flash_value = app_controller_file_line.match(/^\s+flash\[(:[A-Za-z0-9_]+)\]\s*=\s*([a-zA-Z0-9_:]+)(\s+[^(\s\?)].*$|\s*$)/).captures
|
61
|
+
elsif app_controller_file_line =~ /^\s+flash\.now\[(:[A-Za-z0-9_]+)\]\s*=\s*('.+')(?:\s+[^(\s\?)].*$|\s*$)/
|
62
|
+
flash_key, flash_value = app_controller_file_line.match(/^\s+flash\.now\[(:[A-Za-z0-9_]+)\]\s*=\s*('.+')(?:\s+[^(\s\?)].*$|\s*$)/).captures
|
63
|
+
flash_option = "now"
|
64
|
+
elsif app_controller_file_line =~ /^\s+flash\.now\[(:[A-Za-z0-9_]+)\]\s*=\s*(".+")(?:\s+[^(\s\?)].*$|\s*$)/
|
65
|
+
flash_key, flash_value = app_controller_file_line.match(/^\s+flash\.now\[(:[A-Za-z0-9_]+)\]\s*=\s*(".+")(?:\s+[^(\s\?)].*$|\s*$)/).captures
|
66
|
+
flash_option = "now"
|
67
|
+
elsif app_controller_file_line =~ /^\s+flash\.now\[(:[A-Za-z0-9_]+)\]\s*=\s*([a-zA-Z0-9_:]+)(\s+[^(\s\?)].*$|\s*$)/
|
68
|
+
flash_key, flash_value = app_controller_file_line.match(/^\s+flash\.now\[(:[A-Za-z0-9_]+)\]\s*=\s*([a-zA-Z0-9_:]+)(\s+[^(\s\?)].*$|\s*$)/).captures
|
69
|
+
flash_option = "now"
|
70
|
+
end
|
71
|
+
{ flash_key: flash_key, flash_value: flash_value, flash_option: flash_option }
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_set_flash_message_key_and_value(app_controller_file_line)
|
75
|
+
flash_key = ""
|
76
|
+
flash_value = ""
|
77
|
+
if app_controller_file_line =~ /^\s+set_flash_message(?:\s|\(|\!\s|\!\()\s*:[A-Za-z0-9_]+,\s*'.+'\s*(?:\)\s*.*$|.*$)/
|
78
|
+
flash_key, flash_value = app_controller_file_line.match(/^\s+set_flash_message(?:\s|\(|\!\s|\!\()\s*(:[A-Za-z0-9_]+),\s*'(.+)'\s*(?:\)\s*.*$|.*$)/).captures
|
79
|
+
elsif app_controller_file_line =~ /^\s+set_flash_message(?:\s|\(|\!\s|\!\()\s*:[A-Za-z0-9_]+,\s*".+"\s*(?:\)\s*.*$|.*$)/
|
80
|
+
flash_key, flash_value = app_controller_file_line.match(/^\s+set_flash_message(?:\s|\(|\!\s|\!\()\s*(:[A-Za-z0-9_]+),\s*"(.+)"\s*(?:\)\s*.*$|.*$)/).captures
|
81
|
+
elsif app_controller_file_line =~ /^\s+set_flash_message(?:\s|\(|\!\s|\!\()\s*:[A-Za-z0-9_]+,\s*(?::[a-zA-Z0-9_]+|[a-zA-Z0-9_]+|"[a-zA-Z0-9_\s'{}#.]+"|'[a-zA-Z0-9_\s"{}#.]+'|:"[a-zA-Z0-9_\s'{}#.]+"|:'[a-zA-Z0-9_\s"{}#.]+')\s*(?:$|,.*$|\).*$|\s.*$)/
|
82
|
+
flash_key, flash_value = app_controller_file_line.match(/^\s+set_flash_message(?:\s|\(|\!\s|\!\()\s*(:[A-Za-z0-9_]+),\s*(:[a-zA-Z0-9_]+|[a-zA-Z0-9_]+|"[a-zA-Z0-9_\s'{}#.]+"|'[a-zA-Z0-9_\s"{}#.]+'|:"[a-zA-Z0-9_\s'{}#.]+"|:'[a-zA-Z0-9_\s"{}#.]+')\s*(?:$|,.*$|\).*$|\s.*$)/).captures
|
83
|
+
end
|
84
|
+
{ flash_key: flash_key, flash_value: flash_value, flash_option: "" }
|
85
|
+
end
|
86
|
+
|
87
|
+
def consolidate_set_flash_occurrences(set_flash_occurrences)
|
88
|
+
consolidated_occurrences = []
|
89
|
+
consolidated_occurrence = {}
|
90
|
+
previous_controller_action = ""
|
91
|
+
set_flash_occurrences.sort_by!{ |sfo| [sfo[:controller_action], sfo[:flash_hash][:flash_option], sfo[:flash_hash][:flash_key], sfo[:flash_hash][:flash_value]] }
|
92
|
+
set_flash_occurrences.each do |set_flash_occurrence|
|
93
|
+
if set_flash_occurrence[:controller_action] == previous_controller_action
|
94
|
+
consolidated_occurrence[:flash_hashes] << set_flash_occurrence[:flash_hash]
|
95
|
+
else
|
96
|
+
consolidated_occurrences = append_element(consolidated_occurrence, consolidated_occurrences)
|
97
|
+
consolidated_occurrence = { controller_action: set_flash_occurrence[:controller_action], flash_hashes: [set_flash_occurrence[:flash_hash]] }
|
98
|
+
previous_controller_action = set_flash_occurrence[:controller_action]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
append_element(consolidated_occurrence, consolidated_occurrences)
|
102
|
+
end
|
103
|
+
|
104
|
+
def generate_set_flash_matcher_tests(app_controller_name, set_flash_occurrences)
|
105
|
+
set_flash_tests = []
|
106
|
+
set_flash_occurrences.each do |set_flash_occurrence|
|
107
|
+
app_controller_route_controller = app_controller_name.underscore.sub(/_controller$/, "")
|
108
|
+
app_controller_action_routes = get_app_controller_routes_by_action(app_controller_route_controller, set_flash_occurrence[:controller_action])
|
109
|
+
if app_controller_action_routes.present?
|
110
|
+
app_controller_action_routes.each do |app_controller_action_route|
|
111
|
+
set_flash_test = generate_set_flash_test(app_controller_action_route, set_flash_occurrence)
|
112
|
+
set_flash_tests = append_element(set_flash_test, set_flash_tests)
|
113
|
+
end
|
114
|
+
# else
|
115
|
+
# set_flash_occurrence exists in non-action method
|
116
|
+
end
|
117
|
+
end
|
118
|
+
format_tests(set_flash_tests)
|
119
|
+
end
|
120
|
+
|
121
|
+
def generate_set_flash_test(app_controller_action_route, set_flash_occurrence)
|
122
|
+
app_controller_route_http_method = get_route_http_method(app_controller_action_route)
|
123
|
+
set_flash_test = " describe '#{ app_controller_route_http_method } ##{ set_flash_occurrence[:controller_action] }' do\n"
|
124
|
+
set_flash_test.concat(" before { #{ app_controller_route_http_method.downcase } :#{ set_flash_occurrence[:controller_action] } }\n\n")
|
125
|
+
set_flash_occurrence[:flash_hashes].each do |flash_hash|
|
126
|
+
set_flash_test.concat(" it { is_expected.to set_flash[#{ flash_hash[:flash_key] }].to(#{ flash_hash[:flash_value] }) }\n")
|
127
|
+
set_flash_test.sub!(" set_flash", " set_flash.now") if flash_hash[:flash_option] == "now"
|
128
|
+
end
|
129
|
+
set_flash_test.concat(" end")
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module ShouldaMatchmakers
|
2
|
+
module Controller
|
3
|
+
module ActionController
|
4
|
+
module Matchmaker
|
5
|
+
module SetSession
|
6
|
+
|
7
|
+
|
8
|
+
def set_session_matcher_tests
|
9
|
+
set_session_occurrences = get_set_session_occurrences(@app_controller_name)
|
10
|
+
if set_session_occurrences.present?
|
11
|
+
generate_set_session_matcher_tests(@app_controller_name, set_session_occurrences)
|
12
|
+
else
|
13
|
+
[]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def get_set_session_occurrences(app_controller_name)
|
21
|
+
app_controller_file_path = compose_extended_app_controller_file_path(app_controller_name)
|
22
|
+
if File.exists?(app_controller_file_path)
|
23
|
+
set_session_occurrences = parse_controller_for_set_session_occurrences(app_controller_name, app_controller_file_path)
|
24
|
+
if set_session_occurrences.present?
|
25
|
+
set_session_occurrences = consolidate_set_session_occurrences(set_session_occurrences)
|
26
|
+
end
|
27
|
+
else
|
28
|
+
set_session_occurrences = []
|
29
|
+
end
|
30
|
+
set_session_occurrences
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_controller_for_set_session_occurrences(app_controller_name, app_controller_file_path)
|
34
|
+
set_session_occurrences = []
|
35
|
+
current_app_controller_method = nil
|
36
|
+
File.open(app_controller_file_path, 'r') do |app_controller_file|
|
37
|
+
app_controller_file.each_line do |app_controller_file_line|
|
38
|
+
session_key_and_value = {}
|
39
|
+
if app_controller_file_line =~ /\s+def\s[A-Za-z0-9_][A-Za-z0-9_!\?=]+/
|
40
|
+
current_app_controller_method = app_controller_file_line.scan(/\s+def\s([A-Za-z0-9_][A-Za-z0-9_!\?=]+)/).flatten.first
|
41
|
+
elsif app_controller_file_line =~ /^\s+session\[:[A-Za-z0-9_]+\]\s*=/
|
42
|
+
session_key_and_value = get_session_key_and_value(app_controller_file_line)
|
43
|
+
end
|
44
|
+
if current_app_controller_method.present? && session_key_and_value[:session_key].present?
|
45
|
+
if containing_method_is_action(app_controller_name, current_app_controller_method)
|
46
|
+
set_session_occurrences << { controller_action: current_app_controller_method, session_hash: session_key_and_value }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
set_session_occurrences
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_session_key_and_value(app_controller_file_line)
|
55
|
+
session_key = ""
|
56
|
+
session_value = ""
|
57
|
+
if app_controller_file_line =~ /^\s+session\[(:[A-Za-z0-9_]+)\]\s*=\s*('.+')(?:\s+[^(\s\?)].*$|\s*$)/
|
58
|
+
session_key, session_value = app_controller_file_line.match(/^\s+session\[(:[A-Za-z0-9_]+)\]\s*=\s*('.+')(?:\s+[^(\s\?)].*$|\s*$)/).captures
|
59
|
+
elsif app_controller_file_line =~ /^\s+session\[(:[A-Za-z0-9_]+)\]\s*=\s*(".+")(?:\s+[^(\s\?)].*$|\s*$)/
|
60
|
+
session_key, session_value = app_controller_file_line.match(/^\s+session\[(:[A-Za-z0-9_]+)\]\s*=\s*(".+")(?:\s+[^(\s\?)].*$|\s*$)/).captures
|
61
|
+
elsif app_controller_file_line =~ /^\s+session\[(:[A-Za-z0-9_]+)\]\s*=\s*([a-zA-Z0-9_:]+)(\s+[^(\s\?)].*$|\s*$)/
|
62
|
+
session_key, session_value = app_controller_file_line.match(/^\s+session\[(:[A-Za-z0-9_]+)\]\s*=\s*([a-zA-Z0-9_:]+)(\s+[^(\s\?)].*$|\s*$)/).captures
|
63
|
+
end
|
64
|
+
{ session_key: session_key, session_value: session_value }
|
65
|
+
end
|
66
|
+
|
67
|
+
def consolidate_set_session_occurrences(set_session_occurrences)
|
68
|
+
consolidated_occurrences = []
|
69
|
+
consolidated_occurrence = {}
|
70
|
+
previous_controller_action = ""
|
71
|
+
set_session_occurrences.sort_by!{ |sso| [sso[:controller_action], sso[:session_hash][:session_key], sso[:session_hash][:session_value]] }
|
72
|
+
set_session_occurrences.each do |set_session_occurrence|
|
73
|
+
if set_session_occurrence[:controller_action] == previous_controller_action
|
74
|
+
consolidated_occurrence[:session_hashes] << set_session_occurrence[:session_hash]
|
75
|
+
else
|
76
|
+
consolidated_occurrences = append_element(consolidated_occurrence, consolidated_occurrences)
|
77
|
+
consolidated_occurrence = { controller_action: set_session_occurrence[:controller_action], session_hashes: [set_session_occurrence[:session_hash]] }
|
78
|
+
previous_controller_action = set_session_occurrence[:controller_action]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
append_element(consolidated_occurrence, consolidated_occurrences)
|
82
|
+
end
|
83
|
+
|
84
|
+
def generate_set_session_matcher_tests(app_controller_name, set_session_occurrences)
|
85
|
+
set_session_tests = []
|
86
|
+
set_session_occurrences.each do |set_session_occurrence|
|
87
|
+
app_controller_route_controller = app_controller_name.underscore.sub(/_controller$/, "")
|
88
|
+
app_controller_action_routes = get_app_controller_routes_by_action(app_controller_route_controller, set_session_occurrence[:controller_action])
|
89
|
+
if app_controller_action_routes.present?
|
90
|
+
app_controller_action_routes.each do |app_controller_action_route|
|
91
|
+
set_session_test = generate_set_session_test(app_controller_action_route, set_session_occurrence)
|
92
|
+
set_session_tests << set_session_test
|
93
|
+
end
|
94
|
+
# else
|
95
|
+
# set_session_occurrence exists in non-action method
|
96
|
+
end
|
97
|
+
end
|
98
|
+
format_tests(set_session_tests)
|
99
|
+
end
|
100
|
+
|
101
|
+
def generate_set_session_test(app_controller_action_route, set_session_occurrence)
|
102
|
+
app_controller_route_http_method = get_route_http_method(app_controller_action_route)
|
103
|
+
set_session_test = " describe '#{ app_controller_route_http_method } ##{ set_session_occurrence[:controller_action] }' do\n"
|
104
|
+
set_session_test.concat(" before { #{ app_controller_route_http_method.downcase } :#{ set_session_occurrence[:controller_action] } }\n\n")
|
105
|
+
set_session_occurrence[:session_hashes].each do |session_hash|
|
106
|
+
set_session_test.concat(" it { is_expected.to set_session[#{ session_hash[:session_key] }].to(#{ session_hash[:session_value] }) }\n")
|
107
|
+
end
|
108
|
+
set_session_test.concat(" end")
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module ShouldaMatchmakers
|
2
|
+
module Controller
|
3
|
+
module ActionController
|
4
|
+
class PermittedParamsDefinition
|
5
|
+
|
6
|
+
### Attribute Accessors ###
|
7
|
+
attr_accessor :calls,
|
8
|
+
:defining_controller,
|
9
|
+
:defining_method,
|
10
|
+
:params_array_type,
|
11
|
+
:params_class,
|
12
|
+
:params_class_controller_action,
|
13
|
+
:permitted_params,
|
14
|
+
:permitted_params_string
|
15
|
+
|
16
|
+
def initialize(defining_controller, defining_method, params_class)
|
17
|
+
@calls = []
|
18
|
+
@defining_controller = defining_controller
|
19
|
+
@defining_method = defining_method
|
20
|
+
@params_array_type = ""
|
21
|
+
@params_class = params_class
|
22
|
+
@params_class_controller_action = nil
|
23
|
+
@permitted_params = []
|
24
|
+
@permitted_params_string = ""
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
# module ShouldaMatchmakers
|
34
|
+
# module Controller
|
35
|
+
# module ActionController
|
36
|
+
# class PermittedParamsDefinition
|
37
|
+
#
|
38
|
+
# ### Attribute Accessors ###
|
39
|
+
# attr_accessor :calling_controller,
|
40
|
+
# :defining_method,
|
41
|
+
# :defining_method_calls,
|
42
|
+
# :params_class,
|
43
|
+
# :permitted_params,
|
44
|
+
# :permitted_params_string,
|
45
|
+
# :params_array_type
|
46
|
+
#
|
47
|
+
# def initialize(controller, defining_method, params_class, line)
|
48
|
+
# @calling_controller = controller
|
49
|
+
# @defining_method = defining_method
|
50
|
+
# @defining_method_calls = []
|
51
|
+
# @params_class = params_class
|
52
|
+
# @permitted_params = []
|
53
|
+
# @permitted_params_string = line
|
54
|
+
# @params_array_type = ""
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# end
|
58
|
+
# end
|
59
|
+
# end
|
60
|
+
# end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'haml'
|
2
|
+
require_relative 'controller_matcher_generator_helper'
|
3
|
+
require 'controller/action_controller/action_controller_controller_sm_model'
|
4
|
+
require 'spin_to_win'
|
5
|
+
|
6
|
+
module ShouldaMatchmakers
|
7
|
+
class ControllerMatcherGenerator < Rails::Generators::Base
|
8
|
+
|
9
|
+
include Generator::ActionController::ControllerMatcherGeneratorHelper
|
10
|
+
|
11
|
+
source_root(File.expand_path(File.dirname(__FILE__)))
|
12
|
+
|
13
|
+
class_option :include, type: :array,
|
14
|
+
require: false,
|
15
|
+
aliases: '-i',
|
16
|
+
default: [],
|
17
|
+
desc: "Sets list of application ActionController controllers to INCLUDE in generated tests.\n" +
|
18
|
+
" By default, tests are generated for all ActionController::Base descendants.\n" +
|
19
|
+
" When used, '_included' and '_excluded' settings in '~/config/initializers/shoulda_matchmakers.rb'\n" +
|
20
|
+
" configuration file are ignored. Example (space delimited, include namespaces):\n\n" +
|
21
|
+
" -i DriversController LicensesController Vehicle::CarsController Vehicle::BusesController\n\n\n"
|
22
|
+
|
23
|
+
class_option :exclude, type: :array,
|
24
|
+
require: false,
|
25
|
+
aliases: '-e',
|
26
|
+
default: [],
|
27
|
+
desc: "Sets list of application ActionController controllers to EXCLUDE from generated tests.\n" +
|
28
|
+
" By default, no ActionController::Base descendants are excluded from generated tests.\n" +
|
29
|
+
" When used, '_included' and '_excluded' settings in '~/config/initializers/shoulda_matchmakers.rb'\n" +
|
30
|
+
" configuration file are ignored. Example (space delimited, include namespaces):\n\n" +
|
31
|
+
" -e DriversController Vehicle::CarsController\n\n\n"
|
32
|
+
|
33
|
+
class_option :include_and_config, type: :array,
|
34
|
+
require: false,
|
35
|
+
aliases: '-I',
|
36
|
+
default: [],
|
37
|
+
desc: "Same as '-i/-include', except that '_included' and '_excluded' settings in\n" +
|
38
|
+
" '~/config/initializers/shoulda_matchmakers.rb' are not ignored. Configuration file\n" +
|
39
|
+
" settings are applied first then the controller names listed with this option are applied.\n" +
|
40
|
+
" Example (space delimited, include namespaces):\n\n" +
|
41
|
+
" -I DriversController LicensesController Vehicle::CarsController Vehicle::BusesController\n\n\n"
|
42
|
+
|
43
|
+
class_option :exclude_and_config, type: :array,
|
44
|
+
require: false,
|
45
|
+
aliases: '-E',
|
46
|
+
default: [],
|
47
|
+
desc: "Same as '-e/-exclude', except that '_included' and '_excluded' settings in\n" +
|
48
|
+
" '~/config/initializers/shoulda_matchmakers.rb' are not ignored. Configuration file\n" +
|
49
|
+
" settings are applied first then the controller names listed with this option are applied.\n" +
|
50
|
+
" Example (space delimited, include namespaces):\n\n" +
|
51
|
+
" -E DriversController Vehicle::CarsController\n\n\n"
|
52
|
+
|
53
|
+
def create_controller_matchmakers
|
54
|
+
puts "\n"
|
55
|
+
generator_options = options.to_hash
|
56
|
+
working_generated_code_line_length = ShouldaMatchmakers.configuration.preferred_generated_code_line_length - 6
|
57
|
+
SpinToWin.with_spinner('ShouldaMatchmakers:ControllerMatchers') do |spinner|
|
58
|
+
spinner.banner('initializing...')
|
59
|
+
load_application
|
60
|
+
@app_action_controller_descendants_names = get_app_action_controller_descendants_names
|
61
|
+
end
|
62
|
+
puts "\n"
|
63
|
+
generate_action_controller_controller_matchmakers(generator_options, @app_action_controller_descendants_names, working_generated_code_line_length)
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def generate_action_controller_controller_matchmakers(generator_options, app_action_controller_descendants_names, code_line_length)
|
70
|
+
if app_action_controller_descendants_names.present?
|
71
|
+
selected_app_action_controller_descendants_names = filter_app_action_controller_descendants_names(app_action_controller_descendants_names, generator_options)
|
72
|
+
selected_app_action_controller_descendants_names.each do |app_controller_name|
|
73
|
+
save_generate(app_controller_name) do
|
74
|
+
@action_controller_controller_sm_model = ::ShouldaMatchmakers::Controller::ActionController::ActionControllerControllerSmModel.new(app_controller_name, app_action_controller_descendants_names, code_line_length)
|
75
|
+
template_filename = File.expand_path('../../templates/controller/action_controller/controller_spec_template.haml', File.dirname(__FILE__))
|
76
|
+
template = File.read(template_filename)
|
77
|
+
create_file "#{ ShouldaMatchmakers.configuration.action_controller_controller_tests_path }/#{ app_controller_name.underscore }_spec.rb",
|
78
|
+
Haml::Engine.new(template, filename: template_filename, format: :html5).to_html(binding)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module ShouldaMatchmakers
|
2
|
+
module Generator
|
3
|
+
module ActionController
|
4
|
+
module ControllerMatcherGeneratorHelper
|
5
|
+
|
6
|
+
def load_application
|
7
|
+
Rails.application.try(:eager_load!)
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_app_action_controller_descendants_names
|
11
|
+
if defined?(::ActionController::Base)
|
12
|
+
::ActionController::Base.descendants.map(&:name)
|
13
|
+
else
|
14
|
+
[]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def save_generate(controller_name)
|
19
|
+
begin
|
20
|
+
yield
|
21
|
+
rescue => e
|
22
|
+
puts "Cannot create controller spec for #{ controller_name }. Reason #{ e.message }"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def filter_app_action_controller_descendants_names(app_action_controller_descendants_names, generator_options)
|
27
|
+
generator_include_option_action_controller_controller_names = generator_options.fetch('include')
|
28
|
+
generator_exclude_option_action_controller_controller_names = generator_options.fetch('exclude')
|
29
|
+
generator_include_and_config_options_action_controller_controller_names = generator_options.fetch('include_and_config')
|
30
|
+
generator_exclude_and_config_options_action_controller_controller_names = generator_options.fetch('exclude_and_config')
|
31
|
+
if generator_include_option_action_controller_controller_names.present?
|
32
|
+
filter_action_controller_controller_names_with_include_option(app_action_controller_descendants_names, generator_include_option_action_controller_controller_names)
|
33
|
+
elsif generator_exclude_option_action_controller_controller_names.present?
|
34
|
+
filter_action_controller_controller_names_with_exclude_option(app_action_controller_descendants_names, generator_exclude_option_action_controller_controller_names)
|
35
|
+
elsif generator_include_and_config_options_action_controller_controller_names.present?
|
36
|
+
filter_action_controller_controller_names_with_generator_include_and_config_options(app_action_controller_descendants_names, generator_include_and_config_options_action_controller_controller_names)
|
37
|
+
elsif generator_exclude_and_config_options_action_controller_controller_names.present?
|
38
|
+
filter_action_controller_controller_names_with_generator_exclude_and_config_options(app_action_controller_descendants_names, generator_exclude_and_config_options_action_controller_controller_names)
|
39
|
+
else
|
40
|
+
selected_app_action_controller_descendants_names = filter_action_controller_controller_names_with_config_options(app_action_controller_descendants_names)
|
41
|
+
if selected_app_action_controller_descendants_names.present?
|
42
|
+
selected_app_action_controller_descendants_names
|
43
|
+
else
|
44
|
+
app_action_controller_descendants_names.uniq.sort
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
def filter_action_controller_controller_names_with_include_option(app_action_controller_descendants_names, include_option_action_controller_controller_names)
|
51
|
+
app_action_controller_descendants_names.map.select { |app_controller_name| include_option_action_controller_controller_names.include? app_controller_name }.uniq.sort
|
52
|
+
end
|
53
|
+
|
54
|
+
def filter_action_controller_controller_names_with_exclude_option(app_action_controller_descendants_names, exclude_option_action_controller_controller_names)
|
55
|
+
app_action_controller_descendants_names.map.reject { |app_controller_name| exclude_option_action_controller_controller_names.include? app_controller_name }.uniq.sort
|
56
|
+
end
|
57
|
+
|
58
|
+
def filter_action_controller_controller_names_with_generator_include_and_config_options(app_action_controller_descendants_names, generator_include_and_config_options_action_controller_controller_names)
|
59
|
+
selected_app_action_controller_descendants_names = filter_action_controller_controller_names_with_config_options(app_action_controller_descendants_names)
|
60
|
+
if selected_app_action_controller_descendants_names.present?
|
61
|
+
selected_app_action_controller_descendants_names +
|
62
|
+
filter_action_controller_controller_names_with_include_option(app_action_controller_descendants_names, generator_include_and_config_options_action_controller_controller_names).uniq.sort
|
63
|
+
else
|
64
|
+
filter_action_controller_controller_names_with_include_option(app_action_controller_descendants_names, generator_include_and_config_options_action_controller_controller_names).uniq.sort
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def filter_action_controller_controller_names_with_generator_exclude_and_config_options(app_action_controller_descendants_names, generator_exclude_and_config_options_action_controller_controller_names)
|
69
|
+
selected_action_controller_controller_names = filter_action_controller_controller_names_with_config_options(app_action_controller_descendants_names)
|
70
|
+
if selected_action_controller_controller_names.present?
|
71
|
+
filter_action_controller_controller_names_with_exclude_option(selected_action_controller_controller_names, generator_exclude_and_config_options_action_controller_controller_names).uniq.sort
|
72
|
+
else
|
73
|
+
filter_action_controller_controller_names_with_exclude_option(app_action_controller_descendants_names, generator_exclude_and_config_options_action_controller_controller_names).uniq.sort
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def filter_action_controller_controller_names_with_config_options(app_action_controller_descendants_names)
|
78
|
+
config_included_option_action_controller_controller_names = ShouldaMatchmakers.configuration.action_controller_controller_names_included
|
79
|
+
config_excluded_option_action_controller_controller_names = ShouldaMatchmakers.configuration.action_controller_controller_names_excluded
|
80
|
+
if config_included_option_action_controller_controller_names.present?
|
81
|
+
filter_action_controller_controller_names_with_include_option(app_action_controller_descendants_names, config_included_option_action_controller_controller_names).uniq.sort
|
82
|
+
elsif config_excluded_option_action_controller_controller_names.present?
|
83
|
+
filter_action_controller_controller_names_with_exclude_option(app_action_controller_descendants_names, config_excluded_option_action_controller_controller_names).uniq.sort
|
84
|
+
else
|
85
|
+
[]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|