Class: Moxml::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/moxml/config.rb

Constant Summary collapse

LINE_ENDING_LF =
"\n"
LINE_ENDING_CRLF =
"\r\n"
VALID_LINE_ENDINGS =
[LINE_ENDING_LF, LINE_ENDING_CRLF].freeze
VALID_ADAPTERS =
%i[nokogiri oga rexml ox headed_ox libxml leptris].freeze
PREFERRED_ADAPTER =

Preferred CRuby default (issue #96): fastest on every measured operation and the cleanest deployment story. Only takes effect when the installed leptris supports programmatic document construction (Leptris::XML::Document.create); otherwise moxml falls back to FALLBACK_ADAPTER so released-gem environments keep working. Under Opal the default is oga only when the vendored pure-Ruby fork was compiled into the bundle — stock oga requires its C extension and cannot load there; otherwise rexml.

:leptris
FALLBACK_ADAPTER =
:nokogiri
OPAL_DEFAULT_ADAPTER =
:oga
OPAL_FALLBACK_ADAPTER =
:rexml
ENTITY_LOAD_MODES =

Entity loading modes:

  • :required - Must load entities, raise error if unavailable (default)
  • :optional - Try to load, continue silently if unavailable
  • :disabled - Don't load entities, use empty registry
  • :custom - Use custom entity provider via entity_provider callback
%i[required optional disabled custom].freeze
NAMESPACE_VALIDATION_MODES =
%i[strict lenient].freeze
ENTITY_RESTORATION_MODES =

Entity restoration modes:

  • :lenient (default) — restore any known entity from the registry
  • :strict — only restore DTD-declared entities (falls back to lenient until DTD parsing is implemented)
%i[strict lenient].freeze

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(adapter_name = nil, strict_parsing = nil, default_encoding = nil) ⇒ Config

Returns a new instance of Config.



117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/moxml/config.rb', line 117

def initialize(adapter_name = nil, strict_parsing = nil,
               default_encoding = nil)
  self.adapter = adapter_name || Config.default.adapter_name
  @strict_parsing = strict_parsing || Config.default.strict_parsing
  @default_encoding = default_encoding || Config.default.default_encoding
  @default_indent = 2
  @default_line_ending = LINE_ENDING_LF
  @restore_entities = false
  @preload_entity_sets = []
  @entity_load_mode = :required
  @entity_provider = nil
  @namespace_validation_mode = :strict
  @entity_restoration_mode = :lenient
end

Class Attribute Details

.default_adapterObject



36
37
38
# File 'lib/moxml/config.rb', line 36

def default_adapter
  @default_adapter || runtime_default_adapter
end

Instance Attribute Details

#adapter_nameObject (readonly)

Returns the value of attribute adapter_name.



96
97
98
# File 'lib/moxml/config.rb', line 96

def adapter_name
  @adapter_name
end

#default_encodingObject

Returns the value of attribute default_encoding.



97
98
99
# File 'lib/moxml/config.rb', line 97

def default_encoding
  @default_encoding
end

#default_indentObject

Returns the value of attribute default_indent.



97
98
99
# File 'lib/moxml/config.rb', line 97

def default_indent
  @default_indent
end

#default_line_endingObject

Returns the value of attribute default_line_ending.



96
97
98
# File 'lib/moxml/config.rb', line 96

def default_line_ending
  @default_line_ending
end

#entity_load_modeObject

Returns the value of attribute entity_load_mode.



97
98
99
# File 'lib/moxml/config.rb', line 97

def entity_load_mode
  @entity_load_mode
end

#entity_providerObject

Returns the value of attribute entity_provider.



97
98
99
# File 'lib/moxml/config.rb', line 97

def entity_provider
  @entity_provider
end

#entity_restoration_modeObject

Returns the value of attribute entity_restoration_mode.



97
98
99
# File 'lib/moxml/config.rb', line 97

def entity_restoration_mode
  @entity_restoration_mode
end

#namespace_validation_modeObject

Returns the value of attribute namespace_validation_mode.



97
98
99
# File 'lib/moxml/config.rb', line 97

def namespace_validation_mode
  @namespace_validation_mode
end

#preload_entity_setsObject

Returns the value of attribute preload_entity_sets.



97
98
99
# File 'lib/moxml/config.rb', line 97

def preload_entity_sets
  @preload_entity_sets
end

#restore_entitiesObject

Returns the value of attribute restore_entities.



97
98
99
# File 'lib/moxml/config.rb', line 97

def restore_entities
  @restore_entities
end

#strict_parsingObject

Returns the value of attribute strict_parsing.



97
98
99
# File 'lib/moxml/config.rb', line 97

def strict_parsing
  @strict_parsing
end

Class Method Details

.defaultObject



32
33
34
# File 'lib/moxml/config.rb', line 32

def default
  @default ||= new(default_adapter, true, "UTF-8")
end

.detect_loaded_adapterObject



80
81
82
83
84
85
86
# File 'lib/moxml/config.rb', line 80

def detect_loaded_adapter
  return :nokogiri if Object.const_defined?(:Nokogiri)
  return :ox if Object.const_defined?(:Ox)
  return :oga if Object.const_defined?(:Oga)

  nil
end

.leptris_preferred_available?Boolean

True when the leptris gem is installed AND meets the adapter's binding floor (issue #149; 1.9.32 — traverse bounding #89, built-docs parts #91, and every capability surface the adapter now assumes). Memoized: the probe runs once. Below the floor the default falls back to Nokogiri rather than driving a binding the adapter no longer accommodates.

Returns:

  • (Boolean)


67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/moxml/config.rb', line 67

def leptris_preferred_available?
  return @leptris_preferred_available if defined?(@leptris_preferred_available)

  @leptris_preferred_available = begin
    require "leptris"
    Moxml::Adapter.load(:leptris)
    Gem::Version.new(::Leptris::VERSION) >=
      Gem::Version.new(Moxml::Adapter::Leptris::MINIMUM_BINDING_VERSION)
  rescue LoadError, NameError
    false
  end
end

.opal_runtime_adapterObject

Stock oga requires its C extension, so under Opal the oga adapter can only come from the vendored pure-Ruby fork — a repo-only artifact the released gem does not ship. Bundles that compiled it in (moxml's own harness) keep oga; everyone else gets the rexml adapter, whose Opal compat ships in-gem. defined? is safe here: this branch never runs under MRI, where it would trigger autoload resolution.



55
56
57
58
59
# File 'lib/moxml/config.rb', line 55

def opal_runtime_adapter
  return OPAL_DEFAULT_ADAPTER if defined?(Moxml::Adapter::Oga)

  OPAL_FALLBACK_ADAPTER
end

.runtime_default_adapterObject



40
41
42
43
44
45
46
# File 'lib/moxml/config.rb', line 40

def runtime_default_adapter
  return opal_runtime_adapter if RUBY_ENGINE == "opal"

  return PREFERRED_ADAPTER if leptris_preferred_available?

  detect_loaded_adapter || FALLBACK_ADAPTER
end

Instance Method Details

#adapterObject



153
154
155
# File 'lib/moxml/config.rb', line 153

def adapter
  @adapter ||= Adapter.load(@adapter_name)
end

#adapter=(name) ⇒ Object



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/moxml/config.rb', line 132

def adapter=(name)
  name = name.to_sym
  @adapter = nil

  unless VALID_ADAPTERS.include?(name)
    raise Moxml::AdapterError.new(
      "Invalid adapter: #{name}",
      adapter: name,
      operation: "set_adapter",
    )
  end

  @adapter_name = name
  adapter
end

#default_adapter=(name) ⇒ Object



148
149
150
151
# File 'lib/moxml/config.rb', line 148

def default_adapter=(name)
  self.adapter = name
  self.class.default_adapter = name
end

#load_external_entitiesObject



196
197
198
# File 'lib/moxml/config.rb', line 196

def load_external_entities
  @entity_load_mode == :required
end

#load_external_entities=(value) ⇒ Object

Backward compatibility: convert old boolean to new symbol



188
189
190
191
192
193
194
# File 'lib/moxml/config.rb', line 188

def load_external_entities=(value)
  @entity_load_mode = case value
                      when true then :required
                      when false then :disabled
                      else value
                      end
end