pubid 2.0.0.pre.alpha.8 → 2.0.0.pre.alpha.11

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 (672) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +33 -11
  3. data/conformance/pending.yaml +4 -0
  4. data/data/bipm/update_codes.yaml +9 -0
  5. data/data/iec/update_codes.yaml +3 -0
  6. data/data/ieee/update_codes.yaml +107 -1
  7. data/{archived-gems/pubid-nist → data/nist}/series.yaml +34 -0
  8. data/data/nist/update_codes.yaml +8 -0
  9. data/lib/pubid/adobe/builder.rb +52 -0
  10. data/lib/pubid/adobe/identifier.rb +47 -0
  11. data/lib/pubid/adobe/identifiers/publication.rb +31 -0
  12. data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
  13. data/lib/pubid/adobe/identifiers.rb +10 -0
  14. data/lib/pubid/adobe/parser.rb +136 -0
  15. data/lib/pubid/adobe/renderer.rb +39 -0
  16. data/lib/pubid/adobe/urn_generator.rb +42 -0
  17. data/lib/pubid/adobe/urn_parser.rb +69 -0
  18. data/lib/pubid/adobe.rb +61 -0
  19. data/lib/pubid/amca/builder.rb +4 -4
  20. data/lib/pubid/amca/identifier.rb +1 -3
  21. data/lib/pubid/amca/identifiers/base.rb +50 -33
  22. data/lib/pubid/amca/identifiers/interpretation.rb +18 -10
  23. data/lib/pubid/amca/identifiers/publication.rb +14 -10
  24. data/lib/pubid/amca/identifiers/standard.rb +3 -1
  25. data/lib/pubid/amca/identifiers.rb +0 -1
  26. data/lib/pubid/amca/parser.rb +1 -1
  27. data/lib/pubid/amca/renderer.rb +4 -4
  28. data/lib/pubid/amca/single_identifier.rb +1 -1
  29. data/lib/pubid/amca/urn_generator.rb +2 -2
  30. data/lib/pubid/amca.rb +5 -4
  31. data/lib/pubid/ansi/builder.rb +2 -2
  32. data/lib/pubid/ansi/identifier.rb +18 -0
  33. data/lib/pubid/ansi/parser.rb +1 -1
  34. data/lib/pubid/ansi/renderer.rb +2 -2
  35. data/lib/pubid/ansi.rb +5 -5
  36. data/lib/pubid/api/builder.rb +16 -2
  37. data/lib/pubid/api/identifier.rb +25 -4
  38. data/lib/pubid/api/identifiers/mpms.rb +10 -8
  39. data/lib/pubid/api/parser.rb +1 -1
  40. data/lib/pubid/api/renderer.rb +16 -7
  41. data/lib/pubid/api/single_identifier.rb +5 -12
  42. data/lib/pubid/api.rb +1 -0
  43. data/lib/pubid/ashrae/builder.rb +53 -32
  44. data/lib/pubid/ashrae/identifier.rb +3 -4
  45. data/lib/pubid/ashrae/identifiers/addenda_package.rb +7 -1
  46. data/lib/pubid/ashrae/identifiers/addendum.rb +9 -1
  47. data/lib/pubid/ashrae/identifiers/base.rb +94 -12
  48. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +8 -1
  49. data/lib/pubid/ashrae/identifiers/errata.rb +9 -0
  50. data/lib/pubid/ashrae/identifiers/guideline.rb +3 -0
  51. data/lib/pubid/ashrae/identifiers/interpretation.rb +16 -0
  52. data/lib/pubid/ashrae/identifiers/standard.rb +3 -0
  53. data/lib/pubid/ashrae/identifiers.rb +0 -1
  54. data/lib/pubid/ashrae/parser.rb +37 -17
  55. data/lib/pubid/ashrae/renderer.rb +20 -20
  56. data/lib/pubid/ashrae/single_identifier.rb +1 -1
  57. data/lib/pubid/ashrae/supplement_identifier.rb +21 -6
  58. data/lib/pubid/ashrae/urn_generator.rb +8 -2
  59. data/lib/pubid/ashrae.rb +10 -4
  60. data/lib/pubid/asme/builder.rb +11 -2
  61. data/lib/pubid/asme/identifier.rb +9 -0
  62. data/lib/pubid/asme/identifiers/standard.rb +86 -2
  63. data/lib/pubid/asme/parser.rb +1 -1
  64. data/lib/pubid/asme/renderer.rb +3 -3
  65. data/lib/pubid/asme/single_identifier.rb +8 -1
  66. data/lib/pubid/asme/urn_generator.rb +2 -2
  67. data/lib/pubid/asme.rb +1 -0
  68. data/lib/pubid/astm/builder.rb +10 -3
  69. data/lib/pubid/astm/identifier.rb +9 -0
  70. data/lib/pubid/astm/identifiers/adjunct.rb +16 -1
  71. data/lib/pubid/astm/identifiers/code_number.rb +81 -0
  72. data/lib/pubid/astm/identifiers/data_series.rb +2 -0
  73. data/lib/pubid/astm/identifiers/iso_dual_published.rb +16 -0
  74. data/lib/pubid/astm/identifiers/manual.rb +10 -0
  75. data/lib/pubid/astm/identifiers/monograph.rb +2 -0
  76. data/lib/pubid/astm/identifiers/research_report.rb +10 -0
  77. data/lib/pubid/astm/identifiers/standard.rb +10 -0
  78. data/lib/pubid/astm/identifiers/technical_report.rb +2 -0
  79. data/lib/pubid/astm/identifiers/work_in_progress.rb +2 -0
  80. data/lib/pubid/astm/identifiers.rb +1 -0
  81. data/lib/pubid/astm/parser.rb +1 -1
  82. data/lib/pubid/astm/renderer.rb +1 -1
  83. data/lib/pubid/astm/single_identifier.rb +31 -1
  84. data/lib/pubid/astm/urn_generator.rb +7 -5
  85. data/lib/pubid/astm.rb +1 -0
  86. data/lib/pubid/bipm/builder.rb +163 -0
  87. data/lib/pubid/bipm/identifier.rb +285 -0
  88. data/lib/pubid/bipm/identifiers/committee_document.rb +36 -0
  89. data/lib/pubid/bipm/identifiers/guide.rb +35 -0
  90. data/lib/pubid/bipm/identifiers/meeting.rb +53 -0
  91. data/lib/pubid/bipm/identifiers/mep.rb +33 -0
  92. data/lib/pubid/bipm/identifiers/metrologia_article.rb +48 -0
  93. data/lib/pubid/bipm/identifiers/si_brochure.rb +33 -0
  94. data/lib/pubid/bipm/identifiers.rb +15 -0
  95. data/lib/pubid/bipm/parser.rb +237 -0
  96. data/lib/pubid/bipm/renderer.rb +118 -0
  97. data/lib/pubid/bipm/urn_generator.rb +58 -0
  98. data/lib/pubid/bipm/urn_parser.rb +60 -0
  99. data/lib/pubid/bipm.rb +92 -0
  100. data/lib/pubid/bsi/builder.rb +62 -52
  101. data/lib/pubid/bsi/identifier.rb +0 -1
  102. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
  103. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +36 -7
  104. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +7 -6
  105. data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
  106. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +0 -1
  107. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +10 -0
  108. data/lib/pubid/bsi/identifiers/committee_document.rb +10 -1
  109. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +6 -0
  110. data/lib/pubid/bsi/identifiers/corrigendum.rb +4 -4
  111. data/lib/pubid/bsi/identifiers/expert_commentary.rb +5 -5
  112. data/lib/pubid/bsi/identifiers/handbook.rb +0 -2
  113. data/lib/pubid/bsi/identifiers/practice_guide.rb +0 -1
  114. data/lib/pubid/bsi/identifiers/set.rb +11 -0
  115. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -1
  116. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -2
  117. data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
  118. data/lib/pubid/bsi/parser.rb +1 -1
  119. data/lib/pubid/bsi/renderer.rb +71 -59
  120. data/lib/pubid/bsi/single_identifier.rb +64 -7
  121. data/lib/pubid/bsi/urn_generator.rb +11 -2
  122. data/lib/pubid/bsi.rb +7 -1
  123. data/lib/pubid/builder/base.rb +23 -11
  124. data/lib/pubid/bundled_identifier.rb +19 -9
  125. data/lib/pubid/calconnect/builder.rb +38 -0
  126. data/lib/pubid/calconnect/identifier.rb +121 -0
  127. data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
  128. data/lib/pubid/calconnect/identifiers.rb +9 -0
  129. data/lib/pubid/calconnect/parser.rb +54 -0
  130. data/lib/pubid/calconnect/renderer.rb +36 -0
  131. data/lib/pubid/calconnect/urn_generator.rb +33 -0
  132. data/lib/pubid/calconnect/urn_parser.rb +34 -0
  133. data/lib/pubid/calconnect.rb +83 -0
  134. data/lib/pubid/ccsds/builder.rb +1 -1
  135. data/lib/pubid/ccsds/identifier.rb +10 -3
  136. data/lib/pubid/ccsds/identifiers/base.rb +4 -2
  137. data/lib/pubid/ccsds/identifiers/corrigendum.rb +4 -4
  138. data/lib/pubid/ccsds/parser.rb +1 -1
  139. data/lib/pubid/ccsds/single_identifier.rb +2 -2
  140. data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
  141. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  142. data/lib/pubid/ccsds.rb +1 -0
  143. data/lib/pubid/cen_cenelec/builder.rb +131 -72
  144. data/lib/pubid/cen_cenelec/identifier.rb +115 -3
  145. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +27 -16
  146. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +46 -6
  147. data/lib/pubid/cen_cenelec/identifiers/base.rb +8 -9
  148. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -1
  149. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -1
  150. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +1 -1
  151. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +29 -14
  152. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +47 -8
  153. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
  154. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +27 -2
  155. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -1
  156. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +15 -5
  157. data/lib/pubid/cen_cenelec/identifiers/guide.rb +1 -1
  158. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -1
  159. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -1
  160. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -1
  161. data/lib/pubid/cen_cenelec/parser.rb +1 -1
  162. data/lib/pubid/cen_cenelec/renderer.rb +55 -60
  163. data/lib/pubid/cen_cenelec/single_identifier.rb +20 -2
  164. data/lib/pubid/cen_cenelec/urn_generator.rb +66 -44
  165. data/lib/pubid/cen_cenelec.rb +104 -82
  166. data/lib/pubid/cie/builder.rb +149 -24
  167. data/lib/pubid/cie/identifier.rb +13 -4
  168. data/lib/pubid/cie/identifiers/bundle.rb +35 -5
  169. data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
  170. data/lib/pubid/cie/identifiers/conference.rb +11 -6
  171. data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
  172. data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
  173. data/lib/pubid/cie/identifiers/identical.rb +9 -9
  174. data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
  175. data/lib/pubid/cie/identifiers/proceedings.rb +41 -0
  176. data/lib/pubid/cie/identifiers/standard.rb +43 -8
  177. data/lib/pubid/cie/identifiers/supplement.rb +27 -25
  178. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +7 -3
  179. data/lib/pubid/cie/identifiers.rb +2 -0
  180. data/lib/pubid/cie/parser.rb +55 -6
  181. data/lib/pubid/cie/single_identifier.rb +40 -1
  182. data/lib/pubid/cie/supplement_identifier.rb +29 -16
  183. data/lib/pubid/cie/urn_generator.rb +11 -8
  184. data/lib/pubid/cie.rb +7 -2
  185. data/lib/pubid/components/date.rb +21 -5
  186. data/lib/pubid/conformance/checks.rb +72 -0
  187. data/lib/pubid/conformance/corpus/case.rb +55 -0
  188. data/lib/pubid/conformance/corpus.rb +36 -0
  189. data/lib/pubid/conformance/generator.rb +212 -0
  190. data/lib/pubid/conformance/pending.rb +63 -0
  191. data/lib/pubid/conformance/runner.rb +153 -0
  192. data/lib/pubid/conformance.rb +55 -0
  193. data/lib/pubid/core.rb +2 -0
  194. data/lib/pubid/csa/builder.rb +48 -48
  195. data/lib/pubid/csa/composite_identifier.rb +18 -7
  196. data/lib/pubid/csa/identifier.rb +187 -80
  197. data/lib/pubid/csa/identifiers/bundled.rb +25 -9
  198. data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
  199. data/lib/pubid/csa/identifiers/cec.rb +44 -4
  200. data/lib/pubid/csa/identifiers/combined.rb +97 -69
  201. data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
  202. data/lib/pubid/csa/identifiers/package.rb +4 -4
  203. data/lib/pubid/csa/parser.rb +12 -8
  204. data/lib/pubid/csa/renderer.rb +13 -5
  205. data/lib/pubid/csa/single_identifier.rb +93 -4
  206. data/lib/pubid/csa/urn_generator.rb +9 -2
  207. data/lib/pubid/csa/wrapper_identifier.rb +43 -10
  208. data/lib/pubid/csa.rb +7 -1
  209. data/lib/pubid/doi/builder.rb +18 -0
  210. data/lib/pubid/doi/identifier.rb +49 -0
  211. data/lib/pubid/doi/identifiers/resource.rb +30 -0
  212. data/lib/pubid/doi/identifiers.rb +9 -0
  213. data/lib/pubid/doi/parser.rb +52 -0
  214. data/lib/pubid/doi/renderer.rb +13 -0
  215. data/lib/pubid/doi.rb +56 -0
  216. data/lib/pubid/easc/builder.rb +55 -0
  217. data/lib/pubid/easc/identifier.rb +59 -0
  218. data/lib/pubid/easc/identifiers/pmg.rb +20 -0
  219. data/lib/pubid/easc/identifiers/rmg.rb +19 -0
  220. data/lib/pubid/easc/identifiers.rb +10 -0
  221. data/lib/pubid/easc/parser.rb +88 -0
  222. data/lib/pubid/easc/renderer.rb +48 -0
  223. data/lib/pubid/easc/urn_generator.rb +46 -0
  224. data/lib/pubid/easc/urn_parser.rb +57 -0
  225. data/lib/pubid/easc.rb +53 -0
  226. data/lib/pubid/ecma/builder.rb +45 -0
  227. data/lib/pubid/ecma/identifier.rb +147 -0
  228. data/lib/pubid/ecma/identifiers/memento.rb +30 -0
  229. data/lib/pubid/ecma/identifiers/standard.rb +31 -0
  230. data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
  231. data/lib/pubid/ecma/identifiers.rb +11 -0
  232. data/lib/pubid/ecma/parser.rb +76 -0
  233. data/lib/pubid/ecma/renderer.rb +67 -0
  234. data/lib/pubid/ecma/urn_generator.rb +46 -0
  235. data/lib/pubid/ecma/urn_parser.rb +51 -0
  236. data/lib/pubid/ecma.rb +68 -0
  237. data/lib/pubid/errors.rb +80 -0
  238. data/lib/pubid/etsi/builder.rb +13 -4
  239. data/lib/pubid/etsi/identifier.rb +1 -3
  240. data/lib/pubid/etsi/identifiers/base.rb +43 -11
  241. data/lib/pubid/etsi/identifiers/etsi_standard.rb +207 -4
  242. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +45 -3
  243. data/lib/pubid/etsi/identifiers.rb +0 -1
  244. data/lib/pubid/etsi/parser.rb +9 -3
  245. data/lib/pubid/etsi/renderer.rb +8 -2
  246. data/lib/pubid/etsi.rb +6 -5
  247. data/lib/pubid/evs/builder.rb +26 -0
  248. data/lib/pubid/evs/identifier.rb +37 -0
  249. data/lib/pubid/evs/identifiers/national_adoption.rb +17 -0
  250. data/lib/pubid/evs/identifiers.rb +9 -0
  251. data/lib/pubid/evs/parser.rb +27 -0
  252. data/lib/pubid/evs/renderer.rb +30 -0
  253. data/lib/pubid/evs/urn_generator.rb +30 -0
  254. data/lib/pubid/evs/urn_parser.rb +80 -0
  255. data/lib/pubid/evs.rb +90 -0
  256. data/lib/pubid/export/exporter.rb +2 -1
  257. data/lib/pubid/export/flavor_exporter.rb +18 -3
  258. data/lib/pubid/export.rb +1 -0
  259. data/lib/pubid/format_detector.rb +1 -0
  260. data/lib/pubid/gb/builder.rb +45 -0
  261. data/lib/pubid/gb/identifier.rb +67 -0
  262. data/lib/pubid/gb/identifiers/standard.rb +34 -0
  263. data/lib/pubid/gb/identifiers.rb +9 -0
  264. data/lib/pubid/gb/parser.rb +63 -0
  265. data/lib/pubid/gb/renderer.rb +35 -0
  266. data/lib/pubid/gb.rb +88 -0
  267. data/lib/pubid/gost/builder.rb +185 -0
  268. data/lib/pubid/gost/identifier.rb +47 -0
  269. data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
  270. data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
  271. data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
  272. data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
  273. data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
  274. data/lib/pubid/gost/identifiers.rb +13 -0
  275. data/lib/pubid/gost/parser.rb +105 -0
  276. data/lib/pubid/gost/renderer.rb +48 -0
  277. data/lib/pubid/gost/urn_generator.rb +46 -0
  278. data/lib/pubid/gost/urn_parser.rb +52 -0
  279. data/lib/pubid/gost.rb +50 -0
  280. data/lib/pubid/iala/builder.rb +22 -27
  281. data/lib/pubid/iala/identifier.rb +36 -8
  282. data/lib/pubid/iala/identifiers/advice.rb +1 -1
  283. data/lib/pubid/iala/identifiers/annex.rb +10 -10
  284. data/lib/pubid/iala/identifiers/general_assembly.rb +5 -2
  285. data/lib/pubid/iala/identifiers/guideline.rb +3 -1
  286. data/lib/pubid/iala/identifiers/letter.rb +1 -1
  287. data/lib/pubid/iala/identifiers/manual.rb +3 -1
  288. data/lib/pubid/iala/identifiers/model_course.rb +3 -1
  289. data/lib/pubid/iala/identifiers/recommendation.rb +3 -1
  290. data/lib/pubid/iala/identifiers/report.rb +1 -1
  291. data/lib/pubid/iala/identifiers/resolution.rb +1 -1
  292. data/lib/pubid/iala/identifiers/standard.rb +3 -1
  293. data/lib/pubid/iala/identifiers.rb +0 -1
  294. data/lib/pubid/iala/parser.rb +10 -2
  295. data/lib/pubid/iala/renderer.rb +1 -1
  296. data/lib/pubid/iala/urn_generator.rb +1 -1
  297. data/lib/pubid/iala/urn_parser.rb +24 -3
  298. data/lib/pubid/iala.rb +5 -4
  299. data/lib/pubid/iana/builder.rb +22 -0
  300. data/lib/pubid/iana/identifier.rb +140 -0
  301. data/lib/pubid/iana/identifiers/registry.rb +69 -0
  302. data/lib/pubid/iana/identifiers.rb +9 -0
  303. data/lib/pubid/iana/parser.rb +38 -0
  304. data/lib/pubid/iana/renderer.rb +32 -0
  305. data/lib/pubid/iana/urn_generator.rb +19 -0
  306. data/lib/pubid/iana/urn_parser.rb +24 -0
  307. data/lib/pubid/iana.rb +70 -0
  308. data/lib/pubid/identifier.rb +797 -26
  309. data/lib/pubid/identifier_metadata.rb +1 -0
  310. data/lib/pubid/idf/builder.rb +4 -4
  311. data/lib/pubid/idf/identifier.rb +18 -9
  312. data/lib/pubid/idf/parser.rb +3 -3
  313. data/lib/pubid/idf/renderer.rb +5 -5
  314. data/lib/pubid/idf/supplement_identifier.rb +3 -3
  315. data/lib/pubid/idf/urn_generator.rb +1 -1
  316. data/lib/pubid/idf.rb +7 -1
  317. data/lib/pubid/iec/builder.rb +49 -32
  318. data/lib/pubid/iec/components.rb +0 -1
  319. data/lib/pubid/iec/identifier.rb +112 -77
  320. data/lib/pubid/iec/identifiers/amendment.rb +6 -2
  321. data/lib/pubid/iec/identifiers/base.rb +2 -2
  322. data/lib/pubid/iec/identifiers/component_specification.rb +0 -10
  323. data/lib/pubid/iec/identifiers/conformity_assessment.rb +0 -10
  324. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
  325. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -2
  326. data/lib/pubid/iec/identifiers/fragment_identifier.rb +13 -15
  327. data/lib/pubid/iec/identifiers/guide.rb +0 -16
  328. data/lib/pubid/iec/identifiers/international_standard.rb +22 -6
  329. data/lib/pubid/iec/identifiers/operational_document.rb +0 -10
  330. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +0 -12
  331. data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
  332. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +0 -10
  333. data/lib/pubid/iec/identifiers/systems_reference_document.rb +0 -10
  334. data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
  335. data/lib/pubid/iec/identifiers/technical_report.rb +1 -18
  336. data/lib/pubid/iec/identifiers/technical_specification.rb +1 -18
  337. data/lib/pubid/iec/identifiers/technology_report.rb +0 -10
  338. data/lib/pubid/iec/identifiers/test_report_form.rb +0 -11
  339. data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
  340. data/lib/pubid/iec/identifiers/white_paper.rb +0 -10
  341. data/lib/pubid/iec/identifiers/working_document.rb +24 -10
  342. data/lib/pubid/iec/identifiers.rb +1 -0
  343. data/lib/pubid/iec/parser.rb +53 -28
  344. data/lib/pubid/iec/renderer.rb +31 -18
  345. data/lib/pubid/iec/single_identifier.rb +34 -11
  346. data/lib/pubid/iec/supplement_identifier.rb +32 -19
  347. data/lib/pubid/iec/urn_generator.rb +227 -61
  348. data/lib/pubid/iec/urn_parser.rb +42 -4
  349. data/lib/pubid/iec.rb +2 -6
  350. data/lib/pubid/ieee/aiee/builder.rb +17 -3
  351. data/lib/pubid/ieee/aiee/identifier.rb +46 -62
  352. data/lib/pubid/ieee/aiee/parser.rb +1 -1
  353. data/lib/pubid/ieee/builder.rb +386 -69
  354. data/lib/pubid/ieee/compaction.rb +121 -0
  355. data/lib/pubid/ieee/components/draft.rb +47 -7
  356. data/lib/pubid/ieee/identifier.rb +1 -3
  357. data/lib/pubid/ieee/identifiers/adopted_standard.rb +62 -5
  358. data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
  359. data/lib/pubid/ieee/identifiers/base.rb +148 -18
  360. data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
  361. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +6 -2
  362. data/lib/pubid/ieee/identifiers/corrigendum.rb +17 -2
  363. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +24 -3
  364. data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
  365. data/lib/pubid/ieee/identifiers/dual_published.rb +58 -3
  366. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
  367. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +25 -1
  368. data/lib/pubid/ieee/identifiers/joint_development.rb +64 -15
  369. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +58 -6
  370. data/lib/pubid/ieee/identifiers/nesc/base.rb +90 -19
  371. data/lib/pubid/ieee/identifiers/nesc/draft.rb +20 -5
  372. data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
  373. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +16 -5
  374. data/lib/pubid/ieee/identifiers/nesc/redline.rb +11 -2
  375. data/lib/pubid/ieee/identifiers/nesc/standard.rb +18 -3
  376. data/lib/pubid/ieee/identifiers/nesc.rb +1 -0
  377. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +3 -3
  378. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +14 -6
  379. data/lib/pubid/ieee/identifiers/redlined_standard.rb +4 -4
  380. data/lib/pubid/ieee/identifiers/si_standard.rb +4 -1
  381. data/lib/pubid/ieee/identifiers/standard.rb +4 -1
  382. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +26 -7
  383. data/lib/pubid/ieee/identifiers.rb +2 -1
  384. data/lib/pubid/ieee/ire/builder.rb +7 -6
  385. data/lib/pubid/ieee/ire/identifier.rb +48 -33
  386. data/lib/pubid/ieee/ire/parser.rb +1 -1
  387. data/lib/pubid/ieee/nesc/builder.rb +33 -20
  388. data/lib/pubid/ieee/nesc/parser.rb +16 -15
  389. data/lib/pubid/ieee/parser.rb +462 -44
  390. data/lib/pubid/ieee/pre_parser.rb +1 -1
  391. data/lib/pubid/ieee/renderer.rb +158 -57
  392. data/lib/pubid/ieee/typed_stages.rb +12 -1
  393. data/lib/pubid/ieee/urn_generator.rb +35 -8
  394. data/lib/pubid/ieee.rb +63 -4
  395. data/lib/pubid/ieee_debug.rb +1 -0
  396. data/lib/pubid/ietf/builder.rb +78 -0
  397. data/lib/pubid/ietf/identifier.rb +5 -0
  398. data/lib/pubid/ietf/identifiers/base.rb +72 -0
  399. data/lib/pubid/ietf/identifiers/bcp.rb +36 -0
  400. data/lib/pubid/ietf/identifiers/fyi.rb +36 -0
  401. data/lib/pubid/ietf/identifiers/internet_draft.rb +45 -0
  402. data/lib/pubid/ietf/identifiers/rfc.rb +27 -0
  403. data/lib/pubid/ietf/identifiers/serialization.rb +51 -0
  404. data/lib/pubid/ietf/identifiers/std.rb +36 -0
  405. data/lib/pubid/ietf/identifiers.rb +14 -0
  406. data/lib/pubid/ietf/parser.rb +61 -0
  407. data/lib/pubid/ietf/renderer.rb +64 -0
  408. data/lib/pubid/ietf/urn_generator.rb +37 -0
  409. data/lib/pubid/ietf/urn_parser.rb +43 -0
  410. data/lib/pubid/ietf.rb +86 -0
  411. data/lib/pubid/iho/identifier.rb +1 -3
  412. data/lib/pubid/iho/identifiers/base.rb +11 -10
  413. data/lib/pubid/iho/identifiers/bibliographic.rb +1 -1
  414. data/lib/pubid/iho/identifiers/circular_letter.rb +1 -1
  415. data/lib/pubid/iho/identifiers/miscellaneous.rb +1 -1
  416. data/lib/pubid/iho/identifiers/publication.rb +1 -1
  417. data/lib/pubid/iho/identifiers/standard.rb +1 -1
  418. data/lib/pubid/iho/identifiers.rb +0 -1
  419. data/lib/pubid/iho/parser.rb +1 -1
  420. data/lib/pubid/iho.rb +8 -7
  421. data/lib/pubid/isbn/builder.rb +44 -0
  422. data/lib/pubid/isbn/check_digit.rb +53 -0
  423. data/lib/pubid/isbn/identifier.rb +81 -0
  424. data/lib/pubid/isbn/identifiers/book.rb +30 -0
  425. data/lib/pubid/isbn/identifiers.rb +9 -0
  426. data/lib/pubid/isbn/parser.rb +45 -0
  427. data/lib/pubid/isbn/renderer.rb +16 -0
  428. data/lib/pubid/isbn.rb +53 -0
  429. data/lib/pubid/iso/builder.rb +9 -4
  430. data/lib/pubid/iso/bundled_identifier.rb +5 -3
  431. data/lib/pubid/iso/combined_identifier.rb +6 -4
  432. data/lib/pubid/iso/identifier.rb +29 -8
  433. data/lib/pubid/iso/identifiers/directives_supplement.rb +12 -12
  434. data/lib/pubid/iso/normalizer.rb +2 -2
  435. data/lib/pubid/iso/parser.rb +17 -13
  436. data/lib/pubid/iso/supplement_identifier.rb +19 -6
  437. data/lib/pubid/iso/urn_generator.rb +4 -1
  438. data/lib/pubid/iso/urn_parser.rb +1 -1
  439. data/lib/pubid/iso.rb +7 -1
  440. data/lib/pubid/itu/builder.rb +230 -29
  441. data/lib/pubid/itu/components/code.rb +48 -5
  442. data/lib/pubid/itu/components/designation.rb +35 -0
  443. data/lib/pubid/itu/components.rb +1 -0
  444. data/lib/pubid/itu/identifier.rb +1 -3
  445. data/lib/pubid/itu/identifiers/addendum.rb +15 -0
  446. data/lib/pubid/itu/identifiers/amendment.rb +7 -29
  447. data/lib/pubid/itu/identifiers/annex.rb +13 -2
  448. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
  449. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
  450. data/lib/pubid/itu/identifiers/base.rb +357 -25
  451. data/lib/pubid/itu/identifiers/combined_identifier.rb +99 -23
  452. data/lib/pubid/itu/identifiers/corrigendum.rb +16 -23
  453. data/lib/pubid/itu/identifiers/errata.rb +15 -0
  454. data/lib/pubid/itu/identifiers/handbook.rb +38 -0
  455. data/lib/pubid/itu/identifiers/question.rb +63 -0
  456. data/lib/pubid/itu/identifiers/recommendation.rb +3 -2
  457. data/lib/pubid/itu/identifiers/report.rb +39 -0
  458. data/lib/pubid/itu/identifiers/special_publication.rb +3 -1
  459. data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
  460. data/lib/pubid/itu/identifiers/supplement.rb +119 -14
  461. data/lib/pubid/itu/identifiers.rb +10 -1
  462. data/lib/pubid/itu/model.rb +1 -1
  463. data/lib/pubid/itu/parser.rb +481 -27
  464. data/lib/pubid/itu/urn_generator.rb +36 -6
  465. data/lib/pubid/itu/urn_parser.rb +8 -0
  466. data/lib/pubid/itu.rb +12 -3
  467. data/lib/pubid/jcgm/builder.rb +24 -14
  468. data/lib/pubid/jcgm/identifier.rb +10 -0
  469. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -2
  470. data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
  471. data/lib/pubid/jcgm/identifiers/gum_guide.rb +3 -3
  472. data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
  473. data/lib/pubid/jcgm/identifiers.rb +2 -0
  474. data/lib/pubid/jcgm/parser.rb +74 -7
  475. data/lib/pubid/jcgm/renderer.rb +33 -12
  476. data/lib/pubid/jcgm/single_identifier.rb +84 -6
  477. data/lib/pubid/jcgm/supplement_identifier.rb +39 -4
  478. data/lib/pubid/jcgm/urn_generator.rb +21 -13
  479. data/lib/pubid/jcgm/urn_parser.rb +164 -10
  480. data/lib/pubid/jcgm.rb +10 -0
  481. data/lib/pubid/jis/identifier.rb +62 -3
  482. data/lib/pubid/jis/parser.rb +1 -1
  483. data/lib/pubid/jis.rb +1 -0
  484. data/lib/pubid/nist/builder.rb +29 -9
  485. data/lib/pubid/nist/caster.rb +7 -45
  486. data/lib/pubid/nist/circular_supplement_builder.rb +7 -5
  487. data/lib/pubid/nist/components/stage.rb +2 -2
  488. data/lib/pubid/nist/components/supplement.rb +5 -2
  489. data/lib/pubid/nist/configuration.rb +6 -2
  490. data/lib/pubid/nist/identifier.rb +1 -3
  491. data/lib/pubid/nist/identifiers/base.rb +133 -39
  492. data/lib/pubid/nist/identifiers/circular.rb +10 -3
  493. data/lib/pubid/nist/identifiers/circular_supplement.rb +14 -5
  494. data/lib/pubid/nist/identifiers/commercial_standard.rb +1 -1
  495. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +1 -1
  496. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +8 -2
  497. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -2
  498. data/lib/pubid/nist/identifiers/dated_document.rb +1 -1
  499. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +1 -1
  500. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +1 -1
  501. data/lib/pubid/nist/identifiers/handbook.rb +10 -3
  502. data/lib/pubid/nist/identifiers/internal_report.rb +13 -6
  503. data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
  504. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +15 -7
  505. data/lib/pubid/nist/identifiers/monograph.rb +15 -8
  506. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  507. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  508. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  509. data/lib/pubid/nist/identifiers/report.rb +15 -7
  510. data/lib/pubid/nist/identifiers/special_publication.rb +10 -1
  511. data/lib/pubid/nist/identifiers/technical_note.rb +1 -1
  512. data/lib/pubid/nist/identifiers.rb +0 -1
  513. data/lib/pubid/nist/parser.rb +27 -4
  514. data/lib/pubid/nist/preprocessor.rb +15 -0
  515. data/lib/pubid/nist/router.rb +2 -2
  516. data/lib/pubid/nist/series/ir.rb +0 -3
  517. data/lib/pubid/nist/supplement_identifier.rb +24 -9
  518. data/lib/pubid/nist.rb +19 -13
  519. data/lib/pubid/oasis/builder.rb +79 -0
  520. data/lib/pubid/oasis/identifier.rb +160 -0
  521. data/lib/pubid/oasis/identifiers/standard.rb +29 -0
  522. data/lib/pubid/oasis/identifiers.rb +9 -0
  523. data/lib/pubid/oasis/parser.rb +34 -0
  524. data/lib/pubid/oasis/renderer.rb +29 -0
  525. data/lib/pubid/oasis/urn_generator.rb +25 -0
  526. data/lib/pubid/oasis/urn_parser.rb +22 -0
  527. data/lib/pubid/oasis.rb +80 -0
  528. data/lib/pubid/ogc/builder.rb +33 -0
  529. data/lib/pubid/ogc/identifier.rb +81 -0
  530. data/lib/pubid/ogc/identifiers/document.rb +26 -0
  531. data/lib/pubid/ogc/identifiers.rb +10 -0
  532. data/lib/pubid/ogc/parser.rb +40 -0
  533. data/lib/pubid/ogc/renderer.rb +33 -0
  534. data/lib/pubid/ogc/urn_generator.rb +14 -0
  535. data/lib/pubid/ogc/urn_parser.rb +22 -0
  536. data/lib/pubid/ogc.rb +72 -0
  537. data/lib/pubid/oiml/builder.rb +36 -8
  538. data/lib/pubid/oiml/identifier.rb +9 -1
  539. data/lib/pubid/oiml/identifiers/basic_publication.rb +2 -0
  540. data/lib/pubid/oiml/identifiers/bulletin.rb +36 -0
  541. data/lib/pubid/oiml/identifiers/code_number.rb +90 -0
  542. data/lib/pubid/oiml/identifiers/document.rb +2 -0
  543. data/lib/pubid/oiml/identifiers/expert_report.rb +2 -0
  544. data/lib/pubid/oiml/identifiers/guide.rb +2 -0
  545. data/lib/pubid/oiml/identifiers/recommendation.rb +2 -0
  546. data/lib/pubid/oiml/identifiers/seminar_report.rb +2 -0
  547. data/lib/pubid/oiml/identifiers/vocabulary.rb +2 -0
  548. data/lib/pubid/oiml/identifiers.rb +1 -0
  549. data/lib/pubid/oiml/parser.rb +12 -13
  550. data/lib/pubid/oiml/renderer.rb +13 -13
  551. data/lib/pubid/oiml/single_identifier.rb +41 -37
  552. data/lib/pubid/oiml/supplement_identifier.rb +36 -9
  553. data/lib/pubid/oiml/urn_parser.rb +23 -6
  554. data/lib/pubid/oiml.rb +10 -0
  555. data/lib/pubid/omg/builder.rb +20 -0
  556. data/lib/pubid/omg/identifier.rb +61 -0
  557. data/lib/pubid/omg/identifiers/specification.rb +32 -0
  558. data/lib/pubid/omg/identifiers.rb +9 -0
  559. data/lib/pubid/omg/parser.rb +93 -0
  560. data/lib/pubid/omg/renderer.rb +31 -0
  561. data/lib/pubid/omg.rb +52 -0
  562. data/lib/pubid/parser/grammar.rb +74 -0
  563. data/lib/pubid/parser.rb +2 -0
  564. data/lib/pubid/parsers/mr_string.rb +120 -7
  565. data/lib/pubid/plateau/builder.rb +8 -4
  566. data/lib/pubid/plateau/identifier.rb +1 -3
  567. data/lib/pubid/plateau/identifiers/base.rb +1 -6
  568. data/lib/pubid/plateau/identifiers/handbook.rb +1 -1
  569. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  570. data/lib/pubid/plateau/identifiers.rb +0 -1
  571. data/lib/pubid/plateau/parser.rb +16 -6
  572. data/lib/pubid/plateau/renderer.rb +1 -1
  573. data/lib/pubid/plateau/supplement_identifier.rb +11 -11
  574. data/lib/pubid/plateau.rb +14 -4
  575. data/lib/pubid/prefixes_support.rb +1 -0
  576. data/lib/pubid/renderers/annotator.rb +233 -0
  577. data/lib/pubid/renderers/base.rb +13 -0
  578. data/lib/pubid/renderers/directives_renderer.rb +3 -3
  579. data/lib/pubid/renderers/human_readable.rb +6 -4
  580. data/lib/pubid/renderers/mr_string.rb +54 -6
  581. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  582. data/lib/pubid/renderers.rb +1 -0
  583. data/lib/pubid/rendering/numbering.rb +25 -7
  584. data/lib/pubid/rendering/supplement.rb +4 -4
  585. data/lib/pubid/rendering.rb +1 -0
  586. data/lib/pubid/sae/builder.rb +1 -1
  587. data/lib/pubid/sae/identifier.rb +1 -3
  588. data/lib/pubid/sae/identifiers/base.rb +19 -9
  589. data/lib/pubid/sae/identifiers.rb +0 -1
  590. data/lib/pubid/sae/parser.rb +1 -1
  591. data/lib/pubid/sae.rb +4 -3
  592. data/lib/pubid/schema/declaration.rb +33 -0
  593. data/lib/pubid/schema/error.rb +14 -0
  594. data/lib/pubid/schema/identifier_type.rb +23 -0
  595. data/lib/pubid/schema/loader.rb +117 -0
  596. data/lib/pubid/schema/typed_stage.rb +24 -0
  597. data/lib/pubid/schema.rb +25 -0
  598. data/lib/pubid/tgpp/builder.rb +41 -0
  599. data/lib/pubid/tgpp/identifier.rb +107 -0
  600. data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
  601. data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
  602. data/lib/pubid/tgpp/identifiers.rb +11 -0
  603. data/lib/pubid/tgpp/parser.rb +78 -0
  604. data/lib/pubid/tgpp/renderer.rb +52 -0
  605. data/lib/pubid/tgpp/urn_generator.rb +39 -0
  606. data/lib/pubid/tgpp/urn_parser.rb +30 -0
  607. data/lib/pubid/tgpp.rb +84 -0
  608. data/lib/pubid/type_resolver.rb +74 -0
  609. data/lib/pubid/un/builder.rb +42 -0
  610. data/lib/pubid/un/identifier.rb +40 -0
  611. data/lib/pubid/un/identifiers/document.rb +24 -0
  612. data/lib/pubid/un/identifiers.rb +9 -0
  613. data/lib/pubid/un/parser.rb +25 -0
  614. data/lib/pubid/un/renderer.rb +11 -0
  615. data/lib/pubid/un.rb +47 -0
  616. data/lib/pubid/urn_parser/errors.rb +8 -1
  617. data/lib/pubid/urn_parser.rb +1 -0
  618. data/lib/pubid/utils.rb +1 -0
  619. data/lib/pubid/version.rb +1 -1
  620. data/lib/pubid/w3c/builder.rb +55 -0
  621. data/lib/pubid/w3c/identifier.rb +130 -0
  622. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
  623. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
  624. data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
  625. data/lib/pubid/w3c/identifiers/note.rb +30 -0
  626. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
  627. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
  628. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
  629. data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
  630. data/lib/pubid/w3c/identifiers/standard.rb +12 -0
  631. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
  632. data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
  633. data/lib/pubid/w3c/identifiers.rb +25 -0
  634. data/lib/pubid/w3c/parser.rb +43 -0
  635. data/lib/pubid/w3c/renderer.rb +35 -0
  636. data/lib/pubid/w3c/urn_generator.rb +18 -0
  637. data/lib/pubid/w3c/urn_parser.rb +36 -0
  638. data/lib/pubid/w3c.rb +68 -0
  639. data/lib/pubid/xsf/builder.rb +17 -0
  640. data/lib/pubid/xsf/identifier.rb +66 -0
  641. data/lib/pubid/xsf/identifiers/xep.rb +31 -0
  642. data/lib/pubid/xsf/identifiers.rb +9 -0
  643. data/lib/pubid/xsf/parser.rb +38 -0
  644. data/lib/pubid/xsf/renderer.rb +23 -0
  645. data/lib/pubid/xsf/urn_generator.rb +13 -0
  646. data/lib/pubid/xsf/urn_parser.rb +18 -0
  647. data/lib/pubid/xsf.rb +82 -0
  648. data/lib/pubid.rb +424 -22
  649. data/lib/tasks/conformance.rake +34 -0
  650. data/lib/tasks/docs.rake +3 -3
  651. data/lib/tasks/schema.rake +88 -0
  652. data/schema/core/joint_prefixes.yaml +24 -0
  653. data/schema/iec.yaml +1017 -0
  654. data/schema/iso.yaml +1586 -0
  655. data/schema/schema.schema.yaml +96 -0
  656. metadata +241 -19
  657. data/archived-gems/pubid-ccsds/update_codes.yaml +0 -1
  658. data/archived-gems/pubid-iec/stages.yaml +0 -129
  659. data/archived-gems/pubid-iec/update_codes.yaml +0 -67
  660. data/archived-gems/pubid-ieee/update_codes.yaml +0 -104
  661. data/archived-gems/pubid-iso/stages.yaml +0 -106
  662. data/archived-gems/pubid-iso/update_codes.yaml +0 -4
  663. data/archived-gems/pubid-itu/i18n.yaml +0 -13
  664. data/archived-gems/pubid-itu/series.yaml +0 -42
  665. data/archived-gems/pubid-nist/publishers.yaml +0 -6
  666. data/archived-gems/pubid-nist/update_codes.yaml +0 -93
  667. data/archived-gems/pubid-plateau/update_codes.yaml +0 -6
  668. data/lib/pubid/cen_cenelec/supplement_identifier.rb +0 -48
  669. data/lib/pubid/cie/components/code.rb +0 -80
  670. data/lib/pubid/iala/identifiers/base.rb +0 -14
  671. data/lib/pubid/iec/components/code.rb +0 -36
  672. /data/{archived-gems/pubid-nist → data/nist}/stages.yaml +0 -0
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ogc
5
+ # Human-readable renderer for OGC identifiers.
6
+ #
7
+ # Produces the canonical printed form, e.g.:
8
+ # "24-032r1"
9
+ # "01-009a"
10
+ # "OGC 24-032r1" (only when with_publisher: true)
11
+ #
12
+ # Registered as the `:human` format in the OGC format registry and invoked
13
+ # via `render(format: :human)`.
14
+ class Renderer < ::Pubid::Renderers::Base
15
+ PUBLISHER = "OGC"
16
+
17
+ def render(**_opts)
18
+ id = @id
19
+ result = +""
20
+ result << "#{PUBLISHER} " if with_publisher?(id)
21
+ result << "#{id.year}-#{id.number}"
22
+ result << id.revision.to_s if id.revision
23
+ result
24
+ end
25
+
26
+ private
27
+
28
+ def with_publisher?(id)
29
+ id.respond_to?(:with_publisher) && id.with_publisher == true
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ogc
5
+ # Emits `urn:ogc:<year>:<number>[:<revision>]`, e.g. `urn:ogc:24:032:r1`.
6
+ class UrnGenerator < Pubid::UrnGenerator::Base
7
+ def generate
8
+ parts = ["urn", "ogc", identifier.year.to_s, identifier.number.to_s]
9
+ parts << identifier.revision.to_s if identifier.revision
10
+ parts.join(":")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ogc
5
+ # Parses OGC URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits: `urn:ogc:<year>:<number>[:<revision>]`.
8
+ #
9
+ # Examples:
10
+ # - urn:ogc:25:023 → 25-023
11
+ # - urn:ogc:24:032:r1 → 24-032r1
12
+ class UrnParser < Pubid::UrnParser::Base
13
+ def parse_urn(urn)
14
+ body = strip_namespace(urn)
15
+ year, number, revision = split_parts(body)
16
+ text = "#{year}-#{number}"
17
+ text += revision.to_s if revision
18
+ flavor_parse(text)
19
+ end
20
+ end
21
+ end
22
+ end
data/lib/pubid/ogc.rb ADDED
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pubid"
4
+ module Pubid
5
+ module Ogc
6
+ extend Pubid::PrefixesSupport
7
+
8
+ # OGC identifiers are digit-leading (`25-023`) and carry no publisher token
9
+ # in the printed form. Per the PREFIXES inclusion policy, bare numeric
10
+ # patterns are NOT listed (they would make cross-flavor routing ambiguous).
11
+ # Instead the sole entry is the publisher token "OGC", which relaton uses to
12
+ # route a reference to this flavor even though it is not literally present
13
+ # in the id string.
14
+ PREFIXES = ["OGC"].freeze
15
+
16
+ autoload :Builder, "#{__dir__}/ogc/builder"
17
+ autoload :Identifier, "#{__dir__}/ogc/identifier"
18
+ autoload :Identifiers, "#{__dir__}/ogc/identifiers"
19
+ autoload :Parser, "#{__dir__}/ogc/parser"
20
+ autoload :Renderer, "#{__dir__}/ogc/renderer"
21
+ autoload :UrnGenerator, "#{__dir__}/ogc/urn_generator"
22
+ autoload :UrnParser, "#{__dir__}/ogc/urn_parser"
23
+
24
+ # Parse an OGC identifier string
25
+ def self.parse(identifier)
26
+ Identifier.parse(identifier)
27
+ end
28
+
29
+ # Per-flavor format registry: inherits global formats, overrides :human
30
+ Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
31
+ Identifier.format_registry.register(:human, renderer: Ogc::Renderer)
32
+
33
+ # Auto-discover all identifier types from the Identifiers namespace
34
+ # @return [Array<Class>] identifier classes that define a self.type Hash
35
+ def self.identifier_types
36
+ @identifier_types ||= Identifiers.constants
37
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
38
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
39
+ .select { |c| c.type.is_a?(Hash) }
40
+ end
41
+
42
+ # Build typed stage index from identifier types
43
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
44
+ def self.all_typed_stages
45
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
46
+ if klass.const_defined?(:TYPED_STAGES)
47
+ klass.const_get(:TYPED_STAGES)
48
+ else
49
+ []
50
+ end
51
+ end
52
+ end
53
+
54
+ # Lookup: type code -> identifier class
55
+ # @param code [String, Symbol] the type key to find
56
+ # @return [Class, nil] the matching identifier class
57
+ def self.locate_type(code)
58
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
59
+ end
60
+
61
+ # Lookup: abbreviation -> typed stage
62
+ # @param abbr [String, Symbol] the abbreviation to find
63
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
64
+ def self.locate_stage(abbr)
65
+ abbr_str = abbr.to_s.upcase
66
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
67
+ end
68
+ end
69
+ end
70
+
71
+ # Register OGC flavor with the registry
72
+ Pubid::Registry.register(:ogc, Pubid::Ogc)
@@ -21,8 +21,8 @@ module Pubid
21
21
  return build_short_amendment(parsed_hash)
