pubid 2.0.0.pre.alpha.7 → 2.0.0.pre.alpha.9

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 (485) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +9 -50
  3. data/data/bipm/update_codes.yaml +9 -0
  4. data/data/iec/update_codes.yaml +3 -0
  5. data/data/ieee/update_codes.yaml +107 -1
  6. data/data/nist/series.yaml +155 -0
  7. data/data/nist/update_codes.yaml +8 -0
  8. data/lib/pubid/adobe/builder.rb +52 -0
  9. data/lib/pubid/adobe/identifier.rb +49 -0
  10. data/lib/pubid/adobe/identifiers/publication.rb +31 -0
  11. data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
  12. data/lib/pubid/adobe/identifiers.rb +10 -0
  13. data/lib/pubid/adobe/parser.rb +128 -0
  14. data/lib/pubid/adobe/renderer.rb +39 -0
  15. data/lib/pubid/adobe/urn_generator.rb +42 -0
  16. data/lib/pubid/adobe/urn_parser.rb +69 -0
  17. data/lib/pubid/adobe.rb +60 -0
  18. data/lib/pubid/amca/builder.rb +2 -2
  19. data/lib/pubid/amca/identifier.rb +1 -3
  20. data/lib/pubid/amca/identifiers/base.rb +1 -6
  21. data/lib/pubid/amca/identifiers/interpretation.rb +1 -1
  22. data/lib/pubid/amca/identifiers/publication.rb +1 -1
  23. data/lib/pubid/amca/identifiers/standard.rb +1 -1
  24. data/lib/pubid/amca/identifiers.rb +0 -1
  25. data/lib/pubid/amca/single_identifier.rb +1 -1
  26. data/lib/pubid/amca.rb +3 -3
  27. data/lib/pubid/ashrae/builder.rb +22 -22
  28. data/lib/pubid/ashrae/identifier.rb +3 -4
  29. data/lib/pubid/ashrae/identifiers/addenda_package.rb +1 -1
  30. data/lib/pubid/ashrae/identifiers/addendum.rb +1 -1
  31. data/lib/pubid/ashrae/identifiers/base.rb +14 -8
  32. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +1 -1
  33. data/lib/pubid/ashrae/identifiers.rb +0 -1
  34. data/lib/pubid/ashrae/parser.rb +14 -9
  35. data/lib/pubid/ashrae/renderer.rb +19 -19
  36. data/lib/pubid/ashrae/single_identifier.rb +1 -1
  37. data/lib/pubid/ashrae/supplement_identifier.rb +6 -6
  38. data/lib/pubid/ashrae.rb +3 -3
  39. data/lib/pubid/bipm/builder.rb +107 -0
  40. data/lib/pubid/bipm/identifier.rb +160 -0
  41. data/lib/pubid/bipm/identifiers/committee_document.rb +24 -0
  42. data/lib/pubid/bipm/identifiers/guide.rb +24 -0
  43. data/lib/pubid/bipm/identifiers/meeting.rb +41 -0
  44. data/lib/pubid/bipm/identifiers/mep.rb +21 -0
  45. data/lib/pubid/bipm/identifiers/metrologia_article.rb +24 -0
  46. data/lib/pubid/bipm/identifiers/si_brochure.rb +20 -0
  47. data/lib/pubid/bipm/identifiers.rb +15 -0
  48. data/lib/pubid/bipm/parser.rb +184 -0
  49. data/lib/pubid/bipm/renderer.rb +110 -0
  50. data/lib/pubid/bipm/urn_generator.rb +58 -0
  51. data/lib/pubid/bipm/urn_parser.rb +52 -0
  52. data/lib/pubid/bipm.rb +86 -0
  53. data/lib/pubid/bsi/builder.rb +14 -14
  54. data/lib/pubid/bsi/identifier.rb +0 -1
  55. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
  56. data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
  57. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +6 -0
  58. data/lib/pubid/bsi/identifiers/corrigendum.rb +4 -4
  59. data/lib/pubid/bsi/identifiers/expert_commentary.rb +5 -5
  60. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -2
  61. data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
  62. data/lib/pubid/bsi/renderer.rb +8 -8
  63. data/lib/pubid/bsi/single_identifier.rb +48 -0
  64. data/lib/pubid/builder/base.rb +5 -3
  65. data/lib/pubid/bundled_identifier.rb +3 -3
  66. data/lib/pubid/calconnect/builder.rb +38 -0
  67. data/lib/pubid/calconnect/identifier.rb +117 -0
  68. data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
  69. data/lib/pubid/calconnect/identifiers.rb +9 -0
  70. data/lib/pubid/calconnect/parser.rb +54 -0
  71. data/lib/pubid/calconnect/renderer.rb +36 -0
  72. data/lib/pubid/calconnect/urn_generator.rb +33 -0
  73. data/lib/pubid/calconnect/urn_parser.rb +34 -0
  74. data/lib/pubid/calconnect.rb +77 -0
  75. data/lib/pubid/ccsds/builder.rb +1 -1
  76. data/lib/pubid/ccsds/identifier.rb +1 -1
  77. data/lib/pubid/ccsds/identifiers/corrigendum.rb +2 -2
  78. data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
  79. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  80. data/lib/pubid/cen_cenelec/builder.rb +46 -12
  81. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -2
  82. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +6 -0
  83. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -2
  84. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
  85. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  86. data/lib/pubid/cen_cenelec/renderer.rb +5 -5
  87. data/lib/pubid/cen_cenelec/supplement_identifier.rb +5 -5
  88. data/lib/pubid/cen_cenelec/urn_generator.rb +1 -1
  89. data/lib/pubid/cen_cenelec.rb +76 -72
  90. data/lib/pubid/cie/builder.rb +139 -24
  91. data/lib/pubid/cie/identifier.rb +7 -3
  92. data/lib/pubid/cie/identifiers/bundle.rb +32 -4
  93. data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
  94. data/lib/pubid/cie/identifiers/conference.rb +9 -4
  95. data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
  96. data/lib/pubid/cie/identifiers/dual_published.rb +4 -4
  97. data/lib/pubid/cie/identifiers/identical.rb +7 -7
  98. data/lib/pubid/cie/identifiers/joint_published.rb +8 -8
  99. data/lib/pubid/cie/identifiers/proceedings.rb +39 -0
  100. data/lib/pubid/cie/identifiers/standard.rb +33 -7
  101. data/lib/pubid/cie/identifiers/supplement.rb +24 -22
  102. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +6 -2
  103. data/lib/pubid/cie/identifiers.rb +2 -0
  104. data/lib/pubid/cie/parser.rb +54 -5
  105. data/lib/pubid/cie/single_identifier.rb +40 -1
  106. data/lib/pubid/cie/supplement_identifier.rb +29 -16
  107. data/lib/pubid/cie/urn_generator.rb +11 -8
  108. data/lib/pubid/cie.rb +0 -1
  109. data/lib/pubid/components/date.rb +21 -5
  110. data/lib/pubid/csa/builder.rb +1 -1
  111. data/lib/pubid/csa/composite_identifier.rb +17 -1
  112. data/lib/pubid/csa/identifier.rb +48 -3
  113. data/lib/pubid/csa/identifiers/bundled.rb +6 -0
  114. data/lib/pubid/csa/identifiers/combined.rb +6 -0
  115. data/lib/pubid/csa/identifiers/package.rb +2 -2
  116. data/lib/pubid/csa/parser.rb +6 -6
  117. data/lib/pubid/csa/wrapper_identifier.rb +17 -0
  118. data/lib/pubid/doi/builder.rb +18 -0
  119. data/lib/pubid/doi/identifier.rb +46 -0
  120. data/lib/pubid/doi/identifiers/resource.rb +30 -0
  121. data/lib/pubid/doi/identifiers.rb +9 -0
  122. data/lib/pubid/doi/parser.rb +52 -0
  123. data/lib/pubid/doi/renderer.rb +13 -0
  124. data/lib/pubid/doi.rb +55 -0
  125. data/lib/pubid/easc/builder.rb +55 -0
  126. data/lib/pubid/easc/identifier.rb +61 -0
  127. data/lib/pubid/easc/identifiers/pmg.rb +20 -0
  128. data/lib/pubid/easc/identifiers/rmg.rb +19 -0
  129. data/lib/pubid/easc/identifiers.rb +10 -0
  130. data/lib/pubid/easc/parser.rb +80 -0
  131. data/lib/pubid/easc/renderer.rb +48 -0
  132. data/lib/pubid/easc/urn_generator.rb +46 -0
  133. data/lib/pubid/easc/urn_parser.rb +57 -0
  134. data/lib/pubid/easc.rb +52 -0
  135. data/lib/pubid/ecma/builder.rb +31 -0
  136. data/lib/pubid/ecma/identifier.rb +76 -0
  137. data/lib/pubid/ecma/identifiers/memento.rb +30 -0
  138. data/lib/pubid/ecma/identifiers/standard.rb +31 -0
  139. data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
  140. data/lib/pubid/ecma/identifiers.rb +11 -0
  141. data/lib/pubid/ecma/parser.rb +41 -0
  142. data/lib/pubid/ecma/renderer.rb +46 -0
  143. data/lib/pubid/ecma/urn_generator.rb +25 -0
  144. data/lib/pubid/ecma/urn_parser.rb +35 -0
  145. data/lib/pubid/ecma.rb +67 -0
  146. data/lib/pubid/etsi/builder.rb +7 -3
  147. data/lib/pubid/etsi/identifier.rb +1 -3
  148. data/lib/pubid/etsi/identifiers/base.rb +28 -10
  149. data/lib/pubid/etsi/identifiers/etsi_standard.rb +128 -4
  150. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +35 -3
  151. data/lib/pubid/etsi/identifiers.rb +0 -1
  152. data/lib/pubid/etsi/parser.rb +8 -2
  153. data/lib/pubid/etsi/renderer.rb +8 -2
  154. data/lib/pubid/etsi.rb +5 -5
  155. data/lib/pubid/export/exporter.rb +2 -1
  156. data/lib/pubid/export/flavor_exporter.rb +18 -3
  157. data/lib/pubid/gb/builder.rb +45 -0
  158. data/lib/pubid/gb/identifier.rb +64 -0
  159. data/lib/pubid/gb/identifiers/standard.rb +34 -0
  160. data/lib/pubid/gb/identifiers.rb +9 -0
  161. data/lib/pubid/gb/parser.rb +63 -0
  162. data/lib/pubid/gb/renderer.rb +35 -0
  163. data/lib/pubid/gb.rb +87 -0
  164. data/lib/pubid/gost/builder.rb +148 -0
  165. data/lib/pubid/gost/identifier.rb +49 -0
  166. data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
  167. data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
  168. data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
  169. data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
  170. data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
  171. data/lib/pubid/gost/identifiers.rb +13 -0
  172. data/lib/pubid/gost/parser.rb +97 -0
  173. data/lib/pubid/gost/renderer.rb +48 -0
  174. data/lib/pubid/gost/urn_generator.rb +46 -0
  175. data/lib/pubid/gost/urn_parser.rb +52 -0
  176. data/lib/pubid/gost.rb +49 -0
  177. data/lib/pubid/iala/builder.rb +22 -27
  178. data/lib/pubid/iala/identifier.rb +27 -2
  179. data/lib/pubid/iala/identifiers/advice.rb +1 -1
  180. data/lib/pubid/iala/identifiers/annex.rb +14 -12
  181. data/lib/pubid/iala/identifiers/general_assembly.rb +5 -2
  182. data/lib/pubid/iala/identifiers/guideline.rb +3 -1
  183. data/lib/pubid/iala/identifiers/letter.rb +1 -1
  184. data/lib/pubid/iala/identifiers/manual.rb +3 -1
  185. data/lib/pubid/iala/identifiers/model_course.rb +3 -1
  186. data/lib/pubid/iala/identifiers/recommendation.rb +3 -1
  187. data/lib/pubid/iala/identifiers/report.rb +1 -1
  188. data/lib/pubid/iala/identifiers/resolution.rb +1 -1
  189. data/lib/pubid/iala/identifiers/standard.rb +3 -1
  190. data/lib/pubid/iala/identifiers.rb +0 -1
  191. data/lib/pubid/iala/renderer.rb +1 -1
  192. data/lib/pubid/iala/urn_generator.rb +1 -1
  193. data/lib/pubid/iala/urn_parser.rb +19 -2
  194. data/lib/pubid/iala.rb +4 -4
  195. data/lib/pubid/iana/builder.rb +20 -0
  196. data/lib/pubid/iana/identifier.rb +72 -0
  197. data/lib/pubid/iana/identifiers/registry.rb +33 -0
  198. data/lib/pubid/iana/identifiers.rb +9 -0
  199. data/lib/pubid/iana/parser.rb +38 -0
  200. data/lib/pubid/iana/renderer.rb +29 -0
  201. data/lib/pubid/iana/urn_generator.rb +15 -0
  202. data/lib/pubid/iana/urn_parser.rb +24 -0
  203. data/lib/pubid/iana.rb +69 -0
  204. data/lib/pubid/identifier.rb +210 -23
  205. data/lib/pubid/idf/builder.rb +1 -1
  206. data/lib/pubid/idf/parser.rb +2 -2
  207. data/lib/pubid/idf/renderer.rb +1 -1
  208. data/lib/pubid/idf/supplement_identifier.rb +3 -3
  209. data/lib/pubid/iec/builder.rb +35 -25
  210. data/lib/pubid/iec/identifier.rb +47 -2
  211. data/lib/pubid/iec/identifiers/base.rb +2 -2
  212. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
  213. data/lib/pubid/iec/identifiers/fragment_identifier.rb +11 -11
  214. data/lib/pubid/iec/identifiers/international_standard.rb +8 -5
  215. data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
  216. data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
  217. data/lib/pubid/iec/identifiers/technical_report.rb +1 -1
  218. data/lib/pubid/iec/identifiers/technical_specification.rb +1 -1
  219. data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
  220. data/lib/pubid/iec/identifiers.rb +1 -0
  221. data/lib/pubid/iec/parser.rb +51 -10
  222. data/lib/pubid/iec/renderer.rb +18 -8
  223. data/lib/pubid/iec/single_identifier.rb +1 -1
  224. data/lib/pubid/iec/supplement_identifier.rb +32 -19
  225. data/lib/pubid/iec.rb +1 -6
  226. data/lib/pubid/ieee/aiee/builder.rb +17 -3
  227. data/lib/pubid/ieee/aiee/identifier.rb +45 -61
  228. data/lib/pubid/ieee/builder.rb +341 -68
  229. data/lib/pubid/ieee/compaction.rb +121 -0
  230. data/lib/pubid/ieee/components/draft.rb +47 -7
  231. data/lib/pubid/ieee/identifier.rb +1 -3
  232. data/lib/pubid/ieee/identifiers/adopted_standard.rb +30 -5
  233. data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
  234. data/lib/pubid/ieee/identifiers/base.rb +106 -13
  235. data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
  236. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +6 -2
  237. data/lib/pubid/ieee/identifiers/corrigendum.rb +17 -2
  238. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +3 -3
  239. data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
  240. data/lib/pubid/ieee/identifiers/dual_published.rb +3 -3
  241. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
  242. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +2 -1
  243. data/lib/pubid/ieee/identifiers/joint_development.rb +56 -11
  244. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -1
  245. data/lib/pubid/ieee/identifiers/nesc/base.rb +90 -19
  246. data/lib/pubid/ieee/identifiers/nesc/draft.rb +20 -5
  247. data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
  248. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +16 -5
  249. data/lib/pubid/ieee/identifiers/nesc/redline.rb +11 -2
  250. data/lib/pubid/ieee/identifiers/nesc/standard.rb +18 -3
  251. data/lib/pubid/ieee/identifiers/nesc.rb +1 -0
  252. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +3 -3
  253. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +14 -6
  254. data/lib/pubid/ieee/identifiers/redlined_standard.rb +4 -4
  255. data/lib/pubid/ieee/identifiers/si_standard.rb +4 -1
  256. data/lib/pubid/ieee/identifiers/standard.rb +4 -1
  257. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +26 -7
  258. data/lib/pubid/ieee/identifiers.rb +2 -1
  259. data/lib/pubid/ieee/ire/builder.rb +7 -6
  260. data/lib/pubid/ieee/ire/identifier.rb +48 -33
  261. data/lib/pubid/ieee/nesc/builder.rb +33 -20
  262. data/lib/pubid/ieee/nesc/parser.rb +15 -14
  263. data/lib/pubid/ieee/parser.rb +461 -43
  264. data/lib/pubid/ieee/pre_parser.rb +1 -1
  265. data/lib/pubid/ieee/renderer.rb +154 -57
  266. data/lib/pubid/ieee/typed_stages.rb +12 -1
  267. data/lib/pubid/ieee/urn_generator.rb +3 -5
  268. data/lib/pubid/ieee.rb +56 -3
  269. data/lib/pubid/ietf/builder.rb +62 -0
  270. data/lib/pubid/ietf/identifier.rb +5 -0
  271. data/lib/pubid/ietf/identifiers/base.rb +75 -0
  272. data/lib/pubid/ietf/identifiers/bcp.rb +25 -0
  273. data/lib/pubid/ietf/identifiers/fyi.rb +25 -0
  274. data/lib/pubid/ietf/identifiers/internet_draft.rb +29 -0
  275. data/lib/pubid/ietf/identifiers/rfc.rb +25 -0
  276. data/lib/pubid/ietf/identifiers/std.rb +25 -0
  277. data/lib/pubid/ietf/identifiers.rb +13 -0
  278. data/lib/pubid/ietf/parser.rb +43 -0
  279. data/lib/pubid/ietf/renderer.rb +26 -0
  280. data/lib/pubid/ietf/urn_generator.rb +23 -0
  281. data/lib/pubid/ietf/urn_parser.rb +35 -0
  282. data/lib/pubid/ietf.rb +76 -0
  283. data/lib/pubid/iho/identifier.rb +1 -3
  284. data/lib/pubid/iho/identifiers/base.rb +1 -7
  285. data/lib/pubid/iho/identifiers/bibliographic.rb +1 -1
  286. data/lib/pubid/iho/identifiers/circular_letter.rb +1 -1
  287. data/lib/pubid/iho/identifiers/miscellaneous.rb +1 -1
  288. data/lib/pubid/iho/identifiers/publication.rb +1 -1
  289. data/lib/pubid/iho/identifiers/standard.rb +1 -1
  290. data/lib/pubid/iho/identifiers.rb +0 -1
  291. data/lib/pubid/iho.rb +7 -7
  292. data/lib/pubid/isbn/builder.rb +44 -0
  293. data/lib/pubid/isbn/check_digit.rb +53 -0
  294. data/lib/pubid/isbn/identifier.rb +63 -0
  295. data/lib/pubid/isbn/identifiers/book.rb +30 -0
  296. data/lib/pubid/isbn/identifiers.rb +9 -0
  297. data/lib/pubid/isbn/parser.rb +45 -0
  298. data/lib/pubid/isbn/renderer.rb +16 -0
  299. data/lib/pubid/isbn.rb +52 -0
  300. data/lib/pubid/iso/builder.rb +9 -4
  301. data/lib/pubid/iso/combined_identifier.rb +2 -2
  302. data/lib/pubid/iso/identifier.rb +17 -1
  303. data/lib/pubid/iso/identifiers/directives_supplement.rb +8 -8
  304. data/lib/pubid/iso/normalizer.rb +2 -2
  305. data/lib/pubid/iso/parser.rb +16 -12
  306. data/lib/pubid/iso/supplement_identifier.rb +19 -6
  307. data/lib/pubid/iso/urn_generator.rb +4 -1
  308. data/lib/pubid/iso/urn_parser.rb +1 -1
  309. data/lib/pubid/itu/builder.rb +230 -29
  310. data/lib/pubid/itu/components/code.rb +48 -5
  311. data/lib/pubid/itu/components/designation.rb +35 -0
  312. data/lib/pubid/itu/components.rb +1 -0
  313. data/lib/pubid/itu/identifier.rb +1 -3
  314. data/lib/pubid/itu/identifiers/addendum.rb +15 -0
  315. data/lib/pubid/itu/identifiers/amendment.rb +6 -28
  316. data/lib/pubid/itu/identifiers/annex.rb +13 -2
  317. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
  318. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
  319. data/lib/pubid/itu/identifiers/base.rb +341 -23
  320. data/lib/pubid/itu/identifiers/combined_identifier.rb +99 -23
  321. data/lib/pubid/itu/identifiers/corrigendum.rb +16 -23
  322. data/lib/pubid/itu/identifiers/errata.rb +15 -0
  323. data/lib/pubid/itu/identifiers/handbook.rb +38 -0
  324. data/lib/pubid/itu/identifiers/question.rb +63 -0
  325. data/lib/pubid/itu/identifiers/recommendation.rb +3 -2
  326. data/lib/pubid/itu/identifiers/report.rb +39 -0
  327. data/lib/pubid/itu/identifiers/special_publication.rb +3 -1
  328. data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
  329. data/lib/pubid/itu/identifiers/supplement.rb +119 -14
  330. data/lib/pubid/itu/identifiers.rb +10 -1
  331. data/lib/pubid/itu/model.rb +1 -1
  332. data/lib/pubid/itu/parser.rb +480 -26
  333. data/lib/pubid/itu/urn_generator.rb +36 -6
  334. data/lib/pubid/itu/urn_parser.rb +8 -0
  335. data/lib/pubid/itu.rb +11 -3
  336. data/lib/pubid/jcgm/builder.rb +23 -13
  337. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -2
  338. data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
  339. data/lib/pubid/jcgm/identifiers/gum_guide.rb +3 -3
  340. data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
  341. data/lib/pubid/jcgm/identifiers.rb +2 -0
  342. data/lib/pubid/jcgm/parser.rb +66 -6
  343. data/lib/pubid/jcgm/renderer.rb +26 -12
  344. data/lib/pubid/jcgm/single_identifier.rb +74 -5
  345. data/lib/pubid/jcgm/supplement_identifier.rb +39 -4
  346. data/lib/pubid/jcgm/urn_generator.rb +21 -13
  347. data/lib/pubid/jcgm/urn_parser.rb +15 -3
  348. data/lib/pubid/jis/identifier.rb +52 -0
  349. data/lib/pubid/nist/builder.rb +29 -9
  350. data/lib/pubid/nist/caster.rb +7 -45
  351. data/lib/pubid/nist/circular_supplement_builder.rb +7 -5
  352. data/lib/pubid/nist/components/supplement.rb +5 -2
  353. data/lib/pubid/nist/configuration.rb +7 -1
  354. data/lib/pubid/nist/identifier.rb +1 -3
  355. data/lib/pubid/nist/identifiers/base.rb +121 -37
  356. data/lib/pubid/nist/identifiers/circular.rb +1 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard.rb +1 -1
  358. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +1 -1
  359. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +1 -1
  360. data/lib/pubid/nist/identifiers/crpl_report.rb +1 -1
  361. data/lib/pubid/nist/identifiers/dated_document.rb +1 -1
  362. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +1 -1
  363. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +1 -1
  364. data/lib/pubid/nist/identifiers/handbook.rb +1 -1
  365. data/lib/pubid/nist/identifiers/internal_report.rb +1 -1
  366. data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
  367. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +1 -1
  368. data/lib/pubid/nist/identifiers/monograph.rb +1 -1
  369. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  370. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  371. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  372. data/lib/pubid/nist/identifiers/report.rb +1 -1
  373. data/lib/pubid/nist/identifiers/special_publication.rb +10 -1
  374. data/lib/pubid/nist/identifiers/technical_note.rb +1 -1
  375. data/lib/pubid/nist/identifiers.rb +0 -1
  376. data/lib/pubid/nist/parser.rb +29 -4
  377. data/lib/pubid/nist/preprocessor.rb +15 -0
  378. data/lib/pubid/nist/router.rb +3 -2
  379. data/lib/pubid/nist/series/ir.rb +0 -3
  380. data/lib/pubid/nist/supplement_identifier.rb +9 -9
  381. data/lib/pubid/nist.rb +13 -12
  382. data/lib/pubid/oasis/builder.rb +77 -0
  383. data/lib/pubid/oasis/identifier.rb +82 -0
  384. data/lib/pubid/oasis/identifiers/standard.rb +29 -0
  385. data/lib/pubid/oasis/identifiers.rb +9 -0
  386. data/lib/pubid/oasis/parser.rb +34 -0
  387. data/lib/pubid/oasis/renderer.rb +29 -0
  388. data/lib/pubid/oasis/urn_generator.rb +25 -0
  389. data/lib/pubid/oasis/urn_parser.rb +22 -0
  390. data/lib/pubid/oasis.rb +74 -0
  391. data/lib/pubid/ogc/builder.rb +33 -0
  392. data/lib/pubid/ogc/identifier.rb +77 -0
  393. data/lib/pubid/ogc/identifiers/document.rb +26 -0
  394. data/lib/pubid/ogc/identifiers.rb +10 -0
  395. data/lib/pubid/ogc/parser.rb +40 -0
  396. data/lib/pubid/ogc/renderer.rb +33 -0
  397. data/lib/pubid/ogc/urn_generator.rb +14 -0
  398. data/lib/pubid/ogc/urn_parser.rb +22 -0
  399. data/lib/pubid/ogc.rb +71 -0
  400. data/lib/pubid/oiml/builder.rb +31 -7
  401. data/lib/pubid/oiml/identifier.rb +9 -1
  402. data/lib/pubid/oiml/parser.rb +11 -12
  403. data/lib/pubid/oiml/renderer.rb +13 -13
  404. data/lib/pubid/oiml/single_identifier.rb +20 -0
  405. data/lib/pubid/oiml/supplement_identifier.rb +9 -9
  406. data/lib/pubid/oiml/urn_parser.rb +23 -6
  407. data/lib/pubid/oiml.rb +4 -0
  408. data/lib/pubid/omg/builder.rb +19 -0
  409. data/lib/pubid/omg/identifier.rb +44 -0
  410. data/lib/pubid/omg/identifiers/specification.rb +32 -0
  411. data/lib/pubid/omg/identifiers.rb +9 -0
  412. data/lib/pubid/omg/parser.rb +40 -0
  413. data/lib/pubid/omg/renderer.rb +19 -0
  414. data/lib/pubid/omg.rb +51 -0
  415. data/lib/pubid/parsers/mr_string.rb +101 -7
  416. data/lib/pubid/plateau/builder.rb +8 -4
  417. data/lib/pubid/plateau/identifier.rb +1 -3
  418. data/lib/pubid/plateau/identifiers/base.rb +1 -6
  419. data/lib/pubid/plateau/identifiers/handbook.rb +1 -1
  420. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  421. data/lib/pubid/plateau/identifiers.rb +0 -1
  422. data/lib/pubid/plateau/parser.rb +15 -5
  423. data/lib/pubid/plateau/renderer.rb +1 -1
  424. data/lib/pubid/plateau/supplement_identifier.rb +11 -11
  425. data/lib/pubid/plateau.rb +4 -4
  426. data/lib/pubid/renderers/human_readable.rb +3 -1
  427. data/lib/pubid/renderers/mr_string.rb +46 -4
  428. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  429. data/lib/pubid/rendering/supplement.rb +4 -4
  430. data/lib/pubid/sae/builder.rb +1 -1
  431. data/lib/pubid/sae/identifier.rb +1 -3
  432. data/lib/pubid/sae/identifiers/base.rb +10 -7
  433. data/lib/pubid/sae/identifiers.rb +0 -1
  434. data/lib/pubid/sae.rb +3 -3
  435. data/lib/pubid/tgpp/builder.rb +41 -0
  436. data/lib/pubid/tgpp/identifier.rb +91 -0
  437. data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
  438. data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
  439. data/lib/pubid/tgpp/identifiers.rb +11 -0
  440. data/lib/pubid/tgpp/parser.rb +62 -0
  441. data/lib/pubid/tgpp/renderer.rb +36 -0
  442. data/lib/pubid/tgpp/urn_generator.rb +20 -0
  443. data/lib/pubid/tgpp/urn_parser.rb +28 -0
  444. data/lib/pubid/tgpp.rb +78 -0
  445. data/lib/pubid/type_resolver.rb +59 -0
  446. data/lib/pubid/un/builder.rb +42 -0
  447. data/lib/pubid/un/identifier.rb +37 -0
  448. data/lib/pubid/un/identifiers/document.rb +24 -0
  449. data/lib/pubid/un/identifiers.rb +9 -0
  450. data/lib/pubid/un/parser.rb +25 -0
  451. data/lib/pubid/un/renderer.rb +11 -0
  452. data/lib/pubid/un.rb +46 -0
  453. data/lib/pubid/version.rb +1 -1
  454. data/lib/pubid/w3c/builder.rb +55 -0
  455. data/lib/pubid/w3c/identifier.rb +101 -0
  456. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
  457. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
  458. data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
  459. data/lib/pubid/w3c/identifiers/note.rb +30 -0
  460. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
  461. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
  462. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
  463. data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
  464. data/lib/pubid/w3c/identifiers/standard.rb +12 -0
  465. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
  466. data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
  467. data/lib/pubid/w3c/identifiers.rb +25 -0
  468. data/lib/pubid/w3c/parser.rb +43 -0
  469. data/lib/pubid/w3c/renderer.rb +35 -0
  470. data/lib/pubid/w3c/urn_generator.rb +18 -0
  471. data/lib/pubid/w3c/urn_parser.rb +36 -0
  472. data/lib/pubid/w3c.rb +67 -0
  473. data/lib/pubid/xsf/builder.rb +17 -0
  474. data/lib/pubid/xsf/identifier.rb +62 -0
  475. data/lib/pubid/xsf/identifiers/xep.rb +31 -0
  476. data/lib/pubid/xsf/identifiers.rb +9 -0
  477. data/lib/pubid/xsf/parser.rb +25 -0
  478. data/lib/pubid/xsf/renderer.rb +23 -0
  479. data/lib/pubid/xsf/urn_generator.rb +13 -0
  480. data/lib/pubid/xsf/urn_parser.rb +18 -0
  481. data/lib/pubid/xsf.rb +76 -0
  482. data/lib/pubid.rb +25 -1
  483. metadata +205 -4
  484. data/lib/pubid/cie/components/code.rb +0 -80
  485. data/lib/pubid/iala/identifiers/base.rb +0 -14
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ # CalConnect (The Calendaring and Scheduling Consortium) flavor.
5
+ #
6
+ # Parses/renders the "CC …" numbering, e.g. "CC 18011:2018",
7
+ # "CC/DIR 10006:2019", "CC/Adv 0707.1:2007". Modeled on Pubid::Jis: a single
8
+ # flat identifier type (Identifiers::Standard) with no supplement layer.
9
+ module Calconnect
10
+ extend Pubid::PrefixesSupport
11
+
12
+ # Sole CalConnect publisher/leading token. Series letters (A, WD, R, S, CD,
13
+ # DIR, Adv, FDS) follow "CC/" and never lead a reference, so they are
14
+ # excluded per the PrefixesSupport inclusion policy.
15
+ PREFIXES = ["CC"].freeze
16
+
17
+ autoload :Builder, "#{__dir__}/calconnect/builder"
18
+ autoload :Identifier, "#{__dir__}/calconnect/identifier"
19
+ autoload :Identifiers, "#{__dir__}/calconnect/identifiers"
20
+ autoload :Parser, "#{__dir__}/calconnect/parser"
21
+ autoload :Renderer, "#{__dir__}/calconnect/renderer"
22
+ autoload :UrnGenerator, "#{__dir__}/calconnect/urn_generator"
23
+ autoload :UrnParser, "#{__dir__}/calconnect/urn_parser"
24
+
25
+ # Parse a CalConnect identifier string
26
+ def self.parse(identifier)
27
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
28
+ raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
29
+ end
30
+
31
+ Identifier.parse(identifier)
32
+ end
33
+
34
+ # Per-flavor format registry: inherits global formats, overrides :human
35
+ Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
36
+ Identifier.format_registry.register(:human, renderer: Calconnect::Renderer)
37
+
38
+ # Auto-discover all identifier types from the Identifiers namespace
39
+ # @return [Array<Class>] identifier classes that define a self.type Hash
40
+ def self.identifier_types
41
+ @identifier_types ||= Identifiers.constants
42
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
43
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
44
+ .select { |c| c.type.is_a?(Hash) }
45
+ end
46
+
47
+ # Build typed stage index from identifier types
48
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
49
+ def self.all_typed_stages
50
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
51
+ if klass.const_defined?(:TYPED_STAGES)
52
+ klass.const_get(:TYPED_STAGES)
53
+ else
54
+ []
55
+ end
56
+ end
57
+ end
58
+
59
+ # Lookup: type code -> identifier class
60
+ # @param code [String, Symbol] the type key to find
61
+ # @return [Class, nil] the matching identifier class
62
+ def self.locate_type(code)
63
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
64
+ end
65
+
66
+ # Lookup: abbreviation -> typed stage
67
+ # @param abbr [String, Symbol] the abbreviation to find
68
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
69
+ def self.locate_stage(abbr)
70
+ abbr_str = abbr.to_s.upcase
71
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
72
+ end
73
+ end
74
+ end
75
+
76
+ # Register CalConnect flavor with the registry
77
+ Pubid::Registry.register(:calconnect, Pubid::Calconnect)
@@ -47,7 +47,7 @@ module Pubid
47
47
  # If multiple corrigenda exist, we build the last one wrapping the base
