Revision b40dde10
Added by Dominic Cleal about 7 years ago
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
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.