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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +25 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +4 -55
  6. data/lib/pubid/amca/identifiers/base.rb +58 -47
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -21
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -17
  9. data/lib/pubid/amca/identifiers/standard.rb +0 -4
  10. data/lib/pubid/amca/renderer.rb +82 -0
  11. data/lib/pubid/amca/single_identifier.rb +0 -23
  12. data/lib/pubid/amca/urn_generator.rb +2 -1
  13. data/lib/pubid/amca/urn_parser.rb +28 -0
  14. data/lib/pubid/amca.rb +42 -1
  15. data/lib/pubid/ansi/builder.rb +5 -3
  16. data/lib/pubid/ansi/identifier.rb +1 -43
  17. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  18. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  19. data/lib/pubid/ansi/renderer.rb +53 -0
  20. data/lib/pubid/ansi/single_identifier.rb +2 -31
  21. data/lib/pubid/ansi/urn_generator.rb +3 -38
  22. data/lib/pubid/ansi/urn_parser.rb +23 -0
  23. data/lib/pubid/ansi.rb +38 -3
  24. data/lib/pubid/api/builder.rb +33 -74
  25. data/lib/pubid/api/identifier.rb +5 -52
  26. data/lib/pubid/api/identifiers/base.rb +2 -14
  27. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  28. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  29. data/lib/pubid/api/identifiers/mpms.rb +0 -20
  30. data/lib/pubid/api/identifiers/publication.rb +0 -2
  31. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  32. data/lib/pubid/api/identifiers/specification.rb +0 -2
  33. data/lib/pubid/api/identifiers/standard.rb +0 -2
  34. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  35. data/lib/pubid/api/identifiers/typeless_standard.rb +0 -16
  36. data/lib/pubid/api/identifiers.rb +18 -0
  37. data/lib/pubid/api/renderer.rb +89 -0
  38. data/lib/pubid/api/single_identifier.rb +5 -20
  39. data/lib/pubid/api/urn_generator.rb +0 -18
  40. data/lib/pubid/api/urn_parser.rb +35 -0
  41. data/lib/pubid/api.rb +51 -5
  42. data/lib/pubid/ashrae/builder.rb +3 -3
  43. data/lib/pubid/ashrae/identifier.rb +7 -55
  44. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  45. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  46. data/lib/pubid/ashrae/identifiers/base.rb +29 -15
  47. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  48. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  49. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  50. data/lib/pubid/ashrae/parser.rb +4 -0
  51. data/lib/pubid/ashrae/renderer.rb +117 -0
  52. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  53. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  54. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  55. data/lib/pubid/ashrae.rb +46 -1
  56. data/lib/pubid/asme/components/code.rb +10 -2
  57. data/lib/pubid/asme/identifier.rb +0 -46
  58. data/lib/pubid/asme/identifiers/base.rb +0 -60
  59. data/lib/pubid/asme/renderer.rb +66 -0
  60. data/lib/pubid/asme/single_identifier.rb +3 -1
  61. data/lib/pubid/asme/urn_parser.rb +31 -0
  62. data/lib/pubid/asme.rb +42 -1
  63. data/lib/pubid/astm/components/code.rb +9 -0
  64. data/lib/pubid/{jis → astm}/components.rb +1 -1
  65. data/lib/pubid/astm/identifier.rb +0 -77
  66. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  67. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  68. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  69. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  70. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  71. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  72. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  73. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  74. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  75. data/lib/pubid/astm/identifiers.rb +18 -0
  76. data/lib/pubid/astm/renderer.rb +172 -0
  77. data/lib/pubid/astm/single_identifier.rb +3 -11
  78. data/lib/pubid/astm/urn_parser.rb +30 -0
  79. data/lib/pubid/astm.rb +39 -27
  80. data/lib/pubid/bsi/builder.rb +21 -12
  81. data/lib/pubid/bsi/identifier.rb +5 -85
  82. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -36
  83. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +8 -48
  84. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +8 -39
  85. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +2 -55
  86. data/lib/pubid/bsi/identifiers/amendment.rb +2 -22
  87. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +1 -6
  88. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  89. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -87
  90. data/lib/pubid/bsi/identifiers/committee_document.rb +0 -16
  91. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -87
  92. data/lib/pubid/bsi/identifiers/corrigendum.rb +2 -10
  93. data/lib/pubid/bsi/identifiers/detailed_specification.rb +0 -36
  94. data/lib/pubid/bsi/identifiers/disc.rb +0 -29
  95. data/lib/pubid/bsi/identifiers/draft_document.rb +2 -46
  96. data/lib/pubid/bsi/identifiers/electronic_book.rb +2 -38
  97. data/lib/pubid/bsi/identifiers/expert_commentary.rb +2 -18
  98. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +0 -47
  99. data/lib/pubid/bsi/identifiers/flex.rb +0 -35
  100. data/lib/pubid/bsi/identifiers/handbook.rb +1 -15
  101. data/lib/pubid/bsi/identifiers/index.rb +0 -32
  102. data/lib/pubid/bsi/identifiers/method.rb +0 -41
  103. data/lib/pubid/bsi/identifiers/national_annex.rb +4 -29
  104. data/lib/pubid/bsi/identifiers/practice_guide.rb +1 -6
  105. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +2 -54
  106. data/lib/pubid/bsi/identifiers/published_document.rb +2 -54
  107. data/lib/pubid/bsi/identifiers/section.rb +0 -30
  108. data/lib/pubid/bsi/identifiers/set.rb +3 -20
  109. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +0 -9
  110. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -24
  111. data/lib/pubid/bsi/identifiers/supplementary_index.rb +0 -46
  112. data/lib/pubid/bsi/identifiers/technical_specification.rb +2 -47
  113. data/lib/pubid/bsi/identifiers/test_method.rb +0 -32
  114. data/lib/pubid/bsi/identifiers/value_added_publication.rb +2 -17
  115. data/lib/pubid/bsi/identifiers.rb +0 -1
  116. data/lib/pubid/bsi/renderer.rb +1050 -0
  117. data/lib/pubid/bsi/single_identifier.rb +33 -78
  118. data/lib/pubid/bsi/urn_generator.rb +2 -3
  119. data/lib/pubid/bsi/urn_parser.rb +52 -0
  120. data/lib/pubid/bsi.rb +232 -2
  121. data/lib/pubid/builder/base.rb +57 -10
  122. data/lib/pubid/bundled_identifier.rb +0 -1
  123. data/lib/pubid/ccsds/builder.rb +4 -3
  124. data/lib/pubid/ccsds/identifier.rb +53 -68
  125. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  126. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  127. data/lib/pubid/ccsds/parser.rb +4 -2
  128. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  129. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  130. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  131. data/lib/pubid/ccsds.rb +39 -1
  132. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  133. data/lib/pubid/cen_cenelec/identifier.rb +11 -40
  134. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +9 -4
  135. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +0 -10
  136. data/lib/pubid/cen_cenelec/identifiers/base.rb +2 -45
  137. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +0 -27
  140. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +0 -15
  141. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +2 -8
  143. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +0 -4
  145. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  146. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  147. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  148. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  149. data/lib/pubid/cen_cenelec/single_identifier.rb +9 -90
  150. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  151. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  152. data/lib/pubid/cen_cenelec.rb +172 -1
  153. data/lib/pubid/cie/components/code.rb +8 -0
  154. data/lib/pubid/cie/identifier.rb +10 -57
  155. data/lib/pubid/cie/single_identifier.rb +4 -4
  156. data/lib/pubid/cie/urn_parser.rb +28 -0
  157. data/lib/pubid/cie.rb +47 -1
  158. data/lib/pubid/components/adoption.rb +104 -0
  159. data/lib/pubid/components/code.rb +22 -8
  160. data/lib/pubid/components/date.rb +23 -16
  161. data/lib/pubid/components/edition.rb +9 -6
  162. data/lib/pubid/components/iteration.rb +32 -0
  163. data/lib/pubid/components/language.rb +6 -4
  164. data/lib/pubid/components/locality.rb +10 -1
  165. data/lib/pubid/components/publisher.rb +9 -6
  166. data/lib/pubid/components/relationship.rb +151 -0
  167. data/lib/pubid/components/stage.rb +5 -14
  168. data/lib/pubid/components/supplement.rb +184 -0
  169. data/lib/pubid/components/type.rb +5 -15
  170. data/lib/pubid/components/typed_stage.rb +10 -11
  171. data/lib/pubid/components.rb +4 -1
  172. data/lib/pubid/core/update_codes.rb +28 -7
  173. data/lib/pubid/csa/identifier.rb +9 -59
  174. data/lib/pubid/csa/identifiers/base.rb +0 -123
  175. data/lib/pubid/csa/identifiers/cec.rb +0 -103
  176. data/lib/pubid/csa/identifiers/series.rb +0 -104
  177. data/lib/pubid/csa/renderer.rb +292 -0
  178. data/lib/pubid/csa/single_identifier.rb +1 -1
  179. data/lib/pubid/csa/urn_generator.rb +1 -1
  180. data/lib/pubid/csa/urn_parser.rb +33 -0
  181. data/lib/pubid/csa.rb +46 -1
  182. data/lib/pubid/etsi/components/code.rb +10 -9
  183. data/lib/pubid/etsi/components/version.rb +0 -5
  184. data/lib/pubid/etsi/identifier.rb +4 -55
  185. data/lib/pubid/etsi/identifiers/base.rb +31 -27
  186. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +1 -11
  187. data/lib/pubid/etsi/renderer.rb +42 -0
  188. data/lib/pubid/etsi/urn_parser.rb +34 -0
  189. data/lib/pubid/etsi.rb +44 -1
  190. data/lib/pubid/export/exporter.rb +4 -46
  191. data/lib/pubid/export/flavor_exporter.rb +111 -278
  192. data/lib/pubid/export.rb +0 -6
  193. data/lib/pubid/identifier.rb +92 -18
  194. data/lib/pubid/identifier_metadata.rb +1 -1
  195. data/lib/pubid/idf/builder.rb +3 -3
  196. data/lib/pubid/idf/identifier.rb +7 -66
  197. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  198. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  199. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  200. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  201. data/lib/pubid/idf/parser.rb +3 -2
  202. data/lib/pubid/idf/renderer.rb +84 -0
  203. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  204. data/lib/pubid/idf/urn_generator.rb +4 -39
  205. data/lib/pubid/idf/urn_parser.rb +25 -0
  206. data/lib/pubid/idf.rb +55 -1
  207. data/lib/pubid/iec/builder.rb +46 -64
  208. data/lib/pubid/iec/components/code.rb +8 -32
  209. data/lib/pubid/iec/components/publisher.rb +0 -1
  210. data/lib/pubid/iec/components.rb +14 -0
  211. data/lib/pubid/iec/identifier.rb +251 -213
  212. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  213. data/lib/pubid/iec/identifiers/base.rb +5 -33
  214. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  215. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  216. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +23 -26
  217. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  218. data/lib/pubid/iec/identifiers/fragment_identifier.rb +35 -24
  219. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  220. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  221. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  222. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  223. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  224. data/lib/pubid/iec/identifiers/sheet_identifier.rb +17 -11
  225. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  226. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  227. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  228. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  229. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  230. data/lib/pubid/iec/identifiers/test_report_form.rb +3 -35
  231. data/lib/pubid/iec/identifiers/vap_identifier.rb +24 -21
  232. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  233. data/lib/pubid/iec/identifiers/working_document.rb +2 -50
  234. data/lib/pubid/iec/identifiers.rb +30 -0
  235. data/lib/pubid/iec/parser.rb +13 -12
  236. data/lib/pubid/iec/renderer.rb +254 -0
  237. data/lib/pubid/iec/single_identifier.rb +6 -12
  238. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  239. data/lib/pubid/iec/urn_generator.rb +3 -3
  240. data/lib/pubid/iec/urn_parser.rb +3 -3
  241. data/lib/pubid/iec.rb +43 -67
  242. data/lib/pubid/ieee/builder.rb +12 -12
  243. data/lib/pubid/ieee/components/code.rb +8 -0
  244. data/lib/pubid/ieee/components/draft.rb +14 -0
  245. data/lib/pubid/ieee/components/relationship.rb +5 -149
  246. data/lib/pubid/ieee/identifier.rb +5 -52
  247. data/lib/pubid/ieee/identifiers/adopted_standard.rb +0 -9
  248. data/lib/pubid/ieee/identifiers/base.rb +221 -556
  249. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +0 -10
  250. data/lib/pubid/ieee/identifiers/corrigendum.rb +0 -12
  251. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +0 -10
  252. data/lib/pubid/ieee/identifiers/dual_identifier.rb +0 -4
  253. data/lib/pubid/ieee/identifiers/dual_published.rb +0 -4
  254. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +0 -9
  255. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +0 -10
  256. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  257. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +0 -18
  258. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +0 -6
  259. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  260. data/lib/pubid/ieee/identifiers/redlined_standard.rb +0 -7
  261. data/lib/pubid/ieee/identifiers/si_standard.rb +0 -38
  262. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  263. data/lib/pubid/ieee/pre_parser.rb +301 -0
  264. data/lib/pubid/ieee/renderer.rb +307 -0
  265. data/lib/pubid/ieee/urn_parser.rb +34 -0
  266. data/lib/pubid/ieee.rb +66 -1
  267. data/lib/pubid/ieee_debug.rb +0 -1
  268. data/lib/pubid/iho/builder.rb +2 -2
  269. data/lib/pubid/iho/identifier.rb +7 -59
  270. data/lib/pubid/iho/identifiers/base.rb +64 -31
  271. data/lib/pubid/iho/parser.rb +3 -3
  272. data/lib/pubid/iho/renderer.rb +30 -0
  273. data/lib/pubid/iho/urn_generator.rb +2 -2
  274. data/lib/pubid/iho/urn_parser.rb +58 -0
  275. data/lib/pubid/iho.rb +52 -1
  276. data/lib/pubid/iso/builder.rb +55 -53
  277. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  278. data/lib/pubid/iso/components/code.rb +7 -19
  279. data/lib/pubid/iso/components/publisher.rb +10 -8
  280. data/lib/pubid/iso/components.rb +2 -4
  281. data/lib/pubid/iso/identifier.rb +219 -252
  282. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  283. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  284. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  285. data/lib/pubid/iso/identifiers/data.rb +0 -1
  286. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  287. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  288. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  289. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  290. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  291. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  292. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  293. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  294. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  295. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  296. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  297. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  298. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  299. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  300. data/lib/pubid/iso/identifiers.rb +0 -1
  301. data/lib/pubid/iso/normalizer.rb +89 -0
  302. data/lib/pubid/iso/parser.rb +22 -4
  303. data/lib/pubid/iso/single_identifier.rb +0 -4
  304. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  305. data/lib/pubid/iso/urn_generator.rb +66 -182
  306. data/lib/pubid/iso/urn_parser.rb +12 -7
  307. data/lib/pubid/iso.rb +177 -2
  308. data/lib/pubid/itu/builder.rb +0 -12
  309. data/lib/pubid/itu/components/code.rb +9 -7
  310. data/lib/pubid/itu/components/sector.rb +15 -4
  311. data/lib/pubid/itu/components/series.rb +0 -4
  312. data/lib/pubid/itu/components.rb +11 -0
  313. data/lib/pubid/itu/identifier.rb +4 -116
  314. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  315. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  316. data/lib/pubid/itu/identifiers/base.rb +124 -128
  317. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  318. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  319. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  320. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  321. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  322. data/lib/pubid/itu/urn_parser.rb +23 -0
  323. data/lib/pubid/itu.rb +44 -1
  324. data/lib/pubid/jcgm/builder.rb +16 -8
  325. data/lib/pubid/jcgm/identifier.rb +0 -43
  326. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -9
  327. data/lib/pubid/jcgm/identifiers/gum_guide.rb +0 -12
  328. data/lib/pubid/jcgm/renderer.rb +68 -0
  329. data/lib/pubid/jcgm/single_identifier.rb +0 -8
  330. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  331. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  332. data/lib/pubid/jcgm.rb +43 -2
  333. data/lib/pubid/jis/builder.rb +44 -52
  334. data/lib/pubid/jis/identifier.rb +120 -46
  335. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  336. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  337. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  338. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  339. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  340. data/lib/pubid/jis/identifiers.rb +1 -1
  341. data/lib/pubid/jis/parser.rb +31 -5
  342. data/lib/pubid/jis/renderer.rb +69 -0
  343. data/lib/pubid/jis/single_identifier.rb +6 -12
  344. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  345. data/lib/pubid/jis/urn_parser.rb +23 -0
  346. data/lib/pubid/jis.rb +42 -2
  347. data/lib/pubid/nist/builder.rb +63 -1871
  348. data/lib/pubid/nist/caster.rb +1272 -0
  349. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  350. data/lib/pubid/nist/components/code.rb +9 -20
  351. data/lib/pubid/nist/components/supplement.rb +2 -2
  352. data/lib/pubid/nist/components.rb +0 -1
  353. data/lib/pubid/nist/identifier.rb +8 -60
  354. data/lib/pubid/nist/identifiers/base.rb +564 -492
  355. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  356. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  358. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  359. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  360. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  361. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  362. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  363. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  364. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  365. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  366. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  367. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  368. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  369. data/lib/pubid/nist/identifiers/report.rb +4 -2
  370. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  371. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  372. data/lib/pubid/nist/identifiers.rb +1 -0
  373. data/lib/pubid/nist/parser.rb +62 -452
  374. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  375. data/lib/pubid/nist/preprocessor.rb +428 -0
  376. data/lib/pubid/nist/renderer.rb +43 -0
  377. data/lib/pubid/nist/router.rb +148 -0
  378. data/lib/pubid/nist/series/base.rb +58 -0
  379. data/lib/pubid/nist/series/crpl.rb +13 -0
  380. data/lib/pubid/nist/series/fips.rb +14 -0
  381. data/lib/pubid/nist/series/ir.rb +60 -0
  382. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  383. data/lib/pubid/nist/series/mono.rb +19 -0
  384. data/lib/pubid/nist/series/ncstar.rb +20 -0
  385. data/lib/pubid/nist/series.rb +49 -0
  386. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  387. data/lib/pubid/nist/urn_parser.rb +67 -0
  388. data/lib/pubid/nist.rb +86 -4
  389. data/lib/pubid/oiml/builder.rb +21 -3
  390. data/lib/pubid/oiml/components/code.rb +17 -0
  391. data/lib/pubid/oiml/identifier.rb +40 -46
  392. data/lib/pubid/oiml/identifiers/annex.rb +13 -46
  393. data/lib/pubid/oiml/identifiers/errata.rb +15 -0
  394. data/lib/pubid/oiml/identifiers.rb +1 -1
  395. data/lib/pubid/oiml/parser.rb +59 -12
  396. data/lib/pubid/oiml/renderer.rb +171 -0
  397. data/lib/pubid/oiml/single_identifier.rb +61 -42
  398. data/lib/pubid/oiml/supplement_identifier.rb +31 -17
  399. data/lib/pubid/oiml/urn_generator.rb +0 -8
  400. data/lib/pubid/oiml/urn_parser.rb +22 -0
  401. data/lib/pubid/oiml.rb +42 -1
  402. data/lib/pubid/plateau/identifier.rb +4 -55
  403. data/lib/pubid/plateau/identifiers/base.rb +45 -36
  404. data/lib/pubid/plateau/identifiers/handbook.rb +0 -6
  405. data/lib/pubid/plateau/identifiers/technical_report.rb +0 -4
  406. data/lib/pubid/plateau/renderer.rb +51 -0
  407. data/lib/pubid/plateau/supplement_identifier.rb +0 -4
  408. data/lib/pubid/plateau/urn_parser.rb +43 -0
  409. data/lib/pubid/plateau.rb +43 -1
  410. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  411. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  412. data/lib/pubid/renderers/human_readable.rb +18 -7
  413. data/lib/pubid/rendering/context.rb +28 -19
  414. data/lib/pubid/rendering.rb +0 -3
  415. data/lib/pubid/sae/components/date.rb +8 -0
  416. data/lib/pubid/sae/components/type.rb +5 -1
  417. data/lib/pubid/sae/identifier.rb +4 -35
  418. data/lib/pubid/sae/identifiers/base.rb +26 -31
  419. data/lib/pubid/sae/renderer.rb +36 -0
  420. data/lib/pubid/sae/urn_generator.rb +2 -10
  421. data/lib/pubid/sae/urn_parser.rb +36 -0
  422. data/lib/pubid/sae.rb +42 -1
  423. data/lib/pubid/urn_generator/base.rb +12 -12
  424. data/lib/pubid/urn_parser/base.rb +81 -0
  425. data/lib/pubid/urn_parser/errors.rb +9 -0
  426. data/lib/pubid/urn_parser.rb +14 -0
  427. data/lib/pubid/version.rb +1 -1
  428. data/lib/pubid.rb +45 -7
  429. data/lib/tasks/export.rake +6 -5
  430. data/lib/tasks/website-data.json +1940 -1882
  431. metadata +75 -45
  432. data/lib/pubid/amca/scheme.rb +0 -16
  433. data/lib/pubid/ansi/scheme.rb +0 -15
  434. data/lib/pubid/api/scheme.rb +0 -66
  435. data/lib/pubid/ashrae/scheme.rb +0 -53
  436. data/lib/pubid/asme/scheme.rb +0 -37
  437. data/lib/pubid/astm/scheme.rb +0 -55
  438. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  439. data/lib/pubid/bsi/scheme.rb +0 -243
  440. data/lib/pubid/ccsds/scheme.rb +0 -57
  441. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  442. data/lib/pubid/cie/scheme.rb +0 -64
  443. data/lib/pubid/components/factory.rb +0 -50
  444. data/lib/pubid/csa/scheme.rb +0 -44
  445. data/lib/pubid/etsi/scheme.rb +0 -42
  446. data/lib/pubid/export/data_class_exporter.rb +0 -59
  447. data/lib/pubid/export/ieee_exporter.rb +0 -78
  448. data/lib/pubid/export/itu_exporter.rb +0 -66
  449. data/lib/pubid/export/nist_exporter.rb +0 -64
  450. data/lib/pubid/export/registry_exporter.rb +0 -90
  451. data/lib/pubid/export/scheme_exporter.rb +0 -70
  452. data/lib/pubid/identifier_registry.rb +0 -198
  453. data/lib/pubid/idf/scheme.rb +0 -61
  454. data/lib/pubid/iec/scheme.rb +0 -71
  455. data/lib/pubid/ieee/scheme.rb +0 -90
  456. data/lib/pubid/iho/scheme.rb +0 -29
  457. data/lib/pubid/iso/identifiers/base.rb +0 -115
  458. data/lib/pubid/iso/scheme.rb +0 -193
  459. data/lib/pubid/itu/scheme.rb +0 -174
  460. data/lib/pubid/jcgm/scheme.rb +0 -60
  461. data/lib/pubid/jis/components/code.rb +0 -59
  462. data/lib/pubid/jis/identifiers/base.rb +0 -72
  463. data/lib/pubid/jis/scheme.rb +0 -49
  464. data/lib/pubid/nist/components/publisher.rb +0 -24
  465. data/lib/pubid/nist/scheme.rb +0 -199
  466. data/lib/pubid/oiml/identifiers/base.rb +0 -36
  467. data/lib/pubid/oiml/scheme.rb +0 -46
  468. data/lib/pubid/plateau/scheme.rb +0 -45
  469. data/lib/pubid/rendering/base.rb +0 -73
  470. data/lib/pubid/rendering/common.rb +0 -211
  471. data/lib/pubid/rendering/format.rb +0 -25
  472. data/lib/pubid/sae/scheme.rb +0 -47
  473. data/lib/pubid/scheme.rb +0 -219
