pubid 2.0.0.alpha.10 → 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 (811) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +51 -54
  3. data/data/iec/update_codes.yaml +0 -3
  4. data/data/ieee/update_codes.yaml +1 -107
  5. data/data/nist/update_codes.yaml +0 -35
  6. data/lib/pubid/amca/builder.rb +6 -6
  7. data/lib/pubid/amca/identifier.rb +16 -2
  8. data/lib/pubid/amca/identifiers/base.rb +46 -74
  9. data/lib/pubid/amca/identifiers/interpretation.rb +30 -17
  10. data/lib/pubid/amca/identifiers/publication.rb +27 -14
  11. data/lib/pubid/amca/identifiers/standard.rb +5 -3
  12. data/lib/pubid/amca/identifiers.rb +1 -0
  13. data/lib/pubid/amca/parser.rb +1 -1
  14. data/lib/pubid/amca/scheme.rb +16 -0
  15. data/lib/pubid/amca/single_identifier.rb +24 -1
  16. data/lib/pubid/amca/urn_generator.rb +3 -4
  17. data/lib/pubid/amca.rb +3 -50
  18. data/lib/pubid/ansi/builder.rb +5 -7
  19. data/lib/pubid/ansi/identifier.rb +1 -19
  20. data/lib/pubid/ansi/identifiers/american_national_standard.rb +1 -2
  21. data/lib/pubid/ansi/identifiers/standard.rb +3 -2
  22. data/lib/pubid/ansi/parser.rb +1 -1
  23. data/lib/pubid/ansi/scheme.rb +15 -0
  24. data/lib/pubid/ansi/single_identifier.rb +31 -2
  25. data/lib/pubid/ansi/urn_generator.rb +38 -3
  26. data/lib/pubid/ansi.rb +6 -47
  27. data/lib/pubid/api/builder.rb +72 -45
  28. data/lib/pubid/api/identifier.rb +9 -30
  29. data/lib/pubid/api/identifiers/base.rb +14 -2
  30. data/lib/pubid/api/identifiers/bulletin.rb +2 -0
  31. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +2 -0
  32. data/lib/pubid/api/identifiers/mpms.rb +28 -10
  33. data/lib/pubid/api/identifiers/publication.rb +2 -0
  34. data/lib/pubid/api/identifiers/recommended_practice.rb +2 -0
  35. data/lib/pubid/api/identifiers/specification.rb +2 -0
  36. data/lib/pubid/api/identifiers/standard.rb +2 -0
  37. data/lib/pubid/api/identifiers/technical_report.rb +2 -0
  38. data/lib/pubid/api/identifiers/typeless_standard.rb +16 -0
  39. data/lib/pubid/api/parser.rb +1 -1
  40. data/lib/pubid/api/scheme.rb +66 -0
  41. data/lib/pubid/api/single_identifier.rb +32 -10
  42. data/lib/pubid/api/urn_generator.rb +18 -0
  43. data/lib/pubid/api.rb +5 -56
  44. data/lib/pubid/ashrae/builder.rb +35 -56
  45. data/lib/pubid/ashrae/identifier.rb +16 -6
  46. data/lib/pubid/ashrae/identifiers/addenda_package.rb +11 -7
  47. data/lib/pubid/ashrae/identifiers/addendum.rb +20 -9
  48. data/lib/pubid/ashrae/identifiers/base.rb +15 -111
  49. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +16 -8
  50. data/lib/pubid/ashrae/identifiers/errata.rb +10 -9
  51. data/lib/pubid/ashrae/identifiers/guideline.rb +0 -3
  52. data/lib/pubid/ashrae/identifiers/interpretation.rb +10 -16
  53. data/lib/pubid/ashrae/identifiers/standard.rb +0 -3
  54. data/lib/pubid/ashrae/identifiers.rb +1 -0
  55. data/lib/pubid/ashrae/parser.rb +16 -40
  56. data/lib/pubid/ashrae/scheme.rb +53 -0
  57. data/lib/pubid/ashrae/single_identifier.rb +14 -1
  58. data/lib/pubid/ashrae/supplement_identifier.rb +6 -21
  59. data/lib/pubid/ashrae/urn_generator.rb +10 -8
  60. data/lib/pubid/ashrae.rb +2 -58
  61. data/lib/pubid/asme/builder.rb +2 -11
  62. data/lib/pubid/asme/components/code.rb +2 -10
  63. data/lib/pubid/asme/identifier.rb +0 -9
  64. data/lib/pubid/asme/identifiers/base.rb +60 -0
  65. data/lib/pubid/asme/identifiers/standard.rb +2 -86
  66. data/lib/pubid/asme/parser.rb +1 -1
  67. data/lib/pubid/asme/scheme.rb +37 -0
  68. data/lib/pubid/asme/single_identifier.rb +2 -11
  69. data/lib/pubid/asme/urn_generator.rb +2 -2
  70. data/lib/pubid/asme.rb +1 -47
  71. data/lib/pubid/astm/builder.rb +3 -10
  72. data/lib/pubid/astm/components/code.rb +0 -9
  73. data/lib/pubid/astm/identifier.rb +0 -9
  74. data/lib/pubid/astm/identifiers/adjunct.rb +9 -16
  75. data/lib/pubid/astm/identifiers/data_series.rb +14 -2
  76. data/lib/pubid/astm/identifiers/iso_dual_published.rb +34 -25
  77. data/lib/pubid/astm/identifiers/manual.rb +25 -8
  78. data/lib/pubid/astm/identifiers/monograph.rb +14 -2
  79. data/lib/pubid/astm/identifiers/research_report.rb +5 -8
  80. data/lib/pubid/astm/identifiers/standard.rb +37 -8
  81. data/lib/pubid/astm/identifiers/technical_report.rb +13 -2
  82. data/lib/pubid/astm/identifiers/work_in_progress.rb +10 -1
  83. data/lib/pubid/astm/parser.rb +1 -1
  84. data/lib/pubid/astm/scheme.rb +55 -0
  85. data/lib/pubid/astm/single_identifier.rb +10 -32
  86. data/lib/pubid/astm/urn_generator.rb +5 -7
  87. data/lib/pubid/astm.rb +27 -44
  88. data/lib/pubid/bsi/builder.rb +107 -119
  89. data/lib/pubid/bsi/identifier.rb +25 -4
  90. data/lib/pubid/bsi/identifiers/addendum_document.rb +37 -3
  91. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +47 -19
  92. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +39 -8
  93. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +55 -2
  94. data/lib/pubid/bsi/identifiers/amendment.rb +22 -30
  95. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  96. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +7 -1
  97. data/lib/pubid/bsi/identifiers/british_standard.rb +1 -2
  98. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +87 -13
  99. data/lib/pubid/bsi/identifiers/committee_document.rb +17 -10
  100. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +87 -19
  101. data/lib/pubid/bsi/identifiers/corrigendum.rb +10 -26
  102. data/lib/pubid/bsi/identifiers/detailed_specification.rb +36 -0
  103. data/lib/pubid/bsi/identifiers/disc.rb +29 -0
  104. data/lib/pubid/bsi/identifiers/draft_document.rb +46 -2
  105. data/lib/pubid/bsi/identifiers/electronic_book.rb +38 -2
  106. data/lib/pubid/bsi/identifiers/expert_commentary.rb +21 -10
  107. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +47 -0
  108. data/lib/pubid/bsi/identifiers/flex.rb +34 -3
  109. data/lib/pubid/bsi/identifiers/handbook.rb +17 -1
  110. data/lib/pubid/bsi/identifiers/index.rb +32 -0
  111. data/lib/pubid/bsi/identifiers/method.rb +41 -0
  112. data/lib/pubid/bsi/identifiers/national_annex.rb +29 -4
  113. data/lib/pubid/bsi/identifiers/practice_guide.rb +7 -1
  114. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +54 -2
  115. data/lib/pubid/bsi/identifiers/published_document.rb +54 -2
  116. data/lib/pubid/bsi/identifiers/section.rb +30 -0
  117. data/lib/pubid/bsi/identifiers/set.rb +20 -14
  118. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -10
  119. data/lib/pubid/bsi/identifiers/supplement_document.rb +25 -3
  120. data/lib/pubid/bsi/identifiers/supplementary_index.rb +46 -0
  121. data/lib/pubid/bsi/identifiers/technical_specification.rb +47 -2
  122. data/lib/pubid/bsi/identifiers/test_method.rb +32 -0
  123. data/lib/pubid/bsi/identifiers/value_added_publication.rb +22 -7
  124. data/lib/pubid/bsi/identifiers.rb +1 -0
  125. data/lib/pubid/bsi/parser.rb +6 -20
  126. data/lib/pubid/bsi/scheme.rb +243 -0
  127. data/lib/pubid/bsi/single_identifier.rb +82 -94
  128. data/lib/pubid/bsi/urn_generator.rb +5 -13
  129. data/lib/pubid/bsi.rb +2 -252
  130. data/lib/pubid/builder/base.rb +13 -62
  131. data/lib/pubid/bundled_identifier.rb +10 -18
  132. data/lib/pubid/ccsds/builder.rb +4 -5
  133. data/lib/pubid/ccsds/identifier.rb +3 -63
  134. data/lib/pubid/ccsds/identifiers/base.rb +51 -14
  135. data/lib/pubid/ccsds/identifiers/corrigendum.rb +8 -9
  136. data/lib/pubid/ccsds/parser.rb +3 -5
  137. data/lib/pubid/ccsds/scheme.rb +57 -0
  138. data/lib/pubid/ccsds/single_identifier.rb +3 -6
  139. data/lib/pubid/ccsds/supplement_identifier.rb +13 -17
  140. data/lib/pubid/ccsds/urn_generator.rb +6 -6
  141. data/lib/pubid/ccsds.rb +1 -44
  142. data/lib/pubid/cen_cenelec/builder.rb +29 -61
  143. data/lib/pubid/cen_cenelec/identifier.rb +5 -28
  144. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +4 -9
  145. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +12 -2
  146. data/lib/pubid/cen_cenelec/identifiers/base.rb +46 -5
  147. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -2
  148. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -2
  149. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +27 -6
  150. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +17 -2
  151. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +4 -62
  152. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +7 -20
  153. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -2
  154. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +6 -2
  155. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -2
  156. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -2
  157. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -2
  158. data/lib/pubid/cen_cenelec/parser.rb +1 -1
  159. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  160. data/lib/pubid/cen_cenelec/single_identifier.rb +91 -10
  161. data/lib/pubid/cen_cenelec/supplement_identifier.rb +7 -6
  162. data/lib/pubid/cen_cenelec/urn_generator.rb +7 -7
  163. data/lib/pubid/cen_cenelec.rb +1 -188
  164. data/lib/pubid/cie/builder.rb +24 -149
  165. data/lib/pubid/cie/components/code.rb +72 -0
  166. data/lib/pubid/cie/identifier.rb +5 -20
  167. data/lib/pubid/cie/identifiers/bundle.rb +5 -35
  168. data/lib/pubid/cie/identifiers/conference.rb +6 -11
  169. data/lib/pubid/cie/identifiers/corrigendum.rb +23 -17
  170. data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
  171. data/lib/pubid/cie/identifiers/identical.rb +9 -9
  172. data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
  173. data/lib/pubid/cie/identifiers/standard.rb +8 -43
  174. data/lib/pubid/cie/identifiers/supplement.rb +25 -27
  175. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +3 -7
  176. data/lib/pubid/cie/identifiers.rb +0 -2
  177. data/lib/pubid/cie/parser.rb +6 -55
  178. data/lib/pubid/cie/scheme.rb +64 -0
  179. data/lib/pubid/cie/single_identifier.rb +5 -44
  180. data/lib/pubid/cie/supplement_identifier.rb +16 -29
  181. data/lib/pubid/cie/urn_generator.rb +8 -11
  182. data/lib/pubid/cie.rb +2 -57
  183. data/lib/pubid/components/code.rb +8 -22
  184. data/lib/pubid/components/date.rb +18 -41
  185. data/lib/pubid/components/edition.rb +6 -9
  186. data/lib/pubid/components/language.rb +4 -6
  187. data/lib/pubid/components/locality.rb +1 -10
  188. data/lib/pubid/components/publisher.rb +6 -9
  189. data/lib/pubid/components/stage.rb +14 -5
  190. data/lib/pubid/components/type.rb +15 -5
  191. data/lib/pubid/components/typed_stage.rb +8 -11
  192. data/lib/pubid/components.rb +0 -4
  193. data/lib/pubid/core/update_codes.rb +7 -28
  194. data/lib/pubid/csa/builder.rb +48 -48
  195. data/lib/pubid/csa/composite_identifier.rb +7 -18
  196. data/lib/pubid/csa/identifier.rb +78 -191
  197. data/lib/pubid/csa/identifiers/base.rb +123 -0
  198. data/lib/pubid/csa/identifiers/bundled.rb +9 -25
  199. data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
  200. data/lib/pubid/csa/identifiers/cec.rb +103 -40
  201. data/lib/pubid/csa/identifiers/combined.rb +69 -97
  202. data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
  203. data/lib/pubid/csa/identifiers/package.rb +4 -4
  204. data/lib/pubid/csa/identifiers/series.rb +104 -0
  205. data/lib/pubid/csa/parser.rb +8 -12
  206. data/lib/pubid/csa/scheme.rb +44 -0
  207. data/lib/pubid/csa/single_identifier.rb +5 -94
  208. data/lib/pubid/csa/urn_generator.rb +2 -9
  209. data/lib/pubid/csa/wrapper_identifier.rb +10 -43
  210. data/lib/pubid/csa.rb +1 -56
  211. data/lib/pubid/etsi/builder.rb +4 -13
  212. data/lib/pubid/etsi/components/code.rb +9 -10
  213. data/lib/pubid/etsi/components/version.rb +5 -0
  214. data/lib/pubid/etsi/identifier.rb +12 -2
  215. data/lib/pubid/etsi/identifiers/base.rb +24 -60
  216. data/lib/pubid/etsi/identifiers/etsi_standard.rb +4 -207
  217. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +14 -46
  218. data/lib/pubid/etsi/identifiers.rb +1 -0
  219. data/lib/pubid/etsi/parser.rb +3 -9
  220. data/lib/pubid/etsi/scheme.rb +42 -0
  221. data/lib/pubid/etsi.rb +2 -52
  222. data/lib/pubid/export/data_class_exporter.rb +59 -0
  223. data/lib/pubid/export/exporter.rb +47 -6
  224. data/lib/pubid/export/flavor_exporter.rb +276 -124
  225. data/lib/pubid/export/ieee_exporter.rb +78 -0
  226. data/lib/pubid/export/itu_exporter.rb +66 -0
  227. data/lib/pubid/export/nist_exporter.rb +64 -0
  228. data/lib/pubid/export/registry_exporter.rb +90 -0
  229. data/lib/pubid/export/scheme_exporter.rb +70 -0
  230. data/lib/pubid/export.rb +6 -0
  231. data/lib/pubid/identifier.rb +37 -920
  232. data/lib/pubid/identifier_metadata.rb +1 -1
  233. data/lib/pubid/identifier_registry.rb +198 -0
  234. data/lib/pubid/idf/builder.rb +7 -7
  235. data/lib/pubid/idf/identifier.rb +13 -23
  236. data/lib/pubid/idf/identifiers/amendment.rb +1 -2
  237. data/lib/pubid/idf/identifiers/corrigendum.rb +1 -2
  238. data/lib/pubid/idf/identifiers/international_standard.rb +1 -2
  239. data/lib/pubid/idf/identifiers/reviewed_method.rb +1 -2
  240. data/lib/pubid/idf/parser.rb +5 -6
  241. data/lib/pubid/idf/scheme.rb +61 -0
  242. data/lib/pubid/idf/supplement_identifier.rb +13 -5
  243. data/lib/pubid/idf/urn_generator.rb +39 -4
  244. data/lib/pubid/idf.rb +1 -65
  245. data/lib/pubid/iec/builder.rb +91 -92
  246. data/lib/pubid/iec/components/code.rb +32 -9
  247. data/lib/pubid/iec/components/publisher.rb +1 -1
  248. data/lib/pubid/iec/identifier.rb +8 -328
  249. data/lib/pubid/iec/identifiers/amendment.rb +5 -8
  250. data/lib/pubid/iec/identifiers/base.rb +31 -7
  251. data/lib/pubid/iec/identifiers/component_specification.rb +13 -3
  252. data/lib/pubid/iec/identifiers/conformity_assessment.rb +12 -1
  253. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +30 -29
  254. data/lib/pubid/iec/identifiers/corrigendum.rb +5 -4
  255. data/lib/pubid/iec/identifiers/fragment_identifier.rb +36 -43
  256. data/lib/pubid/iec/identifiers/guide.rb +18 -0
  257. data/lib/pubid/iec/identifiers/international_standard.rb +9 -24
  258. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +3 -2
  259. data/lib/pubid/iec/identifiers/operational_document.rb +13 -3
  260. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +15 -2
  261. data/lib/pubid/iec/identifiers/sheet_identifier.rb +24 -26
  262. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +13 -3
  263. data/lib/pubid/iec/identifiers/systems_reference_document.rb +13 -2
  264. data/lib/pubid/iec/identifiers/technical_report.rb +21 -3
  265. data/lib/pubid/iec/identifiers/technical_specification.rb +21 -3
  266. data/lib/pubid/iec/identifiers/technology_report.rb +12 -1
  267. data/lib/pubid/iec/identifiers/test_report_form.rb +46 -3
  268. data/lib/pubid/iec/identifiers/vap_identifier.rb +34 -33
  269. data/lib/pubid/iec/identifiers/white_paper.rb +13 -3
  270. data/lib/pubid/iec/identifiers/working_document.rb +60 -26
  271. data/lib/pubid/iec/parser.rb +42 -73
  272. data/lib/pubid/iec/scheme.rb +71 -0
  273. data/lib/pubid/iec/single_identifier.rb +23 -15
  274. data/lib/pubid/iec/supplement_identifier.rb +67 -84
  275. data/lib/pubid/iec/urn_generator.rb +143 -195
  276. data/lib/pubid/iec/urn_parser.rb +246 -85
  277. data/lib/pubid/iec.rb +66 -45
  278. data/lib/pubid/ieee/aiee/builder.rb +3 -17
  279. data/lib/pubid/ieee/aiee/identifier.rb +62 -46
  280. data/lib/pubid/ieee/aiee/parser.rb +1 -1
  281. data/lib/pubid/ieee/builder.rb +81 -398
  282. data/lib/pubid/ieee/components/code.rb +0 -8
  283. data/lib/pubid/ieee/components/draft.rb +0 -54
  284. data/lib/pubid/ieee/components/relationship.rb +149 -5
  285. data/lib/pubid/ieee/identifier.rb +11 -3
  286. data/lib/pubid/ieee/identifiers/adopted_standard.rb +14 -62
  287. data/lib/pubid/ieee/identifiers/base.rb +547 -340
  288. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +12 -6
  289. data/lib/pubid/ieee/identifiers/corrigendum.rb +12 -15
  290. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +13 -24
  291. data/lib/pubid/ieee/identifiers/dual_identifier.rb +7 -3
  292. data/lib/pubid/ieee/identifiers/dual_published.rb +7 -58
  293. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +11 -99
  294. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +11 -25
  295. data/lib/pubid/ieee/identifiers/joint_development.rb +15 -66
  296. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +24 -58
  297. data/lib/pubid/ieee/identifiers/nesc/base.rb +19 -90
  298. data/lib/pubid/ieee/identifiers/nesc/draft.rb +5 -20
  299. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +5 -16
  300. data/lib/pubid/ieee/identifiers/nesc/redline.rb +2 -11
  301. data/lib/pubid/ieee/identifiers/nesc/standard.rb +3 -18
  302. data/lib/pubid/ieee/identifiers/nesc.rb +0 -1
  303. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +9 -3
  304. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +6 -29
  305. data/lib/pubid/ieee/identifiers/redlined_standard.rb +11 -4
  306. data/lib/pubid/ieee/identifiers/si_standard.rb +39 -4
  307. data/lib/pubid/ieee/identifiers/standard.rb +2 -5
  308. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +7 -26
  309. data/lib/pubid/ieee/identifiers.rb +1 -2
  310. data/lib/pubid/ieee/ire/builder.rb +6 -7
  311. data/lib/pubid/ieee/ire/identifier.rb +33 -48
  312. data/lib/pubid/ieee/ire/parser.rb +1 -1
  313. data/lib/pubid/ieee/nesc/builder.rb +20 -33
  314. data/lib/pubid/ieee/nesc/parser.rb +15 -16
  315. data/lib/pubid/ieee/parser.rb +44 -462
  316. data/lib/pubid/ieee/scheme.rb +90 -0
  317. data/lib/pubid/ieee/typed_stages.rb +1 -12
  318. data/lib/pubid/ieee/urn_generator.rb +8 -35
  319. data/lib/pubid/ieee.rb +2 -133
  320. data/lib/pubid/ieee_debug.rb +1 -0
  321. data/lib/pubid/iho/builder.rb +2 -2
  322. data/lib/pubid/iho/identifier.rb +17 -5
  323. data/lib/pubid/iho/identifiers/base.rb +30 -64
  324. data/lib/pubid/iho/identifiers/bibliographic.rb +5 -1
  325. data/lib/pubid/iho/identifiers/circular_letter.rb +5 -1
  326. data/lib/pubid/iho/identifiers/miscellaneous.rb +5 -1
  327. data/lib/pubid/iho/identifiers/publication.rb +5 -1
  328. data/lib/pubid/iho/identifiers/standard.rb +5 -1
  329. data/lib/pubid/iho/identifiers.rb +1 -0
  330. data/lib/pubid/iho/parser.rb +4 -4
  331. data/lib/pubid/iho/scheme.rb +29 -0
  332. data/lib/pubid/iho/urn_generator.rb +3 -3
  333. data/lib/pubid/iho.rb +3 -59
  334. data/lib/pubid/iso/builder.rb +57 -68
  335. data/lib/pubid/iso/bundled_identifier.rb +3 -56
  336. data/lib/pubid/iso/combined_identifier.rb +4 -6
  337. data/lib/pubid/iso/components/code.rb +19 -7
  338. data/lib/pubid/iso/components/publisher.rb +8 -10
  339. data/lib/pubid/iso/components.rb +4 -2
  340. data/lib/pubid/iso/identifier.rb +11 -260
  341. data/lib/pubid/iso/identifiers/addendum.rb +6 -9
  342. data/lib/pubid/iso/identifiers/amendment.rb +4 -8
  343. data/lib/pubid/iso/identifiers/base.rb +115 -0
  344. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  345. data/lib/pubid/iso/identifiers/data.rb +1 -0
  346. data/lib/pubid/iso/identifiers/directives.rb +2 -8
  347. data/lib/pubid/iso/identifiers/directives_supplement.rb +26 -55
  348. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  349. data/lib/pubid/iso/identifiers/guide.rb +1 -0
  350. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  351. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  352. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +4 -10
  353. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  354. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  355. data/lib/pubid/iso/identifiers/supplement.rb +3 -11
  356. data/lib/pubid/iso/identifiers/tc_document.rb +15 -44
  357. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  358. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  359. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  360. data/lib/pubid/iso/identifiers.rb +1 -0
  361. data/lib/pubid/iso/parser.rb +19 -43
  362. data/lib/pubid/iso/scheme.rb +187 -0
  363. data/lib/pubid/iso/single_identifier.rb +7 -6
  364. data/lib/pubid/iso/supplement_identifier.rb +3 -29
  365. data/lib/pubid/iso/urn_generator.rb +177 -78
  366. data/lib/pubid/iso/urn_parser.rb +10 -29
  367. data/lib/pubid/iso.rb +2 -188
  368. data/lib/pubid/itu/builder.rb +41 -230
  369. data/lib/pubid/itu/components/code.rb +12 -57
  370. data/lib/pubid/itu/components/sector.rb +4 -15
  371. data/lib/pubid/itu/components/series.rb +4 -0
  372. data/lib/pubid/itu/identifier.rb +51 -2
  373. data/lib/pubid/itu/identifiers/amendment.rb +31 -7
  374. data/lib/pubid/itu/identifiers/annex.rb +4 -13
  375. data/lib/pubid/itu/identifiers/base.rb +128 -456
  376. data/lib/pubid/itu/identifiers/combined_identifier.rb +25 -99
  377. data/lib/pubid/itu/identifiers/corrigendum.rb +25 -16
  378. data/lib/pubid/itu/identifiers/recommendation.rb +4 -3
  379. data/lib/pubid/itu/identifiers/special_publication.rb +3 -3
  380. data/lib/pubid/itu/identifiers/supplement.rb +16 -119
  381. data/lib/pubid/itu/identifiers.rb +1 -10
  382. data/lib/pubid/itu/model.rb +1 -1
  383. data/lib/pubid/itu/parser.rb +27 -481
  384. data/lib/pubid/itu/scheme.rb +174 -0
  385. data/lib/pubid/itu/urn_generator.rb +6 -36
  386. data/lib/pubid/itu.rb +2 -58
  387. data/lib/pubid/jcgm/builder.rb +19 -37
  388. data/lib/pubid/jcgm/identifier.rb +0 -10
  389. data/lib/pubid/jcgm/identifiers/amendment.rb +11 -0
  390. data/lib/pubid/jcgm/identifiers/gum_guide.rb +15 -3
  391. data/lib/pubid/jcgm/identifiers.rb +0 -2
  392. data/lib/pubid/jcgm/parser.rb +7 -74
  393. data/lib/pubid/jcgm/scheme.rb +60 -0
  394. data/lib/pubid/jcgm/single_identifier.rb +14 -84
  395. data/lib/pubid/jcgm/supplement_identifier.rb +4 -39
  396. data/lib/pubid/jcgm/urn_generator.rb +19 -25
  397. data/lib/pubid/jcgm.rb +2 -57
  398. data/lib/pubid/jis/builder.rb +52 -44
  399. data/lib/pubid/jis/components/code.rb +59 -0
  400. data/lib/pubid/{astm → jis}/components.rb +1 -1
  401. data/lib/pubid/jis/identifier.rb +5 -181
  402. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  403. data/lib/pubid/jis/identifiers/base.rb +72 -0
  404. data/lib/pubid/jis/identifiers/standard.rb +1 -2
  405. data/lib/pubid/jis/identifiers/technical_report.rb +1 -2
  406. data/lib/pubid/jis/identifiers/technical_specification.rb +1 -2
  407. data/lib/pubid/jis/identifiers.rb +1 -1
  408. data/lib/pubid/jis/parser.rb +6 -32
  409. data/lib/pubid/jis/scheme.rb +49 -0
  410. data/lib/pubid/jis/single_identifier.rb +12 -6
  411. data/lib/pubid/jis/supplement_identifier.rb +14 -17
  412. data/lib/pubid/jis.rb +2 -48
  413. data/lib/pubid/nist/builder.rb +1765 -146
  414. data/lib/pubid/nist/components/code.rb +20 -9
  415. data/lib/pubid/nist/components/edition.rb +0 -16
  416. data/lib/pubid/nist/components/publisher.rb +24 -0
  417. data/lib/pubid/nist/components/supplement.rb +21 -91
  418. data/lib/pubid/nist/components.rb +1 -0
  419. data/lib/pubid/nist/configuration.rb +2 -12
  420. data/lib/pubid/nist/identifiers/base.rb +417 -662
  421. data/lib/pubid/nist/identifiers/circular.rb +5 -17
  422. data/lib/pubid/nist/identifiers/circular_supplement.rb +6 -16
  423. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -3
  424. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +5 -7
  425. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +5 -18
  426. data/lib/pubid/nist/identifiers/crpl_report.rb +13 -16
  427. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -18
  428. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -3
  429. data/lib/pubid/nist/identifiers/handbook.rb +4 -12
  430. data/lib/pubid/nist/identifiers/internal_report.rb +7 -15
  431. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -3
  432. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +11 -20
  433. data/lib/pubid/nist/identifiers/monograph.rb +11 -22
  434. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  435. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  436. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  437. data/lib/pubid/nist/identifiers/report.rb +10 -19
  438. data/lib/pubid/nist/identifiers/special_publication.rb +2 -12
  439. data/lib/pubid/nist/identifiers/technical_note.rb +3 -4
  440. data/lib/pubid/nist/identifiers.rb +1 -1
  441. data/lib/pubid/nist/parser.rb +429 -97
  442. data/lib/pubid/nist/scheme.rb +199 -0
  443. data/lib/pubid/nist/supplement_identifier.rb +34 -35
  444. data/lib/pubid/nist/urn_generator.rb +8 -14
  445. data/lib/pubid/nist.rb +5 -107
  446. data/lib/pubid/oiml/builder.rb +10 -91
  447. data/lib/pubid/oiml/components/code.rb +0 -17
  448. data/lib/pubid/oiml/identifier.rb +0 -53
  449. data/lib/pubid/oiml/identifiers/annex.rb +46 -13
  450. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  451. data/lib/pubid/oiml/identifiers/basic_publication.rb +0 -2
  452. data/lib/pubid/oiml/identifiers/document.rb +0 -2
  453. data/lib/pubid/oiml/identifiers/expert_report.rb +0 -2
  454. data/lib/pubid/oiml/identifiers/guide.rb +0 -2
  455. data/lib/pubid/oiml/identifiers/recommendation.rb +0 -2
  456. data/lib/pubid/oiml/identifiers/seminar_report.rb +0 -2
  457. data/lib/pubid/oiml/identifiers/vocabulary.rb +0 -2
  458. data/lib/pubid/oiml/identifiers.rb +1 -3
  459. data/lib/pubid/oiml/parser.rb +17 -118
  460. data/lib/pubid/oiml/scheme.rb +46 -0
  461. data/lib/pubid/oiml/single_identifier.rb +43 -66
  462. data/lib/pubid/oiml/supplement_identifier.rb +17 -62
  463. data/lib/pubid/oiml/urn_generator.rb +8 -22
  464. data/lib/pubid/oiml.rb +1 -56
  465. data/lib/pubid/parser.rb +0 -1
  466. data/lib/pubid/parsers/mr_string.rb +7 -120
  467. data/lib/pubid/plateau/builder.rb +4 -8
  468. data/lib/pubid/plateau/identifiers/base.rb +36 -40
  469. data/lib/pubid/plateau/identifiers/handbook.rb +7 -1
  470. data/lib/pubid/plateau/identifiers/technical_report.rb +5 -1
  471. data/lib/pubid/plateau/identifiers.rb +1 -0
  472. data/lib/pubid/plateau/parser.rb +6 -16
  473. data/lib/pubid/plateau/scheme.rb +45 -0
  474. data/lib/pubid/plateau/supplement_identifier.rb +15 -11
  475. data/lib/pubid/plateau.rb +1 -58
  476. data/lib/pubid/renderers/base.rb +0 -47
  477. data/lib/pubid/renderers/directives_renderer.rb +14 -27
  478. data/lib/pubid/renderers/guide_renderer.rb +1 -7
  479. data/lib/pubid/renderers/human_readable.rb +9 -34
  480. data/lib/pubid/renderers/iwa_renderer.rb +1 -5
  481. data/lib/pubid/renderers/mr_string.rb +6 -54
  482. data/lib/pubid/renderers/supplement_renderer.rb +2 -5
  483. data/lib/pubid/renderers.rb +0 -1
  484. data/lib/pubid/rendering/base.rb +73 -0
  485. data/lib/pubid/rendering/common.rb +211 -0
  486. data/lib/pubid/rendering/context.rb +21 -33
  487. data/lib/pubid/rendering/format.rb +25 -0
  488. data/lib/pubid/rendering/numbering.rb +7 -25
  489. data/lib/pubid/rendering/supplement.rb +4 -4
  490. data/lib/pubid/rendering.rb +3 -0
  491. data/lib/pubid/sae/builder.rb +1 -1
  492. data/lib/pubid/sae/components/date.rb +0 -8
  493. data/lib/pubid/sae/components/type.rb +1 -5
  494. data/lib/pubid/sae/identifier.rb +12 -2
  495. data/lib/pubid/sae/identifiers/base.rb +28 -33
  496. data/lib/pubid/sae/identifiers.rb +1 -0
  497. data/lib/pubid/sae/parser.rb +1 -1
  498. data/lib/pubid/sae/scheme.rb +47 -0
  499. data/lib/pubid/sae/urn_generator.rb +10 -2
  500. data/lib/pubid/sae.rb +2 -49
  501. data/lib/pubid/scheme.rb +207 -0
  502. data/lib/pubid/urn_generator/base.rb +12 -12
  503. data/lib/pubid/version.rb +1 -1
  504. data/lib/pubid.rb +10 -424
  505. data/lib/tasks/export.rake +5 -6
  506. data/lib/tasks/website-data.json +1796 -1854
  507. metadata +45 -307
  508. data/data/bipm/update_codes.yaml +0 -9
  509. data/data/nist/series.yaml +0 -155
  510. data/lib/pubid/adobe/builder.rb +0 -52
  511. data/lib/pubid/adobe/identifier.rb +0 -47
  512. data/lib/pubid/adobe/identifiers/publication.rb +0 -31
  513. data/lib/pubid/adobe/identifiers/tech_note.rb +0 -32
  514. data/lib/pubid/adobe/identifiers.rb +0 -10
  515. data/lib/pubid/adobe/parser.rb +0 -136
  516. data/lib/pubid/adobe/renderer.rb +0 -39
  517. data/lib/pubid/adobe/urn_generator.rb +0 -42
  518. data/lib/pubid/adobe/urn_parser.rb +0 -69
  519. data/lib/pubid/adobe.rb +0 -60
  520. data/lib/pubid/amca/renderer.rb +0 -82
  521. data/lib/pubid/amca/urn_parser.rb +0 -28
  522. data/lib/pubid/ansi/renderer.rb +0 -53
  523. data/lib/pubid/ansi/urn_parser.rb +0 -23
  524. data/lib/pubid/api/identifiers.rb +0 -18
  525. data/lib/pubid/api/renderer.rb +0 -98
  526. data/lib/pubid/api/urn_parser.rb +0 -35
  527. data/lib/pubid/ashrae/renderer.rb +0 -117
  528. data/lib/pubid/ashrae/urn_parser.rb +0 -27
  529. data/lib/pubid/asme/renderer.rb +0 -66
  530. data/lib/pubid/asme/urn_parser.rb +0 -31
  531. data/lib/pubid/astm/identifiers/code_number.rb +0 -81
  532. data/lib/pubid/astm/identifiers.rb +0 -19
  533. data/lib/pubid/astm/renderer.rb +0 -172
  534. data/lib/pubid/astm/urn_parser.rb +0 -30
  535. data/lib/pubid/bipm/builder.rb +0 -163
  536. data/lib/pubid/bipm/identifier.rb +0 -285
  537. data/lib/pubid/bipm/identifiers/committee_document.rb +0 -36
  538. data/lib/pubid/bipm/identifiers/guide.rb +0 -35
  539. data/lib/pubid/bipm/identifiers/meeting.rb +0 -53
  540. data/lib/pubid/bipm/identifiers/mep.rb +0 -33
  541. data/lib/pubid/bipm/identifiers/metrologia_article.rb +0 -48
  542. data/lib/pubid/bipm/identifiers/si_brochure.rb +0 -33
  543. data/lib/pubid/bipm/identifiers.rb +0 -15
  544. data/lib/pubid/bipm/parser.rb +0 -237
  545. data/lib/pubid/bipm/renderer.rb +0 -118
  546. data/lib/pubid/bipm/urn_generator.rb +0 -58
  547. data/lib/pubid/bipm/urn_parser.rb +0 -60
  548. data/lib/pubid/bipm.rb +0 -91
  549. data/lib/pubid/bsi/renderer.rb +0 -1064
  550. data/lib/pubid/bsi/urn_parser.rb +0 -52
  551. data/lib/pubid/calconnect/builder.rb +0 -38
  552. data/lib/pubid/calconnect/identifier.rb +0 -121
  553. data/lib/pubid/calconnect/identifiers/standard.rb +0 -29
  554. data/lib/pubid/calconnect/identifiers.rb +0 -9
  555. data/lib/pubid/calconnect/parser.rb +0 -54
  556. data/lib/pubid/calconnect/renderer.rb +0 -36
  557. data/lib/pubid/calconnect/urn_generator.rb +0 -33
  558. data/lib/pubid/calconnect/urn_parser.rb +0 -34
  559. data/lib/pubid/calconnect.rb +0 -82
  560. data/lib/pubid/ccsds/urn_parser.rb +0 -20
  561. data/lib/pubid/cen_cenelec/renderer.rb +0 -261
  562. data/lib/pubid/cen_cenelec/urn_parser.rb +0 -28
  563. data/lib/pubid/cie/identifiers/code_attributes.rb +0 -52
  564. data/lib/pubid/cie/identifiers/proceedings.rb +0 -41
  565. data/lib/pubid/cie/urn_parser.rb +0 -28
  566. data/lib/pubid/components/adoption.rb +0 -104
  567. data/lib/pubid/components/iteration.rb +0 -32
  568. data/lib/pubid/components/relationship.rb +0 -151
  569. data/lib/pubid/components/supplement.rb +0 -184
  570. data/lib/pubid/csa/renderer.rb +0 -300
  571. data/lib/pubid/csa/urn_parser.rb +0 -33
  572. data/lib/pubid/doi/builder.rb +0 -18
  573. data/lib/pubid/doi/identifier.rb +0 -49
  574. data/lib/pubid/doi/identifiers/resource.rb +0 -30
  575. data/lib/pubid/doi/identifiers.rb +0 -9
  576. data/lib/pubid/doi/parser.rb +0 -52
  577. data/lib/pubid/doi/renderer.rb +0 -13
  578. data/lib/pubid/doi.rb +0 -55
  579. data/lib/pubid/easc/builder.rb +0 -55
  580. data/lib/pubid/easc/identifier.rb +0 -59
  581. data/lib/pubid/easc/identifiers/pmg.rb +0 -20
  582. data/lib/pubid/easc/identifiers/rmg.rb +0 -19
  583. data/lib/pubid/easc/identifiers.rb +0 -10
  584. data/lib/pubid/easc/parser.rb +0 -88
  585. data/lib/pubid/easc/renderer.rb +0 -48
  586. data/lib/pubid/easc/urn_generator.rb +0 -46
  587. data/lib/pubid/easc/urn_parser.rb +0 -57
  588. data/lib/pubid/easc.rb +0 -52
  589. data/lib/pubid/ecma/builder.rb +0 -45
  590. data/lib/pubid/ecma/identifier.rb +0 -147
  591. data/lib/pubid/ecma/identifiers/memento.rb +0 -30
  592. data/lib/pubid/ecma/identifiers/standard.rb +0 -31
  593. data/lib/pubid/ecma/identifiers/technical_report.rb +0 -31
  594. data/lib/pubid/ecma/identifiers.rb +0 -11
  595. data/lib/pubid/ecma/parser.rb +0 -76
  596. data/lib/pubid/ecma/renderer.rb +0 -67
  597. data/lib/pubid/ecma/urn_generator.rb +0 -46
  598. data/lib/pubid/ecma/urn_parser.rb +0 -51
  599. data/lib/pubid/ecma.rb +0 -67
  600. data/lib/pubid/errors.rb +0 -79
  601. data/lib/pubid/etsi/renderer.rb +0 -48
  602. data/lib/pubid/etsi/urn_parser.rb +0 -34
  603. data/lib/pubid/gb/builder.rb +0 -45
  604. data/lib/pubid/gb/identifier.rb +0 -67
  605. data/lib/pubid/gb/identifiers/standard.rb +0 -34
  606. data/lib/pubid/gb/identifiers.rb +0 -9
  607. data/lib/pubid/gb/parser.rb +0 -63
  608. data/lib/pubid/gb/renderer.rb +0 -35
  609. data/lib/pubid/gb.rb +0 -87
  610. data/lib/pubid/gost/builder.rb +0 -148
  611. data/lib/pubid/gost/identifier.rb +0 -47
  612. data/lib/pubid/gost/identifiers/foreign_reference.rb +0 -25
  613. data/lib/pubid/gost/identifiers/harmonized.rb +0 -39
  614. data/lib/pubid/gost/identifiers/identical_adoption.rb +0 -39
  615. data/lib/pubid/gost/identifiers/interstate_standard.rb +0 -20
  616. data/lib/pubid/gost/identifiers/national_standard.rb +0 -19
  617. data/lib/pubid/gost/identifiers.rb +0 -13
  618. data/lib/pubid/gost/parser.rb +0 -105
  619. data/lib/pubid/gost/renderer.rb +0 -48
  620. data/lib/pubid/gost/urn_generator.rb +0 -46
  621. data/lib/pubid/gost/urn_parser.rb +0 -52
  622. data/lib/pubid/gost.rb +0 -49
  623. data/lib/pubid/iala/builder.rb +0 -102
  624. data/lib/pubid/iala/identifier.rb +0 -90
  625. data/lib/pubid/iala/identifiers/advice.rb +0 -15
  626. data/lib/pubid/iala/identifiers/annex.rb +0 -57
  627. data/lib/pubid/iala/identifiers/general_assembly.rb +0 -19
  628. data/lib/pubid/iala/identifiers/guideline.rb +0 -17
  629. data/lib/pubid/iala/identifiers/letter.rb +0 -16
  630. data/lib/pubid/iala/identifiers/manual.rb +0 -18
  631. data/lib/pubid/iala/identifiers/model_course.rb +0 -17
  632. data/lib/pubid/iala/identifiers/recommendation.rb +0 -17
  633. data/lib/pubid/iala/identifiers/report.rb +0 -16
  634. data/lib/pubid/iala/identifiers/resolution.rb +0 -16
  635. data/lib/pubid/iala/identifiers/standard.rb +0 -17
  636. data/lib/pubid/iala/identifiers.rb +0 -19
  637. data/lib/pubid/iala/parser.rb +0 -138
  638. data/lib/pubid/iala/renderer.rb +0 -36
  639. data/lib/pubid/iala/urn_generator.rb +0 -49
  640. data/lib/pubid/iala/urn_parser.rb +0 -67
  641. data/lib/pubid/iala.rb +0 -71
  642. data/lib/pubid/iana/builder.rb +0 -22
  643. data/lib/pubid/iana/identifier.rb +0 -140
  644. data/lib/pubid/iana/identifiers/registry.rb +0 -69
  645. data/lib/pubid/iana/identifiers.rb +0 -9
  646. data/lib/pubid/iana/parser.rb +0 -38
  647. data/lib/pubid/iana/renderer.rb +0 -32
  648. data/lib/pubid/iana/urn_generator.rb +0 -19
  649. data/lib/pubid/iana/urn_parser.rb +0 -24
  650. data/lib/pubid/iana.rb +0 -69
  651. data/lib/pubid/idf/renderer.rb +0 -84
  652. data/lib/pubid/idf/urn_parser.rb +0 -25
  653. data/lib/pubid/iec/components.rb +0 -14
  654. data/lib/pubid/iec/identifiers/technical_group.rb +0 -30
  655. data/lib/pubid/iec/identifiers.rb +0 -31
  656. data/lib/pubid/iec/renderer.rb +0 -267
  657. data/lib/pubid/ieee/compaction.rb +0 -121
  658. data/lib/pubid/ieee/identifiers/amendment.rb +0 -40
  659. data/lib/pubid/ieee/identifiers/code_number.rb +0 -82
  660. data/lib/pubid/ieee/identifiers/nesc/edition.rb +0 -32
  661. data/lib/pubid/ieee/pre_parser.rb +0 -301
  662. data/lib/pubid/ieee/renderer.rb +0 -408
  663. data/lib/pubid/ieee/urn_parser.rb +0 -34
  664. data/lib/pubid/ietf/builder.rb +0 -78
  665. data/lib/pubid/ietf/identifier.rb +0 -5
  666. data/lib/pubid/ietf/identifiers/base.rb +0 -72
  667. data/lib/pubid/ietf/identifiers/bcp.rb +0 -36
  668. data/lib/pubid/ietf/identifiers/fyi.rb +0 -36
  669. data/lib/pubid/ietf/identifiers/internet_draft.rb +0 -45
  670. data/lib/pubid/ietf/identifiers/rfc.rb +0 -27
  671. data/lib/pubid/ietf/identifiers/serialization.rb +0 -51
  672. data/lib/pubid/ietf/identifiers/std.rb +0 -36
  673. data/lib/pubid/ietf/identifiers.rb +0 -14
  674. data/lib/pubid/ietf/parser.rb +0 -61
  675. data/lib/pubid/ietf/renderer.rb +0 -64
  676. data/lib/pubid/ietf/urn_generator.rb +0 -37
  677. data/lib/pubid/ietf/urn_parser.rb +0 -43
  678. data/lib/pubid/ietf.rb +0 -85
  679. data/lib/pubid/iho/renderer.rb +0 -30
  680. data/lib/pubid/iho/urn_parser.rb +0 -58
  681. data/lib/pubid/isbn/builder.rb +0 -44
  682. data/lib/pubid/isbn/check_digit.rb +0 -53
  683. data/lib/pubid/isbn/identifier.rb +0 -81
  684. data/lib/pubid/isbn/identifiers/book.rb +0 -30
  685. data/lib/pubid/isbn/identifiers.rb +0 -9
  686. data/lib/pubid/isbn/parser.rb +0 -45
  687. data/lib/pubid/isbn/renderer.rb +0 -16
  688. data/lib/pubid/isbn.rb +0 -52
  689. data/lib/pubid/iso/normalizer.rb +0 -89
  690. data/lib/pubid/itu/components/designation.rb +0 -35
  691. data/lib/pubid/itu/components.rb +0 -12
  692. data/lib/pubid/itu/identifiers/addendum.rb +0 -15
  693. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +0 -87
  694. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +0 -92
  695. data/lib/pubid/itu/identifiers/errata.rb +0 -15
  696. data/lib/pubid/itu/identifiers/handbook.rb +0 -38
  697. data/lib/pubid/itu/identifiers/question.rb +0 -63
  698. data/lib/pubid/itu/identifiers/report.rb +0 -39
  699. data/lib/pubid/itu/identifiers/standard_serialization.rb +0 -58
  700. data/lib/pubid/itu/urn_parser.rb +0 -31
  701. data/lib/pubid/jcgm/identifiers/corrigendum.rb +0 -34
  702. data/lib/pubid/jcgm/identifiers/meeting.rb +0 -47
  703. data/lib/pubid/jcgm/renderer.rb +0 -89
  704. data/lib/pubid/jcgm/urn_parser.rb +0 -177
  705. data/lib/pubid/jis/identifiers/corrigendum.rb +0 -16
  706. data/lib/pubid/jis/renderer.rb +0 -69
  707. data/lib/pubid/jis/urn_parser.rb +0 -23
  708. data/lib/pubid/nist/caster.rb +0 -1234
  709. data/lib/pubid/nist/circular_supplement_builder.rb +0 -293
  710. data/lib/pubid/nist/identifier.rb +0 -8
  711. data/lib/pubid/nist/identifiers/dated_document.rb +0 -49
  712. data/lib/pubid/nist/parser_output_normalizer.rb +0 -233
  713. data/lib/pubid/nist/preprocessor.rb +0 -443
  714. data/lib/pubid/nist/renderer.rb +0 -43
  715. data/lib/pubid/nist/router.rb +0 -149
  716. data/lib/pubid/nist/series/base.rb +0 -58
  717. data/lib/pubid/nist/series/crpl.rb +0 -13
  718. data/lib/pubid/nist/series/fips.rb +0 -14
  719. data/lib/pubid/nist/series/ir.rb +0 -57
  720. data/lib/pubid/nist/series/letter_preserving.rb +0 -15
  721. data/lib/pubid/nist/series/mono.rb +0 -19
  722. data/lib/pubid/nist/series/ncstar.rb +0 -20
  723. data/lib/pubid/nist/series.rb +0 -49
  724. data/lib/pubid/nist/urn_parser.rb +0 -67
  725. data/lib/pubid/oasis/builder.rb +0 -79
  726. data/lib/pubid/oasis/identifier.rb +0 -160
  727. data/lib/pubid/oasis/identifiers/standard.rb +0 -29
  728. data/lib/pubid/oasis/identifiers.rb +0 -9
  729. data/lib/pubid/oasis/parser.rb +0 -34
  730. data/lib/pubid/oasis/renderer.rb +0 -29
  731. data/lib/pubid/oasis/urn_generator.rb +0 -25
  732. data/lib/pubid/oasis/urn_parser.rb +0 -22
  733. data/lib/pubid/oasis.rb +0 -79
  734. data/lib/pubid/ogc/builder.rb +0 -33
  735. data/lib/pubid/ogc/identifier.rb +0 -81
  736. data/lib/pubid/ogc/identifiers/document.rb +0 -26
  737. data/lib/pubid/ogc/identifiers.rb +0 -10
  738. data/lib/pubid/ogc/parser.rb +0 -40
  739. data/lib/pubid/ogc/renderer.rb +0 -33
  740. data/lib/pubid/ogc/urn_generator.rb +0 -14
  741. data/lib/pubid/ogc/urn_parser.rb +0 -22
  742. data/lib/pubid/ogc.rb +0 -71
  743. data/lib/pubid/oiml/identifiers/bulletin.rb +0 -137
  744. data/lib/pubid/oiml/identifiers/code_number.rb +0 -90
  745. data/lib/pubid/oiml/identifiers/errata.rb +0 -15
  746. data/lib/pubid/oiml/renderer.rb +0 -232
  747. data/lib/pubid/oiml/urn_parser.rb +0 -39
  748. data/lib/pubid/omg/builder.rb +0 -19
  749. data/lib/pubid/omg/identifier.rb +0 -47
  750. data/lib/pubid/omg/identifiers/specification.rb +0 -32
  751. data/lib/pubid/omg/identifiers.rb +0 -9
  752. data/lib/pubid/omg/parser.rb +0 -40
  753. data/lib/pubid/omg/renderer.rb +0 -19
  754. data/lib/pubid/omg.rb +0 -51
  755. data/lib/pubid/parser/grammar.rb +0 -74
  756. data/lib/pubid/plateau/identifier.rb +0 -4
  757. data/lib/pubid/plateau/renderer.rb +0 -51
  758. data/lib/pubid/plateau/urn_parser.rb +0 -43
  759. data/lib/pubid/prefixes_support.rb +0 -51
  760. data/lib/pubid/renderers/annotator.rb +0 -233
  761. data/lib/pubid/sae/renderer.rb +0 -36
  762. data/lib/pubid/sae/urn_parser.rb +0 -36
  763. data/lib/pubid/tgpp/builder.rb +0 -41
  764. data/lib/pubid/tgpp/identifier.rb +0 -107
  765. data/lib/pubid/tgpp/identifiers/technical_report.rb +0 -32
  766. data/lib/pubid/tgpp/identifiers/technical_specification.rb +0 -33
  767. data/lib/pubid/tgpp/identifiers.rb +0 -11
  768. data/lib/pubid/tgpp/parser.rb +0 -78
  769. data/lib/pubid/tgpp/renderer.rb +0 -52
  770. data/lib/pubid/tgpp/urn_generator.rb +0 -39
  771. data/lib/pubid/tgpp/urn_parser.rb +0 -30
  772. data/lib/pubid/tgpp.rb +0 -83
  773. data/lib/pubid/type_resolver.rb +0 -59
  774. data/lib/pubid/un/builder.rb +0 -42
  775. data/lib/pubid/un/identifier.rb +0 -40
  776. data/lib/pubid/un/identifiers/document.rb +0 -24
  777. data/lib/pubid/un/identifiers.rb +0 -9
  778. data/lib/pubid/un/parser.rb +0 -25
  779. data/lib/pubid/un/renderer.rb +0 -11
  780. data/lib/pubid/un.rb +0 -46
  781. data/lib/pubid/urn_parser/base.rb +0 -81
  782. data/lib/pubid/urn_parser/errors.rb +0 -16
  783. data/lib/pubid/urn_parser.rb +0 -14
  784. data/lib/pubid/w3c/builder.rb +0 -55
  785. data/lib/pubid/w3c/identifier.rb +0 -130
  786. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +0 -31
  787. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +0 -31
  788. data/lib/pubid/w3c/identifiers/draft_note.rb +0 -31
  789. data/lib/pubid/w3c/identifiers/note.rb +0 -30
  790. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +0 -31
  791. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +0 -31
  792. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +0 -31
  793. data/lib/pubid/w3c/identifiers/recommendation.rb +0 -31
  794. data/lib/pubid/w3c/identifiers/standard.rb +0 -12
  795. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +0 -31
  796. data/lib/pubid/w3c/identifiers/working_draft.rb +0 -30
  797. data/lib/pubid/w3c/identifiers.rb +0 -25
  798. data/lib/pubid/w3c/parser.rb +0 -43
  799. data/lib/pubid/w3c/renderer.rb +0 -35
  800. data/lib/pubid/w3c/urn_generator.rb +0 -18
  801. data/lib/pubid/w3c/urn_parser.rb +0 -36
  802. data/lib/pubid/w3c.rb +0 -67
  803. data/lib/pubid/xsf/builder.rb +0 -17
  804. data/lib/pubid/xsf/identifier.rb +0 -66
  805. data/lib/pubid/xsf/identifiers/xep.rb +0 -31
  806. data/lib/pubid/xsf/identifiers.rb +0 -9
  807. data/lib/pubid/xsf/parser.rb +0 -25
  808. data/lib/pubid/xsf/renderer.rb +0 -23
  809. data/lib/pubid/xsf/urn_generator.rb +0 -13
  810. data/lib/pubid/xsf/urn_parser.rb +0 -18
  811. data/lib/pubid/xsf.rb +0 -81
