pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.3

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 (458) 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 +7 -39
  6. data/lib/pubid/amca/identifiers/base.rb +0 -26
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -17
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -13
  9. data/lib/pubid/amca/renderer.rb +82 -0
  10. data/lib/pubid/amca/single_identifier.rb +0 -23
  11. data/lib/pubid/amca/urn_parser.rb +28 -0
  12. data/lib/pubid/amca.rb +42 -1
  13. data/lib/pubid/ansi/builder.rb +5 -3
  14. data/lib/pubid/ansi/identifier.rb +1 -43
  15. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  16. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  17. data/lib/pubid/ansi/renderer.rb +53 -0
  18. data/lib/pubid/ansi/single_identifier.rb +2 -31
  19. data/lib/pubid/ansi/urn_generator.rb +3 -38
  20. data/lib/pubid/ansi/urn_parser.rb +23 -0
  21. data/lib/pubid/ansi.rb +38 -3
  22. data/lib/pubid/api/builder.rb +29 -74
  23. data/lib/pubid/api/identifier.rb +0 -51
  24. data/lib/pubid/api/identifiers/base.rb +0 -2
  25. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  26. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  27. data/lib/pubid/api/identifiers/mpms.rb +1 -17
  28. data/lib/pubid/api/identifiers/publication.rb +0 -2
  29. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  30. data/lib/pubid/api/identifiers/specification.rb +0 -2
  31. data/lib/pubid/api/identifiers/standard.rb +0 -2
  32. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  33. data/lib/pubid/api/identifiers/typeless_standard.rb +1 -14
  34. data/lib/pubid/api/identifiers.rb +18 -0
  35. data/lib/pubid/api/renderer.rb +89 -0
  36. data/lib/pubid/api/single_identifier.rb +1 -13
  37. data/lib/pubid/api/urn_generator.rb +0 -18
  38. data/lib/pubid/api/urn_parser.rb +35 -0
  39. data/lib/pubid/api.rb +51 -5
  40. data/lib/pubid/ashrae/builder.rb +3 -3
  41. data/lib/pubid/ashrae/identifier.rb +6 -39
  42. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  43. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  44. data/lib/pubid/ashrae/identifiers/base.rb +3 -0
  45. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  46. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  47. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  48. data/lib/pubid/ashrae/renderer.rb +117 -0
  49. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  50. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  51. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  52. data/lib/pubid/ashrae.rb +42 -1
  53. data/lib/pubid/asme/components/code.rb +10 -2
  54. data/lib/pubid/asme/identifier.rb +0 -46
  55. data/lib/pubid/asme/identifiers/base.rb +0 -60
  56. data/lib/pubid/asme/renderer.rb +66 -0
  57. data/lib/pubid/asme/urn_parser.rb +31 -0
  58. data/lib/pubid/asme.rb +42 -1
  59. data/lib/pubid/astm/components/code.rb +9 -0
  60. data/lib/pubid/{jis → astm}/components.rb +1 -1
  61. data/lib/pubid/astm/identifier.rb +0 -77
  62. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  63. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  64. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  65. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  66. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  67. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  68. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  69. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  70. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  71. data/lib/pubid/astm/identifiers.rb +18 -0
  72. data/lib/pubid/astm/renderer.rb +172 -0
  73. data/lib/pubid/astm/single_identifier.rb +0 -10
  74. data/lib/pubid/astm/urn_parser.rb +30 -0
  75. data/lib/pubid/astm.rb +39 -27
  76. data/lib/pubid/bsi/builder.rb +21 -12
  77. data/lib/pubid/bsi/identifier.rb +8 -62
  78. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  79. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  80. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  81. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  82. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  83. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  84. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  85. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  87. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  88. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  89. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  90. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  91. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  92. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  93. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  94. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  95. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  96. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  97. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  98. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  99. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  100. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  101. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  102. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  103. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  104. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  105. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  106. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  107. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  108. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  109. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  110. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  111. data/lib/pubid/bsi/identifiers.rb +0 -1
  112. data/lib/pubid/bsi/renderer.rb +1050 -0
  113. data/lib/pubid/bsi/single_identifier.rb +6 -70
  114. data/lib/pubid/bsi/urn_generator.rb +2 -3
  115. data/lib/pubid/bsi/urn_parser.rb +52 -0
  116. data/lib/pubid/bsi.rb +224 -1
  117. data/lib/pubid/builder/base.rb +57 -10
  118. data/lib/pubid/bundled_identifier.rb +0 -1
  119. data/lib/pubid/ccsds/builder.rb +4 -3
  120. data/lib/pubid/ccsds/identifier.rb +63 -66
  121. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  122. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  123. data/lib/pubid/ccsds/parser.rb +4 -2
  124. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  125. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  126. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  127. data/lib/pubid/ccsds.rb +39 -1
  128. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  129. data/lib/pubid/cen_cenelec/identifier.rb +7 -38
  130. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  131. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  132. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  133. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  135. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  136. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  137. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  139. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  140. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  141. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  143. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  145. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  146. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  147. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  148. data/lib/pubid/cen_cenelec.rb +168 -1
  149. data/lib/pubid/cie/components/code.rb +8 -0
  150. data/lib/pubid/cie/identifier.rb +6 -57
  151. data/lib/pubid/cie/urn_parser.rb +28 -0
  152. data/lib/pubid/cie.rb +43 -1
  153. data/lib/pubid/components/adoption.rb +104 -0
  154. data/lib/pubid/components/code.rb +22 -8
  155. data/lib/pubid/components/date.rb +23 -16
  156. data/lib/pubid/components/edition.rb +9 -6
  157. data/lib/pubid/components/iteration.rb +32 -0
  158. data/lib/pubid/components/language.rb +6 -4
  159. data/lib/pubid/components/locality.rb +10 -1
  160. data/lib/pubid/components/publisher.rb +9 -6
  161. data/lib/pubid/components/relationship.rb +151 -0
  162. data/lib/pubid/components/stage.rb +5 -14
  163. data/lib/pubid/components/supplement.rb +184 -0
  164. data/lib/pubid/components/type.rb +5 -15
  165. data/lib/pubid/components/typed_stage.rb +10 -11
  166. data/lib/pubid/components.rb +4 -1
  167. data/lib/pubid/core/update_codes.rb +28 -7
  168. data/lib/pubid/csa/identifier.rb +0 -59
  169. data/lib/pubid/csa/identifiers/base.rb +2 -122
  170. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  171. data/lib/pubid/csa/identifiers/series.rb +2 -102
  172. data/lib/pubid/csa/renderer.rb +292 -0
  173. data/lib/pubid/csa/urn_generator.rb +1 -1
  174. data/lib/pubid/csa/urn_parser.rb +33 -0
  175. data/lib/pubid/csa.rb +42 -1
  176. data/lib/pubid/etsi/components/code.rb +9 -2
  177. data/lib/pubid/etsi/identifier.rb +0 -43
  178. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  179. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  180. data/lib/pubid/etsi/renderer.rb +42 -0
  181. data/lib/pubid/etsi/urn_parser.rb +34 -0
  182. data/lib/pubid/etsi.rb +42 -1
  183. data/lib/pubid/export/exporter.rb +4 -46
  184. data/lib/pubid/export/flavor_exporter.rb +111 -278
  185. data/lib/pubid/export.rb +0 -6
  186. data/lib/pubid/identifier.rb +2 -17
  187. data/lib/pubid/identifier_facade.rb +114 -0
  188. data/lib/pubid/identifier_metadata.rb +1 -1
  189. data/lib/pubid/idf/builder.rb +3 -3
  190. data/lib/pubid/idf/identifier.rb +3 -66
  191. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  192. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  193. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  194. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  195. data/lib/pubid/idf/parser.rb +3 -2
  196. data/lib/pubid/idf/renderer.rb +84 -0
  197. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  198. data/lib/pubid/idf/urn_generator.rb +4 -39
  199. data/lib/pubid/idf/urn_parser.rb +25 -0
  200. data/lib/pubid/idf.rb +51 -1
  201. data/lib/pubid/iec/builder.rb +46 -64
  202. data/lib/pubid/iec/components/code.rb +8 -32
  203. data/lib/pubid/iec/components/publisher.rb +0 -1
  204. data/lib/pubid/iec/components.rb +14 -0
  205. data/lib/pubid/iec/identifier.rb +251 -213
  206. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  207. data/lib/pubid/iec/identifiers/base.rb +8 -32
  208. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  209. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  210. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -26
  211. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  212. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -22
  213. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  214. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  215. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  216. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  217. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  218. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -11
  219. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  220. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  222. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  223. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  224. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  225. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -19
  226. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  227. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  228. data/lib/pubid/iec/identifiers.rb +30 -0
  229. data/lib/pubid/iec/parser.rb +13 -12
  230. data/lib/pubid/iec/renderer.rb +254 -0
  231. data/lib/pubid/iec/single_identifier.rb +6 -12
  232. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  233. data/lib/pubid/iec/urn_generator.rb +3 -3
  234. data/lib/pubid/iec/urn_parser.rb +3 -3
  235. data/lib/pubid/iec.rb +40 -68
  236. data/lib/pubid/ieee/builder.rb +12 -12
  237. data/lib/pubid/ieee/components/code.rb +8 -0
  238. data/lib/pubid/ieee/components/draft.rb +14 -0
  239. data/lib/pubid/ieee/components/relationship.rb +5 -149
  240. data/lib/pubid/ieee/identifier.rb +6 -41
  241. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  242. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  243. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  245. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  246. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  247. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  248. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  249. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  250. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  251. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  252. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  253. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  254. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  255. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  256. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  257. data/lib/pubid/ieee/pre_parser.rb +301 -0
  258. data/lib/pubid/ieee/renderer.rb +307 -0
  259. data/lib/pubid/ieee/urn_parser.rb +34 -0
  260. data/lib/pubid/ieee.rb +62 -1
  261. data/lib/pubid/ieee_debug.rb +0 -1
  262. data/lib/pubid/iho/builder.rb +2 -2
  263. data/lib/pubid/iho/identifier.rb +8 -42
  264. data/lib/pubid/iho/identifiers/base.rb +49 -10
  265. data/lib/pubid/iho/parser.rb +3 -3
  266. data/lib/pubid/iho/renderer.rb +30 -0
  267. data/lib/pubid/iho/urn_generator.rb +2 -2
  268. data/lib/pubid/iho/urn_parser.rb +58 -0
  269. data/lib/pubid/iho.rb +50 -1
  270. data/lib/pubid/iso/builder.rb +55 -53
  271. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  272. data/lib/pubid/iso/components/code.rb +7 -19
  273. data/lib/pubid/iso/components/publisher.rb +10 -8
  274. data/lib/pubid/iso/components.rb +2 -4
  275. data/lib/pubid/iso/identifier.rb +218 -252
  276. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  277. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  278. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  279. data/lib/pubid/iso/identifiers/data.rb +0 -1
  280. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  281. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  282. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  283. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  284. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  285. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  286. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  287. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  288. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  289. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  290. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  291. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  292. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  293. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  294. data/lib/pubid/iso/identifiers.rb +0 -1
  295. data/lib/pubid/iso/normalizer.rb +89 -0
  296. data/lib/pubid/iso/parser.rb +22 -4
  297. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  298. data/lib/pubid/iso/urn_generator.rb +66 -182
  299. data/lib/pubid/iso/urn_parser.rb +12 -7
  300. data/lib/pubid/iso.rb +173 -2
  301. data/lib/pubid/itu/builder.rb +0 -12
  302. data/lib/pubid/itu/components/code.rb +8 -0
  303. data/lib/pubid/itu/components.rb +11 -0
  304. data/lib/pubid/itu/identifier.rb +6 -104
  305. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  306. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  307. data/lib/pubid/itu/identifiers/base.rb +0 -6
  308. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  309. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  310. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  311. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  312. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  313. data/lib/pubid/itu/urn_parser.rb +23 -0
  314. data/lib/pubid/itu.rb +42 -1
  315. data/lib/pubid/jcgm/builder.rb +16 -8
  316. data/lib/pubid/jcgm/identifier.rb +0 -43
  317. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  318. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  319. data/lib/pubid/jcgm/renderer.rb +68 -0
  320. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  321. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  322. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  323. data/lib/pubid/jcgm.rb +43 -2
  324. data/lib/pubid/jis/builder.rb +44 -52
  325. data/lib/pubid/jis/identifier.rb +132 -46
  326. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  327. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  328. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  329. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  330. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  331. data/lib/pubid/jis/identifiers.rb +1 -1
  332. data/lib/pubid/jis/parser.rb +31 -5
  333. data/lib/pubid/jis/renderer.rb +69 -0
  334. data/lib/pubid/jis/single_identifier.rb +6 -12
  335. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  336. data/lib/pubid/jis/urn_parser.rb +23 -0
  337. data/lib/pubid/jis.rb +42 -2
  338. data/lib/pubid/nist/builder.rb +63 -1871
  339. data/lib/pubid/nist/caster.rb +1272 -0
  340. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  341. data/lib/pubid/nist/components/code.rb +9 -20
  342. data/lib/pubid/nist/components/supplement.rb +2 -2
  343. data/lib/pubid/nist/components.rb +0 -1
  344. data/lib/pubid/nist/identifier.rb +11 -48
  345. data/lib/pubid/nist/identifiers/base.rb +110 -47
  346. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  347. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  348. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  349. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  350. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  351. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  352. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  353. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  354. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  355. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  356. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  357. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  358. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  359. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  360. data/lib/pubid/nist/identifiers/report.rb +4 -2
  361. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  362. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  363. data/lib/pubid/nist/identifiers.rb +1 -0
  364. data/lib/pubid/nist/parser.rb +62 -452
  365. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  366. data/lib/pubid/nist/preprocessor.rb +416 -0
  367. data/lib/pubid/nist/renderer.rb +43 -0
  368. data/lib/pubid/nist/router.rb +148 -0
  369. data/lib/pubid/nist/series/base.rb +58 -0
  370. data/lib/pubid/nist/series/crpl.rb +13 -0
  371. data/lib/pubid/nist/series/fips.rb +14 -0
  372. data/lib/pubid/nist/series/ir.rb +60 -0
  373. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  374. data/lib/pubid/nist/series/mono.rb +19 -0
  375. data/lib/pubid/nist/series/ncstar.rb +20 -0
  376. data/lib/pubid/nist/series.rb +49 -0
  377. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  378. data/lib/pubid/nist/urn_parser.rb +67 -0
  379. data/lib/pubid/nist.rb +82 -4
  380. data/lib/pubid/oiml/components/code.rb +10 -0
  381. data/lib/pubid/oiml/identifier.rb +0 -50
  382. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  383. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  384. data/lib/pubid/oiml/renderer.rb +161 -0
  385. data/lib/pubid/oiml/single_identifier.rb +6 -45
  386. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  387. data/lib/pubid/oiml/urn_generator.rb +0 -8
  388. data/lib/pubid/oiml/urn_parser.rb +22 -0
  389. data/lib/pubid/oiml.rb +42 -1
  390. data/lib/pubid/plateau/identifier.rb +7 -41
  391. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  392. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  393. data/lib/pubid/plateau/renderer.rb +51 -0
  394. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  395. data/lib/pubid/plateau/urn_parser.rb +43 -0
  396. data/lib/pubid/plateau.rb +43 -1
  397. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  398. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  399. data/lib/pubid/renderers/human_readable.rb +18 -7
  400. data/lib/pubid/rendering/context.rb +28 -19
  401. data/lib/pubid/rendering.rb +0 -3
  402. data/lib/pubid/sae/components/date.rb +8 -0
  403. data/lib/pubid/sae/components/type.rb +5 -1
  404. data/lib/pubid/sae/identifier.rb +0 -23
  405. data/lib/pubid/sae/identifiers/base.rb +2 -16
  406. data/lib/pubid/sae/renderer.rb +36 -0
  407. data/lib/pubid/sae/urn_generator.rb +2 -10
  408. data/lib/pubid/sae/urn_parser.rb +36 -0
  409. data/lib/pubid/sae.rb +42 -1
  410. data/lib/pubid/urn_generator/base.rb +12 -12
  411. data/lib/pubid/urn_parser/base.rb +81 -0
  412. data/lib/pubid/urn_parser/errors.rb +9 -0
  413. data/lib/pubid/urn_parser.rb +14 -0
  414. data/lib/pubid/version.rb +1 -1
  415. data/lib/pubid.rb +29 -7
  416. data/lib/tasks/website-data.json +1940 -1882
  417. metadata +75 -44
  418. data/lib/pubid/amca/scheme.rb +0 -16
  419. data/lib/pubid/ansi/scheme.rb +0 -15
  420. data/lib/pubid/api/scheme.rb +0 -66
  421. data/lib/pubid/ashrae/scheme.rb +0 -53
  422. data/lib/pubid/asme/scheme.rb +0 -37
  423. data/lib/pubid/astm/scheme.rb +0 -55
  424. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  425. data/lib/pubid/bsi/scheme.rb +0 -243
  426. data/lib/pubid/ccsds/scheme.rb +0 -57
  427. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  428. data/lib/pubid/cie/scheme.rb +0 -64
  429. data/lib/pubid/components/factory.rb +0 -50
  430. data/lib/pubid/csa/scheme.rb +0 -44
  431. data/lib/pubid/etsi/scheme.rb +0 -42
  432. data/lib/pubid/export/data_class_exporter.rb +0 -59
  433. data/lib/pubid/export/ieee_exporter.rb +0 -78
  434. data/lib/pubid/export/itu_exporter.rb +0 -66
  435. data/lib/pubid/export/nist_exporter.rb +0 -64
  436. data/lib/pubid/export/registry_exporter.rb +0 -90
  437. data/lib/pubid/export/scheme_exporter.rb +0 -70
  438. data/lib/pubid/identifier_registry.rb +0 -198
  439. data/lib/pubid/idf/scheme.rb +0 -61
  440. data/lib/pubid/iec/scheme.rb +0 -71
  441. data/lib/pubid/ieee/scheme.rb +0 -90
  442. data/lib/pubid/iho/scheme.rb +0 -29
  443. data/lib/pubid/iso/identifiers/base.rb +0 -115
  444. data/lib/pubid/iso/scheme.rb +0 -193
  445. data/lib/pubid/itu/scheme.rb +0 -174
  446. data/lib/pubid/jcgm/scheme.rb +0 -60
  447. data/lib/pubid/jis/components/code.rb +0 -59
  448. data/lib/pubid/jis/identifiers/base.rb +0 -72
  449. data/lib/pubid/jis/scheme.rb +0 -49
  450. data/lib/pubid/nist/components/publisher.rb +0 -24
  451. data/lib/pubid/nist/scheme.rb +0 -199
  452. data/lib/pubid/oiml/scheme.rb +0 -46
  453. data/lib/pubid/plateau/scheme.rb +0 -45
  454. data/lib/pubid/rendering/base.rb +0 -73
  455. data/lib/pubid/rendering/common.rb +0 -211
  456. data/lib/pubid/rendering/format.rb +0 -25
  457. data/lib/pubid/sae/scheme.rb +0 -47
  458. data/lib/pubid/scheme.rb +0 -219
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
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ autoload :Base, "#{__dir__}/identifiers/base"
7
+ autoload :Standard, "#{__dir__}/identifiers/standard"
8
+ autoload :IsoDualPublished, "#{__dir__}/identifiers/iso_dual_published"
9
+ autoload :Manual, "#{__dir__}/identifiers/manual"
10
+ autoload :ResearchReport, "#{__dir__}/identifiers/research_report"
11
+ autoload :DataSeries, "#{__dir__}/identifiers/data_series"
12
+ autoload :TechnicalReport, "#{__dir__}/identifiers/technical_report"
13
+ autoload :Monograph, "#{__dir__}/identifiers/monograph"
14
+ autoload :Adjunct, "#{__dir__}/identifiers/adjunct"
15
+ autoload :WorkInProgress, "#{__dir__}/identifiers/work_in_progress"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ # Human-readable renderer for ASTM identifiers.
6
+ #
7
+ # Consolidates the per-type rendering logic that used to live inline on
8
+ # each identifier class. Produces strings like:
9
+ # "ASTM E2938-15"
10
+ # "ASTM RR:A01-1234"
11
+ # "ASTM MNL45-EB"
12
+ # "ASTM ADJD2148"
13
+ class Renderer < ::Pubid::Renderers::Base
14
+ def render(context: nil, **opts)
15
+ id = @id
16
+
17
+ case id
18
+ when Identifiers::Standard
19
+ render_standard(id)
20
+ when Identifiers::IsoDualPublished
21
+ render_standard(id)
22
+ when Identifiers::ResearchReport
23
+ render_research_report(id)
24
+ when Identifiers::DataSeries
25
+ render_data_series(id)
26
+ when Identifiers::TechnicalReport
27
+ render_technical_report(id)
28
+ when Identifiers::Monograph
29
+ render_monograph(id)
30
+ when Identifiers::Adjunct
31
+ render_adjunct(id)
32
+ when Identifiers::WorkInProgress
33
+ render_work_in_progress(id)
34
+ when Identifiers::Manual
35
+ render_manual(id)
36
+ else
37
+ render_single(id)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def render_single(id)
44
+ parts = []
45
+ parts << id.publisher if id.publisher
46
+ parts << id.prefix if id.class.attributes.key?(:prefix) && id.prefix
47
+ parts << id.code.to_s if id.code
48
+ parts << "-#{id.year}" if id.year
49
+ parts << id.format_suffix if id.format_suffix
50
+ parts.join(" ")
51
+ end
52
+
53
+ def render_standard(id)
54
+ parts = []
55
+ parts << id.publisher if id.publisher
56
+
57
+ if id.code
58
+ code_str = id.code.to_s
59
+ if id.code.dual_m
60
+ base_code = "#{id.code.letter}#{id.code.number}"
61
+ code_str = "#{base_code}/#{base_code}M"
62
+ end
63
+ parts << code_str
64
+ end
65
+
66
+ result = parts.join(" ")
67
+
68
+ if id.year
69
+ result += "-#{year_portion(id)}"
70
+ result += id.sub_year if id.sub_year
71
+ end
72
+
73
+ result += "(#{id.reapproval})" if id.reapproval
74
+ result += "e#{id.edition}" if id.edition
75
+
76
+ result
77
+ end
78
+
79
+ def year_portion(id)
80
+ year_str = id.year.to_s
81
+ year_str.length == 4 ? year_str[-2..] : year_str
82
+ end
83
+
84
+ def render_research_report(id)
85
+ parts = []
86
+ parts << id.publisher if id.publisher
87
+ parts << "RR:#{id.committee}-#{id.code.number}" if id.committee && id.code
88
+ parts.join(" ")
89
+ end
90
+
91
+ def render_data_series(id)
92
+ parts = []
93
+ parts << id.publisher if id.publisher
94
+
95
+ result = parts.join(" ")
96
+ result += " " if id.publisher && !result.end_with?(" ")
97
+
98
+ result += "DS"
99
+ result += id.code.to_s if id.code
100
+ result += "HOL" if id.hol_suffix
101
+ result += id.format_suffix if id.format_suffix
102
+ result
103
+ end
104
+
105
+ def render_technical_report(id)
106
+ if id.publisher == "ISO/ASTM" && (id.code.nil? || id.code.letter.nil?)
107
+ result = "ISO/ASTMTR"
108
+ else
109
+ result = "TR"
110
+ result += id.code.letter if id.code&.letter
111
+ end
112
+ result += id.code.number if id.code&.number
113
+ result += id.format_suffix if id.format_suffix
114
+ result
115
+ end
116
+
117
+ def render_monograph(id)
118
+ parts = []
119
+ parts << id.publisher if id.publisher
120
+
121
+ result = parts.join(" ")
122
+ result += " " if id.publisher && !result.end_with?(" ")
123
+
124
+ result += "MONO"
125
+ result += id.code.number if id.code
126
+ result += "-#{id.edition}" if id.edition
127
+ result += id.format_suffix if id.format_suffix
128
+ result
129
+ end
130
+
131
+ def render_adjunct(id)
132
+ result = []
133
+ result << id.publisher if id.publisher && !id.ea_suffix && !id.dvd_suffix
134
+ result << "ADJ#{id.designation}#{'-EA' if id.ea_suffix}#{'DVD' if id.dvd_suffix}"
135
+ result.compact.join(" ")
136
+ end
137
+
138
+ def render_work_in_progress(id)
139
+ parts = []
140
+ parts << id.publisher if id.publisher
141
+
142
+ result = parts.join(" ")
143
+ result += " " if id.publisher && !result.end_with?(" ")
144
+
145
+ result += "WK"
146
+ result += id.code.number if id.code
147
+ result
148
+ end
149
+
150
+ def render_manual(id)
151
+ parts = []
152
+ parts << id.publisher if id.publisher
153
+ parts << "MNL"
154
+ parts << "TP" if id.tp_designation
155
+ parts << id.code.number if id.code
156
+
157
+ result = parts.join
158
+
159
+ result += "-#{id.edition}" if id.edition
160
+
161
+ if id.publisher
162
+ result = "#{id.publisher} #{result[id.publisher.length..]}"
163
+ end
164
+
165
+ result += "-SUP" if id.supplement
166
+ result += id.format_suffix if id.format_suffix
167
+
168
+ result
169
+ end
170
+ end
171
+ end
172
+ end
@@ -10,16 +10,6 @@ module Pubid
10
10
  attribute :code, Components::Code
