pubid 2.0.0.pre.alpha.1 → 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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +27 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +7 -0
  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 -1
  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 -4
  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 -0
  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/identifiers/base.rb +0 -60
  55. data/lib/pubid/asme/renderer.rb +66 -0
  56. data/lib/pubid/asme/urn_parser.rb +31 -0
  57. data/lib/pubid/asme.rb +42 -1
  58. data/lib/pubid/astm/components/code.rb +9 -0
  59. data/lib/pubid/{jis → astm}/components.rb +1 -1
  60. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  61. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  62. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  63. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  64. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  65. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  66. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  67. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  68. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  69. data/lib/pubid/astm/identifiers.rb +18 -0
  70. data/lib/pubid/astm/renderer.rb +172 -0
  71. data/lib/pubid/astm/single_identifier.rb +0 -10
  72. data/lib/pubid/astm/urn_parser.rb +30 -0
  73. data/lib/pubid/astm.rb +39 -27
  74. data/lib/pubid/bsi/builder.rb +21 -12
  75. data/lib/pubid/bsi/identifier.rb +8 -2
  76. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  77. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  78. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  79. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  80. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  81. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  82. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  83. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  84. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  85. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  87. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  88. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  89. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  90. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  91. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  92. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  93. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  94. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  95. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  96. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  97. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  98. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  99. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  100. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  101. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  102. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  103. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  104. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  105. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  106. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  107. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  108. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  109. data/lib/pubid/bsi/identifiers.rb +0 -1
  110. data/lib/pubid/bsi/renderer.rb +1050 -0
  111. data/lib/pubid/bsi/single_identifier.rb +6 -70
  112. data/lib/pubid/bsi/urn_generator.rb +2 -3
  113. data/lib/pubid/bsi/urn_parser.rb +52 -0
  114. data/lib/pubid/bsi.rb +224 -1
  115. data/lib/pubid/builder/base.rb +57 -10
  116. data/lib/pubid/bundled_identifier.rb +0 -1
  117. data/lib/pubid/ccsds/builder.rb +4 -3
  118. data/lib/pubid/ccsds/identifier.rb +66 -1
  119. data/lib/pubid/ccsds/identifiers/base.rb +11 -50
  120. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  121. data/lib/pubid/ccsds/parser.rb +4 -2
  122. data/lib/pubid/ccsds/single_identifier.rb +4 -1
  123. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  124. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  125. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  126. data/lib/pubid/ccsds.rb +39 -1
  127. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  128. data/lib/pubid/cen_cenelec/identifier.rb +8 -2
  129. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  130. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  131. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  132. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  133. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  135. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  136. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  137. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  138. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  140. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  141. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  143. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  144. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  145. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  146. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  147. data/lib/pubid/cen_cenelec.rb +168 -1
  148. data/lib/pubid/cie/components/code.rb +8 -0
  149. data/lib/pubid/cie/identifier.rb +6 -4
  150. data/lib/pubid/cie/urn_parser.rb +28 -0
  151. data/lib/pubid/cie.rb +43 -1
  152. data/lib/pubid/components/adoption.rb +104 -0
  153. data/lib/pubid/components/code.rb +22 -8
  154. data/lib/pubid/components/date.rb +23 -16
  155. data/lib/pubid/components/edition.rb +9 -6
  156. data/lib/pubid/components/iteration.rb +32 -0
  157. data/lib/pubid/components/language.rb +6 -4
  158. data/lib/pubid/components/locality.rb +10 -1
  159. data/lib/pubid/components/publisher.rb +9 -6
  160. data/lib/pubid/components/relationship.rb +151 -0
  161. data/lib/pubid/components/stage.rb +5 -14
  162. data/lib/pubid/components/supplement.rb +184 -0
  163. data/lib/pubid/components/type.rb +5 -15
  164. data/lib/pubid/components/typed_stage.rb +11 -8
  165. data/lib/pubid/components.rb +4 -0
  166. data/lib/pubid/core/update_codes.rb +28 -7
  167. data/lib/pubid/csa/identifier.rb +0 -3
  168. data/lib/pubid/csa/identifiers/base.rb +2 -122
  169. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  170. data/lib/pubid/csa/identifiers/series.rb +2 -102
  171. data/lib/pubid/csa/renderer.rb +292 -0
  172. data/lib/pubid/csa/urn_generator.rb +1 -1
  173. data/lib/pubid/csa/urn_parser.rb +33 -0
  174. data/lib/pubid/csa.rb +42 -1
  175. data/lib/pubid/etsi/components/code.rb +9 -2
  176. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  177. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  178. data/lib/pubid/etsi/renderer.rb +42 -0
  179. data/lib/pubid/etsi/urn_parser.rb +34 -0
  180. data/lib/pubid/etsi.rb +42 -1
  181. data/lib/pubid/export/exporter.rb +4 -46
  182. data/lib/pubid/export/flavor_exporter.rb +111 -278
  183. data/lib/pubid/export.rb +0 -6
  184. data/lib/pubid/identifier.rb +10 -18
  185. data/lib/pubid/identifier_facade.rb +114 -0
  186. data/lib/pubid/identifier_metadata.rb +1 -1
  187. data/lib/pubid/idf/builder.rb +3 -3
  188. data/lib/pubid/idf/identifier.rb +3 -6
  189. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  190. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  191. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  192. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  193. data/lib/pubid/idf/parser.rb +3 -2
  194. data/lib/pubid/idf/renderer.rb +84 -0
  195. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  196. data/lib/pubid/idf/urn_generator.rb +4 -39
  197. data/lib/pubid/idf/urn_parser.rb +25 -0
  198. data/lib/pubid/idf.rb +51 -1
  199. data/lib/pubid/iec/builder.rb +48 -65
  200. data/lib/pubid/iec/components/code.rb +9 -32
  201. data/lib/pubid/iec/components/publisher.rb +1 -1
  202. data/lib/pubid/iec/components.rb +14 -0
  203. data/lib/pubid/iec/identifier.rb +276 -3
  204. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  205. data/lib/pubid/iec/identifiers/base.rb +8 -28
  206. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  207. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  208. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -30
  209. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  210. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -26
  211. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  212. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  213. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  214. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  215. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  216. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -15
  217. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  218. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  219. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  220. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  222. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  223. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -23
  224. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  225. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  226. data/lib/pubid/iec/identifiers.rb +30 -0
  227. data/lib/pubid/iec/parser.rb +20 -14
  228. data/lib/pubid/iec/renderer.rb +254 -0
  229. data/lib/pubid/iec/single_identifier.rb +6 -12
  230. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  231. data/lib/pubid/iec/urn_generator.rb +57 -171
  232. data/lib/pubid/iec/urn_parser.rb +53 -252
  233. data/lib/pubid/iec.rb +40 -68
  234. data/lib/pubid/ieee/builder.rb +12 -12
  235. data/lib/pubid/ieee/components/code.rb +8 -0
  236. data/lib/pubid/ieee/components/draft.rb +14 -0
  237. data/lib/pubid/ieee/components/relationship.rb +5 -149
  238. data/lib/pubid/ieee/identifier.rb +6 -0
  239. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  240. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  241. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  242. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  243. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  245. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  246. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  247. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  248. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  249. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  250. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  251. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  252. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  253. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  254. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  255. data/lib/pubid/ieee/pre_parser.rb +301 -0
  256. data/lib/pubid/ieee/renderer.rb +307 -0
  257. data/lib/pubid/ieee/urn_parser.rb +34 -0
  258. data/lib/pubid/ieee.rb +62 -1
  259. data/lib/pubid/ieee_debug.rb +0 -1
  260. data/lib/pubid/iho/builder.rb +2 -2
  261. data/lib/pubid/iho/identifier.rb +8 -0
  262. data/lib/pubid/iho/identifiers/base.rb +49 -10
  263. data/lib/pubid/iho/identifiers/bibliographic.rb +0 -4
  264. data/lib/pubid/iho/identifiers/circular_letter.rb +0 -4
  265. data/lib/pubid/iho/identifiers/miscellaneous.rb +0 -4
  266. data/lib/pubid/iho/identifiers/publication.rb +0 -4
  267. data/lib/pubid/iho/identifiers/standard.rb +0 -4
  268. data/lib/pubid/iho/parser.rb +3 -3
  269. data/lib/pubid/iho/renderer.rb +30 -0
  270. data/lib/pubid/iho/urn_generator.rb +3 -3
  271. data/lib/pubid/iho/urn_parser.rb +58 -0
  272. data/lib/pubid/iho.rb +50 -1
  273. data/lib/pubid/iso/builder.rb +59 -53
  274. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  275. data/lib/pubid/iso/components/code.rb +7 -19
  276. data/lib/pubid/iso/components/publisher.rb +10 -8
  277. data/lib/pubid/iso/components.rb +2 -4
  278. data/lib/pubid/iso/identifier.rb +233 -6
  279. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  280. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  281. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  282. data/lib/pubid/iso/identifiers/data.rb +0 -1
  283. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  284. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  285. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  286. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  287. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  288. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  289. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  290. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  291. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  292. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  293. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  294. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  295. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  296. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  297. data/lib/pubid/iso/identifiers.rb +0 -1
  298. data/lib/pubid/iso/normalizer.rb +89 -0
  299. data/lib/pubid/iso/parser.rb +26 -6
  300. data/lib/pubid/iso/single_identifier.rb +6 -3
  301. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  302. data/lib/pubid/iso/urn_generator.rb +74 -176
  303. data/lib/pubid/iso/urn_parser.rb +28 -9
  304. data/lib/pubid/iso.rb +173 -2
  305. data/lib/pubid/itu/builder.rb +0 -12
  306. data/lib/pubid/itu/components/code.rb +8 -0
  307. data/lib/pubid/itu/components.rb +11 -0
  308. data/lib/pubid/itu/identifier.rb +6 -39
  309. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  310. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  311. data/lib/pubid/itu/identifiers/base.rb +0 -6
  312. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  313. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  314. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  315. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  316. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  317. data/lib/pubid/itu/urn_parser.rb +23 -0
  318. data/lib/pubid/itu.rb +42 -1
  319. data/lib/pubid/jcgm/builder.rb +16 -8
  320. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  321. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  322. data/lib/pubid/jcgm/renderer.rb +68 -0
  323. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  324. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  325. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  326. data/lib/pubid/jcgm.rb +43 -2
  327. data/lib/pubid/jis/builder.rb +44 -52
  328. data/lib/pubid/jis/identifier.rb +132 -3
  329. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  330. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  331. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  332. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  333. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  334. data/lib/pubid/jis/identifiers.rb +1 -1
  335. data/lib/pubid/jis/parser.rb +31 -5
  336. data/lib/pubid/jis/renderer.rb +69 -0
  337. data/lib/pubid/jis/single_identifier.rb +6 -12
  338. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  339. data/lib/pubid/jis/urn_parser.rb +23 -0
  340. data/lib/pubid/jis.rb +42 -2
  341. data/lib/pubid/nist/builder.rb +122 -1761
  342. data/lib/pubid/nist/caster.rb +1272 -0
  343. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  344. data/lib/pubid/nist/components/code.rb +9 -20
  345. data/lib/pubid/nist/components/edition.rb +16 -0
  346. data/lib/pubid/nist/components/supplement.rb +88 -21
  347. data/lib/pubid/nist/components.rb +0 -1
  348. data/lib/pubid/nist/identifier.rb +25 -0
  349. data/lib/pubid/nist/identifiers/base.rb +206 -64
  350. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  351. data/lib/pubid/nist/identifiers/circular_supplement.rb +3 -2
  352. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  353. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  354. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  355. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -11
  356. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  357. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -16
  358. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  359. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  360. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  361. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  362. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  363. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  364. data/lib/pubid/nist/identifiers/report.rb +4 -3
  365. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  366. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  367. data/lib/pubid/nist/identifiers.rb +1 -0
  368. data/lib/pubid/nist/parser.rb +67 -424
  369. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  370. data/lib/pubid/nist/preprocessor.rb +416 -0
  371. data/lib/pubid/nist/renderer.rb +43 -0
  372. data/lib/pubid/nist/router.rb +148 -0
  373. data/lib/pubid/nist/series/base.rb +58 -0
  374. data/lib/pubid/nist/series/crpl.rb +13 -0
  375. data/lib/pubid/nist/series/fips.rb +14 -0
  376. data/lib/pubid/nist/series/ir.rb +60 -0
  377. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  378. data/lib/pubid/nist/series/mono.rb +19 -0
  379. data/lib/pubid/nist/series/ncstar.rb +20 -0
  380. data/lib/pubid/nist/series.rb +49 -0
  381. data/lib/pubid/nist/supplement_identifier.rb +11 -25
  382. data/lib/pubid/nist/urn_generator.rb +14 -8
  383. data/lib/pubid/nist/urn_parser.rb +67 -0
  384. data/lib/pubid/nist.rb +83 -4
  385. data/lib/pubid/oiml/components/code.rb +10 -0
  386. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  387. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  388. data/lib/pubid/oiml/renderer.rb +161 -0
  389. data/lib/pubid/oiml/single_identifier.rb +6 -45
  390. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  391. data/lib/pubid/oiml/urn_generator.rb +0 -8
  392. data/lib/pubid/oiml/urn_parser.rb +22 -0
  393. data/lib/pubid/oiml.rb +42 -1
  394. data/lib/pubid/plateau/identifier.rb +23 -0
  395. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  396. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  397. data/lib/pubid/plateau/renderer.rb +51 -0
  398. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  399. data/lib/pubid/plateau/urn_parser.rb +43 -0
  400. data/lib/pubid/plateau.rb +44 -1
  401. data/lib/pubid/renderers/base.rb +34 -0
  402. data/lib/pubid/renderers/directives_renderer.rb +27 -14
  403. data/lib/pubid/renderers/guide_renderer.rb +7 -1
  404. data/lib/pubid/renderers/human_readable.rb +31 -8
  405. data/lib/pubid/renderers/iwa_renderer.rb +5 -1
  406. data/lib/pubid/renderers/supplement_renderer.rb +4 -1
  407. data/lib/pubid/rendering/context.rb +33 -21
  408. data/lib/pubid/rendering.rb +0 -3
  409. data/lib/pubid/sae/components/date.rb +8 -0
  410. data/lib/pubid/sae/components/type.rb +5 -1
  411. data/lib/pubid/sae/identifiers/base.rb +2 -16
  412. data/lib/pubid/sae/renderer.rb +36 -0
  413. data/lib/pubid/sae/urn_generator.rb +2 -10
  414. data/lib/pubid/sae/urn_parser.rb +36 -0
  415. data/lib/pubid/sae.rb +42 -1
  416. data/lib/pubid/urn_generator/base.rb +12 -12
  417. data/lib/pubid/urn_parser/base.rb +81 -0
  418. data/lib/pubid/urn_parser/errors.rb +9 -0
  419. data/lib/pubid/urn_parser.rb +14 -0
  420. data/lib/pubid/version.rb +1 -1
  421. data/lib/pubid.rb +29 -7
  422. data/lib/tasks/website-data.json +1940 -1882
  423. metadata +77 -43
  424. data/lib/pubid/amca/scheme.rb +0 -16
  425. data/lib/pubid/ansi/scheme.rb +0 -15
  426. data/lib/pubid/api/scheme.rb +0 -66
  427. data/lib/pubid/ashrae/scheme.rb +0 -53
  428. data/lib/pubid/asme/scheme.rb +0 -37
  429. data/lib/pubid/astm/scheme.rb +0 -55
  430. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  431. data/lib/pubid/bsi/scheme.rb +0 -243
  432. data/lib/pubid/ccsds/scheme.rb +0 -57
  433. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  434. data/lib/pubid/cie/scheme.rb +0 -64
  435. data/lib/pubid/csa/scheme.rb +0 -44
  436. data/lib/pubid/etsi/scheme.rb +0 -42
  437. data/lib/pubid/export/data_class_exporter.rb +0 -59
  438. data/lib/pubid/export/ieee_exporter.rb +0 -78
  439. data/lib/pubid/export/itu_exporter.rb +0 -66
  440. data/lib/pubid/export/nist_exporter.rb +0 -64
  441. data/lib/pubid/export/registry_exporter.rb +0 -90
  442. data/lib/pubid/export/scheme_exporter.rb +0 -70
  443. data/lib/pubid/identifier_registry.rb +0 -198
  444. data/lib/pubid/idf/scheme.rb +0 -61
  445. data/lib/pubid/iec/scheme.rb +0 -71
  446. data/lib/pubid/ieee/scheme.rb +0 -90
  447. data/lib/pubid/iho/scheme.rb +0 -29
  448. data/lib/pubid/iso/identifiers/base.rb +0 -115
  449. data/lib/pubid/iso/scheme.rb +0 -187
  450. data/lib/pubid/itu/scheme.rb +0 -174
  451. data/lib/pubid/jcgm/scheme.rb +0 -60
  452. data/lib/pubid/jis/components/code.rb +0 -59
  453. data/lib/pubid/jis/identifiers/base.rb +0 -72
  454. data/lib/pubid/jis/scheme.rb +0 -49
  455. data/lib/pubid/nist/components/publisher.rb +0 -24
  456. data/lib/pubid/nist/scheme.rb +0 -199
  457. data/lib/pubid/oiml/scheme.rb +0 -46
  458. data/lib/pubid/plateau/scheme.rb +0 -45
  459. data/lib/pubid/rendering/base.rb +0 -73
  460. data/lib/pubid/rendering/common.rb +0 -211
  461. data/lib/pubid/rendering/format.rb +0 -25
  462. data/lib/pubid/sae/scheme.rb +0 -47
  463. data/lib/pubid/scheme.rb +0 -207
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ashrae
5
+ # Human-readable renderer for ASHRAE identifiers.
6
+ #
7
+ # Produces strings like:
8
+ # "ASHRAE Standard 15-2024"
9
+ # "ASHRAE Guideline 0-2019"
10
+ # "ASHRAE Addendum a to Standard 15-2001"
11
+ # "ASHRAE Standard 52.2-1999: Addenda Supplement Package"
12
+ # "ASHRAE Addenda c and d to Standard 15-1994"
13
+ # "ASHRAE Guideline 0-2005 Errata (September 28, 2011)"
14
+ # "Interpretations for Standard 15.2-2022"
15
+ #
16
+ # The renderer is registered as the +:human+ format in the ASHRAE format
17
+ # registry and invoked via +render(format: :human)+.
18
+ class Renderer < ::Pubid::Renderers::Base
19
+ def render(context: nil, **_opts)
20
+ id = @id
21
+
22
+ case id
23
+ when Identifiers::Addendum
24
+ render_addendum(id)
25
+ when Identifiers::AddendaPackage
26
+ render_addenda_package(id)
27
+ when Identifiers::CombinedAddenda
28
+ render_combined_addenda(id)
29
+ when Identifiers::Errata
30
+ render_errata(id)
31
+ when Identifiers::Interpretation
32
+ render_interpretation(id)
33
+ when SingleIdentifier
34
+ render_single(id)
35
+ else
36
+ render_single(id)
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ # SingleIdentifier (Standard, Guideline): "ASHRAE Standard 15-2024"
43
+ def render_single(id)
44
+ parts = []
45
+ parts << id.publisher if id.publisher
46
+ parts << id.type.to_s if id.type
47
+ result = parts.join(" ")
48
+ result += " " if result.length.positive?
49
+ result += id.code.to_s
50
+ result += "-#{id.year}" if id.year
51
+ result += " (#{id.amendment})" if id.amendment
52
+ result += id.suffix if id.suffix
53
+ result += " (RA#{id.reaffirmed})" if id.reaffirmed
54
+ result
55
+ end
56
+
57
+ # Addendum: "ASHRAE Addendum a to Standard 15-2001"
58
+ def render_addendum(id)
59
+ return id.base_identifier.to_s unless id.base_identifier
60
+
61
+ base_type = id.base_identifier.type || "Standard"
62
+
63
+ if id.copublisher
64
+ "#{id.copublisher} Addendum #{id.addendum_code} to #{id.base_identifier}"
65
+ else
66
+ result = "ASHRAE Addendum #{id.addendum_code} to #{base_type} #{id.base_identifier.code}"
67
+ result += "-#{id.base_identifier.year}" if id.base_identifier.year
68
+ result
69
+ end.tap { |r| r << " (#{id.addendum_date})" if id.addendum_date }
70
+ end
71
+
72
+ # AddendaPackage: "ASHRAE Standard 52.2-1999: Addenda Supplement Package"
73
+ def render_addenda_package(id)
74
+ return id.base_identifier.to_s unless id.base_identifier
75
+
76
+ result = "ASHRAE #{id.base_identifier.type || 'Standard'} #{id.base_identifier.code}"
77
+ result += "-#{id.base_identifier.year}" if id.base_identifier.year
78
+ result += ": Addenda #{id.package_description}" if id.package_description
79
+ result
80
+ end
81
+
82
+ # CombinedAddenda: "ASHRAE Addenda c and d to Standard 15-1994"
83
+ def render_combined_addenda(id)
84
+ return id.base_identifier.to_s unless id.base_identifier
85
+
86
+ base_type = id.base_identifier.type || "Standard"
87
+ if id.addendum_codes
88
+ result = "ASHRAE Addenda #{id.addendum_codes} to #{base_type} #{id.base_identifier.code}"
89
+ else
90
+ result = "ASHRAE Addenda to #{base_type} #{id.base_identifier.code}"
91
+ end
92
+ result += "-#{id.base_identifier.year}" if id.base_identifier.year
93
+ result
94
+ end
95
+
96
+ # Errata: "ASHRAE Guideline 0-2005 Errata (September 28, 2011)"
97
+ def render_errata(id)
98
+ return id.base_identifier.to_s unless id.base_identifier
99
+
100
+ result = id.base_identifier.to_s
101
+ result += " Errata"
102
+ result += " (#{id.errata_date})" if id.errata_date
103
+ result
104
+ end
105
+
106
+ # Interpretation: "Interpretations for Standard 15.2-2022"
107
+ def render_interpretation(id)
108
+ return id.base_identifier.to_s unless id.base_identifier
109
+
110
+ base_type = id.base_identifier.type || "Standard"
111
+ result = "Interpretations for #{base_type} #{id.base_identifier.code}"
112
+ result += "-#{id.base_identifier.year}" if id.base_identifier.year
113
+ result
114
+ end
115
+ end
116
+ end
117
+ end
@@ -5,19 +5,6 @@ module Pubid
5
5
  # Base class for single (non-supplement) ASHRAE identifiers
