pubid 2.0.0.pre.alpha.8 → 2.0.0.pre.alpha.11

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 (672) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +33 -11
  3. data/conformance/pending.yaml +4 -0
  4. data/data/bipm/update_codes.yaml +9 -0
  5. data/data/iec/update_codes.yaml +3 -0
  6. data/data/ieee/update_codes.yaml +107 -1
  7. data/{archived-gems/pubid-nist → data/nist}/series.yaml +34 -0
  8. data/data/nist/update_codes.yaml +8 -0
  9. data/lib/pubid/adobe/builder.rb +52 -0
  10. data/lib/pubid/adobe/identifier.rb +47 -0
  11. data/lib/pubid/adobe/identifiers/publication.rb +31 -0
  12. data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
  13. data/lib/pubid/adobe/identifiers.rb +10 -0
  14. data/lib/pubid/adobe/parser.rb +136 -0
  15. data/lib/pubid/adobe/renderer.rb +39 -0
  16. data/lib/pubid/adobe/urn_generator.rb +42 -0
  17. data/lib/pubid/adobe/urn_parser.rb +69 -0
  18. data/lib/pubid/adobe.rb +61 -0
  19. data/lib/pubid/amca/builder.rb +4 -4
  20. data/lib/pubid/amca/identifier.rb +1 -3
  21. data/lib/pubid/amca/identifiers/base.rb +50 -33
  22. data/lib/pubid/amca/identifiers/interpretation.rb +18 -10
  23. data/lib/pubid/amca/identifiers/publication.rb +14 -10
  24. data/lib/pubid/amca/identifiers/standard.rb +3 -1
  25. data/lib/pubid/amca/identifiers.rb +0 -1
  26. data/lib/pubid/amca/parser.rb +1 -1
  27. data/lib/pubid/amca/renderer.rb +4 -4
  28. data/lib/pubid/amca/single_identifier.rb +1 -1
  29. data/lib/pubid/amca/urn_generator.rb +2 -2
  30. data/lib/pubid/amca.rb +5 -4
  31. data/lib/pubid/ansi/builder.rb +2 -2
  32. data/lib/pubid/ansi/identifier.rb +18 -0
  33. data/lib/pubid/ansi/parser.rb +1 -1
  34. data/lib/pubid/ansi/renderer.rb +2 -2
  35. data/lib/pubid/ansi.rb +5 -5
  36. data/lib/pubid/api/builder.rb +16 -2
  37. data/lib/pubid/api/identifier.rb +25 -4
  38. data/lib/pubid/api/identifiers/mpms.rb +10 -8
  39. data/lib/pubid/api/parser.rb +1 -1
  40. data/lib/pubid/api/renderer.rb +16 -7
  41. data/lib/pubid/api/single_identifier.rb +5 -12
  42. data/lib/pubid/api.rb +1 -0
  43. data/lib/pubid/ashrae/builder.rb +53 -32
  44. data/lib/pubid/ashrae/identifier.rb +3 -4
  45. data/lib/pubid/ashrae/identifiers/addenda_package.rb +7 -1
  46. data/lib/pubid/ashrae/identifiers/addendum.rb +9 -1
  47. data/lib/pubid/ashrae/identifiers/base.rb +94 -12
  48. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +8 -1
  49. data/lib/pubid/ashrae/identifiers/errata.rb +9 -0
  50. data/lib/pubid/ashrae/identifiers/guideline.rb +3 -0
  51. data/lib/pubid/ashrae/identifiers/interpretation.rb +16 -0
  52. data/lib/pubid/ashrae/identifiers/standard.rb +3 -0
  53. data/lib/pubid/ashrae/identifiers.rb +0 -1
  54. data/lib/pubid/ashrae/parser.rb +37 -17
  55. data/lib/pubid/ashrae/renderer.rb +20 -20
  56. data/lib/pubid/ashrae/single_identifier.rb +1 -1
  57. data/lib/pubid/ashrae/supplement_identifier.rb +21 -6
  58. data/lib/pubid/ashrae/urn_generator.rb +8 -2
  59. data/lib/pubid/ashrae.rb +10 -4
  60. data/lib/pubid/asme/builder.rb +11 -2
  61. data/lib/pubid/asme/identifier.rb +9 -0
  62. data/lib/pubid/asme/identifiers/standard.rb +86 -2
  63. data/lib/pubid/asme/parser.rb +1 -1
  64. data/lib/pubid/asme/renderer.rb +3 -3
  65. data/lib/pubid/asme/single_identifier.rb +8 -1
  66. data/lib/pubid/asme/urn_generator.rb +2 -2
  67. data/lib/pubid/asme.rb +1 -0
  68. data/lib/pubid/astm/builder.rb +10 -3
  69. data/lib/pubid/astm/identifier.rb +9 -0
  70. data/lib/pubid/astm/identifiers/adjunct.rb +16 -1
  71. data/lib/pubid/astm/identifiers/code_number.rb +81 -0
  72. data/lib/pubid/astm/identifiers/data_series.rb +2 -0
  73. data/lib/pubid/astm/identifiers/iso_dual_published.rb +16 -0
  74. data/lib/pubid/astm/identifiers/manual.rb +10 -0
  75. data/lib/pubid/astm/identifiers/monograph.rb +2 -0
  76. data/lib/pubid/astm/identifiers/research_report.rb +10 -0
  77. data/lib/pubid/astm/identifiers/standard.rb +10 -0
  78. data/lib/pubid/astm/identifiers/technical_report.rb +2 -0
  79. data/lib/pubid/astm/identifiers/work_in_progress.rb +2 -0
  80. data/lib/pubid/astm/identifiers.rb +1 -0
  81. data/lib/pubid/astm/parser.rb +1 -1
  82. data/lib/pubid/astm/renderer.rb +1 -1
  83. data/lib/pubid/astm/single_identifier.rb +31 -1
  84. data/lib/pubid/astm/urn_generator.rb +7 -5
  85. data/lib/pubid/astm.rb +1 -0
  86. data/lib/pubid/bipm/builder.rb +163 -0
  87. data/lib/pubid/bipm/identifier.rb +285 -0
  88. data/lib/pubid/bipm/identifiers/committee_document.rb +36 -0
  89. data/lib/pubid/bipm/identifiers/guide.rb +35 -0
  90. data/lib/pubid/bipm/identifiers/meeting.rb +53 -0
  91. data/lib/pubid/bipm/identifiers/mep.rb +33 -0
  92. data/lib/pubid/bipm/identifiers/metrologia_article.rb +48 -0
  93. data/lib/pubid/bipm/identifiers/si_brochure.rb +33 -0
  94. data/lib/pubid/bipm/identifiers.rb +15 -0
  95. data/lib/pubid/bipm/parser.rb +237 -0
  96. data/lib/pubid/bipm/renderer.rb +118 -0
  97. data/lib/pubid/bipm/urn_generator.rb +58 -0
  98. data/lib/pubid/bipm/urn_parser.rb +60 -0
  99. data/lib/pubid/bipm.rb +92 -0
  100. data/lib/pubid/bsi/builder.rb +62 -52
  101. data/lib/pubid/bsi/identifier.rb +0 -1
  102. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
  103. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +36 -7
  104. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +7 -6
  105. data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
  106. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +0 -1
  107. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +10 -0
  108. data/lib/pubid/bsi/identifiers/committee_document.rb +10 -1
  109. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +6 -0
  110. data/lib/pubid/bsi/identifiers/corrigendum.rb +4 -4
  111. data/lib/pubid/bsi/identifiers/expert_commentary.rb +5 -5
  112. data/lib/pubid/bsi/identifiers/handbook.rb +0 -2
  113. data/lib/pubid/bsi/identifiers/practice_guide.rb +0 -1
  114. data/lib/pubid/bsi/identifiers/set.rb +11 -0
  115. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -1
  116. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -2
  117. data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
  118. data/lib/pubid/bsi/parser.rb +1 -1
  119. data/lib/pubid/bsi/renderer.rb +71 -59
  120. data/lib/pubid/bsi/single_identifier.rb +64 -7
  121. data/lib/pubid/bsi/urn_generator.rb +11 -2
  122. data/lib/pubid/bsi.rb +7 -1
  123. data/lib/pubid/builder/base.rb +23 -11
  124. data/lib/pubid/bundled_identifier.rb +19 -9
  125. data/lib/pubid/calconnect/builder.rb +38 -0
  126. data/lib/pubid/calconnect/identifier.rb +121 -0
  127. data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
  128. data/lib/pubid/calconnect/identifiers.rb +9 -0
  129. data/lib/pubid/calconnect/parser.rb +54 -0
  130. data/lib/pubid/calconnect/renderer.rb +36 -0
  131. data/lib/pubid/calconnect/urn_generator.rb +33 -0
  132. data/lib/pubid/calconnect/urn_parser.rb +34 -0
  133. data/lib/pubid/calconnect.rb +83 -0
  134. data/lib/pubid/ccsds/builder.rb +1 -1
  135. data/lib/pubid/ccsds/identifier.rb +10 -3
  136. data/lib/pubid/ccsds/identifiers/base.rb +4 -2
  137. data/lib/pubid/ccsds/identifiers/corrigendum.rb +4 -4
  138. data/lib/pubid/ccsds/parser.rb +1 -1
  139. data/lib/pubid/ccsds/single_identifier.rb +2 -2
  140. data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
  141. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  142. data/lib/pubid/ccsds.rb +1 -0
  143. data/lib/pubid/cen_cenelec/builder.rb +131 -72
  144. data/lib/pubid/cen_cenelec/identifier.rb +115 -3
  145. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +27 -16
  146. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +46 -6
  147. data/lib/pubid/cen_cenelec/identifiers/base.rb +8 -9
  148. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -1
  149. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -1
  150. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +1 -1
  151. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +29 -14
  152. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +47 -8
  153. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
  154. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +27 -2
  155. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -1
  156. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +15 -5
  157. data/lib/pubid/cen_cenelec/identifiers/guide.rb +1 -1
  158. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -1
  159. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -1
  160. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -1
  161. data/lib/pubid/cen_cenelec/parser.rb +1 -1
  162. data/lib/pubid/cen_cenelec/renderer.rb +55 -60
  163. data/lib/pubid/cen_cenelec/single_identifier.rb +20 -2
  164. data/lib/pubid/cen_cenelec/urn_generator.rb +66 -44
  165. data/lib/pubid/cen_cenelec.rb +104 -82
  166. data/lib/pubid/cie/builder.rb +149 -24
  167. data/lib/pubid/cie/identifier.rb +13 -4
  168. data/lib/pubid/cie/identifiers/bundle.rb +35 -5
  169. data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
  170. data/lib/pubid/cie/identifiers/conference.rb +11 -6
  171. data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
  172. data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
  173. data/lib/pubid/cie/identifiers/identical.rb +9 -9
  174. data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
  175. data/lib/pubid/cie/identifiers/proceedings.rb +41 -0
  176. data/lib/pubid/cie/identifiers/standard.rb +43 -8
  177. data/lib/pubid/cie/identifiers/supplement.rb +27 -25
  178. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +7 -3
  179. data/lib/pubid/cie/identifiers.rb +2 -0
  180. data/lib/pubid/cie/parser.rb +55 -6
  181. data/lib/pubid/cie/single_identifier.rb +40 -1
  182. data/lib/pubid/cie/supplement_identifier.rb +29 -16
  183. data/lib/pubid/cie/urn_generator.rb +11 -8
  184. data/lib/pubid/cie.rb +7 -2
  185. data/lib/pubid/components/date.rb +21 -5
  186. data/lib/pubid/conformance/checks.rb +72 -0
  187. data/lib/pubid/conformance/corpus/case.rb +55 -0
  188. data/lib/pubid/conformance/corpus.rb +36 -0
  189. data/lib/pubid/conformance/generator.rb +212 -0
  190. data/lib/pubid/conformance/pending.rb +63 -0
  191. data/lib/pubid/conformance/runner.rb +153 -0
  192. data/lib/pubid/conformance.rb +55 -0
  193. data/lib/pubid/core.rb +2 -0
  194. data/lib/pubid/csa/builder.rb +48 -48
  195. data/lib/pubid/csa/composite_identifier.rb +18 -7
  196. data/lib/pubid/csa/identifier.rb +187 -80
  197. data/lib/pubid/csa/identifiers/bundled.rb +25 -9
  198. data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
  199. data/lib/pubid/csa/identifiers/cec.rb +44 -4
  200. data/lib/pubid/csa/identifiers/combined.rb +97 -69
  201. data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
  202. data/lib/pubid/csa/identifiers/package.rb +4 -4
  203. data/lib/pubid/csa/parser.rb +12 -8
  204. data/lib/pubid/csa/renderer.rb +13 -5
  205. data/lib/pubid/csa/single_identifier.rb +93 -4
  206. data/lib/pubid/csa/urn_generator.rb +9 -2
  207. data/lib/pubid/csa/wrapper_identifier.rb +43 -10
  208. data/lib/pubid/csa.rb +7 -1
  209. data/lib/pubid/doi/builder.rb +18 -0
  210. data/lib/pubid/doi/identifier.rb +49 -0
  211. data/lib/pubid/doi/identifiers/resource.rb +30 -0
  212. data/lib/pubid/doi/identifiers.rb +9 -0
  213. data/lib/pubid/doi/parser.rb +52 -0
  214. data/lib/pubid/doi/renderer.rb +13 -0
  215. data/lib/pubid/doi.rb +56 -0
  216. data/lib/pubid/easc/builder.rb +55 -0
  217. data/lib/pubid/easc/identifier.rb +59 -0
  218. data/lib/pubid/easc/identifiers/pmg.rb +20 -0
  219. data/lib/pubid/easc/identifiers/rmg.rb +19 -0
  220. data/lib/pubid/easc/identifiers.rb +10 -0
  221. data/lib/pubid/easc/parser.rb +88 -0
  222. data/lib/pubid/easc/renderer.rb +48 -0
  223. data/lib/pubid/easc/urn_generator.rb +46 -0
  224. data/lib/pubid/easc/urn_parser.rb +57 -0
  225. data/lib/pubid/easc.rb +53 -0
  226. data/lib/pubid/ecma/builder.rb +45 -0
  227. data/lib/pubid/ecma/identifier.rb +147 -0
  228. data/lib/pubid/ecma/identifiers/memento.rb +30 -0
  229. data/lib/pubid/ecma/identifiers/standard.rb +31 -0
  230. data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
  231. data/lib/pubid/ecma/identifiers.rb +11 -0
  232. data/lib/pubid/ecma/parser.rb +76 -0
  233. data/lib/pubid/ecma/renderer.rb +67 -0
  234. data/lib/pubid/ecma/urn_generator.rb +46 -0
  235. data/lib/pubid/ecma/urn_parser.rb +51 -0
  236. data/lib/pubid/ecma.rb +68 -0
  237. data/lib/pubid/errors.rb +80 -0
  238. data/lib/pubid/etsi/builder.rb +13 -4
  239. data/lib/pubid/etsi/identifier.rb +1 -3
  240. data/lib/pubid/etsi/identifiers/base.rb +43 -11
  241. data/lib/pubid/etsi/identifiers/etsi_standard.rb +207 -4
  242. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +45 -3
  243. data/lib/pubid/etsi/identifiers.rb +0 -1
  244. data/lib/pubid/etsi/parser.rb +9 -3
  245. data/lib/pubid/etsi/renderer.rb +8 -2
  246. data/lib/pubid/etsi.rb +6 -5
  247. data/lib/pubid/evs/builder.rb +26 -0
  248. data/lib/pubid/evs/identifier.rb +37 -0
  249. data/lib/pubid/evs/identifiers/national_adoption.rb +17 -0
  250. data/lib/pubid/evs/identifiers.rb +9 -0
  251. data/lib/pubid/evs/parser.rb +27 -0
  252. data/lib/pubid/evs/renderer.rb +30 -0
  253. data/lib/pubid/evs/urn_generator.rb +30 -0
  254. data/lib/pubid/evs/urn_parser.rb +80 -0
  255. data/lib/pubid/evs.rb +90 -0
  256. data/lib/pubid/export/exporter.rb +2 -1
  257. data/lib/pubid/export/flavor_exporter.rb +18 -3
  258. data/lib/pubid/export.rb +1 -0
  259. data/lib/pubid/format_detector.rb +1 -0
  260. data/lib/pubid/gb/builder.rb +45 -0
  261. data/lib/pubid/gb/identifier.rb +67 -0
  262. data/lib/pubid/gb/identifiers/standard.rb +34 -0
  263. data/lib/pubid/gb/identifiers.rb +9 -0
  264. data/lib/pubid/gb/parser.rb +63 -0
  265. data/lib/pubid/gb/renderer.rb +35 -0
  266. data/lib/pubid/gb.rb +88 -0
  267. data/lib/pubid/gost/builder.rb +185 -0
  268. data/lib/pubid/gost/identifier.rb +47 -0
  269. data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
  270. data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
  271. data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
  272. data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
  273. data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
  274. data/lib/pubid/gost/identifiers.rb +13 -0
  275. data/lib/pubid/gost/parser.rb +105 -0
  276. data/lib/pubid/gost/renderer.rb +48 -0
  277. data/lib/pubid/gost/urn_generator.rb +46 -0
  278. data/lib/pubid/gost/urn_parser.rb +52 -0
  279. data/lib/pubid/gost.rb +50 -0
  280. data/lib/pubid/iala/builder.rb +22 -27
  281. data/lib/pubid/iala/identifier.rb +36 -8
  282. data/lib/pubid/iala/identifiers/advice.rb +1 -1
  283. data/lib/pubid/iala/identifiers/annex.rb +10 -10
  284. data/lib/pubid/iala/identifiers/general_assembly.rb +5 -2
  285. data/lib/pubid/iala/identifiers/guideline.rb +3 -1
  286. data/lib/pubid/iala/identifiers/letter.rb +1 -1
  287. data/lib/pubid/iala/identifiers/manual.rb +3 -1
  288. data/lib/pubid/iala/identifiers/model_course.rb +3 -1
  289. data/lib/pubid/iala/identifiers/recommendation.rb +3 -1
  290. data/lib/pubid/iala/identifiers/report.rb +1 -1
  291. data/lib/pubid/iala/identifiers/resolution.rb +1 -1
  292. data/lib/pubid/iala/identifiers/standard.rb +3 -1
  293. data/lib/pubid/iala/identifiers.rb +0 -1
  294. data/lib/pubid/iala/parser.rb +10 -2
  295. data/lib/pubid/iala/renderer.rb +1 -1
  296. data/lib/pubid/iala/urn_generator.rb +1 -1
  297. data/lib/pubid/iala/urn_parser.rb +24 -3
  298. data/lib/pubid/iala.rb +5 -4
  299. data/lib/pubid/iana/builder.rb +22 -0
  300. data/lib/pubid/iana/identifier.rb +140 -0
  301. data/lib/pubid/iana/identifiers/registry.rb +69 -0
  302. data/lib/pubid/iana/identifiers.rb +9 -0
  303. data/lib/pubid/iana/parser.rb +38 -0
  304. data/lib/pubid/iana/renderer.rb +32 -0
  305. data/lib/pubid/iana/urn_generator.rb +19 -0
  306. data/lib/pubid/iana/urn_parser.rb +24 -0
  307. data/lib/pubid/iana.rb +70 -0
  308. data/lib/pubid/identifier.rb +797 -26
  309. data/lib/pubid/identifier_metadata.rb +1 -0
  310. data/lib/pubid/idf/builder.rb +4 -4
  311. data/lib/pubid/idf/identifier.rb +18 -9
  312. data/lib/pubid/idf/parser.rb +3 -3
  313. data/lib/pubid/idf/renderer.rb +5 -5
  314. data/lib/pubid/idf/supplement_identifier.rb +3 -3
  315. data/lib/pubid/idf/urn_generator.rb +1 -1
  316. data/lib/pubid/idf.rb +7 -1
  317. data/lib/pubid/iec/builder.rb +49 -32
  318. data/lib/pubid/iec/components.rb +0 -1
  319. data/lib/pubid/iec/identifier.rb +112 -77
  320. data/lib/pubid/iec/identifiers/amendment.rb +6 -2
  321. data/lib/pubid/iec/identifiers/base.rb +2 -2
  322. data/lib/pubid/iec/identifiers/component_specification.rb +0 -10
  323. data/lib/pubid/iec/identifiers/conformity_assessment.rb +0 -10
  324. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
  325. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -2
  326. data/lib/pubid/iec/identifiers/fragment_identifier.rb +13 -15
  327. data/lib/pubid/iec/identifiers/guide.rb +0 -16
  328. data/lib/pubid/iec/identifiers/international_standard.rb +22 -6
  329. data/lib/pubid/iec/identifiers/operational_document.rb +0 -10
  330. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +0 -12
  331. data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
  332. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +0 -10
  333. data/lib/pubid/iec/identifiers/systems_reference_document.rb +0 -10
  334. data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
  335. data/lib/pubid/iec/identifiers/technical_report.rb +1 -18
  336. data/lib/pubid/iec/identifiers/technical_specification.rb +1 -18
  337. data/lib/pubid/iec/identifiers/technology_report.rb +0 -10
  338. data/lib/pubid/iec/identifiers/test_report_form.rb +0 -11
  339. data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
  340. data/lib/pubid/iec/identifiers/white_paper.rb +0 -10
  341. data/lib/pubid/iec/identifiers/working_document.rb +24 -10
  342. data/lib/pubid/iec/identifiers.rb +1 -0
  343. data/lib/pubid/iec/parser.rb +53 -28
  344. data/lib/pubid/iec/renderer.rb +31 -18
  345. data/lib/pubid/iec/single_identifier.rb +34 -11
  346. data/lib/pubid/iec/supplement_identifier.rb +32 -19
  347. data/lib/pubid/iec/urn_generator.rb +227 -61
  348. data/lib/pubid/iec/urn_parser.rb +42 -4
  349. data/lib/pubid/iec.rb +2 -6
  350. data/lib/pubid/ieee/aiee/builder.rb +17 -3
  351. data/lib/pubid/ieee/aiee/identifier.rb +46 -62
  352. data/lib/pubid/ieee/aiee/parser.rb +1 -1
  353. data/lib/pubid/ieee/builder.rb +386 -69
  354. data/lib/pubid/ieee/compaction.rb +121 -0
  355. data/lib/pubid/ieee/components/draft.rb +47 -7
  356. data/lib/pubid/ieee/identifier.rb +1 -3
  357. data/lib/pubid/ieee/identifiers/adopted_standard.rb +62 -5
  358. data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
  359. data/lib/pubid/ieee/identifiers/base.rb +148 -18
  360. data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
  361. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +6 -2
  362. data/lib/pubid/ieee/identifiers/corrigendum.rb +17 -2
  363. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +24 -3
  364. data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
  365. data/lib/pubid/ieee/identifiers/dual_published.rb +58 -3
  366. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
  367. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +25 -1
  368. data/lib/pubid/ieee/identifiers/joint_development.rb +64 -15
  369. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +58 -6
  370. data/lib/pubid/ieee/identifiers/nesc/base.rb +90 -19
  371. data/lib/pubid/ieee/identifiers/nesc/draft.rb +20 -5
  372. data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
  373. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +16 -5
  374. data/lib/pubid/ieee/identifiers/nesc/redline.rb +11 -2
  375. data/lib/pubid/ieee/identifiers/nesc/standard.rb +18 -3
  376. data/lib/pubid/ieee/identifiers/nesc.rb +1 -0
  377. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +3 -3
  378. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +14 -6
  379. data/lib/pubid/ieee/identifiers/redlined_standard.rb +4 -4
  380. data/lib/pubid/ieee/identifiers/si_standard.rb +4 -1
  381. data/lib/pubid/ieee/identifiers/standard.rb +4 -1
  382. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +26 -7
  383. data/lib/pubid/ieee/identifiers.rb +2 -1
  384. data/lib/pubid/ieee/ire/builder.rb +7 -6
  385. data/lib/pubid/ieee/ire/identifier.rb +48 -33
  386. data/lib/pubid/ieee/ire/parser.rb +1 -1
  387. data/lib/pubid/ieee/nesc/builder.rb +33 -20
  388. data/lib/pubid/ieee/nesc/parser.rb +16 -15
  389. data/lib/pubid/ieee/parser.rb +462 -44
  390. data/lib/pubid/ieee/pre_parser.rb +1 -1
  391. data/lib/pubid/ieee/renderer.rb +158 -57
  392. data/lib/pubid/ieee/typed_stages.rb +12 -1
  393. data/lib/pubid/ieee/urn_generator.rb +35 -8
  394. data/lib/pubid/ieee.rb +63 -4
  395. data/lib/pubid/ieee_debug.rb +1 -0
  396. data/lib/pubid/ietf/builder.rb +78 -0
  397. data/lib/pubid/ietf/identifier.rb +5 -0
  398. data/lib/pubid/ietf/identifiers/base.rb +72 -0
  399. data/lib/pubid/ietf/identifiers/bcp.rb +36 -0
  400. data/lib/pubid/ietf/identifiers/fyi.rb +36 -0
  401. data/lib/pubid/ietf/identifiers/internet_draft.rb +45 -0
  402. data/lib/pubid/ietf/identifiers/rfc.rb +27 -0
  403. data/lib/pubid/ietf/identifiers/serialization.rb +51 -0
  404. data/lib/pubid/ietf/identifiers/std.rb +36 -0
  405. data/lib/pubid/ietf/identifiers.rb +14 -0
  406. data/lib/pubid/ietf/parser.rb +61 -0
  407. data/lib/pubid/ietf/renderer.rb +64 -0
  408. data/lib/pubid/ietf/urn_generator.rb +37 -0
  409. data/lib/pubid/ietf/urn_parser.rb +43 -0
  410. data/lib/pubid/ietf.rb +86 -0
  411. data/lib/pubid/iho/identifier.rb +1 -3
  412. data/lib/pubid/iho/identifiers/base.rb +11 -10
  413. data/lib/pubid/iho/identifiers/bibliographic.rb +1 -1
  414. data/lib/pubid/iho/identifiers/circular_letter.rb +1 -1
  415. data/lib/pubid/iho/identifiers/miscellaneous.rb +1 -1
  416. data/lib/pubid/iho/identifiers/publication.rb +1 -1
  417. data/lib/pubid/iho/identifiers/standard.rb +1 -1
  418. data/lib/pubid/iho/identifiers.rb +0 -1
  419. data/lib/pubid/iho/parser.rb +1 -1
  420. data/lib/pubid/iho.rb +8 -7
  421. data/lib/pubid/isbn/builder.rb +44 -0
  422. data/lib/pubid/isbn/check_digit.rb +53 -0
  423. data/lib/pubid/isbn/identifier.rb +81 -0
  424. data/lib/pubid/isbn/identifiers/book.rb +30 -0
  425. data/lib/pubid/isbn/identifiers.rb +9 -0
  426. data/lib/pubid/isbn/parser.rb +45 -0
  427. data/lib/pubid/isbn/renderer.rb +16 -0
  428. data/lib/pubid/isbn.rb +53 -0
  429. data/lib/pubid/iso/builder.rb +9 -4
  430. data/lib/pubid/iso/bundled_identifier.rb +5 -3
  431. data/lib/pubid/iso/combined_identifier.rb +6 -4
  432. data/lib/pubid/iso/identifier.rb +29 -8
  433. data/lib/pubid/iso/identifiers/directives_supplement.rb +12 -12
  434. data/lib/pubid/iso/normalizer.rb +2 -2
  435. data/lib/pubid/iso/parser.rb +17 -13
  436. data/lib/pubid/iso/supplement_identifier.rb +19 -6
  437. data/lib/pubid/iso/urn_generator.rb +4 -1
  438. data/lib/pubid/iso/urn_parser.rb +1 -1
  439. data/lib/pubid/iso.rb +7 -1
  440. data/lib/pubid/itu/builder.rb +230 -29
  441. data/lib/pubid/itu/components/code.rb +48 -5
  442. data/lib/pubid/itu/components/designation.rb +35 -0
  443. data/lib/pubid/itu/components.rb +1 -0
  444. data/lib/pubid/itu/identifier.rb +1 -3
  445. data/lib/pubid/itu/identifiers/addendum.rb +15 -0
  446. data/lib/pubid/itu/identifiers/amendment.rb +7 -29
  447. data/lib/pubid/itu/identifiers/annex.rb +13 -2
  448. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
  449. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
  450. data/lib/pubid/itu/identifiers/base.rb +357 -25
  451. data/lib/pubid/itu/identifiers/combined_identifier.rb +99 -23
  452. data/lib/pubid/itu/identifiers/corrigendum.rb +16 -23
  453. data/lib/pubid/itu/identifiers/errata.rb +15 -0
  454. data/lib/pubid/itu/identifiers/handbook.rb +38 -0
  455. data/lib/pubid/itu/identifiers/question.rb +63 -0
  456. data/lib/pubid/itu/identifiers/recommendation.rb +3 -2
  457. data/lib/pubid/itu/identifiers/report.rb +39 -0
  458. data/lib/pubid/itu/identifiers/special_publication.rb +3 -1
  459. data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
  460. data/lib/pubid/itu/identifiers/supplement.rb +119 -14
  461. data/lib/pubid/itu/identifiers.rb +10 -1
  462. data/lib/pubid/itu/model.rb +1 -1
  463. data/lib/pubid/itu/parser.rb +481 -27
  464. data/lib/pubid/itu/urn_generator.rb +36 -6
  465. data/lib/pubid/itu/urn_parser.rb +8 -0
  466. data/lib/pubid/itu.rb +12 -3
  467. data/lib/pubid/jcgm/builder.rb +24 -14
  468. data/lib/pubid/jcgm/identifier.rb +10 -0
  469. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -2
  470. data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
  471. data/lib/pubid/jcgm/identifiers/gum_guide.rb +3 -3
  472. data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
  473. data/lib/pubid/jcgm/identifiers.rb +2 -0
  474. data/lib/pubid/jcgm/parser.rb +74 -7
  475. data/lib/pubid/jcgm/renderer.rb +33 -12
  476. data/lib/pubid/jcgm/single_identifier.rb +84 -6
  477. data/lib/pubid/jcgm/supplement_identifier.rb +39 -4
  478. data/lib/pubid/jcgm/urn_generator.rb +21 -13
  479. data/lib/pubid/jcgm/urn_parser.rb +164 -10
  480. data/lib/pubid/jcgm.rb +10 -0
  481. data/lib/pubid/jis/identifier.rb +62 -3
  482. data/lib/pubid/jis/parser.rb +1 -1
  483. data/lib/pubid/jis.rb +1 -0
  484. data/lib/pubid/nist/builder.rb +29 -9
  485. data/lib/pubid/nist/caster.rb +7 -45
  486. data/lib/pubid/nist/circular_supplement_builder.rb +7 -5
  487. data/lib/pubid/nist/components/stage.rb +2 -2
  488. data/lib/pubid/nist/components/supplement.rb +5 -2
  489. data/lib/pubid/nist/configuration.rb +6 -2
  490. data/lib/pubid/nist/identifier.rb +1 -3
  491. data/lib/pubid/nist/identifiers/base.rb +133 -39
  492. data/lib/pubid/nist/identifiers/circular.rb +10 -3
  493. data/lib/pubid/nist/identifiers/circular_supplement.rb +14 -5
  494. data/lib/pubid/nist/identifiers/commercial_standard.rb +1 -1
  495. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +1 -1
  496. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +8 -2
  497. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -2
  498. data/lib/pubid/nist/identifiers/dated_document.rb +1 -1
  499. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +1 -1
  500. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +1 -1
  501. data/lib/pubid/nist/identifiers/handbook.rb +10 -3
  502. data/lib/pubid/nist/identifiers/internal_report.rb +13 -6
  503. data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
  504. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +15 -7
  505. data/lib/pubid/nist/identifiers/monograph.rb +15 -8
  506. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  507. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  508. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  509. data/lib/pubid/nist/identifiers/report.rb +15 -7
  510. data/lib/pubid/nist/identifiers/special_publication.rb +10 -1
  511. data/lib/pubid/nist/identifiers/technical_note.rb +1 -1
  512. data/lib/pubid/nist/identifiers.rb +0 -1
  513. data/lib/pubid/nist/parser.rb +27 -4
  514. data/lib/pubid/nist/preprocessor.rb +15 -0
  515. data/lib/pubid/nist/router.rb +2 -2
  516. data/lib/pubid/nist/series/ir.rb +0 -3
  517. data/lib/pubid/nist/supplement_identifier.rb +24 -9
  518. data/lib/pubid/nist.rb +19 -13
  519. data/lib/pubid/oasis/builder.rb +79 -0
  520. data/lib/pubid/oasis/identifier.rb +160 -0
  521. data/lib/pubid/oasis/identifiers/standard.rb +29 -0
  522. data/lib/pubid/oasis/identifiers.rb +9 -0
  523. data/lib/pubid/oasis/parser.rb +34 -0
  524. data/lib/pubid/oasis/renderer.rb +29 -0
  525. data/lib/pubid/oasis/urn_generator.rb +25 -0
  526. data/lib/pubid/oasis/urn_parser.rb +22 -0
  527. data/lib/pubid/oasis.rb +80 -0
  528. data/lib/pubid/ogc/builder.rb +33 -0
  529. data/lib/pubid/ogc/identifier.rb +81 -0
  530. data/lib/pubid/ogc/identifiers/document.rb +26 -0
  531. data/lib/pubid/ogc/identifiers.rb +10 -0
  532. data/lib/pubid/ogc/parser.rb +40 -0
  533. data/lib/pubid/ogc/renderer.rb +33 -0
  534. data/lib/pubid/ogc/urn_generator.rb +14 -0
  535. data/lib/pubid/ogc/urn_parser.rb +22 -0
  536. data/lib/pubid/ogc.rb +72 -0
  537. data/lib/pubid/oiml/builder.rb +36 -8
  538. data/lib/pubid/oiml/identifier.rb +9 -1
  539. data/lib/pubid/oiml/identifiers/basic_publication.rb +2 -0
  540. data/lib/pubid/oiml/identifiers/bulletin.rb +36 -0
  541. data/lib/pubid/oiml/identifiers/code_number.rb +90 -0
  542. data/lib/pubid/oiml/identifiers/document.rb +2 -0
  543. data/lib/pubid/oiml/identifiers/expert_report.rb +2 -0
  544. data/lib/pubid/oiml/identifiers/guide.rb +2 -0
  545. data/lib/pubid/oiml/identifiers/recommendation.rb +2 -0
  546. data/lib/pubid/oiml/identifiers/seminar_report.rb +2 -0
  547. data/lib/pubid/oiml/identifiers/vocabulary.rb +2 -0
  548. data/lib/pubid/oiml/identifiers.rb +1 -0
  549. data/lib/pubid/oiml/parser.rb +12 -13
  550. data/lib/pubid/oiml/renderer.rb +13 -13
  551. data/lib/pubid/oiml/single_identifier.rb +41 -37
  552. data/lib/pubid/oiml/supplement_identifier.rb +36 -9
  553. data/lib/pubid/oiml/urn_parser.rb +23 -6
  554. data/lib/pubid/oiml.rb +10 -0
  555. data/lib/pubid/omg/builder.rb +20 -0
  556. data/lib/pubid/omg/identifier.rb +61 -0
  557. data/lib/pubid/omg/identifiers/specification.rb +32 -0
  558. data/lib/pubid/omg/identifiers.rb +9 -0
  559. data/lib/pubid/omg/parser.rb +93 -0
  560. data/lib/pubid/omg/renderer.rb +31 -0
  561. data/lib/pubid/omg.rb +52 -0
  562. data/lib/pubid/parser/grammar.rb +74 -0
  563. data/lib/pubid/parser.rb +2 -0
  564. data/lib/pubid/parsers/mr_string.rb +120 -7
  565. data/lib/pubid/plateau/builder.rb +8 -4
  566. data/lib/pubid/plateau/identifier.rb +1 -3
  567. data/lib/pubid/plateau/identifiers/base.rb +1 -6
  568. data/lib/pubid/plateau/identifiers/handbook.rb +1 -1
  569. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  570. data/lib/pubid/plateau/identifiers.rb +0 -1
  571. data/lib/pubid/plateau/parser.rb +16 -6
  572. data/lib/pubid/plateau/renderer.rb +1 -1
  573. data/lib/pubid/plateau/supplement_identifier.rb +11 -11
  574. data/lib/pubid/plateau.rb +14 -4
  575. data/lib/pubid/prefixes_support.rb +1 -0
  576. data/lib/pubid/renderers/annotator.rb +233 -0
  577. data/lib/pubid/renderers/base.rb +13 -0
  578. data/lib/pubid/renderers/directives_renderer.rb +3 -3
  579. data/lib/pubid/renderers/human_readable.rb +6 -4
  580. data/lib/pubid/renderers/mr_string.rb +54 -6
  581. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  582. data/lib/pubid/renderers.rb +1 -0
  583. data/lib/pubid/rendering/numbering.rb +25 -7
  584. data/lib/pubid/rendering/supplement.rb +4 -4
  585. data/lib/pubid/rendering.rb +1 -0
  586. data/lib/pubid/sae/builder.rb +1 -1
  587. data/lib/pubid/sae/identifier.rb +1 -3
  588. data/lib/pubid/sae/identifiers/base.rb +19 -9
  589. data/lib/pubid/sae/identifiers.rb +0 -1
  590. data/lib/pubid/sae/parser.rb +1 -1
  591. data/lib/pubid/sae.rb +4 -3
  592. data/lib/pubid/schema/declaration.rb +33 -0
  593. data/lib/pubid/schema/error.rb +14 -0
  594. data/lib/pubid/schema/identifier_type.rb +23 -0
  595. data/lib/pubid/schema/loader.rb +117 -0
  596. data/lib/pubid/schema/typed_stage.rb +24 -0
  597. data/lib/pubid/schema.rb +25 -0
  598. data/lib/pubid/tgpp/builder.rb +41 -0
  599. data/lib/pubid/tgpp/identifier.rb +107 -0
  600. data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
  601. data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
  602. data/lib/pubid/tgpp/identifiers.rb +11 -0
  603. data/lib/pubid/tgpp/parser.rb +78 -0
  604. data/lib/pubid/tgpp/renderer.rb +52 -0
  605. data/lib/pubid/tgpp/urn_generator.rb +39 -0
  606. data/lib/pubid/tgpp/urn_parser.rb +30 -0
  607. data/lib/pubid/tgpp.rb +84 -0
  608. data/lib/pubid/type_resolver.rb +74 -0
  609. data/lib/pubid/un/builder.rb +42 -0
  610. data/lib/pubid/un/identifier.rb +40 -0
  611. data/lib/pubid/un/identifiers/document.rb +24 -0
  612. data/lib/pubid/un/identifiers.rb +9 -0
  613. data/lib/pubid/un/parser.rb +25 -0
  614. data/lib/pubid/un/renderer.rb +11 -0
  615. data/lib/pubid/un.rb +47 -0
  616. data/lib/pubid/urn_parser/errors.rb +8 -1
  617. data/lib/pubid/urn_parser.rb +1 -0
  618. data/lib/pubid/utils.rb +1 -0
  619. data/lib/pubid/version.rb +1 -1
  620. data/lib/pubid/w3c/builder.rb +55 -0
  621. data/lib/pubid/w3c/identifier.rb +130 -0
  622. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
  623. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
  624. data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
  625. data/lib/pubid/w3c/identifiers/note.rb +30 -0
  626. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
  627. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
  628. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
  629. data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
  630. data/lib/pubid/w3c/identifiers/standard.rb +12 -0
  631. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
  632. data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
  633. data/lib/pubid/w3c/identifiers.rb +25 -0
  634. data/lib/pubid/w3c/parser.rb +43 -0
  635. data/lib/pubid/w3c/renderer.rb +35 -0
  636. data/lib/pubid/w3c/urn_generator.rb +18 -0
  637. data/lib/pubid/w3c/urn_parser.rb +36 -0
  638. data/lib/pubid/w3c.rb +68 -0
  639. data/lib/pubid/xsf/builder.rb +17 -0
  640. data/lib/pubid/xsf/identifier.rb +66 -0
  641. data/lib/pubid/xsf/identifiers/xep.rb +31 -0
  642. data/lib/pubid/xsf/identifiers.rb +9 -0
  643. data/lib/pubid/xsf/parser.rb +38 -0
  644. data/lib/pubid/xsf/renderer.rb +23 -0
  645. data/lib/pubid/xsf/urn_generator.rb +13 -0
  646. data/lib/pubid/xsf/urn_parser.rb +18 -0
  647. data/lib/pubid/xsf.rb +82 -0
  648. data/lib/pubid.rb +424 -22
  649. data/lib/tasks/conformance.rake +34 -0
  650. data/lib/tasks/docs.rake +3 -3
  651. data/lib/tasks/schema.rake +88 -0
  652. data/schema/core/joint_prefixes.yaml +24 -0
  653. data/schema/iec.yaml +1017 -0
  654. data/schema/iso.yaml +1586 -0
  655. data/schema/schema.schema.yaml +96 -0
  656. metadata +241 -19
  657. data/archived-gems/pubid-ccsds/update_codes.yaml +0 -1
  658. data/archived-gems/pubid-iec/stages.yaml +0 -129
  659. data/archived-gems/pubid-iec/update_codes.yaml +0 -67
  660. data/archived-gems/pubid-ieee/update_codes.yaml +0 -104
  661. data/archived-gems/pubid-iso/stages.yaml +0 -106
  662. data/archived-gems/pubid-iso/update_codes.yaml +0 -4
  663. data/archived-gems/pubid-itu/i18n.yaml +0 -13
  664. data/archived-gems/pubid-itu/series.yaml +0 -42
  665. data/archived-gems/pubid-nist/publishers.yaml +0 -6
  666. data/archived-gems/pubid-nist/update_codes.yaml +0 -93
  667. data/archived-gems/pubid-plateau/update_codes.yaml +0 -6
  668. data/lib/pubid/cen_cenelec/supplement_identifier.rb +0 -48
  669. data/lib/pubid/cie/components/code.rb +0 -80
  670. data/lib/pubid/iala/identifiers/base.rb +0 -14
  671. data/lib/pubid/iec/components/code.rb +0 -36
  672. /data/{archived-gems/pubid-nist → data/nist}/stages.yaml +0 -0
