pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.4

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 (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +25 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +4 -55
  6. data/lib/pubid/amca/identifiers/base.rb +58 -47
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -21
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -17
  9. data/lib/pubid/amca/identifiers/standard.rb +0 -4
  10. data/lib/pubid/amca/renderer.rb +82 -0
  11. data/lib/pubid/amca/single_identifier.rb +0 -23
  12. data/lib/pubid/amca/urn_generator.rb +2 -1
  13. data/lib/pubid/amca/urn_parser.rb +28 -0
  14. data/lib/pubid/amca.rb +42 -1
  15. data/lib/pubid/ansi/builder.rb +5 -3
  16. data/lib/pubid/ansi/identifier.rb +1 -43
  17. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  18. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  19. data/lib/pubid/ansi/renderer.rb +53 -0
  20. data/lib/pubid/ansi/single_identifier.rb +2 -31
  21. data/lib/pubid/ansi/urn_generator.rb +3 -38
  22. data/lib/pubid/ansi/urn_parser.rb +23 -0
  23. data/lib/pubid/ansi.rb +38 -3
  24. data/lib/pubid/api/builder.rb +33 -74
  25. data/lib/pubid/api/identifier.rb +5 -52
  26. data/lib/pubid/api/identifiers/base.rb +2 -14
  27. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  28. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  29. data/lib/pubid/api/identifiers/mpms.rb +0 -20
  30. data/lib/pubid/api/identifiers/publication.rb +0 -2
  31. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  32. data/lib/pubid/api/identifiers/specification.rb +0 -2
  33. data/lib/pubid/api/identifiers/standard.rb +0 -2
  34. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  35. data/lib/pubid/api/identifiers/typeless_standard.rb +0 -16
  36. data/lib/pubid/api/identifiers.rb +18 -0
  37. data/lib/pubid/api/renderer.rb +89 -0
  38. data/lib/pubid/api/single_identifier.rb +5 -20
  39. data/lib/pubid/api/urn_generator.rb +0 -18
  40. data/lib/pubid/api/urn_parser.rb +35 -0
  41. data/lib/pubid/api.rb +51 -5
  42. data/lib/pubid/ashrae/builder.rb +3 -3
  43. data/lib/pubid/ashrae/identifier.rb +7 -55
  44. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  45. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  46. data/lib/pubid/ashrae/identifiers/base.rb +29 -15
  47. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  48. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  49. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  50. data/lib/pubid/ashrae/parser.rb +4 -0
  51. data/lib/pubid/ashrae/renderer.rb +117 -0
  52. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  53. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  54. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  55. data/lib/pubid/ashrae.rb +46 -1
  56. data/lib/pubid/asme/components/code.rb +10 -2
  57. data/lib/pubid/asme/identifier.rb +0 -46
  58. data/lib/pubid/asme/identifiers/base.rb +0 -60
  59. data/lib/pubid/asme/renderer.rb +66 -0
  60. data/lib/pubid/asme/single_identifier.rb +3 -1
  61. data/lib/pubid/asme/urn_parser.rb +31 -0
  62. data/lib/pubid/asme.rb +42 -1
  63. data/lib/pubid/astm/components/code.rb +9 -0
  64. data/lib/pubid/{jis → astm}/components.rb +1 -1
  65. data/lib/pubid/astm/identifier.rb +0 -77
  66. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  67. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  68. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  69. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  70. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  71. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  72. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  73. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  74. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  75. data/lib/pubid/astm/identifiers.rb +18 -0
  76. data/lib/pubid/astm/renderer.rb +172 -0
  77. data/lib/pubid/astm/single_identifier.rb +3 -11
  78. data/lib/pubid/astm/urn_parser.rb +30 -0
  79. data/lib/pubid/astm.rb +39 -27
  80. data/lib/pubid/bsi/builder.rb +21 -12
  81. data/lib/pubid/bsi/identifier.rb +5 -85
  82. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -36
  83. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +8 -48
  84. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +8 -39
  85. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +2 -55
  86. data/lib/pubid/bsi/identifiers/amendment.rb +2 -22
  87. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +1 -6
  88. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  89. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -87
  90. data/lib/pubid/bsi/identifiers/committee_document.rb +0 -16
  91. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -87
  92. data/lib/pubid/bsi/identifiers/corrigendum.rb +2 -10
  93. data/lib/pubid/bsi/identifiers/detailed_specification.rb +0 -36
  94. data/lib/pubid/bsi/identifiers/disc.rb +0 -29
  95. data/lib/pubid/bsi/identifiers/draft_document.rb +2 -46
  96. data/lib/pubid/bsi/identifiers/electronic_book.rb +2 -38
  97. data/lib/pubid/bsi/identifiers/expert_commentary.rb +2 -18
  98. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +0 -47
  99. data/lib/pubid/bsi/identifiers/flex.rb +0 -35
  100. data/lib/pubid/bsi/identifiers/handbook.rb +1 -15
  101. data/lib/pubid/bsi/identifiers/index.rb +0 -32
  102. data/lib/pubid/bsi/identifiers/method.rb +0 -41
  103. data/lib/pubid/bsi/identifiers/national_annex.rb +4 -29
  104. data/lib/pubid/bsi/identifiers/practice_guide.rb +1 -6
  105. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +2 -54
  106. data/lib/pubid/bsi/identifiers/published_document.rb +2 -54
  107. data/lib/pubid/bsi/identifiers/section.rb +0 -30
  108. data/lib/pubid/bsi/identifiers/set.rb +3 -20
  109. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +0 -9
  110. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -24
  111. data/lib/pubid/bsi/identifiers/supplementary_index.rb +0 -46
  112. data/lib/pubid/bsi/identifiers/technical_specification.rb +2 -47
  113. data/lib/pubid/bsi/identifiers/test_method.rb +0 -32
  114. data/lib/pubid/bsi/identifiers/value_added_publication.rb +2 -17
  115. data/lib/pubid/bsi/identifiers.rb +0 -1
  116. data/lib/pubid/bsi/renderer.rb +1050 -0
  117. data/lib/pubid/bsi/single_identifier.rb +33 -78
  118. data/lib/pubid/bsi/urn_generator.rb +2 -3
  119. data/lib/pubid/bsi/urn_parser.rb +52 -0
  120. data/lib/pubid/bsi.rb +232 -2
  121. data/lib/pubid/builder/base.rb +57 -10
  122. data/lib/pubid/bundled_identifier.rb +0 -1
  123. data/lib/pubid/ccsds/builder.rb +4 -3
  124. data/lib/pubid/ccsds/identifier.rb +53 -68
  125. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  126. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  127. data/lib/pubid/ccsds/parser.rb +4 -2
  128. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  129. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  130. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  131. data/lib/pubid/ccsds.rb +39 -1
  132. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  133. data/lib/pubid/cen_cenelec/identifier.rb +11 -40
  134. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +9 -4
  135. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +0 -10
  136. data/lib/pubid/cen_cenelec/identifiers/base.rb +2 -45
  137. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +0 -27
  140. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +0 -15
  141. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +2 -8
  143. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +0 -4
  145. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  146. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  147. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  148. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  149. data/lib/pubid/cen_cenelec/single_identifier.rb +9 -90
  150. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  151. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  152. data/lib/pubid/cen_cenelec.rb +172 -1
  153. data/lib/pubid/cie/components/code.rb +8 -0
  154. data/lib/pubid/cie/identifier.rb +10 -57
  155. data/lib/pubid/cie/single_identifier.rb +4 -4
  156. data/lib/pubid/cie/urn_parser.rb +28 -0
  157. data/lib/pubid/cie.rb +47 -1
  158. data/lib/pubid/components/adoption.rb +104 -0
  159. data/lib/pubid/components/code.rb +22 -8
  160. data/lib/pubid/components/date.rb +23 -16
  161. data/lib/pubid/components/edition.rb +9 -6
  162. data/lib/pubid/components/iteration.rb +32 -0
  163. data/lib/pubid/components/language.rb +6 -4
  164. data/lib/pubid/components/locality.rb +10 -1
  165. data/lib/pubid/components/publisher.rb +9 -6
  166. data/lib/pubid/components/relationship.rb +151 -0
  167. data/lib/pubid/components/stage.rb +5 -14
  168. data/lib/pubid/components/supplement.rb +184 -0
  169. data/lib/pubid/components/type.rb +5 -15
  170. data/lib/pubid/components/typed_stage.rb +10 -11
  171. data/lib/pubid/components.rb +4 -1
  172. data/lib/pubid/core/update_codes.rb +28 -7
  173. data/lib/pubid/csa/identifier.rb +9 -59
  174. data/lib/pubid/csa/identifiers/base.rb +0 -123
  175. data/lib/pubid/csa/identifiers/cec.rb +0 -103
  176. data/lib/pubid/csa/identifiers/series.rb +0 -104
  177. data/lib/pubid/csa/renderer.rb +292 -0
  178. data/lib/pubid/csa/single_identifier.rb +1 -1
  179. data/lib/pubid/csa/urn_generator.rb +1 -1
  180. data/lib/pubid/csa/urn_parser.rb +33 -0
  181. data/lib/pubid/csa.rb +46 -1
  182. data/lib/pubid/etsi/components/code.rb +10 -9
  183. data/lib/pubid/etsi/components/version.rb +0 -5
  184. data/lib/pubid/etsi/identifier.rb +4 -55
  185. data/lib/pubid/etsi/identifiers/base.rb +31 -27
  186. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +1 -11
  187. data/lib/pubid/etsi/renderer.rb +42 -0
  188. data/lib/pubid/etsi/urn_parser.rb +34 -0
  189. data/lib/pubid/etsi.rb +44 -1
  190. data/lib/pubid/export/exporter.rb +4 -46
  191. data/lib/pubid/export/flavor_exporter.rb +111 -278
  192. data/lib/pubid/export.rb +0 -6
  193. data/lib/pubid/identifier.rb +92 -18
  194. data/lib/pubid/identifier_metadata.rb +1 -1
  195. data/lib/pubid/idf/builder.rb +3 -3
  196. data/lib/pubid/idf/identifier.rb +7 -66
  197. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  198. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  199. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  200. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  201. data/lib/pubid/idf/parser.rb +3 -2
  202. data/lib/pubid/idf/renderer.rb +84 -0
  203. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  204. data/lib/pubid/idf/urn_generator.rb +4 -39
  205. data/lib/pubid/idf/urn_parser.rb +25 -0
  206. data/lib/pubid/idf.rb +55 -1
  207. data/lib/pubid/iec/builder.rb +46 -64
  208. data/lib/pubid/iec/components/code.rb +8 -32
  209. data/lib/pubid/iec/components/publisher.rb +0 -1
  210. data/lib/pubid/iec/components.rb +14 -0
  211. data/lib/pubid/iec/identifier.rb +251 -213
  212. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  213. data/lib/pubid/iec/identifiers/base.rb +5 -33
  214. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  215. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  216. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +23 -26
  217. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  218. data/lib/pubid/iec/identifiers/fragment_identifier.rb +35 -24
  219. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  220. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  221. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  222. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  223. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  224. data/lib/pubid/iec/identifiers/sheet_identifier.rb +17 -11
  225. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  226. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  227. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  228. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  229. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  230. data/lib/pubid/iec/identifiers/test_report_form.rb +3 -35
  231. data/lib/pubid/iec/identifiers/vap_identifier.rb +24 -21
  232. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  233. data/lib/pubid/iec/identifiers/working_document.rb +2 -50
  234. data/lib/pubid/iec/identifiers.rb +30 -0
  235. data/lib/pubid/iec/parser.rb +13 -12
  236. data/lib/pubid/iec/renderer.rb +254 -0
  237. data/lib/pubid/iec/single_identifier.rb +6 -12
  238. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  239. data/lib/pubid/iec/urn_generator.rb +3 -3
  240. data/lib/pubid/iec/urn_parser.rb +3 -3
  241. data/lib/pubid/iec.rb +43 -67
  242. data/lib/pubid/ieee/builder.rb +12 -12
  243. data/lib/pubid/ieee/components/code.rb +8 -0
  244. data/lib/pubid/ieee/components/draft.rb +14 -0
  245. data/lib/pubid/ieee/components/relationship.rb +5 -149
  246. data/lib/pubid/ieee/identifier.rb +5 -52
  247. data/lib/pubid/ieee/identifiers/adopted_standard.rb +0 -9
  248. data/lib/pubid/ieee/identifiers/base.rb +221 -556
  249. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +0 -10
  250. data/lib/pubid/ieee/identifiers/corrigendum.rb +0 -12
  251. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +0 -10
  252. data/lib/pubid/ieee/identifiers/dual_identifier.rb +0 -4
  253. data/lib/pubid/ieee/identifiers/dual_published.rb +0 -4
  254. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +0 -9
  255. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +0 -10
  256. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  257. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +0 -18
  258. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +0 -6
  259. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  260. data/lib/pubid/ieee/identifiers/redlined_standard.rb +0 -7
  261. data/lib/pubid/ieee/identifiers/si_standard.rb +0 -38
  262. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  263. data/lib/pubid/ieee/pre_parser.rb +301 -0
  264. data/lib/pubid/ieee/renderer.rb +307 -0
  265. data/lib/pubid/ieee/urn_parser.rb +34 -0
  266. data/lib/pubid/ieee.rb +66 -1
  267. data/lib/pubid/ieee_debug.rb +0 -1
  268. data/lib/pubid/iho/builder.rb +2 -2
  269. data/lib/pubid/iho/identifier.rb +7 -59
  270. data/lib/pubid/iho/identifiers/base.rb +64 -31
  271. data/lib/pubid/iho/parser.rb +3 -3
  272. data/lib/pubid/iho/renderer.rb +30 -0
  273. data/lib/pubid/iho/urn_generator.rb +2 -2
  274. data/lib/pubid/iho/urn_parser.rb +58 -0
  275. data/lib/pubid/iho.rb +52 -1
  276. data/lib/pubid/iso/builder.rb +55 -53
  277. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  278. data/lib/pubid/iso/components/code.rb +7 -19
  279. data/lib/pubid/iso/components/publisher.rb +10 -8
  280. data/lib/pubid/iso/components.rb +2 -4
  281. data/lib/pubid/iso/identifier.rb +219 -252
  282. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  283. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  284. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  285. data/lib/pubid/iso/identifiers/data.rb +0 -1
  286. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  287. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  288. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  289. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  290. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  291. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  292. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  293. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  294. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  295. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  296. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  297. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  298. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  299. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  300. data/lib/pubid/iso/identifiers.rb +0 -1
  301. data/lib/pubid/iso/normalizer.rb +89 -0
  302. data/lib/pubid/iso/parser.rb +22 -4
  303. data/lib/pubid/iso/single_identifier.rb +0 -4
  304. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  305. data/lib/pubid/iso/urn_generator.rb +66 -182
  306. data/lib/pubid/iso/urn_parser.rb +12 -7
  307. data/lib/pubid/iso.rb +177 -2
  308. data/lib/pubid/itu/builder.rb +0 -12
  309. data/lib/pubid/itu/components/code.rb +9 -7
  310. data/lib/pubid/itu/components/sector.rb +15 -4
  311. data/lib/pubid/itu/components/series.rb +0 -4
  312. data/lib/pubid/itu/components.rb +11 -0
  313. data/lib/pubid/itu/identifier.rb +4 -116
  314. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  315. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  316. data/lib/pubid/itu/identifiers/base.rb +124 -128
  317. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  318. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  319. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  320. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  321. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  322. data/lib/pubid/itu/urn_parser.rb +23 -0
  323. data/lib/pubid/itu.rb +44 -1
  324. data/lib/pubid/jcgm/builder.rb +16 -8
  325. data/lib/pubid/jcgm/identifier.rb +0 -43
  326. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -9
  327. data/lib/pubid/jcgm/identifiers/gum_guide.rb +0 -12
  328. data/lib/pubid/jcgm/renderer.rb +68 -0
  329. data/lib/pubid/jcgm/single_identifier.rb +0 -8
  330. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  331. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  332. data/lib/pubid/jcgm.rb +43 -2
  333. data/lib/pubid/jis/builder.rb +44 -52
  334. data/lib/pubid/jis/identifier.rb +120 -46
  335. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  336. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  337. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  338. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  339. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  340. data/lib/pubid/jis/identifiers.rb +1 -1
  341. data/lib/pubid/jis/parser.rb +31 -5
  342. data/lib/pubid/jis/renderer.rb +69 -0
  343. data/lib/pubid/jis/single_identifier.rb +6 -12
  344. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  345. data/lib/pubid/jis/urn_parser.rb +23 -0
  346. data/lib/pubid/jis.rb +42 -2
  347. data/lib/pubid/nist/builder.rb +63 -1871
  348. data/lib/pubid/nist/caster.rb +1272 -0
  349. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  350. data/lib/pubid/nist/components/code.rb +9 -20
  351. data/lib/pubid/nist/components/supplement.rb +2 -2
  352. data/lib/pubid/nist/components.rb +0 -1
  353. data/lib/pubid/nist/identifier.rb +8 -60
  354. data/lib/pubid/nist/identifiers/base.rb +564 -492
  355. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  356. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  358. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  359. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  360. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  361. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  362. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  363. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  364. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  365. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  366. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  367. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  368. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  369. data/lib/pubid/nist/identifiers/report.rb +4 -2
  370. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  371. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  372. data/lib/pubid/nist/identifiers.rb +1 -0
  373. data/lib/pubid/nist/parser.rb +62 -452
  374. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  375. data/lib/pubid/nist/preprocessor.rb +428 -0
  376. data/lib/pubid/nist/renderer.rb +43 -0
  377. data/lib/pubid/nist/router.rb +148 -0
  378. data/lib/pubid/nist/series/base.rb +58 -0
  379. data/lib/pubid/nist/series/crpl.rb +13 -0
  380. data/lib/pubid/nist/series/fips.rb +14 -0
  381. data/lib/pubid/nist/series/ir.rb +60 -0
  382. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  383. data/lib/pubid/nist/series/mono.rb +19 -0
  384. data/lib/pubid/nist/series/ncstar.rb +20 -0
  385. data/lib/pubid/nist/series.rb +49 -0
  386. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  387. data/lib/pubid/nist/urn_parser.rb +67 -0
  388. data/lib/pubid/nist.rb +86 -4
  389. data/lib/pubid/oiml/builder.rb +21 -3
  390. data/lib/pubid/oiml/components/code.rb +17 -0
  391. data/lib/pubid/oiml/identifier.rb +40 -46
  392. data/lib/pubid/oiml/identifiers/annex.rb +13 -46
  393. data/lib/pubid/oiml/identifiers/errata.rb +15 -0
  394. data/lib/pubid/oiml/identifiers.rb +1 -1
  395. data/lib/pubid/oiml/parser.rb +59 -12
  396. data/lib/pubid/oiml/renderer.rb +171 -0
  397. data/lib/pubid/oiml/single_identifier.rb +61 -42
  398. data/lib/pubid/oiml/supplement_identifier.rb +31 -17
  399. data/lib/pubid/oiml/urn_generator.rb +0 -8
  400. data/lib/pubid/oiml/urn_parser.rb +22 -0
  401. data/lib/pubid/oiml.rb +42 -1
  402. data/lib/pubid/plateau/identifier.rb +4 -55
  403. data/lib/pubid/plateau/identifiers/base.rb +45 -36
  404. data/lib/pubid/plateau/identifiers/handbook.rb +0 -6
  405. data/lib/pubid/plateau/identifiers/technical_report.rb +0 -4
  406. data/lib/pubid/plateau/renderer.rb +51 -0
  407. data/lib/pubid/plateau/supplement_identifier.rb +0 -4
  408. data/lib/pubid/plateau/urn_parser.rb +43 -0
  409. data/lib/pubid/plateau.rb +43 -1
  410. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  411. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  412. data/lib/pubid/renderers/human_readable.rb +18 -7
  413. data/lib/pubid/rendering/context.rb +28 -19
  414. data/lib/pubid/rendering.rb +0 -3
  415. data/lib/pubid/sae/components/date.rb +8 -0
  416. data/lib/pubid/sae/components/type.rb +5 -1
  417. data/lib/pubid/sae/identifier.rb +4 -35
  418. data/lib/pubid/sae/identifiers/base.rb +26 -31
  419. data/lib/pubid/sae/renderer.rb +36 -0
  420. data/lib/pubid/sae/urn_generator.rb +2 -10
  421. data/lib/pubid/sae/urn_parser.rb +36 -0
  422. data/lib/pubid/sae.rb +42 -1
  423. data/lib/pubid/urn_generator/base.rb +12 -12
  424. data/lib/pubid/urn_parser/base.rb +81 -0
  425. data/lib/pubid/urn_parser/errors.rb +9 -0
  426. data/lib/pubid/urn_parser.rb +14 -0
  427. data/lib/pubid/version.rb +1 -1
  428. data/lib/pubid.rb +45 -7
  429. data/lib/tasks/export.rake +6 -5
  430. data/lib/tasks/website-data.json +1940 -1882
  431. metadata +75 -45
  432. data/lib/pubid/amca/scheme.rb +0 -16
  433. data/lib/pubid/ansi/scheme.rb +0 -15
  434. data/lib/pubid/api/scheme.rb +0 -66
  435. data/lib/pubid/ashrae/scheme.rb +0 -53
  436. data/lib/pubid/asme/scheme.rb +0 -37
  437. data/lib/pubid/astm/scheme.rb +0 -55
  438. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  439. data/lib/pubid/bsi/scheme.rb +0 -243
  440. data/lib/pubid/ccsds/scheme.rb +0 -57
  441. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  442. data/lib/pubid/cie/scheme.rb +0 -64
  443. data/lib/pubid/components/factory.rb +0 -50
  444. data/lib/pubid/csa/scheme.rb +0 -44
  445. data/lib/pubid/etsi/scheme.rb +0 -42
  446. data/lib/pubid/export/data_class_exporter.rb +0 -59
  447. data/lib/pubid/export/ieee_exporter.rb +0 -78
  448. data/lib/pubid/export/itu_exporter.rb +0 -66
  449. data/lib/pubid/export/nist_exporter.rb +0 -64
  450. data/lib/pubid/export/registry_exporter.rb +0 -90
  451. data/lib/pubid/export/scheme_exporter.rb +0 -70
  452. data/lib/pubid/identifier_registry.rb +0 -198
  453. data/lib/pubid/idf/scheme.rb +0 -61
  454. data/lib/pubid/iec/scheme.rb +0 -71
  455. data/lib/pubid/ieee/scheme.rb +0 -90
  456. data/lib/pubid/iho/scheme.rb +0 -29
  457. data/lib/pubid/iso/identifiers/base.rb +0 -115
  458. data/lib/pubid/iso/scheme.rb +0 -193
  459. data/lib/pubid/itu/scheme.rb +0 -174
  460. data/lib/pubid/jcgm/scheme.rb +0 -60
  461. data/lib/pubid/jis/components/code.rb +0 -59
  462. data/lib/pubid/jis/identifiers/base.rb +0 -72
  463. data/lib/pubid/jis/scheme.rb +0 -49
  464. data/lib/pubid/nist/components/publisher.rb +0 -24
  465. data/lib/pubid/nist/scheme.rb +0 -199
  466. data/lib/pubid/oiml/identifiers/base.rb +0 -36
  467. data/lib/pubid/oiml/scheme.rb +0 -46
  468. data/lib/pubid/plateau/scheme.rb +0 -45
  469. data/lib/pubid/rendering/base.rb +0 -73
  470. data/lib/pubid/rendering/common.rb +0 -211
  471. data/lib/pubid/rendering/format.rb +0 -25
  472. data/lib/pubid/sae/scheme.rb +0 -47
  473. data/lib/pubid/scheme.rb +0 -219
@@ -5,11 +5,19 @@ require "lutaml/model"
5
5
  module Pubid
6
6
  module Asme
7
7
  module Components
8
+ # Code component for ASME identifiers.
9
+ #
10
+ # Stays independent of Pubid::Components::Code because ASME uses
11
+ # +designator+ (a flavor-specific letter prefix) plus +number+.
8
12
  class Code < Lutaml::Model::Serializable
9
- attribute :designator, :string # B, Y, BPVC, etc.
10
- attribute :number, :string # 16.5, 14.43, III.1.NB, etc.
13
+ attribute :designator, :string
14
+ attribute :number, :string
11
15
 
12
16
  def to_s
17
+ render
18
+ end
19
+
20
+ def render(context: nil)
13
21
  "#{designator}#{number}"
14
22
  end
15
23
  end
@@ -10,52 +10,6 @@ module Pubid
10
10
  parsed = parser.parse(str)
11
11
  builder.build(parsed)
12
12
  end
13
-
14
- # Factory that builds an ASME identifier from a hash of primitives.
15
- # Default is {Identifiers::Standard}. ASME's Code Component has
16
- # `:designator` (leading letters, e.g. "B") and `:number` (rest,
17
- # e.g. "16.34"); `.create` accepts either an already-split pair or
18
- # a combined `:code` string which it splits at the first digit.
19
- def self.create(**opts)
20
- Identifiers::Standard.new(**coerce_create_attrs(opts))
21
- end
22
-
23
- def self.coerce_create_attrs(opts)
24
- attrs = { publisher: (opts[:publisher] || "ASME").to_s }
25
-
26
- if opts[:designator] || opts[:number]
27
- attrs[:code] = Pubid::Asme::Components::Code.new(
28
- designator: opts[:designator]&.to_s,
29
- number: opts[:number]&.to_s,
30
- )
31
- elsif (combined = opts[:code])
32
- designator, number = split_asme_code(combined.to_s)
33
- attrs[:code] = Pubid::Asme::Components::Code.new(
34
- designator: designator,
35
- number: number,
36
- )
37
- end
38
-
39
- %i[year reaffirmation language csa_number draft_year
40
- revision_note parenthetical_revision ptc_suffix
41
- joint_publisher first_publisher first_code].each do |k|
42
- attrs[k] = opts[k].to_s unless opts[k].nil?
43
- end
44
- attrs[:handbook] = opts[:handbook] if opts.key?(:handbook)
45
- attrs
46
- end
47
-
48
- # ASME codes pair a letter designator with a numeric/dotted number.
49
- # Split at the first digit. "B16.34" → ["B", "16.34"]; "Y14.5" →
50
- # ["Y", "14.5"]; "BPVC.III.1.NB" → ["BPVC.III.1.NB", nil] (no
51
- # leading all-letters before the first digit — pass through).
52
- def self.split_asme_code(str)
53
- match = str.match(/\A([A-Za-z]+)(\d.*)\z/)
54
- return match.captures if match
55
-
56
- [str, nil]
57
- end
58
- private_class_method :coerce_create_attrs, :split_asme_code
59
13
  end
60
14
  end
61
15
  end
@@ -4,66 +4,6 @@ module Pubid
4
4
  module Asme
5
5
  module Identifiers
6
6
  class Base < SingleIdentifier
7
- def to_s
8
- # Handle joint published identifiers
9
- parts = []
10
- if first_publisher && first_code
11
- # CSA B44.10/ASME A17.10 or API 579-2/ASME PTB-14 format
12
- parts << first_publisher
13
- parts << first_code
14
- parts << "/#{second_publisher}" if second_publisher
15
- parts << code.to_s if code && code.to_s != ""
16
-
17
- elsif joint_publisher
18
- # ISO/ASME or ASME/ANS format
19
- parts << joint_publisher
20
- parts << code.to_s if code && code.to_s != ""
21
-
22
- else
23
- # Standard ASME format
24
- parts << publisher if publisher
25
- parts << code.to_s if code
26
-
27
- end
28
- result = parts.join(" ")
29
-
30
- # PTC suffix (space-separated)
31
- if ptc_suffix
32
- result += " #{ptc_suffix}"
33
- end
34
-
35
- # CSA dual-published (for ASME/CSA format)
36
- if csa_number
37
- result += "/CSA #{csa_number}"
38
- end
39
-
40
- # Handbook keyword
41
- if handbook
42
- result += " Handbook"
43
- end
44
-
45
- # Year
46
- if draft_year
47
- result += "-#{draft_year}"
48
- elsif year
49
- result += "-#{year}"
50
- end
51
-
52
- # Parenthetical revision (comes after year)
53
- result += " #{parenthetical_revision}" if parenthetical_revision
54
-
55
- # Language (can appear in rendered output)
56
- result += " (#{language})" if language
57
-
58
- # Reaffirmation
59
- result += " (#{reaffirmation})" if reaffirmation
60
-
61
- # Revision note
62
- result += " #{revision_note}" if revision_note
63
-
64
- # Normalize all em-dashes (–, —) and en-dashes to regular dash (-)
65
- result.gsub(/[–—]/, "-")
66
- end
67
7
  end
68
8
  end
69
9
  end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Asme
5
+ # Human-readable renderer for ASME identifiers.
6
+ #
7
+ # Produces strings like:
8
+ # "ASME B16.5-2020"
9
+ # "CSA B44.10/ASME A17.10"
10
+ # "ASME BPVC III.1.NB-2023"
11
+ # "ASME PTC 4-2013"
12
+ #
13
+ # The renderer is registered as the `:human` format in the ASME format
14
+ # registry and invoked via `render(format: :human)`.
15
+ class Renderer < ::Pubid::Renderers::Base
16
+ def render(context: nil, **opts)
17
+ id = @id
18
+ parts = []
19
+
20
+ if id.first_publisher && id.first_code
21
+ # CSA B44.10/ASME A17.10 or API 579-2/ASME PTB-14 format
22
+ parts << id.first_publisher
23
+ parts << id.first_code
24
+ parts << "/#{id.second_publisher}" if id.second_publisher
25
+ parts << id.code.to_s if id.code && id.code.to_s != ""
26
+ elsif id.joint_publisher
27
+ # ISO/ASME or ASME/ANS format
28
+ parts << id.joint_publisher
29
+ parts << id.code.to_s if id.code && id.code.to_s != ""
30
+ else
31
+ # Standard ASME format
32
+ parts << id.publisher if id.publisher
33
+ parts << id.code.to_s if id.code
34
+ end
35
+
36
+ result = parts.join(" ")
37
+
38
+ if id.ptc_suffix
39
+ result += " #{id.ptc_suffix}"
40
+ end
41
+
42
+ if id.csa_number
43
+ result += "/CSA #{id.csa_number}"
44
+ end
45
+
46
+ if id.handbook
47
+ result += " Handbook"
48
+ end
49
+
50
+ if id.draft_year
51
+ result += "-#{id.draft_year}"
52
+ elsif id.year
53
+ result += "-#{id.year}"
54
+ end
55
+
56
+ result += " #{id.parenthetical_revision}" if id.parenthetical_revision
57
+ result += " (#{id.language})" if id.language
58
+ result += " (#{id.reaffirmation})" if id.reaffirmation
59
+ result += " #{id.revision_note}" if id.revision_note
60
+
61
+ # Normalize all em-dashes and en-dashes to regular dash
62
+ result.gsub(/[–—]/, "-")
63
+ end
64
+ end
65
+ end
66
+ end
@@ -2,7 +2,9 @@
2
2
 
3
3
  module Pubid
4
4
  module Asme
5
- class SingleIdentifier < Pubid::Identifier
5
+ # Descends from Pubid::Asme::Identifier (the flavor base) so every concrete
6
+ # ASME identifier is `is_a?(Pubid::Asme::Identifier)`.
7
+ class SingleIdentifier < Identifier
6
8
  # Generate URN for this identifier
7
9
  #
8
10
  # @return [String] URN representation
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Asme
5
+ # Parses ASME URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits:
8
+ # urn:asme:{publisher}:{code}:{year}
9
+ #
10
+ # publisher is the lowercase publisher string. code is the alphanumeric
11
+ # designation (e.g., "B16.5", "PTC1", "BPVC-2023"). The year separator
12
+ # in human-readable form is `-`, not `:`.
13
+ #
14
+ # Examples:
15
+ # - urn:asme:asme:B16.5:2020 → ASME B16.5-2020
16
+ # - urn:asme:asme:PTC1:2020 → ASME PTC1-2020
17
+ # - urn:asme:asme:BPVC-2023 → ASME BPVC-2023
18
+ class UrnParser < Pubid::UrnParser::Base
19
+ def parse_urn(urn)
20
+ body = strip_namespace(urn)
21
+ parts = split_parts(body)
22
+
23
+ _publisher, code, year = parts
24
+
25
+ text = "ASME #{code}"
26
+ text += "-#{year}" if year
27
+ flavor_parse(text)
28
+ end
29
+ end
30
+ end
31
+ end
data/lib/pubid/asme.rb CHANGED
@@ -7,13 +7,54 @@ module Pubid
7
7
  autoload :Identifier, "#{__dir__}/asme/identifier"
8
8
  autoload :Identifiers, "#{__dir__}/asme/identifiers"
9
9
  autoload :Parser, "#{__dir__}/asme/parser"
10
- autoload :Scheme, "#{__dir__}/asme/scheme"
10
+ autoload :Renderer, "#{__dir__}/asme/renderer"
11
11
  autoload :SingleIdentifier, "#{__dir__}/asme/single_identifier"
12
12
  autoload :UrnGenerator, "#{__dir__}/asme/urn_generator"
13
+ autoload :UrnParser, "#{__dir__}/asme/urn_parser"
13
14
 
14
15
  def self.parse(str)
15
16
  Identifier.parse(str)
16
17
  end
18
+
19
+ # Per-flavor format registry: inherits global formats, overrides :human
20
+ SingleIdentifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
21
+ SingleIdentifier.format_registry.register(:human, renderer: Asme::Renderer)
22
+
23
+ # Auto-discover all identifier types from the Identifiers namespace
24
+ # @return [Array<Class>] identifier classes that define a self.type Hash
25
+ def self.identifier_types
26
+ @identifier_types ||= Identifiers.constants
27
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
28
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
29
+ .select { |c| c.type.is_a?(Hash) }
30
+ end
31
+
32
+ # Build typed stage index from identifier types
33
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
34
+ def self.all_typed_stages
35
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
36
+ if klass.const_defined?(:TYPED_STAGES)
37
+ klass.const_get(:TYPED_STAGES)
38
+ else
39
+ []
40
+ end
41
+ end
42
+ end
43
+
44
+ # Lookup: type code -> identifier class
45
+ # @param code [String, Symbol] the type key to find
46
+ # @return [Class, nil] the matching identifier class
47
+ def self.locate_type(code)
48
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
49
+ end
50
+
51
+ # Lookup: abbreviation -> typed stage
52
+ # @param abbr [String, Symbol] the abbreviation to find
53
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
54
+ def self.locate_stage(abbr)
55
+ abbr_str = abbr.to_s.upcase
56
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
57
+ end
17
58
  end
18
59
  end
19
60
 
@@ -5,6 +5,11 @@ require "lutaml/model"
5
5
  module Pubid
6
6
  module Astm
7
7
  module Components
8
+ # Code component for ASTM identifiers.
9
+ #
10
+ # Stays independent of Pubid::Components::Code because ASTM has a
11
+ # rich taxonomy: +letter+ (A-G for standards), +suffix+ (A/B/C for
12
+ # data series), +subseries+ (S1/S4/S10), and +dual_m+ (metric flag).
8
13
  class Code < Lutaml::Model::Serializable
9
14
  attribute :letter, :string # A-G for standards
10
15
  attribute :number, :string # Main number
@@ -27,6 +32,10 @@ module Pubid
27
32
  end
28
33
  result
29
34
  end
35
+
36
+ def render(context: nil)
37
+ to_s
38
+ end
30
39
  end
31
40
  end
32
41
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pubid
4
- module Jis
4
+ module Astm
5
5
  module Components
6
6
  autoload :Code, "#{__dir__}/components/code"
7
7
  end
@@ -10,83 +10,6 @@ module Pubid
10
10
  parsed = parser.parse(str)
11
11
  builder.build(parsed)
12
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
13
  end
91
14
  end
92
15
  end
@@ -7,14 +7,6 @@ module Pubid
7
7
  attribute :designation, :string # D2148, F3504, G0088, C062702
8
8
  attribute :ea_suffix, :boolean # -EA
9
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
10
  end
19
11
  end
20
12
  end
@@ -5,20 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  class DataSeries < Base
7
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
8
  end
23
9
  end
24
10
  end
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../../iso/components/publisher"
4
- require_relative "../../components/date"
5
-
6
3
  module Pubid
7
4
  module Astm
8
5
  module Identifiers
@@ -28,45 +25,23 @@ module Pubid
28
25
  # Rendering is identical to Standard
29
26
  # Example: ASTM 52303-24e1
30
27
 
31
- # Convert to ISO/ASTM dual-published format
32
- # @return [Pubid::Iso::Identifiers::InternationalStandard] ISO version
28
+ # Convert to ISO/ASTM dual-published format.
29
+ # Uses Pubid::Iso.build so this flavor never reaches into ISO's
30
+ # internal class hierarchy.
31
+ # @return [Pubid::Iso::Identifier] ISO version
33
32
  #
34
33
  # @example Convert ASTM to ISO format
35
34
  # astm = Pubid::Astm.parse("ASTM 52303-24e1")
36
35
  # iso = astm.to_iso_identifier
37
36
  # iso.to_s # => "ISO/ASTM 52303:2024"
38
37
  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(
38
+ Pubid::Iso.build(
39
+ type: :is,
47
40
  publisher: "ISO",
48
- copublisher: ["ASTM"],
41
+ copublishers: ["ASTM"],
42
+ number: code&.number,
43
+ year: year&.to_s,
49
44
  )
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
45
  end
71
46
  end
72
47
  end
@@ -7,33 +7,6 @@ module Pubid
7
7
  attribute :edition, :string # 9TH, 2ND
8
8
  attribute :supplement, :boolean # -SUP-
9
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
10
  end
38
11
  end
39
12
  end
@@ -5,20 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  class Monograph < Base
7
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
8
  end
23
9
  end
24
10
  end
@@ -5,13 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  class ResearchReport < Base
7
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
8
  end
16
9
  end
17
10
  end
@@ -7,45 +7,6 @@ module Pubid
7
7
  attribute :sub_year, :string # a, b, c
8
8
  attribute :reapproval, :string # (2023)
9
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
10
  end
50
11
  end
51
12
  end
@@ -4,19 +4,6 @@ module Pubid
4
4
  module Astm
5
5
  module Identifiers
6
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
7
  end
21
8
  end
22
9
  end
@@ -4,17 +4,6 @@ module Pubid
4
4
  module Astm
5
5
  module Identifiers
6
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
7
  end
19
8
  end
20
9
  end