module MultiJson::AdapterSelector
Handles adapter discovery, loading, and selection
Adapters can be specified as:
-
Symbol/String: adapter name (e.g., :oj, “json_gem”)
-
Module: adapter class directly
-
nil/false: use default adapter
@api private
Constants
- ALIASES
Alternate spellings for adapter names
- LOADERS
Strategy lambdas for loading adapters based on specification type
Public Instance Methods
Returns the default adapter to use
@api private @return [Symbol] adapter name @example
AdapterSelector.default_adapter #=> :oj
# File lib/multi_json/adapter_selector.rb, line 31 def default_adapter @default_adapter ||= detect_best_adapter end
Private Instance Methods
Detects the best available JSON adapter
@api private @return [Symbol] adapter name
# File lib/multi_json/adapter_selector.rb, line 41 def detect_best_adapter loaded_adapter || installable_adapter || fallback_adapter end
Returns the fallback adapter when no others available
@api private @return [Symbol] the ok_json adapter name
# File lib/multi_json/adapter_selector.rb, line 86 def fallback_adapter warn_about_fallback unless @default_adapter_warning_shown @default_adapter_warning_shown = true :ok_json end
Finds the appropriate loader for an adapter specification
@api private @param adapter_spec [Object] adapter specification @return [Proc, nil] loader proc if found
# File lib/multi_json/adapter_selector.rb, line 122 def find_loader_for(adapter_spec) klass = adapter_spec.class return LOADERS.fetch(klass) if LOADERS.key?(klass) LOADERS.fetch(Module) if adapter_spec.is_a?(Module) end
Tries to require and use an installable adapter
@api private @return [Symbol, nil] adapter name if successfully required
# File lib/multi_json/adapter_selector.rb, line 63 def installable_adapter ::MultiJson::REQUIREMENT_MAP.each_key do |adapter_name| return adapter_name if try_require(adapter_name) end nil end
Loads an adapter from a specification
@api private @param adapter_spec [Symbol, String, Module, nil] adapter specification @return [Class] the adapter class
# File lib/multi_json/adapter_selector.rb, line 108 def load_adapter(adapter_spec) loader = find_loader_for(adapter_spec) return loader.call(adapter_spec, self) if loader raise ::LoadError, adapter_spec rescue ::LoadError => e raise AdapterError.build(e) end
Loads an adapter by its string name
@api private @param name [String] adapter name @return [Class] the adapter class
# File lib/multi_json/adapter_selector.rb, line 134 def load_adapter_by_name(name) normalized = ALIASES.fetch(name, name).downcase require_relative "adapters/#{normalized}" class_name = normalized.split("_").map(&:capitalize).join ::MultiJson::Adapters.const_get(class_name) end
Finds an already-loaded JSON library
@api private @return [Symbol, nil] adapter name if found
# File lib/multi_json/adapter_selector.rb, line 49 def loaded_adapter return :fast_jsonparser if defined?(::FastJsonparser) return :oj if defined?(::Oj) return :yajl if defined?(::Yajl) return :jr_jackson if defined?(::JrJackson) return :json_gem if defined?(::JSON::Ext::Parser) :gson if defined?(::Gson) end
Attempts to require a JSON library
@api private @param adapter_name [Symbol] adapter to require @return [Boolean] true if require succeeded
# File lib/multi_json/adapter_selector.rb, line 75 def try_require(adapter_name) require ::MultiJson::REQUIREMENT_MAP.fetch(adapter_name) true rescue ::LoadError false end
Warns the user about using the slow fallback adapter
@api private @return [void]
# File lib/multi_json/adapter_selector.rb, line 96 def warn_about_fallback Kernel.warn( "[WARNING] MultiJson is using the default adapter (ok_json). " \ "We recommend loading a different JSON library to improve performance." ) end