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
@@ -7,8 +7,13 @@ module Pubid
7
7
  # Represents corrections to published standards
8
8
  # Example: IEEE Std 535-2013/Cor. 1-2017
9
9
  class Corrigendum < SupplementIdentifier
10
- attribute :cor_number, :string
11
- attribute :cor_year, :string
10
+ # The corrigendum's own ordinal (`number`) and `year` — uniform names,
11
+ # not `cor_number`/`cor_year`. `number` is a plain string redefining the
12
+ # inherited Components::Code (leaf-safe, like the standards); `year` is
13
+ # the inherited base :string. `root.number` still returns the *base*
14
+ # document number, so the index key is unaffected.
15
+ attribute :number, :string
16
+ # `year` inherited from the base.
12
17
 
13
18
  # TYPED_STAGES for corrigendum
14
19
  # Corrigendum uses "Cor" abbreviation
@@ -19,6 +24,16 @@ module Pubid
19
24
  stage_code: "published",
20
25
  ),
21
26
  ].freeze
27
+
28
+ # MR supplement suffix: `cor.{number}.{year}` (e.g. "/cor.1.2017").
29
+ # The MrString renderer recurses into `base` and appends this so the
30
+ # full IEEE corrigendum round-trips losslessly (issue #142).
31
+ def mr_supplement_suffix
32
+ segments = ["cor"]
33
+ segments << number.to_s if number
34
+ segments << year.to_s if year
35
+ segments.join(".")
36
+ end
22
37
  end
23
38
  end
24
39
  end
@@ -6,11 +6,32 @@ module Pubid
6
6
  # CSA dual published identifier
7
7
  # Represents IEEE/CSA dual published standards
8
8
  # Example: IEEE Std 844.1-2017/CSA C22.2 No. 293.1-17
9
- class CsaDualPublished < Base
10
- attribute :ieee_identifier, Base
9
+ class CsaDualPublished < Identifier
10
+ attribute :ieee_identifier, Identifier
11
11
  # CSA identifier is stored as-is (not a Lutaml model type)
12
12
  attr_accessor :csa_identifier
13
13
 
14
+ # `csa_identifier` is a real constructor parameter even though it is
15
+ # not a lutaml attribute, so the unknown-key contract must let it
16
+ # through — and the constructor must actually assign it.
17
+ def self.extra_init_keys
18
+ super + %i[csa_identifier]
19
+ end
20
+
21
+ # Walk to the IEEE designation for the relaton-index key: this wrapper
22
+ # names one document by an IEEE and a CSA number and holds neither
23
+ # itself, so `root.number` was "".
24
+ def root
25
+ ieee_identifier ? ieee_identifier.root : self
26
+ end
27
+
28
+ # Carry the number onto the URN and the MR slug as well as #root — see
29
+ # AdoptedStandard#code_obj. `#code` below delegates already, but the
30
+ # URN generator and the MR renderer both read `code_obj`.
31
+ def code_obj
32
+ ieee_identifier&.code_obj
33
+ end
34
+
14
35
  # Delegate common attributes to ieee_identifier
15
36
  def publisher
16
37
  ieee_identifier.publisher
@@ -33,7 +54,7 @@ module Pubid
33
54
  end
34
55
 
35
56
  def self.parse(string)
36
- Base.parse(string)
57
+ Identifier.parse(string)
37
58
  end
38
59
  end
39
60
  end
@@ -5,9 +5,9 @@ module Pubid
5
5
  module Identifiers
6
6
  # Dual Identifier - wraps two identifiers connected with "and"
7
7
  # Example: "ANSI C37.61-1973 and IEEE Std 321-1973"
8
- class DualIdentifier < Base
9
- attribute :first_identifier, Base, polymorphic: true
10
- attribute :second_identifier, Base, polymorphic: true
8
+ class DualIdentifier < Identifier
9
+ attribute :first_identifier, Identifier, polymorphic: true
10
+ attribute :second_identifier, Identifier, polymorphic: true
11
11
  end
12
12
  end
13
13
  end
@@ -7,17 +7,72 @@ module Pubid
7
7
  # Document jointly published by two organizations
8
8
  # Example: "ANSI C37.61-1973 and IEEE Std 321-1973"
9
9
  # This means the document was published together by both organizations
