pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.3

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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +25 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +7 -39
  6. data/lib/pubid/amca/identifiers/base.rb +0 -26
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -17
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -13
  9. data/lib/pubid/amca/renderer.rb +82 -0
  10. data/lib/pubid/amca/single_identifier.rb +0 -23
  11. data/lib/pubid/amca/urn_parser.rb +28 -0
  12. data/lib/pubid/amca.rb +42 -1
  13. data/lib/pubid/ansi/builder.rb +5 -3
  14. data/lib/pubid/ansi/identifier.rb +1 -43
  15. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  16. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  17. data/lib/pubid/ansi/renderer.rb +53 -0
  18. data/lib/pubid/ansi/single_identifier.rb +2 -31
  19. data/lib/pubid/ansi/urn_generator.rb +3 -38
  20. data/lib/pubid/ansi/urn_parser.rb +23 -0
  21. data/lib/pubid/ansi.rb +38 -3
  22. data/lib/pubid/api/builder.rb +29 -74
  23. data/lib/pubid/api/identifier.rb +0 -51
  24. data/lib/pubid/api/identifiers/base.rb +0 -2
  25. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  26. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  27. data/lib/pubid/api/identifiers/mpms.rb +1 -17
  28. data/lib/pubid/api/identifiers/publication.rb +0 -2
  29. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  30. data/lib/pubid/api/identifiers/specification.rb +0 -2
  31. data/lib/pubid/api/identifiers/standard.rb +0 -2
  32. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  33. data/lib/pubid/api/identifiers/typeless_standard.rb +1 -14
  34. data/lib/pubid/api/identifiers.rb +18 -0
  35. data/lib/pubid/api/renderer.rb +89 -0
  36. data/lib/pubid/api/single_identifier.rb +1 -13
  37. data/lib/pubid/api/urn_generator.rb +0 -18
  38. data/lib/pubid/api/urn_parser.rb +35 -0
  39. data/lib/pubid/api.rb +51 -5
  40. data/lib/pubid/ashrae/builder.rb +3 -3
  41. data/lib/pubid/ashrae/identifier.rb +6 -39
  42. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  43. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  44. data/lib/pubid/ashrae/identifiers/base.rb +3 -0
  45. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  46. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  47. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  48. data/lib/pubid/ashrae/renderer.rb +117 -0
  49. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  50. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  51. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  52. data/lib/pubid/ashrae.rb +42 -1
  53. data/lib/pubid/asme/components/code.rb +10 -2
  54. data/lib/pubid/asme/identifier.rb +0 -46
  55. data/lib/pubid/asme/identifiers/base.rb +0 -60
  56. data/lib/pubid/asme/renderer.rb +66 -0
  57. data/lib/pubid/asme/urn_parser.rb +31 -0
  58. data/lib/pubid/asme.rb +42 -1
  59. data/lib/pubid/astm/components/code.rb +9 -0
  60. data/lib/pubid/{jis → astm}/components.rb +1 -1
  61. data/lib/pubid/astm/identifier.rb +0 -77
  62. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  63. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  64. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  65. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  66. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  67. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  68. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  69. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  70. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  71. data/lib/pubid/astm/identifiers.rb +18 -0
  72. data/lib/pubid/astm/renderer.rb +172 -0
  73. data/lib/pubid/astm/single_identifier.rb +0 -10
  74. data/lib/pubid/astm/urn_parser.rb +30 -0
  75. data/lib/pubid/astm.rb +39 -27
  76. data/lib/pubid/bsi/builder.rb +21 -12
  77. data/lib/pubid/bsi/identifier.rb +8 -62
  78. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  79. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  80. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  81. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  82. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  83. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  84. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  85. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  87. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  88. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  89. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  90. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  91. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  92. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  93. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  94. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  95. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  96. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  97. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  98. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  99. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  100. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  101. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  102. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  103. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  104. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  105. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  106. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  107. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  108. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  109. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  110. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  111. data/lib/pubid/bsi/identifiers.rb +0 -1
  112. data/lib/pubid/bsi/renderer.rb +1050 -0
  113. data/lib/pubid/bsi/single_identifier.rb +6 -70
  114. data/lib/pubid/bsi/urn_generator.rb +2 -3
  115. data/lib/pubid/bsi/urn_parser.rb +52 -0
  116. data/lib/pubid/bsi.rb +224 -1
  117. data/lib/pubid/builder/base.rb +57 -10
  118. data/lib/pubid/bundled_identifier.rb +0 -1
  119. data/lib/pubid/ccsds/builder.rb +4 -3
  120. data/lib/pubid/ccsds/identifier.rb +63 -66
  121. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  122. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  123. data/lib/pubid/ccsds/parser.rb +4 -2
  124. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  125. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  126. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  127. data/lib/pubid/ccsds.rb +39 -1
  128. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  129. data/lib/pubid/cen_cenelec/identifier.rb +7 -38
  130. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  131. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  132. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  133. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  135. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  136. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  137. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  139. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  140. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  141. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  143. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  145. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  146. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  147. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  148. data/lib/pubid/cen_cenelec.rb +168 -1
  149. data/lib/pubid/cie/components/code.rb +8 -0
  150. data/lib/pubid/cie/identifier.rb +6 -57
  151. data/lib/pubid/cie/urn_parser.rb +28 -0
  152. data/lib/pubid/cie.rb +43 -1
  153. data/lib/pubid/components/adoption.rb +104 -0
  154. data/lib/pubid/components/code.rb +22 -8
  155. data/lib/pubid/components/date.rb +23 -16
  156. data/lib/pubid/components/edition.rb +9 -6
  157. data/lib/pubid/components/iteration.rb +32 -0
  158. data/lib/pubid/components/language.rb +6 -4
  159. data/lib/pubid/components/locality.rb +10 -1
  160. data/lib/pubid/components/publisher.rb +9 -6
  161. data/lib/pubid/components/relationship.rb +151 -0
  162. data/lib/pubid/components/stage.rb +5 -14
  163. data/lib/pubid/components/supplement.rb +184 -0
  164. data/lib/pubid/components/type.rb +5 -15
  165. data/lib/pubid/components/typed_stage.rb +10 -11
  166. data/lib/pubid/components.rb +4 -1
  167. data/lib/pubid/core/update_codes.rb +28 -7
  168. data/lib/pubid/csa/identifier.rb +0 -59
  169. data/lib/pubid/csa/identifiers/base.rb +2 -122
  170. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  171. data/lib/pubid/csa/identifiers/series.rb +2 -102
  172. data/lib/pubid/csa/renderer.rb +292 -0
  173. data/lib/pubid/csa/urn_generator.rb +1 -1
  174. data/lib/pubid/csa/urn_parser.rb +33 -0
  175. data/lib/pubid/csa.rb +42 -1
  176. data/lib/pubid/etsi/components/code.rb +9 -2
  177. data/lib/pubid/etsi/identifier.rb +0 -43
  178. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  179. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  180. data/lib/pubid/etsi/renderer.rb +42 -0
  181. data/lib/pubid/etsi/urn_parser.rb +34 -0
  182. data/lib/pubid/etsi.rb +42 -1
  183. data/lib/pubid/export/exporter.rb +4 -46
  184. data/lib/pubid/export/flavor_exporter.rb +111 -278
  185. data/lib/pubid/export.rb +0 -6
  186. data/lib/pubid/identifier.rb +2 -17
  187. data/lib/pubid/identifier_facade.rb +114 -0
  188. data/lib/pubid/identifier_metadata.rb +1 -1
  189. data/lib/pubid/idf/builder.rb +3 -3
  190. data/lib/pubid/idf/identifier.rb +3 -66
  191. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  192. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  193. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  194. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  195. data/lib/pubid/idf/parser.rb +3 -2
  196. data/lib/pubid/idf/renderer.rb +84 -0
  197. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  198. data/lib/pubid/idf/urn_generator.rb +4 -39
  199. data/lib/pubid/idf/urn_parser.rb +25 -0
  200. data/lib/pubid/idf.rb +51 -1
  201. data/lib/pubid/iec/builder.rb +46 -64
  202. data/lib/pubid/iec/components/code.rb +8 -32
  203. data/lib/pubid/iec/components/publisher.rb +0 -1
  204. data/lib/pubid/iec/components.rb +14 -0
  205. data/lib/pubid/iec/identifier.rb +251 -213
  206. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  207. data/lib/pubid/iec/identifiers/base.rb +8 -32
  208. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  209. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  210. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -26
  211. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  212. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -22
  213. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  214. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  215. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  216. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  217. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  218. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -11
  219. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  220. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  222. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  223. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  224. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  225. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -19
  226. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  227. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  228. data/lib/pubid/iec/identifiers.rb +30 -0
  229. data/lib/pubid/iec/parser.rb +13 -12
  230. data/lib/pubid/iec/renderer.rb +254 -0
  231. data/lib/pubid/iec/single_identifier.rb +6 -12
  232. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  233. data/lib/pubid/iec/urn_generator.rb +3 -3
  234. data/lib/pubid/iec/urn_parser.rb +3 -3
  235. data/lib/pubid/iec.rb +40 -68
  236. data/lib/pubid/ieee/builder.rb +12 -12
  237. data/lib/pubid/ieee/components/code.rb +8 -0
  238. data/lib/pubid/ieee/components/draft.rb +14 -0
  239. data/lib/pubid/ieee/components/relationship.rb +5 -149
  240. data/lib/pubid/ieee/identifier.rb +6 -41
  241. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  242. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  243. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  245. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  246. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  247. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  248. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  249. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  250. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  251. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  252. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  253. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  254. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  255. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  256. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  257. data/lib/pubid/ieee/pre_parser.rb +301 -0
  258. data/lib/pubid/ieee/renderer.rb +307 -0
  259. data/lib/pubid/ieee/urn_parser.rb +34 -0
  260. data/lib/pubid/ieee.rb +62 -1
  261. data/lib/pubid/ieee_debug.rb +0 -1
  262. data/lib/pubid/iho/builder.rb +2 -2
  263. data/lib/pubid/iho/identifier.rb +8 -42
  264. data/lib/pubid/iho/identifiers/base.rb +49 -10
  265. data/lib/pubid/iho/parser.rb +3 -3
  266. data/lib/pubid/iho/renderer.rb +30 -0
  267. data/lib/pubid/iho/urn_generator.rb +2 -2
  268. data/lib/pubid/iho/urn_parser.rb +58 -0
  269. data/lib/pubid/iho.rb +50 -1
  270. data/lib/pubid/iso/builder.rb +55 -53
  271. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  272. data/lib/pubid/iso/components/code.rb +7 -19
  273. data/lib/pubid/iso/components/publisher.rb +10 -8
  274. data/lib/pubid/iso/components.rb +2 -4
  275. data/lib/pubid/iso/identifier.rb +218 -252
  276. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  277. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  278. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  279. data/lib/pubid/iso/identifiers/data.rb +0 -1
  280. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  281. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  282. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  283. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  284. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  285. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  286. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  287. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  288. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  289. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  290. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  291. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  292. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  293. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  294. data/lib/pubid/iso/identifiers.rb +0 -1
  295. data/lib/pubid/iso/normalizer.rb +89 -0
  296. data/lib/pubid/iso/parser.rb +22 -4
  297. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  298. data/lib/pubid/iso/urn_generator.rb +66 -182
  299. data/lib/pubid/iso/urn_parser.rb +12 -7
  300. data/lib/pubid/iso.rb +173 -2
  301. data/lib/pubid/itu/builder.rb +0 -12
  302. data/lib/pubid/itu/components/code.rb +8 -0
  303. data/lib/pubid/itu/components.rb +11 -0
  304. data/lib/pubid/itu/identifier.rb +6 -104
  305. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  306. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  307. data/lib/pubid/itu/identifiers/base.rb +0 -6
  308. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  309. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  310. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  311. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  312. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  313. data/lib/pubid/itu/urn_parser.rb +23 -0
  314. data/lib/pubid/itu.rb +42 -1
  315. data/lib/pubid/jcgm/builder.rb +16 -8
  316. data/lib/pubid/jcgm/identifier.rb +0 -43
  317. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  318. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  319. data/lib/pubid/jcgm/renderer.rb +68 -0
  320. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  321. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  322. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  323. data/lib/pubid/jcgm.rb +43 -2
  324. data/lib/pubid/jis/builder.rb +44 -52
  325. data/lib/pubid/jis/identifier.rb +132 -46
  326. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  327. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  328. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  329. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  330. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  331. data/lib/pubid/jis/identifiers.rb +1 -1
  332. data/lib/pubid/jis/parser.rb +31 -5
  333. data/lib/pubid/jis/renderer.rb +69 -0
  334. data/lib/pubid/jis/single_identifier.rb +6 -12
  335. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  336. data/lib/pubid/jis/urn_parser.rb +23 -0
  337. data/lib/pubid/jis.rb +42 -2
  338. data/lib/pubid/nist/builder.rb +63 -1871
  339. data/lib/pubid/nist/caster.rb +1272 -0
  340. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  341. data/lib/pubid/nist/components/code.rb +9 -20
  342. data/lib/pubid/nist/components/supplement.rb +2 -2
  343. data/lib/pubid/nist/components.rb +0 -1
  344. data/lib/pubid/nist/identifier.rb +11 -48
  345. data/lib/pubid/nist/identifiers/base.rb +110 -47
  346. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  347. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  348. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  349. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  350. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  351. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  352. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  353. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  354. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  355. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  356. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  357. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  358. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  359. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  360. data/lib/pubid/nist/identifiers/report.rb +4 -2
  361. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  362. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  363. data/lib/pubid/nist/identifiers.rb +1 -0
  364. data/lib/pubid/nist/parser.rb +62 -452
  365. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  366. data/lib/pubid/nist/preprocessor.rb +416 -0
  367. data/lib/pubid/nist/renderer.rb +43 -0
  368. data/lib/pubid/nist/router.rb +148 -0
  369. data/lib/pubid/nist/series/base.rb +58 -0
  370. data/lib/pubid/nist/series/crpl.rb +13 -0
  371. data/lib/pubid/nist/series/fips.rb +14 -0
  372. data/lib/pubid/nist/series/ir.rb +60 -0
  373. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  374. data/lib/pubid/nist/series/mono.rb +19 -0
  375. data/lib/pubid/nist/series/ncstar.rb +20 -0
  376. data/lib/pubid/nist/series.rb +49 -0
  377. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  378. data/lib/pubid/nist/urn_parser.rb +67 -0
  379. data/lib/pubid/nist.rb +82 -4
  380. data/lib/pubid/oiml/components/code.rb +10 -0
  381. data/lib/pubid/oiml/identifier.rb +0 -50
  382. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  383. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  384. data/lib/pubid/oiml/renderer.rb +161 -0
  385. data/lib/pubid/oiml/single_identifier.rb +6 -45
  386. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  387. data/lib/pubid/oiml/urn_generator.rb +0 -8
  388. data/lib/pubid/oiml/urn_parser.rb +22 -0
  389. data/lib/pubid/oiml.rb +42 -1
  390. data/lib/pubid/plateau/identifier.rb +7 -41
  391. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  392. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  393. data/lib/pubid/plateau/renderer.rb +51 -0
  394. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  395. data/lib/pubid/plateau/urn_parser.rb +43 -0
  396. data/lib/pubid/plateau.rb +43 -1
  397. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  398. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  399. data/lib/pubid/renderers/human_readable.rb +18 -7
  400. data/lib/pubid/rendering/context.rb +28 -19
  401. data/lib/pubid/rendering.rb +0 -3
  402. data/lib/pubid/sae/components/date.rb +8 -0
  403. data/lib/pubid/sae/components/type.rb +5 -1
  404. data/lib/pubid/sae/identifier.rb +0 -23
  405. data/lib/pubid/sae/identifiers/base.rb +2 -16
  406. data/lib/pubid/sae/renderer.rb +36 -0
  407. data/lib/pubid/sae/urn_generator.rb +2 -10
  408. data/lib/pubid/sae/urn_parser.rb +36 -0
  409. data/lib/pubid/sae.rb +42 -1
  410. data/lib/pubid/urn_generator/base.rb +12 -12
  411. data/lib/pubid/urn_parser/base.rb +81 -0
  412. data/lib/pubid/urn_parser/errors.rb +9 -0
  413. data/lib/pubid/urn_parser.rb +14 -0
  414. data/lib/pubid/version.rb +1 -1
  415. data/lib/pubid.rb +29 -7
  416. data/lib/tasks/website-data.json +1940 -1882
  417. metadata +75 -44
  418. data/lib/pubid/amca/scheme.rb +0 -16
  419. data/lib/pubid/ansi/scheme.rb +0 -15
  420. data/lib/pubid/api/scheme.rb +0 -66
  421. data/lib/pubid/ashrae/scheme.rb +0 -53
  422. data/lib/pubid/asme/scheme.rb +0 -37
  423. data/lib/pubid/astm/scheme.rb +0 -55
  424. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  425. data/lib/pubid/bsi/scheme.rb +0 -243
  426. data/lib/pubid/ccsds/scheme.rb +0 -57
  427. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  428. data/lib/pubid/cie/scheme.rb +0 -64
  429. data/lib/pubid/components/factory.rb +0 -50
  430. data/lib/pubid/csa/scheme.rb +0 -44
  431. data/lib/pubid/etsi/scheme.rb +0 -42
  432. data/lib/pubid/export/data_class_exporter.rb +0 -59
  433. data/lib/pubid/export/ieee_exporter.rb +0 -78
  434. data/lib/pubid/export/itu_exporter.rb +0 -66
  435. data/lib/pubid/export/nist_exporter.rb +0 -64
  436. data/lib/pubid/export/registry_exporter.rb +0 -90
  437. data/lib/pubid/export/scheme_exporter.rb +0 -70
  438. data/lib/pubid/identifier_registry.rb +0 -198
  439. data/lib/pubid/idf/scheme.rb +0 -61
  440. data/lib/pubid/iec/scheme.rb +0 -71
  441. data/lib/pubid/ieee/scheme.rb +0 -90
  442. data/lib/pubid/iho/scheme.rb +0 -29
  443. data/lib/pubid/iso/identifiers/base.rb +0 -115
  444. data/lib/pubid/iso/scheme.rb +0 -193
  445. data/lib/pubid/itu/scheme.rb +0 -174
  446. data/lib/pubid/jcgm/scheme.rb +0 -60
  447. data/lib/pubid/jis/components/code.rb +0 -59
  448. data/lib/pubid/jis/identifiers/base.rb +0 -72
  449. data/lib/pubid/jis/scheme.rb +0 -49
  450. data/lib/pubid/nist/components/publisher.rb +0 -24
  451. data/lib/pubid/nist/scheme.rb +0 -199
  452. data/lib/pubid/oiml/scheme.rb +0 -46
  453. data/lib/pubid/plateau/scheme.rb +0 -45
  454. data/lib/pubid/rendering/base.rb +0 -73
  455. data/lib/pubid/rendering/common.rb +0 -211
  456. data/lib/pubid/rendering/format.rb +0 -25
  457. data/lib/pubid/sae/scheme.rb +0 -47
  458. data/lib/pubid/scheme.rb +0 -219
