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
@@ -125,9 +125,11 @@ module Pubid
125
125
 
126
126
  def parse_date(value)
127
127
  value = value.to_s
128
- if value.match?(/^\d{4}(-\d{2})?$/)
129
- year, month = value.split("-")
130
- Pubid::Components::Date.new(year: year, month: month || nil)
128
+ if value.match?(/^\d{4}(-\d{2}){0,2}$/)
129
+ year, month, day = value.split("-")
130
+ Pubid::Components::Date.new(year: year,
131
+ month: month || nil,
132
+ day: day || nil)
131
133
  elsif value.is_a?(Integer) || (value.is_a?(String) && value.match?(/^\d{4}$/))
132
134
  Pubid::Components::Date.new(year: value)
133
135
  else
@@ -135,11 +137,14 @@ module Pubid
135
137
  end
136
138
  end
137
139
 
138
- # Splits a compound document number ("1234", "1234-1", "1234-1-2")
139
- # into number/part/subpart Code components. Flavor-specific dash/slash
140
- # normalization lives in +normalize_number_with_part+; legacy year
141
- # extraction (e.g. ISO "4037-1979") lives in +extract_legacy_year+.
142
- def parse_number_with_part(value, code_class:)
140
+ # Splits a compound document number ("1234", "1234-1", "1234-1-2") into
141
+ # number/part/subpart. Each piece is wrapped in +code_class+ when the
142
+ # flavor declares those attributes as a Components::Code (ISO), and kept
143
+ # as a plain string when +code_class+ is nil (IEC and the other retyped
144
+ # flavors). Flavor-specific dash/slash normalization lives in
145
+ # +normalize_number_with_part+; legacy year extraction (e.g. ISO
146
+ # "4037-1979") lives in +extract_legacy_year+.
147
+ def parse_number_with_part(value, code_class: nil)
143
148
  normalized = normalize_number_with_part(value)
144
149
  parts = normalized.split("-").reject(&:empty?)
145
150
  number = parts.shift
@@ -151,12 +156,19 @@ module Pubid
151
156
 
152
157
  part = convert_roman_to_integer(part) if part
153
158
 
154
- code_hash = { number: code_class.new(value: number) }
155
- code_hash[:part] = code_class.new(value: part) if part
156
- code_hash[:subpart] = code_class.new(value: subpart) if subpart
159
+ code_hash = { number: wrap_component(number, code_class) }
160
+ code_hash[:part] = wrap_component(part, code_class) if part
161
+ code_hash[:subpart] = wrap_component(subpart, code_class) if subpart
157
162
  code_hash
158
163
  end
159
164
 
165
+ # A nil +code_class+ means the flavor holds number/part/subpart as plain
166
+ # strings — the `number` retype tranches — so keep the raw scalar. ISO
167
+ # still passes its Components::Code and is unaffected.
168
+ def wrap_component(value, code_class)
169
+ code_class ? code_class.new(value: value) : value
170
+ end
171
+
160
172
  # Hook: normalize the raw number_with_part string before splitting.
161
173
  # Override in subclasses for flavor-specific dash/slash/space handling.
162
174
  def normalize_number_with_part(value)
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  # Identifier that represents a combined bundle of documents using the + operator.
5
6
  # Examples:
@@ -45,22 +46,27 @@ module Pubid
45
46
  base_document&.typed_stage
46
47
  end
47
48
 
49
+ # `**opts` carries render flags this method does not name — `annotated:`
50
+ # above all. Without it the closed keyword list raised
51
+ # `ArgumentError: unknown keyword: :annotated` for every bundled
52
+ # identifier, which is worse than a missing span: a wrapper is exactly the
53
+ # shape a consumer renders.
48
54
  def to_s(lang: :en, lang_single: false, with_edition: false, format: nil,
49
- stage_format_long: nil, with_date: nil)
55
+ stage_format_long: nil, with_date: nil, **opts)
50
56
  result = base_document.to_s(lang: lang, lang_single: lang_single,
51
- with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)
57
+ with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)
52
58
 