@@ -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,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pubid"
4
+ module Pubid
5
+ module Adobe
6
+ extend Pubid::PrefixesSupport
7
+
8
+ # Leading identifier prefix tokens that an Adobe document id can start
9
+ # with. Tech notes appear as both `Adobe Technical Note #<n>` and the
10
+ # short alias `ATN<n>` in citations; both must route to this flavor.
11
+ # Named publications start with `Adobe` (e.g. `Adobe Glyph List`,
12
+ # `Adobe-Japan1-7`).
13
+ PREFIXES = ["Adobe", "ATN"].freeze
14
+
15
+ autoload :Builder, "#{__dir__}/adobe/builder"
16
+ autoload :Identifier, "#{__dir__}/adobe/identifier"
17
+ autoload :Identifiers, "#{__dir__}/adobe/identifiers"
18
+ autoload :Parser, "#{__dir__}/adobe/parser"
19
+ autoload :Renderer, "#{__dir__}/adobe/renderer"
20
+ autoload :UrnGenerator, "#{__dir__}/adobe/urn_generator"
21
+ autoload :UrnParser, "#{__dir__}/adobe/urn_parser"
22
+
23
+ # Parse an Adobe identifier string into an identifier object.
24
+ # @param identifier [String]
25
+ # @return [Pubid::Adobe::Identifier]
26
+ def self.parse(identifier)
27
+ Identifier.parse(identifier)
28
+ end
29
+
30
+ # Per-flavor format registry: inherits global formats, overrides :human
31
+ # with the Adobe-specific renderer.
32
+ Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
33
+ Identifier.format_registry.register(:human, renderer: Adobe::Renderer)
34
+
35
+ # Auto-discover identifier types from the Identifiers namespace.
36
+ # @return [Array<Class>]
37
+ def self.identifier_types
38
+ @identifier_types ||= Identifiers.constants
39
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
40
+ .select { |c| c.is_a?(Class) && c < Pubid::Identifier }
41
+ .reject { |c| c == Identifier }
42
+ end
43
+
44
+ # Lookup: type key → identifier class
45
+ # @param code [String, Symbol]
46
+ # @return [Class, nil]
47
+ def self.locate_type(code)
48
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
49
+ end
50
+
51
+ # Lookup: type short letter (e.g. "ATN") → identifier class
52
+ # @param short [String]
53
+ # @return [Class<Identifier>]
54
+ def self.identifier_klass_for_short(short)
55
+ @by_short ||= identifier_types.to_h { |klass| [klass.type[:short].to_s, klass] }
56
+ @by_short.fetch(short.to_s)
57
+ end
58
+ end
59
+ end
60
+
61
+ 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
@@ -78,7 +78,7 @@ module Pubid
78
78
  if parsed[:code_with_year]
