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
@@ -23,6 +23,17 @@ module Pubid
23
23
  # Compare first identifier
24
24
  identifiers.first <=> other.identifiers.first
25
25
  end
26
+
27
+ # As for BundledIdentifier: a set holds no number of its own, so walk
28
+ # to the first member for the relaton-index key.
29
+ #
30
+ # NOTE the members are frequently a FOREIGN flavor (BS ISO ... holds
31
+ # Pubid::Iso identifiers), which `to_hash` still rejects — see the
32
+ # hand-off bsi-set-cross-flavor-type. `#root` is unaffected by that:
33
+ # it only reads the object, never serializes it.
34
+ def root
35
+ identifiers&.first ? identifiers.first.root : self
36
+ end
26
37
  end
27
38
  end
28
39
  end
@@ -6,7 +6,16 @@ module Pubid
6
6
  # Standalone Amendment identifier (no base reference)
7
7
  # Examples: "AMD 11015", "(AMD 10971)", "AMD Corrigendum 14716"
8
8
  class StandaloneAmendment < SingleIdentifier
9
- attribute :amendment_number, Components::Code
9
+ # The amendment number lives in the `number` inherited from
10
+ # SingleIdentifier — already a Bsi::Components::Code, exactly what the
11
+ # deleted `amendment_number` was, so nothing is retyped. It used to sit
12
+ # under the private name, leaving `number` nil and `root.number` "".
13
+ #
14
+ # A standalone amendment is its OWN document (there is no base standard
15
+ # to walk to — that is what "standalone" means), so it needs a real
16
+ # number rather than a #root override. `Identifiers::Amendment`, the
17
+ # attached kind, keeps its own `amendment_number` and is untouched:
18
+ # there the ordinal is a supplement ordinal, not the document number.
10
19
  attribute :corrigendum, :boolean, default: false
11
20
  attribute :parenthesized, :boolean, default: false
12
21
 
@@ -9,7 +9,7 @@ module Pubid
9
9
  # Forward: "BS 1000:Supplement No. 1:1972", "BS 1722-1 Supplement No. 1:1974"
10
10
  # Reverse: "Supplement No. 1 (1970) to BS 1831:1969"
11
11
  class SupplementDocument < SingleIdentifier
12
- attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
12
+ attribute :base, ::Pubid::Identifier, polymorphic: true
13
13
  attribute :supplement_number, :string
14
14
  attribute :supplement_year, :integer
15
15
  attribute :supplement_type, :string, default: -> {
@@ -21,7 +21,7 @@ module Pubid
21
21
  } # Separator before Supplement (":" or " ")
22
22
 
23
23
  def publisher
24
- base_identifier&.publisher
24
+ base&.publisher
25
25
  end
26
26
  end
27
27
  end
@@ -12,24 +12,24 @@ module Pubid
12
12
  # PAS 96:2017 - TC
13
13
  # PP 7722:2006 BOOK
14
14
  class ValueAddedPublication < SingleIdentifier
15
- attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
15
+ attribute :base, ::Pubid::Identifier, polymorphic: true
16
16
  attribute :format, :string, values: ["PDF", "TC", "BOOK"]
17
17
 
18
- # Delegate common attributes to base_identifier
18
+ # Delegate common attributes to base
19
19
  def publisher
20
- base_identifier&.publisher
20
+ base&.publisher
21
21
  end
22
22
 
23
23
  def number
24
- base_identifier&.number
24
+ base&.number
25
25
  end
26
26
 
27
27
  def year
28
- base_identifier&.year
28
+ base&.year
29
29
  end
30
30
 
31
31
  def date
32
- base_identifier&.date
32
+ base&.date
33
33
  end
34
34
  end
35
35
  end
@@ -4,7 +4,7 @@ require "parslet"
4
4
 
5
5
  module Pubid
6
6
  module Bsi
