pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.4

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 (473) 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 +4 -55
  6. data/lib/pubid/amca/identifiers/base.rb +58 -47
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -21
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -17
  9. data/lib/pubid/amca/identifiers/standard.rb +0 -4
  10. data/lib/pubid/amca/renderer.rb +82 -0
  11. data/lib/pubid/amca/single_identifier.rb +0 -23
  12. data/lib/pubid/amca/urn_generator.rb +2 -1
  13. data/lib/pubid/amca/urn_parser.rb +28 -0
  14. data/lib/pubid/amca.rb +42 -1
  15. data/lib/pubid/ansi/builder.rb +5 -3
  16. data/lib/pubid/ansi/identifier.rb +1 -43
  17. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  18. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  19. data/lib/pubid/ansi/renderer.rb +53 -0
  20. data/lib/pubid/ansi/single_identifier.rb +2 -31
  21. data/lib/pubid/ansi/urn_generator.rb +3 -38
  22. data/lib/pubid/ansi/urn_parser.rb +23 -0
  23. data/lib/pubid/ansi.rb +38 -3
  24. data/lib/pubid/api/builder.rb +33 -74
  25. data/lib/pubid/api/identifier.rb +5 -52
  26. data/lib/pubid/api/identifiers/base.rb +2 -14
  27. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  28. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  29. data/lib/pubid/api/identifiers/mpms.rb +0 -20
  30. data/lib/pubid/api/identifiers/publication.rb +0 -2
  31. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  32. data/lib/pubid/api/identifiers/specification.rb +0 -2
  33. data/lib/pubid/api/identifiers/standard.rb +0 -2
  34. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  35. data/lib/pubid/api/identifiers/typeless_standard.rb +0 -16
  36. data/lib/pubid/api/identifiers.rb +18 -0
  37. data/lib/pubid/api/renderer.rb +89 -0
  38. data/lib/pubid/api/single_identifier.rb +5 -20
  39. data/lib/pubid/api/urn_generator.rb +0 -18
  40. data/lib/pubid/api/urn_parser.rb +35 -0
  41. data/lib/pubid/api.rb +51 -5
  42. data/lib/pubid/ashrae/builder.rb +3 -3
  43. data/lib/pubid/ashrae/identifier.rb +7 -55
  44. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  45. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  46. data/lib/pubid/ashrae/identifiers/base.rb +29 -15
  47. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  48. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  49. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  50. data/lib/pubid/ashrae/parser.rb +4 -0
  51. data/lib/pubid/ashrae/renderer.rb +117 -0
  52. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  53. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  54. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  55. data/lib/pubid/ashrae.rb +46 -1
  56. data/lib/pubid/asme/components/code.rb +10 -2
  57. data/lib/pubid/asme/identifier.rb +0 -46
  58. data/lib/pubid/asme/identifiers/base.rb +0 -60
  59. data/lib/pubid/asme/renderer.rb +66 -0
  60. data/lib/pubid/asme/single_identifier.rb +3 -1
  61. data/lib/pubid/asme/urn_parser.rb +31 -0
  62. data/lib/pubid/asme.rb +42 -1
  63. data/lib/pubid/astm/components/code.rb +9 -0
  64. data/lib/pubid/{jis → astm}/components.rb +1 -1
  65. data/lib/pubid/astm/identifier.rb +0 -77
  66. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  67. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  68. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  69. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  70. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  71. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  72. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  73. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  74. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  75. data/lib/pubid/astm/identifiers.rb +18 -0
  76. data/lib/pubid/astm/renderer.rb +172 -0
  77. data/lib/pubid/astm/single_identifier.rb +3 -11
  78. data/lib/pubid/astm/urn_parser.rb +30 -0
  79. data/lib/pubid/astm.rb +39 -27
  80. data/lib/pubid/bsi/builder.rb +21 -12
  81. data/lib/pubid/bsi/identifier.rb +5 -85
  82. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -36
  83. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +8 -48
  84. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +8 -39
  85. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +2 -55
  86. data/lib/pubid/bsi/identifiers/amendment.rb +2 -22
  87. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +1 -6
  88. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  89. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -87
  90. data/lib/pubid/bsi/identifiers/committee_document.rb +0 -16
  91. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -87
  92. data/lib/pubid/bsi/identifiers/corrigendum.rb +2 -10
  93. data/lib/pubid/bsi/identifiers/detailed_specification.rb +0 -36
  94. data/lib/pubid/bsi/identifiers/disc.rb +0 -29
  95. data/lib/pubid/bsi/identifiers/draft_document.rb +2 -46
  96. data/lib/pubid/bsi/identifiers/electronic_book.rb +2 -38
  97. data/lib/pubid/bsi/identifiers/expert_commentary.rb +2 -18
  98. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +0 -47
  99. data/lib/pubid/bsi/identifiers/flex.rb +0 -35
  100. data/lib/pubid/bsi/identifiers/handbook.rb +1 -15
  101. data/lib/pubid/bsi/identifiers/index.rb +0 -32
  102. data/lib/pubid/bsi/identifiers/method.rb +0 -41
  103. data/lib/pubid/bsi/identifiers/national_annex.rb +4 -29
  104. data/lib/pubid/bsi/identifiers/practice_guide.rb +1 -6
  105. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +2 -54
  106. data/lib/pubid/bsi/identifiers/published_document.rb +2 -54
  107. data/lib/pubid/bsi/identifiers/section.rb +0 -30
  108. data/lib/pubid/bsi/identifiers/set.rb +3 -20
  109. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +0 -9
  110. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -24
  111. data/lib/pubid/bsi/identifiers/supplementary_index.rb +0 -46
  112. data/lib/pubid/bsi/identifiers/technical_specification.rb +2 -47
  113. data/lib/pubid/bsi/identifiers/test_method.rb +0 -32
  114. data/lib/pubid/bsi/identifiers/value_added_publication.rb +2 -17
  115. data/lib/pubid/bsi/identifiers.rb +0 -1
  116. data/lib/pubid/bsi/renderer.rb +1050 -0
  117. data/lib/pubid/bsi/single_identifier.rb +33 -78
  118. data/lib/pubid/bsi/urn_generator.rb +2 -3
  119. data/lib/pubid/bsi/urn_parser.rb +52 -0
  120. data/lib/pubid/bsi.rb +232 -2
  121. data/lib/pubid/builder/base.rb +57 -10
  122. data/lib/pubid/bundled_identifier.rb +0 -1
  123. data/lib/pubid/ccsds/builder.rb +4 -3
  124. data/lib/pubid/ccsds/identifier.rb +53 -68
  125. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  126. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  127. data/lib/pubid/ccsds/parser.rb +4 -2
  128. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  129. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  130. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  131. data/lib/pubid/ccsds.rb +39 -1
  132. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  133. data/lib/pubid/cen_cenelec/identifier.rb +11 -40
  134. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +9 -4
  135. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +0 -10
  136. data/lib/pubid/cen_cenelec/identifiers/base.rb +2 -45
  137. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +0 -27
  140. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +0 -15
  141. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +2 -8
  143. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +0 -4
  145. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  146. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  147. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  148. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  149. data/lib/pubid/cen_cenelec/single_identifier.rb +9 -90
  150. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  151. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  152. data/lib/pubid/cen_cenelec.rb +172 -1
  153. data/lib/pubid/cie/components/code.rb +8 -0
  154. data/lib/pubid/cie/identifier.rb +10 -57
  155. data/lib/pubid/cie/single_identifier.rb +4 -4
  156. data/lib/pubid/cie/urn_parser.rb +28 -0
  157. data/lib/pubid/cie.rb +47 -1
  158. data/lib/pubid/components/adoption.rb +104 -0
  159. data/lib/pubid/components/code.rb +22 -8
  160. data/lib/pubid/components/date.rb +23 -16
  161. data/lib/pubid/components/edition.rb +9 -6
  162. data/lib/pubid/components/iteration.rb +32 -0
  163. data/lib/pubid/components/language.rb +6 -4
  164. data/lib/pubid/components/locality.rb +10 -1
  165. data/lib/pubid/components/publisher.rb +9 -6
  166. data/lib/pubid/components/relationship.rb +151 -0
  167. data/lib/pubid/components/stage.rb +5 -14
  168. data/lib/pubid/components/supplement.rb +184 -0
  169. data/lib/pubid/components/type.rb +5 -15
  170. data/lib/pubid/components/typed_stage.rb +10 -11
  171. data/lib/pubid/components.rb +4 -1
  172. data/lib/pubid/core/update_codes.rb +28 -7
  173. data/lib/pubid/csa/identifier.rb +9 -59
  174. data/lib/pubid/csa/identifiers/base.rb +0 -123
  175. data/lib/pubid/csa/identifiers/cec.rb +0 -103
  176. data/lib/pubid/csa/identifiers/series.rb +0 -104
  177. data/lib/pubid/csa/renderer.rb +292 -0
  178. data/lib/pubid/csa/single_identifier.rb +1 -1
  179. data/lib/pubid/csa/urn_generator.rb +1 -1
  180. data/lib/pubid/csa/urn_parser.rb +33 -0
  181. data/lib/pubid/csa.rb +46 -1
  182. data/lib/pubid/etsi/components/code.rb +10 -9
  183. data/lib/pubid/etsi/components/version.rb +0 -5
  184. data/lib/pubid/etsi/identifier.rb +4 -55
  185. data/lib/pubid/etsi/identifiers/base.rb +31 -27
  186. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +1 -11
  187. data/lib/pubid/etsi/renderer.rb +42 -0
  188. data/lib/pubid/etsi/urn_parser.rb +34 -0
  189. data/lib/pubid/etsi.rb +44 -1
  190. data/lib/pubid/export/exporter.rb +4 -46
  191. data/lib/pubid/export/flavor_exporter.rb +111 -278
  192. data/lib/pubid/export.rb +0 -6
  193. data/lib/pubid/identifier.rb +92 -18
  194. data/lib/pubid/identifier_metadata.rb +1 -1
  195. data/lib/pubid/idf/builder.rb +3 -3
  196. data/lib/pubid/idf/identifier.rb +7 -66
  197. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  198. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  199. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  200. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  201. data/lib/pubid/idf/parser.rb +3 -2
  202. data/lib/pubid/idf/renderer.rb +84 -0
  203. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  204. data/lib/pubid/idf/urn_generator.rb +4 -39
  205. data/lib/pubid/idf/urn_parser.rb +25 -0
  206. data/lib/pubid/idf.rb +55 -1
  207. data/lib/pubid/iec/builder.rb +46 -64
  208. data/lib/pubid/iec/components/code.rb +8 -32
  209. data/lib/pubid/iec/components/publisher.rb +0 -1
  210. data/lib/pubid/iec/components.rb +14 -0
  211. data/lib/pubid/iec/identifier.rb +251 -213
  212. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  213. data/lib/pubid/iec/identifiers/base.rb +5 -33
  214. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  215. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  216. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +23 -26
  217. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  218. data/lib/pubid/iec/identifiers/fragment_identifier.rb +35 -24
  219. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  220. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  221. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  222. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  223. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  224. data/lib/pubid/iec/identifiers/sheet_identifier.rb +17 -11
  225. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  226. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  227. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  228. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  229. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  230. data/lib/pubid/iec/identifiers/test_report_form.rb +3 -35
  231. data/lib/pubid/iec/identifiers/vap_identifier.rb +24 -21
  232. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  233. data/lib/pubid/iec/identifiers/working_document.rb +2 -50
  234. data/lib/pubid/iec/identifiers.rb +30 -0
  235. data/lib/pubid/iec/parser.rb +13 -12
  236. data/lib/pubid/iec/renderer.rb +254 -0
  237. data/lib/pubid/iec/single_identifier.rb +6 -12
  238. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  239. data/lib/pubid/iec/urn_generator.rb +3 -3
  240. data/lib/pubid/iec/urn_parser.rb +3 -3
  241. data/lib/pubid/iec.rb +43 -67
  242. data/lib/pubid/ieee/builder.rb +12 -12
  243. data/lib/pubid/ieee/components/code.rb +8 -0
  244. data/lib/pubid/ieee/components/draft.rb +14 -0
  245. data/lib/pubid/ieee/components/relationship.rb +5 -149
  246. data/lib/pubid/ieee/identifier.rb +5 -52
  247. data/lib/pubid/ieee/identifiers/adopted_standard.rb +0 -9
  248. data/lib/pubid/ieee/identifiers/base.rb +221 -556
  249. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +0 -10
  250. data/lib/pubid/ieee/identifiers/corrigendum.rb +0 -12
  251. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +0 -10
  252. data/lib/pubid/ieee/identifiers/dual_identifier.rb +0 -4
  253. data/lib/pubid/ieee/identifiers/dual_published.rb +0 -4
  254. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +0 -9
  255. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +0 -10
  256. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  257. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +0 -18
  258. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +0 -6
  259. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  260. data/lib/pubid/ieee/identifiers/redlined_standard.rb +0 -7
  261. data/lib/pubid/ieee/identifiers/si_standard.rb +0 -38
  262. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  263. data/lib/pubid/ieee/pre_parser.rb +301 -0
  264. data/lib/pubid/ieee/renderer.rb +307 -0
  265. data/lib/pubid/ieee/urn_parser.rb +34 -0
  266. data/lib/pubid/ieee.rb +66 -1
  267. data/lib/pubid/ieee_debug.rb +0 -1
  268. data/lib/pubid/iho/builder.rb +2 -2
  269. data/lib/pubid/iho/identifier.rb +7 -59
  270. data/lib/pubid/iho/identifiers/base.rb +64 -31
  271. data/lib/pubid/iho/parser.rb +3 -3
  272. data/lib/pubid/iho/renderer.rb +30 -0
  273. data/lib/pubid/iho/urn_generator.rb +2 -2
  274. data/lib/pubid/iho/urn_parser.rb +58 -0
  275. data/lib/pubid/iho.rb +52 -1
  276. data/lib/pubid/iso/builder.rb +55 -53
  277. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  278. data/lib/pubid/iso/components/code.rb +7 -19
  279. data/lib/pubid/iso/components/publisher.rb +10 -8
  280. data/lib/pubid/iso/components.rb +2 -4
  281. data/lib/pubid/iso/identifier.rb +219 -252
  282. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  283. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  284. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  285. data/lib/pubid/iso/identifiers/data.rb +0 -1
  286. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  287. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  288. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  289. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  290. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  291. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  292. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  293. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  294. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  295. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  296. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  297. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  298. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  299. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  300. data/lib/pubid/iso/identifiers.rb +0 -1
  301. data/lib/pubid/iso/normalizer.rb +89 -0
  302. data/lib/pubid/iso/parser.rb +22 -4
  303. data/lib/pubid/iso/single_identifier.rb +0 -4
  304. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  305. data/lib/pubid/iso/urn_generator.rb +66 -182
  306. data/lib/pubid/iso/urn_parser.rb +12 -7
  307. data/lib/pubid/iso.rb +177 -2
  308. data/lib/pubid/itu/builder.rb +0 -12
  309. data/lib/pubid/itu/components/code.rb +9 -7
  310. data/lib/pubid/itu/components/sector.rb +15 -4
  311. data/lib/pubid/itu/components/series.rb +0 -4
  312. data/lib/pubid/itu/components.rb +11 -0
  313. data/lib/pubid/itu/identifier.rb +4 -116
  314. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  315. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  316. data/lib/pubid/itu/identifiers/base.rb +124 -128
  317. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  318. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  319. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  320. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  321. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  322. data/lib/pubid/itu/urn_parser.rb +23 -0
  323. data/lib/pubid/itu.rb +44 -1
  324. data/lib/pubid/jcgm/builder.rb +16 -8
  325. data/lib/pubid/jcgm/identifier.rb +0 -43
  326. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -9
  327. data/lib/pubid/jcgm/identifiers/gum_guide.rb +0 -12
  328. data/lib/pubid/jcgm/renderer.rb +68 -0
  329. data/lib/pubid/jcgm/single_identifier.rb +0 -8
  330. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  331. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  332. data/lib/pubid/jcgm.rb +43 -2
  333. data/lib/pubid/jis/builder.rb +44 -52
  334. data/lib/pubid/jis/identifier.rb +120 -46
  335. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  336. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  337. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  338. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  339. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  340. data/lib/pubid/jis/identifiers.rb +1 -1
  341. data/lib/pubid/jis/parser.rb +31 -5
  342. data/lib/pubid/jis/renderer.rb +69 -0
  343. data/lib/pubid/jis/single_identifier.rb +6 -12
  344. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  345. data/lib/pubid/jis/urn_parser.rb +23 -0
  346. data/lib/pubid/jis.rb +42 -2
  347. data/lib/pubid/nist/builder.rb +63 -1871
  348. data/lib/pubid/nist/caster.rb +1272 -0
  349. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  350. data/lib/pubid/nist/components/code.rb +9 -20
  351. data/lib/pubid/nist/components/supplement.rb +2 -2
  352. data/lib/pubid/nist/components.rb +0 -1
  353. data/lib/pubid/nist/identifier.rb +8 -60
  354. data/lib/pubid/nist/identifiers/base.rb +564 -492
  355. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  356. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  358. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  359. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  360. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  361. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  362. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  363. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  364. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  365. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  366. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  367. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  368. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  369. data/lib/pubid/nist/identifiers/report.rb +4 -2
  370. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  371. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  372. data/lib/pubid/nist/identifiers.rb +1 -0
  373. data/lib/pubid/nist/parser.rb +62 -452
  374. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  375. data/lib/pubid/nist/preprocessor.rb +428 -0
  376. data/lib/pubid/nist/renderer.rb +43 -0
  377. data/lib/pubid/nist/router.rb +148 -0
  378. data/lib/pubid/nist/series/base.rb +58 -0
  379. data/lib/pubid/nist/series/crpl.rb +13 -0
  380. data/lib/pubid/nist/series/fips.rb +14 -0
  381. data/lib/pubid/nist/series/ir.rb +60 -0
  382. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  383. data/lib/pubid/nist/series/mono.rb +19 -0
  384. data/lib/pubid/nist/series/ncstar.rb +20 -0
  385. data/lib/pubid/nist/series.rb +49 -0
  386. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  387. data/lib/pubid/nist/urn_parser.rb +67 -0
  388. data/lib/pubid/nist.rb +86 -4
  389. data/lib/pubid/oiml/builder.rb +21 -3
  390. data/lib/pubid/oiml/components/code.rb +17 -0
  391. data/lib/pubid/oiml/identifier.rb +40 -46
  392. data/lib/pubid/oiml/identifiers/annex.rb +13 -46
  393. data/lib/pubid/oiml/identifiers/errata.rb +15 -0
  394. data/lib/pubid/oiml/identifiers.rb +1 -1
  395. data/lib/pubid/oiml/parser.rb +59 -12
  396. data/lib/pubid/oiml/renderer.rb +171 -0
  397. data/lib/pubid/oiml/single_identifier.rb +61 -42
  398. data/lib/pubid/oiml/supplement_identifier.rb +31 -17
  399. data/lib/pubid/oiml/urn_generator.rb +0 -8
  400. data/lib/pubid/oiml/urn_parser.rb +22 -0
  401. data/lib/pubid/oiml.rb +42 -1
  402. data/lib/pubid/plateau/identifier.rb +4 -55
  403. data/lib/pubid/plateau/identifiers/base.rb +45 -36
  404. data/lib/pubid/plateau/identifiers/handbook.rb +0 -6
  405. data/lib/pubid/plateau/identifiers/technical_report.rb +0 -4
  406. data/lib/pubid/plateau/renderer.rb +51 -0
  407. data/lib/pubid/plateau/supplement_identifier.rb +0 -4
  408. data/lib/pubid/plateau/urn_parser.rb +43 -0
  409. data/lib/pubid/plateau.rb +43 -1
  410. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  411. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  412. data/lib/pubid/renderers/human_readable.rb +18 -7
  413. data/lib/pubid/rendering/context.rb +28 -19
  414. data/lib/pubid/rendering.rb +0 -3
  415. data/lib/pubid/sae/components/date.rb +8 -0
  416. data/lib/pubid/sae/components/type.rb +5 -1
  417. data/lib/pubid/sae/identifier.rb +4 -35
  418. data/lib/pubid/sae/identifiers/base.rb +26 -31
  419. data/lib/pubid/sae/renderer.rb +36 -0
  420. data/lib/pubid/sae/urn_generator.rb +2 -10
  421. data/lib/pubid/sae/urn_parser.rb +36 -0
  422. data/lib/pubid/sae.rb +42 -1
  423. data/lib/pubid/urn_generator/base.rb +12 -12
  424. data/lib/pubid/urn_parser/base.rb +81 -0
  425. data/lib/pubid/urn_parser/errors.rb +9 -0
  426. data/lib/pubid/urn_parser.rb +14 -0
  427. data/lib/pubid/version.rb +1 -1
  428. data/lib/pubid.rb +45 -7
  429. data/lib/tasks/export.rake +6 -5
  430. data/lib/tasks/website-data.json +1940 -1882
  431. metadata +75 -45
  432. data/lib/pubid/amca/scheme.rb +0 -16
  433. data/lib/pubid/ansi/scheme.rb +0 -15
  434. data/lib/pubid/api/scheme.rb +0 -66
  435. data/lib/pubid/ashrae/scheme.rb +0 -53
  436. data/lib/pubid/asme/scheme.rb +0 -37
  437. data/lib/pubid/astm/scheme.rb +0 -55
  438. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  439. data/lib/pubid/bsi/scheme.rb +0 -243
  440. data/lib/pubid/ccsds/scheme.rb +0 -57
  441. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  442. data/lib/pubid/cie/scheme.rb +0 -64
  443. data/lib/pubid/components/factory.rb +0 -50
  444. data/lib/pubid/csa/scheme.rb +0 -44
  445. data/lib/pubid/etsi/scheme.rb +0 -42
  446. data/lib/pubid/export/data_class_exporter.rb +0 -59
  447. data/lib/pubid/export/ieee_exporter.rb +0 -78
  448. data/lib/pubid/export/itu_exporter.rb +0 -66
  449. data/lib/pubid/export/nist_exporter.rb +0 -64
  450. data/lib/pubid/export/registry_exporter.rb +0 -90
  451. data/lib/pubid/export/scheme_exporter.rb +0 -70
  452. data/lib/pubid/identifier_registry.rb +0 -198
  453. data/lib/pubid/idf/scheme.rb +0 -61
  454. data/lib/pubid/iec/scheme.rb +0 -71
  455. data/lib/pubid/ieee/scheme.rb +0 -90
  456. data/lib/pubid/iho/scheme.rb +0 -29
  457. data/lib/pubid/iso/identifiers/base.rb +0 -115
  458. data/lib/pubid/iso/scheme.rb +0 -193
  459. data/lib/pubid/itu/scheme.rb +0 -174
  460. data/lib/pubid/jcgm/scheme.rb +0 -60
  461. data/lib/pubid/jis/components/code.rb +0 -59
  462. data/lib/pubid/jis/identifiers/base.rb +0 -72
  463. data/lib/pubid/jis/scheme.rb +0 -49
  464. data/lib/pubid/nist/components/publisher.rb +0 -24
  465. data/lib/pubid/nist/scheme.rb +0 -199
  466. data/lib/pubid/oiml/identifiers/base.rb +0 -36
  467. data/lib/pubid/oiml/scheme.rb +0 -46
  468. data/lib/pubid/plateau/scheme.rb +0 -45
  469. data/lib/pubid/rendering/base.rb +0 -73
  470. data/lib/pubid/rendering/common.rb +0 -211
  471. data/lib/pubid/rendering/format.rb +0 -25
  472. data/lib/pubid/sae/scheme.rb +0 -47
  473. data/lib/pubid/scheme.rb +0 -219
