pubid 1.15.19 → 2.0.0.pre.alpha.2

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 (604) 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 +89 -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 +57 -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 +55 -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 +68 -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 +57 -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 +61 -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 +92 -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 +87 -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 +84 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +89 -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 +77 -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 +52 -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 +71 -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/factory.rb +50 -0
  219. data/lib/pubid/components/language.rb +37 -0
  220. data/lib/pubid/components/locality.rb +10 -0
  221. data/lib/pubid/components/publisher.rb +36 -0
  222. data/lib/pubid/components/stage.rb +54 -0
  223. data/lib/pubid/components/type.rb +58 -0
  224. data/lib/pubid/components/typed_stage.rb +59 -0
  225. data/lib/pubid/components.rb +16 -0
  226. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  227. data/lib/pubid/core/update_codes.rb +77 -0
  228. data/lib/pubid/core.rb +8 -0
  229. data/lib/pubid/csa/builder.rb +671 -0
  230. data/lib/pubid/csa/components/code.rb +9 -0
  231. data/lib/pubid/csa/components.rb +9 -0
  232. data/lib/pubid/csa/composite_identifier.rb +27 -0
  233. data/lib/pubid/csa/identifier.rb +513 -0
  234. data/lib/pubid/csa/identifiers/base.rb +133 -0
  235. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  236. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  237. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  238. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  239. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  240. data/lib/pubid/csa/identifiers/package.rb +65 -0
  241. data/lib/pubid/csa/identifiers/series.rb +127 -0
  242. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  243. data/lib/pubid/csa/identifiers.rb +17 -0
  244. data/lib/pubid/csa/parser.rb +445 -0
  245. data/lib/pubid/csa/scheme.rb +44 -0
  246. data/lib/pubid/csa/single_identifier.rb +30 -0
  247. data/lib/pubid/csa/urn_generator.rb +80 -0
  248. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  249. data/lib/pubid/csa.rb +25 -0
  250. data/lib/pubid/etsi/builder.rb +133 -0
  251. data/lib/pubid/etsi/components/code.rb +42 -0
  252. data/lib/pubid/etsi/components/version.rb +37 -0
  253. data/lib/pubid/etsi/components.rb +10 -0
  254. data/lib/pubid/etsi/identifier.rb +57 -0
  255. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  256. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  257. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  258. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  259. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  260. data/lib/pubid/etsi/identifiers.rb +14 -0
  261. data/lib/pubid/etsi/parser.rb +133 -0
  262. data/lib/pubid/etsi/scheme.rb +42 -0
  263. data/lib/pubid/etsi/urn_generator.rb +76 -0
  264. data/lib/pubid/etsi.rb +21 -0
  265. data/lib/pubid/export/auditor.rb +89 -0
  266. data/lib/pubid/export/data_class_exporter.rb +59 -0
  267. data/lib/pubid/export/exporter.rb +74 -0
  268. data/lib/pubid/export/flavor_exporter.rb +402 -0
  269. data/lib/pubid/export/ieee_exporter.rb +78 -0
  270. data/lib/pubid/export/itu_exporter.rb +66 -0
  271. data/lib/pubid/export/nist_exporter.rb +64 -0
  272. data/lib/pubid/export/registry_exporter.rb +90 -0
  273. data/lib/pubid/export/result.rb +97 -0
  274. data/lib/pubid/export/scheme_exporter.rb +70 -0
  275. data/lib/pubid/export.rb +18 -0
  276. data/lib/pubid/format_detector.rb +16 -0
  277. data/lib/pubid/format_registry.rb +42 -0
  278. data/lib/pubid/identifier.rb +242 -0
  279. data/lib/pubid/identifier_metadata.rb +148 -0
  280. data/lib/pubid/identifier_registry.rb +198 -0
  281. data/lib/pubid/idf/builder.rb +82 -0
  282. data/lib/pubid/idf/identifier.rb +129 -0
  283. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  284. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  285. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  286. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  287. data/lib/pubid/idf/identifiers.rb +13 -0
  288. data/lib/pubid/idf/parser.rb +143 -0
  289. data/lib/pubid/idf/scheme.rb +61 -0
  290. data/lib/pubid/idf/single_identifier.rb +19 -0
  291. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  292. data/lib/pubid/idf/urn_generator.rb +84 -0
  293. data/lib/pubid/idf.rb +25 -0
  294. data/lib/pubid/iec/builder.rb +458 -0
  295. data/lib/pubid/iec/components/code.rb +60 -0
  296. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  297. data/lib/pubid/iec/components/publisher.rb +36 -0
  298. data/lib/pubid/iec/components/sheet.rb +32 -0
  299. data/lib/pubid/iec/components/trf_info.rb +38 -0
  300. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  301. data/lib/pubid/iec/identifier.rb +256 -0
  302. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  303. data/lib/pubid/iec/identifiers/base.rb +82 -0
  304. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  305. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  306. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +82 -0
  307. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  308. data/lib/pubid/iec/identifiers/fragment_identifier.rb +137 -0
  309. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  310. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  311. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  312. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  313. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  314. data/lib/pubid/iec/identifiers/sheet_identifier.rb +62 -0
  315. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  316. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  317. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  319. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  320. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  321. data/lib/pubid/iec/identifiers/vap_identifier.rb +73 -0
  322. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  323. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  324. data/lib/pubid/iec/parser.rb +417 -0
  325. data/lib/pubid/iec/rendering_style.rb +113 -0
  326. data/lib/pubid/iec/scheme.rb +71 -0
  327. data/lib/pubid/iec/single_identifier.rb +80 -0
  328. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  329. data/lib/pubid/iec/urn_generator.rb +79 -0
  330. data/lib/pubid/iec/urn_parser.rb +90 -0
  331. data/lib/pubid/iec.rb +85 -0
  332. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  333. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  334. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  335. data/lib/pubid/ieee/aiee.rb +11 -0
  336. data/lib/pubid/ieee/builder.rb +1237 -0
  337. data/lib/pubid/ieee/components/code.rb +102 -0
  338. data/lib/pubid/ieee/components/draft.rb +93 -0
  339. data/lib/pubid/ieee/components/relationship.rb +157 -0
  340. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  341. data/lib/pubid/ieee/identifier.rb +54 -0
  342. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  343. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  344. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  345. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  346. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  347. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  348. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  349. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  350. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  351. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  352. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  353. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  354. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  355. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  356. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  358. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  359. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  360. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  361. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  362. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  363. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  364. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  365. data/lib/pubid/ieee/identifiers.rb +33 -0
  366. data/lib/pubid/ieee/ire/builder.rb +61 -0
  367. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  368. data/lib/pubid/ieee/ire/parser.rb +91 -0
  369. data/lib/pubid/ieee/ire.rb +11 -0
  370. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  371. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  372. data/lib/pubid/ieee/nesc.rb +10 -0
  373. data/lib/pubid/ieee/parser.rb +1226 -0
  374. data/lib/pubid/ieee/scheme.rb +90 -0
  375. data/lib/pubid/ieee/typed_stages.rb +172 -0
  376. data/lib/pubid/ieee/urn_generator.rb +188 -0
  377. data/lib/pubid/ieee.rb +32 -0
  378. data/lib/pubid/ieee_debug.rb +31 -0
  379. data/lib/pubid/iho/builder.rb +37 -0
  380. data/lib/pubid/iho/identifier.rb +61 -0
  381. data/lib/pubid/iho/identifiers/base.rb +41 -0
  382. data/lib/pubid/iho/identifiers/bibliographic.rb +16 -0
  383. data/lib/pubid/iho/identifiers/circular_letter.rb +15 -0
  384. data/lib/pubid/iho/identifiers/miscellaneous.rb +16 -0
  385. data/lib/pubid/iho/identifiers/publication.rb +15 -0
  386. data/lib/pubid/iho/identifiers/standard.rb +15 -0
  387. data/lib/pubid/iho/identifiers.rb +14 -0
  388. data/lib/pubid/iho/parser.rb +68 -0
  389. data/lib/pubid/iho/scheme.rb +29 -0
  390. data/lib/pubid/iho/urn_generator.rb +29 -0
  391. data/lib/pubid/iho.rb +21 -0
  392. data/lib/pubid/iso/builder.rb +309 -0
  393. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  394. data/lib/pubid/iso/combined_identifier.rb +22 -0
  395. data/lib/pubid/iso/components/code.rb +36 -0
  396. data/lib/pubid/iso/components/publisher.rb +60 -0
  397. data/lib/pubid/iso/components.rb +12 -0
  398. data/lib/pubid/iso/format_resolver.rb +45 -0
  399. data/lib/pubid/iso/identifier.rb +330 -0
  400. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  401. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  402. data/lib/pubid/iso/identifiers/base.rb +115 -0
  403. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  404. data/lib/pubid/iso/identifiers/data.rb +76 -0
  405. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  406. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  407. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  408. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  409. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  410. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  411. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  412. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  413. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  414. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  415. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  416. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  417. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  418. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  419. data/lib/pubid/iso/identifiers.rb +33 -0
  420. data/lib/pubid/iso/parser.rb +512 -0
  421. data/lib/pubid/iso/rendering_style.rb +120 -0
  422. data/lib/pubid/iso/scheme.rb +193 -0
  423. data/lib/pubid/iso/single_identifier.rb +64 -0
  424. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  425. data/lib/pubid/iso/urn_generator.rb +426 -0
  426. data/lib/pubid/iso/urn_parser.rb +437 -0
  427. data/lib/pubid/iso/utilities.rb +86 -0
  428. data/lib/pubid/iso.rb +50 -0
  429. data/lib/pubid/itu/builder.rb +171 -0
  430. data/lib/pubid/itu/components/code.rb +39 -0
  431. data/lib/pubid/itu/components/sector.rb +35 -0
  432. data/lib/pubid/itu/components/series.rb +29 -0
  433. data/lib/pubid/itu/i18n.rb +9 -0
  434. data/lib/pubid/itu/i18n.yaml +30 -0
  435. data/lib/pubid/itu/identifier.rb +118 -0
  436. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  437. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  438. data/lib/pubid/itu/identifiers/base.rb +154 -0
  439. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  440. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  441. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  442. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  443. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  444. data/lib/pubid/itu/identifiers.rb +16 -0
  445. data/lib/pubid/itu/model.rb +111 -0
  446. data/lib/pubid/itu/parser.rb +225 -0
  447. data/lib/pubid/itu/scheme.rb +174 -0
  448. data/lib/pubid/itu/urn_generator.rb +105 -0
  449. data/lib/pubid/itu.rb +22 -0
  450. data/lib/pubid/jcgm/builder.rb +88 -0
  451. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  452. data/lib/pubid/jcgm/components.rb +9 -0
  453. data/lib/pubid/jcgm/identifier.rb +54 -0
  454. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  455. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  456. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  457. data/lib/pubid/jcgm/identifiers.rb +11 -0
  458. data/lib/pubid/jcgm/parser.rb +84 -0
  459. data/lib/pubid/jcgm/scheme.rb +60 -0
  460. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  461. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  462. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  463. data/lib/pubid/jcgm.rb +31 -0
  464. data/lib/pubid/jis/builder.rb +124 -0
  465. data/lib/pubid/jis/components/code.rb +59 -0
  466. data/lib/pubid/jis/components.rb +9 -0
  467. data/lib/pubid/jis/identifier.rb +61 -0
  468. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  469. data/lib/pubid/jis/identifiers/base.rb +72 -0
  470. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  471. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  472. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  473. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  474. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  475. data/lib/pubid/jis/identifiers.rb +17 -0
  476. data/lib/pubid/jis/parser.rb +109 -0
  477. data/lib/pubid/jis/scheme.rb +49 -0
  478. data/lib/pubid/jis/single_identifier.rb +37 -0
  479. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  480. data/lib/pubid/jis/urn_generator.rb +25 -0
  481. data/lib/pubid/jis.rb +23 -0
  482. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  483. data/lib/pubid/nist/builder.rb +2269 -0
  484. data/lib/pubid/nist/components/code.rb +38 -0
  485. data/lib/pubid/nist/components/edition.rb +134 -0
  486. data/lib/pubid/nist/components/issue_number.rb +28 -0
  487. data/lib/pubid/nist/components/part.rb +77 -0
  488. data/lib/pubid/nist/components/publisher.rb +24 -0
  489. data/lib/pubid/nist/components/stage.rb +53 -0
  490. data/lib/pubid/nist/components/supplement.rb +188 -0
  491. data/lib/pubid/nist/components/translation.rb +42 -0
  492. data/lib/pubid/nist/components/update.rb +103 -0
  493. data/lib/pubid/nist/components/version.rb +35 -0
  494. data/lib/pubid/nist/components/volume.rb +32 -0
  495. data/lib/pubid/nist/components.rb +19 -0
  496. data/lib/pubid/nist/configuration.rb +77 -0
  497. data/lib/pubid/nist/identifier.rb +62 -0
  498. data/lib/pubid/nist/identifiers/base.rb +578 -0
  499. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  500. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  501. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  502. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  503. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  504. data/lib/pubid/nist/identifiers/crpl_report.rb +132 -0
  505. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +104 -0
  506. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  507. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  508. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  509. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  510. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  511. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  512. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  513. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  514. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  515. data/lib/pubid/nist/identifiers/report.rb +67 -0
  516. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  517. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  518. data/lib/pubid/nist/identifiers.rb +33 -0
  519. data/lib/pubid/nist/parser.rb +1117 -0
  520. data/lib/pubid/nist/scheme.rb +199 -0
  521. data/lib/pubid/nist/supplement_identifier.rb +67 -0
  522. data/lib/pubid/nist/urn_generator.rb +133 -0
  523. data/lib/pubid/nist.rb +37 -0
  524. data/lib/pubid/oiml/builder.rb +189 -0
  525. data/lib/pubid/oiml/components/code.rb +20 -0
  526. data/lib/pubid/oiml/components.rb +9 -0
  527. data/lib/pubid/oiml/identifier.rb +61 -0
  528. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  529. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  530. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  531. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  536. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  537. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  538. data/lib/pubid/oiml/identifiers.rb +18 -0
  539. data/lib/pubid/oiml/parser.rb +173 -0
  540. data/lib/pubid/oiml/scheme.rb +46 -0
  541. data/lib/pubid/oiml/single_identifier.rb +90 -0
  542. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  543. data/lib/pubid/oiml/urn_generator.rb +64 -0
  544. data/lib/pubid/oiml.rb +26 -0
  545. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  546. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  547. data/lib/pubid/parser.rb +8 -0
  548. data/lib/pubid/parsers/base.rb +11 -0
  549. data/lib/pubid/parsers/mr_string.rb +93 -0
  550. data/lib/pubid/plateau/builder.rb +50 -0
  551. data/lib/pubid/plateau/identifier.rb +57 -0
  552. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  553. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  554. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  555. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  556. data/lib/pubid/plateau/identifiers.rb +12 -0
  557. data/lib/pubid/plateau/parser.rb +63 -0
  558. data/lib/pubid/plateau/scheme.rb +45 -0
  559. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  560. data/lib/pubid/plateau/urn_generator.rb +29 -0
  561. data/lib/pubid/plateau.rb +26 -0
  562. data/lib/pubid/renderers/base.rb +53 -0
  563. data/lib/pubid/renderers/directives_renderer.rb +61 -0
  564. data/lib/pubid/renderers/guide_renderer.rb +24 -0
  565. data/lib/pubid/renderers/human_readable.rb +70 -0
  566. data/lib/pubid/renderers/iwa_renderer.rb +20 -0
  567. data/lib/pubid/renderers/mr_string.rb +16 -0
  568. data/lib/pubid/renderers/supplement_renderer.rb +36 -0
  569. data/lib/pubid/renderers/urn.rb +11 -0
  570. data/lib/pubid/renderers.rb +14 -0
  571. data/lib/pubid/rendering/base.rb +73 -0
  572. data/lib/pubid/rendering/common.rb +211 -0
  573. data/lib/pubid/rendering/context.rb +159 -0
  574. data/lib/pubid/rendering/date.rb +27 -0
  575. data/lib/pubid/rendering/format.rb +25 -0
  576. data/lib/pubid/rendering/language.rb +21 -0
  577. data/lib/pubid/rendering/numbering.rb +24 -0
  578. data/lib/pubid/rendering/publisher.rb +25 -0
  579. data/lib/pubid/rendering/stage.rb +38 -0
  580. data/lib/pubid/rendering/supplement.rb +46 -0
  581. data/lib/pubid/rendering.rb +16 -0
  582. data/lib/pubid/sae/builder.rb +32 -0
  583. data/lib/pubid/sae/components/code.rb +9 -0
  584. data/lib/pubid/sae/components/date.rb +19 -0
  585. data/lib/pubid/sae/components/type.rb +19 -0
  586. data/lib/pubid/sae/components.rb +11 -0
  587. data/lib/pubid/sae/identifier.rb +37 -0
  588. data/lib/pubid/sae/identifiers/base.rb +42 -0
  589. data/lib/pubid/sae/identifiers.rb +9 -0
  590. data/lib/pubid/sae/parser.rb +55 -0
  591. data/lib/pubid/sae/scheme.rb +47 -0
  592. data/lib/pubid/sae/urn_generator.rb +38 -0
  593. data/lib/pubid/sae.rb +19 -0
  594. data/lib/pubid/scheme.rb +219 -0
  595. data/lib/pubid/urn_generator/base.rb +110 -0
  596. data/lib/pubid/utils/string_normalizer.rb +196 -0
  597. data/lib/pubid/utils.rb +7 -0
  598. data/lib/pubid/version.rb +3 -1
  599. data/lib/pubid.rb +137 -13
  600. data/lib/tasks/docs.rake +37 -0
  601. data/lib/tasks/export.rake +38 -0
  602. data/lib/tasks/website-data.json +7488 -0
  603. metadata +616 -171
  604. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Export
