pubid 1.15.19 → 2.0.0.pre.alpha.1

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 (601) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.adoc +2041 -53
  4. data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
  5. data/archived-gems/pubid-iec/stages.yaml +129 -0
  6. data/archived-gems/pubid-iec/update_codes.yaml +67 -0
  7. data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
  8. data/archived-gems/pubid-iso/stages.yaml +106 -0
  9. data/archived-gems/pubid-iso/update_codes.yaml +4 -0
  10. data/archived-gems/pubid-itu/i18n.yaml +13 -0
  11. data/archived-gems/pubid-itu/series.yaml +42 -0
  12. data/archived-gems/pubid-nist/publishers.yaml +6 -0
  13. data/archived-gems/pubid-nist/series.yaml +121 -0
  14. data/archived-gems/pubid-nist/stages.yaml +16 -0
  15. data/archived-gems/pubid-nist/update_codes.yaml +93 -0
  16. data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
  17. data/data/ccsds/update_codes.yaml +1 -0
  18. data/data/iec/update_codes.yaml +67 -0
  19. data/data/ieee/update_codes.yaml +104 -0
  20. data/data/iso/update_codes.yaml +21 -0
  21. data/data/nist/update_codes.yaml +87 -0
  22. data/data/plateau/update_codes.yaml +6 -0
  23. data/lib/pubid/amca/builder.rb +176 -0
  24. data/lib/pubid/amca/identifier.rb +18 -0
  25. data/lib/pubid/amca/identifiers/base.rb +64 -0
  26. data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
  27. data/lib/pubid/amca/identifiers/publication.rb +47 -0
  28. data/lib/pubid/amca/identifiers/standard.rb +22 -0
  29. data/lib/pubid/amca/identifiers.rb +12 -0
  30. data/lib/pubid/amca/parser.rb +153 -0
  31. data/lib/pubid/amca/scheme.rb +16 -0
  32. data/lib/pubid/amca/single_identifier.rb +33 -0
  33. data/lib/pubid/amca/urn_generator.rb +50 -0
  34. data/lib/pubid/amca.rb +26 -0
  35. data/lib/pubid/ansi/builder.rb +52 -0
  36. data/lib/pubid/ansi/identifier.rb +13 -0
  37. data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
  38. data/lib/pubid/ansi/identifiers/standard.rb +16 -0
  39. data/lib/pubid/ansi/identifiers.rb +11 -0
  40. data/lib/pubid/ansi/parser.rb +91 -0
  41. data/lib/pubid/ansi/scheme.rb +15 -0
  42. data/lib/pubid/ansi/single_identifier.rb +45 -0
  43. data/lib/pubid/ansi/urn_generator.rb +76 -0
  44. data/lib/pubid/ansi.rb +27 -0
  45. data/lib/pubid/api/builder.rb +85 -0
  46. data/lib/pubid/api/components/code.rb +9 -0
  47. data/lib/pubid/api/identifier.rb +21 -0
  48. data/lib/pubid/api/identifiers/base.rb +24 -0
  49. data/lib/pubid/api/identifiers/bulletin.rb +15 -0
  50. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
  51. data/lib/pubid/api/identifiers/mpms.rb +44 -0
  52. data/lib/pubid/api/identifiers/publication.rb +15 -0
  53. data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
  54. data/lib/pubid/api/identifiers/specification.rb +15 -0
  55. data/lib/pubid/api/identifiers/standard.rb +15 -0
  56. data/lib/pubid/api/identifiers/technical_report.rb +15 -0
  57. data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
  58. data/lib/pubid/api/parser.rb +140 -0
  59. data/lib/pubid/api/scheme.rb +66 -0
  60. data/lib/pubid/api/single_identifier.rb +46 -0
  61. data/lib/pubid/api/urn_generator.rb +41 -0
  62. data/lib/pubid/api.rb +17 -0
  63. data/lib/pubid/ashrae/builder.rb +498 -0
  64. data/lib/pubid/ashrae/identifier.rb +18 -0
  65. data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
  66. data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
  67. data/lib/pubid/ashrae/identifiers/base.rb +23 -0
  68. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
  69. data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
  70. data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
  71. data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
  72. data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
  73. data/lib/pubid/ashrae/identifiers.rb +16 -0
  74. data/lib/pubid/ashrae/parser.rb +724 -0
  75. data/lib/pubid/ashrae/scheme.rb +53 -0
  76. data/lib/pubid/ashrae/single_identifier.rb +23 -0
  77. data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
  78. data/lib/pubid/ashrae/urn_generator.rb +59 -0
  79. data/lib/pubid/ashrae.rb +21 -0
  80. data/lib/pubid/asme/builder.rb +153 -0
  81. data/lib/pubid/asme/components/code.rb +18 -0
  82. data/lib/pubid/asme/identifier.rb +15 -0
  83. data/lib/pubid/asme/identifiers/base.rb +70 -0
  84. data/lib/pubid/asme/identifiers/standard.rb +12 -0
  85. data/lib/pubid/asme/identifiers.rb +10 -0
  86. data/lib/pubid/asme/parser.rb +308 -0
  87. data/lib/pubid/asme/scheme.rb +37 -0
  88. data/lib/pubid/asme/single_identifier.rb +29 -0
  89. data/lib/pubid/asme/urn_generator.rb +133 -0
  90. data/lib/pubid/asme.rb +21 -0
  91. data/lib/pubid/astm/builder.rb +159 -0
  92. data/lib/pubid/astm/components/code.rb +33 -0
  93. data/lib/pubid/astm/identifier.rb +15 -0
  94. data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
  95. data/lib/pubid/astm/identifiers/base.rb +13 -0
  96. data/lib/pubid/astm/identifiers/data_series.rb +25 -0
  97. data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
  98. data/lib/pubid/astm/identifiers/manual.rb +40 -0
  99. data/lib/pubid/astm/identifiers/monograph.rb +25 -0
  100. data/lib/pubid/astm/identifiers/research_report.rb +18 -0
  101. data/lib/pubid/astm/identifiers/standard.rb +52 -0
  102. data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
  103. data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
  104. data/lib/pubid/astm/parser.rb +244 -0
  105. data/lib/pubid/astm/scheme.rb +55 -0
  106. data/lib/pubid/astm/single_identifier.rb +25 -0
  107. data/lib/pubid/astm/urn_generator.rb +99 -0
  108. data/lib/pubid/astm.rb +38 -0
  109. data/lib/pubid/bsi/builder.rb +1483 -0
  110. data/lib/pubid/bsi/components/code.rb +11 -0
  111. data/lib/pubid/bsi/components/date.rb +11 -0
  112. data/lib/pubid/bsi/components/publisher.rb +11 -0
  113. data/lib/pubid/bsi/components/type.rb +11 -0
  114. data/lib/pubid/bsi/identifier.rb +27 -0
  115. data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
  116. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
  117. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
  118. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
  119. data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
  120. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  121. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
  122. data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
  123. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
  124. data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
  125. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
  126. data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
  127. data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
  128. data/lib/pubid/bsi/identifiers/disc.rb +56 -0
  129. data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
  130. data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
  131. data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
  132. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
  133. data/lib/pubid/bsi/identifiers/flex.rb +61 -0
  134. data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
  135. data/lib/pubid/bsi/identifiers/index.rb +62 -0
  136. data/lib/pubid/bsi/identifiers/method.rb +76 -0
  137. data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
  138. data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
  139. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
  140. data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
  141. data/lib/pubid/bsi/identifiers/section.rb +62 -0
  142. data/lib/pubid/bsi/identifiers/set.rb +46 -0
  143. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
  144. data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
  145. data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
  146. data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
  147. data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
  148. data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
  149. data/lib/pubid/bsi/identifiers.rb +52 -0
  150. data/lib/pubid/bsi/model.rb +196 -0
  151. data/lib/pubid/bsi/parser.rb +659 -0
  152. data/lib/pubid/bsi/scheme.rb +243 -0
  153. data/lib/pubid/bsi/single_identifier.rb +129 -0
  154. data/lib/pubid/bsi/urn_generator.rb +84 -0
  155. data/lib/pubid/bsi.rb +32 -0
  156. data/lib/pubid/builder/base.rb +138 -0
  157. data/lib/pubid/bundled_identifier.rb +126 -0
  158. data/lib/pubid/ccsds/builder.rb +56 -0
  159. data/lib/pubid/ccsds/identifier.rb +16 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +78 -0
  161. data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
  162. data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
  163. data/lib/pubid/ccsds/identifiers.rb +10 -0
  164. data/lib/pubid/ccsds/parser.rb +71 -0
  165. data/lib/pubid/ccsds/scheme.rb +57 -0
  166. data/lib/pubid/ccsds/single_identifier.rb +74 -0
  167. data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
  168. data/lib/pubid/ccsds/urn_generator.rb +115 -0
  169. data/lib/pubid/ccsds.rb +21 -0
  170. data/lib/pubid/cen_cenelec/builder.rb +330 -0
  171. data/lib/pubid/cen_cenelec/identifier.rb +15 -0
  172. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
  173. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
  174. data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
  175. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
  176. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
  177. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
  178. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
  179. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
  180. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
  181. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
  182. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
  183. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
  184. data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
  185. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
  186. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
  187. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
  188. data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
  189. data/lib/pubid/cen_cenelec/parser.rb +144 -0
  190. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  191. data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
  192. data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
  193. data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
  194. data/lib/pubid/cen_cenelec.rb +21 -0
  195. data/lib/pubid/cie/builder.rb +399 -0
  196. data/lib/pubid/cie/components/code.rb +72 -0
  197. data/lib/pubid/cie/components/language.rb +58 -0
  198. data/lib/pubid/cie/identifier.rb +18 -0
  199. data/lib/pubid/cie/identifiers/bundle.rb +20 -0
  200. data/lib/pubid/cie/identifiers/conference.rb +32 -0
  201. data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
  202. data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
  203. data/lib/pubid/cie/identifiers/identical.rb +64 -0
  204. data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
  205. data/lib/pubid/cie/identifiers/standard.rb +58 -0
  206. data/lib/pubid/cie/identifiers/supplement.rb +45 -0
  207. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
  208. data/lib/pubid/cie/identifiers.rb +17 -0
  209. data/lib/pubid/cie/parser.rb +347 -0
  210. data/lib/pubid/cie/scheme.rb +64 -0
  211. data/lib/pubid/cie/single_identifier.rb +30 -0
  212. data/lib/pubid/cie/supplement_identifier.rb +26 -0
  213. data/lib/pubid/cie/urn_generator.rb +123 -0
  214. data/lib/pubid/cie.rb +28 -0
  215. data/lib/pubid/components/code.rb +33 -0
  216. data/lib/pubid/components/date.rb +49 -0
  217. data/lib/pubid/components/edition.rb +32 -0
  218. data/lib/pubid/components/language.rb +37 -0
  219. data/lib/pubid/components/locality.rb +10 -0
  220. data/lib/pubid/components/publisher.rb +36 -0
  221. data/lib/pubid/components/stage.rb +54 -0
  222. data/lib/pubid/components/type.rb +58 -0
  223. data/lib/pubid/components/typed_stage.rb +55 -0
  224. data/lib/pubid/components.rb +15 -0
  225. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  226. data/lib/pubid/core/update_codes.rb +77 -0
  227. data/lib/pubid/core.rb +8 -0
  228. data/lib/pubid/csa/builder.rb +671 -0
  229. data/lib/pubid/csa/components/code.rb +9 -0
  230. data/lib/pubid/csa/components.rb +9 -0
  231. data/lib/pubid/csa/composite_identifier.rb +27 -0
  232. data/lib/pubid/csa/identifier.rb +457 -0
  233. data/lib/pubid/csa/identifiers/base.rb +133 -0
  234. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  235. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  236. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  237. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  238. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  239. data/lib/pubid/csa/identifiers/package.rb +65 -0
  240. data/lib/pubid/csa/identifiers/series.rb +127 -0
  241. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  242. data/lib/pubid/csa/identifiers.rb +17 -0
  243. data/lib/pubid/csa/parser.rb +445 -0
  244. data/lib/pubid/csa/scheme.rb +44 -0
  245. data/lib/pubid/csa/single_identifier.rb +30 -0
  246. data/lib/pubid/csa/urn_generator.rb +80 -0
  247. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  248. data/lib/pubid/csa.rb +25 -0
  249. data/lib/pubid/etsi/builder.rb +133 -0
  250. data/lib/pubid/etsi/components/code.rb +42 -0
  251. data/lib/pubid/etsi/components/version.rb +37 -0
  252. data/lib/pubid/etsi/components.rb +10 -0
  253. data/lib/pubid/etsi/identifier.rb +14 -0
  254. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  255. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  256. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  257. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  258. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  259. data/lib/pubid/etsi/identifiers.rb +14 -0
  260. data/lib/pubid/etsi/parser.rb +133 -0
  261. data/lib/pubid/etsi/scheme.rb +42 -0
  262. data/lib/pubid/etsi/urn_generator.rb +76 -0
  263. data/lib/pubid/etsi.rb +21 -0
  264. data/lib/pubid/export/auditor.rb +89 -0
  265. data/lib/pubid/export/data_class_exporter.rb +59 -0
  266. data/lib/pubid/export/exporter.rb +74 -0
  267. data/lib/pubid/export/flavor_exporter.rb +402 -0
  268. data/lib/pubid/export/ieee_exporter.rb +78 -0
  269. data/lib/pubid/export/itu_exporter.rb +66 -0
  270. data/lib/pubid/export/nist_exporter.rb +64 -0
  271. data/lib/pubid/export/registry_exporter.rb +90 -0
  272. data/lib/pubid/export/result.rb +97 -0
  273. data/lib/pubid/export/scheme_exporter.rb +70 -0
  274. data/lib/pubid/export.rb +18 -0
  275. data/lib/pubid/format_detector.rb +16 -0
  276. data/lib/pubid/format_registry.rb +42 -0
  277. data/lib/pubid/identifier.rb +235 -0
  278. data/lib/pubid/identifier_metadata.rb +148 -0
  279. data/lib/pubid/identifier_registry.rb +198 -0
  280. data/lib/pubid/idf/builder.rb +82 -0
  281. data/lib/pubid/idf/identifier.rb +69 -0
  282. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  283. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  284. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  285. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  286. data/lib/pubid/idf/identifiers.rb +13 -0
  287. data/lib/pubid/idf/parser.rb +143 -0
  288. data/lib/pubid/idf/scheme.rb +61 -0
  289. data/lib/pubid/idf/single_identifier.rb +19 -0
  290. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  291. data/lib/pubid/idf/urn_generator.rb +84 -0
  292. data/lib/pubid/idf.rb +25 -0
  293. data/lib/pubid/iec/builder.rb +457 -0
  294. data/lib/pubid/iec/components/code.rb +59 -0
  295. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  296. data/lib/pubid/iec/components/publisher.rb +35 -0
  297. data/lib/pubid/iec/components/sheet.rb +32 -0
  298. data/lib/pubid/iec/components/trf_info.rb +38 -0
  299. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  300. data/lib/pubid/iec/identifier.rb +21 -0
  301. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  302. data/lib/pubid/iec/identifiers/base.rb +78 -0
  303. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  304. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  305. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +86 -0
  306. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  307. data/lib/pubid/iec/identifiers/fragment_identifier.rb +141 -0
  308. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  309. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  310. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  311. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  312. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  313. data/lib/pubid/iec/identifiers/sheet_identifier.rb +66 -0
  314. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  315. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  316. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  317. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  319. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  320. data/lib/pubid/iec/identifiers/vap_identifier.rb +77 -0
  321. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  322. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  323. data/lib/pubid/iec/parser.rb +412 -0
  324. data/lib/pubid/iec/rendering_style.rb +113 -0
  325. data/lib/pubid/iec/scheme.rb +71 -0
  326. data/lib/pubid/iec/single_identifier.rb +80 -0
  327. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  328. data/lib/pubid/iec/urn_generator.rb +193 -0
  329. data/lib/pubid/iec/urn_parser.rb +289 -0
  330. data/lib/pubid/iec.rb +85 -0
  331. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  332. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  333. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  334. data/lib/pubid/ieee/aiee.rb +11 -0
  335. data/lib/pubid/ieee/builder.rb +1237 -0
  336. data/lib/pubid/ieee/components/code.rb +102 -0
  337. data/lib/pubid/ieee/components/draft.rb +93 -0
  338. data/lib/pubid/ieee/components/relationship.rb +157 -0
  339. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  340. data/lib/pubid/ieee/identifier.rb +13 -0
  341. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  342. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  343. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  344. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  345. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  346. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  347. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  348. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  349. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  350. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  351. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  352. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  353. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  354. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  355. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  356. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  358. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  359. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  360. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  361. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  362. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  363. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  364. data/lib/pubid/ieee/identifiers.rb +33 -0
  365. data/lib/pubid/ieee/ire/builder.rb +61 -0
  366. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  367. data/lib/pubid/ieee/ire/parser.rb +91 -0
  368. data/lib/pubid/ieee/ire.rb +11 -0
  369. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  370. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  371. data/lib/pubid/ieee/nesc.rb +10 -0
  372. data/lib/pubid/ieee/parser.rb +1226 -0
  373. data/lib/pubid/ieee/scheme.rb +90 -0
  374. data/lib/pubid/ieee/typed_stages.rb +172 -0
  375. data/lib/pubid/ieee/urn_generator.rb +188 -0
  376. data/lib/pubid/ieee.rb +32 -0
  377. data/lib/pubid/ieee_debug.rb +31 -0
  378. data/lib/pubid/iho/builder.rb +37 -0
  379. data/lib/pubid/iho/identifier.rb +19 -0
  380. data/lib/pubid/iho/identifiers/base.rb +41 -0
  381. data/lib/pubid/iho/identifiers/bibliographic.rb +20 -0
  382. data/lib/pubid/iho/identifiers/circular_letter.rb +19 -0
  383. data/lib/pubid/iho/identifiers/miscellaneous.rb +20 -0
  384. data/lib/pubid/iho/identifiers/publication.rb +19 -0
  385. data/lib/pubid/iho/identifiers/standard.rb +19 -0
  386. data/lib/pubid/iho/identifiers.rb +14 -0
  387. data/lib/pubid/iho/parser.rb +68 -0
  388. data/lib/pubid/iho/scheme.rb +29 -0
  389. data/lib/pubid/iho/urn_generator.rb +29 -0
  390. data/lib/pubid/iho.rb +21 -0
  391. data/lib/pubid/iso/builder.rb +305 -0
  392. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  393. data/lib/pubid/iso/combined_identifier.rb +22 -0
  394. data/lib/pubid/iso/components/code.rb +36 -0
  395. data/lib/pubid/iso/components/publisher.rb +60 -0
  396. data/lib/pubid/iso/components.rb +12 -0
  397. data/lib/pubid/iso/format_resolver.rb +45 -0
  398. data/lib/pubid/iso/identifier.rb +69 -0
  399. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  400. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  401. data/lib/pubid/iso/identifiers/base.rb +115 -0
  402. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  403. data/lib/pubid/iso/identifiers/data.rb +76 -0
  404. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  405. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  406. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  407. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  408. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  409. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  410. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  411. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  412. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  413. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  414. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  415. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  416. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  417. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  418. data/lib/pubid/iso/identifiers.rb +33 -0
  419. data/lib/pubid/iso/parser.rb +510 -0
  420. data/lib/pubid/iso/rendering_style.rb +120 -0
  421. data/lib/pubid/iso/scheme.rb +187 -0
  422. data/lib/pubid/iso/single_identifier.rb +61 -0
  423. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  424. data/lib/pubid/iso/urn_generator.rb +412 -0
  425. data/lib/pubid/iso/urn_parser.rb +423 -0
  426. data/lib/pubid/iso/utilities.rb +86 -0
  427. data/lib/pubid/iso.rb +50 -0
  428. data/lib/pubid/itu/builder.rb +171 -0
  429. data/lib/pubid/itu/components/code.rb +39 -0
  430. data/lib/pubid/itu/components/sector.rb +35 -0
  431. data/lib/pubid/itu/components/series.rb +29 -0
  432. data/lib/pubid/itu/i18n.rb +9 -0
  433. data/lib/pubid/itu/i18n.yaml +30 -0
  434. data/lib/pubid/itu/identifier.rb +53 -0
  435. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  436. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  437. data/lib/pubid/itu/identifiers/base.rb +154 -0
  438. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  439. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  440. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  441. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  442. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  443. data/lib/pubid/itu/identifiers.rb +16 -0
  444. data/lib/pubid/itu/model.rb +111 -0
  445. data/lib/pubid/itu/parser.rb +225 -0
  446. data/lib/pubid/itu/scheme.rb +174 -0
  447. data/lib/pubid/itu/urn_generator.rb +105 -0
  448. data/lib/pubid/itu.rb +22 -0
  449. data/lib/pubid/jcgm/builder.rb +88 -0
  450. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  451. data/lib/pubid/jcgm/components.rb +9 -0
  452. data/lib/pubid/jcgm/identifier.rb +11 -0
  453. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  454. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  455. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  456. data/lib/pubid/jcgm/identifiers.rb +11 -0
  457. data/lib/pubid/jcgm/parser.rb +84 -0
  458. data/lib/pubid/jcgm/scheme.rb +60 -0
  459. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  460. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  461. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  462. data/lib/pubid/jcgm.rb +31 -0
  463. data/lib/pubid/jis/builder.rb +124 -0
  464. data/lib/pubid/jis/components/code.rb +59 -0
  465. data/lib/pubid/jis/components.rb +9 -0
  466. data/lib/pubid/jis/identifier.rb +18 -0
  467. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  468. data/lib/pubid/jis/identifiers/base.rb +72 -0
  469. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  470. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  471. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  472. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  473. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  474. data/lib/pubid/jis/identifiers.rb +17 -0
  475. data/lib/pubid/jis/parser.rb +109 -0
  476. data/lib/pubid/jis/scheme.rb +49 -0
  477. data/lib/pubid/jis/single_identifier.rb +37 -0
  478. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  479. data/lib/pubid/jis/urn_generator.rb +25 -0
  480. data/lib/pubid/jis.rb +23 -0
  481. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  482. data/lib/pubid/nist/builder.rb +2100 -0
  483. data/lib/pubid/nist/components/code.rb +38 -0
  484. data/lib/pubid/nist/components/edition.rb +118 -0
  485. data/lib/pubid/nist/components/issue_number.rb +28 -0
  486. data/lib/pubid/nist/components/part.rb +77 -0
  487. data/lib/pubid/nist/components/publisher.rb +24 -0
  488. data/lib/pubid/nist/components/stage.rb +53 -0
  489. data/lib/pubid/nist/components/supplement.rb +121 -0
  490. data/lib/pubid/nist/components/translation.rb +42 -0
  491. data/lib/pubid/nist/components/update.rb +103 -0
  492. data/lib/pubid/nist/components/version.rb +35 -0
  493. data/lib/pubid/nist/components/volume.rb +32 -0
  494. data/lib/pubid/nist/components.rb +19 -0
  495. data/lib/pubid/nist/configuration.rb +77 -0
  496. data/lib/pubid/nist/identifiers/base.rb +499 -0
  497. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  498. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  499. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  500. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  501. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  502. data/lib/pubid/nist/identifiers/crpl_report.rb +135 -0
  503. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +94 -0
  504. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  505. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  506. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  507. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  508. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  509. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  510. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  511. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  512. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  513. data/lib/pubid/nist/identifiers/report.rb +68 -0
  514. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  515. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  516. data/lib/pubid/nist/identifiers.rb +33 -0
  517. data/lib/pubid/nist/parser.rb +1084 -0
  518. data/lib/pubid/nist/scheme.rb +199 -0
  519. data/lib/pubid/nist/supplement_identifier.rb +83 -0
  520. data/lib/pubid/nist/urn_generator.rb +127 -0
  521. data/lib/pubid/nist.rb +36 -0
  522. data/lib/pubid/oiml/builder.rb +189 -0
  523. data/lib/pubid/oiml/components/code.rb +20 -0
  524. data/lib/pubid/oiml/components.rb +9 -0
  525. data/lib/pubid/oiml/identifier.rb +11 -0
  526. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  527. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  528. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  529. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  530. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  531. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  536. data/lib/pubid/oiml/identifiers.rb +18 -0
  537. data/lib/pubid/oiml/parser.rb +173 -0
  538. data/lib/pubid/oiml/scheme.rb +46 -0
  539. data/lib/pubid/oiml/single_identifier.rb +90 -0
  540. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  541. data/lib/pubid/oiml/urn_generator.rb +64 -0
  542. data/lib/pubid/oiml.rb +26 -0
  543. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  544. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  545. data/lib/pubid/parser.rb +8 -0
  546. data/lib/pubid/parsers/base.rb +11 -0
  547. data/lib/pubid/parsers/mr_string.rb +93 -0
  548. data/lib/pubid/plateau/builder.rb +50 -0
  549. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  550. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  551. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  552. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  553. data/lib/pubid/plateau/identifiers.rb +12 -0
  554. data/lib/pubid/plateau/parser.rb +63 -0
  555. data/lib/pubid/plateau/scheme.rb +45 -0
  556. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  557. data/lib/pubid/plateau/urn_generator.rb +29 -0
  558. data/lib/pubid/plateau.rb +25 -0
  559. data/lib/pubid/renderers/base.rb +19 -0
  560. data/lib/pubid/renderers/directives_renderer.rb +62 -0
  561. data/lib/pubid/renderers/guide_renderer.rb +20 -0
  562. data/lib/pubid/renderers/human_readable.rb +58 -0
  563. data/lib/pubid/renderers/iwa_renderer.rb +16 -0
  564. data/lib/pubid/renderers/mr_string.rb +16 -0
  565. data/lib/pubid/renderers/supplement_renderer.rb +33 -0
  566. data/lib/pubid/renderers/urn.rb +11 -0
  567. data/lib/pubid/renderers.rb +14 -0
  568. data/lib/pubid/rendering/base.rb +73 -0
  569. data/lib/pubid/rendering/common.rb +211 -0
  570. data/lib/pubid/rendering/context.rb +156 -0
  571. data/lib/pubid/rendering/date.rb +27 -0
  572. data/lib/pubid/rendering/format.rb +25 -0
  573. data/lib/pubid/rendering/language.rb +21 -0
  574. data/lib/pubid/rendering/numbering.rb +24 -0
  575. data/lib/pubid/rendering/publisher.rb +25 -0
  576. data/lib/pubid/rendering/stage.rb +38 -0
  577. data/lib/pubid/rendering/supplement.rb +46 -0
  578. data/lib/pubid/rendering.rb +16 -0
  579. data/lib/pubid/sae/builder.rb +32 -0
  580. data/lib/pubid/sae/components/code.rb +9 -0
  581. data/lib/pubid/sae/components/date.rb +19 -0
  582. data/lib/pubid/sae/components/type.rb +19 -0
  583. data/lib/pubid/sae/components.rb +11 -0
  584. data/lib/pubid/sae/identifier.rb +14 -0
  585. data/lib/pubid/sae/identifiers/base.rb +42 -0
  586. data/lib/pubid/sae/identifiers.rb +9 -0
  587. data/lib/pubid/sae/parser.rb +55 -0
  588. data/lib/pubid/sae/scheme.rb +47 -0
  589. data/lib/pubid/sae/urn_generator.rb +38 -0
  590. data/lib/pubid/sae.rb +19 -0
  591. data/lib/pubid/scheme.rb +207 -0
  592. data/lib/pubid/urn_generator/base.rb +110 -0
  593. data/lib/pubid/utils/string_normalizer.rb +196 -0
  594. data/lib/pubid/utils.rb +7 -0
  595. data/lib/pubid/version.rb +3 -1
  596. data/lib/pubid.rb +137 -13
  597. data/lib/tasks/docs.rake +37 -0
  598. data/lib/tasks/export.rake +38 -0
  599. data/lib/tasks/website-data.json +7488 -0
  600. metadata +613 -171
  601. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,402 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "set"