22
22
  end
23
23
 
24
- # Check for supplements first (have base_identifier)
25
- if parsed_hash[:base_identifier]
24
+ # Check for supplements first (have base)
25
+ if parsed_hash[:base]
26
26
  return build_supplement(parsed_hash)
27
27
  end
28
28
 
@@ -53,11 +53,11 @@ module Pubid
53
53
  end
54
54
 
55
55
  # Build the base document
56
- base_identifier = build_base_document(base_hash)
56
+ base = build_base_document(base_hash)
57
57
 
58
58
  # Create amendment
59
59
  amendment = Identifiers::Amendment.new
60
- amendment.base_identifier = base_identifier
60
+ amendment.base = base
61
61
 
62
62
  # Extract year from edition_format if present, otherwise from year directly
63
63
  year_value = if parsed_hash[:edition_format].is_a?(Hash)
@@ -97,8 +97,8 @@ module Pubid
97
97
  supplement.joined = true if plus_marker
98
98
 
99
99
  # Recursively parse base identifier
100
- if parsed_hash[:base_identifier]
101
- supplement.base_identifier = build(parsed_hash[:base_identifier])
100
+ if parsed_hash[:base]
101
+ supplement.base = build(parsed_hash[:base])
102
102
  end
103
103
 
104
104
  # Extract year from edition_format if present, otherwise from year directly
