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
@@ -5,14 +5,44 @@ require "lutaml/model"
5
5
  module Pubid
6
6
  module Cie
7
7
  module Identifiers
8
- # Bundle identifier for CIE
9
- # Handles comma-separated supplement lists
8
+ # Bundle identifier for CIE: a comma-separated list of sibling documents,
9
+ # each a full CIE identifier (typically a Supplement).
10
10
  # Example: CIE 198-SP1.1:2011,198-SP1.2:2011,198-SP1.3:2011,198-SP1.4:2011
11
+ #
12
+ # A CIE bundle is the parts of one supplement of one standard, so its
13
+ # members share a base document. That shared +base+ is hoisted to the
14
+ # bundle and the +ids+ carry only what differs (supplement number/part);
15
+ # #root walks +base+ to the origin standard for the relaton-index key.
16
+ # (Defensive: if members ever don't share a base, each id keeps its own
17
+ # and +base+ is nil — see Builder#build_bundle.)
11
18
  class Bundle < SingleIdentifier
12
- attribute :identifiers_string, :string # Store as string for now
19
+ attribute :base, Identifier, polymorphic: true
20
+ attribute :ids, Identifier, polymorphic: true, collection: true
13
21
 
14
- def to_s
15
- identifiers_string || ""
22
+ # The origin document: the shared base's root, else the first member's.
23
+ def root
24
+ (base || ids&.first)&.root || self
25
+ end
26
+
27
+ # The printed form writes the publisher once: the first member keeps its
28
+ # "CIE " prefix, the rest are bare. A base-less member is re-based onto
29
+ # the bundle's shared base for rendering.
30
+ def to_s(**opts)
31
+ return "" unless ids&.any?
32
+
33
+ result = ids.each_with_index.map do |id, i|
34
+ member = id.base ? id : rebased(id)
35
+ i.zero? ? member.to_s : member.to_s.delete_prefix("CIE ")
36
+ end.join(",")
37
+
38
+ annotate_plain_render(result, **opts)
39
+ end
40
+
41
+ private
42
+
43
+ # Attach the bundle's shared base to a base-less member for rendering.
44
+ def rebased(id)
45
+ Supplement.new(base: base, number: id.number, part: id.part)
16
46
  end
17
47
  end
18
48
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Cie
5
+ module Identifiers
6
+ # Shared document-code attributes + rendering for the CIE identifier
7
+ # types that carry a code (Standard, Identical, JointPublished,
8
+ # DualPublished).
9
+ #
10
+ # The code fields live *flat* on the identifier (no nested
11
+ # Components::Code), so the serialized hash stays compact:
12
+ # {style:, year:, ..., number: "018", iteration: "2"}
13
+ # rather than nesting them under a code: {number:, iteration:, style:}.
14
+ #
15
+ # +code.style+ is intentionally gone: it always equalled the identifier's
16
+ # own +style+ (the builder set both from one value), so #code_string reads
17
+ # the identifier's +style+ directly for the part-separator fallback.
18
+ module CodeAttributes
19
+ def self.included(base)
20
+ base.class_eval do
21
+ attribute :number, :string # "018", "170", "11664"
22
+ attribute :part, :string # "1", "2", "4"
23
+ attribute :iteration, :string # "2" in "018.2"
24
+ attribute :part_separator, :string # "slash" | "dash" (original sep)
25
+ end
26
+ end
27
+
28
+ # Render the code portion: "018.2", "170-1", "19/2.1", "11664-1".
29
+ # Uses +part_separator+ when set, otherwise falls back to the
30
+ # identifier's +style+ (legacy -> "/", current -> "-").
31
+ def code_string
32
+ return nil unless number
33
+
34
+ result = number.dup
35
+ if part && iteration
36
+ result += "/#{part}.#{iteration}"
37
+ elsif iteration
38
+ result += ".#{iteration}"
39
+ elsif part
40
+ separator = case part_separator
41
+ when "slash" then "/"
42
+ when "dash" then "-"
43
+ else style == "current" ? "-" : "/"
44
+ end
45
+ result += "#{separator}#{part}"
46
+ end
47
+ result
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -9,22 +9,27 @@ module Pubid
9
9
  # Handles x-prefix conference proceedings
