pubid 2.0.0.alpha.10 → 2.0.0.pre.alpha.1

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 (811) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +51 -54
  3. data/data/iec/update_codes.yaml +0 -3
  4. data/data/ieee/update_codes.yaml +1 -107
  5. data/data/nist/update_codes.yaml +0 -35
  6. data/lib/pubid/amca/builder.rb +6 -6
  7. data/lib/pubid/amca/identifier.rb +16 -2
  8. data/lib/pubid/amca/identifiers/base.rb +46 -74
  9. data/lib/pubid/amca/identifiers/interpretation.rb +30 -17
  10. data/lib/pubid/amca/identifiers/publication.rb +27 -14
  11. data/lib/pubid/amca/identifiers/standard.rb +5 -3
  12. data/lib/pubid/amca/identifiers.rb +1 -0
  13. data/lib/pubid/amca/parser.rb +1 -1
  14. data/lib/pubid/amca/scheme.rb +16 -0
  15. data/lib/pubid/amca/single_identifier.rb +24 -1
  16. data/lib/pubid/amca/urn_generator.rb +3 -4
  17. data/lib/pubid/amca.rb +3 -50
  18. data/lib/pubid/ansi/builder.rb +5 -7
  19. data/lib/pubid/ansi/identifier.rb +1 -19
  20. data/lib/pubid/ansi/identifiers/american_national_standard.rb +1 -2
  21. data/lib/pubid/ansi/identifiers/standard.rb +3 -2
  22. data/lib/pubid/ansi/parser.rb +1 -1
  23. data/lib/pubid/ansi/scheme.rb +15 -0
  24. data/lib/pubid/ansi/single_identifier.rb +31 -2
  25. data/lib/pubid/ansi/urn_generator.rb +38 -3
  26. data/lib/pubid/ansi.rb +6 -47
  27. data/lib/pubid/api/builder.rb +72 -45
  28. data/lib/pubid/api/identifier.rb +9 -30
  29. data/lib/pubid/api/identifiers/base.rb +14 -2
  30. data/lib/pubid/api/identifiers/bulletin.rb +2 -0
  31. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +2 -0
  32. data/lib/pubid/api/identifiers/mpms.rb +28 -10
  33. data/lib/pubid/api/identifiers/publication.rb +2 -0
  34. data/lib/pubid/api/identifiers/recommended_practice.rb +2 -0
  35. data/lib/pubid/api/identifiers/specification.rb +2 -0
  36. data/lib/pubid/api/identifiers/standard.rb +2 -0
  37. data/lib/pubid/api/identifiers/technical_report.rb +2 -0
  38. data/lib/pubid/api/identifiers/typeless_standard.rb +16 -0
  39. data/lib/pubid/api/parser.rb +1 -1
  40. data/lib/pubid/api/scheme.rb +66 -0
  41. data/lib/pubid/api/single_identifier.rb +32 -10
  42. data/lib/pubid/api/urn_generator.rb +18 -0
  43. data/lib/pubid/api.rb +5 -56
  44. data/lib/pubid/ashrae/builder.rb +35 -56
  45. data/lib/pubid/ashrae/identifier.rb +16 -6
  46. data/lib/pubid/ashrae/identifiers/addenda_package.rb +11 -7
  47. data/lib/pubid/ashrae/identifiers/addendum.rb +20 -9
  48. data/lib/pubid/ashrae/identifiers/base.rb +15 -111
  49. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +16 -8
  50. data/lib/pubid/ashrae/identifiers/errata.rb +10 -9
  51. data/lib/pubid/ashrae/identifiers/guideline.rb +0 -3
  52. data/lib/pubid/ashrae/identifiers/interpretation.rb +10 -16
  53. data/lib/pubid/ashrae/identifiers/standard.rb +0 -3
  54. data/lib/pubid/ashrae/identifiers.rb +1 -0
  55. data/lib/pubid/ashrae/parser.rb +16 -40
  56. data/lib/pubid/ashrae/scheme.rb +53 -0
  57. data/lib/pubid/ashrae/single_identifier.rb +14 -1
  58. data/lib/pubid/ashrae/supplement_identifier.rb +6 -21
  59. data/lib/pubid/ashrae/urn_generator.rb +10 -8
  60. data/lib/pubid/ashrae.rb +2 -58
  61. data/lib/pubid/asme/builder.rb +2 -11
  62. data/lib/pubid/asme/components/code.rb +2 -10
  63. data/lib/pubid/asme/identifier.rb +0 -9
  64. data/lib/pubid/asme/identifiers/base.rb +60 -0
  65. data/lib/pubid/asme/identifiers/standard.rb +2 -86
  66. data/lib/pubid/asme/parser.rb +1 -1
  67. data/lib/pubid/asme/scheme.rb +37 -0
  68. data/lib/pubid/asme/single_identifier.rb +2 -11
  69. data/lib/pubid/asme/urn_generator.rb +2 -2
  70. data/lib/pubid/asme.rb +1 -47
  71. data/lib/pubid/astm/builder.rb +3 -10
  72. data/lib/pubid/astm/components/code.rb +0 -9
  73. data/lib/pubid/astm/identifier.rb +0 -9
  74. data/lib/pubid/astm/identifiers/adjunct.rb +9 -16
  75. data/lib/pubid/astm/identifiers/data_series.rb +14 -2
  76. data/lib/pubid/astm/identifiers/iso_dual_published.rb +34 -25
  77. data/lib/pubid/astm/identifiers/manual.rb +25 -8
  78. data/lib/pubid/astm/identifiers/monograph.rb +14 -2
  79. data/lib/pubid/astm/identifiers/research_report.rb +5 -8
  80. data/lib/pubid/astm/identifiers/standard.rb +37 -8
  81. data/lib/pubid/astm/identifiers/technical_report.rb +13 -2
  82. data/lib/pubid/astm/identifiers/work_in_progress.rb +10 -1
  83. data/lib/pubid/astm/parser.rb +1 -1
  84. data/lib/pubid/astm/scheme.rb +55 -0
  85. data/lib/pubid/astm/single_identifier.rb +10 -32
  86. data/lib/pubid/astm/urn_generator.rb +5 -7
  87. data/lib/pubid/astm.rb +27 -44
  88. data/lib/pubid/bsi/builder.rb +107 -119
  89. data/lib/pubid/bsi/identifier.rb +25 -4
  90. data/lib/pubid/bsi/identifiers/addendum_document.rb +37 -3
  91. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +47 -19
  92. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +39 -8
  93. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +55 -2
  94. data/lib/pubid/bsi/identifiers/amendment.rb +22 -30
  95. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  96. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +7 -1
  97. data/lib/pubid/bsi/identifiers/british_standard.rb +1 -2
  98. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +87 -13
  99. data/lib/pubid/bsi/identifiers/committee_document.rb +17 -10
  100. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +87 -19
  101. data/lib/pubid/bsi/identifiers/corrigendum.rb +10 -26
  102. data/lib/pubid/bsi/identifiers/detailed_specification.rb +36 -0
  103. data/lib/pubid/bsi/identifiers/disc.rb +29 -0
  104. data/lib/pubid/bsi/identifiers/draft_document.rb +46 -2
  105. data/lib/pubid/bsi/identifiers/electronic_book.rb +38 -2
  106. data/lib/pubid/bsi/identifiers/expert_commentary.rb +21 -10
  107. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +47 -0
  108. data/lib/pubid/bsi/identifiers/flex.rb +34 -3
  109. data/lib/pubid/bsi/identifiers/handbook.rb +17 -1
  110. data/lib/pubid/bsi/identifiers/index.rb +32 -0
  111. data/lib/pubid/bsi/identifiers/method.rb +41 -0
  112. data/lib/pubid/bsi/identifiers/national_annex.rb +29 -4
  113. data/lib/pubid/bsi/identifiers/practice_guide.rb +7 -1
  114. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +54 -2
  115. data/lib/pubid/bsi/identifiers/published_document.rb +54 -2
  116. data/lib/pubid/bsi/identifiers/section.rb +30 -0
  117. data/lib/pubid/bsi/identifiers/set.rb +20 -14
  118. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -10
  119. data/lib/pubid/bsi/identifiers/supplement_document.rb +25 -3
  120. data/lib/pubid/bsi/identifiers/supplementary_index.rb +46 -0
  121. data/lib/pubid/bsi/identifiers/technical_specification.rb +47 -2
  122. data/lib/pubid/bsi/identifiers/test_method.rb +32 -0
  123. data/lib/pubid/bsi/identifiers/value_added_publication.rb +22 -7
  124. data/lib/pubid/bsi/identifiers.rb +1 -0
  125. data/lib/pubid/bsi/parser.rb +6 -20
  126. data/lib/pubid/bsi/scheme.rb +243 -0
  127. data/lib/pubid/bsi/single_identifier.rb +82 -94
  128. data/lib/pubid/bsi/urn_generator.rb +5 -13
  129. data/lib/pubid/bsi.rb +2 -252
  130. data/lib/pubid/builder/base.rb +13 -62
  131. data/lib/pubid/bundled_identifier.rb +10 -18
  132. data/lib/pubid/ccsds/builder.rb +4 -5
  133. data/lib/pubid/ccsds/identifier.rb +3 -63
  134. data/lib/pubid/ccsds/identifiers/base.rb +51 -14
  135. data/lib/pubid/ccsds/identifiers/corrigendum.rb +8 -9
  136. data/lib/pubid/ccsds/parser.rb +3 -5
  137. data/lib/pubid/ccsds/scheme.rb +57 -0
  138. data/lib/pubid/ccsds/single_identifier.rb +3 -6
  139. data/lib/pubid/ccsds/supplement_identifier.rb +13 -17
  140. data/lib/pubid/ccsds/urn_generator.rb +6 -6
  141. data/lib/pubid/ccsds.rb +1 -44
  142. data/lib/pubid/cen_cenelec/builder.rb +29 -61
  143. data/lib/pubid/cen_cenelec/identifier.rb +5 -28
  144. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +4 -9
  145. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +12 -2
  146. data/lib/pubid/cen_cenelec/identifiers/base.rb +46 -5
  147. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -2
  148. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -2
  149. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +27 -6
  150. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +17 -2
  151. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +4 -62
  152. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +7 -20
  153. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -2
  154. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +6 -2
  155. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -2
  156. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -2
  157. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -2
  158. data/lib/pubid/cen_cenelec/parser.rb +1 -1
  159. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  160. data/lib/pubid/cen_cenelec/single_identifier.rb +91 -10
  161. data/lib/pubid/cen_cenelec/supplement_identifier.rb +7 -6
  162. data/lib/pubid/cen_cenelec/urn_generator.rb +7 -7
  163. data/lib/pubid/cen_cenelec.rb +1 -188
  164. data/lib/pubid/cie/builder.rb +24 -149
  165. data/lib/pubid/cie/components/code.rb +72 -0
  166. data/lib/pubid/cie/identifier.rb +5 -20
  167. data/lib/pubid/cie/identifiers/bundle.rb +5 -35
  168. data/lib/pubid/cie/identifiers/conference.rb +6 -11
  169. data/lib/pubid/cie/identifiers/corrigendum.rb +23 -17
  170. data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
  171. data/lib/pubid/cie/identifiers/identical.rb +9 -9
  172. data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
  173. data/lib/pubid/cie/identifiers/standard.rb +8 -43
  174. data/lib/pubid/cie/identifiers/supplement.rb +25 -27
  175. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +3 -7
  176. data/lib/pubid/cie/identifiers.rb +0 -2
  177. data/lib/pubid/cie/parser.rb +6 -55
  178. data/lib/pubid/cie/scheme.rb +64 -0
  179. data/lib/pubid/cie/single_identifier.rb +5 -44
  180. data/lib/pubid/cie/supplement_identifier.rb +16 -29
  181. data/lib/pubid/cie/urn_generator.rb +8 -11
  182. data/lib/pubid/cie.rb +2 -57
  183. data/lib/pubid/components/code.rb +8 -22
  184. data/lib/pubid/components/date.rb +18 -41
  185. data/lib/pubid/components/edition.rb +6 -9
  186. data/lib/pubid/components/language.rb +4 -6
  187. data/lib/pubid/components/locality.rb +1 -10
  188. data/lib/pubid/components/publisher.rb +6 -9
  189. data/lib/pubid/components/stage.rb +14 -5
  190. data/lib/pubid/components/type.rb +15 -5
  191. data/lib/pubid/components/typed_stage.rb +8 -11
  192. data/lib/pubid/components.rb +0 -4
  193. data/lib/pubid/core/update_codes.rb +7 -28
  194. data/lib/pubid/csa/builder.rb +48 -48
  195. data/lib/pubid/csa/composite_identifier.rb +7 -18
  196. data/lib/pubid/csa/identifier.rb +78 -191
  197. data/lib/pubid/csa/identifiers/base.rb +123 -0
  198. data/lib/pubid/csa/identifiers/bundled.rb +9 -25
  199. data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
  200. data/lib/pubid/csa/identifiers/cec.rb +103 -40
  201. data/lib/pubid/csa/identifiers/combined.rb +69 -97
  202. data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
  203. data/lib/pubid/csa/identifiers/package.rb +4 -4
  204. data/lib/pubid/csa/identifiers/series.rb +104 -0
  205. data/lib/pubid/csa/parser.rb +8 -12
  206. data/lib/pubid/csa/scheme.rb +44 -0
  207. data/lib/pubid/csa/single_identifier.rb +5 -94
  208. data/lib/pubid/csa/urn_generator.rb +2 -9
  209. data/lib/pubid/csa/wrapper_identifier.rb +10 -43
  210. data/lib/pubid/csa.rb +1 -56
  211. data/lib/pubid/etsi/builder.rb +4 -13
  212. data/lib/pubid/etsi/components/code.rb +9 -10
  213. data/lib/pubid/etsi/components/version.rb +5 -0
  214. data/lib/pubid/etsi/identifier.rb +12 -2
  215. data/lib/pubid/etsi/identifiers/base.rb +24 -60
  216. data/lib/pubid/etsi/identifiers/etsi_standard.rb +4 -207
  217. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +14 -46
  218. data/lib/pubid/etsi/identifiers.rb +1 -0
  219. data/lib/pubid/etsi/parser.rb +3 -9
  220. data/lib/pubid/etsi/scheme.rb +42 -0
  221. data/lib/pubid/etsi.rb +2 -52
  222. data/lib/pubid/export/data_class_exporter.rb +59 -0
  223. data/lib/pubid/export/exporter.rb +47 -6
  224. data/lib/pubid/export/flavor_exporter.rb +276 -124
  225. data/lib/pubid/export/ieee_exporter.rb +78 -0
  226. data/lib/pubid/export/itu_exporter.rb +66 -0
  227. data/lib/pubid/export/nist_exporter.rb +64 -0
  228. data/lib/pubid/export/registry_exporter.rb +90 -0
  229. data/lib/pubid/export/scheme_exporter.rb +70 -0
  230. data/lib/pubid/export.rb +6 -0
  231. data/lib/pubid/identifier.rb +37 -920
  232. data/lib/pubid/identifier_metadata.rb +1 -1
  233. data/lib/pubid/identifier_registry.rb +198 -0
  234. data/lib/pubid/idf/builder.rb +7 -7
  235. data/lib/pubid/idf/identifier.rb +13 -23
  236. data/lib/pubid/idf/identifiers/amendment.rb +1 -2
  237. data/lib/pubid/idf/identifiers/corrigendum.rb +1 -2
  238. data/lib/pubid/idf/identifiers/international_standard.rb +1 -2
  239. data/lib/pubid/idf/identifiers/reviewed_method.rb +1 -2
  240. data/lib/pubid/idf/parser.rb +5 -6
  241. data/lib/pubid/idf/scheme.rb +61 -0
  242. data/lib/pubid/idf/supplement_identifier.rb +13 -5
  243. data/lib/pubid/idf/urn_generator.rb +39 -4
  244. data/lib/pubid/idf.rb +1 -65
  245. data/lib/pubid/iec/builder.rb +91 -92
  246. data/lib/pubid/iec/components/code.rb +32 -9
  247. data/lib/pubid/iec/components/publisher.rb +1 -1
  248. data/lib/pubid/iec/identifier.rb +8 -328
  249. data/lib/pubid/iec/identifiers/amendment.rb +5 -8
  250. data/lib/pubid/iec/identifiers/base.rb +31 -7
  251. data/lib/pubid/iec/identifiers/component_specification.rb +13 -3
  252. data/lib/pubid/iec/identifiers/conformity_assessment.rb +12 -1
  253. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +30 -29
  254. data/lib/pubid/iec/identifiers/corrigendum.rb +5 -4
  255. data/lib/pubid/iec/identifiers/fragment_identifier.rb +36 -43
  256. data/lib/pubid/iec/identifiers/guide.rb +18 -0
  257. data/lib/pubid/iec/identifiers/international_standard.rb +9 -24
  258. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +3 -2
  259. data/lib/pubid/iec/identifiers/operational_document.rb +13 -3
  260. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +15 -2
  261. data/lib/pubid/iec/identifiers/sheet_identifier.rb +24 -26
  262. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +13 -3
  263. data/lib/pubid/iec/identifiers/systems_reference_document.rb +13 -2
  264. data/lib/pubid/iec/identifiers/technical_report.rb +21 -3
  265. data/lib/pubid/iec/identifiers/technical_specification.rb +21 -3
  266. data/lib/pubid/iec/identifiers/technology_report.rb +12 -1
  267. data/lib/pubid/iec/identifiers/test_report_form.rb +46 -3
  268. data/lib/pubid/iec/identifiers/vap_identifier.rb +34 -33
  269. data/lib/pubid/iec/identifiers/white_paper.rb +13 -3
  270. data/lib/pubid/iec/identifiers/working_document.rb +60 -26
  271. data/lib/pubid/iec/parser.rb +42 -73
  272. data/lib/pubid/iec/scheme.rb +71 -0
  273. data/lib/pubid/iec/single_identifier.rb +23 -15
  274. data/lib/pubid/iec/supplement_identifier.rb +67 -84
  275. data/lib/pubid/iec/urn_generator.rb +143 -195
  276. data/lib/pubid/iec/urn_parser.rb +246 -85
  277. data/lib/pubid/iec.rb +66 -45
  278. data/lib/pubid/ieee/aiee/builder.rb +3 -17
  279. data/lib/pubid/ieee/aiee/identifier.rb +62 -46
  280. data/lib/pubid/ieee/aiee/parser.rb +1 -1
  281. data/lib/pubid/ieee/builder.rb +81 -398
  282. data/lib/pubid/ieee/components/code.rb +0 -8
  283. data/lib/pubid/ieee/components/draft.rb +0 -54
  284. data/lib/pubid/ieee/components/relationship.rb +149 -5
  285. data/lib/pubid/ieee/identifier.rb +11 -3
  286. data/lib/pubid/ieee/identifiers/adopted_standard.rb +14 -62
  287. data/lib/pubid/ieee/identifiers/base.rb +547 -340
  288. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +12 -6
  289. data/lib/pubid/ieee/identifiers/corrigendum.rb +12 -15
  290. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +13 -24
  291. data/lib/pubid/ieee/identifiers/dual_identifier.rb +7 -3
  292. data/lib/pubid/ieee/identifiers/dual_published.rb +7 -58
  293. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +11 -99
  294. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +11 -25
  295. data/lib/pubid/ieee/identifiers/joint_development.rb +15 -66
  296. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +24 -58
  297. data/lib/pubid/ieee/identifiers/nesc/base.rb +19 -90
  298. data/lib/pubid/ieee/identifiers/nesc/draft.rb +5 -20
  299. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +5 -16
  300. data/lib/pubid/ieee/identifiers/nesc/redline.rb +2 -11
  301. data/lib/pubid/ieee/identifiers/nesc/standard.rb +3 -18
  302. data/lib/pubid/ieee/identifiers/nesc.rb +0 -1
  303. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +9 -3
  304. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +6 -29
  305. data/lib/pubid/ieee/identifiers/redlined_standard.rb +11 -4
  306. data/lib/pubid/ieee/identifiers/si_standard.rb +39 -4
  307. data/lib/pubid/ieee/identifiers/standard.rb +2 -5
  308. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +7 -26
  309. data/lib/pubid/ieee/identifiers.rb +1 -2
  310. data/lib/pubid/ieee/ire/builder.rb +6 -7
  311. data/lib/pubid/ieee/ire/identifier.rb +33 -48
  312. data/lib/pubid/ieee/ire/parser.rb +1 -1
  313. data/lib/pubid/ieee/nesc/builder.rb +20 -33
  314. data/lib/pubid/ieee/nesc/parser.rb +15 -16
  315. data/lib/pubid/ieee/parser.rb +44 -462
  316. data/lib/pubid/ieee/scheme.rb +90 -0
  317. data/lib/pubid/ieee/typed_stages.rb +1 -12
  318. data/lib/pubid/ieee/urn_generator.rb +8 -35
  319. data/lib/pubid/ieee.rb +2 -133
  320. data/lib/pubid/ieee_debug.rb +1 -0
  321. data/lib/pubid/iho/builder.rb +2 -2
  322. data/lib/pubid/iho/identifier.rb +17 -5
  323. data/lib/pubid/iho/identifiers/base.rb +30 -64
  324. data/lib/pubid/iho/identifiers/bibliographic.rb +5 -1
  325. data/lib/pubid/iho/identifiers/circular_letter.rb +5 -1
  326. data/lib/pubid/iho/identifiers/miscellaneous.rb +5 -1
  327. data/lib/pubid/iho/identifiers/publication.rb +5 -1
  328. data/lib/pubid/iho/identifiers/standard.rb +5 -1
  329. data/lib/pubid/iho/identifiers.rb +1 -0
  330. data/lib/pubid/iho/parser.rb +4 -4
  331. data/lib/pubid/iho/scheme.rb +29 -0
  332. data/lib/pubid/iho/urn_generator.rb +3 -3
  333. data/lib/pubid/iho.rb +3 -59
  334. data/lib/pubid/iso/builder.rb +57 -68
  335. data/lib/pubid/iso/bundled_identifier.rb +3 -56
  336. data/lib/pubid/iso/combined_identifier.rb +4 -6
  337. data/lib/pubid/iso/components/code.rb +19 -7
  338. data/lib/pubid/iso/components/publisher.rb +8 -10
  339. data/lib/pubid/iso/components.rb +4 -2
  340. data/lib/pubid/iso/identifier.rb +11 -260
  341. data/lib/pubid/iso/identifiers/addendum.rb +6 -9
  342. data/lib/pubid/iso/identifiers/amendment.rb +4 -8
  343. data/lib/pubid/iso/identifiers/base.rb +115 -0
  344. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  345. data/lib/pubid/iso/identifiers/data.rb +1 -0
  346. data/lib/pubid/iso/identifiers/directives.rb +2 -8
  347. data/lib/pubid/iso/identifiers/directives_supplement.rb +26 -55
  348. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  349. data/lib/pubid/iso/identifiers/guide.rb +1 -0
  350. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  351. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  352. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +4 -10
  353. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  354. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  355. data/lib/pubid/iso/identifiers/supplement.rb +3 -11
  356. data/lib/pubid/iso/identifiers/tc_document.rb +15 -44
  357. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  358. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  359. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  360. data/lib/pubid/iso/identifiers.rb +1 -0
  361. data/lib/pubid/iso/parser.rb +19 -43
  362. data/lib/pubid/iso/scheme.rb +187 -0
  363. data/lib/pubid/iso/single_identifier.rb +7 -6
  364. data/lib/pubid/iso/supplement_identifier.rb +3 -29
  365. data/lib/pubid/iso/urn_generator.rb +177 -78
  366. data/lib/pubid/iso/urn_parser.rb +10 -29
  367. data/lib/pubid/iso.rb +2 -188
  368. data/lib/pubid/itu/builder.rb +41 -230
  369. data/lib/pubid/itu/components/code.rb +12 -57
  370. data/lib/pubid/itu/components/sector.rb +4 -15
  371. data/lib/pubid/itu/components/series.rb +4 -0
  372. data/lib/pubid/itu/identifier.rb +51 -2
  373. data/lib/pubid/itu/identifiers/amendment.rb +31 -7
  374. data/lib/pubid/itu/identifiers/annex.rb +4 -13
  375. data/lib/pubid/itu/identifiers/base.rb +128 -456
  376. data/lib/pubid/itu/identifiers/combined_identifier.rb +25 -99
  377. data/lib/pubid/itu/identifiers/corrigendum.rb +25 -16
  378. data/lib/pubid/itu/identifiers/recommendation.rb +4 -3
  379. data/lib/pubid/itu/identifiers/special_publication.rb +3 -3
  380. data/lib/pubid/itu/identifiers/supplement.rb +16 -119
  381. data/lib/pubid/itu/identifiers.rb +1 -10
  382. data/lib/pubid/itu/model.rb +1 -1
  383. data/lib/pubid/itu/parser.rb +27 -481
  384. data/lib/pubid/itu/scheme.rb +174 -0
  385. data/lib/pubid/itu/urn_generator.rb +6 -36
  386. data/lib/pubid/itu.rb +2 -58
  387. data/lib/pubid/jcgm/builder.rb +19 -37
  388. data/lib/pubid/jcgm/identifier.rb +0 -10
  389. data/lib/pubid/jcgm/identifiers/amendment.rb +11 -0
  390. data/lib/pubid/jcgm/identifiers/gum_guide.rb +15 -3
  391. data/lib/pubid/jcgm/identifiers.rb +0 -2
  392. data/lib/pubid/jcgm/parser.rb +7 -74
  393. data/lib/pubid/jcgm/scheme.rb +60 -0
  394. data/lib/pubid/jcgm/single_identifier.rb +14 -84
  395. data/lib/pubid/jcgm/supplement_identifier.rb +4 -39
  396. data/lib/pubid/jcgm/urn_generator.rb +19 -25
  397. data/lib/pubid/jcgm.rb +2 -57
  398. data/lib/pubid/jis/builder.rb +52 -44
  399. data/lib/pubid/jis/components/code.rb +59 -0
  400. data/lib/pubid/{astm → jis}/components.rb +1 -1
  401. data/lib/pubid/jis/identifier.rb +5 -181
  402. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  403. data/lib/pubid/jis/identifiers/base.rb +72 -0
  404. data/lib/pubid/jis/identifiers/standard.rb +1 -2
  405. data/lib/pubid/jis/identifiers/technical_report.rb +1 -2
  406. data/lib/pubid/jis/identifiers/technical_specification.rb +1 -2
  407. data/lib/pubid/jis/identifiers.rb +1 -1
  408. data/lib/pubid/jis/parser.rb +6 -32
  409. data/lib/pubid/jis/scheme.rb +49 -0
  410. data/lib/pubid/jis/single_identifier.rb +12 -6
  411. data/lib/pubid/jis/supplement_identifier.rb +14 -17
  412. data/lib/pubid/jis.rb +2 -48
  413. data/lib/pubid/nist/builder.rb +1765 -146
  414. data/lib/pubid/nist/components/code.rb +20 -9
  415. data/lib/pubid/nist/components/edition.rb +0 -16
  416. data/lib/pubid/nist/components/publisher.rb +24 -0
  417. data/lib/pubid/nist/components/supplement.rb +21 -91
  418. data/lib/pubid/nist/components.rb +1 -0
  419. data/lib/pubid/nist/configuration.rb +2 -12
  420. data/lib/pubid/nist/identifiers/base.rb +417 -662
  421. data/lib/pubid/nist/identifiers/circular.rb +5 -17
  422. data/lib/pubid/nist/identifiers/circular_supplement.rb +6 -16
  423. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -3
  424. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +5 -7
  425. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +5 -18
  426. data/lib/pubid/nist/identifiers/crpl_report.rb +13 -16
  427. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -18
  428. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -3
  429. data/lib/pubid/nist/identifiers/handbook.rb +4 -12
  430. data/lib/pubid/nist/identifiers/internal_report.rb +7 -15
  431. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -3
  432. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +11 -20
  433. data/lib/pubid/nist/identifiers/monograph.rb +11 -22
  434. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  435. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  436. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  437. data/lib/pubid/nist/identifiers/report.rb +10 -19
  438. data/lib/pubid/nist/identifiers/special_publication.rb +2 -12
  439. data/lib/pubid/nist/identifiers/technical_note.rb +3 -4
  440. data/lib/pubid/nist/identifiers.rb +1 -1
  441. data/lib/pubid/nist/parser.rb +429 -97
  442. data/lib/pubid/nist/scheme.rb +199 -0
  443. data/lib/pubid/nist/supplement_identifier.rb +34 -35
  444. data/lib/pubid/nist/urn_generator.rb +8 -14
  445. data/lib/pubid/nist.rb +5 -107
  446. data/lib/pubid/oiml/builder.rb +10 -91
  447. data/lib/pubid/oiml/components/code.rb +0 -17
  448. data/lib/pubid/oiml/identifier.rb +0 -53
  449. data/lib/pubid/oiml/identifiers/annex.rb +46 -13
  450. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  451. data/lib/pubid/oiml/identifiers/basic_publication.rb +0 -2
  452. data/lib/pubid/oiml/identifiers/document.rb +0 -2
  453. data/lib/pubid/oiml/identifiers/expert_report.rb +0 -2
  454. data/lib/pubid/oiml/identifiers/guide.rb +0 -2
  455. data/lib/pubid/oiml/identifiers/recommendation.rb +0 -2
  456. data/lib/pubid/oiml/identifiers/seminar_report.rb +0 -2
  457. data/lib/pubid/oiml/identifiers/vocabulary.rb +0 -2
  458. data/lib/pubid/oiml/identifiers.rb +1 -3
  459. data/lib/pubid/oiml/parser.rb +17 -118
  460. data/lib/pubid/oiml/scheme.rb +46 -0
  461. data/lib/pubid/oiml/single_identifier.rb +43 -66
  462. data/lib/pubid/oiml/supplement_identifier.rb +17 -62
  463. data/lib/pubid/oiml/urn_generator.rb +8 -22
  464. data/lib/pubid/oiml.rb +1 -56
  465. data/lib/pubid/parser.rb +0 -1
  466. data/lib/pubid/parsers/mr_string.rb +7 -120
  467. data/lib/pubid/plateau/builder.rb +4 -8
  468. data/lib/pubid/plateau/identifiers/base.rb +36 -40
  469. data/lib/pubid/plateau/identifiers/handbook.rb +7 -1
  470. data/lib/pubid/plateau/identifiers/technical_report.rb +5 -1
  471. data/lib/pubid/plateau/identifiers.rb +1 -0
  472. data/lib/pubid/plateau/parser.rb +6 -16
  473. data/lib/pubid/plateau/scheme.rb +45 -0
  474. data/lib/pubid/plateau/supplement_identifier.rb +15 -11
  475. data/lib/pubid/plateau.rb +1 -58
  476. data/lib/pubid/renderers/base.rb +0 -47
  477. data/lib/pubid/renderers/directives_renderer.rb +14 -27
  478. data/lib/pubid/renderers/guide_renderer.rb +1 -7
  479. data/lib/pubid/renderers/human_readable.rb +9 -34
  480. data/lib/pubid/renderers/iwa_renderer.rb +1 -5
  481. data/lib/pubid/renderers/mr_string.rb +6 -54
  482. data/lib/pubid/renderers/supplement_renderer.rb +2 -5
  483. data/lib/pubid/renderers.rb +0 -1
  484. data/lib/pubid/rendering/base.rb +73 -0
  485. data/lib/pubid/rendering/common.rb +211 -0
  486. data/lib/pubid/rendering/context.rb +21 -33
  487. data/lib/pubid/rendering/format.rb +25 -0
  488. data/lib/pubid/rendering/numbering.rb +7 -25
  489. data/lib/pubid/rendering/supplement.rb +4 -4
  490. data/lib/pubid/rendering.rb +3 -0
  491. data/lib/pubid/sae/builder.rb +1 -1
  492. data/lib/pubid/sae/components/date.rb +0 -8
  493. data/lib/pubid/sae/components/type.rb +1 -5
  494. data/lib/pubid/sae/identifier.rb +12 -2
  495. data/lib/pubid/sae/identifiers/base.rb +28 -33
  496. data/lib/pubid/sae/identifiers.rb +1 -0
  497. data/lib/pubid/sae/parser.rb +1 -1
  498. data/lib/pubid/sae/scheme.rb +47 -0
  499. data/lib/pubid/sae/urn_generator.rb +10 -2
  500. data/lib/pubid/sae.rb +2 -49
  501. data/lib/pubid/scheme.rb +207 -0
  502. data/lib/pubid/urn_generator/base.rb +12 -12
  503. data/lib/pubid/version.rb +1 -1
  504. data/lib/pubid.rb +10 -424
  505. data/lib/tasks/export.rake +5 -6
  506. data/lib/tasks/website-data.json +1796 -1854
  507. metadata +45 -307
  508. data/data/bipm/update_codes.yaml +0 -9
  509. data/data/nist/series.yaml +0 -155
  510. data/lib/pubid/adobe/builder.rb +0 -52
  511. data/lib/pubid/adobe/identifier.rb +0 -47
  512. data/lib/pubid/adobe/identifiers/publication.rb +0 -31
  513. data/lib/pubid/adobe/identifiers/tech_note.rb +0 -32
  514. data/lib/pubid/adobe/identifiers.rb +0 -10
  515. data/lib/pubid/adobe/parser.rb +0 -136
  516. data/lib/pubid/adobe/renderer.rb +0 -39
  517. data/lib/pubid/adobe/urn_generator.rb +0 -42
  518. data/lib/pubid/adobe/urn_parser.rb +0 -69
  519. data/lib/pubid/adobe.rb +0 -60
  520. data/lib/pubid/amca/renderer.rb +0 -82
  521. data/lib/pubid/amca/urn_parser.rb +0 -28
  522. data/lib/pubid/ansi/renderer.rb +0 -53
  523. data/lib/pubid/ansi/urn_parser.rb +0 -23
  524. data/lib/pubid/api/identifiers.rb +0 -18
  525. data/lib/pubid/api/renderer.rb +0 -98
  526. data/lib/pubid/api/urn_parser.rb +0 -35
  527. data/lib/pubid/ashrae/renderer.rb +0 -117
  528. data/lib/pubid/ashrae/urn_parser.rb +0 -27
  529. data/lib/pubid/asme/renderer.rb +0 -66
  530. data/lib/pubid/asme/urn_parser.rb +0 -31
  531. data/lib/pubid/astm/identifiers/code_number.rb +0 -81
  532. data/lib/pubid/astm/identifiers.rb +0 -19
  533. data/lib/pubid/astm/renderer.rb +0 -172
  534. data/lib/pubid/astm/urn_parser.rb +0 -30
  535. data/lib/pubid/bipm/builder.rb +0 -163
  536. data/lib/pubid/bipm/identifier.rb +0 -285
  537. data/lib/pubid/bipm/identifiers/committee_document.rb +0 -36
  538. data/lib/pubid/bipm/identifiers/guide.rb +0 -35
  539. data/lib/pubid/bipm/identifiers/meeting.rb +0 -53
  540. data/lib/pubid/bipm/identifiers/mep.rb +0 -33
  541. data/lib/pubid/bipm/identifiers/metrologia_article.rb +0 -48
  542. data/lib/pubid/bipm/identifiers/si_brochure.rb +0 -33
  543. data/lib/pubid/bipm/identifiers.rb +0 -15
  544. data/lib/pubid/bipm/parser.rb +0 -237
  545. data/lib/pubid/bipm/renderer.rb +0 -118
  546. data/lib/pubid/bipm/urn_generator.rb +0 -58
  547. data/lib/pubid/bipm/urn_parser.rb +0 -60
  548. data/lib/pubid/bipm.rb +0 -91
  549. data/lib/pubid/bsi/renderer.rb +0 -1064
  550. data/lib/pubid/bsi/urn_parser.rb +0 -52
  551. data/lib/pubid/calconnect/builder.rb +0 -38
  552. data/lib/pubid/calconnect/identifier.rb +0 -121
  553. data/lib/pubid/calconnect/identifiers/standard.rb +0 -29
  554. data/lib/pubid/calconnect/identifiers.rb +0 -9
  555. data/lib/pubid/calconnect/parser.rb +0 -54
  556. data/lib/pubid/calconnect/renderer.rb +0 -36
  557. data/lib/pubid/calconnect/urn_generator.rb +0 -33
  558. data/lib/pubid/calconnect/urn_parser.rb +0 -34
  559. data/lib/pubid/calconnect.rb +0 -82
  560. data/lib/pubid/ccsds/urn_parser.rb +0 -20
  561. data/lib/pubid/cen_cenelec/renderer.rb +0 -261
  562. data/lib/pubid/cen_cenelec/urn_parser.rb +0 -28
  563. data/lib/pubid/cie/identifiers/code_attributes.rb +0 -52
  564. data/lib/pubid/cie/identifiers/proceedings.rb +0 -41
  565. data/lib/pubid/cie/urn_parser.rb +0 -28
  566. data/lib/pubid/components/adoption.rb +0 -104
  567. data/lib/pubid/components/iteration.rb +0 -32
  568. data/lib/pubid/components/relationship.rb +0 -151
  569. data/lib/pubid/components/supplement.rb +0 -184
  570. data/lib/pubid/csa/renderer.rb +0 -300
  571. data/lib/pubid/csa/urn_parser.rb +0 -33
  572. data/lib/pubid/doi/builder.rb +0 -18
  573. data/lib/pubid/doi/identifier.rb +0 -49
  574. data/lib/pubid/doi/identifiers/resource.rb +0 -30
  575. data/lib/pubid/doi/identifiers.rb +0 -9
  576. data/lib/pubid/doi/parser.rb +0 -52
  577. data/lib/pubid/doi/renderer.rb +0 -13
  578. data/lib/pubid/doi.rb +0 -55
  579. data/lib/pubid/easc/builder.rb +0 -55
  580. data/lib/pubid/easc/identifier.rb +0 -59
  581. data/lib/pubid/easc/identifiers/pmg.rb +0 -20
  582. data/lib/pubid/easc/identifiers/rmg.rb +0 -19
  583. data/lib/pubid/easc/identifiers.rb +0 -10
  584. data/lib/pubid/easc/parser.rb +0 -88
  585. data/lib/pubid/easc/renderer.rb +0 -48
  586. data/lib/pubid/easc/urn_generator.rb +0 -46
  587. data/lib/pubid/easc/urn_parser.rb +0 -57
  588. data/lib/pubid/easc.rb +0 -52
  589. data/lib/pubid/ecma/builder.rb +0 -45
  590. data/lib/pubid/ecma/identifier.rb +0 -147
  591. data/lib/pubid/ecma/identifiers/memento.rb +0 -30
  592. data/lib/pubid/ecma/identifiers/standard.rb +0 -31
  593. data/lib/pubid/ecma/identifiers/technical_report.rb +0 -31
  594. data/lib/pubid/ecma/identifiers.rb +0 -11
  595. data/lib/pubid/ecma/parser.rb +0 -76
  596. data/lib/pubid/ecma/renderer.rb +0 -67
  597. data/lib/pubid/ecma/urn_generator.rb +0 -46
  598. data/lib/pubid/ecma/urn_parser.rb +0 -51
  599. data/lib/pubid/ecma.rb +0 -67
  600. data/lib/pubid/errors.rb +0 -79
  601. data/lib/pubid/etsi/renderer.rb +0 -48
  602. data/lib/pubid/etsi/urn_parser.rb +0 -34
  603. data/lib/pubid/gb/builder.rb +0 -45
  604. data/lib/pubid/gb/identifier.rb +0 -67
  605. data/lib/pubid/gb/identifiers/standard.rb +0 -34
  606. data/lib/pubid/gb/identifiers.rb +0 -9
  607. data/lib/pubid/gb/parser.rb +0 -63
  608. data/lib/pubid/gb/renderer.rb +0 -35
  609. data/lib/pubid/gb.rb +0 -87
  610. data/lib/pubid/gost/builder.rb +0 -148
  611. data/lib/pubid/gost/identifier.rb +0 -47
  612. data/lib/pubid/gost/identifiers/foreign_reference.rb +0 -25
  613. data/lib/pubid/gost/identifiers/harmonized.rb +0 -39
  614. data/lib/pubid/gost/identifiers/identical_adoption.rb +0 -39
  615. data/lib/pubid/gost/identifiers/interstate_standard.rb +0 -20
  616. data/lib/pubid/gost/identifiers/national_standard.rb +0 -19
  617. data/lib/pubid/gost/identifiers.rb +0 -13
  618. data/lib/pubid/gost/parser.rb +0 -105
  619. data/lib/pubid/gost/renderer.rb +0 -48
  620. data/lib/pubid/gost/urn_generator.rb +0 -46
  621. data/lib/pubid/gost/urn_parser.rb +0 -52
  622. data/lib/pubid/gost.rb +0 -49
  623. data/lib/pubid/iala/builder.rb +0 -102
  624. data/lib/pubid/iala/identifier.rb +0 -90
  625. data/lib/pubid/iala/identifiers/advice.rb +0 -15
  626. data/lib/pubid/iala/identifiers/annex.rb +0 -57
  627. data/lib/pubid/iala/identifiers/general_assembly.rb +0 -19
  628. data/lib/pubid/iala/identifiers/guideline.rb +0 -17
  629. data/lib/pubid/iala/identifiers/letter.rb +0 -16
  630. data/lib/pubid/iala/identifiers/manual.rb +0 -18
  631. data/lib/pubid/iala/identifiers/model_course.rb +0 -17
  632. data/lib/pubid/iala/identifiers/recommendation.rb +0 -17
  633. data/lib/pubid/iala/identifiers/report.rb +0 -16
  634. data/lib/pubid/iala/identifiers/resolution.rb +0 -16
  635. data/lib/pubid/iala/identifiers/standard.rb +0 -17
  636. data/lib/pubid/iala/identifiers.rb +0 -19
  637. data/lib/pubid/iala/parser.rb +0 -138
  638. data/lib/pubid/iala/renderer.rb +0 -36
  639. data/lib/pubid/iala/urn_generator.rb +0 -49
  640. data/lib/pubid/iala/urn_parser.rb +0 -67
  641. data/lib/pubid/iala.rb +0 -71
  642. data/lib/pubid/iana/builder.rb +0 -22
  643. data/lib/pubid/iana/identifier.rb +0 -140
  644. data/lib/pubid/iana/identifiers/registry.rb +0 -69
  645. data/lib/pubid/iana/identifiers.rb +0 -9
  646. data/lib/pubid/iana/parser.rb +0 -38
  647. data/lib/pubid/iana/renderer.rb +0 -32
  648. data/lib/pubid/iana/urn_generator.rb +0 -19
  649. data/lib/pubid/iana/urn_parser.rb +0 -24
  650. data/lib/pubid/iana.rb +0 -69
  651. data/lib/pubid/idf/renderer.rb +0 -84
  652. data/lib/pubid/idf/urn_parser.rb +0 -25
  653. data/lib/pubid/iec/components.rb +0 -14
  654. data/lib/pubid/iec/identifiers/technical_group.rb +0 -30
  655. data/lib/pubid/iec/identifiers.rb +0 -31
  656. data/lib/pubid/iec/renderer.rb +0 -267
  657. data/lib/pubid/ieee/compaction.rb +0 -121
  658. data/lib/pubid/ieee/identifiers/amendment.rb +0 -40
  659. data/lib/pubid/ieee/identifiers/code_number.rb +0 -82
  660. data/lib/pubid/ieee/identifiers/nesc/edition.rb +0 -32
  661. data/lib/pubid/ieee/pre_parser.rb +0 -301
  662. data/lib/pubid/ieee/renderer.rb +0 -408
  663. data/lib/pubid/ieee/urn_parser.rb +0 -34
  664. data/lib/pubid/ietf/builder.rb +0 -78
  665. data/lib/pubid/ietf/identifier.rb +0 -5
  666. data/lib/pubid/ietf/identifiers/base.rb +0 -72
  667. data/lib/pubid/ietf/identifiers/bcp.rb +0 -36
  668. data/lib/pubid/ietf/identifiers/fyi.rb +0 -36
  669. data/lib/pubid/ietf/identifiers/internet_draft.rb +0 -45
  670. data/lib/pubid/ietf/identifiers/rfc.rb +0 -27
  671. data/lib/pubid/ietf/identifiers/serialization.rb +0 -51
  672. data/lib/pubid/ietf/identifiers/std.rb +0 -36
  673. data/lib/pubid/ietf/identifiers.rb +0 -14
  674. data/lib/pubid/ietf/parser.rb +0 -61
  675. data/lib/pubid/ietf/renderer.rb +0 -64
  676. data/lib/pubid/ietf/urn_generator.rb +0 -37
  677. data/lib/pubid/ietf/urn_parser.rb +0 -43
  678. data/lib/pubid/ietf.rb +0 -85
  679. data/lib/pubid/iho/renderer.rb +0 -30
  680. data/lib/pubid/iho/urn_parser.rb +0 -58
  681. data/lib/pubid/isbn/builder.rb +0 -44
  682. data/lib/pubid/isbn/check_digit.rb +0 -53
  683. data/lib/pubid/isbn/identifier.rb +0 -81
  684. data/lib/pubid/isbn/identifiers/book.rb +0 -30
  685. data/lib/pubid/isbn/identifiers.rb +0 -9
  686. data/lib/pubid/isbn/parser.rb +0 -45
  687. data/lib/pubid/isbn/renderer.rb +0 -16
  688. data/lib/pubid/isbn.rb +0 -52
  689. data/lib/pubid/iso/normalizer.rb +0 -89
  690. data/lib/pubid/itu/components/designation.rb +0 -35
  691. data/lib/pubid/itu/components.rb +0 -12
  692. data/lib/pubid/itu/identifiers/addendum.rb +0 -15
  693. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +0 -87
  694. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +0 -92
  695. data/lib/pubid/itu/identifiers/errata.rb +0 -15
  696. data/lib/pubid/itu/identifiers/handbook.rb +0 -38
  697. data/lib/pubid/itu/identifiers/question.rb +0 -63
  698. data/lib/pubid/itu/identifiers/report.rb +0 -39
  699. data/lib/pubid/itu/identifiers/standard_serialization.rb +0 -58
  700. data/lib/pubid/itu/urn_parser.rb +0 -31
  701. data/lib/pubid/jcgm/identifiers/corrigendum.rb +0 -34
  702. data/lib/pubid/jcgm/identifiers/meeting.rb +0 -47
  703. data/lib/pubid/jcgm/renderer.rb +0 -89
  704. data/lib/pubid/jcgm/urn_parser.rb +0 -177
  705. data/lib/pubid/jis/identifiers/corrigendum.rb +0 -16
  706. data/lib/pubid/jis/renderer.rb +0 -69
  707. data/lib/pubid/jis/urn_parser.rb +0 -23
  708. data/lib/pubid/nist/caster.rb +0 -1234
  709. data/lib/pubid/nist/circular_supplement_builder.rb +0 -293
  710. data/lib/pubid/nist/identifier.rb +0 -8
  711. data/lib/pubid/nist/identifiers/dated_document.rb +0 -49
  712. data/lib/pubid/nist/parser_output_normalizer.rb +0 -233
  713. data/lib/pubid/nist/preprocessor.rb +0 -443
  714. data/lib/pubid/nist/renderer.rb +0 -43
  715. data/lib/pubid/nist/router.rb +0 -149
  716. data/lib/pubid/nist/series/base.rb +0 -58
  717. data/lib/pubid/nist/series/crpl.rb +0 -13
  718. data/lib/pubid/nist/series/fips.rb +0 -14
  719. data/lib/pubid/nist/series/ir.rb +0 -57
  720. data/lib/pubid/nist/series/letter_preserving.rb +0 -15
  721. data/lib/pubid/nist/series/mono.rb +0 -19
  722. data/lib/pubid/nist/series/ncstar.rb +0 -20
  723. data/lib/pubid/nist/series.rb +0 -49
  724. data/lib/pubid/nist/urn_parser.rb +0 -67
  725. data/lib/pubid/oasis/builder.rb +0 -79
  726. data/lib/pubid/oasis/identifier.rb +0 -160
  727. data/lib/pubid/oasis/identifiers/standard.rb +0 -29
  728. data/lib/pubid/oasis/identifiers.rb +0 -9
  729. data/lib/pubid/oasis/parser.rb +0 -34
  730. data/lib/pubid/oasis/renderer.rb +0 -29
  731. data/lib/pubid/oasis/urn_generator.rb +0 -25
  732. data/lib/pubid/oasis/urn_parser.rb +0 -22
  733. data/lib/pubid/oasis.rb +0 -79
  734. data/lib/pubid/ogc/builder.rb +0 -33
  735. data/lib/pubid/ogc/identifier.rb +0 -81
  736. data/lib/pubid/ogc/identifiers/document.rb +0 -26
  737. data/lib/pubid/ogc/identifiers.rb +0 -10
  738. data/lib/pubid/ogc/parser.rb +0 -40
  739. data/lib/pubid/ogc/renderer.rb +0 -33
  740. data/lib/pubid/ogc/urn_generator.rb +0 -14
  741. data/lib/pubid/ogc/urn_parser.rb +0 -22
  742. data/lib/pubid/ogc.rb +0 -71
  743. data/lib/pubid/oiml/identifiers/bulletin.rb +0 -137
  744. data/lib/pubid/oiml/identifiers/code_number.rb +0 -90
  745. data/lib/pubid/oiml/identifiers/errata.rb +0 -15
  746. data/lib/pubid/oiml/renderer.rb +0 -232
  747. data/lib/pubid/oiml/urn_parser.rb +0 -39
  748. data/lib/pubid/omg/builder.rb +0 -19
  749. data/lib/pubid/omg/identifier.rb +0 -47
  750. data/lib/pubid/omg/identifiers/specification.rb +0 -32
  751. data/lib/pubid/omg/identifiers.rb +0 -9
  752. data/lib/pubid/omg/parser.rb +0 -40
  753. data/lib/pubid/omg/renderer.rb +0 -19
  754. data/lib/pubid/omg.rb +0 -51
  755. data/lib/pubid/parser/grammar.rb +0 -74
  756. data/lib/pubid/plateau/identifier.rb +0 -4
  757. data/lib/pubid/plateau/renderer.rb +0 -51
  758. data/lib/pubid/plateau/urn_parser.rb +0 -43
  759. data/lib/pubid/prefixes_support.rb +0 -51
  760. data/lib/pubid/renderers/annotator.rb +0 -233
  761. data/lib/pubid/sae/renderer.rb +0 -36
  762. data/lib/pubid/sae/urn_parser.rb +0 -36
  763. data/lib/pubid/tgpp/builder.rb +0 -41
  764. data/lib/pubid/tgpp/identifier.rb +0 -107
  765. data/lib/pubid/tgpp/identifiers/technical_report.rb +0 -32
  766. data/lib/pubid/tgpp/identifiers/technical_specification.rb +0 -33
  767. data/lib/pubid/tgpp/identifiers.rb +0 -11
  768. data/lib/pubid/tgpp/parser.rb +0 -78
  769. data/lib/pubid/tgpp/renderer.rb +0 -52
  770. data/lib/pubid/tgpp/urn_generator.rb +0 -39
  771. data/lib/pubid/tgpp/urn_parser.rb +0 -30
  772. data/lib/pubid/tgpp.rb +0 -83
  773. data/lib/pubid/type_resolver.rb +0 -59
  774. data/lib/pubid/un/builder.rb +0 -42
  775. data/lib/pubid/un/identifier.rb +0 -40
  776. data/lib/pubid/un/identifiers/document.rb +0 -24
  777. data/lib/pubid/un/identifiers.rb +0 -9
  778. data/lib/pubid/un/parser.rb +0 -25
  779. data/lib/pubid/un/renderer.rb +0 -11
  780. data/lib/pubid/un.rb +0 -46
  781. data/lib/pubid/urn_parser/base.rb +0 -81
  782. data/lib/pubid/urn_parser/errors.rb +0 -16
  783. data/lib/pubid/urn_parser.rb +0 -14
  784. data/lib/pubid/w3c/builder.rb +0 -55
  785. data/lib/pubid/w3c/identifier.rb +0 -130
  786. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +0 -31
  787. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +0 -31
  788. data/lib/pubid/w3c/identifiers/draft_note.rb +0 -31
  789. data/lib/pubid/w3c/identifiers/note.rb +0 -30
  790. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +0 -31
  791. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +0 -31
  792. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +0 -31
  793. data/lib/pubid/w3c/identifiers/recommendation.rb +0 -31
  794. data/lib/pubid/w3c/identifiers/standard.rb +0 -12
  795. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +0 -31
  796. data/lib/pubid/w3c/identifiers/working_draft.rb +0 -30
  797. data/lib/pubid/w3c/identifiers.rb +0 -25
  798. data/lib/pubid/w3c/parser.rb +0 -43
  799. data/lib/pubid/w3c/renderer.rb +0 -35
  800. data/lib/pubid/w3c/urn_generator.rb +0 -18
  801. data/lib/pubid/w3c/urn_parser.rb +0 -36
  802. data/lib/pubid/w3c.rb +0 -67
  803. data/lib/pubid/xsf/builder.rb +0 -17
  804. data/lib/pubid/xsf/identifier.rb +0 -66
  805. data/lib/pubid/xsf/identifiers/xep.rb +0 -31
  806. data/lib/pubid/xsf/identifiers.rb +0 -9
  807. data/lib/pubid/xsf/parser.rb +0 -25
  808. data/lib/pubid/xsf/renderer.rb +0 -23
  809. data/lib/pubid/xsf/urn_generator.rb +0 -13
  810. data/lib/pubid/xsf/urn_parser.rb +0 -18
  811. data/lib/pubid/xsf.rb +0 -81