7
- class Parser < Parslet::Parser
7
+ class Parser < ::Pubid::Parser::Grammar
8
8
  # Case-insensitive string match (Parslet 2.0 has no built-in `stri`).
9
9
  # Each character becomes a two-case character class; other characters
10
10
  # (spaces, punctuation) match verbatim.
@@ -94,6 +94,16 @@ module Pubid
94
94
 
95
95
  private
96
96
 
97
+ # Read a value that may be a component or a bare scalar. BSI's own
98
+ # `number`/`part`/`subpart` are plain strings, but a bundle member or an
99
+ # adopted identifier can be a foreign one (ISO, IEC, CEN/CENELEC) whose
100
+ # equivalents are still a Components::Code.
101
+ def component_str(value)
102
+ return "" if value.nil?
103
+
104
+ (value.respond_to?(:render) ? value.render(context: @context) : value).to_s
105
+ end
106
+
97
107
  # ------------------------------------------------------------------
98
108
  # SingleIdentifier (base BSI identifier)
99
109
  # ------------------------------------------------------------------
@@ -109,7 +119,7 @@ module Pubid
109
119
  end
110
120
 
111
121
  if id.number
112
- number_str = id.number.render(context: @context)
122
+ number_str = id.number
113
123
 
114
124
  if id.second_number
115
125
  second_val = id.second_number.render(context: @context)
@@ -118,13 +128,13 @@ module Pubid
118
128
 
119
129
  space_separated = id.space_separated_part
120
130
  if id.part
121
- part_val = id.part.render(context: @context)
131
+ part_val = id.part
122
132
  part_str = part_val.to_s.strip
123
133
  separator = space_separated ? " " : "-"
124
134
  number_str += "#{separator}#{part_str}"
125
135
  end
126
136
  if id.subpart
127
- subpart_val = id.subpart.render(context: @context)
137
+ subpart_val = id.subpart
128
138
  subpart_str = subpart_val.to_s.strip
129
139
  number_str += "-#{subpart_str}"
130
140
  end
@@ -160,13 +170,13 @@ module Pubid
160
170
  # ------------------------------------------------------------------
161
171
 
162
172
  def render_addendum_document(id, opts)
163
- result = id.base_identifier.to_s(**opts)
173
+ result = id.base.to_s(**opts)
164
174
 
165
- base_has_year = id.base_identifier.to_s =~ /:(\d{4})$/
175
+ base_has_year = id.base.to_s =~ /:(\d{4})$/
166
176
 
167
177
  sep = if id.separator == ":"
168
178
  ":"
169
- elsif base_has_year && id.base_identifier.to_s !~ /:\d{4}:/
179
+ elsif base_has_year && id.base.to_s !~ /:\d{4}:/
170
180
  " "
171
181
  else
172
182
  id.separator
@@ -202,7 +212,7 @@ module Pubid
202
212
  end
203
213
 
204
214
  result = prefix
205
- result += " #{id.adopted_identifier}" if id.adopted_identifier
215
+ result += " #{id.adopted}" if id.adopted
206
216
  result += " ED#{id.edition}" if id.edition
207
217
 
208
218
  result += " (R#{id.reaffirmation_year})" if id.reaffirmation_year
@@ -227,7 +237,7 @@ module Pubid
227
237
  end
228
238
 
229
239
  result = prefix
230
- result += " #{id.adopted_identifier}" if id.adopted_identifier
240
+ result += " #{id.adopted}" if id.adopted
231
241
  result += " ED#{id.edition}" if id.edition
232
242
 
233
243
  result += " (R#{id.reaffirmation_year})" if id.reaffirmation_year
@@ -249,14 +259,14 @@ module Pubid
249
259
  parts << id.prefix if id.prefix
250
260
 
251
261
  if id.number
252
- number_str = id.number.render(context: @context)
262
+ number_str = id.number
253
263
 
254
264
  if id.part
255
- part_val = id.part.render(context: @context)
265
+ part_val = id.part
256
266
  number_str += "-#{part_val}"