53
59
  supplements.each do |supplement|
54
60
  # ISO DirectivesSupplement always uses " + " (space before)
55
- # CEN-style supplements (AC, A) without base_identifier use "+" (no space before)
56
- # Other ISO supplements with base_identifier use " + " (space before)
61
+ # CEN-style supplements (AC, A) without base use "+" (no space before)
62
+ # Other ISO supplements with base use " + " (space before)
57
63
  if supplement.class.name&.include?("DirectivesSupplement") ||
58
- (supplement.class.attributes.key?(:base_identifier) && !supplement.base_identifier.nil?)
64
+ (supplement.class.attributes.key?(:base) && !supplement.base.nil?)
59
65
  result += " + #{supplement.to_s(lang: lang, lang_single: lang_single,
60
- with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)}"
66
+ with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)}"
61
67
  else
62
68
  result += "+#{supplement.to_s(lang: lang, lang_single: lang_single,
63
- with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)}"
69
+ with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)}"
64
70
  end
65
71
  end
66
72
 
@@ -102,9 +108,13 @@ stage_format_long: nil, with_date: nil)
102
108
  parts << supplement.date.year.to_s
103
109
  end
104
110
 
105
- # Add supplement number if present
111
+ # Add supplement number if present. `supplement` is polymorphic and
112
+ # `number` is a Components::Code on ::Pubid::Identifier but a plain
113
+ # :string in a growing number of flavors, so read through either.
106
114
  if supplement.number
107
- parts << "v#{supplement.number.value}"
115
+ number = supplement.number
116
+ value = number.respond_to?(:value) ? number.value : number
117
+ parts << "v#{value}"
108
118
  end
109
119
  end
