shoulda-matchers 3.0.1 → 3.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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +3 -3
  4. data/CONTRIBUTING.md +60 -28
  5. data/Gemfile +1 -0
  6. data/Gemfile.lock +15 -12
  7. data/NEWS.md +111 -0
  8. data/README.md +94 -6
  9. data/Rakefile +10 -8
  10. data/custom_plan.rb +88 -0
  11. data/gemfiles/4.0.0.gemfile +1 -0
  12. data/gemfiles/4.0.0.gemfile.lock +21 -18
  13. data/gemfiles/4.0.1.gemfile +1 -0
  14. data/gemfiles/4.0.1.gemfile.lock +21 -18
  15. data/gemfiles/4.1.gemfile +1 -0
  16. data/gemfiles/4.1.gemfile.lock +21 -18
  17. data/gemfiles/4.2.gemfile +1 -0
  18. data/gemfiles/4.2.gemfile.lock +24 -21
  19. data/lib/shoulda/matchers/action_controller/permit_matcher.rb +6 -11
  20. data/lib/shoulda/matchers/active_model.rb +10 -1
  21. data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +258 -180
  22. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_changed_value_error.rb +45 -0
  23. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_does_not_exist_error.rb +23 -0
  24. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter.rb +236 -0
  25. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb +62 -0
  26. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters.rb +40 -0
  27. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters_and_validators.rb +48 -0
  28. data/lib/shoulda/matchers/active_model/allow_value_matcher/successful_check.rb +14 -0
  29. data/lib/shoulda/matchers/active_model/allow_value_matcher/successful_setting.rb +14 -0
  30. data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +34 -14
  31. data/lib/shoulda/matchers/active_model/helpers.rb +9 -17
  32. data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +13 -6
  33. data/lib/shoulda/matchers/active_model/numericality_matchers/even_number_matcher.rb +13 -2
  34. data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +19 -35
  35. data/lib/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher.rb +13 -2
  36. data/lib/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher.rb +12 -2
  37. data/lib/shoulda/matchers/active_model/qualifiers.rb +12 -0
  38. data/lib/shoulda/matchers/active_model/qualifiers/ignore_interference_by_writer.rb +101 -0
  39. data/lib/shoulda/matchers/active_model/qualifiers/ignoring_interference_by_writer.rb +21 -0
  40. data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +30 -32
  41. data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +5 -8
  42. data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +22 -22
  43. data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +27 -16
  44. data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +58 -15
  45. data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +22 -12
  46. data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +165 -87
  47. data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +7 -9
  48. data/lib/shoulda/matchers/active_model/validation_matcher.rb +111 -49
  49. data/lib/shoulda/matchers/active_model/validation_matcher/build_description.rb +60 -0
  50. data/lib/shoulda/matchers/active_model/validator.rb +71 -52
  51. data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +19 -5
  52. data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +450 -124
  53. data/lib/shoulda/matchers/util.rb +43 -0
  54. data/lib/shoulda/matchers/util/word_wrap.rb +59 -31
  55. data/lib/shoulda/matchers/version.rb +1 -1
  56. data/script/update_gem_in_all_appraisals +1 -1
  57. data/script/update_gems_in_all_appraisals +1 -1
  58. data/spec/acceptance/multiple_libraries_integration_spec.rb +5 -2
  59. data/spec/acceptance/rails_integration_spec.rb +6 -2
  60. data/spec/spec_helper.rb +1 -3
  61. data/spec/support/acceptance/helpers/step_helpers.rb +4 -1
  62. data/spec/support/tests/current_bundle.rb +21 -7
  63. data/spec/support/unit/active_record/create_table.rb +54 -0
  64. data/spec/support/unit/attribute.rb +47 -0
  65. data/spec/support/unit/capture.rb +6 -0
  66. data/spec/support/unit/change_value.rb +111 -0
  67. data/spec/support/unit/create_model_arguments/basic.rb +135 -0
  68. data/spec/support/unit/create_model_arguments/has_many.rb +15 -0
  69. data/spec/support/unit/create_model_arguments/uniqueness_matcher.rb +74 -0
  70. data/spec/support/unit/helpers/active_record_versions.rb +1 -1
  71. data/spec/support/unit/helpers/class_builder.rb +61 -47
  72. data/spec/support/unit/helpers/database_helpers.rb +5 -3
  73. data/spec/support/unit/helpers/model_builder.rb +77 -97
  74. data/spec/support/unit/helpers/validation_matcher_scenario_helpers.rb +44 -0
  75. data/spec/support/unit/load_environment.rb +12 -0
  76. data/spec/support/unit/matchers/fail_with_message_including_matcher.rb +2 -2
  77. data/spec/support/unit/matchers/fail_with_message_matcher.rb +12 -1
  78. data/spec/support/unit/model_creation_strategies/active_model.rb +111 -0
  79. data/spec/support/unit/model_creation_strategies/active_record.rb +77 -0
  80. data/spec/support/unit/model_creators.rb +19 -0
  81. data/spec/support/unit/model_creators/active_model.rb +39 -0
  82. data/spec/support/unit/model_creators/active_record.rb +43 -0
  83. data/spec/support/unit/model_creators/active_record/has_and_belongs_to_many.rb +95 -0
  84. data/spec/support/unit/model_creators/active_record/has_many.rb +67 -0
  85. data/spec/support/unit/model_creators/active_record/uniqueness_matcher.rb +42 -0
  86. data/spec/support/unit/model_creators/basic.rb +97 -0
  87. data/spec/support/unit/rails_application.rb +1 -1
  88. data/spec/support/unit/record_validating_confirmation_builder.rb +3 -7
  89. data/spec/support/unit/shared_examples/ignoring_interference_by_writer.rb +79 -0
  90. data/spec/support/unit/validation_matcher_scenario.rb +62 -0
  91. data/spec/unit/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +4 -0
  92. data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +575 -140
  93. data/spec/unit/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +115 -15
  94. data/spec/unit/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +42 -4
  95. data/spec/unit/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +92 -6
  96. data/spec/unit/shoulda/matchers/active_model/validate_exclusion_of_matcher_spec.rb +122 -10
  97. data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +306 -58
  98. data/spec/unit/shoulda/matchers/active_model/validate_length_of_matcher_spec.rb +122 -3
  99. data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +805 -131
  100. data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +196 -29
  101. data/spec/unit/shoulda/matchers/active_record/define_enum_for_matcher_spec.rb +82 -40
  102. data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +600 -101
  103. data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +88 -33
  104. data/spec/unit_spec_helper.rb +10 -22
  105. data/zeus.json +11 -0
  106. metadata +64 -23
  107. data/lib/shoulda/matchers/active_model/strict_validator.rb +0 -51
  108. data/spec/support/unit/shared_examples/numerical_type_submatcher.rb +0 -15
  109. data/spec/unit/shoulda/matchers/active_model/numericality_matchers/comparison_matcher_spec.rb +0 -288
  110. data/spec/unit/shoulda/matchers/active_model/numericality_matchers/even_number_matcher_spec.rb +0 -100
  111. data/spec/unit/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher_spec.rb +0 -100
  112. data/spec/unit/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher_spec.rb +0 -100