10
- class DualPublished < Base
10
+ class DualPublished < Identifier
11
11
  # First organization's identifier
12
- attribute :first_identifier, Base, polymorphic: true
12
+ attribute :first_identifier, Identifier, polymorphic: true
13
13
 
14
14
  # Second organization's identifier
15
- attribute :second_identifier, Base, polymorphic: true
15
+ attribute :second_identifier, Identifier, polymorphic: true
16
16
 
17
17
  def publisher
18
18
  # Return array of both publishers
19
19
  [first_identifier&.publisher, second_identifier&.publisher].compact
20
20
  end
21
+
22
+ # `publisher` above is DERIVED from the two member identifiers (the
23
+ # serialized source of truth), so it must not be serialized itself.
24
+ # Emitting it breaks the canonical round-trip exactly as it did on
25
+ # Identifiers::AdoptedStandard and Identifiers::JointDevelopment: the
26
+ # derived value is default-omitted on the parse path (the attribute is
27
+ # unset), but re-emitted once from_hash materializes the attribute
28
+ # default, because the override then returns the members' publishers
29
+ # rather than the "IEEE" default. Worse here, it is an ARRAY, so the
30
+ # re-emitted value was the literal string `["IEEE", "IEEE"]`.
31
+ #
32
+ # This made all 25 DualPublished ids in the fixture corpus fail
33
+ # `from_hash(to_hash) == to_hash` — the gate relaton's index build
34
+ # uses, which SKIPS a document that fails it. Dropping the key is
35
+ # lossless: first_identifier and second_identifier rebuild it.
36
+ #
37
+ # A top-level to_hash delete is sufficient because DualPublished is
38
+ # only ever a top-level wrapper, never a nested `base` (where lutaml's
39
+ # own transform would bypass this override).
40
+ def to_hash(*args)
41
+ hash = super
42
+ hash.delete("publisher") if hash.is_a?(::Hash)
43
+ hash
44
+ end
45
+
46
+ # A dual-published document is one document under two designations, and
47
+ # this wrapper carries neither number itself — so `root.number`, the key
48
+ # relaton-index sorts and bsearches on, was "". Walk to the first
49
+ # designation, which is the one the printed reference leads with.
50
+ def root
51
+ first_identifier ? first_identifier.root : self
52
+ end
53
+
54
+ # Carry the number onto the URN and the MR slug as well as #root — see
55
+ # AdoptedStandard#code_obj for why all three surfaces need it.
56
+ def code_obj
57
+ first_identifier&.code_obj
58
+ end
59
+
60
+ # See AdoptedStandard#mr_year — without it the 1989 and the 1993
61
+ # printings of "IEEE Std 960 and IEEE Std 1177" shared one slug.
62
+ def mr_year
63
+ (year || first_identifier&.year)&.to_s
64
+ end
65
+
66
+ # `#publisher` above returns an ARRAY, and the inherited `mr_publisher`
67
+ # is `publisher&.to_s&.downcase` — so the MR slug contained a literal
68
+ # Ruby array (`["ieee", "asme"]`, brackets, quotes, comma and space
69
+ # included) and `to_slug` is an output FILENAME. Join the two instead,
70
+ # keeping both publishers in the slug: they are equally part of this
71
+ # document's identity, so by the project rule both must reach it.
72
+ def mr_publisher
73
+ names = Array(publisher).map { |p| p.to_s.downcase }.reject(&:empty?)
74
+ names.empty? ? nil : names.join("-")
75
+ end
21
76
  end
22
77
  end
23
78
  end
@@ -3,15 +3,112 @@
3
3
  module Pubid
4
4
  module Ieee
5
5
  module Identifiers
6
- # IEC/IEEE Copublished Identifier - represents standards copublished by IEC and IEEE
6
+ # IEC/IEEE Copublished Identifier - standards copublished by IEC and IEEE.
7
7
  # Example: "IEC/IEEE 60079-30-2/D5 IEC:2013 (10/07)"
