pubid 1.15.17 → 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,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "typed_stages"
4
+
5
+ module Pubid
6
+ module Ieee
7
+ # Scheme provides registry access for IEEE identifiers
8
+ # Following the proven ISO/IEC/CEN/BSI pattern
9
+ #
10
+ # This class is the single source of truth for:
11
+ # - TypedStage lookup by abbreviation
12
+ # - TypedStage lookup by IEEE draft notation
13
+ # - TypedStage lookup by ISO stage code
14
+ # - Identifier class selection based on type code
15
+ class Scheme < Pubid::Scheme
16
+ class << self
17
+ # Locate typed stage by abbreviation
18
+ # @param abbr [String, nil] stage abbreviation (e.g., "D1", "FDIS", "Std")
19
+ # @return [Components::TypedStage] matching typed stage
20
+ def locate_typed_stage_by_abbr(abbr)
21
+ return TypedStages::DEFAULT_TYPED_STAGE if abbr.nil? || abbr.to_s.strip.empty?
22
+
23
+ # Normalize abbreviation
24
+ abbr_str = abbr.to_s.strip
25
+
26
+ # Find typed stage that includes this abbreviation
27
+ typed_stage = TypedStages::TYPED_STAGES.find { |ts| ts.abbr.include?(abbr_str) }
28
+
29
+ # Fall back to default if not found
30
+ typed_stage || TypedStages::DEFAULT_TYPED_STAGE
31
+ end
32
+
33
+ # Locate typed stage by IEEE draft notation
34
+ # @param draft [String] IEEE draft notation (e.g., "D1", "D5", "P")
35
+ # @return [Components::TypedStage, nil] matching typed stage
36
+ def locate_typed_stage_by_ieee_draft(draft)
37
+ return nil if draft.nil? || draft.to_s.strip.empty?
38
+
39
+ draft_str = draft.to_s.strip
40
+
41
+ # Try exact match on abbreviation first
42
+ ts = TypedStages::TYPED_STAGES.find { |t| t.abbr.include?(draft_str) }
43
+ return ts if ts
44
+
45
+ # Try match on ieee_draft_equivalent
46
+ TypedStages::TYPED_STAGES.find { |t| t.ieee_draft_equivalent == draft_str }
47
+ end
48
+
49
+ # Locate typed stage by ISO stage code
50
+ # @param stage [String] ISO stage code (e.g., "WD", "CD", "DIS", "FDIS")
51
+ # @return [Components::TypedStage, nil] matching typed stage
52
+ def locate_typed_stage_by_iso_stage(stage)
53
+ return nil if stage.nil? || stage.to_s.strip.empty?
54
+
55
+ TypedStages::TYPED_STAGES.find { |ts| ts.iso_stage_equivalent == stage.to_s.strip }
56
+ end
57
+
58
+ # Locate identifier class by type code
59
+ # @param type_code [String, Symbol] type code (:standard, :draft, :std, :P, etc.)
60
+ # @return [Class] identifier class
61
+ def locate_identifier_klass_by_type_code(type_code)
62
+ type_str = type_code.to_s
63
+
64
+ case type_str
65
+ when "draft", "Draft Std", "Draft", "P"
66
+ # "P" indicates project draft status - maps to ProjectDraftIdentifier
67
+ Identifiers::ProjectDraftIdentifier
68
+ when "standard", "Std", "std"
69
+ Identifiers::Standard
70
+ else
71
+ # Default to base identifier
72
+ Identifiers::Base
73
+ end
74
+ end
75
+
76
+ # Get all typed stages
77
+ # @return [Array<Components::TypedStage>] all registered typed stages
78
+ def typed_stages
79
+ TypedStages::TYPED_STAGES
80
+ end
81
+
82
+ # Get default typed stage (published standard)
83
+ # @return [Components::TypedStage] default typed stage
84
+ def default_typed_stage
85
+ TypedStages::DEFAULT_TYPED_STAGE
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ # Registry of all IEEE typed stages
6
+ # Single source of truth for stage/type combinations
7
+ #
8
+ # IEEE has three approval levels:
9
+ # 1. Unapproved Draft (D1-D6): Working drafts
10
+ # 2. Approved Draft (D7-D9): Board-approved but unpublished
11
+ # 3. Published: Final standards (no P prefix, no D number)
12
+ #
13
+ # For joint development with ISO/IEC, both IEEE and ISO stages may appear
14
+ module TypedStages
15
+ TYPED_STAGES = [
16
+ # Published Standards (no P prefix, no draft notation)
17
+ Components::TypedStage.new(
18
+ abbr: ["Std"],
19
+ stage_code: "published",
20
+ type_code: "standard",
21
+ approval_status: "published",
22
+ project_status: false,
23
+ ),
24
+
25
+ # IEEE Draft Stages (P prefix, unapproved)
26
+ # D1 - Initial working draft
27
+ Components::TypedStage.new(
28
+ abbr: ["D1"],
29
+ stage_code: "working_draft",
30
+ type_code: "draft",
31
+ ieee_draft_equivalent: "D1",
32
+ iso_stage_equivalent: "WD",
33
+ approval_status: "unapproved",
34
+ project_status: true,
35
+ ),
36
+
37
+ # D2, D3 - Committee draft stages
38
+ Components::TypedStage.new(
39
+ abbr: ["D2", "D3"],
40
+ stage_code: "committee_draft",
41
+ type_code: "draft",
42
+ ieee_draft_equivalent: "D2-D3",
43
+ iso_stage_equivalent: "CD",
44
+ approval_status: "unapproved",
45
+ project_status: true,
46
+ ),
47
+
48
+ # D4, D5, D6 - Draft standard stages
49
+ Components::TypedStage.new(
50
+ abbr: ["D4", "D5", "D6"],
51
+ stage_code: "draft_standard",
52
+ type_code: "draft",
53
+ ieee_draft_equivalent: "D4-D6",
54
+ iso_stage_equivalent: "DIS",
55
+ approval_status: "unapproved",
56
+ project_status: true,
57
+ ),
58
+
59
+ # IEEE Draft Stages (P prefix, approved but unpublished)
60
+ # D7, D8, D9 - Final draft (board-approved)
61
+ Components::TypedStage.new(
62
+ abbr: ["D7", "D8", "D9"],
63
+ stage_code: "final_draft",
64
+ type_code: "draft",
65
+ ieee_draft_equivalent: "D7-D9",
66
+ iso_stage_equivalent: "FDIS",
67
+ approval_status: "approved",
68
+ project_status: true,
69
+ ),
70
+
71
+ # ISO Stages (for joint development with ISO/IEC/IEEE)
72
+ # These stages appear in joint development identifiers
73
+ Components::TypedStage.new(
74
+ abbr: ["PWI"],
75
+ stage_code: "preliminary",
76
+ type_code: "draft",
77
+ ieee_draft_equivalent: "P",
78
+ iso_stage_equivalent: "PWI",
79
+ approval_status: "unapproved",
80
+ project_status: true,
81
+ ),
82
+
83
+ Components::TypedStage.new(
84
+ abbr: ["NP"],
85
+ stage_code: "new_proposal",
86
+ type_code: "draft",
87
+ ieee_draft_equivalent: "P",
88
+ iso_stage_equivalent: "NP",
89
+ approval_status: "unapproved",
90
+ project_status: true,
91
+ ),
92
+
93
+ Components::TypedStage.new(
94
+ abbr: ["WD"],
95
+ stage_code: "working_draft",
96
+ type_code: "draft",
97
+ ieee_draft_equivalent: "D1",
98
+ iso_stage_equivalent: "WD",
99
+ approval_status: "unapproved",
100
+ project_status: true,
101
+ ),
102
+
103
+ Components::TypedStage.new(
104
+ abbr: ["CD", "CD2", "CD3"],
105
+ stage_code: "committee_draft",
106
+ type_code: "draft",
107
+ ieee_draft_equivalent: "D2-D3",
108
+ iso_stage_equivalent: "CD",
109
+ approval_status: "unapproved",
110
+ project_status: true,
111
+ ),
112
+
113
+ Components::TypedStage.new(
114
+ abbr: ["DIS"],
115
+ stage_code: "draft_international_standard",
116
+ type_code: "draft",
117
+ ieee_draft_equivalent: "D5",
118
+ iso_stage_equivalent: "DIS",
119
+ approval_status: "unapproved",
120
+ project_status: true,
121
+ ),
122
+
123
+ Components::TypedStage.new(
124
+ abbr: ["FDIS"],
125
+ stage_code: "final_draft",
126
+ type_code: "draft",
127
+ ieee_draft_equivalent: "D8",
128
+ iso_stage_equivalent: "FDIS",
129
+ approval_status: "approved",
130
+ project_status: true,
131
+ ),
132
+
133
+ # Historical stages (AIEE, IRE)
134
+ # "No" or "No." for AIEE standards
135
+ Components::TypedStage.new(
136
+ abbr: ["No", "No."],
137
+ stage_code: "published",
138
+ type_code: "standard",
139
+ approval_status: "published",
140
+ project_status: false,
141
+ ),
142
+
143
+ # Generic "P" prefix for drafts (when specific D number not known)
144
+ Components::TypedStage.new(
145
+ abbr: ["P"],
146
+ stage_code: "draft",
147
+ type_code: "draft",
148
+ ieee_draft_equivalent: "P",
149
+ approval_status: "unapproved",
150
+ project_status: true,
151
+ ),
152
+
153
+ # Draft without specific version (legacy)
154
+ Components::TypedStage.new(
155
+ abbr: ["Draft"],
156
+ stage_code: "draft",
157
+ type_code: "draft",
158
+ approval_status: "unapproved",
159
+ project_status: true,
160
+ ),
161
+ ].freeze
162
+
163
+ # Default typed stage for published standards
164
+ DEFAULT_TYPED_STAGE = TYPED_STAGES.first
165
+ end
166
+
167
+ # Backward compatibility aliases at module level
168
+ # These allow code expecting Pubid::Ieee::TYPED_STAGES to still work
169
+ TYPED_STAGES = TypedStages::TYPED_STAGES
170
+ DEFAULT_TYPED_STAGE = TypedStages::DEFAULT_TYPED_STAGE
171
+ end
172
+ end
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ class UrnGenerator < Pubid::UrnGenerator::Base
6
+ def generate
7
+ parts = ["urn", "ieee"]
8
+
9
+ parts << publisher_component
10
+
11
+ special_type = special_identifier_type_component
12
+ parts << special_type if special_type
13
+
14
+ tc = type_component
15
+ parts << tc if tc
16
+
17
+ cc = code_component
18
+ parts << cc if cc
19
+
20
+ parts << identifier.year if identifier.year
21
+
22
+ dc = draft_component
23
+ parts << dc if dc
24
+
25
+ ec = edition_component
26
+ parts << ec if ec
27
+
28
+ md = month_day_component
29
+ parts << md if md
30
+
31
+ ds = draft_status_component
32
+ parts << ds if ds
33
+
34
+ if !special_type && identifier.redline
35
+ parts << "redline"
36
+ end
37
+
38
+ if !special_type && identifier.interpretation
39
+ parts << "int"
40
+ end
41
+
42
+ if special_type != "conformance" && identifier.conf_number
43
+ conf = "conf.#{identifier.conf_number}"
44
+ conf += "-#{identifier.conf_year}" if identifier.conf_year
45
+ parts << conf
46
+ end
47
+
48
+ if identifier.ashrae_number
49
+ ashrae = "ashrae.#{identifier.ashrae_number}"
50
+ ashrae += "-#{identifier.ashrae_year}" if identifier.ashrae_year
51
+ parts << ashrae
52
+ end
53
+
54
+ if identifier.crossref
55
+ parts << "xref.#{identifier.crossref}"
56
+ end
57
+
58
+ if identifier.relationships&.any?
59
+ rel = identifier.relationships.join("/")
60
+ parts << "rel.#{rel}"
61
+ end
62
+
63
+ if identifier.revision_of
64
+ parts << "revof.#{identifier.revision_of}"
65
+ end
66
+
67
+ if identifier.amendment_to
68
+ parts << "amdto.#{identifier.amendment_to}"
69
+ end
70
+
71
+ if identifier.adoption
72
+ parts << "adopt.#{identifier.adoption}"
73
+ end
74
+
75
+ reaffirmed = maybe(:reaffirmed)
76
+ if reaffirmed
77
+ parts << "reaff.#{reaffirmed}"
78
+ end
79
+
80
+ if identifier.note
81
+ parts << "note.#{identifier.note}"
82
+ end
83
+
84
+ if identifier.nickname
85
+ parts << "nick.#{identifier.nickname}"
86
+ end
87
+
88
+ parts.join(":")
89
+ end
90
+
91
+ private
92
+
93
+ def special_identifier_type_component
94
+ class_name = identifier.class.name.to_s
95
+
96
+ case class_name
97
+ when /RedlinedStandard/
98
+ "redlined"
99
+ when /SiStandard/
100
+ "si"
101
+ when /ConformanceIdentifier/
102
+ "conformance"
103
+ when /InterpretationIdentifier/
104
+ "interpretation"
105
+ when /SupplementIdentifier/
106
+ if identifier.typed_stage
107
+ type_code = identifier.typed_stage.type_code
108
+ case type_code.to_s
109
+ when "amd"
110
+ "amendment"
111
+ when "cor"
112
+ "corrigendum"
113
+ when "errata"
114
+ "errata"
115
+ else
116
+ type_code.to_s
117
+ end
118
+ end
119
+ else
120
+ if identifier.typed_stage
121
+ type_code = identifier.typed_stage.type_code
122
+ case type_code.to_s
123
+ when "SI"
124
+ "si"
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ def publisher_component
131
+ pub = identifier.publisher || "IEEE"
132
+ pub = pub.to_s.downcase
133
+
134
+ if identifier.copublisher&.any?
135
+ copubs = identifier.copublisher.map(&:to_s).map(&:downcase)
136
+ pub = [pub, *copubs].join("-")
137
+ end
138
+
139
+ pub
140
+ end
141
+
142
+ def type_component
143
+ return nil unless identifier.type
144
+
145
+ type = identifier.type
146
+ return nil if !type || type.to_s.strip.empty? || type.to_s == "Std"
147
+
148
+ type.to_s.downcase.gsub(" ", ".")
149
+ end
150
+
151
+ def code_component
152
+ return nil unless identifier.code_obj
153
+
154
+ identifier.code_obj.to_s
155
+ end
156
+
157
+ def draft_component
158
+ return nil unless identifier.draft_obj
159
+
160
+ "draft.#{identifier.draft_obj}"
161
+ end
162
+
163
+ def edition_component
164
+ return nil unless identifier.edition
165
+
166
+ "ed.#{identifier.edition}"
167
+ end
168
+
169
+ def month_day_component
170
+ parts = []
171
+
172
+ parts << identifier.month if identifier.month
173
+ parts << identifier.day if identifier.day
174
+
175
+ return nil if parts.empty?
176
+
177
+ parts.join("-")
178
+ end
179
+
180
+ def draft_status_component
181
+ return nil unless identifier.draft_status
182
+
183
+ status = identifier.draft_status.downcase
184
+ status.gsub(" ", ".")
185
+ end
186
+ end
187
+ end
188
+ end
data/lib/pubid/ieee.rb ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ autoload :Aiee, "#{__dir__}/ieee/aiee"
6
+ autoload :Builder, "#{__dir__}/ieee/builder"
7
+ autoload :Identifier, "#{__dir__}/ieee/identifier"
8
+ autoload :Identifiers, "#{__dir__}/ieee/identifiers"
9
+ autoload :Ire, "#{__dir__}/ieee/ire"
10
+ autoload :Nesc, "#{__dir__}/ieee/nesc"
11
+ autoload :Parser, "#{__dir__}/ieee/parser"
12
+ autoload :Scheme, "#{__dir__}/ieee/scheme"
13
+ autoload :TypedStages, "#{__dir__}/ieee/typed_stages"
14
+ autoload :UrnGenerator, "#{__dir__}/ieee/urn_generator"
15
+
16
+ # Components submodule
17
+ module Components
18
+ autoload :Code, "#{__dir__}/ieee/components/code"
19
+ autoload :Draft, "#{__dir__}/ieee/components/draft"
20
+ autoload :Relationship, "#{__dir__}/ieee/components/relationship"
21
+ autoload :TypedStage, "#{__dir__}/ieee/components/typed_stage"
22
+ end
23
+
24
+ class << self
25
+ def parse(input)
26
+ Identifier.parse(input)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ Pubid::Registry.register(:ieee, Pubid::Ieee)
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ autoload :Aiee, "#{__dir__}/aiee"
6
+ autoload :Builder, "#{__dir__}/builder"
7
+ autoload :Identifier,
8
+ "#{__dir__}/identifier (DEBUG: __dir__ is \#{__dir__})"
9
+ autoload :Identifiers, "#{__dir__}/identifiers"
10
+ autoload :Ire, "#{__dir__}/ire"
11
+ autoload :Nesc, "#{__dir__}/nesc"
12
+ autoload :Parser, "#{__dir__}/parser"
13
+ autoload :Scheme, "#{__dir__}/scheme"
14
+ autoload :TypedStages, "#{__dir__}/typed_stages"
15
+ autoload :UrnGenerator, "#{__dir__}/urn_generator"
16
+
17
+ # Components submodule
18
+ module Components
19
+ autoload :Code, "#{__dir__}/components/code"
20
+ autoload :Draft, "#{__dir__}/components/draft"
21
+ autoload :Relationship, "#{__dir__}/components/relationship"
22
+ autoload :TypedStage, "#{__dir__}/components/typed_stage"
23
+ end
24
+
25
+ class << self
26
+ def parse(input)
27
+ Identifier.parse(input)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ # Build IHO identifier objects from parslet parse output.
6
+ class Builder
7
+ def build(parsed)
8
+ hash = parsed.is_a?(Array) ? parsed.reduce({}, :merge) : parsed
9
+ type_letter = stringify(hash[:type])
10
+
11
+ attrs = {
12
+ code: stringify(hash[:code]),
13
+ appendix: stringify(hash[:appendix]),
14
+ part: stringify(hash[:part]),
15
+ annex: stringify(hash[:annex]),
16
+ supplement: stringify(hash[:supplement]),
17
+ version: stringify(hash[:version]),
18
+ }.compact
19
+
20
+ Scheme.identifier_klass_for_type_letter(type_letter).new(**attrs)
21
+ end
22
+
23
+ def self.build(parsed)
24
+ new.build(parsed)
25
+ end
26
+
27
+ private
28
+
29
+ def stringify(value)
30
+ return nil if value.nil?
31
+
32
+ str = value.to_s
33
+ str.empty? ? nil : str
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ # Entry point for parsing IHO identifiers.
6
+ module Identifier
7
+ # Parse an IHO identifier string into an identifier object
8
+ # @param identifier [String] The IHO identifier string to parse
9
+ # @return [Pubid::Iho::Identifiers::Base] The appropriate identifier object
10
+ # @raise [Parslet::ParseFailed] If parsing fails
11
+ def self.parse(identifier)
12
+ parsed = Parser.parse(identifier)
13
+ Builder.build(parsed)
14
+ rescue Parslet::ParseFailed => e
15
+ raise "Failed to parse IHO identifier '#{identifier}': #{e.message}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ module Identifiers
6
+ # Base class for all IHO identifiers.
7
+ #
8
+ # IHO identifiers have the form:
9
+ # IHO {S|P|M|B|C}-{code}[ Ap. {appendix}][ Part {part}][ Annex {annex}][ Suppl {supplement}][ {version}]
10
+ #
11
+ # The leading IHO publisher prefix is optional on input but always
12
+ # emitted on output.
13
+ class Base < Pubid::Identifier
14
+ attribute :publisher, :string, default: "IHO"
15
+ attribute :code, :string
16
+ attribute :appendix, :string
17
+ attribute :part, :string
18
+ attribute :annex, :string
19
+ attribute :supplement, :string
20
+ attribute :version, :string
21
+
22
+ def self.parse(string)
23
+ Iho::Identifier.parse(string)
24
+ end
25
+
26
+ # Render the identifier as a string in canonical IHO form.
27
+ # @return [String]
28
+ def to_s
29
+ letter = type.is_a?(Hash) ? type[:short].to_s : type.to_s
30
+ rendered = "#{publisher} #{letter}-#{code}"
31
+ rendered << " Ap. #{appendix}" if appendix
32
+ rendered << " Part #{part}" if part
33
+ rendered << " Annex #{annex}" if annex
34
+ rendered << " Suppl #{supplement}" if supplement
35
+ rendered << " #{version}" if version
36
+ rendered
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ module Identifiers
6
+ # IHO Bibliographic Publication (B series).
7
+ # Example: IHO B-4 2.19.0.
8
+ class Bibliographic < Base
9
+ def self.type
10
+ { key: :bibliographic, title: "Bibliographic Publication",
11
+ short: "B" }
12
+ end
13
+
14
+ def type
15
+ self.class.type
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ module Identifiers
6
+ # IHO Circular Letter (C series).
7
+ # Example: IHO C-13 1.0.0.
8
+ class CircularLetter < Base
9
+ def self.type
10
+ { key: :circular_letter, title: "Circular Letter", short: "C" }
11
+ end
12
+
13
+ def type
14
+ self.class.type
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ module Identifiers
6
+ # IHO Miscellaneous Publication (M series).
7
+ # Example: IHO M-3 2.0.0.
8
+ class Miscellaneous < Base
9
+ def self.type
10
+ { key: :miscellaneous, title: "Miscellaneous Publication",
11
+ short: "M" }
12
+ end
13
+
14
+ def type
15
+ self.class.type
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ module Identifiers
6
+ # IHO Publication (P series).
7
+ # Examples: IHO P-1 1.0.0, IHO P-1/21 1.0.0, IHO P-6-3 1.0.0.
8
+ class Publication < Base
9
+ def self.type
10
+ { key: :publication, title: "Publication", short: "P" }
11
+ end
12
+
13
+ def type
14
+ self.class.type
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end