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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (672) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +33 -11
  3. data/conformance/pending.yaml +4 -0
  4. data/data/bipm/update_codes.yaml +9 -0
  5. data/data/iec/update_codes.yaml +3 -0
  6. data/data/ieee/update_codes.yaml +107 -1
  7. data/{archived-gems/pubid-nist → data/nist}/series.yaml +34 -0
  8. data/data/nist/update_codes.yaml +8 -0
  9. data/lib/pubid/adobe/builder.rb +52 -0
  10. data/lib/pubid/adobe/identifier.rb +47 -0
  11. data/lib/pubid/adobe/identifiers/publication.rb +31 -0
  12. data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
  13. data/lib/pubid/adobe/identifiers.rb +10 -0
  14. data/lib/pubid/adobe/parser.rb +136 -0
  15. data/lib/pubid/adobe/renderer.rb +39 -0
  16. data/lib/pubid/adobe/urn_generator.rb +42 -0
  17. data/lib/pubid/adobe/urn_parser.rb +69 -0
  18. data/lib/pubid/adobe.rb +61 -0
  19. data/lib/pubid/amca/builder.rb +4 -4
  20. data/lib/pubid/amca/identifier.rb +1 -3
  21. data/lib/pubid/amca/identifiers/base.rb +50 -33
  22. data/lib/pubid/amca/identifiers/interpretation.rb +18 -10
  23. data/lib/pubid/amca/identifiers/publication.rb +14 -10
  24. data/lib/pubid/amca/identifiers/standard.rb +3 -1
  25. data/lib/pubid/amca/identifiers.rb +0 -1
  26. data/lib/pubid/amca/parser.rb +1 -1
  27. data/lib/pubid/amca/renderer.rb +4 -4
  28. data/lib/pubid/amca/single_identifier.rb +1 -1
  29. data/lib/pubid/amca/urn_generator.rb +2 -2
  30. data/lib/pubid/amca.rb +5 -4
  31. data/lib/pubid/ansi/builder.rb +2 -2
  32. data/lib/pubid/ansi/identifier.rb +18 -0
  33. data/lib/pubid/ansi/parser.rb +1 -1
  34. data/lib/pubid/ansi/renderer.rb +2 -2
  35. data/lib/pubid/ansi.rb +5 -5
  36. data/lib/pubid/api/builder.rb +16 -2
  37. data/lib/pubid/api/identifier.rb +25 -4
  38. data/lib/pubid/api/identifiers/mpms.rb +10 -8
  39. data/lib/pubid/api/parser.rb +1 -1
  40. data/lib/pubid/api/renderer.rb +16 -7
  41. data/lib/pubid/api/single_identifier.rb +5 -12
  42. data/lib/pubid/api.rb +1 -0
  43. data/lib/pubid/ashrae/builder.rb +53 -32
  44. data/lib/pubid/ashrae/identifier.rb +3 -4
  45. data/lib/pubid/ashrae/identifiers/addenda_package.rb +7 -1
  46. data/lib/pubid/ashrae/identifiers/addendum.rb +9 -1
  47. data/lib/pubid/ashrae/identifiers/base.rb +94 -12
  48. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +8 -1
  49. data/lib/pubid/ashrae/identifiers/errata.rb +9 -0
  50. data/lib/pubid/ashrae/identifiers/guideline.rb +3 -0
  51. data/lib/pubid/ashrae/identifiers/interpretation.rb +16 -0
  52. data/lib/pubid/ashrae/identifiers/standard.rb +3 -0
  53. data/lib/pubid/ashrae/identifiers.rb +0 -1
  54. data/lib/pubid/ashrae/parser.rb +37 -17
  55. data/lib/pubid/ashrae/renderer.rb +20 -20
  56. data/lib/pubid/ashrae/single_identifier.rb +1 -1
  57. data/lib/pubid/ashrae/supplement_identifier.rb +21 -6
  58. data/lib/pubid/ashrae/urn_generator.rb +8 -2
  59. data/lib/pubid/ashrae.rb +10 -4
  60. data/lib/pubid/asme/builder.rb +11 -2
  61. data/lib/pubid/asme/identifier.rb +9 -0
  62. data/lib/pubid/asme/identifiers/standard.rb +86 -2
  63. data/lib/pubid/asme/parser.rb +1 -1
  64. data/lib/pubid/asme/renderer.rb +3 -3
  65. data/lib/pubid/asme/single_identifier.rb +8 -1
  66. data/lib/pubid/asme/urn_generator.rb +2 -2
  67. data/lib/pubid/asme.rb +1 -0
  68. data/lib/pubid/astm/builder.rb +10 -3
  69. data/lib/pubid/astm/identifier.rb +9 -0
  70. data/lib/pubid/astm/identifiers/adjunct.rb +16 -1
  71. data/lib/pubid/astm/identifiers/code_number.rb +81 -0
  72. data/lib/pubid/astm/identifiers/data_series.rb +2 -0
  73. data/lib/pubid/astm/identifiers/iso_dual_published.rb +16 -0
  74. data/lib/pubid/astm/identifiers/manual.rb +10 -0
  75. data/lib/pubid/astm/identifiers/monograph.rb +2 -0
  76. data/lib/pubid/astm/identifiers/research_report.rb +10 -0
  77. data/lib/pubid/astm/identifiers/standard.rb +10 -0
  78. data/lib/pubid/astm/identifiers/technical_report.rb +2 -0
  79. data/lib/pubid/astm/identifiers/work_in_progress.rb +2 -0
  80. data/lib/pubid/astm/identifiers.rb +1 -0
  81. data/lib/pubid/astm/parser.rb +1 -1
  82. data/lib/pubid/astm/renderer.rb +1 -1
  83. data/lib/pubid/astm/single_identifier.rb +31 -1
  84. data/lib/pubid/astm/urn_generator.rb +7 -5
  85. data/lib/pubid/astm.rb +1 -0
  86. data/lib/pubid/bipm/builder.rb +163 -0
  87. data/lib/pubid/bipm/identifier.rb +285 -0
  88. data/lib/pubid/bipm/identifiers/committee_document.rb +36 -0
  89. data/lib/pubid/bipm/identifiers/guide.rb +35 -0
  90. data/lib/pubid/bipm/identifiers/meeting.rb +53 -0
  91. data/lib/pubid/bipm/identifiers/mep.rb +33 -0
  92. data/lib/pubid/bipm/identifiers/metrologia_article.rb +48 -0
  93. data/lib/pubid/bipm/identifiers/si_brochure.rb +33 -0
  94. data/lib/pubid/bipm/identifiers.rb +15 -0
  95. data/lib/pubid/bipm/parser.rb +237 -0
  96. data/lib/pubid/bipm/renderer.rb +118 -0
  97. data/lib/pubid/bipm/urn_generator.rb +58 -0
  98. data/lib/pubid/bipm/urn_parser.rb +60 -0
  99. data/lib/pubid/bipm.rb +92 -0
  100. data/lib/pubid/bsi/builder.rb +62 -52
  101. data/lib/pubid/bsi/identifier.rb +0 -1
  102. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
  103. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +36 -7
  104. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +7 -6
  105. data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
  106. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +0 -1
  107. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +10 -0
  108. data/lib/pubid/bsi/identifiers/committee_document.rb +10 -1
  109. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +6 -0
  110. data/lib/pubid/bsi/identifiers/corrigendum.rb +4 -4
  111. data/lib/pubid/bsi/identifiers/expert_commentary.rb +5 -5
  112. data/lib/pubid/bsi/identifiers/handbook.rb +0 -2
  113. data/lib/pubid/bsi/identifiers/practice_guide.rb +0 -1
  114. data/lib/pubid/bsi/identifiers/set.rb +11 -0
  115. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -1
  116. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -2
  117. data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
  118. data/lib/pubid/bsi/parser.rb +1 -1
  119. data/lib/pubid/bsi/renderer.rb +71 -59
  120. data/lib/pubid/bsi/single_identifier.rb +64 -7
  121. data/lib/pubid/bsi/urn_generator.rb +11 -2
  122. data/lib/pubid/bsi.rb +7 -1
  123. data/lib/pubid/builder/base.rb +23 -11
  124. data/lib/pubid/bundled_identifier.rb +19 -9
  125. data/lib/pubid/calconnect/builder.rb +38 -0
  126. data/lib/pubid/calconnect/identifier.rb +121 -0
  127. data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
  128. data/lib/pubid/calconnect/identifiers.rb +9 -0
  129. data/lib/pubid/calconnect/parser.rb +54 -0
  130. data/lib/pubid/calconnect/renderer.rb +36 -0
  131. data/lib/pubid/calconnect/urn_generator.rb +33 -0
  132. data/lib/pubid/calconnect/urn_parser.rb +34 -0
  133. data/lib/pubid/calconnect.rb +83 -0
  134. data/lib/pubid/ccsds/builder.rb +1 -1
  135. data/lib/pubid/ccsds/identifier.rb +10 -3
  136. data/lib/pubid/ccsds/identifiers/base.rb +4 -2
  137. data/lib/pubid/ccsds/identifiers/corrigendum.rb +4 -4
  138. data/lib/pubid/ccsds/parser.rb +1 -1
  139. data/lib/pubid/ccsds/single_identifier.rb +2 -2
  140. data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
  141. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  142. data/lib/pubid/ccsds.rb +1 -0
  143. data/lib/pubid/cen_cenelec/builder.rb +131 -72
  144. data/lib/pubid/cen_cenelec/identifier.rb +115 -3
  145. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +27 -16
  146. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +46 -6
  147. data/lib/pubid/cen_cenelec/identifiers/base.rb +8 -9
  148. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -1
  149. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -1
  150. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +1 -1
  151. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +29 -14
  152. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +47 -8
  153. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
  154. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +27 -2
  155. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -1
  156. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +15 -5
  157. data/lib/pubid/cen_cenelec/identifiers/guide.rb +1 -1
  158. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -1
  159. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -1
  160. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -1
  161. data/lib/pubid/cen_cenelec/parser.rb +1 -1
  162. data/lib/pubid/cen_cenelec/renderer.rb +55 -60
  163. data/lib/pubid/cen_cenelec/single_identifier.rb +20 -2
  164. data/lib/pubid/cen_cenelec/urn_generator.rb +66 -44
  165. data/lib/pubid/cen_cenelec.rb +104 -82
  166. data/lib/pubid/cie/builder.rb +149 -24
  167. data/lib/pubid/cie/identifier.rb +13 -4
  168. data/lib/pubid/cie/identifiers/bundle.rb +35 -5
  169. data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
  170. data/lib/pubid/cie/identifiers/conference.rb +11 -6
  171. data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
  172. data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
  173. data/lib/pubid/cie/identifiers/identical.rb +9 -9
  174. data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
  175. data/lib/pubid/cie/identifiers/proceedings.rb +41 -0
  176. data/lib/pubid/cie/identifiers/standard.rb +43 -8
  177. data/lib/pubid/cie/identifiers/supplement.rb +27 -25
  178. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +7 -3
  179. data/lib/pubid/cie/identifiers.rb +2 -0
  180. data/lib/pubid/cie/parser.rb +55 -6
  181. data/lib/pubid/cie/single_identifier.rb +40 -1
  182. data/lib/pubid/cie/supplement_identifier.rb +29 -16
  183. data/lib/pubid/cie/urn_generator.rb +11 -8
  184. data/lib/pubid/cie.rb +7 -2
  185. data/lib/pubid/components/date.rb +21 -5
  186. data/lib/pubid/conformance/checks.rb +72 -0
  187. data/lib/pubid/conformance/corpus/case.rb +55 -0
  188. data/lib/pubid/conformance/corpus.rb +36 -0
  189. data/lib/pubid/conformance/generator.rb +212 -0
  190. data/lib/pubid/conformance/pending.rb +63 -0
  191. data/lib/pubid/conformance/runner.rb +153 -0
  192. data/lib/pubid/conformance.rb +55 -0
  193. data/lib/pubid/core.rb +2 -0
  194. data/lib/pubid/csa/builder.rb +48 -48
  195. data/lib/pubid/csa/composite_identifier.rb +18 -7
  196. data/lib/pubid/csa/identifier.rb +187 -80
  197. data/lib/pubid/csa/identifiers/bundled.rb +25 -9
  198. data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
  199. data/lib/pubid/csa/identifiers/cec.rb +44 -4
  200. data/lib/pubid/csa/identifiers/combined.rb +97 -69
  201. data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
  202. data/lib/pubid/csa/identifiers/package.rb +4 -4
  203. data/lib/pubid/csa/parser.rb +12 -8
  204. data/lib/pubid/csa/renderer.rb +13 -5
  205. data/lib/pubid/csa/single_identifier.rb +93 -4
  206. data/lib/pubid/csa/urn_generator.rb +9 -2
  207. data/lib/pubid/csa/wrapper_identifier.rb +43 -10
  208. data/lib/pubid/csa.rb +7 -1
  209. data/lib/pubid/doi/builder.rb +18 -0
  210. data/lib/pubid/doi/identifier.rb +49 -0
  211. data/lib/pubid/doi/identifiers/resource.rb +30 -0
  212. data/lib/pubid/doi/identifiers.rb +9 -0
  213. data/lib/pubid/doi/parser.rb +52 -0
  214. data/lib/pubid/doi/renderer.rb +13 -0
  215. data/lib/pubid/doi.rb +56 -0
  216. data/lib/pubid/easc/builder.rb +55 -0
  217. data/lib/pubid/easc/identifier.rb +59 -0
  218. data/lib/pubid/easc/identifiers/pmg.rb +20 -0
  219. data/lib/pubid/easc/identifiers/rmg.rb +19 -0
  220. data/lib/pubid/easc/identifiers.rb +10 -0
  221. data/lib/pubid/easc/parser.rb +88 -0
  222. data/lib/pubid/easc/renderer.rb +48 -0
  223. data/lib/pubid/easc/urn_generator.rb +46 -0
  224. data/lib/pubid/easc/urn_parser.rb +57 -0
  225. data/lib/pubid/easc.rb +53 -0
  226. data/lib/pubid/ecma/builder.rb +45 -0
  227. data/lib/pubid/ecma/identifier.rb +147 -0
  228. data/lib/pubid/ecma/identifiers/memento.rb +30 -0
  229. data/lib/pubid/ecma/identifiers/standard.rb +31 -0
  230. data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
  231. data/lib/pubid/ecma/identifiers.rb +11 -0
  232. data/lib/pubid/ecma/parser.rb +76 -0
  233. data/lib/pubid/ecma/renderer.rb +67 -0
  234. data/lib/pubid/ecma/urn_generator.rb +46 -0
  235. data/lib/pubid/ecma/urn_parser.rb +51 -0
  236. data/lib/pubid/ecma.rb +68 -0
  237. data/lib/pubid/errors.rb +80 -0
  238. data/lib/pubid/etsi/builder.rb +13 -4
  239. data/lib/pubid/etsi/identifier.rb +1 -3
  240. data/lib/pubid/etsi/identifiers/base.rb +43 -11
  241. data/lib/pubid/etsi/identifiers/etsi_standard.rb +207 -4
  242. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +45 -3
  243. data/lib/pubid/etsi/identifiers.rb +0 -1
  244. data/lib/pubid/etsi/parser.rb +9 -3
  245. data/lib/pubid/etsi/renderer.rb +8 -2
  246. data/lib/pubid/etsi.rb +6 -5
  247. data/lib/pubid/evs/builder.rb +26 -0
  248. data/lib/pubid/evs/identifier.rb +37 -0
  249. data/lib/pubid/evs/identifiers/national_adoption.rb +17 -0
  250. data/lib/pubid/evs/identifiers.rb +9 -0
  251. data/lib/pubid/evs/parser.rb +27 -0
  252. data/lib/pubid/evs/renderer.rb +30 -0
  253. data/lib/pubid/evs/urn_generator.rb +30 -0
  254. data/lib/pubid/evs/urn_parser.rb +80 -0
  255. data/lib/pubid/evs.rb +90 -0
  256. data/lib/pubid/export/exporter.rb +2 -1
  257. data/lib/pubid/export/flavor_exporter.rb +18 -3
  258. data/lib/pubid/export.rb +1 -0
  259. data/lib/pubid/format_detector.rb +1 -0
  260. data/lib/pubid/gb/builder.rb +45 -0
  261. data/lib/pubid/gb/identifier.rb +67 -0
  262. data/lib/pubid/gb/identifiers/standard.rb +34 -0
  263. data/lib/pubid/gb/identifiers.rb +9 -0
  264. data/lib/pubid/gb/parser.rb +63 -0
  265. data/lib/pubid/gb/renderer.rb +35 -0
  266. data/lib/pubid/gb.rb +88 -0
  267. data/lib/pubid/gost/builder.rb +185 -0
  268. data/lib/pubid/gost/identifier.rb +47 -0
  269. data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
  270. data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
  271. data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
  272. data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
  273. data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
  274. data/lib/pubid/gost/identifiers.rb +13 -0
  275. data/lib/pubid/gost/parser.rb +105 -0
  276. data/lib/pubid/gost/renderer.rb +48 -0
  277. data/lib/pubid/gost/urn_generator.rb +46 -0
  278. data/lib/pubid/gost/urn_parser.rb +52 -0
  279. data/lib/pubid/gost.rb +50 -0
  280. data/lib/pubid/iala/builder.rb +22 -27
  281. data/lib/pubid/iala/identifier.rb +36 -8
  282. data/lib/pubid/iala/identifiers/advice.rb +1 -1
  283. data/lib/pubid/iala/identifiers/annex.rb +10 -10
  284. data/lib/pubid/iala/identifiers/general_assembly.rb +5 -2
  285. data/lib/pubid/iala/identifiers/guideline.rb +3 -1
  286. data/lib/pubid/iala/identifiers/letter.rb +1 -1
  287. data/lib/pubid/iala/identifiers/manual.rb +3 -1
  288. data/lib/pubid/iala/identifiers/model_course.rb +3 -1
  289. data/lib/pubid/iala/identifiers/recommendation.rb +3 -1
  290. data/lib/pubid/iala/identifiers/report.rb +1 -1
  291. data/lib/pubid/iala/identifiers/resolution.rb +1 -1
  292. data/lib/pubid/iala/identifiers/standard.rb +3 -1
  293. data/lib/pubid/iala/identifiers.rb +0 -1
  294. data/lib/pubid/iala/parser.rb +10 -2
  295. data/lib/pubid/iala/renderer.rb +1 -1
  296. data/lib/pubid/iala/urn_generator.rb +1 -1
  297. data/lib/pubid/iala/urn_parser.rb +24 -3
  298. data/lib/pubid/iala.rb +5 -4
  299. data/lib/pubid/iana/builder.rb +22 -0
  300. data/lib/pubid/iana/identifier.rb +140 -0
  301. data/lib/pubid/iana/identifiers/registry.rb +69 -0
  302. data/lib/pubid/iana/identifiers.rb +9 -0
  303. data/lib/pubid/iana/parser.rb +38 -0
  304. data/lib/pubid/iana/renderer.rb +32 -0
  305. data/lib/pubid/iana/urn_generator.rb +19 -0
  306. data/lib/pubid/iana/urn_parser.rb +24 -0
  307. data/lib/pubid/iana.rb +70 -0
  308. data/lib/pubid/identifier.rb +797 -26
  309. data/lib/pubid/identifier_metadata.rb +1 -0
  310. data/lib/pubid/idf/builder.rb +4 -4
  311. data/lib/pubid/idf/identifier.rb +18 -9
  312. data/lib/pubid/idf/parser.rb +3 -3
  313. data/lib/pubid/idf/renderer.rb +5 -5
  314. data/lib/pubid/idf/supplement_identifier.rb +3 -3
  315. data/lib/pubid/idf/urn_generator.rb +1 -1
  316. data/lib/pubid/idf.rb +7 -1
  317. data/lib/pubid/iec/builder.rb +49 -32
  318. data/lib/pubid/iec/components.rb +0 -1
  319. data/lib/pubid/iec/identifier.rb +112 -77
  320. data/lib/pubid/iec/identifiers/amendment.rb +6 -2
  321. data/lib/pubid/iec/identifiers/base.rb +2 -2
  322. data/lib/pubid/iec/identifiers/component_specification.rb +0 -10
  323. data/lib/pubid/iec/identifiers/conformity_assessment.rb +0 -10
  324. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
  325. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -2
  326. data/lib/pubid/iec/identifiers/fragment_identifier.rb +13 -15
  327. data/lib/pubid/iec/identifiers/guide.rb +0 -16
  328. data/lib/pubid/iec/identifiers/international_standard.rb +22 -6
  329. data/lib/pubid/iec/identifiers/operational_document.rb +0 -10
  330. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +0 -12
  331. data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
  332. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +0 -10
  333. data/lib/pubid/iec/identifiers/systems_reference_document.rb +0 -10
  334. data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
  335. data/lib/pubid/iec/identifiers/technical_report.rb +1 -18
  336. data/lib/pubid/iec/identifiers/technical_specification.rb +1 -18
  337. data/lib/pubid/iec/identifiers/technology_report.rb +0 -10
  338. data/lib/pubid/iec/identifiers/test_report_form.rb +0 -11
  339. data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
  340. data/lib/pubid/iec/identifiers/white_paper.rb +0 -10
  341. data/lib/pubid/iec/identifiers/working_document.rb +24 -10
  342. data/lib/pubid/iec/identifiers.rb +1 -0
  343. data/lib/pubid/iec/parser.rb +53 -28
  344. data/lib/pubid/iec/renderer.rb +31 -18
  345. data/lib/pubid/iec/single_identifier.rb +34 -11
  346. data/lib/pubid/iec/supplement_identifier.rb +32 -19
  347. data/lib/pubid/iec/urn_generator.rb +227 -61
  348. data/lib/pubid/iec/urn_parser.rb +42 -4
  349. data/lib/pubid/iec.rb +2 -6
  350. data/lib/pubid/ieee/aiee/builder.rb +17 -3
  351. data/lib/pubid/ieee/aiee/identifier.rb +46 -62
  352. data/lib/pubid/ieee/aiee/parser.rb +1 -1
  353. data/lib/pubid/ieee/builder.rb +386 -69
  354. data/lib/pubid/ieee/compaction.rb +121 -0
  355. data/lib/pubid/ieee/components/draft.rb +47 -7
  356. data/lib/pubid/ieee/identifier.rb +1 -3
  357. data/lib/pubid/ieee/identifiers/adopted_standard.rb +62 -5
  358. data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
  359. data/lib/pubid/ieee/identifiers/base.rb +148 -18
  360. data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
  361. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +6 -2
  362. data/lib/pubid/ieee/identifiers/corrigendum.rb +17 -2
  363. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +24 -3
  364. data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
  365. data/lib/pubid/ieee/identifiers/dual_published.rb +58 -3
  366. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
  367. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +25 -1
  368. data/lib/pubid/ieee/identifiers/joint_development.rb +64 -15
  369. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +58 -6
  370. data/lib/pubid/ieee/identifiers/nesc/base.rb +90 -19
  371. data/lib/pubid/ieee/identifiers/nesc/draft.rb +20 -5
  372. data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
  373. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +16 -5
  374. data/lib/pubid/ieee/identifiers/nesc/redline.rb +11 -2
  375. data/lib/pubid/ieee/identifiers/nesc/standard.rb +18 -3
  376. data/lib/pubid/ieee/identifiers/nesc.rb +1 -0
  377. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +3 -3
  378. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +14 -6
  379. data/lib/pubid/ieee/identifiers/redlined_standard.rb +4 -4
  380. data/lib/pubid/ieee/identifiers/si_standard.rb +4 -1
  381. data/lib/pubid/ieee/identifiers/standard.rb +4 -1
  382. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +26 -7
  383. data/lib/pubid/ieee/identifiers.rb +2 -1
  384. data/lib/pubid/ieee/ire/builder.rb +7 -6
  385. data/lib/pubid/ieee/ire/identifier.rb +48 -33
  386. data/lib/pubid/ieee/ire/parser.rb +1 -1
  387. data/lib/pubid/ieee/nesc/builder.rb +33 -20
  388. data/lib/pubid/ieee/nesc/parser.rb +16 -15
  389. data/lib/pubid/ieee/parser.rb +462 -44
  390. data/lib/pubid/ieee/pre_parser.rb +1 -1
  391. data/lib/pubid/ieee/renderer.rb +158 -57
  392. data/lib/pubid/ieee/typed_stages.rb +12 -1
  393. data/lib/pubid/ieee/urn_generator.rb +35 -8
  394. data/lib/pubid/ieee.rb +63 -4
  395. data/lib/pubid/ieee_debug.rb +1 -0
  396. data/lib/pubid/ietf/builder.rb +78 -0
  397. data/lib/pubid/ietf/identifier.rb +5 -0
  398. data/lib/pubid/ietf/identifiers/base.rb +72 -0
  399. data/lib/pubid/ietf/identifiers/bcp.rb +36 -0
  400. data/lib/pubid/ietf/identifiers/fyi.rb +36 -0
  401. data/lib/pubid/ietf/identifiers/internet_draft.rb +45 -0
  402. data/lib/pubid/ietf/identifiers/rfc.rb +27 -0
  403. data/lib/pubid/ietf/identifiers/serialization.rb +51 -0
  404. data/lib/pubid/ietf/identifiers/std.rb +36 -0
  405. data/lib/pubid/ietf/identifiers.rb +14 -0
  406. data/lib/pubid/ietf/parser.rb +61 -0
  407. data/lib/pubid/ietf/renderer.rb +64 -0
  408. data/lib/pubid/ietf/urn_generator.rb +37 -0
  409. data/lib/pubid/ietf/urn_parser.rb +43 -0
  410. data/lib/pubid/ietf.rb +86 -0
  411. data/lib/pubid/iho/identifier.rb +1 -3
  412. data/lib/pubid/iho/identifiers/base.rb +11 -10
  413. data/lib/pubid/iho/identifiers/bibliographic.rb +1 -1
  414. data/lib/pubid/iho/identifiers/circular_letter.rb +1 -1
  415. data/lib/pubid/iho/identifiers/miscellaneous.rb +1 -1
  416. data/lib/pubid/iho/identifiers/publication.rb +1 -1
  417. data/lib/pubid/iho/identifiers/standard.rb +1 -1
  418. data/lib/pubid/iho/identifiers.rb +0 -1
  419. data/lib/pubid/iho/parser.rb +1 -1
  420. data/lib/pubid/iho.rb +8 -7
  421. data/lib/pubid/isbn/builder.rb +44 -0
  422. data/lib/pubid/isbn/check_digit.rb +53 -0
  423. data/lib/pubid/isbn/identifier.rb +81 -0
  424. data/lib/pubid/isbn/identifiers/book.rb +30 -0
  425. data/lib/pubid/isbn/identifiers.rb +9 -0
  426. data/lib/pubid/isbn/parser.rb +45 -0
  427. data/lib/pubid/isbn/renderer.rb +16 -0
  428. data/lib/pubid/isbn.rb +53 -0
  429. data/lib/pubid/iso/builder.rb +9 -4
  430. data/lib/pubid/iso/bundled_identifier.rb +5 -3
  431. data/lib/pubid/iso/combined_identifier.rb +6 -4
  432. data/lib/pubid/iso/identifier.rb +29 -8
  433. data/lib/pubid/iso/identifiers/directives_supplement.rb +12 -12
  434. data/lib/pubid/iso/normalizer.rb +2 -2
  435. data/lib/pubid/iso/parser.rb +17 -13
  436. data/lib/pubid/iso/supplement_identifier.rb +19 -6
  437. data/lib/pubid/iso/urn_generator.rb +4 -1
  438. data/lib/pubid/iso/urn_parser.rb +1 -1
  439. data/lib/pubid/iso.rb +7 -1
  440. data/lib/pubid/itu/builder.rb +230 -29
  441. data/lib/pubid/itu/components/code.rb +48 -5
  442. data/lib/pubid/itu/components/designation.rb +35 -0
  443. data/lib/pubid/itu/components.rb +1 -0
  444. data/lib/pubid/itu/identifier.rb +1 -3
  445. data/lib/pubid/itu/identifiers/addendum.rb +15 -0
  446. data/lib/pubid/itu/identifiers/amendment.rb +7 -29
  447. data/lib/pubid/itu/identifiers/annex.rb +13 -2
  448. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
  449. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
  450. data/lib/pubid/itu/identifiers/base.rb +357 -25
  451. data/lib/pubid/itu/identifiers/combined_identifier.rb +99 -23
  452. data/lib/pubid/itu/identifiers/corrigendum.rb +16 -23
  453. data/lib/pubid/itu/identifiers/errata.rb +15 -0
  454. data/lib/pubid/itu/identifiers/handbook.rb +38 -0
  455. data/lib/pubid/itu/identifiers/question.rb +63 -0
  456. data/lib/pubid/itu/identifiers/recommendation.rb +3 -2
  457. data/lib/pubid/itu/identifiers/report.rb +39 -0
  458. data/lib/pubid/itu/identifiers/special_publication.rb +3 -1
  459. data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
  460. data/lib/pubid/itu/identifiers/supplement.rb +119 -14
  461. data/lib/pubid/itu/identifiers.rb +10 -1
  462. data/lib/pubid/itu/model.rb +1 -1
  463. data/lib/pubid/itu/parser.rb +481 -27
  464. data/lib/pubid/itu/urn_generator.rb +36 -6
  465. data/lib/pubid/itu/urn_parser.rb +8 -0
  466. data/lib/pubid/itu.rb +12 -3
  467. data/lib/pubid/jcgm/builder.rb +24 -14
  468. data/lib/pubid/jcgm/identifier.rb +10 -0
  469. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -2
  470. data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
  471. data/lib/pubid/jcgm/identifiers/gum_guide.rb +3 -3
  472. data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
  473. data/lib/pubid/jcgm/identifiers.rb +2 -0
  474. data/lib/pubid/jcgm/parser.rb +74 -7
  475. data/lib/pubid/jcgm/renderer.rb +33 -12
  476. data/lib/pubid/jcgm/single_identifier.rb +84 -6
  477. data/lib/pubid/jcgm/supplement_identifier.rb +39 -4
  478. data/lib/pubid/jcgm/urn_generator.rb +21 -13
  479. data/lib/pubid/jcgm/urn_parser.rb +164 -10
  480. data/lib/pubid/jcgm.rb +10 -0
  481. data/lib/pubid/jis/identifier.rb +62 -3
  482. data/lib/pubid/jis/parser.rb +1 -1
  483. data/lib/pubid/jis.rb +1 -0
  484. data/lib/pubid/nist/builder.rb +29 -9
  485. data/lib/pubid/nist/caster.rb +7 -45
  486. data/lib/pubid/nist/circular_supplement_builder.rb +7 -5
  487. data/lib/pubid/nist/components/stage.rb +2 -2
  488. data/lib/pubid/nist/components/supplement.rb +5 -2
  489. data/lib/pubid/nist/configuration.rb +6 -2
  490. data/lib/pubid/nist/identifier.rb +1 -3
  491. data/lib/pubid/nist/identifiers/base.rb +133 -39
  492. data/lib/pubid/nist/identifiers/circular.rb +10 -3
  493. data/lib/pubid/nist/identifiers/circular_supplement.rb +14 -5
  494. data/lib/pubid/nist/identifiers/commercial_standard.rb +1 -1
  495. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +1 -1
  496. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +8 -2
  497. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -2
  498. data/lib/pubid/nist/identifiers/dated_document.rb +1 -1
  499. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +1 -1
  500. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +1 -1
  501. data/lib/pubid/nist/identifiers/handbook.rb +10 -3
  502. data/lib/pubid/nist/identifiers/internal_report.rb +13 -6
  503. data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
  504. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +15 -7
  505. data/lib/pubid/nist/identifiers/monograph.rb +15 -8
  506. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  507. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  508. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  509. data/lib/pubid/nist/identifiers/report.rb +15 -7
  510. data/lib/pubid/nist/identifiers/special_publication.rb +10 -1
  511. data/lib/pubid/nist/identifiers/technical_note.rb +1 -1
  512. data/lib/pubid/nist/identifiers.rb +0 -1
  513. data/lib/pubid/nist/parser.rb +27 -4
  514. data/lib/pubid/nist/preprocessor.rb +15 -0
  515. data/lib/pubid/nist/router.rb +2 -2
  516. data/lib/pubid/nist/series/ir.rb +0 -3
  517. data/lib/pubid/nist/supplement_identifier.rb +24 -9
  518. data/lib/pubid/nist.rb +19 -13
  519. data/lib/pubid/oasis/builder.rb +79 -0
  520. data/lib/pubid/oasis/identifier.rb +160 -0
  521. data/lib/pubid/oasis/identifiers/standard.rb +29 -0
  522. data/lib/pubid/oasis/identifiers.rb +9 -0
  523. data/lib/pubid/oasis/parser.rb +34 -0
  524. data/lib/pubid/oasis/renderer.rb +29 -0
  525. data/lib/pubid/oasis/urn_generator.rb +25 -0
  526. data/lib/pubid/oasis/urn_parser.rb +22 -0
  527. data/lib/pubid/oasis.rb +80 -0
  528. data/lib/pubid/ogc/builder.rb +33 -0
  529. data/lib/pubid/ogc/identifier.rb +81 -0
  530. data/lib/pubid/ogc/identifiers/document.rb +26 -0
  531. data/lib/pubid/ogc/identifiers.rb +10 -0
  532. data/lib/pubid/ogc/parser.rb +40 -0
  533. data/lib/pubid/ogc/renderer.rb +33 -0
  534. data/lib/pubid/ogc/urn_generator.rb +14 -0
  535. data/lib/pubid/ogc/urn_parser.rb +22 -0
  536. data/lib/pubid/ogc.rb +72 -0
  537. data/lib/pubid/oiml/builder.rb +36 -8
  538. data/lib/pubid/oiml/identifier.rb +9 -1
  539. data/lib/pubid/oiml/identifiers/basic_publication.rb +2 -0
  540. data/lib/pubid/oiml/identifiers/bulletin.rb +36 -0
  541. data/lib/pubid/oiml/identifiers/code_number.rb +90 -0
  542. data/lib/pubid/oiml/identifiers/document.rb +2 -0
  543. data/lib/pubid/oiml/identifiers/expert_report.rb +2 -0
  544. data/lib/pubid/oiml/identifiers/guide.rb +2 -0
  545. data/lib/pubid/oiml/identifiers/recommendation.rb +2 -0
  546. data/lib/pubid/oiml/identifiers/seminar_report.rb +2 -0
  547. data/lib/pubid/oiml/identifiers/vocabulary.rb +2 -0
  548. data/lib/pubid/oiml/identifiers.rb +1 -0
  549. data/lib/pubid/oiml/parser.rb +12 -13
  550. data/lib/pubid/oiml/renderer.rb +13 -13
  551. data/lib/pubid/oiml/single_identifier.rb +41 -37
  552. data/lib/pubid/oiml/supplement_identifier.rb +36 -9
  553. data/lib/pubid/oiml/urn_parser.rb +23 -6
  554. data/lib/pubid/oiml.rb +10 -0
  555. data/lib/pubid/omg/builder.rb +20 -0
  556. data/lib/pubid/omg/identifier.rb +61 -0
  557. data/lib/pubid/omg/identifiers/specification.rb +32 -0
  558. data/lib/pubid/omg/identifiers.rb +9 -0
  559. data/lib/pubid/omg/parser.rb +93 -0
  560. data/lib/pubid/omg/renderer.rb +31 -0
  561. data/lib/pubid/omg.rb +52 -0
  562. data/lib/pubid/parser/grammar.rb +74 -0
  563. data/lib/pubid/parser.rb +2 -0
  564. data/lib/pubid/parsers/mr_string.rb +120 -7
  565. data/lib/pubid/plateau/builder.rb +8 -4
  566. data/lib/pubid/plateau/identifier.rb +1 -3
  567. data/lib/pubid/plateau/identifiers/base.rb +1 -6
  568. data/lib/pubid/plateau/identifiers/handbook.rb +1 -1
  569. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  570. data/lib/pubid/plateau/identifiers.rb +0 -1
  571. data/lib/pubid/plateau/parser.rb +16 -6
  572. data/lib/pubid/plateau/renderer.rb +1 -1
  573. data/lib/pubid/plateau/supplement_identifier.rb +11 -11
  574. data/lib/pubid/plateau.rb +14 -4
  575. data/lib/pubid/prefixes_support.rb +1 -0
  576. data/lib/pubid/renderers/annotator.rb +233 -0
  577. data/lib/pubid/renderers/base.rb +13 -0
  578. data/lib/pubid/renderers/directives_renderer.rb +3 -3
  579. data/lib/pubid/renderers/human_readable.rb +6 -4
  580. data/lib/pubid/renderers/mr_string.rb +54 -6
  581. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  582. data/lib/pubid/renderers.rb +1 -0
  583. data/lib/pubid/rendering/numbering.rb +25 -7
  584. data/lib/pubid/rendering/supplement.rb +4 -4
  585. data/lib/pubid/rendering.rb +1 -0
  586. data/lib/pubid/sae/builder.rb +1 -1
  587. data/lib/pubid/sae/identifier.rb +1 -3
  588. data/lib/pubid/sae/identifiers/base.rb +19 -9
  589. data/lib/pubid/sae/identifiers.rb +0 -1
  590. data/lib/pubid/sae/parser.rb +1 -1
  591. data/lib/pubid/sae.rb +4 -3
  592. data/lib/pubid/schema/declaration.rb +33 -0
  593. data/lib/pubid/schema/error.rb +14 -0
  594. data/lib/pubid/schema/identifier_type.rb +23 -0
  595. data/lib/pubid/schema/loader.rb +117 -0
  596. data/lib/pubid/schema/typed_stage.rb +24 -0
  597. data/lib/pubid/schema.rb +25 -0
  598. data/lib/pubid/tgpp/builder.rb +41 -0
  599. data/lib/pubid/tgpp/identifier.rb +107 -0
  600. data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
  601. data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
  602. data/lib/pubid/tgpp/identifiers.rb +11 -0
  603. data/lib/pubid/tgpp/parser.rb +78 -0
  604. data/lib/pubid/tgpp/renderer.rb +52 -0
  605. data/lib/pubid/tgpp/urn_generator.rb +39 -0
  606. data/lib/pubid/tgpp/urn_parser.rb +30 -0
  607. data/lib/pubid/tgpp.rb +84 -0
  608. data/lib/pubid/type_resolver.rb +74 -0
  609. data/lib/pubid/un/builder.rb +42 -0
  610. data/lib/pubid/un/identifier.rb +40 -0
  611. data/lib/pubid/un/identifiers/document.rb +24 -0
  612. data/lib/pubid/un/identifiers.rb +9 -0
  613. data/lib/pubid/un/parser.rb +25 -0
  614. data/lib/pubid/un/renderer.rb +11 -0
  615. data/lib/pubid/un.rb +47 -0
  616. data/lib/pubid/urn_parser/errors.rb +8 -1
  617. data/lib/pubid/urn_parser.rb +1 -0
  618. data/lib/pubid/utils.rb +1 -0
  619. data/lib/pubid/version.rb +1 -1
  620. data/lib/pubid/w3c/builder.rb +55 -0
  621. data/lib/pubid/w3c/identifier.rb +130 -0
  622. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
  623. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
  624. data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
  625. data/lib/pubid/w3c/identifiers/note.rb +30 -0
  626. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
  627. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
  628. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
  629. data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
  630. data/lib/pubid/w3c/identifiers/standard.rb +12 -0
  631. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
  632. data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
  633. data/lib/pubid/w3c/identifiers.rb +25 -0
  634. data/lib/pubid/w3c/parser.rb +43 -0
  635. data/lib/pubid/w3c/renderer.rb +35 -0
  636. data/lib/pubid/w3c/urn_generator.rb +18 -0
  637. data/lib/pubid/w3c/urn_parser.rb +36 -0
  638. data/lib/pubid/w3c.rb +68 -0
  639. data/lib/pubid/xsf/builder.rb +17 -0
  640. data/lib/pubid/xsf/identifier.rb +66 -0
  641. data/lib/pubid/xsf/identifiers/xep.rb +31 -0
  642. data/lib/pubid/xsf/identifiers.rb +9 -0
  643. data/lib/pubid/xsf/parser.rb +38 -0
  644. data/lib/pubid/xsf/renderer.rb +23 -0
  645. data/lib/pubid/xsf/urn_generator.rb +13 -0
  646. data/lib/pubid/xsf/urn_parser.rb +18 -0
  647. data/lib/pubid/xsf.rb +82 -0
  648. data/lib/pubid.rb +424 -22
  649. data/lib/tasks/conformance.rake +34 -0
  650. data/lib/tasks/docs.rake +3 -3
  651. data/lib/tasks/schema.rake +88 -0
  652. data/schema/core/joint_prefixes.yaml +24 -0
  653. data/schema/iec.yaml +1017 -0
  654. data/schema/iso.yaml +1586 -0
  655. data/schema/schema.schema.yaml +96 -0
  656. metadata +241 -19
  657. data/archived-gems/pubid-ccsds/update_codes.yaml +0 -1
  658. data/archived-gems/pubid-iec/stages.yaml +0 -129
  659. data/archived-gems/pubid-iec/update_codes.yaml +0 -67
  660. data/archived-gems/pubid-ieee/update_codes.yaml +0 -104
  661. data/archived-gems/pubid-iso/stages.yaml +0 -106
  662. data/archived-gems/pubid-iso/update_codes.yaml +0 -4
  663. data/archived-gems/pubid-itu/i18n.yaml +0 -13
  664. data/archived-gems/pubid-itu/series.yaml +0 -42
  665. data/archived-gems/pubid-nist/publishers.yaml +0 -6
  666. data/archived-gems/pubid-nist/update_codes.yaml +0 -93
  667. data/archived-gems/pubid-plateau/update_codes.yaml +0 -6
  668. data/lib/pubid/cen_cenelec/supplement_identifier.rb +0 -48
  669. data/lib/pubid/cie/components/code.rb +0 -80
  670. data/lib/pubid/iala/identifiers/base.rb +0 -14
  671. data/lib/pubid/iec/components/code.rb +0 -36
  672. /data/{archived-gems/pubid-nist → data/nist}/stages.yaml +0 -0
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # IHO Bibliographic Publication (B series).
7
7
  # Example: IHO B-4 2.19.0.