48
48
  corr_numbers.reduce(base) do |current_base, cor_num|
49
49
  Identifiers::Corrigendum.new(
50
- base_identifier: current_base,
50
+ base: current_base,
51
51
  number: cor_num,
52
52
  )
53
53
  end
@@ -10,7 +10,7 @@ module Pubid
10
10
  #
11
11
  # Keeping the root abstract (it is never itself a serialized type, so it is
12
12
  # absent from CCSDS_TYPE_MAP) is what breaks the polymorphic recursion a
13
- # supplement's `base_identifier` would otherwise hit if it pointed at a
13
+ # supplement's `base` would otherwise hit if it pointed at a
14
14
  # concrete type that is also its own superclass.
15
15
  class Identifier < ::Pubid::Identifier
16
16
  # CCSDS stores every code component as a plain string (the Builder passes
@@ -25,14 +25,14 @@ module Pubid
25
25
  # attribute (mirroring ISO), so it serializes via Base's key_value as
26
26
  # { _type, number: '1', base: {...} } with no corrigendum-specific map.
27
27
  def to_s
28
- base_str = base_identifier.to_s
28
+ base_str = base.to_s
29
29
  "#{base_str} Cor. #{number}"
30
30
  end
31
31
 
32
32
  def ==(other)
33
33
  return false unless other.is_a?(Corrigendum)