@@ -2,24 +2,65 @@
2
2
 
3
3
  module Pubid
4
4
  module Export
5
- # Top-level orchestrator. Iterates flavors and delegates to FlavorExporter.
5
+ # Top-level orchestrator. Iterates flavors, selects the appropriate
6
+ # extraction strategy, and produces the combined result.
6
7
  #
7
- # Open/Closed: Adding a new flavor only requires adding it to FLAVORS;
8
- # no existing code changes.
8
+ # Open/Closed: Adding a new flavor only requires registering it in
9
+ # FLAVOR_STRATEGIES; no existing code changes.
9
10
  class Exporter
10
11
  FLAVORS = %i[
11
12
  iso iec ieee nist bsi itu cen_cenelec etsi ansi astm ashrae asme
12
- ccsds cie csa ecma jis jcgm oiml idf api amca plateau sae ogc ietf tgpp w3c xsf
13
- bipm iana oasis calconnect
13
+ ccsds cie csa jis jcgm oiml idf api amca plateau sae
14
14
  ].freeze
15
15
 
16
+ # Maps each flavor to its extraction strategy class.
17
+ # When a flavor follows a new pattern, add a new strategy class here.
18
+ FLAVOR_STRATEGIES = {
19
+ iso: :scheme,
20
+ iec: :scheme,
21
+ ieee: :ieee,
22
+ nist: :nist,
23
+ bsi: :registry,
24
+ itu: :itu,
25
+ cen_cenelec: :registry,
26
+ etsi: :data_class,
27
+ ansi: :scheme,
28
+ astm: :scheme,
29
+ ashrae: :scheme,
30
+ asme: :scheme,
31
+ ccsds: :scheme,
32
+ cie: :scheme,
33
+ csa: :scheme,
34
+ jis: :scheme,
35
+ jcgm: :scheme,
36
+ oiml: :scheme,
37
+ idf: :scheme,
38
+ api: :scheme,
39
+ amca: :scheme,
40
+ plateau: :data_class,
41
+ sae: :scheme,
42
+ }.freeze
43
+
44
+ STRATEGY_CLASSES = {
45
+ scheme: SchemeExporter,
46
+ registry: RegistryExporter,
47
+ data_class: DataClassExporter,
48
+ nist: NistExporter,
49
+ ieee: IeeeExporter,
50
+ itu: ItuExporter,
51
+ }.freeze
52
+
16
53
  # Export all flavors to a hash suitable for JSON serialization.