8
- class IecIeeeCopublished < Base
9
- attribute :iec_identifier, Base, polymorphic: true
10
- attribute :ieee_identifier, Base, polymorphic: true
11
- attribute :copublished_number, :string # The shared number like "60079-30-2"
8
+ #
9
+ # The printed IEC/IEEE number is stored as split index columns rather than
10
+ # a verbatim string: `number` (bare-digit narrowing key), `parts` (matched
11
+ # within the bucket), `separators` (per-part `.`/`-`, since a single code
12
+ # mixes them, e.g. `60076.57-1202`), and the trailing publication `year`
13
+ # (inherited from the base; attached with `year_sep`, always `-` in
14
+ # practice). The verbatim `copublished_number` is reconstructed from these
15
+ # for rendering — see #copublished_number — so it is NOT serialized.
16
+ class IecIeeeCopublished < Identifier
17
+ attribute :number, :string
18
+ attribute :parts, :string, collection: true, default: -> { [] }
19
+ attribute :separators, :string, collection: true, default: -> { [] }
20
+ attribute :year_sep, :string, default: -> { "-" }
21
+ # `year` is inherited from the base (:string).
22
+
23
+ attribute :iec_identifier, Identifier, polymorphic: true
24
+ attribute :ieee_identifier, Identifier, polymorphic: true
12
25
  attribute :draft_info, :string # Draft information like "/D5"
13
26
  attribute :iec_year, :string # IEC year like "2013"
14
27
  attribute :date_info, :string # Date information like "(10/07)"