34
34
 
35
- base_identifier == other.base_identifier && number == other.number
35
+ base == other.base && number == other.number
36
36
  end
37
37
  end
38
38
  end
@@ -4,28 +4,28 @@ module Pubid
4
4
  module Ccsds
5
5
  # Base class for CCSDS supplements (corrigenda, amendments, etc.).
6
6
  # Descends from the abstract root (not the concrete Base) and points
7
- # `base_identifier` at the root, so the polymorphic attribute never
7
+ # `base` at the root, so the polymorphic attribute never
8
8
  # resolves to its own superclass — which is what prevents lutaml from
9
9
  # recursing forever while building a supplement from a hash.
10
10
  class SupplementIdentifier < Identifier
11
- attribute :base_identifier, Identifier, polymorphic: true
11
+ attribute :base, Identifier, polymorphic: true
12
12
 
13
13
  # Serialize the supplemented identifier under "base" (matches ISO/JIS).
14
- # The key stays `base_identifier` for the attribute/getter, which
14
+ # The key stays `base` for the attribute/getter, which
15
15
  # relaton-index's get_id_number relies on. A supplement's own code
16
16
  # attributes (number/part/edition/...) stay nil — they live inside
17
17
  # `base` — so the merged root key_value omits them here, keeping the
18
18
  # serialization lean and non-duplicated.