17
54
  # @return [Hash{String => Hash}]
18
55
  def self.export_all
19
56
  require "pubid"
20
57
 
21
58
  FLAVORS.each_with_object({}) do |flavor, result|
22
- exporter = FlavorExporter.new(flavor)
59
+ strategy_name = FLAVOR_STRATEGIES[flavor]
60
+ strategy_class = STRATEGY_CLASSES[strategy_name]
61
+ next unless strategy_class
62
+
63
+ exporter = strategy_class.new(flavor)
23
64
  flavor_result = exporter.export
24
65
  next unless flavor_result
25
66
 
@@ -4,14 +4,11 @@ require "set"
4
4
 
5
5
  module Pubid
6
6
  module Export
7
- # Unified metadata extractor for all flavors.
7
+ # Abstract base class for per-flavor metadata extraction.
8
+ # Subclasses implement strategy for different Scheme patterns.
8
9
  #
9
- # Uses the self-describing type interface (identifier_types, all_typed_stages,
10
- # locate_type, locate_stage) on each flavor module. No Scheme dependency (Scheme class removed).
11
- #
12
- # Open/Closed: Adding a new flavor requires only adding it to Exporter::FLAVORS.
13
- # Single Responsibility: Extracts metadata from flavor modules into value objects.
14
- # Single Source of Truth: Each identifier class IS the type definition.
10
+ # Open/Closed: New flavors add a subclass; no existing code changes.
11
+ # Single Responsibility: Each subclass extracts data for one Scheme pattern.
15
12
  class FlavorExporter
