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
@@ -3,13 +3,48 @@
3
3
  module Pubid
4
4
  module Jcgm
5
5
  # Base class for JCGM supplement identifiers (amendments, corrigenda, etc.)
6
+ #
7
+ # The supplement's OWN number (the "1" in "/Cor 1", the "2" in "/Amd 2")
8
+ # is stored in the inherited `number` attribute — NOT a separate
9
+ # `iteration` attribute. Each supplement is itself a numbered document,
10
+ # just like the base. The base document's number is accessed via
11
+ # `base.number`. This mirrors how pubid-Iso models supplements.
6
12
  class SupplementIdentifier < SingleIdentifier
7
- attribute :base_identifier, Identifier, polymorphic: true
8
- attribute :iteration, Pubid::Components::Code
13
+ attribute :base, Identifier, polymorphic: true
9
14
 
10
- # Delegate publisher to base_identifier
15
+ # The base document nests under the compact key "base" (mirrors ISO/JIS),
16
+ # serialized via its own to_hash so it collapses to {_type, number, year}.
17
+ # On load the sub-hash is re-dispatched through Jcgm::Identifier.from_hash,
18
+ # which resolves `_type` to the concrete Guide/GumGuide — a bare
19
+ # polymorphic cast would rebuild it as a plain Identifier and later fail
20
+ # on publisher_portion. This custom mapping replaces the former
21
+ # self.from_hash override.
22
+ #
23
+ # `number` (the supplement's own number) is mapped by SingleIdentifier's
24
+ # key_value block via number_to_kv / number_from_kv — no override needed.
25
+ key_value do
26
+ map "base", with: { to: :base_to_kv, from: :base_from_kv }
27
+ end
28
+
29
+ def base_to_kv(model, doc)
30
+ return unless model.base
31
+
32
+ doc.add_child(
33
+ Lutaml::KeyValue::DataModel::Element.new(
34
+ "base", model.base.to_hash
35
+ ),
36
+ )
37
+ end
38
+
39
+ def base_from_kv(model, value)
40
+ return unless value
41
+
42
+ model.base = ::Pubid::Jcgm::Identifier.from_hash(value)
43
+ end
44
+
45
+ # Delegate publisher to base
11
46
  def publisher
12
- base_identifier&.publisher
47
+ base&.publisher
13
48
  end
14
49
  end
15
50
  end
@@ -4,7 +4,9 @@ module Pubid
4
4
  module Jcgm
5
5
  class UrnGenerator < Pubid::UrnGenerator::Base
6
6
  def generate
7
- if identifier.is_a?(SupplementIdentifier)
7
+ if identifier.is_a?(Identifiers::Meeting)
8
+ generate_meeting_urn
9
+ elsif identifier.is_a?(SupplementIdentifier)
8
10
  generate_supplement_urn
9
11
  else
10
12
  generate_base_urn
@@ -13,16 +15,21 @@ module Pubid
13
15
 
14
16
  protected
15
17
 
18
+ # urn:jcgm:meeting:<number>:<year>, e.g. urn:jcgm:meeting:17:2012
19
+ def generate_meeting_urn
20
+ parts = ["urn", "jcgm", "meeting"]
21
+ parts << identifier.number if identifier.number
22
+ parts << identifier.date.year if identifier.date
23
+ parts.join(":")
24
+ end
25
+
16
26
  def generate_base_urn
17
27
  parts = ["urn", "jcgm"]
18
28
 
19
- gum_number = maybe(:gum_number)
20
- if gum_number
21
- number = gum_number.to_s
22
- parts << "gum.#{number}"
29
+ if identifier.is_a?(Identifiers::GumGuide) && identifier.number
30
+ parts << "gum.#{identifier.number}"
23
31
  elsif identifier.number
24
- number = identifier.number.to_s
25
- parts << number
32
+ parts << identifier.number.to_s
26
33
  end
27
34
 
28
35
  part = maybe(:part)
@@ -55,9 +62,11 @@ module Pubid
55
62
  parts << "iter.#{iter}"
