module RSpec::SleepingKingStudios::Concerns::ExampleConstants
Constants
- DEFAULT_VALUE
Public Class Methods
assign_constant(namespace, constant_name, constant_value) { || ... }
click to toggle source
# 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)
click to toggle source
# 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) message = "constant #{constant_name} is already defined with value "\ "#{namespace.const_get(constant_name).inspect}" raise NameError, message end
resolve_base_class(value)
click to toggle source
# 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) { |resolved| ... }
click to toggle source
# 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
Public Instance Methods
example_class(class_name, base_class = nil, &block)
click to toggle source
# 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)
click to toggle source
# 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