pubid 2.0.0.pre.alpha.25 → 2.0.0.pre.alpha.27

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.
@@ -1,6 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pubid
4
+ # Per-flavor string formats (renderer/parser pairs), parent-chained
5
+ # along the identifier class hierarchy.
6
+ #
7
+ # When lutaml-model is loaded, every registration is mirrored into
8
+ # Lutaml::Model::FormatRegistry (the single format registry the
9
+ # grammar-backed format machinery consumes), so pubid's string
10
+ # formats and LML-declared formats live in one registry. pubid
11
+ # itself does not depend on lutaml-model — the mirror is inert
12
+ # without it.
4
13
  class FormatRegistry
5
14
  attr_reader :formats
6
15
 
@@ -11,6 +20,7 @@ module Pubid
11
20
 
12
21
  def register(format, renderer: nil, parser: nil)
13
22
  @formats[format.to_sym] = { renderer:, parser: }
23
+ mirror_to_model_registry(format.to_sym, renderer, parser)
14
24
  end
15
25
 
16
26
  def renderer_for(format)
@@ -38,5 +48,32 @@ module Pubid
38
48
  def has?(format)
39
49
  @formats.key?(format.to_sym) || (@parent&.has?(format) || false)
40
50
  end
51
+
52
+ private
53
+
54
+ def mirror_to_model_registry(format, renderer, parser)
55
+ return unless defined?(::Lutaml::Model::FormatRegistry)
56
+ return if ::Lutaml::Model::FormatRegistry.registered?(format)
57
+
58
+ adapter = Class.new
59
+ adapter.define_singleton_method(:pubid_renderer) { renderer }
60
+ if parser
61
+ adapter.define_singleton_method(:parse) { |data, _options = {}| parser.call(data) }
62
+ end
63
+ transformer = Class.new do
64
+ define_singleton_method(:name) { "Pubid#{format.to_s.capitalize}Transform" }
65
+
66
+ define_method(:data_to_model) do |data, _format, _options = {}|
67
+ data
68
+ end
69
+ end
70
+ ::Lutaml::Model::FormatRegistry.register(
71
+ format,
72
+ mapping_class: ::Lutaml::Model::Mapping,
73
+ adapter_class: adapter,
74
+ transformer: transformer,
75
+ error_types: [Pubid::Errors::ParseError],
76
+ )
77
+ end
41
78
  end
42
79
  end
@@ -1255,12 +1255,6 @@ module Pubid
1255
1255
  cleaned = cleaned.gsub(/\s+/, " ")
1256
1256
 
1257
1257
 
1258
- # NEW Session 171: CONSERVATIVE data quality fixes for TODO.IEEE-MUST-DO.txt
1259
- # Only fix clear typos: space before dash + 4-digit year, OR dash + space + 4-digit year
1260
- # Do NOT touch " - " (space-dash-space) which is valid formatting
1261
- cleaned = cleaned.gsub(/(\d)\s+-(\d{4})\b/, '\1-\2') # "C37.101 -2006" → "C37.101-2006"
1262
- cleaned = cleaned.gsub(/(\d)-\s+(\d{4})\b/, '\1-\2') # "C62.35- 2010" → "C62.35-2010"
1263
-
1264
1258
  # NEW Session 171: Remove wrong ! prefix
1265
1259
  cleaned = cleaned.gsub(/^!IEEE /, "IEEE ")
1266
1260
 
@@ -1270,10 +1264,6 @@ module Pubid
1270
1264
  cleaned = cleaned.gsub("&", "&") # Double-encoded ampersand
1271
1265
  cleaned = cleaned.gsub("&", "&") # Single-encoded ampersand
1272
1266
 
1273
- # NEW: Wrap P&V notation in parentheses (Paper & Video, etc.)
1274
- # Pattern: "IEEE Std 500-1984 P&V" → "IEEE Std 500-1984 (P&V)"
1275
- cleaned = cleaned.gsub(/\s+(P&V)\s*$/, ' (\1)')
1276
-
1277
1267
  # NEW Phase 1: Fix number spacing issues (e.g., "C57.1 2.25" → "C57.12.25")
1278
1268
  # This handles cases where a space appears in the middle of a number
1279
1269
  cleaned = cleaned.gsub(/(\d+\.\d+)\s+(\d+\.)/, '\1\2')
@@ -1282,16 +1272,6 @@ module Pubid
1282
1272
  # Remove spaces within 4-digit years
1283
1273
  cleaned = cleaned.gsub(/\b(1|2)\s+(\d{3})\b/, '\1\2')
1284
1274
 
1285
- # NEW: Fix month+year spacing (e.g., "March2016" → "March 2016")
1286
- # Add space between month name and 4-digit year when they're concatenated
1287
- cleaned = cleaned.gsub(
1288
- /\b(January|February|March|April|May|June|July|August|September|October|November|December)(\d{4})\b/, '\1 \2'
1289
- )
1290
- # Also handle abbreviated months
1291
- cleaned = cleaned.gsub(
1292
- /\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec)(\d{4})\b/, '\1 \2'
1293
- )
1294
-
1295
1275
  # NEW: Convert IEC/IEEE space-separated to semicolon format
1296
1276
  # Pattern: "IEC 61523-3 First edition 2004-09; IEEE 1497" → already semicolon
1297
1277
  # Pattern: "IEC 62539 First Edition 2007-07 IEEE 930" → needs semicolon
data/lib/pubid/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pubid
4
- VERSION = "2.0.0.pre.alpha.25"
4
+ VERSION = "2.0.0.pre.alpha.27"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre.alpha.25
4
+ version: 2.0.0.pre.alpha.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-10-03 00:00:00.000000000 Z
11
+ date: 2026-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lutaml-model