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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (811) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +51 -54
  3. data/data/iec/update_codes.yaml +0 -3
  4. data/data/ieee/update_codes.yaml +1 -107
  5. data/data/nist/update_codes.yaml +0 -35
  6. data/lib/pubid/amca/builder.rb +6 -6
  7. data/lib/pubid/amca/identifier.rb +16 -2
  8. data/lib/pubid/amca/identifiers/base.rb +46 -74
  9. data/lib/pubid/amca/identifiers/interpretation.rb +30 -17
  10. data/lib/pubid/amca/identifiers/publication.rb +27 -14
  11. data/lib/pubid/amca/identifiers/standard.rb +5 -3
  12. data/lib/pubid/amca/identifiers.rb +1 -0
  13. data/lib/pubid/amca/parser.rb +1 -1
  14. data/lib/pubid/amca/scheme.rb +16 -0
  15. data/lib/pubid/amca/single_identifier.rb +24 -1
  16. data/lib/pubid/amca/urn_generator.rb +3 -4
  17. data/lib/pubid/amca.rb +3 -50
  18. data/lib/pubid/ansi/builder.rb +5 -7
  19. data/lib/pubid/ansi/identifier.rb +1 -19
  20. data/lib/pubid/ansi/identifiers/american_national_standard.rb +1 -2
  21. data/lib/pubid/ansi/identifiers/standard.rb +3 -2
  22. data/lib/pubid/ansi/parser.rb +1 -1
  23. data/lib/pubid/ansi/scheme.rb +15 -0
  24. data/lib/pubid/ansi/single_identifier.rb +31 -2
  25. data/lib/pubid/ansi/urn_generator.rb +38 -3
  26. data/lib/pubid/ansi.rb +6 -47
  27. data/lib/pubid/api/builder.rb +72 -45
  28. data/lib/pubid/api/identifier.rb +9 -30
  29. data/lib/pubid/api/identifiers/base.rb +14 -2
  30. data/lib/pubid/api/identifiers/bulletin.rb +2 -0
  31. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +2 -0
  32. data/lib/pubid/api/identifiers/mpms.rb +28 -10
  33. data/lib/pubid/api/identifiers/publication.rb +2 -0
  34. data/lib/pubid/api/identifiers/recommended_practice.rb +2 -0
  35. data/lib/pubid/api/identifiers/specification.rb +2 -0
  36. data/lib/pubid/api/identifiers/standard.rb +2 -0
  37. data/lib/pubid/api/identifiers/technical_report.rb +2 -0
  38. data/lib/pubid/api/identifiers/typeless_standard.rb +16 -0
  39. data/lib/pubid/api/parser.rb +1 -1
  40. data/lib/pubid/api/scheme.rb +66 -0
  41. data/lib/pubid/api/single_identifier.rb +32 -10
  42. data/lib/pubid/api/urn_generator.rb +18 -0
  43. data/lib/pubid/api.rb +5 -56
  44. data/lib/pubid/ashrae/builder.rb +35 -56
  45. data/lib/pubid/ashrae/identifier.rb +16 -6
  46. data/lib/pubid/ashrae/identifiers/addenda_package.rb +11 -7
  47. data/lib/pubid/ashrae/identifiers/addendum.rb +20 -9
  48. data/lib/pubid/ashrae/identifiers/base.rb +15 -111
  49. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +16 -8
  50. data/lib/pubid/ashrae/identifiers/errata.rb +10 -9
  51. data/lib/pubid/ashrae/identifiers/guideline.rb +0 -3
  52. data/lib/pubid/ashrae/identifiers/interpretation.rb +10 -16
  53. data/lib/pubid/ashrae/identifiers/standard.rb +0 -3
  54. data/lib/pubid/ashrae/identifiers.rb +1 -0
  55. data/lib/pubid/ashrae/parser.rb +16 -40
  56. data/lib/pubid/ashrae/scheme.rb +53 -0
  57. data/lib/pubid/ashrae/single_identifier.rb +14 -1
  58. data/lib/pubid/ashrae/supplement_identifier.rb +6 -21
  59. data/lib/pubid/ashrae/urn_generator.rb +10 -8
  60. data/lib/pubid/ashrae.rb +2 -58
  61. data/lib/pubid/asme/builder.rb +2 -11
  62. data/lib/pubid/asme/components/code.rb +2 -10
  63. data/lib/pubid/asme/identifier.rb +0 -9
  64. data/lib/pubid/asme/identifiers/base.rb +60 -0
  65. data/lib/pubid/asme/identifiers/standard.rb +2 -86
  66. data/lib/pubid/asme/parser.rb +1 -1
  67. data/lib/pubid/asme/scheme.rb +37 -0
  68. data/lib/pubid/asme/single_identifier.rb +2 -11
  69. data/lib/pubid/asme/urn_generator.rb +2 -2
  70. data/lib/pubid/asme.rb +1 -47
  71. data/lib/pubid/astm/builder.rb +3 -10
  72. data/lib/pubid/astm/components/code.rb +0 -9
  73. data/lib/pubid/astm/identifier.rb +0 -9
  74. data/lib/pubid/astm/identifiers/adjunct.rb +9 -16
  75. data/lib/pubid/astm/identifiers/data_series.rb +14 -2
  76. data/lib/pubid/astm/identifiers/iso_dual_published.rb +34 -25
  77. data/lib/pubid/astm/identifiers/manual.rb +25 -8
  78. data/lib/pubid/astm/identifiers/monograph.rb +14 -2
  79. data/lib/pubid/astm/identifiers/research_report.rb +5 -8
  80. data/lib/pubid/astm/identifiers/standard.rb +37 -8
  81. data/lib/pubid/astm/identifiers/technical_report.rb +13 -2
  82. data/lib/pubid/astm/identifiers/work_in_progress.rb +10 -1
  83. data/lib/pubid/astm/parser.rb +1 -1
  84. data/lib/pubid/astm/scheme.rb +55 -0
  85. data/lib/pubid/astm/single_identifier.rb +10 -32
  86. data/lib/pubid/astm/urn_generator.rb +5 -7
  87. data/lib/pubid/astm.rb +27 -44
  88. data/lib/pubid/bsi/builder.rb +107 -119
  89. data/lib/pubid/bsi/identifier.rb +25 -4
  90. data/lib/pubid/bsi/identifiers/addendum_document.rb +37 -3
  91. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +47 -19
  92. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +39 -8
  93. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +55 -2
  94. data/lib/pubid/bsi/identifiers/amendment.rb +22 -30
  95. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  96. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +7 -1
  97. data/lib/pubid/bsi/identifiers/british_standard.rb +1 -2
  98. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +87 -13
  99. data/lib/pubid/bsi/identifiers/committee_document.rb +17 -10
  100. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +87 -19
  101. data/lib/pubid/bsi/identifiers/corrigendum.rb +10 -26
  102. data/lib/pubid/bsi/identifiers/detailed_specification.rb +36 -0
  103. data/lib/pubid/bsi/identifiers/disc.rb +29 -0
  104. data/lib/pubid/bsi/identifiers/draft_document.rb +46 -2
  105. data/lib/pubid/bsi/identifiers/electronic_book.rb +38 -2
  106. data/lib/pubid/bsi/identifiers/expert_commentary.rb +21 -10
  107. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +47 -0
  108. data/lib/pubid/bsi/identifiers/flex.rb +34 -3
  109. data/lib/pubid/bsi/identifiers/handbook.rb +17 -1
  110. data/lib/pubid/bsi/identifiers/index.rb +32 -0
  111. data/lib/pubid/bsi/identifiers/method.rb +41 -0
  112. data/lib/pubid/bsi/identifiers/national_annex.rb +29 -4
  113. data/lib/pubid/bsi/identifiers/practice_guide.rb +7 -1
  114. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +54 -2
  115. data/lib/pubid/bsi/identifiers/published_document.rb +54 -2
  116. data/lib/pubid/bsi/identifiers/section.rb +30 -0
  117. data/lib/pubid/bsi/identifiers/set.rb +20 -14
  118. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -10
  119. data/lib/pubid/bsi/identifiers/supplement_document.rb +25 -3
  120. data/lib/pubid/bsi/identifiers/supplementary_index.rb +46 -0
  121. data/lib/pubid/bsi/identifiers/technical_specification.rb +47 -2
  122. data/lib/pubid/bsi/identifiers/test_method.rb +32 -0
  123. data/lib/pubid/bsi/identifiers/value_added_publication.rb +22 -7
  124. data/lib/pubid/bsi/identifiers.rb +1 -0
  125. data/lib/pubid/bsi/parser.rb +6 -20
  126. data/lib/pubid/bsi/scheme.rb +243 -0
  127. data/lib/pubid/bsi/single_identifier.rb +82 -94
  128. data/lib/pubid/bsi/urn_generator.rb +5 -13
  129. data/lib/pubid/bsi.rb +2 -252
  130. data/lib/pubid/builder/base.rb +13 -62
  131. data/lib/pubid/bundled_identifier.rb +10 -18
  132. data/lib/pubid/ccsds/builder.rb +4 -5
  133. data/lib/pubid/ccsds/identifier.rb +3 -63
  134. data/lib/pubid/ccsds/identifiers/base.rb +51 -14
  135. data/lib/pubid/ccsds/identifiers/corrigendum.rb +8 -9
  136. data/lib/pubid/ccsds/parser.rb +3 -5
  137. data/lib/pubid/ccsds/scheme.rb +57 -0
  138. data/lib/pubid/ccsds/single_identifier.rb +3 -6
  139. data/lib/pubid/ccsds/supplement_identifier.rb +13 -17
  140. data/lib/pubid/ccsds/urn_generator.rb +6 -6
  141. data/lib/pubid/ccsds.rb +1 -44
  142. data/lib/pubid/cen_cenelec/builder.rb +29 -61
  143. data/lib/pubid/cen_cenelec/identifier.rb +5 -28
  144. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +4 -9
  145. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +12 -2
  146. data/lib/pubid/cen_cenelec/identifiers/base.rb +46 -5
  147. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -2
  148. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -2
  149. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +27 -6
  150. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +17 -2
  151. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +4 -62
  152. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +7 -20
  153. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -2
  154. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +6 -2
  155. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -2
  156. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -2
  157. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -2
  158. data/lib/pubid/cen_cenelec/parser.rb +1 -1
  159. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  160. data/lib/pubid/cen_cenelec/single_identifier.rb +91 -10
  161. data/lib/pubid/cen_cenelec/supplement_identifier.rb +7 -6
  162. data/lib/pubid/cen_cenelec/urn_generator.rb +7 -7
  163. data/lib/pubid/cen_cenelec.rb +1 -188
  164. data/lib/pubid/cie/builder.rb +24 -149
  165. data/lib/pubid/cie/components/code.rb +72 -0
  166. data/lib/pubid/cie/identifier.rb +5 -20
  167. data/lib/pubid/cie/identifiers/bundle.rb +5 -35
  168. data/lib/pubid/cie/identifiers/conference.rb +6 -11
  169. data/lib/pubid/cie/identifiers/corrigendum.rb +23 -17
  170. data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
  171. data/lib/pubid/cie/identifiers/identical.rb +9 -9
  172. data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
  173. data/lib/pubid/cie/identifiers/standard.rb +8 -43
  174. data/lib/pubid/cie/identifiers/supplement.rb +25 -27
  175. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +3 -7
  176. data/lib/pubid/cie/identifiers.rb +0 -2
  177. data/lib/pubid/cie/parser.rb +6 -55
  178. data/lib/pubid/cie/scheme.rb +64 -0
  179. data/lib/pubid/cie/single_identifier.rb +5 -44
  180. data/lib/pubid/cie/supplement_identifier.rb +16 -29
  181. data/lib/pubid/cie/urn_generator.rb +8 -11
  182. data/lib/pubid/cie.rb +2 -57
  183. data/lib/pubid/components/code.rb +8 -22
  184. data/lib/pubid/components/date.rb +18 -41
  185. data/lib/pubid/components/edition.rb +6 -9
  186. data/lib/pubid/components/language.rb +4 -6
  187. data/lib/pubid/components/locality.rb +1 -10
  188. data/lib/pubid/components/publisher.rb +6 -9
  189. data/lib/pubid/components/stage.rb +14 -5
  190. data/lib/pubid/components/type.rb +15 -5
  191. data/lib/pubid/components/typed_stage.rb +8 -11
  192. data/lib/pubid/components.rb +0 -4
  193. data/lib/pubid/core/update_codes.rb +7 -28
  194. data/lib/pubid/csa/builder.rb +48 -48
  195. data/lib/pubid/csa/composite_identifier.rb +7 -18
  196. data/lib/pubid/csa/identifier.rb +78 -191
  197. data/lib/pubid/csa/identifiers/base.rb +123 -0
  198. data/lib/pubid/csa/identifiers/bundled.rb +9 -25
  199. data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
  200. data/lib/pubid/csa/identifiers/cec.rb +103 -40
  201. data/lib/pubid/csa/identifiers/combined.rb +69 -97
  202. data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
  203. data/lib/pubid/csa/identifiers/package.rb +4 -4
  204. data/lib/pubid/csa/identifiers/series.rb +104 -0
  205. data/lib/pubid/csa/parser.rb +8 -12
  206. data/lib/pubid/csa/scheme.rb +44 -0
  207. data/lib/pubid/csa/single_identifier.rb +5 -94
  208. data/lib/pubid/csa/urn_generator.rb +2 -9
  209. data/lib/pubid/csa/wrapper_identifier.rb +10 -43
  210. data/lib/pubid/csa.rb +1 -56
  211. data/lib/pubid/etsi/builder.rb +4 -13
  212. data/lib/pubid/etsi/components/code.rb +9 -10
  213. data/lib/pubid/etsi/components/version.rb +5 -0
  214. data/lib/pubid/etsi/identifier.rb +12 -2
  215. data/lib/pubid/etsi/identifiers/base.rb +24 -60
  216. data/lib/pubid/etsi/identifiers/etsi_standard.rb +4 -207
  217. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +14 -46
  218. data/lib/pubid/etsi/identifiers.rb +1 -0
  219. data/lib/pubid/etsi/parser.rb +3 -9
  220. data/lib/pubid/etsi/scheme.rb +42 -0
  221. data/lib/pubid/etsi.rb +2 -52
  222. data/lib/pubid/export/data_class_exporter.rb +59 -0
  223. data/lib/pubid/export/exporter.rb +47 -6
  224. data/lib/pubid/export/flavor_exporter.rb +276 -124
  225. data/lib/pubid/export/ieee_exporter.rb +78 -0
  226. data/lib/pubid/export/itu_exporter.rb +66 -0
  227. data/lib/pubid/export/nist_exporter.rb +64 -0
  228. data/lib/pubid/export/registry_exporter.rb +90 -0
  229. data/lib/pubid/export/scheme_exporter.rb +70 -0
  230. data/lib/pubid/export.rb +6 -0
  231. data/lib/pubid/identifier.rb +37 -920
  232. data/lib/pubid/identifier_metadata.rb +1 -1
  233. data/lib/pubid/identifier_registry.rb +198 -0
  234. data/lib/pubid/idf/builder.rb +7 -7
  235. data/lib/pubid/idf/identifier.rb +13 -23
  236. data/lib/pubid/idf/identifiers/amendment.rb +1 -2
  237. data/lib/pubid/idf/identifiers/corrigendum.rb +1 -2
  238. data/lib/pubid/idf/identifiers/international_standard.rb +1 -2
  239. data/lib/pubid/idf/identifiers/reviewed_method.rb +1 -2
  240. data/lib/pubid/idf/parser.rb +5 -6
  241. data/lib/pubid/idf/scheme.rb +61 -0
  242. data/lib/pubid/idf/supplement_identifier.rb +13 -5
  243. data/lib/pubid/idf/urn_generator.rb +39 -4
  244. data/lib/pubid/idf.rb +1 -65
  245. data/lib/pubid/iec/builder.rb +91 -92
  246. data/lib/pubid/iec/components/code.rb +32 -9
  247. data/lib/pubid/iec/components/publisher.rb +1 -1
  248. data/lib/pubid/iec/identifier.rb +8 -328
  249. data/lib/pubid/iec/identifiers/amendment.rb +5 -8
  250. data/lib/pubid/iec/identifiers/base.rb +31 -7
  251. data/lib/pubid/iec/identifiers/component_specification.rb +13 -3
  252. data/lib/pubid/iec/identifiers/conformity_assessment.rb +12 -1
  253. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +30 -29
  254. data/lib/pubid/iec/identifiers/corrigendum.rb +5 -4
  255. data/lib/pubid/iec/identifiers/fragment_identifier.rb +36 -43
  256. data/lib/pubid/iec/identifiers/guide.rb +18 -0
  257. data/lib/pubid/iec/identifiers/international_standard.rb +9 -24
  258. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +3 -2
  259. data/lib/pubid/iec/identifiers/operational_document.rb +13 -3
  260. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +15 -2
  261. data/lib/pubid/iec/identifiers/sheet_identifier.rb +24 -26
  262. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +13 -3
  263. data/lib/pubid/iec/identifiers/systems_reference_document.rb +13 -2
  264. data/lib/pubid/iec/identifiers/technical_report.rb +21 -3
  265. data/lib/pubid/iec/identifiers/technical_specification.rb +21 -3
  266. data/lib/pubid/iec/identifiers/technology_report.rb +12 -1
  267. data/lib/pubid/iec/identifiers/test_report_form.rb +46 -3
  268. data/lib/pubid/iec/identifiers/vap_identifier.rb +34 -33
  269. data/lib/pubid/iec/identifiers/white_paper.rb +13 -3
  270. data/lib/pubid/iec/identifiers/working_document.rb +60 -26
  271. data/lib/pubid/iec/parser.rb +42 -73
  272. data/lib/pubid/iec/scheme.rb +71 -0
  273. data/lib/pubid/iec/single_identifier.rb +23 -15
  274. data/lib/pubid/iec/supplement_identifier.rb +67 -84
  275. data/lib/pubid/iec/urn_generator.rb +143 -195
  276. data/lib/pubid/iec/urn_parser.rb +246 -85
  277. data/lib/pubid/iec.rb +66 -45
  278. data/lib/pubid/ieee/aiee/builder.rb +3 -17
  279. data/lib/pubid/ieee/aiee/identifier.rb +62 -46
  280. data/lib/pubid/ieee/aiee/parser.rb +1 -1
  281. data/lib/pubid/ieee/builder.rb +81 -398
  282. data/lib/pubid/ieee/components/code.rb +0 -8
  283. data/lib/pubid/ieee/components/draft.rb +0 -54
  284. data/lib/pubid/ieee/components/relationship.rb +149 -5
  285. data/lib/pubid/ieee/identifier.rb +11 -3
  286. data/lib/pubid/ieee/identifiers/adopted_standard.rb +14 -62
  287. data/lib/pubid/ieee/identifiers/base.rb +547 -340
  288. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +12 -6
  289. data/lib/pubid/ieee/identifiers/corrigendum.rb +12 -15
  290. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +13 -24
  291. data/lib/pubid/ieee/identifiers/dual_identifier.rb +7 -3
  292. data/lib/pubid/ieee/identifiers/dual_published.rb +7 -58
  293. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +11 -99
  294. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +11 -25
  295. data/lib/pubid/ieee/identifiers/joint_development.rb +15 -66
  296. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +24 -58
  297. data/lib/pubid/ieee/identifiers/nesc/base.rb +19 -90
  298. data/lib/pubid/ieee/identifiers/nesc/draft.rb +5 -20
  299. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +5 -16
  300. data/lib/pubid/ieee/identifiers/nesc/redline.rb +2 -11
  301. data/lib/pubid/ieee/identifiers/nesc/standard.rb +3 -18
  302. data/lib/pubid/ieee/identifiers/nesc.rb +0 -1
  303. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +9 -3
  304. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +6 -29
  305. data/lib/pubid/ieee/identifiers/redlined_standard.rb +11 -4
  306. data/lib/pubid/ieee/identifiers/si_standard.rb +39 -4
  307. data/lib/pubid/ieee/identifiers/standard.rb +2 -5
  308. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +7 -26
  309. data/lib/pubid/ieee/identifiers.rb +1 -2
  310. data/lib/pubid/ieee/ire/builder.rb +6 -7
  311. data/lib/pubid/ieee/ire/identifier.rb +33 -48
  312. data/lib/pubid/ieee/ire/parser.rb +1 -1
  313. data/lib/pubid/ieee/nesc/builder.rb +20 -33
  314. data/lib/pubid/ieee/nesc/parser.rb +15 -16
  315. data/lib/pubid/ieee/parser.rb +44 -462
  316. data/lib/pubid/ieee/scheme.rb +90 -0
  317. data/lib/pubid/ieee/typed_stages.rb +1 -12
  318. data/lib/pubid/ieee/urn_generator.rb +8 -35
  319. data/lib/pubid/ieee.rb +2 -133
  320. data/lib/pubid/ieee_debug.rb +1 -0
  321. data/lib/pubid/iho/builder.rb +2 -2
  322. data/lib/pubid/iho/identifier.rb +17 -5
  323. data/lib/pubid/iho/identifiers/base.rb +30 -64
  324. data/lib/pubid/iho/identifiers/bibliographic.rb +5 -1
  325. data/lib/pubid/iho/identifiers/circular_letter.rb +5 -1
  326. data/lib/pubid/iho/identifiers/miscellaneous.rb +5 -1
  327. data/lib/pubid/iho/identifiers/publication.rb +5 -1
  328. data/lib/pubid/iho/identifiers/standard.rb +5 -1
  329. data/lib/pubid/iho/identifiers.rb +1 -0
  330. data/lib/pubid/iho/parser.rb +4 -4
  331. data/lib/pubid/iho/scheme.rb +29 -0
  332. data/lib/pubid/iho/urn_generator.rb +3 -3
  333. data/lib/pubid/iho.rb +3 -59
  334. data/lib/pubid/iso/builder.rb +57 -68
  335. data/lib/pubid/iso/bundled_identifier.rb +3 -56
  336. data/lib/pubid/iso/combined_identifier.rb +4 -6
  337. data/lib/pubid/iso/components/code.rb +19 -7
  338. data/lib/pubid/iso/components/publisher.rb +8 -10
  339. data/lib/pubid/iso/components.rb +4 -2
  340. data/lib/pubid/iso/identifier.rb +11 -260
  341. data/lib/pubid/iso/identifiers/addendum.rb +6 -9
  342. data/lib/pubid/iso/identifiers/amendment.rb +4 -8
  343. data/lib/pubid/iso/identifiers/base.rb +115 -0
  344. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  345. data/lib/pubid/iso/identifiers/data.rb +1 -0
  346. data/lib/pubid/iso/identifiers/directives.rb +2 -8
  347. data/lib/pubid/iso/identifiers/directives_supplement.rb +26 -55
  348. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  349. data/lib/pubid/iso/identifiers/guide.rb +1 -0
  350. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  351. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  352. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +4 -10
  353. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  354. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  355. data/lib/pubid/iso/identifiers/supplement.rb +3 -11
  356. data/lib/pubid/iso/identifiers/tc_document.rb +15 -44
  357. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  358. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  359. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  360. data/lib/pubid/iso/identifiers.rb +1 -0
  361. data/lib/pubid/iso/parser.rb +19 -43
  362. data/lib/pubid/iso/scheme.rb +187 -0
  363. data/lib/pubid/iso/single_identifier.rb +7 -6
  364. data/lib/pubid/iso/supplement_identifier.rb +3 -29
  365. data/lib/pubid/iso/urn_generator.rb +177 -78
  366. data/lib/pubid/iso/urn_parser.rb +10 -29
  367. data/lib/pubid/iso.rb +2 -188
  368. data/lib/pubid/itu/builder.rb +41 -230
  369. data/lib/pubid/itu/components/code.rb +12 -57
  370. data/lib/pubid/itu/components/sector.rb +4 -15
  371. data/lib/pubid/itu/components/series.rb +4 -0
  372. data/lib/pubid/itu/identifier.rb +51 -2
  373. data/lib/pubid/itu/identifiers/amendment.rb +31 -7
  374. data/lib/pubid/itu/identifiers/annex.rb +4 -13
  375. data/lib/pubid/itu/identifiers/base.rb +128 -456
  376. data/lib/pubid/itu/identifiers/combined_identifier.rb +25 -99
  377. data/lib/pubid/itu/identifiers/corrigendum.rb +25 -16
  378. data/lib/pubid/itu/identifiers/recommendation.rb +4 -3
  379. data/lib/pubid/itu/identifiers/special_publication.rb +3 -3
  380. data/lib/pubid/itu/identifiers/supplement.rb +16 -119
  381. data/lib/pubid/itu/identifiers.rb +1 -10
  382. data/lib/pubid/itu/model.rb +1 -1
  383. data/lib/pubid/itu/parser.rb +27 -481
  384. data/lib/pubid/itu/scheme.rb +174 -0
  385. data/lib/pubid/itu/urn_generator.rb +6 -36
  386. data/lib/pubid/itu.rb +2 -58
  387. data/lib/pubid/jcgm/builder.rb +19 -37
  388. data/lib/pubid/jcgm/identifier.rb +0 -10
  389. data/lib/pubid/jcgm/identifiers/amendment.rb +11 -0
  390. data/lib/pubid/jcgm/identifiers/gum_guide.rb +15 -3
  391. data/lib/pubid/jcgm/identifiers.rb +0 -2
  392. data/lib/pubid/jcgm/parser.rb +7 -74
  393. data/lib/pubid/jcgm/scheme.rb +60 -0
  394. data/lib/pubid/jcgm/single_identifier.rb +14 -84
  395. data/lib/pubid/jcgm/supplement_identifier.rb +4 -39
  396. data/lib/pubid/jcgm/urn_generator.rb +19 -25
  397. data/lib/pubid/jcgm.rb +2 -57
  398. data/lib/pubid/jis/builder.rb +52 -44
  399. data/lib/pubid/jis/components/code.rb +59 -0
  400. data/lib/pubid/{astm → jis}/components.rb +1 -1
  401. data/lib/pubid/jis/identifier.rb +5 -181
  402. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  403. data/lib/pubid/jis/identifiers/base.rb +72 -0
  404. data/lib/pubid/jis/identifiers/standard.rb +1 -2
  405. data/lib/pubid/jis/identifiers/technical_report.rb +1 -2
  406. data/lib/pubid/jis/identifiers/technical_specification.rb +1 -2
  407. data/lib/pubid/jis/identifiers.rb +1 -1
  408. data/lib/pubid/jis/parser.rb +6 -32
  409. data/lib/pubid/jis/scheme.rb +49 -0
  410. data/lib/pubid/jis/single_identifier.rb +12 -6
  411. data/lib/pubid/jis/supplement_identifier.rb +14 -17
  412. data/lib/pubid/jis.rb +2 -48
  413. data/lib/pubid/nist/builder.rb +1765 -146
  414. data/lib/pubid/nist/components/code.rb +20 -9
  415. data/lib/pubid/nist/components/edition.rb +0 -16
  416. data/lib/pubid/nist/components/publisher.rb +24 -0
  417. data/lib/pubid/nist/components/supplement.rb +21 -91
  418. data/lib/pubid/nist/components.rb +1 -0
  419. data/lib/pubid/nist/configuration.rb +2 -12
  420. data/lib/pubid/nist/identifiers/base.rb +417 -662
  421. data/lib/pubid/nist/identifiers/circular.rb +5 -17
  422. data/lib/pubid/nist/identifiers/circular_supplement.rb +6 -16
  423. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -3
  424. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +5 -7
  425. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +5 -18
  426. data/lib/pubid/nist/identifiers/crpl_report.rb +13 -16
  427. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -18
  428. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -3
  429. data/lib/pubid/nist/identifiers/handbook.rb +4 -12
  430. data/lib/pubid/nist/identifiers/internal_report.rb +7 -15
  431. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -3
  432. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +11 -20
  433. data/lib/pubid/nist/identifiers/monograph.rb +11 -22
  434. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  435. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  436. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  437. data/lib/pubid/nist/identifiers/report.rb +10 -19
  438. data/lib/pubid/nist/identifiers/special_publication.rb +2 -12
  439. data/lib/pubid/nist/identifiers/technical_note.rb +3 -4
  440. data/lib/pubid/nist/identifiers.rb +1 -1
  441. data/lib/pubid/nist/parser.rb +429 -97
  442. data/lib/pubid/nist/scheme.rb +199 -0
  443. data/lib/pubid/nist/supplement_identifier.rb +34 -35
  444. data/lib/pubid/nist/urn_generator.rb +8 -14
  445. data/lib/pubid/nist.rb +5 -107
  446. data/lib/pubid/oiml/builder.rb +10 -91
  447. data/lib/pubid/oiml/components/code.rb +0 -17
  448. data/lib/pubid/oiml/identifier.rb +0 -53
  449. data/lib/pubid/oiml/identifiers/annex.rb +46 -13
  450. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  451. data/lib/pubid/oiml/identifiers/basic_publication.rb +0 -2
  452. data/lib/pubid/oiml/identifiers/document.rb +0 -2
  453. data/lib/pubid/oiml/identifiers/expert_report.rb +0 -2
  454. data/lib/pubid/oiml/identifiers/guide.rb +0 -2
  455. data/lib/pubid/oiml/identifiers/recommendation.rb +0 -2
  456. data/lib/pubid/oiml/identifiers/seminar_report.rb +0 -2
  457. data/lib/pubid/oiml/identifiers/vocabulary.rb +0 -2
  458. data/lib/pubid/oiml/identifiers.rb +1 -3
  459. data/lib/pubid/oiml/parser.rb +17 -118
  460. data/lib/pubid/oiml/scheme.rb +46 -0
  461. data/lib/pubid/oiml/single_identifier.rb +43 -66
  462. data/lib/pubid/oiml/supplement_identifier.rb +17 -62
  463. data/lib/pubid/oiml/urn_generator.rb +8 -22
  464. data/lib/pubid/oiml.rb +1 -56
  465. data/lib/pubid/parser.rb +0 -1
  466. data/lib/pubid/parsers/mr_string.rb +7 -120
  467. data/lib/pubid/plateau/builder.rb +4 -8
  468. data/lib/pubid/plateau/identifiers/base.rb +36 -40
  469. data/lib/pubid/plateau/identifiers/handbook.rb +7 -1
  470. data/lib/pubid/plateau/identifiers/technical_report.rb +5 -1
  471. data/lib/pubid/plateau/identifiers.rb +1 -0
  472. data/lib/pubid/plateau/parser.rb +6 -16
  473. data/lib/pubid/plateau/scheme.rb +45 -0
  474. data/lib/pubid/plateau/supplement_identifier.rb +15 -11
  475. data/lib/pubid/plateau.rb +1 -58
  476. data/lib/pubid/renderers/base.rb +0 -47
  477. data/lib/pubid/renderers/directives_renderer.rb +14 -27
  478. data/lib/pubid/renderers/guide_renderer.rb +1 -7
  479. data/lib/pubid/renderers/human_readable.rb +9 -34
  480. data/lib/pubid/renderers/iwa_renderer.rb +1 -5
  481. data/lib/pubid/renderers/mr_string.rb +6 -54
  482. data/lib/pubid/renderers/supplement_renderer.rb +2 -5
  483. data/lib/pubid/renderers.rb +0 -1
  484. data/lib/pubid/rendering/base.rb +73 -0
  485. data/lib/pubid/rendering/common.rb +211 -0
  486. data/lib/pubid/rendering/context.rb +21 -33
  487. data/lib/pubid/rendering/format.rb +25 -0
  488. data/lib/pubid/rendering/numbering.rb +7 -25
  489. data/lib/pubid/rendering/supplement.rb +4 -4
  490. data/lib/pubid/rendering.rb +3 -0
  491. data/lib/pubid/sae/builder.rb +1 -1
  492. data/lib/pubid/sae/components/date.rb +0 -8
  493. data/lib/pubid/sae/components/type.rb +1 -5
  494. data/lib/pubid/sae/identifier.rb +12 -2
  495. data/lib/pubid/sae/identifiers/base.rb +28 -33
  496. data/lib/pubid/sae/identifiers.rb +1 -0
  497. data/lib/pubid/sae/parser.rb +1 -1
  498. data/lib/pubid/sae/scheme.rb +47 -0
  499. data/lib/pubid/sae/urn_generator.rb +10 -2
  500. data/lib/pubid/sae.rb +2 -49
  501. data/lib/pubid/scheme.rb +207 -0
  502. data/lib/pubid/urn_generator/base.rb +12 -12
  503. data/lib/pubid/version.rb +1 -1
  504. data/lib/pubid.rb +10 -424
  505. data/lib/tasks/export.rake +5 -6
  506. data/lib/tasks/website-data.json +1796 -1854
  507. metadata +45 -307
  508. data/data/bipm/update_codes.yaml +0 -9
  509. data/data/nist/series.yaml +0 -155
  510. data/lib/pubid/adobe/builder.rb +0 -52
  511. data/lib/pubid/adobe/identifier.rb +0 -47
  512. data/lib/pubid/adobe/identifiers/publication.rb +0 -31
  513. data/lib/pubid/adobe/identifiers/tech_note.rb +0 -32
  514. data/lib/pubid/adobe/identifiers.rb +0 -10
  515. data/lib/pubid/adobe/parser.rb +0 -136
  516. data/lib/pubid/adobe/renderer.rb +0 -39
  517. data/lib/pubid/adobe/urn_generator.rb +0 -42
  518. data/lib/pubid/adobe/urn_parser.rb +0 -69
  519. data/lib/pubid/adobe.rb +0 -60
  520. data/lib/pubid/amca/renderer.rb +0 -82
  521. data/lib/pubid/amca/urn_parser.rb +0 -28
  522. data/lib/pubid/ansi/renderer.rb +0 -53
  523. data/lib/pubid/ansi/urn_parser.rb +0 -23
  524. data/lib/pubid/api/identifiers.rb +0 -18
  525. data/lib/pubid/api/renderer.rb +0 -98
  526. data/lib/pubid/api/urn_parser.rb +0 -35
  527. data/lib/pubid/ashrae/renderer.rb +0 -117
  528. data/lib/pubid/ashrae/urn_parser.rb +0 -27
  529. data/lib/pubid/asme/renderer.rb +0 -66
  530. data/lib/pubid/asme/urn_parser.rb +0 -31
  531. data/lib/pubid/astm/identifiers/code_number.rb +0 -81
  532. data/lib/pubid/astm/identifiers.rb +0 -19
  533. data/lib/pubid/astm/renderer.rb +0 -172
  534. data/lib/pubid/astm/urn_parser.rb +0 -30
  535. data/lib/pubid/bipm/builder.rb +0 -163
  536. data/lib/pubid/bipm/identifier.rb +0 -285
  537. data/lib/pubid/bipm/identifiers/committee_document.rb +0 -36
  538. data/lib/pubid/bipm/identifiers/guide.rb +0 -35
  539. data/lib/pubid/bipm/identifiers/meeting.rb +0 -53
  540. data/lib/pubid/bipm/identifiers/mep.rb +0 -33
  541. data/lib/pubid/bipm/identifiers/metrologia_article.rb +0 -48
  542. data/lib/pubid/bipm/identifiers/si_brochure.rb +0 -33
  543. data/lib/pubid/bipm/identifiers.rb +0 -15
  544. data/lib/pubid/bipm/parser.rb +0 -237
  545. data/lib/pubid/bipm/renderer.rb +0 -118
  546. data/lib/pubid/bipm/urn_generator.rb +0 -58
  547. data/lib/pubid/bipm/urn_parser.rb +0 -60
  548. data/lib/pubid/bipm.rb +0 -91
  549. data/lib/pubid/bsi/renderer.rb +0 -1064
  550. data/lib/pubid/bsi/urn_parser.rb +0 -52
  551. data/lib/pubid/calconnect/builder.rb +0 -38
  552. data/lib/pubid/calconnect/identifier.rb +0 -121
  553. data/lib/pubid/calconnect/identifiers/standard.rb +0 -29
  554. data/lib/pubid/calconnect/identifiers.rb +0 -9
  555. data/lib/pubid/calconnect/parser.rb +0 -54
  556. data/lib/pubid/calconnect/renderer.rb +0 -36
  557. data/lib/pubid/calconnect/urn_generator.rb +0 -33
  558. data/lib/pubid/calconnect/urn_parser.rb +0 -34
  559. data/lib/pubid/calconnect.rb +0 -82
  560. data/lib/pubid/ccsds/urn_parser.rb +0 -20
  561. data/lib/pubid/cen_cenelec/renderer.rb +0 -261
  562. data/lib/pubid/cen_cenelec/urn_parser.rb +0 -28
  563. data/lib/pubid/cie/identifiers/code_attributes.rb +0 -52
  564. data/lib/pubid/cie/identifiers/proceedings.rb +0 -41
  565. data/lib/pubid/cie/urn_parser.rb +0 -28
  566. data/lib/pubid/components/adoption.rb +0 -104
  567. data/lib/pubid/components/iteration.rb +0 -32
  568. data/lib/pubid/components/relationship.rb +0 -151
  569. data/lib/pubid/components/supplement.rb +0 -184
  570. data/lib/pubid/csa/renderer.rb +0 -300
  571. data/lib/pubid/csa/urn_parser.rb +0 -33
  572. data/lib/pubid/doi/builder.rb +0 -18
  573. data/lib/pubid/doi/identifier.rb +0 -49
  574. data/lib/pubid/doi/identifiers/resource.rb +0 -30
  575. data/lib/pubid/doi/identifiers.rb +0 -9
  576. data/lib/pubid/doi/parser.rb +0 -52
  577. data/lib/pubid/doi/renderer.rb +0 -13
  578. data/lib/pubid/doi.rb +0 -55
  579. data/lib/pubid/easc/builder.rb +0 -55
  580. data/lib/pubid/easc/identifier.rb +0 -59
  581. data/lib/pubid/easc/identifiers/pmg.rb +0 -20
  582. data/lib/pubid/easc/identifiers/rmg.rb +0 -19
  583. data/lib/pubid/easc/identifiers.rb +0 -10
  584. data/lib/pubid/easc/parser.rb +0 -88
  585. data/lib/pubid/easc/renderer.rb +0 -48
  586. data/lib/pubid/easc/urn_generator.rb +0 -46
  587. data/lib/pubid/easc/urn_parser.rb +0 -57
  588. data/lib/pubid/easc.rb +0 -52
  589. data/lib/pubid/ecma/builder.rb +0 -45
  590. data/lib/pubid/ecma/identifier.rb +0 -147
  591. data/lib/pubid/ecma/identifiers/memento.rb +0 -30
  592. data/lib/pubid/ecma/identifiers/standard.rb +0 -31
  593. data/lib/pubid/ecma/identifiers/technical_report.rb +0 -31
  594. data/lib/pubid/ecma/identifiers.rb +0 -11
  595. data/lib/pubid/ecma/parser.rb +0 -76
  596. data/lib/pubid/ecma/renderer.rb +0 -67
  597. data/lib/pubid/ecma/urn_generator.rb +0 -46
  598. data/lib/pubid/ecma/urn_parser.rb +0 -51
  599. data/lib/pubid/ecma.rb +0 -67
  600. data/lib/pubid/errors.rb +0 -79
  601. data/lib/pubid/etsi/renderer.rb +0 -48
  602. data/lib/pubid/etsi/urn_parser.rb +0 -34
  603. data/lib/pubid/gb/builder.rb +0 -45
  604. data/lib/pubid/gb/identifier.rb +0 -67
  605. data/lib/pubid/gb/identifiers/standard.rb +0 -34
  606. data/lib/pubid/gb/identifiers.rb +0 -9
  607. data/lib/pubid/gb/parser.rb +0 -63
  608. data/lib/pubid/gb/renderer.rb +0 -35
  609. data/lib/pubid/gb.rb +0 -87
  610. data/lib/pubid/gost/builder.rb +0 -148
  611. data/lib/pubid/gost/identifier.rb +0 -47
  612. data/lib/pubid/gost/identifiers/foreign_reference.rb +0 -25
  613. data/lib/pubid/gost/identifiers/harmonized.rb +0 -39
  614. data/lib/pubid/gost/identifiers/identical_adoption.rb +0 -39
  615. data/lib/pubid/gost/identifiers/interstate_standard.rb +0 -20
  616. data/lib/pubid/gost/identifiers/national_standard.rb +0 -19
  617. data/lib/pubid/gost/identifiers.rb +0 -13
  618. data/lib/pubid/gost/parser.rb +0 -105
  619. data/lib/pubid/gost/renderer.rb +0 -48
  620. data/lib/pubid/gost/urn_generator.rb +0 -46
  621. data/lib/pubid/gost/urn_parser.rb +0 -52
  622. data/lib/pubid/gost.rb +0 -49
  623. data/lib/pubid/iala/builder.rb +0 -102
  624. data/lib/pubid/iala/identifier.rb +0 -90
  625. data/lib/pubid/iala/identifiers/advice.rb +0 -15
  626. data/lib/pubid/iala/identifiers/annex.rb +0 -57
  627. data/lib/pubid/iala/identifiers/general_assembly.rb +0 -19
  628. data/lib/pubid/iala/identifiers/guideline.rb +0 -17
  629. data/lib/pubid/iala/identifiers/letter.rb +0 -16
  630. data/lib/pubid/iala/identifiers/manual.rb +0 -18
  631. data/lib/pubid/iala/identifiers/model_course.rb +0 -17
  632. data/lib/pubid/iala/identifiers/recommendation.rb +0 -17
  633. data/lib/pubid/iala/identifiers/report.rb +0 -16
  634. data/lib/pubid/iala/identifiers/resolution.rb +0 -16
  635. data/lib/pubid/iala/identifiers/standard.rb +0 -17
  636. data/lib/pubid/iala/identifiers.rb +0 -19
  637. data/lib/pubid/iala/parser.rb +0 -138
  638. data/lib/pubid/iala/renderer.rb +0 -36
  639. data/lib/pubid/iala/urn_generator.rb +0 -49
  640. data/lib/pubid/iala/urn_parser.rb +0 -67
  641. data/lib/pubid/iala.rb +0 -71
  642. data/lib/pubid/iana/builder.rb +0 -22
  643. data/lib/pubid/iana/identifier.rb +0 -140
  644. data/lib/pubid/iana/identifiers/registry.rb +0 -69
  645. data/lib/pubid/iana/identifiers.rb +0 -9
  646. data/lib/pubid/iana/parser.rb +0 -38
  647. data/lib/pubid/iana/renderer.rb +0 -32
  648. data/lib/pubid/iana/urn_generator.rb +0 -19
  649. data/lib/pubid/iana/urn_parser.rb +0 -24
  650. data/lib/pubid/iana.rb +0 -69
  651. data/lib/pubid/idf/renderer.rb +0 -84
  652. data/lib/pubid/idf/urn_parser.rb +0 -25
  653. data/lib/pubid/iec/components.rb +0 -14
  654. data/lib/pubid/iec/identifiers/technical_group.rb +0 -30
  655. data/lib/pubid/iec/identifiers.rb +0 -31
  656. data/lib/pubid/iec/renderer.rb +0 -267
  657. data/lib/pubid/ieee/compaction.rb +0 -121
  658. data/lib/pubid/ieee/identifiers/amendment.rb +0 -40
  659. data/lib/pubid/ieee/identifiers/code_number.rb +0 -82
  660. data/lib/pubid/ieee/identifiers/nesc/edition.rb +0 -32
  661. data/lib/pubid/ieee/pre_parser.rb +0 -301
  662. data/lib/pubid/ieee/renderer.rb +0 -408
  663. data/lib/pubid/ieee/urn_parser.rb +0 -34
  664. data/lib/pubid/ietf/builder.rb +0 -78
  665. data/lib/pubid/ietf/identifier.rb +0 -5
  666. data/lib/pubid/ietf/identifiers/base.rb +0 -72
  667. data/lib/pubid/ietf/identifiers/bcp.rb +0 -36
  668. data/lib/pubid/ietf/identifiers/fyi.rb +0 -36
  669. data/lib/pubid/ietf/identifiers/internet_draft.rb +0 -45
  670. data/lib/pubid/ietf/identifiers/rfc.rb +0 -27
  671. data/lib/pubid/ietf/identifiers/serialization.rb +0 -51
  672. data/lib/pubid/ietf/identifiers/std.rb +0 -36
  673. data/lib/pubid/ietf/identifiers.rb +0 -14
  674. data/lib/pubid/ietf/parser.rb +0 -61
  675. data/lib/pubid/ietf/renderer.rb +0 -64
  676. data/lib/pubid/ietf/urn_generator.rb +0 -37
  677. data/lib/pubid/ietf/urn_parser.rb +0 -43
  678. data/lib/pubid/ietf.rb +0 -85
  679. data/lib/pubid/iho/renderer.rb +0 -30
  680. data/lib/pubid/iho/urn_parser.rb +0 -58
  681. data/lib/pubid/isbn/builder.rb +0 -44
  682. data/lib/pubid/isbn/check_digit.rb +0 -53
  683. data/lib/pubid/isbn/identifier.rb +0 -81
  684. data/lib/pubid/isbn/identifiers/book.rb +0 -30
  685. data/lib/pubid/isbn/identifiers.rb +0 -9
  686. data/lib/pubid/isbn/parser.rb +0 -45
  687. data/lib/pubid/isbn/renderer.rb +0 -16
  688. data/lib/pubid/isbn.rb +0 -52
  689. data/lib/pubid/iso/normalizer.rb +0 -89
  690. data/lib/pubid/itu/components/designation.rb +0 -35
  691. data/lib/pubid/itu/components.rb +0 -12
  692. data/lib/pubid/itu/identifiers/addendum.rb +0 -15
  693. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +0 -87
  694. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +0 -92
  695. data/lib/pubid/itu/identifiers/errata.rb +0 -15
  696. data/lib/pubid/itu/identifiers/handbook.rb +0 -38
  697. data/lib/pubid/itu/identifiers/question.rb +0 -63
  698. data/lib/pubid/itu/identifiers/report.rb +0 -39
  699. data/lib/pubid/itu/identifiers/standard_serialization.rb +0 -58
  700. data/lib/pubid/itu/urn_parser.rb +0 -31
  701. data/lib/pubid/jcgm/identifiers/corrigendum.rb +0 -34
  702. data/lib/pubid/jcgm/identifiers/meeting.rb +0 -47
  703. data/lib/pubid/jcgm/renderer.rb +0 -89
  704. data/lib/pubid/jcgm/urn_parser.rb +0 -177
  705. data/lib/pubid/jis/identifiers/corrigendum.rb +0 -16
  706. data/lib/pubid/jis/renderer.rb +0 -69
  707. data/lib/pubid/jis/urn_parser.rb +0 -23
  708. data/lib/pubid/nist/caster.rb +0 -1234
  709. data/lib/pubid/nist/circular_supplement_builder.rb +0 -293
  710. data/lib/pubid/nist/identifier.rb +0 -8
  711. data/lib/pubid/nist/identifiers/dated_document.rb +0 -49
  712. data/lib/pubid/nist/parser_output_normalizer.rb +0 -233
  713. data/lib/pubid/nist/preprocessor.rb +0 -443
  714. data/lib/pubid/nist/renderer.rb +0 -43
  715. data/lib/pubid/nist/router.rb +0 -149
  716. data/lib/pubid/nist/series/base.rb +0 -58
  717. data/lib/pubid/nist/series/crpl.rb +0 -13
  718. data/lib/pubid/nist/series/fips.rb +0 -14
  719. data/lib/pubid/nist/series/ir.rb +0 -57
  720. data/lib/pubid/nist/series/letter_preserving.rb +0 -15
  721. data/lib/pubid/nist/series/mono.rb +0 -19
  722. data/lib/pubid/nist/series/ncstar.rb +0 -20
  723. data/lib/pubid/nist/series.rb +0 -49
  724. data/lib/pubid/nist/urn_parser.rb +0 -67
  725. data/lib/pubid/oasis/builder.rb +0 -79
  726. data/lib/pubid/oasis/identifier.rb +0 -160
  727. data/lib/pubid/oasis/identifiers/standard.rb +0 -29
  728. data/lib/pubid/oasis/identifiers.rb +0 -9
  729. data/lib/pubid/oasis/parser.rb +0 -34
  730. data/lib/pubid/oasis/renderer.rb +0 -29
  731. data/lib/pubid/oasis/urn_generator.rb +0 -25
  732. data/lib/pubid/oasis/urn_parser.rb +0 -22
  733. data/lib/pubid/oasis.rb +0 -79
  734. data/lib/pubid/ogc/builder.rb +0 -33
  735. data/lib/pubid/ogc/identifier.rb +0 -81
  736. data/lib/pubid/ogc/identifiers/document.rb +0 -26
  737. data/lib/pubid/ogc/identifiers.rb +0 -10
  738. data/lib/pubid/ogc/parser.rb +0 -40
  739. data/lib/pubid/ogc/renderer.rb +0 -33
  740. data/lib/pubid/ogc/urn_generator.rb +0 -14
  741. data/lib/pubid/ogc/urn_parser.rb +0 -22
  742. data/lib/pubid/ogc.rb +0 -71
  743. data/lib/pubid/oiml/identifiers/bulletin.rb +0 -137
  744. data/lib/pubid/oiml/identifiers/code_number.rb +0 -90
  745. data/lib/pubid/oiml/identifiers/errata.rb +0 -15
  746. data/lib/pubid/oiml/renderer.rb +0 -232
  747. data/lib/pubid/oiml/urn_parser.rb +0 -39
  748. data/lib/pubid/omg/builder.rb +0 -19
  749. data/lib/pubid/omg/identifier.rb +0 -47
  750. data/lib/pubid/omg/identifiers/specification.rb +0 -32
  751. data/lib/pubid/omg/identifiers.rb +0 -9
  752. data/lib/pubid/omg/parser.rb +0 -40
  753. data/lib/pubid/omg/renderer.rb +0 -19
  754. data/lib/pubid/omg.rb +0 -51
  755. data/lib/pubid/parser/grammar.rb +0 -74
  756. data/lib/pubid/plateau/identifier.rb +0 -4
  757. data/lib/pubid/plateau/renderer.rb +0 -51
  758. data/lib/pubid/plateau/urn_parser.rb +0 -43
  759. data/lib/pubid/prefixes_support.rb +0 -51
  760. data/lib/pubid/renderers/annotator.rb +0 -233
  761. data/lib/pubid/sae/renderer.rb +0 -36
  762. data/lib/pubid/sae/urn_parser.rb +0 -36
  763. data/lib/pubid/tgpp/builder.rb +0 -41
  764. data/lib/pubid/tgpp/identifier.rb +0 -107
  765. data/lib/pubid/tgpp/identifiers/technical_report.rb +0 -32
  766. data/lib/pubid/tgpp/identifiers/technical_specification.rb +0 -33
  767. data/lib/pubid/tgpp/identifiers.rb +0 -11
  768. data/lib/pubid/tgpp/parser.rb +0 -78
  769. data/lib/pubid/tgpp/renderer.rb +0 -52
  770. data/lib/pubid/tgpp/urn_generator.rb +0 -39
  771. data/lib/pubid/tgpp/urn_parser.rb +0 -30
  772. data/lib/pubid/tgpp.rb +0 -83
  773. data/lib/pubid/type_resolver.rb +0 -59
  774. data/lib/pubid/un/builder.rb +0 -42
  775. data/lib/pubid/un/identifier.rb +0 -40
  776. data/lib/pubid/un/identifiers/document.rb +0 -24
  777. data/lib/pubid/un/identifiers.rb +0 -9
  778. data/lib/pubid/un/parser.rb +0 -25
  779. data/lib/pubid/un/renderer.rb +0 -11
  780. data/lib/pubid/un.rb +0 -46
  781. data/lib/pubid/urn_parser/base.rb +0 -81
  782. data/lib/pubid/urn_parser/errors.rb +0 -16
  783. data/lib/pubid/urn_parser.rb +0 -14
  784. data/lib/pubid/w3c/builder.rb +0 -55
  785. data/lib/pubid/w3c/identifier.rb +0 -130
  786. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +0 -31
  787. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +0 -31
  788. data/lib/pubid/w3c/identifiers/draft_note.rb +0 -31
  789. data/lib/pubid/w3c/identifiers/note.rb +0 -30
  790. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +0 -31
  791. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +0 -31
  792. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +0 -31
  793. data/lib/pubid/w3c/identifiers/recommendation.rb +0 -31
  794. data/lib/pubid/w3c/identifiers/standard.rb +0 -12
  795. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +0 -31
  796. data/lib/pubid/w3c/identifiers/working_draft.rb +0 -30
  797. data/lib/pubid/w3c/identifiers.rb +0 -25
  798. data/lib/pubid/w3c/parser.rb +0 -43
  799. data/lib/pubid/w3c/renderer.rb +0 -35
  800. data/lib/pubid/w3c/urn_generator.rb +0 -18
  801. data/lib/pubid/w3c/urn_parser.rb +0 -36
  802. data/lib/pubid/w3c.rb +0 -67
  803. data/lib/pubid/xsf/builder.rb +0 -17
  804. data/lib/pubid/xsf/identifier.rb +0 -66
  805. data/lib/pubid/xsf/identifiers/xep.rb +0 -31
  806. data/lib/pubid/xsf/identifiers.rb +0 -9
  807. data/lib/pubid/xsf/parser.rb +0 -25
  808. data/lib/pubid/xsf/renderer.rb +0 -23
  809. data/lib/pubid/xsf/urn_generator.rb +0 -13
  810. data/lib/pubid/xsf/urn_parser.rb +0 -18
  811. data/lib/pubid/xsf.rb +0 -81