8
- class Bibliographic < Base
8
+ class Bibliographic < Identifier
9
9
  def self.type
10
10
  { key: :bibliographic, title: "Bibliographic Publication",
11
11
  short: "B" }
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # IHO Circular Letter (C series).
7
7
  # Example: IHO C-13 1.0.0.
8
- class CircularLetter < Base
8
+ class CircularLetter < Identifier
9
9
  def self.type
10
10
  { key: :circular_letter, title: "Circular Letter", short: "C" }
11
11
  end
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # IHO Miscellaneous Publication (M series).
7
7
  # Example: IHO M-3 2.0.0.
8
- class Miscellaneous < Base
8
+ class Miscellaneous < Identifier
9
9
  def self.type
10
10
  { key: :miscellaneous, title: "Miscellaneous Publication",
11
11
  short: "M" }
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # IHO Publication (P series).
7
7
  # Examples: IHO P-1 1.0.0, IHO P-1/21 1.0.0, IHO P-6-3 1.0.0.
8
- class Publication < Base
8
+ class Publication < Identifier
9
9
  def self.type
10
10
  { key: :publication, title: "Publication", short: "P" }
11
11
  end
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # IHO Standards and Specifications (S series).
7
7
  # Examples: IHO S-44 5.0.0, IHO S-100 Part 4a 1.0.0, IHO S-65 Ap. A 1.0.0.
