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
data/lib/pubid/astm.rb CHANGED
@@ -1,55 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "parslet"
4
+ require "lutaml/model"
5
+ require_relative "identifier"
6
+ require_relative "astm/identifier"
7
+ require_relative "astm/components/code"
8
+ require_relative "astm/single_identifier"
9
+ require_relative "astm/parser"
10
+ require_relative "astm/builder"
11
+
12
+ # Identifier classes
13
+ require_relative "astm/identifiers/base"
14
+ require_relative "astm/identifiers/standard"
15
+ require_relative "astm/identifiers/iso_dual_published"
16
+ require_relative "astm/identifiers/manual"
17
+ require_relative "astm/identifiers/research_report"
18
+ require_relative "astm/identifiers/data_series"
19
+ require_relative "astm/identifiers/technical_report"
20
+ require_relative "astm/identifiers/monograph"
21
+ require_relative "astm/identifiers/adjunct"
22
+ require_relative "astm/identifiers/work_in_progress"
23
+
24
+ # Scheme (must be loaded after identifiers)
25
+ require_relative "astm/scheme"
26
+
3
27
  module Pubid
4
28
  module Astm
5
- extend Pubid::PrefixesSupport
6
-
7
- # Sole ASTM publisher token (see the parser's `publisher` rule).
8
- PREFIXES = ["ASTM"].freeze
9
-
10
- autoload :Components, "#{__dir__}/astm/components"
11
- autoload :Identifier, "#{__dir__}/astm/identifier"
12
- autoload :Identifiers, "#{__dir__}/astm/identifiers"
13
- autoload :SingleIdentifier, "#{__dir__}/astm/single_identifier"
14
- autoload :Parser, "#{__dir__}/astm/parser"
15
- autoload :Builder, "#{__dir__}/astm/builder"
16
- autoload :Renderer, "#{__dir__}/astm/renderer"
17
- autoload :UrnGenerator, "#{__dir__}/astm/urn_generator"
18
- autoload :UrnParser, "#{__dir__}/astm/urn_parser"
19
-
20
29
  def self.parse(str)
21
30
  Identifier.parse(str)
22
31
  end
23
-
24
- def self.identifier_types
25
- @identifier_types ||= Identifiers.constants
26
- .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
27
- .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
28
- .select { |c| c.type.is_a?(Hash) }
29
- end
30
-
31
- def self.all_typed_stages
32
- @all_typed_stages ||= identifier_types.flat_map do |klass|
33
- if klass.const_defined?(:TYPED_STAGES)
34
- klass.const_get(:TYPED_STAGES)
35
- else
36
- []
37
- end
38
- end
39
- end
40
-
41
- def self.locate_type(code)
42
- identifier_types.find { |t| t.type[:key].to_s == code.to_s }
43
- end
44
-
45
- def self.locate_stage(abbr)
46
- abbr_str = abbr.to_s.upcase
47
- all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
48
- end
49
32
  end
33
+
34
+ # Register this flavor with the Pubid registry
50
35
  end
51
36
 
37
+ # Register Uastm flavor with the registry
52
38
  Pubid::Registry.register(:astm, Pubid::Astm)
53
-
54
- Pubid::Astm::SingleIdentifier.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
55
- Pubid::Astm::SingleIdentifier.format_registry.register(:human, renderer: Pubid::Astm::Renderer)
@@ -3,19 +3,12 @@
3
3
  module Pubid
4
4
  module Bsi
5
5
  class Builder < Pubid::Builder::Base
6
- # Default typed stage used when an abbreviation lookup yields no match.
7
- # Empty/unknown abbreviations fall back to the published British Standard.
8
- DEFAULT_TYPED_STAGE = Pubid::Components::TypedStage.new(
9
- code: :pubbs,
10
- stage_code: :published,
11
- type_code: :bs,
12
- abbr: ["BS"],
13
- name: "British Standard",
14
- harmonized_stages: %w[60.00 60.60],
15
- ).freeze
16
-
17
- def self.build(parsed_data)
18
- new.build(parsed_data)
6
+ def initialize(scheme)
7
+ @scheme = scheme
8
+ end
9
+
10
+ def self.build(parsed_data, scheme = Scheme.new)
11
+ new(scheme).build(parsed_data)
19
12
  end
