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,78 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "set"
4
-
5
- module Pubid
6
- module Export
7
- # Strategy for IEEE, which has identifier classes in the Identifiers module
8
- # without a Scheme.identifiers method.
9
- class IeeeExporter < FlavorExporter
10
- def export
11
- klasses = resolve_ieee_identifiers
12
- return nil if klasses.empty?
13
-
14
- fixture_data = fixture_examples
15
- seen_keys = Set.new
16
-
17
- identifier_types = klasses.filter_map do |klass|
18
- info = extract_type_info(klass)
19
- next if seen_keys.include?(info[:key])
20
-
21
- seen_keys << info[:key]
22
-
23
- type_key = info[:key]
24
- examples = match_ieee_examples(fixture_data, type_key, klass)
25
-
26
- IdentifierTypeResult.new(
27
- key: info[:key],
28
- title: info[:title],
29
- short: info[:short],
30
- abbr: info[:abbr],
31
- typed_stages: [],
32
- examples: examples,
33
- )
34
- end
35
-
36
- FlavorResult.new(
37
- flavor: flavor,
38
- identifier_types: identifier_types,
39
- attributes: [],
40
- )
41
- end
42
-
43
- private
44
-
45
- def resolve_ieee_identifiers
46
- identifiers_mod = scheme_module::Identifiers
47
- skip = %w[Base Supplement]
48
- klasses = []
49
- collect_classes(identifiers_mod, skip, klasses)
50
- klasses
51
- end
52
-
53
- def collect_classes(mod, skip, result)
54
- mod.constants.each do |c|
55
- const = begin; mod.const_get(c); rescue NameError; next; end
56
- if const.is_a?(Module) && !const.is_a?(Class)
57
- collect_classes(const, skip, result)
58
- elsif const.is_a?(Class)
59
- next if skip.include?(const.name&.split("::")&.last)
60
-
61
- result << const
62
- end
63
- end
64
- end
65
-
66
- def match_ieee_examples(fixture_data, type_key, klass)
67
- # Try direct key match
68
- examples = fixture_data[type_key] || fixture_data[type_key.to_s] || []
69
- return examples if examples.any?
70
-
71
- # Try class name match
72
- class_name = klass.name&.split("::")&.last
73
- snake_name = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/, "")
74
- fixture_data[snake_name] || []
75
- end
76
- end
77
- end
78
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Export
5
- # Strategy for ITU, which uses a transform/model pattern without
6
- # traditional identifier classes or TYPED_STAGES.
7
- class ItuExporter < FlavorExporter
8
- WEBSITE_KEY_OVERRIDES = {
9
- "special_publication" => "special_publication",
10
- }.freeze
11
-
12
- def export
13
- klasses = resolve_itu_identifiers
14
- return nil if klasses.empty?
15
-
16
- fixture_data = fixture_examples
17
-
18
- identifier_types = klasses.map do |klass|
19
- info = extract_type_info(klass)
20
- type_key = info[:key]
21
- examples = fixture_data[type_key] || fixture_data[type_key.to_s] || []
22
-
23
- IdentifierTypeResult.new(
24
- key: info[:key],
25
- title: info[:title],
26
- short: info[:short],
27
- abbr: info[:abbr],
28
- typed_stages: [],
29
- examples: examples,
30
- )
31
- end
32
-
33
- FlavorResult.new(
34
- flavor: flavor,
35
- identifier_types: identifier_types,
36
- attributes: extract_attribute_names,
37
- )
38
- end
39
-
40
- private
41
-
42
- def resolve_itu_identifiers
43
- identifiers_mod = scheme_module::Identifiers
44
- skip = %w[Base]
45
- identifiers_mod.constants.filter_map do |c|
46
- klass = begin
47
- identifiers_mod.const_get(c); rescue NameError; next
48
- end
49
- next unless klass.is_a?(Class)
50
- next if skip.include?(klass.name&.split("::")&.last)
51
-
52
- klass
53
- end
54
- end
55
-
56
- def extract_attribute_names
57
- model = scheme_module::Identifier
58
- return [] unless model&.methods&.include?(:model_attributes)
59
-
60
- model.model_attributes.keys.map(&:to_s)
61
- rescue NoMethodError, NameError
62
- []
63
- end
64
- end
65
- end
66
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Export
5
- # Strategy for NIST, which has a unique identifier architecture:
6
- # per-class typed_stages class method (not TYPED_STAGES constant),
7
- # and a Scheme.identifiers class method.
8
- class NistExporter < FlavorExporter
9
- def export
10
- scheme = scheme_class
11
- return nil unless scheme
12
-
13
- klasses = scheme.identifiers.reject { |k| k == scheme_module::Identifiers::Base }
14
- fixture_data = fixture_examples
15
-
16
- seen_keys = Set.new
17
- identifier_types = klasses.filter_map do |klass|
18
- info = extract_type_info(klass)
19
- type_key = info[:key]
20
- next if seen_keys.include?(type_key)
21
-
22
- seen_keys << type_key
23
-
24
- examples = match_nist_examples(fixture_data, type_key, klass)
25
- stages = klass.typed_stages
26
-
27
- IdentifierTypeResult.new(
28
- key: info[:key],
29
- title: info[:title],
30
- short: info[:short],
31
- abbr: stages.flat_map(&:abbr),
32
- typed_stages: stages,
33
- examples: examples,
34
- )
35
- end
36
-
37
- FlavorResult.new(
38
- flavor: flavor,
39
- identifier_types: identifier_types,
40
- attributes: klasses.first ? extract_attributes(klasses.first) : [],
41
- )
42
- end
43
-
44
- private
45
-
46
- def match_nist_examples(fixture_data, type_key, klass)
47
- return [] unless type_key
48
-
49
- # NIST fixtures use series codes like "nist_sp", "nist_ir", etc.
50
- key_str = type_key.to_s
51
- examples = fixture_data["nist_#{key_str}"] ||
52
- fixture_data[key_str.to_s] ||
53
- []
54
-
55
- return examples if examples.any?
56
-
57
- # Try class name match
58
- class_name = klass.name&.split("::")&.last
59
- snake_name = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/, "")
60
- fixture_data[snake_name] || []
61
- end
62
- end
63
- end
64
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "set"
4
-
5
- module Pubid
6
- module Export
7
- # Strategy for flavors using TYPED_STAGES_REGISTRY on the Scheme class
8
- # (BSI, CEN). These don't use per-class TYPED_STAGES but instead have
9
- # a centralized registry mapping type_code → typed stages.
10
- class RegistryExporter < FlavorExporter
11
- def export
12
- registry = extract_registry
13
- return nil if registry.empty?
14
-
15
- known_website_keys = Set.new
16
-
17
- identifier_types = registry.group_by(&:type_code).map do |type_code, stages|
18
- wkey = resolve_website_key(type_code).to_s
19
- known_website_keys << wkey
20
- primary = stages.first
21
- IdentifierTypeResult.new(
22
- key: wkey,
23
- title: primary.name,
24
- short: nil,
25
- abbr: primary.abbr,
26
- typed_stages: stages,
27
- examples: [],
28
- )
29
- end
30
-
31
- # Supplement with typed classes not in the registry
32
- additional = discover_additional_from_identifiers(known_website_keys)
33
- identifier_types.concat(additional)
34
-
35
- FlavorResult.new(
36
- flavor: flavor,
37
- identifier_types: identifier_types,
38
- wrapper_types: extract_wrapper_types,
39
- attributes: [],
40
- )
41
- end
42
-
43
- private
44
-
45
- def extract_registry
46
- scheme = scheme_class
47
- return [] unless scheme
48
-
49
- if scheme.const_defined?(:TYPED_STAGES_REGISTRY)
50
- scheme.const_get(:TYPED_STAGES_REGISTRY)
51
- else
52
- []
53
- end
54
- end
55
-
56
- def discover_additional_from_identifiers(known_keys)
57
- mod = scheme_module
58
- return [] unless mod
59
-
60
- idents_mod = mod.const_get(:Identifiers)
61
- skip = %w[Base]
62
-
63
- idents_mod.constants.filter_map do |c|
64
- klass = idents_mod.const_get(c)
65
- rescue NameError
66
- next
67
- else
68
- next unless klass.is_a?(Class)
69
- next if skip.include?(klass.name&.split("::")&.last)
70
-
71
- info = extract_type_info(klass)
72
- next unless info[:key]
73
-
74
- website_key = info[:key].to_s
75
- next if known_keys.include?(website_key)
76
-
77
- known_keys << website_key
78
- IdentifierTypeResult.new(
79
- key: website_key,
80
- title: info[:title],
81
- short: info[:short],
82
- abbr: [],
83
- typed_stages: [],
84
- examples: [],
85
- )
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Export
5
- # Strategy for flavors using Scheme with class-level identifiers method
6
- # and def self.type / TYPED_STAGES patterns.
7
- #
8
- # Covers: ISO, IEC, ASTM, ASHRAE, ASME, CCSDS, CIE, CSA, JIS, JCGM,
9
- # OIML, IDF, API, SAE, NIST, IEEE
10
- class SchemeExporter < FlavorExporter
11
- def export
12
- klasses = identifier_classes
13
- return nil if klasses.empty?
14
-
15
- fixture_data = fixture_examples
16
-
17
- identifier_types = klasses.filter_map do |klass|
18
- info = extract_type_info(klass)
19
- stages = extract_typed_stages(klass)
20
- type_key = info[:key]&.to_s
21
-
22
- # Match fixture examples to this type
23
- examples = match_examples(fixture_data, type_key, klass)
24
-
25
- IdentifierTypeResult.new(
26
- key: info[:key],
27
- title: info[:title],
28
- short: info[:short],
29
- abbr: info[:abbr],
30
- typed_stages: stages,
31
- examples: examples,
32
- )
33
- end
34
-
35
- all_attrs = klasses.first ? extract_attributes(klasses.first) : []
36
- wrapper_types = extract_wrapper_types
37
-
38
- FlavorResult.new(
39
- flavor: flavor,
40
- identifier_types: identifier_types,
41
- wrapper_types: wrapper_types,
42
- attributes: all_attrs,
43
- )
44
- end
45
-
46
- private
47
-
48
- def match_examples(fixture_data, type_key, klass)
49
- return [] unless type_key
50
-
51
- # Try direct type key match first
52
- examples = fixture_data[map_fixture_key_to_type_key(type_key)] ||
53
- fixture_data[map_fixture_key_to_type_key(type_key.gsub("_",
54
- ""))] ||
55
- []
56
-
57
- return examples if examples.any?
58
-
59
- # Try class name match
60
- class_name = klass.name&.split("::")&.last
61
- snake_name = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/, "")
62
- if snake_name && fixture_data.key?(snake_name)
63
- fixture_data[snake_name]
64
- else
65
- []
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,198 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "identifier_metadata"
4
-
5
- module Pubid
6
- # Global registry of all identifier types across all flavors
7
- # Provides searchable index for machine-readable lookups
8
- class IdentifierRegistry
9
- class << self
10
- # Register an identifier class with its metadata
11
- # @param identifier_class [Class] The identifier class
12
- # @param metadata [Hash] Metadata attributes
13
- def register(identifier_class, **metadata)
14
- # Extract class name from full class name
15
- identifier_class_name = identifier_class.name.to_s.split("::")&.last
16
-
17
- all_identifiers[identifier_class] = IdentifierMetadata::Metadata.new(
18
- flavor: metadata.fetch(:flavor),
19
- identifier_class: identifier_class_name,
20
- **metadata,
21
- )
22
-
23
- # Index by various keys for fast lookup
24
- index_by_flavor(metadata[:flavor], identifier_class)
25
- if metadata[:type_key]
26
- index_by_type_key(metadata[:type_key],
27
- identifier_class)
28
- end
29
- index_by_abbr(metadata[:abbr], identifier_class) if metadata[:abbr]
30
-
31
- identifier_class
32
- end
33
-
34
- # Find identifier class by flavor and type key
35
- # @param flavor [String, Symbol] The flavor
36
- # @param type_key [String, Symbol] The type key
37
- # @return [Class, nil]
38
- def find_by_type(flavor, type_key)
39
- flavor_index[flavor.to_s]&.dig(type_key.to_s)
40
- end
41
-
42
- # Find identifier class by abbreviation
43
- # @param flavor [String, Symbol] The flavor
44
- # @param abbr [String] The abbreviation
45
- # @return [Array<Class>] All matching classes
46
- def find_by_abbr(flavor, abbr)
47
- abbr_index[flavor.to_s]&.dig(abbr.to_s.downcase) || []
48
- end
49
-
50
- # Get all identifiers for a flavor
51
- # @param flavor [String, Symbol] The flavor
52
- # @return [Array<Class>]
53
- def all_for_flavor(flavor)
54
- flavor_index[flavor.to_s]&.values || []
55
- end
56
-
57
- # Get all registered identifiers
58
- # @return [Hash<Class, Metadata>]
59
- def all_identifiers
60
- @all_identifiers ||= {}
61
- end
62
-
63
- # Get metadata for an identifier class
64
- # @param identifier_class [Class] The identifier class
65
- # @return [Metadata, nil]
66
- def metadata_for(identifier_class)
67
- all_identifiers[identifier_class]
68
- end
69
-
70
- # Search identifiers by criteria
71
- # @param criteria [Hash] Search criteria
72
- # @option criteria [String, Symbol] :flavor Filter by flavor
73
- # @option criteria [String, Symbol] :type_key Filter by type key
74
- # @option criteria [String] :abbr Filter by abbreviation
75
- # @option criteria [String] :title Filter by title (partial match)
76
- # @option criteria [Boolean] :base_class Filter by base class status
77
- # @option criteria [Boolean] :supplement_class Filter by supplement class status
78
- # @return [Array<Hash>] Array of {class: Class, metadata: Metadata}
79
- def search(**criteria)
80
- results = []
81
-
82
- all_identifiers.each do |klass, metadata|
83
- matches = true
84
-
85
- if criteria[:flavor]
86
- matches &= metadata.flavor.to_s == criteria[:flavor].to_s
87
- end
88
-
89
- if criteria[:type_key]
90
- matches &= metadata.type_key.to_s == criteria[:type_key].to_s
91
- end
92
-
93
- if criteria[:abbr]
94
- matches &= metadata.abbr.map(&:to_s).map(&:downcase).include?(criteria[:abbr].to_s.downcase)
95
- end
96
-
97
- if criteria[:title]
98
- matches &= metadata.title.to_s.downcase.include?(criteria[:title].to_s.downcase)
99
- end
100
-
101
- if criteria[:base_class]
102
- matches &= !metadata.base_class.nil? == criteria[:base_class]
103
- end
104
-
105
- if criteria[:supplement_class]
106
- matches &= !metadata.supplement_class.nil? == criteria[:supplement_class]
107
- end
108
-
109
- results << { class: klass, metadata: metadata } if matches
110
- end
111
-
112
- results
113
- end
114
-
115
- # Export registry to machine-readable format (JSON)
116
- # @return [String] JSON representation
117
- def to_json(*args)
118
- all_identifiers.values.map(&:to_hash).to_json(*args)
119
- end
120
-
121
- # Export registry to machine-readable format (YAML)
122
- # @return [String] YAML representation
123
- def to_yaml
124
- require "json"
125
- hash = all_identifiers.values.map(&:to_h)
126
- # Convert to YAML format (basic implementation)
127
- hash.map(&:to_json).join("\n")
128
- end
129
-
130
- # Clear all registrations (useful for testing)
131
- def clear!
132
- @all_identifiers = {}
133
- @flavor_index = nil
134
- @type_key_index = nil
135
- @abbr_index = nil
136
- end
137
-
138
- # Generate a summary report
139
- # @return [String] Human-readable summary
140
- def summary
141
- flavors = all_identifiers.values.map(&:flavor).uniq.sort
142
- total = all_identifiers.size
143
-
144
- summary = "Identifier Registry Summary\n"
145
- summary += "#{'=' * 50}\n"
146
- summary += "Total identifiers: #{total}\n"
147
- summary += "Flavors: #{flavors.join(', ')}\n\n"
148
-
149
- flavors.each do |flavor|
150
- flavor_ids = all_identifiers.values.select do |m|
151
- m.flavor.to_s == flavor
152
- end
153
- summary += "#{flavor.upcase} (#{flavor_ids.size}):\n"
154
- flavor_ids.sort_by(&:type_key).each do |metadata|
155
- summary += " - #{metadata.type_key}: #{metadata.title}\n"
156
- end
157
- end
158
-
159
- summary
160
- end
161
-
162
- private
163
-
164
- def flavor_index
165
- @flavor_index ||= Hash.new { |h, k| h[k] = {} }
166
- end
167
-
168
- def type_key_index
169
- @type_key_index ||= Hash.new { |h, k| h[k] = {} }
170
- end
171
-
172
- def abbr_index
173
- @abbr_index ||= Hash.new do |h, k|
174
- h[k] = Hash.new do |h2, k2|
175
- h2[k2] = []
176
- end
177
- end
178
- end
179
-
180
- def index_by_flavor(flavor, identifier_class)
181
- flavor_index[flavor.to_s][:_all] ||= []
182
- flavor_index[flavor.to_s][:_all] << identifier_class
183
- end
184
-
185
- def index_by_type_key(type_key, identifier_class)
186
- flavor = all_identifiers[identifier_class].flavor
187
- flavor_index[flavor.to_s][type_key.to_s] = identifier_class
188
- end
189
-
190
- def index_by_abbr(abbr, identifier_class)
191
- flavor = all_identifiers[identifier_class].flavor
192
- Array(abbr).each do |a|
193
- abbr_index[flavor.to_s][a.to_s.downcase] << identifier_class
194
- end
195
- end
196
- end
197
- end
198
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Idf
5
- class Scheme < Pubid::Scheme
6
- class << self
7
- def identifiers
8
- @identifiers ||= [
9
- Identifiers::InternationalStandard,
10
- Identifiers::ReviewedMethod,
11
- ].freeze
12
- end
13
-
14
- def supplement_identifiers
15
- @supplement_identifiers ||= [
16
- Identifiers::Amendment,
17
- Identifiers::Corrigendum,
18
- ].freeze
19
- end
20
-
21
- def typed_stages
22
- @typed_stages ||= identifiers.flat_map { |klass| klass::TYPED_STAGES }
23
- end
24
-
25
- def supplement_typed_stages
26
- @supplement_typed_stages ||= supplement_identifiers.flat_map do |klass|
27
- klass::TYPED_STAGES
28
- end
29
- end
30
-
31
- def locate_typed_stage_by_abbr(abbr)
32
- abbr = "" if abbr.nil?
33
-
34
- typed_stage = (typed_stages + supplement_typed_stages).detect do |ts|
35
- ts.abbr.include?(abbr)
36
- end
37
-
38
- unless typed_stage
39
- raise ArgumentError,
40
- "Unknown type abbreviation: '#{abbr}'"
41
- end
42
-
43
- typed_stage
44
- end
45
-
46
- def locate_identifier_klass_by_type_code(type_code)
47
- identifier_klass = (identifiers + supplement_identifiers).detect do |klass|
48
- klass.type[:key].to_s == type_code.to_s
49
- end
50
-
51
- unless identifier_klass
52
- raise ArgumentError,
53
- "Unknown type code: #{type_code}"
54
- end
55
-
56
- identifier_klass
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,71 +0,0 @@
1
- require_relative "identifiers/international_standard"
2
- # frozen_string_literal: true
3
- require_relative "identifiers/technical_specification"
4
- require_relative "identifiers/technical_report"
5
- require_relative "identifiers/publicly_available_specification"
6
- require_relative "identifiers/guide"
7
- require_relative "identifiers/amendment"
8
- require_relative "identifiers/corrigendum"
9
- require_relative "identifiers/fragment_identifier"
10
-
11
- module Pubid
12
- module Iec
13
- class Scheme < Pubid::Scheme
14
- class << self
15
- def identifiers
16
- [
17
- Identifiers::InternationalStandard,
18
- Identifiers::TechnicalSpecification,
19
- Identifiers::TechnicalReport,
20
- Identifiers::PubliclyAvailableSpecification,
21
- Identifiers::Guide,
22
- ]
23
- end
24
-
25
- def supplement_identifiers
26
- [
27
- Identifiers::Amendment,
28
- Identifiers::Corrigendum,
29
- Identifiers::FragmentIdentifier,
30
- ]
31
- end
32
-
33
- def typed_stages
34
- identifiers.flat_map { |klass| klass::TYPED_STAGES }
35
- end
36
-
37
- def supplement_typed_stages
38
- supplement_identifiers.flat_map { |klass| klass::TYPED_STAGES }
39
- end
40
-
41
- def locate_typed_stage_by_abbr(abbr)
42
- abbr = "" if abbr.nil?
43
-
44
- typed_stage = (typed_stages + supplement_typed_stages).detect do |ts|
45
- ts.abbr.include?(abbr)
46
- end
47
-
48
- unless typed_stage
49
- raise ArgumentError,
50
- "Unknown type abbreviation: '#{abbr}'"
51
- end
52
-
53
- typed_stage
54
- end
55
-
56
- def locate_identifier_klass_by_type_code(type_code)
57
- identifier_klass = (identifiers + supplement_identifiers).detect do |klass|
58
- klass.type[:key].to_s == type_code.to_s
59
- end
60
-
61
- unless identifier_klass
62
- raise ArgumentError,
63
- "Unknown type code: #{type_code}"
64
- end
65
-
66
- identifier_klass
67
- end
68
- end
69
- end
70
- end
71
- end