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
@@ -4,14 +4,76 @@ module Pubid
4
4
  module CenCenelec
5
5
  class UrnGenerator < Pubid::UrnGenerator::Base
6
6
  def generate
7
- if identifier.is_a?(CenCenelec::SupplementIdentifier)
8
- generate_supplement_urn
7
+ urn_for(identifier)
8
+ end
9
+
10
+ protected
11
+
12
+ # The URN of +id+, walking the wrapper structure:
13
+ # EN 13250:2000/A1:2005 urn:cen:en:13250:2000:amd:1:2005
14
+ # EN 285:2015+A1:2021 urn:cen:en:285:2015:plus:amd:1:2021
15
+ # EN 60038 AMD1 FRAG2 urn:cen:en:60038:amd:1:frag:2
16
+ # CEN ISO/TS 21003-7:2019 urn:cen:cen:iso:ts:21003-7:2019
17
+ # ENV ISO 11079:1999 urn:cen:env:iso:11079:1999
18
+ # prEN ISO 1234:2020 urn:cen:en:iso:1234:2020:stage.proposal
19
+ # The "plus" marker keeps a consolidated identifier apart from the
20
+ # standalone amendment with the same number and year.
21
+ def urn_for(id)
22
+ case id
23
+ when nil
24
+ "urn:cen"
25
+ when Identifiers::Amendment, Identifiers::Corrigendum,
26
+ Identifiers::Fragment
27
+ [urn_for(id.base), *supplement_segments(id)].join(":")
28
+ when Identifiers::ConsolidatedIdentifier
29
+ base, *supplements = id.identifiers
30
+ [urn_for(base), *supplements.flat_map do |s|
31
+ ["plus", *supplement_segments(s)]
32
+ end].join(":")
9
33
  else
10
- generate_base_urn
34
+ if adoption?(id)
35
+ # The publisher, then the adopted document's MR string with its
36
+ # dot and underscore separators as colons, then a draft stage as
37
+ # the base URN writes it.
38
+ body = [id.mr_publisher, id.adopted&.to_mr_string]
39
+ .compact.reject(&:empty?).join(".").tr("._", "::")
40
+ ["urn:cen:#{body}", *stage_segment(id)].join(":")
41
+ else
42
+ self.class.new(id).generate_base_urn
43
+ end
11
44
  end
12
45
  end
13
46
 
14
- protected
47
+ # "EN ISO 8601:2019" or "ENV ISO 11079:1999": the document identity is
48
+ # on the adopted ISO/IEC identifier, not on this one.
49
+ def adoption?(id)
50
+ id.is_a?(Identifiers::AdoptedEuropeanNorm) ||
51
+ (id.is_a?(Identifiers::EuropeanPrestandard) && id.adopted)
52
+ end
53
+
54
+ # ["stage.proposal"] for a draft stage, [] for a published document.
55
+ def stage_segment(id)
56
+ code = id.typed_stage&.stage_code
57
+ return [] if code.nil? || code.to_s == "published"
58
+
59
+ ["stage.#{code}"]
60
+ end
61
+
62
+ # The segments that a supplement adds to its base: type, number (none
63
+ # for an unnumbered "/AC"), then the date.
64
+ def supplement_segments(id)
65
+ segments = case id
66
+ when Identifiers::Amendment
67
+ ["amd", id.number, id.year]
68
+ when Identifiers::Corrigendum
69
+ ["cor", id.number, id.supplement_date]
70
+ when Identifiers::Fragment
71
+ ["frag", id.number]
72
+ else
73
+ []
74
+ end
75
+ segments.map(&:to_s).reject(&:empty?)
76
+ end
15
77
 
16
78
  def generate_base_urn
17
79
  parts = ["urn", "cen"]
@@ -75,46 +137,6 @@ module Pubid
75
137
  parts.join(":")
76
138
  end
77
139
 