@@ -2,36 +2,21 @@
2
2
 
3
3
  module Pubid
4
4
  module Api
5
- class SingleIdentifier < Pubid::Identifier
5
+ class SingleIdentifier < Identifier
6
6
  # Generate URN for this identifier
7
7
  #
8
8
  # @return [String] URN representation
9
9
 
10
- def publisher
11
- "API"
12
- end
10
+ # Stored as a plain string (always "API") so it round-trips through
11
+ # to_hash/from_hash. Was a `def publisher` method, which made lutaml
12
+ # serialize a String against the Components::Publisher attribute.
13
+ attribute :publisher, :string, default: -> { "API" }
13
14
 
14
15
  attribute :code, Components::Code
15
16
  attribute :part, :string
16
17
  attribute :year, :string
17
18
  attribute :reaffirmation, :string
18
19
 
19
- def to_s
20
- parts = ["API"]
21
-
22
- # Add type if available
23
- parts << type_string if self.class.attributes.key?(:type_string) && type_string
24
-
25
- # Add code/number with part as one token
26
- parts << code_portion if code_portion
27
-
28
- # Build result - join with space, then add dash+year as one token
29
- result = parts.join(" ")
30
- result += "-#{year}" if year
31
- result += " (R#{reaffirmation})" if reaffirmation
32
- result
33
- end
34
-
35
20
  private
