pubid 2.0.0.pre.alpha.13 → 2.0.0.pre.alpha.15

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.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/data/parg/adobe.json +1 -0
  3. data/data/parg/aiee.parg +37 -0
  4. data/data/parg/amca.json +1 -0
  5. data/data/parg/ansi.json +1 -0
  6. data/data/parg/api.json +1 -0
  7. data/data/parg/ashrae.json +1 -0
  8. data/data/parg/asme.json +1 -0
  9. data/data/parg/astm.json +1 -0
  10. data/data/parg/bipm.json +1 -0
  11. data/data/parg/bsi.json +1 -0
  12. data/data/parg/calconnect.json +1 -0
  13. data/data/parg/ccsds.json +1 -0
  14. data/data/parg/cen_cenelec.json +1 -0
  15. data/data/parg/cen_cenelec.parg +42 -0
  16. data/data/parg/cie.json +1 -0
  17. data/data/parg/csa.json +1 -0
  18. data/data/parg/doi.json +1 -0
  19. data/data/parg/easc.json +1 -0
  20. data/data/parg/ecma.json +1 -0
  21. data/data/parg/etsi.json +1 -0
  22. data/data/parg/evs.json +1 -0
  23. data/data/parg/gb.json +1 -0
  24. data/data/parg/gost.json +1 -0
  25. data/data/parg/iala.json +1 -0
  26. data/data/parg/iana.json +1 -0
  27. data/data/parg/idf.parg +39 -0
  28. data/data/parg/iec.json +1 -0
  29. data/data/parg/ieee.json +1 -0
  30. data/data/parg/ietf.json +1 -0
  31. data/data/parg/ire.parg +39 -0
  32. data/data/parg/isbn.json +1 -0
  33. data/data/parg/iso.json +1 -0
  34. data/data/parg/itu.json +1 -0
  35. data/data/parg/jcgm.json +1 -0
  36. data/data/parg/jis.json +1 -0
  37. data/data/parg/nesc.parg +38 -0
  38. data/data/parg/nist.json +1 -0
  39. data/data/parg/oasis.json +1 -0
  40. data/data/parg/ogc.json +1 -0
  41. data/data/parg/oiml.json +1 -0
  42. data/data/parg/omg.json +1 -0
  43. data/data/parg/plateau.json +1 -0
  44. data/data/parg/sae.json +1 -0
  45. data/data/parg/tables/bipm_groups.yaml +14 -0
  46. data/data/parg/tables/bipm_type_codes.yaml +5 -0
  47. data/data/parg/tables/bipm_type_names_en.yaml +6 -0
  48. data/data/parg/tables/bipm_type_names_fr.yaml +6 -0
  49. data/data/parg/tables/directives_supplements_typed_stages.yaml +3 -0
  50. data/data/parg/tables/directives_typed_stages.yaml +5 -0
  51. data/data/parg/tables/idf_typed_stages.yaml +27 -0
  52. data/data/parg/tables/idf_typed_stages_supplements.yaml +2 -0
  53. data/data/parg/tables/iec_typed_stages.yaml +130 -0
  54. data/data/parg/tables/iso_publishers.yaml +4 -0
  55. data/data/parg/tables/organizations.yaml +12 -0
  56. data/data/parg/tables/tc_types.yaml +42 -0
  57. data/data/parg/tables/typed_stages.yaml +114 -0
  58. data/data/parg/tables/typed_stages_supplements.yaml +64 -0
  59. data/data/parg/tables/wg_types.yaml +21 -0
  60. data/data/parg/tgpp.json +1 -0
  61. data/data/parg/un.json +1 -0
  62. data/data/parg/w3c.json +1 -0
  63. data/data/parg/xsf.json +1 -0
  64. data/lib/pubid/adobe/identifier.rb +11 -1
  65. data/lib/pubid/amca/identifiers/base.rb +1 -1
  66. data/lib/pubid/ansi/identifier.rb +1 -1
  67. data/lib/pubid/api/identifier.rb +1 -1
  68. data/lib/pubid/api/parser.rb +8 -4
  69. data/lib/pubid/ashrae/identifiers/base.rb +10 -1
  70. data/lib/pubid/ashrae/parser.rb +18 -11
  71. data/lib/pubid/asme/identifier.rb +1 -1
  72. data/lib/pubid/astm/identifier.rb +1 -1
  73. data/lib/pubid/bipm/identifier.rb +1 -1
  74. data/lib/pubid/bsi/single_identifier.rb +1 -3
  75. data/lib/pubid/calconnect/identifier.rb +1 -1
  76. data/lib/pubid/ccsds/identifier.rb +1 -1
  77. data/lib/pubid/cen_cenelec/identifier.rb +2 -1
  78. data/lib/pubid/cen_cenelec/parser.rb +9 -2
  79. data/lib/pubid/cie/identifier.rb +1 -1
  80. data/lib/pubid/cie/parser.rb +9 -2
  81. data/lib/pubid/conformance/checks.rb +1 -1
  82. data/lib/pubid/csa/identifier.rb +6 -2
  83. data/lib/pubid/csa/parser.rb +25 -8
  84. data/lib/pubid/doi/identifier.rb +1 -1
  85. data/lib/pubid/easc/identifier.rb +10 -1
  86. data/lib/pubid/ecma/identifier.rb +1 -1
  87. data/lib/pubid/etsi/identifiers/base.rb +1 -1
  88. data/lib/pubid/evs.rb +1 -1
  89. data/lib/pubid/gb/identifier.rb +1 -1
  90. data/lib/pubid/gost/identifier.rb +11 -1
  91. data/lib/pubid/gost/parser.rb +8 -1
  92. data/lib/pubid/iala/identifier.rb +10 -1
  93. data/lib/pubid/iana/identifier.rb +1 -1
  94. data/lib/pubid/idf/builder.rb +5 -0
  95. data/lib/pubid/iec/identifier.rb +1 -1
  96. data/lib/pubid/iec/parser.rb +9 -4
  97. data/lib/pubid/ieee/builder.rb +61 -23
  98. data/lib/pubid/ieee/identifiers/base.rb +1 -1
  99. data/lib/pubid/ieee/identifiers/joint_development.rb +55 -19
  100. data/lib/pubid/ieee/parser.rb +25 -11
  101. data/lib/pubid/ieee/renderer.rb +5 -3
  102. data/lib/pubid/ietf/identifiers/base.rb +1 -1
  103. data/lib/pubid/isbn/identifier.rb +1 -1
  104. data/lib/pubid/iso/identifier.rb +4 -1
  105. data/lib/pubid/iso/normalizer.rb +4 -1
  106. data/lib/pubid/itu/CLAUDE.md +46 -0
  107. data/lib/pubid/itu/builder.rb +24 -4
  108. data/lib/pubid/itu/identifiers/base.rb +11 -18
  109. data/lib/pubid/itu/identifiers/radio_regulations.rb +27 -0
  110. data/lib/pubid/itu/identifiers/special_publication.rb +48 -14
  111. data/lib/pubid/itu/identifiers/standard_serialization.rb +2 -0
  112. data/lib/pubid/itu/identifiers.rb +1 -0
  113. data/lib/pubid/itu/parser.rb +108 -22
  114. data/lib/pubid/itu/urn_generator.rb +9 -2
  115. data/lib/pubid/jcgm.rb +1 -1
  116. data/lib/pubid/jis/identifier.rb +1 -1
  117. data/lib/pubid/nist/builder.rb +1 -0
  118. data/lib/pubid/nist/identifiers/base.rb +15 -4
  119. data/lib/pubid/nist/parser.rb +9 -0
  120. data/lib/pubid/nist/urn_parser.rb +10 -1
  121. data/lib/pubid/oasis/identifier.rb +1 -1
  122. data/lib/pubid/ogc/identifier.rb +1 -1
  123. data/lib/pubid/oiml.rb +1 -1
  124. data/lib/pubid/omg/identifier.rb +1 -1
  125. data/lib/pubid/parg/artifact.rb +46 -0
  126. data/lib/pubid/parg/backend.rb +92 -0
  127. data/lib/pubid/parg.rb +8 -0
  128. data/lib/pubid/pg.rb +8 -0
  129. data/lib/pubid/plateau.rb +1 -2
  130. data/lib/pubid/sae/identifiers/base.rb +1 -1
  131. data/lib/pubid/tgpp/identifier.rb +1 -1
  132. data/lib/pubid/un/identifier.rb +1 -1
  133. data/lib/pubid/version.rb +1 -1
  134. data/lib/pubid/w3c/identifier.rb +1 -1
  135. data/lib/pubid/xsf/identifier.rb +1 -1
  136. data/lib/pubid.rb +1 -0
  137. metadata +83 -2