@@ -0,0 +1,261 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module CenCenelec
5
+ # Human-readable renderer for CEN/CENELEC identifiers.
6
+ #
7
+ # Produces strings like:
8
+ # "EN 196-3:2005"
9
+ # "EN ISO 8601:2019"
10
+ # "prEN 12345:2020"
11
+ # "CEN/TS 12345:2005"
12
+ # "EN 196-3:2005+A1:2008"
13
+ # "EN 60038/AC1:2012"
14
+ # "ENV ISO 8601"
15
+ #
16
+ # The renderer is registered as the +:human+ format in the CEN/CENELEC format
17
+ # registry and invoked via +render(format: :human)+.
18
+ class Renderer < ::Pubid::Renderers::Base
19
+ def render(context: nil, **opts)
20
+ id = @id
21
+ @context = context
22
+
23
+ case id
24
+ when Identifiers::AdoptedEuropeanNorm
25
+ render_adopted_european_norm(id)
26
+ when Identifiers::Amendment
27
+ render_amendment(id)
28
+ when Identifiers::Corrigendum
29
+ render_corrigendum(id)
30
+ when Identifiers::ConsolidatedIdentifier
31
+ render_consolidated(id)
32
+ when Identifiers::Fragment
33
+ render_fragment(id)
34
+ when Identifiers::EuropeanPrestandard
35
+ render_european_prestandard(id, **opts)
36
+ when Identifiers::Base
37
+ # CEN identifiers::Base hierarchy (Amendment, Corrigendum, etc. handled above)
38
+ render_cen_base(id)
39
+ when SingleIdentifier
40
+ render_single(id)
41
+ else
42
+ render_single(id)
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ # SingleIdentifier (EN, Guide, TR, TS, CWA, HD, etc.):
49
+ # Complex rendering with draft stages, copublishers, typed stages
50
+ def render_single(id)
51
+ parts = []
52
+
53
+ # Check if we have a draft stage (prEN, FprEN) - these include both stage and type
54
+ is_draft_stage = id.typed_stage&.abbr && %w[prEN
55
+ FprEN].include?(id.typed_stage.abbr.first)
56
+
57
+ # Get type short name - for draft stages, extract base type
58
+ type_short = if is_draft_stage
59
+ id.typed_stage.type_code.to_s.upcase # :en => "EN"
60
+ elsif id.type.is_a?(Components::Type)
61
+ id.type.abbr
62
+ elsif id.class.type.is_a?(Hash)
63
+ id.class.type[:short]
64
+ else
65
+ "EN" # Default
66
+ end
67
+
68
+ # Track if we should use slash before type
69
+ use_slash_before_type = false
70
+
71
+ # For CWA/HD, they act as publisher (not EN)
72
+ if %w[CWA HD CR].include?(type_short)
73
+ # Stage prefix OR type as publisher
74
+ parts << if id.typed_stage&.abbr && id.typed_stage.abbr.first != type_short
75
+ id.typed_stage.abbr.first
76
+ else
77
+ type_short
78
+ end
79
+ elsif is_draft_stage
80
+ # Draft stage prefix (prEN, FprEN) OR regular publisher
81
+ parts << id.typed_stage.abbr.first
82
+ elsif id.publisher
83
+ parts << id.publisher.render(context: @context)
84
+ use_slash_before_type = true # When publisher present, use slash before type
85
+ end
86
+
87
+ # Copublishers - add to last part (publisher) with slash
88
+ if id.copublishers&.any?
89
+ copub_str = id.copublishers.map { |cp| cp.render(context: @context) }.join("/")
90
+ unless copub_str.empty?
91
+ if parts.any?
92
+ parts[-1] = "#{parts[-1]}/#{copub_str}"
93
+ else
94
+ parts << copub_str
95
+ end
96
+ end
97
+ end
98
+
99
+ # Type for non-EN documents (TS, TR) - but not CWA/HD or Guide
100
+ if type_short != "EN" && !%w[CWA HD CR Guide].include?(type_short)
101
+ if use_slash_before_type && parts.any?
102
+ # Use slash separator for publisher/type combination (TS, TR only)
103
+ parts << "/#{type_short}"
104
+ else
105
+ parts << type_short
106
+ end
107
+ elsif type_short == "Guide"
108
+ # Guide uses SPACE separator, not slash
109
+ parts << "Guide"
110
+ end
111
+
112
+ # Number with part (which may be multi-level like "5-1-1")
113
+ if id.number
114
+ number_str = id.number.render(context: @context)
115
+ if id.part
116
+ number_str += "-#{id.part.render(context: @context)}"
117
+ end
118
+ parts << number_str
119
+ end
120
+
121
+ # Join parts - but handle slash prefix for type
122
+ result = ""
123
+ parts.each_with_index do |part, idx|
124
+ if idx.positive? && !part.start_with?("/")
125
+ result += " "
126
+ end
127
+ result += part
128
+ end
129
+
130
+ # Date
131
+ if id.date
132
+ year_val = id.date.is_a?(::Pubid::Components::Date) ? id.date.render(context: @context) : id.date.to_i
133
+ result += ":#{year_val}"
134
+ end
135
+
136
+ result
137
+ end
138
+
139
+ # CEN Identifiers::Base: simple key-value model
140
+ # Format: {PUBLISHER} NUMBER[-PART]:YEAR
141
+ def render_cen_base(id)
142
+ result = ""
143
+
144
+ # Stage or Publisher
145
+ if id.stage
146
+ result += id.stage
147
+ elsif id.publisher&.any?
148
+ result += id.publisher.join("/")
149
+ end
150
+
151
+ # If we have adopted_identifier, render it (contains all info)
152
+ if id.adopted_identifier
153
+ result += " #{id.adopted_identifier}"
154
+ # Don't add our own number/parts/year - they're in adopted_identifier
155
+ else
156
+ # Only render our own fields if no adoption
157
+ # Type - use space for Guide, slash for TR/TS
158
+ if id.type
159
+ sep = id.type == "Guide" ? " " : "/"
160
+ result += "#{sep}#{id.type}"
161
+ end
162
+
163
+ result += " #{id.number}"
164
+ result += id.parts.map { |p| "-#{p}" }.join if id.parts&.any?
165
+ result += ":#{id.year}" if id.year
166
+
167
+ # Supplements
168
+ if id.supplements&.any?
169
+ id.supplements.each do |supp|
170
+ sep = supp[:type] == :amendment ? "/" : "+"
171
+ result += "#{sep}#{supp[:type] == :amendment ? 'A' : 'AC'}"
172
+ result += supp[:number] if supp[:number] && !supp[:number].empty?
173
+ result += ":#{supp[:year]}" if supp[:year]
174
+ end
175
+ end
176
+
177
+ # Edition
178
+ result += " ED#{id.edition}" if id.edition
179
+ end
180
+
181
+ result
182
+ end
183
+
184
+ # AdoptedEuropeanNorm: "EN ISO 8601:2019"
185
+ def render_adopted_european_norm(id)
186
+ result = id.publisher.is_a?(Array) ? id.publisher.join("/") : id.publisher.join("/")
187
+ result += " #{id.adopted_identifier}" if id.adopted_identifier
188
+ result
189
+ end
190
+
191
+ # Amendment: "EN 196-3:2005/A1:2008"
192
+ def render_amendment(id)
193
+ result = if id.base_identifier
194
+ "#{id.base_identifier}/A#{id.amendment_number}"
195
+ else
196
+ "/A#{id.amendment_number}"
197
+ end
198
+ result += ":#{id.amendment_year}" if id.amendment_year
199
+ result
200
+ end
201
+
202
+ # Corrigendum: "EN 60038/AC1:2012"
203
+ def render_corrigendum(id)
204
+ if id.base_identifier
205
+ result = id.base_identifier.to_s
206
+ result += "/AC"
207
+ result += id.corrigendum_number if id.corrigendum_number && !id.corrigendum_number.empty?
208
+ else
209
+ result = "/AC#{id.corrigendum_number}"
210
+ end
211
+ if id.corrigendum_year
212
+ result += ":#{id.corrigendum_year}"
213
+ result += "-#{id.corrigendum_month}" if id.corrigendum_month && !id.corrigendum_month.empty?
214
+ end
215
+ result
216
+ end
217
+
218
+ # ConsolidatedIdentifier: "EN 196-3:2005+A1:2008"
219
+ def render_consolidated(id)
220
+ id.identifiers.map.with_index do |sub_id, idx|
221
+ if idx.zero?
222
+ # First identifier renders normally
223
+ sub_id.to_s
224
+ elsif sub_id.is_a?(Identifiers::Amendment)
225
+ # Supplements render with "+" prefix (bundled/consolidated format)
226
+ result = "+A#{sub_id.amendment_number}"
227
+ result += ":#{sub_id.amendment_year}" if sub_id.amendment_year
228
+ result
229
+ # Only render the amendment portion, not the full id.to_s
230
+ elsif sub_id.is_a?(Identifiers::Corrigendum)
231
+ # Only render the corrigendum portion
232
+ result = "+AC"
233
+ result += sub_id.corrigendum_number if sub_id.corrigendum_number && !sub_id.corrigendum_number.empty?
234
+ if sub_id.corrigendum_year
235
+ result += ":#{sub_id.corrigendum_year}"
236
+ result += "-#{sub_id.corrigendum_month}" if sub_id.corrigendum_month && !sub_id.corrigendum_month.empty?
237
+ end
238
+ result
239
+ else
240
+ # Other identifiers (should not happen in typical bundles) render with +
241
+ "+#{sub_id}"
242
+ end
243
+ end.compact.join
244
+ end
245
+
246
+ # Fragment: "EN 60038 AMD1 FRAG2"
247
+ def render_fragment(id)
248
+ "#{id.base_identifier} FRAG#{id.fragment_number}"
249
+ end
250
+
251
+ # EuropeanPrestandard: "ENV ISO 8601" or falls through to SingleIdentifier
252
+ def render_european_prestandard(id, **opts)
253
+ if id.adopted_identifier
254
+ "ENV #{id.adopted_identifier}"
255
+ else
256
+ render_single(id)
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
@@ -3,6 +3,12 @@
3
3
  module Pubid