@@ -0,0 +1,174 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "model"
4
+
5
+ module Pubid
6
+ module Itu
7
+ class Scheme < Pubid::Scheme
8
+ # Attribute mappings define how parsed data maps to model attributes
9
+ ATTRIBUTE_MAPPINGS = {
10
+ sector: :sector,
11
+ series: :series,
12
+ number: :number,
13
+ subseries: :subseries,
14
+ part: :part,
15
+ supplement: :supplement,
16
+ amendment: :amendment,
17
+ annex: :annex,
18
+ corrigendum: :corrigendum,
19
+ addendum: :addendum,
20
+ appendix: :appendix,
21
+ date: :date,
22
+ month: :month,
23
+ year: :year,
24
+ second_number: :second_number,
25
+ range_series: :range_series,
26
+ range_number: :range_number,
27
+ sg_number: :sg_number,
28
+ }.freeze
29
+
30
+ # Model class to use for rendering
31
+ def self.model_class
32
+ Model
33
+ end
34
+
35
+ # Convert parsed data to model attributes
36
+ def self.transform(parsed)
37
+ attributes = {}
38
+
39
+ # Extract sector
40
+ attributes[:sector] = parsed[:sector].to_s if parsed[:sector]
41
+
42
+ # Determine content based on sector
43
+ content = parsed[:t_content] || parsed[:r_content] || {}
44
+
45
+ # Extract series and study group
46
+ if content[:series].is_a?(Hash) && content[:series][:sg_number]
47
+ # Study groups (questions)
48
+ attributes[:series] = "SG#{content[:series][:sg_number]}"
49
+ elsif content[:series]
50
+ attributes[:series] = content[:series].to_s
51
+ end
52
+
53
+ # Extract numbering components
54
+ if content[:numbering]
55
+ numbering = content[:numbering]
56
+
57
+ # Handle numbering as array (e.g., number + subseries)
58
+ if numbering.is_a?(Array)
59
+ numbering.each do |part|
60
+ if part.is_a?(Hash)
61
+ if part[:number]
62
+ attributes[:number] = part[:number].to_s
63
+ elsif part[:subseries]
64
+ # Collect subseries parts
65
+ if attributes[:subseries]
66
+ attributes[:subseries] =
67
+ "#{attributes[:subseries]}.#{part[:subseries]}"
68
+ else
69
+ attributes[:subseries] = part[:subseries].to_s
70
+ end
71
+ elsif part[:part]
72
+ attributes[:part] = part[:part].to_s
73
+ end
74
+ end
75
+ end
76
+ elsif numbering.is_a?(Hash)
77
+ # Handle numbering as hash
78
+ attributes[:number] = numbering[:number].to_s if numbering[:number]
79
+ if numbering[:subseries]
80
+ attributes[:subseries] =
81
+ numbering[:subseries].to_s
82
+ end
83
+ attributes[:part] = numbering[:part].to_s if numbering[:part]
84
+ end
85
+ end
86
+
87
+ # Extract supplement/amendment/etc.
88
+ if content[:supplement]
89
+ attributes[:supplement] =
90
+ content[:supplement].to_s
91
+ end
92
+ attributes[:amendment] = content[:amendment].to_s if content[:amendment]
93
+ attributes[:annex] = content[:annex].to_s if content[:annex]
94
+ if content[:corrigendum]
95
+ attributes[:corrigendum] =
96
+ content[:corrigendum].to_s
97
+ end
98
+ attributes[:addendum] = content[:addendum].to_s if content[:addendum]
99
+
100
+ # Handle appendix (convert Roman numerals to Arabic)
101
+ if content[:appendix]
102
+ appendix = content[:appendix].to_s
103
+ attributes[:appendix] = roman_to_arabic(appendix) || appendix
104
+ end
105
+
106
+ # Extract date
107
+ if content[:date]
108
+ date = content[:date]
109
+ if date[:month] && date[:year]
110
+ attributes[:month] = date[:month].to_s
111
+ attributes[:year] = date[:year].to_s
112
+ elsif date[:year]
113
+ attributes[:year] = date[:year].to_s
114
+ end
115
+ end
116
+
117
+ # Extract second number (for combined standards like G.780/Y.1351)
118
+ if content[:second_number]
119
+ second = content[:second_number]
120
+ second_attrs = {}
121
+ second_attrs[:series] = second[:series].to_s if second[:series]
122
+ if second[:numbering]
123
+ numbering = second[:numbering]
124
+ if numbering[:number]
125
+ second_attrs[:number] =
126
+ numbering[:number].to_s
127
+ end
128
+ if numbering[:subseries]
129
+ second_attrs[:subseries] = numbering[:subseries].to_s
130
+ end
131
+ second_attrs[:part] = numbering[:part].to_s if numbering[:part]
132
+ end
133
+ attributes[:second_number] = second_attrs unless second_attrs.empty?
134
+ end
135
+
136
+ # Extract range (for Q.400-Q.490 style)
137
+ if content[:range_series] && content[:range_number]
138
+ attributes[:range] = {
139
+ series: content[:range_series].to_s,
140
+ number: content[:range_number].to_s,
141
+ }
142
+ end
143
+
144
+ attributes
145
+ end
146
+
147
+ # Convert Roman numerals to Arabic numbers
148
+ def self.roman_to_arabic(roman)
149
+ return roman unless roman.match?(/^[IVXLCDM]+$/i)
150
+
151
+ roman_map = {
152
+ "I" => 1, "V" => 5, "X" => 10, "L" => 50,
153
+ "C" => 100, "D" => 500, "M" => 1000
154
+ }
155
+
156
+ roman = roman.upcase
157
+ result = 0
158
+ prev_value = 0
159
+
160
+ roman.reverse.each_char do |char|
161
+ value = roman_map[char]
162
+ if value < prev_value
163
+ result -= value
164
+ else
165
+ result += value
166
+ end
167
+ prev_value = value
168
+ end
169
+
170
+ result.to_s
171
+ end
172
+ end
173
+ end
174
+ end
@@ -23,37 +23,19 @@ module Pubid
23
23
  parts << "itu"