@@ -116,7 +116,7 @@ module Pubid
116
116
  # Annex with no year of its own but a dated base ("R 60:2017 Annexes"):
117
117
  # the year belongs to the base and must render glued to it.
118
118
  if supplement.is_a?(Identifiers::Annex) && !year_value &&
119
- supplement.base_identifier&.date
119
+ supplement.base&.date
120
120
  supplement.year_on_base = true
121
121
  end
122
122
 
@@ -152,7 +152,11 @@ module Pubid
152
152
  code_attrs[:suffix] = parsed_hash[:code_suffix].to_s
153
153
  code_attrs[:space_suffix] = true if parsed_hash.key?(:space_suffix)
154
154
  end
155
- identifier.code = Components::Code.new(**code_attrs)
155
+ # The code fields are flat index columns on the leaf (see
156
+ # Identifiers::CodeNumber) — `number` is what relaton-index keys on —
157
+ # so they are assigned individually rather than as a Code object.
158
+ # Bulletin has no code columns and never reaches this branch.
159
+ code_attrs.each { |name, value| identifier.public_send(:"#{name}=", value) }
156
160
  end
157
161
 
158
162
  # Handle other attributes
@@ -214,6 +218,11 @@ module Pubid
214
218
  # Structured: :issue and :sequence captured directly as zero-padded
