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
@@ -164,7 +164,7 @@ module Pubid
164
164
 
165
165
  # Build attributes hash (conditional arguments must be handled separately)
166
166
  attrs = {
167
- number: Components::Code.new(value: number_val),
167
+ number: number_val,
168
168
  issue_number: issue_number,
169
169
  index_format: format,
170
170
  }
@@ -181,7 +181,7 @@ module Pubid
181
181
 
182
182
  # Build attributes hash
183
183
  attrs = {
184
- number: Components::Code.new(value: number_val),
184
+ number: number_val,
185
185
  }
186
186
  attrs[:date] = Components::Date.new(year: year_val) if year_val
187
187
 
@@ -206,9 +206,9 @@ module Pubid
206
206
 
207
207
  # Build attributes hash
208
208
  attrs = {
209
- number: Components::Code.new(value: number_val),
209
+ number: number_val,
210
210
  }
211
- attrs[:part] = Components::Code.new(value: part_val) if part_val
211
+ attrs[:part] = part_val if part_val
212
212
  attrs[:date] = Components::Date.new(year: year_val) if year_val
213
213
 
214
214
  Identifiers::ExplanatorySupplement.new(attrs)
@@ -248,13 +248,13 @@ module Pubid
248
248
 
249
249
  # Build attributes hash
250
250
  attrs = {
251
- number: Components::Code.new(value: number_val),
251
+ number: number_val,
252
252
  method_code: method_code,
253
253
  method_to: method_to,
254
254
  method_and: method_and,
255
255
  is_plural: is_plural,
256
256
  }
257
- attrs[:part] = Components::Code.new(value: part_val) if part_val
257
+ attrs[:part] = part_val if part_val
258
258
  attrs[:date] = Components::Date.new(year: year_val) if year_val
259
259
 
260
260
  Identifiers::Method.new(attrs)
@@ -280,7 +280,7 @@ module Pubid
280
280
 
281
281
  # Build attributes hash
282
282
  attrs = {
283
- number: Components::Code.new(value: number_val),
283
+ number: number_val,
284
284
  test_series: test_series,
285
285
  test_id: test_id,
286
286
  }
@@ -313,7 +313,7 @@ module Pubid
313
313
 
314
314
  # Build attributes hash (conditional arguments must be handled separately)
315
315
  attrs = {
316
- number: Components::Code.new(value: number_val),
316
+ number: number_val,
317
317
  section_id: section_id,
318
318
  section_format: format,
319
319
  }
@@ -343,7 +343,7 @@ module Pubid
343
343
 
344
344
  # Build attributes hash
345
345
  attrs = {
346
- number: Components::Code.new(value: number_val),
346
+ number: number_val,
347
347
  }
348
348
  attrs[:spec_code] = Components::Code.new(value: spec_code) if spec_code
349
349
  if publisher_val
@@ -373,9 +373,9 @@ module Pubid
373
373
 
374
374
  # Build attributes hash
375
375
  attrs = {
376
- number: Components::Code.new(value: number_val),
376
+ number: number_val,
377
377
  }
378
- attrs[:part] = Components::Code.new(value: part_val) if part_val
378
+ attrs[:part] = part_val if part_val
379
379
  attrs[:publisher] = Components::Publisher.new(body: "DISC")
380
380
  attrs[:date] = Components::Date.new(year: year_val) if year_val
381
381
 
@@ -432,9 +432,9 @@ module Pubid
432
432
  # Build attributes hash
433
433
  attrs = {
434
434
  prefix: prefix_val,
435
- number: Components::Code.new(value: number_val),
435
+ number: number_val,
436
436
  }
437
- attrs[:part] = Components::Code.new(value: part_val) if part_val
437
+ attrs[:part] = part_val if part_val
438
438
  attrs[:iteration] = iteration_val if iteration_val
439
439
  attrs[:edition] = final_edition if final_edition
440
440
  attrs[:publisher] = Components::Publisher.new(body: "BS")
@@ -456,20 +456,20 @@ module Pubid
456
456
  # Build base identifier
457
457
  base_id = SingleIdentifier.new(
458
458
  publisher: Components::Publisher.new(body: "BS"),
459
- number: Components::Code.new(value: base_number),
459
+ number: base_number,
460
460
  )
461
461
 
