pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +25 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +7 -39
  6. data/lib/pubid/amca/identifiers/base.rb +0 -26
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -17
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -13
  9. data/lib/pubid/amca/renderer.rb +82 -0
  10. data/lib/pubid/amca/single_identifier.rb +0 -23
  11. data/lib/pubid/amca/urn_parser.rb +28 -0
  12. data/lib/pubid/amca.rb +42 -1
  13. data/lib/pubid/ansi/builder.rb +5 -3
  14. data/lib/pubid/ansi/identifier.rb +1 -43
  15. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  16. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  17. data/lib/pubid/ansi/renderer.rb +53 -0
  18. data/lib/pubid/ansi/single_identifier.rb +2 -31
  19. data/lib/pubid/ansi/urn_generator.rb +3 -38
  20. data/lib/pubid/ansi/urn_parser.rb +23 -0
  21. data/lib/pubid/ansi.rb +38 -3
  22. data/lib/pubid/api/builder.rb +29 -74
  23. data/lib/pubid/api/identifier.rb +0 -51
  24. data/lib/pubid/api/identifiers/base.rb +0 -2
  25. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  26. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  27. data/lib/pubid/api/identifiers/mpms.rb +1 -17
  28. data/lib/pubid/api/identifiers/publication.rb +0 -2
  29. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  30. data/lib/pubid/api/identifiers/specification.rb +0 -2
  31. data/lib/pubid/api/identifiers/standard.rb +0 -2
  32. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  33. data/lib/pubid/api/identifiers/typeless_standard.rb +1 -14
  34. data/lib/pubid/api/identifiers.rb +18 -0
  35. data/lib/pubid/api/renderer.rb +89 -0
  36. data/lib/pubid/api/single_identifier.rb +1 -13
  37. data/lib/pubid/api/urn_generator.rb +0 -18
  38. data/lib/pubid/api/urn_parser.rb +35 -0
  39. data/lib/pubid/api.rb +51 -5
  40. data/lib/pubid/ashrae/builder.rb +3 -3
  41. data/lib/pubid/ashrae/identifier.rb +6 -39
  42. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  43. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  44. data/lib/pubid/ashrae/identifiers/base.rb +3 -0
  45. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  46. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  47. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  48. data/lib/pubid/ashrae/renderer.rb +117 -0
  49. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  50. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  51. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  52. data/lib/pubid/ashrae.rb +42 -1
  53. data/lib/pubid/asme/components/code.rb +10 -2
  54. data/lib/pubid/asme/identifier.rb +0 -46
  55. data/lib/pubid/asme/identifiers/base.rb +0 -60
  56. data/lib/pubid/asme/renderer.rb +66 -0
  57. data/lib/pubid/asme/urn_parser.rb +31 -0
  58. data/lib/pubid/asme.rb +42 -1
  59. data/lib/pubid/astm/components/code.rb +9 -0
  60. data/lib/pubid/{jis → astm}/components.rb +1 -1
  61. data/lib/pubid/astm/identifier.rb +0 -77
  62. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  63. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  64. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  65. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  66. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  67. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  68. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  69. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  70. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  71. data/lib/pubid/astm/identifiers.rb +18 -0
  72. data/lib/pubid/astm/renderer.rb +172 -0
  73. data/lib/pubid/astm/single_identifier.rb +0 -10
  74. data/lib/pubid/astm/urn_parser.rb +30 -0
  75. data/lib/pubid/astm.rb +39 -27
  76. data/lib/pubid/bsi/builder.rb +21 -12
  77. data/lib/pubid/bsi/identifier.rb +8 -62
  78. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  79. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  80. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  81. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  82. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  83. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  84. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  85. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  87. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  88. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  89. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  90. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  91. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  92. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  93. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  94. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  95. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  96. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  97. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  98. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  99. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  100. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  101. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  102. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  103. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  104. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  105. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  106. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  107. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  108. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  109. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  110. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  111. data/lib/pubid/bsi/identifiers.rb +0 -1
  112. data/lib/pubid/bsi/renderer.rb +1050 -0
  113. data/lib/pubid/bsi/single_identifier.rb +6 -70
  114. data/lib/pubid/bsi/urn_generator.rb +2 -3
  115. data/lib/pubid/bsi/urn_parser.rb +52 -0
  116. data/lib/pubid/bsi.rb +224 -1
  117. data/lib/pubid/builder/base.rb +57 -10
  118. data/lib/pubid/bundled_identifier.rb +0 -1
  119. data/lib/pubid/ccsds/builder.rb +4 -3
  120. data/lib/pubid/ccsds/identifier.rb +63 -66
  121. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  122. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  123. data/lib/pubid/ccsds/parser.rb +4 -2
  124. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  125. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  126. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  127. data/lib/pubid/ccsds.rb +39 -1
  128. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  129. data/lib/pubid/cen_cenelec/identifier.rb +7 -38
  130. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  131. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  132. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  133. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  135. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  136. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  137. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  139. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  140. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  141. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  143. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  145. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  146. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  147. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  148. data/lib/pubid/cen_cenelec.rb +168 -1
  149. data/lib/pubid/cie/components/code.rb +8 -0
  150. data/lib/pubid/cie/identifier.rb +6 -57
  151. data/lib/pubid/cie/urn_parser.rb +28 -0
  152. data/lib/pubid/cie.rb +43 -1
  153. data/lib/pubid/components/adoption.rb +104 -0
  154. data/lib/pubid/components/code.rb +22 -8
  155. data/lib/pubid/components/date.rb +23 -16
  156. data/lib/pubid/components/edition.rb +9 -6
  157. data/lib/pubid/components/iteration.rb +32 -0
  158. data/lib/pubid/components/language.rb +6 -4
  159. data/lib/pubid/components/locality.rb +10 -1
  160. data/lib/pubid/components/publisher.rb +9 -6
  161. data/lib/pubid/components/relationship.rb +151 -0
  162. data/lib/pubid/components/stage.rb +5 -14
  163. data/lib/pubid/components/supplement.rb +184 -0
  164. data/lib/pubid/components/type.rb +5 -15
  165. data/lib/pubid/components/typed_stage.rb +10 -11
  166. data/lib/pubid/components.rb +4 -1
  167. data/lib/pubid/core/update_codes.rb +28 -7
  168. data/lib/pubid/csa/identifier.rb +0 -59
  169. data/lib/pubid/csa/identifiers/base.rb +2 -122
  170. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  171. data/lib/pubid/csa/identifiers/series.rb +2 -102
  172. data/lib/pubid/csa/renderer.rb +292 -0
  173. data/lib/pubid/csa/urn_generator.rb +1 -1
  174. data/lib/pubid/csa/urn_parser.rb +33 -0
  175. data/lib/pubid/csa.rb +42 -1
  176. data/lib/pubid/etsi/components/code.rb +9 -2
  177. data/lib/pubid/etsi/identifier.rb +0 -43
  178. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  179. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  180. data/lib/pubid/etsi/renderer.rb +42 -0
  181. data/lib/pubid/etsi/urn_parser.rb +34 -0
  182. data/lib/pubid/etsi.rb +42 -1
  183. data/lib/pubid/export/exporter.rb +4 -46
  184. data/lib/pubid/export/flavor_exporter.rb +111 -278
  185. data/lib/pubid/export.rb +0 -6
  186. data/lib/pubid/identifier.rb +2 -17
  187. data/lib/pubid/identifier_facade.rb +114 -0
  188. data/lib/pubid/identifier_metadata.rb +1 -1
  189. data/lib/pubid/idf/builder.rb +3 -3
  190. data/lib/pubid/idf/identifier.rb +3 -66
  191. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  192. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  193. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  194. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  195. data/lib/pubid/idf/parser.rb +3 -2
  196. data/lib/pubid/idf/renderer.rb +84 -0
  197. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  198. data/lib/pubid/idf/urn_generator.rb +4 -39
  199. data/lib/pubid/idf/urn_parser.rb +25 -0
  200. data/lib/pubid/idf.rb +51 -1
  201. data/lib/pubid/iec/builder.rb +46 -64
  202. data/lib/pubid/iec/components/code.rb +8 -32
  203. data/lib/pubid/iec/components/publisher.rb +0 -1
  204. data/lib/pubid/iec/components.rb +14 -0
  205. data/lib/pubid/iec/identifier.rb +251 -213
  206. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  207. data/lib/pubid/iec/identifiers/base.rb +8 -32
  208. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  209. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  210. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -26
  211. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  212. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -22
  213. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  214. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  215. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  216. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  217. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  218. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -11
  219. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  220. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  222. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  223. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  224. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  225. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -19
  226. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  227. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  228. data/lib/pubid/iec/identifiers.rb +30 -0
  229. data/lib/pubid/iec/parser.rb +13 -12
  230. data/lib/pubid/iec/renderer.rb +254 -0
  231. data/lib/pubid/iec/single_identifier.rb +6 -12
  232. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  233. data/lib/pubid/iec/urn_generator.rb +3 -3
  234. data/lib/pubid/iec/urn_parser.rb +3 -3
  235. data/lib/pubid/iec.rb +40 -68
  236. data/lib/pubid/ieee/builder.rb +12 -12
  237. data/lib/pubid/ieee/components/code.rb +8 -0
  238. data/lib/pubid/ieee/components/draft.rb +14 -0
  239. data/lib/pubid/ieee/components/relationship.rb +5 -149
  240. data/lib/pubid/ieee/identifier.rb +6 -41
  241. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  242. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  243. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  245. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  246. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  247. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  248. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  249. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  250. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  251. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  252. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  253. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  254. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  255. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  256. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  257. data/lib/pubid/ieee/pre_parser.rb +301 -0
  258. data/lib/pubid/ieee/renderer.rb +307 -0
  259. data/lib/pubid/ieee/urn_parser.rb +34 -0
  260. data/lib/pubid/ieee.rb +62 -1
  261. data/lib/pubid/ieee_debug.rb +0 -1
  262. data/lib/pubid/iho/builder.rb +2 -2
  263. data/lib/pubid/iho/identifier.rb +8 -42
  264. data/lib/pubid/iho/identifiers/base.rb +49 -10
  265. data/lib/pubid/iho/parser.rb +3 -3
  266. data/lib/pubid/iho/renderer.rb +30 -0
  267. data/lib/pubid/iho/urn_generator.rb +2 -2
  268. data/lib/pubid/iho/urn_parser.rb +58 -0
  269. data/lib/pubid/iho.rb +50 -1
  270. data/lib/pubid/iso/builder.rb +55 -53
  271. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  272. data/lib/pubid/iso/components/code.rb +7 -19
  273. data/lib/pubid/iso/components/publisher.rb +10 -8
  274. data/lib/pubid/iso/components.rb +2 -4
  275. data/lib/pubid/iso/identifier.rb +218 -252
  276. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  277. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  278. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  279. data/lib/pubid/iso/identifiers/data.rb +0 -1
  280. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  281. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  282. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  283. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  284. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  285. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  286. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  287. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  288. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  289. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  290. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  291. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  292. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  293. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  294. data/lib/pubid/iso/identifiers.rb +0 -1
  295. data/lib/pubid/iso/normalizer.rb +89 -0
  296. data/lib/pubid/iso/parser.rb +22 -4
  297. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  298. data/lib/pubid/iso/urn_generator.rb +66 -182
  299. data/lib/pubid/iso/urn_parser.rb +12 -7
  300. data/lib/pubid/iso.rb +173 -2
  301. data/lib/pubid/itu/builder.rb +0 -12
  302. data/lib/pubid/itu/components/code.rb +8 -0
  303. data/lib/pubid/itu/components.rb +11 -0
  304. data/lib/pubid/itu/identifier.rb +6 -104
  305. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  306. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  307. data/lib/pubid/itu/identifiers/base.rb +0 -6
  308. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  309. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  310. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  311. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  312. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  313. data/lib/pubid/itu/urn_parser.rb +23 -0
  314. data/lib/pubid/itu.rb +42 -1
  315. data/lib/pubid/jcgm/builder.rb +16 -8
  316. data/lib/pubid/jcgm/identifier.rb +0 -43
  317. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  318. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  319. data/lib/pubid/jcgm/renderer.rb +68 -0
  320. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  321. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  322. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  323. data/lib/pubid/jcgm.rb +43 -2
  324. data/lib/pubid/jis/builder.rb +44 -52
  325. data/lib/pubid/jis/identifier.rb +132 -46
  326. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  327. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  328. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  329. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  330. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  331. data/lib/pubid/jis/identifiers.rb +1 -1
  332. data/lib/pubid/jis/parser.rb +31 -5
  333. data/lib/pubid/jis/renderer.rb +69 -0
  334. data/lib/pubid/jis/single_identifier.rb +6 -12
  335. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  336. data/lib/pubid/jis/urn_parser.rb +23 -0
  337. data/lib/pubid/jis.rb +42 -2
  338. data/lib/pubid/nist/builder.rb +63 -1871
  339. data/lib/pubid/nist/caster.rb +1272 -0
  340. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  341. data/lib/pubid/nist/components/code.rb +9 -20
  342. data/lib/pubid/nist/components/supplement.rb +2 -2
  343. data/lib/pubid/nist/components.rb +0 -1
  344. data/lib/pubid/nist/identifier.rb +11 -48
  345. data/lib/pubid/nist/identifiers/base.rb +110 -47
  346. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  347. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  348. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  349. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  350. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  351. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  352. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  353. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  354. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  355. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  356. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  357. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  358. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  359. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  360. data/lib/pubid/nist/identifiers/report.rb +4 -2
  361. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  362. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  363. data/lib/pubid/nist/identifiers.rb +1 -0
  364. data/lib/pubid/nist/parser.rb +62 -452
  365. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  366. data/lib/pubid/nist/preprocessor.rb +416 -0
  367. data/lib/pubid/nist/renderer.rb +43 -0
  368. data/lib/pubid/nist/router.rb +148 -0
  369. data/lib/pubid/nist/series/base.rb +58 -0
  370. data/lib/pubid/nist/series/crpl.rb +13 -0
  371. data/lib/pubid/nist/series/fips.rb +14 -0
  372. data/lib/pubid/nist/series/ir.rb +60 -0
  373. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  374. data/lib/pubid/nist/series/mono.rb +19 -0
  375. data/lib/pubid/nist/series/ncstar.rb +20 -0
  376. data/lib/pubid/nist/series.rb +49 -0
  377. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  378. data/lib/pubid/nist/urn_parser.rb +67 -0
  379. data/lib/pubid/nist.rb +82 -4
  380. data/lib/pubid/oiml/components/code.rb +10 -0
  381. data/lib/pubid/oiml/identifier.rb +0 -50
  382. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  383. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  384. data/lib/pubid/oiml/renderer.rb +161 -0
  385. data/lib/pubid/oiml/single_identifier.rb +6 -45
  386. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  387. data/lib/pubid/oiml/urn_generator.rb +0 -8
  388. data/lib/pubid/oiml/urn_parser.rb +22 -0
  389. data/lib/pubid/oiml.rb +42 -1
  390. data/lib/pubid/plateau/identifier.rb +7 -41
  391. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  392. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  393. data/lib/pubid/plateau/renderer.rb +51 -0
  394. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  395. data/lib/pubid/plateau/urn_parser.rb +43 -0
  396. data/lib/pubid/plateau.rb +43 -1
  397. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  398. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  399. data/lib/pubid/renderers/human_readable.rb +18 -7
  400. data/lib/pubid/rendering/context.rb +28 -19
  401. data/lib/pubid/rendering.rb +0 -3
  402. data/lib/pubid/sae/components/date.rb +8 -0
  403. data/lib/pubid/sae/components/type.rb +5 -1
  404. data/lib/pubid/sae/identifier.rb +0 -23
  405. data/lib/pubid/sae/identifiers/base.rb +2 -16
  406. data/lib/pubid/sae/renderer.rb +36 -0
  407. data/lib/pubid/sae/urn_generator.rb +2 -10
  408. data/lib/pubid/sae/urn_parser.rb +36 -0
  409. data/lib/pubid/sae.rb +42 -1
  410. data/lib/pubid/urn_generator/base.rb +12 -12
  411. data/lib/pubid/urn_parser/base.rb +81 -0
  412. data/lib/pubid/urn_parser/errors.rb +9 -0
  413. data/lib/pubid/urn_parser.rb +14 -0
  414. data/lib/pubid/version.rb +1 -1
  415. data/lib/pubid.rb +29 -7
  416. data/lib/tasks/website-data.json +1940 -1882
  417. metadata +75 -44
  418. data/lib/pubid/amca/scheme.rb +0 -16
  419. data/lib/pubid/ansi/scheme.rb +0 -15
  420. data/lib/pubid/api/scheme.rb +0 -66
  421. data/lib/pubid/ashrae/scheme.rb +0 -53
  422. data/lib/pubid/asme/scheme.rb +0 -37
  423. data/lib/pubid/astm/scheme.rb +0 -55
  424. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  425. data/lib/pubid/bsi/scheme.rb +0 -243
  426. data/lib/pubid/ccsds/scheme.rb +0 -57
  427. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  428. data/lib/pubid/cie/scheme.rb +0 -64
  429. data/lib/pubid/components/factory.rb +0 -50
  430. data/lib/pubid/csa/scheme.rb +0 -44
  431. data/lib/pubid/etsi/scheme.rb +0 -42
  432. data/lib/pubid/export/data_class_exporter.rb +0 -59
  433. data/lib/pubid/export/ieee_exporter.rb +0 -78
  434. data/lib/pubid/export/itu_exporter.rb +0 -66
  435. data/lib/pubid/export/nist_exporter.rb +0 -64
  436. data/lib/pubid/export/registry_exporter.rb +0 -90
  437. data/lib/pubid/export/scheme_exporter.rb +0 -70
  438. data/lib/pubid/identifier_registry.rb +0 -198
  439. data/lib/pubid/idf/scheme.rb +0 -61
  440. data/lib/pubid/iec/scheme.rb +0 -71
  441. data/lib/pubid/ieee/scheme.rb +0 -90
  442. data/lib/pubid/iho/scheme.rb +0 -29
  443. data/lib/pubid/iso/identifiers/base.rb +0 -115
  444. data/lib/pubid/iso/scheme.rb +0 -193
  445. data/lib/pubid/itu/scheme.rb +0 -174
  446. data/lib/pubid/jcgm/scheme.rb +0 -60
  447. data/lib/pubid/jis/components/code.rb +0 -59
  448. data/lib/pubid/jis/identifiers/base.rb +0 -72
  449. data/lib/pubid/jis/scheme.rb +0 -49
  450. data/lib/pubid/nist/components/publisher.rb +0 -24
  451. data/lib/pubid/nist/scheme.rb +0 -199
  452. data/lib/pubid/oiml/scheme.rb +0 -46
  453. data/lib/pubid/plateau/scheme.rb +0 -45
  454. data/lib/pubid/rendering/base.rb +0 -73
  455. data/lib/pubid/rendering/common.rb +0 -211
  456. data/lib/pubid/rendering/format.rb +0 -25
  457. data/lib/pubid/sae/scheme.rb +0 -47
  458. data/lib/pubid/scheme.rb +0 -219