8
- class Standard < Base
8
+ class Standard < Identifier
9
9
  def self.type
10
10
  { key: :standard, title: "Standards and Specifications", short: "S" }
11
11
  end
@@ -3,7 +3,6 @@
3
3
  module Pubid
4
4
  module Iho
5
5
  module Identifiers
6
- autoload :Base, "#{__dir__}/identifiers/base"
7
6
  autoload :Bibliographic, "#{__dir__}/identifiers/bibliographic"
8
7
  autoload :CircularLetter, "#{__dir__}/identifiers/circular_letter"
9
8
  autoload :Miscellaneous, "#{__dir__}/identifiers/miscellaneous"
@@ -5,7 +5,7 @@ require "parslet"
5
5
  module Pubid
6
6
  module Iho
7
7
  # Parser class for IHO identifiers
8
- class Parser < Parslet::Parser
8
+ class Parser < ::Pubid::Parser::Grammar
9
9
  rule(:space) { str(" ") }
10
10
  rule(:dash) { str("-") }
11
11
  rule(:dot) { str(".") }
data/lib/pubid/iho.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module Iho
5
6
  extend Pubid::PrefixesSupport
@@ -8,7 +9,7 @@ module Pubid
8
9
  PREFIXES = ["IHO"].freeze
9
10
 