110
120
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Calconnect
5
+ # Builds a CalConnect identifier object from a Parslet parse tree. There is
6
+ # a single concrete type (Identifiers::Standard), so no type dispatch.
7
+ class Builder
8
+ def self.build(parsed_data)
9
+ new.build(parsed_data)
10
+ end
11
+
12
+ def build(data)
13
+ Identifiers::Standard.new(
14
+ series: data[:series]&.to_s,
15
+ number: data[:number].to_s,
16
+ date: build_date(data),
17
+ )
18
+ end
19
+
20
+ private
21
+
22
+ # Publication date as a Pubid::Components::Date, or nil for a partial
23
+ # reference that omits the trailing ":YYYY" (relaton matches such refs by
24
+ # excluding the date). Digits are kept as strings verbatim (already
25
+ # zero-padded in the source, e.g. "07"/"23"); month/day are nil for the
26
+ # common year-only form.
27
+ def build_date(data)
28
+ return nil if data[:year].nil?
29
+
30
+ ::Pubid::Components::Date.new(
31
+ year: data[:year].to_s,
32
+ month: data[:month]&.to_s,
33
+ day: data[:day]&.to_s,
34
+ )
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Calconnect
5
+ # Base class for every CalConnect identifier AND the flavor's parse entry
6
+ # point — mirrors Pubid::Jis::Identifier. Concrete identifiers under
7
+ # Pubid::Calconnect::Identifiers descend from this class, so a parsed
8
+ # CalConnect id is an instance of Pubid::Calconnect::Identifier and
9
+ # relaton-index can pass this class as `pubid_class` for from_hash/to_hash.
10
+ class Identifier < ::Pubid::Identifier
11
+ # `number` is a CalConnect-specific plain string (preserves leading zeros
12
+ # like "0514" and the sub-part separator, "0812-1"/"0707.1"), so it
13
+ # overrides the inherited Components::Code type. The publication date uses
14
+ # the shared Pubid::Components::Date (inherited attribute): `year` is
15
+ # always present, `month`/`day` only for the rare full-date form
16
+ # ("CC/WD 51017:2024-07-23").
17
+ attribute :series, :string # Optional series letter/token (A, WD, DIR, …)
18
+ attribute :number, :string
19
+ attribute :date, ::Pubid::Components::Date
20
+
21
+ # Polymorphic type map for lutaml::Model key_value (de)serialization,
22
+ # mapping the concrete class's polymorphic_name to its class name so a
23
+ # stored hash rebuilds the correct identifier type via from_hash.
24
+ CALCONNECT_TYPE_MAP = {
25
+ "pubid:calconnect:standard" => "Pubid::Calconnect::Identifiers::Standard",
26
+ }.freeze
27
+
28
+ # The date serializes FLAT as year/month/day string keys (nils omitted),
29
+ # mirroring lib/pubid/iso/identifier.rb — not as a nested "date" object —
30
+ # so the index row stays a shallow hash and round-trips exactly.
31
+ key_value do
32
+ map "_type", to: :_type, polymorphic_map: CALCONNECT_TYPE_MAP
33
+ map "series", to: :series
34
+ map "number", to: :number
35
+ map "year", with: { to: :year_to_kv, from: :year_from_kv }
36
+ map "month", with: { to: :month_to_kv, from: :month_from_kv }
37
+ map "day", with: { to: :day_to_kv, from: :day_from_kv }
38
+ end
39
+
40
+ # Publisher is always "CC". A plain constant (not a `publisher` method) so
41
+ # it doesn't shadow the inherited lutaml `publisher` attribute, which
42
+ # would otherwise fail serialization type validation.
43
+ PUBLISHER = "CC"
44
+
45
+ attr_reader :with_publisher
46
+
47
+ # Render the publication date, e.g. "2018" or "2024-07-23". Shared by the
48
+ # renderer and the URN generator so they always agree.
49
+ # Pubid::Components::Date#to_s yields the year alone, or the zero-padded
50
+ # "YYYY-MM-DD" when month/day are present.
51
+ def date_string
52
+ date&.to_s
53
+ end
54
+
55
+ # Basic string representation. Delegates to the human renderer. The
56
+ # printed CalConnect id carries the "CC" publisher token by default; pass
57
+ # with_publisher: false to drop it (and the series slash).
58
+ def to_s(**opts)
59
+ render(format: :human, **opts)
60
+ end
61
+
62
+ # Capture the with_publisher flag on EVERY render call (default true), so
63
+ # it can never leak across calls. The base `render` only forwards
64
+ # `:with_edition` to the renderer, so the flag is threaded via this
65
+ # per-call instance write (the renderer reads `id.with_publisher`).
66
+ def render(format: :human, with_publisher: true, **opts)
67
+ @with_publisher = with_publisher
68
+ super(format: format, **opts)
69
+ end
70
+
71
+ # --- date serialized flat as year/month/day (mirrors ISO) ---
72
+ def year_to_kv(model, doc)
73
+ emit_date_part(doc, "year", model.date&.year)
74
+ end
75
+
76
+ def month_to_kv(model, doc)
77
+ emit_date_part(doc, "month", model.date&.month)
78
+ end
79
+
80
+ def day_to_kv(model, doc)
81
+ emit_date_part(doc, "day", model.date&.day)
82
+ end
83
+
84
+ def year_from_kv(model, value) = date_for(model).year = value.to_s
85
+ def month_from_kv(model, value) = date_for(model).month = value.to_s
86
+ def day_from_kv(model, value) = date_for(model).day = value.to_s
87
+
88
+ def emit_date_part(doc, key, val)
89
+ return if val.nil? || val.to_s.empty?
90
+
91
+ doc.add_child(Lutaml::KeyValue::DataModel::Element.new(key, val.to_s))
92
+ end
93
+
94
+ def date_for(model)
95
+ model.date ||= ::Pubid::Components::Date.new
96
+ end
97
+
98
+ # from_hash is the shared polymorphic dispatch on Pubid::Identifier.
99
+ # CALCONNECT_TYPE_MAP remains as the key_value polymorphic_map.
100
+
101
+ # Parse a CalConnect identifier string into an identifier object.
102
+ # @param identifier [String] The CalConnect identifier string to parse
103
+ # @return [Identifier] The appropriate identifier object
104
+ # @raise [Pubid::Errors::InvalidInputError]
105
+ # If the input exceeds the maximum length
106
+ # @raise [Pubid::Errors::ParseError] If parsing fails
107
+ def self.parse(identifier)
108
+ unless identifier.is_a?(String)
109
+ raise Pubid::Errors::InvalidInputError,
110
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
111
+ end
112
+
113
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
114
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
115
+ end
116
+
117
+ Builder.build(Parser.parse(identifier))
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Calconnect
5
+ module Identifiers
6
+ # The sole CalConnect document type. Its polymorphic_name resolves
7
+ # automatically to "pubid:calconnect:standard".
8
+ class Standard < Identifier
9
+ TYPED_STAGES = [
10
+ Pubid::Components::TypedStage.new(
11
+ code: :pubcc,
12
+ stage_code: :published,
13
+ type_code: :cc,
14
+ abbr: ["CC"],
15
+ name: "CalConnect Standard",
16
+ harmonized_stages: [],
17
+ ),
18
+ ].freeze
19
+
20
+ def self.type
21
+ { key: :cc,
22
+ web: :standard,
23
+ title: "CalConnect Standard",
24
+ short: "CC" }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Calconnect
5
+ module Identifiers
6
+ autoload :Standard, "#{__dir__}/identifiers/standard"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Calconnect
7
+ # Parslet grammar for CalConnect identifiers.
8
+ #
9
+ # Shape: CC[/<series>] <number>:<date>
10
+ # CC 18011:2018
11
+ # CC/DIR 10006:2019
12
+ # CC/Adv 0707.1:2007 (dot sub-part)
13
+ # CC/A 0812-1:2008 (dash sub-part)
14
+ # CC/WD 51017:2024-07-23 (full ISO date)
15
+ class Parser < ::Pubid::Parser::Grammar
16
+ rule(:digit) { match["0-9"] }
17
+ rule(:digits) { digit.repeat(1) }
18
+
19
+ # Publisher token
20
+ rule(:publisher) { str("CC") }
21
+
22
+ # Series token — an open [A-Za-z]+ set (A, WD, R, S, CD, DIR, Adv, FDS, …)
23
+ rule(:series) { match["A-Za-z"].repeat(1).as(:series) }
24
+
25
+ # Number — digits, preserving leading zeros, with at most one dot- or
26
+ # dash-delimited sub-part ("0707.1", "0812-1"). Kept as a string.
27
+ rule(:number) do
28
+ (digits >> ((str(".") | str("-")) >> digits).maybe).as(:number)
29
+ end
30
+
31
+ # Date after the colon: a year, optionally a full "YYYY-MM-DD". The colon
32
+ # hard-delimits number from date, and month+day only appear together, so
33
+ # the split is unambiguous.
34
+ rule(:date) do
35
+ digits.as(:year) >>
36
+ (str("-") >> digits.as(:month) >> str("-") >> digits.as(:day)).maybe
37
+ end
38
+
39
+ rule(:identifier) do
40
+ publisher >>
41
+ (str("/") >> series).maybe >>
42
+ str(" ") >>
43
+ number >>
44
+ (str(":") >> date).maybe
45
+ end
46
+
47
+ rule(:root) { identifier }
48
+
49
+ def self.parse(input)
50
+ new.parse(input)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Calconnect
5
+ # Human-readable renderer for CalConnect identifiers.
6
+ #
7
+ # Produces the canonical printed form, e.g.:
8
+ # "CC 18011:2018"
9
+ # "CC/DIR 10006:2019"
10
+ # "CC/WD 51017:2024-07-23"
11
+ # "DIR 10006:2019" (only when with_publisher: false)
12
+ #
13
+ # Registered as the `:human` format in the CalConnect format registry and
14
+ # invoked via `render(format: :human)`.
15
+ class Renderer < ::Pubid::Renderers::Base
16
+ PUBLISHER = "CC"
17
+
18
+ def render(**_opts)
19
+ id = @id
20
+ prefix = if with_publisher?(id)
21
+ id.series ? "#{PUBLISHER}/#{id.series} " : "#{PUBLISHER} "
22
+ else
23
+ id.series ? "#{id.series} " : ""
24
+ end
25
+ date = id.date_string
26
+ "#{prefix}#{id.number}#{":#{date}" if date}"
27
+ end
28
+
29
+ private
30
+
31
+ def with_publisher?(id)
32
+ id.respond_to?(:with_publisher) && id.with_publisher != false
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Calconnect
5
+ # Emits CalConnect URNs of the form
6
+ # urn:calconnect[:<series>]:<number>:<date>
7
+ # e.g. "urn:calconnect:DIR:10006:2019", "urn:calconnect:18011:2018",
8
+ # "urn:calconnect:WD:51017:2024-07-23".
9
+ #
10
+ # The series keeps its printed case (JIS keeps its code case likewise) so a
11
+ # URN reconstructs the human form losslessly — mirror in urn_parser.rb.
12
+ #
13
+ # NOTE: a *partial* (date-less) reference has NO round-trippable URN form.
14
+ # Both `series` and `date` are optional, and UrnParser reads the trailing
15
+ # segments positionally, so a date-less URN like "urn:calconnect:11001"
16
+ # (or "urn:calconnect:DIR:10006") is ambiguous with a series-less dated URN
17
+ # and does not parse back. Partial refs are matched by pubid `#exclude`,
18
+ # not by URN, so this generator simply omits the missing segment rather
19
+ # than emitting an empty ":" — callers must not rely on URN round-trip for
20
+ # a partial id.
21
+ class UrnGenerator < Pubid::UrnGenerator::Base
22
+ def generate
23
+ # series and date_string are nil for a series-less or partial
24
+ # (date-less) id; compact drops them so no empty ":" segment appears.
25
+ parts = [
26
+ "urn", "calconnect",
27
+ identifier.series, identifier.number.to_s, identifier.date_string
28
+ ]
29
+ parts.compact.join(":")
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Calconnect
5
+ # Parses CalConnect URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits: urn:calconnect[:<series>]:<number>:<date>
8
+ # urn:calconnect:18011:2018 → CC 18011:2018
9
+ # urn:calconnect:DIR:10006:2019 → CC/DIR 10006:2019
10
+ # urn:calconnect:WD:51017:2024-07-23 → CC/WD 51017:2024-07-23
11
+ #
12
+ # The date segment (year or full "YYYY-MM-DD") never contains a colon, so
13
+ # it is a single trailing part; the number precedes it, and an optional
14
+ # series precedes the number.
15
+ #
16
+ # This positional pop assumes a *dated* URN (the form UrnGenerator emits for
17
+ # a full id). A partial (date-less) reference has no round-trippable URN —
18
+ # see UrnGenerator — so this parser is only guaranteed for URNs produced
19
+ # from a full id; a date-less URN misaligns the pops and will not parse.
20
+ class UrnParser < Pubid::UrnParser::Base
21
+ def parse_urn(urn)
22
+ parts = split_parts(strip_namespace(urn))
23
+ date = parts.pop
24
+ number = parts.pop
25
+ series = parts.pop
26
+
27
+ text = +"CC"
28
+ text << "/#{series}" if series
29
+ text << " #{number}:#{date}"
30
+ flavor_parse(text)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pubid"
4
+ module Pubid
5
+ # CalConnect (The Calendaring and Scheduling Consortium) flavor.
6
+ #
7
+ # Parses/renders the "CC …" numbering, e.g. "CC 18011:2018",
8
+ # "CC/DIR 10006:2019", "CC/Adv 0707.1:2007". Modeled on Pubid::Jis: a single
9
+ # flat identifier type (Identifiers::Standard) with no supplement layer.
10
+ module Calconnect
11
+ extend Pubid::PrefixesSupport
12
+
13
+ # Sole CalConnect publisher/leading token. Series letters (A, WD, R, S, CD,
14
+ # DIR, Adv, FDS) follow "CC/" and never lead a reference, so they are
15
+ # excluded per the PrefixesSupport inclusion policy.
16
+ PREFIXES = ["CC"].freeze
17
+
18
+ autoload :Builder, "#{__dir__}/calconnect/builder"
19
+ autoload :Identifier, "#{__dir__}/calconnect/identifier"
20
+ autoload :Identifiers, "#{__dir__}/calconnect/identifiers"
21
+ autoload :Parser, "#{__dir__}/calconnect/parser"
22
+ autoload :Renderer, "#{__dir__}/calconnect/renderer"
23
+ autoload :UrnGenerator, "#{__dir__}/calconnect/urn_generator"
24
+ autoload :UrnParser, "#{__dir__}/calconnect/urn_parser"
25
+
26
+ # Parse a CalConnect identifier string
27
+ def self.parse(identifier)
28
+ unless identifier.is_a?(String)
29
+ raise Pubid::Errors::InvalidInputError,
30
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
31
+ end
32
+
33
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
34
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
35
+ end
36
+
37
+ Identifier.parse(identifier)
38
+ end
39
+
40
+ # Per-flavor format registry: inherits global formats, overrides :human
41
+ Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
42
+ Identifier.format_registry.register(:human, renderer: Calconnect::Renderer)
43
+
44
+ # Auto-discover all identifier types from the Identifiers namespace
45
+ # @return [Array<Class>] identifier classes that define a self.type Hash
46
+ def self.identifier_types
47
+ @identifier_types ||= Identifiers.constants
48
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
49
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
50
+ .select { |c| c.type.is_a?(Hash) }
51
+ end
52
+
53
+ # Build typed stage index from identifier types
54
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
55
+ def self.all_typed_stages
56
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
57
+ if klass.const_defined?(:TYPED_STAGES)
58
+ klass.const_get(:TYPED_STAGES)
59
+ else
60
+ []
61
+ end
62
+ end
63
+ end
64
+
65
+ # Lookup: type code -> identifier class
66
+ # @param code [String, Symbol] the type key to find
67
+ # @return [Class, nil] the matching identifier class
68
+ def self.locate_type(code)
69
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
70
+ end
71
+
72
+ # Lookup: abbreviation -> typed stage
73
+ # @param abbr [String, Symbol] the abbreviation to find
74
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
75
+ def self.locate_stage(abbr)
76
+ abbr_str = abbr.to_s.upcase
77
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
78
+ end
79
+ end
80
+ end
81
+
82
+ # Register CalConnect flavor with the registry
83
+ Pubid::Registry.register(:calconnect, Pubid::Calconnect)
@@ -47,7 +47,7 @@ module Pubid
47
47
  # If multiple corrigenda exist, we build the last one wrapping the base