215
219
  # strings. Citation: :volume_roman, :issue_arabic, :article_id —
216
220
  # decode the 8-digit article_id to recover year+issue+sequence.
221
+ #
222
+ # For the citation form, the parsed roman volume is cross-checked
223
+ # against the year decoded from the article_id; a mismatch warns but
224
+ # does not raise (the article_id is the source of truth — the roman
225
+ # volume is redundant display).
217
226
  def apply_bulletin_locator(identifier, parsed_hash)
218
227
  if parsed_hash[:article_id]
219
228
  article_id = parsed_hash[:article_id].to_s
@@ -221,6 +230,7 @@ module Pubid
221
230
  identifier.date.year = article_id[0, 4]
222
231
  identifier.issue = article_id[4, 2]
223
232
  identifier.sequence = article_id[6, 2]
233
+ warn_on_volume_mismatch(identifier, parsed_hash[:volume_roman])
224
234
  return
225
235
  end
226
236
 
@@ -228,6 +238,24 @@ module Pubid
228
238
  identifier.sequence = parsed_hash[:sequence].to_s if parsed_hash[:sequence]
229
239
  end
230
240
 
241
+ # Citation form carries the volume in two places: spelled out as a
242
+ # roman numeral ("LXVII") and encoded in the 8-digit article_id
243
+ # (year+issue+sequence, where year - 1959 = volume). They should
244
+ # agree; if they don't, the input was malformed. Warn loudly so the
245
+ # user sees the discrepancy, but continue using the article_id
246
+ # (deterministic) rather than the roman (possibly mistyped).
247
+ def warn_on_volume_mismatch(identifier, parsed_volume_roman)
248
+ return unless parsed_volume_roman && identifier.date&.year
249
+
250
+ declared = parsed_volume_roman.to_s
251
+ computed = Identifiers::Bulletin.to_roman(identifier.date.year.to_i -
252
+ Identifiers::Bulletin::BASE_YEAR_OFFSET)
253
+ return if declared == computed
254
+
255
+ warn "OIML Bulletin citation volume mismatch: parsed '#{declared}' " \
256
+ "but article_id year #{identifier.date.year} implies '#{computed}'"
257
+ end
258
+
231
259
  def extract_language(lang_data)
