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
@@ -1,293 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Nist
5
- # Builder dedicated to CIRC/LCIRC supplement identifier construction.
6
- #
7
- # Extracted from Builder.build_circular_supplement* methods to keep the
8
- # main Builder focused on orchestration. The circular supplement
9
- # construction pipeline is a self-contained sub-flow that:
10
- #
11
- # 1. Decides between the wrapper class (CircularSupplement) for V1-compat
12
- # update forms (slash-year "118supp3/1926" -> ".../Upd1-192603";
13
- # implicit revision "145r11/1925") and the normal Circular /
14
- # LetterCircular classes for everything else.
15
- # 2. Builds the base identifier recursively via Builder#build.
16
- # 3. Attaches the supplement as either an isolated component on the normal
17
- # class, or a structured edition/update on the wrapper.
18
- #
19
- # Single Responsibility: Construct CIRC/LCIRC supplement identifier
20
- # objects from parsed data, calling back to the parent Builder for base
21
- # identifier construction.
22
- class CircularSupplementBuilder
23
- # @param builder [Builder] the parent builder (for recursive base build)
24
- def initialize(builder)
25
- @builder = builder
26
- end
27
-
28
- # Build CircularSupplement with base wrapping
29
- # @param parsed_hash [Hash] the parsed supplement data
30
- # Build a CIRC/LCIRC supplement. Most forms collapse onto the base
31
- # identifier's normal class (Circular / LetterCircular) with isolated
32
- # supplement attributes, so they share one model with every other series
33
- # and are queryable by part. The V1-compat update forms (slash-year
34
- # "118supp3/1926" -> ".../Upd1-192603"; implicit revision "145r11/1925")
35
- # render through an Update component the flat supplement model can't
36
- # express, so they stay on the CircularSupplement wrapper for now.
37
- def build_circular_supplement(parsed_hash)
38
- if parsed_hash[:supplement_slash_year].is_a?(Hash) ||
39
- parsed_hash[:implicit_supplement].is_a?(Hash)
40
- return build_circular_supplement_wrapper(parsed_hash)
41
- end
42
-
43
- series_value = if parsed_hash[:circ_series].is_a?(Hash)
44
- parsed_hash[:circ_series][:series]
45
- else
46
- parsed_hash[:series]
47
- end
48
-
49
- # Date-range supplement (no base document): a plain base identifier with
50
- # no number, carrying the range. parsed_format is left at the default so
51
- # a dotted MR input still normalizes to the spaced short form.
52
- if parsed_hash[:supplement_date_range].is_a?(Hash)
53
- range = parsed_hash[:supplement_date_range]
54
- identifier = @builder.build({ series: series_value })
55
- ms = range[:supp_month_start]&.to_s
56
- ys = range[:supp_year_start]&.to_s
57
- me = range[:supp_month_end]&.to_s
58
- ye = range[:supp_year_end]&.to_s
59
- # Month is optional: a year-only range ("sup1925-1926") passes just the
60
- # bare year, which supplement_from parses into year/year_end.
61
- identifier.supplement = @builder.supplement_from(
62
- value: nil, has_revision: false,
63
- range_start: (ys ? "#{ms}#{ys}" : nil),
64
- range_end: (ye ? "#{me}#{ye}" : nil)
65
- )
66
- return identifier
67
- end
68
-
69
- # Based supplement: build the base, then attach the supplement as an
70
- # isolated component on that normal class.
71
- identifier = build_circular_supplement_base(parsed_hash, series_value)
72
- raw = if parsed_hash[:supplement_month_year]
73
- parsed_hash[:supplement_month_year].to_s
74
- elsif parsed_hash[:supplement_year]
75
- parsed_hash[:supplement_year].to_s
76
- else
77
- "" # supplement_empty or bare marker
78
- end
79
- identifier.supplement = Components::Supplement.from_raw(raw)
80
- identifier
81
- end
82
-
83
- # Build just the base identifier for a based CIRC/LCIRC supplement, from
84
- # base_portion (number, optional edition "101e2" or letter suffix "378G")
85
- # or the merged first_number fallback. Returns the normal class.
86
- def build_circular_supplement_base(parsed_hash, series_value)
87
- base_portion = parsed_hash[:base_portion]
88
- unless base_portion
89
- return @builder.build({
90
- publisher: parsed_hash[:publisher],
91
- series: series_value || parsed_hash[:series],
92
- first_number: parsed_hash[:first_number],
93
- parsed_format: parsed_hash[:parsed_format],
94
- })
95
- end
96
-
97
- base_number = if base_portion.is_a?(Hash)
98
- base_portion[:simple_number] || base_portion[:base_number]
99
- else
100
- base_portion
101
- end
102
-
103
- letter_suffix = nil
104
- if base_portion.is_a?(Hash) && base_portion[:letter_suffix]
105
- letter_suffix = base_portion[:letter_suffix].to_s.upcase
106
- end
107
-
108
- publisher_value = nil
109
- if parsed_hash[:circ_series].is_a?(Hash) && parsed_hash[:circ_series][:series]
110
- series_str = parsed_hash[:circ_series][:series].to_s
111
- publisher_value = series_str.split.first if series_str.include?(" ")
112
- end
113
-
114
- has_edition = base_portion.is_a?(Hash) && base_portion[:edition_number]
115
-
116
- base_number_with_suffix = base_number.to_s
117
- base_number_with_suffix += letter_suffix if letter_suffix
118
- if has_edition
119
- base_number_with_suffix += "e#{base_portion[:edition_number]}"
120
- end
121
-
122
- base_hash = {
123
- series: series_value,
124
- first_number: base_number_with_suffix,
125
- parsed_format: parsed_hash[:parsed_format],
126
- }
127
- base_hash[:publisher] = publisher_value if publisher_value
128
- base_hash[:edition_e] =
129
- { edition_id: base_portion[:edition_number] } if has_edition
130
-
131
- @builder.build(base_hash)
132
- end
133
-
134
- # @return [Identifiers::CircularSupplement] the supplement identifier
135
- def build_circular_supplement_wrapper(parsed_hash)
136
- supplement = Identifiers::CircularSupplement.new
137
-
138
- # Extract series from circ_series if present (nested structure from parser)
139
- series_value = nil
140
- if parsed_hash[:circ_series].is_a?(Hash)
141
- series_value = parsed_hash[:circ_series][:series]
142
- elsif parsed_hash[:series]
143
- series_value = parsed_hash[:series]
144
- end
145
-
146
- # Handle date range supplement (no base)
147
- if parsed_hash[:supplement_date_range].is_a?(Hash)
148
- range = parsed_hash[:supplement_date_range]
149
- month_start = range[:supp_month_start]&.to_s
150
- year_start = range[:supp_year_start]&.to_s
151
- month_end = range[:supp_month_end]&.to_s
152
- year_end = range[:supp_year_end]&.to_s
153
-
154
- supplement.supplement_date_range_start = "#{month_start}#{year_start}" if month_start && year_start
155
- supplement.supplement_date_range_end = "#{month_end}#{year_end}" if month_end && year_end
156
-
157
- return supplement
158
- end
159
-
160
- # Build base identifier from base_portion (if present)
161
- # If not present (because it was merged during parsing), use first_number
162
- if parsed_hash[:base_portion]
163
- # Extract the actual number value from base_portion hash
164
- # base_portion can be: {:simple_number=>"118"}, {:base_number=>"145", :revision_letter=>"r", :revision_number=>"11"}, etc.
165
- base_portion = parsed_hash[:base_portion]
166
- base_number = if base_portion.is_a?(Hash)
167
- # Extract the value from whichever key is present
168
- base_portion[:simple_number] || base_portion[:base_number]
169
- else
170
- base_portion
171
- end
172
-
173
- # Check for letter suffix in base_portion (e.g., "378G")
174
- letter_suffix = nil
175
- if base_portion.is_a?(Hash) && base_portion[:letter_suffix]
176
- letter_suffix = base_portion[:letter_suffix].to_s.upcase
177
- end
178
-
179
- # Extract publisher from circ_series if present
180
- publisher_value = nil
181
- if parsed_hash[:circ_series].is_a?(Hash) && parsed_hash[:circ_series][:series]
182
- series_str = parsed_hash[:circ_series][:series].to_s
183
- # Extract publisher from series (e.g., "NBS LCIRC" -> "NBS")
184
- publisher_value = series_str.split.first if series_str.include?(" ")
185
- end
186
-
187
- # Check if base_portion has revision (for patterns like "145r11/1925")
188
- has_revision = base_portion.is_a?(Hash) && base_portion[:revision_letter] && base_portion[:revision_number]
189
-
190
- # NEW: Check if base_portion has edition_number (for patterns like "101e2")
191
- has_edition = base_portion.is_a?(Hash) && base_portion[:edition_number]
192
-
193
- # Include letter suffix in base_number if present
194
- # Also include edition_number if present (for "101e2" pattern)
195
- base_number_with_suffix = base_number.to_s
196
- if letter_suffix
197
- base_number_with_suffix += letter_suffix
198
- end
199
- if has_edition
200
- base_number_with_suffix += "e#{base_portion[:edition_number]}"
201
- end
202
-
203
- # Reconstruct parse hash for base identifier
204
- base_hash = {
205
- series: series_value,
206
- first_number: base_number_with_suffix,
207
- parsed_format: parsed_hash[:parsed_format],
208
- }
209
- base_hash[:publisher] = publisher_value if publisher_value
210
-
211
- # NEW: Add edition_number to base_hash for patterns like "101e2"
212
- # This will be processed by the normal build() logic to create Edition component
213
- if has_edition
214
- # Create edition_e hash that will be converted to Edition with type="e"
215
- base_hash[:edition_e] =
216
- { edition_id: base_portion[:edition_number] }
217
- end
218
-
219
- # Recursively build base identifier
220
- # This will go through normal build() process which extracts edition from "101e2"
221
- supplement.base = @builder.build(base_hash)
222
-
223
- # NEW: Handle revision + implicit supplement pattern (e.g., "145r11/1925")
224
- # Create update format: "Upd1-{year}{revision_number}"
225
- if has_revision && parsed_hash[:implicit_supplement].is_a?(Hash)
226
- revision_number = base_portion[:revision_number].to_s
227
- supplement_year = parsed_hash[:implicit_supplement][:implicit_supplement_year].to_s
228
-
229
- # Create Update component for revision+supplement pattern.
230
- # Renders "/Upd1-{year}{revision_number}" via Update#to_s(:short).
231
- # The year+revision are fused into the year field (month left nil) so
232
- # the revision is NOT zero-padded (e.g. "145r6/1925" -> "Upd1-19256",
233
- # not "192506"). Must be a Components::Update (not a String) so
234
- # :update serializes.
235
- supplement.update = Components::Update.new(
236
- number: "1", year: "#{supplement_year}#{revision_number}",
237
- prefix: "slash"
238
- )
239
- supplement.implicit_supplement = true # Mark as implicit supplement for rendering
240
- end
241
- elsif parsed_hash[:first_number]
242
- # base_portion was lost during merge, use first_number to build base identifier
243
- base_hash = {
244
- publisher: parsed_hash[:publisher],
245
- series: series_value || parsed_hash[:series],
246
- first_number: parsed_hash[:first_number],
247
- parsed_format: parsed_hash[:parsed_format],
248
- }
249
-
250
- # Recursively build base identifier
251
- supplement.base = @builder.build(base_hash)
252
- end
253
-
254
- # Build supplement edition from captured data
255
- if parsed_hash[:supplement_month_year]
256
- # Parse month+year format like "Jan1924"
257
- month_year = parsed_hash[:supplement_month_year].to_s
258
- supplement.edition = Components::Edition.new(type: "s",
259
- id: month_year)
260
- elsif parsed_hash[:supplement_year]
261
- # Just year: 1924
262
- supplement.edition = Components::Edition.new(type: "s",
263
- id: parsed_hash[:supplement_year].to_s)
264
- elsif parsed_hash[:supplement_slash_year].is_a?(Hash)
265
- # NEW: Handle supplement_slash_year pattern (e.g., "sup12/1926", "sup1/1927")
266
- # V1 format: "Upd1-192612" where "1" is fixed and "192612" is year+number concatenated
267
- # Single digit numbers are zero-padded: "sup1/1927" -> "Upd1-192701"
268
- supp_hash = parsed_hash[:supplement_slash_year]
269
- supp_number = supp_hash[:supp_number]&.to_s
270
- supp_year = supp_hash[:supp_year]&.to_s
271
-
272
- # Pad supplement number to 2 digits for single-digit numbers
273
- supp_number_padded = supp_number.rjust(2, "0")
274
-
275
- # Create Update component for supplement (V1 compatibility uses Update for supplements).
276
- # Renders "/Upd1-{year}{padded_number}" via Update#to_s(:short). The
277
- # year and already-padded number are fused into the year field (month
278
- # left nil) so rendering reproduces the V1 string exactly. Must be a
279
- # Components::Update (not a String) so :update serializes.
280
- supplement.update = Components::Update.new(
281
- number: "1", year: "#{supp_year}#{supp_number_padded}",
282
- prefix: "slash"
283
- )
284
- elsif parsed_hash[:supplement_empty]
285
- # Empty supplement - no edition
286
- # supplement.edition remains nil
287
- end
288
-
289
- supplement
290
- end
291
- end
292
- end
293
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The NIST flavor base class is Pubid::Nist::Identifier — a real
4
- # Pubid::Identifier subclass that every concrete NIST identifier descends from,
5
- # so `id.is_a?(Pubid::Nist::Identifier)` and the shared polymorphic `from_hash`
6
- # work natively (no facade needed). Its full body and `.parse` are defined in identifiers/base.rb to keep
7
- # that large body in one place; this file just ensures it is loaded when a
8
- # consumer references Pubid::Nist::Identifier directly.
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Nist
5
- module Identifiers
6
- # NIST date-style identifier with no series.
7
- # Examples:
8
- # - "NIST 2022-04-15 001" (short) / "NIST.2022-04-15.001" (mr/doi)
9
- # DOI 10.6028/NIST.2022-04-15.001
10
- class DatedDocument < Identifier
11
- # Empty so the bare "NIST" abbr never shadows a series lookup; the
12
- # Router guard (parsed_hash[:dated_date] && :dated_seq) is the dispatch path.
13
- TYPED_STAGES = [].freeze
14
-
15
- attribute :date_year, :string
16
- attribute :date_month, :string
17
- attribute :date_day, :string
18
- attribute :dated_seq, :string
19
-
20
- class << self
21
- def typed_stages
22
- TYPED_STAGES
23
- end
24
-
25
- def type
26
- { key: :dated, title: "NIST Dated Document" }
27
- end
28
- end
29
-
30
- def to_short_style
31
- "#{publisher || 'NIST'} #{date_year}-#{date_month}-#{date_day} #{dated_seq}"
32
- end
33
-
34
- def to_mr_style
35
- "#{publisher || 'NIST'}.#{date_year}-#{date_month}-#{date_day}.#{dated_seq}"
36
- end
37
-
38
- # No series/number to expand; non-default formats fall back to short.
39
- def to_full_style
40
- to_short_style
41
- end
42
-
43
- def to_abbreviated_style
44
- to_short_style
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,233 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Nist
5
- # Normalizes the raw hash produced by the NIST parser before the Builder
6
- # constructs the identifier object.
7
- #
8
- # The parser emits a flat hash with keys like :first_number, :second_number,
9
- # :edition_dash_year, :update_prefix, etc. Many of those keys are
10
- # *incompatible shapes* — e.g. parser captures a year as :edition_dash_year
11
- # when it is actually a second_number, or a letter+digits suffix lives
12
- # inside :first_number when it should become a Part component.
13
- #
14
- # Each `normalize_*` method here performs one such shape correction,
15
- # mutating the hash in place. The Normalizer is intentionally
16
- # *side-effect-only*: it never reads from the Builder, the Caster, or the
17
- # identifier classes, so it can be tested in isolation.
18
- #
19
- # Pre-processing blocks that need to surface extracted components to the
20
- # Builder (e.g. letter-suffix Part components, embedded-edition objects)
21
- # remain in Builder#build because they create local variables that flow
22
- # into the construction phase. All other normalizations live here.
23
- class ParserOutputNormalizer
24
- # Range of years we treat as "looks like a calendar year" when
25
- # disambiguating :edition_dash_year from :second_number.
26
- VALID_YEAR_RANGE = (1901..2026).freeze
27
-
28
- # Series that treat :edition_dash_year as a year-only edition when the
29
- # dash year falls in VALID_YEAR_RANGE. For other series with a dash-year
30
- # in this range, the dash-year is interpreted differently (or kept as
31
- # a compound number, depending on the branch).
32
- DASH_YEAR_AS_EDITION_SERIES = %w[HB CS FIPS].freeze
33
-
34
- # Apply all normalizations to the parsed hash in the correct order.
35
- # @param parsed_hash [Hash] parser output (mutated in place)
36
- # @return [Hash] the same hash, normalized
37
- def normalize(parsed_hash)
38
- merge_edition_e_into_update(parsed_hash)
39
- extract_embedded_edition_with_year(parsed_hash)
40
- extract_embedded_edition_without_dash_year(parsed_hash)
41
- split_second_number_edition_year(parsed_hash)
42
- split_fips_month_year_after_part(parsed_hash)
43
- disambiguate_ir_compound_vs_edition(parsed_hash)
44
- disambiguate_dash_year(parsed_hash)
45
- parsed_hash
46
- end
47
-
48
- private
49
-
50
- # Pattern: "800-53r4/Upd3-2015"
51
- # Parser captures "-2015" as :edition_e but it belongs on :update.
52
- def merge_edition_e_into_update(parsed_hash)
53
- return unless parsed_hash[:update_prefix] && parsed_hash[:update] && parsed_hash[:edition_e]
54
-
55
- edition_id = parsed_hash[:edition_e][:edition_id]
56
- parsed_hash[:update] = parsed_hash[:update].merge(update_year: edition_id)
57
- parsed_hash.delete(:edition_e)
58
- end
59
-
60
- # Pattern: "44e2-1955"
61
- # first_number="44e2", edition_dash_year="1955"
62
- # Result: first_number="44", edition(type:"e", id:"2", additional_text:"1955")
63
- def extract_embedded_edition_with_year(parsed_hash)
64
- return unless parsed_hash[:first_number]&.to_s&.match?(/^[0-9]+[a-zA-Z]\d+$/) &&
65
- parsed_hash[:edition_dash_year]
66
-
67
- number_str = parsed_hash[:first_number].to_s
68
- return unless (match_data = number_str.match(/^(\d+)([a-zA-Z])(\d+)$/))
69
-
70
- base_number, edition_type, edition_id = match_data[1], match_data[2].downcase, match_data[3]
71
-
72
- parsed_hash[:first_number] = Components::Code.new(value: base_number)
73
- parsed_hash[:edition_with_year] = Components::Edition.new(
74
- type: edition_type,
75
- id: edition_id,
76
- additional_text: parsed_hash[:edition_dash_year][:dash_year],
77
- )
78
- parsed_hash.delete(:edition_dash_year)
79
- end
80
-
81
- # Pattern: "8115r1" (with no edition_dash_year)
82
- # first_number="8115r1", no second_number
83
- # Result: first_number="8115", edition(type:"r", id:"1")
84
- #
85
- # CRITICAL: Only when no :second_number is present, otherwise the
86
- # compound-number logic in the Builder handles the pattern.
87
- def extract_embedded_edition_without_dash_year(parsed_hash)
88
- return if parsed_hash[:second_number]
89
- return unless parsed_hash[:first_number]&.to_s&.match?(/^[0-9]+[a-zA-Z]\d+$/)
90
- return if parsed_hash[:edition_dash_year]
91
-
92
- number_str = parsed_hash[:first_number].to_s
93
- return unless (match_data = number_str.match(/^(\d+)([a-zA-Z])(\d+)$/))
94
-
95
- base_number, edition_type, edition_id = match_data[1], match_data[2].downcase, match_data[3]
96
-
97
- parsed_hash[:first_number] = Components::Code.new(value: base_number)
98
- parsed_hash[:edition_with_year] = Components::Edition.new(
99
- type: edition_type,
100
- id: edition_id,
101
- )
102
- end
103
-
104
- # Pattern: "105-1-1990"
105
- # Parser returns second_number_edition_year={second_number:"1", dash_year:"1990"}
106
- # Result: :second_number="1", plus either :edition_from_year (HB series)
107
- # or :edition_dash_year (other series) for further downstream processing.
108
- def split_second_number_edition_year(parsed_hash)
109
- return unless parsed_hash[:second_number_edition_year]
110
-
111
- combined = parsed_hash[:second_number_edition_year]
112
- parsed_hash[:second_number] = combined[:second_number]
113
- dash_year = combined[:dash_year]
114
-
115
- is_handbook = safely_to_s(parsed_hash[:series]) == "HB"
116
- if is_handbook && dash_year.to_s.match?(/^\d{4}$/)
117
- parsed_hash[:edition_from_year] = Components::Edition.new(type: "e", id: dash_year)
118
- else
119
- parsed_hash[:edition_dash_year] = { dash_year: dash_year }
120
- end
121
-
122
- parsed_hash.delete(:second_number_edition_year)
123
- end
124
-
125
- # Pattern: "11-1-Sep1977"
126
- # Parser returns fips_month_year_after_part={second_number:"1", edition_month:"Sep", edition_year:"1977"}
127
- # Result: :second_number="1", :edition_from_year(type:"e", id:"197709")
128
- def split_fips_month_year_after_part(parsed_hash)
129
- return unless parsed_hash[:fips_month_year_after_part]
130
-
131
- combined = parsed_hash[:fips_month_year_after_part]
132
- parsed_hash[:second_number] = combined[:second_number]
133
- month_str = combined[:edition_month]
134
- year_str = combined[:edition_year]
135
-
136
- month_num = month_to_number(month_str)
137
- edition_id = month_num&.positive? ? "#{year_str}#{format('%02d', month_num)}" : year_str
138
-
139
- parsed_hash[:edition_from_year] = Components::Edition.new(type: "e", id: edition_id)
140
- parsed_hash.delete(:fips_month_year_after_part)
141
- end
142
-
143
- # Pattern: "84-2946" with series=IR
144
- # For IR (Interagency Report), a 2-digit first_number followed by a
145
- # 4-digit dash-year is *almost* always a year-only edition (e.g.
146
- # "76e1100") — except when the 4-digit number is clearly not a year
147
- # (>= 2700) or there is an embedded :edition_e (compound number).
148
- def disambiguate_ir_compound_vs_edition(parsed_hash)
149
- return unless safely_to_s(parsed_hash[:series]) == "IR"
150
- return unless parsed_hash[:first_number] && parsed_hash[:edition_dash_year]
151
-
152
- first_num = parsed_hash[:first_number].to_s
153
- dash_year = parsed_hash[:edition_dash_year][:dash_year].to_s
154
- return unless first_num.match?(/^\d{2}$/) && dash_year.match?(/^\d{4}$/)
155
-
156
- dash_year_num = dash_year.to_i
157
- is_valid_year = VALID_YEAR_RANGE.cover?(dash_year_num)
158
- has_embedded_edition = parsed_hash[:edition_e]
159
-
160
- if is_valid_year && !has_embedded_edition
161
- parsed_hash[:first_number] = Components::Code.new(value: first_num)
162
- parsed_hash[:edition] = Components::Edition.new(type: "e", id: dash_year)
163
- else
164
- parsed_hash[:first_number] = Components::Code.new(value: "#{first_num}-#{dash_year}")
165
- end
166
- parsed_hash.delete(:edition_dash_year)
167
- end
168
-
169
- # Pattern: "250-1039" or "15-1000" or "1946-1947" (RPT)
170
- # When the parser captures a :first_number plus :edition_dash_year, the
171
- # dash year is interpreted differently per series:
172
- # - RPT: always join into a compound (date range), regardless of year
173
- # - GCR: always convert dash-year to year-only edition
174
- # - IR: convert dash-year to year-only edition only if it is a valid year
175
- # - HB/CS/FIPS: convert dash-year to year-only edition only if valid year
176
- # - others: drop :edition_dash_year, or stash as :second_number if < 1900
177
- def disambiguate_dash_year(parsed_hash)
178
- return unless parsed_hash[:first_number] && parsed_hash[:edition_dash_year]
179
- return if parsed_hash[:first_number].to_s.match?(/^[0-9]+[a-zA-Z]\d+$/)
180
-
181
- dash_year = parsed_hash[:edition_dash_year][:dash_year].to_s
182
- series = safely_to_s(parsed_hash[:series])
183
- dash_year_num = dash_year.to_i
184
- is_valid_year = VALID_YEAR_RANGE.cover?(dash_year_num)
185
-
186
- if series == "RPT"
187
- # RPT date ranges: "1946-1947" -> "1946-1947"
188
- parsed_hash[:first_number] =
189
- Components::Code.new(value: "#{parsed_hash[:first_number]}-#{dash_year}")
190
- parsed_hash.delete(:edition_dash_year)
191
- elsif series == "GCR"
192
- # GCR always converts dash-year to edition
193
- stash_edition_from_year(parsed_hash, dash_year)
194
- elsif series == "IR" && is_valid_year
195
- # IR converts valid years to edition
196
- stash_edition_from_year(parsed_hash, dash_year)
197
- elsif DASH_YEAR_AS_EDITION_SERIES.include?(series) && is_valid_year
198
- # HB/CS/FIPS: convert dash-year to edition only if valid year
199
- stash_edition_from_year(parsed_hash, dash_year)
200
- elsif dash_year_num < 1900
201
- # For other series, dash-year < 1900 is a second_number
202
- parsed_hash[:second_number] = dash_year
203
- parsed_hash.delete(:edition_dash_year)
204
- end
205
- # Other cases (non-HB/CS/FIPS with a valid year): leave the keys alone
206
- # so downstream Builder logic can handle them.
207
- end
208
-
209
- # Convert dash-year into a year-only Edition and stash for the Builder
210
- # to assign after construction.
211
- def stash_edition_from_year(parsed_hash, dash_year)
212
- parsed_hash[:edition_from_year] = Components::Edition.new(type: "e", id: dash_year)
213
- parsed_hash.delete(:edition_dash_year)
214
- end
215
-
216
- # Safely coerce arbitrary values to strings (parsers can hand us Parslet
217
- # nodes that raise on #to_s in some scenarios).
218
- def safely_to_s(value)
219
- value.to_s
220
- rescue StandardError
221
- ""
222
- end
223
-
224
- # Convert a month abbreviation or name to a 1-based month number.
225
- # Returns nil when the value is not a recognizable month.
226
- def month_to_number(month_str)
227
- Date::ABBR_MONTHNAMES.index(month_str) ||
228
- Date::MONTHNAMES.index(month_str) ||
229
- month_str.to_i
230
- end
231
- end
232
- end
233
- end