56
63
  end
57
64
 
65
+ # Guide and GUM-guide are already implied by the number form (bare
66
+ # number vs "gum.N"), so their type_code is not appended.
58
67
  if identifier.typed_stage
59
68
  type_code = identifier.typed_stage.type_code
60
- if type_code && type_code.to_s != "guide"
69
+ if type_code && !%w[guide gum_guide].include?(type_code.to_s)
61
70
  parts << type_code.to_s
62
71
  end
63
72
  end
@@ -73,7 +82,7 @@ module Pubid
73
82
  def generate_supplement_urn
74
83
  parts = ["urn", "jcgm"]
75
84
 
76
- base_id = maybe(:base_identifier)
85
+ base_id = maybe(:base)
77
86
  if base_id
78
87
  base_gen = self.class.new(base_id)
79
88
  base_urn = base_gen.generate_base_urn
@@ -88,10 +97,9 @@ module Pubid
88
97
  parts << supp_type if supp_type
89
98
  end
90
99
 
91
- iteration = maybe(:iteration)
92
- if iteration
93
- iter = iteration.to_s
94
- parts << iter
100
+ # The supplement's own number (the "1" in "/Cor 1") — NOT iteration.
101
+ if identifier.number
102
+ parts << identifier.number.to_s
95
103
  end
96
104
 
97
105
  if identifier.date&.is_a?(::Pubid::Components::Date) && identifier.date.present?
@@ -4,19 +4,173 @@ module Pubid
4
4
  module Jcgm
5
5
  # Parses JCGM URNs back into identifiers.
6
6
  #
7
- # UrnGenerator emits: `urn:jcgm:{number}:{year}`.
7
+ # Identifiers are rebuilt **directly from the URN segments** rather than
8
+ # rendered to a human-readable string and re-parsed (the BIPM UrnParser
9
+ # pattern). Round-tripping through the grammar flattened the segments into
10
+ # one string and silently lost everything the string form could not carry:
11
+ # a GUM guide (`urn:jcgm:gum.6:2020`) raised, and the language and
12
+ # supplement segments were dropped, so a corrigendum read back as the
13
+ # standard it amends — a different document, with no error.
8
14
  #
9
- # Examples:
10
- # - urn:jcgm:200:2012 → JCGM 200:2012
11
- # - urn:jcgm:100:2008 → JCGM 100:2008
15
+ # Shapes emitted by UrnGenerator, and read back here:
16
+ # urn:jcgm:200:2008 → JCGM 200:2008
17
+ # urn:jcgm:100:2008:en → JCGM 100:2008(E)
18
+ # urn:jcgm:200:2012:en,fr → JCGM 200:2012(E/F)
19
+ # urn:jcgm:GUM → JCGM GUM
20
+ # urn:jcgm:gum.6:2020 → JCGM GUM-6:2020
21
+ # urn:jcgm:200:2008:corrigendum → JCGM 200:2008 Corrigendum
22
+ # urn:jcgm:101:2008:corrigendum:1:2009 → JCGM 101:2008/Cor 1:2009
23
+ # urn:jcgm:100:2008:amendment:1:2023 → JCGM 100:2008/Amd 1:2023
24
+ # urn:jcgm:meeting:17:2012 → JCGM 17th Meeting (2012)
25
+ # urn:jcgm:meeting:11 → JCGM 11st Meeting
26
+ #
27
+ # KNOWN GAP, on the generator side and unchanged here: a full date is
28
+ # rendered as its year alone (`JCGM GUM-1:2022-11-28` →
29
+ # `urn:jcgm:gum.1:2022`), so a URN cannot restore the month and day.
30
+ # Widening it would change already-published URNs.
12
31
  class UrnParser < Pubid::UrnParser::Base
