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,204 @@
|
|
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
|
@@ -0,0 +1,188 @@
|
|
1
|
+
module ShouldaMatchmakers
|
2
|
+
module Controller
|
3
|
+
module ActionController
|
4
|
+
module Matchmaker
|
5
|
+
module RenderTemplate
|
6
|
+
|
7
|
+
def render_template_matcher_tests
|
8
|
+
render_template_occurrences = get_render_template_occurrences(@action_controller_controller_sm_model)
|
9
|
+
if render_template_occurrences.present?
|
10
|
+
generate_render_template_matcher_tests(render_template_occurrences)
|
11
|
+
else
|
12
|
+
[]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def generate_render_template_matcher_tests(render_template_occurrences)
|
20
|
+
render_template_tests = []
|
21
|
+
render_template_occurrences.sort_by!{ |render_template| [render_template[:view_action], render_template[:view_action_http_method]] }
|
22
|
+
render_template_occurrences.each do |render_template|
|
23
|
+
render_template_test = " describe '#{ render_template[:view_action_http_method] } ##{ render_template[:view_action] }' do\n"
|
24
|
+
render_template_test.concat(" before { #{ render_template[:view_action_http_method].downcase } :#{ render_template[:view_action] } }\n\n")
|
25
|
+
render_template_test.concat(" it { is_expected.to render_template('#{ render_template[:view_action] }') }\n")
|
26
|
+
render_template[:view_action_render_occurrences].sort_by!{ |render_occurrence| [render_occurrence[:render_view_type], render_occurrence[:render_view]] }
|
27
|
+
render_template[:view_action_render_occurrences].each do |render_occurrence|
|
28
|
+
if render_occurrence[:render_view_type] == "partial" && render_occurrence[:render_view].include?("/") ||
|
29
|
+
render_occurrence[:render_view_type] == "file"
|
30
|
+
render_template_test.concat(" it { is_expected.to render_template(#{ render_occurrence[:render_view_type] }: '")
|
31
|
+
elsif render_occurrence[:render_view_type] == "partial"
|
32
|
+
render_template_test.concat(" it { is_expected.to render_template(#{ render_occurrence[:render_view_type] }: '_")
|
33
|
+
elsif render_occurrence[:render_view_type] == "unknown"
|
34
|
+
render_template_test.concat(" # Unknown view type. Remove 'x' from 'xit' once view type identified (e.g. 'partial:', 'file:', etc.)\n")
|
35
|
+
render_template_test.concat(" xit { is_expected.to render_template('")
|
36
|
+
else
|
37
|
+
render_template_test.concat(" it { is_expected.to render_template('")
|
38
|
+
end
|
39
|
+
render_template_test.concat("#{ render_occurrence[:render_view] }') }\n")
|
40
|
+
end
|
41
|
+
render_template_test.concat(" end")
|
42
|
+
render_template_tests << render_template_test
|
43
|
+
end
|
44
|
+
render_template_tests = properly_line_space_tests(render_template_tests)
|
45
|
+
render_template_tests.flatten.compact.uniq.join("\n")
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def get_render_template_occurrences(controller)
|
50
|
+
render_template_occurrences = []
|
51
|
+
app_views_path = Rails.root.join("app", "views").to_s + "/"
|
52
|
+
controller_views_path = app_views_path + controller.underscore.sub(/_controller$/, "/")
|
53
|
+
%w(erb haml slim).each do |view_file_format|
|
54
|
+
render_template_occurrences = render_template_occurrences + get_render_template_occurrences_by_file_type(app_views_path, controller_views_path, view_file_format)
|
55
|
+
end
|
56
|
+
render_template_occurrences
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_render_template_occurrences_by_file_type(app_views_path, controller_views_path, view_file_format)
|
60
|
+
render_template_occurrences_by_file_type = []
|
61
|
+
Dir.glob(controller_views_path + "**/*.html." + view_file_format) do |view_file_path|
|
62
|
+
view_action_render_occurrences = []
|
63
|
+
File.open(view_file_path, 'r') do |view_file|
|
64
|
+
view_file.each_line do |line|
|
65
|
+
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*$/
|
66
|
+
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
|
67
|
+
if render_view_type.present?
|
68
|
+
render_view_type = render_view_type.gsub(/\s+/,"").gsub(":", "").gsub("=>","")
|
69
|
+
else
|
70
|
+
render_view_type = get_render_view_type(app_views_path, view_file_path, render_view_path)
|
71
|
+
end
|
72
|
+
view_action_render_occurrence = { render_view_type: render_view_type, render_view: render_view_path }
|
73
|
+
view_action_render_occurrences << view_action_render_occurrence
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
if view_action_render_occurrences.present?
|
78
|
+
view_action = get_view_from_path(view_file_path).sub(".html." + view_file_format, "")
|
79
|
+
if render_template_containing_method_is_action(controller, view_action)
|
80
|
+
route_controller = controller.underscore.sub(/_controller$/, "")
|
81
|
+
view_action_route = Rails.application.routes.set.select { |route| route.defaults[:controller] == route_controller && route.defaults[:action] == view_action }
|
82
|
+
view_action_http_method = view_action_route.first.constraints[:request_method].to_s.gsub("(?-mix:^","").gsub("$)","")
|
83
|
+
render_template_occurrence = { view_action: view_action, view_action_http_method: view_action_http_method, view_action_render_occurrences: view_action_render_occurrences }
|
84
|
+
render_template_occurrences_by_file_type << render_template_occurrence
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
render_template_occurrences_by_file_type
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_render_view_type(app_views_path, view_file_path, render_view_path)
|
92
|
+
render_view_and_directory = get_internal_render_view_and_directory(app_views_path, view_file_path, render_view_path)
|
93
|
+
render_view_type = identify_internal_render_view_type(render_view_and_directory, app_views_path)
|
94
|
+
if render_view_type == "unknown" && render_view_path.include?("/")
|
95
|
+
render_view_and_directory = get_external_render_view_and_directory(render_view_path)
|
96
|
+
render_view_type = identify_external_render_view_type(render_view_and_directory)
|
97
|
+
end
|
98
|
+
render_view_type
|
99
|
+
end
|
100
|
+
|
101
|
+
def get_internal_render_view_and_directory(app_views_path, view_file_path, render_view_path)
|
102
|
+
if render_view_path.include?("/")
|
103
|
+
render_view_directory = get_view_directory_prepended(render_view_path,app_views_path)
|
104
|
+
render_view = get_view_from_path(render_view_path).sub(/^\s*_/,"")
|
105
|
+
else
|
106
|
+
render_view_directory = get_view_directory_from_path(view_file_path)
|
107
|
+
render_view = render_view_path.sub(/^\s*_/,"")
|
108
|
+
end
|
109
|
+
{ directory: render_view_directory, view: render_view }
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
def get_external_render_view_and_directory(render_view_path)
|
114
|
+
render_view_directory = get_view_directory_from_path(render_view_path)
|
115
|
+
render_view = get_view_from_path(render_view_path)
|
116
|
+
{ directory: render_view_directory, view: render_view }
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
def get_view_from_path(view_path)
|
121
|
+
view_path.scan(/\/([a-zA-z0-9.]+)$/).last.first
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
def get_view_directory_from_path(view_path)
|
126
|
+
view_path.sub(/\/[a-zA-z0-9.]+$/,"/")
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
def get_view_directory_prepended(view_path, prepend_path)
|
131
|
+
view_path.sub(/\/[a-zA-z0-9.]+$/,"/").prepend(prepend_path)
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
def identify_internal_render_view_type(render_view_and_directory, app_views_path)
|
136
|
+
render_view_type = "unknown"
|
137
|
+
if view_partial_exist(render_view_and_directory)
|
138
|
+
render_view_type = "partial"
|
139
|
+
elsif view_exist(render_view_and_directory)
|
140
|
+
render_view_controller_name = get_controller_name_from_view_directory_path(render_view_and_directory[:directory], app_views_path)
|
141
|
+
if render_view_controller_name.present? && render_template_containing_method_is_action(render_view_controller_name, render_view_and_directory[:view])
|
142
|
+
render_view_type = "action"
|
143
|
+
else
|
144
|
+
render_view_type = "template"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
render_view_type
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
def identify_external_render_view_type(render_view_and_directory)
|
152
|
+
render_view_type = "unknown"
|
153
|
+
if view_partial_exist(render_view_and_directory) || view_exist(render_view_and_directory)
|
154
|
+
render_view_type = "file"
|
155
|
+
end
|
156
|
+
render_view_type
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
def view_exist(render_view_and_directory)
|
161
|
+
File.exist?(render_view_and_directory[:directory] + render_view_and_directory[:view] + ".html.erb") ||
|
162
|
+
File.exist?(render_view_and_directory[:directory] + render_view_and_directory[:view] + ".html.haml") ||
|
163
|
+
File.exist?(render_view_and_directory[:directory] + render_view_and_directory[:view] + ".html.slim")
|
164
|
+
end
|
165
|
+
|
166
|
+
|
167
|
+
def view_partial_exist(render_view_and_directory)
|
168
|
+
File.exist?(render_view_and_directory[:directory] + "_" + render_view_and_directory[:view] + ".html.erb") ||
|
169
|
+
File.exist?(render_view_and_directory[:directory] + "_" + render_view_and_directory[:view] + ".html.haml") ||
|
170
|
+
File.exist?(render_view_and_directory[:directory] + "_" + render_view_and_directory[:view] + ".html.slim")
|
171
|
+
end
|
172
|
+
|
173
|
+
|
174
|
+
def get_controller_name_from_view_directory_path(view_directory_path, app_views_path)
|
175
|
+
view_directory_path.sub(app_views_path, "").sub(/\/$/,"").concat("_controller").camelize
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
def render_template_containing_method_is_action(controller, action_candidate)
|
180
|
+
controller.constantize.instance_methods(false).include?(action_candidate.to_sym)
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ShouldaMatchmakers
|
2
|
+
module Controller
|
3
|
+
module ActionController
|
4
|
+
module ActionControllerMatcher
|
5
|
+
module UseAroundAction
|
6
|
+
|
7
|
+
def use_around_action_matcher_tests
|
8
|
+
around_action_tests = []
|
9
|
+
around_actions.map do |action|
|
10
|
+
around_action_test = " it { is_expected.to use_around_action(#{ action }) }"
|
11
|
+
around_action_tests << [around_action_test]
|
12
|
+
end
|
13
|
+
around_action_tests.flatten.compact.uniq.join("\n")
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ShouldaMatchmakers
|
2
|
+
module Controller
|
3
|
+
module ActionController
|
4
|
+
module ActionControllerMatcher
|
5
|
+
module UseBeforeAction
|
6
|
+
|
7
|
+
def use_before_action_matcher_tests
|
8
|
+
before_action_tests = []
|
9
|
+
before_actions.map do |action|
|
10
|
+
before_action_test = " it { is_expected.to use_before_action(#{ action }) }"
|
11
|
+
before_action_tests << [before_action_test]
|
12
|
+
end
|
13
|
+
before_action_tests.flatten.compact.uniq.join("\n")
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ShouldaMatchmakers
|
2
|
+
module Model
|
3
|
+
module ActiveRecord
|
4
|
+
module ActiveModelMatcher
|
5
|
+
module ValidateAbsenceOf
|
6
|
+
|
7
|
+
def validate_absence_of_matcher_tests
|
8
|
+
absence_validators = extract_validators(@active_record_model_sm_model, ::ActiveModel::Validations::AbsenceValidator).flatten
|
9
|
+
generate_validator_matcher_tests(absence_validators)
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|