36
21
 
37
22
  def code_portion
@@ -7,24 +7,6 @@ module Pubid
7
7
  "std"
8
8
  end
9
9
 
10
- def urn_number
11
- return nil unless identifier.code
12
-
13
- identifier.code.value.to_s
14
- end
15
-
16
- def urn_part
17
- return nil unless identifier.part
18
-
19
- "-#{identifier.part}"
20
- end
21
-
22
- def urn_year
23
- return identifier.year.to_s if identifier.year
24
-
25
- nil
26
- end
27
-
28
10
  def generate
29
11
  parts = ["urn", "api"]
30
12
  parts << urn_type
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Api
5
+ # Parses API URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits:
8
+ # urn:api:{publisher}:{number}[-{part}]:{year}
9
+ # where slot[1] is the publisher (default "api"), slot[2] is the number
10
+ # with optional `-part` suffix, slot[3] is the optional year.
11
+ #
12
+ # Examples:
13
+ # - urn:api:api:1104 → API STD 1104
14
+ # - urn:api:api:1104-1:2020 → API STD 1104-1:2020
15
+ class UrnParser < Pubid::UrnParser::Base
16
+ def parse_urn(urn)
17
+ body = strip_namespace(urn)
18
+ parts = split_parts(body)
19
+
20
+ _type, number = parts
21
+ idx = 2
22
+ part = nil
23
+ if parts[idx]&.start_with?("-")
24
+ part = parts[idx]
25
+ idx += 1
26
+ end
27
+ year = parts[idx]
28
+
29
+ text = "API STD #{number}#{part}"
30
+ text += ":#{year}" if year
31
+ flavor_parse(text)
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/pubid/api.rb CHANGED
@@ -1,17 +1,63 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "api/identifier"
4
- require_relative "api/scheme"
5
-
6
3
  module Pubid