78
- def generate_supplement_urn
79
- parts = ["urn", "cen"]
80
-
81
- base_id = maybe(:base_identifier)
82
- if base_id
83
- base_gen = self.class.new(base_id)
84
- base_urn = base_gen.generate_base_urn
85
-
86
- base_part = base_urn.sub(/^urn:cen:/, "")
87
- base_parts = base_part.split(":")
88
-
89
- parts.concat(base_parts)
90
-
91
- typed_stage = maybe(:typed_stage)
92
- if typed_stage
93
- supp_type = typed_stage.type_code.to_s
94
- parts << supp_type if supp_type
95
- end
96
-
97
- amendment_number = maybe(:amendment_number)
98
- if amendment_number
99
- parts << amendment_number.to_s
100
- elsif identifier.number
101
- number = identifier.number.to_s
102
- parts << number
103
- end
104
-
105
- amendment_year = maybe(:amendment_year)
106
- if amendment_year
107
- parts << amendment_year.to_s
108
- elsif identifier.date&.is_a?(::Pubid::Components::Date) && identifier.date.present?
109
- parts << identifier.date.render(context: URN_CONTEXT)
110
- end
111
- else
112
- parts << "unknown"
113
- end
114
-
115
- parts.join(":")
116
- end
117
-
118
140
  def type_component
119
141
  typed_stage = maybe(:typed_stage)
120
142
  return nil unless typed_stage
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module CenCenelec
5
6
  extend Pubid::PrefixesSupport
@@ -9,130 +10,137 @@ module Pubid
9
10
  # are excluded — they route to their own SDOs, not to CEN.
10
11
  PREFIXES = %w[EN CEN CLC CWA HD ES CR ENV].freeze
11
12
 
13
+ # Publisher tokens that are also the document type. "CWA 14050" has no
14
+ # separate type token, so the builder picks the class from the publisher
15
+ # and the renderer prints the token once, not as "CWA/CWA 14050".
16
+ PUBLISHER_TYPES = %w[CWA HD ES CR ENV].freeze
17
+
12
18
  autoload :Builder, "#{__dir__}/cen_cenelec/builder"
13
19
  autoload :Identifier, "#{__dir__}/cen_cenelec/identifier"
14
20
  autoload :Identifiers, "#{__dir__}/cen_cenelec/identifiers"
15
21
  autoload :Parser, "#{__dir__}/cen_cenelec/parser"
16
22
  autoload :Renderer, "#{__dir__}/cen_cenelec/renderer"
17
23
  autoload :SingleIdentifier, "#{__dir__}/cen_cenelec/single_identifier"
18
- autoload :SupplementIdentifier,
19
- "#{__dir__}/cen_cenelec/supplement_identifier"
20
24
  autoload :UrnGenerator, "#{__dir__}/cen_cenelec/urn_generator"
21
25
  autoload :UrnParser, "#{__dir__}/cen_cenelec/urn_parser"
22
26
 
23
27
  # TYPED_STAGES_REGISTRY for native CEN types