257
267
  end
258
268
  if id.subpart
259
- subpart_val = id.subpart.render(context: @context)
269
+ subpart_val = id.subpart
260
270
  number_str += "-#{subpart_val}"
261
271
  end
262
272
 
@@ -289,7 +299,7 @@ module Pubid
289
299
  end
290
300
 
291
301
  def render_amendment(id)
292
- base = id.base_identifier ? id.base_identifier.to_s : ""
302
+ base = id.base ? id.base.to_s : ""
293
303
 
294
304
  if id.amd_suffix_form
295
305
  # Trailing " AMD5" / " AMD AA" suffix form
@@ -321,8 +331,10 @@ module Pubid
321
331
  parts_list = id.identifiers[1..].map do |idd|
322
332
  part_val = idd.class.attributes.key?(:part) ? idd.part : nil
323
333
  if part_val
324
- pv = part_val.render(context: @context)
325
- pv.to_s
334
+ # A bundle member may be a foreign identifier (ISO, CEN/CENELEC),
335
+ # whose `part` is still a Components::Code, so read through
336
+ # whichever shape it holds.
337
+ component_str(part_val)
326
338
  else
327
339
  idd.to_s
328
340
  end
@@ -350,23 +362,23 @@ module Pubid
350
362
  abbrev_str = prefix.to_s
351
363
  end
352
364
  if idd.number
353
- number_val = idd.number.render(context: @context)
365
+ number_val = idd.number
354
366
  abbrev_str += " " if !abbrev_str.empty?
355
367
  abbrev_str += number_val.to_s
356
368
  end
357
369
  if idd.part
358
- part_val = idd.part.render(context: @context)
370
+ part_val = idd.part
359
371
  abbrev_str += "-#{part_val}"
360
372
  end
361
373
  parts << abbrev_str
362
374
  else
363
375
  abbrev_str = ""
364
376
  if idd.number
365
- number_val = idd.number.render(context: @context)
377
+ number_val = idd.number
366
378
  abbrev_str = number_val.to_s
367
379
  end
368
380
  if idd.part
369
- part_val = idd.part.render(context: @context)
381
+ part_val = idd.part
370
382
  abbrev_str += "-#{part_val}"
371
383
  end
372
384
  parts << abbrev_str
@@ -394,7 +406,7 @@ module Pubid
394
406
  "00"
395
407
  end
396
408
 
397
- "#{year_str}/#{id.document_number} DC"
409
+ "#{year_str}/#{id.number} DC"
398
410
  end
399
411
 
400
412
  def render_consolidated_identifier(id, opts)
@@ -471,7 +483,7 @@ module Pubid
471
483
  end
472
484
 
473
485
  def render_corrigendum(id)
474
- result = id.base_identifier ? id.base_identifier.to_s : ""
486
+ result = id.base ? id.base.to_s : ""
475
487
  result += "#{id.separator}C"
476
488
  result += id.corrigendum_number.to_s if id.corrigendum_number
477
489
  result += ":#{id.corrigendum_year}" if id.corrigendum_year
@@ -483,7 +495,7 @@ module Pubid
483
495
  parts << "BS"
484
496
 
485
497
  if id.number
486
- number_str = id.number.render(context: @context)
498
+ number_str = id.number
487
499
  parts << number_str
488
500
  end
489
501
 
@@ -507,9 +519,9 @@ module Pubid
507
519
  parts << "DISC"
508
520
 
509
521
  if id.number
510
- number_str = id.number.render(context: @context)
522
+ number_str = id.number
511
523
  if id.part
512
- part_val = id.part.render(context: @context)
524
+ part_val = id.part
513
525
  number_str += "-#{part_val.to_s.strip}"
514
526
  end
515
527
  parts << "PD #{number_str}"
@@ -529,14 +541,14 @@ module Pubid
529
541
  parts << type_abbr
530
542
 
