pubid 2.0.0.pre.alpha.1 → 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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +27 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +7 -0
  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 -1
  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 -4
  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 -0
  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/identifiers/base.rb +0 -60
  55. data/lib/pubid/asme/renderer.rb +66 -0
  56. data/lib/pubid/asme/urn_parser.rb +31 -0
  57. data/lib/pubid/asme.rb +42 -1
  58. data/lib/pubid/astm/components/code.rb +9 -0
  59. data/lib/pubid/{jis → astm}/components.rb +1 -1
  60. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  61. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  62. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  63. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  64. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  65. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  66. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  67. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  68. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  69. data/lib/pubid/astm/identifiers.rb +18 -0
  70. data/lib/pubid/astm/renderer.rb +172 -0
  71. data/lib/pubid/astm/single_identifier.rb +0 -10
  72. data/lib/pubid/astm/urn_parser.rb +30 -0
  73. data/lib/pubid/astm.rb +39 -27
  74. data/lib/pubid/bsi/builder.rb +21 -12
  75. data/lib/pubid/bsi/identifier.rb +8 -2
  76. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  77. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  78. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  79. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  80. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  81. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  82. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  83. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  84. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  85. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  87. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  88. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  89. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  90. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  91. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  92. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  93. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  94. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  95. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  96. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  97. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  98. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  99. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  100. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  101. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  102. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  103. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  104. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  105. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  106. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  107. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  108. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  109. data/lib/pubid/bsi/identifiers.rb +0 -1
  110. data/lib/pubid/bsi/renderer.rb +1050 -0
  111. data/lib/pubid/bsi/single_identifier.rb +6 -70
  112. data/lib/pubid/bsi/urn_generator.rb +2 -3
  113. data/lib/pubid/bsi/urn_parser.rb +52 -0
  114. data/lib/pubid/bsi.rb +224 -1
  115. data/lib/pubid/builder/base.rb +57 -10
  116. data/lib/pubid/bundled_identifier.rb +0 -1
  117. data/lib/pubid/ccsds/builder.rb +4 -3
  118. data/lib/pubid/ccsds/identifier.rb +66 -1
  119. data/lib/pubid/ccsds/identifiers/base.rb +11 -50
  120. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  121. data/lib/pubid/ccsds/parser.rb +4 -2
  122. data/lib/pubid/ccsds/single_identifier.rb +4 -1
  123. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  124. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  125. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  126. data/lib/pubid/ccsds.rb +39 -1
  127. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  128. data/lib/pubid/cen_cenelec/identifier.rb +8 -2
  129. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  130. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  131. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  132. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  133. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  135. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  136. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  137. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  138. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  140. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  141. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  143. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  144. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  145. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  146. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  147. data/lib/pubid/cen_cenelec.rb +168 -1
  148. data/lib/pubid/cie/components/code.rb +8 -0
  149. data/lib/pubid/cie/identifier.rb +6 -4
  150. data/lib/pubid/cie/urn_parser.rb +28 -0
  151. data/lib/pubid/cie.rb +43 -1
  152. data/lib/pubid/components/adoption.rb +104 -0
  153. data/lib/pubid/components/code.rb +22 -8
  154. data/lib/pubid/components/date.rb +23 -16
  155. data/lib/pubid/components/edition.rb +9 -6
  156. data/lib/pubid/components/iteration.rb +32 -0
  157. data/lib/pubid/components/language.rb +6 -4
  158. data/lib/pubid/components/locality.rb +10 -1
  159. data/lib/pubid/components/publisher.rb +9 -6
  160. data/lib/pubid/components/relationship.rb +151 -0
  161. data/lib/pubid/components/stage.rb +5 -14
  162. data/lib/pubid/components/supplement.rb +184 -0
  163. data/lib/pubid/components/type.rb +5 -15
  164. data/lib/pubid/components/typed_stage.rb +11 -8
  165. data/lib/pubid/components.rb +4 -0
  166. data/lib/pubid/core/update_codes.rb +28 -7
  167. data/lib/pubid/csa/identifier.rb +0 -3
  168. data/lib/pubid/csa/identifiers/base.rb +2 -122
  169. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  170. data/lib/pubid/csa/identifiers/series.rb +2 -102
  171. data/lib/pubid/csa/renderer.rb +292 -0
  172. data/lib/pubid/csa/urn_generator.rb +1 -1
  173. data/lib/pubid/csa/urn_parser.rb +33 -0
  174. data/lib/pubid/csa.rb +42 -1
  175. data/lib/pubid/etsi/components/code.rb +9 -2
  176. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  177. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  178. data/lib/pubid/etsi/renderer.rb +42 -0
  179. data/lib/pubid/etsi/urn_parser.rb +34 -0
  180. data/lib/pubid/etsi.rb +42 -1
  181. data/lib/pubid/export/exporter.rb +4 -46
  182. data/lib/pubid/export/flavor_exporter.rb +111 -278
  183. data/lib/pubid/export.rb +0 -6
  184. data/lib/pubid/identifier.rb +10 -18
  185. data/lib/pubid/identifier_facade.rb +114 -0
  186. data/lib/pubid/identifier_metadata.rb +1 -1
  187. data/lib/pubid/idf/builder.rb +3 -3
  188. data/lib/pubid/idf/identifier.rb +3 -6
  189. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  190. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  191. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  192. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  193. data/lib/pubid/idf/parser.rb +3 -2
  194. data/lib/pubid/idf/renderer.rb +84 -0
  195. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  196. data/lib/pubid/idf/urn_generator.rb +4 -39
  197. data/lib/pubid/idf/urn_parser.rb +25 -0
  198. data/lib/pubid/idf.rb +51 -1
  199. data/lib/pubid/iec/builder.rb +48 -65
  200. data/lib/pubid/iec/components/code.rb +9 -32
  201. data/lib/pubid/iec/components/publisher.rb +1 -1
  202. data/lib/pubid/iec/components.rb +14 -0
  203. data/lib/pubid/iec/identifier.rb +276 -3
  204. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  205. data/lib/pubid/iec/identifiers/base.rb +8 -28
  206. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  207. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  208. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -30
  209. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  210. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -26
  211. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  212. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  213. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  214. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  215. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  216. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -15
  217. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  218. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  219. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  220. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  222. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  223. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -23
  224. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  225. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  226. data/lib/pubid/iec/identifiers.rb +30 -0
  227. data/lib/pubid/iec/parser.rb +20 -14
  228. data/lib/pubid/iec/renderer.rb +254 -0
  229. data/lib/pubid/iec/single_identifier.rb +6 -12
  230. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  231. data/lib/pubid/iec/urn_generator.rb +57 -171
  232. data/lib/pubid/iec/urn_parser.rb +53 -252
  233. data/lib/pubid/iec.rb +40 -68
  234. data/lib/pubid/ieee/builder.rb +12 -12
  235. data/lib/pubid/ieee/components/code.rb +8 -0
  236. data/lib/pubid/ieee/components/draft.rb +14 -0
  237. data/lib/pubid/ieee/components/relationship.rb +5 -149
  238. data/lib/pubid/ieee/identifier.rb +6 -0
  239. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  240. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  241. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  242. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  243. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  245. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  246. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  247. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  248. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  249. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  250. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  251. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  252. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  253. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  254. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  255. data/lib/pubid/ieee/pre_parser.rb +301 -0
  256. data/lib/pubid/ieee/renderer.rb +307 -0
  257. data/lib/pubid/ieee/urn_parser.rb +34 -0
  258. data/lib/pubid/ieee.rb +62 -1
  259. data/lib/pubid/ieee_debug.rb +0 -1
  260. data/lib/pubid/iho/builder.rb +2 -2
  261. data/lib/pubid/iho/identifier.rb +8 -0
  262. data/lib/pubid/iho/identifiers/base.rb +49 -10
  263. data/lib/pubid/iho/identifiers/bibliographic.rb +0 -4
  264. data/lib/pubid/iho/identifiers/circular_letter.rb +0 -4
  265. data/lib/pubid/iho/identifiers/miscellaneous.rb +0 -4
  266. data/lib/pubid/iho/identifiers/publication.rb +0 -4
  267. data/lib/pubid/iho/identifiers/standard.rb +0 -4
  268. data/lib/pubid/iho/parser.rb +3 -3
  269. data/lib/pubid/iho/renderer.rb +30 -0
  270. data/lib/pubid/iho/urn_generator.rb +3 -3
  271. data/lib/pubid/iho/urn_parser.rb +58 -0
  272. data/lib/pubid/iho.rb +50 -1
  273. data/lib/pubid/iso/builder.rb +59 -53
  274. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  275. data/lib/pubid/iso/components/code.rb +7 -19
  276. data/lib/pubid/iso/components/publisher.rb +10 -8
  277. data/lib/pubid/iso/components.rb +2 -4
  278. data/lib/pubid/iso/identifier.rb +233 -6
  279. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  280. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  281. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  282. data/lib/pubid/iso/identifiers/data.rb +0 -1
  283. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  284. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  285. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  286. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  287. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  288. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  289. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  290. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  291. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  292. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  293. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  294. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  295. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  296. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  297. data/lib/pubid/iso/identifiers.rb +0 -1
  298. data/lib/pubid/iso/normalizer.rb +89 -0
  299. data/lib/pubid/iso/parser.rb +26 -6
  300. data/lib/pubid/iso/single_identifier.rb +6 -3
  301. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  302. data/lib/pubid/iso/urn_generator.rb +74 -176
  303. data/lib/pubid/iso/urn_parser.rb +28 -9
  304. data/lib/pubid/iso.rb +173 -2
  305. data/lib/pubid/itu/builder.rb +0 -12
  306. data/lib/pubid/itu/components/code.rb +8 -0
  307. data/lib/pubid/itu/components.rb +11 -0
  308. data/lib/pubid/itu/identifier.rb +6 -39
  309. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  310. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  311. data/lib/pubid/itu/identifiers/base.rb +0 -6
  312. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  313. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  314. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  315. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  316. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  317. data/lib/pubid/itu/urn_parser.rb +23 -0
  318. data/lib/pubid/itu.rb +42 -1
  319. data/lib/pubid/jcgm/builder.rb +16 -8
  320. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  321. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  322. data/lib/pubid/jcgm/renderer.rb +68 -0
  323. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  324. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  325. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  326. data/lib/pubid/jcgm.rb +43 -2
  327. data/lib/pubid/jis/builder.rb +44 -52
  328. data/lib/pubid/jis/identifier.rb +132 -3
  329. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  330. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  331. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  332. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  333. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  334. data/lib/pubid/jis/identifiers.rb +1 -1
  335. data/lib/pubid/jis/parser.rb +31 -5
  336. data/lib/pubid/jis/renderer.rb +69 -0
  337. data/lib/pubid/jis/single_identifier.rb +6 -12
  338. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  339. data/lib/pubid/jis/urn_parser.rb +23 -0
  340. data/lib/pubid/jis.rb +42 -2
  341. data/lib/pubid/nist/builder.rb +122 -1761
  342. data/lib/pubid/nist/caster.rb +1272 -0
  343. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  344. data/lib/pubid/nist/components/code.rb +9 -20
  345. data/lib/pubid/nist/components/edition.rb +16 -0
  346. data/lib/pubid/nist/components/supplement.rb +88 -21
  347. data/lib/pubid/nist/components.rb +0 -1
  348. data/lib/pubid/nist/identifier.rb +25 -0
  349. data/lib/pubid/nist/identifiers/base.rb +206 -64
  350. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  351. data/lib/pubid/nist/identifiers/circular_supplement.rb +3 -2
  352. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  353. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  354. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  355. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -11
  356. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  357. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -16
  358. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  359. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  360. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  361. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  362. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  363. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  364. data/lib/pubid/nist/identifiers/report.rb +4 -3
  365. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  366. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  367. data/lib/pubid/nist/identifiers.rb +1 -0
  368. data/lib/pubid/nist/parser.rb +67 -424
  369. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  370. data/lib/pubid/nist/preprocessor.rb +416 -0
  371. data/lib/pubid/nist/renderer.rb +43 -0
  372. data/lib/pubid/nist/router.rb +148 -0
  373. data/lib/pubid/nist/series/base.rb +58 -0
  374. data/lib/pubid/nist/series/crpl.rb +13 -0
  375. data/lib/pubid/nist/series/fips.rb +14 -0
  376. data/lib/pubid/nist/series/ir.rb +60 -0
  377. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  378. data/lib/pubid/nist/series/mono.rb +19 -0
  379. data/lib/pubid/nist/series/ncstar.rb +20 -0
  380. data/lib/pubid/nist/series.rb +49 -0
  381. data/lib/pubid/nist/supplement_identifier.rb +11 -25
  382. data/lib/pubid/nist/urn_generator.rb +14 -8
  383. data/lib/pubid/nist/urn_parser.rb +67 -0
  384. data/lib/pubid/nist.rb +83 -4
  385. data/lib/pubid/oiml/components/code.rb +10 -0
  386. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  387. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  388. data/lib/pubid/oiml/renderer.rb +161 -0
  389. data/lib/pubid/oiml/single_identifier.rb +6 -45
  390. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  391. data/lib/pubid/oiml/urn_generator.rb +0 -8
  392. data/lib/pubid/oiml/urn_parser.rb +22 -0
  393. data/lib/pubid/oiml.rb +42 -1
  394. data/lib/pubid/plateau/identifier.rb +23 -0
  395. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  396. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  397. data/lib/pubid/plateau/renderer.rb +51 -0
  398. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  399. data/lib/pubid/plateau/urn_parser.rb +43 -0
  400. data/lib/pubid/plateau.rb +44 -1
  401. data/lib/pubid/renderers/base.rb +34 -0
  402. data/lib/pubid/renderers/directives_renderer.rb +27 -14
  403. data/lib/pubid/renderers/guide_renderer.rb +7 -1
  404. data/lib/pubid/renderers/human_readable.rb +31 -8
  405. data/lib/pubid/renderers/iwa_renderer.rb +5 -1
  406. data/lib/pubid/renderers/supplement_renderer.rb +4 -1
  407. data/lib/pubid/rendering/context.rb +33 -21
  408. data/lib/pubid/rendering.rb +0 -3
  409. data/lib/pubid/sae/components/date.rb +8 -0
  410. data/lib/pubid/sae/components/type.rb +5 -1
  411. data/lib/pubid/sae/identifiers/base.rb +2 -16
  412. data/lib/pubid/sae/renderer.rb +36 -0
  413. data/lib/pubid/sae/urn_generator.rb +2 -10
  414. data/lib/pubid/sae/urn_parser.rb +36 -0
  415. data/lib/pubid/sae.rb +42 -1
  416. data/lib/pubid/urn_generator/base.rb +12 -12
  417. data/lib/pubid/urn_parser/base.rb +81 -0
  418. data/lib/pubid/urn_parser/errors.rb +9 -0
  419. data/lib/pubid/urn_parser.rb +14 -0
  420. data/lib/pubid/version.rb +1 -1
  421. data/lib/pubid.rb +29 -7
  422. data/lib/tasks/website-data.json +1940 -1882
  423. metadata +77 -43
  424. data/lib/pubid/amca/scheme.rb +0 -16
  425. data/lib/pubid/ansi/scheme.rb +0 -15
  426. data/lib/pubid/api/scheme.rb +0 -66
  427. data/lib/pubid/ashrae/scheme.rb +0 -53
  428. data/lib/pubid/asme/scheme.rb +0 -37
  429. data/lib/pubid/astm/scheme.rb +0 -55
  430. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  431. data/lib/pubid/bsi/scheme.rb +0 -243
  432. data/lib/pubid/ccsds/scheme.rb +0 -57
  433. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  434. data/lib/pubid/cie/scheme.rb +0 -64
  435. data/lib/pubid/csa/scheme.rb +0 -44
  436. data/lib/pubid/etsi/scheme.rb +0 -42
  437. data/lib/pubid/export/data_class_exporter.rb +0 -59
  438. data/lib/pubid/export/ieee_exporter.rb +0 -78
  439. data/lib/pubid/export/itu_exporter.rb +0 -66
  440. data/lib/pubid/export/nist_exporter.rb +0 -64
  441. data/lib/pubid/export/registry_exporter.rb +0 -90
  442. data/lib/pubid/export/scheme_exporter.rb +0 -70
  443. data/lib/pubid/identifier_registry.rb +0 -198
  444. data/lib/pubid/idf/scheme.rb +0 -61
  445. data/lib/pubid/iec/scheme.rb +0 -71
  446. data/lib/pubid/ieee/scheme.rb +0 -90
  447. data/lib/pubid/iho/scheme.rb +0 -29
  448. data/lib/pubid/iso/identifiers/base.rb +0 -115
  449. data/lib/pubid/iso/scheme.rb +0 -187
  450. data/lib/pubid/itu/scheme.rb +0 -174
  451. data/lib/pubid/jcgm/scheme.rb +0 -60
  452. data/lib/pubid/jis/components/code.rb +0 -59
  453. data/lib/pubid/jis/identifiers/base.rb +0 -72
  454. data/lib/pubid/jis/scheme.rb +0 -49
  455. data/lib/pubid/nist/components/publisher.rb +0 -24
  456. data/lib/pubid/nist/scheme.rb +0 -199
  457. data/lib/pubid/oiml/scheme.rb +0 -46
  458. data/lib/pubid/plateau/scheme.rb +0 -45
  459. data/lib/pubid/rendering/base.rb +0 -73
  460. data/lib/pubid/rendering/common.rb +0 -211
  461. data/lib/pubid/rendering/format.rb +0 -25
  462. data/lib/pubid/sae/scheme.rb +0 -47
  463. data/lib/pubid/scheme.rb +0 -207