7
4
  module Api
5
+ autoload :Builder, "#{__dir__}/api/builder"
6
+ autoload :Identifier, "#{__dir__}/api/identifier"
7
+ autoload :Identifiers, "#{__dir__}/api/identifiers"
8
+ autoload :Parser, "#{__dir__}/api/parser"
9
+ autoload :Renderer, "#{__dir__}/api/renderer"
10
+ autoload :SingleIdentifier, "#{__dir__}/api/single_identifier"
11
+ autoload :UrnGenerator, "#{__dir__}/api/urn_generator"
12
+ autoload :UrnParser, "#{__dir__}/api/urn_parser"
13
+
8
14
  def self.parse(input)
9
15
  Identifier.parse(input)
10
16
  end
11
- end
12
17
 
13
- # Register this flavor with the Pubid registry
18
+ # Auto-discover all identifier types from the Identifiers namespace.
19
+ # @return [Array<Class>] identifier classes (Pubid::Identifier subclasses)
20
+ def self.identifier_types
21
+ @identifier_types ||= Identifiers.constants
22
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
23
+ .select { |c| c.is_a?(Class) && c < Pubid::Identifier }
24
+ .reject { |c| c.name&.split("::")&.last == "Base" }
25
+ end
26
+
27
+ # Build typed stage index from identifier types
28
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
29
+ def self.all_typed_stages
30
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
31
+ if klass.const_defined?(:TYPED_STAGES)
32
+ klass.const_get(:TYPED_STAGES)
33
+ else
34
+ []
35
+ end
36
+ end
37
+ end
38
+
39
+ # Lookup: type code -> identifier class
40
+ # @param code [String, Symbol] the type key to find
41
+ # @return [Class, nil] the matching identifier class
42
+ def self.locate_type(code)
43
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
44
+ rescue NoMethodError
45
+ nil
46
+ end
47
+
48
+ # Lookup: abbreviation -> typed stage
49
+ # @param abbr [String, Symbol] the abbreviation to find
50
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
51
+ def self.locate_stage(abbr)
52
+ abbr_str = abbr.to_s.upcase
53
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
54
+ end
55
+ end
14
56
  end