6
6
  # Includes: Guideline, Standard
7
7
  class SingleIdentifier < Identifiers::Base
8
- def to_s
9
- parts = []
10
- parts << publisher if publisher
11
- parts << type.to_s if type
12
- result = parts.join(" ")
13
- result += " " if result.length.positive?
14
- result += code.to_s
15
- result += "-#{year}" if year
16
- result += " (#{amendment})" if amendment
17
- result += suffix if suffix
18
- result += " (RA#{reaffirmed})" if reaffirmed
19
- result
20
- end
21
8
  end
22
9
  end
23
10
  end
@@ -9,14 +9,6 @@ module Pubid
9
9
  identifier.code.to_s
10
10
  end
11
11
 
12
- def urn_year
13
- if identifier.year
14
- return identifier.year.to_s
15
- end
16
-
17
- nil
18
- end
19
-
20
12
  def urn_suffix
21
13
  identifier.suffix&.to_s&.downcase
22
14
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ashrae
5
+ # Parses ASHRAE URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits:
8
+ # urn:ashrae:{number}:{year}:{type}[:{suffix}][:amd.{N}][:reaff.{Y}]
9
+ #
10
+ # The type token follows the year; the human-readable form prefixes the
11
+ # type ("ASHRAE Standard 90.1-2019"). The year separator is `-`.
12
+ #
13
+ # Examples:
14
+ # - urn:ashrae:90.1:2019:standard → ASHRAE Standard 90.1-2019
15
+ class UrnParser < Pubid::UrnParser::Base
16
+ def parse_urn(urn)
17
+ body = strip_namespace(urn)
18
+ parts = split_parts(body)
19
+
20
+ number, year = parts
21
+ text = "ASHRAE Standard #{number}"
22
+ text += "-#{year}" if year
23
+ flavor_parse(text)
24
+ end
25
+ end
26
+ end
27
+ end
data/lib/pubid/ashrae.rb CHANGED
@@ -6,16 +6,57 @@ module Pubid
6
6
  autoload :Identifier, "#{__dir__}/ashrae/identifier"