531
543
  if id.number
532
- number_str = id.number.render(context: @context)
544
+ number_str = id.number
533
545
 
534
546
  if id.part
535
- part_val = id.part.render(context: @context)
547
+ part_val = id.part
536
548
  number_str += "-#{part_val.to_s.strip}"
537
549
  end
538
550
  if id.subpart
539
- subpart_val = id.subpart.render(context: @context)
551
+ subpart_val = id.subpart
540
552
  number_str += "-#{subpart_val.to_s.strip}"
541
553
  end
542
554
 
@@ -562,14 +574,14 @@ module Pubid
562
574
  parts << "EP"
563
575
 
564
576
  if id.number
565
- number_str = id.number.render(context: @context)
577
+ number_str = id.number
566
578
 
567
579
  if id.part
568
- part_val = id.part.render(context: @context)
580
+ part_val = id.part
569
581
  number_str += "-#{part_val.to_s.strip}"
570
582
  end
571
583
  if id.subpart
572
- subpart_val = id.subpart.render(context: @context)
584
+ subpart_val = id.subpart
573
585
  number_str += "-#{subpart_val.to_s.strip}"
574
586
  end
575
587
 
@@ -589,7 +601,7 @@ module Pubid
589
601
  end
590
602
 
591
603
  def render_expert_commentary(id)
592
- base_str = id.base_identifier.to_s
604
+ base_str = id.base.to_s
593
605
  base_str = base_str.sub(/ (Expert Commentary|ExComm(\s*\(.*\))?)$/, "")
594
606
 
595
607
  case id.format
@@ -607,14 +619,14 @@ module Pubid
607
619
  parts << "BS"
608
620
 
609
621
  if id.number
610
- number_str = id.number.render(context: @context)
622
+ number_str = id.number
611
623
 
612
624
  if id.part
613
- part_val = id.part.render(context: @context)
625
+ part_val = id.part
614
626
  number_str += "-#{part_val}"
615
627
  end
616
628
  if id.subpart
617
- subpart_val = id.subpart.render(context: @context)
629
+ subpart_val = id.subpart
618
630
  number_str += "-#{subpart_val}"
619
631
  end
620
632
 
@@ -637,13 +649,13 @@ module Pubid
637
649
  parts << "BSI Flex"
638
650
 
639
651
  if id.number
640
- number_str = id.number.render(context: @context)
652
+ number_str = id.number
641
653
  if id.part
642
- part_val = id.part.render(context: @context)
654
+ part_val = id.part
643
655
  number_str += "-#{part_val}"
644
656
  end
645
657
  if id.subpart
646
- subpart_val = id.subpart.render(context: @context)
658
+ subpart_val = id.subpart
647
659
  number_str += "-#{subpart_val}"
648
660
  end
649
661
  parts << number_str
@@ -665,9 +677,9 @@ module Pubid
665
677
  def render_handbook(id)
666
678
  abbr = id.original_abbr || "Handbook"
667
679
 
668
- number_str = id.number.render(context: @context)
680
+ number_str = id.number
669
681
  if id.part
670
- part_val = id.part.render(context: @context)
682
+ part_val = id.part
671
683
  number_str += "-#{part_val.to_s.strip}"
672
684
  end
673
685
 
@@ -681,7 +693,7 @@ module Pubid
681
693
  parts << id.publisher.to_s if id.publisher
682
694
 
683
695
  if id.number
684
- number_str = id.number.render(context: @context)
696
+ number_str = id.number
685
697
  parts << number_str
686
698
  end
687
699
 
@@ -708,9 +720,9 @@ module Pubid
708
720
  parts << id.publisher.to_s if id.publisher
709
721
 
710
722
  if id.number
711
- number_str = id.number.render(context: @context)
723
+ number_str = id.number
712
724
  if id.part
713
- part_val = id.part.render(context: @context)
725
+ part_val = id.part
714
726
  number_str += "-#{part_val}"