24
24
  end
25
25
 
26
- # An ITU-R Report numbers independently of the Recommendation series,
27
- # so "BT.2020-1" alone is ambiguous — the type has to reach the URN as
28
- # well as `to_s` and the MR slug, or the two documents share an
29
- # identifier on that surface.
30
- parts << "report" if identifier.is_a?(Identifiers::Report)
31
-
32
26
  if identifier.series
33
27
  series = identifier.series.to_s
34
28
  if identifier.code
35
- # A series-code document joins with a dash, not a dot; rendering it
36
- # "EMC.5" would be ambiguous with a hypothetical "ITU-T EMC.5" and
37
- # would not parse back.
38
- join = identifier.series_dash ? "-" : "."
39
- parts << "#{series}#{join}#{identifier.code.compact_s}"
29
+ code = identifier.code.to_s
30
+ parts << "#{series}.#{code}"
40
31
  else
41
32
  parts << series
42
33
  end
43
34
  elsif identifier.code
44
- code = identifier.code.compact_s
35
+ code = identifier.code.to_s
45
36
  parts << code
46
37
  end
47
38
 
48
- # Identity-bearing markers that are not part of sector/series/code.
49
- # Without them "ITU-T H.350 attachment", "ITU-T Q.120-Q.139" and
50
- # "ITU-T E-100 series Suppl. 2" would each share a URN with the
51
- # document they are distinct from — the same collision Code#compact_s
52
- # exists to prevent for the code suffixes.
53
- parts << "series" if identifier.series_word
54
- parts << "attachment" if identifier.attachment
55
- parts << "to-#{identifier.range_end}" if identifier.range_end
56
-
57
39
  if identifier.date