@@ -0,0 +1,47 @@
1
+ module UnitTests
2
+ class Attribute
3
+ attr_reader :name, :column_type, :column_options
4
+
5
+ DEFAULT_COLUMN_TYPE = :string
6
+ DEFAULT_COLUMN_OPTIONS = {
7
+ null: false,
8
+ array: false
9
+ }
10
+
11
+ def initialize(args)
12
+ @args = args
13
+ end
14
+
15
+ def name
16
+ args.fetch(:name)
17
+ end
18
+
19
+ def column_type
20
+ args.fetch(:column_type, DEFAULT_COLUMN_TYPE)
21
+ end
22
+
23
+ def column_options
24
+ DEFAULT_COLUMN_OPTIONS.
25
+ merge(args.fetch(:column_options, {})).
26
+ merge(type: column_type)
27
+ end
28
+
29
+ def array?
30
+ column_options[:array]
31
+ end
32
+
33
+ def default_value
34
+ args.fetch(:default_value) do
35
+ if column_options[:null]
36
+ nil
37
+ else
38
+ Shoulda::Matchers::Util.dummy_value_for(value_type, array: array?)
39
+ end
40
+ end
41
+ end
42
+
43
+ protected
44
+
45
+ attr_reader :args
46
+ end
47
+ end
@@ -2,6 +2,8 @@ module Kernel
2
2
  # #capture, #silence_stream, and #silence_stderr are deprecated after Rails
