pubid 1.15.18 → 2.0.0.pre.alpha.1

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 (601) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.adoc +2041 -53
  4. data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
  5. data/archived-gems/pubid-iec/stages.yaml +129 -0
  6. data/archived-gems/pubid-iec/update_codes.yaml +67 -0
  7. data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
  8. data/archived-gems/pubid-iso/stages.yaml +106 -0
  9. data/archived-gems/pubid-iso/update_codes.yaml +4 -0
  10. data/archived-gems/pubid-itu/i18n.yaml +13 -0
  11. data/archived-gems/pubid-itu/series.yaml +42 -0
  12. data/archived-gems/pubid-nist/publishers.yaml +6 -0
  13. data/archived-gems/pubid-nist/series.yaml +121 -0
  14. data/archived-gems/pubid-nist/stages.yaml +16 -0
  15. data/archived-gems/pubid-nist/update_codes.yaml +93 -0
  16. data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
  17. data/data/ccsds/update_codes.yaml +1 -0
  18. data/data/iec/update_codes.yaml +67 -0
  19. data/data/ieee/update_codes.yaml +104 -0
  20. data/data/iso/update_codes.yaml +21 -0
  21. data/data/nist/update_codes.yaml +87 -0
  22. data/data/plateau/update_codes.yaml +6 -0
  23. data/lib/pubid/amca/builder.rb +176 -0
  24. data/lib/pubid/amca/identifier.rb +18 -0
  25. data/lib/pubid/amca/identifiers/base.rb +64 -0
  26. data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
  27. data/lib/pubid/amca/identifiers/publication.rb +47 -0
  28. data/lib/pubid/amca/identifiers/standard.rb +22 -0
  29. data/lib/pubid/amca/identifiers.rb +12 -0
  30. data/lib/pubid/amca/parser.rb +153 -0
  31. data/lib/pubid/amca/scheme.rb +16 -0
  32. data/lib/pubid/amca/single_identifier.rb +33 -0
  33. data/lib/pubid/amca/urn_generator.rb +50 -0
  34. data/lib/pubid/amca.rb +26 -0
  35. data/lib/pubid/ansi/builder.rb +52 -0
  36. data/lib/pubid/ansi/identifier.rb +13 -0
  37. data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
  38. data/lib/pubid/ansi/identifiers/standard.rb +16 -0
  39. data/lib/pubid/ansi/identifiers.rb +11 -0
  40. data/lib/pubid/ansi/parser.rb +91 -0
  41. data/lib/pubid/ansi/scheme.rb +15 -0
  42. data/lib/pubid/ansi/single_identifier.rb +45 -0
  43. data/lib/pubid/ansi/urn_generator.rb +76 -0
  44. data/lib/pubid/ansi.rb +27 -0
  45. data/lib/pubid/api/builder.rb +85 -0
  46. data/lib/pubid/api/components/code.rb +9 -0
  47. data/lib/pubid/api/identifier.rb +21 -0
  48. data/lib/pubid/api/identifiers/base.rb +24 -0
  49. data/lib/pubid/api/identifiers/bulletin.rb +15 -0
  50. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
  51. data/lib/pubid/api/identifiers/mpms.rb +44 -0
  52. data/lib/pubid/api/identifiers/publication.rb +15 -0
  53. data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
  54. data/lib/pubid/api/identifiers/specification.rb +15 -0
  55. data/lib/pubid/api/identifiers/standard.rb +15 -0
  56. data/lib/pubid/api/identifiers/technical_report.rb +15 -0
  57. data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
  58. data/lib/pubid/api/parser.rb +140 -0
  59. data/lib/pubid/api/scheme.rb +66 -0
  60. data/lib/pubid/api/single_identifier.rb +46 -0
  61. data/lib/pubid/api/urn_generator.rb +41 -0
  62. data/lib/pubid/api.rb +17 -0
  63. data/lib/pubid/ashrae/builder.rb +498 -0
  64. data/lib/pubid/ashrae/identifier.rb +18 -0
  65. data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
  66. data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
  67. data/lib/pubid/ashrae/identifiers/base.rb +23 -0
  68. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
  69. data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
  70. data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
  71. data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
  72. data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
  73. data/lib/pubid/ashrae/identifiers.rb +16 -0
  74. data/lib/pubid/ashrae/parser.rb +724 -0
  75. data/lib/pubid/ashrae/scheme.rb +53 -0
  76. data/lib/pubid/ashrae/single_identifier.rb +23 -0
  77. data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
  78. data/lib/pubid/ashrae/urn_generator.rb +59 -0
  79. data/lib/pubid/ashrae.rb +21 -0
  80. data/lib/pubid/asme/builder.rb +153 -0
  81. data/lib/pubid/asme/components/code.rb +18 -0
  82. data/lib/pubid/asme/identifier.rb +15 -0
  83. data/lib/pubid/asme/identifiers/base.rb +70 -0
  84. data/lib/pubid/asme/identifiers/standard.rb +12 -0
  85. data/lib/pubid/asme/identifiers.rb +10 -0
  86. data/lib/pubid/asme/parser.rb +308 -0
  87. data/lib/pubid/asme/scheme.rb +37 -0
  88. data/lib/pubid/asme/single_identifier.rb +29 -0
  89. data/lib/pubid/asme/urn_generator.rb +133 -0
  90. data/lib/pubid/asme.rb +21 -0
  91. data/lib/pubid/astm/builder.rb +159 -0
  92. data/lib/pubid/astm/components/code.rb +33 -0
  93. data/lib/pubid/astm/identifier.rb +15 -0
  94. data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
  95. data/lib/pubid/astm/identifiers/base.rb +13 -0
  96. data/lib/pubid/astm/identifiers/data_series.rb +25 -0
  97. data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
  98. data/lib/pubid/astm/identifiers/manual.rb +40 -0
  99. data/lib/pubid/astm/identifiers/monograph.rb +25 -0
  100. data/lib/pubid/astm/identifiers/research_report.rb +18 -0
  101. data/lib/pubid/astm/identifiers/standard.rb +52 -0
  102. data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
  103. data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
  104. data/lib/pubid/astm/parser.rb +244 -0
  105. data/lib/pubid/astm/scheme.rb +55 -0
  106. data/lib/pubid/astm/single_identifier.rb +25 -0
  107. data/lib/pubid/astm/urn_generator.rb +99 -0
  108. data/lib/pubid/astm.rb +38 -0
  109. data/lib/pubid/bsi/builder.rb +1483 -0
  110. data/lib/pubid/bsi/components/code.rb +11 -0
  111. data/lib/pubid/bsi/components/date.rb +11 -0
  112. data/lib/pubid/bsi/components/publisher.rb +11 -0
  113. data/lib/pubid/bsi/components/type.rb +11 -0
  114. data/lib/pubid/bsi/identifier.rb +27 -0
  115. data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
  116. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
  117. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
  118. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
  119. data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
  120. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  121. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
  122. data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
  123. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
  124. data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
  125. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
  126. data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
  127. data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
  128. data/lib/pubid/bsi/identifiers/disc.rb +56 -0
  129. data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
  130. data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
  131. data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
  132. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
  133. data/lib/pubid/bsi/identifiers/flex.rb +61 -0
  134. data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
  135. data/lib/pubid/bsi/identifiers/index.rb +62 -0
  136. data/lib/pubid/bsi/identifiers/method.rb +76 -0
  137. data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
  138. data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
  139. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
  140. data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
  141. data/lib/pubid/bsi/identifiers/section.rb +62 -0
  142. data/lib/pubid/bsi/identifiers/set.rb +46 -0
  143. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
  144. data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
  145. data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
  146. data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
  147. data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
  148. data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
  149. data/lib/pubid/bsi/identifiers.rb +52 -0
  150. data/lib/pubid/bsi/model.rb +196 -0
  151. data/lib/pubid/bsi/parser.rb +659 -0
  152. data/lib/pubid/bsi/scheme.rb +243 -0
  153. data/lib/pubid/bsi/single_identifier.rb +129 -0
  154. data/lib/pubid/bsi/urn_generator.rb +84 -0
  155. data/lib/pubid/bsi.rb +32 -0
  156. data/lib/pubid/builder/base.rb +138 -0
  157. data/lib/pubid/bundled_identifier.rb +126 -0
  158. data/lib/pubid/ccsds/builder.rb +56 -0
  159. data/lib/pubid/ccsds/identifier.rb +16 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +78 -0
  161. data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
  162. data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
  163. data/lib/pubid/ccsds/identifiers.rb +10 -0
  164. data/lib/pubid/ccsds/parser.rb +71 -0
  165. data/lib/pubid/ccsds/scheme.rb +57 -0
  166. data/lib/pubid/ccsds/single_identifier.rb +74 -0
  167. data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
  168. data/lib/pubid/ccsds/urn_generator.rb +115 -0
  169. data/lib/pubid/ccsds.rb +21 -0
  170. data/lib/pubid/cen_cenelec/builder.rb +330 -0
  171. data/lib/pubid/cen_cenelec/identifier.rb +15 -0
  172. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
  173. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
  174. data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
  175. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
  176. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
  177. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
  178. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
  179. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
  180. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
  181. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
  182. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
  183. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
  184. data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
  185. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
  186. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
  187. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
  188. data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
  189. data/lib/pubid/cen_cenelec/parser.rb +144 -0
  190. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  191. data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
  192. data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
  193. data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
  194. data/lib/pubid/cen_cenelec.rb +21 -0
  195. data/lib/pubid/cie/builder.rb +399 -0
  196. data/lib/pubid/cie/components/code.rb +72 -0
  197. data/lib/pubid/cie/components/language.rb +58 -0
  198. data/lib/pubid/cie/identifier.rb +18 -0
  199. data/lib/pubid/cie/identifiers/bundle.rb +20 -0
  200. data/lib/pubid/cie/identifiers/conference.rb +32 -0
  201. data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
  202. data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
  203. data/lib/pubid/cie/identifiers/identical.rb +64 -0
  204. data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
  205. data/lib/pubid/cie/identifiers/standard.rb +58 -0
  206. data/lib/pubid/cie/identifiers/supplement.rb +45 -0
  207. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
  208. data/lib/pubid/cie/identifiers.rb +17 -0
  209. data/lib/pubid/cie/parser.rb +347 -0
  210. data/lib/pubid/cie/scheme.rb +64 -0
  211. data/lib/pubid/cie/single_identifier.rb +30 -0
  212. data/lib/pubid/cie/supplement_identifier.rb +26 -0
  213. data/lib/pubid/cie/urn_generator.rb +123 -0
  214. data/lib/pubid/cie.rb +28 -0
  215. data/lib/pubid/components/code.rb +33 -0
  216. data/lib/pubid/components/date.rb +49 -0
  217. data/lib/pubid/components/edition.rb +32 -0
  218. data/lib/pubid/components/language.rb +37 -0
  219. data/lib/pubid/components/locality.rb +10 -0
  220. data/lib/pubid/components/publisher.rb +36 -0
  221. data/lib/pubid/components/stage.rb +54 -0
  222. data/lib/pubid/components/type.rb +58 -0
  223. data/lib/pubid/components/typed_stage.rb +55 -0
  224. data/lib/pubid/components.rb +15 -0
  225. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  226. data/lib/pubid/core/update_codes.rb +77 -0
  227. data/lib/pubid/core.rb +8 -0
  228. data/lib/pubid/csa/builder.rb +671 -0
  229. data/lib/pubid/csa/components/code.rb +9 -0
  230. data/lib/pubid/csa/components.rb +9 -0
  231. data/lib/pubid/csa/composite_identifier.rb +27 -0
  232. data/lib/pubid/csa/identifier.rb +457 -0
  233. data/lib/pubid/csa/identifiers/base.rb +133 -0
  234. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  235. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  236. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  237. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  238. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  239. data/lib/pubid/csa/identifiers/package.rb +65 -0
  240. data/lib/pubid/csa/identifiers/series.rb +127 -0
  241. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  242. data/lib/pubid/csa/identifiers.rb +17 -0
  243. data/lib/pubid/csa/parser.rb +445 -0
  244. data/lib/pubid/csa/scheme.rb +44 -0
  245. data/lib/pubid/csa/single_identifier.rb +30 -0
  246. data/lib/pubid/csa/urn_generator.rb +80 -0
  247. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  248. data/lib/pubid/csa.rb +25 -0
  249. data/lib/pubid/etsi/builder.rb +133 -0
  250. data/lib/pubid/etsi/components/code.rb +42 -0
  251. data/lib/pubid/etsi/components/version.rb +37 -0
  252. data/lib/pubid/etsi/components.rb +10 -0
  253. data/lib/pubid/etsi/identifier.rb +14 -0
  254. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  255. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  256. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  257. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  258. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  259. data/lib/pubid/etsi/identifiers.rb +14 -0
  260. data/lib/pubid/etsi/parser.rb +133 -0
  261. data/lib/pubid/etsi/scheme.rb +42 -0
  262. data/lib/pubid/etsi/urn_generator.rb +76 -0
  263. data/lib/pubid/etsi.rb +21 -0
  264. data/lib/pubid/export/auditor.rb +89 -0
  265. data/lib/pubid/export/data_class_exporter.rb +59 -0
  266. data/lib/pubid/export/exporter.rb +74 -0
  267. data/lib/pubid/export/flavor_exporter.rb +402 -0
  268. data/lib/pubid/export/ieee_exporter.rb +78 -0
  269. data/lib/pubid/export/itu_exporter.rb +66 -0
  270. data/lib/pubid/export/nist_exporter.rb +64 -0
  271. data/lib/pubid/export/registry_exporter.rb +90 -0
  272. data/lib/pubid/export/result.rb +97 -0
  273. data/lib/pubid/export/scheme_exporter.rb +70 -0
  274. data/lib/pubid/export.rb +18 -0
  275. data/lib/pubid/format_detector.rb +16 -0
  276. data/lib/pubid/format_registry.rb +42 -0
  277. data/lib/pubid/identifier.rb +235 -0
  278. data/lib/pubid/identifier_metadata.rb +148 -0
  279. data/lib/pubid/identifier_registry.rb +198 -0
  280. data/lib/pubid/idf/builder.rb +82 -0
  281. data/lib/pubid/idf/identifier.rb +69 -0
  282. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  283. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  284. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  285. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  286. data/lib/pubid/idf/identifiers.rb +13 -0
  287. data/lib/pubid/idf/parser.rb +143 -0
  288. data/lib/pubid/idf/scheme.rb +61 -0
  289. data/lib/pubid/idf/single_identifier.rb +19 -0
  290. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  291. data/lib/pubid/idf/urn_generator.rb +84 -0
  292. data/lib/pubid/idf.rb +25 -0
  293. data/lib/pubid/iec/builder.rb +457 -0
  294. data/lib/pubid/iec/components/code.rb +59 -0
  295. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  296. data/lib/pubid/iec/components/publisher.rb +35 -0
  297. data/lib/pubid/iec/components/sheet.rb +32 -0
  298. data/lib/pubid/iec/components/trf_info.rb +38 -0
  299. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  300. data/lib/pubid/iec/identifier.rb +21 -0
  301. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  302. data/lib/pubid/iec/identifiers/base.rb +78 -0
  303. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  304. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  305. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +86 -0
  306. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  307. data/lib/pubid/iec/identifiers/fragment_identifier.rb +141 -0
  308. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  309. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  310. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  311. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  312. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  313. data/lib/pubid/iec/identifiers/sheet_identifier.rb +66 -0
  314. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  315. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  316. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  317. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  319. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  320. data/lib/pubid/iec/identifiers/vap_identifier.rb +77 -0
  321. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  322. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  323. data/lib/pubid/iec/parser.rb +412 -0
  324. data/lib/pubid/iec/rendering_style.rb +113 -0
  325. data/lib/pubid/iec/scheme.rb +71 -0
  326. data/lib/pubid/iec/single_identifier.rb +80 -0
  327. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  328. data/lib/pubid/iec/urn_generator.rb +193 -0
  329. data/lib/pubid/iec/urn_parser.rb +289 -0
  330. data/lib/pubid/iec.rb +85 -0
  331. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  332. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  333. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  334. data/lib/pubid/ieee/aiee.rb +11 -0
  335. data/lib/pubid/ieee/builder.rb +1237 -0
  336. data/lib/pubid/ieee/components/code.rb +102 -0
  337. data/lib/pubid/ieee/components/draft.rb +93 -0
  338. data/lib/pubid/ieee/components/relationship.rb +157 -0
  339. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  340. data/lib/pubid/ieee/identifier.rb +13 -0
  341. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  342. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  343. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  344. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  345. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  346. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  347. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  348. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  349. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  350. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  351. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  352. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  353. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  354. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  355. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  356. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  358. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  359. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  360. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  361. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  362. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  363. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  364. data/lib/pubid/ieee/identifiers.rb +33 -0
  365. data/lib/pubid/ieee/ire/builder.rb +61 -0
  366. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  367. data/lib/pubid/ieee/ire/parser.rb +91 -0
  368. data/lib/pubid/ieee/ire.rb +11 -0
  369. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  370. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  371. data/lib/pubid/ieee/nesc.rb +10 -0
  372. data/lib/pubid/ieee/parser.rb +1226 -0
  373. data/lib/pubid/ieee/scheme.rb +90 -0
  374. data/lib/pubid/ieee/typed_stages.rb +172 -0
  375. data/lib/pubid/ieee/urn_generator.rb +188 -0
  376. data/lib/pubid/ieee.rb +32 -0
  377. data/lib/pubid/ieee_debug.rb +31 -0
  378. data/lib/pubid/iho/builder.rb +37 -0
  379. data/lib/pubid/iho/identifier.rb +19 -0
  380. data/lib/pubid/iho/identifiers/base.rb +41 -0
  381. data/lib/pubid/iho/identifiers/bibliographic.rb +20 -0
  382. data/lib/pubid/iho/identifiers/circular_letter.rb +19 -0
  383. data/lib/pubid/iho/identifiers/miscellaneous.rb +20 -0
  384. data/lib/pubid/iho/identifiers/publication.rb +19 -0
  385. data/lib/pubid/iho/identifiers/standard.rb +19 -0
  386. data/lib/pubid/iho/identifiers.rb +14 -0
  387. data/lib/pubid/iho/parser.rb +68 -0
  388. data/lib/pubid/iho/scheme.rb +29 -0
  389. data/lib/pubid/iho/urn_generator.rb +29 -0
  390. data/lib/pubid/iho.rb +21 -0
  391. data/lib/pubid/iso/builder.rb +305 -0
  392. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  393. data/lib/pubid/iso/combined_identifier.rb +22 -0
  394. data/lib/pubid/iso/components/code.rb +36 -0
  395. data/lib/pubid/iso/components/publisher.rb +60 -0
  396. data/lib/pubid/iso/components.rb +12 -0
  397. data/lib/pubid/iso/format_resolver.rb +45 -0
  398. data/lib/pubid/iso/identifier.rb +69 -0
  399. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  400. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  401. data/lib/pubid/iso/identifiers/base.rb +115 -0
  402. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  403. data/lib/pubid/iso/identifiers/data.rb +76 -0
  404. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  405. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  406. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  407. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  408. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  409. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  410. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  411. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  412. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  413. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  414. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  415. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  416. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  417. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  418. data/lib/pubid/iso/identifiers.rb +33 -0
  419. data/lib/pubid/iso/parser.rb +510 -0
  420. data/lib/pubid/iso/rendering_style.rb +120 -0
  421. data/lib/pubid/iso/scheme.rb +187 -0
  422. data/lib/pubid/iso/single_identifier.rb +61 -0
  423. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  424. data/lib/pubid/iso/urn_generator.rb +412 -0
  425. data/lib/pubid/iso/urn_parser.rb +423 -0
  426. data/lib/pubid/iso/utilities.rb +86 -0
  427. data/lib/pubid/iso.rb +50 -0
  428. data/lib/pubid/itu/builder.rb +171 -0
  429. data/lib/pubid/itu/components/code.rb +39 -0
  430. data/lib/pubid/itu/components/sector.rb +35 -0
  431. data/lib/pubid/itu/components/series.rb +29 -0
  432. data/lib/pubid/itu/i18n.rb +9 -0
  433. data/lib/pubid/itu/i18n.yaml +30 -0
  434. data/lib/pubid/itu/identifier.rb +53 -0
  435. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  436. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  437. data/lib/pubid/itu/identifiers/base.rb +154 -0
  438. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  439. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  440. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  441. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  442. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  443. data/lib/pubid/itu/identifiers.rb +16 -0
  444. data/lib/pubid/itu/model.rb +111 -0
  445. data/lib/pubid/itu/parser.rb +225 -0
  446. data/lib/pubid/itu/scheme.rb +174 -0
  447. data/lib/pubid/itu/urn_generator.rb +105 -0
  448. data/lib/pubid/itu.rb +22 -0
  449. data/lib/pubid/jcgm/builder.rb +88 -0
  450. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  451. data/lib/pubid/jcgm/components.rb +9 -0
  452. data/lib/pubid/jcgm/identifier.rb +11 -0
  453. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  454. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  455. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  456. data/lib/pubid/jcgm/identifiers.rb +11 -0
  457. data/lib/pubid/jcgm/parser.rb +84 -0
  458. data/lib/pubid/jcgm/scheme.rb +60 -0
  459. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  460. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  461. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  462. data/lib/pubid/jcgm.rb +31 -0
  463. data/lib/pubid/jis/builder.rb +124 -0
  464. data/lib/pubid/jis/components/code.rb +59 -0
  465. data/lib/pubid/jis/components.rb +9 -0
  466. data/lib/pubid/jis/identifier.rb +18 -0
  467. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  468. data/lib/pubid/jis/identifiers/base.rb +72 -0
  469. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  470. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  471. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  472. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  473. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  474. data/lib/pubid/jis/identifiers.rb +17 -0
  475. data/lib/pubid/jis/parser.rb +109 -0
  476. data/lib/pubid/jis/scheme.rb +49 -0
  477. data/lib/pubid/jis/single_identifier.rb +37 -0
  478. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  479. data/lib/pubid/jis/urn_generator.rb +25 -0
  480. data/lib/pubid/jis.rb +23 -0
  481. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  482. data/lib/pubid/nist/builder.rb +2100 -0
  483. data/lib/pubid/nist/components/code.rb +38 -0
  484. data/lib/pubid/nist/components/edition.rb +118 -0
  485. data/lib/pubid/nist/components/issue_number.rb +28 -0
  486. data/lib/pubid/nist/components/part.rb +77 -0
  487. data/lib/pubid/nist/components/publisher.rb +24 -0
  488. data/lib/pubid/nist/components/stage.rb +53 -0
  489. data/lib/pubid/nist/components/supplement.rb +121 -0
  490. data/lib/pubid/nist/components/translation.rb +42 -0
  491. data/lib/pubid/nist/components/update.rb +103 -0
  492. data/lib/pubid/nist/components/version.rb +35 -0
  493. data/lib/pubid/nist/components/volume.rb +32 -0
  494. data/lib/pubid/nist/components.rb +19 -0
  495. data/lib/pubid/nist/configuration.rb +77 -0
  496. data/lib/pubid/nist/identifiers/base.rb +499 -0
  497. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  498. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  499. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  500. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  501. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  502. data/lib/pubid/nist/identifiers/crpl_report.rb +135 -0
  503. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +94 -0
  504. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  505. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  506. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  507. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  508. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  509. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  510. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  511. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  512. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  513. data/lib/pubid/nist/identifiers/report.rb +68 -0
  514. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  515. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  516. data/lib/pubid/nist/identifiers.rb +33 -0
  517. data/lib/pubid/nist/parser.rb +1084 -0
  518. data/lib/pubid/nist/scheme.rb +199 -0
  519. data/lib/pubid/nist/supplement_identifier.rb +83 -0
  520. data/lib/pubid/nist/urn_generator.rb +127 -0
  521. data/lib/pubid/nist.rb +36 -0
  522. data/lib/pubid/oiml/builder.rb +189 -0
  523. data/lib/pubid/oiml/components/code.rb +20 -0
  524. data/lib/pubid/oiml/components.rb +9 -0
  525. data/lib/pubid/oiml/identifier.rb +11 -0
  526. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  527. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  528. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  529. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  530. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  531. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  536. data/lib/pubid/oiml/identifiers.rb +18 -0
  537. data/lib/pubid/oiml/parser.rb +173 -0
  538. data/lib/pubid/oiml/scheme.rb +46 -0
  539. data/lib/pubid/oiml/single_identifier.rb +90 -0
  540. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  541. data/lib/pubid/oiml/urn_generator.rb +64 -0
  542. data/lib/pubid/oiml.rb +26 -0
  543. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  544. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  545. data/lib/pubid/parser.rb +8 -0
  546. data/lib/pubid/parsers/base.rb +11 -0
  547. data/lib/pubid/parsers/mr_string.rb +93 -0
  548. data/lib/pubid/plateau/builder.rb +50 -0
  549. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  550. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  551. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  552. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  553. data/lib/pubid/plateau/identifiers.rb +12 -0
  554. data/lib/pubid/plateau/parser.rb +63 -0
  555. data/lib/pubid/plateau/scheme.rb +45 -0
  556. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  557. data/lib/pubid/plateau/urn_generator.rb +29 -0
  558. data/lib/pubid/plateau.rb +25 -0
  559. data/lib/pubid/renderers/base.rb +19 -0
  560. data/lib/pubid/renderers/directives_renderer.rb +62 -0
  561. data/lib/pubid/renderers/guide_renderer.rb +20 -0
  562. data/lib/pubid/renderers/human_readable.rb +58 -0
  563. data/lib/pubid/renderers/iwa_renderer.rb +16 -0
  564. data/lib/pubid/renderers/mr_string.rb +16 -0
  565. data/lib/pubid/renderers/supplement_renderer.rb +33 -0
  566. data/lib/pubid/renderers/urn.rb +11 -0
  567. data/lib/pubid/renderers.rb +14 -0
  568. data/lib/pubid/rendering/base.rb +73 -0
  569. data/lib/pubid/rendering/common.rb +211 -0
  570. data/lib/pubid/rendering/context.rb +156 -0
  571. data/lib/pubid/rendering/date.rb +27 -0
  572. data/lib/pubid/rendering/format.rb +25 -0
  573. data/lib/pubid/rendering/language.rb +21 -0
  574. data/lib/pubid/rendering/numbering.rb +24 -0
  575. data/lib/pubid/rendering/publisher.rb +25 -0
  576. data/lib/pubid/rendering/stage.rb +38 -0
  577. data/lib/pubid/rendering/supplement.rb +46 -0
  578. data/lib/pubid/rendering.rb +16 -0
  579. data/lib/pubid/sae/builder.rb +32 -0
  580. data/lib/pubid/sae/components/code.rb +9 -0
  581. data/lib/pubid/sae/components/date.rb +19 -0
  582. data/lib/pubid/sae/components/type.rb +19 -0
  583. data/lib/pubid/sae/components.rb +11 -0
  584. data/lib/pubid/sae/identifier.rb +14 -0
  585. data/lib/pubid/sae/identifiers/base.rb +42 -0
  586. data/lib/pubid/sae/identifiers.rb +9 -0
  587. data/lib/pubid/sae/parser.rb +55 -0
  588. data/lib/pubid/sae/scheme.rb +47 -0
  589. data/lib/pubid/sae/urn_generator.rb +38 -0
  590. data/lib/pubid/sae.rb +19 -0
  591. data/lib/pubid/scheme.rb +207 -0
  592. data/lib/pubid/urn_generator/base.rb +110 -0
  593. data/lib/pubid/utils/string_normalizer.rb +196 -0
  594. data/lib/pubid/utils.rb +7 -0
  595. data/lib/pubid/version.rb +3 -1
  596. data/lib/pubid.rb +137 -13
  597. data/lib/tasks/docs.rake +37 -0
  598. data/lib/tasks/export.rake +38 -0
  599. data/lib/tasks/website-data.json +7488 -0
  600. metadata +613 -171
  601. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Api
