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
@@ -1,9 +1,4 @@
1
- require_relative "../single_identifier"
2
1
  # frozen_string_literal: true
3
- require_relative "../components/publisher"
4
- require_relative "../components/code"
5
- require_relative "../components/vap_suffix"
6
- require_relative "../components/trf_info"
7
2
 
8
3
  module Pubid
9
4
  module Iec
@@ -12,33 +7,21 @@ module Pubid
12
7
  # Inherits from SingleIdentifier to get common functionality
13
8
  # Single Responsibility: Common IEC identifier attributes and behavior
14
9
  class Base < SingleIdentifier
15
- # IEC-specific attributes
16
- attribute :vap_suffix, Components::VapSuffix, default: -> {}
10
+ # IEC-specific attributes. VAP codes live on VapIdentifier, not here.
17
11
  attribute :trf_info, Components::TrfInfo, default: -> {}
18
12
  attribute :database, :boolean, default: -> { false }
19
13
  attribute :fragment, :string, default: -> {}
20
14
  attribute :version, :string, default: -> {}
21
15
  attribute :decision_sheet, :string, default: -> {}
22
16
 
23
- def to_s(_format = :short)
24
- parts = []
25
-
26
- # Publisher and type portion (from typed_stage) - uses inherited method
27
- parts << publisher_portion
28
-
29
- # Number portion (number with part/subpart)
30
- parts << number_portion
31
-
32
- # Edition if present - add space before edition
33
- parts << " #{edition}" if edition&.number
34
-
35
- # VAP suffix
36
- parts << vap_suffix.render_with_space if vap_suffix
37
-
38
- # Database flag
39
- parts << " DB" if database
17
+ # database is the only Base-specific serialized key (emitted when set);
18
+ # merged onto the common map inherited from Identifier.
19
+ key_value do
20
+ map "database", to: :database, render_default: false
21
+ end
40
22
 
41
- parts.compact.join
23
+ def to_s(**opts)
24
+ render(format: :human, **opts)
42
25
  end
43
26
 
44
27
  def number_portion
@@ -66,9 +49,6 @@ module Pubid
66
49
  def validate!
67
50
  super if defined?(super)
68
51
 
69
- # Validate VAP suffix if present
70
- vap_suffix&.validate!
71
-
72
52
  # Validate TRF info if present
73
53
  trf_info&.validate! if trf_info && !trf_info.empty?
74
54
  end
@@ -1,5 +1,4 @@
1
- require_relative "base"
2
- require_relative "../../components/typed_stage"
1
+ # frozen_string_literal: true
3
2
 
4
3
  module Pubid
5
4
  module Iec
@@ -20,7 +19,8 @@ module Pubid
20
19
  ].freeze
21
20
 
22
21
  def self.type
23
- { key: :cs, title: "Component Specification", short: "CS" }
22
+ { key: :cs,
23
+ web: :component_specification, title: "Component Specification", short: "CS" }
24
24
  end
25
25
 
26
26
  # Override publisher_portion to add CS
@@ -1,5 +1,4 @@
1
- require_relative "base"
2
- require_relative "../../components/typed_stage"
1
+ # frozen_string_literal: true
3
2
 
4
3
  module Pubid
5
4
  module Iec
@@ -1,4 +1,3 @@
1
- require_relative "../identifier"
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module Pubid
@@ -11,31 +10,33 @@ module Pubid
11
10
  class ConsolidatedIdentifier < Identifier
12
11
  attribute :identifiers, Identifier, polymorphic: true, collection: true
13
12
 