19
19
  key_value do
20
- map "base", to: :base_identifier
20
+ map "base", to: :base
21
21
  end
22
22
 
23
23
  def <=>(other)
24
24
  return nil unless other.is_a?(SupplementIdentifier)
25
25
 
26
26
  # Compare base identifiers first
27
- if base_identifier && other.base_identifier
28
- base_cmp = base_identifier <=> other.base_identifier
27
+ if base && other.base
28
+ base_cmp = base <=> other.base
29
29
  return base_cmp unless base_cmp.zero?
30
30
  end
31
31
 
@@ -91,14 +91,14 @@ module Pubid
91
91
 
92
92
  while current.is_a?(SupplementIdentifier)
93
93
  supplement_chain.unshift(current)
94
- current = current.base_identifier
94
+ current = current.base
95
95
  end
96
96
 
97
97
  base_gen = self.class.new(current)
98
98
  base_urn = base_gen.generate_base_urn
99
99
 
100
- base_identifier_part = base_urn.sub(/^urn:ccsds:/, "")
101
- parts << base_identifier_part
100
+ base_part = base_urn.sub(/^urn:ccsds:/, "")
101
+ parts << base_part
102
102
 
103
103
  supplement_chain.each do |supp|
104
104
  if supp.number && !supp.number.to_s.empty?