79
79
  code_year_data = parsed[:code_with_year]
80
80
  if code_year_data && code_year_data[:code]
81
- attributes[:code] =
81
+ attributes[:number] =
82
82
  extract_value(code_year_data[:code])
83
83
  end
84
84
  if code_year_data && code_year_data[:year]
@@ -86,7 +86,7 @@ module Pubid
86
86
  extract_value(code_year_data[:year])
87
87
  end
88
88
  elsif parsed[:code]
89
- attributes[:code] = extract_value(parsed[:code])
89
+ attributes[:number] = extract_value(parsed[:code])
90
90
  end
91
91
 
92
92
  # Extract year if not already extracted from code_with_year
@@ -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,15 +3,22 @@
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
- # @raise [Parslet::ParseFailed] If parsing fails
9
+ # @raise [Pubid::Errors::ParseError] If parsing fails
10
10
  def self.parse(identifier)
11
+ unless identifier.is_a?(String)
12
+ raise Pubid::Errors::InvalidInputError,
13
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
14
+ end
15
+
16
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
17
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
18
+ end
19
+
11
20
  parsed = Parser.parse(identifier)
12
21
  Builder.build(parsed)
13
- rescue Parslet::ParseFailed => e
14
- raise "Failed to parse ACMA identifier '#{identifier}': #{e.message}"
15
22
  end