16
13
  attr_reader :flavor
17
14
 
@@ -25,121 +22,300 @@ module Pubid
25
22
  @flavor = flavor
26
23
  end
27
24
 
25
+ # Subclasses must override
28
26
  def export
29
- mod = flavor_module
30
- return nil unless mod
27
+ raise NotImplementedError
28
+ end
31
29
 
32
- klasses = resolve_identifier_classes(mod)
33
- return nil if klasses.empty?
30
+ protected
34
31
 
35
- fixture_data = fixture_examples
36
- seen_keys = Set.new
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
37
60
 
38
- identifier_types = klasses.filter_map do |klass|
39
- info = extract_type_info(klass)
40
- next if seen_keys.include?(info[:key])
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
41
69
 
42
- seen_keys << info[:key]
70
+ def identifier_classes
71
+ resolve_identifier_classes
72
+ end
43
73
 
44
- stages = extract_typed_stages(klass)
45
- examples = match_examples(fixture_data, info[:key]&.to_s, klass)
74
+ def resolve_identifier_classes
75
+ scheme = scheme_class
76
+ scheme_klasses = []
46
77
 
47
- IdentifierTypeResult.new(
48
- key: info[:key],
49
- title: info[:title],
50
- short: info[:short],
51
- abbr: info[:abbr],
52
- typed_stages: stages,
53
- examples: examples,
54
- )
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]
55
107
  end
