pubid 2.0.0.pre.alpha.8 → 2.0.0.pre.alpha.9

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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/data/bipm/update_codes.yaml +9 -0
  3. data/data/iec/update_codes.yaml +3 -0
  4. data/data/ieee/update_codes.yaml +107 -1
  5. data/data/nist/series.yaml +155 -0
  6. data/data/nist/update_codes.yaml +8 -0
  7. data/lib/pubid/adobe/builder.rb +52 -0
  8. data/lib/pubid/adobe/identifier.rb +49 -0
  9. data/lib/pubid/adobe/identifiers/publication.rb +31 -0
  10. data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
  11. data/lib/pubid/adobe/identifiers.rb +10 -0
  12. data/lib/pubid/adobe/parser.rb +128 -0
  13. data/lib/pubid/adobe/renderer.rb +39 -0
  14. data/lib/pubid/adobe/urn_generator.rb +42 -0
  15. data/lib/pubid/adobe/urn_parser.rb +69 -0
  16. data/lib/pubid/adobe.rb +60 -0
  17. data/lib/pubid/amca/builder.rb +2 -2
  18. data/lib/pubid/amca/identifier.rb +1 -3
  19. data/lib/pubid/amca/identifiers/base.rb +1 -6
  20. data/lib/pubid/amca/identifiers/interpretation.rb +1 -1
  21. data/lib/pubid/amca/identifiers/publication.rb +1 -1
  22. data/lib/pubid/amca/identifiers/standard.rb +1 -1
  23. data/lib/pubid/amca/identifiers.rb +0 -1
  24. data/lib/pubid/amca/single_identifier.rb +1 -1
  25. data/lib/pubid/amca.rb +3 -3
  26. data/lib/pubid/ashrae/builder.rb +22 -22
  27. data/lib/pubid/ashrae/identifier.rb +3 -4
  28. data/lib/pubid/ashrae/identifiers/addenda_package.rb +1 -1
  29. data/lib/pubid/ashrae/identifiers/addendum.rb +1 -1
  30. data/lib/pubid/ashrae/identifiers/base.rb +14 -8
  31. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +1 -1
  32. data/lib/pubid/ashrae/identifiers.rb +0 -1
  33. data/lib/pubid/ashrae/parser.rb +14 -9
  34. data/lib/pubid/ashrae/renderer.rb +19 -19
  35. data/lib/pubid/ashrae/single_identifier.rb +1 -1
  36. data/lib/pubid/ashrae/supplement_identifier.rb +6 -6
  37. data/lib/pubid/ashrae.rb +3 -3
  38. data/lib/pubid/bipm/builder.rb +107 -0
  39. data/lib/pubid/bipm/identifier.rb +160 -0
  40. data/lib/pubid/bipm/identifiers/committee_document.rb +24 -0
  41. data/lib/pubid/bipm/identifiers/guide.rb +24 -0
  42. data/lib/pubid/bipm/identifiers/meeting.rb +41 -0
  43. data/lib/pubid/bipm/identifiers/mep.rb +21 -0
  44. data/lib/pubid/bipm/identifiers/metrologia_article.rb +24 -0
  45. data/lib/pubid/bipm/identifiers/si_brochure.rb +20 -0
  46. data/lib/pubid/bipm/identifiers.rb +15 -0
  47. data/lib/pubid/bipm/parser.rb +184 -0
  48. data/lib/pubid/bipm/renderer.rb +110 -0
  49. data/lib/pubid/bipm/urn_generator.rb +58 -0
  50. data/lib/pubid/bipm/urn_parser.rb +52 -0
  51. data/lib/pubid/bipm.rb +86 -0
  52. data/lib/pubid/bsi/builder.rb +14 -14
  53. data/lib/pubid/bsi/identifier.rb +0 -1
  54. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
  55. data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
  56. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +6 -0
  57. data/lib/pubid/bsi/identifiers/corrigendum.rb +4 -4
  58. data/lib/pubid/bsi/identifiers/expert_commentary.rb +5 -5
  59. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -2
  60. data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
  61. data/lib/pubid/bsi/renderer.rb +8 -8
  62. data/lib/pubid/bsi/single_identifier.rb +48 -0
  63. data/lib/pubid/builder/base.rb +5 -3
  64. data/lib/pubid/bundled_identifier.rb +3 -3
  65. data/lib/pubid/calconnect/builder.rb +38 -0
  66. data/lib/pubid/calconnect/identifier.rb +117 -0
  67. data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
  68. data/lib/pubid/calconnect/identifiers.rb +9 -0
  69. data/lib/pubid/calconnect/parser.rb +54 -0
  70. data/lib/pubid/calconnect/renderer.rb +36 -0
  71. data/lib/pubid/calconnect/urn_generator.rb +33 -0
  72. data/lib/pubid/calconnect/urn_parser.rb +34 -0
  73. data/lib/pubid/calconnect.rb +77 -0
  74. data/lib/pubid/ccsds/builder.rb +1 -1
  75. data/lib/pubid/ccsds/identifier.rb +1 -1
  76. data/lib/pubid/ccsds/identifiers/corrigendum.rb +2 -2
  77. data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
  78. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  79. data/lib/pubid/cen_cenelec/builder.rb +46 -12
  80. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -2
  81. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +6 -0
  82. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -2
  83. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
  84. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  85. data/lib/pubid/cen_cenelec/renderer.rb +5 -5
  86. data/lib/pubid/cen_cenelec/supplement_identifier.rb +5 -5
  87. data/lib/pubid/cen_cenelec/urn_generator.rb +1 -1
  88. data/lib/pubid/cen_cenelec.rb +76 -72
  89. data/lib/pubid/cie/builder.rb +139 -24
  90. data/lib/pubid/cie/identifier.rb +7 -3
  91. data/lib/pubid/cie/identifiers/bundle.rb +32 -4
  92. data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
  93. data/lib/pubid/cie/identifiers/conference.rb +9 -4
  94. data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
  95. data/lib/pubid/cie/identifiers/dual_published.rb +4 -4
  96. data/lib/pubid/cie/identifiers/identical.rb +7 -7
  97. data/lib/pubid/cie/identifiers/joint_published.rb +8 -8
  98. data/lib/pubid/cie/identifiers/proceedings.rb +39 -0
  99. data/lib/pubid/cie/identifiers/standard.rb +33 -7
  100. data/lib/pubid/cie/identifiers/supplement.rb +24 -22
  101. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +6 -2
  102. data/lib/pubid/cie/identifiers.rb +2 -0
  103. data/lib/pubid/cie/parser.rb +54 -5
  104. data/lib/pubid/cie/single_identifier.rb +40 -1
  105. data/lib/pubid/cie/supplement_identifier.rb +29 -16
  106. data/lib/pubid/cie/urn_generator.rb +11 -8
  107. data/lib/pubid/cie.rb +0 -1
  108. data/lib/pubid/components/date.rb +21 -5
  109. data/lib/pubid/csa/builder.rb +1 -1
  110. data/lib/pubid/csa/composite_identifier.rb +17 -1
  111. data/lib/pubid/csa/identifier.rb +48 -3
  112. data/lib/pubid/csa/identifiers/bundled.rb +6 -0
  113. data/lib/pubid/csa/identifiers/combined.rb +6 -0
  114. data/lib/pubid/csa/identifiers/package.rb +2 -2
  115. data/lib/pubid/csa/parser.rb +6 -6
  116. data/lib/pubid/csa/wrapper_identifier.rb +17 -0
  117. data/lib/pubid/doi/builder.rb +18 -0
  118. data/lib/pubid/doi/identifier.rb +46 -0
  119. data/lib/pubid/doi/identifiers/resource.rb +30 -0
  120. data/lib/pubid/doi/identifiers.rb +9 -0
  121. data/lib/pubid/doi/parser.rb +52 -0
  122. data/lib/pubid/doi/renderer.rb +13 -0
  123. data/lib/pubid/doi.rb +55 -0
  124. data/lib/pubid/easc/builder.rb +55 -0
  125. data/lib/pubid/easc/identifier.rb +61 -0
  126. data/lib/pubid/easc/identifiers/pmg.rb +20 -0
  127. data/lib/pubid/easc/identifiers/rmg.rb +19 -0
  128. data/lib/pubid/easc/identifiers.rb +10 -0
  129. data/lib/pubid/easc/parser.rb +80 -0
  130. data/lib/pubid/easc/renderer.rb +48 -0
  131. data/lib/pubid/easc/urn_generator.rb +46 -0
  132. data/lib/pubid/easc/urn_parser.rb +57 -0
  133. data/lib/pubid/easc.rb +52 -0
  134. data/lib/pubid/ecma/builder.rb +31 -0
  135. data/lib/pubid/ecma/identifier.rb +76 -0
  136. data/lib/pubid/ecma/identifiers/memento.rb +30 -0
  137. data/lib/pubid/ecma/identifiers/standard.rb +31 -0
  138. data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
  139. data/lib/pubid/ecma/identifiers.rb +11 -0
  140. data/lib/pubid/ecma/parser.rb +41 -0
  141. data/lib/pubid/ecma/renderer.rb +46 -0
  142. data/lib/pubid/ecma/urn_generator.rb +25 -0
  143. data/lib/pubid/ecma/urn_parser.rb +35 -0
  144. data/lib/pubid/ecma.rb +67 -0
  145. data/lib/pubid/etsi/builder.rb +7 -3
  146. data/lib/pubid/etsi/identifier.rb +1 -3
  147. data/lib/pubid/etsi/identifiers/base.rb +28 -10
  148. data/lib/pubid/etsi/identifiers/etsi_standard.rb +128 -4
  149. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +35 -3
  150. data/lib/pubid/etsi/identifiers.rb +0 -1
  151. data/lib/pubid/etsi/parser.rb +8 -2
  152. data/lib/pubid/etsi/renderer.rb +8 -2
  153. data/lib/pubid/etsi.rb +5 -5
  154. data/lib/pubid/export/exporter.rb +2 -1
  155. data/lib/pubid/export/flavor_exporter.rb +18 -3
  156. data/lib/pubid/gb/builder.rb +45 -0
  157. data/lib/pubid/gb/identifier.rb +64 -0
  158. data/lib/pubid/gb/identifiers/standard.rb +34 -0
  159. data/lib/pubid/gb/identifiers.rb +9 -0
  160. data/lib/pubid/gb/parser.rb +63 -0
  161. data/lib/pubid/gb/renderer.rb +35 -0
  162. data/lib/pubid/gb.rb +87 -0
  163. data/lib/pubid/gost/builder.rb +148 -0
  164. data/lib/pubid/gost/identifier.rb +49 -0
  165. data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
  166. data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
  167. data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
  168. data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
  169. data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
  170. data/lib/pubid/gost/identifiers.rb +13 -0
  171. data/lib/pubid/gost/parser.rb +97 -0
  172. data/lib/pubid/gost/renderer.rb +48 -0
  173. data/lib/pubid/gost/urn_generator.rb +46 -0
  174. data/lib/pubid/gost/urn_parser.rb +52 -0
  175. data/lib/pubid/gost.rb +49 -0
  176. data/lib/pubid/iala/builder.rb +22 -27
  177. data/lib/pubid/iala/identifier.rb +27 -2
  178. data/lib/pubid/iala/identifiers/advice.rb +1 -1
  179. data/lib/pubid/iala/identifiers/annex.rb +10 -10
  180. data/lib/pubid/iala/identifiers/general_assembly.rb +5 -2
  181. data/lib/pubid/iala/identifiers/guideline.rb +3 -1
  182. data/lib/pubid/iala/identifiers/letter.rb +1 -1
  183. data/lib/pubid/iala/identifiers/manual.rb +3 -1
  184. data/lib/pubid/iala/identifiers/model_course.rb +3 -1
  185. data/lib/pubid/iala/identifiers/recommendation.rb +3 -1
  186. data/lib/pubid/iala/identifiers/report.rb +1 -1
  187. data/lib/pubid/iala/identifiers/resolution.rb +1 -1
  188. data/lib/pubid/iala/identifiers/standard.rb +3 -1
  189. data/lib/pubid/iala/identifiers.rb +0 -1
  190. data/lib/pubid/iala/renderer.rb +1 -1
  191. data/lib/pubid/iala/urn_generator.rb +1 -1
  192. data/lib/pubid/iala/urn_parser.rb +19 -2
  193. data/lib/pubid/iala.rb +4 -4
  194. data/lib/pubid/iana/builder.rb +20 -0
  195. data/lib/pubid/iana/identifier.rb +72 -0
  196. data/lib/pubid/iana/identifiers/registry.rb +33 -0
  197. data/lib/pubid/iana/identifiers.rb +9 -0
  198. data/lib/pubid/iana/parser.rb +38 -0
  199. data/lib/pubid/iana/renderer.rb +29 -0
  200. data/lib/pubid/iana/urn_generator.rb +15 -0
  201. data/lib/pubid/iana/urn_parser.rb +24 -0
  202. data/lib/pubid/iana.rb +69 -0
  203. data/lib/pubid/identifier.rb +210 -23
  204. data/lib/pubid/idf/builder.rb +1 -1
  205. data/lib/pubid/idf/parser.rb +2 -2
  206. data/lib/pubid/idf/renderer.rb +1 -1
  207. data/lib/pubid/idf/supplement_identifier.rb +3 -3
  208. data/lib/pubid/iec/builder.rb +35 -25
  209. data/lib/pubid/iec/identifier.rb +47 -2
  210. data/lib/pubid/iec/identifiers/base.rb +2 -2
  211. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
  212. data/lib/pubid/iec/identifiers/fragment_identifier.rb +11 -11
  213. data/lib/pubid/iec/identifiers/international_standard.rb +8 -5
  214. data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
  215. data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
  216. data/lib/pubid/iec/identifiers/technical_report.rb +1 -1
  217. data/lib/pubid/iec/identifiers/technical_specification.rb +1 -1
  218. data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
  219. data/lib/pubid/iec/identifiers.rb +1 -0
  220. data/lib/pubid/iec/parser.rb +51 -10
  221. data/lib/pubid/iec/renderer.rb +18 -8
  222. data/lib/pubid/iec/single_identifier.rb +1 -1
  223. data/lib/pubid/iec/supplement_identifier.rb +32 -19
  224. data/lib/pubid/iec.rb +1 -6
  225. data/lib/pubid/ieee/aiee/builder.rb +17 -3
  226. data/lib/pubid/ieee/aiee/identifier.rb +45 -61
  227. data/lib/pubid/ieee/builder.rb +341 -68
  228. data/lib/pubid/ieee/compaction.rb +121 -0
  229. data/lib/pubid/ieee/components/draft.rb +47 -7
  230. data/lib/pubid/ieee/identifier.rb +1 -3
  231. data/lib/pubid/ieee/identifiers/adopted_standard.rb +30 -5
  232. data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
  233. data/lib/pubid/ieee/identifiers/base.rb +106 -13
  234. data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
  235. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +6 -2
  236. data/lib/pubid/ieee/identifiers/corrigendum.rb +17 -2
  237. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +3 -3
  238. data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
  239. data/lib/pubid/ieee/identifiers/dual_published.rb +3 -3
  240. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
  241. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +2 -1
  242. data/lib/pubid/ieee/identifiers/joint_development.rb +56 -11
  243. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -1
  244. data/lib/pubid/ieee/identifiers/nesc/base.rb +90 -19
  245. data/lib/pubid/ieee/identifiers/nesc/draft.rb +20 -5
  246. data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
  247. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +16 -5
  248. data/lib/pubid/ieee/identifiers/nesc/redline.rb +11 -2
  249. data/lib/pubid/ieee/identifiers/nesc/standard.rb +18 -3
  250. data/lib/pubid/ieee/identifiers/nesc.rb +1 -0
  251. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +3 -3
  252. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +14 -6
  253. data/lib/pubid/ieee/identifiers/redlined_standard.rb +4 -4
  254. data/lib/pubid/ieee/identifiers/si_standard.rb +4 -1
  255. data/lib/pubid/ieee/identifiers/standard.rb +4 -1
  256. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +26 -7
  257. data/lib/pubid/ieee/identifiers.rb +2 -1
  258. data/lib/pubid/ieee/ire/builder.rb +7 -6
  259. data/lib/pubid/ieee/ire/identifier.rb +48 -33
  260. data/lib/pubid/ieee/nesc/builder.rb +33 -20
  261. data/lib/pubid/ieee/nesc/parser.rb +15 -14
  262. data/lib/pubid/ieee/parser.rb +461 -43
  263. data/lib/pubid/ieee/pre_parser.rb +1 -1
  264. data/lib/pubid/ieee/renderer.rb +154 -57
  265. data/lib/pubid/ieee/typed_stages.rb +12 -1
  266. data/lib/pubid/ieee/urn_generator.rb +3 -5
  267. data/lib/pubid/ieee.rb +56 -3
  268. data/lib/pubid/ietf/builder.rb +62 -0
  269. data/lib/pubid/ietf/identifier.rb +5 -0
  270. data/lib/pubid/ietf/identifiers/base.rb +75 -0
  271. data/lib/pubid/ietf/identifiers/bcp.rb +25 -0
  272. data/lib/pubid/ietf/identifiers/fyi.rb +25 -0
  273. data/lib/pubid/ietf/identifiers/internet_draft.rb +29 -0
  274. data/lib/pubid/ietf/identifiers/rfc.rb +25 -0
  275. data/lib/pubid/ietf/identifiers/std.rb +25 -0
  276. data/lib/pubid/ietf/identifiers.rb +13 -0
  277. data/lib/pubid/ietf/parser.rb +43 -0
  278. data/lib/pubid/ietf/renderer.rb +26 -0
  279. data/lib/pubid/ietf/urn_generator.rb +23 -0
  280. data/lib/pubid/ietf/urn_parser.rb +35 -0
  281. data/lib/pubid/ietf.rb +76 -0
  282. data/lib/pubid/iho/identifier.rb +1 -3
  283. data/lib/pubid/iho/identifiers/base.rb +1 -7
  284. data/lib/pubid/iho/identifiers/bibliographic.rb +1 -1
  285. data/lib/pubid/iho/identifiers/circular_letter.rb +1 -1
  286. data/lib/pubid/iho/identifiers/miscellaneous.rb +1 -1
  287. data/lib/pubid/iho/identifiers/publication.rb +1 -1
  288. data/lib/pubid/iho/identifiers/standard.rb +1 -1
  289. data/lib/pubid/iho/identifiers.rb +0 -1
  290. data/lib/pubid/iho.rb +7 -7
  291. data/lib/pubid/isbn/builder.rb +44 -0
  292. data/lib/pubid/isbn/check_digit.rb +53 -0
  293. data/lib/pubid/isbn/identifier.rb +63 -0
  294. data/lib/pubid/isbn/identifiers/book.rb +30 -0
  295. data/lib/pubid/isbn/identifiers.rb +9 -0
  296. data/lib/pubid/isbn/parser.rb +45 -0
  297. data/lib/pubid/isbn/renderer.rb +16 -0
  298. data/lib/pubid/isbn.rb +52 -0
  299. data/lib/pubid/iso/builder.rb +9 -4
  300. data/lib/pubid/iso/combined_identifier.rb +2 -2
  301. data/lib/pubid/iso/identifier.rb +17 -1
  302. data/lib/pubid/iso/identifiers/directives_supplement.rb +8 -8
  303. data/lib/pubid/iso/normalizer.rb +2 -2
  304. data/lib/pubid/iso/parser.rb +16 -12
  305. data/lib/pubid/iso/supplement_identifier.rb +19 -6
  306. data/lib/pubid/iso/urn_generator.rb +4 -1
  307. data/lib/pubid/iso/urn_parser.rb +1 -1
  308. data/lib/pubid/itu/builder.rb +230 -29
  309. data/lib/pubid/itu/components/code.rb +48 -5
  310. data/lib/pubid/itu/components/designation.rb +35 -0
  311. data/lib/pubid/itu/components.rb +1 -0
  312. data/lib/pubid/itu/identifier.rb +1 -3
  313. data/lib/pubid/itu/identifiers/addendum.rb +15 -0
  314. data/lib/pubid/itu/identifiers/amendment.rb +6 -28
  315. data/lib/pubid/itu/identifiers/annex.rb +13 -2
  316. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
  317. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
  318. data/lib/pubid/itu/identifiers/base.rb +341 -23
  319. data/lib/pubid/itu/identifiers/combined_identifier.rb +99 -23
  320. data/lib/pubid/itu/identifiers/corrigendum.rb +16 -23
  321. data/lib/pubid/itu/identifiers/errata.rb +15 -0
  322. data/lib/pubid/itu/identifiers/handbook.rb +38 -0
  323. data/lib/pubid/itu/identifiers/question.rb +63 -0
  324. data/lib/pubid/itu/identifiers/recommendation.rb +3 -2
  325. data/lib/pubid/itu/identifiers/report.rb +39 -0
  326. data/lib/pubid/itu/identifiers/special_publication.rb +3 -1
  327. data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
  328. data/lib/pubid/itu/identifiers/supplement.rb +119 -14
  329. data/lib/pubid/itu/identifiers.rb +10 -1
  330. data/lib/pubid/itu/model.rb +1 -1
  331. data/lib/pubid/itu/parser.rb +480 -26
  332. data/lib/pubid/itu/urn_generator.rb +36 -6
  333. data/lib/pubid/itu/urn_parser.rb +8 -0
  334. data/lib/pubid/itu.rb +11 -3
  335. data/lib/pubid/jcgm/builder.rb +23 -13
  336. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -2
  337. data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
  338. data/lib/pubid/jcgm/identifiers/gum_guide.rb +3 -3
  339. data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
  340. data/lib/pubid/jcgm/identifiers.rb +2 -0
  341. data/lib/pubid/jcgm/parser.rb +66 -6
  342. data/lib/pubid/jcgm/renderer.rb +26 -12
  343. data/lib/pubid/jcgm/single_identifier.rb +74 -5
  344. data/lib/pubid/jcgm/supplement_identifier.rb +39 -4
  345. data/lib/pubid/jcgm/urn_generator.rb +21 -13
  346. data/lib/pubid/jcgm/urn_parser.rb +15 -3
  347. data/lib/pubid/jis/identifier.rb +52 -0
  348. data/lib/pubid/nist/builder.rb +29 -9
  349. data/lib/pubid/nist/caster.rb +7 -45
  350. data/lib/pubid/nist/circular_supplement_builder.rb +7 -5
  351. data/lib/pubid/nist/components/supplement.rb +5 -2
  352. data/lib/pubid/nist/configuration.rb +7 -1
  353. data/lib/pubid/nist/identifier.rb +1 -3
  354. data/lib/pubid/nist/identifiers/base.rb +121 -37
  355. data/lib/pubid/nist/identifiers/circular.rb +1 -1
  356. data/lib/pubid/nist/identifiers/commercial_standard.rb +1 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +1 -1
  358. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +1 -1
  359. data/lib/pubid/nist/identifiers/crpl_report.rb +1 -1
  360. data/lib/pubid/nist/identifiers/dated_document.rb +1 -1
  361. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +1 -1
  362. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +1 -1
  363. data/lib/pubid/nist/identifiers/handbook.rb +1 -1
  364. data/lib/pubid/nist/identifiers/internal_report.rb +1 -1
  365. data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
  366. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +1 -1
  367. data/lib/pubid/nist/identifiers/monograph.rb +1 -1
  368. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  369. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  370. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  371. data/lib/pubid/nist/identifiers/report.rb +1 -1
  372. data/lib/pubid/nist/identifiers/special_publication.rb +10 -1
  373. data/lib/pubid/nist/identifiers/technical_note.rb +1 -1
  374. data/lib/pubid/nist/identifiers.rb +0 -1
  375. data/lib/pubid/nist/parser.rb +26 -3
  376. data/lib/pubid/nist/preprocessor.rb +15 -0
  377. data/lib/pubid/nist/router.rb +2 -2
  378. data/lib/pubid/nist/series/ir.rb +0 -3
  379. data/lib/pubid/nist/supplement_identifier.rb +9 -9
  380. data/lib/pubid/nist.rb +12 -12
  381. data/lib/pubid/oasis/builder.rb +77 -0
  382. data/lib/pubid/oasis/identifier.rb +82 -0
  383. data/lib/pubid/oasis/identifiers/standard.rb +29 -0
  384. data/lib/pubid/oasis/identifiers.rb +9 -0
  385. data/lib/pubid/oasis/parser.rb +34 -0
  386. data/lib/pubid/oasis/renderer.rb +29 -0
  387. data/lib/pubid/oasis/urn_generator.rb +25 -0
  388. data/lib/pubid/oasis/urn_parser.rb +22 -0
  389. data/lib/pubid/oasis.rb +74 -0
  390. data/lib/pubid/ogc/builder.rb +33 -0
  391. data/lib/pubid/ogc/identifier.rb +77 -0
  392. data/lib/pubid/ogc/identifiers/document.rb +26 -0
  393. data/lib/pubid/ogc/identifiers.rb +10 -0
  394. data/lib/pubid/ogc/parser.rb +40 -0
  395. data/lib/pubid/ogc/renderer.rb +33 -0
  396. data/lib/pubid/ogc/urn_generator.rb +14 -0
  397. data/lib/pubid/ogc/urn_parser.rb +22 -0
  398. data/lib/pubid/ogc.rb +71 -0
  399. data/lib/pubid/oiml/builder.rb +31 -7
  400. data/lib/pubid/oiml/identifier.rb +9 -1
  401. data/lib/pubid/oiml/parser.rb +11 -12
  402. data/lib/pubid/oiml/renderer.rb +13 -13
  403. data/lib/pubid/oiml/single_identifier.rb +20 -0
  404. data/lib/pubid/oiml/supplement_identifier.rb +9 -9
  405. data/lib/pubid/oiml/urn_parser.rb +23 -6
  406. data/lib/pubid/oiml.rb +4 -0
  407. data/lib/pubid/omg/builder.rb +19 -0
  408. data/lib/pubid/omg/identifier.rb +44 -0
  409. data/lib/pubid/omg/identifiers/specification.rb +32 -0
  410. data/lib/pubid/omg/identifiers.rb +9 -0
  411. data/lib/pubid/omg/parser.rb +40 -0
  412. data/lib/pubid/omg/renderer.rb +19 -0
  413. data/lib/pubid/omg.rb +51 -0
  414. data/lib/pubid/parsers/mr_string.rb +101 -7
  415. data/lib/pubid/plateau/builder.rb +8 -4
  416. data/lib/pubid/plateau/identifier.rb +1 -3
  417. data/lib/pubid/plateau/identifiers/base.rb +1 -6
  418. data/lib/pubid/plateau/identifiers/handbook.rb +1 -1
  419. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  420. data/lib/pubid/plateau/identifiers.rb +0 -1
  421. data/lib/pubid/plateau/parser.rb +15 -5
  422. data/lib/pubid/plateau/renderer.rb +1 -1
  423. data/lib/pubid/plateau/supplement_identifier.rb +11 -11
  424. data/lib/pubid/plateau.rb +4 -4
  425. data/lib/pubid/renderers/human_readable.rb +3 -1
  426. data/lib/pubid/renderers/mr_string.rb +46 -4
  427. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  428. data/lib/pubid/rendering/supplement.rb +4 -4
  429. data/lib/pubid/sae/builder.rb +1 -1
  430. data/lib/pubid/sae/identifier.rb +1 -3
  431. data/lib/pubid/sae/identifiers/base.rb +10 -7
  432. data/lib/pubid/sae/identifiers.rb +0 -1
  433. data/lib/pubid/sae.rb +3 -3
  434. data/lib/pubid/tgpp/builder.rb +41 -0
  435. data/lib/pubid/tgpp/identifier.rb +91 -0
  436. data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
  437. data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
  438. data/lib/pubid/tgpp/identifiers.rb +11 -0
  439. data/lib/pubid/tgpp/parser.rb +62 -0
  440. data/lib/pubid/tgpp/renderer.rb +36 -0
  441. data/lib/pubid/tgpp/urn_generator.rb +20 -0
  442. data/lib/pubid/tgpp/urn_parser.rb +28 -0
  443. data/lib/pubid/tgpp.rb +78 -0
  444. data/lib/pubid/type_resolver.rb +59 -0
  445. data/lib/pubid/un/builder.rb +42 -0
  446. data/lib/pubid/un/identifier.rb +37 -0
  447. data/lib/pubid/un/identifiers/document.rb +24 -0
  448. data/lib/pubid/un/identifiers.rb +9 -0
  449. data/lib/pubid/un/parser.rb +25 -0
  450. data/lib/pubid/un/renderer.rb +11 -0
  451. data/lib/pubid/un.rb +46 -0
  452. data/lib/pubid/version.rb +1 -1
  453. data/lib/pubid/w3c/builder.rb +55 -0
  454. data/lib/pubid/w3c/identifier.rb +101 -0
  455. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
  456. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
  457. data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
  458. data/lib/pubid/w3c/identifiers/note.rb +30 -0
  459. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
  460. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
  461. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
  462. data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
  463. data/lib/pubid/w3c/identifiers/standard.rb +12 -0
  464. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
  465. data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
  466. data/lib/pubid/w3c/identifiers.rb +25 -0
  467. data/lib/pubid/w3c/parser.rb +43 -0
  468. data/lib/pubid/w3c/renderer.rb +35 -0
  469. data/lib/pubid/w3c/urn_generator.rb +18 -0
  470. data/lib/pubid/w3c/urn_parser.rb +36 -0
  471. data/lib/pubid/w3c.rb +67 -0
  472. data/lib/pubid/xsf/builder.rb +17 -0
  473. data/lib/pubid/xsf/identifier.rb +62 -0
  474. data/lib/pubid/xsf/identifiers/xep.rb +31 -0
  475. data/lib/pubid/xsf/identifiers.rb +9 -0
  476. data/lib/pubid/xsf/parser.rb +25 -0
  477. data/lib/pubid/xsf/renderer.rb +23 -0
  478. data/lib/pubid/xsf/urn_generator.rb +13 -0
  479. data/lib/pubid/xsf/urn_parser.rb +18 -0
  480. data/lib/pubid/xsf.rb +76 -0
  481. data/lib/pubid.rb +25 -1
  482. metadata +205 -4
  483. data/lib/pubid/cie/components/code.rb +0 -80
  484. data/lib/pubid/iala/identifiers/base.rb +0 -14
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Adobe
5
+ # Generates URN strings for Adobe identifiers.
6
+ #
7
+ # Format:
8
+ # urn:adobe:tech-note:<number> e.g. urn:adobe:tech-note:5014
9
+ # urn:adobe:publication:<slug>[:v<ver>] e.g. urn:adobe:publication:adobe-glyph-list
10
+ # urn:adobe:publication:adobe-japan1:v7
11
+ class UrnGenerator
12
+ attr_reader :identifier
13
+
14
+ def initialize(identifier)
15
+ @identifier = identifier
16
+ end
17
+
18
+ def generate
19
+ if identifier.is_a?(Identifiers::TechNote)
20
+ generate_tech_note
21
+ elsif identifier.is_a?(Identifiers::Publication)
22
+ generate_publication
23
+ else
24
+ raise ArgumentError,
25
+ "Unknown Adobe identifier class: #{identifier.class}"
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def generate_tech_note
32
+ "urn:adobe:tech-note:#{identifier.number}"
33
+ end
34
+
35
+ def generate_publication
36
+ parts = ["urn:adobe:publication", identifier.slug]
37
+ parts << "v#{identifier.version}" if identifier.version
38
+ parts.join(":")
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Adobe
5
+ # Parses Adobe URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits:
8
+ # urn:adobe:tech-note:<number>
9
+ # urn:adobe:publication:<slug>[:v<version>]
10
+ #
11
+ # Examples:
12
+ # urn:adobe:tech-note:5014 → Adobe Technical Note #5014
13
+ # urn:adobe:publication:adobe-glyph-list → adobe-glyph-list
14
+ # urn:adobe:publication:adobe-japan1:v7 → adobe-japan1-7
15
+ class UrnParser < Pubid::UrnParser::Base
16
+ PREFIX = "urn:adobe:".freeze
17
+
18
+ def parse_urn(urn)
19
+ body = strip_namespace(urn)
20
+ parts = split_parts(body)
21
+ namespace = parts.fetch(0)
22
+
23
+ case namespace
24
+ when "tech-note"
25
+ parse_tech_note(parts)
26
+ when "publication"
27
+ parse_publication(parts)
28
+ else
29
+ raise Pubid::UrnParser::Errors::ParseError,
30
+ "Unknown Adobe URN namespace: #{namespace.inspect} in #{urn.inspect}"
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def strip_namespace(urn)
37
+ unless urn.downcase.start_with?(PREFIX)
38
+ raise Pubid::UrnParser::Errors::ParseError,
39
+ "Invalid Adobe URN: #{urn.inspect}"
40
+ end
41
+
42
+ urn[PREFIX.length..]
43
+ end
44
+
45
+ def parse_tech_note(parts)
46
+ number = parts.fetch(1)
47
+ flavor_parse("Adobe Technical Note ##{number}")
48
+ end
49
+
50
+ def parse_publication(parts)
51
+ slug = parts.fetch(1)
52
+ version_seg = parts[2]
53
+ if version_seg&.start_with?("v")
54
+ flavor_parse("#{slug}-#{version_seg.sub(/\Av/, "")}")
55
+ else
56
+ flavor_parse(slug)
57
+ end
58
+ end
59
+
60
+ def split_parts(body)
61
+ body.split(":")
62
+ end
63
+
64
+ def flavor_parse(text)
65
+ ::Pubid::Adobe.parse(text)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Adobe
5
+ extend Pubid::PrefixesSupport
6
+
7
+ # Leading identifier prefix tokens that an Adobe document id can start
8
+ # with. Tech notes appear as both `Adobe Technical Note #<n>` and the
9
+ # short alias `ATN<n>` in citations; both must route to this flavor.
10
+ # Named publications start with `Adobe` (e.g. `Adobe Glyph List`,
11
+ # `Adobe-Japan1-7`).
12
+ PREFIXES = ["Adobe", "ATN"].freeze
13
+
14
+ autoload :Builder, "#{__dir__}/adobe/builder"
15
+ autoload :Identifier, "#{__dir__}/adobe/identifier"
16
+ autoload :Identifiers, "#{__dir__}/adobe/identifiers"
17
+ autoload :Parser, "#{__dir__}/adobe/parser"
18
+ autoload :Renderer, "#{__dir__}/adobe/renderer"
19
+ autoload :UrnGenerator, "#{__dir__}/adobe/urn_generator"
20
+ autoload :UrnParser, "#{__dir__}/adobe/urn_parser"
21
+
22
+ # Parse an Adobe identifier string into an identifier object.
23
+ # @param identifier [String]
24
+ # @return [Pubid::Adobe::Identifier]
25
+ def self.parse(identifier)
26
+ Identifier.parse(identifier)
27
+ end
28
+
29
+ # Per-flavor format registry: inherits global formats, overrides :human
30
+ # with the Adobe-specific renderer.
31
+ Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
32
+ Identifier.format_registry.register(:human, renderer: Adobe::Renderer)
33
+
34
+ # Auto-discover identifier types from the Identifiers namespace.
35
+ # @return [Array<Class>]
36
+ def self.identifier_types
37
+ @identifier_types ||= Identifiers.constants
38
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
39
+ .select { |c| c.is_a?(Class) && c < Pubid::Identifier }
40
+ .reject { |c| c == Identifier }
41
+ end
42
+
43
+ # Lookup: type key → identifier class
44
+ # @param code [String, Symbol]
45
+ # @return [Class, nil]
46
+ def self.locate_type(code)
47
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
48
+ end
49
+
50
+ # Lookup: type short letter (e.g. "ATN") → identifier class
51
+ # @param short [String]
52
+ # @return [Class<Identifier>]
53
+ def self.identifier_klass_for_short(short)
54
+ @by_short ||= identifier_types.to_h { |klass| [klass.type[:short].to_s, klass] }
55
+ @by_short.fetch(short.to_s)
56
+ end
57
+ end
58
+ end
59
+
60
+ Pubid::Registry.register(:adobe, Pubid::Adobe)
@@ -7,7 +7,7 @@ module Pubid
7
7
  class Builder