28
+ # Covers the CEN PROJEX stage-code table per issue #251.
24
29
  TYPED_STAGES_REGISTRY = [
25
- # European Norm (EN)
30
+ # === European Norm (EN) lifecycle ===
31
+ # Preliminary (pWI EN): proposal/WI stages
26
32
  Pubid::Components::TypedStage.new(
27
- code: :puben,
28
- stage_code: :published,
29
- type_code: :en,
30
- abbr: ["EN"],
31
- name: "European Norm",
32
- harmonized_stages: %w[60.00 60.60],
33
+ code: :pwien, stage_code: :preliminary, type_code: :en,
34
+ abbr: ["pWI EN"], name: "Preliminary Work Item EN",
35
+ harmonized_stages: %w[00.60 10.98 10.99 20.60],
33
36
  ),
37
+ # Proposal (prEN): working draft stages
34
38
  Pubid::Components::TypedStage.new(
35
- code: :pren,
36
- stage_code: :proposal,
37
- type_code: :en,
38
- abbr: ["prEN"],
39
- name: "Proposal European Norm",
40
- harmonized_stages: %w[30.00 30.20 30.60 30.92 30.98 30.99],
39
+ code: :pren, stage_code: :proposal, type_code: :en,
40
+ abbr: ["prEN"], name: "Proposal European Norm",
41
+ harmonized_stages: %w[30.00 30.20 30.60 30.92 30.97 30.98 30.99],
42
+ ),
43
+ # Final Proposal (FprEN): enquiry stages
44
+ Pubid::Components::TypedStage.new(
45
+ code: :fpren, stage_code: :final_proposal, type_code: :en,
46
+ abbr: ["FprEN"], name: "Final Proposal European Norm",
47
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.97 40.98 40.99],
48
+ ),
49
+ # Formal Vote (FV prEN): COCOR + FV dispatch
50
+ Pubid::Components::TypedStage.new(
51
+ code: :fven, stage_code: :formal_vote, type_code: :en,
52
+ abbr: ["FV prEN"], name: "Formal Vote EN",
53
+ harmonized_stages: %w[43.20 43.60 43.97 43.98 45.97 45.98 45.99],
54
+ ),
55
+ # Vote (vEN): enquiry/vote
56
+ Pubid::Components::TypedStage.new(
57
+ code: :ven, stage_code: :vote, type_code: :en,
58
+ abbr: ["vEN"], name: "Vote EN",
59
+ harmonized_stages: %w[50.20 50.60 50.97 50.98],
60
+ ),
61
+ # Published (EN): ratification + publication milestones
62
+ Pubid::Components::TypedStage.new(
63
+ code: :puben, stage_code: :published, type_code: :en,
64
+ abbr: ["EN"], name: "European Norm",
65
+ harmonized_stages: %w[60.00 60.55 60.60 65.31 65.51 65.62],
66
+ ),
67
+ # Review (rvEN): 2-year review
68
+ Pubid::Components::TypedStage.new(
69
+ code: :rven, stage_code: :review, type_code: :en,
70
+ abbr: ["rvEN"], name: "Review EN",
71
+ harmonized_stages: %w[90.00 90.20 90.60 90.92 90.93 90.98],
72
+ ),
73
+ # Reactivation (racEN)
74
+ Pubid::Components::TypedStage.new(
75
+ code: :racen, stage_code: :reactivation, type_code: :en,
76
+ abbr: ["racEN"], name: "Re-activated EN",
77
+ harmonized_stages: %w[96.60],
41
78
  ),
79
+ # Withdrawn (wdEN)
42
80
  Pubid::Components::TypedStage.new(
43
- code: :fpren,
44
- stage_code: :final_proposal,
45
- type_code: :en,
46
- abbr: ["FprEN"],
47
- name: "Final Proposal European Norm",
48
- harmonized_stages: %w[40.00 40.20 40.60 40.92 40.98 40.99],
81
+ code: :wden, stage_code: :withdrawn, type_code: :en,
82
+ abbr: ["wdEN"], name: "Withdrawn EN",
83
+ harmonized_stages: %w[99.60],
49
84
  ),
50
85
 
51
- # Technical Specification (TS)
86
+ # === Technical Specification (TS) ===
52
87
  Pubid::Components::TypedStage.new(
53
- code: :pubts,
54
- stage_code: :published,
55
- type_code: :ts,
56
- abbr: ["TS"],
57
- name: "Technical Specification",
88
+ code: :pubts, stage_code: :published, type_code: :ts,
89
+ abbr: ["TS"], name: "Technical Specification",
58
90
  harmonized_stages: %w[60.00 60.60],
59
91
  ),
60
92
  Pubid::Components::TypedStage.new(
61
- code: :prts,
62
- stage_code: :proposal,
63
- type_code: :ts,
64
- abbr: ["prTS"],
65
- name: "Proposal Technical Specification",
93
+ code: :prts, stage_code: :proposal, type_code: :ts,
94
+ abbr: ["prTS"], name: "Proposal Technical Specification",
66
95
  harmonized_stages: %w[30.00 30.20 30.60 30.92 30.98 30.99],
67
96
  ),
68
97
 
69
- # Technical Report (TR)
98
+ # === Technical Report (TR) ===
70
99
  Pubid::Components::TypedStage.new(
71
- code: :pubtr,
72
- stage_code: :published,
73
- type_code: :tr,
74
- abbr: ["TR"],
75
- name: "Technical Report",
100
+ code: :pubtr, stage_code: :published, type_code: :tr,
101
+ abbr: ["TR"], name: "Technical Report",
76
102
  harmonized_stages: %w[60.00 60.60],
77
103
  ),
78
104
 