56
108
 
57
- FlavorResult.new(
58
- flavor: flavor,
59
- identifier_types: identifier_types,
60
- wrapper_types: extract_wrapper_types,
61
- attributes: extract_attributes(klasses.first),
62
- )
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
63
114
  end
64
115
 
65
- protected
116
+ # Classes to skip when discovering additional identifier types
117
+ SKIP_CLASSES = %w[Base].freeze
66
118
 
67
- # Resolve identifier classes from the flavor module.
68
- # Primary: use the module's self-describing identifier_types method.
69
- # Fallback: scan the Identifiers namespace directly for Pubid::Identifier
70
- # subclasses (handles ETSI, ITU, and other non-standard patterns).
71
- def resolve_identifier_classes(mod)
72
- klasses = mod.identifier_types
73
- return klasses if klasses && !klasses.empty?
119
+ def discover_additional_typed_classes(known_classes,
120
+ known_website_keys = Set.new)
121
+ mod = scheme_module
122
+ return [] unless mod
74
123
 
75
- discover_from_namespace(mod)
76
- end
124
+ idents_mod = mod.const_get(:Identifiers)
125
+ known_set = Set.new(known_classes)
77
126
 
78
- # Scan Identifiers namespace for all Pubid::Identifier subclasses,
79
- # excluding structural base classes.
80
- def discover_from_namespace(mod)
81
- if mod.const_defined?(:Identifiers)
82
- classes = collect_identifier_classes(mod.const_get(:Identifiers))
83
- return classes unless classes.empty?
84
- end
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)
85
141
 
