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
@@ -3,71 +3,59 @@
3
3
  module Pubid
4
4
  module Ieee
5
5
  # Builder class for constructing IEEE identifier scheme from parsed data
6
- # Single Responsibility: Transform parsed data into identifier objects
6
+ # Single Responsibility: Transform parsed data into Scheme objects
7
7
  class Builder
8
8
  attr_accessor :original_input
9
9
  attr_reader :identifier_class
10
10
 
11
- def initialize(identifier_class = Identifier)
11
+ def initialize(identifier_class = Identifiers::Base)
12
12
  @identifier_class = identifier_class
13
13
  end
14
14
 
15
15
  # Build a scheme object from parsed data
16
16
  # @param parsed [Hash, Array] the parsed identifier data
17
- # @return [identifier] the constructed identifier object
17
+ # @return [Scheme] the constructed scheme object
18
18
  def build(parsed)
19
- # Parslet returns a top-level *array* of hashes when a repeated capture
20
- # (e.g. the two subparts in "7.4-3-2") stops the sibling captures from
21
- # hash-merging. The dispatch checks below need hash access, so read them
22
- # off a merged view (`d`); build_single_identifier re-handles the array
23
- # itself (preserving every subpart), so it still gets the original.
24
- d = parsed.is_a?(Array) ? merge_parsed_array(parsed) : parsed
25
-
26
19
  # Handle CSA dual published patterns
27
- if d[:ieee_portion] && d[:csa_portion]
20
+ if parsed[:ieee_portion] && parsed[:csa_portion]
28
21
  return build_csa_dual_published(parsed)
29
22
  end
30
23
 
31
- # Handle the historical IEEE/IPCEA cable designation (S-135)
32
- if d[:s_number]
33
- return build_s_designation(parsed)
34
- end
35
-
36
24
  # Handle combined AIEE identifiers (from "Nos X and Y" preprocessing)
37
- if d[:first_aiee] && d[:second_aiee]
25
+ if parsed[:first_aiee] && parsed[:second_aiee]
38
26
  return build_combined_aiee(parsed)
39
27
  end
40
28
 
41
29
  # Handle dual published patterns
42
- if d[:first] && d[:second]
30
+ if parsed[:first] && parsed[:second]
43
31
  return build_dual_published(parsed)
44
32
  end
45
33
 
46
34
  # Handle IEC/IEEE copublished patterns
47
- if d[:content]
35
+ if parsed[:content]
48
36
  return build_iec_ieee_copublished(parsed)
49
37
  end
50
38
 
51
39
  # Handle NESC identifiers (National Electrical Safety Code)
52
- if d[:nesc]
40
+ if parsed[:nesc]
53
41
  nesc_builder = Nesc::Builder.new
54
- return nesc_builder.build(d[:nesc])
42
+ return nesc_builder.build(parsed[:nesc])
55
43
  end
56
44
 
57
45
  # Handle AIEE identifiers (American Institute of Electrical Engineers)
58
- if d[:aiee]
46
+ if parsed[:aiee]
59
47
  aiee_builder = Aiee::Builder.new
60
- return aiee_builder.build(d[:aiee])
48
+ return aiee_builder.build(parsed[:aiee])
61
49
  end
62
50
 
63
51
  # Handle IRE identifiers (Institute of Radio Engineers)
64
- if d[:ire]
52
+ if parsed[:ire]
65
53
  ire_builder = Ire::Builder.new
66
- return ire_builder.build(d[:ire])
54
+ return ire_builder.build(parsed[:ire])
67
55
  end
68
56
 
69
57
  # Handle IEEE/ASTM SI/PSI identifiers (Système International)
70
- if d[:si_type]
58
+ if parsed[:si_type]
71
59
  return build_si_psi_identifier(parsed)
72
60
  end
73
61
 
@@ -124,59 +112,13 @@ module Pubid
124
112
  end
125
113
 
126
114
  Identifiers::IecIeeeCopublished.new(
115
+ copublished_number: copublished_number,
127
116
  draft_info: draft_info,
128
117
  iec_year: iec_year,
129
118
  date_info: date_info,
130
- **copublished_structured(copublished_number),
131
119
  )
132
120
  end
133
121
 