20
13
 
21
14
  def build(data)
@@ -114,14 +107,22 @@ module Pubid
114
107
  if data[:na_prefix]
115
108
  return build_national_annex(data, supplements_data)
116
109
  elsif data[:adopted_string]
117
- # Adopted identifiers carry their supplements and Expert-commentary
118
- # suffix *inside* the adopted string, so build_adopted_identifier does
119
- # all the wrapping. Wrapping again here would double-wrap (a second
120
- # ExpertCommentary around the first) and break #base_document.
121
- return build_adopted_identifier(data)
110
+ # Check for multi-level adoptions
111
+ identifier = build_adopted_identifier(data)
112
+
113
+ # Wrap with consolidated if supplements present
114
+ if supplements_data.any?
115
+ identifier = wrap_with_consolidated(identifier,
116
+ supplements_data)
117
+ end
118
+
119
+ # Wrap with ExpertCommentary if needed
120
+ identifier = wrap_with_expert_commentary(identifier) if data[:expert_commentary]
121
+
122
+ return identifier
122
123
  end
123
124
 
124
- # Determine identifier class using the module's lookup helpers
125
+ # Determine identifier class using Scheme
125
126
  identifier = locate_identifier_klass(data).new
126
127
  assign_attributes(identifier, data)
127
128
 
@@ -131,11 +132,8 @@ module Pubid
131
132
  supplements_data)
132
133
  end
133
134
 
134
- # Wrap with ExpertCommentary if needed (full "Expert Commentary" form
135
- # arrives as the standalone :expert_commentary_full token)
136
- if data[:expert_commentary] || data[:expert_commentary_full]
137
- identifier = wrap_with_expert_commentary(identifier)
138
- end
135
+ # Wrap with ExpertCommentary if needed
136
+ identifier = wrap_with_expert_commentary(identifier) if data[:expert_commentary]
139
137
 
140
138
  identifier
141
139
  end
@@ -164,7 +162,7 @@ module Pubid
164
162
 
165
163
  # Build attributes hash (conditional arguments must be handled separately)
166
164
  attrs = {
167
- number: number_val,
165
+ number: Components::Code.new(value: number_val),
168
166
  issue_number: issue_number,
169
167
  index_format: format,
170
168
  }
@@ -181,7 +179,7 @@ module Pubid
181
179
 
182
180
  # Build attributes hash
183
181
  attrs = {
184
- number: number_val,
182
+ number: Components::Code.new(value: number_val),
185
183
  }
186
184
  attrs[:date] = Components::Date.new(year: year_val) if year_val
187
185
 
@@ -206,9 +204,9 @@ module Pubid
206
204
 
207
205
  # Build attributes hash
208
206
  attrs = {
209
- number: number_val,
207
+ number: Components::Code.new(value: number_val),
210
208
  }
211
- attrs[:part] = part_val if part_val
209
+ attrs[:part] = Components::Code.new(value: part_val) if part_val
212
210
  attrs[:date] = Components::Date.new(year: year_val) if year_val
213
211
 
214
212
  Identifiers::ExplanatorySupplement.new(attrs)
@@ -248,13 +246,13 @@ module Pubid
248
246
 
249
247
  # Build attributes hash
250
248
  attrs = {
251
- number: number_val,
249
+ number: Components::Code.new(value: number_val),
252
250
  method_code: method_code,
253
251
  method_to: method_to,
254
252
  method_and: method_and,
255
253
  is_plural: is_plural,
256
254
  }
257
- attrs[:part] = part_val if part_val
255
+ attrs[:part] = Components::Code.new(value: part_val) if part_val
258
256
  attrs[:date] = Components::Date.new(year: year_val) if year_val
259
257
 
260
258
  Identifiers::Method.new(attrs)
@@ -280,7 +278,7 @@ module Pubid
280
278
 
281
279
  # Build attributes hash
282
280
  attrs = {
283
- number: number_val,
281
+ number: Components::Code.new(value: number_val),
284
282
  test_series: test_series,
285
283
  test_id: test_id,
286
284
  }