8
8
  attr_reader :identifier_class
9
9
 
10
- def initialize(identifier_class = Identifiers::Base)
10
+ def initialize(identifier_class = Identifier)
11
11
  @identifier_class = identifier_class
12
12
  end
13
13
 
@@ -46,7 +46,7 @@ module Pubid
46
46
 
47
47
  # Class method to build an identifier from parsed data
48
48
  # @param parsed [Hash, Array] the parsed identifier data
49
- # @return [Identifiers::Base] the constructed identifier object
49
+ # @return [Identifier] the constructed identifier object
50
50
  def self.build(parsed)
51
51
  new.build(parsed)
52
52
  end
@@ -1,6 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Pubid::Amca::Identifier is the AMCA base class (a real Pubid::Identifier
4
- # subclass); its body, `.parse`, and the Identifiers::Base back-compat alias
5
- # live in identifiers/base.rb. This file just ensures it is loaded.
6
- require_relative "identifiers/base"
4
+ # subclass); its body and `.parse` live in identifiers/base.rb. This file just ensures it is loaded.
@@ -3,7 +3,7 @@
3
3
  module Pubid
4
4
  module Amca
5
5
  # Base identifier class for AMCA identifiers. Canonical name
6
- # Pubid::Amca::Identifier (Identifiers::Base is a back-compat alias); common
6
+ # Pubid::Amca::Identifier; common
7
7
  # functionality for all AMCA identifier types.
8
8
  class Identifier < ::Pubid::Identifier
9
9
  # @raise [Parslet::ParseFailed] If parsing fails
@@ -66,10 +66,5 @@ module Pubid
66
66
  end
67
67
  end
68
68
 
69
- module Identifiers
70
- # Backward-compatible alias: AMCA's base class used to be
71
- # Pubid::Amca::Identifiers::Base. It is now Pubid::Amca::Identifier.
72
- Base = Pubid::Amca::Identifier
73
- end
74
69
  end
75
70
  end
@@ -8,7 +8,7 @@ module Pubid
8
8
  # - AMCA 99 JW Interp
9
9
  # - AMCA 204 – 1
10
10
  # - ANSI/AMCA 204 Interp
11
- class Interpretation < Base
11
+ class Interpretation < Identifier
12
12
  attr_reader :interpretation_code
13
13
 
14
14
  def initialize(code:, year: nil, copublisher: nil, suffix: nil,
@@ -8,7 +8,7 @@ module Pubid
8
8
  # - AMCA Publication 211-22 (Rev. 01-23)
9
9
  # - AMCA Publication 311-16
10
10
  # - AMCA Publication 1011-03 (R2010)
11
- class Publication < Base
11
+ class Publication < Identifier
12
12
  attr_reader :revision
13
13
 
14
14
  def initialize(code:, year:, copublisher: nil, suffix: nil,
@@ -8,7 +8,7 @@ module Pubid
8
8
  # - ANSI/AMCA 210-16
9
9
  # - ANSI/AMCA Standard 99-25
10
10
  # - AMCA Standard 803-02 (R2008)
11
- class Standard < Base
11
+ class Standard < Identifier
12
12
  def self.type
13
13
  { key: :standard, title: "Standard", short: nil }
14
14
  end
@@ -3,7 +3,6 @@
3
3
  module Pubid
4
4
  module Amca
5
5
  module Identifiers
6
- autoload :Base, "#{__dir__}/identifiers/base"
7
6
  autoload :Interpretation, "#{__dir__}/identifiers/interpretation"
8
7
  autoload :Publication, "#{__dir__}/identifiers/publication"
9
8
  autoload :Standard, "#{__dir__}/identifiers/standard"
@@ -4,7 +4,7 @@ module Pubid
4
4
  module Amca
5
5
  # Base class for single (non-supplement) ACMA identifiers
6
6
  # Includes: Standard, Publication
7
- class SingleIdentifier < Identifiers::Base
7
+ class SingleIdentifier < Identifier
8
8
  end
9
9
  end
10
10
  end
data/lib/pubid/amca.rb CHANGED
@@ -8,7 +8,7 @@ module Pubid
8
8
  # Pubid::JOINT_PREFIXES.
9
9
  PREFIXES = ["AMCA"].freeze
10
10
 
11
- autoload :Identifier, "#{__dir__}/amca/identifier"
11
+ autoload :Identifier, "#{__dir__}/amca/identifiers/base"
12
12
  autoload :Identifiers, "#{__dir__}/amca/identifiers"
13
13
  autoload :Builder, "#{__dir__}/amca/builder"
14
14
  autoload :Parser, "#{__dir__}/amca/parser"
@@ -26,8 +26,8 @@ module Pubid
26
26
  end
27
27
 
28
28
  # Per-flavor format registry: inherits global formats, overrides :human
29
- Identifiers::Base.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
30
- Identifiers::Base.format_registry.register(:human, renderer: Amca::Renderer)
29
+ Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
30
+ Identifier.format_registry.register(:human, renderer: Amca::Renderer)
31
31
 
32
32
  # Auto-discover all identifier types from the Identifiers namespace
33
33
  # @return [Array<Class>] identifier classes that define a self.type Hash
@@ -7,7 +7,7 @@ module Pubid
7
7
  class Builder
8
8
  attr_reader :identifier_class
9
9
 
10
- def initialize(identifier_class = Identifiers::Base)
10
+ def initialize(identifier_class = Identifier)
11
11
  @identifier_class = identifier_class
12
12
  end
13
13
 
@@ -53,7 +53,7 @@ module Pubid
53
53
 
54
54
  # Class method to build an identifier from parsed data
55
55
  # @param parsed [Hash, Array] the parsed identifier data
56
- # @return [Identifiers::Base] the constructed identifier object
56
+ # @return [Identifier] the constructed identifier object
57
57
  def self.build(parsed)
58
58
  new.build(parsed)
59
59
  end
@@ -158,12 +158,12 @@ module Pubid
158
158
  def build_errata(parsed)
159
159
  base_attrs = extract_base_attributes(parsed)
160
160
  base_class = determine_identifier_class(base_attrs)
161
- base_identifier = base_class.new(**base_attrs)
161
+ base = base_class.new(**base_attrs)
162
162
 
163
163
  errata_date = extract_errata_date(parsed[:errata_date])
164
164
 
165
165
  Identifiers::Errata.new(
166
- base_identifier: base_identifier,
166
+ base: base,
167
167
  errata_date: errata_date,
168
168
  )
169
169
  end
@@ -174,10 +174,10 @@ module Pubid
174
174
  def build_interpretation(parsed)
175
175
  base_attrs = extract_base_attributes(parsed)
176
176
  base_class = determine_identifier_class(base_attrs)
177
- base_identifier = base_class.new(**base_attrs)
177
+ base = base_class.new(**base_attrs)
178
178
 
179
179
  Identifiers::Interpretation.new(
180
- base_identifier: base_identifier,
180
+ base: base,
181
181
  )
182
182
  end
183
183
 
@@ -187,13 +187,13 @@ module Pubid
187
187
  def build_addendum_from_identifier(parsed)
188
188
  base_attrs = extract_base_attributes(parsed)
189
189
  base_class = determine_identifier_class(base_attrs)
190
- base_identifier = base_class.new(**base_attrs)
190
+ base = base_class.new(**base_attrs)
191
191
 
192
192
  addendum_code = extract_value(parsed[:addendum_code])
193
193
  addendum_date = extract_addendum_date(parsed[:addendum_year])
194
194
 
195
195
  Identifiers::Addendum.new(
196
- base_identifier: base_identifier,
196
+ base: base,
197
197
  addendum_code: addendum_code,
198
198
  addendum_date: addendum_date,
199
199
  )
@@ -209,13 +209,13 @@ module Pubid
209
209
  year: extract_value(parsed[:year]),
210
210
  }
211
211
  base_class = determine_identifier_class(base_attrs)
212
- base_identifier = base_class.new(**base_attrs)
212
+ base = base_class.new(**base_attrs)
213
213
 
214
214
  addendum_code = extract_value(parsed[:addendum_code])
215
215
  addendum_date = extract_addendum_date(parsed[:addendum_year])
216
216
 
217
217
  Identifiers::Addendum.new(
218
- base_identifier: base_identifier,
218
+ base: base,
219
219
  addendum_code: addendum_code,
220
220
  addendum_date: addendum_date,
221
221
  )
@@ -232,13 +232,13 @@ module Pubid
232
232
  year: extract_value(parsed[:year]),
233
233
  }
234
234
  base_class = determine_identifier_class(base_attrs)
235
- base_identifier = base_class.new(**base_attrs)
235
+ base = base_class.new(**base_attrs)
236
236
 
237
237
  addendum_code = extract_value(parsed[:addendum_code])
238
238
  addendum_date = extract_addendum_date(parsed[:addendum_year])
239
239
 
240
240
  Identifiers::Addendum.new(
241
- base_identifier: base_identifier,
241
+ base: base,
242
242
  addendum_code: addendum_code,
243
243
  addendum_date: addendum_date,
244
244
  )
@@ -270,13 +270,13 @@ module Pubid
270
270
  end
271
271
 
272
272
  base_class = determine_identifier_class(base_attrs)
273
- base_identifier = base_class.new(**base_attrs)
273
+ base = base_class.new(**base_attrs)
274
274
 
275
275
  addendum_code = extract_value(parsed[:addendum_code])
276
276
  addendum_date = extract_addendum_date(parsed[:addendum_year])
277
277
 
278
278
  Identifiers::Addendum.new(
279
- base_identifier: base_identifier,
279
+ base: base,
280
280
  addendum_code: addendum_code,
281
281
  addendum_date: addendum_date,
282
282
  )
@@ -308,13 +308,13 @@ module Pubid
308
308
  end
309
309
 
310
310
  base_class = determine_identifier_class(base_attrs)
311
- base_identifier = base_class.new(**base_attrs)
311
+ base = base_class.new(**base_attrs)
312
312
 
313
313
  addendum_code = extract_value(parsed[:addendum_code])
314
314
  addendum_date = extract_addendum_date(parsed[:addendum_year])
315
315
 
316
316
  Identifiers::Addendum.new(
317
- base_identifier: base_identifier,
317
+ base: base,
318
318
  addendum_code: addendum_code,
319
319
  addendum_date: addendum_date,
320
320
  )
@@ -326,13 +326,13 @@ module Pubid
326
326
  def build_standard_addendum(parsed)
327
327
  base_attrs = extract_base_attributes(parsed)
328
328
  base_class = determine_identifier_class(base_attrs)
329
- base_identifier = base_class.new(**base_attrs)
329
+ base = base_class.new(**base_attrs)
330
330
 
331
331
  addendum_code = extract_value(parsed[:addendum_code])
332
332
  addendum_date = extract_addendum_date(parsed[:addendum_year])
333
333
 
334
334
  Identifiers::Addendum.new(
335
- base_identifier: base_identifier,
335
+ base: base,
336
336
  addendum_code: addendum_code,
337
337
  addendum_date: addendum_date,
338
338
  )
@@ -372,7 +372,7 @@ module Pubid
372
372
  end
373
373
 
374
374
  base_class = determine_identifier_class(base_attrs)
375
- base_identifier = base_class.new(**base_attrs)
375
+ base = base_class.new(**base_attrs)
376
376
 
377
377
  # Build the addendum_codes string from first code and additional codes
378
378
  first_code = extract_value(parsed[:addendum_code])
@@ -406,7 +406,7 @@ module Pubid
406
406
  end
407
407
 
408
408
  Identifiers::CombinedAddenda.new(
409
- base_identifier: base_identifier,
409
+ base: base,
410
410
  addendum_codes: addendum_codes_str,
411
411
  )
412
412
  end
@@ -417,12 +417,12 @@ module Pubid
417
417
  def build_addenda_package(parsed)
418
418
  base_attrs = extract_base_attributes(parsed)
419
419
  base_class = determine_identifier_class(base_attrs)
420
- base_identifier = base_class.new(**base_attrs)
420
+ base = base_class.new(**base_attrs)
421
421
 
422
422
  package_description = extract_value(parsed[:package_description])
423
423
 
424
424
  Identifiers::AddendaPackage.new(
425
- base_identifier: base_identifier,
425
+ base: base,
426
426
  package_description: package_description,
427
427
  )
428
428
  end
@@ -3,7 +3,6 @@
3
3
  # The ASHRAE flavor base class is Pubid::Ashrae::Identifier — a real
4
4
  # Pubid::Identifier subclass that every concrete ASHRAE identifier descends
5
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"
6
+ # (no facade needed). Its body and `.parse` live in identifiers/base.rb; this
7
+ # file just ensures it is loaded when a consumer references
8
+ # Pubid::Ashrae::Identifier directly.
@@ -28,7 +28,7 @@ module Pubid
28
28
  end
29
29
 
30
30
  def copublisher
31
- base_identifier&.copublisher
31
+ base&.copublisher
32
32
  end
33
33
  end
34
34
  end
@@ -28,7 +28,7 @@ module Pubid
28
28
  end
29
29
 
30
30
  def copublisher
31
- base_identifier&.copublisher
31
+ base&.copublisher
32
32
  end
33
33
  end
34
34
  end
@@ -3,9 +3,7 @@
3
3
  module Pubid
4
4
  module Ashrae
5
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.
6
+ # Pubid::Ashrae::Identifier; every concrete ASHRAE identifier descends from it.
9
7
  class Identifier < ::Pubid::Identifier
10
8
  # Parse an ASHRAE identifier string into an identifier object
11
9
  # @param identifier [String] The ASHRAE identifier string to parse
@@ -26,12 +24,20 @@ module Pubid
26
24
  attribute :amendment, :string
27
25
  attribute :reaffirmed, :string
28
26
  attribute :copublisher, :string
29
- end
30
27
 
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
28
+ # ASHRAE stores the publication year in a plain :string scalar, not a
29
+ # Components::Date, so the base #exclude's :year->:date remap cannot nil
30
+ # it. Reset the scalar directly (mirroring CSA/BIPM) so a year-less
31
+ # partial reference is a year wildcard under
32
+ # matches?(other, ignore: [:year]). super still recurses into the nested
33
+ # `base` of wrapper types (Errata/Addendum/…), which carry no year scalar.
34
+ def exclude(*args)
35
+ result = super
36
+ year_keys = args & %i[year date]
37
+ result.year = nil if !year_keys.empty? && result.respond_to?(:year=)
38
+ result
39
+ end
35
40
  end
41
+
36
42
  end
37
43
  end
@@ -28,7 +28,7 @@ module Pubid
28
28
  end
29
29
 
30
30
  def copublisher
31
- base_identifier&.copublisher
31
+ base&.copublisher
32
32
  end
33
33
  end
34
34
  end
@@ -5,7 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  autoload :AddendaPackage, "#{__dir__}/identifiers/addenda_package"
7
7
  autoload :Addendum, "#{__dir__}/identifiers/addendum"
8
- autoload :Base, "#{__dir__}/identifiers/base"
9
8
  autoload :CombinedAddenda, "#{__dir__}/identifiers/combined_addenda"
10
9
  autoload :Errata, "#{__dir__}/identifiers/errata"
11
10
  autoload :Guideline, "#{__dir__}/identifiers/guideline"
@@ -166,7 +166,7 @@ module Pubid
166
166
  (space >> additional_copublisher).maybe >>
167
167
  suffix.maybe >>
168
168
  reaffirmed.maybe
169
- ).as(:base_identifier) >>
169
+ ).as(:base) >>
170
170
  space >>