79
- # CEN Workshop Agreement (CWA)
105
+ # === CEN Workshop Agreement (CWA) ===
80
106
  Pubid::Components::TypedStage.new(
81
- code: :pubcwa,
82
- stage_code: :published,
83
- type_code: :cwa,
84
- abbr: ["CWA"],
85
- name: "CEN Workshop Agreement",
107
+ code: :pubcwa, stage_code: :published, type_code: :cwa,
108
+ abbr: ["CWA"], name: "CEN Workshop Agreement",
86
109
  harmonized_stages: %w[60.00 60.60],
87
110
  ),
88
111
 
89
- # Guide
112
+ # === Guide ===
90
113
  Pubid::Components::TypedStage.new(
91
- code: :pubguide,
92
- stage_code: :published,
93
- type_code: :guide,
94
- abbr: ["Guide"],
95
- name: "Guide",
114
+ code: :pubguide, stage_code: :published, type_code: :guide,
115
+ abbr: ["Guide"], name: "Guide",
96
116
  harmonized_stages: %w[60.00 60.60],
97
117
  ),
98
118
 
99
- # Harmonization Document (HD)
119
+ # === Harmonization Document (HD) ===
100
120
  Pubid::Components::TypedStage.new(
101
- code: :pubhd,
102
- stage_code: :published,
103
- type_code: :hd,
104
- abbr: ["HD"],
105
- name: "Harmonization Document",
121
+ code: :pubhd, stage_code: :published, type_code: :hd,
122
+ abbr: ["HD"], name: "Harmonization Document",
106
123
  harmonized_stages: %w[60.00 60.60],
107
124
  ),
108
125
 
109
- # European Specification (ES)
126
+ # === European Specification (ES) ===
110
127
  Pubid::Components::TypedStage.new(
111
- code: :pubes,
112
- stage_code: :published,
113
- type_code: :es,
114
- abbr: ["ES"],
115
- name: "European Specification",
128
+ code: :pubes, stage_code: :published, type_code: :es,
129
+ abbr: ["ES"], name: "European Specification",
116
130
  harmonized_stages: %w[60.00 60.60],
117
131
  ),
118
132
 
119
- # CEN Report (CR)
133
+ # === CEN Report (CR) ===
120
134
  Pubid::Components::TypedStage.new(
121
- code: :pubcr,
122
- stage_code: :published,
123
- type_code: :cr,
124
- abbr: ["CR"],
125
- name: "CEN Report",
135
+ code: :pubcr, stage_code: :published, type_code: :cr,
136
+ abbr: ["CR"], name: "CEN Report",
126
137
  harmonized_stages: %w[60.00 60.60],
127
138
  ),
128
139
 
129
- # European Prestandard (ENV)
140
+ # === European Prestandard (ENV) ===
130
141
  Pubid::Components::TypedStage.new(
131
- code: :pubenv,
132
- stage_code: :published,
133
- type_code: :env,
134
- abbr: ["ENV"],
135
- name: "European Prestandard",
142
+ code: :pubenv, stage_code: :published, type_code: :env,
143
+ abbr: ["ENV"], name: "European Prestandard",
136
144
  harmonized_stages: %w[60.00 60.60],
137
145
  ),
138
146
  ].freeze
@@ -148,8 +156,13 @@ module Pubid
148
156
  ).freeze
149
157
 
150
158
  def self.parse(identifier)
159
+ unless identifier.is_a?(String)
160
+ raise Pubid::Errors::InvalidInputError,
161
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
162
+ end
163
+
151
164
  if identifier.length > Pubid::MAX_INPUT_LENGTH
152
- raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
165
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
153
166
  end
154
167
 
155
168
  CenCenelec::Identifier.parse(identifier)
@@ -184,16 +197,25 @@ module Pubid
184
197
  abbr_str = abbr.to_s.upcase
185
198
  all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
186
199
  end
200
+
201
+ # Lookup: typed-stage code -> typed stage ("pren" -> the prEN entry).
202
+ # The serialized form of a draft stage is this code.
203
+ # @param code [String, Symbol] the typed-stage code to find
204
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
205
+ def self.locate_stage_by_code(code)
206
+ all_typed_stages.find { |s| s.code.to_s == code.to_s }
207
+ end
187
208
  end