@@ -0,0 +1,199 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Nist
5
+ # Scheme class for NIST identifier registry
6
+ # Single Responsibility: Identifier class registry and series-to-class mapping
7
+ class Scheme < Pubid::Scheme
8
+ class << self
9
+ # Aggregate TYPED_STAGES from all identifier classes
10
+ # @return [Array<Components::TypedStage>] all typed stages
11
+ def typed_stages
12
+ @typed_stages ||= identifiers
13
+ .reject { |klass| klass == Identifiers::Base } # Skip Base fallback class
14
+ .flat_map(&:typed_stages)
15
+ .freeze
16
+ end
17
+
18
+ # Locate TypedStage by abbreviation
19
+ # @param abbr [String, Symbol] the type abbreviation
20
+ # @return [Components::TypedStage] the matching typed stage
21
+ # @raise [ArgumentError] if abbreviation not found
22
+ def locate_typed_stage_by_abbr(abbr)
23
+ abbr_str = abbr.to_s.upcase
24
+ typed_stages.find do |ts|
25
+ ts.abbr.any? { |a| a.to_s.upcase == abbr_str }
26
+ end || raise(ArgumentError, "Unknown type abbreviation: #{abbr}")
27
+ end
28
+
29
+ # Locate identifier class by type code
30
+ # @param type_code [String, Symbol] the type code
31
+ # @return [Class] the identifier class
32
+ # @raise [ArgumentError] if type code not found
33
+ def locate_identifier_klass_by_type_code(type_code)
34
+ type_str = type_code.to_s
35
+ identifiers
36
+ .reject { |klass| klass == Identifiers::Base } # Skip Base fallback class
37
+ .find do |klass|
38
+ klass.typed_stages.any? { |ts| ts.type_code.to_s == type_str }
39
+ end || raise(ArgumentError, "Unknown type code: #{type_code}")
40
+ end
41
+
42
+ # Locate identifier class by series and pattern
43
+ # @param parsed_hash [Hash] the parsed identifier data
44
+ # @return [Class] the identifier class
45
+ def locate_identifier_klass(parsed_hash)
46
+ series = parsed_hash[:series]&.to_s
47
+
48
+ # Handle compound series that include publisher (both space and dot separated)
49
+ if series&.start_with?("NBS ")
50
+ simple_series = series.sub("NBS ", "")
51
+
52
+ # Check for CIRC supplement
53
+ if simple_series == "CIRC"
54
+ if has_supplement?(parsed_hash)
55
+ return Identifiers::CircularSupplement
56
+ else
57
+ return Identifiers::Circular
58
+ end
59
+ end
60
+
61
+ # Use simple series for lookup (TYPED_STAGES abbr handles compound forms)
62
+ series = simple_series
63
+ elsif series&.start_with?("NBS.")
64
+ # Handle dot-separated patterns (e.g., "NBS.LCIRC" after preprocessing)
65
+ simple_series = series.sub("NBS.", "")
66
+
67
+ # Check for LCIRC supplement (dot-separated variant)
68
+ if simple_series == "LCIRC"
69
+ if has_supplement?(parsed_hash)
70
+ return Identifiers::CircularSupplement
71
+ else
72
+ return Identifiers::LetterCircular
73
+ end
74
+ end
75
+
76
+ # Check for CIRC supplement (dot-separated variant)
77
+ if simple_series == "CIRC"
78
+ if has_supplement?(parsed_hash)
79
+ return Identifiers::CircularSupplement
80
+ else
81
+ return Identifiers::Circular
82
+ end
83
+ end
84
+
85
+ # Use simple series for lookup
86
+ series = simple_series
87
+ elsif series&.start_with?("NIST.")
88
+ # Handle dot-separated NIST patterns
89
+ simple_series = series.sub("NIST.", "")
90
+
91
+ # Check for LCIRC supplement (dot-separated variant)
92
+ if simple_series == "LCIRC"
93
+ if has_supplement?(parsed_hash)
94
+ return Identifiers::CircularSupplement
95
+ else
96
+ return Identifiers::LetterCircular
97
+ end
98
+ end
99
+
100
+ # Use simple series for lookup
101
+ series = simple_series
102
+ end
103
+
104
+ # Check for CS variants (works for both compound "NBS CS" and simple "CS")
105
+ if series == "CS"
106
+ first_num = parsed_hash[:first_number]
107
+
108
+ # Check for CSM (monthly) - v#n# pattern inside first_number hash
109
+ if first_num.is_a?(Hash) && first_num[:volume_number] && first_num[:issue_number]
110
+ return Identifiers::CommercialStandardsMonthly
111
+ end
112
+
113
+ # Check for CS-E (emergency) - e-prefix with 3+ digits
114
+ # Handle Parslet::Slice by converting to string
115
+ first_num_str = first_num.is_a?(String) ? first_num.to_str : first_num.to_s
116
+
117
+ # Match e104 or e104 (when "e104-43" is split into first+second)
118
+ if /^e\d{3,}/.match?(first_num_str)
119
+ return Identifiers::CommercialStandardEmergency
120
+ end
121
+ end
122
+
123
+ # Look up using TYPED_STAGES registry (replaces series_to_class_map)
124
+ # This handles simple series, compound series (via abbr array), and all variants
125
+ begin
126
+ typed_stage = locate_typed_stage_by_abbr(series)
127
+ type_code = typed_stage.type_code
128
+ locate_identifier_klass_by_type_code(type_code)
129
+ rescue ArgumentError
130
+ # Fallback to Base for unmapped series (e.g., "AMS", "VTS")
131
+ Identifiers::Base
132
+ end
133
+ end
134
+
135
+ # Check if parsed hash has supplement indicators
136
+ def has_supplement?(parsed_hash)
137
+ parsed_hash[:supplement] ||
138
+ parsed_hash[:supplement_date_range] ||
139
+ parsed_hash[:supplement_date] ||
140
+ parsed_hash[:supplement_slash_year] ||
141
+ parsed_hash[:supplement_with_rev]
142
+ end
143
+
144
+ # All identifier classes
145
+ # @return [Array<Class>] list of all identifier classes
146
+ def identifiers
147
+ @identifiers ||= [
148
+ Identifiers::SpecialPublication,
149
+ Identifiers::FederalInformationProcessingStandards,
150
+ Identifiers::InteragencyReport,
151
+ Identifiers::Handbook,
152
+ Identifiers::TechnicalNote,
153
+ Identifiers::Circular,
154
+ Identifiers::CircularSupplement,
155
+ Identifiers::CrplReport,
156
+ Identifiers::Report,
157
+ Identifiers::Monograph,
158
+ Identifiers::MiscellaneousPublication,
159
+ Identifiers::GrantContractorReport,
160
+ Identifiers::Ncstar,
161
+ Identifiers::Owmwp,
162
+ Identifiers::Nsrds,
163
+ Identifiers::LetterCircular,
164
+ Identifiers::CommercialStandard,
165
+ Identifiers::CommercialStandardEmergency,
166
+ Identifiers::CommercialStandardsMonthly,
167
+ Identifiers::Base, # Fallback for unmapped series
168
+ ].freeze
169
+ end
170
+
171
+ # Check if series is valid
172
+ # @param series_code [String] the series code
173
+ # @return [Boolean] true if series is valid
174
+ def valid_series?(series_code)
175
+ VALID_SERIES.include?(series_code)
176
+ end
177
+
178
+ # All valid series codes (comprehensive list)
179
+ VALID_SERIES = [
180
+ # Major series with dedicated classes
181
+ "SP", "FIPS", "IR", "HB", "TN",
182
+ # Specialized series with dedicated classes
183
+ "CIRC", "CRPL", "CS", "CSM",
184
+ # Other series (use Base class)
185
+ "GCR", "AMS", "BSS", "BMS", "BH", "MONO", "MP",
186
+ "NCSTAR", "NSRDS", "CSWP", "VTS", "AI", "OWMWP",
187
+ "PC", "RPT", "SIBS", "TIBM", "TTB", "EAB",
188
+ "JPCRD", "JRES", "CIS", "HR", "IRPL", "IP",
189
+ "LC", "PS", "LCIRC",
190
+ # Compound series
191
+ "BRPD-CRPL-D", "CRPL-F-A", "CRPL-F-B", "CS-E",
192
+ "CSRC Building Block", "CSRC Use Case", "CSRC Book",
193
+ "ITL Bulletin", "NIST LC", "NIST PS", "NIST DCI",
194
+ "NIST Other", "NSRDS-NBS"
195
+ ].freeze
196
+ end
197
+ end
198
+ end
199
+ end
@@ -6,66 +6,65 @@ module Pubid
6
6
  # Supplements wrap a base identifier with additional edition information