@@ -3,12 +3,15 @@
3
3
  module Pubid
4
4
  module Ccsds
5
5
  module Identifiers
6
- # CCSDS identifier
7
- # Format: CCSDS NUMBER.PART-TYPE-EDITION[-SUFFIX]
8
- # Example: CCSDS 120.0-G-4, CCSDS 100.0-G-1-S
9
- class Base < Lutaml::Model::Serializable
10
- # CCSDS uses a simple architecture without typed stages
11
- # TYPED_STAGES includes default stage for base identifiers
6
+ # CCSDS base identifier (a published standard).
7
+ #
8
+ # Format: CCSDS NUMBER.PART-TYPE-EDITION[-SUFFIX][ - LANGUAGE Translated]
9
+ # Examples: CCSDS 120.0-G-4, CCSDS 100.0-G-1-S, CCSDS 551.1-O-2 - Russian Translated
10
+ #
11
+ # Attributes, the key_value mapping and from_hash dispatch live on the
12
+ # abstract root Pubid::Ccsds::Identifier; this concrete type only carries
13
+ # its typed stage and rendering.
14
+ class Base < Pubid::Ccsds::Identifier
12
15
  TYPED_STAGES = [
13
16
  Pubid::Components::TypedStage.new(
14
17
  abbr: [""],
@@ -17,61 +20,19 @@ module Pubid
17
20
  ),
18
21
  ].freeze
