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,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module W3c
5
+ # Parses W3C URNs back into identifiers by reconstructing the printed form
6
+ # and delegating to the flavor's text parser.
7
+ #
8
+ # UrnGenerator emits `urn:w3c:<type-down>:<code>[:<date>]`. The first body
9
+ # segment is the maturity token only when it is one of the known tokens AND
10
+ # a code segment follows it (a typed URN always has ≥2 segments); a
11
+ # single-segment body is always a bare code — even one that happens to spell
12
+ # a token, e.g. `urn:w3c:rec` -> `W3C rec` (a Standard, not a REC).
13
+ #
14
+ # Examples:
15
+ # - urn:w3c:wd:charmod:19991129 -> W3C WD-charmod-19991129
16
+ # - urn:w3c:note:xml-names -> W3C NOTE-xml-names
17
+ # - urn:w3c:2dcontext -> W3C 2dcontext
18
+ class UrnParser < Pubid::UrnParser::Base
19
+ KNOWN_TOKENS = %w[note dnote wd cr crd rec pr per spsd obsl].freeze
20
+
21
+ def parse_urn(urn)
22
+ parts = split_parts(strip_namespace(urn))
23
+
24
+ if parts.size > 1 && KNOWN_TOKENS.include?(parts.first)
25
+ token = parts.shift.upcase
26
+ text = "W3C #{token}-#{parts.shift}"
27
+ else
28
+ text = "W3C #{parts.shift}"
29
+ end
30
+ text += "-#{parts.shift}" unless parts.empty?
31
+
32
+ flavor_parse(text)
33
+ end
34
+ end
35
+ end
36
+ end
data/lib/pubid/w3c.rb ADDED
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module W3c
5
+ extend Pubid::PrefixesSupport
6
+
7
+ # Sole W3C publisher token (see the parser's `prefix` rule). Document-type
8
+ # tokens (WD/NOTE/REC/…) follow the "W3C " prefix and are excluded.
9
+ PREFIXES = ["W3C"].freeze
10
+
11
+ autoload :Builder, "#{__dir__}/w3c/builder"
12
+ autoload :Identifier, "#{__dir__}/w3c/identifier"
13
+ autoload :Identifiers, "#{__dir__}/w3c/identifiers"
14
+ autoload :Parser, "#{__dir__}/w3c/parser"
15
+ autoload :Renderer, "#{__dir__}/w3c/renderer"
16
+ autoload :UrnGenerator, "#{__dir__}/w3c/urn_generator"
17
+ autoload :UrnParser, "#{__dir__}/w3c/urn_parser"
18
+
19
+ # Parse a W3C identifier string
20
+ def self.parse(identifier)
21
+ Identifier.parse(identifier)
22
+ end
23
+
24
+ # Per-flavor format registry: inherits global formats, overrides :human
25
+ Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
26
+ Identifier.format_registry.register(:human, renderer: W3c::Renderer)
27
+
28
+ # Auto-discover all identifier types from the Identifiers namespace
29
+ # @return [Array<Class>] identifier classes that define a self.type Hash
30
+ def self.identifier_types
31
+ @identifier_types ||= Identifiers.constants
32
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
33
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
34
+ .select { |c| c.type.is_a?(Hash) }
35
+ end
36
+
37
+ # Build typed stage index from identifier types
38
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
39
+ def self.all_typed_stages
40
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
41
+ if klass.const_defined?(:TYPED_STAGES)
42
+ klass.const_get(:TYPED_STAGES)
43
+ else
44
+ []
45
+ end
46
+ end
47
+ end
48
+
49
+ # Lookup: type code -> identifier class
50
+ # @param code [String, Symbol] the type key to find
51
+ # @return [Class, nil] the matching identifier class
52
+ def self.locate_type(code)
53
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
54
+ end
55
+
56
+ # Lookup: abbreviation -> typed stage
57
+ # @param abbr [String, Symbol] the abbreviation to find
58
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
59
+ def self.locate_stage(abbr)
60
+ abbr_str = abbr.to_s.upcase
61
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
62
+ end
63
+ end
64
+ end
65
+
66
+ # Register W3C flavor with the registry
67
+ Pubid::Registry.register(:w3c, Pubid::W3c)
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Xsf
5
+ # Builds an identifier object from the Parslet parse tree. XSF has a single
6
+ # concrete type, so the builder always produces an Identifiers::Xep.
7
+ class Builder
8
+ def self.build(parsed_data)
9
+ new.build(parsed_data)
10
+ end
11
+
12
+ def build(data)
13
+ Identifiers::Xep.new(number: data[:number].to_s)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Xsf
5
+ # Base class for every XSF identifier AND the flavor's parse/create entry
6
+ # point — mirrors Pubid::Jis::Identifier. The single concrete type
7
+ # (Pubid::Xsf::Identifiers::Xep) descends from this class, so a parsed XSF
8
+ # id is an instance of Pubid::Xsf::Identifier.
9
+ class Identifier < ::Pubid::Identifier
10
+ # XEP number kept as a string to preserve the 4-digit zero padding
11
+ # ("0001", not 1). No default → it is dropped from the serialized hash
12
+ # only when nil, and always present for a real identifier.
13
+ attribute :number, :string
14
+
15
+ # Polymorphic type map for lutaml::Model key_value (de)serialization:
16
+ # maps each subclass's polymorphic_name to its class name so a stored
17
+ # hash rebuilds the correct identifier type via from_hash.
18
+ XSF_TYPE_MAP = {
19
+ "pubid:xsf:xep" => "Pubid::Xsf::Identifiers::Xep",
20
+ }.freeze
21
+
22
+ key_value do
23
+ map "_type", to: :_type, polymorphic_map: XSF_TYPE_MAP
24
+ map "number", to: :number
25
+ end
26
+
27
+ # Publisher name. A plain constant (not a `publisher` method) so it does
28
+ # not shadow the inherited lutaml `publisher` attribute, which would
29
+ # otherwise fail serialization type validation. XSF never prints its
30
+ # publisher name in an identifier — the leading token is "XEP".
31
+ PUBLISHER = "XSF"
32
+
33
+ attr_reader :with_publisher
34
+
35
+ # Basic string representation. Delegates to renderer; `with_publisher:
36
+ # false` yields the bare number.
37
+ def to_s(with_publisher: true, **opts)
38
+ @with_publisher = with_publisher
39
+ render(format: :human, **opts)
40
+ end
41
+
42
+ # from_hash is the shared polymorphic dispatch on Pubid::Identifier;
43
+ # XSF_TYPE_MAP remains as the key_value polymorphic_map.
44
+
45
+ # Parse an XSF identifier string into an identifier object
46
+ # @param identifier [String] The XSF identifier string to parse
47
+ # @return [Identifier] The appropriate identifier object
48
+ # @raise [ArgumentError] If the input exceeds the maximum length
49
+ # @raise [RuntimeError] If parsing fails
50
+ def self.parse(identifier)
51
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
52
+ raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
53
+ end
54
+
55
+ parsed = Parser.parse(identifier)
56
+ Builder.build(parsed)
57
+ rescue Parslet::ParseFailed => e
58
+ raise "Failed to parse XSF identifier '#{identifier}': #{e.message}"
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Xsf
5
+ module Identifiers
6
+ # XMPP Extension Protocol — the sole XSF identifier type.
7
+ # Format: "XEP NNNN" (e.g. XEP 0001, XEP 0218).
8
+ #
9
+ # `polymorphic_name` auto-derives "pubid:xsf:xep" from the class name,
10
+ # which is what serializes into the `_type` tag and drives from_hash
11
+ # dispatch (see XSF_TYPE_MAP on the base Identifier).
12
+ class Xep < Identifier
13
+ TYPED_STAGES = [
14
+ Pubid::Components::TypedStage.new(
15
+ code: :xep,
16
+ stage_code: :published,
17
+ type_code: :xep,
18
+ abbr: ["XEP"],
19
+ name: "XMPP Extension Protocol",
20
+ harmonized_stages: [],
21
+ ),
22
+ ].freeze
23
+
24
+ def self.type
25
+ { key: :xep,
26
+ web: :xep, title: "XMPP Extension Protocol", short: "XEP" }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Xsf
5
+ module Identifiers
6
+ autoload :Xep, "#{__dir__}/identifiers/xep"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Xsf
7
+ # Parslet grammar for XSF identifiers. One fixed shape: "XEP NNNN".
8
+ class Parser < Parslet::Parser
9
+ rule(:digit) { match["0-9"] }
10
+ rule(:digits) { digit.repeat(1) }
11
+
12
+ # "XEP 0001" — publisher token, a single space, then the number kept as
13
+ # a string of digits (leading zeros preserved by the builder).
14
+ rule(:identifier) do
15
+ str("XEP") >> str(" ") >> digits.as(:number)
16
+ end
17
+
18
+ rule(:root) { identifier }
19
+
20
+ def self.parse(input)
21
+ new.parse(input)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Xsf
5
+ # Human-readable renderer for XSF identifiers.
6
+ #
7
+ # Produces strings like "XEP 0001". With `with_publisher: false` it emits
8
+ # just the bare number ("0001").
9
+ #
10
+ # Registered as the `:human` format in the XSF format registry and invoked
11
+ # via `render(format: :human)`.
12
+ class Renderer < ::Pubid::Renderers::Base
13
+ PUBLISHER = "XEP"
14
+
15
+ def render(context: nil, **opts)
16
+ id = @id
17
+ return id.number.to_s if id.with_publisher == false
18
+
19
+ "#{PUBLISHER} #{id.number}"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Xsf
5
+ # Emits `urn:xsf:xep:<number>` (e.g. urn:xsf:xep:0001). The number keeps its
6
+ # zero padding so the URN round-trips back to the printed identifier.
7
+ class UrnGenerator < Pubid::UrnGenerator::Base
8
+ def generate
9
+ ["urn", "xsf", "xep", identifier.number.to_s].join(":")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Xsf
5
+ # Parses XSF URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits: `urn:xsf:xep:<number>` (e.g. urn:xsf:xep:0001).
8
+ # This inverts it by reconstructing the printed "XEP <number>" string and
9
+ # delegating to the flavor's text parser.
10
+ class UrnParser < Pubid::UrnParser::Base
11
+ def parse_urn(urn)
12
+ body = strip_namespace(urn)
13
+ _type, number = split_parts(body)
14
+ flavor_parse("XEP #{number}")
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/pubid/xsf.rb ADDED
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ # XSF (XMPP Standards Foundation) flavor. Its documents are XEPs — XMPP
5
+ # Extension Protocols — printed as "XEP NNNN" with a 4-digit zero-padded
6
+ # number (e.g. "XEP 0001"). The simplest full flavor: a single identifier
7
+ # type, one string attribute.
8
+ module Xsf
9
+ extend Pubid::PrefixesSupport
10
+
11
+ # Sole leading token an XSF identifier can start with (see the parser's
12
+ # `str("XEP")`). "XSF" is the publisher name but never appears in a printed
13
+ # identifier, so it is not a prefix.
14
+ PREFIXES = ["XEP"].freeze
15
+
16
+ autoload :Builder, "#{__dir__}/xsf/builder"
17
+ autoload :Identifier, "#{__dir__}/xsf/identifier"
18
+ autoload :Identifiers, "#{__dir__}/xsf/identifiers"
19
+ autoload :Parser, "#{__dir__}/xsf/parser"
20
+ autoload :Renderer, "#{__dir__}/xsf/renderer"
21
+ autoload :UrnGenerator, "#{__dir__}/xsf/urn_generator"
22
+ autoload :UrnParser, "#{__dir__}/xsf/urn_parser"
23
+
24
+ # Parse an XSF identifier string
25
+ def self.parse(identifier)
26
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
27
+ raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
28
+ end
29
+
30
+ Identifier.parse(identifier)
31
+ end
32
+
33
+ # Per-flavor format registry: inherits global formats, overrides :human
34
+ Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
35
+ Identifier.format_registry.register(:human, renderer: Xsf::Renderer)
36
+
37
+ # Auto-discover all identifier types from the Identifiers namespace
38
+ # @return [Array<Class>] identifier classes that define a self.type Hash
39
+ def self.identifier_types
40
+ @identifier_types ||= Identifiers.constants
41
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
42
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
43
+ .select { |c| c.type.is_a?(Hash) }
44
+ end
45
+
46
+ # Build typed stage index from identifier types
47
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
48
+ def self.all_typed_stages
49
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
50
+ if klass.const_defined?(:TYPED_STAGES)
51
+ klass.const_get(:TYPED_STAGES)
52
+ else
53
+ []
54
+ end
55
+ end
56
+ end
57
+
58
+ # Lookup: type code -> identifier class
59
+ # @param code [String, Symbol] the type key to find
60
+ # @return [Class, nil] the matching identifier class
61
+ def self.locate_type(code)
62
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
63
+ end
64
+
65
+ # Lookup: abbreviation -> typed stage
66
+ # @param abbr [String, Symbol] the abbreviation to find
67
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
68
+ def self.locate_stage(abbr)
69
+ abbr_str = abbr.to_s.upcase
70
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
71
+ end
72
+ end
73
+ end
74
+
75
+ # Register XSF flavor with the registry
76
+ Pubid::Registry.register(:xsf, Pubid::Xsf)
data/lib/pubid.rb CHANGED
@@ -97,35 +97,54 @@ module Pubid
97
97
  autoload :Utils, "pubid/utils"