10
10
  # Example: CIE x038:2013, CIE x038:2013 Amendment 1
11
11
  class Conference < SingleIdentifier
12
- attribute :conference_number, :string
12
+ # :string overrides the base ::Pubid::Identifier Components::Code type.
13
+ attribute :number, :string
13
14
  attribute :amendment_number, :string
15
+ # Techstreet opaque /slug variant (no default -> round-trips cleanly)
16
+ attribute :variant, :string
14
17
 
15
- def to_s
16
- result = "CIE x#{conference_number}"
18
+ def to_s(**opts)
19
+ result = "CIE x#{number}"
17
20
 
18
21
  # Date with separator
19
22
  if year
20
- separator = date_separator == "colon" ? ":" : "-"
21
- result += "#{separator}#{year}"
23
+ result += "#{date_sep_char}#{year}"
22
24
  end
23
25
 
24
26
  # Amendment if present
25
27
  result += " Amendment #{amendment_number}" if amendment_number
26
28
 
27
- result
29
+ # Opaque /slug variant if present
30
+ result += "/#{variant}" if variant
31
+
32
+ annotate_plain_render(result, **opts)
28
33
  end
29
34
  end
30
35
  end
@@ -5,34 +5,28 @@ require "lutaml/model"
5
5
  module Pubid
6
6
  module Cie
7
7
  module Identifiers
8
- # Corrigendum identifier for CIE
9
- # Handles /CorN notation with recursive base parsing
8
+ # Corrigendum identifier for CIE (/CorN notation).
9
+ # Wraps a nested base — a Standard, or a Supplement when the
10
+ # corrigendum applies to a supplement (CIE 198-SP1.4:2011/Cor1:2013).
11
+ # The "/CorN:year" is a clean trailing suffix on the base's rendering.
10
12
  # Examples: CIE 232:2019/Cor1:2020, CIE 198-SP1.4:2011/Cor1:2013
11
13
  class Corrigendum < SupplementIdentifier
12
- attribute :base_number, :string
13
- attribute :base_year, :string
14
- attribute :base_supplement, :string # If base is a supplement
15
- attribute :base_supplement_part, :string # Part of supplement
16
- attribute :cor_number, :string
17
- attribute :cor_year, :string
14
+ # +number+ (the "/CorN" ordinal) is inherited from SupplementIdentifier.
15
+ # The corrigendum's own year — SupplementIdentifier descends from the
16
+ # base Identifier (not SingleIdentifier), so there is no inherited year.
17
+ attribute :year, :string
18
18
 
19
- def to_s
20
- # Build base identifier string
21
- result = "CIE #{base_number}"
22
-
23
- # Add supplement notation if base is a supplement
24
- if base_supplement
25
- result += "-SP#{base_supplement}"
26
- result += ".#{base_supplement_part}" if base_supplement_part
27
- end
28
-
29
- # Add base year with colon
30
- result += ":#{base_year}" if base_year
19
+ # Uniform supplement interface (shared with Supplement).
20
+ def supplement_type
21
+ :corrigendum
22
+ end
31
23
 
32
- # Add corrigendum with slash and colon
33
- result += "/Cor#{cor_number}:#{cor_year}"
24
+ def supplement_year
25
+ year
26
+ end
34
27
 
35
- result
28
+ def to_s(**opts)
29
+ annotate_plain_render("#{base}/Cor#{number}:#{year}", **opts)
36
30
  end
37
31
  end
38
32
  end
@@ -9,31 +9,31 @@ module Pubid
9
9
  # Represents CIE/IEC dual published standards
10
10
  # Example: CIE S 009:2002/IEC 62471:2006
11
11
  class DualPublished < SingleIdentifier
