shoulda_matchmakers 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +21 -0
  4. data/lib/controller/action_controller/action_controller_controller_sm_model.rb +53 -0
  5. data/lib/controller/action_controller/action_controller_controller_sm_model_helper.rb +73 -0
  6. data/lib/controller/action_controller/matchmakers/callbacks.rb +56 -0
  7. data/lib/controller/action_controller/matchmakers/filter_param.rb +69 -0
  8. data/lib/controller/action_controller/matchmakers/permit.rb +510 -0
  9. data/lib/controller/action_controller/matchmakers/redirect_to.rb +126 -0
  10. data/lib/controller/action_controller/matchmakers/render_template.rb +198 -0
  11. data/lib/controller/action_controller/matchmakers/render_with_layout.rb +72 -0
  12. data/lib/controller/action_controller/matchmakers/rescue_from.rb +96 -0
  13. data/lib/controller/action_controller/matchmakers/respond_with.rb +71 -0
  14. data/lib/controller/action_controller/matchmakers/route.rb +586 -0
  15. data/lib/controller/action_controller/matchmakers/set_flash.rb +136 -0
  16. data/lib/controller/action_controller/matchmakers/set_session.rb +115 -0
  17. data/lib/controller/action_controller/permitted_params_definition.rb +60 -0
  18. data/lib/generators/shoulda_matchmakers/controller_matcher_generator.rb +87 -0
  19. data/lib/generators/shoulda_matchmakers/controller_matcher_generator_helper.rb +92 -0
  20. data/lib/generators/shoulda_matchmakers/factory_generator.rb +86 -0
  21. data/lib/generators/shoulda_matchmakers/install_generator.rb +10 -0
  22. data/lib/generators/shoulda_matchmakers/model_matcher_generator.rb +87 -0
  23. data/lib/generators/shoulda_matchmakers/model_matcher_generator_helper.rb +107 -0
  24. data/lib/model/active_record/active_record_model_sm_model.rb +50 -0
  25. data/lib/model/active_record/active_record_model_sm_model_helper.rb +206 -0
  26. data/lib/model/active_record/factory_sm_model.rb +28 -0
  27. data/lib/model/active_record/factory_sm_model_helper.rb +124 -0
  28. data/lib/model/active_record/matchmakers/accept_nested_attributes_for.rb +66 -0
  29. data/lib/model/active_record/matchmakers/allow_value.rb +137 -0
  30. data/lib/model/active_record/matchmakers/associations.rb +52 -0
  31. data/lib/model/active_record/matchmakers/define_enum_for.rb +53 -0
  32. data/lib/model/active_record/matchmakers/delegate_method.rb +101 -0
  33. data/lib/model/active_record/matchmakers/have_db_column.rb +33 -0
  34. data/lib/model/active_record/matchmakers/have_db_index.rb +39 -0
  35. data/lib/model/active_record/matchmakers/have_readonly_attribute.rb +32 -0
  36. data/lib/model/active_record/matchmakers/have_secure_password.rb +32 -0
  37. data/lib/model/active_record/matchmakers/serialize.rb +67 -0
  38. data/lib/model/active_record/matchmakers/validations.rb +169 -0
  39. data/lib/model/active_record/options_definition.rb +160 -0
  40. data/lib/shoulda_matchmakers.rb +48 -0
  41. data/lib/shoulda_matchmakers/version.rb +3 -0
  42. data/lib/support/command_line_interface.rb +100 -0
  43. data/lib/support/controller_generator.rb +198 -0
  44. data/lib/support/indefinite_article.rb +70 -0
  45. data/lib/support/to_discard/belong_to.rb +94 -0
  46. data/lib/support/to_discard/have_and_belong_to_many.rb +83 -0
  47. data/lib/support/to_discard/have_many.rb +96 -0
  48. data/lib/support/to_discard/have_one.rb +98 -0
  49. data/lib/support/to_discard/permit_refactor.rb +270 -0
  50. data/lib/support/to_discard/render_template_new.rb +204 -0
  51. data/lib/support/to_discard/render_template_reconstruction.rb +188 -0
  52. data/lib/support/to_discard/use_around_action.rb +20 -0
  53. data/lib/support/to_discard/use_before_action.rb +20 -0
  54. data/lib/support/to_discard/validate_absence_of.rb +16 -0
  55. data/lib/support/to_discard/validate_acceptance_of.rb +16 -0
  56. data/lib/support/to_discard/validate_confirmation_of.rb +16 -0
  57. data/lib/support/to_discard/validate_exclusion_of.rb +145 -0
  58. data/lib/support/to_discard/validate_inclusion_of.rb +94 -0
  59. data/lib/support/to_discard/validate_length_of.rb +16 -0
  60. data/lib/support/to_discard/validate_numericality_of.rb +16 -0
  61. data/lib/support/to_discard/validate_presence_of.rb +16 -0
  62. data/lib/support/to_discard/validate_uniqueness_of.rb +16 -0
  63. data/lib/support/to_discard/validation_old.rb +37 -0
  64. data/lib/support/to_discard/validations.rb +41 -0
  65. data/lib/support/to_discard/validations_conditional.rb +146 -0
  66. data/lib/support/trace_debug_lines.txt +319 -0
  67. data/lib/support/util.rb +15 -0
  68. data/lib/templates/controller/action_controller/controller_spec_template.haml +146 -0
  69. data/lib/templates/factory/active_record/factory_template.haml +13 -0
  70. data/lib/templates/model/active_record/model_spec_template.haml +233 -0
  71. data/lib/templates/shoulda_matchmakers.rb +112 -0
  72. 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