4
4
  module CenCenelec
5
5
  class SingleIdentifier < Pubid::Identifier
6
+ # Identity for the Pubid::CenCenelec::Identifier facade. CEN/CENELEC
7
+ # identifiers split between two roots (Identifiers::Base and this
8
+ # SingleIdentifier), both direct subclasses of Pubid::Identifier, so the
9
+ # facade module is included into each to cover every concrete type.
10
+ include Pubid::CenCenelec::Identifier
11
+
6
12
  attribute :publisher, Components::Publisher, default: -> {
7
13
  Components::Publisher.new(body: "EN")
8
14
  }
@@ -11,96 +17,12 @@ module Pubid
11
17
  #
12
18
  # @return [String] URN representation
13
19
 
14
- def to_s(lang: :en, lang_single: false)
15
- parts = []
16
-
17
- # Check if we have a draft stage (prEN, FprEN) - these include both stage and type
18
- is_draft_stage = typed_stage&.abbr && %w[prEN
19
- FprEN].include?(typed_stage.abbr.first)
20
-
21
- # Get type short name - for draft stages, extract base type
22
- type_short = if is_draft_stage
23
- typed_stage.type_code.to_s.upcase # :en => "EN"
24
- elsif type.is_a?(Components::Type)
25
- type.abbr
26
- elsif self.class.respond_to?(:type) && self.class.type.is_a?(Hash)
27
- self.class.type[:short]
28
- else
29
- "EN" # Default
30
- end
31
-
32
- # Track if we should use slash before type
33
- use_slash_before_type = false
34
-
35
- # For CWA/HD, they act as publisher (not EN)
36
- if %w[CWA HD CR].include?(type_short)
37
- # Stage prefix OR type as publisher
38
- parts << if typed_stage&.abbr && typed_stage.abbr.first != type_short
39
- typed_stage.abbr.first
40
- else
41
- type_short
42
- end
43
- elsif is_draft_stage
44
- # Draft stage prefix (prEN, FprEN) OR regular publisher
45
- parts << typed_stage.abbr.first
46
- elsif publisher
47
- parts << (publisher.is_a?(Components::Publisher) ? publisher.body : publisher.to_s)
48
- use_slash_before_type = true # When publisher present, use slash before type
49
- end
50
-
51
- # Copublishers - add to last part (publisher) with slash
52
- if copublishers&.any?
53
- copub_str = copublishers.map do |cp|
54
- cp.is_a?(Components::Publisher) ? cp.body : cp.to_s
55
- end.join("/")
56
- unless copub_str.empty?
57
- if parts.any?
58
- parts[-1] = "#{parts[-1]}/#{copub_str}"
59
- else
60
- parts << copub_str
61
- end
62
- end
63
- end
64
-
65
- # Type for non-EN documents (TS, TR) - but not CWA/HD or Guide
66
- if type_short != "EN" && !%w[CWA HD CR Guide].include?(type_short)
67
- if use_slash_before_type && parts.any?
68
- # Use slash separator for publisher/type combination (TS, TR only)
69
- parts << "/#{type_short}"
70
- else
71
- parts << type_short
72
- end
73
- elsif type_short == "Guide"
74
- # Guide uses SPACE separator, not slash
75
- parts << "Guide"
76
- end
77
-
78
- # Number with part (which may be multi-level like "5-1-1")
79
- if number
80
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
81
- if part
82
- part_val = part.is_a?(Components::Code) ? part.value : part
83
- number_str += "-#{part_val}"
84
- end
85
- parts << number_str
86
- end
87
-
88
- # Join parts - but handle slash prefix for type
89
- result = ""
90
- parts.each_with_index do |part, idx|
91
- if idx.positive? && !part.start_with?("/")
92
- result += " "
93
- end
94
- result += part
95
- end
96
-
97
- # Date
98
- if date
99
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
100
- result += ":#{year_val}"
101
- end
20
+ def self.type
21
+ nil
22
+ end
102
23
 