188
209
  end
189
210
 
190
211
  Pubid::Registry.register(:cen_cenelec, Pubid::CenCenelec)
191
212
  Pubid::Registry.register(:cen, Pubid::CenCenelec)
192
213
 
193
- # Per-flavor format registry: inherits global formats, overrides :human
194
- # Register on both root hierarchies: SingleIdentifier and Identifiers::Base
195
- cen_renderer = Pubid::CenCenelec::Renderer
196
- Pubid::CenCenelec::SingleIdentifier.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
197
- Pubid::CenCenelec::SingleIdentifier.format_registry.register(:human, renderer: cen_renderer)
198
- Pubid::CenCenelec::Identifiers::Base.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
199
- Pubid::CenCenelec::Identifiers::Base.format_registry.register(:human, renderer: cen_renderer)
214
+ # Per-flavor format registry: inherits global formats, overrides :human.
215
+ # Registered on the shared parent of every CEN/CENELEC class, so it covers
216
+ # SingleIdentifier, Identifiers::Base and the supplement wrappers, which
217
+ # descend from neither.
218
+ Pubid::CenCenelec::Identifier.format_registry =
219
+ Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
220
+ Pubid::CenCenelec::Identifier.format_registry
221
+ .register(:human, renderer: Pubid::CenCenelec::Renderer)
@@ -14,12 +14,30 @@ module Pubid
14
14
  # Determine identifier class based on parsed content
15
15
  identifier_class = determine_class(parsed_hash)
16
16
 
17
+ # Supplement / Corrigendum wrap a nested base.
18
+ if identifier_class == Cie::Identifiers::Corrigendum
19
+ return build_corrigendum(parsed_hash)
20
+ end
21
+ if identifier_class == Cie::Identifiers::Supplement
22
+ return build_supplement(parsed_hash)
23
+ end
24
+
17
25
  # Extract attributes with style detection
18
26
  attributes = extract_attributes(parsed_hash)
19
27
 
20
- # For Bundle identifier, store original string
28
+ # For Bundle, parse each comma-separated member and hoist a shared base.
21
29
  if parsed_hash[:bundle_items] && original_string
22
- attributes[:identifiers_string] = original_string
30
+ attributes.merge!(build_bundle(original_string))
31
+ end
32
+
33
+ # `extract_attributes` builds one attribute hash for every CIE type,
34
+ # but the types do not share one attribute set — only Standard,
35
+ # DualPublished and Identical declare `s_prefix`, while Conference,
36
+ # Bundle, Proceedings and TutorialBundle do not. lutaml used to drop
37
+ # the surplus key without a word; the constructor now refuses it, so
38
+ # the builder has to stop offering it.
39
+ attributes = attributes.select do |key, _|
40
+ identifier_class.attributes.key?(key)
23
41
  end
24
42
 
25
43
  # Construct identifier
@@ -28,6 +46,85 @@ module Pubid
28
46
 
29
47
  private
30
48
 
