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
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class Corrigendum < SupplementIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
10
9
  ::Pubid::Components::TypedStage.new(
@@ -59,7 +58,7 @@ module Pubid
59
58
  ),
60
59
  ::Pubid::Components::TypedStage.new(
61
60
  code: :dcor,
62
- abbr: ["DCor", "DCOR"],
61
+ abbr: ["DCor", "DCOR", "DIS Cor"],
63
62
  short_abbr: "DCOR",
64
63
  long_abbr: "DCor",
65
64
  type_code: :cor,
@@ -69,7 +68,7 @@ module Pubid
69
68
  ),
70
69
  ::Pubid::Components::TypedStage.new(
71
70
  code: :fdcor,
72
- abbr: ["FDCor", "FDCOR", "FCOR"],
71
+ abbr: ["FDCor", "FDCOR", "FCOR", "FDIS Cor"],
73
72
  short_abbr: "FDCOR",
74
73
  long_abbr: "FDCor",
75
74
  type_code: :cor,
@@ -100,7 +99,8 @@ module Pubid
100
99
  ].freeze
101
100
 
102
101
  def self.type
103
- { key: :cor, title: "Corrigendum", short: "COR" }
102
+ { key: :cor,
103
+ web: :corrigendum, title: "Corrigendum", short: "COR" }
104
104
  end
105
105
  end
106
106
  end
@@ -5,7 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  # Data Identifier
7
7
  class Data < SingleIdentifier
8
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
9
8
 
10
9
  TYPED_STAGES = [
11
10
  ::Pubid::Components::TypedStage.new(
@@ -4,9 +4,14 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class Directives < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
  attribute :subgroup, ::Pubid::Components::Code
9
8
 
9
+ # Merges with Identifier's block (base attributes); only adds the
10
+ # Directives-specific subgroup so it survives to_hash/from_hash.
11
+ key_value do
12
+ map "subgroup", to: :subgroup
13
+ end
14
+
10
15
  TYPED_STAGES = [
11
16
  ::Pubid::Components::TypedStage.new(
12
17
  code: :pubguide,
@@ -22,7 +27,8 @@ module Pubid
22
27
  ].freeze
23
28
 
24
29
  def self.type
25
- { key: :dir, title: "Directives", short: "DIR" }
30
+ { key: :dir,
31
+ web: :directives, title: "Directives", short: "DIR" }
26
32
  end
27
33
 
28
34
  def to_s(**opts)
@@ -4,9 +4,35 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class DirectivesSupplement < SupplementIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
  attribute :supplement_publisher, ::Pubid::Components::Publisher
9
8
 
9
+ # supplement_publisher (e.g. "IEC" in "ISO/IEC DIR 1 IEC SUP") is needed
10
+ # by to_s/to_urn; serialize its body under "publisher" (the supplement's
11
+ # own publisher; the base's publisher lives in the nested base). This
12
+ # overrides the inherited publisher map, whose delegated value is nil or
13
+ # the omitted ISO default here.
14
+ key_value do
15
+ map "publisher",
16
+ with: { to: :supplement_publisher_to_kv, from: :supplement_publisher_from_kv }
17
+ end
18
+
19
+ def supplement_publisher_to_kv(model, doc)
20
+ body = model.supplement_publisher&.body
21
+ return if body.nil? || body.to_s.empty?
22
+
23
+ doc.add_child(
24
+ Lutaml::KeyValue::DataModel::Element.new("publisher", body.to_s),
25
+ )
26
+ end
27
+
28
+ def supplement_publisher_from_kv(model, value)
29
+ model.supplement_publisher = ::Pubid::Components::Publisher.new(body: value.to_s)
30
+ end
31
+
32
+ # copublishers here is the base's (delegated), redundant with the nested
33
+ # base; don't duplicate it at the supplement level.
34
+ def copublishers_to_kv(_model, _doc); end
35
+
10
36
  # Delegate base identifier attributes for easier access
11
37
  def copublishers
12
38
  base_identifier&.copublishers
@@ -28,7 +54,8 @@ module Pubid
28
54
  ].freeze
29
55
 
30
56
  def self.type
31
- { key: :"dir-sup", title: "Directives Supplement", short: "SUP" }
57
+ { key: :"dir-sup",
58
+ web: :directives_supplement, title: "Directives Supplement", short: "SUP" }
32
59
  end
33
60
 
34
61
  # def render_directives_supplement_identifier(identifier)
@@ -47,10 +74,10 @@ format: nil, stage_format_long: nil, with_date: nil)
47
74
  [
48
75
  base_identifier.to_s(lang: lang, lang_single: lang_single,
49
76
  with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date),
50
- " #{supplement_publisher.body}",
77
+ " #{supplement_publisher.render}",
51
78
  " SUP", # Always render as "SUP" even though typed_stage.abbreviation is "DIR SUP"
52
- (date ? ":#{date.year}" : ""),
53
- (edition ? " Edition #{edition.number.value}" : ""),
79
+ (date ? ":#{date.render}" : ""),
80
+ (edition ? " Edition #{edition.value}" : ""),
54
81
  ].join
55
82
  else
56
83
  # Simplified rendering for bundled identifiers (just the supplement part)
@@ -63,13 +90,13 @@ format: nil, stage_format_long: nil, with_date: nil)
63
90
  format: nil, stage_format_long: nil, with_date: nil)