32
+ MEETING_MARKER = "meeting"
33
+
34
+ # The GUM-guide number is written "gum.<n>" by UrnGenerator.
35
+ GUM_PREFIX = "gum."
36
+
37
+ # The supplement marker UrnGenerator writes is the typed stage's
38
+ # `type_code`; the abbreviation is what `Jcgm.locate_stage` matches on.
39
+ SUPPLEMENT_ABBRS = {
40
+ "corrigendum" => "Cor",
41
+ "amendment" => "Amd",
42
+ }.freeze
43
+
44
+ MEETING_ABBR = "Meeting"
45
+
46
+ # Mirrors `year_digits` in the shared parser rules.
47
+ YEAR_PATTERN = /\A(?:19|20)\d{2}\z/
48
+
49
+ # A language segment is one or more comma-joined ISO codes.
50
+ LANGUAGES_PATTERN = /\A[a-z]{2}(?:,[a-z]{2})*\z/
51
+
52
+ # Language codes back to the single-letter form the identifier prints;
53
+ # the builder maps the other way when parsing "(E)" / "(E/F)".
54
+ LANGUAGE_LETTERS = Pubid::Builder::Base::LANG_CHAR_MAP.invert.freeze
55
+
13
56
  def parse_urn(urn)
14
- body = strip_namespace(urn)
15
- parts = split_parts(body)
16
- number, year = parts
17
- text = "JCGM #{number}"
18
- text += ":#{year}" if year
19
- flavor_parse(text)
57
+ parts = split_parts(strip_namespace(urn))
58
+ return parse_meeting_urn(parts) if parts.first == MEETING_MARKER
59
+
60
+ parse_document_urn(parts)
61
+ end
62
+
63
+ private
64
+
65
+ # urn:jcgm:meeting:<number>[:<year>] -> Identifiers::Meeting
66
+ #
67
+ # The reconstruction must agree with a parsed identifier attribute for
68
+ # attribute, so `typed_stage` comes from the same registry lookup
69
+ # `Builder#locate_typed_stage` uses. (The attribute default now agrees
70
+ # too — it no longer sets `original_abbr` — so this mirrors the builder
71
+ # for clarity rather than out of necessity.)
72
+ def parse_meeting_urn(parts)
73
+ _, number, year = parts
74
+
75
+ Identifiers::Meeting.new(
76
+ number: meeting_number(number),
77
+ date: urn_date(year),
78
+ typed_stage: Jcgm.locate_stage(MEETING_ABBR),
79
+ )
80
+ end
81
+
82
+ # A guide, a GUM guide, or a supplement wrapping one of those. The
83
+ # supplement marker splits the segments: everything before it describes
84
+ # the base document, everything after is the supplement's own number and
85
+ # date.
86
+ def parse_document_urn(parts)
87
+ marker_at = parts.index { |segment| SUPPLEMENT_ABBRS.key?(segment) }
88
+ return build_document(parts) unless marker_at
89
+
90
+ build_supplement(
91
+ parts[marker_at],
92
+ build_document(parts[0...marker_at]),
93
+ parts[(marker_at + 1)..] || [],
94
+ )
95
+ end
96
+
97
+ # The class comes from the same registry the builder uses, so a URN and a
98
+ # parsed reference resolve to one class and one typed_stage.
99
+ def build_supplement(marker, base, tail)
100
+ typed_stage = Jcgm.locate_stage(SUPPLEMENT_ABBRS.fetch(marker))
101
+ number, year = tail
102
+
103
+ Jcgm.locate_type(typed_stage.type_code).new(
104
+ base: base,
105
+ number: (number.nil? || number.empty? ? nil : number.to_s),
106
+ date: urn_date(year),
107
+ typed_stage: typed_stage,
108
+ )
109
+ end
110
+
111
+ # <number>[:<year>][:<languages>] — the number segment carries the
112
+ # "gum." prefix for a GUM guide, which is what selects the class.
113
+ #
114
+ # Guide and GumGuide deliberately take their `typed_stage` from the
115
+ # attribute default: the grammar emits no type token for them, so
116
+ # `Builder#build` fills it from `published_typed_stage` too, and both
117
+ # paths agree.
118
+ def build_document(parts)
119
+ number, *rest = parts
120
+ require_number!(number)
121
+ gum = number.start_with?(GUM_PREFIX)
122
+
123
+ (gum ? Identifiers::GumGuide : Identifiers::Guide).new(
124
+ number: (gum ? number.delete_prefix(GUM_PREFIX) : number).to_s,
125
+ date: urn_date(segment_matching(rest, YEAR_PATTERN)),
126
+ languages: urn_languages(segment_matching(rest, LANGUAGES_PATTERN)),
127
+ )
128
+ end
129
+
130
+ def require_number!(segment)
131
+ return unless segment.nil? || segment.empty?
132
+
133
+ raise Pubid::UrnParser::Errors::ParseError,
134
+ "JCGM URN has no document number"
135
+ end
136
+
137
+ def segment_matching(segments, pattern)
138
+ segments.find { |segment| segment.match?(pattern) }
139
+ end
140
+
141
+ # The ordinal, normalized the way `Identifiers::Meeting.ordinal` does it
142
+ # (`number.to_i`), so "011" reads back as "11" and a missing or
143
+ # non-numeric segment as "0" — the behaviour of the previous
144
+ # render-and-re-parse implementation.
145
+ def meeting_number(segment)
146
+ segment.to_i.to_s
147
+ end
148
+
149
+ # nil for an absent year; a Date for a well-formed one. The grammar
150
+ # accepts only a 19xx/20xx year, so anything else is a malformed URN and
151
+ # must still be rejected now that no re-parse validates it.
152
+ def urn_date(segment)
153
+ return nil if segment.nil? || segment.empty?
154
+
155
+ unless segment.match?(YEAR_PATTERN)
156
+ raise Pubid::UrnParser::Errors::ParseError,
157
+ "Invalid year in JCGM URN: #{segment.inspect}"
158
+ end
159
+
160
+ Pubid::Components::Date.new(year: segment)
161
+ end
162
+
163
+ # "en" -> (E), "en,fr" -> (E/F). `original_code` is what the renderer
164
+ # prints, so it is restored from the code rather than left nil.
165
+ def urn_languages(segment)
166
+ return nil if segment.nil? || segment.empty?
167
+
168
+ segment.split(",").map do |code|
169
+ Pubid::Components::Language.new(
170
+ code: code,
171
+ original_code: LANGUAGE_LETTERS.fetch(code, code),
172
+ )
173
+ end
20
174
  end