19
22
 
20
- # Type information for this identifier class
21
- #
22
- # @return [Hash] Type information with key, title, and short form
23
23
  def self.type
24
- { key: :base, title: "Base Standard", short: nil }
24
+ { key: :base, web: :base, title: "Base Standard", short: nil }
25
25
  end
26
26
 
27
- # Generate URN for this identifier
28
- #
29
- # @return [String] URN representation
30
-
31
- # Include CCSDS-specific attributes in serialization
32
- def base_hash
33
- hash = super
34
- # CCSDS uses plain strings for type, edition, suffix
35
- hash[:type] = type if type
36
- hash[:suffix] = suffix if suffix
37
- hash[:language] = language if language
38
- hash
39
- end
40
-
41
- attribute :number, :string
42
- attribute :part, :string
43
- attribute :type, :string # B, G, M, R, Y, O, etc.
44
- attribute :edition, :string
45
- attribute :suffix, :string # Optional suffix like -S
46
- attribute :language, :string # Language metadata (e.g., "French", "Russian")
47
-
48
- def publisher
49
- "CCSDS"
50
- end
51
-
52
- def to_s
27
+ def to_s(**_opts)
53
28
  result = "#{publisher} #{number}"
54
29
  result += ".#{part}" if part
55
30
  result += "-#{type}" if type