10
11
  autoload :Builder, "#{__dir__}/iho/builder"
11
- autoload :Identifier, "#{__dir__}/iho/identifier"
12
+ autoload :Identifier, "#{__dir__}/iho/identifiers/base"
12
13
  autoload :Identifiers, "#{__dir__}/iho/identifiers"
13
14
  autoload :Parser, "#{__dir__}/iho/parser"
14
15
  autoload :Renderer, "#{__dir__}/iho/renderer"
@@ -17,14 +18,14 @@ module Pubid
17
18
 
18
19
  # Parse an IHO identifier string into an identifier object
19
20
  # @param identifier [String] The IHO identifier string to parse
20
- # @return [Pubid::Iho::Identifiers::Base] The appropriate identifier object
21
+ # @return [Pubid::Iho::Identifier] The appropriate identifier object
21
22
  def self.parse(identifier)
22
23
  Identifier.parse(identifier)
23
24
  end
24
25
 
25
26
  # Per-flavor format registry: inherits global formats, overrides :human
26
- Identifiers::Base.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
27
- Identifiers::Base.format_registry.register(:human, renderer: Iho::Renderer)
27
+ Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
28
+ Identifier.format_registry.register(:human, renderer: Iho::Renderer)
28
29
 
29
30
  # Auto-discover all identifier types from the Identifiers namespace.
