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,101 @@
1
+ module ShouldaMatchmakers
2
+ module Model
3
+ module ActiveRecord
4
+ module Matchmaker
5
+ module DelegateMethod
6
+
7
+
8
+ def delegate_method_matcher_tests
9
+ delegate_method_occurrences = get_delegate_method_occurrences(@app_class_name)
10
+ if delegate_method_occurrences.present?
11
+ generate_delegate_method_matcher_tests(delegate_method_occurrences)
12
+ else
13
+ []
14
+ end
15
+ end
16
+
17
+
18
+ private
19
+
20
+ def get_delegate_method_occurrences(app_class_name)
21
+ delegate_method_occurrences = []
22
+ app_model_file_path = compose_extended_model_file_path(app_class_name)
23
+ if File.exists?(app_model_file_path)
24
+ File.open(app_model_file_path, 'r') do |app_model_file|
25
+ app_model_file.each_line do |app_model_file_line|
26
+ if app_model_file_line =~ /^\s+delegate(?:\s*\(\s*|\s+):[A-Za-z0-9_@]+/
27
+ delegate_method_occurrences = delegate_method_occurrences + get_delegate_delegate_method_occurrences(app_model_file_line)
28
+ elsif app_model_file_line =~ /^\s+def(?:_instance)?_delegators?(?:\s*\(\s*|\s+):[A-Za-z0-9_@]+/
29
+ delegate_method_occurrences = delegate_method_occurrences + get_def_delegate_delegate_method_occurrences(app_model_file_line)
30
+ end
31
+ end
32
+ end
33
+ else
34
+ delegate_method_occurrences = []
35
+ end
36
+ delegate_method_occurrences
37
+ end
38
+
39
+ def get_delegate_delegate_method_occurrences(app_model_file_line)
40
+ delegate_delegate_method_occurrences = []
41
+ delegated_methods = app_model_file_line.scan(/(?:^\s+delegate(?:\s*\(\s*|\s+)|,\s*)(:[A-Za-z0-9_@]+)/).flatten
42
+ delegate = app_model_file_line.scan(/,\s*to:\s+(:?[A-Za-z0-9_@]+)/).flatten
43
+ if delegate.present? && delegated_methods.present?
44
+ prefix = app_model_file_line.scan(/,\s*prefix:\s+(:?[A-Za-z0-9_@]+)/).flatten
45
+ arguments = app_model_file_line.scan(/,\s*([A-Za-z0-9_@]+:\s+:?[A-Za-z0-9_@]+)/)
46
+ arguments = arguments.flatten.reject{ |argument| argument =~ /^to:/ || argument =~ /^prefix:/ }
47
+ delegated_methods.each do |delegated_method|
48
+ delegate_method_hash = { delegate: delegate[0], method: delegated_method, prefix: "", arguments: [] }
49
+ delegate_method_hash[:prefix] = prefix[0] if prefix.present?
50
+ delegate_method_hash[:arguments] = arguments if arguments.present?
51
+ delegate_delegate_method_occurrences = append_element(delegate_method_hash, delegate_delegate_method_occurrences)
52
+ end
53
+ end
54
+ delegate_delegate_method_occurrences
55
+ end
56
+
57
+ def get_def_delegate_delegate_method_occurrences(app_model_file_line)
58
+ def_delegate_delegate_method_occurrences = []
59
+ delegate = app_model_file_line.scan(/^\s+def(?:_instance)?_delegators?(?:\s*\(\s*|\s+)(:[A-Za-z0-9_@]+)/).flatten
60
+ delegated_methods = app_model_file_line.scan(/,\s*(:[A-Za-z0-9_@]+)/).flatten
61
+ if delegate.present? && delegated_methods.present?
62
+ delegated_methods.each do |delegated_method|
63
+ delegate_method_hash = { delegate: delegate[0], method: delegated_method, prefix: "", arguments: [] }
64
+ def_delegate_delegate_method_occurrences = append_element(delegate_method_hash, def_delegate_delegate_method_occurrences)
65
+ end
66
+ end
67
+ def_delegate_delegate_method_occurrences
68
+ end
69
+
70
+ def generate_delegate_method_matcher_tests(delegate_method_occurrences)
71
+ delegate_method_tests = []
72
+ delegate_method_occurrences.sort_by!{ |dmo| [dmo[:method], dmo[:delegate], dmo[:prefix], dmo[:arguments]] }
73
+ delegate_method_occurrences = delegate_method_occurrences.uniq
74
+ delegate_method_occurrences.each do |delegate_method_occurrence|
75
+ delegate_method_test = generate_delegate_method_test(delegate_method_occurrence)
76
+ delegate_method_tests = append_element(delegate_method_test, delegate_method_tests)
77
+ end
78
+ format_tests(delegate_method_tests)
79
+ end
80
+
81
+ def generate_delegate_method_test(delegate_method_occurrence)
82
+ delegate_method_test = " it { is_expected.to delegate_method(#{ delegate_method_occurrence[:method] }).to(#{ delegate_method_occurrence[:delegate] })"
83
+ if delegate_method_occurrence[:prefix].present?
84
+ delegate_method_test.concat(".with_prefix(#{ delegate_method_occurrence[:prefix] })")
85
+ end
86
+ if delegate_method_occurrence[:arguments].present?
87
+ delegate_method_test.concat(".with_arguments(")
88
+ delegate_method_occurrence[:arguments].each do |delegate_method_argument|
89
+ delegate_method_test.concat("#{ delegate_method_argument }, ")
90
+ end
91
+ delegate_method_test.chomp!(", ").concat(")")
92
+ end
93
+ delegate_method_test.concat(" }")
94
+ end
95
+
96
+
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,33 @@
1
+ module ShouldaMatchmakers
2
+ module Model
3
+ module ActiveRecord
4
+ module Matchmaker
5
+ module HaveDbColumn
6
+
7
+
8
+ def have_db_column_matcher_tests
9
+ db_columns = @app_class_name.constantize.columns
10
+ if db_columns.present?
11
+ generate_have_db_column_matcher_tests(db_columns)
12
+ else
13
+ []
14
+ end
15
+ end
16
+
17
+
18
+ private
19
+
20
+ def generate_have_db_column_matcher_tests(db_columns)
21
+ db_column_tests = []
22
+ db_columns.each do |db_column|
23
+ db_column_test = " it { is_expected.to have_db_column(:#{ db_column.name }).of_type(:#{ db_column.type }) }"
24
+ db_column_tests = append_element(db_column_test, db_column_tests)
25
+ end
26
+ format_tests(db_column_tests)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,39 @@
1
+ module ShouldaMatchmakers
2
+ module Model
3
+ module ActiveRecord
4
+ module Matchmaker
5
+ module HaveDbIndex
6
+
7
+ def have_db_index_matcher_tests
8
+ # IMPLEMENTATION TODO: Determine if it is possible to indexes where 'using=:gin' (or anything not :btree)
9
+ db_indexes = ::ActiveRecord::Base.connection.indexes(@app_class_name.tableize.gsub("/", "_")).select{ |ndx| ndx.using == :btree }
10
+ if db_indexes.present?
11
+ generate_have_db_index_matcher_tests(db_indexes)
12
+ else
13
+ []
14
+ end
15
+ end
16
+
17
+
18
+ private
19
+
20
+ def generate_have_db_index_matcher_tests(db_indexes)
21
+ db_index_tests = []
22
+ db_indexes.map do |ndx|
23
+ if ndx.columns.length == 1
24
+ db_index_test = " it { is_expected.to have_db_index(:#{ ndx.columns[0] })"
25
+ else
26
+ db_index_test = " it { is_expected.to have_db_index(#{ ndx.columns.map { |c| c.to_sym } })"
27
+ end
28
+ db_index_test.concat(".unique") if ndx.unique
29
+ db_index_test.concat(" }")
30
+ db_index_tests = append_element(db_index_test, db_index_tests)
31
+ end
32
+ format_tests(db_index_tests)
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,32 @@
1
+ module ShouldaMatchmakers
2
+ module Model
3
+ module ActiveRecord
4
+ module Matchmaker
5
+ module HaveReadonlyAttribute
6
+
7
+ def have_readonly_attribute_matcher_tests
8
+ readonly_attributes = @app_class_name.constantize.readonly_attributes
9
+ if readonly_attributes.present?
10
+ generate_have_readonly_attribute_matcher_tests(readonly_attributes)
11
+ else
12
+ []
13
+ end
14
+ end
15
+
16
+
17
+ private
18
+
19
+ def generate_have_readonly_attribute_matcher_tests(readonly_attributes)
20
+ readonly_attribute_tests = []
21
+ readonly_attributes.each do |attribute|
22
+ readonly_attribute_test = " it { is_expected.to have_readonly_attribute(:#{ attribute }) }"
23
+ readonly_attribute_tests = append_element(readonly_attribute_test, readonly_attribute_tests)
24
+ end
25
+ format_tests(readonly_attribute_tests)
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ module ShouldaMatchmakers
2
+ module Model
3
+ module ActiveRecord
4
+ module Matchmaker
5
+ module HaveSecurePassword
6
+
7
+ def have_secure_password_matcher_tests
8
+ model_methods = @app_class_name.constantize.methods
9
+ model_instance_methods = @app_class_name.constantize.instance_methods
10
+ if model_methods.present? && model_instance_methods.present?
11
+ generate_have_secure_password_matcher_tests(model_methods, model_instance_methods)
12
+ else
13
+ []
14
+ end
15
+ end
16
+
17
+
18
+ private
19
+
20
+ def generate_have_secure_password_matcher_tests(model_methods, model_instance_methods)
21
+ secure_password_test = ""
22
+ if model_instance_methods.include?(:password_digest) && model_methods.exclude?(:devise_parameter_filter)
23
+ secure_password_test = " it { is_expected.to have_secure_password }"
24
+ end
25
+ secure_password_test
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,67 @@
1
+ module ShouldaMatchmakers
2
+ module Model
3
+ module ActiveRecord
4
+ module Matchmaker
5
+ module Serialize
6
+
7
+
8
+ def serialize_matcher_tests
9
+ serialized_attributes = @app_class_name.constantize.serialized_attributes
10
+ if serialized_attributes.present?
11
+ generate_serialize_matcher_tests(serialized_attributes)
12
+ else
13
+ []
14
+ end
15
+ end
16
+
17
+
18
+ private
19
+
20
+ def generate_serialize_matcher_tests(serialized_attributes)
21
+ serialize_tests = []
22
+ serialized_attributes.map do |attribute, cast_type|
23
+ object_class = cast_type.try(:object_class)
24
+ if %w(Array Hash Object).include?(object_class.to_s) || (object_class == nil && cast_type.to_s.include?("JSON"))
25
+ serialize_test = generate_serialize_test(attribute, object_class)
26
+ serialize_tests = append_element(serialize_test, serialize_tests)
27
+ else
28
+ custom_serialize_test = generate_custom_serialize_test(attribute, cast_type, object_class)
29
+ serialize_tests = append_element(custom_serialize_test, serialize_tests)
30
+ end
31
+ end
32
+ format_tests(serialize_tests)
33
+ end
34
+
35
+ def generate_serialize_test(attribute, object_class)
36
+ case object_class.to_s
37
+ when "Array", "Hash"
38
+ serialize_test = " it { is_expected.to serialize(:#{ attribute }).as(#{ object_class }) }"
39
+ when "Object"
40
+ serialize_test = " it { is_expected.to serialize(:#{ attribute }) }"
41
+ else
42
+ serialize_test = " it { is_expected.to serialize(:#{ attribute }).as(JSON) }"
43
+ end
44
+ serialize_test
45
+ end
46
+
47
+ def generate_custom_serialize_test(attribute, cast_type, object_class)
48
+ if object_class == nil
49
+ custom_serializer_class = cast_type.to_s
50
+ custom_serializer_class = custom_serializer_class.gsub(/#\</, "").gsub(/:.*\z/, "") if cast_type.to_s.include?("#<")
51
+ custom_serialize_test = " it { is_expected.to serialize(:#{ attribute }).as(#{ custom_serializer_class }) }"
52
+ else
53
+ custom_serializer_class = object_class.to_s
54
+ custom_serializer_class = custom_serializer_class.gsub(/#\</, "").gsub(/:.*\z/, "") if object_class.to_s.include?("#<")
55
+ custom_serialize_test = " it { is_expected.to serialize(:#{ attribute }).as_instance_of(#{ custom_serializer_class }) }"
56
+ end
57
+ if custom_serialize_test.length > @working_generated_code_line_length
58
+ custom_serialize_test = custom_serialize_test.sub(" it { ", " it do\n ").sub(").as", ").\n as").sub("}) }", "})\n end")
59
+ end
60
+ custom_serialize_test
61
+ end
62
+
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,169 @@
1
+ module ShouldaMatchmakers
2
+ module Model
3
+ module ActiveRecord
4
+ module Matchmaker
5
+ module Validations
6
+
7
+
8
+ def validator_matcher_tests(validation_type)
9
+ validators = extract_validators(@app_class_name, validation_type)
10
+ if validators.present?
11
+ generate_validation_matcher_tests(validators)
12
+ else
13
+ []
14
+ end
15
+ end
16
+
17
+
18
+ private
19
+
20
+ def generate_validation_matcher_tests(validators)
21
+ validation_tests = []
22
+ validators.map do |validator|
23
+ if conditional_options_exist(validator.options)
24
+ conditional_validation_tests = generate_conditional_validation_tests(validator)
25
+ validation_tests = validation_tests + conditional_validation_tests
26
+ else
27
+ validation_test = generate_validation_test(validator, validator.options)
28
+ validation_tests = append_element(validation_test, validation_tests)
29
+ end
30
+ end
31
+ format_tests(validation_tests)
32
+ end
33
+
34
+ def generate_validation_test(validator, validator_options)
35
+ validation_test = " it { is_expected.to validate_#{ validator.kind.to_s }_of(:#{ validator.attributes.first.to_s })"
36
+ if (validator.kind == :exclusion || validator.kind == :inclusion) && custom_exclusion_inclusion_test_required(validator_options)
37
+ validation_test.sub!(" it {", " xit {")
38
+ custom_exclusion_inclusion_test_comment = get_custom_exclusion_inclusion_test_comment(validator_options)
39
+ validation_test.prepend(custom_exclusion_inclusion_test_comment).concat(" }")
40
+ else
41
+ if validator.kind == :exclusion || validator.kind == :inclusion
42
+ refined_validator_options = refine_exclusion_inclusion_non_conditional_option(validator_options)
43
+ else
44
+ refined_validator_options = validator_options
45
+ end
46
+ validator_options_string = get_options_string(refined_validator_options)
47
+ validation_test.concat(validator_options_string + " }")
48
+ if validation_test.length > @working_generated_code_line_length
49
+ validation_test = generate_validation_test_multiple_lines(validator, validator_options_string)
50
+ end
51
+ end
52
+ validation_test
53
+ end
54
+
55
+ def generate_validation_test_multiple_lines(validator, validator_options_string)
56
+ validation_test = " it do\n is_expected.to validate_#{ validator.kind.to_s }_of(:#{ validator.attributes.first })"
57
+ validator_options_string = validator_options_string.gsub(".", ".\n ")
58
+ validation_test.concat(validator_options_string).concat("\n end")
59
+ end
60
+
61
+ def generate_conditional_validation_tests(validator)
62
+ conditional_validation_tests = []
63
+ validator_options = parse_validator_options(validator.options.dup)
64
+ if (validator.kind == :exclusion || validator.kind == :inclusion) && validator_options[:non_conditional_options].present?
65
+ validator_options[:non_conditional_options] = refine_exclusion_inclusion_non_conditional_option(validator_options[:non_conditional_options])
66
+ end
67
+ if all_option_values_are_symbols(validator_options[:if_option_values]) &&
68
+ all_option_values_are_symbols(validator_options[:unless_option_values])
69
+ conditional_validating_test = generate_conditional_validating_test(validator, validator_options)
70
+ conditional_validation_tests = append_element(conditional_validating_test, conditional_validation_tests)
71
+ conditional_non_validating_tests = generate_conditional_non_validating_tests(validator, validator_options)
72
+ conditional_validation_tests = conditional_validation_tests + conditional_non_validating_tests
73
+ # else
74
+ # Skip tests due to non-symbol conditions (see below)
75
+ end
76
+ conditional_validation_tests
77
+ end
78
+
79
+ def generate_conditional_validating_test(validator, validator_options)
80
+ conditional_validating_test = compose_conditional_validating_context_string(validator_options)
81
+ validating_permutation = get_validating_true_false_permutation(validator_options)
82
+ conditional_validating_test.concat(compose_conditional_before_strings(validator_options, validating_permutation))
83
+ validating_test = generate_validation_test(validator, validator_options[:non_conditional_options])
84
+ validating_test = adjust_conditional_test_indentation(validating_test)
85
+ conditional_validating_test.concat(validating_test).concat("\n end").prepend("# Conditional validating test\n#\n")
86
+ end
87
+
88
+ def generate_conditional_non_validating_tests(validator, validator_options)
89
+ conditional_non_validating_tests = []
90
+ possible_conditional_permutations = get_possible_true_false_permutations(validator_options)
91
+ validating_permutation = get_validating_true_false_permutation(validator_options)
92
+ non_validating_permutations = possible_conditional_permutations - [validating_permutation]
93
+ non_validating_permutations.each do |non_validating_permutation|
94
+ conditional_non_validating_test = generate_conditional_non_validating_test(validator, validator_options, non_validating_permutation)
95
+ conditional_non_validating_tests << conditional_non_validating_test
96
+ end
97
+ if validator.options.key?(:unless)
98
+ conditional_non_validating_tests[0] = conditional_non_validating_tests[0].prepend("# For more natural readability of 'is_expected.not_to' context lines, 'unless' is represented by 'if not'\n# and 'unless not' is represented by 'if'.\n#\n")
99
+ end
100
+ conditional_non_validating_tests[0] = conditional_non_validating_tests[0].prepend("# Conditional non-validating test(s)\n#\n")
101
+ conditional_non_validating_tests
102
+ end
103
+
104
+ def generate_conditional_non_validating_test(validator, validator_options, non_validating_permutation)
105
+ conditional_non_validating_test = compose_conditional_non_validating_context_string(validator_options, non_validating_permutation)
106
+ conditional_non_validating_test.concat(compose_conditional_before_strings(validator_options, non_validating_permutation))
107
+ non_validating_test = generate_validation_test(validator, validator_options[:non_conditional_options])
108
+ non_validating_test.sub!("is_expected.to","is_expected.not_to")
109
+ non_validating_test = adjust_conditional_test_indentation(non_validating_test)
110
+ conditional_non_validating_test.concat(non_validating_test)
111
+ conditional_non_validating_test.concat("\n end")
112
+ end
113
+
114
+ def custom_exclusion_inclusion_test_required(exclusion_inclusion_option)
115
+ exclusion_inclusion_enumerable = exclusion_inclusion_option[:in] || exclusion_inclusion_option[:within]
116
+ if exclusion_inclusion_enumerable.is_a?(Array) || exclusion_inclusion_enumerable.is_a?(Range)
117
+ false
118
+ else
119
+ true
120
+ end
121
+ end
122
+
123
+ def get_custom_exclusion_inclusion_test_comment(exclusion_inclusion_option)
124
+ exclusion_inclusion_enumerable = exclusion_inclusion_option[:in] || exclusion_inclusion_option[:within]
125
+ # CONFIRMATION TODO: Confirm whether or not enumerable could be a 'Proc' that isn't a 'lambda'
126
+ custom_exclusion_inclusion_test_comment = if exclusion_inclusion_enumerable.lambda?
127
+ "# Note: Your 'in:/within:' configuration option value is a 'Lambda'." +
128
+ " You will need to implement a customized test.\n"
129
+ elsif exclusion_inclusion_enumerable.respond_to?(:call)
130
+ "# Note: Your 'in:/within:' configuration option value is a 'Proc'." +
131
+ " You will need to implement a customized test.\n"
132
+ else
133
+ "# Alert: Invalid 'in:/within:' enumerable object type: '#{ exclusion_enumerable.class.name.to_s }'\n" +
134
+ "# Valid exclusion 'in:/within:' enumerable object types: 'Array', 'Range'" +
135
+ " (or a proc, lambda or symbol which returns an enumerable)\n"
136
+ end
137
+ custom_exclusion_inclusion_test_comment.concat("# Remove the 'x' from 'xit' once test customization has been implemented.\n")
138
+ end
139
+
140
+ def refine_exclusion_inclusion_non_conditional_option(exclusion_inclusion_option)
141
+ refined_exclusion_inclusion_option = {}
142
+ exclusion_inclusion_enumerable = exclusion_inclusion_option[:in] || exclusion_inclusion_option[:within]
143
+ if exclusion_inclusion_enumerable.is_a?(Array)
144
+ refined_exclusion_inclusion_option = { in_array: exclusion_inclusion_enumerable }
145
+ elsif exclusion_inclusion_enumerable.is_a?(Range)
146
+ refined_exclusion_inclusion_option = { in_range: exclusion_inclusion_enumerable }
147
+ end
148
+ refined_exclusion_inclusion_option
149
+ end
150
+
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+
157
+ # else
158
+ # Skip tests due to non-symbol conditions (see below)
159
+ # validator.attributes.map do |attribute|
160
+ # skip = true
161
+ # presence_test = generate_presence_test_single_line(validator_options, attribute, skip)
162
+ # if presence_test[0].length > 100 || validator_options.count > 1
163
+ # presence_test = generate_presence_test_multiple_lines(validator_options, attribute, skip)
164
+ # end
165
+ # presence_test_comment = " # This test is currently skipped due to if: and/or unless: conditions that aren't symbols.\n"
166
+ # presence_test_comment.concat(" # Provide ")
167
+ # presence_test.prepend(presence_test_comment)
168
+ # presence_tests << presence_test
169
+ # end