oxml 0.5.0 → 0.6.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 293e831e7b36d26b1fba3169b8e1c2d31544cc30c73fc9f683112139bbbe741b
4
- data.tar.gz: d0e02071511efd3370965b0e65db752dee3f2b2e0824562b3143fc3444abc509
3
+ metadata.gz: 479fdde9590894564065ab9b4793e7a5ae47698d2b33d737925a2035c4b00e75
4
+ data.tar.gz: 14d023101beda337c6899e3b458f11f3f1e08bdca38c83b35a827875a49f9bce
5
5
  SHA512:
6
- metadata.gz: 66df7df7cbbdf297e86348f771d22da580c767fcb64427f88f19b77536d0f19dacaa294546800d19e0248260f8e9c1c20bf1a2bdc6510407bc3e280aa0188e37
7
- data.tar.gz: 32ee54f605644dcd251444eff168cf86b7f2ad2b2d260c5496999fca772d592a66ea712b47e72ba9b0390f21f77f0560fcc109e1917991d4d395b2e4a974ed7b
6
+ metadata.gz: 2e7b901282659b50bd1b0d19194dd510cad27e868318116342abc8822c17d47f32d6fcd3ad8db0c80be4ea08f73ec1bcc9d4b7d251863642299ed2ffc9de5d90
7
+ data.tar.gz: '072924a32a01c48cfb60083d2dd6ba46d8d5d32e5981886db388c45edec2e85af7c9c03bd345dd21ba1bf8187ae181fda8fddc1f0e9a5a72641db075ffc4eeff'
data/lib/oxml/builder.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  module OXML
4
4
  class Builder
5
5
  def initialize(hash)
6
- @hash = hash
6
+ @hash = Marshal.load(Marshal.dump(hash))
7
7
  end
8
8
 
9
9
  def to_s
data/lib/oxml/parser.rb CHANGED
@@ -19,6 +19,9 @@ module OXML
19
19
  @delete_namespace_attributes = options.fetch(:delete_namespace_attributes, false)
20
20
  @advanced_typecasting = options.fetch(:advanced_typecasting, false)
21
21
  @skip_soap_elements = options.fetch(:skip_soap_elements, false)
22
+ @symbolize_keys = options.fetch(:symbolize_keys, true)
23
+ @strip_whitespace = options.fetch(:strip_whitespace, false)
24
+ @normalize_whitespace = options.fetch(:normalize_whitespace, false)
22
25
  end
23
26
 
24
27
  def to_h
@@ -44,11 +47,13 @@ module OXML
44
47
  @arr.push(@memo)
45
48
 
46
49
  if @strip_namespaces && name.start_with?('@')
47
- @name = name.to_sym
50
+ @name = @symbolize_keys ? name.to_sym : name
48
51
  elsif @strip_namespaces
49
- @name = @map[name] ||= Utils.snakecase(name).split(':').last.to_sym
52
+ processed_name = Utils.snakecase(name).split(':').last
53
+ @name = @map[name] ||= (@symbolize_keys ? processed_name.to_sym : processed_name)
50
54
  else
51
- @name = @map[name] ||= Utils.snakecase(name).to_sym
55
+ processed_name = Utils.snakecase(name)
56
+ @name = @map[name] ||= (@symbolize_keys ? processed_name.to_sym : processed_name)
52
57
  end
53
58
 
54
59
  @memo = {}
@@ -67,6 +72,16 @@ module OXML
67
72
  end
68
73
 
69
74
  def text(value)
75
+ # Apply whitespace optimizations only when explicitly enabled
76
+ if @strip_whitespace && value.is_a?(String)
77
+ value = value.strip
78
+ return if value.empty?
79
+ end
80
+
81
+ if @normalize_whitespace && value.is_a?(String)
82
+ value = value.gsub(/\s+/, ' ').strip
83
+ end
84
+
70
85
  if @arr.last[@name].is_a?(Array)
71
86
  @arr.last[@name].pop unless value == @memo
72
87
  @arr.last[@name] << cast(value)
data/lib/oxml/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OXML
4
- VERSION = '0.5.0'
4
+ VERSION = '0.6.0.rc1'
5
5
  end
data/lib/oxml.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'stringio'
3
4
  require 'ox'
4
5
 
5
6
  require_relative 'oxml/version'
@@ -8,16 +9,27 @@ require_relative 'oxml/parser'
8
9
  require_relative 'oxml/builder'
9
10
 
10
11
  module OXML
12
+ IO_OPTIMIZATION_THRESHOLD = 1_048_576 # 1MB in bytes
13
+
11
14
  module_function
12
15
 
13
16
  def parse(xml, options = {})
14
17
  handler = Parser.new(options)
15
18
  Ox.default_options = { encoding: 'UTF-8', skip: :skip_return}
16
- Ox.sax_parse(handler, xml)
19
+
20
+ xml_input = optimize_xml_input(xml)
21
+ Ox.sax_parse(handler, xml_input)
17
22
  handler.to_h
18
23
  end
19
24
 
20
25
  def build(hash)
21
26
  Builder.new(hash).to_s
22
27
  end
28
+
29
+ # Use StringIO for large strings to reduce memory allocation
30
+ def optimize_xml_input(xml)
31
+ return xml unless xml.is_a?(String) && xml.bytesize > IO_OPTIMIZATION_THRESHOLD
32
+
33
+ StringIO.new(xml)
34
+ end
23
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oxml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - xkwd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-24 00:00:00.000000000 Z
11
+ date: 2025-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ox
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '13.2'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '13.2'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rspec
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,8 +66,8 @@ dependencies:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
- description: Fast XML to Hash parser and Hash to XML builder, built on top of the
56
- Ox gem (native C extension)
69
+ description: Fast Ruby XML to Hash parser and Hash to XML builder, built on top of
70
+ the Ox gem (a native C extension)
57
71
  email:
58
72
  executables: []
59
73
  extensions: []
@@ -79,12 +93,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
79
93
  version: '2.6'
80
94
  required_rubygems_version: !ruby/object:Gem::Requirement
81
95
  requirements:
82
- - - ">="
96
+ - - ">"
83
97
  - !ruby/object:Gem::Version
84
- version: '0'
98
+ version: 1.3.1
85
99
  requirements: []
86
100
  rubygems_version: 3.2.3
87
101
  signing_key:
88
102
  specification_version: 4
89
- summary: Fast XML to Hash parser
103
+ summary: Fast Ruby XML to Hash parser and Hash to XML builder
90
104
  test_files: []