56
31
  result += "-#{edition}" if edition
57
32
  result += "-#{suffix}" if suffix
58
-
59
- # Add language metadata
60
33
  result += " - #{language} Translated" if language
61
-
62
34
  result
63
35
  end
64
-
65
- def ==(other)
66
- return false unless other.is_a?(Base)
67
-
68
- number == other.number &&
69
- part == other.part &&
70
- type == other.type &&
71
- edition == other.edition &&
72
- suffix == other.suffix &&
73
- language == other.language
74
- end
75
36
  end
76
37
  end
77
38
  end
@@ -17,21 +17,22 @@ module Pubid
17
17
  #
18
18
  # @return [Hash] Type information with key, title, and short form
19
19
  def self.type
20
- { key: :cor, title: "Corrigendum", short: "Cor" }
20
+ { key: :cor,
21
+ web: :corrigendum, title: "Corrigendum", short: "Cor" }
21
22
  end
22
23
 
23
- attribute :cor_number, :integer
24
-
24
+ # The corrigendum sequence number is stored in the inherited `number`
25
+ # attribute (mirroring ISO), so it serializes via Base's key_value as
26
+ # { _type, number: '1', base: {...} } with no corrigendum-specific map.
25
27
  def to_s
26
28
  base_str = base_identifier.to_s