16
23
 
17
24
  # Stored as a plain string (always "AMCA") so it round-trips through
@@ -19,22 +26,40 @@ module Pubid
19
26
  # serialize a String against the Components::Publisher attribute and raise.
20
27
  attribute :publisher, :string, default: -> { "AMCA" }
21
28
  attribute :copublisher, :string
22
- attribute :code, Components::Code
23
- attribute :year, Components::Date
29
+ # The document number used to live in AMCA's own `code` attribute, leaving
30
+ # the `number` inherited from ::Pubid::Identifier nil — so relaton-index,
31
+ # which sorts and bsearches on `id.root.number.to_s`, keyed every AMCA row
32
+ # on "". `code` is gone; each LEAF now declares `attribute :number,
33
+ # :string` (see standard.rb / publication.rb / interpretation.rb).
34
+ #
35
+ # It is declared on the leaves, never here: this class is inherited by all
36
+ # three of them, and redefining the parent's Components::Code-typed
37
+ # `number` on an inherited-from class resolves nondeterministically under
38
+ # multi-flavor load. Do not reintroduce `code`, and do not move `number`
39
+ # up here.
40
+ #
41
+ # A bare 2-digit edition year ("21", "02"). Declared :string, not
42
+ # Components::Date: the builder assigns a String and lutaml does not cast
43
+ # it, so a Date declaration left the PARSE path holding a String while
44
+ # from_hash produced a Components::Date — making
45
+ # `parse(x) == from_hash(parse(x).to_hash)` false for every AMCA id and
46
+ # breaking #matches?, which is built on ==. to_hash and to_s agreed, so
47
+ # the relaton index gate never caught it.
48
+ attribute :year, :string
24
49
  attribute :suffix, :string