@@ -1,4 +1,3 @@
1
- require_relative "../identifier"
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module Pubid
@@ -11,31 +10,29 @@ 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
39
36
  end
40
37
 
41
38
  # 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,8 @@ module Pubid
84
114
  ].freeze
85
115
 
86
116
  def self.type
87
- { key: :frag, title: "Fragment", short: "FRAG" }
88
- end
89
-
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
117
+ { key: :frag,
118
+ web: :fragment_identifier, title: "Fragment", short: "FRAG" }
108
119
  end
109
120
 
110
121
  # 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,27 @@ 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
21
24
 
22
- # Add sheet notation /N
23
- parts << "/#{sheet_number}"
25
+ def base_to_kv(model, doc)
26
+ base = model.base_identifier
27
+ return unless base
24
28
 
25
- # Add year if present
26
- parts << ":#{year}" if year
29
+ doc.add_child(Lutaml::KeyValue::DataModel::Element.new("base",
30
+ base.to_hash))
31
+ end
27
32
 
28
- parts.join
33
+ def base_from_kv(model, value)
34
+ model.base_identifier = ::Pubid::Iec::Identifier.from_hash(value) if value
29
35
  end
30
36
 
31
37
  # 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,38 +39,7 @@ 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
74
- end
42
+ # TRF uses special rendering via the Renderer
75
43
  end