11
11
  attribute :year, :string
12
12
  attribute :format_suffix, :string # -EB for eBook
13
-
14
- def to_s
15
- parts = []
16
- parts << publisher if publisher
17
- parts << prefix if self.class.attributes.key?(:prefix) && prefix
18
- parts << code.to_s if code
19
- parts << "-#{year}" if year
20
- parts << format_suffix if format_suffix
21
- parts.join(" ")
22
- end
23
13
  end
24
14
  end
25
15
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ # Parses ASTM URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits:
8
+ # urn:astm:{publisher}:{code}:{year}[:sub_year][:reapp.X][:eX][:wip][:wk.X]
9
+ #
10
+ # The publisher slot is the lowercase publisher string ("astm" or
11
+ # "pub-copub"). The code slot is the alphanumeric ASTM code (e.g.,
12
+ # "D2148", "A1"). Year is **2 digits** in the URN.
13
+ #
14
+ # Examples:
15
+ # - urn:astm:astm:D2148:2022 → ASTM D2148-22
16
+ # - urn:astm:astm:A1:2002 → ASTM A1-02
17
+ class UrnParser < Pubid::UrnParser::Base
18
+ def parse_urn(urn)
19
+ body = strip_namespace(urn)
20
+ parts = split_parts(body)
21
+
22
+ _publisher, code, year = parts
23
+
24
+ text = "ASTM #{code}"
25
+ text += "-#{year[-2..]}" if year && year.length >= 2
26
+ flavor_parse(text)
27
+ end
28
+ end
29
+ end
30
+ end