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,198 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "identifier_metadata"
4
+
5
+ module Pubid
6
+ # Global registry of all identifier types across all flavors
7
+ # Provides searchable index for machine-readable lookups
8
+ class IdentifierRegistry
9
+ class << self
10
+ # Register an identifier class with its metadata
11
+ # @param identifier_class [Class] The identifier class
12
+ # @param metadata [Hash] Metadata attributes
13
+ def register(identifier_class, **metadata)
14
+ # Extract class name from full class name
15
+ identifier_class_name = identifier_class.name.to_s.split("::")&.last
16
+
17
+ all_identifiers[identifier_class] = IdentifierMetadata::Metadata.new(
18
+ flavor: metadata.fetch(:flavor),
19
+ identifier_class: identifier_class_name,
20
+ **metadata,
21
+ )
22
+
23
+ # Index by various keys for fast lookup
24
+ index_by_flavor(metadata[:flavor], identifier_class)
25
+ if metadata[:type_key]
26
+ index_by_type_key(metadata[:type_key],
27
+ identifier_class)
28
+ end
29
+ index_by_abbr(metadata[:abbr], identifier_class) if metadata[:abbr]
30
+
31
+ identifier_class
32
+ end
33
+
34
+ # Find identifier class by flavor and type key
35
+ # @param flavor [String, Symbol] The flavor
36
+ # @param type_key [String, Symbol] The type key
37
+ # @return [Class, nil]
38
+ def find_by_type(flavor, type_key)
39
+ flavor_index[flavor.to_s]&.dig(type_key.to_s)
40
+ end
41
+
42
+ # Find identifier class by abbreviation
43
+ # @param flavor [String, Symbol] The flavor
44
+ # @param abbr [String] The abbreviation
45
+ # @return [Array<Class>] All matching classes
46
+ def find_by_abbr(flavor, abbr)
47
+ abbr_index[flavor.to_s]&.dig(abbr.to_s.downcase) || []
48
+ end
49
+
50
+ # Get all identifiers for a flavor
51
+ # @param flavor [String, Symbol] The flavor
52
+ # @return [Array<Class>]
53
+ def all_for_flavor(flavor)
54
+ flavor_index[flavor.to_s]&.values || []
55
+ end
56
+
57
+ # Get all registered identifiers
58
+ # @return [Hash<Class, Metadata>]
59
+ def all_identifiers
60
+ @all_identifiers ||= {}
61
+ end
62
+
63
+ # Get metadata for an identifier class
64
+ # @param identifier_class [Class] The identifier class
65
+ # @return [Metadata, nil]
66
+ def metadata_for(identifier_class)
67
+ all_identifiers[identifier_class]
68
+ end
69
+
70
+ # Search identifiers by criteria
71
+ # @param criteria [Hash] Search criteria
72
+ # @option criteria [String, Symbol] :flavor Filter by flavor
73
+ # @option criteria [String, Symbol] :type_key Filter by type key
74
+ # @option criteria [String] :abbr Filter by abbreviation
75
+ # @option criteria [String] :title Filter by title (partial match)
76
+ # @option criteria [Boolean] :base_class Filter by base class status
77
+ # @option criteria [Boolean] :supplement_class Filter by supplement class status
78
+ # @return [Array<Hash>] Array of {class: Class, metadata: Metadata}
79
+ def search(**criteria)
80
+ results = []
81
+
82
+ all_identifiers.each do |klass, metadata|
83
+ matches = true
84
+
85
+ if criteria[:flavor]
86
+ matches &= metadata.flavor.to_s == criteria[:flavor].to_s
87
+ end
88
+
89
+ if criteria[:type_key]
90
+ matches &= metadata.type_key.to_s == criteria[:type_key].to_s
91
+ end
92
+
93
+ if criteria[:abbr]
94
+ matches &= metadata.abbr.map(&:to_s).map(&:downcase).include?(criteria[:abbr].to_s.downcase)
95
+ end
96
+
97
+ if criteria[:title]
98
+ matches &= metadata.title.to_s.downcase.include?(criteria[:title].to_s.downcase)
99
+ end
100
+
101
+ if criteria[:base_class]
102
+ matches &= !metadata.base_class.nil? == criteria[:base_class]
103
+ end
104
+
105
+ if criteria[:supplement_class]
106
+ matches &= !metadata.supplement_class.nil? == criteria[:supplement_class]
107
+ end
108
+
109
+ results << { class: klass, metadata: metadata } if matches
110
+ end
111
+
112
+ results
113
+ end
114
+
115
+ # Export registry to machine-readable format (JSON)
116
+ # @return [String] JSON representation
117
+ def to_json(*args)
118
+ all_identifiers.values.map(&:to_hash).to_json(*args)
119
+ end
120
+
121
+ # Export registry to machine-readable format (YAML)
122
+ # @return [String] YAML representation
123
+ def to_yaml
124
+ require "json"
125
+ hash = all_identifiers.values.map(&:to_h)
126
+ # Convert to YAML format (basic implementation)
127
+ hash.map(&:to_json).join("\n")
128
+ end
129
+
130
+ # Clear all registrations (useful for testing)
131
+ def clear!
132
+ @all_identifiers = {}
133
+ @flavor_index = nil
134
+ @type_key_index = nil
135
+ @abbr_index = nil
136
+ end
137
+
138
+ # Generate a summary report
139
+ # @return [String] Human-readable summary
140
+ def summary
141
+ flavors = all_identifiers.values.map(&:flavor).uniq.sort
142
+ total = all_identifiers.size
143
+
144
+ summary = "Identifier Registry Summary\n"
145
+ summary += "#{'=' * 50}\n"
146
+ summary += "Total identifiers: #{total}\n"
147
+ summary += "Flavors: #{flavors.join(', ')}\n\n"
148
+
149
+ flavors.each do |flavor|
150
+ flavor_ids = all_identifiers.values.select do |m|
151
+ m.flavor.to_s == flavor
152
+ end
153
+ summary += "#{flavor.upcase} (#{flavor_ids.size}):\n"
154
+ flavor_ids.sort_by(&:type_key).each do |metadata|
155
+ summary += " - #{metadata.type_key}: #{metadata.title}\n"
156
+ end
157
+ end
158
+
159
+ summary
160
+ end
161
+
162
+ private
163
+
164
+ def flavor_index
165
+ @flavor_index ||= Hash.new { |h, k| h[k] = {} }
166
+ end
167
+
168
+ def type_key_index
169
+ @type_key_index ||= Hash.new { |h, k| h[k] = {} }
170
+ end
171
+
172
+ def abbr_index
173
+ @abbr_index ||= Hash.new do |h, k|
174
+ h[k] = Hash.new do |h2, k2|
175
+ h2[k2] = []
176
+ end
177
+ end
178
+ end
179
+
180
+ def index_by_flavor(flavor, identifier_class)
181
+ flavor_index[flavor.to_s][:_all] ||= []
182
+ flavor_index[flavor.to_s][:_all] << identifier_class
183
+ end
184
+
185
+ def index_by_type_key(type_key, identifier_class)
186
+ flavor = all_identifiers[identifier_class].flavor
187
+ flavor_index[flavor.to_s][type_key.to_s] = identifier_class
188
+ end
189
+
190
+ def index_by_abbr(abbr, identifier_class)
191
+ flavor = all_identifiers[identifier_class].flavor
192
+ Array(abbr).each do |a|
193
+ abbr_index[flavor.to_s][a.to_s.downcase] << identifier_class
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Idf
5
+ class Builder < Pubid::Builder::Base
6
+ LANG_CHAR_MAP = {
7
+ "R" => "ru",
8
+ "F" => "fr",
9
+ "E" => "en",
10
+ "A" => "ar",
11
+ "S" => "es",
12
+ "D" => "de",
13
+ }.freeze
14
+
15
+ def build(parsed_hash)
16
+ typed_stage = Scheme.locate_typed_stage_by_abbr(parsed_hash[:type_with_stage])
17
+ identifier = Scheme.locate_identifier_klass_by_type_code(typed_stage.type_code).new
18
+
19
+ if type_with_stage_fr = parsed_hash.delete(:type_with_stage_fr)
20
+ parsed_hash[:type_with_stage] = type_with_stage_fr
21
+ end
22
+
23
+ assign_attributes(identifier, parsed_hash)
24
+ identifier
25
+ end
26
+
27
+ private
28
+
29
+ def default_identifier_class
30
+ Identifiers::InternationalStandard
31
+ end
32
+
33
+ def cast(type, value)
34
+ case type
35
+ when :base_identifier
36
+ build(value)
37
+ when :publisher
38
+ Components::Publisher.new(body: value)
39
+ when :number_with_part
40
+ parts = value.to_s.split("-")
41
+ number = parts.shift
42
+ part = parts.shift
43
+ subpart = parts.size.positive? ? parts.join("-") : nil
44
+ code_hash = { number: Components::Code.new(value: number) }
45
+ code_hash[:part] = Components::Code.new(value: part) if part
46
+ code_hash[:subpart] = Components::Code.new(value: subpart) if subpart
47
+ code_hash
48
+ when :type_with_stage
49
+ iteration = value.to_s.match(/(\d+)$/)
50
+ value = value.to_s.sub(iteration.to_s, "")
51
+ typed_stage = Scheme.locate_typed_stage_by_abbr(value || "")
52
+ {
53
+ stage: typed_stage.to_stage,
54
+ type: typed_stage.to_type,
55
+ typed_stage: typed_stage,
56
+ }
57
+ when :date
58
+ value = value.to_s
59
+ if value.match?(/^\d{4}(-\d{2})?$/)
60
+ year, month = value.split("-")
61
+ Components::Date.new(year: year, month: month || nil)
62
+ elsif value.is_a?(Integer) || (value.is_a?(String) && value.match?(/^\d{4}$/))
63
+ Components::Date.new(year: value)
64
+ else
65
+ raise ArgumentError, "Invalid date format: #{value.inspect}"
66
+ end
67
+ when :languages
68
+ value = value.to_s.gsub("/", ",")
69
+ value.split(",").map do |lang|
70
+ lang = lang.strip
71
+ lang = LANG_CHAR_MAP[lang] if lang.length == 1
72
+ Components::Language.new(code: lang)
73
+ end
74
+ when :all_parts
75
+ Components::Locality.new(all_parts: true)
76
+ else
77
+ raise ArgumentError, "Unknown type: #{type}"
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ # Identifier that
5
+ module Idf
6
+ # An IDF identifier has no copublisher
7
+ class Identifier < ::Pubid::Identifier
8
+ attribute :typed_stage, Components::TypedStage
9
+
10
+ def to_s(lang: :en, lang_single: false, with_edition: false)
11
+ [
12
+ publisher_portion(lang: lang),
13
+ number_portion(lang_single: lang_single),
14
+ ].join
15
+ end
16
+
17
+ def publisher_portion(lang: :en)
18
+ [
19
+ publisher.body,
20
+ (typed_stage.abbreviation.empty? ? "" : "/#{typed_stage.abbreviation}"),
21
+ ].join
22
+ end
23
+
24
+ def number_portion(lang_single: false)
25
+ [
26
+ # Directives may not have a number
27
+ (number ? " #{number.value}" : ""),
28
+
29
+ # Parts and subparts are optional
30
+ (part ? "-#{part.value}" : ""),
31
+ (subpart ? "-#{subpart.value}" : ""),
32
+
33
+ # Stage iteration is optional
34
+ (stage_iteration ? ".#{stage_iteration.value}" : ""),
35
+
36
+ # Date is optional
37
+ (date ? ":#{date.year}" : ""),
38
+
39
+ # Languages are optional
40
+ language_portion(lang_single: lang_single),
41
+ ].join
42
+ end
43
+
44
+ # Returns a string representation of the languages
45
+ # :single returns single-char language codes
46
+ def language_portion(lang_single: false)
47
+ return "" unless languages&.any?
48
+
49
+ [
50
+ "(",
51
+ languages.map do |lang|
52
+ lang.to_s(lang_single: lang_single)
53
+ end.join(lang_single ? "/" : ","),
54
+ ")",
55
+ ].join
56
+ end
57
+
58
+ def self.parse(string)
59
+ parsed = Pubid::Idf::Parser.new.parse(string)
60
+ if parsed.nil? || parsed.empty?
61
+ raise Pubid::Idf::Parser::ParseError,
62
+ "Invalid identifier format"
63
+ end
64
+
65
+ Pubid::Idf::Builder.new.build(parsed)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Idf
5
+ module Identifiers
6
+ class Amendment < SupplementIdentifier
7
+ attribute :type, Components::Type, default: -> { self.class.type[:key] }
8
+
9
+ TYPED_STAGES = [
10
+ Components::TypedStage.new(
11
+ code: :published,
12
+ abbr: ["AMD"],
13
+ short_abbr: "AMD",
14
+ long_abbr: "AMD",
15
+ type_code: :amd,
16
+ stage_code: :published,
17
+ name: "Amendment",
18
+ ),
19
+ ].freeze
20
+
21
+ def self.type
22
+ { key: :amd, title: "Amendment", short: "AMD" }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Idf
5
+ module Identifiers
6
+ class Corrigendum < SupplementIdentifier
7
+ attribute :type, Components::Type, default: -> { self.class.type[:key] }
8
+
9
+ TYPED_STAGES = [
10
+ Components::TypedStage.new(
11
+ code: :published,
12
+ abbr: ["COR"],
13
+ short_abbr: "COR",
14
+ long_abbr: "COR",
15
+ type_code: :cor,
16
+ stage_code: :published,
17
+ name: "Corrigendum",
18
+ ),
19
+ ].freeze
20
+
21
+ def self.type
22
+ { key: :cor, title: "Corrigendum", short: "COR" }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Idf
5
+ module Identifiers
6
+ # International Standard Identifier
7
+ class InternationalStandard < SingleIdentifier
8
+ attribute :type, Components::Type, default: -> { self.class.type[:key] }
9
+
10
+ TYPED_STAGES = [
11
+ Components::TypedStage.new(
12
+ code: :pwiis,
13
+ stage_code: :pwi,
14
+ type_code: :is,
15
+ abbr: ["PWI"],
16
+ name: "Proposed Work Item for International Standard",
17
+ harmonized_stages: %w[00.00 00.20 00.60 00.92 00.93 00.98 00.99],
18
+ ),
19
+ Components::TypedStage.new(
20
+ code: :isnp,
21
+ stage_code: :np,
22
+ type_code: :is,
23
+ abbr: ["NP", "NWIP"],
24
+ name: "New Work Item Proposal for International Standard",
25
+ harmonized_stages: %w[10.00 10.20 10.60 10.92 10.93 10.98],
26
+ ),
27
+ Components::TypedStage.new(
28
+ code: :awiis,
29
+ stage_code: :awi,
30
+ type_code: :is,
31
+ abbr: ["AWI"],
32
+ name: "Approved Work Item for International Standard",
33
+ harmonized_stages: %w[10.99 20.00],
34
+ ),
35
+ Components::TypedStage.new(
36
+ code: :wdis,
37
+ stage_code: :wd,
38
+ type_code: :is,
39
+ abbr: ["WD"],
40
+ name: "Working Draft for International Standard",
41
+ harmonized_stages: %w[20.20 20.60 20.92 20.93 20.98 20.99],
42
+ ),
43
+ Components::TypedStage.new(
44
+ code: :cdis,
45
+ stage_code: :cd,
46
+ type_code: :is,
47
+ abbr: ["CD"],
48
+ name: "Committee Draft for International Standard",
49
+ harmonized_stages: %w[30.00 30.20 30.60 30.92 30.93 30.98 30.99],
50
+ ),
51
+ Components::TypedStage.new(
52
+ code: :fcdis,
53
+ stage_code: :fcd,
54
+ type_code: :is,
55
+ abbr: ["FCD"],
56
+ name: "Final Committee Draft for International Standard",
57
+ harmonized_stages: %w[30.00 30.20 30.60 30.92 30.93 30.98 30.99],
58
+ ),
59
+ Components::TypedStage.new(
60
+ code: :dis,
61
+ stage_code: :dis,
62
+ type_code: :is,
63
+ abbr: ["DIS", "FPD"],
64
+ name: "Draft International Standard",
65
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 40.98 40.99],
66
+ ),
67
+ Components::TypedStage.new(
68
+ code: :fdis,
69
+ stage_code: :fdis,
70
+ type_code: :is,
71
+ abbr: ["FDIS"],
72
+ name: "Final Draft International Standard",
73
+ harmonized_stages: %w[50.00 50.20 50.60 50.92 50.98 50.99],
74
+ ),
75
+ Components::TypedStage.new(
76
+ code: :prfis,
77
+ stage_code: :prf,
78
+ type_code: :is,
79
+ abbr: ["PRF", "Fpr"],
80
+ name: "Proof International Standard",
81
+ harmonized_stages: %w[60.00],
82
+ ),
83
+ Components::TypedStage.new(
84
+ code: :is,
85
+ stage_code: :published,
86
+ type_code: :is,
87
+ abbr: [""],
88
+ name: "International Standard",
89
+ harmonized_stages: %w[60.00 60.60],
90
+ ),
91
+ Components::TypedStage.new(
92
+ code: :wdr,
93
+ stage_code: :wdr,
94
+ type_code: :is,
95
+ abbr: ["WDR"],
96
+ name: "Proposed for Withdrawal",
97
+ harmonized_stages: %w[90.92],
98
+ ),
99
+ Components::TypedStage.new(
100
+ code: :wda,
101
+ stage_code: :wda,
102
+ type_code: :is,
103
+ abbr: ["WDA"],
104
+ name: "Withdrawal Approved",
105
+ harmonized_stages: %w[90.93],
106
+ ),
107
+ Components::TypedStage.new(
108
+ code: :wdar,
109
+ stage_code: :wdar,
110
+ type_code: :is,
111
+ abbr: ["WDAR"],
112
+ name: "Withdrawal Archived",
113
+ harmonized_stages: %w[95.99],
114
+ ),
115
+ ].freeze
116
+
117
+ def self.type
118
+ { key: :is, title: "International Standard", short: nil }
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Idf
5
+ module Identifiers
6
+ class ReviewedMethod < SingleIdentifier
7
+ attribute :type, Components::Type, default: -> { self.class.type[:key] }
8
+ TYPED_STAGES = [
9
+ Components::TypedStage.new(
10
+ code: :pwirm,
11
+ stage_code: :pwi,
12
+ type_code: :rm,
13
+ abbr: ["PWI RM"],
14
+ name: "Proposed Work Item for Reviewed Method",
15
+ harmonized_stages: %w[00.00 00.20 00.60 00.92 00.93 00.98 00.99],
16
+ ),
17
+ Components::TypedStage.new(
18
+ code: :nprm,
19
+ stage_code: :np,
20
+ type_code: :rm,
21
+ abbr: ["NP RM"],
22
+ name: "New Work Item Proposal for Reviewed Method",
23
+ harmonized_stages: %w[10.00 10.20 10.60 10.92 10.93 10.98],
24
+ ),
25
+
26
+ Components::TypedStage.new(
27
+ code: :awirm,
28
+ stage_code: :awi,
29
+ type_code: :rm,
30
+ abbr: ["AWI RM"],
31
+ name: "Approved Work Item for Reviewed Method",
32
+ harmonized_stages: %w[10.99 20.00],
33
+ ),
34
+
35
+ Components::TypedStage.new(
36
+ code: :wdrm,
37
+ stage_code: :wd,
38
+ type_code: :rm,
39
+ abbr: ["WD RM"],
40
+ name: "Working Draft Reviewed Method",
41
+ harmonized_stages: %w[20.20 20.60 20.92 20.93 20.98 20.99],
42
+ ),
43
+
44
+ Components::TypedStage.new(
45
+ code: :cdrm,
46
+ stage_code: :cd,
47
+ type_code: :rm,
48
+ abbr: ["CD RM"],
49
+ name: "Committee Draft Reviewed Method",
50
+ harmonized_stages: %w[30.00 30.20 30.60 30.92 30.93 30.98 30.99],
51
+ ),
52
+ Components::TypedStage.new(
53
+ code: :pdrm,
54
+ stage_code: :cd,
55
+ type_code: :rm,
56
+ abbr: ["PDRM"],
57
+ name: "Proposed Draft Reviewed Method",
58
+ harmonized_stages: %w[30.00 30.20 30.60 30.92 30.93 30.98 30.99],
59
+ ),
60
+
61
+ Components::TypedStage.new(
62
+ code: :drm,
63
+ type_code: :rm,
64
+ abbr: ["DRM"],
65
+ name: "Draft Reviewed Method",
66
+ harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 40.98 40.99],
67
+ ),
68
+ Components::TypedStage.new(
69
+ code: :fdrm,
70
+ type_code: :rm,
71
+ abbr: ["FDRM"],
72
+ name: "Final Draft Reviewed Method",
73
+ harmonized_stages: %w[50.00 50.20 50.60 50.92 50.98 50.99],
74
+ ),
75
+
76
+ Components::TypedStage.new(
77
+ code: :prfrm,
78
+ stage_code: :prf,
79
+ type_code: :rm,
80
+ abbr: ["PRF RM"],
81
+ name: "Proof Reviewed Method",
82
+ harmonized_stages: %w[50.00 50.20 50.60 50.92 50.98 50.99],
83
+ ),
84
+ Components::TypedStage.new(
85
+ code: :pubrm,
86
+ stage_code: :published,
87
+ type_code: :rm,
88
+ abbr: ["RM"],
89
+ name: "Published Reviewed Method",
90
+ harmonized_stages: %w[60.00 60.60],
91
+ ),
92
+ ].freeze
93
+
94
+ def self.type
95
+ { key: :rm, title: "Reviewed Method", short: "RM" }
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Idf
5
+ module Identifiers
6
+ autoload :Amendment, "#{__dir__}/identifiers/amendment"
7
+ autoload :Corrigendum, "#{__dir__}/identifiers/corrigendum"
8
+ autoload :InternationalStandard,
9
+ "#{__dir__}/identifiers/international_standard"
10
+ autoload :ReviewedMethod, "#{__dir__}/identifiers/reviewed_method"
11
+ end
12
+ end
13
+ end