86
- # Single-class flavors (e.g. SAE) expose no concrete types under
87
- # Identifiers — the flavor's own Identifier class IS the sole document
88
- # type (previously discovered via the removed Identifiers::Base alias).
89
- Array(single_class_flavor_type(mod))
142
+ known_website_keys << wkey if wkey
143
+ klass
144
+ end
90
145
  end
91
146
 
92
- # The flavor's own `Identifier` class when it is a concrete
93
- # Pubid::Identifier subclass, else nil (used as the sole type for
94
- # single-class flavors with an empty Identifiers namespace).
95
- def single_class_flavor_type(mod)
96
- return unless mod.const_defined?(:Identifier)
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
97
238
 
98
- ident = mod.const_get(:Identifier)
99
- ident if ident.is_a?(Class) && ident < Pubid::Identifier
100
- end
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
101
252
 
102
- # Recursively collect all Pubid::Identifier subclasses from a module,
103
- # descending into submodules (e.g., IEEE's Nesc namespace).
104
- def collect_identifier_classes(mod)
105
- result = []
106
- mod.constants.each do |c|
107
- const = begin; mod.const_get(c); rescue NameError; next; end
108
- if const.is_a?(Module) && !const.is_a?(Class)
109
- result.concat(collect_identifier_classes(const))
110
- elsif const.is_a?(Class) && const < Pubid::Identifier
111
- result << const
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
112
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
+ }
113
275
  end
