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,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Astm
7
+ module Components
8
+ class Code < Lutaml::Model::Serializable
9
+ attribute :letter, :string # A-G for standards
10
+ attribute :number, :string # Main number
11
+ attribute :suffix, :string # A, B, C for data series
12
+ attribute :subseries, :string # S1, S4, S10 for data series
13
+ attribute :dual_m, :boolean # M suffix for metric (dual unit)
14
+
15
+ def to_s
16
+ if letter
17
+ parts = [letter, number]
18
+ parts << suffix if suffix
19
+ result = parts.join
20
+ result += "-S#{subseries}" if subseries
21
+ result += "M" if dual_m
22
+ else
23
+ # No letter (e.g., DataSeries, ISO/ASTM dual)
24
+ result = number.to_s
25
+ result += suffix if suffix
26
+ result += "-S#{subseries}" if subseries
27
+ end
28
+ result
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ class Identifier < Pubid::Identifier
6
+ def self.parse(str)
7
+ parser = Parser.new
8
+ builder = Builder.new
9
+
10
+ parsed = parser.parse(str)
11
+ builder.build(parsed)
12
+ end
13
+
14
+ # Factory that builds an ASTM identifier from a hash of primitives.
15
+ # Default is {Identifiers::Standard}.
16
+ #
17
+ # ASTM's Code Component has :letter (single letter A–Z) + :number
18
+ # (rest); `.create` accepts either an already-split pair or a
19
+ # combined `:code` string which it splits at the first digit.
20
+ TYPE_KEY_TO_KLASS = {
21
+ standard: "Standard",
22
+ adjunct: "Adjunct",
23
+ manual: "Manual",
24
+ monograph: "Monograph",
25
+ research_report: "ResearchReport",
26
+ technical_report: "TechnicalReport",
27
+ data_series: "DataSeries",
28
+ iso_dual_published: "IsoDualPublished",
29
+ work_in_progress: "WorkInProgress",
30
+ }.freeze
31
+
32
+ def self.create(type: nil, **opts)
33
+ klass = resolve_create_class(type)
34
+ klass.new(**coerce_create_attrs(opts, klass: klass))
35
+ end
36
+
37
+ def self.resolve_create_class(type)
38
+ return Identifiers::Standard if type.nil?
39
+
40
+ klass_name = TYPE_KEY_TO_KLASS[type.to_sym]
41
+ raise ArgumentError, "Unknown ASTM type: #{type.inspect}" unless klass_name
42
+
43
+ Identifiers.const_get(klass_name)
44
+ end
45
+
46
+ def self.coerce_create_attrs(opts, klass:)
47
+ attrs = { publisher: (opts[:publisher] || "ASTM").to_s }
48
+
49
+ if opts[:letter] || opts[:number]
50
+ attrs[:code] = Pubid::Astm::Components::Code.new(
51
+ letter: opts[:letter]&.to_s,
52
+ number: opts[:number]&.to_s,
53
+ suffix: opts[:suffix]&.to_s,
54
+ subseries: opts[:subseries]&.to_s,
55
+ dual_m: opts[:dual_m],
56
+ )
57
+ elsif (combined = opts[:code])
58
+ letter, number = split_astm_code(combined.to_s)
59
+ attrs[:code] = Pubid::Astm::Components::Code.new(
60
+ letter: letter, number: number,
61
+ )
62
+ end
63
+
64
+ attrs[:year] = opts[:year].to_s if opts[:year]
65
+ attrs[:format_suffix] = opts[:format_suffix].to_s if opts[:format_suffix]
66
+
67
+ # Pass through subclass-specific kwargs (designation, edition,
68
+ # committee, …) when the class declares them.
69
+ opts.each do |k, v|
70
+ next if attrs.key?(k)
71
+ next if %i[publisher code letter number suffix subseries
72
+ dual_m year format_suffix].include?(k)
73
+ attrs[k] = v if klass.attributes.key?(k)
74
+ end
75
+ attrs
76
+ end
77
+
78
+ # ASTM codes use a single letter prefix (A–Z) followed by digits.
79
+ # "A36" → ["A", "36"]; "E1444" → ["E", "1444"]. Codes without a
80
+ # leading letter (data series numbers, etc.) pass through with
81
+ # letter: nil.
82
+ def self.split_astm_code(str)
83
+ match = str.match(/\A([A-Za-z])(\d.*)\z/)
84
+ return match.captures if match
85
+
86
+ [nil, str]
87
+ end
88
+ private_class_method :resolve_create_class, :coerce_create_attrs,
89
+ :split_astm_code
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ class Adjunct < SingleIdentifier
7
+ attribute :designation, :string # D2148, F3504, G0088, C062702
8
+ attribute :ea_suffix, :boolean # -EA
9
+ attribute :dvd_suffix, :boolean # DVD
10
+
11
+ def to_s
12
+ result = []
13
+ # Only include publisher for simple adjuncts (no EA or DVD suffix)
14
+ result << publisher if publisher && !ea_suffix && !dvd_suffix
15
+ result << "ADJ#{designation}#{'-EA' if ea_suffix}#{'DVD' if dvd_suffix}"
16
+ result.compact.join(" ")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ class Base < SingleIdentifier
7
+ def self.parse(str)
8
+ Pubid::Astm::Identifier.parse(str)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ class DataSeries < Base
7
+ attribute :hol_suffix, :boolean # HOL suffix
8
+
9
+ def to_s
10
+ parts = []
11
+ parts << publisher if publisher
12
+
13
+ result = parts.join(" ")
14
+ result += " " if publisher && !result.end_with?(" ")
15
+
16
+ result += "DS"
17
+ result += code.to_s if code
18
+ result += "HOL" if hol_suffix
19
+ result += format_suffix if format_suffix
20
+ result
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../iso/components/publisher"
4
+ require_relative "../../components/date"
5
+
6
+ module Pubid
7
+ module Astm
8
+ module Identifiers
9
+ # IsoDualPublished represents ASTM standards that are dual-published with ISO
10
+ #
11
+ # SEMANTIC NOTE: ISO/ASTM dual-published standards (typically 5xxxx series)
12
+ # - ASTM version: ASTM 52303-24e1 (e1 = edition 1, not "E" prefix)
13
+ # - ISO version: ISO/ASTM 52303:2024
14
+ #
15
+ # Distinguishing feature: Starts with digit (typically 5xxxx series)
16
+ # These are ASTM's version of standards jointly developed with ISO
17
+ class IsoDualPublished < Standard
18
+ # Inherits all behavior from Standard:
19
+ # - sub_year (a, b, c)
20
+ # - reapproval ((2023))
21
+ # - edition (e1)
22
+ # - code (number without letter prefix)
23
+ # - year (2024 → 24)
24
+
25
+ # No additional attributes needed - same structure as Standard
26
+ # The semantic difference is the classification itself
27
+
28
+ # Rendering is identical to Standard
29
+ # Example: ASTM 52303-24e1
30
+
31
+ # Convert to ISO/ASTM dual-published format
32
+ # @return [Pubid::Iso::Identifiers::InternationalStandard] ISO version
33
+ #
34
+ # @example Convert ASTM to ISO format
35
+ # astm = Pubid::Astm.parse("ASTM 52303-24e1")
36
+ # iso = astm.to_iso_identifier
37
+ # iso.to_s # => "ISO/ASTM 52303:2024"
38
+ def to_iso_identifier
39
+ require_relative "../../iso/identifiers/international_standard"
40
+ require_relative "../../iso/components/code"
41
+ require_relative "../../components/publisher"
42
+
43
+ iso = Pubid::Iso::Identifiers::InternationalStandard.new
44
+
45
+ # Set publisher as ISO with ASTM as copublisher (in Publisher component)
46
+ iso.publisher = Pubid::Iso::Components::Publisher.new(
47
+ publisher: "ISO",
48
+ copublisher: ["ASTM"],
49
+ )
50
+
51
+ # Also set copublishers attribute (array of Publisher objects) for rendering
52
+ astm_publisher = ::Pubid::Components::Publisher.new(body: "ASTM")
53
+ iso.copublishers = [astm_publisher]
54
+
55
+ # Set code number (same as ASTM) - use ISO Code component
56
+ if code
57
+ iso_code = Pubid::Iso::Components::Code.new
58
+ iso_code.number = code.number
59
+ iso.number = iso_code
60
+ end
61
+
62
+ # Set year as date component - use base Date component
63
+ if year
64
+ iso_date = ::Pubid::Components::Date.new
65
+ iso_date.year = year.to_s
66
+ iso.date = iso_date
67
+ end
68
+
69
+ iso
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ class Manual < Base
7
+ attribute :edition, :string # 9TH, 2ND
8
+ attribute :supplement, :boolean # -SUP-
9
+ attribute :tp_designation, :string # TP for technical publications
10
+
11
+ def to_s
12
+ parts = []
13
+ parts << publisher if publisher
14
+ parts << "MNL"
15
+ parts << "TP" if tp_designation
16
+ parts << code.number if code
17
+
18
+ result = parts.join
19
+
20
+ # Edition with dash separator
21
+ result += "-#{edition}" if edition
22
+
23
+ # Add separator after publisher
24
+ if publisher
25
+ # Insert space after publisher
26
+ result = "#{publisher} #{result[publisher.length..]}"
27
+ end
28
+
29
+ # Add supplement if present
30
+ result += "-SUP" if supplement
31
+
32
+ # Add format suffix (already has dash from builder)
33
+ result += format_suffix if format_suffix
34
+
35
+ result
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ class Monograph < Base
7
+ attribute :edition, :string # 2ND, 4TH
8
+
9
+ def to_s
10
+ parts = []
11
+ parts << publisher if publisher
12
+
13
+ result = parts.join(" ")
14
+ result += " " if publisher && !result.end_with?(" ")
15
+
16
+ result += "MONO"
17
+ result += code.number if code
18
+ result += "-#{edition}" if edition
19
+ result += format_suffix if format_suffix
20
+ result
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ class ResearchReport < Base
7
+ attribute :committee, :string # A01, C09
8
+
9
+ def to_s
10
+ parts = []
11
+ parts << publisher if publisher
12
+ parts << "RR:#{committee}-#{code.number}" if committee && code
13
+ parts.join(" ")
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ class Standard < Base
7
+ attribute :sub_year, :string # a, b, c
8
+ attribute :reapproval, :string # (2023)
9
+ attribute :edition, :string # e1
10
+
11
+ def to_s
12
+ parts = []
13
+ parts << publisher if publisher
14
+
15
+ # Code with potential dual unit
16
+ if code
17
+ code_str = code.to_s
18
+ # Check if this is a dual unit designation
19
+ if code.dual_m
20
+ # F1862/F1862M format
21
+ base_code = "#{code.letter}#{code.number}"
22
+ code_str = "#{base_code}/#{base_code}M"
23
+ end
24
+ parts << code_str
25
+ end
26
+
27
+ # Join parts with space (ASTM E2938)
28
+ result = parts.join(" ")
29
+
30
+ # Append year directly without space
31
+ if year
32
+ result += "-#{year_portion}"
33
+ result += sub_year if sub_year
34
+ end
35
+
36
+ # Append reapproval
37
+ result += "(#{reapproval})" if reapproval
38
+
39
+ # Append edition
40
+ result += "e#{edition}" if edition
41
+
42
+ result
43
+ end
44
+
45
+ def year_portion
46
+ # Convert 4-digit to 2-digit (e.g., 2015 → 15)
47
+ year.to_s.length == 4 ? year.to_s[-2..] : year.to_s
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ class TechnicalReport < Base
7
+ def to_s
8
+ # Check if ISO/ASTM format: publisher "ISO/ASTM" without TR letter in code
9
+ if publisher == "ISO/ASTM" && (code.nil? || code.letter.nil?)
10
+ result = "ISO/ASTMTR"
11
+ else
12
+ # Simple TR format
13
+ result = "TR"
14
+ result += code.letter if code&.letter
15
+ end
16
+ result += code.number if code&.number
17
+ result += format_suffix if format_suffix
18
+ result
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ class WorkInProgress < Base
7
+ def to_s
8
+ parts = []
9
+ parts << publisher if publisher
10
+
11
+ result = parts.join(" ")
12
+ result += " " if publisher && !result.end_with?(" ")
13
+
14
+ result += "WK"
15
+ result += code.number if code
16
+ result
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,244 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Astm
7
+ class Parser < Parslet::Parser
8
+ # Basic building blocks
9
+ rule(:space) { str(" ") }
10
+ rule(:dash) { str("-") }
11
+ rule(:slash) { str("/") }
12
+ rule(:colon) { str(":") }
13
+ rule(:dot) { str(".") }
14
+ rule(:digit) { match("[0-9]") }
15
+ rule(:digits) { digit.repeat(1) }
16
+ rule(:letter) { match("[A-Z]") }
17
+ rule(:letters) { letter.repeat(1) }
18
+
19
+ # Publisher
20
+ rule(:publisher) { str("ASTM").as(:publisher) >> space.maybe }
21
+
22
+ # Letters A-G for standard types
23
+ rule(:standard_letter) { match("[A-G]").as(:letter) }
24
+
25
+ # Year patterns (2-digit)
26
+ rule(:year_2digit) { digit.repeat(2, 2).as(:year) }
27
+
28
+ # Reapproval notation (may have comment after)
29
+ rule(:reapproval) do
30
+ str("(") >> digit.repeat(4, 4).as(:reapproval) >> str(")")
31
+ end
32
+
33
+ # Comment portion (anything after #)
34
+ rule(:comment) { space.maybe >> str("#") >> match("[^#]").repeat }
35
+
36
+ # Edition notations - supports both ordinal (1ST, 2ND) and e-notation (e1, e2)
37
+ # For e-notation, capture just the digits (not the 'e' prefix)
38
+ # For ordinal notation, capture the whole string
39
+ rule(:edition) do
40
+ (
41
+ (str("e") >> digits.as(:edition_number)) |
42
+ str("9TH") | str("8TH") | str("7TH") | str("6TH") |
43
+ str("5TH") | str("4TH") | str("3RD") | str("2ND") |
44
+ str("1ST")
45
+ ).as(:edition)
46
+ end
47
+
48
+ # Sub-year notation (a, b, c)
49
+ rule(:sub_year) { match("[a-c]").as(:sub_year) }
50
+
51
+ # Format suffix
52
+ rule(:format_suffix) { dash >> str("EB").as(:format_suffix) }
53
+
54
+ # Format suffix without dash (for use after supplement which ends with dash)
55
+ rule(:format_suffix_no_dash) { str("EB").as(:format_suffix) }
56
+
57
+ # Supplement notation (ends with dash)
58
+ rule(:supplement) { dash >> str("SUP").as(:supplement) >> dash }
59
+
60
+ # ========================================
61
+ # Research Report - MOST SPECIFIC (has colon)
62
+ # ========================================
63
+ rule(:research_report) do
64
+ publisher.maybe >>
65
+ str("RR").as(:type) >>
66
+ colon >>
67
+ (letter >> digit.repeat(2, 2)).as(:committee) >>
68
+ dash >>
69
+ digits.as(:number)
70
+ end
71
+
72
+ # ========================================
73
+ # Manual
74
+ # ========================================
75
+ rule(:manual) do
76
+ publisher.maybe >>
77
+ str("MNL").as(:type) >>
78
+ str("TP").as(:tp_designation).maybe >>
79
+ digits.as(:number) >>
80
+ (dash >> edition).maybe >>
81
+ (
82
+ (supplement >> format_suffix_no_dash.maybe) |
83
+ format_suffix.maybe
84
+ )
85
+ end
86
+
87
+ # ========================================
88
+ # Monograph
89
+ # ========================================
90
+ rule(:monograph) do
91
+ publisher.maybe >>
92
+ str("MONO").as(:type) >>
93
+ digits.as(:number) >>
94
+ (dash >> edition).maybe >>
95
+ format_suffix.maybe
96
+ end
97
+
98
+ # ========================================
99
+ # Data Series
100
+ # ========================================
101
+ rule(:data_series_suffix) { match("[A-Z]").as(:suffix) }
102
+ # Subseries can be: -S4 OR S4 (when following a letter suffix)
103
+ rule(:data_series_subseries_with_dash) do
104
+ dash >> str("S") >> digits.as(:subseries)
105
+ end
106
+ rule(:data_series_subseries_no_dash) do
107
+ digits.as(:subseries) # Directly after letter suffix
108
+ end
109
+ rule(:data_series_code) do
110
+ digits.as(:number) >>
111
+ (
112
+ str("HOL").as(:hol_suffix) |
113
+ (data_series_suffix >> data_series_subseries_no_dash.maybe) |
114
+ data_series_subseries_with_dash
115
+ ).maybe
116
+ end
117
+
118
+ rule(:data_series) do
119
+ publisher.maybe >>
120
+ str("DS").as(:type) >>
121
+ data_series_code >>
122
+ format_suffix.maybe
123
+ end
124
+
125
+ # ========================================
126
+ # Work in Progress
127
+ # ========================================
128
+ rule(:work_in_progress) do
129
+ publisher.maybe >>
130
+ str("WK").as(:type) >>
131
+ digits.as(:number)
132
+ end
133
+
134
+ # ========================================
135
+ # Adjunct
136
+ # ========================================
137
+ # SEMANTIC NOTE: Adjunct identifiers reference a base standard
138
+ # Structure: ADJ + base_standard_code + adjunct_designation
139
+ # Examples:
140
+ # ADJF3504-EA: Adjunct to F3504, EA = Excel file format
141
+ # ADJC033501: Adjunct "01" to C335
142
+ # ADJC0450A: Adjunct format "A" to C450
143
+ # ADJE11211T: Adjunct "11T" to E112
144
+ # ADJDQCALC: Adjunct with text designation (not to numbered standard)
145
+ # Adjunct formats: EA (Excel), E-PDF, A1A2 (arbitrary identifiers)
146
+ # One standard can have multiple adjuncts
147
+ rule(:adjunct) do
148
+ publisher.maybe >>
149
+ str("ADJ").as(:type) >>
150
+ ((letter >> digits) | letters | digits).as(:designation) >>
151
+ (dash >> str("EA")).maybe.as(:ea_suffix) >>
152
+ str("DVD").maybe.as(:dvd_suffix)
153
+ end
154
+
155
+ # ========================================
156
+ # Technical Report
157
+ # ========================================
158
+ rule(:technical_report_iso_astm) do
159
+ str("ISO/ASTMTR").as(:type) >>
160
+ digits.as(:number) >>
161
+ format_suffix.maybe >>
162
+ comment.maybe
163
+ end
164
+
165
+ rule(:technical_report_simple) do
166
+ publisher.maybe >>
167
+ str("TR").as(:type) >>
168
+ digits.as(:number) >>
169
+ format_suffix.maybe >>
170
+ comment.maybe
171
+ end
172
+
173
+ rule(:technical_report) do
174
+ technical_report_iso_astm | technical_report_simple
175
+ end
176
+
177
+ # ========================================
178
+ # Standard (DEFAULT - handles A-G prefix AND digit-only E-standards)
179
+ # ========================================
180
+
181
+ # SEMANTIC NOTE: 5xxxx digit-only standards are ISO/ASTM dual-published
182
+ # Examples:
183
+ # ASTM 52303-24e1: ASTM's version (e1 = edition 1, not "E" prefix)
184
+ # ISO/ASTM 52303:2024: ISO's published version of the same document
185
+ # These should semantically be IsoDualPublishedIdentifier or similar
186
+ # Parser currently accepts them as digit-only standards
187
+
188
+ # NOTE: Reference Radiographs (RR) are a separate document type not yet implemented
189
+ # Examples:
190
+ # RRE341903: Reference radiograph for standard E3419
191
+ # RRE015501: Reference radiograph, volume 1
192
+ # RRE2669CS: Adjunct to E2669 reference radiograph
193
+ # These require separate ReferenceRadiograph identifier class
194
+
195
+ # Dual unit pattern: F1862/F1862M
196
+ rule(:dual_unit) do
197
+ slash >>
198
+ standard_letter >>
199
+ digits >>
200
+ str("M").as(:dual_m)
201
+ end
202
+
203
+ rule(:standard_code_with_letter) do
204
+ standard_letter >>
205
+ digits.as(:number) >>
206
+ dual_unit.maybe
207
+ end
208
+
209
+ # Digit-only standards (primarily 5xxxx ISO/ASTM dual-published)
210
+ # Parsed as digit-only, semantic meaning is dual-published with ISO
211
+ rule(:standard_code_digit_only) do
212
+ digits.as(:number) # Accept digit-only, no implicit E prefix
213
+ end
214
+
215
+ rule(:standard) do
216
+ publisher.maybe >>
217
+ (standard_code_with_letter | standard_code_digit_only) >>
218
+ (
219
+ dash >> year_2digit >>
220
+ sub_year.maybe >>
221
+ reapproval.maybe >>
222
+ edition.maybe
223
+ ).maybe >>
224
+ comment.maybe
225
+ end
226
+
227
+ # ========================================
228
+ # Main identifier rule - ORDER MATTERS!
229
+ # ========================================
230
+ rule(:identifier) do
231
+ research_report | # Most specific (has colon)
232
+ technical_report | # Has TR prefix
233
+ manual | # Has MNL prefix
234
+ monograph | # Has MONO prefix
235
+ data_series | # Has DS prefix
236
+ work_in_progress | # Has WK prefix
237
+ adjunct | # Has ADJ prefix
238
+ standard # DEFAULT (A-G letter)
239
+ end
240
+
241
+ root(:identifier)
242
+ end
243
+ end
244
+ end