25
50
  attribute :reaffirmed, :string
26
51
 
27
52
  # Explicit key_value mapping: only these keys serialize (the inherited
28
53
  # Pubid::Identifier attributes — including :type, which subclasses expose
29
54
  # as a class-metadata Hash via `self.type` — are intentionally dropped).
30
- # code/year are flattened to their scalar value and rebuilt on load, since
31
- # the Builder may store them as either a String or a component.
55
+ # Every mapped attribute is a plain scalar, so no custom converters are
56
+ # needed; the canonical to_hash already drops empty and default values.
32
57
  key_value do
33
58
  map "_type", to: :_type
34
59
  map "publisher", to: :publisher
35
60
  map "copublisher", to: :copublisher
36
- map "code", with: { to: :code_to_kv, from: :code_from_kv }
37
- map "year", with: { to: :year_to_kv, from: :year_from_kv }
61
+ map "number", to: :number
62
+ map "year", to: :year
38
63
  map "suffix", to: :suffix
39
64
  map "reaffirmed", to: :reaffirmed
40
65
  end
@@ -43,33 +68,25 @@ module Pubid
43
68
  UrnGenerator.new(self).generate
44
69
  end
45
70
 
46
- def code_to_kv(model, doc)
47
- v = model.code.is_a?(::Pubid::Components::Code) ? model.code.value : model.code
48
- return if v.nil? || v.to_s.empty?
71
+ # AMCA models its document type as class metadata (`self.type`), not as a
72
+ # `typed_stage`, so the base `mr_type` hook found nothing. Without it an
73
+ # interpretation and the standard it interprets share a slug — and
74
+ # `to_slug` is an output FILENAME. Before the index columns landed the
75
+ # whole flavor collapsed onto two slugs ("amca" and "").
76
+ def mr_type
77
+ return nil unless self.class.respond_to?(:type)
49
78
 