64
91
  date_str = if date
65
92
  month_part = date.month ? "-#{date.month}" : ""
66
- ":#{date.year}#{month_part}"
93
+ ":#{date.render}#{month_part}"
67
94
  else
68
95
  ""
69
96
  end
70
97
 
71
98
  [
72
- supplement_publisher.body,
99
+ supplement_publisher.render,
73
100
  " SUP",
74
101
  date_str,
75
102
  ].join
@@ -78,13 +105,15 @@ format: nil, stage_format_long: nil, with_date: nil)
78
105
  # DirectivesSupplement use urn:iso:doc scheme (not urn:iso:std)
79
106
  # Format: urn:iso:doc:{base_urn_parts}:jtc:X:sup[:{year}][:{edition}]
80
107
  def to_urn
108
+ urn_ctx = Rendering::RenderingContext.urn
109
+
81
110
  # If this is a standalone supplement (no base_identifier), build URN directly
82
111
  unless base_identifier
83
112
  parts = ["urn", "iso", "doc"]
84
- parts << supplement_publisher.body.downcase if supplement_publisher
113
+ parts << supplement_publisher.render(context: urn_ctx) if supplement_publisher
85
114
  parts << "sup"
86
- parts << date.year.to_s if date
87
- parts << "ed-#{edition.number}" if edition&.number
115
+ parts << date.render(context: urn_ctx) if date
116
+ parts << edition.render(context: urn_ctx) if edition&.number
88
117
  return parts.join(":")
89
118
  end
90
119
 
@@ -94,7 +123,7 @@ format: nil, stage_format_long: nil, with_date: nil)
94
123
  # Handle JTC pattern specially
95
124
  if supplement_publisher&.body&.match?(/^JTC\s+(\d+)$/i)
96
125
  # Extract JTC number: "JTC 1" -> ["jtc", "1"]
97
- jtc_parts = supplement_publisher.body.downcase.split
126
+ jtc_parts = supplement_publisher.render(context: urn_ctx).split
98
127
  # Insert JTC parts before "sup"
99
128
  parts = base_urn.split(":")
100
129
  parts.concat(jtc_parts) # Add "jtc" and "1"
@@ -102,14 +131,14 @@ format: nil, stage_format_long: nil, with_date: nil)
102
131
  else
103
132
  # Normal supplement
104
133
  parts = [base_urn, "sup"]
105
- parts << supplement_publisher.body.downcase if supplement_publisher
134
+ parts << supplement_publisher.render(context: urn_ctx) if supplement_publisher
106
135
  end