5
+ class UrnGenerator < Pubid::UrnGenerator::Base
6
+ def urn_type
7
+ "std"
8
+ end
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
+ def generate
29
+ parts = ["urn", "api"]
30
+ parts << urn_type
31
+ parts << urn_number if urn_number
32
+ parts << urn_part if urn_part
33
+ parts << urn_year if urn_year
34
+
35
+ parts[1] = identifier.publisher.to_s.downcase if identifier.publisher
36
+
37
+ parts.join(":")
38
+ end
39
+ end
40
+ end
41
+ end
data/lib/pubid/api.rb ADDED
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "api/identifier"
4
+ require_relative "api/scheme"
5
+
6
+ module Pubid
7
+ module Api
8
+ def self.parse(input)
9
+ Identifier.parse(input)
10
+ end
11
+ end
12
+
13
+ # Register this flavor with the Pubid registry
14
+ end
15
+
16
+ # Register Uapi flavor with the registry
17
+ Pubid::Registry.register(:api, Pubid::Api)
@@ -0,0 +1,498 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ashrae
5
+ # Builder class for constructing ASHRAE identifier scheme from parsed data
6
+ # Single Responsibility: Transform parsed data into Scheme objects
7
+ class Builder
8
+ attr_reader :identifier_class
9
+
10
+ def initialize(identifier_class = Identifiers::Base)
11
+ @identifier_class = identifier_class
12
+ end
13
+
14
+ # Build a scheme object from parsed data
15
+ # @param parsed [Hash, Array] the parsed identifier data
16
+ # @return [Scheme] the constructed scheme object
17
+ def build(parsed)
18
+ # Parslet can return array of hashes - merge them
19
+ parsed_hash = parsed.is_a?(Array) ? merge_parsed_array(parsed) : parsed
20
+
21
+ # Check for supplement identifiers first
22
+ if parsed_hash[:errata_keyword]
23
+ return build_errata(parsed_hash)
24
+ elsif parsed_hash[:interpretation_identifier]
25
+ return build_interpretation(parsed_hash[:interpretation_identifier])
26
+ elsif parsed_hash[:combined_addenda]
27
+ return build_combined_addenda(parsed_hash[:combined_addenda])
28
+ elsif parsed_hash[:addenda_package]
29
+ return build_addenda_package(parsed_hash[:addenda_package])
30
+ elsif parsed_hash[:addendum_identifier]
31
+ return build_addendum_from_identifier(parsed_hash[:addendum_identifier])
32
+ elsif parsed_hash[:publisher_addendum]
33
+ return build_publisher_addendum(parsed_hash[:publisher_addendum])
34
+ elsif parsed_hash[:publisher_addendum_copublisher]
35
+ return build_publisher_addendum_copublisher(parsed_hash[:publisher_addendum_copublisher])
36
+ elsif parsed_hash[:publisher_addendum_copublisher_no_type]
37
+ return build_publisher_addendum_copublisher_no_type(parsed_hash[:publisher_addendum_copublisher_no_type])
38
+ elsif parsed_hash[:addendum_no_type]
39
+ return build_addendum_no_type(parsed_hash[:addendum_no_type])
40
+ elsif parsed_hash[:standard_addendum]
41
+ return build_standard_addendum(parsed_hash[:standard_addendum])
42
+ end
43
+
44
+ # Handle base identifier
45
+ if parsed_hash[:base]
46
+ parsed_hash = parsed_hash[:base]
47
+ end
48
+
49
+ attributes = extract_attributes(parsed_hash)
50
+ identifier_class = determine_identifier_class(attributes)
51
+ identifier_class.new(**attributes)
52
+ end
53
+
54
+ # Class method to build an identifier from parsed data
55
+ # @param parsed [Hash, Array] the parsed identifier data
56
+ # @return [Identifiers::Base] the constructed identifier object
57
+ def self.build(parsed)
58
+ new.build(parsed)
59
+ end
60
+
61
+ private
62
+
63
+ # Merge an array of parsed hashes into a single hash
64
+ # @param parsed_array [Array<Hash>] array of parsed hashes
65
+ # @return [Hash] merged hash
66
+ def merge_parsed_array(parsed_array)
67
+ parsed_array.inject({}) do |result, hash|
68
+ result.merge(hash)
69
+ end
70
+ end
71
+
72
+ # Extract and normalize attributes from parsed data
73
+ # @param parsed [Hash] the parsed data
74
+ # @return [Hash] normalized attributes for Scheme
75
+ def extract_attributes(parsed)
76
+ attributes = {}
77
+
78
+ # Extract publisher
79
+ if parsed[:publisher]
80
+ attributes[:publisher] =
81
+ extract_value(parsed[:publisher])
82
+ end
83
+
84
+ # Extract type - default to "Standard" if not present
85
+ attributes[:type] = extract_value(parsed[:type]) || "Standard"
86
+
87
+ # Extract code (from code or code_with_year format)
88
+ if parsed[:code_with_year]
89
+ # code_with_year contains both code and year
90
+ code_year_data = parsed[:code_with_year]
91
+ if code_year_data && code_year_data[:code]
92
+ attributes[:code] =
93
+ extract_value(code_year_data[:code])
94
+ end
95
+ if code_year_data && code_year_data[:year]
96
+ attributes[:year] =
97
+ extract_value(code_year_data[:year])
98
+ end
99
+ elsif parsed[:code]
100
+ attributes[:code] = extract_value(parsed[:code])
101
+ end
102
+
103
+ # Extract year if not already extracted from code_with_year
104
+ attributes[:year] ||= extract_value(parsed[:year]) if parsed[:year]
105
+
106
+ # Extract suffix (R or P)
107
+ attributes[:suffix] = extract_value(parsed[:suffix]) if parsed[:suffix]
108
+
109
+ # Extract reaffirmed year
110
+ if parsed[:reaffirmed]
111
+ attributes[:reaffirmed] =
112
+ extract_value(parsed[:reaffirmed])
113
+ end
114
+
115
+ # Extract copublisher
116
+ if parsed[:copublisher]
117
+ attributes[:copublisher] =
118
+ extract_value(parsed[:copublisher])
119
+ end
120
+
121
+ attributes
122
+ end
123
+
124
+ # Determine which identifier class to use based on attributes
125
+ def determine_identifier_class(attributes)
126
+ type_value = attributes[:type]
127
+
128
+ # Use type to determine class
129
+ if type_value == "Guideline"
130
+ Identifiers::Guideline
131
+ elsif type_value == "Standard"
132
+ Identifiers::Standard
133
+ else
134
+ # Default to Standard
135
+ Identifiers::Standard
136
+ end
137
+ end
138
+
139
+ # Extract a simple value from parsed data
140
+ # @param value [Object] the value to extract
141
+ # @return [String, nil] the extracted string value
142
+ def extract_value(value)
143
+ return nil if value.nil?
144
+ return nil if value.is_a?(Array) && value.empty?
145
+
146
+ if value.is_a?(Array)
147
+ joined = value.join
148
+ return joined.length.positive? ? joined : nil
149
+ end
150
+
151
+ str_value = value.to_s.strip
152
+ str_value.length.positive? ? str_value : nil
153
+ end
154
+
155
+ # Build an Errata identifier from parsed errata data
156
+ # @param parsed [Hash] the parsed errata data
157
+ # @return [Identifiers::Errata] the constructed errata identifier
158
+ def build_errata(parsed)
159
+ base_attrs = extract_base_attributes(parsed)
160
+ base_class = determine_identifier_class(base_attrs)
161
+ base_identifier = base_class.new(**base_attrs)
162
+
163
+ errata_date = extract_errata_date(parsed[:errata_date])
164
+
165
+ Identifiers::Errata.new(
166
+ base_identifier: base_identifier,
167
+ errata_date: errata_date,
168
+ )
169
+ end
170
+
171
+ # Build an Interpretation identifier from parsed interpretation data
172
+ # @param parsed [Hash] the parsed interpretation data
173
+ # @return [Identifiers::Interpretation] the constructed interpretation identifier
174
+ def build_interpretation(parsed)
175
+ base_attrs = extract_base_attributes(parsed)
176
+ base_class = determine_identifier_class(base_attrs)
177
+ base_identifier = base_class.new(**base_attrs)
178
+
179
+ Identifiers::Interpretation.new(
180
+ base_identifier: base_identifier,
181
+ )
182
+ end
183
+
184
+ # Build an Addendum identifier from "Addendum X to Standard" format
185
+ # @param parsed [Hash] the parsed addendum data
186
+ # @return [Identifiers::Addendum] the constructed addendum identifier
187
+ def build_addendum_from_identifier(parsed)
188
+ base_attrs = extract_base_attributes(parsed)
189
+ base_class = determine_identifier_class(base_attrs)
190
+ base_identifier = base_class.new(**base_attrs)
191
+
192
+ addendum_code = extract_value(parsed[:addendum_code])
193
+ addendum_date = extract_addendum_date(parsed[:addendum_year])
194
+
195
+ Identifiers::Addendum.new(
196
+ base_identifier: base_identifier,
197
+ addendum_code: addendum_code,
198
+ addendum_date: addendum_date,
199
+ )
200
+ end
201
+
202
+ # Build an Addendum identifier from "ASHRAE Addendum X to Standard" format
203
+ # @param parsed [Hash] the parsed publisher addendum data
204
+ # @return [Identifiers::Addendum] the constructed addendum identifier
205
+ def build_publisher_addendum(parsed)
206
+ base_attrs = {
207
+ type: extract_value(parsed[:type]),
208
+ code: extract_value(parsed[:code]),
209
+ year: extract_value(parsed[:year]),
210
+ }
211
+ base_class = determine_identifier_class(base_attrs)
212
+ base_identifier = base_class.new(**base_attrs)
213
+
214
+ addendum_code = extract_value(parsed[:addendum_code])
215
+ addendum_date = extract_addendum_date(parsed[:addendum_year])
216
+
217
+ Identifiers::Addendum.new(
218
+ base_identifier: base_identifier,
219
+ addendum_code: addendum_code,
220
+ addendum_date: addendum_date,
221
+ )
222
+ end
223
+
224
+ # Build an Addendum identifier from "ASHRAE Addendum X to ANSI/ASHRAE Standard Y-YYYY" format
225
+ # @param parsed [Hash] the parsed publisher addendum with copublisher data
226
+ # @return [Identifiers::Addendum] the constructed addendum identifier
227
+ def build_publisher_addendum_copublisher(parsed)
228
+ base_attrs = {
229
+ copublisher: extract_value(parsed[:copublisher]),
230
+ type: extract_value(parsed[:type]) || "Standard",
231
+ code: extract_value(parsed[:code]),
232
+ year: extract_value(parsed[:year]),
233
+ }
234
+ base_class = determine_identifier_class(base_attrs)
235
+ base_identifier = base_class.new(**base_attrs)
236
+
237
+ addendum_code = extract_value(parsed[:addendum_code])
238
+ addendum_date = extract_addendum_date(parsed[:addendum_year])
239
+
240
+ Identifiers::Addendum.new(
241
+ base_identifier: base_identifier,
242
+ addendum_code: addendum_code,
243
+ addendum_date: addendum_date,
244
+ )
245
+ end
246
+
247
+ # Build an Addendum identifier from "ANSI/ASHRAE Addendum X to ANSI/ASHRAE 34-2024" (no type) format
248
+ # @param parsed [Hash] the parsed addendum data with code_with_year
249
+ # @return [Identifiers::Addendum] the constructed addendum identifier
250
+ def build_addendum_no_type(parsed)
251
+ # Extract copublisher and code_with_year data
252
+ base_attrs = {}
253
+ if parsed[:copublisher]
254
+ base_attrs[:copublisher] =
255
+ extract_value(parsed[:copublisher])
256
+ end
257
+ base_attrs[:type] = "Standard" # Default to Standard when type is missing
258
+
259
+ # Extract code and year from code_with_year
260
+ if parsed[:code_with_year]
261
+ code_year_data = parsed[:code_with_year]
262
+ if code_year_data && code_year_data[:code]
263
+ base_attrs[:code] =
264
+ extract_value(code_year_data[:code])
265
+ end
266
+ if code_year_data && code_year_data[:year]
267
+ base_attrs[:year] =
268
+ extract_value(code_year_data[:year])
269
+ end
270
+ end
271
+
272
+ base_class = determine_identifier_class(base_attrs)
273
+ base_identifier = base_class.new(**base_attrs)
274
+
275
+ addendum_code = extract_value(parsed[:addendum_code])
276
+ addendum_date = extract_addendum_date(parsed[:addendum_year])
277
+
278
+ Identifiers::Addendum.new(
279
+ base_identifier: base_identifier,
280
+ addendum_code: addendum_code,
281
+ addendum_date: addendum_date,
282
+ )
283
+ end
284
+
285
+ # Build an Addendum identifier from "ASHRAE Addendum X to ANSI/ASHRAE 62.1-2022" (publisher + copublisher, no type) format
286
+ # @param parsed [Hash] the parsed publisher addendum with copublisher and code_with_year data
287
+ # @return [Identifiers::Addendum] the constructed addendum identifier
288
+ def build_publisher_addendum_copublisher_no_type(parsed)
289
+ # Extract copublisher and code_with_year data
290
+ base_attrs = {}
291
+ if parsed[:copublisher]
292
+ base_attrs[:copublisher] =
293
+ extract_value(parsed[:copublisher])
294
+ end
295
+ base_attrs[:type] = "Standard" # Default to Standard when type is missing
296
+
297
+ # Extract code and year from code_with_year
298
+ if parsed[:code_with_year]
299
+ code_year_data = parsed[:code_with_year]
300
+ if code_year_data && code_year_data[:code]
301
+ base_attrs[:code] =
302
+ extract_value(code_year_data[:code])
303
+ end
304
+ if code_year_data && code_year_data[:year]
305
+ base_attrs[:year] =
306
+ extract_value(code_year_data[:year])
307
+ end
308
+ end
309
+
310
+ base_class = determine_identifier_class(base_attrs)
311
+ base_identifier = base_class.new(**base_attrs)
312
+
313
+ addendum_code = extract_value(parsed[:addendum_code])
314
+ addendum_date = extract_addendum_date(parsed[:addendum_year])
315
+
316
+ Identifiers::Addendum.new(
317
+ base_identifier: base_identifier,
318
+ addendum_code: addendum_code,
319
+ addendum_date: addendum_date,
320
+ )
321
+ end
322
+
323
+ # Build an Addendum identifier from "Standard X Addendum a" format
324
+ # @param parsed [Hash] the parsed standard addendum data
325
+ # @return [Identifiers::Addendum] the constructed addendum identifier
326
+ def build_standard_addendum(parsed)
327
+ base_attrs = extract_base_attributes(parsed)
328
+ base_class = determine_identifier_class(base_attrs)
329
+ base_identifier = base_class.new(**base_attrs)
330
+
331
+ addendum_code = extract_value(parsed[:addendum_code])
332
+ addendum_date = extract_addendum_date(parsed[:addendum_year])
333
+
334
+ Identifiers::Addendum.new(
335
+ base_identifier: base_identifier,
336
+ addendum_code: addendum_code,
337
+ addendum_date: addendum_date,
338
+ )
339
+ end
340
+
341
+ # Build a CombinedAddenda identifier from "ASHRAE Addenda X and Y to Standard Z-YYYY" format
342
+ # @param parsed [Hash] the parsed combined addenda data
343
+ # @return [Identifiers::CombinedAddenda] the constructed combined addenda identifier
344
+ def build_combined_addenda(parsed)
345
+ # Extract base identifier attributes
346
+ # Handle code_with_year format (used in Formats 5 and 6)
347
+ base_attrs = {}
348
+
349
+ if parsed[:code_with_year]
350
+ code_year_data = parsed[:code_with_year]
351
+ if code_year_data && code_year_data[:code]
352
+ base_attrs[:code] =
353
+ extract_value(code_year_data[:code])
354
+ end
355
+ if code_year_data && code_year_data[:year]
356
+ base_attrs[:year] =
357
+ extract_value(code_year_data[:year])
358
+ end
359
+ else
360
+ base_attrs[:type] = extract_value(parsed[:type]) || "Standard"
361
+ base_attrs[:code] = extract_value(parsed[:code])
362
+ base_attrs[:year] = extract_value(parsed[:year])
363
+ end
364
+
365
+ if parsed[:copublisher]
366
+ base_attrs[:copublisher] =
367
+ extract_value(parsed[:copublisher])
368
+ end
369
+ if parsed[:publisher]
370
+ base_attrs[:publisher] =
371
+ extract_value(parsed[:publisher])
372
+ end
373
+
374
+ base_class = determine_identifier_class(base_attrs)
375
+ base_identifier = base_class.new(**base_attrs)
376
+
377
+ # Build the addendum_codes string from first code and additional codes
378
+ first_code = extract_value(parsed[:addendum_code])
379
+ additional_codes = parsed[:additional_codes]
380
+
381
+ # Handle Format 4: "ASHRAE Addenda to Standard" (no specific codes)
382
+ if first_code.nil? && additional_codes.nil?
383
+ # No codes specified - return nil or empty string for addendum_codes
384
+ addendum_codes_str = nil
385
+ else
386
+ addendum_codes_str = first_code || ""
387
+ if additional_codes
388
+ # additional_codes is an array that can contain:
389
+ # - hashes: {:addendum_code=>"f"}
390
+ # - strings: "a", "b", etc.
391
+ # We need to format them as comma-separated
392
+ code_list = []
393
+ additional_codes.each do |code|
394
+ code_str = if code.is_a?(Hash)
395
+ # Extract from {:addendum_code=>"f"}
396
+ extract_value(code[:addendum_code])
397
+ else
398
+ # Direct string value
399
+ extract_value(code)
400
+ end
401
+ code_list << code_str if code_str && code_str != "and"
402
+ end
403
+ # Join with commas
404
+ addendum_codes_str += ", #{code_list.join(', ')}" unless code_list.empty?
405
+ end
406
+ end
407
+
408
+ Identifiers::CombinedAddenda.new(
409
+ base_identifier: base_identifier,
410
+ addendum_codes: addendum_codes_str,
411
+ )
412
+ end
413
+
414
+ # Build an AddendaPackage identifier from "ASHRAE Standard X-YYYY: Addenda Supplement Package" format
415
+ # @param parsed [Hash] the parsed addenda package data
416
+ # @return [Identifiers::AddendaPackage] the constructed addenda package identifier
417
+ def build_addenda_package(parsed)
418
+ base_attrs = extract_base_attributes(parsed)
419
+ base_class = determine_identifier_class(base_attrs)
420
+ base_identifier = base_class.new(**base_attrs)
421
+
422
+ package_description = extract_value(parsed[:package_description])
423
+
424
+ Identifiers::AddendaPackage.new(
425
+ base_identifier: base_identifier,
426
+ package_description: package_description,
427
+ )
428
+ end
429
+
430
+ # Extract base identifier attributes from parsed data
431
+ # @param parsed [Hash] the parsed data
432
+ # @return [Hash] attributes for base identifier
433
+ def extract_base_attributes(parsed)
434
+ attributes = {}
435
+
436
+ if parsed[:publisher]
437
+ attributes[:publisher] =
438
+ extract_value(parsed[:publisher])
439
+ end
440
+ if parsed[:copublisher]
441
+ attributes[:copublisher] =
442
+ extract_value(parsed[:copublisher])
443
+ end
444
+ # Default to "Standard" if type is not present
445
+ attributes[:type] = extract_value(parsed[:type]) || "Standard"
446
+
447
+ # Handle code_with_year format
448
+ if parsed[:code_with_year]
449
+ code_year_data = parsed[:code_with_year]
450
+ if code_year_data && code_year_data[:code]
451
+ attributes[:code] =
452
+ extract_value(code_year_data[:code])
453
+ end
454
+ if code_year_data && code_year_data[:year]
455
+ attributes[:year] =
456
+ extract_value(code_year_data[:year])
457
+ end
458
+ else
459
+ attributes[:code] = extract_value(parsed[:code]) if parsed[:code]
460
+ attributes[:year] = extract_value(parsed[:year]) if parsed[:year]
461
+ end
462
+
463
+ attributes[:suffix] = extract_value(parsed[:suffix]) if parsed[:suffix]
464
+ if parsed[:reaffirmed]
465
+ attributes[:reaffirmed] =
466
+ extract_value(parsed[:reaffirmed])
467
+ end
468
+
469
+ attributes
470
+ end
471
+
472
+ # Extract errata date from parsed errata_date data
473
+ # @param errata_date [Hash] the parsed errata_date hash
474
+ # @return [String, nil] the formatted errata date string
475
+ def extract_errata_date(errata_date)
476
+ return nil unless errata_date
477
+
478
+ # errata_date contains { month_name: "...", errata_year: "..." }
479
+ # We need to format this as "Month Day, Year"
480
+ extract_value(errata_date[:month_name])
481
+ extract_value(errata_date[:errata_year])
482
+ # Note: day is captured as digit.repeat(1,2) but not named in the parser
483
+ # We'll need to reconstruct from the raw string or enhance parser
484
+ nil # For now, return nil - parser enhancement needed
485
+ end
486
+
487
+ # Extract addendum date from parsed addendum_year data
488
+ # @param addendum_year [String, Hash] the parsed addendum year data
489
+ # @return [String, nil] the formatted addendum date string
490
+ def extract_addendum_date(addendum_year)
491
+ return nil unless addendum_year
492
+
493
+ # Date extraction would require more detailed parser
494
+ nil
495
+ end
496
+ end
497
+ end
498
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
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
+ end
17
+ end
18
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Ashrae
7
+ module Identifiers
8
+ # AddendaPackage identifier for ASHRAE addenda collection packages
9
+ # Represents packages that contain multiple addendums
10
+ # Examples:
11
+ # - ASHRAE Standard 52.2-1999: Addenda Supplement Package (Contains Addendum a)
12
+ # - ASHRAE Standard 52.2-2007 Addenda Supplement Package (Contains Addendum b)
13
+ # - ASHRAE Standard 62.2-2004: Addenda Supplement Package (Contains Addendum g) (PDF)
14
+ class AddendaPackage < SupplementIdentifier
15
+ attribute :package_description, :string # e.g., "Addenda Supplement Package"
16
+
17
+ TYPED_STAGES = [
18
+ Components::TypedStage.new(
19
+ abbr: ["Addenda Supplement Package", "Addenda Package"],
20
+ type_code: "addenda_package",
21
+ stage_code: "published",
22
+ ),
23
+ ].freeze
24
+
25
+ def self.type
26
+ { key: :addenda_package, title: "ASHRAE Addenda Package",
27
+ short: "Addenda Package" }
28
+ end
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
+ def copublisher
41
+ base_identifier&.copublisher
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Ashrae
7
+ module Identifiers
8
+ # Addendum identifier for ASHRAE standards and guidelines
9
+ # Examples:
10
+ # - ASHRAE Addendum a to Standard 15-2001
11
+ # - ASHRAE Addendum a to Guideline 1.4-2019
12
+ # - ANSI/ASHRAE Addendum a to ANSI/ASHRAE Standard 15-2019
13
+ # - ASHRAE Standard 15-2013 Addendum a
14
+ class Addendum < SupplementIdentifier
15
+ attribute :addendum_code, :string # a, b, c, ..., aa, ab, ..., ba, etc.
16
+ attribute :addendum_date, :string # Optional date (January 22, 2019)
17
+
18
+ TYPED_STAGES = [
19
+ Components::TypedStage.new(
20
+ abbr: ["Addendum", "Addenda"],
21
+ type_code: "addendum",
22
+ stage_code: "published",
23
+ ),
24
+ ].freeze
25
+
26
+ def self.type
27
+ { key: :addendum, title: "ASHRAE Addendum", short: "Addendum" }
28
+ end
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
+ def copublisher
50
+ base_identifier&.copublisher
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
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
20
+ end
21
+ end
22
+ end
23
+ end