134
- # Decompose an IEC/IEEE `copublished_number` into the split index columns
135
- # that reconstruct it losslessly (IecIeeeCopublished#copublished_number is
136
- # the inverse). First peel a trailing *publication year* (19xx/20xx with
137
- # its `-`/`:` separator) into `year`/`year_sep` — a bare 4-digit strip
138
- # would wrongly eat a part like "60076.57-1202" (1202 is a part, not a
139
- # year). Then tokenise the remainder on `.`/`-`, keeping each part's
140
- # leading separator (a single code mixes them). So `number` narrows to the
141
- # bucket, `parts` matches within it, and `separators` renders it back.
142
- # `year_sep` is omitted when the default `-`. Returns empty for no number.
143
- def copublished_structured(copublished_number)
144
- return {} if copublished_number.nil? || copublished_number.empty?
145
-
146
- remainder, year, year_sep = peel_copublished_year(copublished_number)
147
- tokens = remainder.scan(/\A[^.\-]+|[.\-][^.\-]+/)
148
- { number: tokens.shift }
149
- .merge(copublished_parts(tokens))
150
- .merge(copublished_year(year, year_sep))
151
- end
152
-
153
- # The `parts`/`separators` columns from the tokens after the number.
154
- def copublished_parts(tokens)
155
- return {} if tokens.empty?
156
-
157
- { parts: tokens.map { |t| t[1..] }, separators: tokens.map { |t| t[0] } }
158
- end
159
-
160
- # The `year`/`year_sep` columns; `year_sep` is omitted when the default `-`.
161
- def copublished_year(year, year_sep)
162
- return {} unless year
163
-
164
- year_sep == "-" ? { year: year } : { year: year, year_sep: year_sep }
165
- end
166
-
167
- # Peel a trailing publication year (19xx/20xx with its `-`/`:` separator)
168
- # off a copublished number, returning [remainder, year, year_sep].
169
- def peel_copublished_year(copublished_number)
170
- return [copublished_number, nil, nil] unless
171
- copublished_number =~ /([-:])((?:19|20)\d\d)\z/
172
-
173
- year_sep = Regexp.last_match(1)
174
- year = Regexp.last_match(2)
175
- trimmed = copublished_number[0...(copublished_number.length -
176
- year_sep.length - year.length)]
177
- [trimmed, year, year_sep]
178
- end
179
-
180
122
  # Build dual published identifier
181
123
  def build_dual_published(parsed)
182
124
  first_id = build_single_identifier(parsed[:first])
@@ -211,33 +153,6 @@ module Pubid
211
153
  )
212
154
  end
213
155
 
214
- # Build the historical IEEE/IPCEA cable designation (e.g. S-135).
215
- #
216
- # The "S-135" designation is modelled as a plain Standard whose code holds
217
- # the whole "S-135" string as `number` (prefix nil). It is passed as the
218
- # `number:` split column directly — NOT as `code:` — so it bypasses
219
- # Components::Code.parse, which would peel "S" as a prefix and leave an
220
- # empty number (breaking the relaton index key and the round-trip). This
221
- # keeps `root.number` == "S-135" and renders the dash back verbatim.
222
- #
223
- # The "/IPCEA …" slash co-designation is stored verbatim in `crossref`
224
- # (rendered as-is); the "(IPCEA …)" parenthetical variant flows through
225
- # the normal `parenthetical_content` path.
226
- def build_s_designation(parsed)
227
- attributes = {
228
- number: extract_value(parsed[:s_number]),
229
- publisher: extract_value(parsed[:publisher]) || "IEEE",
230
- typed_stage: Pubid::Ieee.locate_stage("Std"),
231
- }
232
-
233
- if parsed[:ipcea_copub]
234
- attributes[:crossref] = extract_value(parsed[:ipcea_copub])
235
- end
236
- handle_parameters(parsed, attributes)
237
-
238
- Identifiers::Standard.new(**attributes)
239
- end
240
-
241
156
  # Build single identifier
242
157
  def build_single_identifier(parsed, building_secondary: false)
243
158
  # Parslet can return array of hashes - merge them
@@ -249,59 +164,19 @@ module Pubid
249
164
  return build_multi_numbered_identifier(parsed_hash)
250
165
  end
251
166
 
252
- # Handle corrigendum supplements (check for base + cor_number)
167
+ # Handle corrigendum supplements (check for base_identifier + cor_number)
253
168
  # This enables recursive base identifier parsing like ISO/IEC Amendment
254
- if parsed_hash[:base] && parsed_hash[:cor_number]
169
+ if parsed_hash[:base_identifier] && parsed_hash[:cor_number]
255
170
  return build_corrigendum_supplement(parsed_hash)
256
171
  end
257
172
 