50
- doc.add_child(Lutaml::KeyValue::DataModel::Element.new("code", v.to_s))
79
+ self.class.type[:key]&.to_s
51
80
  end
52
81
 
53
- def code_from_kv(model, value)
54
- model.code = ::Pubid::Components::Code.new(value: value.to_s)
55
- end
56
-
57
- def year_to_kv(model, doc)
58
- y = model.year.is_a?(::Pubid::Components::Date) ? model.year.year : model.year
59
- return if y.nil? || y.to_s.empty?
60
-
61
- doc.add_child(Lutaml::KeyValue::DataModel::Element.new("year", y.to_s))
82
+ # AMCA keeps the edition in its own `year` string, not in the inherited
83
+ # `date`, so the base `mr_year` hook read nil and two editions of one
84
+ # standard — "ANSI/AMCA 300-14" and "ANSI/AMCA Standard 300-24" —
85
+ # produced the same slug. Same shape as the BIPM year recorded in
86
+ # CLAUDE.md.
87
+ def mr_year
88
+ year&.to_s
62
89
  end
63
-
64
- def year_from_kv(model, value)
65
- model.year = ::Pubid::Components::Date.new(year: value.to_s)
66
- end
67
- end
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
90
  end
74
91
  end
75
92
  end
@@ -8,17 +8,25 @@ module Pubid
8
8
  # - AMCA 99 JW Interp