49
+ # Build a Bundle's attributes from its printed form. Parse each member,
50
+ # then — since a CIE bundle is the parts of one supplement of one standard
51
+ # — hoist the shared base and keep only the differing supplement
52
+ # number/part in each doc. If the members don't share a base (not seen in
53
+ # practice, but the grammar allows it), keep each doc's own base instead.
54
+ def build_bundle(original_string)
55
+ members = split_bundle_members(original_string)
56
+ shared = common_base(members)
57
+ return { ids: members } unless shared
58
+
59
+ ids = members.map do |m|
60
+ Cie::Identifiers::Supplement.new(number: m.number, part: m.part)
61
+ end
62
+ { base: shared, ids: ids }
63
+ end
64
+
65
+ # The publisher prefix is written once, so only the first item carries
66
+ # "CIE "; prepend it to the rest before parsing each member.
67
+ def split_bundle_members(original_string)
68
+ original_string.split(",").each_with_index.map do |item, i|
69
+ ref = i.zero? ? item.strip : "CIE #{item.strip}"
70
+ Cie::Identifier.parse(ref)
71
+ end
72
+ end
73
+
74
+ # The base shared by every member, or nil if they differ (or any is
75
+ # base-less). Compared by canonical hash so structural equality holds.
76
+ def common_base(members)
77
+ bases = members.map(&:base)
78
+ return nil if bases.any?(&:nil?)
79
+
80
+ first = bases.first.to_hash
81
+ bases.all? { |b| b.to_hash == first } ? bases.first : nil
82
+ end
83
+
84
+ # Supplement: nest the base Standard (the stage/year/language belong to
85
+ # the base), keep only the -SPN number/part on the wrapper.
86
+ def build_supplement(parsed_hash)
87
+ a = extract_attributes(parsed_hash)
88
+ base = Cie::Identifiers::Standard.new(
89
+ number: a[:base_number],
90
+ stage: a[:stage],
91
+ s_prefix: a.fetch(:s_prefix, false),
92
+ language: a[:language],
93
+ year: a[:year],
94
+ style: "current", # supplements always use the colon style
95
+ )
96
+ Cie::Identifiers::Supplement.new(
97
+ base: base,
98
+ number: a[:supplement_number],
99
+ part: a[:supplement_part],
100
+ )
101
+ end
102
+
103
+ # Corrigendum: nest the base (a Standard, or a Supplement when the base
104
+ # itself carries -SPN), keep only the /CorN number/year on the wrapper.
105
+ def build_corrigendum(parsed_hash)
106
+ a = extract_attributes(parsed_hash)
107
+ base_std = Cie::Identifiers::Standard.new(
108
+ number: a[:base_number],
109
+ year: a[:base_year],
110
+ style: "current",
111
+ )
112
+ base = if a[:base_supplement]
113
+ Cie::Identifiers::Supplement.new(
114
+ base: base_std,
115
+ number: a[:base_supplement],
116
+ part: a[:base_supplement_part],
117
+ )
118
+ else
119
+ base_std
120
+ end
121
+ Cie::Identifiers::Corrigendum.new(
122
+ base: base,
123
+ number: a[:cor_number],
124
+ year: a[:cor_year],
125
+ )
126
+ end
127
+
31
128
  # Determine which identifier class to use
32
129
  def determine_class(parsed_hash)
33
130
  # Tutorial Bundle (special text format)
@@ -50,6 +147,11 @@ module Pubid
50
147
  return Cie::Identifiers::Supplement
51
148
  end
52
149
 
150
+ # Proceedings paper (x-prefixed or standalone)
151
+ if parsed_hash[:paper_code]
152
+ return Cie::Identifiers::Proceedings
153
+ end
154
+
53
155
  # Conference (x-prefix)
54
156
  if parsed_hash[:conference]
55
157
  return Cie::Identifiers::Conference
@@ -179,47 +281,69 @@ module Pubid
179
281
  date_sep = "slash" # Special format for identical identifiers
180
282
  end
181
283
 
182
- # Detect style from date separator
183
- style = if date_sep == "colon"
184
- "current"
185
- else
186
- (date_sep == "dash" ? "legacy" : detect_style_fallback(parsed_hash))
284
+ # Style is the sole separator field (no date_separator):
285
+ # colon -> current (":") dash -> legacy ("-") slash -> slash ("/")
286
+ style = case date_sep
287
+ when "colon" then "current"
288
+ when "dash" then "legacy"
289
+ when "slash" then "slash"
290
+ else detect_style_fallback(parsed_hash)
187
291
  end
188
292
  attributes[:style] = style
189
293
 
190
- # Set year and separator if present
294
+ # Set year if present
191
295
  attributes[:year] = year_value if year_value
192
- attributes[:date_separator] = date_sep if date_sep
193
296
 
194
- # Extract code
297
+ # Extract code (flat number/part/iteration/part_separator on the
298
+ # identifier; the code's style is the identifier's own `style`).
195
299
  if parsed_hash[:number]
196
- code_attrs = { number: extract_value(parsed_hash[:number]),
197
- style: style }
300
+ attributes[:number] = extract_value(parsed_hash[:number])
198
301
  if parsed_hash[:part]
199
- code_attrs[:part] =
200
- extract_value(parsed_hash[:part])
302
+ attributes[:part] = extract_value(parsed_hash[:part])
201
303
  end
202
304
  if parsed_hash[:iteration]