258
- # Handle the flat draft + corrigendum form (relaton's `…/D-N/CorM-YYYY`,
259
- # normalized to `…/Cor M-YYYY/D N`): the parser emits a top-level
260
- # `corrigendum` hash alongside `draft`/number with NO `:base` subtree, so
261
- # the supplement path above is skipped. Rebuild a real base standard
262
- # (carrying the draft) and wrap it, so `to_s` renders correctly from a
263
- # fresh parse and after a from_hash round-trip. The `!parsed_hash[:base]`
264
- # guard keeps this disjoint from the nested-base branch above; a
265
- # `:base` + nested-`corrigendum`-hash shape is not produced by the
266
- # grammar, so it would fall through to `extract_attributes` (as before).
267
- if parsed_hash[:corrigendum].is_a?(Hash) && !parsed_hash[:base]
268
- return build_flat_corrigendum(parsed_hash)
269
- end
270
-
271
- # Handle amendment supplements — mirrors the corrigendum path above.
272
- # Every amendment the grammar produces is FLAT (a top-level `amendment`
273
- # hash, no `:base`): the `amendment` rule only ever appears inline via
274
- # `amendment.maybe`, so `build_flat_amendment` carries all real traffic
275
- # (`IEEE Std …/Amd N-YYYY` and `ISO/IEC/IEEE 8802.x/AmdN-YYYY`). The
276
- # recursive-base branch below is kept for structural parity with
277
- # corrigendum (which has a dedicated `corrigendum_identifier` rule
278
- # emitting a `:base` + top-level `:amd_number`-style shape); no amendment
279
- # grammar rule emits it today, so it would only fire if one were added.
280
- if parsed_hash[:base] && parsed_hash[:amd_number]
281
- return build_amendment_supplement(parsed_hash)
282
- end
283
-
284
- if parsed_hash[:amendment].is_a?(Hash) && !parsed_hash[:base]
285
- return build_flat_amendment(parsed_hash)
286
- end
287
-
288
- # Handle interpretation supplements (check for base + int_year)
289
- if parsed_hash[:base] && (parsed_hash[:int_year] || parsed_hash[:interpretation])
173
+ # Handle interpretation supplements (check for base_identifier + int_year)
174
+ if parsed_hash[:base_identifier] && (parsed_hash[:int_year] || parsed_hash[:interpretation])
290
175
  return build_interpretation_supplement(parsed_hash)
291
176
  end
292
177
 
293
- # The same document with a TRAILING DATE parses FLAT — no :base subtree,
294
- # just an :interpretation marker beside the number — so the branch above
295
- # skipped it and determine_identifier_class built a base-less
296
- # InterpretationIdentifier that dropped the number, the part and the
297
- # publisher: "IEEE Std 1003.2-1992/INT, Dec. 1994 Ed." rendered as
298
- # " 1003.2-1992/INT". Mirrors build_flat_corrigendum / build_flat_amendment.
299
- if parsed_hash[:interpretation] && !parsed_hash[:base]
300
- return build_flat_interpretation(parsed_hash)
301
- end
302
-
303
- # Handle conformance supplements (check for base + conf_number)
304
- if parsed_hash[:base] && parsed_hash[:conf_number]
178
+ # Handle conformance supplements (check for base_identifier + conf_number)
179
+ if parsed_hash[:base_identifier] && parsed_hash[:conf_number]
305
180
  return build_conformance_supplement(parsed_hash)
306
181
  end
307
182
 
@@ -319,32 +194,16 @@ module Pubid
319
194
 
320
195
  # Route to appropriate identifier class based on content
321
196
  identifier_class = determine_identifier_class(attributes)
322
- rename_supplement_keys(attributes)
323
197
  identifier_class.new(**attributes)
324
198
  end
325
199
 
326
- # Supplement wrappers (Corrigendum/Amendment/Conformance/Interpretation)
327
- # store their ordinal/year under the uniform `number`/`year`, but the parse
328
- # tree and class-routing above key on the distinct
329
- # `cor_*`/`amd_*`/`conf_*`/`int_year` names. Translate them **after**
330
- # routing, just before construction. Guards ensure a plain standard's own
331
- # `number`/`year` are never overwritten (it carries none of these keys).
332
- def rename_supplement_keys(attributes)
333
- ordinal = attributes.delete(:cor_number) ||
334
- attributes.delete(:amd_number) || attributes.delete(:conf_number)
335
- attributes[:number] = ordinal if ordinal
336
- year = attributes.delete(:cor_year) || attributes.delete(:amd_year) ||
337
- attributes.delete(:conf_year) || attributes.delete(:int_year)
338
- attributes[:year] = year if year
339
- end
340
-
341
- # Reconstruct the base identifier string from a parsed `:base` subtree
342
- # (publisher/copublishers + type + number/part/subpart/year), so it can be
343
- # recursively re-parsed by the supplement builders (corrigendum/amendment).
344
- # @param base_data [Hash] the `:base` subtree
345
- # @return [String] e.g. "IEEE Std 802.1AC-2016" or "535-2013"
346
- def reconstruct_base_string(base_data)
200
+ # Build corrigendum supplement with recursive base parsing
201
+ # @param parsed_hash [Hash] parsed data with base and supplement info
202
+ # @return [Identifiers::Corrigendum] corrigendum identifier
203
+ def build_corrigendum_supplement(parsed_hash)
204
+ # Reconstruct base identifier string from parsed components
347
205
  base_parts = []