14
- def to_s(lang: :en, lang_single: false, with_edition: false)
15
- identifiers.map.with_index do |id, idx|
16
- if idx.zero?
17
- # First identifier renders normally
18
- id.to_s(lang: lang, lang_single: lang_single,
19
- with_edition: with_edition)
20
- elsif id.is_a?(Amendment)
21
- # Subsequent identifiers render with + prefix
22
- # For amendments, just show +AMDn:year part (or +AMDn if no date)
23
- if id.date&.year && !id.date.year.empty?
24
- "+AMD#{id.number}:#{id.date.year}"
25
- else
26
- "+AMD#{id.number}"
27
- end
28
- elsif id.is_a?(Corrigendum)
29
- if id.date&.year && !id.date.year.empty?
30
- "+COR#{id.number}:#{id.date.year}"
31
- else
32
- "+COR#{id.number}"
33
- end
34
- else
35
- "+#{id.to_s(lang: lang, lang_single: lang_single,
36
- with_edition: with_edition)}"
37
- end
38
- end.join
13
+ # Common fields are delegated to identifiers.first, so suppress the
14
+ # inherited common maps and serialize the wrapped identifiers (base
15
+ # document + supplements) instead. Route each nested hash back through
16
+ # Identifier.from_hash so its concrete subclass is reconstructed.
17
+ include Pubid::Iec::DelegatedFieldSuppression
18
+
19
+ key_value do
20
+ map "identifiers",
21
+ with: { to: :identifiers_to_kv, from: :identifiers_from_kv }
22
+ end
23
+
24
+ def identifiers_to_kv(model, doc)
25
+ return unless model.identifiers&.any?
26
+
27
+ doc.add_child(Lutaml::KeyValue::DataModel::Element.new(
28
+ "identifiers", model.identifiers.map(&:to_hash)
29
+ ))
30
+ end
31
+
32
+ def identifiers_from_kv(model, value)
33
+ model.identifiers = Array(value).map do |h|
34
+ ::Pubid::Iec::Identifier.from_hash(h)
35
+ end
36
+ end
37
+
38
+ def to_s(**opts)
39
+ render(format: :human, **opts)
39
40
  end
40
41
 
41
42
  # Delegate common attributes to first identifier (base document)
@@ -59,10 +60,6 @@ module Pubid
59
60
  identifiers&.first&.date
60
61
  end
61
62
 
62
- def type
63
- :consolidated
64
- end
65
-
66
63
  def stage
67
64
  identifiers&.first&.stage
68
65
  end
@@ -1,6 +1,4 @@
1
- require_relative "../supplement_identifier"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -86,7 +84,8 @@ module Pubid
86
84
  ].freeze
87
85
 
88
86
  def self.type
89
- { key: :cor, title: "Corrigendum", short: "COR" }
87
+ { key: :cor,
88
+ web: :corrigendum, title: "Corrigendum", short: "COR" }
90
89
  end
91
90
  end
92
91
  end
@@ -1,6 +1,4 @@
1
- require_relative "../identifier"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -13,7 +11,39 @@ module Pubid
13
11
  attribute :base_identifier, Identifier, polymorphic: true
14
12
  attribute :fragment_number, :string
15
13
  attribute :edition, ::Pubid::Components::Edition, default: -> {}
16
- attribute :typed_stage, ::Pubid::Components::TypedStage
14
+ # Fragments have their own lifecycle; default to the published FRAG stage
15
+ # so an omitted "stage" reconstructs it on from_hash.
16
+ attribute :typed_stage, ::Pubid::Components::TypedStage,
17
+ default: -> { self.class.published_typed_stage }
18
+
19
+ # number/date/publisher delegate to base_identifier, but the fragment's
20
+ # stage and edition are its own. Serialize the wrapped identifier under
21
+ # "base" plus the fragment number; suppress only the truly-delegated
22
+ # common maps (keep stage/edition from the inherited block).
23
+ key_value do
24
+ map "base", with: { to: :base_to_kv, from: :base_from_kv }
25
+ map "fragment_number", to: :fragment_number, render_default: false
26
+ end
27
+
28
+ def number_to_kv(_model, _doc); end
29
+ def part_to_kv(_model, _doc); end
30
+ def subpart_to_kv(_model, _doc); end
31
+ def stage_iteration_to_kv(_model, _doc); end
32
+ def year_to_kv(_model, _doc); end
33
+ def publisher_to_kv(_model, _doc); end
34
+ def copublishers_to_kv(_model, _doc); end
35
+
36
+ def base_to_kv(model, doc)
37
+ base = model.base_identifier
38
+ return unless base
39
+
40
+ doc.add_child(Lutaml::KeyValue::DataModel::Element.new("base",
41
+ base.to_hash))
42
+ end
43
+
44
+ def base_from_kv(model, value)
45
+ model.base_identifier = ::Pubid::Iec::Identifier.from_hash(value) if value
46
+ end
17
47
 
