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,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,207 +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 harmonized stage code
135
- # @param harmonized_code [String] The harmonized stage code to find (e.g., "00.00", "10.00")
136
- # @return [TypedStage, nil] The matching TypedStage, or nil if not found
137
- # @note Uses linear search to check harmonized_stages arrays
138
- def locate_typed_stage_by_harmonized_code(harmonized_code)
139
- harmonized_str = harmonized_code.to_s
140
-
141
- all_typed_stages.detect do |ts|
142
- ts.harmonized_stages&.include?(harmonized_str)
143
- end
144
- end
145
-
146
- # Hash-based index of typed stages by abbreviation
147
- # @return [Hash<String, TypedStage>] index mapping abbreviations to typed stages
148
- # @note Memoized for O(1) lookup performance
149
- def typed_stage_index
150
- @typed_stage_index ||= build_typed_stage_index
151
- end
152
-
153
- # Get all identifier classes sorted by type key
154
- # @return [Array<Class>] All identifier classes sorted by type key
155
- # @note Memoized for performance
156
- def all_identifier_classes
157
- return @all_identifier_classes if defined?(@all_identifier_classes)
158
-
159
- @all_identifier_classes = (@identifiers + @supplement_identifiers).sort_by do |klass|
160
- (klass.type&.dig(:key) || "").to_s
161
- end
162
- end
163
- alias all_identifier_classes_by_type_code all_identifier_classes
164
-
165
- # Locate an identifier class by type code
166
- # @param type_code [String, Symbol] The type code to find
167
- # @return [Class, nil] The matching identifier class, or nil if not found
168
- # @note Uses hash-based index for O(1) lookup, falls back to linear search
169
- def locate_identifier_klass_by_type_code(type_code)
170
- type_str = type_code.to_s
171
-
172
- # Try hash-based index first (O(1))
173
- identifier_klass = identifier_class_index[type_str]
174
-
175
- # Fall back to linear search if not found
176
- identifier_klass || all_identifier_classes.detect do |identifier_class|
177
- identifier_class.type&.dig(:key)&.to_s == type_str
178
- end
179
- end
180
-
181
- # Hash-based index of identifier classes by type code
182
- # @return [Hash<String, Class>] index mapping type codes to identifier classes
183
- # @note Memoized for O(1) lookup performance
184
- def identifier_class_index
185
- @identifier_class_index ||= build_identifier_class_index
186
- end
187
-
188
- protected
189
-
190
- # Build hash-based index of typed stages by abbreviation
191
- # @return [Hash<String, TypedStage>] index mapping abbreviations to typed stages
192
- def build_typed_stage_index
193
- all_typed_stages.each_with_object({}) do |ts, index|
194
- ts.abbr.each { |abbr| index[abbr] = ts }
195
- end
196
- end
197
-
198
- # Build hash-based index of identifier classes by type code
199
- # @return [Hash<String, Class>] index mapping type codes to identifier classes
200
- def build_identifier_class_index
201
- all_identifier_classes.each_with_object({}) do |klass, index|
202
- type_key = klass.type&.dig(:key)&.to_s
203
- index[type_key] = klass if type_key
204
- end
205
- end
206
- end
207
- end