30
31
  # @return [Array<Class>] identifier classes (Pubid::Identifier subclasses)
@@ -32,9 +33,9 @@ module Pubid
32
33
  @identifier_types ||= Identifiers.constants
33
34
  .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
34
35
  .select { |c| c.is_a?(Class) && c < Pubid::Identifier }
35
- # Exclude the flavor base itself by identity (Identifiers::Base is now an
36
+ # Exclude the flavor base itself by identity (Identifier is now an
36
37
  # alias for Pubid::Iho::Identifier, so name-based matching misses it).
37
- .reject { |c| c == Identifiers::Base }
38
+ .reject { |c| c == Identifier }
38
39
  end
39
40
 
40
41
  # Build typed stage index from identifier types
@@ -66,7 +67,7 @@ module Pubid
66
67
 
67
68
  # Look up an identifier class by its IHO series letter (S/P/M/B/C).
68
69
  # @param letter [String]
69
- # @return [Class<Identifiers::Base>]
70
+ # @return [Class<Identifier>]
70
71
  def self.identifier_klass_for_type_letter(letter)
71
72
  @by_letter ||= identifier_types.to_h { |klass| [klass.type[:short], klass] }
72
73
  @by_letter.fetch(letter.to_s)
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Isbn
5
+ # Builds a Pubid::Isbn::Identifier from a parse tree.
6
+ #
7
+ # Validates the check digit; raises if invalid. Stores both the
8
+ # hyphenated form (for round-trip rendering) and the bare digits
9
+ # (for queries).
10
+ class Builder
11
+ INVALID_LENGTH = /^(?:\d{9}[\dX]|\d{13})$/.freeze
12
+
13
+ def self.build(parsed_data)
14
+ new.build(parsed_data)
15
+ end
16
+
17
+ def build(data)
18
+ hyphenated = data[:body].to_s
19
+ raw = hyphenated.delete("-")
20
+
21
+ validate_length!(raw)
22
+ validate_check_digit!(raw)
23
+
24
+ Identifiers::Book.new(raw: raw, hyphenated: hyphenated.include?("-") ? hyphenated : nil)
25
+ end
26
+
27
+ private
28
+
29
+ def validate_length!(raw)
30
+ return if raw.match?(INVALID_LENGTH)
31
+
32
+ raise ArgumentError,
33
+ "ISBN must be 10 or 13 digits (got #{raw.length})"
34
+ end
35
+
36
+ def validate_check_digit!(raw)
37
+ return if CheckDigit.valid?(raw)
38
+
39
+ raise ArgumentError,
40
+ "ISBN check digit invalid for #{raw}"
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Isbn
5
+ # Pure-functional check digit math for ISBN-10 and ISBN-13 per ISO 2108.
6
+ #
7
+ # ISBN-10: weighted sum with weights 10..1, mod 11. Check digit 10 is
8
+ # rendered as "X".
9
+ # ISBN-13: weighted sum with alternating weights 1/3, mod 10. Check digit
10
+ # is 0-9.
11
+ class CheckDigit
12
+ # Compute the correct ISBN-10 check digit for a 9-digit payload.
13
+ # @return [String] "0".."9" or "X"
14
+ def self.compute_isbn10(payload)
15
+ raise ArgumentError, "ISBN-10 payload must be 9 digits" unless payload.to_s.match?(/\A\d{9}\z/)
16
+
17
+ sum = payload.to_s.each_char.with_index.sum { |c, i| c.to_i * (10 - i) }
18
+ digit = (11 - sum % 11) % 11
19
+ digit == 10 ? "X" : digit.to_s
20
+ end
21
+
22
+ # Compute the correct ISBN-13 check digit for a 12-digit payload.
23
+ # @return [String] "0".."9"
24
+ def self.compute_isbn13(payload)
25
+ raise ArgumentError, "ISBN-13 payload must be 12 digits" unless payload.to_s.match?(/\A\d{12}\z/)
26
+
27
+ sum = payload.to_s.each_char.with_index.sum do |c, i|
28
+ c.to_i * (i.even? ? 1 : 3)
29
+ end
30
+ ((10 - sum % 10) % 10).to_s
31
+ end
32
+
33
+ # Verify the check digit on a full 10- or 13-digit ISBN string.
34
+ # @param full [String] 10 or 13 chars; ISBN-10 may end with X.
35
+ # @return [Boolean]
36
+ def self.valid?(full)
37
+ digits = full.to_s.upcase.delete("^0-9X")
38
+ case digits.length
39
+ when 10
40
+ payload = digits[0, 9]
41
+ actual = digits[9]
42
+ compute_isbn10(payload) == actual
43
+ when 13
44
+ payload = digits[0, 12]
45
+ actual = digits[12]
46
+ compute_isbn13(payload) == actual
47
+ else
48
+ false
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Isbn
5
+ class Identifier < ::Pubid::Identifier
6
+ # The digits-only ISBN (no hyphens), including check digit. 10 or 13 chars.
7
+ attribute :raw, :string
8
+
9
+ # Original hyphenated form (may be nil when the input had no hyphens).
10
+ # Preserved for round-trip rendering; not queryable semantics.
11
+ attribute :hyphenated, :string
12
+
13
+ ISBN_TYPE_MAP = {
14
+ "pubid:isbn:book" => "Pubid::Isbn::Identifiers::Book",
15
+ }.freeze
16
+
17
+ key_value do
18
+ map "_type", to: :_type, polymorphic_map: ISBN_TYPE_MAP
19
+ map "raw", to: :raw
20
+ map "hyphenated", to: :hyphenated
21
+ end
22
+
23
+ PUBLISHER = "ISBN"
24
+
25
+ # Returns :isbn10 or :isbn13.
26
+ def form
27
+ case raw.to_s.length
28
+ when 10 then :isbn10
29
+ when 13 then :isbn13
30
+ else raise "Invalid ISBN length: #{raw.inspect}"
31
+ end
32
+ end
33
+
34
+ def check_digit
35
+ raw.to_s[-1]
36
+ end
37
+
38
+ def valid?
39
+ CheckDigit.valid?(raw)
40
+ end
41
+
42
+ def to_s(**opts)
43
+ render(format: :human, **opts)
44
+ end
45
+
46
+ def self.parse(identifier)
47
+ unless identifier.is_a?(String)
48
+ raise Pubid::Errors::InvalidInputError,
49
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
50
+ end
51
+
52
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
53
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
54
+ end
55
+
56
+ # The two guards above must stay OUTSIDE build_identifier: this method
57
+ # rescues ArgumentError to convert the Builder's check-digit and
58
+ # length validation into a parse failure, and that rescue used to
59
+ # swallow the guards' own ArgumentError and re-raise it as a
60
+ # RuntimeError - so ISBN was the one guarded flavor where an over-long
61
+ # input did not surface as ArgumentError.
62
+ build_identifier(identifier)
63
+ end
64
+
65
+ # @raise [Pubid::Errors::ParseError] if the string is not a valid ISBN
66
+ def self.build_identifier(identifier)
67
+ parsed = Parser.parse(identifier)
68
+ Builder.build(parsed)
69
+ rescue ArgumentError => e
70
+ # The Builder validates length and check digit. Surface that as a parse
71
+ # failure, so every ISBN rejection reaches the caller as the same class
72
+ # a grammar rejection does.
73
+ raise Pubid::Errors::ParseError.new(
74
+ "invalid ISBN '#{identifier}': #{e.message}",
75
+ input: identifier, flavor: "isbn",
76
+ )
77
+ end
78
+ private_class_method :build_identifier
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Isbn
5
+ module Identifiers
6
+ # ISBN book identifier — supports both ISBN-10 and ISBN-13.
7
+ #
8
+ # Examples:
9
+ # ISBN 978-3-16-148410-0
10
+ # ISBN 0-306-40615-2
11
+ # 9783161484100
12
+ class Book < Identifier
13
+ TYPED_STAGES = [
14
+ Pubid::Components::TypedStage.new(
15
+ code: :pubisbn,
16
+ stage_code: :published,
17
+ type_code: :isbn,
18
+ abbr: ["ISBN"],
19
+ name: "ISBN",
20
+ harmonized_stages: [],
21
+ ),
22
+ ].freeze
23
+
24
+ def self.type
25
+ { key: :isbn, web: :book, title: "ISBN", short: "ISBN" }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Isbn
5
+ module Identifiers
6
+ autoload :Book, "#{__dir__}/identifiers/book"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Isbn
7
+ # Parslet grammar for ISBN identifiers per ISO 2108.
8
+ #
9
+ # Accepts:
10
+ # [ISBN[ |:]] {10 or 13 digits with optional hyphens}
11
+ #
12
+ # ISBN-10 final digit may be "X" (check digit value 10). Hyphens are
13
+ # optional and may appear in any group position; they are preserved
14
+ # for round-trip rendering.
15
+ class Parser < ::Pubid::Parser::Grammar
16
+ rule(:space) { str(" ") }
17
+ rule(:colon) { str(":") }
18
+ rule(:hyphen) { str("-") }
19
+ rule(:digit) { match("[0-9]") }
20
+ rule(:x_digit) { digit | str("X") }
21
+
22
+ rule(:isbn_prefix) do
23
+ (str("ISBN") >> (space | (space.maybe >> colon >> space.maybe))).maybe
24
+ end
25
+
26
+ rule(:digit_group) { digit.repeat(1) }
27
+ rule(:x_group) { x_digit.repeat(1) }
28
+
29
+ # Loose "ISBN-ish" token: digits or final X, separated by hyphens.
30
+ rule(:isbn_body) do
31
+ (digit_group >> (hyphen >> digit_group).repeat >>
32
+ (hyphen >> x_digit).maybe).as(:body) |
33
+ (digit.repeat(9, 12) >> x_digit.maybe).as(:body)
34
+ end
35
+
36
+ rule(:identifier) { isbn_prefix >> isbn_body }
37
+
38
+ rule(:root) { identifier }
39
+
40
+ def self.parse(input)
41
+ new.parse(input)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Isbn
5
+ # Human-readable renderer for ISBN identifiers.
6
+ #
7
+ # Preserves the original hyphenation when present; otherwise emits the
8
+ # bare digits. Always emits the "ISBN " prefix.
9
+ class Renderer < ::Pubid::Renderers::Base
10
+ def render(**_opts)
11
+ body = @id.hyphenated || @id.raw
12
+ "ISBN #{body}"
13
+ end
14
+ end
15
+ end
16
+ end
data/lib/pubid/isbn.rb ADDED
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pubid"
4
+ module Pubid
5
+ # ISBN flavor — bibliographic book identifier per ISO 2108.
6
+ #
7
+ # Parses both 10-digit (ISBN-10) and 13-digit (ISBN-13) forms with
8
+ # optional hyphenation. The check digit is validated; an invalid check
9
+ # digit raises on parse.
10
+ module Isbn
11
+ extend Pubid::PrefixesSupport
12
+
13
+ PREFIXES = ["ISBN"].freeze
14
+
15
+ autoload :CheckDigit, "#{__dir__}/isbn/check_digit"
16
+ autoload :Builder, "#{__dir__}/isbn/builder"
17
+ autoload :Identifier, "#{__dir__}/isbn/identifier"
18
+ autoload :Identifiers, "#{__dir__}/isbn/identifiers"
19
+ autoload :Parser, "#{__dir__}/isbn/parser"
20
+ autoload :Renderer, "#{__dir__}/isbn/renderer"
21
+
22
+ def self.parse(identifier)
23
+ Identifier.parse(identifier)
24
+ end
25
+
26
+ Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
27
+ Identifier.format_registry.register(:human, renderer: Isbn::Renderer)
28
+
29
+ def self.identifier_types
30
+ @identifier_types ||= Identifiers.constants
31
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
32
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
33
+ .select { |c| c.type.is_a?(Hash) }
34
+ end
35
+
36
+ def self.all_typed_stages
37
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
38
+ klass.const_defined?(:TYPED_STAGES) ? klass.const_get(:TYPED_STAGES) : []
39
+ end
40
+ end
41
+
42
+ def self.locate_type(code)
43
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
44
+ end
45
+
46
+ def self.locate_stage(abbr)
47
+ abbr_str = abbr.to_s.upcase
48
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
49
+ end
50
+ end
51
+ end
52
+
53
+ Pubid::Registry.register(:isbn, Pubid::Isbn)
@@ -16,7 +16,7 @@ module Pubid
16
16
 