@@ -33,6 +33,22 @@ module Pubid
33
33
  return build_standalone_supplement(data)
34
34
  end
35
35
 
36
+ # Implicit adoption: when an EN has no explicit "IEC" prefix but
37
+ # the number falls in the IEC range (60000-79999), treat it as an
38
+ # adoption of the corresponding IEC standard. The lower ISO-only
39
+ # range (1-59999) is intentionally NOT mapped here — too many
40
+ # existing CEN publications (EN Guide N, EN N as a real CEN-assigned
41
+ # number) would change type. Callers who want explicit adoption
42
+ # can still write "EN ISO 12345".
43
+ # (https://github.com/pubid/pubid/issues/249)
44
+ # Skip when parts are present — they would be lost when we rebuild
45
+ # the identifier from just the base number.
46
+ if data[:publisher]&.to_s == "EN" && !data[:adopted_string] &&
47
+ data[:parts].to_a.empty? &&
48
+ (adopted = build_implicit_adoption(data))
49
+ return adopted
50
+ end
51
+
36
52
  # Extract supplements before building base identifier (only plus/bundled)
37
53
  supplements_data = extract_supplements(data)
38
54
 
@@ -56,18 +72,18 @@ module Pubid
56
72
  base_data.delete(:amendment_number)
57
73
  base_data.delete(:fragment_number)
