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,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Identifiers
6
+ # SI Standard (Système International) identifier
7
+ # IEEE/ASTM SI standards for metric system
8
+ # Handles both:
9
+ # - SI: Published standards (IEEE/ASTM SI 10-1997)
10
+ # - PSI: Proposed SI (drafts: IEEE/ASTM PSI 10/D2, October 2015)
11
+ class SiStandard < Base
12
+ # TYPED_STAGES for SI standards
13
+ TYPED_STAGES = [
14
+ Components::TypedStage.new(
15
+ abbr: ["SI"],
16
+ type_code: "SI",
17
+ stage_code: "published",
18
+ ),
19
+ Components::TypedStage.new(
20
+ abbr: ["PSI"],
21
+ type_code: "SI",
22
+ stage_code: "draft",
23
+ ),
24
+ ].freeze
25
+
26
+ # SI standards always have IEEE/ASTM publisher
27
+ # Format: "IEEE/ASTM SI 10-1997" (published)
28
+ # or: "IEEE/ASTM PSI 10/D2, October 2015" (draft)
29
+
30
+ # Use proper Draft component (Lutaml::Model object)
31
+ attr_accessor :draft_obj
32
+
33
+ def to_s
34
+ parts = []
35
+
36
+ # Publisher (IEEE/ASTM)
37
+ parts << "IEEE/ASTM"
38
+
39
+ # Type (SI or PSI based on typed_stage)
40
+ parts << if typed_stage&.abbr&.include?("PSI")
41
+ "PSI"
42
+ else
43
+ "SI"
44
+ end
45
+
46
+ # Code (number) with draft version for PSI
47
+ code_part = code.to_s
48
+ if draft_obj
49
+ # Use Draft component's version attribute
50
+ code_part += "/D#{draft_obj.version}"
51
+ end
52
+ parts << code_part if code
53
+
54
+ # Date
55
+ if month && year
56
+ parts << ", #{month} #{year}"
57
+ elsif year
58
+ parts << "-#{year}"
59
+ end
60
+
61
+ # Relationships (if present)
62
+ result = parts.join(" ")
63
+ if relationships && !relationships.empty?
64
+ rel_strs = relationships.map(&:to_s)
65
+ result += " (#{rel_strs.join(' / ')})"
66
+ end
67
+
68
+ result
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Identifiers
6
+ # Standard identifier for IEEE standards
7
+ #
8
+ # Represents published IEEE standards with the standard format:
9
+ # "IEEE Std XXX-YYYY"
10
+ #
11
+ # @example Standard IEEE identifier
12
+ # std = Pubid::Ieee.parse("IEEE Std 802.3-2018")
13
+ # std.code.to_s # => "802.3"
14
+ # std.year # => "2018"
15
+ #
16
+ # @example With co-publisher
17
+ # std = Pubid::Ieee.parse("ANSI/IEEE Std 500-1984")
18
+ # std.publisher # => "IEEE"
19
+ # std.copublisher # => ["ANSI"]
20
+ class Standard < Base
21
+ # TYPED_STAGES for published IEEE standards
22
+ # Standards use "Std" abbreviation for published state
23
+ TYPED_STAGES = [
24
+ Components::TypedStage.new(
25
+ abbr: ["Std"],
26
+ type_code: "standard",
27
+ stage_code: "published",
28
+ ),
29
+ ].freeze
30
+
31
+ def self.type
32
+ { key: :std, title: "Standard", short: "Std" }
33
+ end
34
+
35
+ # Render standard IEEE format
36
+ #
37
+ # @return [String] IEEE Std XXX-YYYY format
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Identifiers
6
+ # Base class for supplement identifiers (amendments, corrigenda, interpretations, etc.)
7
+ # Supplements modify or add to a base document
8
+ class SupplementIdentifier < Base
9
+ attribute :base_identifier, Base, polymorphic: true
10
+
11
+ # Delegate publisher to base_identifier
12
+ def publisher
13
+ base_identifier&.publisher
14
+ end
15
+
16
+ # Delegate code to base_identifier if not overridden
17
+ def code
18
+ base_identifier&.code
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Identifiers
6
+ autoload :AdoptedStandard, "#{__dir__}/identifiers/adopted_standard"
7
+ autoload :Base, "#{__dir__}/identifiers/base"
8
+ autoload :ConformanceIdentifier,
9
+ "#{__dir__}/identifiers/conformance_identifier"
10
+ autoload :Corrigendum, "#{__dir__}/identifiers/corrigendum"
11
+ autoload :CsaDualPublished, "#{__dir__}/identifiers/csa_dual_published"
12
+ autoload :DualIdentifier, "#{__dir__}/identifiers/dual_identifier"
13
+ autoload :DualPublished, "#{__dir__}/identifiers/dual_published"
14
+ autoload :IecIeeeCopublished,
15
+ "#{__dir__}/identifiers/iec_ieee_copublished"
16
+ autoload :InterpretationIdentifier,
17
+ "#{__dir__}/identifiers/interpretation_identifier"
18
+ autoload :JointDevelopment, "#{__dir__}/identifiers/joint_development"
19
+ autoload :MultiNumberedIdentifier,
20
+ "#{__dir__}/identifiers/multi_numbered_identifier"
21
+ autoload :Nesc, "#{__dir__}/identifiers/nesc"
22
+ autoload :ParentheticalIdentifier,
23
+ "#{__dir__}/identifiers/parenthetical_identifier"
24
+ autoload :ProjectDraftIdentifier,
25
+ "#{__dir__}/identifiers/project_draft_identifier"
26
+ autoload :RedlinedStandard, "#{__dir__}/identifiers/redlined_standard"
27
+ autoload :SiStandard, "#{__dir__}/identifiers/si_standard"
28
+ autoload :Standard, "#{__dir__}/identifiers/standard"
29
+ autoload :SupplementIdentifier,
30
+ "#{__dir__}/identifiers/supplement_identifier"
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Ire
6
+ # Builder for IRE identifiers
7
+ class Builder
8
+ def build(parsed)
9
+ attributes = {}
10
+
11
+ # Extract publisher
12
+ attributes[:publisher] = extract_value(parsed[:publisher])
13
+
14
+ # Extract type
15
+ attributes[:type] = extract_value(parsed[:type])
16
+
17
+ # Extract number
18
+ number_str = extract_value(parsed[:number])
19
+ if number_str
20
+ attributes[:number] = Components::Code.parse(number_str)
21
+ end
22
+
23
+ # Extract year - handle both short (52) and full (1952) formats
24
+ year_str = extract_value(parsed[:year])
25
+ if year_str
26
+ year_int = year_str.to_i
27
+ # Convert 2-digit years to 4-digit (12-63 => 1912-1963)
28
+ if year_int.between?(12, 63)
29
+ year_int += 1900
30
+ end
31
+ attributes[:year] = year_int
32
+ end
33
+
34
+ # Override with full_year if present
35
+ full_year_str = extract_value(parsed[:full_year])
36
+ if full_year_str
37
+ attributes[:year] = full_year_str.to_i
38
+ end
39
+
40
+ # Create identifier
41
+ Identifier.new(**attributes)
42
+ end
43
+
44
+ private
45
+
46
+ def extract_value(value)
47
+ return nil if value.nil?
48
+ return nil if value.is_a?(Array) && value.empty?
49
+
50
+ if value.is_a?(Array)
51
+ joined = value.join
52
+ return joined.length.positive? ? joined : nil
53
+ end
54
+
55
+ str_value = value.to_s.strip
56
+ str_value.length.positive? ? str_value : nil
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Ieee
7
+ module Ire
8
+ # Base class for IRE identifiers
9
+ # IRE (Institute of Radio Engineers): 1912-1963
10
+ class Identifier < Lutaml::Model::Serializable
11
+ attribute :publisher, :string, default: -> { "IRE" }
12
+ attribute :type, :string # "Trans.", "Standard", "Std"
13
+ attribute :number, Components::Code
14
+ attribute :year, :integer
15
+
16
+ def initialize(**args)
17
+ super()
18
+
19
+ # Handle number as string or Code object
20
+ if args[:number].is_a?(String)
21
+ self.number = Components::Code.parse(args[:number])
22
+ elsif args[:number]
23
+ self.number = args[:number]
24
+ end
25
+
26
+ # Set other attributes
27
+ attrs = self.class.attributes
28
+ args.each do |key, value|
29
+ next if key == :number
30
+
31
+ setter = :"#{key}="
32
+ public_send(setter, value) if attrs.key?(key)
33
+ end
34
+ end
35
+
36
+ # Parse IRE identifier string
37
+ def self.parse(input)
38
+ parsed = Parser.new.parse(input)
39
+ builder = Builder.new
40
+ builder.build(parsed)
41
+ end
42
+
43
+ def to_s
44
+ parts = []
45
+ # Year comes FIRST in IRE format - render as 2-digit short year
46
+ if year
47
+ short_year = year.between?(1900, 1999) ? year - 1900 : year
48
+ parts << short_year.to_s
49
+ end
50
+ parts << publisher
51
+ parts << type if type
52
+ parts << number.to_s if number
53
+ parts.join(" ")
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Ieee
7
+ module Ire
8
+ # Parser for IRE (Institute of Radio Engineers) identifiers
9
+ # Historical period: 1912-1963 (merged into IEEE in 1963)
10
+ class Parser < Parslet::Parser
11
+ # Basic building blocks
12
+ rule(:space) { str(" ") }
13
+ rule(:space?) { space.maybe }
14
+ rule(:dash) { str("-") }
15
+ rule(:dot) { str(".") }
16
+ rule(:digit) { match("[0-9]") }
17
+ rule(:digits) { digit.repeat(1) }
18
+ rule(:letter) { match("[A-Za-z]") }
19
+ rule(:upper) { match("[A-Z]") }
20
+
21
+ # Year pattern - handle both 2-digit (52 = 1952) and 4-digit (1952) formats
22
+ rule(:year_short) do
23
+ # 2-digit year: 12-63 (1912-1963 IRE period)
24
+ match("[1-6]") >> digit
25
+ end
26
+
27
+ rule(:year_full) do
28
+ # 4-digit year for IRE period: 1912-1963
29
+ (str("191") >> digit.repeat(1, 1)) | # 1912-1919
30
+ (str("19") >> (str("2") | str("3") | str("4") | str("5")) >> digit) | # 1920-1959
31
+ (str("196") >> match("[0-3]")) # 1960-1963
32
+ end
33
+
34
+ rule(:year) { year_full | year_short }
35
+
36
+ # IRE prefix variations
37
+ rule(:ire_prefix) do
38
+ (
39
+ str("IEEE-IRE") | # Transitional period (1963-1965)
40
+ str("IRE")
41
+ ).as(:publisher)
42
+ end
43
+
44
+ # Document types
45
+ rule(:ire_type) do
46
+ (
47
+ str("Trans.") | # IRE Trans. PGI-7
48
+ str("Standard") | # IRE Standard
49
+ str("Std") # IRE Std
50
+ ).as(:type)
51
+ end
52
+
53
+ # Number formats
54
+ rule(:number) do
55
+ (
56
+ # Complex format with spaces: 28 S1, 15.S1, 7.S2
57
+ (digits >> (space | dot) >> upper >> digits) |
58
+
59
+ # Complex format: 1.IRE62.1S1
60
+ (digits >> dot >> str("IRE") >> digits >> dot >> digits >> upper >> digits) |
61
+
62
+ # Transaction format: PGI-7, PGAP-4
63
+ (upper.repeat(2, 4) >> dash >> digits) |
64
+
65
+ # Simple number: 56, 123
66
+ digits
67
+ ).as(:number)
68
+ end
69
+
70
+ # Date (year only for IRE)
71
+ rule(:date) do
72
+ (space? >> (dash | str(",")).maybe >> space? >> year.as(:year)).maybe
73
+ end
74
+
75
+ # Complete IRE identifier - YEAR FIRST format
76
+ rule(:ire_identifier) do
77
+ # Format: "52 IRE 7.S2" or "1952 IRE 7.S2"
78
+ year.as(:year) >>
79
+ space >>
80
+ ire_prefix >>
81
+ space >>
82
+ (ire_type >> space).maybe >>
83
+ number >>
84
+ (space? >> (dash | str(",")).maybe >> space? >> year_full.as(:full_year)).maybe
85
+ end
86
+
87
+ root(:ire_identifier)
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Ire
6
+ autoload :Builder, "#{__dir__}/ire/builder"
7
+ autoload :Identifier, "#{__dir__}/ire/identifier"
8
+ autoload :Parser, "#{__dir__}/ire/parser"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Nesc
6
+ # Builder for NESC identifier objects
7
+ #
8
+ # Transforms parsed hash into appropriate NESC identifier class instances.
9
+ # Determines the correct identifier type based on parsed attributes and
10
+ # constructs the object with proper components.
11
+ #
12
+ # @example Build standard NESC
13
+ # builder = Builder.new
14
+ # parsed = { code: "C2", year: "1997" }
15
+ # identifier = builder.build(parsed)
16
+ # # => #<Pubid::Ieee::Identifiers::Nesc::Standard>
17
+ #
18
+ # @example Build handbook
19
+ # parsed = { year: "2017", variant: "Handbook", edition: "Premier Edition" }
20
+ # identifier = builder.build(parsed)
21
+ # # => #<Pubid::Ieee::Identifiers::Nesc::Handbook>
22
+ class Builder
23
+ # Build NESC identifier from parsed hash
24
+ #
25
+ # @param parsed_hash [Hash] Hash from parser
26
+ # @return [Identifiers::Nesc::Base] Appropriate NESC identifier instance
27
+ def build(parsed_hash)
28
+ # Determine identifier type based on parsed attributes
29
+ identifier_class = determine_identifier_class(parsed_hash)
30
+
31
+ identifier = identifier_class.new
32
+
33
+ # Set code if present (C2)
34
+ if parsed_hash[:code]
35
+ code_str = parsed_hash[:code].to_s
36
+ identifier.code = Pubid::Ieee::Components::Code.new(
37
+ prefix: code_str[0], # "C" from "C2"
38
+ number: code_str[1..], # "2" from "C2"
39
+ )
40
+ end
41
+
42
+ # Set year (required for all NESC identifiers)
43
+ if parsed_hash[:year]
44
+ identifier.year = Pubid::Components::Date.new(
45
+ year: parsed_hash[:year].to_s.to_i,
46
+ )
47
+ end
48
+
49
+ # Set variant (Handbook, Redline, etc.)
50
+ if parsed_hash[:variant]
51
+ identifier.variant = parsed_hash[:variant].to_s
52
+ end
53
+
54
+ # Set edition (for handbooks)
55
+ if parsed_hash[:edition]
56
+ identifier.edition = parsed_hash[:edition].to_s
57
+ end
58
+
59
+ # Set draft flag
60
+ if parsed_hash[:draft]
61
+ identifier.draft = true
62
+ end
63
+
64
+ # Set month (for drafts)
65
+ if parsed_hash[:month]
66
+ identifier.month = parsed_hash[:month].to_s
67
+ end
68
+
69
+ identifier
70
+ end
71
+
72
+ private
73
+
74
+ # Determine the appropriate identifier class
75
+ #
76
+ # @param parsed_hash [Hash] Parsed attributes
77
+ # @return [Class] Identifier class to instantiate
78
+ def determine_identifier_class(parsed_hash)
79
+ # Draft identifiers
80
+ return Identifiers::Nesc::Draft if parsed_hash[:draft]
81
+
82
+ # Variant-based identifiers
83
+ if parsed_hash[:variant]
84
+ case parsed_hash[:variant].to_s
85
+ when "Handbook"
86
+ return Identifiers::Nesc::Handbook
87
+ when "Redline"
88
+ return Identifiers::Nesc::Redline
89
+ end
90
+ end
91
+
92
+ # C2 code means standard NESC
93
+ return Identifiers::Nesc::Standard if parsed_hash[:code]
94
+
95
+ # Fallback to base class
96
+ Identifiers::Nesc::Base
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Ieee
7
+ module Nesc
8
+ # Parser for National Electrical Safety Code (NESC) identifiers
9
+ #
10
+ # Handles multiple NESC identifier formats including:
11
+ # - Standard C2-YYYY format
12
+ # - Year-first YYYY NESC format
13
+ # - Draft format
14
+ # - Handbook and Redline variations
15
+ #
16
+ # @example Parse C2 standard
17
+ # parser = Parser.new
18
+ # result = parser.parse("C2-1997 National Electric Safety Code")
19
+ #
20
+ # @example Parse handbook
21
+ # parser = Parser.new
22
+ # result = parser.parse("2017 NESC Handbook, Premier Edition")
23
+ class Parser < Parslet::Parser
24
+ root(:nesc_identifier)
25
+
26
+ rule(:space) { str(" ") }
27
+ rule(:comma) { str(",") }
28
+ rule(:digit) { match("[0-9]") }
29
+ rule(:year) { digit.repeat(4, 4) }
30
+ rule(:dash) { str("-") }
31
+
32
+ # C2 code designation
33
+ rule(:c2_code) do
34
+ str("C2").as(:code)
35
+ end
36
+
37
+ # NESC name variations
38
+ rule(:nesc_full_name) do
39
+ str("National Electrical Safety Code(R)") |
40
+ str("National Electrical Safety Code") |
41
+ str("National Electric Safety Code") # Typo variation
42
+ end
43
+
44
+ rule(:nesc_abbr) do
45
+ str("NESC(R)") | str("NESC")
46
+ end
47
+
48
+ rule(:nesc_name) do
49
+ nesc_full_name | nesc_abbr
50
+ end
51
+
52
+ # Registered trademark notation
53
+ rule(:registered) do
54
+ str("(R)").maybe
55
+ end
56
+
57
+ # Edition notations
58
+ rule(:edition) do
59
+ (
60
+ str("Premier Edition") |
61
+ str("First Edition") |
62
+ str("Second Edition") |
63
+ str("Third Edition") |
64
+ str("Fourth Edition") |
65
+ str("Fifth Edition") |
66
+ str("Sixth Edition") |
67
+ str("Seventh Edition") |
68
+ str("Eighth Edition") |
69
+ str("Ninth Edition") |
70
+ str("Tenth Edition")
71
+ ).as(:edition)
72
+ end
73
+
74
+ # Variant types (Handbook, Redline)
75
+ rule(:variant) do
76
+ (
77
+ str("Handbook") |
78
+ str("Redline")
79
+ ).as(:variant)
80
+ end
81
+
82
+ # Month names for drafts
83
+ rule(:month) do
84
+ (
85
+ str("January") | str("February") | str("March") |
86
+ str("April") | str("May") | str("June") |
87
+ str("July") | str("August") | str("September") |
88
+ str("October") | str("November") | str("December")
89
+ ).as(:month)
90
+ end
91
+
92
+ # Pattern 1: C2-YYYY Standard format
93
+ # Examples: "C2-1997 National Electric Safety Code (NESC)"
94
+ # "C2-2012 National Electrical Safety Code"
95
+ rule(:c2_standard) do
96
+ c2_code >>
97
+ dash >>
98
+ year.as(:year) >>
99
+ (comma.maybe >> space).maybe >>
100
+ nesc_full_name >>
101
+ (space >> str("(") >> nesc_abbr >> str(")")).maybe
102
+ end
103
+
104
+ # Pattern 2: YYYY NESC format (year-first)
105
+ # Examples: "2017 NESC(R) Handbook, Premier Edition"
106
+ # "2017 National Electrical Safety Code(R) (NESC(R))"
107
+ # "2012 NESC Handbook"
108
+ rule(:year_first) do
109
+ year.as(:year) >>
110
+ space >>
111
+ (
112
+ # Full name with optional (NESC) suffix
113
+ (nesc_full_name >> registered >>
114
+ (space >> str("(") >> nesc_abbr >> registered >> str(")")).maybe) |
115
+ # Just NESC abbreviation
116
+ (nesc_abbr >> registered)
117
+ ) >>
118
+ (space >> variant).maybe >>
119
+ (comma >> space >> edition).maybe
120
+ end
121
+
122
+ # Pattern 3: Name-first format
123
+ # Examples: "National Electrical Safety Code, C2-2012"
124
+ # "National Electrical Safety Code, C2-2012 - Redline"
125
+ rule(:name_first) do
126
+ nesc_full_name >>
127
+ comma >>
128
+ space >>
129
+ c2_code >>
130
+ dash >>
131
+ year.as(:year) >>
132
+ (space >> str("-") >> space >> variant.as(:variant)).maybe
133
+ end
134
+
135
+ # Pattern 4: Draft format
136
+ # Examples: "Draft National Electrical Safety Code, January 2016"
137
+ # "Draft NESC, June 2011"
138
+ rule(:draft_nesc) do
139
+ str("Draft").as(:draft) >>
140
+ space >>
141
+ nesc_name >>
142
+ comma >> space >>
143
+ month >> space >> year.as(:year)
144
+ end
145
+
146
+ # Main identifier rule - try patterns in order
147
+ # Put most specific patterns first
148
+ rule(:nesc_identifier) do
149
+ draft_nesc | name_first | c2_standard | year_first
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Nesc
6
+ autoload :Builder, "#{__dir__}/nesc/builder"
7
+ autoload :Parser, "#{__dir__}/nesc/parser"
8
+ end
9
+ end
10
+ end