9
9
  # - AMCA 204 – 1
10
10
  # - ANSI/AMCA 204 Interp
11
- class Interpretation < Base
12
- attr_reader :interpretation_code
11
+ class Interpretation < Identifier
12
+ attribute :number, :string
13
13
 
14
- def initialize(code:, year: nil, copublisher: nil, suffix: nil,
15
- reaffirmed: nil, interpretation_code: nil)
16
- @code = Components::Code.new(value: code.to_s)
17
- @year = Components::Date.new(year: year.to_s) if year
18
- @copublisher = copublisher
19
- @suffix = suffix
20
- @reaffirmed = reaffirmed
21
- @interpretation_code = interpretation_code
14
+ # See Publication: the hand-written keyword initializer bypassed lutaml,
15
+ # costing this class its `_type`, its `publisher` default and the
16
+ # serialization of `interpretation_code`.
17
+ attribute :interpretation_code, :string
18
+
19
+ key_value do
20
+ map "interpretation_code", to: :interpretation_code
21
+ end
22
+
23
+ # The interpretation letter is what distinguishes one interpretation of
24
+ # a standard from another ("AMCA 99 JW Interp" vs "AMCA 99 KB Interp" —
25
+ # different documents, and #== agrees). It is in `==` and in `to_s`, so
26
+ # it must reach the slug too, or three interpretations of standard 99
27
+ # share one filename.
28
+ def mr_number_with_part
29
+ mr_join(super, interpretation_code&.to_s&.downcase)
22
30
  end
23
31
 
24
32
  def self.type
@@ -8,17 +8,21 @@ 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
12
- attr_reader :revision
11
+ class Publication < Identifier
12
+ attribute :number, :string
13
13
 
14
- def initialize(code:, year:, copublisher: nil, suffix: nil,
15
- reaffirmed: nil, revision: nil)
16
- @code = Components::Code.new(value: code.to_s)
17
- @year = Components::Date.new(year: year.to_s) if year
18
- @copublisher = copublisher
19
- @suffix = suffix
20
- @reaffirmed = reaffirmed
21
- @revision = revision
14
+ # Was a hand-written keyword initializer assigning ivars directly,
15
+ # which bypassed lutaml entirely. Three things broke as a result: no
16
+ # `_type` was emitted (so Identifier.from_hash could not route back to
17
+ # this class), the `publisher` default never materialised, and
18
+ # `revision` was a plain attr_reader that to_hash dropped. Removing it
19
+ # — and making `revision` a real attribute — is the AIEE/IRE/NESC
20
+ # migration applied here; the builder already calls `new(**attributes)`
21
+ # exactly as it does for Standard, which never had this problem.
22
+ attribute :revision, :string
23
+
24
+ key_value do
25
+ map "revision", to: :revision
22
26
  end
23
27
 
24
28
  def self.type
@@ -8,7 +8,9 @@ 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
+ attribute :number, :string
13
+
12
14
  def self.type
13
15
  { key: :standard, title: "Standard", short: nil }
14
16
  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
  # Parser class for ACMA identifiers
6
6
  # Single Responsibility: Parsing ACMA identifier syntax
7
- class Parser < Parslet::Parser
7
+ class Parser < ::Pubid::Parser::Grammar
8
8
  # Basic building blocks
9
9
  rule(:space) { str(" ") }
10
10
  rule(:space?) { space.maybe }
@@ -35,14 +35,14 @@ module Pubid
35
35
  if t.is_a?(Hash) && t[:title]
36
36
  parts << t[:title].to_s
37
37
  end
38
- parts << id.code.to_s
38
+ parts << id.number.to_s
39
39
  parts << "-#{id.year}" if id.year