48
48
  corr_numbers.reduce(base) do |current_base, cor_num|
49
49
  Identifiers::Corrigendum.new(
50
- base_identifier: current_base,
50
+ base: current_base,
51
51
  number: cor_num,
52
52
  )
53
53
  end
@@ -10,7 +10,7 @@ module Pubid
10
10
  #
11
11
  # Keeping the root abstract (it is never itself a serialized type, so it is
12
12
  # absent from CCSDS_TYPE_MAP) is what breaks the polymorphic recursion a
13
- # supplement's `base_identifier` would otherwise hit if it pointed at a
13
+ # supplement's `base` would otherwise hit if it pointed at a
14
14
  # concrete type that is also its own superclass.
15
15
  class Identifier < ::Pubid::Identifier
16
16
  # CCSDS stores every code component as a plain string (the Builder passes
@@ -54,12 +54,19 @@ module Pubid
54
54
 
55
55
  # Parse a CCSDS identifier string into the appropriate identifier object.
56
56
  def self.parse(identifier)
57
+ unless identifier.is_a?(String)
58
+ raise Pubid::Errors::InvalidInputError,
59
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
60
+ end
61
+
62
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
63
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
64
+ end
65
+
57
66
  # Apply legacy update_codes normalization first
58
67
  normalized = Core::UpdateCodes.apply(identifier, :ccsds)