462
462
  # Build identifiers for each part
463
463
  id1 = SingleIdentifier.new(
464
464
  publisher: Components::Publisher.new(body: "BS"),
465
- number: Components::Code.new(value: base_number),
466
- part: Components::Code.new(value: part1),
465
+ number: base_number,
466
+ part: part1,
467
467
  )
468
468
 
469
469
  id2 = SingleIdentifier.new(
470
470
  publisher: Components::Publisher.new(body: "BS"),
471
- number: Components::Code.new(value: base_number),
472
- part: Components::Code.new(value: part2),
471
+ number: base_number,
472
+ part: part2,
473
473
  )
474
474
 
475
475
  Identifiers::BundledIdentifier.new(
@@ -636,7 +636,7 @@ module Pubid
636
636
  publisher: Components::Publisher.new(body: publisher_val),
637
637
  )
638
638
  id.prefix = prefix_val if prefix_val && !prefix_val.empty?
639
- id.number = Components::Code.new(value: number_val) if number_val
639
+ id.number = number_val if number_val
640
640
 
641
641
  id.explicit_prefix = has_explicit_publisher || has_explicit_prefix
642
642
  id.explicit_publisher = has_explicit_publisher
@@ -646,11 +646,11 @@ module Pubid
646
646
  parts_array = parts_val[:parts]
647
647
  if parts_array.any?
648
648
  part_str = parts_array.first[:part].to_s
649
- id.part = Components::Code.new(value: part_str)
649
+ id.part = part_str
650
650
  end
651
651
  # Handle space-separated part (direct part attribute)
652
652
  elsif space_separated_part_val
653
- id.part = Components::Code.new(value: space_separated_part_val.to_s)
653
+ id.part = space_separated_part_val.to_s
654
654
  # Mark this part as space-separated for rendering
655
655
  id.space_separated_part = true
656
656
  end
@@ -674,7 +674,7 @@ module Pubid
674
674
  topic = @original_data[:expert_commentary_topic]&.to_s
675
675
 
676
676
  Identifiers::ExpertCommentary.new(
677
- base_identifier: base_id,
677
+ base: base_id,
678
678
  format: format,
679
679
  topic: topic,
680
680
  )
@@ -724,7 +724,7 @@ module Pubid
724
724
  end
725
725
 