@@ -313,7 +311,7 @@ module Pubid
313
311
 
314
312
  # Build attributes hash (conditional arguments must be handled separately)
315
313
  attrs = {
316
- number: number_val,
314
+ number: Components::Code.new(value: number_val),
317
315
  section_id: section_id,
318
316
  section_format: format,
319
317
  }
@@ -343,7 +341,7 @@ module Pubid
343
341
 
344
342
  # Build attributes hash
345
343
  attrs = {
346
- number: number_val,
344
+ number: Components::Code.new(value: number_val),
347
345
  }
348
346
  attrs[:spec_code] = Components::Code.new(value: spec_code) if spec_code
349
347
  if publisher_val
@@ -373,9 +371,9 @@ module Pubid
373
371
 
374
372
  # Build attributes hash
375
373
  attrs = {
376
- number: number_val,
374
+ number: Components::Code.new(value: number_val),
377
375
  }
378
- attrs[:part] = part_val if part_val
376
+ attrs[:part] = Components::Code.new(value: part_val) if part_val
379
377
  attrs[:publisher] = Components::Publisher.new(body: "DISC")
380
378
  attrs[:date] = Components::Date.new(year: year_val) if year_val
381
379
 
@@ -432,9 +430,9 @@ module Pubid
432
430
  # Build attributes hash
433
431
  attrs = {
434
432
  prefix: prefix_val,
435
- number: number_val,
433
+ number: Components::Code.new(value: number_val),
436
434
  }
437
- attrs[:part] = part_val if part_val
435
+ attrs[:part] = Components::Code.new(value: part_val) if part_val
438
436
  attrs[:iteration] = iteration_val if iteration_val
439
437
  attrs[:edition] = final_edition if final_edition
440
438
  attrs[:publisher] = Components::Publisher.new(body: "BS")
@@ -456,20 +454,20 @@ module Pubid
456
454
  # Build base identifier
457
455
  base_id = SingleIdentifier.new(
458
456
  publisher: Components::Publisher.new(body: "BS"),
459
- number: base_number,
457
+ number: Components::Code.new(value: base_number),
460
458
  )
461
459
 
462
460
  # Build identifiers for each part
463
461
  id1 = SingleIdentifier.new(
464
462
  publisher: Components::Publisher.new(body: "BS"),
465
- number: base_number,
466
- part: part1,
463
+ number: Components::Code.new(value: base_number),
464
+ part: Components::Code.new(value: part1),
467
465
  )
468
466
 
469
467
  id2 = SingleIdentifier.new(
470
468
  publisher: Components::Publisher.new(body: "BS"),
471
- number: base_number,
472
- part: part2,
469
+ number: Components::Code.new(value: base_number),
470
+ part: Components::Code.new(value: part2),
473
471
  )
474
472
 
475
473
  Identifiers::BundledIdentifier.new(
@@ -636,7 +634,7 @@ module Pubid
636
634
  publisher: Components::Publisher.new(body: publisher_val),
637
635
  )
638
636
  id.prefix = prefix_val if prefix_val && !prefix_val.empty?
639
- id.number = number_val if number_val
637
+ id.number = Components::Code.new(value: number_val) if number_val
640
638
 
641
639
  id.explicit_prefix = has_explicit_publisher || has_explicit_prefix
642
640
  id.explicit_publisher = has_explicit_publisher
@@ -646,11 +644,11 @@ module Pubid
646
644
  parts_array = parts_val[:parts]
647
645
  if parts_array.any?
648
646
  part_str = parts_array.first[:part].to_s
649
- id.part = part_str
647
+ id.part = Components::Code.new(value: part_str)
650
648
  end
651
649
  # Handle space-separated part (direct part attribute)
652
650
  elsif space_separated_part_val
653
- id.part = space_separated_part_val.to_s
651
+ id.part = Components::Code.new(value: space_separated_part_val.to_s)
654
652
  # Mark this part as space-separated for rendering
655
653
  id.space_separated_part = true
656
654
  end
@@ -674,7 +672,7 @@ module Pubid
674
672
  topic = @original_data[:expert_commentary_topic]&.to_s