59
68
  parsed = Pubid::Ccsds::Parser.parse(normalized)
60
69
  Pubid::Ccsds::Builder.build(parsed)
61
- rescue Parslet::ParseFailed => e
62
- raise "Failed to parse CCSDS identifier '#{identifier}': #{e.message}"
63
70
  end
64
71
 
65
72
  # from_hash is the shared polymorphic dispatch on Pubid::Identifier.
@@ -24,14 +24,16 @@ module Pubid
24
24
  { key: :base, web: :base, title: "Base Standard", short: nil }
25
25
  end
26
26
 
27
- def to_s(**_opts)
27
+ # Composes its string by hand rather than going through `render`, so
28
+ # the annotation hook has to be applied on the way out.
29
+ def to_s(**opts)
28
30
  result = "#{publisher} #{number}"
29
31
  result += ".#{part}" if part
30
32
  result += "-#{type}" if type
31
33
  result += "-#{edition}" if edition
32
34
  result += "-#{suffix}" if suffix
33
35
  result += " - #{language} Translated" if language
34
- result
36
+ annotate_plain_render(result, **opts)
35
37
  end
36
38
  end
37
39
  end
@@ -24,15 +24,15 @@ module Pubid
24
24
  # The corrigendum sequence number is stored in the inherited `number`