76
44
  end
77
45
  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,24 +42,6 @@ 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
40
- end
41
-
42
45
  # Delegate common attributes to base_identifier
43
46
  def publisher
44
47
  base_identifier&.publisher
@@ -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
@@ -43,53 +42,6 @@ module Pubid
43
42
 
44
43
  @stage ||= ::Pubid::Components::Stage.new(stage_code: stage_code)
45
44
  end
46
-
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("/")
92
- end
93
45
  end
94
46
  end
95
47
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iec
5
+ module Identifiers
6
+ autoload :Amendment, "#{__dir__}/identifiers/amendment"
7
+ autoload :Base, "#{__dir__}/identifiers/base"
8
+ autoload :ComponentSpecification, "#{__dir__}/identifiers/component_specification"
9
+ autoload :ConformityAssessment, "#{__dir__}/identifiers/conformity_assessment"
10
+ autoload :ConsolidatedIdentifier, "#{__dir__}/identifiers/consolidated_identifier"
11
+ autoload :Corrigendum, "#{__dir__}/identifiers/corrigendum"
12
+ autoload :FragmentIdentifier, "#{__dir__}/identifiers/fragment_identifier"
13
+ autoload :Guide, "#{__dir__}/identifiers/guide"
14
+ autoload :InternationalStandard, "#{__dir__}/identifiers/international_standard"
15
+ autoload :InterpretationSheet, "#{__dir__}/identifiers/interpretation_sheet"
16
+ autoload :OperationalDocument, "#{__dir__}/identifiers/operational_document"
17
+ autoload :PubliclyAvailableSpecification, "#{__dir__}/identifiers/publicly_available_specification"
18
+ autoload :SheetIdentifier, "#{__dir__}/identifiers/sheet_identifier"
19
+ autoload :SocietalTechnologyTrendReport, "#{__dir__}/identifiers/societal_technology_trend_report"
20
+ autoload :SystemsReferenceDocument, "#{__dir__}/identifiers/systems_reference_document"
21
+ autoload :TechnicalReport, "#{__dir__}/identifiers/technical_report"
22
+ autoload :TechnicalSpecification, "#{__dir__}/identifiers/technical_specification"
23
+ autoload :TechnologyReport, "#{__dir__}/identifiers/technology_report"
24
+ autoload :TestReportForm, "#{__dir__}/identifiers/test_report_form"
25
+ autoload :VapIdentifier, "#{__dir__}/identifiers/vap_identifier"
26
+ autoload :WhitePaper, "#{__dir__}/identifiers/white_paper"
27
+ autoload :WorkingDocument, "#{__dir__}/identifiers/working_document"
28
+ end
29
+ end
30
+ end
@@ -1,9 +1,5 @@
1
1
  require "parslet"