21
175
  end
22
176
  end
data/lib/pubid/jcgm.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module Jcgm
5
6
  extend Pubid::PrefixesSupport
@@ -22,6 +23,15 @@ module Pubid
22
23
  # @param identifier [String] the identifier string to parse
23
24
  # @return [Identifier] the parsed identifier
24
25
  def self.parse(identifier)
26
+ unless identifier.is_a?(String)
27
+ raise Pubid::Errors::InvalidInputError,
28
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
29
+ end
30
+
31
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
32
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
33
+ end
34
+
25
35
  parser = Parser.new
26
36
  builder = Builder.new
27
37
 
@@ -117,18 +117,77 @@ module Pubid
117
117
  render(format: :human, **opts)
118
118
  end
119
119
 
120
+ # JIS exposes its publisher as the `PUBLISHER` constant rather than the
121
+ # inherited `publisher` attribute, so the generic mr_publisher returns
122
+ # nil. Without this override every JIS id would lose its "JIS." prefix.
123
+ # Lowercased to match the all-lowercase MR convention.
124
+ def mr_publisher
125
+ PUBLISHER.downcase
126
+ end
127
+
128
+ # JIS stores its identity across `series` (division letter A–Z), `number`
129
+ # (string, may have leading zeros), and `parts` (multi-level). The
130
+ # generic mr_number_with_part only knows about `number`/`part`/`subpart`,
131
+ # so without these overrides every JIS id would collapse onto its
132
+ # document number and drop the division letter (issue #142).
133
+ # Lowercased to match the all-lowercase MR convention.
134
+ def mr_type
135
+ return nil unless respond_to?(:type_prefix)
136
+
137
+ type_prefix&.downcase
138
+ end
139
+
140
+ def mr_number_with_part
141
+ segments = []
142
+ segments << series.to_s.downcase if series
143
+ segments << number.to_s if number
144
+ parts&.each { |p| segments << p.to_s }
145
+ return nil if segments.empty?
146
+
147
+ segments.join("-")
148
+ end
149
+
150
+ # JIS stores the year as a bare integer (not a Components::Date), so the
151
+ # inherited mr_year (which reads `date`) returns nil. Emit it directly,
152
+ # including the reaffirmation marker so `JIS X:2019` and `JIS X:2019R`
153
+ # stay distinct in MR.
154
+ def mr_year
155
+ return nil unless year
156
+
157
+ year_with_reaffirmation.to_s
158
+ end
159
+
160
+ def mr_languages
161
+ return nil unless language
162
+
163
+ "(#{language})"
164
+ end
165
+
166
+ def mr_all_parts
167
+ return nil unless all_parts?
168
+
169
+ "all-parts"
170
+ end
171
+
120
172
  # from_hash is the shared polymorphic dispatch on Pubid::Identifier.