58
74
 
59
- base_identifier = locate_identifier_klass(base_data).new
60
- assign_attributes(base_identifier, base_data)
75
+ base = locate_identifier_klass(base_data).new
76
+ assign_attributes(base, base_data)
61
77
 
62
78
  # Build Amendment identifier wrapping the base
63
79
  amendment = Identifiers::Amendment.new(
64
- base_identifier: base_identifier,
80
+ base: base,
65
81
  amendment_number: data[:amendment_number].to_s,
66
82
  )
67
83
 
68
84
  # Build Fragment wrapping the amendment
69
85
  Identifiers::Fragment.new(
70
- base_identifier: amendment,
86
+ base: amendment,
71
87
  fragment_number: data[:fragment_number].to_s,
72
88
  )
73
89
  end
@@ -207,6 +223,24 @@ module Pubid
207
223
  )
208
224
  end
209
225
 
226
+ # Implicit adoption by number range. Returns an AdoptedEuropeanNorm
227
+ # wrapping the IEC identifier that the EN number implies, or nil if the
228
+ # number doesn't fall in the IEC range. Limited to IEC range only —
229
+ # see the call site comment for why the ISO range is excluded.
230
+ def build_implicit_adoption(data)
231
+ number = data[:number].to_s
232
+ num_str = number.to_s.strip
233
+ return nil unless num_str.match?(/\A\d{1,6}\z/)
234
+
235
+ num = num_str.to_i
236
+ return nil unless (60_000..79_999).cover?(num)
237
+
238
+ Identifiers::AdoptedEuropeanNorm.new(
239
+ publisher: ["EN"],
240
+ adopted_identifier: Pubid::Iec.parse("IEC #{num_str}"),
241
+ )
242
+ end
243
+
210
244
  def build_env_adopted_identifier(data)