27
- "#{base_str} Cor. #{cor_number}"
29
+ "#{base_str} Cor. #{number}"
28
30
  end
29
31
 
30
32
  def ==(other)
31
33
  return false unless other.is_a?(Corrigendum)
32
34
 
33
- base_identifier == other.base_identifier &&
34
- cor_number == other.cor_number
35
+ base_identifier == other.base_identifier && number == other.number
35
36
  end
36
37
  end
37
38
  end
@@ -25,8 +25,10 @@ module Pubid
25
25
  # Type (all possible type letters)
26
26
  rule(:type) { dash >> match["A-Z"].as(:type) }
27
27
 
28
- # Edition (can have dots like 4.1)
29
- rule(:edition) { dash >> match["0-9."].repeat(1).as(:edition) }
28
+ # Edition (can have dots like 4.1, and a trailing draft letter like 1.99h)
29
+ rule(:edition) do
30
+ dash >> (match["0-9."].repeat(1) >> match["A-Za-z"].maybe).as(:edition)
31
+ end
30
32
 
31
33
  # Suffix (like -S)
32
34
  rule(:suffix) { dash >> match["A-Z"].as(:suffix) }
@@ -2,7 +2,10 @@
2
2
 
3
3
  module Pubid
4
4
  module Ccsds
5
- class SingleIdentifier < Identifier
5
+ # Qualified as ::Pubid::Identifier to avoid resolving to the local
6
+ # Pubid::Ccsds::Identifier module, which is a parser entry point
7
+ # (`self.parse`) — not the base class.
8
+ class SingleIdentifier < ::Pubid::Identifier
6
9
  attribute :publisher, Components::Publisher, default: -> {
7
10
  Components::Publisher.new(body: "CCSDS")
8
11
  }
@@ -2,18 +2,22 @@
2
2
 
3
3
  module Pubid
4
4
  module Ccsds
5
- # Base class for CCSDS supplements (corrigenda, amendments, etc.)
6
- # Following ISO pattern: inherits from Base and uses Lutaml::Model
7
- class SupplementIdentifier < Identifiers::Base
8
- attribute :base_identifier, Identifiers::Base, polymorphic: true
5
+ # Base class for CCSDS supplements (corrigenda, amendments, etc.).
6
+ # Descends from the abstract root (not the concrete Base) and points
7
+ # `base_identifier` at the root, so the polymorphic attribute never
8
+ # resolves to its own superclass — which is what prevents lutaml from
9
+ # recursing forever while building a supplement from a hash.
10
+ class SupplementIdentifier < Identifier
11
+ attribute :base_identifier, Identifier, polymorphic: true
9
12
 
10
- # Delegate methods to base_identifier for convenient access
11
- def publisher
12
- base_identifier&.publisher
13
- end
14
-
15
- def number
16
- base_identifier&.number
13
+ # Serialize the supplemented identifier under "base" (matches ISO/JIS).
14
+ # The key stays `base_identifier` for the attribute/getter, which
15
+ # relaton-index's get_id_number relies on. A supplement's own code
16
+ # attributes (number/part/edition/...) stay nil — they live inside
17
+ # `base` — so the merged root key_value omits them here, keeping the
18
+ # serialization lean and non-duplicated.
19
+ key_value do
20
+ map "base", to: :base_identifier
17
21
  end
18
22
 
19
23
  def <=>(other)
@@ -47,7 +47,7 @@ module Pubid
47
47
  edition = maybe(:edition)
48
48
  if edition
49
49
  e = if edition.is_a?(Pubid::Components::Edition)
50
- edition.number || edition.value
50
+ edition.number
51
51
  else
52
52
  edition.to_s
53
53
  end
@@ -101,8 +101,8 @@ module Pubid
101
101
  parts << base_identifier_part
102
102
 
103
103
  supplement_chain.each do |supp|
104
- if supp.number&.value
105
- parts << "cor.#{supp.number.value}"
104
+ if supp.number && !supp.number.to_s.empty?
105
+ parts << "cor.#{supp.number}"
106
106
  elsif supp.typed_stage
107
107
  parts << supp.typed_stage.type_code.to_s
108
108
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ccsds
5
+ # Parses CCSDS URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits: `urn:ccsds:{code}` where the code is the full
8
+ # identifier suffix after "CCSDS " (e.g., "120.0-G-4").
9
+ #
10
+ # Examples:
11
+ # - urn:ccsds:120.0-G-4 → CCSDS 120.0-G-4
12
+ # - urn:ccsds:100.0-G-1-S → CCSDS 100.0-G-1-S
13
+ class UrnParser < Pubid::UrnParser::Base
14
+ def parse_urn(urn)
15
+ body = strip_namespace(urn)
16
+ flavor_parse("CCSDS #{body}")
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/pubid/ccsds.rb CHANGED
@@ -6,14 +6,52 @@ module Pubid
6
6
  autoload :Identifier, "#{__dir__}/ccsds/identifier"