18
48
  TYPED_STAGES = [
19
49
  Pubid::Components::TypedStage.new(
@@ -84,27 +114,12 @@ module Pubid
84
114
  ].freeze
85
115
 
86
116
  def self.type
87
- { key: :frag, title: "Fragment", short: "FRAG" }
117
+ { key: :frag,
118
+ web: :fragment_identifier, title: "Fragment", short: "FRAG" }
88
119
  end
89
120
 
90
- def to_s(lang: :en, lang_single: false, with_edition: false)
91
- parts = []
92
-
93
- # Render base identifier (the amendment/corrigendum)
94
- parts << base_identifier.to_s(lang: lang, lang_single: lang_single,
95
- with_edition: with_edition)
96
-
97
- # Add fragment notation /FRAGN or /FRAGCN depending on base type
98
- parts << if base_identifier.is_a?(Identifiers::Corrigendum)
99
- "/FRAGC#{fragment_number}"
100
- else
101
- "/FRAG#{fragment_number}"
102
- end
103
-
104
- # Add edition if present
105
- parts << " #{edition}" if edition&.number
106
-
107
- parts.join
121
+ def to_s(**opts)
122
+ render(format: :human, **opts)
108
123
  end
109
124
 
110
125
  # Delegate common attributes to base_identifier
@@ -128,10 +143,6 @@ module Pubid
128
143
  base_identifier&.date
129
144
  end
130
145
 
131
- def type
132
- :frag
133
- end
134
-
135
146
  def stage
136
147
  typed_stage&.to_stage || base_identifier&.stage
137
148
  end
@@ -1,6 +1,4 @@
1
- require_relative "base"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -1,6 +1,4 @@
1
- require_relative "base"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -139,7 +137,8 @@ module Pubid
139
137
  }.freeze
140
138
 
141
139
  def self.type
142
- { key: :is, title: "International Standard", short: nil }
140
+ { key: :is,
141
+ web: :international_standard, title: "International Standard", short: nil }
143
142
  end
144
143
  end
145
144
  end
@@ -1,6 +1,4 @@
1
- require_relative "../supplement_identifier"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -96,7 +94,8 @@ module Pubid
96
94
  }.freeze
97
95
 
98
96
  def self.type
99
- { key: :ish, title: "Interpretation Sheet", short: "ISH" }
97
+ { key: :ish,
98
+ web: :interpretation_sheet, title: "Interpretation Sheet", short: "ISH" }
100
99
  end
101
100
  end
102
101
  end
@@ -1,5 +1,4 @@
1
- require_relative "base"
2
- require_relative "../../components/typed_stage"
1
+ # frozen_string_literal: true
3
2
 
4
3
  module Pubid
5
4
  module Iec
@@ -20,7 +19,8 @@ module Pubid
20
19
  ].freeze
21
20
 
22
21
  def self.type
23
- { key: :od, title: "Operational Document", short: "OD" }
22
+ { key: :od,
23
+ web: :operational_document, title: "Operational Document", short: "OD" }
24
24
  end
25
25
 
26
26
  # Override publisher_portion to add OD
@@ -1,6 +1,4 @@
1
- require_relative "base"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -80,7 +78,8 @@ module Pubid
80
78
  }.freeze
81
79
 
82
80
  def self.type
83
- { key: :pas, title: "Publicly Available Specification", short: "PAS" }
81
+ { key: :pas,
82
+ web: :publicly_available_specification, title: "Publicly Available Specification", short: "PAS" }
84
83
  end
85
84
 
86
85
  # Override publisher_portion to add PAS or DPAS stage
@@ -1,4 +1,3 @@
1
- require_relative "../identifier"
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module Pubid
@@ -12,20 +11,31 @@ module Pubid
12
11
  attribute :sheet_number, :string
13
12
  attribute :year, :string, default: -> {}
14
13
 
15
- def to_s(lang: :en, lang_single: false, with_edition: false)
16
- parts = []
14
+ # Common fields are delegated to base_identifier, so serialize the
15
+ # wrapped identifier under "base" plus the sheet number/year; suppress
16
+ # the delegated common maps (they live inside "base").
17
+ include Pubid::Iec::DelegatedFieldSuppression
17
18
 
18
- # Render base identifier
19
- parts << base_identifier.to_s(lang: lang, lang_single: lang_single,
20
- with_edition: with_edition)
19
+ key_value do
20
+ map "base", with: { to: :base_to_kv, from: :base_from_kv }
21
+ map "sheet_number", to: :sheet_number, render_default: false
22
+ map "sheet_year", to: :year, render_default: false
23
+ end
24
+
25
+ def base_to_kv(model, doc)
26
+ base = model.base_identifier
27
+ return unless base
21
28
 