171
171
  str("Errata").as(:errata_keyword) >>
172
172
  (
@@ -188,7 +188,7 @@ module Pubid
188
188
  (space >> additional_copublisher).maybe >>
189
189
  suffix.maybe >>
190
190
  reaffirmed.maybe
191
- ).as(:base_identifier) >>
191
+ ).as(:base) >>
192
192
  space >>
193
193
  str("Errata").as(:errata_keyword) >>
194
194
  (
@@ -207,7 +207,7 @@ module Pubid
207
207
  (space >> additional_copublisher).maybe >>
208
208
  suffix.maybe >>
209
209
  reaffirmed.maybe
210
- ).as(:base_identifier) >>
210
+ ).as(:base) >>
211
211
  space >>
212
212
  str("Errata").as(:errata_keyword) >>
213
213
  errata_date.maybe >>
@@ -219,7 +219,7 @@ module Pubid
219
219
  rule(:interpretation_identifier) do
220
220
  str("Interpretations") >> space >>
221
221
  str("for") >> space >>
222
- (type.as(:type) >> space >> code >> (dash >> year_digits.as(:year)).maybe).as(:base_identifier)
222
+ (type.as(:type) >> space >> code >> (dash >> year_digits.as(:year)).maybe).as(:base)
223
223
  end