206
+ base_data = parsed_hash[:base_identifier]
348
207
 
349
208
  # Extract publisher
350
209
  if base_data[:publishers]
@@ -397,118 +256,22 @@ module Pubid
397
256
  end
398
257
 
399
258
  base_parts << number_str
400
- base_parts.join(" ")
401
- end
402
259
 
403
- # Build corrigendum supplement with recursive base parsing
404
- # @param parsed_hash [Hash] parsed data with base and supplement info
405
- # @return [Identifiers::Corrigendum] corrigendum identifier
406
- def build_corrigendum_supplement(parsed_hash)
407
- # Recursively parse the base identifier reconstructed from the subtree.
408
- base = Identifier.parse(reconstruct_base_string(parsed_hash[:base]))
260
+ # Build base string and recursively parse it
261
+ base_string = base_parts.join(" ")
262
+
263
+ # Recursively parse base identifier using Base.parse
264
+ base_identifier = Identifiers::Base.parse(base_string)
409
265
 
410
- # Extract corrigendum attributes (parse-tree keys are cor_*; the
411
- # identifier stores them as the uniform `number`/`year`).
266
+ # Extract corrigendum attributes
412
267
  cor_number = extract_value(parsed_hash[:cor_number])
413
268
  cor_year = extract_value(parsed_hash[:cor_year])
414
269
 
415
270
  # Create Corrigendum with parsed base
416
271
  Identifiers::Corrigendum.new(
417
- base: base,
418
- number: cor_number,
419
- year: cor_year,
420
- )
421
- end
422
-
423
- # Build a Corrigendum from the flat parse tree produced by the combined
424
- # `…/Cor M-YYYY/D N` form, where the corrigendum lives in a top-level
425
- # `corrigendum` hash and there is no `:base` subtree. Peel the corrigendum
426
- # off, build the remaining attributes into the base standard (with its
427
- # draft) via the normal single-identifier path, then wrap.
428
- # @param parsed_hash [Hash] flat parsed data with a :corrigendum hash
429
- # @return [Identifiers::Corrigendum]
430
- def build_flat_corrigendum(parsed_hash)
431
- cor_data = parsed_hash[:corrigendum]
432
- cor_number = extract_value(cor_data[:cor_number])
433
- cor_year = extract_value(cor_data[:cor_year]) if cor_data[:cor_year]
434
-
435
- base_hash = parsed_hash.reject { |key, _| key == :corrigendum }
436
- base = build_single_identifier(base_hash)
437
-
438
- Identifiers::Corrigendum.new(
439
- base: base,
440
- number: cor_number,
441
- year: cor_year,
442
- )
443
- end
444
-
445
- # Build an interpretation from a FLAT parse tree — the trailing-date form,
446
- # where the :interpretation marker sits beside the base's own keys instead
447
- # of over a :base subtree.
448
- #
449
- # The trailing date is the INTERPRETATION's date (an interpretation of the
450
- # 1992 edition of 1003.2, issued in Dec 1994), so it goes on the wrapper;
451
- # the base keeps its own `year`. That matches the nested form, whose
452
- # `int_year` also lands on the wrapper.
453
- # @param parsed_hash [Hash] flat parsed data carrying :interpretation
454
- # @return [Identifiers::InterpretationIdentifier]
455
- def build_flat_interpretation(parsed_hash)
456
- int_year = extract_value(parsed_hash[:trailing_year]) if parsed_hash[:trailing_year]
457
-
458
- base_hash = parsed_hash.reject do |key, _|
459
- %i[interpretation trailing_month trailing_year].include?(key)
460
- end
461
- base = build_single_identifier(base_hash)
462
-
463
- # The trailing MONTH is deliberately dropped, matching the nested form
464
- # (whose `int_year` carries no month either). It was not preserved
465
- # before this change, so nothing is lost; and setting it fed the URN's
466
- # month_day_component, which put "Dec." — a word with a dot — into a
467
- # URN segment.
468
- Identifiers::InterpretationIdentifier.new(
469
- base: base,
470
- year: int_year,
471
- )
472
- end
473
-
474
- # Build amendment supplement with recursive base parsing. Mirrors
475
- # {#build_corrigendum_supplement} — reconstructs the base identifier
476
- # string, recursively parses it, and wraps it in an Amendment.
477
- # @param parsed_hash [Hash] parsed data with base and amendment info
478
- # @return [Identifiers::Amendment] amendment identifier
479
- def build_amendment_supplement(parsed_hash)
480
- base = Identifier.parse(reconstruct_base_string(parsed_hash[:base]))
481
-
482
- amd_number = extract_value(parsed_hash[:amd_number])
483
- amd_year = extract_value(parsed_hash[:amd_year])
484
-
485
- Identifiers::Amendment.new(
486
- base: base,
487
- number: amd_number,
488
- year: amd_year,
489
- )
490
- end
491
-
492
- # Build an Amendment from the flat parse tree produced by the common
493
- # `…/Amd N-YYYY` form, where the amendment lives in a top-level
494
- # `amendment` hash and there is no `:base` subtree. Peel the amendment
495
- # off, build the remaining attributes into the base standard via the
496
- # normal single-identifier path, then wrap. Mirrors
497
- # {#build_flat_corrigendum}.
498
- # @param parsed_hash [Hash] flat parsed data with an :amendment hash
499
- # @return [Identifiers::Amendment]
500
- def build_flat_amendment(parsed_hash)
501
- amd_data = parsed_hash[:amendment]
502
- amd_number = extract_value(amd_data[:amd_number])
503
- amd_year = extract_value(amd_data[:amd_year]) if amd_data[:amd_year]
504
-
505
- base_hash = parsed_hash.reject { |key, _| key == :amendment }
506
- base = build_single_identifier(base_hash)
507
-
508
- Identifiers::Amendment.new(
509
- base: base,
510
- number: amd_number,
511
- year: amd_year,
272
+ base_identifier: base_identifier,
273
+ cor_number: cor_number,
274
+ cor_year: cor_year,
512
275
  )