17
17
  def locate_identifier_klass(parsed_hash)
18
18
  # If there is a joint_identifier, we need to use a CombinedIdentifier
19
- # which takes `base_identifier` and `additional_identifiers`
19
+ # which takes `base` and `additional_identifiers`
20
20
  if parsed_hash[:joint_identifier]
21
21
  return CombinedIdentifier
22
22
  end
@@ -47,7 +47,7 @@ module Pubid
47
47
  # a) It is an IS.
48
48
  # b) It is a Directive Supplements. The "SUP" keyword may be entirely missing, and hence nil. If the base type_with_stage is a directive, then if the type_with_stage is blank, it is a directive supplement.
49
49
 
50
- if parsed_hash[:type_with_stage].nil? && parsed_hash[:base_identifier] && parsed_hash[:base_identifier][:type_with_stage] == "DIR"
50
+ if parsed_hash[:type_with_stage].nil? && parsed_hash[:base] && parsed_hash[:base][:type_with_stage] == "DIR"
51
51
  # Directive Supplement without "SUP" keyword
52
52
  parsed_hash[:type_with_stage] = "SUP"
53
53
  end
@@ -150,12 +150,12 @@ module Pubid
150
150
 
151
151
  def cast(type, value)
152
152
  case type
153
- when :base_identifier
153
+ when :base
154
154
  # If it has a base identifier, we need to build a supplement