2
2
  # frozen_string_literal: true
3
- require_relative "../parser/common_parse_rules"
4
- require_relative "../parser/common_parse_methods"
5
- require_relative "identifier"
6
- require_relative "supplement_identifier"
7
3
 
8
4
  module Pubid
9
5
  module Iec
@@ -14,10 +10,9 @@ module Pubid
14
10
  DASH_CHARS = ["-", "‑", "‐"].freeze
15
11
 
16
12
  # We need to sort by length to match longest first because that's how Parslet works
17
- TYPED_STAGES = Pubid::Iec::Scheme.typed_stages
18
- .map(&:abbr).flatten.sort_by(&:length).reverse
19
- TYPED_STAGES_SUPPLEMENTS = Pubid::Iec::Scheme.supplement_typed_stages
13
+ TYPED_STAGES = Pubid::Iec.all_typed_stages
20
14
  .map(&:abbr).flatten.sort_by(&:length).reverse
15
+ TYPED_STAGES_SUPPLEMENTS = TYPED_STAGES
21
16
 
22
17
  root :identifier
23
18
 
@@ -277,16 +272,22 @@ module Pubid
277
272
  # EXV = Example version
278
273
  # PAC = Package
279
274
  # PRV = Preview version
280
- rule(:vap_suffix) do
281
- space >> (
282
- str("CSV") |
275
+ # Internal helper (no `.as`): a single VAP code. The capture key stays
276
+ # :vap_suffix below; this rule just lets the suffix be one or more codes.
277
+ rule(:vap_code) do
278
+ str("CSV") |
283
279
  str("CMV") |
284
280
  str("RLV") |
285
281
  str("SER") |
286
282
  str("EXV") |
287
283
  str("PAC") |
288
284
  str("PRV")
289
- ).as(:vap_suffix)
285
+ end
286
+
287
+ # One or more VAP codes joined by "-", captured whole, e.g. "CSV" or
288
+ # "EXV-CMV"; the builder splits it into the VapIdentifier `vap` array.
289
+ rule(:vap_suffix) do
290
+ space >> (vap_code >> (str("-") >> vap_code).repeat).as(:vap_suffix)
290
291
  end
291
292
 
292
293
  # Database suffix: " DB"
@@ -358,7 +359,7 @@ module Pubid
358
359
  end
359
360
 
360
361
  rule(:iso_identifier) do
361
- Iso::Parser.new.identifier
362
+ Pubid::Iso.joint_grammar_atom(:identifier)
362
363
  end
363
364
 
364
365
  rule(:supplement_type_with_stage) do