98
98
  autoload :Version, "pubid/version"
99
99
  autoload :Core, "pubid/core"
100
+ autoload :TypeResolver, "pubid/type_resolver"
100
101
 
101
102
 
102
103
  # Require all flavor modules
104
+ autoload :Adobe, "pubid/adobe"
103
105
  autoload :Amca, "pubid/amca"
104
106
  autoload :Ansi, "pubid/ansi"
105
107
  autoload :Api, "pubid/api"
106
108
  autoload :Ashrae, "pubid/ashrae"
107
109
  autoload :Asme, "pubid/asme"
110
+ autoload :Doi, "pubid/doi"
111
+ autoload :Easc, "pubid/easc"
108
112
  autoload :Astm, "pubid/astm"
113
+ autoload :Bipm, "pubid/bipm"
109
114
  autoload :Bsi, "pubid/bsi"
115
+ autoload :Calconnect, "pubid/calconnect"
110
116
  autoload :Ccsds, "pubid/ccsds"
111
117
  autoload :CenCenelec, "pubid/cen_cenelec"
112
118
  autoload :Cie, "pubid/cie"
113
119
  autoload :Csa, "pubid/csa"
120
+ autoload :Ecma, "pubid/ecma"
114
121
  autoload :Etsi, "pubid/etsi"