15
57
 
16
58
  # Register Uapi flavor with the registry
17
59
  Pubid::Registry.register(:api, Pubid::Api)
60
+
61
+ # Per-flavor format registry: inherits global formats, overrides :human
62
+ Pubid::Api::Identifiers::Base.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
63
+ Pubid::Api::Identifiers::Base.format_registry.register(:human, renderer: Pubid::Api::Renderer)
@@ -3,7 +3,7 @@
3
3
  module Pubid
4
4
  module Ashrae
5
5
  # Builder class for constructing ASHRAE identifier scheme from parsed data
6
- # Single Responsibility: Transform parsed data into Scheme objects
6
+ # Single Responsibility: Transform parsed data into identifier objects
7
7
  class Builder
8
8
  attr_reader :identifier_class
9
9
 
@@ -13,7 +13,7 @@ module Pubid
13
13
 
14
14
  # Build a scheme object from parsed data
15
15
  # @param parsed [Hash, Array] the parsed identifier data
16
- # @return [Scheme] the constructed scheme object
16
+ # @return [identifier] the constructed scheme object
17
17
  def build(parsed)
18
18
  # Parslet can return array of hashes - merge them
19
19
  parsed_hash = parsed.is_a?(Array) ? merge_parsed_array(parsed) : parsed