22
- # Add sheet notation /N
23
- parts << "/#{sheet_number}"
29
+ doc.add_child(Lutaml::KeyValue::DataModel::Element.new("base",
30
+ base.to_hash))
31
+ end
24
32
 
25
- # Add year if present
26
- parts << ":#{year}" if year
33
+ def base_from_kv(model, value)
34
+ model.base_identifier = ::Pubid::Iec::Identifier.from_hash(value) if value
35
+ end
27
36
 
28
- parts.join
37
+ def to_s(**opts)
38
+ render(format: :human, **opts)
29
39
  end
30
40
 
31
41
  # Delegate common attributes to base_identifier
@@ -49,10 +59,6 @@ module Pubid
49
59
  base_identifier&.date
50
60
  end
51
61
 
52
- def type
53
- :sheet
54
- end
55
-
56
62
  def stage
57
63
  base_identifier&.stage
58
64
  end
@@ -1,5 +1,4 @@
1
- require_relative "base"
2
- require_relative "../../components/typed_stage"
1
+ # frozen_string_literal: true
3
2
 
4
3
  module Pubid
5
4
  module Iec
@@ -20,7 +19,8 @@ module Pubid
20
19
  ].freeze
21
20
 
22
21
  def self.type
23
- { key: :sttr, title: "Societal and Technology Trend Report",
22
+ { key: :sttr,
23
+ web: :societal_technology_trend_report, title: "Societal and Technology Trend Report",
24
24
  short: "Trend Report" }
25
25
  end
26
26
 
@@ -1,6 +1,4 @@
1
- require_relative "base"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -21,7 +19,8 @@ module Pubid
21
19
  ].freeze
22
20
 
23
21
  def self.type
24
- { key: :srd, title: "Systems Reference Document", short: "SRD" }
22
+ { key: :srd,
23
+ web: :systems_reference_document, title: "Systems Reference Document", short: "SRD" }
25
24
  end
26
25
 
27
26
  # Override publisher_portion to add SRD
@@ -1,6 +1,4 @@
1
- require_relative "base"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -106,7 +104,8 @@ module Pubid
106
104
  }.freeze
107
105
 
108
106
  def self.type
109
- { key: :tr, title: "Technical Report", short: "TR" }
107
+ { key: :tr,
108
+ web: :technical_report, title: "Technical Report", short: "TR" }
110
109
  end
111
110
 
112
111
  # Override publisher_portion to handle TR formatting
@@ -1,6 +1,4 @@
1
- require_relative "base"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -106,7 +104,8 @@ module Pubid
106
104
  }.freeze
107
105
 
108
106
  def self.type
109
- { key: :ts, title: "Technical Specification", short: "TS" }
107
+ { key: :ts,
108
+ web: :technical_specification, title: "Technical Specification", short: "TS" }
110
109
  end
111
110
 
112
111
  # Override publisher_portion to handle TS formatting
@@ -1,5 +1,4 @@
1
- require_relative "base"
2
- require_relative "../../components/typed_stage"
1
+ # frozen_string_literal: true
3
2
 
4
3
  module Pubid
5
4
  module Iec
@@ -1,6 +1,4 @@
1
- require_relative "base"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/typed_stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -26,7 +24,8 @@ module Pubid
26
24
  ].freeze
27
25
 
28
26
  def self.type
29
- { key: :trf, title: "Test Report Form", short: "TRF" }
27
+ { key: :trf,
28
+ web: :test_report_form, title: "Test Report Form", short: "TRF" }
30
29
  end
31
30
 
32
31
  # Override publisher_portion to add TRF with space
@@ -40,37 +39,9 @@ module Pubid
40
39
  result
41
40
  end
42
41
 