114
- result
115
- end
116
276
 
117
- # Map flavor symbol to the flavor module.
118
- def flavor_module
119
- @flavor_module ||= begin
120
- mod_name = flavor.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }
121
- Pubid.const_get(mod_name)
122
- rescue NameError
277
+ type_info = begin
278
+ klass.type
279
+ rescue NoMethodError, NotImplementedError
280
+ nil
281
+ end
282
+ metadata = begin
283
+ klass.metadata
284
+ rescue NoMethodError
123
285
  nil
124
286
  end
125
- end
126
-
127
- def extract_type_info(klass)
128
- type_info = safe_type(klass)
129
- metadata = safe_metadata(klass)
130
287
 
131
- key = type_info&.dig(:web) || type_info&.dig(:key)
288
+ lib_key = type_info&.dig(:key)
132
289
  title = type_info&.dig(:title) || metadata&.title
133
290
  short = type_info&.dig(:short) || metadata&.short
134
291
  abbr = metadata&.abbr || []
135
292
 
136
- unless key
293
+ # Derive from class name when def self.type is missing
294
+ unless lib_key
137
295
  class_name = klass.name&.split("::")&.last
138
- key = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/, "")
296
+ lib_key = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/,
297
+ "")&.to_sym
139
298
  title ||= class_name&.gsub(/([A-Z])/, ' \1')&.strip