58
40
  date = identifier.date
59
41
  if date&.year && date.month
@@ -75,16 +57,8 @@ module Pubid
75
57
 
76
58
  base = maybe(:base)
77
59
  if base
78
- # An annex or appendix base holds its identity in its OWN base (its
79
- # sector/series/code are nil), so generate_base_urn would emit
80
- # "urn:itu:itu" for it — go through its own to_urn instead.
81
- nested_wrapper = base.is_a?(Identifiers::AnnexOfRecommendation) ||
82
- base.is_a?(Identifiers::AppendixOfRecommendation)
83
- base_urn = if nested_wrapper
84
- base.to_urn
85
- else
86
- self.class.new(base).generate_base_urn
87
- end
60
+ base_gen = self.class.new(base)
61
+ base_urn = base_gen.generate_base_urn
88
62
 
89
63
  base_part = base_urn.sub(/^urn:itu:/, "")
90
64
  base_parts = base_part.split(":")
@@ -98,16 +72,12 @@ module Pubid
98
72
  if identifier.series
99
73
  series = identifier.series.to_s
100
74
  if identifier.code
101
- code = identifier.code.compact_s
75
+ code = identifier.code.to_s
102
76
  parts << "#{series}.#{code}"
103
77
  else
104
78
  parts << series
105
79
  end