12
+ include CodeAttributes # flat number/part/iteration/part_separator + #code_string
13
+
12
14
  attribute :s_prefix, :boolean, default: -> { false }
13
- attribute :code, Components::Code
14
15
  attribute :iec_identifier, :string # IEC portion as string
15
16
 
16
- def to_s
17
+ def to_s(**opts)
17
18
  parts = ["CIE"]
18
19
 
19
20
  # S prefix
20
21
  parts << "S" if s_prefix
21
22
 
22
23
  # Code
23
- parts << code.to_s if code
24
+ parts << code_string if number
24
25
 
25
26
  result = parts.join(" ")
26
27
 
27
28
  # Date
28
29
  if year
29
- separator = date_separator == "colon" ? ":" : "-"
30
- result += "#{separator}#{year}"
30
+ result += "#{date_sep_char}#{year}"
31
31
  end
32
32
 
33
33
  # IEC portion with slash separator
34
34
  result += "/IEC #{iec_identifier}" if iec_identifier
35
35
 
36
- result
36
+ annotate_plain_render(result, **opts)
37
37
  end
38
38
  end
39
39
  end
@@ -12,24 +12,25 @@ module Pubid
12
12
  # CIE S 014-4/E2007 - part with dash + language
13
13
  # CIE S 008/E:2001 (ISO 8995-1:2002(E)) - language with colon year
14
14
  class Identical < SingleIdentifier
15
+ include CodeAttributes # flat number/part/iteration/part_separator + #code_string
16
+
15
17
  attribute :s_prefix, :boolean, default: -> { false }
16
- attribute :code, Components::Code
17
18
  attribute :language, Components::Language
18
19
  attribute :iso_reference, :string # The ISO identifier in parentheses
19
20
 
20
- def to_s
21
+ def to_s(**opts)
21
22
  parts = ["CIE"]
22
23
 
23
24
  # S prefix
24
25
  parts << "S" if s_prefix
25
26
 
26
27
  # Code
27
- parts << code.to_s if code
28
+ parts << code_string if number
28
29
 
29
30
  result = parts.join(" ")
30
31
 
31
32
  # Language + Year combined for slash formats before ISO reference
32
- if language && (language.format == "slash_colon" || (language.format == "slash" && year && date_separator != "slash"))
33
+ if language && (language.format == "slash_colon" || (language.format == "slash" && year && style != "slash"))
33
34
  # Render /E:YYYY or /EYYYY (language with year, no separate date separator)
34
35
  result += if language.format == "slash_colon"
35
36
  "/#{language.code}:#{year}" # /E:2001
@@ -39,13 +40,12 @@ module Pubid
39
40
  elsif language && language.format == "slash"
40
41
  # Language without year: /E
41
42
  result += "/#{language.code}"
42
- elsif year && date_separator == "slash"
43
+ elsif year && style == "slash"
43
44
  # Legacy slash-year format without language: /1998
44
45
  result += "/#{year}"
45
46
  elsif year
46
- # Standard date with separator (colon or dash)
47
- separator = date_separator == "colon" ? ":" : "-"
48
- result += "#{separator}#{year}"
47
+ # Standard date with separator derived from style
48
+ result += "#{date_sep_char}#{year}"
49
49
  end
50
50
 
51
51
  # Language (parenthetical) after date
@@ -56,7 +56,7 @@ module Pubid
56
56
  # ISO reference in parentheses
57
57
  result += " (ISO #{iso_reference})" if iso_reference
58
58
 
59
- result
59
+ annotate_plain_render(result, **opts)
60
60
  end
61
61
  end
62
62
  end
@@ -8,13 +8,14 @@ module Pubid
8
8
  # Joint published identifier for CIE
9
9
  # Handles CIE ISO, CIE IEC, CIE ISO/CIE patterns
10
10
  class JointPublished < SingleIdentifier