@@ -16,7 +16,10 @@ module Pubid
16
16
  def generate_base_urn
17
17
  parts = ["urn", "itu"]
18
18
 
19
- if identifier.sector
19
+ # An Operational Bulletin is cross-bureau: its sector is a spelling,
20
+ # not identity (see SpecialPublication#==), so it stays out of the URN.
21
+ if identifier.sector &&
22
+ !identifier.is_a?(Identifiers::SpecialPublication)
20
23
  sector = identifier.sector.to_s
21
24
  parts << sector.to_s.downcase
22
25
  else
@@ -56,7 +59,11 @@ module Pubid
56
59
 
57
60
  if identifier.date
58
61
  date = identifier.date
59
- if date&.year && date.month
62
+ # Only an Operational Bulletin's printed date carries a day
63
+ # ("15.III.2016"); it is in `==`, so it must reach the URN too.
64
+ if date&.year && date.month && date.day
65
+ parts << "#{date.day}/#{date.month}/#{date.year}"
66
+ elsif date&.year && date.month
60
67
  parts << "#{date.month}/#{date.year}"
61
68
  elsif date&.year
62
69
  parts << date.year.to_s
data/lib/pubid/jcgm.rb CHANGED
@@ -35,7 +35,7 @@ module Pubid
35
35
  parser = Parser.new