@@ -71,7 +71,7 @@ module Pubid
71
71
 
72
72
  # Extract and normalize attributes from parsed data
73
73
  # @param parsed [Hash] the parsed data
74
- # @return [Hash] normalized attributes for Scheme
74
+ # @return [Hash] normalized attributes for identifier
75
75
  def extract_attributes(parsed)
76
76
  attributes = {}
77
77
 
@@ -1,57 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Pubid
4
- module Ashrae
5
- module Identifier
6
- # Parse an ASHRAE identifier string into an identifier object
7
- # @param identifier [String] The ASHRAE identifier string to parse
8
- # @return [Identifiers::Base] The appropriate identifier object
9
- # @raise [Parslet::ParseFailed] If parsing fails
10
- def self.parse(identifier)
11
- parsed = Parser.parse(identifier)
12
- Builder.build(parsed)
13
- rescue Parslet::ParseFailed => e
14
- raise "Failed to parse ASHRAE identifier '#{identifier}': #{e.message}"
15
- 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
- end
56
- end
57
- end
3
+ # The ASHRAE flavor base class is Pubid::Ashrae::Identifier — a real
4
+ # Pubid::Identifier subclass that every concrete ASHRAE identifier descends
5
+ # from, so `is_a?` identity and the shared polymorphic `from_hash` work natively
6
+ # (no facade needed). Its body, `.parse`, and the Identifiers::Base back-compat
7
+ # alias live in identifiers/base.rb; this file just ensures it is loaded when a
8
+ # consumer references Pubid::Ashrae::Identifier directly.
9
+ require_relative "identifiers/base"
@@ -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
@@ -2,22 +2,36 @@
2
2
 