715
727
  end
716
728
  parts << number_str
@@ -771,7 +783,7 @@ module Pubid
771
783
  parts << type_abbr
772
784
 
773
785
  if id.number
774
- number_str = id.number.render(context: @context)
786
+ number_str = id.number
775
787
 
776
788
  if id.second_number
777
789
  second_val = id.second_number.render(context: @context)
@@ -779,11 +791,11 @@ module Pubid
779
791
  end
780
792
 
781
793
  if id.part
782
- part_val = id.part.render(context: @context)
794
+ part_val = id.part
783
795
  number_str += "-#{part_val.to_s.strip}"
784
796
  end
785
797
  if id.subpart
786
- subpart_val = id.subpart.render(context: @context)
798
+ subpart_val = id.subpart
787
799
  number_str += "-#{subpart_val.to_s.strip}"
788
800
  end
789
801
 
@@ -811,7 +823,7 @@ module Pubid
811
823
  parts << type_abbr
812
824
 
813
825
  if id.number
814
- number_str = id.number.render(context: @context)
826
+ number_str = id.number
815
827
 
816
828
  if id.second_number
817
829
  second_val = id.second_number.render(context: @context)
@@ -819,11 +831,11 @@ module Pubid
819
831
  end
820
832
 
821
833
  if id.part
822
- part_val = id.part.render(context: @context)
834
+ part_val = id.part
823
835
  number_str += "-#{part_val.to_s.strip}"
824
836
  end
825
837
  if id.subpart
826
- subpart_val = id.subpart.render(context: @context)
838
+ subpart_val = id.subpart
827
839
  number_str += "-#{subpart_val.to_s.strip}"
828
840
  end
829
841
 
@@ -850,7 +862,7 @@ module Pubid
850
862
  parts << id.publisher.to_s if id.publisher
851
863
 
852
864
  if id.number
853
- number_str = id.number.render(context: @context)
865
+ number_str = id.number
854
866
  parts << number_str
855
867
  end
856
868
 
@@ -886,16 +898,16 @@ module Pubid
886
898
 
887
899
  def render_standalone_amendment(id)
888
900
  base = if id.corrigendum
889
- "AMD Corrigendum #{id.amendment_number}"
901
+ "AMD Corrigendum #{id.number}"
890
902
  else
891
- "AMD #{id.amendment_number}"
903
+ "AMD #{id.number}"
892
904
  end
893
905
 
894
906
  id.parenthesized ? "(#{base})" : base
895
907
  end
896
908
 
897
909
  def render_supplement_document(id)
898
- base_str = id.base_identifier.to_s
910
+ base_str = id.base.to_s
899
911
 
900
912
  if id.reverse_format
901
913
  supplement_str = if id.supplement_type == "No."
@@ -919,14 +931,14 @@ module Pubid
919
931
  parts << "BS"
920
932
 
921
933
  if id.number
922
- number_str = id.number.render(context: @context)
934
+ number_str = id.number
923
935
 
924
936
  if id.part
925
- part_val = id.part.render(context: @context)
937
+ part_val = id.part
926
938
  number_str += "-#{part_val}"
927
939
  end
928
940
  if id.subpart
929
- subpart_val = id.subpart.render(context: @context)
941
+ subpart_val = id.subpart
930
942
  number_str += "-#{subpart_val}"
931
943
  end
932
944
 
@@ -949,14 +961,14 @@ module Pubid
949
961
  parts << "TS"
950
962
 
951
963
  if id.number
952
- number_str = id.number.render(context: @context)
964
+ number_str = id.number
953
965
 
954
966
  if id.part
955
- part_val = id.part.render(context: @context)
967
+ part_val = id.part
956
968
  number_str += "-#{part_val}"
957
969
  end
958
970
  if id.subpart
959
- subpart_val = id.subpart.render(context: @context)
971
+ subpart_val = id.subpart
960
972
  number_str += "-#{subpart_val}"