675
673
 
676
674
  Identifiers::ExpertCommentary.new(
677
- base: base_id,
675
+ base_identifier: base_id,
678
676
  format: format,
679
677
  topic: topic,
680
678
  )
@@ -724,7 +722,7 @@ module Pubid
724
722
  end
725
723
 
726
724
  Identifiers::SupplementDocument.new(
727
- base: base_id,
725
+ base_identifier: base_id,
728
726
  supplement_number: data[:supplement_number].to_s,
729
727
  supplement_year: data[:supplement_year].to_i,
730
728
  supplement_type: supplement_type,
@@ -771,7 +769,7 @@ module Pubid
771
769
  end
772
770
 
773
771
  Identifiers::AddendumDocument.new(
774
- base: base_id,
772
+ base_identifier: base_id,
775
773
  addendum_number: data[:addendum_number].to_s,
776
774
  addendum_year: data[:addendum_year].to_i,
777
775
  addendum_type: addendum_type,
@@ -790,10 +788,8 @@ module Pubid
790
788
  corrigendum = !amd_data[:corrigendum].nil?
791
789
  parenthesized = !data[:parenthesized_amd].nil?
792
790
 
793
- # NOTE `amd_data[:amendment_number]` above is a PARSE-TREE key and keeps
794
- # its name; only the attribute moved to `number`.
795
791
  attrs = {
796
- number: Components::Code.new(value: amendment_number),
792
+ amendment_number: Components::Code.new(value: amendment_number),
797
793
  corrigendum: corrigendum,
798
794
  parenthesized: parenthesized,
799
795
  }
@@ -811,10 +807,8 @@ module Pubid
811
807
  # Could also use a more sophisticated algorithm for year conversion
812
808
  full_year = year_val ? "20#{year_val}" : nil
813
809
 
814
- # NOTE `data[:document_number]` above is a PARSE-TREE key and keeps its
815
- # name; only the attribute moved to `number`.
816
810
  attrs = {
817
- number: Components::Code.new(value: document_number),
811
+ document_number: document_number,
818
812
  }
819
813
  attrs[:date] = Components::Date.new(year: full_year.to_i) if full_year
820
814
 
@@ -841,7 +835,7 @@ module Pubid
841
835
  base_id = build(base_data)
842
836
 
843
837
  Identifiers::ValueAddedPublication.new(
844
- base: base_id,
838
+ base_identifier: base_id,
845
839
  format: format,
846
840
  )
847
841
  end
@@ -886,14 +880,14 @@ module Pubid
886
880
 
887
881
  if supp[:type] == :amendment
888
882
  Identifiers::Amendment.new(
889
- base: nil, # NA supplements don't wrap base
883
+ base_identifier: nil, # NA supplements don't wrap base
890
884
  amendment_number: supp[:number],
891
885
  amendment_year: year_val&.to_i,
892
886
  separator: supp[:separator] || "+",
893
887
  )
894
888
  else
895
889
  Identifiers::Corrigendum.new(
896
- base: nil,
890
+ base_identifier: nil,
897
891
  corrigendum_number: supp[:number],
898
892
  corrigendum_year: year_val&.to_i,
899
893
  separator: supp[:separator] || "+",
@@ -921,7 +915,6 @@ module Pubid
921
915
  number: (supp_data[:amd_number] || supp_data[:cor_number])&.to_s,
922
916
  year: (supp_data[:amd_year] || supp_data[:cor_year])&.to_s,
923
917
  separator: separator,
924
- amd_suffix_form: !(supp_data[:amd_sep_plus] || supp_data[:amd_sep_slash]),
925
918
  }
926
919
  end
927
920
  end
@@ -941,19 +934,17 @@ module Pubid
941
934
  return Identifiers::AdoptedEuropeanNorm if parsed_hash[:adopted_string]&.match?(/^EN\s+\d/)
942
935
  return Identifiers::AdoptedInternationalStandard if parsed_hash[:adopted_string]
943
936
 
944
- # Use type to determine class via Pubid::Bsi.locate_stage / locate_type.
945
- # Unknown abbreviations fall back to DEFAULT_TYPED_STAGE (published BS).
937
+ # Use type to determine class via Scheme
946
938
  type_str = parsed_hash[:type] || parsed_hash[:stage] || ""
947
- typed_stage = Bsi.locate_stage(type_str.to_s.upcase) || DEFAULT_TYPED_STAGE
948
- Bsi.locate_type(typed_stage.type_code) || Identifiers::BritishStandard
939
+ typed_stage = @scheme.locate_typed_stage_by_abbr(type_str)
940
+ @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
949
941
  end
950
942
 
951
943
  def cast(type, value)
952
944
  case type
953
945
  when :type
954
- # Lookup from register via Pubid::Bsi.locate_stage.
955
- # Unknown abbreviations fall back to DEFAULT_TYPED_STAGE (published BS).
956
- typed_stage = Bsi.locate_stage(value.to_s.upcase) || DEFAULT_TYPED_STAGE
946
+ # Lookup from register
947
+ typed_stage = @scheme.locate_typed_stage_by_abbr(value || "")
957
948
  {
958
949
  stage: typed_stage.to_stage,
959
950
  type: typed_stage.to_type,
@@ -973,7 +964,7 @@ module Pubid
973
964
  value&.to_s
974
965
 
975
966
  when :number
976
- value.to_s
967
+ Components::Code.new(value: value.to_s)
977
968
 
978
969
  when :parts
979
970
  # Extract parts - handle both formats:
@@ -987,25 +978,26 @@ module Pubid
987
978
  # Check if subpart is already separated (new format from part_with_subpart rule)
988
979
  if first_part.key?(:subpart)
989
980
  {
990
- part: part_str,
991
- subpart: first_part[:subpart].to_s,
981
+ part: Components::Code.new(value: part_str),
982
+ subpart: Components::Code.new(value: first_part[:subpart].to_s),
992
983
  }
993
984
  else
994
985
  # Old format - split on dash to get part and subpart
995
986
  part_components = part_str.split("-")
996
- result = { part: part_components.first }
987
+ result = { part: Components::Code.new(value: part_components.first) }
997
988
  if part_components.length > 1
998
- result[:subpart] = part_components[1]
989
+ result[:subpart] =
990
+ Components::Code.new(value: part_components[1])
999
991
  end
1000
992
  result
1001
993
  end
1002
994
  end
1003
995
 
1004
996
  when :part
1005
- value[:part].to_s if value.is_a?(Hash)
997
+ Components::Code.new(value: value[:part].to_s) if value.is_a?(Hash)
1006
998
 
1007
999
  when :subpart
1008
- value.to_s
1000
+ Components::Code.new(value: value.to_s)
1009
1001
 
1010
1002
  when :year, :date
1011
1003
  # Only create date if value is present
@@ -1156,10 +1148,8 @@ module Pubid
1156
1148
  # Extract ExComm suffix before parsing (it should be preserved in data[:expert_commentary])
1157
1149
  # Remove it from adopted_string so ISO/IEC parsers don't choke on it
1158
1150
  # Handle all three formats: "Expert Commentary", "ExComm", "ExComm (Fire)"
1159
- # Expert-commentary suffix matching is case-insensitive; output is always
1160
- # canonicalised to "Expert Commentary" / "ExComm".
1161
- if adopted_str.match?(/expert commentary$/i)
1162
- adopted_str = adopted_str.sub(/expert commentary$/i, "")
1151
+ if adopted_str.end_with?("Expert Commentary")
1152
+ adopted_str = adopted_str.sub(/Expert Commentary$/, "")
1163
1153
  data[:expert_commentary_full] = "Expert Commentary"
1164
1154
  data[:expert_commentary] = true unless data.key?(:expert_commentary)
1165
1155
  # Update @original_data so wrap_with_expert_commentary can access it
@@ -1168,8 +1158,8 @@ module Pubid
1168
1158
  @original_data[:expert_commentary] =
1169
1159
  true
1170
1160
  end
1171
- elsif adopted_str.match?(/excomm \($/i)
1172
- adopted_str = adopted_str.sub(/excomm \(.*\)$/i, "")
1161
+ elsif adopted_str.end_with?("ExComm (")
1162
+ adopted_str = adopted_str.sub(/ExComm \(.*\)$/, "")
1173
1163
  data[:expert_commentary_full] = "Expert Commentary"
1174
1164
  data[:expert_commentary] = true unless data.key?(:expert_commentary)
1175
1165
  @original_data[:expert_commentary_full] = "Expert Commentary"
@@ -1177,10 +1167,10 @@ module Pubid
1177
1167
  @original_data[:expert_commentary] =
1178
1168
  true
1179
1169
  end
1180
- elsif adopted_str.match?(/excomm \(/i)
1170
+ elsif adopted_str.include?("ExComm (")
1181
1171
  # Extract topic from "ExComm (Fire)"
1182
- topic_match = adopted_str.match(/excomm\s*\(([^)]+)\)/i)
1183
- adopted_str = adopted_str.sub(/excomm\s*\(.*\)$/i, "")
1172
+ topic_match = adopted_str.match(/ExComm\s*\(([^)]+)\)/)
1173
+ adopted_str = adopted_str.sub(/ExComm\s*\(.*\)$/, "")
1184
1174
  data[:expert_commentary_topic] = topic_match[1] if topic_match
1185
1175
  data[:expert_commentary] = true unless data.key?(:expert_commentary)
1186
1176
  if topic_match
@@ -1191,9 +1181,9 @@ module Pubid
1191
1181
  @original_data[:expert_commentary] =
1192
1182
  true
1193
1183
  end
1194
- elsif adopted_str.match?(/excomm\s*$/i)
1184
+ elsif adopted_str.match?(/ExComm\s*$/)
1195
1185
  # Abbreviated form "ExComm" at the end
1196
- adopted_str = adopted_str.sub(/excomm\s*$/i, "")
1186
+ adopted_str = adopted_str.sub(/ExComm\s*$/, "")
1197
1187
  data[:expert_commentary] = true unless data.key?(:expert_commentary)
1198
1188
  unless @original_data.key?(:expert_commentary)
1199
1189
  @original_data[:expert_commentary] =
@@ -1259,10 +1249,9 @@ module Pubid
1259
1249
  # BSI uses +A1:2020 format, but ISO/IEC parsers can't handle this
1260
1250
  # Patterns: +A1:2020, +A11:2021, +AMD1:2001, +C1:2020
1261
1251
  extracted_supplements = []
1262
- # Match patterns like: +A1:2020, +A11:2021, +AMD1:2001, +C1:2020, +COR1:2020,
1263
- # and the year-less compact forms +A2 / +C1 (the ":YYYY" is optional).
1252
+ # Match patterns like: +A1:2020, +A11:2021, +AMD1:2001, +C1:2020, +COR1:2020
1264
1253
  # Must be at end of string or followed by space (not colon, which is part of date)
1265
- adopted_str_clean = adopted_str_clean.gsub(/([+])(A(\d+)|AMD(\d+)|C(\d+)|COR(\d+))(?::(\d{4}))?(?:\s|$)/) do |_match|
1254
+ adopted_str_clean = adopted_str_clean.gsub(/([+])(A(\d+)|AMD(\d+)|C(\d+)|COR(\d+)):(\d{4})(?:\s|$)/) do |_match|
1266
1255
  separator = $1 # "+" or "/"
1267
1256
  type_code = $2 || $3 || $4 || $5 || $6
1268
1257
  $2 || $3 || $4 || $5 || $6
@@ -1287,8 +1276,6 @@ module Pubid
1287
1276
  number: supp_number,
1288
1277
  year: year,
1289
1278
  separator: separator,
1290
- # compact "+A"/"/A" join form (not the trailing " AMD5" suffix form)
1291
- amd_suffix_form: false,
1292
1279
  }
1293
1280
 
1294
1281
  "" # Remove from adopted_string
@@ -1304,7 +1291,6 @@ module Pubid
1304
1291
  number: amd_number,
1305
1292
  year: nil,
1306
1293
  separator: nil, # No separator for AMD without year
1307
- amd_suffix_form: true, # trailing " AMD5" suffix form
1308
1294
  }
1309
1295
  "" # Remove from adopted_string
1310
1296
  end.strip
@@ -1326,15 +1312,8 @@ module Pubid
1326
1312
 
1327
1313
  adopted_id = nil
1328
1314
 
1329
- # Check for EN ISO or EN IEC patterns (triple-level).
1330
- # The test must be ANCHORED, because the repair below is: an unanchored
1331
- # match accepts "CEN ISO/TS 12180-1:2007" (the "EN ISO" is inside
1332
- # "CEN ISO"), but `sub(/^EN\s+/, "")` then changes nothing, so
1333
- # adopted_id stayed nil and the whole parse returned nil for 49
1334
- # "DD CEN ISO/..." identifiers in BSI's own pass fixtures. Anchored,
1335
- # a "CEN ..." string falls through to the CEN branch below, which is
1336
- # where it belongs.
1337
- if adopted_str_clean.match?(/\AEN\s+(ISO\/IEC|IEC|ISO)/)
1315
+ # Check for EN ISO or EN IEC patterns (triple-level)
1316
+ if adopted_str_clean.match?(/EN\s+(ISO\/IEC|IEC|ISO)/)
1338
1317
  # Parse the ISO/IEC part
1339
1318
  iso_iec_str = adopted_str_clean.sub(/^EN\s+/, "")
1340
1319
 
@@ -1377,9 +1356,6 @@ module Pubid
1377
1356
  # Return appropriate wrapper based on adoption type
1378
1357
  if adopted_id
1379
1358
  # If adopted_id is a CEN identifier (in Cen module), use AdoptedEuropeanNorm
1380
- # The Expert-commentary suffix is represented uniformly by an outer
1381
- # ExpertCommentary wrapper (below), never a boolean on the inner norm,
1382
- # so that #base_document peels cleanly to the bare standard.
1383
1359
  identifier = if adopted_id.class.name.start_with?("Pubid::CenCenelec::")
1384
1360
  Identifiers::AdoptedEuropeanNorm.new(
1385
1361
  publisher: Components::Publisher.new(body: bsi_prefix),
@@ -1387,6 +1363,10 @@ module Pubid
1387
1363
  edition: final_edition&.to_s,
1388
1364
  translation_lang: data[:translation_lang]&.to_s,
1389
1365
  translation_upper: data[:translation_upper]&.to_s,
1366
+ # Pass expert_commentary data so ConsolidatedIdentifier can render it
1367
+ expert_commentary: data[:expert_commentary],
1368
+ # Pass expert_commentary_topic if present
1369
+ expert_commentary_topic: data[:expert_commentary_topic],
1390
1370
  # Pass translation_suffix_type for rendering
1391
1371
  translation_suffix_type: data[:translation_suffix_type]&.to_s,
1392
1372
  # Pass reaffirmation_year for rendering
@@ -1400,6 +1380,11 @@ module Pubid
1400
1380
  edition: final_edition&.to_s,
1401
1381
  translation_lang: data[:translation_lang]&.to_s,
1402
1382
  translation_upper: data[:translation_upper]&.to_s,
1383
+ # Pass expert_commentary data ONLY if no supplements
1384
+ # When supplements are present, ConsolidatedIdentifier will add ExComm later
1385
+ expert_commentary: data[:expert_commentary] && extracted_supplements.none?,
1386
+ # Pass expert_commentary_topic if present and no supplements
1387
+ expert_commentary_topic: (data[:expert_commentary_topic] if extracted_supplements.none?),
1403
1388
  # Pass translation_suffix_type for rendering
1404
1389
  translation_suffix_type: data[:translation_suffix_type]&.to_s,
1405
1390
  # Pass reaffirmation_year for rendering
@@ -1407,13 +1392,20 @@ module Pubid
1407
1392
  )
1408
1393
  end
1409
1394
 
1410
- # Wrap supplements first (they render before the ExComm suffix), then
1411
- # wrap the whole thing in a single ExpertCommentary — same shape as the
1412
- # pure-BSI path, keeping #base_document uniform.
1395
+ # NEW: Wrap with supplements if any were extracted from adopted_string
1396
+ # This must happen BEFORE wrapping with ExpertCommentary so that supplements
1397
+ # render before ExComm suffix
1413
1398
  if extracted_supplements.any?
1414
- identifier = wrap_with_consolidated(identifier, extracted_supplements)
1415
- end
1416
- if data[:expert_commentary] || data[:expert_commentary_full]
1399
+ # When supplements are present, wrap with ConsolidatedIdentifier
1400
+ # Pass expert_commentary data so ConsolidatedIdentifier can render it later
1401
+ identifier = wrap_with_consolidated(
1402
+ identifier,
1403
+ extracted_supplements,
1404
+ expert_commentary: data[:expert_commentary],
1405
+ expert_commentary_topic: data[:expert_commentary_topic],
1406
+ )
1407
+ elsif data[:expert_commentary]
1408
+ # When no supplements but ExComm present, wrap with ExpertCommentary
1417
1409
  identifier = wrap_with_expert_commentary(identifier)
1418
1410
  end
1419
1411
 
@@ -1421,17 +1413,17 @@ module Pubid
1421
1413
  end
1422
1414
  end
1423
1415
 
1424
- def wrap_with_consolidated(base, supplements_data,
1416
+ def wrap_with_consolidated(base_identifier, supplements_data,
1425
1417
  expert_commentary: nil, expert_commentary_topic: nil)
1426
- # If expert_commentary data is provided, set it on the base
1418
+ # If expert_commentary data is provided, set it on the base_identifier
1427
1419
  # This allows ConsolidatedIdentifier to render the ExComm suffix correctly
1428
1420
  if expert_commentary
1429
- base_attrs = base.class.attributes
1421
+ base_attrs = base_identifier.class.attributes
1430
1422
  if base_attrs.key?(:expert_commentary)
1431
- base.expert_commentary = expert_commentary
1423
+ base_identifier.expert_commentary = expert_commentary
1432
1424
  end
1433
1425
  if expert_commentary_topic && base_attrs.key?(:expert_commentary_topic)
1434
- base.expert_commentary_topic = expert_commentary_topic
1426
+ base_identifier.expert_commentary_topic = expert_commentary_topic
1435
1427
  end
1436
1428
  end
1437
1429
 
@@ -1446,15 +1438,14 @@ expert_commentary: nil, expert_commentary_topic: nil)
1446
1438
 
1447
1439
  if supp[:type] == :amendment
1448
1440
  Identifiers::Amendment.new(
1449
- base: base,
1441
+ base_identifier: base_identifier,
1450
1442
  amendment_number: supp[:number],
1451
1443
  amendment_year: year_val&.to_i,
1452
1444
  separator: supp[:separator] || "+",
1453
- amd_suffix_form: supp[:amd_suffix_form] ? true : false,
1454
1445
  )
1455
1446
  else
1456
1447
  Identifiers::Corrigendum.new(
1457
- base: base,
1448
+ base_identifier: base_identifier,
1458
1449
  corrigendum_number: supp[:number],
1459
1450
  corrigendum_year: year_val&.to_i,
1460
1451
  separator: supp[:separator] || "+",
@@ -1463,7 +1454,7 @@ expert_commentary: nil, expert_commentary_topic: nil)
1463
1454
  end
1464
1455
 
1465
1456
  Identifiers::ConsolidatedIdentifier.new(
1466
- identifiers: [base] + supplement_ids,
1457
+ identifiers: [base_identifier] + supplement_ids,
1467
1458
  )
1468
1459
  end
1469
1460
 
@@ -1484,9 +1475,6 @@ expert_commentary: nil, expert_commentary_topic: nil)
1484
1475
  number: (supp_data[:amd_number] || supp_data[:cor_number])&.to_s,
1485
1476
  year: (supp_data[:amd_year] || supp_data[:cor_year])&.to_s,
1486
1477
  separator: separator,
1487
- # The compact "+A"/"/A" amendment rule captures an explicit separator;
1488
- # the trailing " AMD5" suffix form does not.
1489
- amd_suffix_form: !(supp_data[:amd_sep_plus] || supp_data[:amd_sep_slash]),
1490
1478
  }
1491
1479
  end
1492
1480
  end