107
136
 
108
137
  # Year (if present)
109
- parts << date.year.to_s if date
138
+ parts << date.render(context: urn_ctx) if date
110
139
 
111
140
  # Edition (if present)
112
- parts << "ed-#{edition.number}" if edition&.number
141
+ parts << edition.render(context: urn_ctx) if edition&.number
113
142
 
114
143
  parts.join(":")
115
144
  end
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class Extract < SupplementIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
10
9
  ::Pubid::Components::TypedStage.new(
@@ -18,7 +17,8 @@ module Pubid
18
17
  ].freeze
19
18
 
20
19
  def self.type
21
- { key: :ext, title: "Extract", short: "Ext" }
20
+ { key: :ext,
21
+ web: :extract, title: "Extract", short: "Ext" }
22
22
  end
23
23
 
24
24
  # def self.get_renderer_class
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class Guide < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
10
9
  ::Pubid::Components::TypedStage.new(
@@ -8,7 +8,6 @@ module Pubid
8
8
  include IdentifierMetadata
9
9
 
10
10
  # Note: type attribute uses shared Components::Type from Pubid namespace
11
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
12
11
 
13
12
  TYPED_STAGES = [
14
13
  ::Pubid::Components::TypedStage.new(
@@ -142,7 +141,8 @@ module Pubid
142
141
  ].freeze
143
142
 
144
143
  def self.type
145
- { key: :is, title: "International Standard", short: nil }
144
+ { key: :is,
145
+ web: :international_standard, title: "International Standard", short: nil }
146
146
  end
147
147
 
148
148
  # Define machine-readable metadata
@@ -164,5 +164,5 @@ module Pubid
164
164
  end
165
165
  end
166
166
 
167
- # NOTE: Identifiers are now registered in the ISO Scheme class
168
- # The global registry has been removed in favor of per-flavor Schemes
167
+ # NOTE: Identifiers are now registered in the ISO flavor module
168
+ # The global registry has been removed in favor of self-describing types
@@ -5,7 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  # International Standardized Profile Identifier
7
7
  class InternationalStandardizedProfile < SingleIdentifier
8
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
9
8
 
10
9
  TYPED_STAGES = [
11
10
  ::Pubid::Components::TypedStage.new(
@@ -52,7 +51,7 @@ module Pubid
52
51
  code: :disp,
53
52
  stage_code: :disp,
54
53
  type_code: :isp,
55
- abbr: ["DISP"],
54
+ abbr: ["DISP", "DIS ISP"],
56
55
  name: "Draft International Standardized Profile",
57
56
  harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 40.98 40.99],
58
57
  ),
@@ -61,7 +60,7 @@ module Pubid
61
60
  code: :fdisp,
62
61
  stage_code: :fdis,
63
62
  type_code: :isp,
64
- abbr: ["FDISP"],
63
+ abbr: ["FDISP", "FDIS ISP"],
65
64
  name: "Final Draft International Standardized Profile",
66
65
  harmonized_stages: %w[50.00 50.20 50.60 50.92],
67
66
  ),
@@ -85,7 +84,8 @@ module Pubid
85
84
  ].freeze
86
85
 
87
86
  def self.type