7
7
  autoload :Identifiers, "#{__dir__}/ccsds/identifiers"
8
8
  autoload :Parser, "#{__dir__}/ccsds/parser"
9
- autoload :Scheme, "#{__dir__}/ccsds/scheme"
10
9
  autoload :SingleIdentifier, "#{__dir__}/ccsds/single_identifier"
11
10
  autoload :SupplementIdentifier, "#{__dir__}/ccsds/supplement_identifier"
12
11
  autoload :UrnGenerator, "#{__dir__}/ccsds/urn_generator"
12
+ autoload :UrnParser, "#{__dir__}/ccsds/urn_parser"
13
13
 
14
14
  def self.parse(identifier)
15
15
  Identifier.parse(identifier)
16
16
  end
17
+
18
+ # Auto-discover all identifier types from the Identifiers namespace.
19
+ # CCSDS identifier classes extend Lutaml::Model::Serializable directly
20
+ # but do define self.type returning a Hash.
21
+ # @return [Array<Class>] identifier classes that define a self.type Hash
22
+ def self.identifier_types
23
+ @identifier_types ||= Identifiers.constants
24
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
25
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
26
+ .select { |c| c.type.is_a?(Hash) }
27
+ end
28
+
29
+ # Build typed stage index from identifier types
30
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
31
+ def self.all_typed_stages
32
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
33
+ if klass.const_defined?(:TYPED_STAGES)
34
+ klass.const_get(:TYPED_STAGES)
35
+ else
36
+ []
37
+ end
38
+ end
39
+ end
40
+
41
+ # Lookup: type code -> identifier class
42
+ # @param code [String, Symbol] the type key to find
43
+ # @return [Class, nil] the matching identifier class
44
+ def self.locate_type(code)
45
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
46
+ end
47
+
48
+ # Lookup: abbreviation -> typed stage
49
+ # @param abbr [String, Symbol] the abbreviation to find
50
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
51
+ def self.locate_stage(abbr)
52
+ abbr_str = abbr.to_s.upcase
53
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
54
+ end
17
55
  end
18
56
  end
19
57
 
@@ -3,12 +3,8 @@
3
3
  module Pubid
4
4
  module CenCenelec
5
5
  class Builder < Pubid::Builder::Base
6
- def initialize(scheme)
7
- @scheme = scheme
8
- end
9
-
10
- def self.build(parsed_data, scheme = Scheme.new)
11
- new(scheme).build(parsed_data)
6
+ def self.build(parsed_data)
7
+ new.build(parsed_data)
12
8
  end
13
9
 
14
10
  def build(data)
@@ -40,7 +36,7 @@ module Pubid
40
36
  # Extract supplements before building base identifier (only plus/bundled)
41
37
  supplements_data = extract_supplements(data)
42
38
 
43
- # Determine identifier class using Scheme
39
+ # Determine identifier class using the module's lookup helpers
44
40
  identifier = locate_identifier_klass(data).new
45
41
  assign_attributes(identifier, data)
46
42
 
@@ -83,21 +79,23 @@ module Pubid
83
79
  # Check if publisher is actually a type code (CWA, HD, ES, CR, ENV act as publisher)
84
80
  publisher_str = parsed_hash[:publisher].to_s
85
81
  if %w[CWA HD ES CR ENV].include?(publisher_str)
86
- typed_stage = @scheme.locate_typed_stage_by_abbr(publisher_str)
87
- return @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
82
+ typed_stage = CenCenelec.locate_stage(publisher_str)
83
+ if (klass = CenCenelec.locate_type(typed_stage.type_code))
84
+ return klass
85
+ end
88
86
  end
89
87
 
90
- # Use type or stage to determine class via Scheme
88
+ # Use type or stage to determine class via the module's registry
91
89
  type_or_stage = parsed_hash[:type_with_stage] || parsed_hash[:type] || parsed_hash[:stage] || ""
92
- typed_stage = @scheme.locate_typed_stage_by_abbr(type_or_stage)
93
- @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
90
+ typed_stage = CenCenelec.locate_stage(type_or_stage) || CenCenelec::DEFAULT_TYPED_STAGE
91
+ CenCenelec.locate_type(typed_stage.type_code) || Identifiers::EuropeanNorm
94
92
  end
95
93
 
96
94
  def cast(type, value)
97
95
  case type
98
96
  when :type_with_stage
99
97
  # Lookup from register