25
25
  # attribute (mirroring ISO), so it serializes via Base's key_value as
26
26
  # { _type, number: '1', base: {...} } with no corrigendum-specific map.
27
- def to_s
28
- base_str = base_identifier.to_s
29
- "#{base_str} Cor. #{number}"
27
+ def to_s(**opts)
28
+ base_str = base.to_s
29
+ annotate_plain_render("#{base_str} Cor. #{number}", **opts)
30
30
  end
31
31
 
32
32
  def ==(other)
33
33
  return false unless other.is_a?(Corrigendum)
34
34
 
35
- base_identifier == other.base_identifier && number == other.number
35
+ base == other.base && number == other.number
36
36
  end
37
37
  end
38
38
  end
@@ -4,7 +4,7 @@ require "parslet"
4
4
 
5
5
  module Pubid
6
6
  module Ccsds
7
- class Parser < Parslet::Parser
7
+ class Parser < ::Pubid::Parser::Grammar
8
8
  rule(:digit) { match["0-9"] }
9
9
  rule(:digits) { digit.repeat(1) }
10
10
  rule(:alnum) { match["A-Za-z0-9"] }
@@ -19,7 +19,7 @@ module Pubid
19
19
  attribute :type, Components::Type
20
20
  attribute :typed_stage, Components::TypedStage
21
21
 
22
- def to_s(lang: :en, lang_single: false)
22
+ def to_s(lang: :en, lang_single: false, **opts)
23
23
  result = ""
24
24
 
25
25
  # Publisher
@@ -47,7 +47,7 @@ module Pubid
47
47
  # Language (optional)
48
48
  result += " - #{language.code} Translated" if language
49
49
 
50
- result
50
+ annotate_plain_render(result, **opts)
51
51
  end
52
52
 
53
53
  def <=>(other)