203
- code_attrs[:iteration] =
204
- extract_value(parsed_hash[:iteration])
305
+ attributes[:iteration] = extract_value(parsed_hash[:iteration])
205
306
  end
206
307
 
207
308
  # Detect part separator from parser markers
208
309
  if parsed_hash[:slash_sep]
209
- code_attrs[:part_separator] = "slash"
310
+ attributes[:part_separator] = "slash"
210
311
  elsif parsed_hash[:dash_sep]
211
- code_attrs[:part_separator] = "dash"
312
+ attributes[:part_separator] = "dash"
212
313
  end
213
-
214
- attributes[:code] = Components::Code.new(**code_attrs)
215
314
  end
216
315
 
217
316
  # Conference number (separate from regular code)
218
317
  if parsed_hash[:conf_number]
219
- attributes[:conference_number] =
318
+ attributes[:number] =
220
319
  extract_value(parsed_hash[:conf_number])
221
320
  end
222
321
 
322
+ # Proceedings paper: the paper itself is the document, so its identity
323
+ # (code + running number, e.g. "OP01") is the flat +number+ for both
324
+ # surface forms. The x-form's parent conference goes to
325
+ # +conference+; the standalone form keeps its +page+ range.
326
+ if parsed_hash[:paper_code]
327
+ attributes[:number] =
328
+ "#{extract_value(parsed_hash[:paper_code])}" \
329
+ "#{extract_value(parsed_hash[:paper_number])}"
330
+ if parsed_hash[:conf_number]
331
+ attributes[:conference] =
332
+ extract_value(parsed_hash[:conf_number])
333
+ end
334
+ end
335
+ if parsed_hash[:page_range]
336
+ attributes[:page] = extract_value(parsed_hash[:page_range])
337
+ end
338
+
339
+ # Conference /slug variant (opaque, verbatim)
340
+ if parsed_hash[:variant]
341
+ attributes[:variant] = extract_value(parsed_hash[:variant])
342
+ end
343
+
344
+ # D-series marker
345
+ attributes[:d_prefix] = true if parsed_hash[:d_prefix]
346
+
223
347
  # Extract language (direct lang_code for slash_colon format)
224
348
  lang_code = nil
225
349
  lang_format = nil
@@ -325,10 +449,11 @@ module Pubid
325
449
  extract_value(parsed_hash[:amd_number])
326
450
  end
327
451
 
328
- # Extract bundle data
452
+ # Tutorial bundle: the ordinal is the bundle's own `number` (also its
453
+ # relaton-index key). A comma-list bundle instead keys via its `ids`
454
+ # members through #root, so it needs no stored number.
329
455
  if parsed_hash[:bundle_number]
330
- attributes[:bundle_number] =
331
- extract_value(parsed_hash[:bundle_number])
456
+ attributes[:number] = extract_value(parsed_hash[:bundle_number])
332
457
  end
333
458
 
334
459
  # Extract trailing language from legacy_code_with_year
@@ -5,14 +5,23 @@ module Pubid
5
5
  # Base Identifier class for CIE.
6
6
  #
7
7
  # Inherits the shared Pubid::Identifier contract (format_registry, render,
8
- # to_urn, exclude, hash, eql?) while allowing CIE-specific attributes
9
- # such as +style+ ("legacy" vs "current" date separator).
8
+ # to_urn, exclude, hash, eql?) while allowing CIE-specific attributes.
9
+ #
10
+ # +style+ is the sole number<->year separator field (there is no separate
11
+ # date_separator): "current" -> ":", "legacy" -> "-", "slash" -> "/".
12
+ # It defaults to "current" (the dominant value), so canonicalize_hash drops
13
+ # it from the majority of rows and from_hash restores it.
10
14
  class Identifier < ::Pubid::Identifier
11
- attribute :style, :string # "legacy" or "current"
15
+ attribute :style, :string, default: -> { "current" }
12
16
 
13
17
  def self.parse(input)
18
+ unless input.is_a?(String)
19
+ raise Pubid::Errors::InvalidInputError,
20
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
21
+ end
22
+
14
23
  if input.length > Pubid::MAX_INPUT_LENGTH
15
- raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
24
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
16
25
  end
17
26
 
18
27
  parsed = Parser.parse(input)