shoulda_matchmakers 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/controller/action_controller/action_controller_controller_sm_model_helper.rb +0 -7
- data/lib/controller/action_controller/matchmakers/permit.rb +14 -14
- data/lib/controller/action_controller/matchmakers/route.rb +0 -383
- data/lib/model/active_record/matchmakers/have_db_index.rb +1 -1
- data/lib/model/active_record/matchmakers/validations.rb +0 -14
- data/lib/shoulda_matchmakers/version.rb +1 -1
- data/lib/support/controller_generator.rb +2 -54
- data/lib/templates/shoulda_matchmakers.rb +2 -2
- metadata +1 -25
- data/lib/support/indefinite_article.rb +0 -70
- data/lib/support/to_discard/belong_to.rb +0 -94
- data/lib/support/to_discard/have_and_belong_to_many.rb +0 -83
- data/lib/support/to_discard/have_many.rb +0 -96
- data/lib/support/to_discard/have_one.rb +0 -98
- data/lib/support/to_discard/permit_refactor.rb +0 -270
- data/lib/support/to_discard/render_template_new.rb +0 -204
- data/lib/support/to_discard/render_template_reconstruction.rb +0 -188
- data/lib/support/to_discard/use_around_action.rb +0 -20
- data/lib/support/to_discard/use_before_action.rb +0 -20
- data/lib/support/to_discard/validate_absence_of.rb +0 -16
- data/lib/support/to_discard/validate_acceptance_of.rb +0 -16
- data/lib/support/to_discard/validate_confirmation_of.rb +0 -16
- data/lib/support/to_discard/validate_exclusion_of.rb +0 -145
- data/lib/support/to_discard/validate_inclusion_of.rb +0 -94
- data/lib/support/to_discard/validate_length_of.rb +0 -16
- data/lib/support/to_discard/validate_numericality_of.rb +0 -16
- data/lib/support/to_discard/validate_presence_of.rb +0 -16
- data/lib/support/to_discard/validate_uniqueness_of.rb +0 -16
- data/lib/support/to_discard/validation_old.rb +0 -37
- data/lib/support/to_discard/validations.rb +0 -41
- data/lib/support/to_discard/validations_conditional.rb +0 -146
- data/lib/support/trace_debug_lines.txt +0 -319
- data/lib/support/util.rb +0 -15
@@ -1,98 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Model
|
3
|
-
module ActiveRecord
|
4
|
-
module ActiveRecordMatcher
|
5
|
-
module HaveOne
|
6
|
-
|
7
|
-
|
8
|
-
def have_one_matcher_tests
|
9
|
-
have_one_tests = []
|
10
|
-
@active_record_model_sm_model.constantize.reflect_on_all_associations(:has_one).map{ |have_one| { :association_class_name=>have_one.name, :association_options=>have_one.options } }.map do |association|
|
11
|
-
association_class_name = association[:association_class_name].to_s
|
12
|
-
association_options = association[:association_options]
|
13
|
-
have_one_test = generate_have_one_test_single_line(association_class_name, association_options)
|
14
|
-
if have_one_test[0].length > 80 || association_options.count > 1
|
15
|
-
have_one_test = generate_have_one_test_multiple_lines(association_class_name, association_options)
|
16
|
-
end
|
17
|
-
have_one_tests << have_one_test
|
18
|
-
end
|
19
|
-
have_one_tests.flatten.compact.uniq.join("\n\n")
|
20
|
-
end
|
21
|
-
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def generate_have_one_test_single_line(association_class_name, association_options)
|
26
|
-
have_one_test = " it { is_expected.to have_one(:#{ association_class_name })"
|
27
|
-
association_options.map do |option, option_value|
|
28
|
-
have_one_test_option = get_have_one_test_option(option, option_value)
|
29
|
-
have_one_test.concat("." + have_one_test_option) if have_one_test_option.present?
|
30
|
-
end
|
31
|
-
have_one_test.concat(" }")
|
32
|
-
[have_one_test]
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
def generate_have_one_test_multiple_lines(association_class_name, association_options)
|
37
|
-
have_one_test = " it do\n is_expected.to have_one(:#{ association_class_name })"
|
38
|
-
have_one_test_options = get_have_one_test_options(association_options)
|
39
|
-
have_one_test.concat(have_one_test_options) if have_one_test_options.present?
|
40
|
-
have_one_test.concat("\n end")
|
41
|
-
[have_one_test]
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
def get_have_one_test_options(association_options)
|
46
|
-
have_one_test_options = ""
|
47
|
-
association_options.map do |option, option_value|
|
48
|
-
have_one_test_option = get_have_one_test_option(option, option_value)
|
49
|
-
have_one_test_options.concat(".\n " + have_one_test_option) if have_one_test_option.present?
|
50
|
-
end
|
51
|
-
have_one_test_options
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
def get_have_one_test_option(option, option_value)
|
56
|
-
# IMPLEMENTATION TODO: Determine if it is possible to implement 'conditions'
|
57
|
-
case option
|
58
|
-
when :autosave
|
59
|
-
"autosave(#{ option_value })"
|
60
|
-
when :class_name
|
61
|
-
"class_name('#{ option_value }')"
|
62
|
-
when :dependent
|
63
|
-
if option_value.to_s == "true" or option_value.to_s == "false"
|
64
|
-
"dependent(#{ option_value })"
|
65
|
-
else
|
66
|
-
"dependent(:#{ option_value })"
|
67
|
-
end
|
68
|
-
when :foreign_key
|
69
|
-
"with_foreign_key('#{ option_value }')"
|
70
|
-
# IMPLEMENTATION TODO: Determine if Shoulda Matchers recognizes the 'inverse_of' option for 'have_one'
|
71
|
-
# when :inverse_of
|
72
|
-
# "inverse_of(:#{ option_value })"
|
73
|
-
# VERIFICATION TODO: Verify capture of 'order' value due to its unique syntax (e.g. '-> { order("priority desc")' })
|
74
|
-
when :order
|
75
|
-
if option_value.include? '"'
|
76
|
-
"order('#{ option_value }')"
|
77
|
-
else
|
78
|
-
"order(\"#{ option_value }\")"
|
79
|
-
end
|
80
|
-
when :primary_key
|
81
|
-
"with_primary_key('#{ option_value }')"
|
82
|
-
when :source
|
83
|
-
"source(:#{ option_value })"
|
84
|
-
when :through
|
85
|
-
"through(:#{ option_value })"
|
86
|
-
when :validate
|
87
|
-
"validate(#{ option_value })"
|
88
|
-
else
|
89
|
-
# IMPLEMENTATION TODO: Possibly handle this case option as an error or modify evaluation of option (see TODO above)
|
90
|
-
""
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
@@ -1,270 +0,0 @@
|
|
1
|
-
# LATEST REFACTOR =================================================================================
|
2
|
-
|
3
|
-
def get_action_permitted_params_entities(controller)
|
4
|
-
action_permitted_params_entities = []
|
5
|
-
controller_file_path = Rails.root.join("app", "controllers").to_s + "/" +
|
6
|
-
controller.to_s.gsub("::", "/").gsub(/.*[^\/]/) { |pc| pc.underscore }.concat(".rb").gsub("//", "/").to_s
|
7
|
-
if File.exists?(controller_file_path)
|
8
|
-
permitted_params_defs = gather_permitted_params_defs(controller_file_path, controller)
|
9
|
-
if permitted_params_defs.present?
|
10
|
-
action_permitted_params_entities = gather_action_permitted_params_entities(permitted_params_defs)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
action_permitted_params_entities
|
14
|
-
end
|
15
|
-
|
16
|
-
def gather_permitted_params_defs(controller_file_path, controller)
|
17
|
-
controller_method = nil
|
18
|
-
parsing_params = false
|
19
|
-
permitted_params_def = nil
|
20
|
-
permitted_params_defs = []
|
21
|
-
File.open(controller_file_path, 'r') do |controller_file|
|
22
|
-
controller_file.each_line do |line|
|
23
|
-
if line =~ /\s+def\s[A-Za-z0-9_][A-Za-z0-9_!\?=]+/
|
24
|
-
controller_method = update_current_controller_method(line)
|
25
|
-
else
|
26
|
-
if line =~ /params\.require\(:/ && controller_method.present?
|
27
|
-
permitted_params_def = create_permitted_params_def(line, controller.to_s, controller_method)
|
28
|
-
end
|
29
|
-
if line =~ /permit\(/ && permitted_params_def.present? && permitted_params_def.params_class.present?
|
30
|
-
parsing_params = true
|
31
|
-
end
|
32
|
-
if parsing_params
|
33
|
-
permitted_params = get_permitted_params(line)
|
34
|
-
permitted_params_def.permitted_params << permitted_params if permitted_params.present?
|
35
|
-
if line =~ /end\s*\n/
|
36
|
-
permitted_params_def.permitted_params = permitted_params_def.permitted_params.flatten
|
37
|
-
permitted_params_defs << permitted_params_def
|
38
|
-
permitted_params_def = nil
|
39
|
-
controller_method = nil
|
40
|
-
parsing_params = false
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
permitted_params_defs
|
47
|
-
end
|
48
|
-
|
49
|
-
def update_current_controller_method(line)
|
50
|
-
line.scan(/\s+def\s([A-Za-z0-9_][A-Za-z0-9_!\?=]+)/).first.first
|
51
|
-
end
|
52
|
-
|
53
|
-
def create_permitted_params_def(line, controller, controller_method)
|
54
|
-
params_class = line.scan(/params\.require\((:[a-z][a-z0-9_]*)\)/).first.first
|
55
|
-
::ShouldaMatchmakers::Controller::ActionController::PermittedParamsDefinition.new(controller.to_s, controller_method, params_class)
|
56
|
-
end
|
57
|
-
|
58
|
-
def get_permitted_params(line)
|
59
|
-
permitted_params = line.scan(/(:[a-z][a-z0-9_]*)[,\s\)]/)
|
60
|
-
if line =~ /params\.require\(:/
|
61
|
-
permitted_params.shift
|
62
|
-
end
|
63
|
-
permitted_params.flatten.compact.uniq
|
64
|
-
end
|
65
|
-
|
66
|
-
def gather_action_permitted_params_entities(permitted_params_defs)
|
67
|
-
action_permitted_params_entities = []
|
68
|
-
controller_method = nil
|
69
|
-
permitted_params_defs.each do |permitted_params_def|
|
70
|
-
controller_file.each_line do |line|
|
71
|
-
if line =~ /\s+def\s[A-Za-z0-9_][A-Za-z0-9_!\?=]+/
|
72
|
-
controller_method = update_current_controller_method(line)
|
73
|
-
else
|
74
|
-
if line.include?("(" + permitted_params_def.defining_method + ")")
|
75
|
-
action_permitted_params_entity = create_action_permitted_params_entity(line, permitted_params_def, controller_method)
|
76
|
-
if action_permitted_params_entity.params_class_controller_action.present?
|
77
|
-
action_permitted_params_entity.params_class_controller_action = action_permitted_params_entity.params_class_controller_action.first
|
78
|
-
action_permitted_params_entities << action_permitted_params_entity
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
action_permitted_params_entities
|
85
|
-
end
|
86
|
-
|
87
|
-
def create_action_permitted_params_entity(line, permitted_params_def, controller_method)
|
88
|
-
action_permitted_params_entity = permitted_params_def.dup
|
89
|
-
action_permitted_params_entity.calling_method = controller_method
|
90
|
-
action_permitted_params_entity.params_class_controller_action =
|
91
|
-
line.scan(/\s[A-Za-z@][A-Za-z0-9_]*\.([a-z]+)\(#{permitted_params_def.defining_method}\)/).first
|
92
|
-
action_permitted_params_entity
|
93
|
-
end
|
94
|
-
|
95
|
-
# =================================================================================================
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
# FIRST REFACTOR ==================================================================================
|
100
|
-
|
101
|
-
def get_action_permitted_params_entities(controller)
|
102
|
-
controller_file_path = Rails.root.join("app", "controllers").to_s + "/" +
|
103
|
-
controller.to_s.gsub("::", "/").gsub(/.*[^\/]/) { |pc| pc.underscore }.concat(".rb").gsub("//", "/").to_s
|
104
|
-
action_permitted_params_entities = []
|
105
|
-
if File.exists?(controller_file_path)
|
106
|
-
permitted_params_defs = gather_permitted_params_defs(controller_file_path, controller)
|
107
|
-
action_permitted_params_entities = part_two(controller_file_path, permitted_params_defs) if permitted_params_defs.present?
|
108
|
-
end
|
109
|
-
action_permitted_params_entities
|
110
|
-
end
|
111
|
-
|
112
|
-
def gather_permitted_params_defs(controller_file_path, controller)
|
113
|
-
permitted_params_defs = []
|
114
|
-
parsing_params = false
|
115
|
-
controller_method = nil
|
116
|
-
File.open(controller_file_path, 'r') do |controller_file|
|
117
|
-
controller_file.each_line do |line|
|
118
|
-
if line =~ /\s+def\s[A-Za-z0-9_][A-Za-z0-9_!\?=]+/
|
119
|
-
controller_method = line.scan(/\s+def\s([A-Za-z0-9_][A-Za-z0-9_!\?=]+)/).first.first
|
120
|
-
else
|
121
|
-
permitted_params_defs << compose_permitted_params_def(line, controller, controller_method, parsing_params)
|
122
|
-
if parsing_params && line =~ /end\s*\n/
|
123
|
-
parsing_params = false
|
124
|
-
controller_method = nil
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
permitted_params_defs
|
130
|
-
end
|
131
|
-
|
132
|
-
def compose_permitted_params_def(line, controller, controller_method, parsing_params)
|
133
|
-
permitted_params_def = nil
|
134
|
-
if line =~ /params\.require\(:/ && controller_method.present?
|
135
|
-
permitted_params_def = create_permitted_params_def(line, controller, controller_method)
|
136
|
-
end
|
137
|
-
if line =~ /permit\(/ && permitted_params_def.present? && permitted_params_def.params_class.present?
|
138
|
-
parsing_params = true
|
139
|
-
end
|
140
|
-
if parsing_params
|
141
|
-
permitted_params = gather_permitted_params(line)
|
142
|
-
permitted_params_def.permitted_params << permitted_params if permitted_params.present?
|
143
|
-
if line =~ /end\s*\n/
|
144
|
-
permitted_params_def.permitted_params = permitted_params_def.permitted_params.flatten
|
145
|
-
valid_permitted_params_def = permitted_params_def
|
146
|
-
permitted_params_def = nil
|
147
|
-
end
|
148
|
-
end
|
149
|
-
valid_permitted_params_def
|
150
|
-
end
|
151
|
-
|
152
|
-
def create_permitted_params_def(line, controller, controller_method)
|
153
|
-
params_class = line.scan(/params\.require\((:[a-z][a-z0-9_]*)\)/).first.first
|
154
|
-
::ShouldaMatchmakers::Controller::ActionController::PermittedParamsDefinition.new(controller.to_s, controller_method, params_class)
|
155
|
-
end
|
156
|
-
|
157
|
-
def gather_permitted_params(line)
|
158
|
-
permitted_params = line.scan(/(:[a-z][a-z0-9_]*)[,\s\)]/)
|
159
|
-
if line =~ /params\.require\(:/
|
160
|
-
permitted_params.shift
|
161
|
-
end
|
162
|
-
permitted_params.flatten.compact.uniq
|
163
|
-
end
|
164
|
-
|
165
|
-
def gather_get_action_permitted_params_entities(controller_file_path, permitted_params_defs)
|
166
|
-
action_permitted_params_entities = []
|
167
|
-
controller_method = ""
|
168
|
-
File.open(controller_file_path, 'r') do |controller_file|
|
169
|
-
permitted_params_defs.each do |permitted_params_def|
|
170
|
-
controller_file.each_line do |line|
|
171
|
-
if line =~ /\s+def\s[A-Za-z0-9_][A-Za-z0-9_!\?=]+/
|
172
|
-
controller_method = line.scan(/\s+def\s([A-Za-z0-9_][A-Za-z0-9_!\?=]+)/).first.first
|
173
|
-
else
|
174
|
-
action_permitted_params_entity = create_action_permitted_params_entity(line, permitted_params_def, controller_method)
|
175
|
-
action_permitted_params_entities << action_permitted_params_entity if action_permitted_params_entity.present?
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
action_permitted_params_entities
|
181
|
-
end
|
182
|
-
|
183
|
-
def create_action_permitted_params_entity(line, permitted_params_def, controller_method)
|
184
|
-
action_permitted_params_entity = nil
|
185
|
-
if line.include?("(" + permitted_params_def.defining_method + ")")
|
186
|
-
action_permitted_params_entity = permitted_params_def.dup
|
187
|
-
action_permitted_params_entity.calling_method = controller_method
|
188
|
-
action_permitted_params_entity.params_class_controller_action =
|
189
|
-
line.scan(/\s[A-Za-z@][A-Za-z0-9_]*\.([a-z]+)\(#{permitted_params_def.defining_method}\)/).first
|
190
|
-
if action_permitted_params_entity.params_class_controller_action.present?
|
191
|
-
action_permitted_params_entity.params_class_controller_action = action_permitted_params_entity.params_class_controller_action.first
|
192
|
-
else
|
193
|
-
action_permitted_params_entity = nil
|
194
|
-
end
|
195
|
-
end
|
196
|
-
action_permitted_params_entity
|
197
|
-
end
|
198
|
-
|
199
|
-
# =================================================================================================
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
# ORIGINAL ========================================================================================
|
204
|
-
|
205
|
-
def get_action_permitted_params_entities_original(controller)
|
206
|
-
controller_file_path = Rails.root.join("app", "controllers").to_s + "/" +
|
207
|
-
controller.to_s.gsub("::", "/").gsub(/.*[^\/]/) { |pc| pc.underscore }.concat(".rb").gsub("//", "/").to_s
|
208
|
-
|
209
|
-
action_permitted_params_entities = []
|
210
|
-
permitted_params_defs = []
|
211
|
-
permitted_params_def = nil
|
212
|
-
controller_method = nil
|
213
|
-
parsing_params = false
|
214
|
-
|
215
|
-
if File.exists?(controller_file_path)
|
216
|
-
File.open(controller_file_path, 'r') do |controller_file|
|
217
|
-
controller_file.each_line do |line|
|
218
|
-
if line =~ /\s+def\s[A-Za-z0-9_][A-Za-z0-9_!\?=]+/
|
219
|
-
controller_method = line.scan(/\s+def\s([A-Za-z0-9_][A-Za-z0-9_!\?=]+)/).first.first
|
220
|
-
else
|
221
|
-
if line =~ /params\.require\(:/ && controller_method.present?
|
222
|
-
params_class = line.scan(/params\.require\((:[a-z][a-z0-9_]*)\)/).first.first
|
223
|
-
permitted_params_def = ::ShouldaMatchmakers::Controller::ActionController::PermittedParamsDefinition.new(controller.to_s, controller_method, params_class)
|
224
|
-
end
|
225
|
-
if line =~ /permit\(/ && permitted_params_def.present? && permitted_params_def.params_class.present?
|
226
|
-
parsing_params = true
|
227
|
-
end
|
228
|
-
if parsing_params
|
229
|
-
permitted_params = line.scan(/(:[a-z][a-z0-9_]*)[,\s\)]/)
|
230
|
-
if line =~ /params\.require\(:/
|
231
|
-
permitted_params.shift
|
232
|
-
end
|
233
|
-
permitted_params = permitted_params.flatten.compact.uniq
|
234
|
-
permitted_params_def.permitted_params << permitted_params if permitted_params.present?
|
235
|
-
if line =~ /end\s*\n/
|
236
|
-
permitted_params_def.permitted_params = permitted_params_def.permitted_params.flatten
|
237
|
-
permitted_params_defs << permitted_params_def
|
238
|
-
permitted_params_def = nil
|
239
|
-
controller_method = nil
|
240
|
-
parsing_params = false
|
241
|
-
end
|
242
|
-
end
|
243
|
-
end
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
|
248
|
-
File.open(controller_file_path, 'r') do |controller_file|
|
249
|
-
permitted_params_defs.each do |pp_def|
|
250
|
-
controller_file.each_line do |line|
|
251
|
-
if line =~ /\s+def\s[A-Za-z0-9_][A-Za-z0-9_!\?=]+/
|
252
|
-
controller_method = line.scan(/\s+def\s([A-Za-z0-9_][A-Za-z0-9_!\?=]+)/).first.first
|
253
|
-
else
|
254
|
-
if line.include?("(" + pp_def.defining_method + ")")
|
255
|
-
action_permitted_params_entity = pp_def.dup
|
256
|
-
action_permitted_params_entity.calling_method = controller_method
|
257
|
-
action_permitted_params_entity.params_class_controller_action =
|
258
|
-
line.scan(/\s[A-Za-z@][A-Za-z0-9_]*\.([a-z]+)\(#{pp_def.defining_method}\)/).first
|
259
|
-
if action_permitted_params_entity.params_class_controller_action.present?
|
260
|
-
action_permitted_params_entity.params_class_controller_action = action_permitted_params_entity.params_class_controller_action.first
|
261
|
-
action_permitted_params_entities << action_permitted_params_entity
|
262
|
-
end
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
end
|
267
|
-
end
|
268
|
-
end
|
269
|
-
action_permitted_params_entities
|
270
|
-
end
|
@@ -1,204 +0,0 @@
|
|
1
|
-
module ShouldaMatchmakers
|
2
|
-
module Controller
|
3
|
-
module ActionController
|
4
|
-
module Matchmaker
|
5
|
-
module RenderTemplate
|
6
|
-
|
7
|
-
|
8
|
-
def render_template_matcher_tests
|
9
|
-
render_template_occurrences = get_render_template_occurrences(@action_controller_controller_sm_model)
|
10
|
-
if render_template_occurrences.present?
|
11
|
-
generate_render_template_matcher_tests(render_template_occurrences)
|
12
|
-
else
|
13
|
-
[]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def generate_render_template_matcher_tests(render_template_occurrences)
|
21
|
-
render_template_tests = []
|
22
|
-
render_template_occurrences.sort_by!{ |rto| [rto[:view_action], rto[:view_action_http_method]] }
|
23
|
-
render_template_occurrences.each do |render_template|
|
24
|
-
render_template_test = generate_render_template_test_initial(render_template)
|
25
|
-
render_template[:view_action_render_occurrences].sort_by!{ |ro| [ro[:render_view_type], ro[:render_view]] }
|
26
|
-
render_template[:view_action_render_occurrences].each do |render_occurrence|
|
27
|
-
render_template_test.concat(generate_render_occurrence_test(render_occurrence))
|
28
|
-
end
|
29
|
-
render_template_test.concat(" end")
|
30
|
-
render_template_tests << render_template_test
|
31
|
-
end
|
32
|
-
render_template_tests = properly_line_space_tests(render_template_tests)
|
33
|
-
render_template_tests.flatten.compact.uniq.join("\n")
|
34
|
-
end
|
35
|
-
|
36
|
-
def generate_render_template_test_initial(render_template)
|
37
|
-
render_template_test = " describe '#{ render_template[:view_action_http_method] } ##{ render_template[:view_action] }' do\n"
|
38
|
-
render_template_test.concat(" before { #{ render_template[:view_action_http_method].downcase } :#{ render_template[:view_action] } }\n\n")
|
39
|
-
render_template_test.concat(" it { is_expected.to render_template('#{ render_template[:view_action] }') }\n")
|
40
|
-
end
|
41
|
-
|
42
|
-
def generate_render_occurrence_test(render_occurrence)
|
43
|
-
if render_occurrence[:render_view_type] == "partial" && render_occurrence[:render_view].include?("/") ||
|
44
|
-
render_occurrence[:render_view_type] == "file"
|
45
|
-
render_occurrence_test = " it { is_expected.to render_template(#{ render_occurrence[:render_view_type] }: '"
|
46
|
-
elsif render_occurrence[:render_view_type] == "partial"
|
47
|
-
render_occurrence_test = " it { is_expected.to render_template(#{ render_occurrence[:render_view_type] }: '_"
|
48
|
-
elsif render_occurrence[:render_view_type] == "unknown"
|
49
|
-
render_occurrence_test = " # Unknown view type. Remove 'x' from 'xit' once view type identified (e.g. 'partial:', 'file:', etc.)\n"
|
50
|
-
render_occurrence_test.concat(" xit { is_expected.to render_template('")
|
51
|
-
else
|
52
|
-
render_occurrence_test = " it { is_expected.to render_template('"
|
53
|
-
end
|
54
|
-
render_occurrence_test.concat("#{ render_occurrence[:render_view] }') }\n")
|
55
|
-
end
|
56
|
-
|
57
|
-
def get_render_template_occurrences(controller)
|
58
|
-
render_template_occurrences = []
|
59
|
-
app_views_path = Rails.root.join("app", "views").to_s + "/"
|
60
|
-
controller_views_path = app_views_path + controller.underscore.sub(/_controller$/, "/")
|
61
|
-
%w(erb haml slim).each do |view_file_format|
|
62
|
-
render_template_occurrences = render_template_occurrences + get_render_template_occurrences_by_file_type(app_views_path, controller_views_path, view_file_format)
|
63
|
-
end
|
64
|
-
render_template_occurrences
|
65
|
-
end
|
66
|
-
|
67
|
-
def get_render_template_occurrences_by_file_type(app_views_path, controller_views_path, view_file_format)
|
68
|
-
render_template_occurrences_by_file_type = []
|
69
|
-
Dir.glob(controller_views_path + "**/*.html." + view_file_format) do |view_file_path|
|
70
|
-
view_action_render_occurrences = get_view_action_render_occurrences(view_file_path, app_views_path)
|
71
|
-
if view_action_render_occurrences.present?
|
72
|
-
view_action = get_view_from_path(view_file_path).sub(".html." + view_file_format, "")
|
73
|
-
if render_template_containing_method_is_action(controller, view_action)
|
74
|
-
render_template_occurrence = compose_render_template_occurrence_hash(controller, view_action, view_action_render_occurrences)
|
75
|
-
render_template_occurrences_by_file_type << render_template_occurrence
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
render_template_occurrences_by_file_type
|
80
|
-
end
|
81
|
-
|
82
|
-
def compose_render_template_occurrence_hash(controller, view_action, view_action_render_occurrences)
|
83
|
-
route_controller = controller.underscore.sub(/_controller$/, "")
|
84
|
-
view_action_route = Rails.application.routes.set.select { |route| route.defaults[:controller] == route_controller && route.defaults[:action] == view_action }
|
85
|
-
view_action_http_method = view_action_route.first.constraints[:request_method].to_s.gsub("(?-mix:^","").gsub("$)","")
|
86
|
-
{ view_action: view_action, view_action_http_method: view_action_http_method, view_action_render_occurrences: view_action_render_occurrences }
|
87
|
-
end
|
88
|
-
|
89
|
-
def get_view_action_render_occurrences(view_file_path, app_views_path)
|
90
|
-
view_action_render_occurrences = []
|
91
|
-
File.open(view_file_path, 'r') do |view_file|
|
92
|
-
view_file.each_line do |line|
|
93
|
-
if line =~ /(?:\s+render|=render)(?:\s+action:\s+|\s+:action\s+=\>\s+|\s+file:\s+|\s+:file\s+=\>\s+|\s+partial:\s+|\s+:partial\s+=\>\s+|\s+template:\s+|\s+:template\s+=\>\s+|\s+)["':][A-Za-z0-9_\/\.]+"*'*\s*$/
|
94
|
-
view_action_render_occurrence = compose_view_action_render_occurrence_hash(line, app_views_path, view_file_path)
|
95
|
-
view_action_render_occurrences << view_action_render_occurrence
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
view_action_render_occurrences
|
100
|
-
end
|
101
|
-
|
102
|
-
def compose_view_action_render_occurrence_hash(line, app_views_path, view_file_path)
|
103
|
-
render_view_type, render_view_path = line.match(/(?:\s+render|=render)(\s+action:\s+|\s+:action\s+=\>\s+|\s+file:\s+|\s+:file\s+=\>\s+|\s+partial:\s+|\s+:partial\s+=\>\s+|\s+template:\s+|\s+:template\s+=\>\s+|\s+)["':]([A-Za-z0-9_\/\.]+)/).captures
|
104
|
-
if render_view_type.present?
|
105
|
-
render_view_type = render_view_type.gsub(/\s+/,"").gsub(":", "").gsub("=>","")
|
106
|
-
else
|
107
|
-
render_view_type = get_render_view_type(app_views_path, view_file_path, render_view_path)
|
108
|
-
end
|
109
|
-
{ render_view_type: render_view_type, render_view: render_view_path }
|
110
|
-
end
|
111
|
-
|
112
|
-
def get_render_view_type(app_views_path, view_file_path, render_view_path)
|
113
|
-
render_view_and_directory = get_internal_render_view_and_directory(app_views_path, view_file_path, render_view_path)
|
114
|
-
render_view_type = identify_internal_render_view_type(render_view_and_directory, app_views_path)
|
115
|
-
if render_view_type == "unknown" && render_view_path.include?("/")
|
116
|
-
render_view_and_directory = get_external_render_view_and_directory(render_view_path)
|
117
|
-
render_view_type = identify_external_render_view_type(render_view_and_directory)
|
118
|
-
end
|
119
|
-
render_view_type
|
120
|
-
end
|
121
|
-
|
122
|
-
def get_internal_render_view_and_directory(app_views_path, view_file_path, render_view_path)
|
123
|
-
if render_view_path.include?("/")
|
124
|
-
render_view_directory = get_view_directory_prepended(render_view_path,app_views_path)
|
125
|
-
render_view = get_view_from_path(render_view_path).sub(/^\s*_/,"")
|
126
|
-
else
|
127
|
-
render_view_directory = get_view_directory_from_path(view_file_path)
|
128
|
-
render_view = render_view_path.sub(/^\s*_/,"")
|
129
|
-
end
|
130
|
-
{ directory: render_view_directory, view: render_view }
|
131
|
-
end
|
132
|
-
|
133
|
-
|
134
|
-
def get_external_render_view_and_directory(render_view_path)
|
135
|
-
render_view_directory = get_view_directory_from_path(render_view_path)
|
136
|
-
render_view = get_view_from_path(render_view_path)
|
137
|
-
{ directory: render_view_directory, view: render_view }
|
138
|
-
end
|
139
|
-
|
140
|
-
|
141
|
-
def get_view_from_path(view_path)
|
142
|
-
view_path.scan(/\/([a-zA-z0-9.]+)$/).last.first
|
143
|
-
end
|
144
|
-
|
145
|
-
|
146
|
-
def get_view_directory_from_path(view_path)
|
147
|
-
view_path.sub(/\/[a-zA-z0-9.]+$/,"/")
|
148
|
-
end
|
149
|
-
|
150
|
-
|
151
|
-
def get_view_directory_prepended(view_path, prepend_path)
|
152
|
-
view_path.sub(/\/[a-zA-z0-9.]+$/,"/").prepend(prepend_path)
|
153
|
-
end
|
154
|
-
|
155
|
-
|
156
|
-
def identify_internal_render_view_type(render_view_and_directory, app_views_path)
|
157
|
-
render_view_type = "unknown"
|
158
|
-
if view_partial_exist(render_view_and_directory)
|
159
|
-
render_view_type = "partial"
|
160
|
-
elsif view_exist(render_view_and_directory)
|
161
|
-
render_view_controller_name = get_controller_name_from_view_directory_path(render_view_and_directory[:directory], app_views_path)
|
162
|
-
if render_view_controller_name.present? && render_template_containing_method_is_action(render_view_controller_name, render_view_and_directory[:view])
|
163
|
-
render_view_type = "action"
|
164
|
-
else
|
165
|
-
render_view_type = "template"
|
166
|
-
end
|
167
|
-
end
|
168
|
-
render_view_type
|
169
|
-
end
|
170
|
-
|
171
|
-
def identify_external_render_view_type(render_view_and_directory)
|
172
|
-
render_view_type = "unknown"
|
173
|
-
if view_partial_exist(render_view_and_directory) || view_exist(render_view_and_directory)
|
174
|
-
render_view_type = "file"
|
175
|
-
end
|
176
|
-
render_view_type
|
177
|
-
end
|
178
|
-
|
179
|
-
def view_exist(render_view_and_directory)
|
180
|
-
File.exist?(render_view_and_directory[:directory] + render_view_and_directory[:view] + ".html.erb") ||
|
181
|
-
File.exist?(render_view_and_directory[:directory] + render_view_and_directory[:view] + ".html.haml") ||
|
182
|
-
File.exist?(render_view_and_directory[:directory] + render_view_and_directory[:view] + ".html.slim")
|
183
|
-
end
|
184
|
-
|
185
|
-
def view_partial_exist(render_view_and_directory)
|
186
|
-
File.exist?(render_view_and_directory[:directory] + "_" + render_view_and_directory[:view] + ".html.erb") ||
|
187
|
-
File.exist?(render_view_and_directory[:directory] + "_" + render_view_and_directory[:view] + ".html.haml") ||
|
188
|
-
File.exist?(render_view_and_directory[:directory] + "_" + render_view_and_directory[:view] + ".html.slim")
|
189
|
-
end
|
190
|
-
|
191
|
-
def get_controller_name_from_view_directory_path(view_directory_path, app_views_path)
|
192
|
-
view_directory_path.sub(app_views_path, "").sub(/\/$/,"").concat("_controller").camelize
|
193
|
-
end
|
194
|
-
|
195
|
-
def render_template_containing_method_is_action(controller, action_candidate)
|
196
|
-
controller.constantize.instance_methods(false).include?(action_candidate.to_sym)
|
197
|
-
end
|
198
|
-
|
199
|
-
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|