513
276
  end
514
277
 
@@ -518,7 +281,7 @@ module Pubid
518
281
  def build_interpretation_supplement(parsed_hash)
519
282
  # Reconstruct base identifier string from parsed components (same logic as corrigendum)
520
283
  base_parts = []
521
- base_data = parsed_hash[:base]
284
+ base_data = parsed_hash[:base_identifier]
522
285
 
523
286
  # Extract publisher
524
287
  if base_data[:publishers]
@@ -574,15 +337,15 @@ module Pubid
574
337
  base_string = base_parts.join(" ")
575
338
 
576
339
  # Recursively parse base identifier using Base.parse
577
- base = Identifier.parse(base_string)
340
+ base_identifier = Identifiers::Base.parse(base_string)
578
341
 
579
342
  # Extract interpretation attributes
580
343
  int_year = extract_value(parsed_hash[:int_year])
581
344
 
582
- # Create InterpretationIdentifier with parsed base (int_year -> year)
345
+ # Create InterpretationIdentifier with parsed base
583
346
  Identifiers::InterpretationIdentifier.new(
584
- base: base,
585
- year: int_year,
347
+ base_identifier: base_identifier,
348
+ int_year: int_year,
586
349
  )
587
350
  end
588
351
 
@@ -592,7 +355,7 @@ module Pubid
592
355
  def build_conformance_supplement(parsed_hash)
593
356
  # Reconstruct base identifier string from parsed components (same logic as corrigendum)
594
357
  base_parts = []
595
- base_data = parsed_hash[:base]
358
+ base_data = parsed_hash[:base_identifier]
596
359
 
597
360
  # Extract publisher
598
361
  if base_data[:publishers]
@@ -648,17 +411,17 @@ module Pubid
648
411
  base_string = base_parts.join(" ")
649
412
 
650
413
  # Recursively parse base identifier using Base.parse
651
- base = Identifier.parse(base_string)
414
+ base_identifier = Identifiers::Base.parse(base_string)
652
415
 
653
416
  # Extract conformance attributes
654
417
  conf_number = extract_value(parsed_hash[:conf_number])
655
418
  conf_year = extract_value(parsed_hash[:conf_year])
656
419
 
657
- # Create ConformanceIdentifier with parsed base (conf_* -> number/year)
420
+ # Create ConformanceIdentifier with parsed base
658
421
  Identifiers::ConformanceIdentifier.new(
659
- base: base,
660
- number: conf_number,
661
- year: conf_year,
422
+ base_identifier: base_identifier,
423
+ conf_number: conf_number,
424
+ conf_year: conf_year,
662
425
  )
663
426
  end
664
427
 
@@ -682,33 +445,8 @@ module Pubid
682
445
  end
683
446
  attributes[:code] = code_str
684
447
 
