Project

General

Profile

« Previous | Next » 

Revision b40dde10

Added by Dominic Cleal about 7 years ago

fixes #19528 - rewrite FiltersHelperOverrides to support autoload

Replaces class-level filter search overrides storage with a query
against Foreman::Plugin, allowing the class to be reloaded and tested
safely. Removes another 'registry' class.

View differences:

app/registries/filters_helper_overrides.rb
class FiltersHelperOverrides
@@overrides = {}
def self.override_search_path(module_or_engine_name, blk)
@@overrides[module_or_engine_name] = blk
end
def self.can_override?(class_or_engine_name)
@@overrides.include?(deconstantize_name(class_or_engine_name))
end
def self.search_path(class_or_engine_name)
@@overrides[deconstantize_name(class_or_engine_name)].call(class_or_engine_name)
end
def self.deconstantize_name(name)
name.include?('::') ? name.deconstantize : name
end
private
def initialize; end
end
app/registries/foreman/plugin.rb
end
end
prepend Foreman::Plugin::SearchOverrides
def_field :name, :description, :url, :author, :author_url, :version, :path
attr_reader :id, :logging, :provision_methods, :compute_resources, :to_prepare_callbacks,
:facets, :rbac_registry, :dashboard_widgets
......
@dashboard_widgets << {:template => template}.merge(options)
end
# To add FiltersHelper#search_path override,
# in lib/engine.rb, in plugin initialization block:
# search_path_override("EngineModuleName") { |resource| ... }
def search_path_override(engine_name, &blk)
if block_given?
FiltersHelperOverrides.override_search_path(engine_name, blk)
else
Rails.logger.warn "Ignoring override of FiltersHelper#search_path_override for '#{engine_name}': no override block is present"
end
end
# list of API controller paths, globs allowed
def apipie_documented_controllers(controllers = nil)
if controllers
app/registries/foreman/plugin/search_overrides.rb
module Foreman
class Plugin
module SearchOverrides
attr_reader :search_overrides
def initialize(*args)
super
@search_overrides = {}
end
# To add FiltersHelper#search_path override,
# in lib/engine.rb, in plugin initialization block:
# search_path_override("EngineModuleName") { |resource| ... }
def search_path_override(engine_name, &blk)
if block_given?
@search_overrides[engine_name] = blk
else
Rails.logger.warn "Ignoring override of FiltersHelper#search_path_override for '#{engine_name}': no override block is present"
end
end
end
end
end
app/services/filters_helper_overrides.rb
class FiltersHelperOverrides
class << self
def can_override?(class_or_engine_name)
overrides.include?(deconstantize_name(class_or_engine_name))
end
def search_path(class_or_engine_name)
overrides[deconstantize_name(class_or_engine_name)].call(class_or_engine_name)
end
private
def deconstantize_name(name)
name.include?('::') ? name.deconstantize : name
end
def overrides
Foreman::Plugin.all.inject({}) { |all, plugin| all.update(plugin.search_overrides) }
end
end
private
def initialize; end
end
test/helpers/filters_helper_test.rb
end
def test_engine_search_path_is_used_when_engine_override_available
FiltersHelperOverrides.override_search_path("TestOverride", ->(resource) { 'test_override/auto_complete_search' })
with_search_overrides('TestOverride' => ->(resource) { 'test_override/auto_complete_search' })
assert_equal "test_override/auto_complete_search", search_path('TestOverride::Resource')
end
def test_no_deconstantization_if_there_is_no_namespace
FiltersHelperOverrides.override_search_path("TestOverride", ->(resource) { 'test_override/auto_complete_search' })
with_search_overrides('TestOverride' => ->(resource) { 'test_override/auto_complete_search' })
assert_equal "test_override/auto_complete_search", search_path('TestOverride')
end
private
def with_search_overrides(search_overrides)
plugin = mock('ExamplePlugin')
plugin.expects(:search_overrides).at_least_once.returns(search_overrides)
Foreman::Plugin.expects(:all).at_least_once.returns([plugin])
end
end
test/unit/plugin_test.rb
end
def test_add_search_path_override
Foreman::Plugin.register :filter_helpers do
plugin = Foreman::Plugin.register :filter_helpers do
search_path_override("TestEngine") { |resource| "test_engine/another_search_path" }
end
assert plugin.search_overrides.key?("TestEngine")
assert FiltersHelperOverrides.can_override?("TestEngine::TestResource")
end

Also available in: Unified diff