4
+
5
+ module Pubid
6
+ module Export
7
+ # Abstract base class for per-flavor metadata extraction.
8
+ # Subclasses implement strategy for different Scheme patterns.
9
+ #
10
+ # Open/Closed: New flavors add a subclass; no existing code changes.
11
+ # Single Responsibility: Each subclass extracts data for one Scheme pattern.
12
+ class FlavorExporter
13
+ attr_reader :flavor
14
+
15
+ # Wrapper classes to discover per flavor (overlay patterns that wrap base identifiers)
16
+ WRAPPER_CLASSES = {
17
+ iec: %i[VapIdentifier],
18
+ bsi: %i[ValueAddedPublication],
19
+ }.freeze
20
+
21
+ def initialize(flavor)
22
+ @flavor = flavor
23
+ end
24
+
25
+ # Subclasses must override
26
+ def export
27
+ raise NotImplementedError
28
+ end
29
+
30
+ protected
31
+
32
+ def scheme_module
33
+ # const_get doesn't trigger autoload; reference the constant directly
34
+ @scheme_module ||= case flavor.to_s
35
+ when "iso" then Pubid::Iso
36
+ when "iec" then Pubid::Iec
37
+ when "ieee" then Pubid::Ieee
38
+ when "nist" then Pubid::Nist
39
+ when "bsi" then Pubid::Bsi
40
+ when "itu" then Pubid::Itu
41
+ when "cen_cenelec" then Pubid::CenCenelec
42
+ when "etsi" then Pubid::Etsi
43
+ when "ansi" then Pubid::Ansi
44
+ when "astm" then Pubid::Astm
45
+ when "ashrae" then Pubid::Ashrae
46
+ when "asme" then Pubid::Asme
47
+ when "ccsds" then Pubid::Ccsds
48
+ when "cie" then Pubid::Cie
49
+ when "csa" then Pubid::Csa
50
+ when "jis" then Pubid::Jis
51
+ when "jcgm" then Pubid::Jcgm
52
+ when "oiml" then Pubid::Oiml
53
+ when "idf" then Pubid::Idf
54
+ when "api" then Pubid::Api
55
+ when "amca" then Pubid::Amca
56
+ when "plateau" then Pubid::Plateau
57
+ when "sae" then Pubid::Sae
58
+ end
59
+ end
60
+
61
+ def scheme_class
62
+ @scheme_class ||= begin
63
+ mod = scheme_module
64
+ mod&.const_get(:Scheme)
65
+ rescue NameError
66
+ nil
67
+ end
68
+ end
69
+
70
+ def identifier_classes
71
+ resolve_identifier_classes
72
+ end
73
+
74
+ def resolve_identifier_classes
75
+ scheme = scheme_class
76
+ scheme_klasses = []
77
+
78
+ # Pattern 1: Class methods (ISO, IEC, ASTM, etc.)
79
+ begin
80
+ scheme_klasses = scheme.identifiers if scheme
81
+ rescue NoMethodError
82
+ scheme_klasses = []
83
+ end
84
+
85
+ # Pattern 2: Instance-based (AMCA, BSI)
86
+ if scheme_klasses.empty? && scheme
87
+ instance = begin
88
+ scheme.new
89
+ rescue NoMethodError
90
+ nil
91
+ end
92
+ if instance
93
+ ids = begin
94
+ instance.identifiers
95
+ rescue NoMethodError
96
+ nil
97
+ end
98
+ scheme_klasses = ids if ids && !ids.empty?
99
+ end
100
+ end
101
+
102
+ # Build set of website keys from Scheme classes to avoid duplicates
103
+ known_website_keys = Set.new
104
+ scheme_klasses.each do |klass|
105
+ info = extract_type_info(klass)
106
+ known_website_keys << info[:key].to_s if info[:key]
107
+ end
108
+
109
+ # Supplement with any typed classes in the Identifiers module
110
+ # that weren't returned by Scheme (e.g., supplements, fragments)
111
+ additional = discover_additional_typed_classes(scheme_klasses,
112
+ known_website_keys)
113
+ scheme_klasses + additional
114
+ end
115
+
116
+ # Classes to skip when discovering additional identifier types
117
+ SKIP_CLASSES = %w[Base].freeze
118
+
119
+ def discover_additional_typed_classes(known_classes,
120
+ known_website_keys = Set.new)
121
+ mod = scheme_module
122
+ return [] unless mod
123
+
124
+ idents_mod = mod.const_get(:Identifiers)
125
+ known_set = Set.new(known_classes)
126
+
127
+ idents_mod.constants.filter_map do |c|
128
+ klass = idents_mod.const_get(c)
129
+ rescue NameError
130
+ next
131
+ else
132
+ next unless klass.is_a?(Class)
133
+ next if known_set.include?(klass)
134
+ next if klass <= Exception
135
+ next if SKIP_CLASSES.include?(klass.name&.split("::")&.last)
136
+
137
+ # Check if this class produces a duplicate website key
138
+ info = extract_type_info(klass)
139
+ wkey = info[:key]&.to_s
140
+ next if wkey && known_website_keys.include?(wkey)
141
+
142
+ known_website_keys << wkey if wkey
143
+ klass
144
+ end
145
+ end
146
+
147
+ # Explicit overrides mapping (flavor, library_key) → website key
148
+ # for cases where derived key doesn't match the website convention.
149
+ WEBSITE_KEY_OVERRIDES = {
150
+ # ISO
151
+ [%i[iso], :is] => :international_standard,
152
+ [%i[iso], :tr] => :technical_report,
153
+ [%i[iso], :ts] => :technical_specification,
154
+ [%i[iso], :pas] => :publicly_available_specification,
155
+ [%i[iso], :tta] => :technology_trends_assessments,
156
+ [%i[iso], :iwa] => :international_workshop_agreement,
157
+ [%i[iso], :isp] => :international_standardized_profile,
158
+ [%i[iso], :rec] => :recommendation,
159
+ [%i[iso], :dir] => :directives,
160
+ [%i[iso], :"dir-sup"] => :directives_supplement,
161
+ [%i[iso], :amd] => :amendment,
162
+ [%i[iso], :cor] => :corrigendum,
163
+ [%i[iso], :suppl] => :supplement,
164
+ [%i[iso], :ext] => :extract,
165
+ [%i[iso], :add] => :addendum,
166
+ [%i[iso], :tc] => :tc_document,
167
+ # IEC
168
+ [%i[iec], :is] => :international_standard,
169
+ [%i[iec], :tr] => :technical_report,
170
+ [%i[iec], :ts] => :technical_specification,
171
+ [%i[iec], :pas] => :publicly_available_specification,
172
+ [%i[iec], :trf] => :test_report_form,
173
+ [%i[iec], :ish] => :interpretation_sheet,
174
+ [%i[iec], :srd] => :systems_reference_document,
175
+ [%i[iec], :wd] => :working_document,
176
+ [%i[iec], :frag] => :fragment_identifier,
177
+ [%i[iec], :amd] => :amendment,
178
+ [%i[iec], :cor] => :corrigendum,
179
+ [%i[iec], :cs] => :component_specification,
180
+ [%i[iec], :od] => :operational_document,
181
+ [%i[iec], :sttr] => :societal_technology_trend_report,
182
+ [%i[iec], :wp] => :white_paper,
183
+ # IEEE
184
+ [%i[ieee], :std] => :standard,
185
+ # NIST
186
+ [%i[nist], :sp] => :special_publication,
187
+ [%i[nist], :fips] => :federal_information_processing_standards,
188
+ [%i[nist], :ir] => :interagency_report,
189
+ [%i[nist], :hb] => :handbook,
190
+ [%i[nist], :tn] => :technical_note,
191
+ [%i[nist], :circ] => :circular,
192
+ [%i[nist], :circ_supp] => :circular_supplement,
193
+ [%i[nist], :crpl] => :crpl_report,
194
+ [%i[nist], :rpt] => :report,
195
+ [%i[nist], :mono] => :monograph,
196
+ [%i[nist], :mp] => :miscellaneous_publication,
197
+ [%i[nist], :gcr] => :grant_contractor_report,
198
+ [%i[nist], :lc] => :letter_circular,
199
+ [%i[nist], :cs] => :commercial_standard,
200
+ [%i[nist], :cse] => :commercial_standard_emergency,
201
+ [%i[nist], :csm] => :commercial_standards_monthly,
202
+ # BSI — adopted types share keys with base types, need unique mappings
203
+ [%i[bsi], :bs] => :british_standard,
204
+ [%i[bsi], :pd] => :published_document,
205
+ [%i[bsi], :pas] => :publicly_available_specification,
206
+ [%i[bsi], :na] => :national_annex,
207
+ [%i[bsi], :dd] => :draft_document,
208
+ [%i[bsi], :ep] => :electronic_book,
209
+ [%i[bsi], :ts] => :technical_specification,
210
+ [%i[bsi], :handbook] => :handbook,
211
+ [%i[bsi], :aerospace] => :aerospace_standard,
212
+ # CEN-CENELEC
213
+ [%i[cen_cenelec], :en] => :european_norm,
214
+ [%i[cen_cenelec], :ts] => :technical_specification,
215
+ [%i[cen_cenelec], :tr] => :technical_report,
216
+ [%i[cen_cenelec], :cwa] => :cen_workshop_agreement,
217
+ [%i[cen_cenelec], :hd] => :harmonization_document,
218
+ [%i[cen_cenelec], :es] => :european_specification,
219
+ [%i[cen_cenelec], :cr] => :cen_report,
220
+ [%i[cen_cenelec], :env] => :european_prestandard,
221
+ # IDF
222
+ [%i[idf], :is] => :international_standard,
223
+ [%i[idf], :rm] => :reviewed_method,
224
+ [%i[idf], :amd] => :amendment,
225
+ [%i[idf], :cor] => :corrigendum,
226
+ # CCSDS
227
+ [%i[ccsds], :base] => :base,
228
+ [%i[ccsds], :cor] => :corrigendum,
229
+ # JIS
230
+ [%i[jis], :jis] => :japanese_industrial_standard,
231
+ [%i[jis], :tr] => :technical_report,
232
+ [%i[jis], :ts] => :technical_specification,
233
+ # SAE
234
+ [%i[sae], :base] => :standard,
235
+ # ANSI
236
+ [%i[ansi], :ans] => :american_national_standard,
237
+ }.freeze
238
+
239
+ # Per-class overrides keyed by class name (for classes that share type keys)
240
+ CLASS_KEY_OVERRIDES = {
241
+ "Pubid::Bsi::Identifiers::AdoptedEuropeanNorm" => "adopted_european_norm",
242
+ "Pubid::Bsi::Identifiers::AdoptedInternationalStandard" => "adopted_international_standard",
243
+ "Pubid::CenCenelec::Identifiers::AdoptedEuropeanNorm" => "adopted_european_norm",
244
+ "Pubid::Ansi::Identifiers::Standard" => "standard",
245
+ "Pubid::Ansi::Identifiers::AmericanNationalStandard" => "american_national_standard",
246
+ "Pubid::Jis::Identifiers::Standard" => "standard",
247
+ "Pubid::Ieee::Identifiers::Nesc::Standard" => "nesc",
248
+ "Pubid::Ieee::Identifiers::Nesc::Draft" => "nesc",
249
+ "Pubid::Ieee::Identifiers::Nesc::Handbook" => "nesc",
250
+ "Pubid::Ieee::Identifiers::Nesc::Redline" => "nesc",
251
+ }.freeze
252
+
253
+ def extract_type_info(klass)
254
+ # Per-class override takes highest priority
255
+ class_key = CLASS_KEY_OVERRIDES[klass.name]
256
+ if class_key
257
+ type_info = begin
258
+ klass.type
259
+ rescue NoMethodError, NotImplementedError
260
+ nil
261
+ end
262
+ metadata = begin
263
+ klass.metadata
264
+ rescue NoMethodError
265
+ nil
266
+ end
267
+ return {
268
+ key: class_key,
269
+ title: type_info&.dig(:title) || metadata&.title || class_key.tr(
270
+ "_", " "
271
+ ).capitalize,
272
+ short: type_info&.dig(:short) || metadata&.short,
273
+ abbr: metadata&.abbr || [],
274
+ }
275
+ end
276
+
277
+ type_info = begin
278
+ klass.type
279
+ rescue NoMethodError, NotImplementedError
280
+ nil
281
+ end
282
+ metadata = begin
283
+ klass.metadata
284
+ rescue NoMethodError
285
+ nil
286
+ end
287
+
288
+ lib_key = type_info&.dig(:key)
289
+ title = type_info&.dig(:title) || metadata&.title
290
+ short = type_info&.dig(:short) || metadata&.short
291
+ abbr = metadata&.abbr || []
292
+
293
+ # Derive from class name when def self.type is missing
294
+ unless lib_key
295
+ class_name = klass.name&.split("::")&.last
296
+ lib_key = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/,
297
+ "")&.to_sym
298
+ title ||= class_name&.gsub(/([A-Z])/, ' \1')&.strip
299
+ end
300
+
301
+ # Map library key to website-compatible key
302
+ website_key = resolve_website_key(lib_key)
303
+
304
+ {
305
+ key: website_key,
306
+ title: title,
307
+ short: short,
308
+ abbr: abbr,
309
+ }
310
+ end
311
+
312
+ def resolve_website_key(lib_key)
313
+ key_str = lib_key.to_s
314
+ WEBSITE_KEY_OVERRIDES.each do |(flavors, from_key), to_key|
315
+ next unless flavors.include?(flavor)
316
+ return to_key.to_s if from_key.to_s == key_str
317
+ end
318
+ key_str
319
+ end
320
+
321
+ def extract_typed_stages(klass)
322
+ return [] unless klass.const_defined?(:TYPED_STAGES)
323
+
324
+ klass.const_get(:TYPED_STAGES)
325
+ rescue NameError
326
+ []
327
+ end
328
+
329
+ # Map flavor keys to fixture directory names when they differ
330
+ FIXTURE_DIR_ALIASES = {}.freeze
331
+
332
+ def fixture_examples
333
+ # __dir__ = lib/pubid/export → go up 3 levels to gem root, then spec/fixtures
334
+ gem_root = File.expand_path("../../..", __dir__)
335
+ dir_name = FIXTURE_DIR_ALIASES[flavor] || flavor.to_s
336
+ base = File.join(gem_root, "spec", "fixtures", dir_name, "identifiers",
337
+ "pass")
338
+ return {} unless Dir.exist?(base)
339
+
340
+ examples = {}
341
+ Dir.glob(File.join(base, "*.txt")).each do |path|
342
+ type_key = File.basename(path, ".txt")
343
+ identifiers = parse_fixture_file(path)
344
+ examples[type_key] = identifiers if identifiers.any?
345
+ end
346
+ examples
347
+ end
348
+
349
+ def parse_fixture_file(path)
350
+ identifiers = []
351
+ File.readlines(path, chomp: true).each do |line|
352
+ next if line.start_with?("#") || line.strip.empty?
353
+
354
+ # Format: "!Type input!expected" or just "input"
355
+ if line.start_with?("!")
356
+ parts = line.split("!")
357
+ # ["", "Type", "input", "expected"] or ["", "Type", "input"]
358
+ input = parts[2]&.strip
359
+ identifiers << input if input && !input.empty?
360
+ else
361
+ identifiers << line.strip
362
+ end
363
+ end
364
+ identifiers.uniq.first(10)
365
+ end
366
+
367
+ def map_fixture_key_to_type_key(fixture_key)
368
+ fixture_key
369
+ end
370
+
371
+ def extract_attributes(klass)
372
+ klass.model_attributes.keys.map(&:to_s)
373
+ rescue NoMethodError
374
+ []
375
+ end
376
+
377
+ def extract_wrapper_types
378
+ names = WRAPPER_CLASSES[flavor]
379
+ return [] unless names
380
+
381
+ mod = scheme_module
382
+ return [] unless mod
383
+
384
+ identifiers_mod = mod.const_get(:Identifiers)
385
+ names.filter_map do |name|
386
+ klass = identifiers_mod.const_get(name)
387
+ info = extract_type_info(klass)
388
+ IdentifierTypeResult.new(
389
+ key: info[:key],
390
+ title: info[:title],
391
+ short: info[:short],
392
+ abbr: info[:abbr],
393
+ typed_stages: [],
394
+ examples: [],
395
+ )
396
+ rescue NameError
397
+ nil
398
+ end
399
+ end
400
+ end
401
+ end
402
+ end
@@ -0,0 +1,78 @@
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
@@ -0,0 +1,66 @@
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
@@ -0,0 +1,64 @@
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
@@ -0,0 +1,90 @@
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