7
7
  #
8
8
  # Architecture follows ISO pattern:
9
- # - base: The base document being supplemented
9
+ # - base_identifier: 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 < Identifier
16
- attribute :base, Identifier, polymorphic: true
15
+ class SupplementIdentifier < Identifiers::Base
16
+ attribute :base_identifier, Identifiers::Base, polymorphic: true
17
17
 
18
- # Delegate publisher to base
18
+ # Delegate publisher to base_identifier
19
19
  def publisher
20
- base&.publisher
20
+ base_identifier&.publisher
21
21
  end
22
22
 
23
- # Delegate series to base
23
+ # Delegate series to base_identifier
24
24
  def series
25
- base&.series
25
+ base_identifier&.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.
32
28
  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)
44
29
  # Handle date range supplements (no base identifier)
45
30
  if supplement_date_range_start && supplement_date_range_end
46
- return "NBS CIRC sup#{supplement_date_range_start}-#{supplement_date_range_end}"
31
+ return "NBS CIRC supp#{supplement_date_range_start}-#{supplement_date_range_end}"
47
32
  end
48
33
 
49
- return yield unless base
34
+ return super unless base_identifier
50
35
 
51
- result = base.to_s(format)
36
+ result = base_identifier.to_s(format)
52
37
 
53
38
  # NEW: Handle update attribute (e.g., "Upd12-1926" for supplement patterns)