232
260
  # Handle both direct string and nested hash from parser
233
261
  case lang_data
@@ -37,7 +37,7 @@ module Pubid
37
37
  # lutaml's polymorphic_map only validates `_type` on deserialization; it
38
38
  # does not re-instantiate the concrete subclass. Route by `_type` so
39
39
  # `Pubid::Oiml::Identifier.from_hash(h)` returns the right class (and its
40
- # nested base_identifier), mirroring Pubid::Iso::Identifier.from_hash.
40
+ # nested base), mirroring Pubid::Iso::Identifier.from_hash.
41
41
  def self.from_hash(data, options = {})
42
42
  type = data["_type"] || data[:_type]
43
43
  klass_name = OIML_TYPE_MAP[type]
@@ -48,6 +48,14 @@ module Pubid
48
48
  super
49
49
  end
50
50
 
51
+ # Uniform class-level parse entry, mirroring every other flavor's
52
+ # `Pubid::<Flavor>::Identifier.parse`. OIML's real logic lives in the
53
+ # module method, so delegate to it (same pattern as jcgm/nist/plateau).
54
+ # The `Pubid::MAX_INPUT_LENGTH` ReDoS guard lives in `Pubid::Oiml.parse`.
55
+ def self.parse(identifier)
56
+ Pubid::Oiml.parse(identifier)
57
+ end
58
+
51
59
  def to_urn