11
+ include CodeAttributes # flat number/part/iteration/part_separator + #code_string
12
+
11
13
  attribute :copublisher, :string # "ISO", "IEC", or "ISO/CIE"
12
- attribute :code, Components::Code
13
14
  attribute :language, Components::Language
14
15
  attribute :doc_type, :string # "TR" for Technical Report
15
16
  attribute :stage, :string # "DIS" for draft stage
16
17
 
17
- def to_s
18
+ def to_s(**opts)
18
19
  parts = ["CIE", copublisher]
19
20
 
20
21
  # Document type (TR)
@@ -24,27 +25,26 @@ module Pubid
24
25
  parts << stage if stage
25
26
 
26
27
  # Code (number-part) - special handling for IEC dot separator
27
- if code
28
- code_str = code.to_s
28
+ if number
29
+ code_str = code_string
29
30
  # For IEC copublisher, if code has a part, use dot not slash/dash
30
- if copublisher == "IEC" && code.part
31
- code_str = "#{code.number}.#{code.part}"
31
+ if copublisher == "IEC" && part
32
+ code_str = "#{number}.#{part}"
32
33
  end
33
34
  parts << code_str
34
35
  end
35
36
 
36
37
  result = parts.join(" ")
37
38
 
38
- # Date - use the actual captured separator
39
+ # Date - separator derived from style
39
40
  if year
40
- separator = date_separator == "colon" ? ":" : "-"
41
- result += "#{separator}#{year}"
41
+ result += "#{date_sep_char}#{year}"
42
42
  end
43
43
 
44
44
  # Language (always parenthetical for joint published)
45
45
  result += language.to_s if language
46
46
 
47
- result
47
+ annotate_plain_render(result, **opts)
48
48
  end
49
49
  end
50
50
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Cie
7
+ module Identifiers
8
+ # Proceedings paper identifier for CIE conference papers.
9
+ #
10
+ # Two surface forms share this type:
11
+ # x-prefixed (attached to a conference): "CIE x043-OP01"
12
+ # standalone (with a page range): "CIE OP02 1-5"
13
+ #
14
+ # The paper itself is the document, so its identity (code + running
15
+ # number, e.g. "OP01") is stored flat as +number+ for BOTH forms. This
16
+ # gives every proceedings row a non-empty relaton-index binary-search key
17
+ # (see index_number_spec). The x-form's parent conference lives in
18
+ # +conference+; the standalone form's +page+ range is its locality.
19
+ # No-default values so absent keys drop from to_hash (round-trip).
20
+ class Proceedings < SingleIdentifier
21
+ # The paper identity "OP01" / "P03". :string overrides the base
22
+ # ::Pubid::Identifier Components::Code type.
23
+ attribute :number, :string
24
+ # The parent conference "043" (x-form only; nil for standalone).
25
+ attribute :conference, :string
26
+ # Page range "1-5" (standalone form only).
27
+ attribute :page, :string
28
+
29
+ def to_s(**opts)
30
+ result = if conference
31
+ "CIE x#{conference}-#{number}"
32
+ else
33
+ "CIE #{number} #{page}"
34
+ end
35
+
36
+ annotate_plain_render(result, **opts)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -8,22 +8,52 @@ module Pubid
8
8
  # Standard identifier for CIE
9
9
  # Handles both legacy (pre-2001) and current (2001+) styles
10
10
  class Standard < SingleIdentifier
11
+ include CodeAttributes # flat number/part/iteration/part_separator + #code_string
12
+
11
13
  attribute :s_prefix, :boolean, default: -> { false }
12
- attribute :code, Components::Code
14
+ # D-series marker (CIE D001-2006). Boolean default false so it is
15
+ # canonicalized away for every non-D standard (round-trip contract).
16
+ attribute :d_prefix, :boolean, default: -> { false }
13
17
  attribute :language, Components::Language
14
18
  attribute :stage, :string # DIS, DS
15
19
 