121
173
  # JIS_TYPE_MAP remains as the key_value polymorphic_map.
122
174
 
123
175
  # Parse a JIS identifier string into an identifier object
124
176
  # @param identifier [String] The JIS identifier string to parse
125
177
  # @return [Identifier] The appropriate identifier object
126
- # @raise [RuntimeError] If parsing fails
178
+ # @raise [Pubid::Errors::ParseError] If parsing fails
127
179
  def self.parse(identifier)
180
+ unless identifier.is_a?(String)
181
+ raise Pubid::Errors::InvalidInputError,
182
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
183
+ end
184
+
185
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
186
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
187
+ end
188
+
128
189
  parsed = Parser.parse(identifier)
129
190
  Builder.build(parsed)
130
- rescue Parslet::ParseFailed => e
131
- raise "Failed to parse JIS identifier '#{identifier}': #{e.message}"
132
191
  end
133
192
  end
134
193
  end
@@ -4,7 +4,7 @@ require "parslet"
4
4
 
5
5
  module Pubid
6
6
  module Jis
7
- class Parser < Parslet::Parser
7
+ class Parser < ::Pubid::Parser::Grammar
8
8
  # Japanese character normalization
9
9
  rule(:jp_dash) { str("ー") } # Full-width dash
10
10
  rule(:jp_space) { str(" ") } # Full-width space
data/lib/pubid/jis.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module Jis
5
6
  extend Pubid::PrefixesSupport
@@ -22,7 +22,7 @@ module Pubid
22
22
 
23
23
  # Build an identifier object from parsed data
24
24
  # @param parsed [Hash, Array] the parsed identifier data
25
- # @return [Identifiers::Base] the constructed identifier object
25
+ # @return [Identifier] the constructed identifier object
26
26
  def build(parsed)
27
27
  # Parslet can return array of hashes - merge them
28
28
  parsed_hash = parsed.is_a?(Array) ? flatten_array(parsed) : parsed
@@ -287,8 +287,6 @@ module Pubid
287
287
 
288
288
  identifier.number = Components::Code.new(value: "#{first_num.value}-#{number_part}")
289
289
  identifier.edition = edition_obj
290
- identifier.edition_component = edition_obj
291
- identifier.revision = "r#{edition_id}"
292
290
  # CS Emergency pattern: e104-43 -> number=104, edition_year=1943
293
291
  # Logic: e104-43 means "emergency 104 from 1943" (43 = 1943)
294
292
  elsif first_num.value.to_s.match?(/^e(\d{3})$/) &&
@@ -304,7 +302,6 @@ module Pubid
304
302
 
305
303
  identifier.number = Components::Code.new(value: number_part)
306
304
  identifier.edition = edition_obj
307
- identifier.edition_component = edition_obj
308
305
  elsif first_num.value.to_s.match?(/^(\d+)e(\d+)$/) &&
309
306
  second_num.value.to_s.match?(/^\d{2,4}$/)