103
- result
24
+ def to_s(lang: :en, lang_single: false, **opts)
25
+ render(format: :human, lang: lang, lang_single: lang_single, **opts)
104
26
  end
105
27
 
106
28
  def <=>(other)
@@ -50,9 +50,10 @@ module Pubid
50
50
  end
51
51
 
52
52
  date = maybe(:date)
53
- if date
54
- year = date.year
55
- parts << year.to_s
53
+ if date&.is_a?(::Pubid::Components::Date) && date.present?
54
+ parts << date.render(context: URN_CONTEXT)
55
+ elsif date
56
+ parts << date.to_s
56
57
  elsif identifier.year
57
58
  parts << identifier.year.to_s
58
59
  end
@@ -104,9 +105,8 @@ module Pubid
104
105
  amendment_year = maybe(:amendment_year)
105
106
  if amendment_year
106
107
  parts << amendment_year.to_s
107
- elsif identifier.date
108
- year = identifier.date.year
109
- parts << year.to_s
108
+ elsif identifier.date&.is_a?(::Pubid::Components::Date) && identifier.date.present?
109
+ parts << identifier.date.render(context: URN_CONTEXT)
110
110
  end
111
111
  else
112
112
  parts << "unknown"
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module CenCenelec
5
+ # Parses CEN/CENELEC URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits: `urn:cen:{type}:{number}:{year}` where type is
8
+ # the lowercase document class (en, etsg, ts, tr).
9
+ #
10
+ # Examples:
11
+ # - urn:cen:en:9001:2015 → EN 9001:2015
12
+ class UrnParser < Pubid::UrnParser::Base
13
+ # UrnGenerator uses "cen" rather than "cencenelec" as the namespace.
14
+ def flavor_name
15
+ "cen"
16
+ end
17
+
18
+ def parse_urn(urn)
19
+ body = strip_namespace(urn)
20
+ parts = split_parts(body)
21
+ type_token, number, year = parts
22
+ text = "#{type_token.upcase} #{number}"
23
+ text += ":#{year}" if year
24
+ flavor_parse(text)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -6,16 +6,183 @@ module Pubid
6
6
  autoload :Identifier, "#{__dir__}/cen_cenelec/identifier"