106
80
  end
107
- # A base-less supplement's whole identity is sector + series, so the
108
- # series-group word belongs in the URN too — without it
109
- # "ITU-T E-100 series Suppl. 2" and "ITU-T E-100 Suppl. 2" collide.
110
- parts << "series" if identifier.series_word
111
81
  end
112
82
 
113
83
  supplement_notation = maybe(:supplement_notation)
data/lib/pubid/itu.rb CHANGED
@@ -4,73 +4,17 @@ require "lutaml/model"
4
4
 
5
5
  module Pubid
6
6
  module Itu
7
- extend Pubid::PrefixesSupport
8
-
9
- # Sole ITU publisher token (see the parser's `itu_prefix` rule).
10
- #
11
- # The leading "Report" of an ITU-R Report's canonical form
12
- # ("Report ITU-R BT.2020-1") is deliberately NOT listed: prefix routing
13
- # claims every reference beginning with the token, and "Report" is a
14
- # generic English word that other SDOs' references start with — the
15
- # mixin's documented exclusion for ambiguous tokens. Report references
16
- # route by their "ITU" token in the infix spelling
17
- # ("ITU-R Report BT.2020-1"), and `Pubid::Itu.parse` accepts both.
18
- PREFIXES = ["ITU"].freeze
19
-
20
7
  autoload :Builder, "#{__dir__}/itu/builder"