54
39
  if update
55
- # Implicit supplements (e.g. "145r11/1925") have no explicit marker;
56
- # everything else uses the canonical single-p "sup" marker
57
- # (relaton-data-nist uses "sup" across all series).
40
+ # Check if this is an implicit supplement (no explicit "sup/supp" marker, just update)
41
+ # For implicit supplements like "145r11/1925", don't add "sup" before the update
58
42
  is_implicit = self.class.attributes.key?(:implicit_supplement) && implicit_supplement == true
59
- result += "sup" unless is_implicit
60
- # Update#to_s emits its own leading separator (/Upd… short, -upd… mr),
61
- # so append it directly instead of hardcoding the slash.
62
- result += update.to_s(format)
43
+
44
+ if is_implicit
45
+ # Implicit supplement: "{base}/{update}" (e.g., "145/Upd1-192511")
46
+ else
47
+ # Explicit supplement: "{base}sup/{update}" (e.g., "118sup/Upd12-1926")
48
+ is_circ_supplement = ["LCIRC", "CIRC"].include?(series.to_s)
49
+ result += is_circ_supplement ? "sup" : "supp"
50
+ end
51
+ result += "/#{update}"
63
52
  return result
64
53
  end
65
54
 
66
- # Canonical supplement marker is single-p "sup" across all NIST/NBS
67
- # series (relaton-data-nist: SP/CIRC/HB/RPT/LC/IR/MONO/BMS all use "sup").
68
- result += "sup"
55
+ # Original supplement rendering
56
+ # For LCIRC/CIRC supplements with update, use "sup"
57
+ # For LCIRC/CIRC supplements without update, normalize "sup" to "supp" for consistency
58
+ is_circ_supplement = ["LCIRC", "CIRC"].include?(series.to_s)
59
+ # When update is present, use "sup" (e.g., "118sup/Upd1-192612")
60
+ # When update is not present, use "supp" (e.g., "378Gsupp" - normalized from "sup")
61
+ result += if is_circ_supplement && !update
62
+ "supp"
63
+ elsif is_circ_supplement
64
+ "sup"
65
+ else
66
+ "supp"
67
+ end
69
68
 