36
36
  builder = Builder.new
37
37
 
38
- parsed = parser.parse(identifier)
38
+ parsed = Pubid::Parg::Backend.parse(:jcgm, identifier)
39
39
  builder.build(parsed)
40
40
  end
41
41
 
@@ -174,7 +174,7 @@ module Pubid
174
174
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
175
175
  end
176
176
 
177
- parsed = Parser.parse(identifier)
177
+ parsed = Pubid::Parg::Backend.parse(:jis, identifier)
178
178
  Builder.build(parsed)
179
179
  end
180
180
  end
@@ -87,6 +87,7 @@ module Pubid
87
87
  # Note: :base_portion is lost during parser merge, so check for supplement indicators
88
88
  if parsed_hash[:supplement_date_range] || parsed_hash[:supplement_slash_year] ||
89
89
  parsed_hash[:supplement_month_year] || parsed_hash[:supplement_year] ||
90
+ parsed_hash[:supplement_empty] ||
90
91
  parsed_hash[:supplement] || parsed_hash[:base_portion]
91
92
  return build_circular_supplement(parsed_hash)
92
93
  end
@@ -696,14 +696,25 @@ module Pubid
696
696
  result += "#{vol_str}n#{issue_number.number}"
697
697
  end
698
698
 
699
- # Use edition component - NO space before edition in MR format (per NIST spec)
700
- result += edition.to_s if edition
699
+ # With a number, the edition glues to it per the NIST spec
700
+ # ("800-53r5"); series-only editions take a dot separator
701
+ # ("NBS.CIRC.e2" — the attested raw spelling; testsuite#5 C4/C5).
702
+ result += if edition
703
+ number ? edition.to_s : ".#{edition}"
704
+ else
705
+ ""
706
+ end
701
707
 
702
708
  # Use version_component
703
709
  result += version_component.to_s(:mr) if version_component
704
710
 
705
- # Supplement (e.g. ".9981sup7") - keep distinct documents distinct
706
- result += supplement_short
711
+ # Supplement (e.g. ".9981sup7") - keep distinct documents distinct;
712
+ # a series-only supplement ("NBS.CIRC.sup") takes the dot itself.
713
+ result += if supplement
714
+ number ? supplement_short : ".#{supplement_short}"
715
+ else
716
+ ""
717
+ end
707
718
 
708
719
  # Use update_component
709
720
  result += update_component.to_s(:mr) if update_component
@@ -726,6 +726,15 @@ module Pubid
726
726
  # 4-digit years so it can't swallow "sup3/1926" or a base number.