3
3
  # 4.2 and will be removed in 5.0, so just override them completely here
4
4
 
5
+ undef_method :capture
6
+
5
7
  def capture(stream)
6
8
  stream = stream.to_s
7
9
  captured_stream = Tempfile.new(stream)
@@ -18,6 +20,8 @@ module Kernel
18
20
  stream_io.reopen(origin_stream)
19
21
  end
20
22
 
23
+ undef_method :silence_stream
24
+
21
25
  def silence_stream(stream)
22
26
  old_stream = stream.dup
23
27
  stream.reopen(RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ ? 'NUL:' : '/dev/null')
@@ -28,6 +32,8 @@ module Kernel
28
32
  old_stream.close
29
33
  end
30
34
 
35
+ undef_method :silence_stderr
36
+
31
37
  def silence_stderr
32
38
  silence_stream(STDERR) { yield }
33
39
  end
@@ -0,0 +1,111 @@
1
+ module UnitTests
2
+ class ChangeValue
3
+ def self.call(column_type, value, value_changer)
4
+ new(column_type, value, value_changer).call
5
+ end
6
+
7
+ def initialize(column_type, value, value_changer)
8
+ @column_type = column_type
9
+ @value = value
10
+ @value_changer = value_changer
11
+ end
12
+
13
+ def call
14
+ if value_changer.is_a?(Proc)
15
+ value_changer.call(value)
16
+ elsif respond_to?(value_changer, true)
17
+ send(value_changer)
18
+ else
19
+ value.public_send(value_changer)
20
+ end
21
+ end
22
+
23
+ protected
24
+
25
+ attr_reader :column_type, :value, :value_changer
26
+
27
+ private
28
+
29
+ def previous_value
30
+ if value.is_a?(String)
31
+ value[0..-2] + (value[-1].ord - 1).chr
32
+ else
33
+ value - 1
34
+ end
35
+ end
36
+
37
+ def next_value
38
+ if value.is_a?(Array)
39
+ value + [value.first.class.new]
40
+ elsif value.respond_to?(:next)
41
+ value.next
42
+ else
43
+ value + 1
44
+ end
45
+ end
46
+
47
+ def next_next_value
48
+ change_value(change_value(value, :next_value), :next_value)
49
+ end
50
+
51
+ def next_value_or_numeric_value
52
+ if value
53
+ change_value(value, :next_value)
54
+ else
55
+ change_value(value, :numeric_value)
56
+ end
57
+ end
58
+
59
+ def next_value_or_non_numeric_value
60
+ if value
61
+ change_value(value, :next_value)
62
+ else
63
+ change_value(value, :non_numeric_value)
64
+ end
65
+ end
66
+
67
+ def never_falsy
68
+ value || dummy_value_for_column
69
+ end
70
+
71
+ def truthy_or_numeric
72
+ value || 1
73
+ end
74
+
75
+ def never_blank
76
+ value.presence || dummy_value_for_column
77
+ end
78
+
79
+ def nil_to_blank
80
+ value || ''
81
+ end
82
+
83
+ def always_nil
84
+ nil
85
+ end
86
+
87
+ def add_character
88
+ value + 'a'
89
+ end
90
+
91
+ def remove_character
92
+ value.chop
93
+ end
94
+
95
+ def numeric_value
96
+ '1'
97
+ end
98
+
99
+ def non_numeric_value
100
+ 'a'
101
+ end
102
+
103
+ def change_value(value, value_changer)
104
+ self.class.call(column_type, value, value_changer)
105
+ end
106
+
107
+ def dummy_value_for_column
108
+ Shoulda::Matchers::Util.dummy_value_for(column_type)
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,135 @@
1
+ require 'forwardable'
2
+
3
+ module UnitTests
4
+ module CreateModelArguments
5
+ class Basic
6
+ DEFAULT_MODEL_NAME = 'Example'
7
+ DEFAULT_ATTRIBUTE_NAME = :attr
8
+ DEFAULT_COLUMN_TYPE = :string
9
+
10
+ def self.wrap(args)
11
+ if args.is_a?(self)
12
+ args
13
+ else
14
+ new(args)
15
+ end
16
+ end
17
+
18
+ extend Forwardable
19
+
20
+ def_delegators(
21
+ :attribute,
22
+ :column_type,
23
+ :column_options,
24
+ :default_value,
25
+ :value_type
26
+ )
27
+
28
+ def initialize(args)
29
+ @args = args
30
+ end
31
+
32
+ def fetch(*args, &block)
33
+ self.args.fetch(*args, &block)
34
+ end
35
+
36
+ def merge(given_args)
37
+ self.class.new(args.deep_merge(given_args))
38
+ end
39
+
40
+ def model_name
41
+ args.fetch(:model_name, DEFAULT_MODEL_NAME)
42
+ end
43
+
44
+ def attribute_name
45
+ args.fetch(:attribute_name, default_attribute_name)
46
+ end
47
+
48
+ def model_creation_strategy
49
+ args.fetch(:model_creation_strategy)
50
+ end
51
+
52
+ def columns
53
+ { attribute_name => column_options }
54
+ end
55
+
56
+ def attribute
57
+ @_attribute ||= attribute_class.new(attribute_args)
58
+ end
59
+
60
+ def all_attribute_overrides
61
+ @_all_attribute_overrides ||= begin
62
+ attribute_overrides = args.slice(
63
+ :changing_values_with,
64
+ :default_value
65
+ )
66
+
67
+ overrides =
68
+ if attribute_overrides.empty?
69
+ {}
70
+ else
71
+ { attribute_name => attribute_overrides }
72
+ end
73
+
74
+ overrides.deep_merge(args.fetch(:attribute_overrides, {}))
75
+ end
76
+ end
77
+
78
+ def attribute_overrides
79
+ all_attribute_overrides.fetch(attribute_name, {})
80
+ end
81
+
82
+ def validation_name
83
+ args.fetch(:validation_name) { map_matcher_name_to_validation_name }
84
+ end
85
+
86
+ def validation_options
87
+ args.fetch(:validation_options, {})
88
+ end
89
+
90
+ def custom_validation?
91
+ args.fetch(:custom_validation, false)
92
+ end
93
+
94
+ def matcher_name
95
+ args.fetch(:matcher_name)
96
+ end
97
+
98
+ def attribute_default_values_by_name
99
+ if attribute_overrides.key?(:default_value)
100
+ { attribute_name => attribute_overrides[:default_value] }
101
+ else
102
+ {}
103
+ end
104
+ end
105
+
106
+ def to_hash
107
+ args.deep_dup
108
+ end
109
+
110
+ protected
111
+
112
+ attr_reader :args
113
+
114
+ def attribute_class
115
+ UnitTests::Attribute
116
+ end
117
+
118
+ def default_attribute_name
119
+ DEFAULT_ATTRIBUTE_NAME
120
+ end
121
+
122
+ private
123
+
124
+ def map_matcher_name_to_validation_name
125
+ matcher_name.to_s.sub('validate', 'validates')
126
+ end
127
+
128
+ def attribute_args
129
+ args.slice(:column_type).deep_merge(
130
+ attribute_overrides.deep_merge(name: attribute_name)
131
+ )
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,15 @@
1
+ module UnitTests
2
+ module CreateModelArguments
3
+ class HasMany < Basic
4
+ def columns
5
+ super.except(attribute_name)
6
+ end
7
+
8
+ private
9
+
10
+ def default_attribute_name
11
+ :children
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,74 @@
1
+ module UnitTests
2
+ module CreateModelArguments
3
+ class UniquenessMatcher < Basic
4
+ def self.normalize_attribute(attribute)
5
+ if attribute.is_a?(Hash)
6
+ Attribute.new(attribute)
7
+ else
8
+ Attribute.new(name: attribute)
9
+ end
10
+ end
11
+
12
+ def self.normalize_attributes(attributes)
13
+ attributes.map do |attribute|
14
+ normalize_attribute(attribute)
15
+ end
16
+ end
17
+
18
+ def columns
19
+ attributes.reduce({}) do |options, attribute|
20
+ options.merge(
21
+ attribute.name => {
22
+ type: attribute.column_type,
23
+ options: attribute.column_options
24
+ }
25
+ )
26
+ end
27
+ end
28
+
29
+ def validation_options
30
+ super.merge(scope: scope_attribute_names)
31
+ end
32
+
33
+ def attribute_default_values_by_name
34
+ attributes.reduce({}) do |values, attribute|
35
+ values.merge(attribute.name => attribute.default_value)
36
+ end
37
+ end
38
+
39
+ protected
40
+
41
+ def attribute_class
42
+ Attribute
43
+ end
44
+
45
+ private
46
+
47
+ def attributes
48
+ [attribute] + scope_attributes + additional_attributes
49
+ end
50
+
51
+ def scope_attribute_names
52
+ scope_attributes.map(&:name)
53
+ end
54
+
55
+ def scope_attributes
56
+ @_scope_attributes ||= self.class.normalize_attributes(
57
+ args.fetch(:scopes, [])
58
+ )
59
+ end
60
+
61
+ def additional_attributes
62
+ @_additional_attributes ||= self.class.normalize_attributes(
63
+ args.fetch(:additional_attributes, [])
64
+ )
65
+ end
66
+
67
+ class Attribute < UnitTests::Attribute
68
+ def value_type
69
+ args.fetch(:value_type) { column_type }
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -6,7 +6,7 @@ module UnitTests
6
6
  end