70
69
  # Add edition information if present (just ID, not type prefix)
71
70
  if edition&.id
@@ -61,24 +61,18 @@ module Pubid
61
61
  identifier_parts << identifier.stage.to_s
62
62
  end
63
63
 
64
- # Supplement is now a structured component. Preserve the existing URN
65
- # branching exactly: range → "supp{start}-{end}", revision → "supprev",
66
- # a valued supplement → "suppX"/"supp-X" (dash unless it starts with an
67
- # uppercase letter), and — quirk retained — a nil (absent) supplement
68
- # still emits "supp", while a present-but-empty one emits nothing.
69
64
  supp = identifier.supplement
70
- if supp&.range?
71
- identifier_parts << "supp#{supp.month}#{supp.year}-#{supp.month_end}#{supp.year_end}"
72
- elsif supp&.has_revision
65
+ if identifier.supplement_date_range_start && identifier.supplement_date_range_end
66
+ identifier_parts << "supp#{identifier.supplement_date_range_start}-#{identifier.supplement_date_range_end}"
67
+ elsif identifier.supplement_has_revision
73
68
  identifier_parts << "supprev"
74
- elsif supp && !supp.value_string.empty?
75
- value = supp.value_string
76
- identifier_parts << if value.match?(/^[A-Z]/)
77
- "supp#{value}"
69
+ elsif supp && !supp.empty?
70
+ identifier_parts << if supp.match?(/^[A-Z]/)
71
+ "supp#{supp}"
78
72
  else