961
973
  end
962
974
 
@@ -979,7 +991,7 @@ module Pubid
979
991
  parts << "BS"
980
992
 
981
993
  if id.number
982
- number_str = id.number.render(context: @context)
994
+ number_str = id.number
983
995
  parts << number_str
984
996
  end
985
997
 
@@ -998,7 +1010,7 @@ module Pubid
998
1010
  end
999
1011
 
1000
1012
  def render_value_added_publication(id, opts)
1001
- base_str = id.base_identifier.to_s(**opts)
1013
+ base_str = id.base.to_s(**opts)
1002
1014
 
1003
1015
  case id.format
1004
1016
  when "TC"
@@ -9,8 +9,13 @@ module Pubid
9
9
  # `from_hash` (no facade needed).
10
10
  class Identifier < ::Pubid::Identifier
11
11
  def self.parse(string)
12
+ unless string.is_a?(String)
13
+ raise Pubid::Errors::InvalidInputError,
14
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
15
+ end
16
+
12
17
  if string.length > Pubid::MAX_INPUT_LENGTH
13
- raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
18
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
14
19
  end
15
20
 
16
21
  # Delegate to IEC for bare IEC identifiers. This handles IEC-specific
@@ -27,8 +32,6 @@ module Pubid
27
32
 
28
33
  parsed = parser.parse(string)
29
34
  Builder.build(parsed)
30
- rescue Parslet::ParseFailed => e
31
- raise StandardError, "Failed to parse '#{string}': #{e.message}"
32
35
  end
33
36
 
34
37
  attribute :publisher, Bsi::Components::Publisher, default: -> {
@@ -36,10 +39,16 @@ module Pubid
36
39
  }
37
40
  attribute :prefix, :string # Specialized prefix (A, AU, C, M, 2A, etc.)
38
41
  attribute :flex_prefix, :string # Flex type prefix (CECC, E9111, M, etc.)
39
- attribute :number, Bsi::Components::Code
42
+ # `number`/`part`/`subpart` are plain strings, not Bsi::Components::Code:
43
+ # BSI never populates a field of that component beyond `value`. This class
44
+ # body is the sole home of Pubid::Bsi::Identifier (bsi/identifier.rb is a
45
+ # comment-only load stub), so declaring here is safe - every subclass body
46
+ # opens after it has run. `second_number` keeps the component type: it is
47
+ # not one of the three attributes the shared base declares.
48
+ attribute :number, :string
40
49
  attribute :iteration, :string # For bracket notation like 1000[9]
41
- attribute :part, Bsi::Components::Code
42
- attribute :subpart, Bsi::Components::Code
50
+ attribute :part, :string
51
+ attribute :subpart, :string
43
52
  attribute :second_number, Bsi::Components::Code # For collections like PAS 2035/2030
44
53
  attribute :date, Bsi::Components::Date
45
54
  attribute :stage, Pubid::Components::Stage
@@ -61,7 +70,7 @@ module Pubid
61
70
  return num_cmp unless num_cmp.zero?
62
71
 
63
72
  # Then by part
64
- part_cmp = (part || Components::Code.new(value: "0")).to_s <=> (other.part || Components::Code.new(value: "0")).to_s
73
+ part_cmp = (part || "0").to_s <=> (other.part || "0").to_s
65
74
  return part_cmp unless part_cmp.zero?
66
75
 
67
76
  # Then by date
@@ -75,6 +84,54 @@ module Pubid
75
84
  0
76
85
  end
77
86
  end