@@ -1,211 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Rendering
5
- # Common rendering methods for identifier string representation
6
- #
7
- # This module extracts duplicated rendering logic across flavors
8
- # to reduce code duplication and ensure consistency.
9
- #
10
- # == Usage
11
- #
12
- # Include this module in flavor-specific identifier base classes:
13
- #
14
- # class Base < ::Pubid::Identifier
15
- # include Pubid::Rendering::Common
16
- #
17
- # def to_s(lang: :en, lang_single: false, with_edition: false)
18
- # render_identifier(lang: lang, lang_single: lang_single, with_edition: with_edition)
19
- # end
20
- # end
21
- #
22
- module Common
23
- # Render publisher with optional copublishers
24
- #
25
- # @param publisher [Components::Publisher] publisher component
26
- # @param copublisher_separator [String] separator for copublishers (default: "/")
27
- # @return [String] formatted publisher string
28
- def render_publisher(publisher, copublisher_separator: "/")
29
- return "" unless publisher
30
-
31
- result = publisher.to_s
32
- cops = publisher.is_a?(Components::Publisher) ? publisher.copublisher : nil
33
- if cops&.any?
34
- result += cops.map do |cp|
35
- "#{copublisher_separator}#{cp}"
36
- end.join
37
- end
38
- result
39
- end
40
-
41
- # Render stage and type abbreviations with proper separators
42
- #
43
- # @param stage [Components::Stage] stage component
44
- # @param type [Components::Type] type component
45
- # @param has_copublisher [Boolean] whether identifier has copublisher
46
- # @param default_type_abbr [String] default type abbreviation to skip (default: "IS")
47
- # @param stage_separator [String] separator before stage without copublisher
48
- # @return [String] formatted stage/type string
49
- def render_stage_type(stage, type, has_copublisher: false,
50
- default_type_abbr: "IS",
51
- stage_separator: "/")
52
- result = ""
53
-
54
- # Add stage abbreviation if present
55
- if stage&.abbr
56
- sep = has_copublisher ? " " : stage_separator
57
- result += "#{sep}#{stage.abbr}"
58
- end
59
-
60
- # Add type abbreviation if present and not default
61
- if type&.abbr && type.abbr != default_type_abbr
62
- # Separator: space after stage or copublisher, slash otherwise
63
- has_prefix = stage&.abbr || has_copublisher
64
- sep = has_prefix ? " " : stage_separator
65
- result += "#{sep}#{type.abbr}"
66
- end
67
-
68
- result
69
- end
70
-
71
- # Render number with optional parts
72
- #
73
- # @param number [Components::Code] primary number component
74
- # @param part [Components::Code] optional part component
75
- # @param subpart [Components::Code] optional subpart component
76
- # @param part_separator [String] separator for parts (default: "-")
77
- # @return [String] formatted numbering string
78
- def render_numbering(number, part = nil, subpart = nil,
79
- part_separator: "-")
80
- return "" unless number&.value
81
-
82
- result = " #{number.value}"
83
- result += "#{part_separator}#{part.value}" if part&.value
84
- result += "#{part_separator}#{subpart.value}" if subpart&.value
85
- result
86
- end
87
-
88
- # Render stage iteration (e.g., ".1" for stage iteration)
89
- #
90
- # @param stage_iteration [Components::Code] stage iteration component
91
- # @return [String] formatted stage iteration or empty string
92
- def render_stage_iteration(stage_iteration)
93
- stage_iteration&.value ? ".#{stage_iteration.value}" : ""
94
- end
95
-
96
- # Render date with optional year/month/day
97
- #
98
- # @param date [Components::Date] date component
99
- # @param include_month [Boolean] include month in output
100
- # @param date_separator [String] separator for date parts (default: "-")
101
- # @return [String] formatted date string or empty string
102
- def render_date(date, include_month: false, date_separator: "-")
103
- return "" unless date&.year
104
-
105
- result = ":#{date.year}"
106
- if date.month && include_month
107
- result += "#{date_separator}#{format('%02d', date.month)}"
108
- result += "#{date_separator}#{format('%02d', date.day)}" if date.day
109
- end
110
- result
111
- end
112
-
113
- # Render language codes
114
- #
115
- # @param languages [Array<Components::Language>] language components
116
- # @param lang_single [Boolean] use single character format
117
- # @param lang_separator [String] separator between languages (default: "/")
118
- # @return [String] formatted language string or empty string
119
- def render_languages(languages, lang_single: false, lang_separator: "/")
120
- return "" unless languages&.any?
121
-
122
- formatted = languages.map do |l|
123
- l.to_s(lang_single: lang_single)
124
- end.join(lang_separator)
125
- "(#{formatted})"
126
- end
127
-
128
- # Render edition component
129
- #
130
- # @param edition [Components::Edition] edition component
131
- # @param with_prefix [Boolean] include prefix (default: true)
132
- # @return [String] formatted edition string or empty string
133
- def render_edition(edition, with_prefix: true)
134
- return "" unless edition
135
-
136
- if with_prefix
137
- edition.to_s
138
- else
139
- " #{edition}"
140
- end
141
- end
142
-
143
- # Check if publisher has copublishers
144
- #
145
- # @param publisher [Components::Publisher] publisher component
146
- # @return [Boolean] true if has copublishers
147
- def publisher_has_copublisher?(publisher)
148
- publisher.is_a?(Components::Publisher) && publisher.has_copublisher?
149
- end
150
-
151
- # Get publisher body/name
152
- #
153
- # @param publisher [Components::Publisher] publisher component
154
- # @return [String] publisher body
155
- def publisher_body(publisher)
156
- publisher.is_a?(Components::Publisher) ? publisher.body : publisher.to_s
157
- end
158
-
159
- # Get copublishers as array
160
- #
161
- # @param publisher [Components::Publisher] publisher component
162
- # @return [Array<String>] array of copublisher names
163
- def copublishers_list(publisher)
164
- return [] unless publisher.is_a?(Components::Publisher) && publisher.copublisher&.any?
165
-
166
- publisher.copublisher.map { |cp| publisher_body(cp) }
167
- end
168
-
169
- # Render full identifier with all components
170
- #
171
- # This is a convenience method that combines all rendering methods
172
- # in the standard order for most identifier types.
173
- #
174
- # @param publisher [Components::Publisher] publisher component
175
- # @param stage [Components::Stage] stage component
176
- # @param type [Components::Type] type component
177
- # @param number [Components::Code] number component
178
- # @param part [Components::Code] part component
179
- # @param subpart [Components::Code] subpart component
180
- # @param stage_iteration [Components::Code] stage iteration component
181
- # @param date [Components::Date] date component
182
- # @param edition [Components::Edition] edition component
183
- # @param languages [Array<Components::Language>] language components
184
- # @param lang [Symbol] language for rendering (:en or :fr)
185
- # @param lang_single [Boolean] use single char language format
186
- # @param with_edition [Boolean] include edition in output
187
- # @param default_type_abbr [String] default type abbreviation to skip
188
- # @return [String] formatted identifier string
189
- def render_full_identifier(publisher:, stage: nil, type: nil,
190
- number: nil, part: nil, subpart: nil,
191
- stage_iteration: nil, date: nil,
192
- edition: nil, languages: nil,
193
- lang: :en, lang_single: false,
194
- with_edition: false,
195
- default_type_abbr: "IS")
196
- result = render_publisher(publisher)
197
- result += render_stage_type(stage, type,
198
- has_copublisher: publisher_has_copublisher?(
199
- publisher,
200
- ),
201
- default_type_abbr: default_type_abbr)
202
- result += render_numbering(number, part, subpart)
203
- result += render_stage_iteration(stage_iteration) if stage_iteration
204
- result += render_date(date)
205
- result += render_edition(edition) if with_edition && edition
206
- result += render_languages(languages, lang_single: lang_single)
207
- result
208
- end
209
- end
210
- end
211
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Rendering
5
- module Format
6
- # Dispatch to appropriate format renderer
7
- # @param format [Symbol] target format
8
- # @return [String] formatted identifier string
9
- def to_s(format = nil)
10
- effective_format = determine_format(format)
11
- send(:"to_#{effective_format}_style")
12
- end
13
-
14
- private
15
-
16
- def determine_format(format)
17
- return :short unless format
18
- return :mr if format.to_sym == :mr
19
- return :full if %i[full long].include?(format.to_sym)
20
-
21
- :short
22
- end
23
- end
24
- end
25
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Sae
5
- class Scheme < Pubid::Scheme
6
- class << self
7
- def identifiers
8
- [
9
- Identifiers::Base,
10
- ]
11
- end
12
-
13
- def typed_stages
14
- identifiers.flat_map { |klass| klass::TYPED_STAGES }
15
- end
16
-
17
- def locate_typed_stage_by_abbr(abbr)
18
- abbr = "SAE" if abbr.nil? || abbr.to_s.empty?
19
-
20
- typed_stage = typed_stages.detect do |ts|
21
- ts.abbr.include?(abbr)
22
- end
23
-
24
- unless typed_stage
25
- raise ArgumentError,
26
- "Unknown type abbreviation: '#{abbr}'"
27
- end
28
-
29
- typed_stage
30
- end
31
-
32
- def locate_identifier_klass_by_type_code(type_code)
33
- identifier_klass = identifiers.detect do |klass|
34
- klass.type[:key].to_s == type_code.to_s
35
- end
36
-
37
- unless identifier_klass
38
- raise ArgumentError,
39
- "Unknown type code: #{type_code}"
40
- end
41
-
42
- identifier_klass
43
- end
44
- end
45
- end
46
- end
47
- end
data/lib/pubid/scheme.rb DELETED
@@ -1,219 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- # Base Scheme class defining the standard interface for all flavor schemes.
5
- #
6
- # The Scheme acts as a registry for identifier types and their associated
7
- # typed stages. Each flavor (ISO, IEC, IEEE, etc.) should have a Scheme that
8
- # implements this interface.
9
- #
10
- # == Standard Interface
11
- #
12
- # All Scheme implementations must provide these methods:
13
- #
14
- # - locate_typed_stage_by_abbr(abbr) -> Find a TypedStage by abbreviation
15
- # - locate_identifier_klass_by_type_code(type_code) -> Find an identifier class
16
- # - typed_stages -> Get all typed stages for base identifiers
17
- # - supplement_typed_stages -> Get typed stages for supplements
18
- # - all_typed_stages -> Get all typed stages combined
19
- # - identifiers -> Get all base identifier classes
20
- # - supplement_identifiers -> Get all supplement identifier classes
21
- # - all_identifier_classes -> Get all identifier classes combined
22
- #
23
- # == Implementation Patterns
24
- #
25
- # There are several valid patterns for implementing a Scheme:
26
- #
27
- # 1. Class-based (ISO, IEEE, JCGM, JIS, CCSDS, ASHRAE):
28
- # Use class << self with class methods
29
- #
30
- # 2. Instance-based with constants (BSI, CEN):
31
- # Use TYPED_STAGES_REGISTRY and instance methods
32
- #
33
- # 3. Transform-based (ITU):
34
- # Use model_class and transform methods (no typed stages)
35
- #
36
- # 4. Data class (ETSI, Plateau):
37
- # Use Lutaml::Model::Serializable as a data model
38
- #
39
- # 5. Inheritance-based (AMCA):
40
- # Inherit from Pubid::Scheme base class
41
- #
42
- # == Performance
43
- #
44
- # All registry lookups are memoized for performance. Callers can rely on
45
- # repeated calls being O(1) after the first call.
46
- #
47
- class Scheme
48
- # Registry of identifiers for this scheme
49
- attr_accessor :identifiers,
50
- :stages,
51
- :types,
52
- :languages,
53
- :publishers,
54
- :supplement_identifiers
55
-
56
- def initialize(
57
- identifiers: [], stages: [], types: [], languages: [], publishers: [],
58
- supplement_identifiers: []
59
- )
60
- @identifiers = identifiers
61
- @supplement_identifiers = supplement_identifiers
62
- @stages = stages
63
- @types = types
64
- @languages = languages
65
- @publishers = publishers
66
- end
67
-
68
- def configure
69
- yield self if block_given?
70
- end
71
-
72
- # Get all typed stages for base identifiers
73
- # @return [Array<TypedStage>] All typed stages from identifiers
74
- # @note Memoized for performance
75
- def typed_stages
76
- return @typed_stages if defined?(@typed_stages)
77
-
78
- @typed_stages = @identifiers.filter_map do |identifier_class|
79
- identifier_class.const_defined?(:TYPED_STAGES) ? identifier_class.const_get(:TYPED_STAGES) : nil
80
- end.flatten
81
- end
82
-
83
- # Get all typed stages for supplement identifiers
84
- # @return [Array<TypedStage>] All typed stages from supplement identifiers
85
- # @note Memoized for performance
86
- def supplement_typed_stages
87
- return @supplement_typed_stages if defined?(@supplement_typed_stages)
88
-
89
- @supplement_typed_stages = @supplement_identifiers.filter_map do |identifier_class|
90
- identifier_class.const_defined?(:TYPED_STAGES) ? identifier_class.const_get(:TYPED_STAGES) : nil
91
- end.flatten
92
- end
93
-
94
- # Get all typed stages (base + supplements), sorted by abbreviation
95
- # @return [Array<TypedStage>] All typed stages sorted by abbreviation
96
- # @note Memoized for performance
97
- def all_typed_stages
98
- return @all_typed_stages if defined?(@all_typed_stages)
99
-
100
- @all_typed_stages = (typed_stages + supplement_typed_stages).sort_by do |ts|
101
- (ts.abbr.first || "").to_s
102
- end.reverse
103
- end
104
-
105
- # Locate a TypedStage by abbreviation
106
- # @param abbr [String, Symbol] The abbreviation to find
107
- # @return [TypedStage, nil] The matching TypedStage, or nil if not found
108
- # @note Uses hash-based index for O(1) lookup, falls back to linear search
109
- def locate_typed_stage_by_abbr(abbr)
110
- abbr = "" if abbr.nil? || abbr.to_s.strip.empty?
111
-
112
- # Try hash-based index first (O(1))
113
- typed_stage = typed_stage_index[abbr]
114
-
115
- # Fall back to linear search if not found (for abbreviations with
116
- # special formatting or edge cases)
117
- typed_stage || all_typed_stages.detect do |ts|
118
- ts.abbr.include?(abbr)
119
- end
120
- end
121
-
122
- # Locate a TypedStage by stage code
123
- # @param stage_code [String, Symbol] The stage code to find
124
- # @return [TypedStage, nil] The matching TypedStage, or nil if not found
125
- # @note Uses linear search for stage code lookup
126
- def locate_typed_stage_by_stage_code(stage_code)
127
- stage_code_sym = stage_code.to_sym
128
-
129
- all_typed_stages.detect do |ts|
130
- ts.stage_code.to_sym == stage_code_sym
131
- end
132
- end
133
-
134
- # Locate a TypedStage by its unique per-typed-stage code
135
- # @param code [String, Symbol] The code to find (e.g. :dtr, :fdisp)
136
- # @return [TypedStage, nil] The matching TypedStage, or nil if not found
137
- # @note Uses linear search for code lookup
138
- def locate_typed_stage_by_code(code)
139
- code_sym = code.to_sym
140
-
141
- all_typed_stages.detect do |ts|
142
- ts.code&.to_sym == code_sym
143
- end
144
- end
145
-
146
- # Locate a TypedStage by harmonized stage code
147
- # @param harmonized_code [String] The harmonized stage code to find (e.g., "00.00", "10.00")
148
- # @return [TypedStage, nil] The matching TypedStage, or nil if not found
149
- # @note Uses linear search to check harmonized_stages arrays
150
- def locate_typed_stage_by_harmonized_code(harmonized_code)
151
- harmonized_str = harmonized_code.to_s
152
-
153
- all_typed_stages.detect do |ts|
154
- ts.harmonized_stages&.include?(harmonized_str)
155
- end
156
- end
157
-
158
- # Hash-based index of typed stages by abbreviation
159
- # @return [Hash<String, TypedStage>] index mapping abbreviations to typed stages
160
- # @note Memoized for O(1) lookup performance
161
- def typed_stage_index
162
- @typed_stage_index ||= build_typed_stage_index
163
- end
164
-
165
- # Get all identifier classes sorted by type key
166
- # @return [Array<Class>] All identifier classes sorted by type key
167
- # @note Memoized for performance
168
- def all_identifier_classes
169
- return @all_identifier_classes if defined?(@all_identifier_classes)
170
-
171
- @all_identifier_classes = (@identifiers + @supplement_identifiers).sort_by do |klass|
172
- (klass.type&.dig(:key) || "").to_s
173
- end
174
- end
175
- alias all_identifier_classes_by_type_code all_identifier_classes
176
-
177
- # Locate an identifier class by type code
178
- # @param type_code [String, Symbol] The type code to find
179
- # @return [Class, nil] The matching identifier class, or nil if not found
180
- # @note Uses hash-based index for O(1) lookup, falls back to linear search
181
- def locate_identifier_klass_by_type_code(type_code)
182
- type_str = type_code.to_s
183
-
184
- # Try hash-based index first (O(1))
185
- identifier_klass = identifier_class_index[type_str]
186
-
187
- # Fall back to linear search if not found
188
- identifier_klass || all_identifier_classes.detect do |identifier_class|
189
- identifier_class.type&.dig(:key)&.to_s == type_str
190
- end
191
- end
192
-
193
- # Hash-based index of identifier classes by type code
194
- # @return [Hash<String, Class>] index mapping type codes to identifier classes
195
- # @note Memoized for O(1) lookup performance
196
- def identifier_class_index
197
- @identifier_class_index ||= build_identifier_class_index
198
- end
199
-
200
- protected
201
-
202
- # Build hash-based index of typed stages by abbreviation
203
- # @return [Hash<String, TypedStage>] index mapping abbreviations to typed stages
204
- def build_typed_stage_index
205
- all_typed_stages.each_with_object({}) do |ts, index|
206
- ts.abbr.each { |abbr| index[abbr] = ts }
207
- end
208
- end
209
-
210
- # Build hash-based index of identifier classes by type code
211
- # @return [Hash<String, Class>] index mapping type codes to identifier classes
212
- def build_identifier_class_index
213
- all_identifier_classes.each_with_object({}) do |klass, index|
214
- type_key = klass.type&.dig(:key)&.to_s
215
- index[type_key] = klass if type_key
216
- end
217
- end
218
- end
219
- end