79
- "supp-#{value}"
73
+ "supp-#{supp}"
80
74
  end
81
- elsif supp.nil?
75
+ elsif !supp
82
76
  identifier_parts << "supp"
83
77
  end
84
78
 
data/lib/pubid/nist.rb CHANGED
@@ -2,86 +2,26 @@
2
2
 
3
3
  module Pubid
4
4
  module Nist
5
- extend Pubid::PrefixesSupport
6
-
7
- # Publisher prefixes (NBS/NIST) plus the "simple series" tokens that can
8
- # *begin* a printed reference on their own — mirrors the parser's
9
- # `publisher` and `simple_series` rules (lib/pubid/nist/parser.rb). Compound
10
- # series that only appear glued to a publisher (e.g. "NBS CRPL-F-A") are
11
- # excluded because they never lead a routable reference by themselves.
12
- PREFIXES = %w[
13
- NIST NBS
14
- AMS VTS BSS BMS BH FIPS GCR HB MONO MP NCSTAR NSRDS IR SP TN CSWP
15
- AI CIRC CS CSM CRPL LCIRC OWMWP PC RPT SIBS TIBM TTB EAB JPCRD JRES
16
- CHIPS NWIRP RB
17
- ].freeze
18
-
19
5
  autoload :Builder, "#{__dir__}/nist/builder"