7
7
  autoload :Identifiers, "#{__dir__}/cen_cenelec/identifiers"
8
8
  autoload :Parser, "#{__dir__}/cen_cenelec/parser"
9
- autoload :Scheme, "#{__dir__}/cen_cenelec/scheme"
9
+ autoload :Renderer, "#{__dir__}/cen_cenelec/renderer"
10
10
  autoload :SingleIdentifier, "#{__dir__}/cen_cenelec/single_identifier"
11
11
  autoload :SupplementIdentifier,
12
12
  "#{__dir__}/cen_cenelec/supplement_identifier"
13
13
  autoload :UrnGenerator, "#{__dir__}/cen_cenelec/urn_generator"
14
+ autoload :UrnParser, "#{__dir__}/cen_cenelec/urn_parser"
15
+
16
+ # TYPED_STAGES_REGISTRY for native CEN types
17
+ TYPED_STAGES_REGISTRY = [
18
+ # European Norm (EN)
19
+ Pubid::Components::TypedStage.new(
20
+ code: :puben,
21
+ stage_code: :published,
22
+ type_code: :en,
23
+ abbr: ["EN"],
24
+ name: "European Norm",
25
+ harmonized_stages: %w[60.00 60.60],
26
+ ),
27
+ Pubid::Components::TypedStage.new(
28
+ code: :pren,
29
+ stage_code: :proposal,
30
+ type_code: :en,
31
+ abbr: ["prEN"],
32
+ name: "Proposal European Norm",
33
+ harmonized_stages: %w[30.00 30.20 30.60 30.92 30.98 30.99],
34
+ ),
35
+ Pubid::Components::TypedStage.new(
36
+ code: :fpren,
37
+ stage_code: :final_proposal,
38
+ type_code: :en,
39
+ abbr: ["FprEN"],
40
+ name: "Final Proposal European Norm",
41
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.98 40.99],
42
+ ),
43
+
44
+ # Technical Specification (TS)
45
+ Pubid::Components::TypedStage.new(
46
+ code: :pubts,
47
+ stage_code: :published,
48
+ type_code: :ts,
49
+ abbr: ["TS"],
50
+ name: "Technical Specification",
51
+ harmonized_stages: %w[60.00 60.60],
52
+ ),
53
+ Pubid::Components::TypedStage.new(
54
+ code: :prts,
55
+ stage_code: :proposal,
56
+ type_code: :ts,
57
+ abbr: ["prTS"],
58
+ name: "Proposal Technical Specification",
59
+ harmonized_stages: %w[30.00 30.20 30.60 30.92 30.98 30.99],
60
+ ),
61
+
62
+ # Technical Report (TR)
63
+ Pubid::Components::TypedStage.new(
64
+ code: :pubtr,
65
+ stage_code: :published,
66
+ type_code: :tr,
67
+ abbr: ["TR"],
68
+ name: "Technical Report",
69
+ harmonized_stages: %w[60.00 60.60],
70
+ ),
71
+
72
+ # CEN Workshop Agreement (CWA)
73
+ Pubid::Components::TypedStage.new(
74
+ code: :pubcwa,
75
+ stage_code: :published,
76
+ type_code: :cwa,
77
+ abbr: ["CWA"],
78
+ name: "CEN Workshop Agreement",
79
+ harmonized_stages: %w[60.00 60.60],
80
+ ),
81
+
82
+ # Guide
83
+ Pubid::Components::TypedStage.new(
84
+ code: :pubguide,
85
+ stage_code: :published,
86
+ type_code: :guide,
87
+ abbr: ["Guide"],
88
+ name: "Guide",
89
+ harmonized_stages: %w[60.00 60.60],
90
+ ),
91
+
92
+ # Harmonization Document (HD)
93
+ Pubid::Components::TypedStage.new(
94
+ code: :pubhd,
95
+ stage_code: :published,
96
+ type_code: :hd,
97
+ abbr: ["HD"],
98
+ name: "Harmonization Document",
99
+ harmonized_stages: %w[60.00 60.60],
100
+ ),
101
+
102
+ # European Specification (ES)
103
+ Pubid::Components::TypedStage.new(
104
+ code: :pubes,
105
+ stage_code: :published,
106
+ type_code: :es,
107
+ abbr: ["ES"],
108
+ name: "European Specification",
109
+ harmonized_stages: %w[60.00 60.60],
110
+ ),
111
+
112
+ # CEN Report (CR)
113
+ Pubid::Components::TypedStage.new(
114
+ code: :pubcr,
115
+ stage_code: :published,
116
+ type_code: :cr,
117
+ abbr: ["CR"],
118
+ name: "CEN Report",
119
+ harmonized_stages: %w[60.00 60.60],
120
+ ),
121
+
122
+ # European Prestandard (ENV)
123
+ Pubid::Components::TypedStage.new(
124
+ code: :pubenv,
125
+ stage_code: :published,
126
+ type_code: :env,
127
+ abbr: ["ENV"],
128
+ name: "European Prestandard",
129
+ harmonized_stages: %w[60.00 60.60],
130
+ ),
131
+ ].freeze
132
+
133
+ # Default typed stage for when no match is found
134
+ DEFAULT_TYPED_STAGE = Pubid::Components::TypedStage.new(
135
+ code: :puben,
136
+ stage_code: :published,
137
+ type_code: :en,
138
+ abbr: ["EN"],
139
+ name: "European Norm",
140
+ harmonized_stages: %w[60.00 60.60],
141
+ ).freeze
14
142
 