100
- typed_stage = @scheme.locate_typed_stage_by_abbr(value || "")
98
+ typed_stage = CenCenelec.locate_stage(value.to_s) || CenCenelec::DEFAULT_TYPED_STAGE
101
99
  {
102
100
  stage: typed_stage.to_stage,
103
101
  type: typed_stage.to_type,
@@ -150,7 +148,7 @@ module Pubid
150
148
 
151
149
  when :stage
152
150
  # Lookup stage in TYPED_STAGES register
153
- typed_stage = @scheme.locate_typed_stage_by_abbr(value.to_s)
151
+ typed_stage = CenCenelec.locate_stage(value.to_s) || CenCenelec::DEFAULT_TYPED_STAGE
154
152
  {
155
153
  stage: typed_stage.to_stage,
156
154
  typed_stage: typed_stage,
@@ -1,12 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+
3
4
  module Pubid
4
5
  module CenCenelec
6
+ # `extend Pubid::IdentifierFacade` adds polymorphic `from_hash` and pairs
7
+ # with `include Pubid::CenCenelec::Identifier` in Identifiers::Base for
8
+ # identity (`is_a?`/`===`), so a consumer handed this module can deserialize
9
+ # and identity-check CEN/CENELEC ids through it.
5
10
  module Identifier
11
+ extend Pubid::IdentifierFacade
12
+
6
13
  def self.parse(identifier)
7
- scheme = Scheme.new
8
14
  parsed = Parser.parse(identifier)
9
- Builder.new(scheme).build(parsed)
15
+ Builder.new.build(parsed)
10
16
  rescue Parslet::ParseFailed => e
11
17
  raise "Failed to parse CEN identifier '#{identifier}': #{e.message}"
12
18
  end
@@ -8,10 +8,19 @@ module Pubid
8
8
  class AdoptedEuropeanNorm < EuropeanNorm
9
9
  attribute :adopted_identifier, Base, polymorphic: true # ISO/IEC/IEEE object
10
10
 
11
- def to_s
12
- result = publisher.is_a?(Array) ? publisher.join("/") : publisher.join("/")
13
- result += " #{adopted_identifier}" if adopted_identifier
14
- result
11
+ # Override self.type to return nil so that AdoptedEuropeanNorm is NOT
12
+ # registered as a type in CenCenelec.identifier_types. The class is a
13
+ # polymorphic wrapper that wraps an adopted ISO/IEC identifier under an
14
+ # EN publisher; it is constructed explicitly by Builder#build_adopted_identifier,
15
+ # not selected via type-code lookup. Returning nil here prevents
16
+ # identifier_types auto-discovery from shadowing EuropeanNorm (which
17
+ # also reports :en) in CenCenelec.locate_type(:en).
18
+ def self.type
19
+ nil
20
+ end
21
+
22
+ def to_s(**opts)
23
+ render(format: :human, **opts)
15
24
  end
16
25
 
17
26
  # Delegate common methods to adopted identifier
@@ -10,14 +10,8 @@ module Pubid
10
10
  attribute :amendment_number, :string
11
11
  attribute :amendment_year, :integer
12
12
 
13
- def to_s
14
- result = if base_identifier
15
- "#{base_identifier}/A#{amendment_number}"
16
- else
17
- "/A#{amendment_number}"
18
- end
19
- result += ":#{amendment_year}" if amendment_year
20
- result
13
+ def to_s(**opts)
14
+ render(format: :human, **opts)
21
15
  end
22
16
 
23
17
  def publisher
@@ -6,6 +6,9 @@ module Pubid
6
6
  # Base CEN identifier
7
7
  # Format: {PUBLISHER} NUMBER[-PART]:YEAR
8
8
  class Base < Pubid::Identifier
9
+ # Identity for the Pubid::CenCenelec::Identifier facade (see its comment).
10
+ include Pubid::CenCenelec::Identifier
11
+
9
12
  # Generate URN for this identifier
10
13
  #
11
14
  # @return [String] URN representation
@@ -20,47 +23,8 @@ module Pubid
20
23
  attribute :adopted_identifier, Base, polymorphic: true # Nested identifier object (ISO, IEC, etc.)
21
24
  attribute :edition, :string # Edition number
22
25
 
23
- def to_s
24
- result = ""
25
-
26
- # Stage or Publisher
27
- if stage
28
- result += stage
29
- elsif publisher&.any?
30
- result += publisher.join("/")
31
- end
32
-
33
- # If we have adopted_identifier, render it (contains all info)
34
- if adopted_identifier
35
- result += " #{adopted_identifier}"
36
- # Don't add our own number/parts/year - they're in adopted_identifier
37
- else
38
- # Only render our own fields if no adoption
39
- # Type - use space for Guide, slash for TR/TS
40
- if type
41
- sep = type == "Guide" ? " " : "/"
42
- result += "#{sep}#{type}"
43
- end
44
-
45
- result += " #{number}"
46
- result += parts.map { |p| "-#{p}" }.join if parts&.any?
47
- result += ":#{year}" if year
48
-
49
- # Supplements
50
- if supplements&.any?
51
- supplements.each do |supp|
52
- sep = supp[:type] == :amendment ? "/" : "+"
53
- result += "#{sep}#{supp[:type] == :amendment ? 'A' : 'AC'}"
54
- result += supp[:number] if supp[:number] && !supp[:number].empty?
55
- result += ":#{supp[:year]}" if supp[:year]
56
- end
57
- end
58
-
59
- # Edition
60
- result += " ED#{edition}" if edition
61
- end
62
-
63
- result
26
+ def to_s(**opts)
27
+ render(format: :human, **opts)
64
28
  end
65
29
 
66
30
  def ==(other)
@@ -20,7 +20,8 @@ module Pubid
20
20
  ].freeze
21
21
 
22
22
  def self.type
23
- { key: :cr, title: "CEN Report", short: "CR" }
23
+ { key: :cr,
24
+ web: :cen_report, title: "CEN Report", short: "CR" }
24
25
  end
25
26
  end
26
27
  end
@@ -19,7 +19,8 @@ module Pubid
19
19
  ].freeze