685
- # Extract year (and optional numeric month, e.g. the -MM of a historical
686
- # "…-2018-05" ISO-stage date). The joint ISO/IEC rules also use the
687
- # `edition` rule, whose year is captured as :edition_year (parser.rb);
688
- # it is promoted to the identity only when no base :year was captured.
689
- if parsed[:year]
690
- attributes[:year] = extract_value(parsed[:year])
691
- elsif parsed[:edition_year]
692
- attributes[:year] = extract_value(parsed[:edition_year])
693
- end
694
- attributes[:month] = extract_value(parsed[:month]) if parsed[:month]
695
-
696
- # Extract edition, from relaton's "/E-<n>" suffix (normalized to
697
- # "Edition <n>.0"). nil-residue hand-off item 1.
698
- attributes[:edition] = extract_value(parsed[:edition]) if parsed[:edition]
699
- if parsed[:edition_month]
700
- attributes[:edition_month] = extract_value(parsed[:edition_month])
701
- end
702
-
703
- # Extract draft version if present (e.g., D8 from /D8). This applies to
704
- # both the ISO-led (bucket 5: "…FDIS P15289/D-3-2017") and IEEE-led
705
- # forms, so it lives before the lead-party split.
706
- if parsed[:draft_version]
707
- draft_ver = extract_value(parsed[:draft_version])
708
- # Remove leading 'D' if present since draft_version already has it
709
- draft_ver = draft_ver.sub(/^D/, "") if draft_ver
710
- attributes[:ieee_draft] = "D#{draft_ver}" if draft_ver
711
- end
448
+ # Extract year
449
+ attributes[:year] = extract_value(parsed[:year]) if parsed[:year]
712
450
 
713
451
  # Detect lead party based on pattern
714
452
  if parsed[:iso_stage]
@@ -720,18 +458,26 @@ module Pubid
720
458
  stage_abbr = attributes[:iso_stage]
721
459
  if stage_abbr
722
460
  attributes[:typed_stage] =
723
- Pubid::Ieee.locate_stage(stage_abbr)
461
+ Ieee::Scheme.locate_typed_stage_by_abbr(stage_abbr)
724
462
  end
725
463
  else
726
464
  # IEEE format - lead party is IEEE
727
465
  attributes[:lead_party] = "IEEE"
728
466
 
467
+ # Extract draft version if present (e.g., D8 from /D8)
468
+ if parsed[:draft_version]
469
+ draft_ver = extract_value(parsed[:draft_version])
470
+ # Remove leading 'D' if present since draft_version already has it
471
+ draft_ver = draft_ver.sub(/^D/, "") if draft_ver
472
+ attributes[:ieee_draft] = "D#{draft_ver}" if draft_ver
473
+ end
474
+
729
475
  # Mark as project (P prefix)
730
476
  attributes[:type] = "P"
731
477
 
732
478
  # Create typed_stage for IEEE project
733
479
  attributes[:typed_stage] =
734
- Pubid::Ieee.locate_stage("P")
480
+ Ieee::Scheme.locate_typed_stage_by_abbr("P")
735
481
  end
736
482
 
737
483
  Identifiers::JointDevelopment.new(**attributes)
@@ -809,14 +555,9 @@ module Pubid
809
555
  # Pattern: slash >> "C" >> digits >> dot >> digits >> dot >> digits >> dash >> year_digits
810
556
  # The parsed crossref is a string - extract the number part
811
557
  # Format: C62.22.1-1996 where C is part of the crossref notation
812
- # The captured slice keeps the leading slash, which is a SEPARATOR in
813
- # the printed reference, not part of the number. Storing it made the
814
- # secondary's code "/C62.22.1-1996", which then failed the renderer's
815
- # own cross-reference test (`/^C\d+\./`) and fell through to the
816
- # " and " join. Strip it.
817
558
  secondary_id = Identifiers::Standard.new(
818
559
  publisher: "IEEE",
819
- number: extract_value(crossref).to_s.sub(%r{\A/}, ""),
560
+ number: extract_value(crossref),
820
561
  )
821
562
  elsif parsed[:secondary_joint]
822
563
  # Joint standard format: ", Std 1177-1989"
@@ -834,7 +575,7 @@ module Pubid
834
575
  end
835
576
 
836
577
  # Determine which identifier class to use based on attributes
837
- # CRITICAL: Use flavor module for type-based decisions, NOT hardcoded logic here
578
+ # CRITICAL: Use Scheme for type-based decisions, NOT hardcoded logic here
838
579
  # Builder's job is ONLY to cast types, not make business decisions
839
580
  def determine_identifier_class(attributes)
840
581
  # Check for AIEE publisher FIRST (AIEE has its own identifier class)
@@ -843,12 +584,12 @@ module Pubid
843
584
  return Ieee::Aiee::Identifier
844
585
  end
845
586
 
846
- # Get type from attributes and use flavor module to locate class
587
+ # Get type from attributes and use Scheme to locate class
847
588
  type_code = attributes[:type]
848
589
 
849
- # Use flavor module for type-to-class mapping
590
+ # Use Scheme registry for type-to-class mapping
850
591
  if type_code
851
- klass = Pubid::Ieee.locate_type(type_code)
592
+ klass = Ieee::Scheme.locate_identifier_klass_by_type_code(type_code)
852
593
  return klass if klass
853
594
  end