21
- autoload :Components, "#{__dir__}/itu/components"
22
- autoload :Identifier, "#{__dir__}/itu/identifiers/base"
8
+ autoload :Identifier, "#{__dir__}/itu/identifier"
23
9
  autoload :Identifiers, "#{__dir__}/itu/identifiers"
24
10
  autoload :Parser, "#{__dir__}/itu/parser"
11
+ autoload :Scheme, "#{__dir__}/itu/scheme"
25
12
  autoload :UrnGenerator, "#{__dir__}/itu/urn_generator"
26
- autoload :UrnParser, "#{__dir__}/itu/urn_parser"
27
13
  autoload :Model, "#{__dir__}/itu/model"
28
14
 
29
- # I18N is a YAML-loaded constant (not a class), so autoload cannot be used.
30
- # It is loaded eagerly when the ITU module is first referenced.
31
- require "#{__dir__}/itu/i18n"
32
-
33
15
  def self.parse(identifier)
34
16
  Identifier.parse(identifier)
35
17
  end
36
-
37
- # Auto-discover all identifier types from the Identifiers namespace
38
- # @return [Array<Class>] identifier classes (Pubid::Identifier subclasses)
39
- def self.identifier_types
40
- @identifier_types ||= Identifiers.constants
41
- .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
42
- .select { |c| c.is_a?(Class) && c < Pubid::Identifier }
43
- # Exclude the flavor base itself by identity (Identifier is now an
44
- # alias for Pubid::Itu::Identifier, so name-based matching misses it).
45
- .reject { |c| c == Identifier }
46
- end
47
-
48
- # Build typed stage index from identifier types
49
- # @return [Array<Pubid::Components::TypedStage>] all typed stages
50
- def self.all_typed_stages
51
- @all_typed_stages ||= identifier_types.flat_map do |klass|
52
- if klass.const_defined?(:TYPED_STAGES)
53
- klass.const_get(:TYPED_STAGES)
54
- else
55
- []
56
- end
57
- end
58
- end
59
-
60
- # Lookup: type code -> identifier class
61
- # @param code [String, Symbol] the type key to find
62
- # @return [Class, nil] the matching identifier class
63
- def self.locate_type(code)
64
- identifier_types.find { |t| t.type[:key].to_s == code.to_s }
65
- end
66
-
67
- # Lookup: abbreviation -> typed stage
68
- # @param abbr [String, Symbol] the abbreviation to find
69
- # @return [Pubid::Components::TypedStage, nil] the matching typed stage
70
- def self.locate_stage(abbr)
71
- abbr_str = abbr.to_s.upcase
72
- all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
73
- end
74
18
  end