7
7
  autoload :Identifiers, "#{__dir__}/ashrae/identifiers"
8
8
  autoload :Parser, "#{__dir__}/ashrae/parser"
9
- autoload :Scheme, "#{__dir__}/ashrae/scheme"
9
+ autoload :Renderer, "#{__dir__}/ashrae/renderer"
10
10
  autoload :SingleIdentifier, "#{__dir__}/ashrae/single_identifier"
11
11
  autoload :SupplementIdentifier, "#{__dir__}/ashrae/supplement_identifier"
12
12
  autoload :UrnGenerator, "#{__dir__}/ashrae/urn_generator"
13
+ autoload :UrnParser, "#{__dir__}/ashrae/urn_parser"
13
14
 
14
15
  def self.parse(identifier)
15
16
  Identifier.parse(identifier)
16
17
  end
18
+
19
+ # Auto-discover all identifier types from the Identifiers namespace
20
+ # @return [Array<Class>] identifier classes that define a self.type Hash
21
+ def self.identifier_types
22
+ @identifier_types ||= Identifiers.constants
23
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
24
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
25
+ .select { |c| c.type.is_a?(Hash) }
26
+ end
27
+
28
+ # Build typed stage index from identifier types
29
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
30
+ def self.all_typed_stages
31
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
32
+ if klass.const_defined?(:TYPED_STAGES)
33
+ klass.const_get(:TYPED_STAGES)
34
+ else
35
+ []
36
+ end
37
+ end
38
+ end
39
+
40
+ # Lookup: type code -> identifier class
41
+ # @param code [String, Symbol] the type key to find
42
+ # @return [Class, nil] the matching identifier class
43
+ def self.locate_type(code)
44
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
45
+ end
46
+
47
+ # Lookup: abbreviation -> typed stage
48
+ # @param abbr [String, Symbol] the abbreviation to find
49
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
50
+ def self.locate_stage(abbr)
51
+ abbr_str = abbr.to_s.upcase
52
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
53
+ end
17
54
  end
18
55
  end
19
56
 
20
57
  # Register Uashrae flavor with the registry
21
58
  Pubid::Registry.register(:ashrae, Pubid::Ashrae)
59
+
60
+ # Per-flavor format registry: inherits global formats, overrides :human
61
+ Pubid::Ashrae::Identifiers::Base.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
62
+ Pubid::Ashrae::Identifiers::Base.format_registry.register(:human, renderer: Pubid::Ashrae::Renderer)
@@ -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
@@ -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
@@ -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
@@ -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