88
- { key: :isp, title: "International Standardized Profile",
87
+ { key: :isp,
88
+ web: :international_standardized_profile, title: "International Standardized Profile",
89
89
  short: "ISP" }
90
90
  end
91
91
  end
@@ -4,12 +4,17 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class InternationalWorkshopAgreement < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
7
+
8
+ # IWA identifiers have no publisher prefix (rendered "IWA 1", not
9
+ # "ISO IWA 1"), so there is no implied publisher to default on load.
10
+ def self.default_publisher
11
+ nil
12
+ end
8
13
 
9
14
  TYPED_STAGES = [
10
15
  ::Pubid::Components::TypedStage.new(
11
- code: :npiwa,
12
- stage_code: :np,
16
+ code: :pwiiwa,
17
+ stage_code: :pwi,
13
18
  type_code: :iwa,
14
19
  abbr: ["PWI IWA"],
15
20
  name: "Proposed Work Item for International Workshop Agreement",
@@ -75,7 +80,8 @@ module Pubid
75
80
  ].freeze
76
81
 
77
82
  def self.type
78
- { key: :iwa, title: "International Workshop Agreement", short: "IWA" }
83
+ { key: :iwa,
84
+ web: :international_workshop_agreement, title: "International Workshop Agreement", short: "IWA" }
79
85
  end
80
86
 
81
87
  def to_s(**opts)
@@ -5,7 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  # Publicly Available Specification", Identifier
7
7
  class Pas < SingleIdentifier
8
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
9
8
 
10
9
  TYPED_STAGES = [
11
10
  ::Pubid::Components::TypedStage.new(
@@ -85,7 +84,8 @@ module Pubid
85
84
  ].freeze
86
85
 
87
86
  def self.type
88
- { key: :pas, title: "Publicly Available Specification", short: "PAS" }
87
+ { key: :pas,
88
+ web: :publicly_available_specification, title: "Publicly Available Specification", short: "PAS" }
89
89
  end
90
90
  end
91
91
  end
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class Recommendation < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
10
9
  ::Pubid::Components::TypedStage.new(
@@ -32,7 +31,8 @@ module Pubid
32
31
  ].freeze
33
32
 
34
33
  def self.type
35
- { key: :rec, title: "Recommendation", short: "R" }
34
+ { key: :rec,
35
+ web: :recommendation, title: "Recommendation", short: "R" }
36
36
  end
37
37
 
38
38
  # Override URN type code - Recommendation uses 'r' in URN (RFC 5141)
@@ -4,9 +4,16 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class Supplement < SupplementIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
9
+ ::Pubid::Components::TypedStage.new(
10
+ code: :pwisuppl,
11
+ stage_code: :pwi,
12
+ type_code: :suppl,
13
+ abbr: ["PWI Suppl"],
14
+ name: "Proposed Work Item for Supplement",
15
+ harmonized_stages: %w[00.00 00.20 00.60 00.92 00.93 00.98 00.99],
16
+ ),
10
17
  ::Pubid::Components::TypedStage.new(
11
18
  code: :npsuppl,
12
19
  stage_code: :np,
@@ -43,7 +50,7 @@ module Pubid
43
50
  code: :dsuppl,
44
51
  stage_code: :dsuppl,
45
52
  type_code: :suppl,
46
- abbr: ["DSuppl"],
53
+ abbr: ["DSuppl", "DIS Suppl"],
47
54
  name: "Draft Supplement",
48
55
  harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 40.98 40.99],
49
56
  ),
@@ -79,7 +86,8 @@ module Pubid
79
86
  end
80
87
 
81
88
  def self.type
82
- { key: :suppl, title: "Supplement", short: "suppl" }
89
+ { key: :suppl,
90
+ web: :supplement, title: "Supplement", short: "suppl" }
83
91
  end
84
92
  end
85
93
  end
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # Technical Committee Document
7
7
  # Format: TC 184/SC 4/WG 3 N 123, JTC 1 N 456, TC 184 N 100
8
- class TcDocument < Base
8
+ class TcDocument < Identifier
9
9
  # TC type (TC, JTC, PC, IT, etc.)
10
10
  attribute :tc_type, ::Pubid::Components::Code
11
11
  # TC number
@@ -33,8 +33,36 @@ module Pubid
33
33
  # TC documents don't use typed stages like other identifiers
34
34
  TYPED_STAGES = [].freeze
35
35
 
36
+ # Serialize the committee structure (all plain-string Codes) on top of
37
+ # the inherited ISO mapping; TC documents have no stage.
38
+ key_value do
39
+ map "tc_type", with: { to: :tc_type_to_kv, from: :tc_type_from_kv }
40
+ map "tc_number", with: { to: :tc_number_to_kv, from: :tc_number_from_kv }
41
+ map "sc_type", with: { to: :sc_type_to_kv, from: :sc_type_from_kv }
42
+ map "sc_number", with: { to: :sc_number_to_kv, from: :sc_number_from_kv }
43
+ map "wg_type", with: { to: :wg_type_to_kv, from: :wg_type_from_kv }
44
+ map "wg_number", with: { to: :wg_number_to_kv, from: :wg_number_from_kv }
45
+ end
46
+
47
+ # TC documents have no stage; suppress the inherited stage emission.
48
+ def stage_to_kv(_model, _doc); end
49
+
50
+ def tc_type_to_kv(m, doc) = emit_code(doc, "tc_type", m.tc_type)
51
+ def tc_type_from_kv(m, v) = m.tc_type = build_code(v)
52
+ def tc_number_to_kv(m, doc) = emit_code(doc, "tc_number", m.tc_number)
53
+ def tc_number_from_kv(m, v) = m.tc_number = build_code(v)
54
+ def sc_type_to_kv(m, doc) = emit_code(doc, "sc_type", m.sc_type)
55
+ def sc_type_from_kv(m, v) = m.sc_type = build_code(v)
56
+ def sc_number_to_kv(m, doc) = emit_code(doc, "sc_number", m.sc_number)
57
+ def sc_number_from_kv(m, v) = m.sc_number = build_code(v)
58
+ def wg_type_to_kv(m, doc) = emit_code(doc, "wg_type", m.wg_type)
59
+ def wg_type_from_kv(m, v) = m.wg_type = build_code(v)
60
+ def wg_number_to_kv(m, doc) = emit_code(doc, "wg_number", m.wg_number)
61
+ def wg_number_from_kv(m, v) = m.wg_number = build_code(v)
62
+
36
63
  def self.type
37
- { key: :tc, title: "Technical Committee Document", short: "TC" }
64
+ { key: :tc,
65
+ web: :tc_document, title: "Technical Committee Document", short: "TC" }
38
66
  end
39
67
 
40
68
  def self.typed_stages
@@ -45,26 +73,26 @@ module Pubid
45
73
  result = publisher.to_s if publisher
46
74
 
47
75
  # Add TC type and number
48
- result += "/#{tc_type.value} " if tc_type&.value
49
- result += tc_number.value.to_s if tc_number&.value
76
+ result += "/#{tc_type.render} " if tc_type&.value
77
+ result += tc_number.render.to_s if tc_number&.value
50
78
 
51
79
  # Add SC type and number
52
80
  if sc_type&.value && sc_number&.value
53
- result += "/#{sc_type.value} "
54
- result += sc_number.value.to_s
81
+ result += "/#{sc_type.render} "
82
+ result += sc_number.render.to_s
55
83
  end
56
84
 
57
85
  # Add WG type and number
58
86
  if wg_type&.value && wg_number&.value
59
- result += "/#{wg_type.value} "
60
- result += wg_number.value.to_s
87
+ result += "/#{wg_type.render} "
88
+ result += wg_number.render.to_s
61
89
  end
62
90
 
63
91
  # Add document number
64
- result += " N #{number.value}" if number&.value
92
+ result += " N #{number.render}" if number&.value
65
93
 
66
94
  # Add year if present
67
- result += ":#{date.year}" if date&.year
95
+ result += ":#{date.render}" if date&.year
68
96
 
69
97
  result
70
98
  end
@@ -72,20 +100,21 @@ module Pubid
72
100
  # Generate URN for TC document
73
101
  # Format: urn:iso:doc:iso:tc:184:sc-4:wg-3:123
74
102
  def to_urn
103
+ urn_ctx = Rendering::RenderingContext.urn
75
104
  parts = ["urn:iso:doc"]
76
- parts << publisher.to_s.downcase if publisher
105
+ parts << publisher.render(context: urn_ctx) if publisher
77
106
 
78
107
  # Add TC
79
- parts << "tc:#{tc_number.value}" if tc_number&.value
108
+ parts << "tc:#{tc_number.render(context: urn_ctx)}" if tc_number&.value
80
109
 
81
110
  # Add SC
82
- parts << "sc-#{sc_number.value}" if sc_number&.value
111
+ parts << "sc-#{sc_number.render(context: urn_ctx)}" if sc_number&.value
83
112
 
84
113
  # Add WG
85
- parts << "wg-#{wg_number.value}" if wg_number&.value
114
+ parts << "wg-#{wg_number.render(context: urn_ctx)}" if wg_number&.value
86
115
 
87
116
  # Add document number
88
- parts << number.value if number&.value
117
+ parts << number.render(context: urn_ctx) if number&.value
89
118
 
90
119
  parts.join(":")
91
120
  end
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class TechnicalReport < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
10
9
  ::Pubid::Components::TypedStage.new(
@@ -64,7 +63,7 @@ module Pubid
64
63
  code: :dtr,
65
64
  stage_code: :draft,
66
65
  type_code: :tr,
67
- abbr: ["DTR"],
66
+ abbr: ["DTR", "DIS TR"],
68
67
  name: "Draft Technical Report",
69
68
  harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 40.98 40.99],
70
69
  ),
@@ -72,7 +71,7 @@ module Pubid
72
71
  code: :fdtr,
73
72
  stage_code: :final_draft,
74
73
  type_code: :tr,
75
- abbr: ["FDTR"],
74
+ abbr: ["FDTR", "FDIS TR"],
76
75
  name: "Final Draft Technical Report",
77
76
  harmonized_stages: %w[50.00 50.20 50.60 50.92 50.98 50.99],
78
77
  ),