7
7
 
8
8
  def active_record_version
9
- Tests::Version.new(ActiveRecord::VERSION::STRING)
9
+ Tests::Version.new(::ActiveRecord::VERSION::STRING)
10
10
  end
11
11
 
12
12
  def active_record_supports_enum?
@@ -1,76 +1,90 @@
1
1
  module UnitTests
2
2
  module ClassBuilder
3
- def self.parse_constant_name(name)
4
- namespace = Shoulda::Matchers::Util.deconstantize(name)
5
- qualified_namespace = (namespace.presence || 'Object').constantize
6
- name_without_namespace = name.to_s.demodulize
7
- [qualified_namespace, name_without_namespace]
3
+ def define_module(*args, &block)
4
+ ClassBuilder.define_module(*args, &block)
8
5
  end
9
6
 
10
- def self.configure_example_group(example_group)
11
- example_group.include(self)
12
-
13
- example_group.after do
14
- teardown_defined_constants
15
- end
7
+ def define_class(*args, &block)
8
+ ClassBuilder.define_class(*args, &block)
16
9
  end
17
10
 
18
- def define_module(module_name, &block)
19
- module_name = module_name.to_s.camelize
11
+ class << self
12
+ def configure_example_group(example_group)
13
+ example_group.include(self)
20
14
 