3
3
  module Pubid
4
4
  module Ashrae
5
- module Identifiers
6
- # Base class for all ASHRAE identifiers
7
- class Base < Pubid::Identifier
8
- attribute :publisher, :string, default: "ASHRAE"
9
- attribute :code, :string
10
- attribute :year, :string
11
- attribute :type, :string
12
- attribute :suffix, :string # R (revision), P (proposed), etc.
13
- attribute :amendment, :string
14
- attribute :reaffirmed, :string
15
- attribute :copublisher, :string
16
-
17
- def self.parse(string)
18
- Ashrae::Identifier.parse(string)
19
- end
5
+ # Base class for all ASHRAE identifiers. Canonical name
6
+ # Pubid::Ashrae::Identifier; every concrete ASHRAE identifier descends from
7
+ # it, and Identifiers::Base aliased at the foot of this file — points back
8
+ # to it.
9
+ class Identifier < ::Pubid::Identifier
10
+ # Parse an ASHRAE identifier string into an identifier object
11
+ # @param identifier [String] The ASHRAE identifier string to parse
12
+ # @return [Pubid::Ashrae::Identifier] The appropriate identifier object
13
+ # @raise [Parslet::ParseFailed] If parsing fails
14
+ def self.parse(identifier)
15
+ parsed = Parser.parse(identifier)
16
+ Builder.build(parsed)
17
+ rescue Parslet::ParseFailed => e
18
+ raise "Failed to parse ASHRAE identifier '#{identifier}': #{e.message}"
20
19
  end
