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.



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

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.



94
95
96
# File 'lib/moxml/config.rb', line 94

def adapter_name
  @adapter_name
end

#default_encodingObject

Returns the value of attribute default_encoding.



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

def default_encoding
  @default_encoding
end

#default_indentObject

Returns the value of attribute default_indent.



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

def default_indent
  @default_indent
end

#default_line_endingObject

Returns the value of attribute default_line_ending.



94
95
96
# File 'lib/moxml/config.rb', line 94

def default_line_ending
  @default_line_ending
end

#entity_load_modeObject

Returns the value of attribute entity_load_mode.



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

def entity_load_mode
  @entity_load_mode
end

#entity_providerObject

Returns the value of attribute entity_provider.



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

def entity_provider
  @entity_provider
end

#entity_restoration_modeObject

Returns the value of attribute entity_restoration_mode.



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

def entity_restoration_mode
  @entity_restoration_mode
end

#namespace_validation_modeObject

Returns the value of attribute namespace_validation_mode.



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

def namespace_validation_mode
  @namespace_validation_mode
end

#preload_entity_setsObject

Returns the value of attribute preload_entity_sets.



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

def preload_entity_sets
  @preload_entity_sets
end

#restore_entitiesObject

Returns the value of attribute restore_entities.



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

def restore_entities
  @restore_entities
end

#strict_parsingObject

Returns the value of attribute strict_parsing.



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

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



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

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 new enough for the adapter (it needs programmatic document construction, which released 1.1.x lacks). Memoized: the require probe runs once.

Returns:

  • (Boolean)


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

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

  @leptris_preferred_available = begin
    require "leptris"
    # leptris-ruby 1.9.0 regression (leptris-ruby#53): the XML
    # autoload manifest is shadowed; load it explicitly.
    require "leptris/xml"
    ::Leptris::XML::Document.respond_to?(:create)
  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



151
152
153
# File 'lib/moxml/config.rb', line 151

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

#adapter=(name) ⇒ Object



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

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



146
147
148
149
# File 'lib/moxml/config.rb', line 146

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

#load_external_entitiesObject



194
195
196
# File 'lib/moxml/config.rb', line 194

def load_external_entities
  @entity_load_mode == :required
end

#load_external_entities=(value) ⇒ Object

Backward compatibility: convert old boolean to new symbol



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

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