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
@@ -2,7 +2,13 @@
2
2
 
3
3
  module Pubid
4
4
  module Ashrae
5
+ # `extend Pubid::IdentifierFacade` adds polymorphic `from_hash` and pairs
6
+ # with `include Pubid::Ashrae::Identifier` in Identifiers::Base for identity
7
+ # (`is_a?`/`===`), so a consumer handed this module can deserialize and
8
+ # identity-check ASHRAE ids through it.
5
9
  module Identifier
10
+ extend Pubid::IdentifierFacade
11
+
6
12
  # Parse an ASHRAE identifier string into an identifier object
7
13
  # @param identifier [String] The ASHRAE identifier string to parse
8
14
  # @return [Identifiers::Base] The appropriate identifier object
@@ -13,45 +19,6 @@ module Pubid
13
19
  rescue Parslet::ParseFailed => e
14
20
  raise "Failed to parse ASHRAE identifier '#{identifier}': #{e.message}"
15
21
  end
16
-
17
- # Factory that builds an ASHRAE identifier from a hash of primitives.
18
- # Dispatch on `:type` to the matching subclass; default is
19
- # {Identifiers::Standard}.
20
- TYPE_KEY_TO_KLASS = {
21
- standard: "Standard",
22
- guideline: "Guideline",
23
- addendum: "Addendum",
24
- addenda_package: "AddendaPackage",
25
- combined_addenda: "CombinedAddenda",
26
- errata: "Errata",
27
- interpretation: "Interpretation",
28
- }.freeze
29
-
30
- def self.create(type: nil, **opts)
31
- klass = resolve_create_class(type)
32
- klass.new(**coerce_create_attrs(opts))
33
- end
34
-
35
- def self.resolve_create_class(type)
36
- return Identifiers::Standard if type.nil?
37
-
38
- klass_name = TYPE_KEY_TO_KLASS[type.to_sym]
39
- raise ArgumentError, "Unknown ASHRAE type: #{type.inspect}" unless klass_name
40
-
41
- Identifiers.const_get(klass_name)
42
- end
43
-
44
- def self.coerce_create_attrs(opts)
45
- attrs = { publisher: (opts[:publisher] || "ASHRAE").to_s }
46
- if (v = opts[:code] || opts[:number])
47
- attrs[:code] = v.to_s
48
- end
49
- %i[year suffix amendment reaffirmed copublisher].each do |k|
50
- attrs[k] = opts[k].to_s unless opts[k].nil?
51
- end
52
- attrs
53
- end
54
- private_class_method :resolve_create_class, :coerce_create_attrs
55
22
  end
56
23
  end
57
24
  end
@@ -27,16 +27,6 @@ module Pubid
27
27
  short: "Addenda Package" }
28
28
  end
29
29
 
30
- def to_s
31
- return base_identifier.to_s unless base_identifier
32
-
33
- # Format: ASHRAE Standard 52.2-1999: Addenda Supplement Package
34
- result = "ASHRAE #{base_identifier.type || 'Standard'} #{base_identifier.code}"
35
- result += "-#{base_identifier.year}" if base_identifier.year
36
- result += ": Addenda #{package_description}" if package_description
37
- result
38
- end
39
-
40
30
  def copublisher
41
31
  base_identifier&.copublisher
42
32
  end
@@ -27,25 +27,6 @@ module Pubid
27
27
  { key: :addendum, title: "ASHRAE Addendum", short: "Addendum" }
28
28
  end
29
29
 
30
- def to_s
31
- return base_identifier.to_s unless base_identifier
32
-
33
- # Determine base type name for rendering
34
- base_type = base_identifier.type || "Standard"
35
-
36
- if copublisher
37
- # Format: ANSI/ASHRAE Addendum a to ANSI/ASHRAE Standard 15-2019
38
- result = "#{copublisher} Addendum #{addendum_code} to #{base_identifier}"
39
- else
40
- # Format: ASHRAE Addendum a to Standard 15-2001
41
- result = "ASHRAE Addendum #{addendum_code} to #{base_type} #{base_identifier.code}"
42
- result += "-#{base_identifier.year}" if base_identifier.year
43
- end
44
-
45
- result += " (#{addendum_date})" if addendum_date
46
- result
47
- end
48
-
49
30
  def copublisher
50
31
  base_identifier&.copublisher
51
32
  end
@@ -5,6 +5,9 @@ module Pubid
5
5
  module Identifiers
6
6
  # Base class for all ASHRAE identifiers
7
7
  class Base < Pubid::Identifier
8
+ # Identity for the Pubid::Ashrae::Identifier facade (see its comment).
9
+ include Pubid::Ashrae::Identifier
10
+
8
11
  attribute :publisher, :string, default: "ASHRAE"
9
12
  attribute :code, :string
10
13
  attribute :year, :string
@@ -27,21 +27,6 @@ module Pubid
27
27
  short: "Addenda" }
28
28
  end
29
29
 
30
- def to_s
31
- return base_identifier.to_s unless base_identifier
32
-
33
- base_type = base_identifier.type || "Standard"
34
- if addendum_codes
35
- # Format: ASHRAE Addenda c and d to Standard 15-1994
36
- result = "ASHRAE Addenda #{addendum_codes} to #{base_type} #{base_identifier.code}"
37
- else
38
- # Format: ASHRAE Addenda to Standard 15-1994 (no specific codes)
39
- result = "ASHRAE Addenda to #{base_type} #{base_identifier.code}"
40
- end
41
- result += "-#{base_identifier.year}" if base_identifier.year
42
- result
43
- end
44
-
45
30
  def copublisher
46
31
  base_identifier&.copublisher
47
32
  end
@@ -24,16 +24,6 @@ module Pubid
24
24
  def self.type
25
25
  { key: :errata, title: "ASHRAE Errata", short: "Errata" }
26
26
  end
27
-
28
- def to_s
29
- return base_identifier.to_s unless base_identifier
30
-
31
- # Format: ASHRAE Guideline 0-2005 Errata (September 28, 2011)
32
- result = base_identifier.to_s
33
- result += " Errata"
34
- result += " (#{errata_date})" if errata_date
35
- result
36
- end
37
27
  end
38
28
  end
39
29
  end
@@ -23,16 +23,6 @@ module Pubid
23
23
  { key: :interpretation, title: "ASHRAE Interpretations",
24
24
  short: "Interpretations" }
25
25
  end
26
-
27
- def to_s
28
- return base_identifier.to_s unless base_identifier
29
-
30
- # Format: Interpretations for Standard 15.2-2022
31
- base_type = base_identifier.type || "Standard"
32
- result = "Interpretations for #{base_type} #{base_identifier.code}"
33
- result += "-#{base_identifier.year}" if base_identifier.year
34
- result
35
- end
36
26
  end
37
27
  end
38
28
  end
@@ -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
@@ -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
@@ -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