75
19
  end
76
20
 
@@ -3,48 +3,32 @@
3
3
  module Pubid
4
4
  module Jcgm
5
5
  class Builder < Pubid::Builder::Base
6
- def locate_identifier_klass(parsed_hash)
7
- if parsed_hash[:base]
8
- type_with_stage = parsed_hash[:type_with_stage]
9
- return Jcgm.locate_type(:amendment) unless type_with_stage
6
+ def initialize(scheme)
7
+ @scheme = scheme
8
+ end
10
9
 
11
- return Jcgm.locate_type(locate_typed_stage(type_with_stage).type_code)
10
+ def locate_identifier_klass(parsed_hash)
11
+ if parsed_hash[:base_identifier]
12
+ return @scheme.locate_identifier_klass_by_type_code(:amendment)
12
13
  end
13
14
 
14
15
  if parsed_hash[:gum_number]
15
- return Jcgm.locate_type(:gum_guide)
16
+ return @scheme.locate_identifier_klass_by_type_code(:gum_guide)
16
17
  end
17
18
 
18
- # Standard guide (no type_with_stage, no gum_number).
19
- # Don't use locate_stage("") — Guide and GumGuide both have
20
- # abbr: [""], so the result depends on constant iteration order.
21
- return Jcgm.locate_type(:guide) unless parsed_hash[:type_with_stage]
22
-
23
19
  typed_stage = locate_typed_stage(parsed_hash[:type_with_stage])
24
- Jcgm.locate_type(typed_stage.type_code)
20
+ @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
25
21
  end
26
22
 
27
23
  def build(parsed_hash)
28
- klass = locate_identifier_klass(parsed_hash)
29
-
30
- # GUM guides store their part number in the shared `number` attribute
31
- # ("JCGM GUM-6" -> number "6"); the parser tags it :gum_number only to
32
- # pick this class. Fold it back onto :number before assigning.
33
- if parsed_hash[:gum_number] && klass == Identifiers::GumGuide
34
- parsed_hash = parsed_hash.merge(number: parsed_hash[:gum_number])
35
- parsed_hash.delete(:gum_number)
36
- end
37
-
38
- identifier = klass.new
24
+ identifier = locate_identifier_klass(parsed_hash).new
39
25
  assign_attributes(identifier, parsed_hash)
40
26
 
41
- # Bare guides/gum-guides carry no parsed stage; derive the (single,
42
- # published) typed_stage from the concrete class so parse and from_hash
43
- # agree. Avoids the ambiguous locate_stage("") lookup (Guide and
44
- # GumGuide both register abbr: [""]).
45
27
  if identifier.class.attributes.key?(:typed_stage) && identifier.typed_stage.nil?
46
- identifier.typed_stage = identifier.class.published_typed_stage ||
47
- raise(ArgumentError, "No published typed_stage for #{identifier.class}")
28
+ default_typed_stage = @scheme.locate_typed_stage_by_abbr("")
29
+ identifier.typed_stage = default_typed_stage
30
+ identifier.stage = default_typed_stage.to_stage if identifier.class.attributes.key?(:stage)
31
+ identifier.type = default_typed_stage.to_type if identifier.class.attributes.key?(:type)
48
32
  end
49
33
 
50
34
  identifier
@@ -56,20 +40,16 @@ module Pubid
56
40
  Identifiers::Guide
57
41
  end
58
42
 
59
- def locate_typed_stage(typed_stage_string)
60
- typed_stage_string = "" if typed_stage_string.nil?
61
- Jcgm.locate_stage(typed_stage_string) ||
62
- raise(ArgumentError, "Unknown type abbreviation: '#{typed_stage_string}'")
63
- end
64
-
65
43
  def cast(type, value)
66
44
  case type
67
- when :base
45
+ when :base_identifier
68
46
  build(value)
69
47
  when :publisher
70
48
  Jcgm::Components::Publisher.new(publisher: value.to_s)
71
49
  when :number
72
- value.to_s
50
+ Pubid::Components::Code.new(value: value.to_s)
51
+ when :gum_number
52
+ Pubid::Components::Code.new(value: value.to_s)
73
53
  when :date
74
54
  date_str = value.to_s
75
55
  if date_str.include?("-")
@@ -82,6 +62,8 @@ module Pubid
82
62
  else
83
63
  Pubid::Components::Date.new(year: date_str)
84
64
  end
65
+ when :iteration
66
+ Pubid::Components::Code.new(value: value.to_s)
85
67
  when :type_with_stage
86
68
  typed_stage = locate_typed_stage(value.to_s)
