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
@@ -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,37 +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
40
-
41
- # All-parts marker — rendered the same as the generic
42
- # HumanReadable renderer for parity (see Pubid::Renderers::HumanReadable#render).
43
- parts << " (all parts)" if all_parts
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
44
22
 
45
- parts.compact.join
23
+ def to_s(**opts)
24
+ render(format: :human, **opts)
46
25
  end
47
26
 
48
27
  def number_portion
@@ -70,9 +49,6 @@ module Pubid
70
49
  def validate!
71
50
  super if defined?(super)
72
51
 
73
- # Validate VAP suffix if present
74
- vap_suffix&.validate!
75
-
76
52
  # Validate TRF info if present
77
53
  trf_info&.validate! if trf_info && !trf_info.empty?
78
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)
@@ -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
@@ -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
@@ -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
@@ -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
@@ -1,6 +1,4 @@
1
- require_relative "base"
2
1
  # frozen_string_literal: true
3
- require_relative "../../components/stage"
4
2
 
5
3
  module Pubid
6
4
  module Iec
@@ -26,7 +24,8 @@ module Pubid
26
24
  PROJECT_STAGES = {}.freeze
27
25
 
28
26
  def self.type
29
- { key: :wd, title: "Working Document", short: "WD" }
27
+ { key: :wd,
28
+ web: :working_document, title: "Working Document", short: "WD" }
30
29
  end
31
30
 
32
31
  # Return stage object for PWI/PNW stage
@@ -44,51 +43,8 @@ module Pubid
44
43
  @stage ||= ::Pubid::Components::Stage.new(stage_code: stage_code)
45
44
  end
46
45
 
47
- def to_s(_format = :short)
48
- # Working Programme format: "PWI TR 100-36 ED1" or "IEC/PWI 60038"
49
- if wp_stage
50
- parts = []
51
- # Include publisher if present (for IEC/PWI format)
52
- if publisher
53
- parts << publisher.body
54
- if copublishers&.any?
55
- parts << "/#{copublishers.map(&:body).join('/')}"
56
- end
57
- parts << "/"
58
- end
59
- parts << wp_stage
60
- # Only add wp_type if it exists and is not empty/whitespace
61
- if wp_type && !wp_type.strip.empty?
62
- parts << " #{wp_type.strip}"
63
- end
64
-
65
- # Render full number with parts
66
- if number
67
- num_str = number.to_s
68
- num_str += "-#{part}" if part && part.to_s != ""
69
- num_str += "-#{subpart}" if subpart && subpart.to_s != ""
70
- parts << " #{num_str}"
71
- end
72
-
73
- parts << " #{edition}" if edition&.number
74
- return parts.join
75
- end
76
-
77
- # Working Document format: "100/3705(F)/FDIS"
78
- parts = []
79
-
80
- parts << technical_committee if technical_committee
81
-
82
- # Number with optional language
83
- if wd_number
84
- num_part = wd_number.to_s
85
- num_part += "(#{wd_language})" if wd_language
86
- parts << num_part
87
- end
88
-
89
- parts << wd_stage if wd_stage
90
-
91
- parts.join("/")
46
+ def to_s(**opts)
47
+ render(format: :human, **opts)
92
48
  end
93
49
  end
94
50
  end