52
60
  UrnGenerator.new(self).generate
53
61
  end
@@ -4,6 +4,8 @@ module Pubid
4
4
  module Oiml
5
5
  module Identifiers
6
6
  class BasicPublication < SingleIdentifier
7
+ include CodeNumber
8
+
7
9
  def type_string
8
10
  "B"
9
11
  end
@@ -45,6 +45,42 @@ module Pubid
45
45
  map "sequence", to: :sequence
46
46
  end
47
47
 
48
+ # relaton-index keys on `id.root.number.to_s`. Bulletin is the one OIML
49
+ # leaf with no code (it does not include Identifiers::CodeNumber), so
50
+ # it derives the key from the year it already stores: every issue and
51
+ # article of a volume clusters into one bucket, with per-article
52
+ # distinctness coming from the MR slug instead. That is the BIPM
53
+ # Metrologia-volume precedent recorded in CLAUDE.md.
54
+ #
55
+ # A DERIVED READER, deliberately not an attribute: storing it would
56
+ # duplicate `year` in every row, and the key_value block above maps no
57
+ # "number", so nothing is added to the wire format. Safe as a plain
58
+ # method because Bulletin declares no `number` attribute of its own
59
+ # (the ITU itu/identifiers/base.rb precedent).
60
+ #
61
+ # nil for the bare periodical reference "OIML Bulletin", which names no
62
+ # year — a deliberate gap, pinned in spec/pubid/oiml/root_number_spec.rb.
63
+ def number
64
+ date&.year&.to_s
65
+ end
66
+
67
+ # The index key above is deliberately coarse — a whole volume in one
68
+ # bucket — which is only defensible because the MR slug stays
69
+ # per-article. The inherited hook reads through `code`, which Bulletin
70
+ # does not have, so it would return nil and collapse every article of a
71
+ # year onto `oiml.bulletin.<year>`; `to_slug` is an output FILENAME, so
72
+ # that is an overwrite. Emit the rest of the locator instead.
73
+ #
74
+ # The year is deliberately NOT included: Renderers::MrString already
75
+ # gives it its own segment (`mr_year`), so repeating it here would
76
+ # render `oiml.bulletin.1960-03-01.1960`.
77
+ def mr_number_with_part
78
+ segments = [issue, sequence].compact
79
+ return nil if segments.empty?
80
+
81
+ segments.join("-")
82
+ end
83
+
48
84
  def type_string