28
+
29
+ # The printed IEC/IEEE number, rebuilt losslessly from the split
30
+ # columns (the renderer/urn read this). Not stored — number/parts/
31
+ # separators/year fully describe it, so the verbatim string never
32
+ # bloats an index row.
33
+ # @param mark [String] IEEE trademark symbol, spliced in after the
34
+ # number and its parts and before the publication year (IEEE prints
35
+ # it there); "" for the ordinary, unmarked rendering.
36
+ def copublished_number(mark = "")
37
+ return nil if number.to_s.empty?
38
+
39
+ code = marked_code(mark)
40
+ code += "#{year_sep}#{year}" if year
41
+ code
42
+ end
43
+
44
+ # The dotted/dashed parts portion, each part with its own separator.
45
+ def parts_suffix
46
+ separators.zip(parts).map { |sep, part| "#{sep}#{part}" }.join
47
+ end
48
+
49
+ # A stage word printed ahead of the number (`FDIS 60079-30-2`,
50
+ # `CD2 P62704-5 ED1`, `TS P61869-105 ED1`). The lookahead — the next
51
+ # token must start like a document number — is what stops this eating a
52
+ # number that merely begins with a letter.
53
+ STAGE_PREFIX = /\A[A-Z]+\d*\s+(?=P?\d)/
54
+
55
+ # Inside the number token, the printed code stops early at:
56
+ #
57
+ # * a colon-attached publication year (`62582-2:2022`);
58
+ # * a dash/dot-attached 19xx/20xx year (`62395.1-2024 Redline`) — only
59
+ # one a descriptive tail stranded inside the code gets here, since
60
+ # #peel_copublished_year moves a genuinely trailing year into the
61
+ # `year` attribute. The 19/20 prefix keeps a part that merely looks
62
+ # like a year (`60076.57-1202`) from matching;
63
+ # * a glued parenthetical (`62704-1(E)`), which is a language marker
64
+ # rather than part of the number.
65
+ CODE_END = /:\d{4}|[-.](?:19|20)\d{2}\z|\(/
66
+
67
+ # `number` + #parts_suffix with the mark spliced at the end of the code
68
+ # proper.
69
+ #
70
+ # Some copublished references carry an edition, a colon year, a stage
71
+ # word or a "- Redline" tail that the parser keeps inside
72
+ # `number`/`parts` rather than in dedicated attributes; appending the
73
+ # mark after all of it would print
74
+ # `IEC/IEEE 60076-16 Edition 2.0 2018-09™` instead of
75
+ # `IEC/IEEE 60076-16™ Edition 2.0 2018-09`. Scanning the whole printed
76
+ # code (not just the suffix) matters because the split point varies —
77
+ # `60802 Edition 1` lands in `number`, `-16 Edition 2` in `parts`.
78
+ #
79
+ # With the flag off `mark` is "" and this returns the code unchanged, so
80
+ # the plain rendering is byte-identical by construction.
81
+ def marked_code(mark)
82
+ code = "#{number}#{parts_suffix}"
83
+ return code if mark.to_s.empty?
84
+
85
+ at = code_end_index(code)
86
+ "#{code[0...at]}#{mark}#{code[at..]}"
87
+ end
88
+
89
+ # Index at which the printed code ends and descriptive text begins.
90
+ #
91
+ # The number is the first whitespace-delimited token after any stage
92
+ # word, so the code can never run past that token's end — which is what
93
+ # keeps the mark off a trailing edition/date phrase even when no
94
+ # CODE_END boundary matches inside the token.
95
+ def code_end_index(code)
96
+ start = code[STAGE_PREFIX]&.length || 0
97
+ token_end = code.index(" ", start) || code.length
98
+ boundary = code[start...token_end].index(CODE_END)
99
+ boundary ? start + boundary : token_end
100
+ end
101
+
102
+ # The base IEEE #exclude already nils year/month/day; also reset the
103
+ # year separator (a format sibling of the scalar year, per the CSA
104
+ # lesson) so a date-less reference matches a `:`-dated form too.
105
+ def exclude(*args)
106
+ result = super
107
+ if args.intersect?(%i[year date]) && result.respond_to?(:year_sep=)
108
+ result.year_sep = "-"
109
+ end
110
+ result
111
+ end
15
112
  end
16
113
  end
17
114
  end
@@ -7,7 +7,31 @@ module Pubid
7
7
  # Represents an interpretation sheet or clarification
8
8
  # Example: IEEE Std 1076/INT-1991, IEEE Std 1003.1-1988/INT
9
9
  class InterpretationIdentifier < SupplementIdentifier
10
- attribute :int_year, :string
10
+ # Uniform `year` (the interpretation year), not `int_year` — inherited
11
+ # from the base, so no attribute is declared here.
12
+
13
+ # The interpreted standard's code must reach the URN. Before this
14
+ # change the flat-parsed form kept its number in the wrapper's own
15
+ # `code_obj` (the builder never built a base), so the URN carried it by
16
+ # accident; now that the number lives on `base` where it belongs, the
17
+ # URN generator has to be pointed at it or the URN silently loses the
18
+ # document number. `code_obj` is a plain attr_accessor, not a lutaml
19
+ # attribute, so overriding it as a method is safe.
20
+ def code_obj
21
+ super || base&.code_obj
22
+ end
23
+
24
+ # MR supplement suffix: `int.{year}` — mirrors Corrigendum/Amendment.
25
+ # Without it the MrString renderer slugs an interpretation FLAT off
26
+ # attributes a supplement does not have, instead of recursing into
27
+ # `base`, so every interpretation of every standard collapsed onto
28
+ # "ieee.std.{year}" with no document number at all — and `to_slug` is
29
+ # an output FILENAME.
30
+ def mr_supplement_suffix
31
+ segments = ["int"]
32
+ segments << year.to_s if year
33
+ segments.join(".")
34
+ end
11
35
 
12
36
  # TYPED_STAGES for interpretation
13
37
  # Interpretation uses "INT" abbreviation
@@ -29,18 +29,27 @@ module Pubid
29
29
  # - "P" prefix means IEEE project (any stage)
30
30
  # - ISO stages and IEEE drafts can coexist but are not equivalent
31
31
  # - Format conversion preserves semantic meaning within each system
32
- class JointDevelopment < Base
32
+ class JointDevelopment < Identifier
33
+ # Split index columns (number/prefix/parts/separator) instead of a
34
+ # `code` string, like every IEEE leaf — see CodeNumber. Rendering reads
35
+ # `code` (base #code → code_obj), which CodeNumber rebuilds from the
36
+ # split fields, so to_ieee_format / to_iso_format are unaffected.
37
+ include CodeNumber
38
+
33
39
  attribute :publishers, :string, collection: true
34
40
  attribute :lead_party, :string # "IEEE", "ISO", "IEC", etc.
35
- attribute :code, :string
36
41
  attribute :typed_stage, Components::TypedStage
37
42
  attribute :year, :string
38
43
  attribute :iso_stage, :string # For ISO stage if present
39
44
  attribute :ieee_draft, :string # For IEEE P/D notation if present
40
45
 
41
- def initialize(**args)
46
+ # Accepts keyword args or a single positional hash (the base
47
+ # #exclude/matching rebuild passes the latter) — see
48
+ # Identifier#initialize.
49
+ def initialize(args = {}, **kwargs)
50
+ args = args.merge(kwargs) unless kwargs.empty?
42
51
  # Call super FIRST to initialize Lutaml::Model attributes
43
- super
52
+ super(args)
44
53
 
45
54
  # Then handle typed_stage
46
55
  if args[:typed_stage].is_a?(Components::TypedStage)
@@ -82,16 +91,30 @@ module Pubid
82
91
  # JointDevelopment has its own dual-format logic (IEEE vs ISO)
83
92
  # that doesn't go through the format registry renderer.
84
93
  # @param format [Symbol] :ieee or :iso (defaults to canonical_format)
94
+ # @param trademark [Boolean] append the IEEE trademark symbol (™/®)
85
95
  # @return [String] formatted identifier
86
- def to_s(format: canonical_format)
87
- case format
88
- when :iso
89
- to_iso_format
90
- when :ieee
91
- to_ieee_format
92
- else
93
- to_ieee_format
94
- end
96
+ # `**_opts` absorbs render flags this list does not name (`annotated:`),
97
+ # which the closed keyword list used to reject outright.
98
+ def to_s(format: canonical_format, trademark: false, **opts)
99
+ # The mark goes after the code number, before the draft and the year
100
+ # ("ISO/IEC/IEEE P26511™/D8-2018"), so it is threaded into the
101
+ # format builders rather than appended to the finished string.
102
+ mark = if trademark
103
+ Pubid::Ieee.trademark_symbol_for(code&.number,
104
+ code&.prefix,
105
+ publishers: publishers)
106
+ else
107
+ ""
108
+ end
109
+
110
+ result = case format
111
+ when :iso
112
+ to_iso_format(mark)
113
+ else
114
+ to_ieee_format(mark)
115
+ end
116
+
117
+ annotate_plain_render(result, **opts)
95
118
  end
96
119
 
97
120
  private
@@ -99,7 +122,7 @@ module Pubid
99
122
  # Convert to ISO format representation
100
123
  # ISO/IEC/IEEE FDIS 26511:2018
101
124
  # @return [String] ISO format string
102
- def to_iso_format
125
+ def to_iso_format(mark = "")
103
126
  parts = []
104
127
 
105
128
  # Publishers (slash-separated)
@@ -117,6 +140,7 @@ module Pubid
117
140
 
118
141
  # Code (NO P prefix in ISO format, NO draft notation)
119
142
  code_str = code.to_s.gsub(/^P/, "")
143
+ code_str += mark unless code_str.empty?
120
144
  parts << code_str if code_str && !code_str.empty?
121
145
 
122
146
  # Join with space and add year with colon
@@ -129,7 +153,7 @@ module Pubid
129
153
  # Convert to IEEE format representation
130
154
  # ISO/IEC/IEEE P26511/D8-2018
131
155
  # @return [String] IEEE format string
132
- def to_ieee_format
156
+ def to_ieee_format(mark = "")
133
157
  parts = []
134
158
 
135
159
  # Publishers (slash-separated)
@@ -143,6 +167,9 @@ module Pubid
143
167
  code_str = "P#{code_str}"
144
168
  end
145
169
 
170
+ # Mark after the number, before the draft and the year
171
+ code_str += mark unless code_str.empty?
172
+
146
173
  # Add IEEE draft notation if available (e.g., /D8)
147
174
  if ieee_draft
148
175
  code_str += "/#{ieee_draft}"
@@ -159,6 +186,12 @@ module Pubid
159
186
  result
160
187
  end
161
188
 
189
+ # Public again: these override base accessors and MUST be public — lutaml
190
+ # serialization calls `public_send(:publisher)`, so leaving them under the
191
+ # `private` above made JointDevelopment#to_hash raise (it could not be
192
+ # serialized or round-tripped / indexed at all).
193
+ public
194
+
162
195
  # Override to ensure proper publisher handling
163
196
  def publisher
164
197
  publishers&.first || super
@@ -168,6 +201,22 @@ module Pubid
168
201
  def copublisher
169
202
  publishers&.drop(1) || super
170
203
  end
204
+
205
+ # `publisher`/`copublisher` are *derived* from `publishers` (the source
206
+ # of truth, which IS serialized). Emitting them too breaks the canonical
207
+ # round-trip: the derived `publisher` is default-omitted on the parse
208
+ # path but re-emitted after from_hash (the override returns
209
+ # publishers.first, not the default). Drop both — publishers rebuilds
210
+ # them. (JointDevelopment is a top-level root, never nested, so a
211
+ # to_hash-level drop is sufficient.)
212
+ def to_hash(*args)
213
+ hash = super
214
+ if hash.is_a?(::Hash)
215
+ hash.delete("publisher")
216
+ hash.delete("copublisher")
217
+ end
218
+ hash
219
+ end
171
220
  end
172
221
  end
173
222
  end
@@ -8,13 +8,42 @@ module Pubid
8
8
  # Examples:
9
9
  # - "IEEE Std 1299/C62.22.1-1996" (same document, two numbers)
10
10
  # - "IEEE Std 960-1989, Std 1177-1989" (same document, two numbers)
11
- class MultiNumberedIdentifier < Base
12
- # Primary identifier (main IEEE standard number)
13
- # Stored as-is (Lutaml model type checking doesn't work with polymorphic identifiers)
14
- attr_accessor :primary_identifier
11
+ class MultiNumberedIdentifier < Identifier
12
+ # Both designations are real lutaml attributes.
13
+ #
14
+ # They used to be `attr_accessor`s, which lutaml cannot see — so
15
+ # `to_hash` emitted {"_type" => "pubid:ieee:multi-numbered-identifier"}
16
+ # and NOTHING else, `from_hash` could not rebuild either member, and
17
+ # `#exclude` (which iterates self.class.attributes) skipped them. The
18
+ # whole identity was dropped. That is the CSA container defect recorded
19
+ # in CLAUDE.md, and the fix is the same: make the members attributes.
20
+ #
21
+ # The type is the CROSS-FLAVOR ::Pubid::Identifier, not IEEE's own:
22
+ # `polymorphic: true` widens only to subclasses, and the second
23
+ # designation may belong to another body — the same reason
24
+ # AdoptedStandard's members carry that type.
25
+ attribute :primary_identifier, ::Pubid::Identifier, polymorphic: true
26
+ attribute :secondary_identifier, ::Pubid::Identifier, polymorphic: true
15
27
 
16
- # Secondary identifier (additional number for same document)
17
- attr_accessor :secondary_identifier
28
+ # One document under two numbers, neither of them held here, so
29
+ # `root.number` was "". Walk to the primary designation.
30
+ def root
31
+ primary_identifier ? primary_identifier.root : self
32
+ end
33
+
34
+ # Carry the number onto the URN and the MR slug as well as #root — see
35
+ # AdoptedStandard#code_obj.
36
+ def code_obj
37
+ primary_identifier&.code_obj
38
+ end
39
+
40
+ # See AdoptedStandard#mr_year. `year` below already delegates, so this
41
+ # only stringifies — it is kept explicit so the hook survives if that
42
+ # delegation is ever removed in favour of the URN generator's
43
+ # `year_component` root fallback.
44
+ def mr_year
45
+ year&.to_s
46
+ end
18
47
 
19
48
  def publisher
20
49
  primary_identifier&.publisher
@@ -27,6 +56,29 @@ module Pubid
27
56
  def year
28
57
  primary_identifier&.year
29
58
  end
59
+
60
+ # `publisher` and `year` are DERIVED from primary_identifier — and,
61
+ # since that member became a serialized attribute above, the derived
62
+ # values are now re-emitted after from_hash materializes the attribute
63
+ # defaults, while the parse path omits them as unset. That asymmetry
64
+ # breaks `from_hash(to_hash) == to_hash`, the gate relaton's index
65
+ # build uses to decide whether to keep a document.
66
+ #
67
+ # It is latent rather than live for the one corpus id (its primary is
68
+ # IEEE-published with no year, so both derived values match their
69
+ # defaults and are dropped anyway), but the class documents that its
70
+ # members may belong to another body — and a synthetic AIEE primary
71
+ # reproduces it immediately. Dropping the keys is lossless:
72
+ # primary_identifier rebuilds both. Same treatment as
73
+ # AdoptedStandard#to_hash and DualPublished#to_hash.
74
+ def to_hash(*args)
75
+ hash = super
76
+ return hash unless hash.is_a?(::Hash)
77
+
78
+ hash.delete("publisher")
79
+ hash.delete("year")
80
+ hash
81
+ end
30
82
  end
31
83
  end
32
84
  end