727
727
  ((str("supp") | str("sup")) >> match("[0-9]").repeat(4, 4).as(:supp_year_start) >>
728
728
  dash >> match("[0-9]").repeat(4, 4).as(:supp_year_end)).as(:supplement_date_range) |
729
+ # Bare supplement marker to the whole series, no base number
730
+ # ("NBS.CIRC.sup" — testsuite#5 C4): the marker alone is the
731
+ # supplement.
732
+ ((str("supp") | str("sup")) >>
733
+ (
734
+ (month_abbrev >> digits).as(:supplement_month_year) |
735
+ (digits.as(:supp_number) >> slash >> digits.as(:supp_year)).as(:supplement_slash_year) |
736
+ str("").as(:supplement_empty)
737
+ ).maybe) |
729
738
  # With base identifier + supplement
730
739
  (
731
740
  # Capture base portion (everything before "supp" or "sup" or slash+year)
@@ -42,13 +42,22 @@ module Pubid
42
42
  type_token, payload = parts
43
43
  code, revision = parse_payload(payload)
44
44
 
45
- text = "NIST #{type_label(type_token)} #{code}"
45
+ text = "#{publisher_for(type_token)} #{type_label(type_token)} #{code}"
46
46
  text += revision if revision
47
47
  flavor_parse(text)
48
48
  end
49
49
 
50
50
  private
51
51
 
52
+ # The NBS-era series carry the NBS imprint in their canonical form
53
+ # ("NBS CSM 1") — the rebuild must name the publisher the document
54
+ # carries, or the flavor parse rejects its own URN's rebuild.
55
+ NBS_SERIES = ["csm"].freeze
56
+
57
+ def publisher_for(type_token)
58
+ NBS_SERIES.include?(type_token.downcase) ? "NBS" : "NIST"
59
+ end
60
+
52
61
  def parse_payload(payload)
53
62
  # Strip the trailing ".supp" supplement marker.
54
63
  stripped = payload.sub(/\.supp\z/, "")
@@ -146,7 +146,7 @@ module Pubid
146
146
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
147
147
  end
148
148
 
149
- parsed = Parser.parse(identifier)
149
+ parsed = Pubid::Parg::Backend.parse(:oasis, identifier)
150
150
  Builder.build(parsed)
151
151
  end
152
152
 
@@ -85,7 +85,7 @@ module Pubid
85
85
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
86
86
  end
87
87
 
88
- Builder.build(Parser.parse(identifier))
88
+ Builder.build(Pubid::Parg::Backend.parse(:ogc, identifier))
89
89
  end
90
90
  end
91
91
  end
data/lib/pubid/oiml.rb CHANGED
@@ -37,7 +37,7 @@ module Pubid
37
37
  parser = Parser.new
38
38
  builder = Builder.new
39
39
 
40
- parsed = parser.parse(identifier)
40
+ parsed = Pubid::Parg::Backend.parse(:oiml, identifier)
41
41
  builder.build(parsed)
42
42
  end
43
43
 
@@ -53,7 +53,7 @@ module Pubid
53
53
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
54
54
  end
55
55
 
56
- parsed = Parser.parse(identifier)
56
+ parsed = Pubid::Parg::Backend.parse(:omg, identifier)
57
57
  Builder.build(parsed)
58
58
  end
59
59
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parsanol"
4
+
5
+ module Pubid
6
+ module Parg
7
+ # A baked, checksum-verified PG artifact for one flavor. The artifact
8
+ # is the parser of record for the flavor: its grammar, tests, entries,
9
+ # and embedded tables travel together and are verified on load.
10
+ class Artifact
11
+ DATA_DIR = File.expand_path("../../../data/parg", __dir__)
12
+ # The deferred entity atoms resolve from_table references at parse
13
+ # time from this dir, so the table YAMLs vendor alongside the
14
+ # baked artifacts.
15
+ TABLES_DIR = File.join(DATA_DIR, "tables")
16
+
17
+ @artifacts = {}
18
+
19
+ class << self
20
+ # Load and memoize the artifact for a flavor (e.g. :iso).
21
+ def for(flavor)
22
+ @artifacts[flavor] ||=
23
+ begin
24
+ path = File.join(DATA_DIR, "#{flavor}.json")
25
+ new(Parsanol::PARG::Artifact.load(path, tables_dir: TABLES_DIR))
26
+ rescue Parsanol::PARG::Error => e
27
+ raise Pubid::Errors::ParseError,
28
+ "PG artifact #{path} rejected: #{e.message}"
29
+ end
30
+ end
31
+ end
32
+
33
+ def initialize(artifact)
34
+ @artifact = artifact
35
+ end
36
+
37
+ def parse(entry, input)
38
+ @artifact.parse(entry, input)
39
+ end
40
+
41
+ def checksum
42
+ @artifact.envelope["checksum"]
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Parg
5
+ # The PG-artifact parse backend: runs the flavor's baked artifact on
6
+ # an input and returns the builder-ready attribute hash the flavor's
7
+ # Builder expects — the same hash its parslet parser produced.
8
+ module Backend
9
+ LEAF_KEYS = %i[value line column offset length].freeze
10
+
11
+ module_function
12
+
13
+ ALL_PARTS_SUFFIX = "(all parts)"
14
+
15
+ def parse(flavor, input, entry: "identifier", merge_top_sequence: true)
16
+ # The parslet grammar base strips the "(all parts)" suffix before
17
+ # parsing and marks the tree (Grammar#parse / #mark_all_parts);
18
+ # the artifact backend carries the same contract so every flavor
19
+ # whose grammar does not itself consume the suffix keeps working.
20
+ if input.end_with?(ALL_PARTS_SUFFIX)
21
+ base = input.sub(/\s*\(all parts\)\s*\z/, "")
22
+ tree = to_builder_hash(Artifact.for(flavor).parse(entry, base), merge: merge_top_sequence)
23
+ return mark_all_parts(tree)
24
+ end
25
+
26
+ to_builder_hash(Artifact.for(flavor).parse(entry, input), merge: merge_top_sequence)
27
+ rescue Parsanol::ParseFailed => e
28
+ raise Pubid::Errors::ParseError.new(e.message, nil,
29
+ input: input,
30
+ flavor: registered_name(flavor))
31
+ end
32
+
33
+ # The registered flavor name (Registry-resolvable; "3gpp" for
34
+ # Pubid::Tgpp), falling back to the internal symbol when the
35
+ # flavor is not registered.
36
+ def registered_name(flavor)
37
+ mod = Pubid.const_get(flavor.to_s.split("_").map(&:capitalize).join)
38
+ names = Pubid::Registry.flavor_names.select { |name| Pubid::Registry.get(name) == mod }
39
+ # A module may register under several names; the longest is the
40
+ # canonical one ("cen_cenelec", not the "cen" alias).
41
+ names.max_by(&:length)
42
+ rescue NameError
43
+ nil
44
+ end || flavor.to_s
45
+
46
+ def mark_all_parts(tree)
47
+ case tree
48
+ when Hash then tree.merge(all_parts: true)
49
+ when Array then tree.map { |t| t.merge(all_parts: true) }
50
+ else tree
51
+ end
52
+ end
53
+
54
+ # The artifact emits the parsanol-tree wire shape: capture leaves
55
+ # ({value, line, column, offset, length}) carry their text, and the
56
+ # top-level sequence is a list of capture hashes. The builder-ready
57
+ # form scalarizes leaves and folds that top-level list into one
58
+ # attribute hash (last key wins) — parslet's sequence fold.
59
+ def to_builder_hash(shape, merge: true)
60
+ normalized = normalize(shape)
61
+ return normalized.reduce(:merge) if merge && mergeable_sequence?(normalized)
62
+
63
+ normalized
64
+ end
65
+
66
+ def normalize(node)
67
+ case node
68
+ when Parsanol::Slice then node.content
69
+ when Hash then normalize_hash(node)
70
+ when Array then node.map { |item| normalize(item) }
71
+ else node
72
+ end
73
+ end
74
+
75
+ def normalize_hash(node)
76
+ return node[:value] if wire_leaf?(node)
77
+
78
+ node.transform_values { |value| normalize(value) }
79
+ end
80
+
81
+ def mergeable_sequence?(value)
82
+ value.is_a?(Array) && value.all?(Hash)
83
+ end
84
+
85
+ def wire_leaf?(node)
86
+ return false unless node.size == LEAF_KEYS.size
87
+
88
+ LEAF_KEYS.all? { |key| node.key?(key) }
89
+ end
90
+ end
91
+ end
92
+ end
data/lib/pubid/parg.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Parg
5
+ autoload :Artifact, "pubid/parg/artifact"
6
+ autoload :Backend, "pubid/parg/backend"
7
+ end
8
+ end
data/lib/pubid/pg.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Pg
5
+ autoload :Artifact, "pubid/pg/artifact"
6
+ autoload :Backend, "pubid/pg/backend"
7
+ end
8
+ end
data/lib/pubid/plateau.rb CHANGED
@@ -31,8 +31,7 @@ module Pubid
31
31
 
32
32
  # Apply legacy update_codes normalization first
33
33
  normalized = Core::UpdateCodes.apply(input, :plateau)
34
- parser = Parser.new
35
- parsed = parser.parse(normalized)
34
+ parsed = Pubid::Parg::Backend.parse(:plateau, normalized)
36
35
  Builder.build(parsed)
37
36
  end
38
37
 
@@ -16,7 +16,7 @@ module Pubid
16
16
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
17
17
  end
18
18
 
19
- parsed = Parser.parse(input)
19
+ parsed = Pubid::Parg::Backend.parse(:sae, input)
20
20
  Builder.build(parsed)
21
21
  end
22
22
 
@@ -113,7 +113,7 @@ module Pubid
113
113
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
114
114
  end
115
115
 
116
- parsed = Parser.parse(identifier)
116
+ parsed = Pubid::Parg::Backend.parse(:tgpp, identifier)
117
117
  Builder.build(parsed)
118
118
  end
119
119
  end
@@ -32,7 +32,7 @@ module Pubid
32
32
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
33
33
  end
34
34
 
35
- parsed = Parser.parse(identifier)
35
+ parsed = Pubid::Parg::Backend.parse(:un, identifier, merge_top_sequence: false)
36
36
  Builder.build(parsed)
37
37
  end
38
38
  end
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.13"
4
+ VERSION = "2.0.0.pre.alpha.15"
5
5
  end
@@ -122,7 +122,7 @@ module Pubid
122
122
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
123
123
  end
124
124
 
125
- parsed = Parser.parse(identifier)
125
+ parsed = Pubid::Parg::Backend.parse(:w3c, identifier)
126
126
  Builder.build(parsed)
127
127
  end
128
128
  end
@@ -58,7 +58,7 @@ module Pubid
58
58
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
59
59
  end
60
60
 
61
- parsed = Parser.parse(identifier)
61
+ parsed = Pubid::Parg::Backend.parse(:xsf, identifier)
62
62
  Builder.build(parsed)
63
63
  end
64
64
  end
data/lib/pubid.rb CHANGED
@@ -17,6 +17,7 @@ require "pubid/prefixes_support"
17
17
  module Pubid
18
18
  autoload :Schema, "pubid/schema"
19
19
  autoload :Conformance, "pubid/conformance"
20
+ autoload :Parg, "pubid/parg"
20
21
  # Upper bound on the length of an identifier string accepted by any +parse+
21
22
  # entry point. Real-world standards identifiers are well under 200 characters;
22
23
  # this limit exists purely to keep pathological, attacker-controlled inputs
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.13
4
+ version: 2.0.0.pre.alpha.15
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-09-24 00:00:00.000000000 Z
11
+ date: 2026-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lutaml-model
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: parsanol
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.57
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.57
41
55
  description: PubID is a Ruby library for parsing and generating international publication
42
56
  identifiers (PubIDs). It provides a simple and flexible API for working with PubIDs,
43
57
  allowing developers to easily create, manipulate, and validate PubIDs in their applications.
@@ -60,6 +74,68 @@ files:
60
74
  - data/nist/series.yaml
61
75
  - data/nist/stages.yaml
62
76
  - data/nist/update_codes.yaml
77
+ - data/parg/adobe.json
78
+ - data/parg/aiee.parg
79
+ - data/parg/amca.json
80
+ - data/parg/ansi.json
81
+ - data/parg/api.json
82
+ - data/parg/ashrae.json
83
+ - data/parg/asme.json
84
+ - data/parg/astm.json
85
+ - data/parg/bipm.json
86
+ - data/parg/bsi.json
87
+ - data/parg/calconnect.json
88
+ - data/parg/ccsds.json
89
+ - data/parg/cen_cenelec.json
90
+ - data/parg/cen_cenelec.parg
91
+ - data/parg/cie.json
92
+ - data/parg/csa.json
93
+ - data/parg/doi.json
94
+ - data/parg/easc.json
95
+ - data/parg/ecma.json
96
+ - data/parg/etsi.json
97
+ - data/parg/evs.json
98
+ - data/parg/gb.json
99
+ - data/parg/gost.json
100
+ - data/parg/iala.json
101
+ - data/parg/iana.json
102
+ - data/parg/idf.parg
103
+ - data/parg/iec.json
104
+ - data/parg/ieee.json
105
+ - data/parg/ietf.json
106
+ - data/parg/ire.parg
107
+ - data/parg/isbn.json
108
+ - data/parg/iso.json
109
+ - data/parg/itu.json
110
+ - data/parg/jcgm.json
111
+ - data/parg/jis.json
112
+ - data/parg/nesc.parg
113
+ - data/parg/nist.json
114
+ - data/parg/oasis.json
115
+ - data/parg/ogc.json
116
+ - data/parg/oiml.json
117
+ - data/parg/omg.json
118
+ - data/parg/plateau.json
119
+ - data/parg/sae.json
120
+ - data/parg/tables/bipm_groups.yaml
121
+ - data/parg/tables/bipm_type_codes.yaml
122
+ - data/parg/tables/bipm_type_names_en.yaml
123
+ - data/parg/tables/bipm_type_names_fr.yaml
124
+ - data/parg/tables/directives_supplements_typed_stages.yaml
125
+ - data/parg/tables/directives_typed_stages.yaml
126
+ - data/parg/tables/idf_typed_stages.yaml
127
+ - data/parg/tables/idf_typed_stages_supplements.yaml
128
+ - data/parg/tables/iec_typed_stages.yaml
129
+ - data/parg/tables/iso_publishers.yaml
130
+ - data/parg/tables/organizations.yaml
131
+ - data/parg/tables/tc_types.yaml
132
+ - data/parg/tables/typed_stages.yaml
133
+ - data/parg/tables/typed_stages_supplements.yaml
134
+ - data/parg/tables/wg_types.yaml
135
+ - data/parg/tgpp.json
136
+ - data/parg/un.json
137
+ - data/parg/w3c.json
138
+ - data/parg/xsf.json
63
139
  - data/plateau/update_codes.yaml
64
140
  - lib/pubid.rb
65
141
  - lib/pubid/adobe.rb
@@ -686,6 +762,7 @@ files:
686
762
  - lib/pubid/itu/identifiers/errata.rb
687
763
  - lib/pubid/itu/identifiers/handbook.rb
688
764
  - lib/pubid/itu/identifiers/question.rb
765
+ - lib/pubid/itu/identifiers/radio_regulations.rb
689
766
  - lib/pubid/itu/identifiers/recommendation.rb
690
767
  - lib/pubid/itu/identifiers/report.rb
691
768
  - lib/pubid/itu/identifiers/special_publication.rb
@@ -843,12 +920,16 @@ files:
843
920
  - lib/pubid/omg/identifiers/specification.rb
844
921
  - lib/pubid/omg/parser.rb
845
922
  - lib/pubid/omg/renderer.rb
923
+ - lib/pubid/parg.rb
924
+ - lib/pubid/parg/artifact.rb
925
+ - lib/pubid/parg/backend.rb
846
926
  - lib/pubid/parser.rb
847
927
  - lib/pubid/parser/common_parse_methods.rb
848
928
  - lib/pubid/parser/common_parse_rules.rb
849
929
  - lib/pubid/parser/grammar.rb
850
930
  - lib/pubid/parsers/base.rb
851
931
  - lib/pubid/parsers/mr_string.rb
932
+ - lib/pubid/pg.rb
852
933
  - lib/pubid/plateau.rb
853
934
  - lib/pubid/plateau/builder.rb
854
935
  - lib/pubid/plateau/identifier.rb