Module: RSpec::SleepingKingStudios::Concerns::ExampleConstants
- Defined in:
- lib/rspec/sleeping_king_studios/concerns/example_constants.rb
Class Method Summary collapse
- .assign_constant(namespace, constant_name, constant_value) ⇒ Object
-
.guard_existing_constant!(namespace, constant_name) ⇒ Object
class method assign_constant.
-
.resolve_base_class(value) ⇒ Object
class method guard_existing_constant!.
- .resolve_namespace(module_names) ⇒ Object
Instance Method Summary collapse
-
#example_class(class_name, base_class = nil, &block) ⇒ Object
class method resolve_namespace.
-
#example_constant(qualified_name, constant_value = DEFAULT_VALUE, force: false, &block) ⇒ Object
method example_class.
Class Method Details
.assign_constant(namespace, constant_name, constant_value) ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/rspec/sleeping_king_studios/concerns/example_constants.rb', line 10 def self.assign_constant namespace, constant_name, constant_value prior_value = DEFAULT_VALUE if namespace.const_defined?(constant_name) prior_value = namespace.const_get(constant_name) end # if namespace.const_set(constant_name, constant_value) yield ensure if prior_value == DEFAULT_VALUE namespace.send :remove_const, constant_name else namespace.const_set(constant_name, prior_value) end # if-else end |
.guard_existing_constant!(namespace, constant_name) ⇒ Object
class method assign_constant
28 29 30 31 32 33 34 35 36 |
# File 'lib/rspec/sleeping_king_studios/concerns/example_constants.rb', line 28 def self.guard_existing_constant! namespace, constant_name return unless namespace.const_defined?(constant_name) = "constant #{constant_name} is already defined with value "\ "#{namespace.const_get(constant_name).inspect}" raise NameError, end |
.resolve_base_class(value) ⇒ Object
class method guard_existing_constant!
38 39 40 41 42 43 44 45 46 |
# File 'lib/rspec/sleeping_king_studios/concerns/example_constants.rb', line 38 def self.resolve_base_class value value = value.fetch(:base_class, nil) if value.is_a?(Hash) return Object if value.nil? return Object.const_get(value) if value.is_a?(String) value end |
.resolve_namespace(module_names) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/rspec/sleeping_king_studios/concerns/example_constants.rb', line 48 def self.resolve_namespace module_names last_defined = nil resolved = module_names.reduce(Object) do |ns, module_name| next ns.const_get(module_name) if ns.const_defined?(module_name) last_defined ||= { :namespace => ns, :module_name => module_name } ns.const_set(module_name, Module.new) end # reduce yield resolved ensure if last_defined last_defined[:namespace].send(:remove_const, last_defined[:module_name]) end # if end |
Instance Method Details
#example_class(class_name, base_class = nil, &block) ⇒ Object
class method resolve_namespace
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/rspec/sleeping_king_studios/concerns/example_constants.rb', line 67 def example_class class_name, base_class = nil, &block class_name = class_name.to_s if class_name.is_a?(Symbol) example_constant(class_name) do klass = Class.new(ExampleConstants.resolve_base_class(base_class)) klass.define_singleton_method(:name) { class_name } klass.singleton_class.send(:alias_method, :inspect, :name) klass.singleton_class.send(:alias_method, :to_s, :name) instance_exec(klass, &block) if block_given? klass end # example_constant end |
#example_constant(qualified_name, constant_value = DEFAULT_VALUE, force: false, &block) ⇒ Object
method example_class
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/rspec/sleeping_king_studios/concerns/example_constants.rb', line 83 def example_constant qualified_name, constant_value = DEFAULT_VALUE, force: false, &block around(:example) do |wrapped_example| example = wrapped_example.example resolved_value = if constant_value == DEFAULT_VALUE block ? example.instance_exec(&block) : nil else constant_value end # if module_names = qualified_name.to_s.split('::') constant_name = module_names.pop ExampleConstants.resolve_namespace(module_names) do |namespace| ExampleConstants.guard_existing_constant!(namespace, constant_name) unless force ExampleConstants.assign_constant(namespace, constant_name, resolved_value) do wrapped_example.call end # assign_constant end # resolve_namespace end # before example end |