16
- def to_s
20
+ def to_s(**opts)
21
+ annotate_plain_render(render_plain, **opts)
22
+ end
23
+
24
+ # CIE Standard distinguishes S-prefixed standards (`CIE S 017`) from
25
+ # plain (`CIE 015`), D-prefixed (`CIE D001`), and DIS-staged. The
26
+ # generic mr_type looks at typed_stage, which CIE doesn't use, so
27
+ # without this override the `S`/`D`/stage marker would be lost in MR.
28
+ def mr_type
29
+ return stage.downcase if stage
30
+ return "d" if d_prefix
31
+ return "s" if s_prefix
32
+
33
+ nil
34
+ end
35
+
36
+ private
37
+
38
+ # The plain composition, extracted verbatim from `to_s`. It has two
39
+ # early returns (the slash_colon language form and the legacy
40
+ # bare slash-year form), and `to_s` needs a single exit to wrap.
41
+ def render_plain
17
42
  parts = ["CIE"]
18
43
 
19
44
  # Stage (DIS/DS) before code if present
20
45
  parts << stage if stage
21
46
 
22
- # S prefix
23
- parts << "S" if s_prefix
47
+ if d_prefix
48
+ # D-series: the D is attached to the code (no space): CIE D001
49
+ parts << "D#{code_string}"
50
+ else
51
+ # S prefix
52
+ parts << "S" if s_prefix
24
53
 
25
- # Code
26
- parts << code.to_s if code
54
+ # Code
55
+ parts << code_string if number
56
+ end
27
57
 
28
58
  # Build initial result from parts
29
59
  result = parts.join(" ")
@@ -39,10 +69,15 @@ module Pubid
39
69
  return result # Year already added
40
70
  end
41
71
 
72
+ # Bare slash-year (legacy, no language): CIE S 007/1998
73
+ if year && style == "slash"
74
+ result += "/#{year}"
75
+ return result
76
+ end
77
+
42
78
  # Date with separator (for non-slash-colon formats)
43
79
  if year
44
- separator = date_separator == "colon" ? ":" : "-"
45
- result += "#{separator}#{year}"
80
+ result += "#{date_sep_char}#{year}"
46
81
  end
47
82
 
48
83
  # Language (parenthetical formats) - comes after date
@@ -5,39 +5,41 @@ require "lutaml/model"
5
5
  module Pubid
6
6
  module Cie
7
7
  module Identifiers
8
- # Supplement identifier for CIE
9
- # Handles -SPN and -SPN.P notation with recursive base parsing
8
+ # Supplement identifier for CIE (-SPN / -SPN.P notation).
9
+ # Wraps a nested base (the base Standard); the "-SPN" is
10
+ # inserted after the base number, so to_s renders from the base's parts.
10
11
  # Examples: CIE 121-SP1:2009, CIE 198-SP1.4:2011, CIE DIS 025-SP1/E:2019
11
12
  class Supplement < SupplementIdentifier
12
- attribute :base_number, :string
13
- attribute :supplement_number, :string # "1", "2"
14
- attribute :supplement_part, :string # "1" in "SP1.1", "4" in "SP1.4"
15
- attribute :year, :string
16
- attribute :stage, :string # "DIS", "DS"
17
- attribute :language, Components::Language
18
-
19
- def to_s
20
- parts = ["CIE"]
13
+ # +number+ (the "-SPN" ordinal) is inherited from SupplementIdentifier.
14
+ attribute :part, :string # "1" in "SP1.1", "4" in "SP1.4"
21
15
 
22
- # Stage if present (DIS/DS)
23
- parts << stage if stage
16
+ # Uniform supplement interface (shared with Corrigendum).
17
+ def supplement_type
18
+ :supplement
19
+ end
24
20
 
25
- # Build base number and supplement
26
- result = parts.join(" ")
27
- result += " #{base_number}-SP#{supplement_number}"
21
+ def supplement_year
22
+ base&.year
23
+ end
28
24
 
