shoulda_matchmakers 0.1.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.
- 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
|