211
245
  # Parse the adopted identifier string
212
246
  adopted_str = data[:adopted_string]&.to_s&.strip
@@ -225,17 +259,17 @@ module Pubid
225
259
  )
226
260
  end
227
261
 
228
- def wrap_with_consolidated(base_identifier, supplements_data)
262
+ def wrap_with_consolidated(base, supplements_data)
229
263
  supplement_ids = supplements_data.map do |supp|
230
264
  if supp[:type] == :amendment
231
265
  Identifiers::Amendment.new(
232
- base_identifier: base_identifier,
266
+ base: base,
233
267
  amendment_number: supp[:number],
234
268
  amendment_year: supp[:year]&.to_i,
235
269
  )
236
270
  else
237
271
  corr_attrs = {
238
- base_identifier: base_identifier,
272
+ base: base,
239
273
  corrigendum_number: supp[:number],
240
274
  corrigendum_year: supp[:year]&.to_i,
241
275
  }
@@ -245,7 +279,7 @@ module Pubid
245
279
  end
246
280
 
247
281
  Identifiers::ConsolidatedIdentifier.new(
248
- identifiers: [base_identifier] + supplement_ids,
282
+ identifiers: [base] + supplement_ids,
249
283
  )
250
284
  end
251
285
 
@@ -294,8 +328,8 @@ module Pubid
294
328
  # Build base identifier first (without supplements)
295
329
  base_data = data.dup
296
330
  base_data.delete(:supplements)
297
- base_identifier = locate_identifier_klass(base_data).new
298
- assign_attributes(base_identifier, base_data)
331
+ base = locate_identifier_klass(base_data).new
332
+ assign_attributes(base, base_data)
299
333
 
300
334
  # Get the first supplement (slash means only one supplement)
301
335
  supp_array = data[:supplements]
@@ -305,13 +339,13 @@ module Pubid
305
339
  # Build appropriate supplement identifier
306
340
  if supp_data[:amd_number]
307
341
  Identifiers::Amendment.new(
308
- base_identifier: base_identifier,
342
+ base: base,
309
343
  amendment_number: supp_data[:amd_number].to_s,
310
344
  amendment_year: supp_data[:amd_year]&.to_i,
311
345
  )
312
346
  else
313
347
  corr_attrs = {
314
- base_identifier: base_identifier,
348
+ base: base,
315
349
  corrigendum_number: supp_data[:cor_number]&.to_s,
316
350
  corrigendum_year: (supp_data[:cor_year] || supp_data[:year])&.to_i,
317
351
  }
@@ -6,12 +6,12 @@ module Pubid
6
6
  # Amendment Identifier
7
7
  # Contains a base identifier plus amendment parameters
8
8
  class Amendment < Base
9
- attribute :base_identifier, Base, polymorphic: true
9
+ attribute :base, Base, polymorphic: true
10
10
  attribute :amendment_number, :string
11
11
  attribute :amendment_year, :integer
12
12
 
13
13
  def publisher
14
- base_identifier&.publisher
14
+ base&.publisher
15
15
  end
16
16
  end
17
17
  end
@@ -28,6 +28,12 @@ module Pubid
28
28
  def type
29
29
  identifiers&.first&.type
30
30
  end
31
+
32
+ # The origin document. Members live in `identifiers` (not `base`), so
33
+ # walk the first member to its root.
34
+ def root
35
+ identifiers&.first&.root || self
36
+ end
31
37
  end
32
38
  end
33
39
  end
@@ -6,13 +6,13 @@ module Pubid
6
6
  # Corrigendum Identifier
7
7
  # Contains a base identifier plus corrigendum parameters
8
8
  class Corrigendum < Base
9
- attribute :base_identifier, Base, polymorphic: true
9
+ attribute :base, Base, polymorphic: true
10
10
  attribute :corrigendum_number, :string
11
11
  attribute :corrigendum_year, :integer
12
12
  attribute :corrigendum_month, :string
13
13
 
14
14
  def publisher
15
- base_identifier&.publisher
15
+ base&.publisher
16
16
  end
17
17
  end
18
18
  end
@@ -6,29 +6,86 @@ module Pubid
6
6
  # European Norm (EN) identifier
7
7
  class EuropeanNorm < SingleIdentifier