854
595
 
@@ -875,11 +616,6 @@ module Pubid
875
616
  return Identifiers::Corrigendum
876
617
  end
877
618
 
878
- # Check for amendment supplements (structural: has amd_number)
879
- if attributes[:amd_number]
880
- return Identifiers::Amendment
881
- end
882
-
883
619
  # Check for multi-numbered standards (structural: has crossref or joint patterns)
884
620
  # These are handled at the build() method level, not here
885
621
  # (cross-reference patterns like /C62.22.1-1996 and joint standards)
@@ -889,16 +625,13 @@ module Pubid
889
625
  return Identifiers::AdoptedStandard
890
626
  end
891
627
 
892
- # A redline is a plain Standard carrying `redline: true` (a distinct
893
- # document from its base) — NOT the RedlinedStandard wrapper, which
894
- # expects a nested `base` the flat build path never sets. render_base
895
- # restores the " - Redline" suffix from the flag.
628
+ # Check for redline standards (structural: has redline flag)
629
+ if attributes[:redline]
630
+ return Identifiers::RedlinedStandard
631
+ end
896
632
 
897
- # Default to the concrete Standard leaf (a plain published standard).
898
- # Routing to a leaf — rather than instantiating the shared base
899
- # Ieee::Identifier — is what lets `number` be a reliable :string index
900
- # key (see Identifiers::Standard).
901
- Identifiers::Standard
633
+ # Default to base identifier
634
+ Identifiers::Base
902
635
  end
903
636
 
904
637
  # Detect lead party for joint development identifiers
@@ -945,7 +678,7 @@ module Pubid
945
678
 
946
679
  # Extract and normalize attributes from parsed data
947
680
  # @param parsed [Hash] the parsed data
948
- # @return [Hash] normalized attributes for identifier
681
+ # @return [Hash] normalized attributes for Scheme
949
682
  def extract_attributes(parsed)
950
683
  attributes = {}
951
684
 
@@ -1044,26 +777,6 @@ module Pubid
1044
777
  if parsed[:year]
1045
778
  year_str = extract_value(parsed[:year])
1046
779
  attributes[:year] = year_str
1047
- elsif parsed[:edition_year]
1048
- # The `edition` rule captures its own year under :edition_year (not
1049
- # :year) so it never collides with the base -YYYY (see parser.rb).
1050
- # With no base year the edition's year IS the document date and is
1051
- # promoted to the identity (e.g. "IEEE Std 802.11 Edition 3.0-2009"
1052
- # -> year 2009). When a base year exists it wins above and
1053
- # :edition_year is dropped — the edition ordinal is still kept.
1054
- attributes[:year] = extract_value(parsed[:edition_year])
1055
- elsif parsed[:trailing_year]
1056
- # No base -YYYY identity year: the trailing "Month YYYY" IS the
1057
- # document date (e.g. "IEEE Std 519, May 1993"), so promote it.
1058
- # When a base year exists it wins (the IEEE approval/identity year)
1059
- # and the trailing date is intentionally dropped rather than
1060
- # fabricating a wrong month/year pairing. The trailing captures use
1061
- # distinct keys (:trailing_month/:trailing_year) so they never collide
1062
- # with the base :year (Parslet no longer warns "Duplicate subtrees").
1063
- attributes[:year] = extract_value(parsed[:trailing_year])
1064
- if parsed[:trailing_month]
1065
- attributes[:month] = extract_value(parsed[:trailing_month])
1066
- end
1067
780
  end
1068
781
 
1069
782
  # Extract edition_month if parsed separately
@@ -1072,7 +785,7 @@ module Pubid
1072
785
  end
1073
786
 
1074
787
  # Set type attribute for backward compatibility (after P extraction)
1075
- # NOTE: "P" IS a type code that maps to ProjectDraftIdentifier via flavor module
788
+ # NOTE: "P" IS a type code that maps to ProjectDraftIdentifier via Scheme
1076
789
  # Type can be: "Std", "No", "P" (project draft), etc.
1077
790
  attributes[:type] = type_value if type_value
1078
791
 
@@ -1081,7 +794,7 @@ module Pubid
1081
794
  parsed)
1082
795
  if typed_stage_abbr
1083
796
  attributes[:typed_stage] =
1084
- Pubid::Ieee.locate_stage(typed_stage_abbr)
797
+ Ieee::Scheme.locate_typed_stage_by_abbr(typed_stage_abbr)
1085
798
  end
1086
799
 
1087
800
  attributes[:draft_status] = draft_status_value
@@ -1100,12 +813,6 @@ module Pubid
1100
813
  # Handle draft (can be complex)
1101
814
  handle_draft(parsed, attributes)
1102
815
 