21
- namespace, name_without_namespace =
22
- ClassBuilder.parse_constant_name(module_name)
15
+ example_group.after do
16
+ ClassBuilder.reset
17
+ end
18
+ end
23
19
 
24
- if namespace.const_defined?(name_without_namespace, false)
25
- namespace.__send__(:remove_const, name_without_namespace)
20
+ def reset
21
+ remove_defined_classes
26
22
  end
27
23
 
28
- eval <<-RUBY
29
- module #{namespace}::#{name_without_namespace}
30
- end
31
- RUBY
24
+ def define_module(module_name, &block)
25
+ module_name = module_name.to_s.camelize
32
26
 
33
- namespace.const_get(name_without_namespace).tap do |constant|
34
- constant.unloadable
27
+ namespace, name_without_namespace =
28
+ ClassBuilder.parse_constant_name(module_name)
35
29
 
36
- if block
37
- constant.module_eval(&block)
30
+ if namespace.const_defined?(name_without_namespace, false)
31
+ namespace.__send__(:remove_const, name_without_namespace)
38
32
  end
39
- end
40
- end
41
33
 
42
- def define_class(class_name, parent_class = Object, &block)
43
- class_name = class_name.to_s.camelize
34
+ eval <<-RUBY
35
+ module #{namespace}::#{name_without_namespace}
36
+ end
37
+ RUBY
44
38
 