20
- autoload :Caster, "#{__dir__}/nist/caster"
21
- autoload :CircularSupplementBuilder, "#{__dir__}/nist/circular_supplement_builder"
22
6
  autoload :Components, "#{__dir__}/nist/components"
23
7
  autoload :Configuration, "#{__dir__}/nist/configuration"
24
- autoload :Identifier, "#{__dir__}/nist/identifiers/base"
25
8
  autoload :Identifiers, "#{__dir__}/nist/identifiers"
26
9
  autoload :Parser, "#{__dir__}/nist/parser"
27
- autoload :ParserOutputNormalizer, "#{__dir__}/nist/parser_output_normalizer"
28
- autoload :Preprocessor, "#{__dir__}/nist/preprocessor"
29
- autoload :Renderer, "#{__dir__}/nist/renderer"
30
- autoload :Router, "#{__dir__}/nist/router"
31
- autoload :Series, "#{__dir__}/nist/series"
10
+ autoload :Scheme, "#{__dir__}/nist/scheme"
32
11
  autoload :SupplementIdentifier, "#{__dir__}/nist/supplement_identifier"
33
12
  autoload :UrnGenerator, "#{__dir__}/nist/urn_generator"
34
- autoload :UrnParser, "#{__dir__}/nist/urn_parser"
35
-
36
- # Explicit registry of NIST identifier classes.
37
- #
38
- # NIST identifier classes use `typed_stages` (not the `self.type` Hash
39
- # pattern used by CEN/JCGM/ANSI), so they cannot be auto-discovered.
40
- # Identifier is the fallback for unmapped series (e.g. AMS, VTS)
41
- # and must be excluded from typed-stage aggregation.
42
- IDENTIFIER_TYPES = [
43
- Identifiers::SpecialPublication,
44
- Identifiers::FederalInformationProcessingStandards,
45
- Identifiers::InteragencyReport,
46
- Identifiers::Handbook,
47
- Identifiers::TechnicalNote,
48
- Identifiers::Circular,
49
- Identifiers::CircularSupplement,
50
- Identifiers::CrplReport,
51
- Identifiers::Report,
52
- Identifiers::Monograph,
53
- Identifiers::MiscellaneousPublication,
54
- Identifiers::GrantContractorReport,
55
- Identifiers::Ncstar,
56
- Identifiers::Owmwp,
57
- Identifiers::Nsrds,
58
- Identifiers::LetterCircular,
59
- Identifiers::CommercialStandard,
60
- Identifiers::CommercialStandardEmergency,
61
- Identifiers::CommercialStandardsMonthly,
62
- Identifiers::DatedDocument,
63
- Identifier, # Fallback for unmapped series
64
- ].freeze
65
13
 
66
14
  # Parse a NIST identifier string
67
15
  # @param identifier [String] the identifier string to parse
68
- # @return [Identifier] the parsed identifier
16
+ # @return [Identifiers::Base] the parsed identifier
69
17
  def self.parse(identifier)
70
- unless identifier.is_a?(String)
71
- raise Pubid::Errors::InvalidInputError,
72
- Pubid::INPUT_NOT_A_STRING_MESSAGE
73
- end
74
-
75
- if identifier.length > Pubid::MAX_INPUT_LENGTH
76
- raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
77
- end
78
-
79
18
  # Use the Parser class's preprocessing method
80
19
  # Note: We call the class method directly to ensure preprocessing is applied
81
20
  parsed = Parser.class_parse_with_preprocessing(identifier)
82
21
 
83
- # Builder is stateless — lookups go through this module (Pubid::Nist)
84
- builder = Builder.new
22
+ # Use Scheme and Builder for clean architecture
23
+ # ONE CLASS PER SERIES TYPE (like ISO)
24
+ builder = Builder.new(Scheme)
85
25
  builder.build(parsed)
86
26
  end
87
27
 