43
- # TRF uses special rendering
44
- def to_s(_format = :short)
45
- parts = []
46
-
47
- # Publisher and type portion
48
- parts << publisher_portion
49
-
50
- # If CISPR identifier embedded, render it with TRF date
51
- if cispr_identifier
52
- cispr_parts = []
53
- cispr_parts << cispr_identifier.publisher.body
54
-
55
- # Build number portion with part
56
- num_str = cispr_identifier.number.to_s
57
- num_str += "-#{cispr_identifier.part}" if cispr_identifier.part && cispr_identifier.part.to_s != ""
58
- cispr_parts << num_str
59
-
60
- # Join with space and add TRF year
61
- cispr_str = cispr_parts.join(" ")
62
- cispr_str += ":#{date.year}" if date
63
-
64
- parts << " #{cispr_str}"
65
- else
66
- # Normal TRF: number portion
67
- parts << number_portion
68
- end
69
-
70
- # TRF info if present (handles version, decision sheet, etc.)
71
- parts << trf_info.to_s if trf_info && !trf_info.empty?
72
-
73
- parts.compact.join
42
+ # TRF uses special rendering via the Renderer
43
+ def to_s(**opts)
44
+ render(format: :human, **opts)
74
45
  end
75
46
  end
76
47
  end
@@ -1,6 +1,4 @@
1
- require_relative "../identifier"
2
1
  # frozen_string_literal: true
3
- require_relative "../components/vap_suffix"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -10,9 +8,32 @@ module Pubid
10
8
  # Examples: "IEC 61666:2010+AMD1:2021 CSV"
11
9
  class VapIdentifier < Identifier
12
10
  attribute :base_identifier, Identifier, polymorphic: true
13
- attribute :vap_suffix, Components::VapSuffix
11
+ # One or more VAP codes (e.g. ["CSV"] or ["EXV", "CMV"]). Plain strings.
12
+ attribute :vap, :string, collection: true
14
13
  attribute :edition, ::Pubid::Components::Edition, default: -> {}
15
14
 
15
+ # number/date/publisher/stage are delegated to base_identifier, so
16
+ # serialize the wrapped identifier under "base" plus the vap array; the
17
+ # common fields live inside "base", not at the top level.
18
+ include Pubid::Iec::DelegatedFieldSuppression
19
+
20
+ key_value do
21
+ map "base", with: { to: :base_to_kv, from: :base_from_kv }
22
+ map "vap", to: :vap, render_default: false
23
+ end
24
+
25
+ def base_to_kv(model, doc)
26
+ base = model.base_identifier
27
+ return unless base
28
+
29
+ doc.add_child(Lutaml::KeyValue::DataModel::Element.new("base",
30
+ base.to_hash))
31
+ end
32
+
33
+ def base_from_kv(model, value)
34
+ model.base_identifier = ::Pubid::Iec::Identifier.from_hash(value) if value
35
+ end
36
+
16
37
  # VAP types mapping
17
38
  TYPE_MAP = {
18
39
  "CSV" => "Consolidated version (with Supplements)",
@@ -21,22 +42,8 @@ module Pubid
21
42
  "SER" => "Serial version",
22
43
  }.freeze
23
44
 
24
- def to_s(lang: :en, lang_single: false, with_edition: false)
25
- parts = []
26
-
27
- # Render base identifier WITHOUT edition (edition goes at VAP level)
28
- parts << base_identifier.to_s(lang: lang, lang_single: lang_single,
29
- with_edition: false)
30
-
31
- # Add VAP suffix with space
32
- if vap_suffix
33
- parts << " #{vap_suffix}"
34
- end
35
-
36
- # Add edition after VAP suffix if present
37
- parts << " #{edition}" if edition&.number
38
-
39
- parts.compact.join
45
+ def to_s(**opts)
46
+ render(format: :human, **opts)
40
47
  end
41
48
 
42
49
  # Delegate common attributes to base_identifier
@@ -60,10 +67,6 @@ module Pubid
60
67
  base_identifier&.date
61
68
  end
62
69
 
63
- def type
64
- :vap
65
- end
66
-
67
70
  def stage
68
71
  base_identifier&.stage
69
72
  end
@@ -1,5 +1,4 @@
1
- require_relative "base"
2
- require_relative "../../components/typed_stage"
1
+ # frozen_string_literal: true
3
2
 
4
3
  module Pubid
5
4
  module Iec
@@ -20,7 +19,8 @@ module Pubid
20
19
  ].freeze
21
20
 
22
21
  def self.type
23
- { key: :wp, title: "White Paper", short: "White Paper" }
22
+ { key: :wp,
23
+ web: :white_paper, title: "White Paper", short: "White Paper" }
24
24
  end
25
25
 
26
26
  # Override publisher_portion to add White Paper