15
143
  def self.parse(identifier)
16
144
  CenCenelec::Identifier.parse(identifier)
17
145
  end
146
+
147
+ # Auto-discover all identifier types from the Identifiers namespace
148
+ # @return [Array<Class>] identifier classes that define a self.type Hash
149
+ def self.identifier_types
150
+ @identifier_types ||= Identifiers.constants
151
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
152
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
153
+ .select { |c| c.type.is_a?(Hash) }
154
+ end
155
+
156
+ # Build typed stage index from the module's TYPED_STAGES_REGISTRY
157
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
158
+ def self.all_typed_stages
159
+ TYPED_STAGES_REGISTRY
160
+ end
161
+
162
+ # Lookup: type code -> identifier class
163
+ # @param code [String, Symbol] the type key to find
164
+ # @return [Class, nil] the matching identifier class
165
+ def self.locate_type(code)
166
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
167
+ end
168
+
169
+ # Lookup: abbreviation -> typed stage
170
+ # @param abbr [String, Symbol] the abbreviation to find
171
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
172
+ def self.locate_stage(abbr)
173
+ abbr_str = abbr.to_s.upcase
174
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
175
+ end
18
176
  end
19
177
  end
20
178
 
21
179
  Pubid::Registry.register(:cen_cenelec, Pubid::CenCenelec)