20
+
21
+ attribute :publisher, :string, default: "ASHRAE"
22
+ attribute :code, :string
23
+ attribute :year, :string
24
+ attribute :type, :string
25
+ attribute :suffix, :string # R (revision), P (proposed), etc.
26
+ attribute :amendment, :string
27
+ attribute :reaffirmed, :string
28
+ attribute :copublisher, :string
29
+ end
30
+
31
+ module Identifiers
32
+ # Backward-compatible alias: ASHRAE's base class used to be
33
+ # Pubid::Ashrae::Identifiers::Base. It is now Pubid::Ashrae::Identifier.
34
+ Base = Pubid::Ashrae::Identifier
21
35
  end
22
36
  end
23
37
  end
@@ -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
@@ -650,6 +650,10 @@ module Pubid
650
650
  root(:identifier)
651
651
 
652
652
  def self.parse(string)
653
+ if string.length > Pubid::MAX_INPUT_LENGTH
654
+ raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
655
+ end
656
+
653
657
  # Strip leading/trailing whitespace
654
658
  cleaned = string.strip
655
659
 
@@ -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,61 @@ 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)
16
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
17
+ raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
18
+ end
19
+
15
20
  Identifier.parse(identifier)
16
21
  end
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
 
20
61
  # Register Uashrae flavor with the registry
21
62
  Pubid::Registry.register(:ashrae, Pubid::Ashrae)
63
+
64
+ # Per-flavor format registry: inherits global formats, overrides :human
65
+ Pubid::Ashrae::Identifiers::Base.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
66
+ Pubid::Ashrae::Identifiers::Base.format_registry.register(:human, renderer: Pubid::Ashrae::Renderer)