20
20
 
21
21
  def self.type
22
- { key: :cwa, title: "CEN Workshop Agreement", short: "CWA" }
22
+ { key: :cwa,
23
+ web: :cen_workshop_agreement, title: "CEN Workshop Agreement", short: "CWA" }
23
24
  end
24
25
  end
25
26
  end
@@ -8,31 +8,8 @@ module Pubid
8
8
  class ConsolidatedIdentifier < Base
9
9
  attribute :identifiers, Base, polymorphic: true, collection: true
10
10
 
11
- def to_s
12
- identifiers.map.with_index do |id, idx|
13
- if idx.zero?
14
- # First identifier renders normally
15
- id.to_s
16
- elsif id.is_a?(Amendment)
17
- # Supplements render with "+" prefix (bundled/consolidated format)
18
- result = "+A#{id.amendment_number}"
19
- result += ":#{id.amendment_year}" if id.amendment_year
20
- result
21
- # Only render the amendment portion, not the full id.to_s
22
- elsif id.is_a?(Corrigendum)
23
- # Only render the corrigendum portion
24
- result = "+AC"
25
- result += id.corrigendum_number if id.corrigendum_number && !id.corrigendum_number.empty?
26
- if id.corrigendum_year
27
- result += ":#{id.corrigendum_year}"
28
- result += "-#{id.corrigendum_month}" if id.corrigendum_month && !id.corrigendum_month.empty?
29
- end
30
- result
31
- else
32
- # Other identifiers (should not happen in typical bundles) render with +
33
- "+#{id}"
34
- end
35
- end.compact.join
11
+ def to_s(**opts)
12
+ render(format: :human, **opts)
36
13
  end
37
14
 
38
15
  # Delegate to first identifier (base document)
@@ -11,19 +11,8 @@ module Pubid
11
11
  attribute :corrigendum_year, :integer
12
12
  attribute :corrigendum_month, :string
13
13
 
14
- def to_s
15
- if base_identifier
16
- result = base_identifier.to_s
17
- result += "/AC"
18
- result += corrigendum_number if corrigendum_number && !corrigendum_number.empty?
19
- else
20
- result = "/AC#{corrigendum_number}"
21
- end
22
- if corrigendum_year
23
- result += ":#{corrigendum_year}"
24
- result += "-#{corrigendum_month}" if corrigendum_month && !corrigendum_month.empty?
25
- end
26
- result
14
+ def to_s(**opts)
15
+ render(format: :human, **opts)
27
16
  end
28
17
 
29
18
  def publisher
@@ -33,7 +33,8 @@ module Pubid
33
33
  ].freeze
34
34
 
35
35
  def self.type
36
- { key: :en, title: "European Norm", short: "EN" }
36
+ { key: :en,
37
+ web: :european_norm, title: "European Norm", short: "EN" }
37
38
  end
38
39
  end
39
40
  end
@@ -21,15 +21,12 @@ module Pubid
21
21
  ].freeze
22
22
 
23
23
  def self.type
24
- { key: :env, title: "European Prestandard", short: "ENV" }
24
+ { key: :env,
25
+ web: :european_prestandard, title: "European Prestandard", short: "ENV" }
25
26
  end
26
27
 
27
- def to_s(lang: :en, lang_single: false)
28
- if adopted_identifier
29
- "ENV #{adopted_identifier}"
30
- else
31
- super
32
- end
28
+ def to_s(lang: :en, lang_single: false, **opts)
29
+ render(format: :human, lang: lang, lang_single: lang_single, **opts)
33
30
  end
34
31
  end
35
32
  end
@@ -20,7 +20,8 @@ module Pubid
20
20
  ].freeze
21
21
 
22
22
  def self.type
23
- { key: :es, title: "European Specification", short: "ES" }
23
+ { key: :es,
24
+ web: :european_specification, title: "European Specification", short: "ES" }
24
25
  end
25
26
  end
26
27
  end
@@ -9,8 +9,8 @@ module Pubid
9
9
  attribute :base_identifier, Amendment
10
10
  attribute :fragment_number, :string
11
11
 
12
- def to_s
13
- "#{base_identifier} FRAG#{fragment_number}"
12
+ def to_s(**opts)
13
+ render(format: :human, **opts)
14
14
  end
15
15
 
16
16
  def publisher
@@ -19,7 +19,8 @@ module Pubid
19
19
  ].freeze
20
20
 
21
21
  def self.type
22
- { key: :hd, title: "Harmonization Document", short: "HD" }
22
+ { key: :hd,
23
+ web: :harmonization_document, title: "Harmonization Document", short: "HD" }
23
24
  end
24
25
  end
25
26
  end
@@ -19,7 +19,8 @@ module Pubid
19
19
  ].freeze
20
20
 
21
21
  def self.type
22
- { key: :tr, title: "Technical Report", short: "TR" }
22
+ { key: :tr,
23
+ web: :technical_report, title: "Technical Report", short: "TR" }
23
24
  end
24
25
  end
25
26
  end
@@ -27,7 +27,8 @@ module Pubid
27
27
  ].freeze
28
28
 
29
29
  def self.type
30
- { key: :ts, title: "Technical Specification", short: "TS" }
30
+ { key: :ts,
31
+ web: :technical_specification, title: "Technical Specification", short: "TS" }
31
32
  end
32
33
  end
33
34
  end