155
155
  # We assume that the base identifier is already a valid Identifier object
156
156
  build(value)
157
157
 
158
- # If there is a base_identifier, and it has a joint_identifier, we need to use a CombinedIdentifier.
158
+ # If there is a base, and it has a joint_identifier, we need to use a CombinedIdentifier.
159
159
 
160
160
  when :publisher, :directives_supplement_body, :supplement_publisher
161
161
  # value can be either a string OR a hash with publisher + copublisher
@@ -230,6 +230,11 @@ module Pubid
230
230
  when :date
231
231
  parse_date(value)
232
232
 
233
+ when :undated_marker
234
+ # ISO/IEC undated reference (e.g. "ISO 16634:--") — explicit
235
+ # publication-date slot with no year; round-trips via date.render.
236
+ { date: Pubid::Components::Date.new(undated: true) }
237
+
233
238
  when :edition
234
239
  # value can be "Ed.2", "Ed 2", "ED1", "Edition 13", or just "Ed"
235
240
  original_text = value.to_s
@@ -86,15 +86,17 @@ module Pubid
86
86
  base_document&.copublishers
87
87
  end
88
88
 
89
+ # See the note on Pubid::BundledIdentifier#to_s: `**opts` carries flags
90
+ # this list does not name, `annotated:` above all.
89
91
  def to_s(lang: :en, lang_single: false, with_edition: false, format: nil,
90
- stage_format_long: nil, with_date: nil)
92
+ stage_format_long: nil, with_date: nil, **opts)
91
93
  parts = [base_document.to_s(lang: lang, lang_single: lang_single,
92
- with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)]
94
+ with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)]
93
95
 