180
+ Pubid::Registry.register(:cen, Pubid::CenCenelec)
181
+
182
+ # Per-flavor format registry: inherits global formats, overrides :human
183
+ # Register on both root hierarchies: SingleIdentifier and Identifiers::Base
184
+ cen_renderer = Pubid::CenCenelec::Renderer
185
+ Pubid::CenCenelec::SingleIdentifier.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
186
+ Pubid::CenCenelec::SingleIdentifier.format_registry.register(:human, renderer: cen_renderer)
187
+ Pubid::CenCenelec::Identifiers::Base.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
188
+ Pubid::CenCenelec::Identifiers::Base.format_registry.register(:human, renderer: cen_renderer)
@@ -7,6 +7,10 @@ module Pubid
7
7
  module Components
8
8
  # Code component for CIE identifiers
9
9
  # Handles number-part-iteration with style awareness
10
+ #
11
+ # Stays independent of Pubid::Components::Code because CIE tracks
12
+ # +style+ ("legacy" / "current") and +part_separator+ to round-trip
13
+ # slash vs dash notation, plus an +iteration+ sub-field.
10
14
  class Code < Lutaml::Model::Serializable
11
15
  attribute :number, :string # "013", "170", "198"
12
16
  attribute :part, :string # "1", "2", "3"
@@ -66,6 +70,10 @@ module Pubid
66
70
  new(number: code_str, style: style)
67
71
  end
68
72
  end
73
+
74
+ def render(context: nil)
75
+ to_s
76
+ end
69
77
  end
70
78
  end
71
79
  end