29
- # Add part if present (e.g., ".4" in "SP1.4")
30
- result += ".#{supplement_part}" if supplement_part
25
+ def to_s(**opts)
26
+ b = base
27
+ parts = ["CIE"]
28
+ parts << b.stage if b.respond_to?(:stage) && b.stage
31
29
 
32
- # Add language with slash if present (before year)
33
- if language && language.format == "slash_colon"
34
- result += "/#{language.code}"
35
- end
30
+ core = "#{b.number}-SP#{number}"
31
+ core += ".#{part}" if part
32
+ parts << core
33
+ result = parts.join(" ")
36
34
 
37
- # Add year with colon (supplements always use current style)
38
- result += ":#{year}" if year
35
+ # Language with slash (before year), e.g. "/E"
36
+ if b.language && b.language.format == "slash_colon"
37
+ result += "/#{b.language.code}"
38
+ end
39
39
 
40
- result
40
+ # Supplements always use the current (colon) style.
41
+ result += ":#{b.year}" if b.year
42
+ annotate_plain_render(result, **opts)
41
43
  end
42
44
  end
43
45
  end
@@ -8,11 +8,15 @@ module Pubid
8
8
  # Tutorial Bundle identifier for CIE
9
9
  # Special text-based identifier
10
10
  # Example: CIE Tutorials Bundle 1
11
+ #
12
+ # The ordinal ("1") is the bundle's own +number+ (also the relaton-index
13
+ # root key); there is no separate document, so no nested base.
11
14
  class TutorialBundle < SingleIdentifier
12
- attribute :bundle_number, :string
15
+ # :string overrides the base ::Pubid::Identifier Components::Code type.
16
+ attribute :number, :string
13
17
 
14
- def to_s
15
- "CIE Tutorials Bundle #{bundle_number}"
18
+ def to_s(**opts)
19
+ annotate_plain_render("CIE Tutorials Bundle #{number}", **opts)
16
20
  end
17
21
  end
18
22
  end
@@ -3,12 +3,14 @@
3
3
  module Pubid
4
4
  module Cie
5
5
  module Identifiers
6
+ autoload :CodeAttributes, "#{__dir__}/identifiers/code_attributes"
6
7
  autoload :Bundle, "#{__dir__}/identifiers/bundle"
7
8
  autoload :Conference, "#{__dir__}/identifiers/conference"
8
9
  autoload :Corrigendum, "#{__dir__}/identifiers/corrigendum"
9
10
  autoload :DualPublished, "#{__dir__}/identifiers/dual_published"
10
11
  autoload :Identical, "#{__dir__}/identifiers/identical"
11
12
  autoload :JointPublished, "#{__dir__}/identifiers/joint_published"
13
+ autoload :Proceedings, "#{__dir__}/identifiers/proceedings"
12
14
  autoload :Standard, "#{__dir__}/identifiers/standard"
13
15
  autoload :Supplement, "#{__dir__}/identifiers/supplement"
14
16
  autoload :TutorialBundle, "#{__dir__}/identifiers/tutorial_bundle"
@@ -6,7 +6,7 @@ module Pubid
6
6
  module Cie
7
7
  # Parser for CIE identifiers
8
8
  # Handles dual-style system (legacy vs current)
9
- class Parser < Parslet::Parser
9
+ class Parser < ::Pubid::Parser::Grammar
10
10
  # Basic building blocks
11
11
  rule(:space) { str(" ") }
12
12
  rule(:space?) { space.maybe }
@@ -135,9 +135,50 @@ module Pubid
135
135
  (str("FDIS") | str("DIS") | str("DS")) >> space
136
136
  end
137
137
 
138
- # Document type (TR for Technical Report)
138
+ # Document type (TR for Technical Report, TS for Technical Specification)
139
139
  rule(:doc_type) do