94
96
  # Add each supplement with "+" separator
95
97
  supplements.each do |supplement|
96
98
  supplement_str = supplement.to_supplement_s(lang: lang, lang_single: lang_single,
97
- with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)
99
+ with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts)
98
100
  parts << "+ #{supplement_str}"
99
101
  end
100
102
 
@@ -4,16 +4,18 @@ module Pubid
4
4
  module Iso
5
5
  # Identifier that represents a supplement to a base identifier.
6
6
  class CombinedIdentifier < Identifier
7
- attribute :base_identifier, Identifier, polymorphic: true
7
+ attribute :base, Identifier, polymorphic: true
8
8
  attribute :additional_identifiers, ::Pubid::Identifier,
9
9
  polymorphic: true, collection: true
10
10
  attribute :type, :string, default: -> { "combined_identifier" }
11
11
 
12
- def to_s(lang: :en, lang_single: false)
12
+ # `**opts` carries render flags this list does not name (`annotated:`),
13
+ # which the closed signature used to reject outright.
14
+ def to_s(lang: :en, lang_single: false, **opts)
13
15
  [
14
- base_identifier.to_s(lang: lang, lang_single: lang_single),
16
+ base.to_s(lang: lang, lang_single: lang_single, **opts),
15
17
  additional_identifiers.map do |id|
16
- id.to_s(lang: lang, lang_single: lang_single)
18
+ id.to_s(lang: lang, lang_single: lang_single, **opts)
17
19
  end,
18
20
  ].flatten.join(" | ")
19
21
  end
@@ -103,7 +103,7 @@ module Pubid
103
103
  # The base Pubid::Identifier no longer auto-maps attributes, so each
104
104
  # flavor's top class must declare its own key_value mapping. Subclasses
105
105
  # merge their own blocks on top of this one (e.g. SupplementIdentifier
106
- # adds base_identifier; Directives adds subgroup), so list every base
106
+ # adds base; Directives adds subgroup), so list every base
107
107
  # attribute ISO serializes here once.
108
108
  key_value do
109
109
  map "_type", to: :_type, polymorphic_map: ISO_TYPE_MAP
@@ -117,6 +117,9 @@ module Pubid
117
117
  map "year", with: { to: :year_to_kv, from: :year_from_kv }
118
118
  map "month", with: { to: :month_to_kv, from: :month_from_kv }
119
119
  map "day", with: { to: :day_to_kv, from: :day_from_kv }
120
+ # ISO/IEC undated reference (e.g. ISO 16634:--). The `false` default
121
+ # is omitted; only the meaningful `true` round-trips via to_hash.
122
+ map "undated", with: { to: :undated_to_kv, from: :undated_from_kv }
120
123
  map "edition", to: :edition
121
124
  map "languages", to: :languages
122
125
  # publisher emitted only when the primary isn't the type default;
@@ -163,9 +166,14 @@ module Pubid
163
166
  def stage_from_kv(model, value)
164
167
  return if value.nil? || value.to_s.empty?
165
168
 
169
+ # The fallback consults the flavor-wide table. It used to call
170
+ # `Pubid::Iso::Scheme`, a class removed repo-wide in e3c19ea1 — so any
171
+ # code absent from the class's own TYPED_STAGES raised NameError
172
+ # instead of falling back. The IEC twin (iec/identifier.rb) was
173
+ # migrated at the time; ISO was missed.
166
174
  ts = (model.class.const_defined?(:TYPED_STAGES) &&
167
175
  model.class::TYPED_STAGES.find { |t| t.code.to_s == value.to_s }) ||
168
- Pubid::Iso::Scheme.locate_typed_stage_by_code(value)
176
+ Pubid::Iso.locate_stage_by_code(value)
169
177
  return unless ts
170
178
 
171
179
  # The renderer prefers `original_abbr` (the parsed surface form); without
@@ -217,6 +225,19 @@ module Pubid
217
225
  def day_to_kv(model, doc) = emit_date_part(doc, "day", model.date&.day)
218
226
  def day_from_kv(model, value) = date_for(model).day = value.to_s
219
227
 
228
+ # --- date undated flag (ISO/IEC undated reference, e.g. ISO 16634:--) ---
229
+ # The `false` default is omitted; only the meaningful `true` round-trips
230
+ # via to_hash / from_hash.
231
+ def undated_to_kv(model, doc)
232
+ return unless model.date&.undated?
233
+
234
+ doc.add_child(Lutaml::KeyValue::DataModel::Element.new("undated", true))
235
+ end
236
+
237
+ def undated_from_kv(model, value)
238
+ date_for(model).undated = value.to_s == "true"
239
+ end
240
+
220
241
  def emit_date_part(doc, key, val)
221
242
  return if val.nil? || val.to_s.empty?
222
243
 
@@ -267,8 +288,13 @@ module Pubid
267
288
  end
268
289
 
269
290
  def self.parse(string, format: :auto)
291
+ unless string.is_a?(String)
292
+ raise Pubid::Errors::InvalidInputError,
293
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
294
+ end
295
+
270
296
  if string.length > Pubid::MAX_INPUT_LENGTH
271
- raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
297
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
272
298
  end
273
299
 
274
300
  format = Pubid::FormatDetector.detect(string) if format == :auto
@@ -280,11 +306,6 @@ module Pubid
280
306
  Pubid::Parsers::MrString.parse(string)
281
307
  else
282
308
  parsed = Pubid::Iso::Parser.new.parse(string)
283
- if parsed.nil? || parsed.empty?
284
- raise Pubid::Iso::Parser::ParseError,
285
- "Invalid identifier format"
286
- end
287
-
288
309
  Pubid::Iso::Builder.new.build(parsed)
289
310
  end
290
311
  end