87
69
  {
@@ -3,16 +3,6 @@
3
3
  module Pubid
4
4
  module Jcgm
5
5
  class Identifier < ::Pubid::Identifier
6
- # `number`/`part`/`subpart` are declared here rather than inherited as a
7
- # Components::Code: JCGM stores a bare string in `number` and uses neither
8
- # of the other two. Declaring on this class is safe because its body lives
9
- # in this one file and is never reopened, so every subclass body opens
10
- # after it has run (lutaml deep-dups the parent attribute table at
11
- # class-definition time).
12
- attribute :number, :string
13
- attribute :part, :string
14
- attribute :subpart, :string
15
-
16
6
  def self.parse(string)
17
7
  Pubid::Jcgm.parse(string)
18
8
  end
@@ -4,6 +4,8 @@ module Pubid
4
4
  module Jcgm
5
5
  module Identifiers
6
6
  class Amendment < SupplementIdentifier
7
+ attribute :type, Pubid::Components::Type, default: -> { self.class.type[:key] }
8
+
7
9
  TYPED_STAGES = [
8
10
  Pubid::Components::TypedStage.new(
9
11
  code: :pubamd,
@@ -18,6 +20,15 @@ module Pubid
18
20
  def self.type
19
21
  { key: :amendment, title: "Amendment", short: "Amd" }
20
22
  end
23
+
24
+ def to_s(lang: :en, lang_single: false, with_edition: false,
25
+ format: nil, stage_format_long: nil, with_date: nil)
26
+ result = base_identifier.to_s if base_identifier
27
+ result += "/Amd"
28
+ result += " #{iteration.value}" if iteration
29
+ result += ":#{date}" if date
30
+ result
31
+ end
21
32
  end
22
33
  end
23
34
  end
@@ -3,10 +3,10 @@
3
3
  module Pubid
4
4
  module Jcgm
5
5
  module Identifiers
6
- # A GUM guide, e.g. "JCGM GUM-6:2020". The GUM-series part number ("6")
7
- # lives in the inherited `number` attribute (serialized as `number: "6"`);
8
- # `_type: pubid:jcgm:gum-guide` disambiguates it from a plain guide.
9
6
  class GumGuide < SingleIdentifier
7
+ attribute :gum_number, Pubid::Components::Code
8
+ attribute :type, Pubid::Components::Type, default: -> { self.class.type[:key] }
9
+
10
10
  TYPED_STAGES = [
11
11
  Pubid::Components::TypedStage.new(
12
12
  code: :pubgumguide,
@@ -22,6 +22,18 @@ module Pubid
22
22
  { key: :gum_guide, title: "GUM Guide", short: "GUM" }
23
23
  end
24
24
 
25
+ def to_s(lang: :en, lang_single: false, with_edition: false,
26
+ format: nil, stage_format_long: nil, with_date: nil)
27
+ parts = []
28
+ parts << publisher.publisher if publisher
29
+ parts << "GUM-#{gum_number.value}" if gum_number
30
+
31
+ result = parts.join(" ")
32
+ result += ":#{date}" if date
33
+ result += language_portion if languages&.any?
34
+ result
35
+ end
36
+
25
37
  private
26
38
 
27
39
  def language_portion
@@ -4,10 +4,8 @@ module Pubid
4
4
  module Jcgm
5
5
  module Identifiers
6
6
  autoload :Amendment, "#{__dir__}/identifiers/amendment"
7
- autoload :Corrigendum, "#{__dir__}/identifiers/corrigendum"
8
7
  autoload :Guide, "#{__dir__}/identifiers/guide"
9
8
  autoload :GumGuide, "#{__dir__}/identifiers/gum_guide"
10
- autoload :Meeting, "#{__dir__}/identifiers/meeting"
11
9
  end
12
10
  end
13
11
  end
@@ -4,86 +4,24 @@ require "parslet"
4
4
 
5
5
  module Pubid
6
6
  module Jcgm
7
- class Parser < ::Pubid::Parser::Grammar
7
+ class Parser < Parslet::Parser
8
8
  include ::Pubid::Parser::CommonParseRules
9
9
  include ::Pubid::Parser::CommonParseMethods
10
10
 
11
11
  root :identifier
12
12
 
13
13
  rule(:identifier) do
14
- meeting_identifier | amendment_identifier | corrigendum_identifier |
15
- numbered_corrigendum_identifier | base | named_guide_identifier
14
+ amendment_identifier | base_identifier
16
15
  end
17
16
 
18
- # "JCGM 200:2008 Corrigendum" — a base guide plus a trailing
19
- # " Corrigendum" word (no number). Must precede base: Parslet
20
- # is an ordered PEG that commits to the first matching alternative, so if
21
- # base ran first it would consume "JCGM 200:2008" and root
22
- # would fail on the leftover " Corrigendum". Emits type_with_stage so the
23
- # builder routes it to Corrigendum.
24
- rule(:corrigendum_identifier) do
25
- base.as(:base) >> space >>
26
- str("Corrigendum").as(:type_with_stage)
27
- end
28
-
29
- # "JCGM 101:2008/Cor 1:2009" — a base guide plus a slash-separated
30
- # numbered corrigendum (mirrors the ISO/IEC supplement form). The
31
- # trailing :YYYY is optional so "JCGM 101:2008/Cor 1" also parses.
32
- # Must precede base for the same PEG-commit reason as corrigendum_identifier.
33
- rule(:numbered_corrigendum_identifier) do
34
- base.as(:base) >>
35
- str("/") >> str("Cor").as(:type_with_stage) >>
36
- space >> digits.as(:number) >>
37
- corrigendum_date.maybe
38
- end
39
-
40
- # Dateless "named" guides: "JCGM GUM", "JCGM VIM-3" (and future "VIM-N").
41
- # Last in the alternation — only reached when base fully fails
42
- # (these have no date, so number_portion/date_portion never match).
43
- rule(:named_guide_identifier) do
44
- publisher >> space >> named_number
45
- end
46
-
47
- rule(:named_number) do
48
- (str("GUM") | (str("VIM") >> (str("-") >> digits).maybe)).as(:number)
49
- end
50
-
51
- # Committee/meeting record, e.g. "JCGM 17th Meeting (2012)". Diverges
52
- # from base right after the digits (base wants ":", meeting
53
- # wants the ordinal suffix), so ordered choice is unambiguous. Emits the
54
- # same tokens as a guide plus type_with_stage "Meeting", so the generic
55
- # builder path resolves it to Identifiers::Meeting (like "Amd").
56
- #
57
- # The trailing " (YYYY)" group is optional, so the partial reference
58
- # "JCGM 11st Meeting" parses with `date` left nil. JCGM numbers its
59
- # meetings in one sequence, so the ordinal alone names the event and the
60
- # year is redundant detail. The whole group is `.maybe` (not the year
61
- # inside it), so a dangling "(" or a truncated year still fails —
62
- # the same shape as `date_portion.maybe` in `rule(:base)`.
63
- rule(:meeting_identifier) do
64
- publisher >> space >> digits.as(:number) >> ordinal_suffix >>
65
- space >> str("Meeting").as(:type_with_stage) >>
66
- (space >> str("(") >> year_digits.as(:date) >> str(")")).maybe
67
- end
68
-
69
- rule(:ordinal_suffix) do
70
- str("st") | str("nd") | str("rd") | str("th")
71
- end
72
-
73
- # `date_portion` is optional so a partial reference that omits the
74
- # trailing `:YYYY` date (e.g. "JCGM 100") parses with `date` left nil,
75
- # letting relaton match a collection via `matches?(row, ignore: [:date])`.
76
- # The whole sub-rule is `.maybe` (not the year inside it) so a dangling
77
- # ":" still fails. Mirrors ETSI (lib/pubid/etsi/parser.rb).
78
- rule(:base) do
79
- publisher >> space >> number_portion >>
80
- date_portion.maybe >> language_portion.maybe
17
+ rule(:base_identifier) do
18
+ publisher >> space >> number_portion >> date_portion >> language_portion.maybe
81
19
  end
82
20
 
83
21
  rule(:amendment_identifier) do
84
- base.as(:base) >>
22
+ base_identifier.as(:base_identifier) >>
85
23
  str("/") >> amendment_type >>
86
- space >> digits.as(:number) >>
24
+ space >> amendment_number >>
87
25
  amendment_date.maybe
88
26
  end
89
27
 
@@ -135,17 +73,12 @@ module Pubid
135
73
  end
136
74
 
137
75
  rule(:amendment_number) do
138
- digits.as(:number)
76
+ digits.as(:iteration)
139
77
  end
140
78
 
141
79
  rule(:amendment_date) do
142
80
  str(":") >> (full_date | year_only)
143
81
  end
144
-
145
- # Numbered corrigendum date: same shape as amendment_date.
146
- rule(:corrigendum_date) do
147
- str(":") >> (full_date | year_only)
148
- end
149
82
  end
150
83
  end
151
84
  end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Jcgm
5
+ class Scheme < Pubid::Scheme
6
+ class << self
7
+ def identifiers
8
+ [
9
+ Identifiers::Guide,
10
+ Identifiers::GumGuide,
11
+ ]
12
+ end
13
+
14
+ def supplement_identifiers
15
+ [
16
+ Identifiers::Amendment,
17
+ ]
18
+ end
19
+
20
+ def typed_stages
21
+ (identifiers + supplement_identifiers).flat_map do |klass|
22
+ klass::TYPED_STAGES
23
+ end
24
+ end
25
+
26
+ def locate_typed_stage_by_abbr(abbr)
27
+ # Empty abbr means Guide (published)
28
+ abbr = "" if abbr.nil? || abbr.to_s.strip.empty?
29
+
30
+ typed_stage = typed_stages.detect do |ts|
31
+ ts.abbr.include?(abbr)
32
+ end
33
+
34
+ unless typed_stage
35
+ raise ArgumentError,
36
+ "Unknown type abbreviation: '#{abbr}'"
37
+ end
38
+
39
+ typed_stage
40
+ end
41
+
42
+ def locate_identifier_klass_by_type_code(type_code)
43
+ # Check all identifier classes (base + supplement)
44
+ all_classes = identifiers + supplement_identifiers
45
+
46
+ identifier_klass = all_classes.detect do |klass|
47
+ klass.type[:key].to_s == type_code.to_s
48
+ end
49
+
50
+ unless identifier_klass
51
+ raise ArgumentError,
52
+ "Unknown type code: #{type_code}"
53
+ end
54
+
55
+ identifier_klass
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end