pubid 2.0.0.pre.alpha.1 → 2.0.0.pre.alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +27 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +7 -0
  6. data/lib/pubid/amca/identifiers/base.rb +0 -26
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -17
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -13
  9. data/lib/pubid/amca/renderer.rb +82 -0
  10. data/lib/pubid/amca/single_identifier.rb +0 -23
  11. data/lib/pubid/amca/urn_parser.rb +28 -0
  12. data/lib/pubid/amca.rb +42 -1
  13. data/lib/pubid/ansi/builder.rb +5 -3
  14. data/lib/pubid/ansi/identifier.rb +1 -1
  15. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  16. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  17. data/lib/pubid/ansi/renderer.rb +53 -0
  18. data/lib/pubid/ansi/single_identifier.rb +2 -31
  19. data/lib/pubid/ansi/urn_generator.rb +3 -38
  20. data/lib/pubid/ansi/urn_parser.rb +23 -0
  21. data/lib/pubid/ansi.rb +38 -3
  22. data/lib/pubid/api/builder.rb +29 -74
  23. data/lib/pubid/api/identifier.rb +0 -4
  24. data/lib/pubid/api/identifiers/base.rb +0 -2
  25. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  26. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  27. data/lib/pubid/api/identifiers/mpms.rb +1 -17
  28. data/lib/pubid/api/identifiers/publication.rb +0 -2
  29. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  30. data/lib/pubid/api/identifiers/specification.rb +0 -2
  31. data/lib/pubid/api/identifiers/standard.rb +0 -2
  32. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  33. data/lib/pubid/api/identifiers/typeless_standard.rb +1 -14
  34. data/lib/pubid/api/identifiers.rb +18 -0
  35. data/lib/pubid/api/renderer.rb +89 -0
  36. data/lib/pubid/api/single_identifier.rb +1 -13
  37. data/lib/pubid/api/urn_generator.rb +0 -18
  38. data/lib/pubid/api/urn_parser.rb +35 -0
  39. data/lib/pubid/api.rb +51 -5
  40. data/lib/pubid/ashrae/builder.rb +3 -3
  41. data/lib/pubid/ashrae/identifier.rb +6 -0
  42. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  43. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  44. data/lib/pubid/ashrae/identifiers/base.rb +3 -0
  45. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  46. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  47. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  48. data/lib/pubid/ashrae/renderer.rb +117 -0
  49. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  50. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  51. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  52. data/lib/pubid/ashrae.rb +42 -1
  53. data/lib/pubid/asme/components/code.rb +10 -2
  54. data/lib/pubid/asme/identifiers/base.rb +0 -60
  55. data/lib/pubid/asme/renderer.rb +66 -0
  56. data/lib/pubid/asme/urn_parser.rb +31 -0
  57. data/lib/pubid/asme.rb +42 -1
  58. data/lib/pubid/astm/components/code.rb +9 -0
  59. data/lib/pubid/{jis → astm}/components.rb +1 -1
  60. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  61. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  62. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  63. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  64. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  65. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  66. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  67. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  68. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  69. data/lib/pubid/astm/identifiers.rb +18 -0
  70. data/lib/pubid/astm/renderer.rb +172 -0
  71. data/lib/pubid/astm/single_identifier.rb +0 -10
  72. data/lib/pubid/astm/urn_parser.rb +30 -0
  73. data/lib/pubid/astm.rb +39 -27
  74. data/lib/pubid/bsi/builder.rb +21 -12
  75. data/lib/pubid/bsi/identifier.rb +8 -2
  76. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  77. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  78. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  79. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  80. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  81. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  82. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  83. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  84. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  85. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  87. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  88. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  89. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  90. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  91. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  92. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  93. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  94. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  95. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  96. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  97. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  98. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  99. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  100. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  101. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  102. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  103. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  104. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  105. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  106. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  107. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  108. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  109. data/lib/pubid/bsi/identifiers.rb +0 -1
  110. data/lib/pubid/bsi/renderer.rb +1050 -0
  111. data/lib/pubid/bsi/single_identifier.rb +6 -70
  112. data/lib/pubid/bsi/urn_generator.rb +2 -3
  113. data/lib/pubid/bsi/urn_parser.rb +52 -0
  114. data/lib/pubid/bsi.rb +224 -1
  115. data/lib/pubid/builder/base.rb +57 -10
  116. data/lib/pubid/bundled_identifier.rb +0 -1
  117. data/lib/pubid/ccsds/builder.rb +4 -3
  118. data/lib/pubid/ccsds/identifier.rb +66 -1
  119. data/lib/pubid/ccsds/identifiers/base.rb +11 -50
  120. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  121. data/lib/pubid/ccsds/parser.rb +4 -2
  122. data/lib/pubid/ccsds/single_identifier.rb +4 -1
  123. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  124. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  125. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  126. data/lib/pubid/ccsds.rb +39 -1
  127. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  128. data/lib/pubid/cen_cenelec/identifier.rb +8 -2
  129. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  130. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  131. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  132. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  133. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  135. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  136. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  137. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  138. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  140. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  141. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  143. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  144. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  145. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  146. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  147. data/lib/pubid/cen_cenelec.rb +168 -1
  148. data/lib/pubid/cie/components/code.rb +8 -0
  149. data/lib/pubid/cie/identifier.rb +6 -4
  150. data/lib/pubid/cie/urn_parser.rb +28 -0
  151. data/lib/pubid/cie.rb +43 -1
  152. data/lib/pubid/components/adoption.rb +104 -0
  153. data/lib/pubid/components/code.rb +22 -8
  154. data/lib/pubid/components/date.rb +23 -16
  155. data/lib/pubid/components/edition.rb +9 -6
  156. data/lib/pubid/components/iteration.rb +32 -0
  157. data/lib/pubid/components/language.rb +6 -4
  158. data/lib/pubid/components/locality.rb +10 -1
  159. data/lib/pubid/components/publisher.rb +9 -6
  160. data/lib/pubid/components/relationship.rb +151 -0
  161. data/lib/pubid/components/stage.rb +5 -14
  162. data/lib/pubid/components/supplement.rb +184 -0
  163. data/lib/pubid/components/type.rb +5 -15
  164. data/lib/pubid/components/typed_stage.rb +11 -8
  165. data/lib/pubid/components.rb +4 -0
  166. data/lib/pubid/core/update_codes.rb +28 -7
  167. data/lib/pubid/csa/identifier.rb +0 -3
  168. data/lib/pubid/csa/identifiers/base.rb +2 -122
  169. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  170. data/lib/pubid/csa/identifiers/series.rb +2 -102
  171. data/lib/pubid/csa/renderer.rb +292 -0
  172. data/lib/pubid/csa/urn_generator.rb +1 -1
  173. data/lib/pubid/csa/urn_parser.rb +33 -0
  174. data/lib/pubid/csa.rb +42 -1
  175. data/lib/pubid/etsi/components/code.rb +9 -2
  176. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  177. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  178. data/lib/pubid/etsi/renderer.rb +42 -0
  179. data/lib/pubid/etsi/urn_parser.rb +34 -0
  180. data/lib/pubid/etsi.rb +42 -1
  181. data/lib/pubid/export/exporter.rb +4 -46
  182. data/lib/pubid/export/flavor_exporter.rb +111 -278
  183. data/lib/pubid/export.rb +0 -6
  184. data/lib/pubid/identifier.rb +10 -18
  185. data/lib/pubid/identifier_facade.rb +114 -0
  186. data/lib/pubid/identifier_metadata.rb +1 -1
  187. data/lib/pubid/idf/builder.rb +3 -3
  188. data/lib/pubid/idf/identifier.rb +3 -6
  189. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  190. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  191. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  192. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  193. data/lib/pubid/idf/parser.rb +3 -2
  194. data/lib/pubid/idf/renderer.rb +84 -0
  195. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  196. data/lib/pubid/idf/urn_generator.rb +4 -39
  197. data/lib/pubid/idf/urn_parser.rb +25 -0
  198. data/lib/pubid/idf.rb +51 -1
  199. data/lib/pubid/iec/builder.rb +48 -65
  200. data/lib/pubid/iec/components/code.rb +9 -32
  201. data/lib/pubid/iec/components/publisher.rb +1 -1
  202. data/lib/pubid/iec/components.rb +14 -0
  203. data/lib/pubid/iec/identifier.rb +276 -3
  204. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  205. data/lib/pubid/iec/identifiers/base.rb +8 -28
  206. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  207. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  208. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -30
  209. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  210. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -26
  211. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  212. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  213. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  214. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  215. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  216. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -15
  217. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  218. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  219. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  220. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  222. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  223. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -23
  224. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  225. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  226. data/lib/pubid/iec/identifiers.rb +30 -0
  227. data/lib/pubid/iec/parser.rb +20 -14
  228. data/lib/pubid/iec/renderer.rb +254 -0
  229. data/lib/pubid/iec/single_identifier.rb +6 -12
  230. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  231. data/lib/pubid/iec/urn_generator.rb +57 -171
  232. data/lib/pubid/iec/urn_parser.rb +53 -252
  233. data/lib/pubid/iec.rb +40 -68
  234. data/lib/pubid/ieee/builder.rb +12 -12
  235. data/lib/pubid/ieee/components/code.rb +8 -0
  236. data/lib/pubid/ieee/components/draft.rb +14 -0
  237. data/lib/pubid/ieee/components/relationship.rb +5 -149
  238. data/lib/pubid/ieee/identifier.rb +6 -0
  239. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  240. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  241. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  242. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  243. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  245. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  246. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  247. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  248. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  249. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  250. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  251. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  252. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  253. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  254. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  255. data/lib/pubid/ieee/pre_parser.rb +301 -0
  256. data/lib/pubid/ieee/renderer.rb +307 -0
  257. data/lib/pubid/ieee/urn_parser.rb +34 -0
  258. data/lib/pubid/ieee.rb +62 -1
  259. data/lib/pubid/ieee_debug.rb +0 -1
  260. data/lib/pubid/iho/builder.rb +2 -2
  261. data/lib/pubid/iho/identifier.rb +8 -0
  262. data/lib/pubid/iho/identifiers/base.rb +49 -10
  263. data/lib/pubid/iho/identifiers/bibliographic.rb +0 -4
  264. data/lib/pubid/iho/identifiers/circular_letter.rb +0 -4
  265. data/lib/pubid/iho/identifiers/miscellaneous.rb +0 -4
  266. data/lib/pubid/iho/identifiers/publication.rb +0 -4
  267. data/lib/pubid/iho/identifiers/standard.rb +0 -4
  268. data/lib/pubid/iho/parser.rb +3 -3
  269. data/lib/pubid/iho/renderer.rb +30 -0
  270. data/lib/pubid/iho/urn_generator.rb +3 -3
  271. data/lib/pubid/iho/urn_parser.rb +58 -0
  272. data/lib/pubid/iho.rb +50 -1
  273. data/lib/pubid/iso/builder.rb +59 -53
  274. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  275. data/lib/pubid/iso/components/code.rb +7 -19
  276. data/lib/pubid/iso/components/publisher.rb +10 -8
  277. data/lib/pubid/iso/components.rb +2 -4
  278. data/lib/pubid/iso/identifier.rb +233 -6
  279. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  280. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  281. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  282. data/lib/pubid/iso/identifiers/data.rb +0 -1
  283. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  284. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  285. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  286. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  287. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  288. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  289. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  290. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  291. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  292. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  293. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  294. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  295. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  296. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  297. data/lib/pubid/iso/identifiers.rb +0 -1
  298. data/lib/pubid/iso/normalizer.rb +89 -0
  299. data/lib/pubid/iso/parser.rb +26 -6
  300. data/lib/pubid/iso/single_identifier.rb +6 -3
  301. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  302. data/lib/pubid/iso/urn_generator.rb +74 -176
  303. data/lib/pubid/iso/urn_parser.rb +28 -9
  304. data/lib/pubid/iso.rb +173 -2
  305. data/lib/pubid/itu/builder.rb +0 -12
  306. data/lib/pubid/itu/components/code.rb +8 -0
  307. data/lib/pubid/itu/components.rb +11 -0
  308. data/lib/pubid/itu/identifier.rb +6 -39
  309. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  310. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  311. data/lib/pubid/itu/identifiers/base.rb +0 -6
  312. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  313. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  314. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  315. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  316. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  317. data/lib/pubid/itu/urn_parser.rb +23 -0
  318. data/lib/pubid/itu.rb +42 -1
  319. data/lib/pubid/jcgm/builder.rb +16 -8
  320. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  321. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  322. data/lib/pubid/jcgm/renderer.rb +68 -0
  323. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  324. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  325. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  326. data/lib/pubid/jcgm.rb +43 -2
  327. data/lib/pubid/jis/builder.rb +44 -52
  328. data/lib/pubid/jis/identifier.rb +132 -3
  329. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  330. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  331. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  332. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  333. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  334. data/lib/pubid/jis/identifiers.rb +1 -1
  335. data/lib/pubid/jis/parser.rb +31 -5
  336. data/lib/pubid/jis/renderer.rb +69 -0
  337. data/lib/pubid/jis/single_identifier.rb +6 -12
  338. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  339. data/lib/pubid/jis/urn_parser.rb +23 -0
  340. data/lib/pubid/jis.rb +42 -2
  341. data/lib/pubid/nist/builder.rb +122 -1761
  342. data/lib/pubid/nist/caster.rb +1272 -0
  343. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  344. data/lib/pubid/nist/components/code.rb +9 -20
  345. data/lib/pubid/nist/components/edition.rb +16 -0
  346. data/lib/pubid/nist/components/supplement.rb +88 -21
  347. data/lib/pubid/nist/components.rb +0 -1
  348. data/lib/pubid/nist/identifier.rb +25 -0
  349. data/lib/pubid/nist/identifiers/base.rb +206 -64
  350. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  351. data/lib/pubid/nist/identifiers/circular_supplement.rb +3 -2
  352. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  353. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  354. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  355. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -11
  356. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  357. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -16
  358. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  359. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  360. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  361. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  362. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  363. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  364. data/lib/pubid/nist/identifiers/report.rb +4 -3
  365. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  366. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  367. data/lib/pubid/nist/identifiers.rb +1 -0
  368. data/lib/pubid/nist/parser.rb +67 -424
  369. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  370. data/lib/pubid/nist/preprocessor.rb +416 -0
  371. data/lib/pubid/nist/renderer.rb +43 -0
  372. data/lib/pubid/nist/router.rb +148 -0
  373. data/lib/pubid/nist/series/base.rb +58 -0
  374. data/lib/pubid/nist/series/crpl.rb +13 -0
  375. data/lib/pubid/nist/series/fips.rb +14 -0
  376. data/lib/pubid/nist/series/ir.rb +60 -0
  377. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  378. data/lib/pubid/nist/series/mono.rb +19 -0
  379. data/lib/pubid/nist/series/ncstar.rb +20 -0
  380. data/lib/pubid/nist/series.rb +49 -0
  381. data/lib/pubid/nist/supplement_identifier.rb +11 -25
  382. data/lib/pubid/nist/urn_generator.rb +14 -8
  383. data/lib/pubid/nist/urn_parser.rb +67 -0
  384. data/lib/pubid/nist.rb +83 -4
  385. data/lib/pubid/oiml/components/code.rb +10 -0
  386. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  387. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  388. data/lib/pubid/oiml/renderer.rb +161 -0
  389. data/lib/pubid/oiml/single_identifier.rb +6 -45
  390. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  391. data/lib/pubid/oiml/urn_generator.rb +0 -8
  392. data/lib/pubid/oiml/urn_parser.rb +22 -0
  393. data/lib/pubid/oiml.rb +42 -1
  394. data/lib/pubid/plateau/identifier.rb +23 -0
  395. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  396. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  397. data/lib/pubid/plateau/renderer.rb +51 -0
  398. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  399. data/lib/pubid/plateau/urn_parser.rb +43 -0
  400. data/lib/pubid/plateau.rb +44 -1
  401. data/lib/pubid/renderers/base.rb +34 -0
  402. data/lib/pubid/renderers/directives_renderer.rb +27 -14
  403. data/lib/pubid/renderers/guide_renderer.rb +7 -1
  404. data/lib/pubid/renderers/human_readable.rb +31 -8
  405. data/lib/pubid/renderers/iwa_renderer.rb +5 -1
  406. data/lib/pubid/renderers/supplement_renderer.rb +4 -1
  407. data/lib/pubid/rendering/context.rb +33 -21
  408. data/lib/pubid/rendering.rb +0 -3
  409. data/lib/pubid/sae/components/date.rb +8 -0
  410. data/lib/pubid/sae/components/type.rb +5 -1
  411. data/lib/pubid/sae/identifiers/base.rb +2 -16
  412. data/lib/pubid/sae/renderer.rb +36 -0
  413. data/lib/pubid/sae/urn_generator.rb +2 -10
  414. data/lib/pubid/sae/urn_parser.rb +36 -0
  415. data/lib/pubid/sae.rb +42 -1
  416. data/lib/pubid/urn_generator/base.rb +12 -12
  417. data/lib/pubid/urn_parser/base.rb +81 -0
  418. data/lib/pubid/urn_parser/errors.rb +9 -0
  419. data/lib/pubid/urn_parser.rb +14 -0
  420. data/lib/pubid/version.rb +1 -1
  421. data/lib/pubid.rb +29 -7
  422. data/lib/tasks/website-data.json +1940 -1882
  423. metadata +77 -43
  424. data/lib/pubid/amca/scheme.rb +0 -16
  425. data/lib/pubid/ansi/scheme.rb +0 -15
  426. data/lib/pubid/api/scheme.rb +0 -66
  427. data/lib/pubid/ashrae/scheme.rb +0 -53
  428. data/lib/pubid/asme/scheme.rb +0 -37
  429. data/lib/pubid/astm/scheme.rb +0 -55
  430. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  431. data/lib/pubid/bsi/scheme.rb +0 -243
  432. data/lib/pubid/ccsds/scheme.rb +0 -57
  433. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  434. data/lib/pubid/cie/scheme.rb +0 -64
  435. data/lib/pubid/csa/scheme.rb +0 -44
  436. data/lib/pubid/etsi/scheme.rb +0 -42
  437. data/lib/pubid/export/data_class_exporter.rb +0 -59
  438. data/lib/pubid/export/ieee_exporter.rb +0 -78
  439. data/lib/pubid/export/itu_exporter.rb +0 -66
  440. data/lib/pubid/export/nist_exporter.rb +0 -64
  441. data/lib/pubid/export/registry_exporter.rb +0 -90
  442. data/lib/pubid/export/scheme_exporter.rb +0 -70
  443. data/lib/pubid/identifier_registry.rb +0 -198
  444. data/lib/pubid/idf/scheme.rb +0 -61
  445. data/lib/pubid/iec/scheme.rb +0 -71
  446. data/lib/pubid/ieee/scheme.rb +0 -90
  447. data/lib/pubid/iho/scheme.rb +0 -29
  448. data/lib/pubid/iso/identifiers/base.rb +0 -115
  449. data/lib/pubid/iso/scheme.rb +0 -187
  450. data/lib/pubid/itu/scheme.rb +0 -174
  451. data/lib/pubid/jcgm/scheme.rb +0 -60
  452. data/lib/pubid/jis/components/code.rb +0 -59
  453. data/lib/pubid/jis/identifiers/base.rb +0 -72
  454. data/lib/pubid/jis/scheme.rb +0 -49
  455. data/lib/pubid/nist/components/publisher.rb +0 -24
  456. data/lib/pubid/nist/scheme.rb +0 -199
  457. data/lib/pubid/oiml/scheme.rb +0 -46
  458. data/lib/pubid/plateau/scheme.rb +0 -45
  459. data/lib/pubid/rendering/base.rb +0 -73
  460. data/lib/pubid/rendering/common.rb +0 -211
  461. data/lib/pubid/rendering/format.rb +0 -25
  462. data/lib/pubid/sae/scheme.rb +0 -47
  463. data/lib/pubid/scheme.rb +0 -207
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "typed_stages"
4
-
5
- module Pubid
6
- module Ieee
7
- # Scheme provides registry access for IEEE identifiers
8
- # Following the proven ISO/IEC/CEN/BSI pattern
9
- #
10
- # This class is the single source of truth for:
11
- # - TypedStage lookup by abbreviation
12
- # - TypedStage lookup by IEEE draft notation
13
- # - TypedStage lookup by ISO stage code
14
- # - Identifier class selection based on type code
15
- class Scheme < Pubid::Scheme
16
- class << self
17
- # Locate typed stage by abbreviation
18
- # @param abbr [String, nil] stage abbreviation (e.g., "D1", "FDIS", "Std")
19
- # @return [Components::TypedStage] matching typed stage
20
- def locate_typed_stage_by_abbr(abbr)
21
- return TypedStages::DEFAULT_TYPED_STAGE if abbr.nil? || abbr.to_s.strip.empty?
22
-
23
- # Normalize abbreviation
24
- abbr_str = abbr.to_s.strip
25
-
26
- # Find typed stage that includes this abbreviation
27
- typed_stage = TypedStages::TYPED_STAGES.find { |ts| ts.abbr.include?(abbr_str) }
28
-
29
- # Fall back to default if not found
30
- typed_stage || TypedStages::DEFAULT_TYPED_STAGE
31
- end
32
-
33
- # Locate typed stage by IEEE draft notation
34
- # @param draft [String] IEEE draft notation (e.g., "D1", "D5", "P")
35
- # @return [Components::TypedStage, nil] matching typed stage
36
- def locate_typed_stage_by_ieee_draft(draft)
37
- return nil if draft.nil? || draft.to_s.strip.empty?
38
-
39
- draft_str = draft.to_s.strip
40
-
41
- # Try exact match on abbreviation first
42
- ts = TypedStages::TYPED_STAGES.find { |t| t.abbr.include?(draft_str) }
43
- return ts if ts
44
-
45
- # Try match on ieee_draft_equivalent
46
- TypedStages::TYPED_STAGES.find { |t| t.ieee_draft_equivalent == draft_str }
47
- end
48
-
49
- # Locate typed stage by ISO stage code
50
- # @param stage [String] ISO stage code (e.g., "WD", "CD", "DIS", "FDIS")
51
- # @return [Components::TypedStage, nil] matching typed stage
52
- def locate_typed_stage_by_iso_stage(stage)
53
- return nil if stage.nil? || stage.to_s.strip.empty?
54
-
55
- TypedStages::TYPED_STAGES.find { |ts| ts.iso_stage_equivalent == stage.to_s.strip }
56
- end
57
-
58
- # Locate identifier class by type code
59
- # @param type_code [String, Symbol] type code (:standard, :draft, :std, :P, etc.)
60
- # @return [Class] identifier class
61
- def locate_identifier_klass_by_type_code(type_code)
62
- type_str = type_code.to_s
63
-
64
- case type_str
65
- when "draft", "Draft Std", "Draft", "P"
66
- # "P" indicates project draft status - maps to ProjectDraftIdentifier
67
- Identifiers::ProjectDraftIdentifier
68
- when "standard", "Std", "std"
69
- Identifiers::Standard
70
- else
71
- # Default to base identifier
72
- Identifiers::Base
73
- end
74
- end
75
-
76
- # Get all typed stages
77
- # @return [Array<Components::TypedStage>] all registered typed stages
78
- def typed_stages
79
- TypedStages::TYPED_STAGES
80
- end
81
-
82
- # Get default typed stage (published standard)
83
- # @return [Components::TypedStage] default typed stage
84
- def default_typed_stage
85
- TypedStages::DEFAULT_TYPED_STAGE
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Iho
5
- # Scheme registry for IHO identifier types.
6
- class Scheme < Pubid::Scheme
7
- IDENTIFIERS = [
8
- Identifiers::Standard,
9
- Identifiers::Publication,
10
- Identifiers::Miscellaneous,
11
- Identifiers::Bibliographic,
12
- Identifiers::CircularLetter,
13
- ].freeze
14
-
15
- def initialize
16
- @identifiers = IDENTIFIERS
17
- end
18
-
19
- # Look up an identifier class by its IHO series letter (S/P/M/B/C).
20
- # @param letter [String]
21
- # @return [Class<Identifiers::Base>]
22
- # @raise [KeyError] if the letter is not a known IHO series
23
- def self.identifier_klass_for_type_letter(letter)
24
- @by_letter ||= IDENTIFIERS.to_h { |klass| [klass.type[:short], klass] }
25
- @by_letter.fetch(letter.to_s)
26
- end
27
- end
28
- end
29
- end
@@ -1,115 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "lutaml/model"
4
-
5
- module Pubid
6
- module Iso
7
- module Identifiers
8
- # Base class for ISO identifiers
9
- class Base < ::Pubid::Identifier
10
- # Inherit most attributes from parent
11
- # ISO-specific attributes
12
- attribute :stage_iteration, ::Pubid::Iso::Components::Code
13
-
14
- # ISO rendering context singleton
15
- def self.rendering_context
16
- @rendering_context ||= Pubid::Rendering::RenderingContext.iso
17
- end
18
-
19
- # Render identifier using OOP approach - each component renders itself
20
- #
21
- # @param lang [Symbol] language for rendering (:en or :fr)
22
- # @param lang_single [Boolean] use single char language format
23
- # @param with_edition [Boolean] include edition in output
24
- # @return [String] formatted identifier string
25
- def to_s(lang: :en, lang_single: false, with_edition: false)
26
- # Create rendering context with language settings
27
- context = Pubid::Rendering::RenderingContext.new(
28
- stage_separator: "/",
29
- stage_separator_with_copublisher: " ",
30
- type_separator: "/",
31
- type_separator_with_prefix: " ",
32
- default_type_abbr: "IS",
33
- lang: lang,
34
- lang_single: lang_single,
35
- )
36
-
37
- # Compose the identifier from component renderings
38
- render_from_components(context: context, with_edition: with_edition)
39
- end
40
-
41
- private
42
-
43
- # Compose identifier string by having each component render itself
44
- #
45
- # @param context [RenderingContext] rendering context for flavor rules
46
- # @param with_edition [Boolean] include edition in output
47
- # @return [String] composed identifier string
48
- def render_from_components(context:, with_edition: false)
49
- parts = []
50
- parts << publisher.to_s
51
-
52
- # Stage renders itself with context-aware separators
53
- if stage
54
- has_copub = publisher&.has_copublisher?
55
- parts << stage.to_s(context: context, has_copublisher: has_copub)
56
- end
57
-
58
- # Type renders itself with context-aware separators and default handling
59
- if type
60
- has_prefix = stage || publisher&.has_copublisher?
61
- type_render = type.to_s(context: context, has_prefix: has_prefix)
62
- parts << type_render if type_render != ""
63
- end
64
-
65
- # Number renders itself
66
- parts << " #{number.value}" if number&.value
67
-
68
- # Parts render themselves
69
- parts << "-#{part.value}" if part&.value
70
- parts << "-#{subpart.value}" if subpart&.value
71
-
72
- # Stage iteration renders itself
73
- parts << ".#{stage_iteration.value}" if stage_iteration&.value
74
-
75
- # Date renders itself with context
76
- parts << date.to_s(context: context) if date&.year
77
-
78
- # Edition renders itself
79
- parts << " #{edition}" if with_edition && edition&.number
80
-
81
- # Languages render themselves
82
- if languages&.any?
83
- parts << "(#{languages.map do |l|
84
- l.to_s(lang_single: context.lang_single)
85
- end.join('/')})"
86
- end
87
-
88
- parts.join
89
- end
90
-
91
- public
92
-
93
- # V1 API compatibility - tests expect .copublishers returning array of Publisher objects
94
- def copublishers
95
- return [] unless publisher.copublisher&.any?
96
-
97
- publisher.copublisher.map do |cp|
98
- ::Pubid::Components::Publisher.new(body: cp)
99
- end
100
- end
101
-
102
- def ==(other)
103
- return false unless other.is_a?(Base)
104
-
105
- publisher == other.publisher &&
106
- type == other.type &&
107
- number == other.number &&
108
- part == other.part &&
109
- date == other.date &&
110
- stage == other.stage
111
- end
112
- end
113
- end
114
- end
115
- end
@@ -1,187 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Iso
5
- # ISO Scheme with memoized parser/builder and hash-based indexing
6
- class Scheme < Pubid::Scheme
7
- class << self
8
- # Singleton instance for memoization
9
- # @return [Pubid::Iso::Scheme] the singleton scheme instance
10
- def instance
11
- @instance ||= new
12
- end
13
-
14
- # Delegate class methods to singleton instance for backward compatibility
15
- # @param identifier [String] the identifier string to parse
16
- # @return [Identifier] the parsed identifier
17
- def parse(identifier)
18
- instance.parse(identifier)
19
- end
20
-
21
- # @param abbr [String, Symbol] the abbreviation to find
22
- # @return [TypedStage] the matching typed stage
23
- def locate_typed_stage_by_abbr(abbr)
24
- instance.locate_typed_stage_by_abbr(abbr)
25
- end
26
-
27
- # @param type_code [String, Symbol] the type code to find
28
- # @return [Class] the matching identifier class
29
- def locate_identifier_klass_by_type_code(type_code)
30
- instance.locate_identifier_klass_by_type_code(type_code)
31
- end
32
-
33
- # @param stage_code [String, Symbol] the stage code to find
34
- # @return [TypedStage] the matching typed stage
35
- def locate_typed_stage_by_stage_code(stage_code)
36
- instance.locate_typed_stage_by_stage_code(stage_code)
37
- end
38
-
39
- # @param harmonized_code [String] the harmonized stage code to find
40
- # @return [TypedStage, nil] the matching typed stage
41
- def locate_typed_stage_by_harmonized_code(harmonized_code)
42
- instance.locate_typed_stage_by_harmonized_code(harmonized_code)
43
- end
44
-
45
- # Keep existing class methods for backward compatibility
46
- # @return [Array<Class>] all base identifier classes
47
- def identifiers
48
- [
49
- Identifiers::InternationalStandard,
50
- Identifiers::TechnicalReport,
51
- Identifiers::TechnicalSpecification,
52
- Identifiers::Guide,
53
- Identifiers::Pas,
54
- Identifiers::Data,
55
- Identifiers::TechnologyTrendsAssessments,
56
- Identifiers::InternationalWorkshopAgreement,
57
- Identifiers::InternationalStandardizedProfile,
58
- Identifiers::Recommendation,
59
- Identifiers::Directives,
60
- Identifiers::Amendment,
61
- Identifiers::Corrigendum,
62
- Identifiers::Supplement,
63
- Identifiers::Extract,
64
- Identifiers::DirectivesSupplement,
65
- Identifiers::Addendum,
66
- Identifiers::TcDocument,
67
- ]
68
- end
69
-
70
- def typed_stages
71
- identifiers.flat_map { |klass| klass::TYPED_STAGES }.compact
72
- end
73
-
74
- def supplement_typed_stages
75
- supplement_identifiers = [
76
- Identifiers::Amendment,
77
- Identifiers::Corrigendum,
78
- Identifiers::Supplement,
79
- Identifiers::Extract,
80
- Identifiers::Addendum,
81
- ]
82
- supplement_identifiers.flat_map { |klass| klass::TYPED_STAGES }
83
- end
84
- end
85
-
86
- # Initialize the scheme with identifiers
87
- def initialize
88
- super(
89
- identifiers: self.class.identifiers,
90
- supplement_identifiers: [
91
- Identifiers::Amendment,
92
- Identifiers::Corrigendum,
93
- Identifiers::Supplement,
94
- Identifiers::Extract,
95
- Identifiers::Addendum,
96
- ],
97
- )
98
- end
99
-
100
- # Parse an ISO identifier string using memoized parser/builder
101
- # @param identifier [String] the identifier string to parse
102
- # @return [Identifier] the parsed identifier
103
- def parse(identifier)
104
- # Handle DAD/FDAD patterns that parser can't recognize
105
- if match = identifier.match(/^(.+?)\/(F?DAD)\s+(\d+)(?::(\d{4}))?$/)
106
- parse_dad_pattern(match)
107
- else
108
- # Apply legacy update_codes normalization first, before any other preprocessing
109
- normalized = Core::UpdateCodes.apply(identifier, :iso)
110
- # Normalize Cyrillic (Russian) identifiers to Latin equivalents
111
- normalized = normalize_cyrillic(normalized)
112
- parsed = parser.parse(normalized)
113
- builder.build(parsed)
114
- end
115
- end
116
-
117
- private
118
-
119
- # Memoized parser instance
120
- # @return [Pubid::Iso::Parser] parser instance
121
- def parser
122
- @parser ||= ::Pubid::Iso::Parser.new
123
- end
124
-
125
- # Memoized builder instance
126
- # @return [Pubid::Iso::Builder] builder instance
127
- def builder
128
- @builder ||= ::Pubid::Iso::Builder.new(self)
129
- end
130
-
131
- # Normalize Cyrillic (Russian) ISO identifiers to Latin equivalents
132
- # ИСО = ISO, МЭК = IEC, Руководство/Руководства = Guide,
133
- # ОПМС = FDIS, ПМС = DIS, ТО = TR, ТС = TS
134
- def normalize_cyrillic(identifier)
135
- return identifier unless identifier.match?(/[а-яА-Я]/)
136
-
137
- normalized = identifier.dup
138
- # Remove inline comments (Russian style comments with #)
139
- normalized = normalized.gsub(/\s*#\s*.*$/, "")
140
- # Translate Russian abbreviations (order matters: longer first)
141
- normalized = normalized.gsub("Руководства", "GUIDE")
142
- normalized = normalized.gsub("Руководство", "GUIDE")
143
- normalized = normalized.gsub("ИСО/МЭК", "ISO/IEC")
144
- normalized = normalized.gsub("ИСО/ОПМС", "ISO/FDIS")
145
- normalized = normalized.gsub("ИСО/ПМС", "ISO/DIS")
146
- normalized = normalized.gsub("ИСО/ТО", "ISO/TR")
147
- normalized = normalized.gsub("ИСО/ТС", "ISO/TS")
148
- normalized = normalized.gsub("ИСО", "ISO")
149
- normalized = normalized.gsub("МЭК", "IEC")
150
- # Standalone Cyrillic stage abbreviations (after publisher replacements)
151
- normalized = normalized.gsub("ТО", "TR")
152
- normalized = normalized.gsub("ТС", "TS")
153
- normalized = normalized.gsub("ОПМС", "FDIS")
154
- normalized = normalized.gsub("ПМС", "DIS")
155
- normalized.strip
156
- end
157
-
158
- # Parse DAD/FDAM pattern manually
159
- # Pattern: "ISO 2631/DAD 1" or "ISO 2553/DAD 1:1987"
160
- # The parser fails because it treats "/" as copublisher separator
161
- def parse_dad_pattern(match)
162
- base_str = match[1] # "ISO 2631" or "ISO 2553"
163
- stage_abbr = match[2] # "DAD" or "FDAD"
164
- supplement_number = match[3] # "1"
165
- supplement_year = match[4] # "1987" or nil
166
-
167
- # Parse the base identifier normally (without supplement)
168
- base_parsed = parser.parse(base_str)
169
- base_identifier = builder.build(base_parsed)
170
-
171
- # Construct the Addendum supplement manually
172
- addendum = Identifiers::Addendum.new
173
- addendum.base_identifier = base_identifier
174
- addendum.number = Iso::Components::Code.new(number: supplement_number)
175
- addendum.date = Pubid::Components::Date.new(year: supplement_year) if supplement_year
176
-
177
- # Set typed_stage from register (uses TYPED_STAGES in Addendum class)
178
- typed_stage = locate_typed_stage_by_abbr(stage_abbr)
179
- addendum.typed_stage = typed_stage
180
- addendum.stage = typed_stage.to_stage
181
- addendum.type = typed_stage.to_type
182
-
183
- addendum
184
- end
185
- end
186
- end
187
- end
@@ -1,174 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "model"
4
-
5
- module Pubid
6
- module Itu
7
- class Scheme < Pubid::Scheme
8
- # Attribute mappings define how parsed data maps to model attributes
9
- ATTRIBUTE_MAPPINGS = {
10
- sector: :sector,
11
- series: :series,
12
- number: :number,
13
- subseries: :subseries,
14
- part: :part,
15
- supplement: :supplement,
16
- amendment: :amendment,
17
- annex: :annex,
18
- corrigendum: :corrigendum,
19
- addendum: :addendum,
20
- appendix: :appendix,
21
- date: :date,
22
- month: :month,
23
- year: :year,
24
- second_number: :second_number,
25
- range_series: :range_series,
26
- range_number: :range_number,
27
- sg_number: :sg_number,
28
- }.freeze
29
-
30
- # Model class to use for rendering
31
- def self.model_class
32
- Model
33
- end
34
-
35
- # Convert parsed data to model attributes
36
- def self.transform(parsed)
37
- attributes = {}
38
-
39
- # Extract sector
40
- attributes[:sector] = parsed[:sector].to_s if parsed[:sector]
41
-
42
- # Determine content based on sector
43
- content = parsed[:t_content] || parsed[:r_content] || {}
44
-
45
- # Extract series and study group
46
- if content[:series].is_a?(Hash) && content[:series][:sg_number]
47
- # Study groups (questions)
48
- attributes[:series] = "SG#{content[:series][:sg_number]}"
49
- elsif content[:series]
50
- attributes[:series] = content[:series].to_s
51
- end
52
-
53
- # Extract numbering components
54
- if content[:numbering]
55
- numbering = content[:numbering]
56
-
57
- # Handle numbering as array (e.g., number + subseries)
58
- if numbering.is_a?(Array)
59
- numbering.each do |part|
60
- if part.is_a?(Hash)
61
- if part[:number]
62
- attributes[:number] = part[:number].to_s
63
- elsif part[:subseries]
64
- # Collect subseries parts
65
- if attributes[:subseries]
66
- attributes[:subseries] =
67
- "#{attributes[:subseries]}.#{part[:subseries]}"
68
- else
69
- attributes[:subseries] = part[:subseries].to_s
70
- end
71
- elsif part[:part]
72
- attributes[:part] = part[:part].to_s
73
- end
74
- end
75
- end
76
- elsif numbering.is_a?(Hash)
77
- # Handle numbering as hash
78
- attributes[:number] = numbering[:number].to_s if numbering[:number]
79
- if numbering[:subseries]
80
- attributes[:subseries] =
81
- numbering[:subseries].to_s
82
- end
83
- attributes[:part] = numbering[:part].to_s if numbering[:part]
84
- end
85
- end
86
-
87
- # Extract supplement/amendment/etc.
88
- if content[:supplement]
89
- attributes[:supplement] =
90
- content[:supplement].to_s
91
- end
92
- attributes[:amendment] = content[:amendment].to_s if content[:amendment]
93
- attributes[:annex] = content[:annex].to_s if content[:annex]
94
- if content[:corrigendum]
95
- attributes[:corrigendum] =
96
- content[:corrigendum].to_s
97
- end
98
- attributes[:addendum] = content[:addendum].to_s if content[:addendum]
99
-
100
- # Handle appendix (convert Roman numerals to Arabic)
101
- if content[:appendix]
102
- appendix = content[:appendix].to_s
103
- attributes[:appendix] = roman_to_arabic(appendix) || appendix
104
- end
105
-
106
- # Extract date
107
- if content[:date]
108
- date = content[:date]
109
- if date[:month] && date[:year]
110
- attributes[:month] = date[:month].to_s
111
- attributes[:year] = date[:year].to_s
112
- elsif date[:year]
113
- attributes[:year] = date[:year].to_s
114
- end
115
- end
116
-
117
- # Extract second number (for combined standards like G.780/Y.1351)
118
- if content[:second_number]
119
- second = content[:second_number]
120
- second_attrs = {}
121
- second_attrs[:series] = second[:series].to_s if second[:series]
122
- if second[:numbering]
123
- numbering = second[:numbering]
124
- if numbering[:number]
125
- second_attrs[:number] =
126
- numbering[:number].to_s
127
- end
128
- if numbering[:subseries]
129
- second_attrs[:subseries] = numbering[:subseries].to_s
130
- end
131
- second_attrs[:part] = numbering[:part].to_s if numbering[:part]
132
- end
133
- attributes[:second_number] = second_attrs unless second_attrs.empty?
134
- end
135
-
136
- # Extract range (for Q.400-Q.490 style)
137
- if content[:range_series] && content[:range_number]
138
- attributes[:range] = {
139
- series: content[:range_series].to_s,
140
- number: content[:range_number].to_s,
141
- }
142
- end
143
-
144
- attributes
145
- end
146
-
147
- # Convert Roman numerals to Arabic numbers
148
- def self.roman_to_arabic(roman)
149
- return roman unless roman.match?(/^[IVXLCDM]+$/i)
150
-
151
- roman_map = {
152
- "I" => 1, "V" => 5, "X" => 10, "L" => 50,
153
- "C" => 100, "D" => 500, "M" => 1000
154
- }
155
-
156
- roman = roman.upcase
157
- result = 0
158
- prev_value = 0
159
-
160
- roman.reverse.each_char do |char|
161
- value = roman_map[char]
162
- if value < prev_value
163
- result -= value
164
- else
165
- result += value
166
- end
167
- prev_value = value
168
- end
169
-
170
- result.to_s
171
- end
172
- end
173
- end
174
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Jcgm
5
- class Scheme < Pubid::Scheme
6
- class << self
7
- def identifiers
8
- [
9
- Identifiers::Guide,
10
- Identifiers::GumGuide,
11
- ]
12
- end
13
-
14
- def supplement_identifiers
15
- [
16
- Identifiers::Amendment,
17
- ]
18
- end
19
-
20
- def typed_stages
21
- (identifiers + supplement_identifiers).flat_map do |klass|
22
- klass::TYPED_STAGES
23
- end
24
- end
25
-
26
- def locate_typed_stage_by_abbr(abbr)
27
- # Empty abbr means Guide (published)
28
- abbr = "" if abbr.nil? || abbr.to_s.strip.empty?
29
-
30
- typed_stage = typed_stages.detect do |ts|
31
- ts.abbr.include?(abbr)
32
- end
33
-
34
- unless typed_stage
35
- raise ArgumentError,
36
- "Unknown type abbreviation: '#{abbr}'"
37
- end
38
-
39
- typed_stage
40
- end
41
-
42
- def locate_identifier_klass_by_type_code(type_code)
43
- # Check all identifier classes (base + supplement)
44
- all_classes = identifiers + supplement_identifiers
45
-
46
- identifier_klass = all_classes.detect do |klass|
47
- klass.type[:key].to_s == type_code.to_s
48
- end
49
-
50
- unless identifier_klass
51
- raise ArgumentError,
52
- "Unknown type code: #{type_code}"
53
- end
54
-
55
- identifier_klass
56
- end
57
- end
58
- end
59
- end
60
- end