310
307
  # Pattern: "11e2-1915" OR "123e2-50" parsed as first="11e2"|"123e2", second="1915"|"50"
@@ -326,7 +323,6 @@ module Pubid
326
323
  edition_obj = Components::Edition.new(type: "e",
327
324
  id: edition_id, additional_text: year_part)
328
325
  identifier.edition = edition_obj
329
- identifier.edition_component = edition_obj
330
326
  elsif first_num.value.to_s.match?(/^(\d+)supp?$/) &&
331
327
  second_num.value.to_s.match?(/^\d{4}$/)
332
328
  # Pattern: "25supp-1924" parsed as first="25supp", second="1924"
@@ -351,7 +347,6 @@ module Pubid
351
347
  identifier.number = first_num
352
348
  edition_obj = Components::Edition.new(type: "e",
353
349
  id: second_num.value.to_s)
354
- identifier.edition_component = edition_obj
355
350
  identifier.edition = edition_obj
356
351
  identifier.edition_year = second_num.value.to_s
357
352
  elsif part_num && series.part_num_as_component?
@@ -379,11 +374,34 @@ module Pubid
379
374
  id: extracted_revision.to_s)
380
375
  end
381
376
 
377
+ # Expose the SP subseries (Appendix A.2 of the NIST PubID Syntax) as
378
+ # a queryable attribute. For "NIST SP 800-53" the subseries is "800"
379
+ # (first_num) and the sequence is "53" (already folded into number).
380
+ # Pure metadata extraction — number is left intact so existing
381
+ # rendering and indexing stay byte-identical.
382
+ if identifier.is_a?(Identifiers::SpecialPublication) &&
383
+ first_num && identifier.respond_to?(:subseries=)
384
+ first_str = first_num.value.to_s
385
+ subseries_code =
386
+ if Identifiers::SpecialPublication::SP_SUBSERIES.include?(first_str)
387
+ first_str
388
+ elsif (m = first_str.match(/\A(\d+GB)\b/)) &&
389
+ Identifiers::SpecialPublication::SP_SUBSERIES.include?(m[1])
390
+ # Parser emits "1190GB-12" as a single first_number token; strip
391
+ # the suffix to surface the bare "1190GB" subseries code.
392
+ m[1]
393
+ end
394
+ if subseries_code
395
+ identifier.subseries =
396
+ Components::Code.new(value: subseries_code)
397
+ end
398
+ end
399
+
382
400
  # Series-specific post-processing (e.g., IR reverses the "84e2946"
383
401
  # form that preprocessing produced back to "84-2946").
384
402
  series.finalize_identifier(identifier, parsed_hash)
385
403
 
386
- # publisher_was_parsed defaults to true (see Identifiers::Base), so only
404
+ # publisher_was_parsed defaults to true (see Identifier), so only
387
405
  # the prefix-less case needs recording: assign false when no publisher
388
406
  # was parsed/extracted, and leave it unset (default true, omitted from
389
407
  # to_hash) when one was. Keeps the common publisher-bearing id lean.
@@ -437,11 +455,13 @@ module Pubid
437
455
  component = Components::Supplement.new
438
456
  # Split the fused "Jun1925"/"Jun1926" strings into isolated start/end
439
457
  # month+year nodes (start reuses :month/:year, end uses *_end).
440
- if range_start && (m = range_start.match(/\A([A-Za-z]{3,9})(\d{4})\z/))
458
+ # Each end is either a fused "Jun1925" (month+year) or a bare "1925"
459
+ # (year-only range, no month).
460
+ if range_start && (m = range_start.match(/\A([A-Za-z]{3,9})?(\d{4})\z/))
441
461
  component.month = m[1]
442
462
  component.year = m[2]
443
463
  end
444
- if range_end && (m = range_end.match(/\A([A-Za-z]{3,9})(\d{4})\z/))
464
+ if range_end && (m = range_end.match(/\A([A-Za-z]{3,9})?(\d{4})\z/))
445
465
  component.month_end = m[1]
446
466
  component.year_end = m[2]
447
467
  end