122
+ autoload :Gost, "pubid/gost"
123
+ autoload :Gb, "pubid/gb"
115
124
  autoload :Idf, "pubid/idf"
116
125
  autoload :Iec, "pubid/iec"
117
126
  autoload :Ieee, "pubid/ieee"
127
+ autoload :Ietf, "pubid/ietf"
128
+ autoload :Isbn, "pubid/isbn"
118
129
  autoload :Iala, "pubid/iala"
130
+ autoload :Iana, "pubid/iana"
119
131
  autoload :Iho, "pubid/iho"
120
132
  autoload :Iso, "pubid/iso"
121
133
  autoload :Itu, "pubid/itu"
122
134
  autoload :Jcgm, "pubid/jcgm"
123
135
  autoload :Jis, "pubid/jis"
124
136
  autoload :Nist, "pubid/nist"
137
+ autoload :Oasis, "pubid/oasis"
138
+ autoload :Ogc, "pubid/ogc"
125
139
  autoload :Oiml, "pubid/oiml"
140
+ autoload :Omg, "pubid/omg"
126
141
  autoload :Plateau, "pubid/plateau"
127
142
  autoload :Export, "pubid/export"
128
143
  autoload :Sae, "pubid/sae"
144
+ autoload :Tgpp, "pubid/tgpp"
145
+ autoload :Un, "pubid/un"
146
+ autoload :Xsf, "pubid/xsf"
147
+ autoload :W3c, "pubid/w3c"
129
148
 
130
149
  # Format infrastructure (loaded eagerly so Pubid::Renderers / Pubid::Parsers are always available)
131
150
  require "pubid/renderers/base"
@@ -181,11 +200,16 @@ module Pubid
181
200
  # Trigger autoloads for every declared flavor module so that
182
201
  # Registry is populated before URN dispatch needs it. Safe to call
183
202
  # repeatedly; no-op after the first invocation.
203
+ #
204
+ # The constant filter allows a digit inside the name (the +0-9+ in the regex)
205
+ # so digit-bearing flavor modules such as +W3c+ are loaded/registered too —
206
+ # without it +W3c+ is silently dropped from the registry enumeration and thus
207
+ # from every registry-driven cross-flavor spec.
184
208
  def self.eager_load_flavors!
185
209
  return if @flavors_loaded
186
210
 
187
211
  constants.each do |c|
188
- next unless c.to_s.match?(/\A[A-Z][a-zA-Z]+\z/)
212
+ next unless c.to_s.match?(/\A[A-Z][a-zA-Z0-9]+\z/)
189
213
 
190
214
  begin
191
215
  const_get(c)