49
85
  "Bulletin"
50
86
  end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Oiml
5
+ module Identifiers
6
+ # Installs the flat, index-friendly code columns and their serialization
7
+ # on the seven concrete OIML document leaves (Recommendation, Document,
8
+ # Vocabulary, Guide, BasicPublication, ExpertReport, SeminarReport).
9
+ #
10
+ # Why the leaves and not Pubid::Oiml::SingleIdentifier, which they all
11
+ # inherit from: `number` redefines the parent ::Pubid::Identifier's
12
+ # `attribute :number, Components::Code` as a plain :string (and `part` /
13
+ # `subpart` likewise). Declaring that on a class the concrete types
14
+ # INHERIT from resolves against the parent definition nondeterministically
15
+ # under multi-flavor load — it passes an OIML-only run and can flip
16
+ # `root.number` to "" under the full suite (the IEEE lesson; see
17
+ # lib/pubid/ieee/identifiers/code_number.rb and CLAUDE.md). Declaring on
18
+ # each leaf removes the ambiguity at the point of use.
19
+ #
20
+ # This matters because relaton-index sorts and bsearches every row on
21
+ # `id.root.number.to_s`. OIML kept the code in an Oiml::Components::Code
22
+ # under a `code` attribute and never set `number`, so all 12,226 lines of
23
+ # the published relaton-data-oiml index-v2 keyed "".
24
+ #
25
+ # The serialized hash ALREADY had these as bare top-level scalars — the
26
+ # old converters merely read them through `code` — so the wire format is
27
+ # byte-identical and that index needs no regeneration.
28
+ #
29
+ # Bulletin deliberately does NOT include this module. It carries no code
30
+ # at all (its locator is the year/issue/sequence tuple), so it would only
31
+ # gain a permanently-nil `number` and a `number` key that never appears.
32
+ # It derives its index key from the year instead; see bulletin.rb.
33
+ module CodeNumber
34
+ def self.included(base)
35
+ install_attributes(base)
36
+ install_mappings(base)
37
+ end
38
+
39
+ def self.install_attributes(base)
40
+ # Bare document number ("144"), the relaton index key. The part is a
41
+ # sibling column, never folded in, so every part of a document shares
42
+ # one bucket and a part-less reference finds them all.
43
+ base.attribute :number, :string
44
+ base.attribute :part, :string
45
+ base.attribute :subpart, :string
46
+ # Free-form trailing suffix glued to the code, e.g. "sup", "A",
47
+ # "erratum", "GUM 1", "ISO3930". Preserved verbatim for round-trip.
48
+ base.attribute :suffix, :string
49
+ # When true the suffix is space-separated ("D 1 Brochure") rather
50
+ # than the default dash ("R 60-sup"). Named for the RARE case with a
51
+ # false default, so the canonical to_hash drops it from every
52
+ # ordinary row.
53
+ base.attribute :space_suffix, :boolean, default: -> { false }
54
+ end
55
+
56
+ # Merged by lutaml with the block SingleIdentifier declares, which
57
+ # carries publisher/year/edition/stage/iteration.
58
+ def self.install_mappings(base)
59
+ base.key_value do
60
+ map "number", to: :number
61
+ map "part", to: :part
62
+ map "subpart", to: :subpart
63
+ map "suffix", to: :suffix
64
+ map "space_suffix", to: :space_suffix
65
+ end
66
+ end
67
+
68
+ # The composed document code, rebuilt on demand from the split columns
69
+ # so the renderer and the URN generator keep one place to ask for the
70
+ # printed form ("144-1", "60-sup"). Deliberately NOT an attribute and
71
+ # NOT memoised: the columns are writable (the base #exclude rebuilds
72
+ # through them), so a cached Code would go stale.
73
+ #
74
+ # nil when there is no number, preserving the old nil-`code` semantics
75
+ # the URN generator branches on.
76
+ def code
77
+ return nil if number.nil?
78
+
79
+ Components::Code.new(
80
+ number: number,
81
+ part: part,
82
+ subpart: subpart,
83
+ suffix: suffix,
84
+ space_suffix: space_suffix,
85
+ )
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -4,6 +4,8 @@ module Pubid
4
4
  module Oiml
5
5
  module Identifiers
6
6
  class Document < SingleIdentifier
7
+ include CodeNumber
8
+
7
9
  def type_string
8
10
  "D"
9
11
  end
@@ -4,6 +4,8 @@ module Pubid
4
4
  module Oiml
5
5
  module Identifiers
6
6
  class ExpertReport < SingleIdentifier
7
+ include CodeNumber
8
+
7
9
  def type_string
8
10
  "E"
9
11
  end
@@ -4,6 +4,8 @@ module Pubid
4
4
  module Oiml
5
5
  module Identifiers
6
6
  class Guide < SingleIdentifier
7
+ include CodeNumber
8
+
7
9
  def type_string
8
10
  "G"
9
11
  end
@@ -4,6 +4,8 @@ module Pubid
4
4
  module Oiml
5
5
  module Identifiers
6
6
  class Recommendation < SingleIdentifier
7
+ include CodeNumber
8
+
7
9
  def type_string
8
10
  "R"
9
11
  end
@@ -4,6 +4,8 @@ module Pubid
4
4
  module Oiml
5
5
  module Identifiers
6
6
  class SeminarReport < SingleIdentifier
7
+ include CodeNumber
8
+
7
9
  def type_string
8
10
  "S"
9
11
  end
@@ -4,6 +4,8 @@ module Pubid
4
4
  module Oiml
5
5
  module Identifiers
6
6
  class Vocabulary < SingleIdentifier
7
+ include CodeNumber
8
+
7
9
  def type_string
8
10
  "V"
9
11
  end
@@ -7,6 +7,7 @@ module Pubid
7
7
  autoload :Annex, "#{__dir__}/identifiers/annex"
8
8
  autoload :BasicPublication, "#{__dir__}/identifiers/basic_publication"
9
9
  autoload :Bulletin, "#{__dir__}/identifiers/bulletin"
10
+ autoload :CodeNumber, "#{__dir__}/identifiers/code_number"
10
11
  autoload :Document, "#{__dir__}/identifiers/document"
11
12
  autoload :Errata, "#{__dir__}/identifiers/errata"
12
13
  autoload :ExpertReport, "#{__dir__}/identifiers/expert_report"
@@ -4,7 +4,7 @@ require "parslet"
4
4
 
5
5
  module Pubid
6
6
  module Oiml