140
- str("TR") # Don't consume trailing space
140
+ (str("TR") | str("TS")) # Don't consume trailing space
141
+ end
142
+
143
+ # Proceedings paper code: 1+ uppercase letters (OP, PO, PP, WP, IP, P, ...)
144
+ # Deliberately generic (open set); greedy letters then digits.
145
+ rule(:paper_code) do
146
+ match("[A-Z]").repeat(1).as(:paper_code)
147
+ end
148
+
149
+ # Techstreet opaque conference variant: /<lowercase-alnum slug>
150
+ # Charset kept lowercase-alnum so it can't collide with the uppercase
151
+ # /E, /Cor, /IEC tails or the self.parse language gsub.
152
+ rule(:variant_slug) do
153
+ slash >> match("[0-9a-z]").repeat(1).as(:variant)
154
+ end
155
+
156
+ # Conference proceedings paper (x-prefixed): CIE x043-OP01
157
+ rule(:conf_proceedings) do
158
+ str("CIE") >> space >> str("x") >> digits.as(:conf_number) >>
159
+ dash >> paper_code >> digits.as(:paper_number)
160
+ end
161
+
162
+ # Standalone proceedings paper: CIE OP02 1-5
163
+ rule(:standalone_proceedings) do
164
+ str("CIE") >> space >> paper_code >> digits.as(:paper_number) >>
165
+ space >> (digits >> dash >> digits).as(:page_range)
166
+ end
167
+
168
+ # D-series: CIE D001-2006 / CIE D002:2004
169
+ rule(:d_series_identifier) do
170
+ str("CIE") >> space >> str("D").as(:d_prefix) >> digits.as(:number) >> date
171
+ end
172
+
173
+ # Standard with bare slash-year (no language letter): CIE S 007/1998
174
+ # Uses a narrow number(+iteration) pattern rather than the full code rule
175
+ # so code_with_part_slash doesn't greedily consume the /year.
176
+ rule(:standard_with_slash_year) do
177
+ str("CIE") >> space >>
178
+ stage_code.maybe.as(:stage) >>
179
+ s_prefix.maybe.as(:s_prefix) >>
180
+ (digits.as(:number) >> (dot >> digits.as(:iteration)).maybe) >>
181
+ slash >> year_digits.as(:slash_year)
141
182
  end
142
183
 
143
184
  # DIS stage with supplement pattern (e.g., DIS 025-SP1/E:2019)
@@ -157,12 +198,14 @@ module Pubid
157
198
  stage_code.maybe.as(:stage) >>
158
199
  s_prefix.maybe.as(:s_prefix) >>
159
200
  code >>
160
- # Language can come BEFORE date, AFTER date, or both
201
+ # Language can come BEFORE date, AFTER date, or both.
202
+ # The whole date group is optional so a bare "CIE 015" (no year)
203
+ # parses with year left nil (partial reference for relaton matching).
161
204
  (
162
205
  (language >> date).as(:lang_before) |
163
206
  (date >> language.maybe).as(:date_then_lang) |
164
207
  date
165
- )
208
+ ).maybe
166
209
  end
167
210
 
168
211
  # Standard identifier without ISO reference but with language-year (CIE S 014-4/E:2007)
@@ -181,7 +224,9 @@ module Pubid
181
224
  digits.as(:conf_number) >>
182
225
  date >>
183
226
  # Optional amendment
184
- (space >> str("Amendment") >> space >> digits.as(:amd_number)).maybe
227
+ (space >> str("Amendment") >> space >> digits.as(:amd_number)).maybe >>
228
+ # Optional techstreet opaque /slug variant
229
+ variant_slug.maybe
185
230
  end
186
231
 
187
232
  # Joint published with ISO
@@ -320,6 +365,10 @@ module Pubid
320
365
  corrigendum_identifier |
321
366
  supplement_identifier |
322
367
  standard_with_language_year |
368
+ standard_with_slash_year |
369
+ d_series_identifier |
370
+ conf_proceedings |
371
+ standalone_proceedings |
323
372
  legacy_code_with_year | # Before standard to catch 001-1980 pattern
324
373
  conference_identifier |
325
374
  standard_identifier