@@ -90,48 +30,6 @@ module Pubid
90
30
  def self.configuration
91
31
  @configuration ||= Configuration.new
92
32
  end
93
-
94
- # Per-flavor format registry: inherits global formats, overrides :human
95
- Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
96
- Identifier.format_registry.register(:human, renderer: Nist::Renderer)
97
-
98
- # All identifier classes for external consumption (export, website).
99
- # Identifier is the fallback for unmapped series and is excluded
100
- # from external type listings.
101
- # @return [Array<Class>] identifier classes
102
- def self.identifier_types
103
- IDENTIFIER_TYPES.reject { |klass| klass == Identifier }
104
- end
105
-
106
- # Aggregate TYPED_STAGES from all identifier classes.
107
- # Identifier is excluded because it has no typed stages and acts
108
- # as the fallback for unmapped series.
109
- # @return [Array<Pubid::Components::TypedStage>] all typed stages
110
- def self.all_typed_stages
111
- @all_typed_stages ||= identifier_types
112
- .reject { |klass| klass == Identifier }
113
- .flat_map(&:typed_stages)
114
- .freeze
115
- end
116
-
117
- # Lookup: type code -> identifier class.
118
- # Identifier is excluded so it never gets selected by type code.
119
- # @param code [String, Symbol] the type code to find
120
- # @return [Class, nil] the matching identifier class, or nil
121
- def self.locate_type(code)
122
- type_str = code.to_s
123
- identifier_types
124
- .reject { |klass| klass == Identifier }
125
- .find { |klass| klass.typed_stages.any? { |ts| ts.type_code.to_s == type_str } }
126
- end
127
-
128
- # Lookup: abbreviation -> typed stage
129
- # @param abbr [String, Symbol] the abbreviation to find
130
- # @return [Pubid::Components::TypedStage, nil] the matching typed stage
131
- def self.locate_stage(abbr)
132
- abbr_str = abbr.to_s.upcase
133
- all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
134
- end
135
33
  end
136
34
  end
137
35
 
@@ -6,7 +6,6 @@ module Pubid
6
6
  # Type to identifier class mapping (MECE)
7
7
  TYPE_CLASS_MAP = {
8
8
  "B" => "BasicPublication",
9
- "Bulletin" => "Bulletin",
10
9
  "D" => "Document",
11
10
  "E" => "ExpertReport",
12
11
  "G" => "Guide",
@@ -21,8 +20,8 @@ module Pubid
21
20
  return build_short_amendment(parsed_hash)
22
21
  end
23
22
 
24
- # Check for supplements first (have base)
25
- if parsed_hash[:base]
23
+ # Check for supplements first (have base_identifier)
24
+ if parsed_hash[:base_identifier]
26
25
  return build_supplement(parsed_hash)
27
26
  end
28
27
 
@@ -53,11 +52,11 @@ module Pubid
53
52
  end
54
53
 
55
54
  # Build the base document
56
- base = build_base_document(base_hash)
55
+ base_identifier = build_base_document(base_hash)
57
56
 
58
57
  # Create amendment
59
58
  amendment = Identifiers::Amendment.new
60
- amendment.base = base
59
+ amendment.base_identifier = base_identifier
61
60
 
62
61
  # Extract year from edition_format if present, otherwise from year directly
63
62
  year_value = if parsed_hash[:edition_format].is_a?(Hash)
@@ -78,27 +77,18 @@ module Pubid
78
77
  end
79
78
 
80
79
  def build_supplement(parsed_hash)
81
- marker = parsed_hash[:trailing_marker].to_s if parsed_hash[:trailing_marker]
82
- plus_marker = parsed_hash[:plus_marker].to_s if parsed_hash[:plus_marker]
83
-
84
- # Determine supplement type. The trailing word ("Amendment"/"Errata")
85
- # selects the class; the concrete class then carries the word via
86
- # #supplement_type, so only the `trailing` flag needs storing.
80
+ # Determine supplement type
87
81
  supplement_class = if parsed_hash[:annex_letter] || parsed_hash[:annex_marker]
88
82
  Identifiers::Annex
89
- elsif marker == "Errata" || plus_marker == "Errata"
90
- Identifiers::Errata
91
83
  else
92
84
  Identifiers::Amendment
93
85
  end
94
86
 
95
87
  supplement = supplement_class.new
96
- supplement.trailing = true if marker
97
- supplement.joined = true if plus_marker
98
88
 
99
89
  # Recursively parse base identifier
100
- if parsed_hash[:base]
101
- supplement.base = build(parsed_hash[:base])
90
+ if parsed_hash[:base_identifier]
91
+ supplement.base_identifier = build(parsed_hash[:base_identifier])
102
92
  end
103
93
 
104
94
  # Extract year from edition_format if present, otherwise from year directly
@@ -113,13 +103,6 @@ module Pubid
113
103
  supplement.language = extract_language(parsed_hash[:language]) if parsed_hash[:language]
114
104
  supplement.letter = parsed_hash[:annex_letter].to_s if parsed_hash[:annex_letter]
115
105
 
116
- # Annex with no year of its own but a dated base ("R 60:2017 Annexes"):
117
- # the year belongs to the base and must render glued to it.
118
- if supplement.is_a?(Identifiers::Annex) && !year_value &&
119
- supplement.base&.date
120
- supplement.year_on_base = true
121
- end
122
-
123
106
  # Track if supplement itself was parsed with Edition format
124
107
  if parsed_hash[:edition_format]
125
108
  supplement.parsed_format = "long"
@@ -136,8 +119,8 @@ module Pubid
136
119
 
137
120
  identifier = identifier_class.new
138
121
 
139
- # Handle code (number-part-subpart-suffix) specially
140
- if parsed_hash[:number] || parsed_hash[:part] || parsed_hash[:subpart] || parsed_hash[:code_suffix]
122
+ # Handle code (number-part-subpart) specially
123
+ if parsed_hash[:number] || parsed_hash[:part] || parsed_hash[:subpart]
141
124
  code_attrs = {}
142
125
  if parsed_hash[:number]
143
126
  code_attrs[:number] =
@@ -148,15 +131,7 @@ module Pubid
148
131
  code_attrs[:subpart] =
149
132
  parsed_hash[:subpart].to_s
150
133
  end
151
- if parsed_hash[:code_suffix]
152
- code_attrs[:suffix] = parsed_hash[:code_suffix].to_s
153
- code_attrs[:space_suffix] = true if parsed_hash.key?(:space_suffix)
154
- end
155
- # The code fields are flat index columns on the leaf (see
156
- # Identifiers::CodeNumber) — `number` is what relaton-index keys on —
157
- # so they are assigned individually rather than as a Code object.
158
- # Bulletin has no code columns and never reaches this branch.
159
- code_attrs.each { |name, value| identifier.public_send(:"#{name}=", value) }
134
+ identifier.code = Components::Code.new(**code_attrs)
160
135
  end
161
136
 
162
137
  # Handle other attributes
@@ -180,26 +155,12 @@ module Pubid
180
155
  identifier.date = Pubid::Components::Date.new(year: year_value.to_s)
181
156
  end
182
157
 
183
- # Bulletin-specific locator fields. The structured form captures
184
- # issue/sequence directly; the citation form captures volume/issue/
185
- # article_id, which we decode to the same (year, issue, sequence)
186
- # tuple. Year comes from either the date rule (structured) or the
187
- # article_id (citation).
188
- if identifier.is_a?(Identifiers::Bulletin)
189
- apply_bulletin_locator(identifier, parsed_hash)
190
- end
191
-
192
158
  # Determine parsed format for round-trip fidelity
193
159
  # If edition_format was captured, it means "Edition" text was present
194
160
  identifier.parsed_format = if parsed_hash[:edition_format]
195
161
  "long"
196
162
  elsif parsed_hash[:space_before_lang]
197
163
  "short_with_space"
198
- elsif parsed_hash[:article_id]
199
- # Bulletin citation form — preserve on
200
- # the identifier so default to_s gives
201
- # back the citation string verbatim.
202
- "citation"
203
164
  else
204
165
  "short"
205
166
  end
@@ -214,48 +175,6 @@ module Pubid
214
175
  identifier
215
176
  end
216
177
 
217
- # Populate issue/sequence on a Bulletin from either parse shape.
218
- # Structured: :issue and :sequence captured directly as zero-padded
219
- # strings. Citation: :volume_roman, :issue_arabic, :article_id —
220
- # decode the 8-digit article_id to recover year+issue+sequence.
221
- #
222
- # For the citation form, the parsed roman volume is cross-checked
223
- # against the year decoded from the article_id; a mismatch warns but
224
- # does not raise (the article_id is the source of truth — the roman
225
- # volume is redundant display).
226
- def apply_bulletin_locator(identifier, parsed_hash)
227
- if parsed_hash[:article_id]
228
- article_id = parsed_hash[:article_id].to_s
229
- identifier.date ||= Pubid::Components::Date.new
230
- identifier.date.year = article_id[0, 4]
231
- identifier.issue = article_id[4, 2]
232
- identifier.sequence = article_id[6, 2]
233
- warn_on_volume_mismatch(identifier, parsed_hash[:volume_roman])
234
- return
235
- end
236
-
237
- identifier.issue = parsed_hash[:issue].to_s if parsed_hash[:issue]
238
- identifier.sequence = parsed_hash[:sequence].to_s if parsed_hash[:sequence]
239
- end
240
-
241
- # Citation form carries the volume in two places: spelled out as a
242
- # roman numeral ("LXVII") and encoded in the 8-digit article_id
243
- # (year+issue+sequence, where year - 1959 = volume). They should
244
- # agree; if they don't, the input was malformed. Warn loudly so the
245
- # user sees the discrepancy, but continue using the article_id
246
- # (deterministic) rather than the roman (possibly mistyped).
247
- def warn_on_volume_mismatch(identifier, parsed_volume_roman)
248
- return unless parsed_volume_roman && identifier.date&.year
249
-
250
- declared = parsed_volume_roman.to_s
251
- computed = Identifiers::Bulletin.to_roman(identifier.date.year.to_i -
252
- Identifiers::Bulletin::BASE_YEAR_OFFSET)
253
- return if declared == computed
254
-
255
- warn "OIML Bulletin citation volume mismatch: parsed '#{declared}' " \
256
- "but article_id year #{identifier.date.year} implies '#{computed}'"
257
- end
258
-
259
178
  def extract_language(lang_data)
260
179
  # Handle both direct string and nested hash from parser
261
180
  case lang_data