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
@@ -8,7 +8,7 @@ module Pubid
8
8
  # - "NBS CRPL 1-2_3-1" = Reports 1-2 and 3-1 jointly
9
9
  # - "NBS CRPL 4-m-5" = Report 4, month m, issue 5
10
10
  # - "NBS CRPL c4-4" = Report c4, issue 4
11
- class CrplReport < Base
11
+ class CrplReport < Identifier
12
12
  TYPED_STAGES = [
13
13
  Pubid::Components::TypedStage.new(
14
14
  abbr: ["CRPL", "NBS CRPL", "CRPL-F-B", "CRPL-F-A", "NBS CRPL-F-B",
@@ -88,6 +88,12 @@ module Pubid
88
88
  end
89
89
 
90
90
  def to_s(format = nil)
91
+ # A caller passing `annotated:` reaches this positional parameter as
92
+ # a Hash — Ruby converts keywords for a method that accepts none.
93
+ # The same idiom `Identifiers::Base#to_s` uses. This renderer
94
+ # ignores `format`, so only the flag is read.
95
+ annotated = format.is_a?(Hash) ? format[:annotated] : nil
96
+
91
97
  # Use actual series attribute if it contains subseries (e.g., "CRPL-F-B")
92
98
  # Otherwise use default series_code ("CRPL")
93
99
  series_to_render = if series&.value&.include?("CRPL-F-")
@@ -124,7 +130,7 @@ module Pubid
124
130
  result += append_short_components
125
131
 
126
132
  result += range_notation if range_notation
127
- result
133
+ annotate_plain_render(result, annotated: annotated)
128
134
  end
129
135
  end
130
136
  end
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Examples:
8
8
  # - "NIST 2022-04-15 001" (short) / "NIST.2022-04-15.001" (mr/doi)
9
9
  # DOI 10.6028/NIST.2022-04-15.001
10
- class DatedDocument < Base
10
+ class DatedDocument < Identifier
11
11
  # Empty so the bare "NIST" abbr never shadows a series lookup; the
12
12
  # Router guard (parsed_hash[:dated_date] && :dated_seq) is the dispatch path.
13
13
  TYPED_STAGES = [].freeze
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Examples:
8
8
  # - "FIPS 140-3" (no NIST prefix)
9
9
  # - "NIST FIPS 140-3" (also accepted, normalizes to FIPS 140-3)
10
- class FederalInformationProcessingStandards < Base
10
+ class FederalInformationProcessingStandards < Identifier
11
11
  TYPED_STAGES = [
12
12
  Pubid::Components::TypedStage.new(
13
13
  abbr: ["FIPS", "NIST FIPS"],
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Examples:
8
8
  # - "NIST GCR 17-917-45" - Basic 3-part number
9
9
  # - "NIST GCR 21-917-48v3B" - With volume and letter suffix
10
- class GrantContractorReport < Base
10
+ class GrantContractorReport < Identifier
11
11
  TYPED_STAGES = [
12
12
  Pubid::Components::TypedStage.new(
13
13
  abbr: ["GCR", "NIST GCR"],
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Examples:
8
8
  # - "NIST HB 130" = Handbook 130
9
9
  # - "NBS HB 133" = NBS Handbook 133
10
- class Handbook < Base
10
+ class Handbook < Identifier
11
11
  TYPED_STAGES = [
12
12
  Pubid::Components::TypedStage.new(
13
13
  abbr: ["HB", "NIST HB", "NBS HB"],
@@ -34,8 +34,15 @@ module Pubid
34
34
  # Override to_s to handle edition+year pattern with dash instead of dot
35
35
  # Pattern: "44e2-1955" (dash separator) not "44e2.1955" (dot separator)
36
36
  def to_s(format = nil)
37
+ # The rewrite below is `$`-anchored, so it has to run on the PLAIN
38
+ # string: with the flag set, `super` returns a string ending in
39
+ # "</span>" and the anchor no longer matches. Render plain, rewrite,
40
+ # then annotate.
41
+ annotated = format.is_a?(Hash) ? format[:annotated] : nil
42
+ format = format[:format] if format.is_a?(Hash)
43
+
37
44
  # Use the base to_s method first
38
- result = super
45
+ result = super(format)
39
46
 
40
47
  # If edition has additional_text (year), replace dot with dash
41
48
  if edition&.additional_text && !edition.additional_text.empty?
@@ -43,7 +50,7 @@ module Pubid
43
50
  "#{edition.type}#{edition.id}-#{edition.additional_text}")
44
51
  end
45
52
 
46
- result
53
+ annotate_plain_render(result, annotated: annotated)
47
54
  end
48
55
  end
49
56
  end
@@ -8,7 +8,7 @@ module Pubid
8
8
  # - "NIST IR 8115" = Interagency Report 8115
9
9
  # - "NIST IR 8115r1" = Interagency Report 8115 revision 1
10
10
  # - "NBS IR 73-197" = NBS Interagency Report 73-197
11
- class InteragencyReport < Base
11
+ class InteragencyReport < Identifier
12
12
  TYPED_STAGES = [
13
13
  Pubid::Components::TypedStage.new(
14
14
  abbr: ["IR", "NIST IR", "NBS IR"],
@@ -37,6 +37,11 @@ module Pubid
37
37
  # @param format [Symbol, Hash, nil] output format
38
38
  # @return [String] formatted identifier
39
39
  def to_s(format = nil)
40
+ # `super` is handed a SYMBOL below, so the base's annotation hook
41
+ # never sees the flag. Capture it here and wrap what comes back —
42
+ # exactly once, because the base returned plain text.
43
+ annotated = format.is_a?(Hash) ? format[:annotated] : nil
44
+
40
45
  # Handle both keyword argument (hash) and positional argument (symbol/string)
41
46
  effective_format = if format.is_a?(Hash)
42
47
  format[:format]
@@ -45,11 +50,13 @@ module Pubid
45
50
  end
46
51
 
47
52
  # If explicit format is specified, use it. Otherwise, default to short.
48
- if effective_format.nil?
49
- super(:short)
50
- else
51
- super(effective_format)
52
- end
53
+ rendered = if effective_format.nil?
54
+ super(:short)
55
+ else
56
+ super(effective_format)
57
+ end
58
+
59
+ annotate_plain_render(rendered, annotated: annotated)
53
60
  end
54
61
  end
55
62
  end
@@ -11,7 +11,7 @@ module Pubid
11
11
  # - "NBS LC 378sup12/1926" - With supplement date
12
12
  # - "NBS LC 378r11/1925" - With revision date
13
13
  # - "NBS LC 378(sp)" - With language code
14
- class LetterCircular < Base
14
+ class LetterCircular < Identifier
15
15
  TYPED_STAGES = [
16
16
  Pubid::Components::TypedStage.new(
17
17
  abbr: ["LCIRC"], # Single definition of truth
@@ -8,7 +8,7 @@ module Pubid
8
8
  # - "NBS MP 39e1" - Edition with "e" notation
9
9
  # - "NBS MP 260e1965" - Edition with year as edition ID
10
10
  # NOTE: Parenthetical edition format (e.g., "39(1)") does NOT exist for MP identifiers
11
- class MiscellaneousPublication < Base
11
+ class MiscellaneousPublication < Identifier
12
12
  TYPED_STAGES = [
13
13
  Pubid::Components::TypedStage.new(
14
14
  abbr: ["MP", "NBS MP"],
@@ -36,13 +36,21 @@ module Pubid
36
36
  "MP"
37
37
  end
38
38
 
39
+ # A caller passing `annotated:` reaches this positional parameter as a
40
+ # Hash — Ruby converts keywords for a method that accepts none. The same
41
+ # idiom `Identifiers::Base#to_s` uses.
39
42
  def to_s(format = :short)
40
- case format
41
- when :mr
42
- to_mr_style
43
- else
44
- to_short_style
45
- end
43
+ annotated = format.is_a?(Hash) ? format[:annotated] : nil
44
+ format = format[:format] || :short if format.is_a?(Hash)
45
+
46
+ rendered = case format
47
+ when :mr
48
+ to_mr_style
49
+ else
50
+ to_short_style
51
+ end
52
+
53
+ annotate_plain_render(rendered, annotated: annotated)
46
54
  end
47
55
 
48
56
  public
@@ -10,7 +10,7 @@ module Pubid
10
10
  # - "NBS MONO 128pt1" - Monograph with part
11
11
  # - "NIST MONO 1-1F" - Monograph with letter suffix
12
12
  # - "NIST MONO 1-2Bv1" - Monograph with letter suffix and volume
13
- class Monograph < Base
13
+ class Monograph < Identifier
14
14
  TYPED_STAGES = [
15
15
  Pubid::Components::TypedStage.new(
16
16
  abbr: ["MONO", "NBS MONO", "NIST MONO"],
@@ -35,6 +35,11 @@ module Pubid
35
35
  end
36
36
 
37
37
  def to_s(format = nil)
38
+ # `super` is handed a SYMBOL below, so the base's annotation hook
39
+ # never sees the flag. Capture it here and wrap what comes back —
40
+ # exactly once, because the base returned plain text.
41
+ annotated = format.is_a?(Hash) ? format[:annotated] : nil
42
+
38
43
  # Handle both keyword argument (hash) and positional argument (symbol/string)
39
44
  effective_format = if format.is_a?(Hash)
40
45
  format[:format]
@@ -43,13 +48,15 @@ module Pubid
43
48
  end
44
49
 
45
50
  # If explicit format is specified, use it. Otherwise, default to short.
46
- if effective_format.nil?
47
- super(:short)
48
- elsif effective_format == :mr
49
- to_mr_style
50
- else
51
- super(effective_format)
52
- end
51
+ rendered = if effective_format.nil?
52
+ super(:short)
53
+ elsif effective_format == :mr
54
+ to_mr_style
55
+ else
56
+ super(effective_format)
57
+ end
58
+
59
+ annotate_plain_render(rendered, annotated: annotated)
53
60
  end
54
61
 
55
62
  private
@@ -8,7 +8,7 @@ module Pubid
8
8
  # - "NIST NCSTAR 1-1Cv1" → "NIST NCSTAR 1-1Cv1" (round-trips)
9
9
  # - "NIST NCSTAR 1-1b" → "NIST NCSTAR 1-1B" (normalizes letter)
10
10
  # - "NIST NCSTAR 1-1cv1" → "NIST NCSTAR 1-1Cv1" (normalizes letter, keeps v1 format)
11
- class Ncstar < Base
11
+ class Ncstar < Identifier
12
12
  TYPED_STAGES = [
13
13
  Pubid::Components::TypedStage.new(
14
14
  abbr: ["NCSTAR", "NIST NCSTAR"],
@@ -34,7 +34,7 @@ module Pubid
34
34
 
35
35
  # NCSTAR-specific: do NOT expand Cv patterns to ", Volume" format
36
36
  # The base class would render "1-1Cv1" as is, which is correct for NCSTAR
37
- # No custom rendering needed - just inherit from Base
37
+ # No custom rendering needed - just inherit from Identifier
38
38
  end
39
39
  end
40
40
  end
@@ -8,7 +8,7 @@ module Pubid
8
8
  # - "NBS NSRDS 1" - Basic NSRDS
9
9
  # - "NSRDS-NBS 1" - With hyphen prefix
10
10
  # - "NBS NSRDS 1p1" - With part notation
11
- class Nsrds < Base
11
+ class Nsrds < Identifier
12
12
  TYPED_STAGES = [
13
13
  Pubid::Components::TypedStage.new(
14
14
  abbr: ["NSRDS", "NBS NSRDS"],
@@ -6,7 +6,7 @@ module Pubid
6
6
  # NIST OWMWP (Office of Weights and Measures Workshop Proceedings)
7
7
  # Examples:
8
8
  # - "NIST OWMWP 06-13-2018" - Date-based format MM-DD-YYYY
9
- class Owmwp < Base
9
+ class Owmwp < Identifier
10
10
  TYPED_STAGES = [
11
11
  Pubid::Components::TypedStage.new(
12
12
  abbr: ["OWMWP", "NIST OWMWP"],
@@ -11,7 +11,7 @@ module Pubid
11
11
  # - "NBS RPT ADHOC" - Ad hoc report
12
12
  # - "NBS RPT div9" - Division report
13
13
  # - "NBS RPT 4817-A" - Report with letter suffix
14
- class Report < Base
14
+ class Report < Identifier
15
15
  TYPED_STAGES = [
16
16
  Pubid::Components::TypedStage.new(
17
17
  abbr: ["RPT", "NBS RPT"],
@@ -39,13 +39,21 @@ module Pubid
39
39
  "RPT"
40
40
  end
41
41
 
42
+ # A caller passing `annotated:` reaches this positional parameter as a
43
+ # Hash — Ruby converts keywords for a method that accepts none. The same
44
+ # idiom `Identifiers::Base#to_s` uses.
42
45
  def to_s(format = :short)
43
- case format
44
- when :mr
45
- to_mr_style
46
- else
47
- to_short_style
48
- end
46
+ annotated = format.is_a?(Hash) ? format[:annotated] : nil
47
+ format = format[:format] || :short if format.is_a?(Hash)
48
+
49
+ rendered = case format
50
+ when :mr
51
+ to_mr_style
52
+ else
53
+ to_short_style
54
+ end
55
+
56
+ annotate_plain_render(rendered, annotated: annotated)
49
57
  end
50
58
 
51
59
  private
@@ -8,7 +8,16 @@ module Pubid
8
8
  # - "NIST SP 800-53" = Special Publication 800-53
9
9
  # - "NIST SP 800-53r5" = Special Publication 800-53 revision 5
10
10
  # - "NIST SP 800-57pt1r4" = Special Publication 800-57 part 1 revision 4
11
- class SpecialPublication < Base
11
+ class SpecialPublication < Identifier
12
+ # Per Appendix A.2 of the NIST PubID Syntax (April 2022), the SP series
13
+ # is subdivided into named subseries. The subseries number is the
14
+ # leading token of a report-num like "800-53" or "1190GB-12". The
15
+ # Builder exposes this as `identifier.subseries` so callers can query
16
+ # which subseries a document belongs to.
17
+ SP_SUBSERIES = %w[
18
+ 250 260 300 400 480 500 700 800 823 960 1190GB 1200 1500 1800 1900 2000 2100
19
+ ].freeze
20
+
12
21
  TYPED_STAGES = [
13
22
  Pubid::Components::TypedStage.new(
14
23
  abbr: ["SP", "NIST SP", "NBS SP"], # Compound series
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Examples:
8
8
  # - "NIST TN 1234" = Technical Note 1234
9
9
  # - "NBS TN 567" = NBS Technical Note 567
10
- class TechnicalNote < Base
10
+ class TechnicalNote < Identifier
11
11
  TYPED_STAGES = [
12
12
  Pubid::Components::TypedStage.new(
13
13
  abbr: ["TN", "NIST TN", "NBS TN"],
@@ -3,7 +3,6 @@
3
3
  module Pubid
4
4
  module Nist
5
5
  module Identifiers
6
- autoload :Base, "#{__dir__}/identifiers/base"
7
6
  autoload :Circular, "#{__dir__}/identifiers/circular"
8
7
  autoload :CircularSupplement, "#{__dir__}/identifiers/circular_supplement"
9
8
  autoload :CommercialStandard, "#{__dir__}/identifiers/commercial_standard"
@@ -6,7 +6,7 @@ module Pubid
6
6
  module Nist
7
7
  # Parser class for NIST identifiers
8
8
  # Single Responsibility: Parsing NIST identifier syntax
9
- class Parser < Parslet::Parser
9
+ class Parser < ::Pubid::Parser::Grammar
10
10
 
11
11
  # Class-level parse method with preprocessing.
12
12
  # Delegates all string normalization to Nist::Preprocessor, then
@@ -346,6 +346,16 @@ module Pubid
346
346
  match("[0-9]").repeat(1).as(:dated_seq)
347
347
  end
348
348
 
349
+ # "NIST Research Library (YYYY)" — one-off NIST publication that doesn't
350
+ # fit the standard series+number shape (no report number, year in parens).
351
+ # See pubid/pubid#151.
352
+ rule(:research_library_identifier) do
353
+ publisher >> space >>
354
+ str("Research Library").as(:series) >>
355
+ (space >> str("(") >>
356
+ match("[0-9]").repeat(4, 4).as(:year) >> str(")")).maybe
357
+ end
358
+
349
359
  # LEGACY EDITION PATTERNS (for backward compatibility during migration)
350
360
  # These will be gradually replaced as we migrate to proper Edition/Date components
351
361
  rule(:legacy_edition) do
@@ -438,7 +448,12 @@ module Pubid
438
448
 
439
449
  # Volume
440
450
  rule(:volume) do
441
- (space.maybe >> (str("v") | str(" Vol. "))) >>
451
+ # Long-form "Vol." comes FIRST so PEG ordered choice doesn't commit to
452
+ # the bare "v" alternative after consuming the leading space via
453
+ # space.maybe (which would then starve the " Vol. " form). Both
454
+ # "Vol. 4" (period + space) and "Vol.4" (period only) are accepted.
455
+ (space.maybe >>
456
+ (str("Vol. ") | str("Vol.") | str("v"))) >>
442
457
  (digits >>
443
458
  # Support letter ranges (lowercase normalized in preprocessing)
444
459
  (str("a-l") | str("m-z") | str("A-L") | str("M-Z")).maybe >>
@@ -448,7 +463,8 @@ module Pubid
448
463
 
449
464
  # Part - enhanced to support patterns like p1adde1 AND pt3r1 (part with revision)
450
465
  rule(:part) do
451
- ((space.maybe >> (str("pt") | str("p") | str("P"))) | str(" Part ")) >>
466
+ (str(" Part. ") | str(" Part.") | str(" Part ") |
467
+ (space.maybe >> (str("pt") | str("p") | str("P")))) >>
452
468
  (digits >>
453
469
  # NEW: Revision after part number: pt3r1, p1r1 (space.maybe for preprocessing)
454
470
  (space.maybe >> str("r") >> digits).maybe >>
@@ -474,7 +490,8 @@ module Pubid
474
490
  # Enhanced to accept letter-only revisions and space before r
475
491
  # ENHANCED: Accept BOTH lowercase and uppercase letters in suffix
476
492
  # ENHANCED: Capture original format prefix for format preservation (e.g., " Rev. 5")
477
- ((str(" rev ") | str("rev") | str(" r") | str("r") | str(" Rev. ") | str(" Revision (r)")).as(:revision_prefix) >>
493
+ ((str(" rev ") | str("rev") | str(" r") | str("r") | str(" Rev. ") | str(" Rev.") | str(" Revision (r)")).as(:revision_prefix) >>
494
+ space.maybe >>
478
495
  ((digits >> match("[a-zA-Z]").maybe) | match("[a-zA-Z]").repeat(1)).as(:revision_id)).as(:revision) |
479
496
  # NEW: Standalone 'r' - MUST BE LAST to avoid consuming from other patterns
480
497
  # Matches " r" at end of input (after preprocessing: "800-56a r", "800-27 r")
@@ -656,6 +673,7 @@ module Pubid
656
673
  circ_supplement_identifier |
657
674
  dated_identifier |
658
675
  mr_identifier |
676
+ research_library_identifier |
659
677
  (
660
678
  # Compound series (includes publisher in series name)
661
679
  compound_series >> (space | dot) >>
@@ -690,6 +708,11 @@ module Pubid
690
708
  # Date range supplement (no base number)
691
709
  (str("supp") >> month_abbrev.as(:supp_month_start) >> digits.as(:supp_year_start) >>
692
710
  dash >> month_abbrev.as(:supp_month_end) >> digits.as(:supp_year_end)).as(:supplement_date_range) |
711
+ # Year-only date range supplement to the whole series, no months
712
+ # (e.g. "NBS CIRC sup1925-1926" — pubid/pubid#152). Requires two
713
+ # 4-digit years so it can't swallow "sup3/1926" or a base number.
714
+ ((str("supp") | str("sup")) >> match("[0-9]").repeat(4, 4).as(:supp_year_start) >>
715
+ dash >> match("[0-9]").repeat(4, 4).as(:supp_year_end)).as(:supplement_date_range) |
693
716
  # With base identifier + supplement
694
717
  (
695
718
  # Capture base portion (everything before "supp" or "sup" or slash+year)
@@ -343,6 +343,21 @@ module Pubid
343
343
  revert_handbook_edition!
344
344
  revert_owmwp_date!
345
345
  revert_report_year_range!
346
+ revert_circ_supplement_year_range!
347
+ end
348
+
349
+ # CIRC/LCIRC year-only series supplements: "NBS CIRC sup1925-1926" is a
350
+ # supplement spanning a year range, so the trailing "-1926" is a range
351
+ # end, not an edition. convert_dashyear_to_edition! would have rewritten
352
+ # it to "sup1925e1926"; restore the dash so the circ_supplement_identifier
353
+ # grammar can read the range (pubid/pubid#152).
354
+ def revert_circ_supplement_year_range!
355
+ return unless @cleaned.include?("CIRC")
356
+
357
+ # Anchor on the series prefix ("CIRC " / "CIRC." / "LCIRC ") so only the
358
+ # whole-series form (sup right after the series, no base number) is
359
+ # reverted — a based "24sup1940e1950" keeps its genuine edition.
360
+ @cleaned = @cleaned.gsub(/(CIRC[ .])(supp?)(\d{4})e(\d{4})(?=\s|$)/, '\1\2\3-\4')
346
361
  end
347
362
 
348
363
  # HB handbooks: "HB 130e1979" → "HB 130-1979" (year is part of
@@ -127,10 +127,10 @@ module Pubid
127
127
  # instead of an injected dependency.
128
128
  typed_stage = Pubid::Nist.locate_stage(series)
129
129
  if typed_stage
130
- Pubid::Nist.locate_type(typed_stage.type_code) || Identifiers::Base
130
+ Pubid::Nist.locate_type(typed_stage.type_code) || Identifier
131
131
  else
132
132
  # Fallback to Base for unmapped series (e.g., "AMS", "VTS")
133
- Identifiers::Base
133
+ Identifier
134
134
  end
135
135
  end
136
136
 
@@ -36,8 +36,6 @@ module Pubid
36
36
  )
37
37
  edition_obj = Components::Edition.new(type: "r", id: "1")
38
38
  identifier.edition = edition_obj
39
- identifier.edition_component = edition_obj
40
- identifier.revision = "r1"
41
39
  true
42
40
  end
43
41
 
@@ -52,7 +50,6 @@ module Pubid
52
50
  value: "#{match[1]}-#{match[2]}",
53
51
  )
54
52
  identifier.edition = nil
55
- identifier.edition_component = nil
56
53
  end
57
54
  end
58
55
  end
@@ -6,34 +6,49 @@ module Pubid
6
6
  # Supplements wrap a base identifier with additional edition information
7
7
  #
8
8
  # Architecture follows ISO pattern:
9
- # - base_identifier: The base document being supplemented
9
+ # - base: The base document being supplemented
10
10
  # - edition: Edition information for the supplement
11
11
  #
12
12
  # Examples:
13
13
  # - "NBS CIRC 101e2supp" → CircularSupplement(base: "NBS CIRC 101", edition: e2)
14
14
  # - "NBS CIRC 25supp-1924" → CircularSupplement(base: "NBS CIRC 25", edition: 1924)
15
- class SupplementIdentifier < Identifiers::Base
16
- attribute :base_identifier, Identifiers::Base, polymorphic: true
15
+ class SupplementIdentifier < Identifier
16
+ attribute :base, Identifier, polymorphic: true
17
17
 
18
- # Delegate publisher to base_identifier
18
+ # Delegate publisher to base
19
19
  def publisher
20
- base_identifier&.publisher
20
+ base&.publisher
21
21
  end
22
22
 
23
- # Delegate series to base_identifier
23
+ # Delegate series to base
24
24
  def series
25
- base_identifier&.series
25
+ base&.series
26
26
  end
27
27
 
28
+ # Four exits — a date range, a base-less delegation, an update form and
29
+ # the canonical one — so the composition stays whole in its own method
30
+ # and `to_s` wraps its single result. `super` is not reachable from a
31
+ # private method, so it is handed in as a block.
28
32
  def to_s(format = :short)
33
+ annotated = format.is_a?(Hash) ? format[:annotated] : nil
34
+ format = format[:format] || :short if format.is_a?(Hash)
35
+
36
+ rendered = render_plain(format) { super(format) }
37
+
38
+ annotate_plain_render(rendered, annotated: annotated)
39
+ end
40
+
41
+ private
42
+
43
+ def render_plain(format)
29
44
  # Handle date range supplements (no base identifier)
30
45
  if supplement_date_range_start && supplement_date_range_end
31
46
  return "NBS CIRC sup#{supplement_date_range_start}-#{supplement_date_range_end}"
32
47
  end
33
48
 
34
- return super unless base_identifier
49
+ return yield unless base
35
50
 
36
- result = base_identifier.to_s(format)
51
+ result = base.to_s(format)
37
52
 
38
53
  # NEW: Handle update attribute (e.g., "Upd12-1926" for supplement patterns)
39
54
  if update
data/lib/pubid/nist.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module Nist
5
6
  extend Pubid::PrefixesSupport
@@ -21,7 +22,7 @@ module Pubid
21
22
  autoload :CircularSupplementBuilder, "#{__dir__}/nist/circular_supplement_builder"
22
23
  autoload :Components, "#{__dir__}/nist/components"
23
24
  autoload :Configuration, "#{__dir__}/nist/configuration"
24
- autoload :Identifier, "#{__dir__}/nist/identifier"
25
+ autoload :Identifier, "#{__dir__}/nist/identifiers/base"
25
26
  autoload :Identifiers, "#{__dir__}/nist/identifiers"
26
27
  autoload :Parser, "#{__dir__}/nist/parser"
27
28
  autoload :ParserOutputNormalizer, "#{__dir__}/nist/parser_output_normalizer"
@@ -37,7 +38,7 @@ module Pubid
37
38
  #
38
39
  # NIST identifier classes use `typed_stages` (not the `self.type` Hash
39
40
  # pattern used by CEN/JCGM/ANSI), so they cannot be auto-discovered.
40
- # Identifiers::Base is the fallback for unmapped series (e.g. AMS, VTS)
41
+ # Identifier is the fallback for unmapped series (e.g. AMS, VTS)
41
42
  # and must be excluded from typed-stage aggregation.
42
43
  IDENTIFIER_TYPES = [
43
44
  Identifiers::SpecialPublication,
@@ -60,15 +61,20 @@ module Pubid
60
61
  Identifiers::CommercialStandardEmergency,
61
62
  Identifiers::CommercialStandardsMonthly,
62
63
  Identifiers::DatedDocument,
63
- Identifiers::Base, # Fallback for unmapped series
64
+ Identifier, # Fallback for unmapped series
64
65
  ].freeze
65
66
 
66
67
  # Parse a NIST identifier string
67
68
  # @param identifier [String] the identifier string to parse
68
- # @return [Identifiers::Base] the parsed identifier
69
+ # @return [Identifier] the parsed identifier
69
70
  def self.parse(identifier)
71
+ unless identifier.is_a?(String)
72
+ raise Pubid::Errors::InvalidInputError,
73
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
74
+ end
75
+
70
76
  if identifier.length > Pubid::MAX_INPUT_LENGTH
71
- raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
77
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
72
78
  end
73
79
 
74
80
  # Use the Parser class's preprocessing method
@@ -87,36 +93,36 @@ module Pubid
87
93
  end
88
94
 
89
95
  # Per-flavor format registry: inherits global formats, overrides :human
90
- Identifiers::Base.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
91
- Identifiers::Base.format_registry.register(:human, renderer: Nist::Renderer)
96
+ Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
97
+ Identifier.format_registry.register(:human, renderer: Nist::Renderer)
92
98
 
93
99
  # All identifier classes for external consumption (export, website).
94
- # Identifiers::Base is the fallback for unmapped series and is excluded
100
+ # Identifier is the fallback for unmapped series and is excluded
95
101
  # from external type listings.
96
102
  # @return [Array<Class>] identifier classes
97
103
  def self.identifier_types
98
- IDENTIFIER_TYPES.reject { |klass| klass == Identifiers::Base }
104
+ IDENTIFIER_TYPES.reject { |klass| klass == Identifier }
99
105
  end
100
106
 
101
107
  # Aggregate TYPED_STAGES from all identifier classes.
102
- # Identifiers::Base is excluded because it has no typed stages and acts
108
+ # Identifier is excluded because it has no typed stages and acts
103
109
  # as the fallback for unmapped series.
104
110
  # @return [Array<Pubid::Components::TypedStage>] all typed stages
105
111
  def self.all_typed_stages
106
112
  @all_typed_stages ||= identifier_types
107
- .reject { |klass| klass == Identifiers::Base }
113
+ .reject { |klass| klass == Identifier }
108
114
  .flat_map(&:typed_stages)
109
115
  .freeze
110
116
  end
111
117
 
112
118
  # Lookup: type code -> identifier class.
113
- # Identifiers::Base is excluded so it never gets selected by type code.
119
+ # Identifier is excluded so it never gets selected by type code.
114
120
  # @param code [String, Symbol] the type code to find
115
121
  # @return [Class, nil] the matching identifier class, or nil
116
122
  def self.locate_type(code)
117
123
  type_str = code.to_s
118
124
  identifier_types
119
- .reject { |klass| klass == Identifiers::Base }
125
+ .reject { |klass| klass == Identifier }
120
126
  .find { |klass| klass.typed_stages.any? { |ts| ts.type_code.to_s == type_str } }
121
127
  end
122
128