canon 0.3.31 → 0.3.32

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: 7c7f349890b131b4280956b65c069369fee17b526db3ffacaa4560c3b3beb485
4
- data.tar.gz: dc2179259f0a7212de6b6aaddd50e61a32fba4627d4b853d60e00172cb819c10
3
+ metadata.gz: 44f563b9b8ac9fa82cc08c9413ca4a17afd8080c524d6eb92536572356892539
4
+ data.tar.gz: 4a7cbe635232ca07fa8b9924e46c027849145fbc6ac6846df3ec9de4c51edbc4
5
5
  SHA512:
6
- metadata.gz: 6e3085a46f5ae85c542a419ae35b961529fc76d1f232d72f3599eb54b1f6588e0bbc9d8f1ffcdb6e31e61a5dcf4a3d8c884ddf0999f9a1f2062e22997640052a
7
- data.tar.gz: 3573d0da07ad60bd4aac8a3e3ffb149d61c400a2708c10d8dcca9280abae0dc12ac7d442786fd12be62ea584345e67dd2807ca63bc598578a4013e9159cd0ad7
6
+ metadata.gz: a228ef2b06e3e59545aab338afd72cdcf4943c32b34fa24063e43884f01b41444558966cb121986513d28041a92f0918864106886875ef44da9b3f00e53dcdc2
7
+ data.tar.gz: 9dbddd3a07e0d6076118ed7e2619de864b9bf3c99ff68c109fa31805a912a1839054d4cf843f712faa2df2a2ee619806d256a47bdce9399feb422721d6117e71
data/CLAUDE.md CHANGED
@@ -149,7 +149,7 @@ Engine A/B testing: `CANON_XML_BACKEND=nokogiri bundle exec rspec` (or `=moxml`
149
149
 
150
150
  ### YAML Engines
151
151
 
152
- `Canon::YamlBackend` selects the YAML engine: `:psych` (default) or `:yeptris` (FFI over libyeptris, the YAML counterpart of the leptris XML stack — `CANON_YAML_BACKEND=yeptris` opts in; the optional `yeptris` Gemfile group must be enabled). `Canon::YamlParsing` is the single gateway for string loads; `Canon::JsonParsing` mirrors it for JSON (the same yeptris engine serves both — `Yeptris::YAML.load` auto-detects JSON and routes to the native C-API materializer; JSON falls back to stdlib unless `YamlBackend.yeptris_native?`, since the FFI ladder is ~29x slower than the stdlib C extension). `YAML.dump` stays on Psych everywhere — canonical output bytes are canon's product and the writers differ. **JSON defaults to the strict yeptris surface whenever the native materializer is installed** (yeptris 0.1.13.4 ships platform gems — zero compilation, zero env; parity spec-pinned to `JSON.parse` upstream). The YAML default stays `:psych` until the yeptris Psych-parity gaps close (yeptris-ruby#30 sexagesimal scalars, #31 >64-bit integers #29 empty documents was fixed in 0.1.12); `spec/canon/yaml_engine_parity_spec.rb` is the executable gate, with upstream-tracked cases pending. Never `require "yeptris/psych"` — it rebinds the global `::Psych` constant for the whole process; only the namespaced `Yeptris::YAML` API is used.
152
+ `Canon::YamlBackend` selects the YAML engine: `:yeptris` (default Marshal bulk materialization in yeptris 0.1.28, 4.5–5x Psych load) or `:psych` (`CANON_YAML_BACKEND=psych` forces the stdlib engine). The default follows availability: yeptris when loadable, Psych otherwise. `Canon::YamlParsing` is the single gateway for string loads; `Canon::JsonParsing` mirrors it for JSON (the same yeptris engine serves both — `Yeptris::YAML.load` auto-detects JSON and routes to the native C-API materializer; JSON falls back to stdlib unless `YamlBackend.yeptris_native?`, since the FFI ladder is ~29x slower than the stdlib C extension). `YAML.dump` stays on Psych everywhere — canonical output bytes are canon's product and the writers differ. **JSON defaults to the strict yeptris surface whenever the native materializer is installed** (yeptris 0.1.13.4 ships platform gems — zero compilation, zero env; parity spec-pinned to `JSON.parse` upstream). The parity gate (`spec/canon/yaml_engine_parity_spec.rb`) ran clean after yeptris-ruby #29/#30/#31/#37 all closed (0.1.15.1), so YAML loads flip to yeptris by default; the spec stays as the executable gate for future yeptris releases. Never `require "yeptris/psych"` — it rebinds the global `::Psych` constant for the whole process; only the namespaced `Yeptris::YAML` API is used.
153
153
 
154
154
  ### Format Detection
155
155
 
@@ -199,10 +199,10 @@ module Canon
199
199
  content
200
200
  when :json
201
201
  # Parse JSON to Ruby object
202
- JSON.parse(content)
202
+ Canon::JsonParsing.parse(content)
203
203
  when :yaml
204
204
  # Parse YAML to Ruby object
205
- YAML.safe_load(content)
205
+ Canon::YamlParsing.safe_load(content)
206
206
  else
207
207
  abort "Error: Unsupported format '#{format}'"
208
208
  end
@@ -126,7 +126,7 @@ module Canon
126
126
 
127
127
  def load_yaml(path)
128
128
  content = File.read(path)
129
- YAML.safe_load(content, permitted_classes: [Symbol]) || {}
129
+ Canon::YamlParsing.safe_load(content, permitted_classes: [Symbol]) || {}
130
130
  end
131
131
  end
132
132
  end
@@ -17,7 +17,7 @@ module Canon
17
17
  # Return as-is if already parsed
18
18
  return yaml if yaml.is_a?(Hash) || yaml.is_a?(Array)
19
19
 
20
- Canon::YamlParsing.safe_load(yaml)
20
+ Canon::YamlParsing.safe_load(yaml, aliases: true)
21
21
  end
22
22
 
23
23
  def self.sort_yaml_keys(obj)
@@ -22,7 +22,7 @@ module Canon
22
22
  return if input.is_a?(Hash) || input.is_a?(Array) # Already parsed
23
23
  return if input.strip.empty?
24
24
 
25
- Canon::YamlParsing.safe_load(input)
25
+ Canon::YamlParsing.safe_load(input, aliases: true)
26
26
  rescue Psych::SyntaxError => e
27
27
  location = extract_location(e)
28
28
 
data/lib/canon/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Canon
4
- VERSION = "0.3.31"
4
+ VERSION = "0.3.32"
5
5
  end
@@ -6,12 +6,12 @@ module Canon
6
6
  # stack).
7
7
  #
8
8
  # Mirrors XmlBackend's discipline (MECE — this module owns selection,
9
- # YamlParsing owns the calls). The default stays :psych until the
10
- # yeptris Psych-safe_load parity gaps close (yeptris-ruby#29 empty
11
- # documents crash, #30 sexagesimal scalars, #31 >64-bit integers);
12
- # yeptris is 3.1x faster at loading (measured, 2,000-item document),
13
- # so CANON_YAML_BACKEND=yeptris opts in early and the default flips
14
- # once the parity spec runs clean.
9
+ # YamlParsing owns the calls). yeptris loads 4.5–5x faster than Psych
10
+ # (0.1.28 Marshal materialization, 2,000-item document) and the
11
+ # Psych-safe_load parity spec runs clean the former gate-blockers
12
+ # (yeptris-ruby#29/#30/#31) are all fixed upstream. The default
13
+ # therefore follows availability: yeptris when loadable, Psych
14
+ # otherwise. CANON_YAML_BACKEND=psych forces the stdlib engine.
15
15
  #
16
16
  # Only the namespaced API (Yeptris::YAML) is ever used — requiring
17
17
  # "yeptris/psych" rebinds the global ::Psych constant for the whole
@@ -22,7 +22,7 @@ module Canon
22
22
  class << self
23
23
  def active
24
24
  @active ||= begin
25
- wanted = forced || :psych
25
+ wanted = forced || (yeptris_available? ? :yeptris : :psych)
26
26
  # A forced yeptris without a loadable gem/native lib must
27
27
  # degrade to Psych, not NameError in the gateway.
28
28
  wanted = :psych if wanted == :yeptris && !yeptris_available?
@@ -14,18 +14,17 @@ module Canon
14
14
  # data with Symbol/Date/Time built in (aliases resolve), so the
15
15
  # permitted-class list is inherently satisfied; parse failures are
16
16
  # normalized to Psych::SyntaxError so canon's rescues hold on both
17
- # engines.
17
+ # engines. Canon always resolves anchors (aliases: true at every
18
+ # call site) — a canonicalizer treats anchors as content: yeptris
19
+ # resolves them unconditionally, so :true keeps both engines
20
+ # behavior-identical.
18
21
  def safe_load(yaml, permitted_classes: [Symbol, Date, Time],
19
- aliases: false)
22
+ aliases: true)
20
23
  if YamlBackend.yeptris?
21
24
  begin
22
25
  ::Yeptris::YAML.load(yaml)
23
26
  rescue ::Yeptris::ParseError => e
24
27
  raise Psych::SyntaxError.new(nil, 0, 0, 0, e.message, "")
25
- rescue ::FFI::NullPointerError
26
- # yeptris-ruby#29: empty/comment-only input. Psych returns
27
- # nil; mirror that until the upstream fix lands.
28
- nil
29
28
  end
30
29
  else
31
30
  YAML.safe_load(yaml, permitted_classes: permitted_classes,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.31
4
+ version: 0.3.32
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.