@@ -95,7 +94,8 @@ module Pubid
95
94
  ].freeze
96
95
 
97
96
  def self.type
98
- { key: :tr, title: "Technical Report", short: "TR" }
97
+ { key: :tr,
98
+ web: :technical_report, title: "Technical Report", short: "TR" }
99
99
  end
100
100
  end
101
101
  end
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class TechnicalSpecification < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
  TYPED_STAGES = [
9
8
  ::Pubid::Components::TypedStage.new(
10
9
  code: :pwits,
@@ -94,7 +93,8 @@ module Pubid
94
93
  ].freeze
95
94
 
96
95
  def self.type
97
- { key: :ts, title: "Technical Specification", short: "TS" }
96
+ { key: :ts,
97
+ web: :technical_specification, title: "Technical Specification", short: "TS" }
98
98
  end
99
99
  end
100
100
  end
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class TechnologyTrendsAssessments < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
10
9
  ::Pubid::Components::TypedStage.new(
@@ -87,7 +86,8 @@ module Pubid
87
86
  ].freeze
88
87
 
89
88
  def self.type
90
- { key: :tta, title: "Technology Trends Assessments", short: "TTA" }
89
+ { key: :tta,
90
+ web: :technology_trends_assessments, title: "Technology Trends Assessments", short: "TTA" }
91
91
  end
92
92
  end
93
93
  end
@@ -5,7 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  autoload :Addendum, "#{__dir__}/identifiers/addendum"
7
7
  autoload :Amendment, "#{__dir__}/identifiers/amendment"
8
- autoload :Base, "#{__dir__}/identifiers/base"
9
8
  autoload :Corrigendum, "#{__dir__}/identifiers/corrigendum"
10
9
  autoload :Data, "#{__dir__}/identifiers/data"
11
10
  autoload :Directives, "#{__dir__}/identifiers/directives"
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iso
5
+ # Applies pre-parse normalizations to ISO identifier strings, then dispatches
6
+ # to the parser/builder. Handles Cyrillic (Russian) translations, legacy
7
+ # update_codes regex rewrites, and the DAD/FDAM pattern that the PEG
8
+ # parser cannot recognize because it treats "/" as a copublisher separator.
9
+ class Normalizer
10
+ DAD_PATTERN = /^(.+?)\/(F?DAD)\s+(\d+)(?::(\d{4}))?$/.freeze
11
+
12
+ class << self
13
+ # Apply all normalizations to an identifier string and return the
14
+ # parsed identifier object.
15
+ # @param identifier [String]
16
+ # @return [Pubid::Iso::Identifier]
17
+ def apply(identifier)
18
+ if (match = identifier.match(DAD_PATTERN))
19
+ parse_dad_pattern(match)
20
+ else
21
+ normalized = Core::UpdateCodes.apply(identifier, :iso)
22
+ normalized = normalize_cyrillic(normalized)
23
+ parse_with_builder(normalized)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def parse_with_builder(string)
30
+ parsed = Pubid::Iso.parser.parse(string)
31
+ Pubid::Iso.builder.build(parsed)
32
+ end
33
+
34
+ # Normalize Cyrillic (Russian) ISO identifiers to Latin equivalents.
35
+ # ИСО = ISO, МЭК = IEC, Руководство/Руководства = Guide,
36
+ # ОПМС = FDIS, ПМС = DIS, ТО = TR, ТС = TS.
37
+ # @return [String]
38
+ def normalize_cyrillic(identifier)
39
+ return identifier unless identifier.match?(/[а-яА-Я]/)
40
+
41
+ normalized = identifier.dup
42
+ # Remove inline comments (Russian style comments with #)
43
+ normalized = normalized.gsub(/\s*#\s*.*$/, "")
44
+ # Translate Russian abbreviations (order matters: longer first)
45
+ normalized = normalized.gsub("Руководства", "GUIDE")
46
+ normalized = normalized.gsub("Руководство", "GUIDE")
47
+ normalized = normalized.gsub("ИСО/МЭК", "ISO/IEC")
48
+ normalized = normalized.gsub("ИСО/ОПМС", "ISO/FDIS")
49
+ normalized = normalized.gsub("ИСО/ПМС", "ISO/DIS")
50
+ normalized = normalized.gsub("ИСО/ТО", "ISO/TR")
51
+ normalized = normalized.gsub("ИСО/ТС", "ISO/TS")
52
+ normalized = normalized.gsub("ИСО", "ISO")
53
+ normalized = normalized.gsub("МЭК", "IEC")
54
+ # Standalone Cyrillic stage abbreviations (after publisher replacements)
55
+ normalized = normalized.gsub("ТО", "TR")
56
+ normalized = normalized.gsub("ТС", "TS")
57
+ normalized = normalized.gsub("ОПМС", "FDIS")
58
+ normalized = normalized.gsub("ПМС", "DIS")
59
+ normalized.strip
60
+ end
61
+
62
+ # Parse the DAD/FDAM pattern manually. The parser fails because it
63
+ # treats "/" as a copublisher separator.
64
+ # Pattern: "ISO 2631/DAD 1" or "ISO 2553/DAD 1:1987"
65
+ def parse_dad_pattern(match)
66
+ base_str = match[1] # "ISO 2631" or "ISO 2553"
67
+ stage_abbr = match[2] # "DAD" or "FDAD"
68
+ supplement_number = match[3] # "1"
69
+ supplement_year = match[4] # "1987" or nil
70
+
71
+ base_parsed = Pubid::Iso.parser.parse(base_str)
72
+ base_identifier = Pubid::Iso.builder.build(base_parsed)
73
+
74
+ addendum = Identifiers::Addendum.new
75
+ addendum.base_identifier = base_identifier
76
+ addendum.number = Iso::Components::Code.new(value: supplement_number)
77
+ addendum.date = Pubid::Components::Date.new(year: supplement_year) if supplement_year
78
+
79
+ typed_stage = Pubid::Iso.locate_stage(stage_abbr)
80
+ addendum.typed_stage = typed_stage
81
+ addendum.stage = typed_stage.to_stage
82
+ addendum.type = typed_stage.to_type
83
+
84
+ addendum
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end