726
726
  Identifiers::SupplementDocument.new(
727
- base_identifier: base_id,
727
+ base: base_id,
728
728
  supplement_number: data[:supplement_number].to_s,
729
729
  supplement_year: data[:supplement_year].to_i,
730
730
  supplement_type: supplement_type,
@@ -771,7 +771,7 @@ module Pubid
771
771
  end
772
772
 
773
773
  Identifiers::AddendumDocument.new(
774
- base_identifier: base_id,
774
+ base: base_id,
775
775
  addendum_number: data[:addendum_number].to_s,
776
776
  addendum_year: data[:addendum_year].to_i,
777
777
  addendum_type: addendum_type,
@@ -790,8 +790,10 @@ module Pubid
790
790
  corrigendum = !amd_data[:corrigendum].nil?
791
791
  parenthesized = !data[:parenthesized_amd].nil?
792
792
 
793
+ # NOTE `amd_data[:amendment_number]` above is a PARSE-TREE key and keeps
794
+ # its name; only the attribute moved to `number`.
793
795
  attrs = {
794
- amendment_number: Components::Code.new(value: amendment_number),
796
+ number: Components::Code.new(value: amendment_number),
795
797
  corrigendum: corrigendum,
796
798
  parenthesized: parenthesized,
797
799
  }
@@ -809,8 +811,10 @@ module Pubid
809
811
  # Could also use a more sophisticated algorithm for year conversion
810
812
  full_year = year_val ? "20#{year_val}" : nil
811
813
 
814
+ # NOTE `data[:document_number]` above is a PARSE-TREE key and keeps its
815
+ # name; only the attribute moved to `number`.
812
816
  attrs = {
813
- document_number: document_number,
817
+ number: Components::Code.new(value: document_number),
814
818
  }
815
819
  attrs[:date] = Components::Date.new(year: full_year.to_i) if full_year
816
820
 
@@ -837,7 +841,7 @@ module Pubid
837
841
  base_id = build(base_data)
838
842
 
839
843
  Identifiers::ValueAddedPublication.new(
840
- base_identifier: base_id,
844
+ base: base_id,
841
845
  format: format,
842
846
  )
843
847
  end
@@ -882,14 +886,14 @@ module Pubid
882
886
 
883
887
  if supp[:type] == :amendment
884
888
  Identifiers::Amendment.new(
885
- base_identifier: nil, # NA supplements don't wrap base
889
+ base: nil, # NA supplements don't wrap base
886
890
  amendment_number: supp[:number],
887
891
  amendment_year: year_val&.to_i,
888
892
  separator: supp[:separator] || "+",
889
893
  )
890
894
  else
891
895
  Identifiers::Corrigendum.new(
892
- base_identifier: nil,
896
+ base: nil,
893
897
  corrigendum_number: supp[:number],
894
898
  corrigendum_year: year_val&.to_i,
895
899
  separator: supp[:separator] || "+",
@@ -969,7 +973,7 @@ module Pubid
969
973
  value&.to_s
970
974
 
971
975
  when :number
972
- Components::Code.new(value: value.to_s)
976
+ value.to_s
973
977
 
974
978
  when :parts
975
979
  # Extract parts - handle both formats:
@@ -983,26 +987,25 @@ module Pubid
983
987
  # Check if subpart is already separated (new format from part_with_subpart rule)
984
988
  if first_part.key?(:subpart)
985
989
  {
986
- part: Components::Code.new(value: part_str),
987
- subpart: Components::Code.new(value: first_part[:subpart].to_s),
990
+ part: part_str,
991
+ subpart: first_part[:subpart].to_s,
988
992
  }
989
993
  else
990
994
  # Old format - split on dash to get part and subpart
991
995
  part_components = part_str.split("-")
992
- result = { part: Components::Code.new(value: part_components.first) }
996
+ result = { part: part_components.first }
993
997
  if part_components.length > 1
994
- result[:subpart] =
995
- Components::Code.new(value: part_components[1])
998
+ result[:subpart] = part_components[1]
996
999
  end
997
1000
  result
998
1001
  end
999
1002
  end
1000
1003
 
1001
1004
  when :part
1002
- Components::Code.new(value: value[:part].to_s) if value.is_a?(Hash)
1005
+ value[:part].to_s if value.is_a?(Hash)
1003
1006
 
1004
1007
  when :subpart
1005
- Components::Code.new(value: value.to_s)
1008
+ value.to_s
1006
1009
 
1007
1010
  when :year, :date
1008
1011
  # Only create date if value is present
@@ -1323,8 +1326,15 @@ module Pubid
1323
1326
 
1324
1327
  adopted_id = nil
1325
1328
 
1326
- # Check for EN ISO or EN IEC patterns (triple-level)
1327
- if adopted_str_clean.match?(/EN\s+(ISO\/IEC|IEC|ISO)/)
1329
+ # Check for EN ISO or EN IEC patterns (triple-level).
1330
+ # The test must be ANCHORED, because the repair below is: an unanchored
1331
+ # match accepts "CEN ISO/TS 12180-1:2007" (the "EN ISO" is inside
1332
+ # "CEN ISO"), but `sub(/^EN\s+/, "")` then changes nothing, so
1333
+ # adopted_id stayed nil and the whole parse returned nil for 49
1334
+ # "DD CEN ISO/..." identifiers in BSI's own pass fixtures. Anchored,
1335
+ # a "CEN ..." string falls through to the CEN branch below, which is
1336
+ # where it belongs.
1337
+ if adopted_str_clean.match?(/\AEN\s+(ISO\/IEC|IEC|ISO)/)
1328
1338
  # Parse the ISO/IEC part
1329
1339
  iso_iec_str = adopted_str_clean.sub(/^EN\s+/, "")
1330
1340
 
@@ -1336,11 +1346,11 @@ module Pubid
1336
1346
  adopted_id = Pubid::Iec.parse(iso_iec_str)
1337
1347
  end
1338
1348
 
1339
- # Wrap ISO/IEC identifier in EN adoption
1349
+ # Wrap ISO/IEC identifier in EN adoption (the publisher is the
1350
+ # "EN" default)
1340
1351
  if adopted_id
1341
1352
  adopted_id = Pubid::CenCenelec::Identifiers::AdoptedEuropeanNorm.new(
1342
- publisher: ["EN"],
1343
- adopted_identifier: adopted_id,
1353
+ adopted: adopted_id,
1344
1354
  )
1345
1355
  end
1346
1356
 
@@ -1373,7 +1383,7 @@ module Pubid
1373
1383
  identifier = if adopted_id.class.name.start_with?("Pubid::CenCenelec::")
1374
1384
  Identifiers::AdoptedEuropeanNorm.new(
1375
1385
  publisher: Components::Publisher.new(body: bsi_prefix),
1376
- adopted_identifier: adopted_id,
1386
+ adopted: adopted_id,
1377
1387
  edition: final_edition&.to_s,
1378
1388
  translation_lang: data[:translation_lang]&.to_s,
1379
1389
  translation_upper: data[:translation_upper]&.to_s,
@@ -1386,7 +1396,7 @@ module Pubid
1386
1396
  # Otherwise it's ISO/IEC, use AdoptedInternationalStandard
1387
1397
  Identifiers::AdoptedInternationalStandard.new(
1388
1398
  publisher: Components::Publisher.new(body: bsi_prefix),
1389
- adopted_identifier: adopted_id,
1399
+ adopted: adopted_id,
1390
1400
  edition: final_edition&.to_s,
1391
1401
  translation_lang: data[:translation_lang]&.to_s,
1392
1402
  translation_upper: data[:translation_upper]&.to_s,
@@ -1411,17 +1421,17 @@ module Pubid
1411
1421
  end
1412
1422
  end
1413
1423
 
1414
- def wrap_with_consolidated(base_identifier, supplements_data,
1424
+ def wrap_with_consolidated(base, supplements_data,
1415
1425
  expert_commentary: nil, expert_commentary_topic: nil)
1416
- # If expert_commentary data is provided, set it on the base_identifier
1426
+ # If expert_commentary data is provided, set it on the base
1417
1427
  # This allows ConsolidatedIdentifier to render the ExComm suffix correctly
1418
1428
  if expert_commentary
1419
- base_attrs = base_identifier.class.attributes
1429
+ base_attrs = base.class.attributes
1420
1430
  if base_attrs.key?(:expert_commentary)
1421
- base_identifier.expert_commentary = expert_commentary
1431
+ base.expert_commentary = expert_commentary
1422
1432
  end
1423
1433
  if expert_commentary_topic && base_attrs.key?(:expert_commentary_topic)
1424
- base_identifier.expert_commentary_topic = expert_commentary_topic
1434
+ base.expert_commentary_topic = expert_commentary_topic
1425
1435
  end
1426
1436
  end
1427
1437
 
@@ -1436,7 +1446,7 @@ expert_commentary: nil, expert_commentary_topic: nil)
1436
1446
 
1437
1447
  if supp[:type] == :amendment
1438
1448
  Identifiers::Amendment.new(
1439
- base_identifier: base_identifier,
1449
+ base: base,
1440
1450
  amendment_number: supp[:number],
1441
1451
  amendment_year: year_val&.to_i,
1442
1452
  separator: supp[:separator] || "+",
@@ -1444,7 +1454,7 @@ expert_commentary: nil, expert_commentary_topic: nil)
1444
1454
  )
1445
1455
  else
1446
1456
  Identifiers::Corrigendum.new(
1447
- base_identifier: base_identifier,
1457
+ base: base,
1448
1458
  corrigendum_number: supp[:number],
1449
1459
  corrigendum_year: year_val&.to_i,
1450
1460
  separator: supp[:separator] || "+",
@@ -1453,7 +1463,7 @@ expert_commentary: nil, expert_commentary_topic: nil)
1453
1463
  end
1454
1464
 
1455
1465
  Identifiers::ConsolidatedIdentifier.new(
1456
- identifiers: [base_identifier] + supplement_ids,
1466
+ identifiers: [base] + supplement_ids,
1457
1467
  )
1458
1468
  end
1459
1469
 
@@ -4,4 +4,3 @@
4
4
  # subclass); its body, `.parse` (including the IEC-delegation logic), and the
5
5
  # SingleIdentifier back-compat alias live in single_identifier.rb. This file
6
6
  # just ensures it is loaded when a consumer references Pubid::Bsi::Identifier.
7
- require_relative "single_identifier"
@@ -11,7 +11,7 @@ module Pubid
11
11
  # "BS 2000-0:Addendum 1:1983"
12
12
  # "BS 6034:1981:Addendum No. 1:1986"
13
13
  class AddendumDocument < SingleIdentifier
14
- attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
14
+ attribute :base, ::Pubid::Identifier, polymorphic: true
15
15
  attribute :addendum_number, :string
16
16
  attribute :addendum_year, :integer
17
17
  attribute :addendum_type, :string, default: -> {
@@ -22,7 +22,7 @@ module Pubid
22
22
  } # Separator before Addendum (":" or " ")
23
23
 
24
24
  def publisher
25
- base_identifier&.publisher
25
+ base&.publisher
26
26
  end
27
27
  end
28
28
  end
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Example: "BS EN 10077-1:2006" where EN 10077-1:2006 is a CEN identifier object
8
8
  # Example: "BS EN ISO 8601:2019" where EN ISO 8601:2019 is a CEN AdoptedEuropeanNorm wrapping ISO
9
9
  class AdoptedEuropeanNorm < BritishStandard
10
- attribute :adopted_identifier, ::Pubid::Identifier, polymorphic: true # CEN object
10
+ attribute :adopted, ::Pubid::Identifier, polymorphic: true # CEN object
11
11
  attribute :edition, :string
12
12
  attribute :translation_lang, :string
13
13
  attribute :translation_upper, :string
@@ -25,29 +25,58 @@ module Pubid
25
25
  nil
26
26
  end
27
27
 
28
+ # Walk to the adopted document for the relaton-index key.
29
+ #
30
+ # The `#number` delegation below is not enough on its own: a
31
+ # "DD ENV ISO 11079:1999" adopts a CenCenelec EuropeanPrestandard,
32
+ # which is ITSELF a wrapper around the ISO standard, so the delegation
33
+ # returned that wrapper's own (nil) number and the chain died one level
34
+ # short. `#root` recurses, so it reaches the ISO standard however many
35
+ # adoption layers sit in between.
36
+ def root
37
+ adopted ? adopted.root : self
38
+ end
39
+
28
40
  # Delegate common methods to adopted identifier
29
41
  def number
30
- adopted_identifier&.number
42
+ delegate_target&.number
31
43
  end
32
44
 
33
45
  def year
34
- adopted_identifier&.year if adopted_identifier&.methods&.include?(:year)
46
+ delegate_target&.year if delegate_target&.methods&.include?(:year)
35
47
  end
36
48
 
37
49
  def date
38
- adopted_identifier&.date if adopted_identifier&.methods&.include?(:date)
50
+ delegate_target&.date if delegate_target&.methods&.include?(:date)
39
51
  end
40
52
 
41
53
  def parts
42
- adopted_identifier&.parts if adopted_identifier&.methods&.include?(:parts)
54
+ delegate_target&.parts if delegate_target&.methods&.include?(:parts)
43
55
  end
44
56
 
45
57
  def part
46
- adopted_identifier&.part if adopted_identifier&.methods&.include?(:part)
58
+ delegate_target&.part if delegate_target&.methods&.include?(:part)
47
59
  end
48
60
 
49
61
  def subpart
50
- adopted_identifier&.subpart if adopted_identifier&.methods&.include?(:subpart)
62
+ adopted&.subpart if adopted&.methods&.include?(:subpart)
63
+ end
64
+
65
+ private
66
+
67
+ # The identifier that holds the number, part and date. For
68
+ # "BS EN ISO 8848:2021" the adopted document is a CEN adoption of an
69
+ # ISO standard, and the CEN adoption keeps no number of its own, so
70
+ # read through it to the ISO standard. The CEN class used to do this
71
+ # with delegating readers, which broke its serialization. `subpart`
72
+ # keeps reading the CEN object, as it did before.
73
+ def delegate_target
74
+ target = adopted
75
+ if target.is_a?(::Pubid::CenCenelec::Identifiers::AdoptedEuropeanNorm)
76
+ target.adopted
77
+ else
78
+ target
79
+ end
51
80
  end
52
81
  end
53
82
  end
@@ -7,7 +7,8 @@ module Pubid
7
7
  # Example: "BS ISO 8601:2019" where ISO 8601:2019 is an ISO identifier object
8
8
  # Example: "BS IEC 62600:2020" where IEC 62600:2020 is an IEC identifier object
9
9
  class AdoptedInternationalStandard < BritishStandard
10
- attribute :adopted_identifier, ::Pubid::Identifier, polymorphic: true # ISO/IEC object
10
+ # The adopted ISO/IEC identifier object
11
+ attribute :adopted, ::Pubid::Identifier, polymorphic: true
11
12
  attribute :edition, :string
12
13
  attribute :translation_lang, :string
13
14
  attribute :translation_upper, :string
@@ -27,23 +28,23 @@ module Pubid
27
28
 
28
29
  # Delegate common methods to adopted identifier
29
30
  def number
30
- adopted_identifier&.number
31
+ adopted&.number
31
32
  end
32
33
 
33
34
  def year
34
- adopted_identifier&.year if adopted_identifier&.methods&.include?(:year)
35
+ adopted&.year if adopted&.methods&.include?(:year)
35
36
  end
36
37
 
37
38
  def date
38
- adopted_identifier&.date if adopted_identifier&.methods&.include?(:date)
39
+ adopted&.date if adopted&.methods&.include?(:date)
39
40
  end
40
41
 
41
42
  def parts
42
- adopted_identifier&.parts if adopted_identifier&.methods&.include?(:parts)
43
+ adopted&.parts if adopted&.methods&.include?(:parts)
43
44
  end
44
45
 
45
46
  def part
46
- adopted_identifier&.part if adopted_identifier&.methods&.include?(:part)
47
+ adopted&.part if adopted&.methods&.include?(:part)
47
48
  end
48
49
  end
49
50
  end
@@ -6,7 +6,7 @@ module Pubid
6
6
  # Amendment Identifier
7
7
  # Contains a base identifier plus amendment parameters
8
8
  class Amendment < SingleIdentifier
9
- attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
9
+ attribute :base, ::Pubid::Identifier, polymorphic: true
10
10
  attribute :amendment_number, :string
11
11
  attribute :amendment_year, :integer
12
12
  attribute :separator, :string, default: -> { "+" }
@@ -16,17 +16,17 @@ module Pubid
16
16
  attribute :amd_suffix_form, :boolean, default: -> { false }
17
17
 
18
18
  def publisher
19
- base_identifier&.publisher
19
+ base&.publisher
20
20
  end
21
21
 
22
22
  # Base document = the standard this amendment applies to, fully peeled.
23
23
  def base_document
24
- base_identifier&.base_document || self
24
+ base&.base_document || self
25
25
  end
26
26
 
27
27
  # Dropping the supplement layer yields the base standard.
28
28
  def drop_supplements
29
- base_identifier || self
29
+ base || self
30
30
  end
31
31
 
32
32
  # Uniform supplement interface (shared with Corrigendum) so callers need
@@ -6,7 +6,6 @@ module Pubid
6
6
  # British Industrial Practice (BIP)
7
7
  # Examples: "BIP 2225:2022", "BIP 0142:2014", "BIP 0009:2020"
8
8
  class BritishIndustrialPractice < SingleIdentifier
9
- attribute :number, Bsi::Components::Code
10
9
  attribute :date, Bsi::Components::Date
11
10
 
12
11
  def self.type
@@ -24,6 +24,16 @@ module Pubid
24
24
  # Compare first identifier
25
25
  identifiers.first <=> other.identifiers.first
26
26
  end
27
+
28
+ # A bundle carries no number of its own — each member holds one — so
29
+ # `root.number`, the key relaton-index sorts and bsearches on, was "".
30
+ # Walk to the first member, the shape ConsolidatedIdentifier already
31
+ # uses. Members of one bundle are consecutive numbers of a single
32
+ # series, so the bundle files under the first, and `<=>` above orders
33
+ # bundles by that same member.
34
+ def root
35
+ identifiers&.first ? identifiers.first.root : self
36
+ end
27
37
  end
28
38
  end
29
39
  end
@@ -11,7 +11,16 @@ module Pubid
11
11
  # 21/30445138 DC
12
12
  # 24/30300822 DC
13
13
  class CommitteeDocument < SingleIdentifier
14
- attribute :document_number, :string # The 8-digit document number
14
+ # The 8-digit document number lives in the `number` inherited from
15
+ # SingleIdentifier (a Bsi::Components::Code). It used to be a separate
16
+ # `document_number` :string, which left `number` nil — so `root.number`,
17
+ # the key relaton-index sorts and bsearches on, was "".
18
+ #
19
+ # The duplicate is DELETED rather than mirrored into `number`: keeping
20
+ # both would emit the same digits twice in `to_hash`, and a derived
21
+ # `#number` method is not available here because `number` is a lutaml
22
+ # attribute, whose generated accessor such a method would collide with.
23
+ # Nothing is retyped — the inherited attribute is already a Code.
15
24
 
16
25
  # TYPED_STAGES for committee documents (draft by default)
17
26
  TYPED_STAGES = [
@@ -68,6 +68,12 @@ module Pubid
68
68
  identifiers&.first&.base_document || self
69
69
  end
70
70
 
71
+ # The origin document. Members live in `identifiers` (not `base`), so
72
+ # walk the first member to its root.
73
+ def root
74
+ identifiers&.first&.root || self
75
+ end
76
+
71
77
  # Dropping the supplement layer yields the base standard alone.
72
78
  def drop_supplements
73
79
  identifiers&.first || self
@@ -6,23 +6,23 @@ module Pubid
6
6
  # Corrigendum Identifier
7
7
  # Contains a base identifier plus corrigendum parameters
8
8
  class Corrigendum < SingleIdentifier
9
- attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
9
+ attribute :base, ::Pubid::Identifier, polymorphic: true
10
10
  attribute :corrigendum_number, :string
11
11
  attribute :corrigendum_year, :integer
12
12
  attribute :separator, :string, default: -> { "+" }
13
13
 
14
14
  def publisher
15
- base_identifier&.publisher
15
+ base&.publisher
16
16
  end
17
17
 
18
18
  # Base document = the standard this corrigendum applies to, fully peeled.
19
19
  def base_document
20
- base_identifier&.base_document || self
20
+ base&.base_document || self
21
21
  end
22
22
 
23
23
  # Dropping the supplement layer yields the base standard.
24
24
  def drop_supplements
25
- base_identifier || self
25
+ base || self
26
26
  end
27
27
 
28
28
  # Uniform supplement interface (shared with Amendment) so callers need
@@ -10,25 +10,25 @@ module Pubid
10
10
  # 2. "ExComm" (abbreviated form)
11
11
  # 3. "ExComm (Fire)" (with optional topic suffix)
12
12
  class ExpertCommentary < SingleIdentifier
13
- attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
13
+ attribute :base, ::Pubid::Identifier, polymorphic: true
14
14
  attribute :format, :string # "full", "abbr", "abbr_with_topic"
15
15
  attribute :topic, :string # e.g., "Fire"
16
16
 
17
17
  def publisher
18
- base_identifier&.publisher
18
+ base&.publisher
19
19
  end
20
20
 
21
21
  def number
22
- base_identifier&.number
22
+ base&.number
23
23
  end
24
24
 
25
25
  def year
26
- base_identifier&.year
26
+ base&.year
27
27
  end
28
28
 
29
29
  # Base document = the commented standard, fully peeled.
30
30
  def base_document
31
- base_identifier&.base_document || self
31
+ base&.base_document || self
32
32
  end
33
33
  end
34
34
  end
@@ -6,8 +6,6 @@ module Pubid
6
6
  # BSI Handbook
7
7
  # Examples: "Handbook 17:1963", "HB 10146:1998"
8
8
  class Handbook < SingleIdentifier
9
- attribute :number, Bsi::Components::Code
10
- attribute :part, Bsi::Components::Code
11
9
  attribute :date, Bsi::Components::Date
12
10
  attribute :original_abbr, :string # Preserve "Handbook" or "HB"
13
11
 
@@ -6,7 +6,6 @@ module Pubid
6
6
  # BSI Practice Guide (PP - Published Practice)
7
7
  # Examples: "PP 888:1982", "PP 7307:1986", "PP 7722:2006"
8
8
  class PracticeGuide < SingleIdentifier
9
- attribute :number, Bsi::Components::Code
10
9
  attribute :date, Bsi::Components::Date
11
10
 
12
11
  def self.type