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