224
224
 
225
225
  # Combined Addenda pattern (multiple addendums grouped together)
@@ -607,9 +607,12 @@ module Pubid
607
607
  year_first_addenda_package_identifier |
608
608
  addenda_package_identifier |
609
609
  addendum_identifier |
610
- # Standalone copublisher pattern (ANSI/AMCA 210-99, AMCA 210-99)
611
- (((str("ANSI") >> slash).maybe >> letter.repeat(2,
612
- 10)).as(:copublisher) >>
610
+ # Standalone copublisher pattern (ANSI/AMCA 210-99, AMCA 210-99).
611
+ # The literal "ASHRAE" is excluded here so a bare "ASHRAE <code>-<year>"
612
+ # is not swallowed as a copublisher and instead falls through to the
613
+ # ASHRAE-publisher branch below.
614
+ (((str("ANSI") >> slash).maybe >> (str("ASHRAE").absent? >> letter).repeat(2,
615
+ 10)).as(:copublisher) >>
613
616
  space >>
614
617
  code_with_year >>
615
618
  optional_suffix.repeat(0, 2)) |
@@ -635,9 +638,11 @@ module Pubid
635
638
  suffix.maybe >>
636
639
  reaffirmed.maybe >>
637
640
  optional_suffix.repeat(0, 2)) |
638
- # Standard ASHRAE pattern
641
+ # Standard ASHRAE pattern. The type keyword is optional so a bare
642
+ # partial reference "ASHRAE <code>" (no "Standard"/"Guideline") parses;
643
+ # the builder defaults the absent type to "Standard".
639
644
  (publisher.as(:publisher) >> space >>
640
- type.as(:type) >> space >>
645
+ (type.as(:type) >> space).maybe >>
641
646
  code >>
642
647
  (space?.maybe >> dash >> year_digits.as(:year)).maybe >>
643
648
  (space >> additional_copublisher).maybe >>