87
+
88
+ # Annex F series groupings per "Rules for the structure and drafting
89
+ # of UK standards" (BSI, 2017), F.1.3-F.1.5. Each maps a `prefix`
90
+ # token to the broader series category.
91
+ SERIES_CATEGORIES = {
92
+ # F.1.3 Automobile
93
+ "AU" => :automotive,
94
+ # F.1.4 Aerospace
95
+ "A" => :aerospace, "B" => :aerospace, "C" => :aerospace,
96
+ "F" => :aerospace, "G" => :aerospace, "HC" => :aerospace,
97
+ "L" => :aerospace, "S" => :aerospace, "SP" => :aerospace,
98
+ "X" => :aerospace, "M" => :aerospace, "TA" => :aerospace,
99
+ "2A" => :aerospace, "2B" => :aerospace, "2C" => :aerospace,
100
+ "2F" => :aerospace, "2G" => :aerospace, "2HC" => :aerospace,
101
+ "2HR" => :aerospace, "2L" => :aerospace, "2M" => :aerospace,
102
+ "2S" => :aerospace, "2SP" => :aerospace, "2TA" => :aerospace,
103
+ "2X" => :aerospace, "3A" => :aerospace, "3B" => :aerospace,
104
+ "3F" => :aerospace, "3G" => :aerospace, "3HR" => :aerospace,
105
+ "3J" => :aerospace, "3L" => :aerospace, "3S" => :aerospace,
106
+ "3TA" => :aerospace, "4F" => :aerospace, "4L" => :aerospace,
107
+ "4S" => :aerospace, "5S" => :aerospace, "7S" => :aerospace,
108
+ # F.1.5 Marine
109
+ "MA" => :marine, "PL" => :marine, "QC" => :marine,
110
+ }.freeze
111
+
112
+ # Series accessor — semantically named alias for `prefix` per
113
+ # issue #252. Returns the prefix token (e.g., "AU", "MA", "2A").
114
+ def series
115
+ prefix
116
+ end
117
+
118
+ # Series category — one of :automotive, :aerospace, :marine, or nil
119
+ # when the identifier doesn't carry a recognized Annex F prefix.
120
+ def series_category
121
+ SERIES_CATEGORIES[prefix.to_s] if prefix
122
+ end
123
+
124
+ def automotive?
125
+ series_category == :automotive
126
+ end
127
+
128
+ def aerospace?
129
+ series_category == :aerospace
130
+ end
131
+
132
+ def marine?
133
+ series_category == :marine
134
+ end
78
135
  end
79
136
 
80
137
  # Backward-compatible alias: BSI's base class is Pubid::Bsi::Identifier.
@@ -21,8 +21,17 @@ module Pubid
21
21
  parts << identifier.flex_prefix.to_s.downcase
22
22
  end
23
23
 
24
- if identifier.number
25
- number = identifier.number.to_s
24
+ # Fall back to the wrapped document's number. A wrapper — an adopted
25
+ # European norm, a bundle, a set — carries no number of its own, and
26
+ # `AdoptedEuropeanNorm#number` only delegates ONE level, so a
27
+ # "DD ENV ISO 11079:1999" (which adopts a CEN prestandard that is
28
+ # itself a wrapper around the ISO standard) emitted the identity-free
29
+ # `urn:bsi:dd` — the same URN as every other DD adoption. `#root`
30
+ # recurses to the origin document, and for a non-wrapper it is `self`,
31
+ # so this changes nothing for an ordinary identifier.
32
+ urn_number = identifier.number || identifier.root.number
33
+ if urn_number
34
+ number = urn_number.to_s
26
35
  if identifier.iteration && !identifier.iteration.empty?
27
36
  number += "[#{identifier.iteration}]"
28
37
  end
data/lib/pubid/bsi.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module Bsi
5
6
  extend Pubid::PrefixesSupport
@@ -221,8 +222,13 @@ module Pubid
221
222
  ].freeze
222
223
 
223
224
  def self.parse(string)
225
+ unless string.is_a?(String)
226
+ raise Pubid::Errors::InvalidInputError,
227
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
228
+ end
229
+
224
230
  if string.length > Pubid::MAX_INPUT_LENGTH
225
- raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
231
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
226
232
  end
227
233
 
228
234
  Identifier.parse(string)