7
- class Parser < Parslet::Parser
7
+ class Parser < ::Pubid::Parser::Grammar
8
8
  include ::Pubid::Parser::CommonParseRules
9
9
  include ::Pubid::Parser::CommonParseMethods
10
10
 
@@ -20,7 +20,7 @@ module Pubid
20
20
  rule(:identifier) do
21
21
  amendment_identifier | amendment_short | annex_letter_identifier |
22
22
  annex_identifier | plus_supplement_identifier |
23
- trailing_supplement_identifier | bulletin_identifier | base_identifier
23
+ trailing_supplement_identifier | bulletin_identifier | base
24
24
  end
25
25
 
26
26
  # Publisher - always "OIML"
@@ -44,10 +44,9 @@ module Pubid
44
44
  rule(:two_digits) { match('\d').repeat(2, 2) }
45
45
 
46
46
  # Roman numeral token composed of I,V,X,L,C,D,M (uppercase, matching
47
- # OIML's print convention). Consumed but not captured — the 8-digit
48
- # article id in the same citation carries year/issue/sequence
49
- # deterministically, so the roman volume is redundant for parsing.
50
- rule(:roman_numeral) { match("[IVXLCDM]").repeat(1) }
47
+ # OIML's print convention). Captured so the builder can cross-check
48
+ # the declared volume against the year implied by the article_id.
49
+ rule(:roman_numeral) { match("[IVXLCDM]").repeat(1).as(:volume_roman) }
51
50
 
52
51
  # Bulletin locator — citation form. The format OIML prints on the
53
52
  # article page is: "LXVII(2) 20260211" where LXVII is the volume in
@@ -62,7 +61,7 @@ module Pubid
62
61
  # Bulletin identifier — no code; the locator (when present) is the
63
62
  # (year, issue, sequence) tuple drawn from either the structured
64
63
  # YYYY-II-SS form or the citation VOLUME(ISSUE) ARTID form. Both
65
- # decode to the same record. Tried before base_identifier because
64
+ # decode to the same record. Tried before base because
66
65
  # "Bulletin" is a word that the single-letter doc_type rule cannot
67
66
  # match.
68
67
  rule(:bulletin_identifier) do
@@ -188,7 +187,7 @@ module Pubid
188
187
  rule(:amendment_identifier) do
189
188
  str("Amendment") >> space >> lparen >> year_digits.as(:year) >> rparen >>
190
189
  space >> str("to") >> space >>
191
- base_without_language.as(:base_identifier) >>
190
+ base_without_language.as(:base) >>
192
191
  language_portion.maybe.as(:language)
193
192
  end
194
193
 
@@ -210,7 +209,7 @@ module Pubid
210
209
  # amendment_short is tried first; it only matches when a year follows the
211
210
  # word, so the no-year trailing form falls through to here.
212
211
  rule(:trailing_supplement_identifier) do
213
- base_without_language.as(:base_identifier) >>
212
+ base_without_language.as(:base) >>
214
213
  space >> (str("Amendment") | str("Errata")).as(:trailing_marker) >>
215
214
  language_portion.maybe.as(:language)
216
215
  end
@@ -220,7 +219,7 @@ module Pubid
220
219
  # and errata to dated bases (e.g. "OIML B 10:2011+Amendment:2012").
221
220
  # Annexes already encode the year-on-base intent via their own model.
222
221
  rule(:plus_supplement_identifier) do
223
- base_without_language.as(:base_identifier) >>
222
+ base_without_language.as(:base) >>
224
223
  str("+") >>
225
224
  (str("Amendment") | str("Errata")).as(:plus_marker) >>
226
225
  (colon >> year_digits.as(:year)).maybe >>
@@ -230,7 +229,7 @@ module Pubid
230
229
  # Annex identifier - "BASE Annexes Edition YYYY" / "BASE Annexes:YYYY" /
231
230
  # "BASE:YYYY Annexes" (year on the base, no annex year).
232
231
  rule(:annex_identifier) do
233
- base_without_language.as(:base_identifier) >>
232
+ base_without_language.as(:base) >>
234
233
  space >> str("Annexes").as(:annex_marker) >>
235
234
  (
236
235
  (space >> edition_text >> space >> year_digits.as(:year)).as(:edition_format) |
@@ -246,7 +245,7 @@ module Pubid
246
245
 
247
246
  # Annex with letter - "BASE Annex A Edition YYYY" / "BASE:YYYY Annex B-C"
248
247
  rule(:annex_letter_identifier) do
249
- base_without_language.as(:base_identifier) >>
248
+ base_without_language.as(:base) >>
250
249
  space >> str("Annex") >> space >> annex_letter_value >>
251
250
  ((space >> edition_text >> space >> year_digits.as(:year)) | (colon >> year_digits.as(:year))).maybe >>
252
251
  language_portion.maybe.as(:language)
@@ -262,7 +261,7 @@ module Pubid
262
261
  end
263
262
 
264
263
  # Base identifier for recursion and standalone parsing
265
- rule(:base_identifier) do
264
+ rule(:base) do
266
265
  publisher >>
267
266
  doc_type >>
268
267
  full_number >>
@@ -138,7 +138,7 @@ module Pubid
138
138
  # Plus-joined: "BASE+Amendment:YEAR" / "BASE+Errata:YEAR" with both
139
139
  # the base and the supplement carrying their own year.
140
140
  if id.joined
141
- base_str = strip_language(id.base_identifier.to_s)
141
+ base_str = strip_language(id.base.to_s)
142
142
  result = "#{base_str}+#{id.supplement_type}"
143
143
  result += ":#{id.year}" if id.year
144
144
  result += " (#{id.language})" if id.language
@@ -149,7 +149,7 @@ module Pubid
149
149
  # publication year kept on the base identifier. The word comes from the
150
150
  # concrete supplement class.
151
151
  if id.trailing
152
- base_str = strip_language(id.base_identifier.to_s)
152
+ base_str = strip_language(id.base.to_s)
153
153
  result = "#{base_str} #{id.supplement_type}"
154
154
  result += " (#{id.language})" if id.language
155
155
  return result
@@ -157,16 +157,16 @@ module Pubid
157
157
 
158
158
  base_format = if format && format != :short
159
159
  format
160
- elsif id.base_identifier.class.attributes.key?(:parsed_format) && id.base_identifier.parsed_format == "long"
160
+ elsif id.base.class.attributes.key?(:parsed_format) && id.base.parsed_format == "long"
161
161
  :long
162
162
  else
163
163
  :short
164
164
  end
165
165
 
166
- base_str = if id.base_identifier.is_a?(SingleIdentifier)
167
- id.base_identifier.to_s(format: base_format)
166
+ base_str = if id.base.is_a?(SingleIdentifier)
167
+ id.base.to_s(format: base_format)
168
168
  else
169
- id.base_identifier.to_s
169
+ id.base.to_s
170
170
  end
171
171
  base_str = strip_language(base_str)
172
172
 
@@ -182,14 +182,14 @@ module Pubid
182
182
  # "BASE:YYYY Annex(es)" — the year is glued to the base, the marker
183
183
  # carries none. Keep the base date instead of stripping it.
184
184
  if id.year_on_base
185
- base_str = strip_language(id.base_identifier.to_s)
185
+ base_str = strip_language(id.base.to_s)
186
186
  marker = id.letter ? "Annex #{id.letter}" : "Annexes"
187
187
  result = "#{base_str} #{marker}"
188
188
  result += " (#{id.language})" if id.language
189
189
  return result
190
190
  end
191
191
 
192
- base_format = if id.base_identifier.class.attributes.key?(:parsed_format) && id.base_identifier.parsed_format == "long"
192
+ base_format = if id.base.class.attributes.key?(:parsed_format) && id.base.parsed_format == "long"
193
193
  :long
194
194
  else
195
195
  :short
@@ -203,10 +203,10 @@ module Pubid
203
203
  :short
204
204
  end
205
205
 
206
- base_str = if id.base_identifier.is_a?(SingleIdentifier)
207
- id.base_identifier.to_s(format: base_format)
206
+ base_str = if id.base.is_a?(SingleIdentifier)
207
+ id.base.to_s(format: base_format)
208
208
  else
209
- id.base_identifier.to_s
209
+ id.base.to_s
210
210
  end
211
211
  result = base_str.sub(/:.*/, "").sub(/\s+Edition\s+\d{4}/, "").sub(
212
212
  /\(.*\)/, ""
@@ -219,8 +219,8 @@ module Pubid
219
219
  result += " Annexes"
220
220
  if id.year
221
221
  result += annex_format == :long ? " Edition #{id.year}" : ":#{id.year}"
222
- elsif id.base_identifier.date
223
- result += annex_format == :long ? " Edition #{id.base_identifier.date.render(context: @context)}" : ":#{id.base_identifier.date.render(context: @context)}"
222
+ elsif id.base.date
223
+ result += annex_format == :long ? " Edition #{id.base.date.render(context: @context)}" : ":#{id.base.date.render(context: @context)}"
224
224
  end
225
225
  end
226
226