140
299
  end
141
300
 
142
- { key: key&.to_s, title: title, short: short, abbr: abbr }
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
143
319
  end
144
320
 
145
321
  def extract_typed_stages(klass)
@@ -150,10 +326,14 @@ module Pubid
150
326
  []
151
327
  end
152
328
 
153
- # Fixture example extraction
329
+ # Map flavor keys to fixture directory names when they differ
330
+ FIXTURE_DIR_ALIASES = {}.freeze
331
+
154
332
  def fixture_examples
333
+ # __dir__ = lib/pubid/export → go up 3 levels to gem root, then spec/fixtures
155
334
  gem_root = File.expand_path("../../..", __dir__)
156
- base = File.join(gem_root, "spec", "fixtures", flavor.to_s, "identifiers",
335
+ dir_name = FIXTURE_DIR_ALIASES[flavor] || flavor.to_s
336
+ base = File.join(gem_root, "spec", "fixtures", dir_name, "identifiers",
157
337
  "pass")
158
338
  return {} unless Dir.exist?(base)
159
339
 
@@ -171,8 +351,10 @@ module Pubid
171
351
  File.readlines(path, chomp: true).each do |line|
172
352
  next if line.start_with?("#") || line.strip.empty?
173
353
 
354
+ # Format: "!Type input!expected" or just "input"
174
355
  if line.start_with?("!")
175
356
  parts = line.split("!")
357
+ # ["", "Type", "input", "expected"] or ["", "Type", "input"]
176
358
  input = parts[2]&.strip
177
359
  identifiers << input if input && !input.empty?
178
360
  else
@@ -182,24 +364,8 @@ module Pubid
182
364
  identifiers.uniq.first(10)
183
365
  end
184
366
 
185
- def match_examples(fixture_data, type_key, klass)
186
- return [] unless type_key
187
-
188
- # Try direct type key match first
189
- examples = fixture_data[type_key] ||
190
- fixture_data[type_key.gsub("_", "")] ||
191
- []
192
-
193
- return examples if examples.any?
194
-
195
- # Try class name match
196
- class_name = klass.name&.split("::")&.last
197
- snake_name = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/, "")
198
- if snake_name && fixture_data.key?(snake_name)
199
- fixture_data[snake_name]
200
- else
201
- []
202
- end
367
+ def map_fixture_key_to_type_key(fixture_key)
368
+ fixture_key
203
369
  end
204
370
 
205
371
  def extract_attributes(klass)
@@ -212,7 +378,7 @@ module Pubid
212
378
  names = WRAPPER_CLASSES[flavor]
213
379
  return [] unless names
214
380
 
215
- mod = flavor_module
381
+ mod = scheme_module
216
382
  return [] unless mod
217
383
 
218
384
  identifiers_mod = mod.const_get(:Identifiers)
@@ -231,20 +397,6 @@ module Pubid
231
397
  nil
232
398
  end
233
399
  end
234
-
235
- private
236
-
237
- def safe_type(klass)
238
- klass.type
239
- rescue NoMethodError, NotImplementedError
240
- nil
241
- end
242
-
243
- def safe_metadata(klass)
244
- klass.metadata
245
- rescue NoMethodError
246
- nil
247
- end
248
400
  end
249
401
  end
250
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