8
8
  TYPED_STAGES = [
9
+ # Published (puben): 60.00-60.60 + publication milestones (65.xx)
9
10
  Components::TypedStage.new(
10
11
  code: :puben,
11
12
  stage_code: :published,
12
13
  type_code: :en,
13
14
  abbr: ["EN"],
14
15
  name: "European Norm",
15
- harmonized_stages: %w[60.00 60.60],
16
+ harmonized_stages: %w[60.00 60.55 60.60 65.31 65.51 65.62],
16
17
  ),
18
+ # Preliminary (pwien): proposal/WI stages
19
+ Components::TypedStage.new(
20
+ code: :pwien,
21
+ stage_code: :preliminary,
22
+ type_code: :en,
23
+ abbr: ["pWI EN"],
24
+ name: "Preliminary Work Item EN",
25
+ harmonized_stages: %w[00.60 10.98 10.99 20.60],
26
+ ),
27
+ # Proposal (pren): working draft stages + split/merge interruption end
17
28
  Components::TypedStage.new(
18
29
  code: :pren,
19
30
  stage_code: :proposal,
20
31
  type_code: :en,
21
32
  abbr: ["prEN"],
22
33
  name: "Proposal European Norm",
23
- harmonized_stages: %w[30.00 30.20 30.60 30.92 30.98 30.99],
34
+ harmonized_stages: %w[30.00 30.20 30.60 30.92 30.97 30.98 30.99],
24
35
  ),
36
+ # Final Proposal (fpren): enquiry stages
25
37
  Components::TypedStage.new(
26
38
  code: :fpren,
27
39
  stage_code: :final_proposal,
28
40
  type_code: :en,
29
41
  abbr: ["FprEN"],
30
42
  name: "Final Proposal European Norm",
31
- harmonized_stages: %w[40.00 40.20 40.60 40.92 40.98 40.99],
43
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.97 40.98 40.99],
44
+ ),
45
+ # Formal Vote (fven): COCOR + FV dispatch stages
46
+ Components::TypedStage.new(
47
+ code: :fven,
48
+ stage_code: :formal_vote,
49
+ type_code: :en,
50
+ abbr: ["FV prEN"],
51
+ name: "Formal Vote EN",
52
+ harmonized_stages: %w[43.20 43.60 43.97 43.98 45.97 45.98 45.99],
53
+ ),
54
+ # Vote (ven): enquiry/vote stages
55
+ Components::TypedStage.new(
56
+ code: :ven,
57
+ stage_code: :vote,
58
+ type_code: :en,
59
+ abbr: ["vEN"],
60
+ name: "Vote EN",
61
+ harmonized_stages: %w[50.20 50.60 50.97 50.98],
62
+ ),
63
+ # Review (rven): 2-year review stages
64
+ Components::TypedStage.new(
65
+ code: :rven,
66
+ stage_code: :review,
67
+ type_code: :en,
68
+ abbr: ["rvEN"],
69
+ name: "Review EN",
70
+ harmonized_stages: %w[90.00 90.20 90.60 90.92 90.93 90.98],
71
+ ),
72
+ # Reactivation (racen): re-activation stage
73
+ Components::TypedStage.new(
74
+ code: :racen,
75
+ stage_code: :reactivation,
76
+ type_code: :en,
77
+ abbr: ["racEN"],
78
+ name: "Re-activated EN",
79
+ harmonized_stages: %w[96.60],
80
+ ),
81
+ # Withdrawn (wden): withdrawal stage
82
+ Components::TypedStage.new(
83
+ code: :wden,
84
+ stage_code: :withdrawn,
85
+ type_code: :en,
86
+ abbr: ["wdEN"],
87
+ name: "Withdrawn EN",
88
+ harmonized_stages: %w[99.60],
32
89
  ),
33
90
  ].freeze
34
91
 
@@ -6,11 +6,11 @@ module Pubid
6
6
  # Fragment Identifier - wraps an Amendment with a fragment number
7
7
  # Example: "EN 60038 AMD1 FRAG2" = Fragment 2 of Amendment 1 to EN 60038
8
8
  class Fragment < Base
9
- attribute :base_identifier, Amendment
9
+ attribute :base, Amendment
10
10
  attribute :fragment_number, :string
11
11
 
12
12
  def publisher
13
- base_identifier&.base_identifier&.publisher
13
+ base&.base&.publisher
14
14
  end
15
15
  end
16
16
  end
@@ -190,8 +190,8 @@ module Pubid
190
190
 
191
191
  # Amendment: "EN 196-3:2005/A1:2008"
192
192
  def render_amendment(id)
193
- result = if id.base_identifier
194
- "#{id.base_identifier}/A#{id.amendment_number}"
193
+ result = if id.base
194
+ "#{id.base}/A#{id.amendment_number}"
195
195
  else
196
196
  "/A#{id.amendment_number}"
197
197
  end
@@ -201,8 +201,8 @@ module Pubid
201
201
 
202
202
  # Corrigendum: "EN 60038/AC1:2012"
203
203
  def render_corrigendum(id)
204
- if id.base_identifier
205
- result = id.base_identifier.to_s
204
+ if id.base
205
+ result = id.base.to_s
206
206
  result += "/AC"
207
207
  result += id.corrigendum_number if id.corrigendum_number && !id.corrigendum_number.empty?
208
208
  else
@@ -245,7 +245,7 @@ module Pubid
245
245
 
246
246
  # Fragment: "EN 60038 AMD1 FRAG2"
247
247
  def render_fragment(id)
248
- "#{id.base_identifier} FRAG#{id.fragment_number}"
248
+ "#{id.base} FRAG#{id.fragment_number}"
249
249
  end
250
250
 
251
251
  # EuropeanPrestandard: "ENV ISO 8601" or falls through to SingleIdentifier
@@ -5,27 +5,27 @@ require "lutaml/model"
5
5
  module Pubid
6
6
  module CenCenelec
7
7
  class SupplementIdentifier < Identifiers::Base
8
- attribute :base_identifier, Identifiers::Base, polymorphic: true
8
+ attribute :base, Identifiers::Base, polymorphic: true
9
9
  attribute :number, Components::Code
10
10
  attribute :date, Components::Date
11
11
  attribute :stage, Components::Stage
12
12
  attribute :type, Components::Type
13
13
  attribute :typed_stage, Components::TypedStage
14
14
 
15
- # Delegate methods to base_identifier for convenient access
15
+ # Delegate methods to base for convenient access
16
16
  def publisher
17
- base_identifier&.publisher
17
+ base&.publisher
18
18
  end
19
19
 
20
20
  def copublishers
21
- base_identifier&.copublishers
21
+ base&.copublishers
22
22
  end
23
23
 
24
24
  def <=>(other)
25
25
  return nil unless other.is_a?(SupplementIdentifier)
26
26
 
27
27
  # Compare base identifiers first
28
- base_cmp = base_identifier <=> other.base_identifier
28
+ base_cmp = base <=> other.base
29
29
  return base_cmp unless base_cmp.zero?
30
30
 
31
31
  # Then compare numbers
@@ -78,7 +78,7 @@ module Pubid
78
78
  def generate_supplement_urn
79
79
  parts = ["urn", "cen"]
80
80
 
81
- base_id = maybe(:base_identifier)
81
+ base_id = maybe(:base)
82
82
  if base_id
83
83
  base_gen = self.class.new(base_id)
84
84
  base_urn = base_gen.generate_base_urn