5
+ # Immutable value object representing extracted metadata for one identifier type.
6
+ # Encapsulates all data needed by the website for a single doc type entry.
7
+ class IdentifierTypeResult
8
+ attr_reader :key, :title, :short, :abbr, :typed_stages, :examples
9
+
10
+ def initialize(key:, title:, short: nil, abbr: [], typed_stages: [],
11
+ examples: [])
12
+ @key = key.to_s
13
+ @title = title
14
+ @short = short
15
+ @abbr = Array(abbr).map(&:to_s)
16
+ @typed_stages = typed_stages.map do |ts|
17
+ TypedStageResult.from_typed_stage(ts)
18
+ end
19
+ @examples = examples
20
+ freeze
21
+ end
22
+
23
+ def to_h
24
+ {
25
+ key: @key,
26
+ title: @title,
27
+ short: @short,
28
+ abbr: @abbr,
29
+ typed_stages: @typed_stages.map(&:to_h),
30
+ examples: @examples,
31
+ }
32
+ end
33
+ alias to_hash to_h
34
+ end
35
+
36
+ # Immutable value object for a single typed stage.
37
+ class TypedStageResult
38
+ attr_reader :stage_code, :type_code, :abbr, :name, :harmonized_stages
39
+
40
+ def initialize(stage_code:, type_code:, abbr:, name:, harmonized_stages:)
41
+ @stage_code = stage_code.to_s
42
+ @type_code = type_code.to_s
43
+ @abbr = Array(abbr).map(&:to_s)
44
+ @name = name
45
+ @harmonized_stages = Array(harmonized_stages).map(&:to_s)
46
+ freeze
47
+ end
48
+
49
+ def self.from_typed_stage(ts)
50
+ new(
51
+ stage_code: ts.stage_code,
52
+ type_code: ts.type_code,
53
+ abbr: ts.abbr,
54
+ name: ts.is_a?(Pubid::Components::TypedStage) ? ts.name : nil,
55
+ harmonized_stages: ts.is_a?(Pubid::Components::TypedStage) ? ts.harmonized_stages : [],
56
+ )
57
+ end
58
+
59
+ def to_h
60
+ {
61
+ stage_code: @stage_code,
62
+ type_code: @type_code,
63
+ abbr: @abbr,
64
+ name: @name,
65
+ harmonized_stages: @harmonized_stages,
66
+ }
67
+ end
68
+ end
69
+
70
+ # Immutable value object for extracted flavor metadata.
71
+ class FlavorResult
72
+ attr_reader :flavor, :identifier_types, :wrapper_types, :attributes
73
+
74
+ def initialize(flavor:, identifier_types:, wrapper_types: [],
75
+ attributes: [])
76
+ @flavor = flavor.to_s
77
+ @identifier_types = identifier_types
78
+ @wrapper_types = wrapper_types
79
+ @attributes = attributes
80
+ freeze
81
+ end
82
+
83
+ def to_h
84
+ h = {
85
+ identifier_types: @identifier_types.map(&:to_h),
86
+ attributes: @attributes,
87
+ }
88
+ unless @wrapper_types.empty?
89
+ h[:wrapper_types] =
90
+ @wrapper_types.map(&:to_h)
91
+ end
92
+ h
93
+ end
94
+ alias to_hash to_h
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Export
5
+ # Strategy for flavors using Scheme with class-level identifiers method
6
+ # and def self.type / TYPED_STAGES patterns.
7
+ #
8
+ # Covers: ISO, IEC, ASTM, ASHRAE, ASME, CCSDS, CIE, CSA, JIS, JCGM,
9
+ # OIML, IDF, API, SAE, NIST, IEEE
10
+ class SchemeExporter < FlavorExporter
11
+ def export
12
+ klasses = identifier_classes
13
+ return nil if klasses.empty?
14
+
15
+ fixture_data = fixture_examples
16
+
17
+ identifier_types = klasses.filter_map do |klass|
18
+ info = extract_type_info(klass)
19
+ stages = extract_typed_stages(klass)
20
+ type_key = info[:key]&.to_s
21
+
22
+ # Match fixture examples to this type
23
+ examples = match_examples(fixture_data, type_key, klass)
24
+
25
+ IdentifierTypeResult.new(
26
+ key: info[:key],
27
+ title: info[:title],
28
+ short: info[:short],
29
+ abbr: info[:abbr],
30
+ typed_stages: stages,
31
+ examples: examples,
32
+ )
33
+ end
34
+
35
+ all_attrs = klasses.first ? extract_attributes(klasses.first) : []
36
+ wrapper_types = extract_wrapper_types
37
+
38
+ FlavorResult.new(
39
+ flavor: flavor,
40
+ identifier_types: identifier_types,
41
+ wrapper_types: wrapper_types,
42
+ attributes: all_attrs,
43
+ )
44
+ end
45
+
46
+ private
47
+
48
+ def match_examples(fixture_data, type_key, klass)
49
+ return [] unless type_key
50
+
51
+ # Try direct type key match first
52
+ examples = fixture_data[map_fixture_key_to_type_key(type_key)] ||
53
+ fixture_data[map_fixture_key_to_type_key(type_key.gsub("_",
54
+ ""))] ||
55
+ []
56
+
57
+ return examples if examples.any?
58
+
59
+ # Try class name match
60
+ class_name = klass.name&.split("::")&.last
61
+ snake_name = class_name&.gsub(/([A-Z])/, '_\1')&.downcase&.sub(/^_/, "")
62
+ if snake_name && fixture_data.key?(snake_name)
63
+ fixture_data[snake_name]
64
+ else
65
+ []
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Export
5
+ autoload :IdentifierTypeResult, "#{__dir__}/export/result"
6
+ autoload :TypedStageResult, "#{__dir__}/export/result"
7
+ autoload :FlavorResult, "#{__dir__}/export/result"
8
+ autoload :FlavorExporter, "#{__dir__}/export/flavor_exporter"
9
+ autoload :SchemeExporter, "#{__dir__}/export/scheme_exporter"
10
+ autoload :IeeeExporter, "#{__dir__}/export/ieee_exporter"
11
+ autoload :RegistryExporter, "#{__dir__}/export/registry_exporter"
12
+ autoload :DataClassExporter, "#{__dir__}/export/data_class_exporter"
13
+ autoload :NistExporter, "#{__dir__}/export/nist_exporter"
14
+ autoload :ItuExporter, "#{__dir__}/export/itu_exporter"
15
+ autoload :Auditor, "#{__dir__}/export/auditor"
16
+ autoload :Exporter, "#{__dir__}/export/exporter"
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module FormatDetector
5
+ URN_PATTERN = /\Aurn:/i
6
+ MR_STRING_PATTERN = /\A[A-Z]{2,}[.-]/
7
+
8
+ def self.detect(string)
9
+ case string
10
+ when URN_PATTERN then :urn
11
+ when MR_STRING_PATTERN then :mr_string
12
+ else :human
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ class FormatRegistry
5
+ attr_reader :formats
6
+
7
+ def initialize(parent: nil)
8
+ @formats = {}
9
+ @parent = parent
10
+ end
11
+
12
+ def register(format, renderer: nil, parser: nil)
13
+ @formats[format.to_sym] = { renderer:, parser: }
14
+ end
15
+
16
+ def renderer_for(format)
17
+ entry = @formats[format.to_sym]
18
+ return entry[:renderer] if entry && entry[:renderer]
19
+ return @parent.renderer_for(format) if @parent
20
+
21
+ nil
22
+ end
23
+
24
+ def parser_for(format)
25
+ entry = @formats[format.to_sym]
26
+ return entry[:parser] if entry && entry[:parser]
27
+ return @parent.parser_for(format) if @parent
28
+
29
+ nil
30
+ end
31
+
32
+ def registered_formats
33
+ formats = @formats.keys
34
+ formats |= @parent.registered_formats if @parent
35
+ formats
36
+ end
37
+
38
+ def has?(format)
39
+ @formats.key?(format.to_sym) || (@parent&.has?(format) || false)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,242 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "components/code"
4
+ require_relative "components/date"
5
+ require_relative "components/edition"
6
+ require_relative "components/language"
7
+ require_relative "components/locality"
8
+ require_relative "components/publisher"
9
+ require_relative "components/stage"
10
+ require_relative "components/type"
11
+
12
+ module Pubid
13
+ class Identifier < Lutaml::Model::Serializable
14
+ class << self
15
+ def format_registry
16
+ @format_registry || superclass&.format_registry
17
+ end
18
+
19
+ attr_writer :format_registry
20
+ end
21
+
22
+ attribute :_type, :string, polymorphic_class: true
23
+ attribute :number, Components::Code
24
+ attribute :part, Components::Code
25
+ attribute :subpart, Components::Code
26
+ attribute :stage_iteration, Components::Code
27
+ attribute :date, Components::Date
28
+ attribute :edition, Components::Edition
29
+ attribute :languages, Components::Language, collection: true
30
+ attribute :publisher, Components::Publisher
31
+ attribute :copublishers, Components::Publisher, collection: true
32
+ attribute :type, Components::Type
33
+ attribute :stage, Components::Stage
34
+ attribute :locality, Components::Locality
35
+ attribute :typed_stage, Components::TypedStage
36
+ attribute :all_parts, Lutaml::Model::Type::Boolean, default: false
37
+ # base_identifier is declared by supplement subclasses with proper type
38
+ def base_identifier
39
+ nil
40
+ end
41
+
42
+ # @return [String, nil] publication year from the date component
43
+ def year
44
+ date&.year&.to_s
45
+ end
46
+
47
+ def initialize(attrs = {}, options = {})
48
+ attrs = attrs.dup
49
+ attrs[:_type] ||= self.class.polymorphic_name
50
+ super
51
+ end
52
+
53
+ def self.polymorphic_name
54
+ return nil unless name
55
+
56
+ parts = name.split("::")
57
+ flavor = parts[1]&.downcase
58
+ type_kebab = parts.last
59
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1-\2')
60
+ .gsub(/([a-z\d])([A-Z])/, '\1-\2')
61
+ .downcase
62
+ "pubid:#{flavor}:#{type_kebab}"
63
+ end
64
+
65
+ klass_ref = self
66
+ key_value do
67
+ klass_ref.attributes.each_key do |name|
68
+ map name.to_s, to: name.to_sym
69
+ end
70
+ end
71
+
72
+ def root
73
+ return base_identifier.root if base_identifier
74
+
75
+ self
76
+ end
77
+
78
+ # Unified render — delegates to format registry
79
+ def render(format: :human, **opts)
80
+ registry = self.class.format_registry
81
+ unless registry
82
+ raise ArgumentError, "No format registry configured on #{self.class}"
83
+ end
84
+
85
+ renderer = registry.renderer_for(format)
86
+ unless renderer
87
+ raise ArgumentError, "No renderer registered for format: #{format}"
88
+ end
89
+
90
+ context = build_rendering_context(renderer, format:, **opts)
91
+ renderer.new(self).render(context:, **opts.slice(:with_edition))
92
+ end
93
+
94
+ def to_s(**opts)
95
+ render(format: :human, **opts)
96
+ end
97
+
98
+ def to_mr_string
99
+ render(format: :mr_string)
100
+ end
101
+
102
+ # MR string template methods — flavors override as needed
103
+ def mr_publisher
104
+ publisher&.to_s
105
+ end
106
+
107
+ def mr_type
108
+ return nil unless typed_stage
109
+
110
+ code = typed_stage.type_code
111
+ return nil if code.nil? || code.empty? || code == "is"
112
+
113
+ code
114
+ end
115
+
116
+ def mr_number_with_part
117
+ num = mr_number
118
+ return nil unless num
119
+
120
+ prt = mr_part
121
+ prt ? "#{num}-#{prt}" : num
122
+ end
123
+
124
+ def mr_number
125
+ number&.to_s
126
+ end
127
+
128
+ def mr_part
129
+ part&.to_s
130
+ end
131
+
132
+ def mr_year
133
+ date&.year&.to_s
134
+ end
135
+
136
+ # URN template methods — flavors override as needed
137
+ def urn_type_code
138
+ nil
139
+ end
140
+
141
+ def urn_supplement_type
142
+ nil
143
+ end
144
+
145
+ # Supplement rendering hook — flavors override for supplement-specific rendering
146
+ def to_supplement_s(**opts)
147
+ to_s(**opts)
148
+ end
149
+
150
+ # Default URN generation — resolves flavor's UrnGenerator class
151
+ def to_urn
152
+ resolve_urn_generator.new(self).generate
153
+ end
154
+
155
+ def resolve_urn_generator
156
+ flavor = self.class.name.split("::")[1]
157
+ Object.const_get("Pubid::#{flavor}::UrnGenerator")
158
+ rescue NameError
159
+ Pubid::UrnGenerator::Base
160
+ end
161
+
162
+ def exclude(*args)
163
+ excluded_args = args.dup
164
+ # Map :year to :date since identifiers store years inside date
165
+ excluded_args << :date if excluded_args.delete(:year)
166
+
167
+ attrs = self.class.attributes.each_with_object({}) do |(name, _), h|
168
+ h[name] = excluded_args.include?(name) ? nil : send(name)
169
+ end
170
+ self.class.new(attrs)
171
+ end
172
+
173
+ def new_edition_of?(other)
174
+ unless publisher == other.publisher
175
+ raise ArgumentError,
176
+ "Cannot compare edition: different publisher"
177
+ end
178
+ unless number == other.number
179
+ raise ArgumentError,
180
+ "Cannot compare edition: different number"
181
+ end
182
+ unless part == other.part
183
+ raise ArgumentError,
184
+ "Cannot compare edition: different part"
185
+ end
186
+
187
+ unless date && other.date
188
+ raise ArgumentError,
189
+ "Cannot compare identifier without date/year"
190
+ end
191
+
192
+ return date.year > other.date.year if date.year != other.date.year
193
+
194
+ if edition && other.edition
195
+ return edition.number > other.edition.number
196
+ end
197
+
198
+ false
199
+ end
200
+
201
+ def hash
202
+ @hash ||= compute_hash
203
+ end
204
+
205
+ def eql?(other)
206
+ return false unless other.is_a?(self.class)
207
+
208
+ hash == other.hash && self == other
209
+ end
210
+
211
+ private
212
+
213
+ def build_rendering_context(_renderer, format:, with_edition: false,
214
+ lang: :en, lang_single: false,
215
+ stage_format_long: nil, with_date: nil,
216
+ annotated: false)
217
+ if format == :mr_string
218
+ nil
219
+ else
220
+ Rendering::RenderingContext.new(
221
+ with_language_code: lang_single ? :single : :none,
222
+ stage_format_long: stage_format_long || false,
223
+ with_date: with_date.nil? || with_date,
224
+ annotated: annotated,
225
+ )
226
+ end
227
+ end
228
+
229
+ def compute_hash
230
+ attrs = [
231
+ publisher,
232
+ number,
233
+ part,
234
+ subpart,
235
+ date,
236
+ type,
237
+ stage,
238
+ ]
239
+ attrs.compact.map(&:hash).hash
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ # Machine-readable metadata for identifier classes
5
+ # Provides a standardized way to describe identifier types for:
6
+ # - Index search and lookup
7
+ # - File naming conventions
8
+ # - Cross-references between flavors
9
+ # - Automated documentation generation
10
+ module IdentifierMetadata
11
+ class Metadata
12
+ attr_reader :flavor, :identifier_class, :type_key, :title, :short, :abbr,
13
+ :base_class, :supplement_class, :stage_codes, :machine_codes
14
+
15
+ def initialize(flavor:, identifier_class:, type_key:, title:, short: nil,
16
+ abbr: [], base_class: nil, supplement_class: nil,
17
+ stage_codes: [], machine_codes: {}, **extra_metadata)
18
+ @flavor = flavor
19
+ @identifier_class = identifier_class
20
+ @type_key = type_key
21
+ @title = title
22
+ @short = short
23
+ @abbr = Array(abbr)
24
+ @base_class = base_class
25
+ @supplement_class = supplement_class
26
+ @stage_codes = Array(stage_codes)
27
+ @machine_codes = machine_codes
28
+ @extra_metadata = extra_metadata
29
+ end
30
+
31
+ # Fully qualified class name
32
+ def qualified_class_name
33
+ "#{flavor.capitalize}::#{identifier_class}"
34
+ end
35
+
36
+ # Machine-readable slug for file naming
37
+ def slug
38
+ "#{flavor}-#{type_key}".downcase.gsub(/[^a-z0-9]+/, "-")
39
+ end
40
+
41
+ # URN-style identifier for this type
42
+ def urn
43
+ "urn:pubid:#{flavor}:type:#{type_key}"
44
+ end
45
+
46
+ # Check if this identifier type matches a code
47
+ def matches_code?(code)
48
+ return false if code.nil?
49
+
50
+ code_str = code.to_s.downcase.strip
51
+ @abbr.map(&:to_s).map(&:downcase).include?(code_str) ||
52
+ @type_key.to_s.downcase == code_str
53
+ end
54
+
55
+ # Additional metadata accessors
56
+ def [](key)
57
+ @extra_metadata[key]
58
+ end
59
+
60
+ def to_h
61
+ {
62
+ flavor: @flavor,
63
+ identifier_class: @identifier_class,
64
+ type_key: @type_key,
65
+ title: @title,
66
+ short: @short,
67
+ abbr: @abbr,
68
+ base_class: @base_class,
69
+ supplement_class: @supplement_class,
70
+ stage_codes: @stage_codes,
71
+ machine_codes: @machine_codes,
72
+ slug: slug,
73
+ urn: urn,
74
+ qualified_class_name: qualified_class_name,
75
+ }.merge(@extra_metadata)
76
+ end
77
+
78
+ def to_json(*args)
79
+ to_h.to_json(*args)
80
+ end
81
+ end
82
+
83
+ module ClassMethods
84
+ # Define metadata for an identifier class
85
+ # @param attrs [Hash] Metadata attributes
86
+ def define_metadata(**attrs)
87
+ flavor = attrs.fetch(:flavor) do
88
+ # Extract flavor from class name (e.g., "Pubid::Iso::Identifiers::Foo" -> "iso")
89
+ name.to_s.split("::")[1..2]&.join("/")&.downcase || "unknown"
90
+ end
91
+
92
+ # Extract class name (e.g., "Pubid::Iso::Identifiers::Foo" -> "Foo")
93
+ identifier_class = name.to_s.split("::")&.last
94
+
95
+ @metadata = Metadata.new(
96
+ flavor: flavor,
97
+ identifier_class: identifier_class,
98
+ **attrs,
99
+ )
100
+ end
101
+
102
+ # Get the metadata for this class
103
+ # @return [Metadata, nil]
104
+ def metadata
105
+ @metadata ||= if superclass.is_a?(Class) && superclass.respond_to?(:metadata)
106
+ superclass.metadata
107
+ end
108
+ end
109
+
110
+ # Get the type key from metadata
111
+ # @return [Symbol, nil]
112
+ def type_key
113
+ metadata&.type_key
114
+ end
115
+
116
+ # Get the title from metadata
117
+ # @return [String, nil]
118
+ def type_title
119
+ metadata&.title
120
+ end
121
+ end
122
+
123
+ module InstanceMethods
124
+ # Get metadata for this instance's class
125
+ # @return [Metadata, nil]
126
+ def metadata
127
+ self.class.metadata
128
+ end
129
+
130
+ # Get the type key for this identifier
131
+ # @return [Symbol, nil]
132
+ def type_key
133
+ self.class.type_key
134
+ end
135
+
136
+ # Get the machine-readable slug
137
+ # @return [String, nil]
138
+ def slug
139
+ metadata&.slug
140
+ end
141
+ end
142
+
143
+ def self.included(base)
144
+ base.extend(ClassMethods)
145
+ base.include(InstanceMethods)
146
+ end
147
+ end
148
+ end