1103
- # Default draft version 1 when the type indicates a Draft but the
1104
- # parser found no explicit version (issue #205). Real-world IEEE
1105
- # drafts always have at least version 1; the missing suffix is a
1106
- # source-data omission, not an undrafted document.
1107
- apply_default_draft_version(attributes, type_value)
1108
-
1109
816
  # Handle corrigendum
1110
817
  handle_corrigendum(parsed, attributes)
1111
818
 
@@ -1173,7 +880,7 @@ module Pubid
1173
880
  if version
1174
881
  draft_abbr = "D#{version}"
1175
882
  # Check if this specific draft stage is in registry
1176
- stage = Pubid::Ieee.locate_stage(draft_abbr)
883
+ stage = Ieee::Scheme.locate_typed_stage_by_abbr(draft_abbr)
1177
884
  return draft_abbr if stage&.abbr&.include?(draft_abbr)
1178
885
  end
1179
886
  end
@@ -1220,36 +927,15 @@ module Pubid
1220
927
  attributes[key] = value if value
1221
928
  end
1222
929
 
1223
- # Default draft version to "1" when the identifier type indicates a
1224
- # Draft but the parser found no explicit version (issue #205).
1225
- def apply_default_draft_version(attributes, type_value)
1226
- return if attributes[:draft] || attributes[:draft_obj]
1227
- return unless type_value.to_s == "Draft Std"
1228
-
1229
- attributes[:draft] = "D1"
1230
- # Carry the identifier's year into the draft object so the renderer
1231
- # doesn't drop it (the renderer suppresses the `-YYYY` suffix when
1232
- # a draft is attached, expecting the year to live inside /D...).
1233
- attributes[:draft_obj] =
1234
- Components::Draft.new(version: "1", year: attributes[:year])
1235
- end
1236
-
1237
930
  # Handle draft information
1238
931
  def handle_draft(parsed, attributes)
1239
932
  draft_data = parsed[:draft] || parsed[:digit_draft]
1240
933
  return unless draft_data
1241
934
 
1242
- # Draft can be an array of hash elements or a single hash. The grammar's
1243
- # `draft_version.repeat(1,2)` splits a dotted designator like "1.2.6"
1244
- # into ["1.2", ".6"], so DON'T let a plain merge overwrite it (that
1245
- # dropped every part but the last — "1.2.6" -> ".6"). Collect ALL the
1246
- # draft_version parts into an array (the version extraction below joins
1247
- # them back into one verbatim string) and merge the remaining keys.
935
+ # Draft can be an array of hash elements or a single hash
1248
936
  if draft_data.is_a?(Array)
1249
- hashes = draft_data.select { |e| e.is_a?(Hash) }
1250
- versions = hashes.filter_map { |e| e[:draft_version] }
1251
- merged = hashes.inject({}) { |result, elem| result.merge(elem) }
1252
- merged[:draft_version] = versions unless versions.empty?
937
+ # Merge all elements in the array
938
+ merged = draft_data.inject({}) { |result, elem| result.merge(elem) }
1253
939
  draft_data = merged
1254
940
  end
1255
941
 
@@ -1269,9 +955,6 @@ module Pubid
1269
955
  else
1270
956
  extract_value(dv)
1271
957
  end
1272
- # Normalize a leading hyphen ("/D-3.0" -> "3.0"); the draft
1273
- # designator is otherwise held verbatim so no digit is lost.
1274
- version = version.sub(/\A-/, "") if version
1275
958
  end
1276
959
 
1277
960
  revision = extract_value(draft_data[:revision]) if draft_data[:revision]
@@ -1500,7 +1183,7 @@ module Pubid
1500
1183
 
1501
1184
  # Parse a list of identifier strings into identifier objects
1502
1185
  # @param list_data [Hash, Array, nil] the parsed identifier list data
1503
- # @return [Array<Identifier>] array of parsed identifier objects
1186
+ # @return [Array<Identifiers::Base>] array of parsed identifier objects
1504
1187
  def parse_identifier_list(list_data)
1505
1188
  return [] unless list_data
1506
1189
 
@@ -1509,12 +1192,12 @@ module Pubid
1509
1192
 
1510
1193
  # Recursively parse each identifier string
1511
1194
  id_strings.map do |id_str|
1512
- # Use Identifier.parse for recursive parsing
1513
- Identifier.parse(id_str)
1195
+ # Use Identifiers::Base.parse for recursive parsing
1196
+ Identifiers::Base.parse(id_str)
1514
1197
  rescue Parslet::ParseFailed
1515
1198
  # If parsing fails, create minimal identifier with just the string
1516
1199
  # This maintains graceful degradation
1517
- Identifier.new(parenthetical_content: id_str)
1200
+ Identifiers::Base.new(parenthetical_content: id_str)
1518
1201
  end
1519
1202
  end
1520
1203