40
40
 
41
41
  result = parts.compact.join(" ")
42
42
 
43
43
  if id.copublisher&.include?("/") && id.year
44
44
  type_title = t.is_a?(Hash) ? t[:title].to_s : ""
45
- result = "#{id.copublisher} #{type_title} #{id.code}-#{id.year}"
45
+ result = "#{id.copublisher} #{type_title} #{id.number}-#{id.year}"
46
46
  end
47
47
 
48
48
  result += " (#{id.reaffirmed})" if id.reaffirmed
@@ -54,7 +54,7 @@ module Pubid
54
54
  parts = []
55
55
  parts << id.copublisher if id.copublisher
56
56
  parts << "Publication"
57
- parts << id.code.to_s
57
+ parts << id.number.to_s
58
58
  parts << "-#{id.year}" if id.year
59
59
  parts << " (Rev. #{id.revision})" if id.revision
60
60
  parts << " (#{id.reaffirmed})" if id.reaffirmed && !id.revision
@@ -65,7 +65,7 @@ module Pubid
65
65
  def render_interpretation(id)
66
66
  parts = []
67
67
  parts << id.copublisher if id.copublisher
68
- parts << id.code.to_s
68
+ parts << id.number.to_s
69
69
 
70
70
  if id.interpretation_code
71
71
  parts << "– #{id.interpretation_code}"
@@ -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
@@ -4,9 +4,9 @@ module Pubid
4
4
  module Amca
5
5
  class UrnGenerator < Pubid::UrnGenerator::Base
6
6
  def urn_number
7
- return nil unless identifier.code
7
+ return nil unless identifier.number
8
8
 
9
- identifier.code.to_s
9
+ identifier.number.to_s
10
10
  end
11
11
 
12
12
  def urn_year
data/lib/pubid/amca.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module Amca
5
6
  extend Pubid::PrefixesSupport
@@ -8,7 +9,7 @@ module Pubid
8
9
  # Pubid::JOINT_PREFIXES.
9
10
  PREFIXES = ["AMCA"].freeze
10
11
 
11
- autoload :Identifier, "#{__dir__}/amca/identifier"
12
+ autoload :Identifier, "#{__dir__}/amca/identifiers/base"
12
13
  autoload :Identifiers, "#{__dir__}/amca/identifiers"
13
14
  autoload :Builder, "#{__dir__}/amca/builder"
14
15
  autoload :Parser, "#{__dir__}/amca/parser"
@@ -20,14 +21,14 @@ module Pubid
20
21
  # Parse an ACMA identifier string into an identifier object
21
22
  # @param identifier [String] The ACMA identifier string to parse
22
23
  # @return [Pubid::Amca::Identifier] The appropriate identifier object
23
- # @raise [Parslet::ParseFailed] If parsing fails
24
+ # @raise [Pubid::Errors::ParseError] If parsing fails
24
25
  def self.parse(identifier)
25
26
  Identifier.parse(identifier)
26
27
  end
27
28
 
28
29
  # 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)
30
+ Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
31
+ Identifier.format_registry.register(:human, renderer: Amca::Renderer)
31
32
 
32
33
  # Auto-discover all identifier types from the Identifiers namespace
33
34
  # @return [Array<Class>] identifier classes that define a self.type Hash
@@ -36,8 +36,8 @@ module Pubid
36
36
  main_number = main_and_parts[0]
37
37
  part_number = main_and_parts[1]
38
38
  {
39
- number: Components::Code.new(value: main_number),
40
- part: part_number ? Components::Code.new(value: part_number) : nil,
39
+ number: main_number,
40
+ part: part_number,
41
41
  }.compact
42
42
  when :date
43
43
  Components::Date.new(year: value.to_s)
@@ -4,7 +4,25 @@ module Pubid
4
4
  module Ansi
5
5
  # Base ANSI identifier class
6
6
  class Identifier < ::Pubid::Identifier
7
+ # `number`/`part`/`subpart` are declared here rather than inherited as a
8
+ # Components::Code: ANSI stores a bare string in every one of them.
9
+ # Declaring on this class is safe because its body lives in this one file
10
+ # and is never reopened, so every subclass body opens after it has run
11
+ # (lutaml deep-dups the parent attribute table at class-definition time).
12
+ attribute :number, :string
13
+ attribute :part, :string
14
+ attribute :subpart, :string
15
+
7
16
  def self.parse(string)
17
+ unless string.is_a?(String)
18
+ raise Pubid::Errors::InvalidInputError,
19
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
20
+ end
21
+
22
+ if string.length > Pubid::MAX_INPUT_LENGTH
23
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
24
+ end
25
+
8
26
  parsed = Pubid::Ansi::Parser.new.parse(string)
9
27
  Pubid::Ansi::Builder.new.build(parsed)
10
28
  end
@@ -4,7 +4,7 @@ module Pubid
4
4
  module Ansi
5
5
  # Parser for ANSI (American National Standards Institute) identifiers
6
6
  # Examples: ANSI X3.4-1986, ANSI C63.4-2014, ANSI/ISO 9899:1990
7
- class Parser < Parslet::Parser
7
+ class Parser < ::Pubid::Parser::Grammar
8
8
  include ::Pubid::Parser::CommonParseRules
9
9
  include ::Pubid::Parser::CommonParseMethods
10
10
 
@@ -37,8 +37,8 @@ module Pubid
37
37
 
38
38
  def number_portion(id, context)
39
39
  [
40
- id.number.render(context:),
41
- (id.part ? "-#{id.part.render(context:)}" : ""),
40
+ id.number,
41
+ (id.part ? "-#{id.part}" : ""),
42
42
  (id.date ? ":#{id.date.render(context:)}" : ""),
43
43
  ].join
44
44
  end
data/lib/pubid/ansi.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module Ansi
5
6
  extend Pubid::PrefixesSupport
@@ -21,12 +22,11 @@ module Pubid
21
22
  # Parse an ANSI identifier string
22
23
  # @param identifier [String] the identifier string to parse
23
24
  # @return [Identifier] the parsed identifier
25
+ # Delegate to the class method rather than repeating the parser/builder
26
+ # sequence, so the input guards live in one place and the two entry points
27
+ # cannot drift apart.
24
28
  def self.parse(identifier)
25
- parser = Parser.new
26
- builder = Builder.new
27
-
28
- parsed = parser.parse(identifier)
29
- builder.build(parsed)
29
+ Identifier.parse(identifier)
30
30
  end
31
31
 
32
32
  # Per-flavor format registry: inherits global formats, overrides :human
@@ -30,15 +30,29 @@ module Pubid
30
30
  # identifier attribute (the concrete class is pinned by `_type`). Drop it
31
31
  # so the raw Parslet::Slice never lands in the inherited :type attribute.
32
32
  when :type then nil
33
- when :number then Components::Code.new(value: value.to_s)
34
33
  when :reaffirmation
35
34
  value.is_a?(Hash) ? (value[:year] || value).to_s : value.to_s
36
- when :part, :chapter, :section, :subsection, :year
35
+ # Every remaining key is a bare scalar. `:chapter` is a PARSE-TREE key
36
+ # and keeps its name in the grammar; the ATTRIBUTE it feeds is `number`
37
+ # (see handle_key below), which this branch retyped from
38
+ # Components::Code to :string — so it now casts like the rest.
39
+ when :number, :chapter, :part, :section, :subsection, :year
37
40
  value.to_s
38
41
  else
39
42
  super
40
43
  end
41
44
  end
45
+
46
+ # Route the MPMS chapter into the `number` attribute. The shared
47
+ # assign_attributes loop uses the parse-tree key as the setter name and
48
+ # silently skips a key that is not an attribute, so without this the
49
+ # chapter would simply vanish once `attribute :chapter` was removed.
50
+ def handle_key(identifier, key, value)
51
+ return super unless key.to_sym == :chapter
52
+
53
+ identifier.number = value
54
+ true
55
+ end
42
56
  end
43
57
  end
44
58
  end