45
- namespace, name_without_namespace =
46
- ClassBuilder.parse_constant_name(class_name)
39
+ namespace.const_get(name_without_namespace).tap do |constant|
40
+ constant.unloadable
47
41
 
48
- if namespace.const_defined?(name_without_namespace, false)
49
- namespace.__send__(:remove_const, name_without_namespace)
42
+ if block
43
+ constant.module_eval(&block)
44
+ end
45
+ end
50
46
  end
51
47
 
52
- eval <<-RUBY
53
- class #{namespace}::#{name_without_namespace} < #{parent_class}
48
+ def define_class(class_name, parent_class = Object, &block)
49
+ class_name = class_name.to_s.camelize
50
+
51
+ namespace, name_without_namespace =
52
+ ClassBuilder.parse_constant_name(class_name)
53
+
54
+ if namespace.const_defined?(name_without_namespace, false)
55
+ namespace.__send__(:remove_const, name_without_namespace)
54
56
  end
55
- RUBY
56
57
 
57
- namespace.const_get(name_without_namespace).tap do |constant|
58
- constant.unloadable
58
+ eval <<-RUBY
59
+ class #{namespace}::#{name_without_namespace} < ::#{parent_class}
60
+ end
61
+ RUBY
62
+
63
+ namespace.const_get(name_without_namespace).tap do |constant|
64
+ constant.unloadable
59
65
 
60
- if block
61
- if block.arity == 0
62
- constant.class_eval(&block)
63
- else
64
- block.call(constant)
66
+ if block
67
+ if block.arity == 0
68
+ constant.class_eval(&block)
69
+ else
70
+ block.call(constant)
71
+ end
65
72
  end
66
73
  end
67
74
  end
68
- end
69
75
 
70
- private
76
+ def parse_constant_name(name)
77
+ namespace = Shoulda::Matchers::Util.deconstantize(name)
78
+ qualified_namespace = (namespace.presence || 'Object').constantize
79
+ name_without_namespace = name.to_s.demodulize
80
+ [qualified_namespace, name_without_namespace]
81
+ end
82
+
83
+ private
71
84
 
72
- def teardown_defined_constants
73
- ActiveSupport::Dependencies.clear
85
+ def remove_defined_classes
86
+ ::ActiveSupport::Dependencies.clear
87
+ end
74
88
  end
75
89
  end
76
90
  end