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
@@ -5,6 +5,7 @@ module Pubid
5
5
  class SingleIdentifier < Identifier
6
6
  # Base class for OIML single identifiers (non-supplements)
7
7
  attribute :publisher, :string
8
+ attribute :code, Oiml::Components::Code
8
9
  attribute :date, Pubid::Components::Date
9
10
  attribute :edition, :string
10
11
  attribute :stage, :string
@@ -14,49 +15,56 @@ module Pubid
14
15
  "short"
15
16
  } # Track parsed format
16
17
 
17
- # Serialization delta on top of Oiml::Identifier's shared block. The
18
- # `date` (year) component is flattened to a top-level key rather than a
19
- # nested hash, mirroring ISO (lib/pubid/iso/identifier.rb). `type` is
20
- # intentionally omitted (recomputed from the class on load).
21
- #
22
- # The code columns (number/part/subpart/suffix/space_suffix) are NOT
23
- # here: they are declared, and mapped, by Identifiers::CodeNumber on each
24
- # concrete leaf, because redefining the inherited `number` on this class
25
- # — which every leaf inherits — is the multi-flavor determinism landmine.
26
- # Keeping the mapping with the attribute is also what lets Bulletin, the
27
- # one leaf with no code, omit both.
28
- key_value do
29
- map "publisher", to: :publisher
30
- map "year", with: { to: :year_to_kv, from: :year_from_kv }
31
- map "edition", to: :edition
32
- map "stage", to: :stage
33
- map "iteration", to: :iteration
18
+ # Type is determined by the subclass
19
+ def type
20
+ type_string
34
21
  end
35
22
 
36
- # --- date flattened to a top-level year ---
37
- def year_to_kv(model, doc) = emit_kv(doc, "year", model.date&.year)
23
+ def to_s(format: nil)
24
+ # Use parsed format if not explicitly overridden
25
+ format ||= (parsed_format == "long" ? :long : :short)
38
26
 
39
- def year_from_kv(model, value)
40
- (model.date ||= Pubid::Components::Date.new).year = value.to_s
41
- end
27
+ result = "#{publisher} #{type_string} #{code}"
42
28
 
43
- def emit_kv(doc, key, value)
44
- return if value.nil? || value.to_s.empty?
29
+ # Track if we're using Edition format for language spacing
30
+ using_edition_format = false
45
31
 
46
- doc.add_child(Lutaml::KeyValue::DataModel::Element.new(key, value.to_s))
47
- end
32
+ # Add edition/date portion
33
+ if edition && date
34
+ # Has edition number: "6th Edition 2015"
35
+ result += " #{edition} Edition #{date.year}"
36
+ using_edition_format = true
37
+ elsif edition
38
+ # Edition without year (shouldn't happen but handle it)
39
+ result += " #{edition}"
40
+ using_edition_format = true
41
+ elsif date
42
+ # Date without edition number
43
+ if format == :long
44
+ result += " Edition #{date.year}"
45
+ using_edition_format = true
46
+ else
47
+ result += ":#{date.year}"
48
+ end
49
+ end
48
50
 
49
- attr_reader :requested_format
51
+ # Add draft stage if present (iteration + stage)
52
+ if stage || iteration
53
+ result += " "
54
+ result += iteration.to_s if iteration
55
+ result += stage.to_s if stage
56
+ end
50
57
 
51
- # Type is determined by the subclass
52
- def type
53
- type_string
54
- end
58
+ # Add language portion - depends on format
59
+ if language
60
+ result += if using_edition_format || parsed_format == "short_with_space"
61
+ " (#{language})"
62
+ else
63
+ "(#{language})"
64
+ end
65
+ end
55
66
 
56
- def to_s(format: nil, **opts)
57
- # Store requested format so the renderer can access it
58
- @requested_format = format
59
- render(format: :human, **opts)
67
+ result
60
68
  end
61
69
 
62
70
  def edition_portion
@@ -76,37 +84,6 @@ module Pubid
76
84
  raise NotImplementedError, "Subclasses must implement type_string"
77
85
  end
78
86
 
79
- # OIML keeps identity in the code columns and `type_string` (e.g. "R",
80
- # "V", "D"), not in the inherited `typed_stage` — the generic MrString
81
- # renderer would otherwise drop both and produce `OIML.<year>`.
82
- # Losslessness for issue #142 requires the type letter and document
83
- # number to appear in MR.
84
- #
85
- # Reads through `code`, which every code-bearing leaf composes from its
86
- # split columns (Identifiers::CodeNumber); Bulletin has no code and
87
- # returns nil here, keeping its (year, issue, sequence) slug.
88
- def mr_number_with_part
89
- segments = []
90
- segments << code&.number&.to_s if code&.number
91
- segments << code&.part&.to_s if code&.part
92
- segments << code&.subpart&.to_s if code&.subpart
93
- segments << code&.suffix&.to_s if code&.suffix
94
- return nil if segments.empty?
95
-
96
- segments.join("-")
97
- end
98
-
99
- # Bulletin overrides `code`; every other leaf gets it from
100
- # Identifiers::CodeNumber. Returning nil here keeps #== , the renderer
101
- # and the URN generator total for the abstract class itself.
102
- def code
103
- nil
104
- end
105
-
106
- def mr_type
107
- type_string&.downcase
108
- end
109
-
110
87
  # Subclasses override this
111
88
  end
112
89
  end
@@ -5,78 +5,33 @@ module Pubid
5
5
  class SupplementIdentifier < Identifier
6
6
  # Base class for OIML supplements (amendments, annexes)
7
7
  # These wrap a base identifier like ISO amendments
8
- attribute :base, Oiml::Identifier, polymorphic: true
8
+ attribute :base_identifier, Oiml::Identifier
9
9
  attribute :year, :string
10
10
  attribute :language, :string
11
-
12
- # Delegate the document code to the wrapped standard, mirroring
13
- # Pubid::Etsi::Identifiers::SupplementIdentifier#code.
14
- #
15
- # PRE-EXISTING BUG this closes: `UrnGenerator#urn_number` calls
16
- # `identifier.code` for every non-Bulletin type, but a supplement
17
- # descends from Oiml::Identifier directly — it is a SIBLING of
18
- # SingleIdentifier, which is where `code` used to live — so it inherited
19
- # no `code` at all and `to_urn` raised NoMethodError for every Amendment,
20
- # Errata and Annex. Verified against a baseline captured on main: all
21
- # five supplement fixtures already raised there, so this is a fix, not a
22
- # regression introduced by the move to split index columns.
23
- #
24
- # It stayed hidden because spec/pubid/oiml/urn_spec.rb only exercises a
25
- # bare Recommendation and spec/pubid/oiml/fixtures_spec.rb globs a bad
26
- # path and runs 0 examples (hand-off: ten-dead-fixture-specs).
27
- # `iteration` is the same story: declared on SingleIdentifier, read
28
- # unconditionally by UrnGenerator#urn_iteration, absent from the
29
- # supplement branch of the hierarchy. (`stage` escapes because
30
- # ::Pubid::Identifier declares one, so it merely returns nil.)
31
- def code
32
- base&.code
33
- end
34
-
35
- def iteration
36
- base&.iteration
37
- end
38
- # True for the trailing-word shorthand ("OIML R 138:2009 Amendment"),
39
- # where the supplement word is appended after a dated base instead of the
40
- # "Amendment (YYYY) to BASE" prose form. The word itself comes from the
41
- # concrete class (#supplement_type), so only this flag is stored.
42
- attribute :trailing, :boolean, default: false
43
- # True for the plus-joined form ("OIML B 10:2011+Amendment:2012") where
44
- # both the base and the supplement carry their own year, joined by "+".
45
- attribute :joined, :boolean, default: false
46
11
  attribute :parsed_format, :string, default: -> {
47
12
  "short"
48
13
  } # Track supplement's parsed format
49
14
 
50
- # Serialization delta on top of Oiml::Identifier's shared block. The
51
- # nested base is (de)serialized recursively through the
52
- # polymorphic router so its own `_type` selects the right subclass.
53
- key_value do
54
- map "base",
55
- with: { to: :base_to_kv, from: :base_from_kv }
56
- map "year", to: :year
57
- map "trailing", to: :trailing
58
- map "joined", to: :joined
59
- end
60
-
61
- def base_to_kv(model, doc)
62
- base = model.base
63
- return unless base
15
+ def to_s(format: :short)
16
+ # Determine base format: explicit parameter takes priority, else use parsed format
17
+ base_format = if format && format != :short
18
+ format # Use explicit override
19
+ elsif base_identifier.class.attributes.key?(:parsed_format) && base_identifier.parsed_format == "long"
20
+ :long
21
+ else
22
+ :short
23
+ end
64
24
 
65
- doc.add_child(
66
- Lutaml::KeyValue::DataModel::Element.new("base",
67
- base.to_hash),
68
- )
69
- end
25
+ # Render base with determined format (preserves Edition vs colon)
26
+ base_str = base_identifier.to_s(format: base_format)
27
+ base_str = base_str.sub(/\s*\([^)]+\)\s*$/, "").strip # Remove language from base
70
28
 
71
- def base_from_kv(model, value)
72
- model.base = ::Pubid::Oiml::Identifier.from_hash(value) if value
73
- end
29
+ result = "#{supplement_type} (#{year}) to #{base_str}"
74
30
 
75
- attr_reader :requested_format
31
+ # Supplements ALWAYS add space before their language
32
+ result += " (#{language})" if language
76
33
 
77
- def to_s(format: nil, **opts)
78
- @requested_format = format
79
- render(format: :human, **opts)
34
+ result
80
35
  end
81
36
 
82
37
  # Subclasses override this
@@ -15,6 +15,14 @@ module Pubid
15
15
  identifier.code.to_s
16
16
  end
17
17
 
18
+ def urn_year
19
+ if identifier.date&.year
20
+ return identifier.date.year.to_s
21
+ end
22
+
23
+ nil
24
+ end
25
+
18
26
  def urn_stage
19
27
  identifier.stage&.to_s&.downcase
20
28
  end
@@ -28,17 +36,6 @@ module Pubid
28
36
  end
29
37
 
30
38
  def generate
31
- # Bulletin issues carry no code; the (year, issue, sequence) tuple
32
- # is the locator. URNs are canonical regardless of how the input was
33
- # formatted, so we always emit the structured YYYY-II-SS form even
34
- # when the identifier was parsed from a citation string.
35
- if identifier.is_a?(Identifiers::Bulletin)
36
- parts = ["urn", "oiml", "bulletin"]
37
- parts << bulletin_locator if identifier.date&.present?
38
- parts << urn_language if urn_language
39
- return parts.join(":")
40
- end
41
-
42
39
  parts = ["urn", "oiml"]
43
40
  parts << urn_type
44
41
  parts << urn_number if urn_number
@@ -62,17 +59,6 @@ module Pubid
62
59
 
63
60
  parts.join(":")
64
61
  end
65
-
66
- # Structured locator "YYYY-II-SS" (or "YYYY-II" / "YYYY") for a Bulletin.
67
- # Built directly from the date year and the issue/sequence attributes so
68
- # the URN is identical regardless of whether the input was the structured
69
- # or citation form.
70
- def bulletin_locator
71
- locator = identifier.date.year.to_s
72
- locator += "-#{identifier.issue}" if identifier.issue
73
- locator += "-#{identifier.sequence}" if identifier.sequence
74
- locator
75
- end
76
62
  end
77
63
  end
78
64
  end
data/lib/pubid/oiml.rb CHANGED
@@ -2,78 +2,23 @@
2
2
 
3
3
  module Pubid
4
4
  module Oiml
5
- extend Pubid::PrefixesSupport
6
-
7
- # Sole OIML publisher token (see the parser's `publisher` rule).
8
- PREFIXES = ["OIML"].freeze
9
-
10
5
  autoload :Builder, "#{__dir__}/oiml/builder"
11
6
  autoload :Components, "#{__dir__}/oiml/components"
12
7
  autoload :Identifier, "#{__dir__}/oiml/identifier"
13
8
  autoload :Identifiers, "#{__dir__}/oiml/identifiers"
14
9
  autoload :Parser, "#{__dir__}/oiml/parser"
15
- autoload :Renderer, "#{__dir__}/oiml/renderer"
10
+ autoload :Scheme, "#{__dir__}/oiml/scheme"
16
11
  autoload :SingleIdentifier, "#{__dir__}/oiml/single_identifier"
17
12
  autoload :SupplementIdentifier, "#{__dir__}/oiml/supplement_identifier"
18
13
  autoload :UrnGenerator, "#{__dir__}/oiml/urn_generator"
19
- autoload :UrnParser, "#{__dir__}/oiml/urn_parser"
20
14
 
21
15
  def self.parse(identifier)
22
- unless identifier.is_a?(String)
23
- raise Pubid::Errors::InvalidInputError,
24
- Pubid::INPUT_NOT_A_STRING_MESSAGE
25
- end
26
-
27
- if identifier.length > Pubid::MAX_INPUT_LENGTH
28
- raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
29
- end
30
-
31
16
  parser = Parser.new
32
17
  builder = Builder.new
33
18
 
34
19
  parsed = parser.parse(identifier)
35
20
  builder.build(parsed)
36
21
  end
37
-
38
- # Per-flavor format registry: inherits global formats, overrides :human
39
- Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
40
- Identifier.format_registry.register(:human, renderer: Oiml::Renderer)
41
-
42
- # Auto-discover all identifier types from the Identifiers namespace
43
- # @return [Array<Class>] identifier classes that define a self.type Hash
44
- def self.identifier_types
45
- @identifier_types ||= Identifiers.constants
46
- .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
47
- .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
48
- .select { |c| c.type.is_a?(Hash) }
49
- end
50
-
51
- # Build typed stage index from identifier types
52
- # @return [Array<Pubid::Components::TypedStage>] all typed stages
53
- def self.all_typed_stages
54
- @all_typed_stages ||= identifier_types.flat_map do |klass|
55
- if klass.const_defined?(:TYPED_STAGES)
56
- klass.const_get(:TYPED_STAGES)
57
- else
58
- []
59
- end
60
- end
61
- end
62
-
63
- # Lookup: type code -> identifier class
64
- # @param code [String, Symbol] the type key to find
65
- # @return [Class, nil] the matching identifier class
66
- def self.locate_type(code)
67
- identifier_types.find { |t| t.type[:key].to_s == code.to_s }
68
- end
69
-
70
- # Lookup: abbreviation -> typed stage
71
- # @param abbr [String, Symbol] the abbreviation to find
72
- # @return [Pubid::Components::TypedStage, nil] the matching typed stage
73
- def self.locate_stage(abbr)
74
- abbr_str = abbr.to_s.upcase
75
- all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
76
- end
77
22
  end
78
23
  end
79
24
 
data/lib/pubid/parser.rb CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Pubid
4
4
  module Parser
5
- autoload :Grammar, "pubid/parser/grammar"
6
5
  autoload :CommonParseMethods, "pubid/parser/common_parse_methods"
7
6
  autoload :CommonParseRules, "pubid/parser/common_parse_rules"
8
7
  end
@@ -2,28 +2,6 @@
2
2
 
3
3
  module Pubid
4
4
  module Parsers
5
- # Parses a machine-readable (MR) identifier string back into an Identifier.
6
- #
7
- # The MR format produced by `Renderers::MrString` mirrors the human form,
8
- # lowercased and filename-safe:
9
- #
10
- # iso.9001.2015 → ISO 9001:2015
11
- # iso-iec.17031-1.2020 → ISO/IEC 17031-1:2020
12
- # iso.1234-1-2-3.2020 → ISO 1234-1-2-3:2020
13
- # iso.tr.14627.2017 → ISO/TR 14627:2017
14
- # iso.16634.-- → ISO 16634:--
15
- # iso.9001.2015_amd.1.2020 → ISO 9001:2015/Amd 1:2020
16
- # iso-iec.13818-1.2015_amd.3.2016_cor.1.2017 → ISO/IEC 13818-1:2015/Amd 3:2016/Cor 1:2017
17
- #
18
- # Copublishers join with `-` (`iso-iec`), supplements append with `_`
19
- # (`iso.9001.2015_amd.1.2020`). Both round-trip back to `/` here. The
20
- # flavor's own parser is case-insensitive on the type/publisher tokens
21
- # we emit, so the lowercased slug re-parses cleanly.
22
- #
23
- # Note: NIST, CSA, IEEE, JIS, and SAE emit their own MR shapes that this
24
- # parser does not attempt to reverse (their `to_s` already round-trips
25
- # through the flavor's own parser, so callers should use that path for
26
- # those flavors).
27
5
  class MrString < Base
28
6
  FLAVOR_MAP = {
29
7
  "ISO" => :iso,
@@ -81,14 +59,6 @@ module Pubid
81
59
  ccsds: :Ccsds,
82
60
  }.freeze
83
61
 
84
- # Lower-case type codes the renderer emits as a separate MR segment
85
- # (e.g. `iso.tr.14627`). When the parser sees one of these in the
86
- # second position, it splits it back out as `/TYPE`.
87
- TYPE_CODES = %w[
88
- tr ts pas is amd cor suppl add ext guide spec
89
- standard corrigendum amendment
90
- ].freeze
91
-
92
62
  def self.parse(mr_string)
93
63
  flavor = detect_flavor(mr_string)
94
64
 
@@ -101,106 +71,23 @@ module Pubid
101
71
  raise ArgumentError, "Unknown flavor: #{flavor}" unless flavor_module
102
72
 
103
73
  identifier_string = convert_to_human_readable(mr_string)
104
-
105
- # Refuse to hand the flavor a string this parser did not change.
106
- #
107
- # `detect_flavor` falls back to `:iso` for any publisher it does not
108
- # know, and `Pubid::Iso.parse` sends an MR-shaped string straight back
109
- # here — so a string that survives conversion unchanged recurses
110
- # forever. `ECMA-426 ed1` is the standing example: "ECMA" is absent
111
- # from FLAVOR_MAP, the string matches the MR shape heuristic
112
- # (`/\A[A-Z]{2,}[.-]/`), and conversion is a fixed point.
113
- # `Pubid::Iso.parse("ECMA-426 ed1")` raised SystemStackError.
114
- #
115
- # A fixed point means "this was never an MR string", which is a parse
116
- # failure — the class the cross-flavor contract requires, and the one
117
- # `Pubid.parse` treats as "try the next flavor".
118
- if identifier_string == mr_string && flavor_module == Pubid::Iso
119
- raise Parslet::ParseFailed,
120
- "#{mr_string.inspect} is not an MR string"
121
- end
122
-
123
74
  flavor_module.parse(identifier_string)
124
75
  end
125
76
 
126
77
  def self.detect_flavor(mr_string)
127
- publisher = mr_string.split(/[._-]/).first.to_s.upcase
78
+ publisher = mr_string.split(".").first.upcase
128
79
  FLAVOR_MAP[publisher] || :iso
129
80
  end
130
81
 
131
- # Convert the MR slug back to a human-readable identifier string the
132
- # flavor's own parser will accept. Splits on `_` first so each segment
133
- # (head + each supplement) is converted independently, then re-joined
134
- # with `/`. Within the head, the copublisher separator `-` (first
135
- # segment only) is restored to `/`.
136
82
  def self.convert_to_human_readable(mr_string)
137
- head, *supplements = mr_string.split("_")
138
- human = convert_head(head)
139
- return human if supplements.empty?
140
-
141
- supplements.inject(human) do |acc, supp|
142
- "#{acc}/#{convert_supplement(supp)}"
83
+ parts = mr_string.split(".")
84
+ if parts.size > 2
85
+ year_part = parts.pop
86
+ parts.join(" ") + ":#{year_part}"
87
+ else
88
+ parts.join(" ")
143
89
  end
144
90
  end
145
-
146
- # Converts a head segment like `iso-iec.13818-1.2015` to
147
- # `ISO/IEC 13818-1:2015`.
148
- def self.convert_head(head)
149
- parts = head.split(".")
150
- return parts.join(" ").upcase if parts.length <= 1
151
-
152
- publisher, *rest = parts
153
-
154
- # Optional type code segment (iso.tr.14627.2017 → ISO/TR 14627:2017).
155
- type_segment = nil
156
- if rest.first && TYPE_CODES.include?(rest.first.downcase)
157
- type_segment = rest.shift.upcase
158
- end
159
-
160
- # Trailing language segment — bare language code(s) with no parens.
161
- # Detect by length <= 5 and all-alpha (en, fr, en-fr, ru).
162
- language_segment = nil
163
- if rest.last&.match?(/\A[a-z]{2}(-[a-z]{2})*\z/)
164
- language_segment = rest.pop
165
- end
166
-
167
- # Trailing year segment (may be `--` for undated, or YYYY[-MM[-DD]]).
168
- year_segment = nil
169
- if rest.any? && rest.last.match?(/\A(?:\d{4}(?:-\d{2}){0,2}|--)\z/)
170
- year_segment = rest.pop
171
- end
172
-
173
- # Copublishers in the first segment: `iso-iec` → `ISO/IEC`. Multi-word
174
- # publisher bodies (e.g. `cen-cenelec`) round-trip the same way.
175
- publisher_part = publisher.split("-").map(&:upcase).join("/")
176
- publisher_part = "#{publisher_part}/#{type_segment}" if type_segment
177
-
178
- number_part = rest.join(" ")
179
- result = publisher_part
180
- result += " #{number_part}" unless number_part.empty?
181
- result += ":#{year_segment}" if year_segment
182
- if language_segment
183
- langs = language_segment.split("-").join(",")
184
- result += "(#{langs})"
185
- end
186
- result
187
- end
188
-
189
- # Converts a supplement segment like `amd.1.2020` to `Amd 1:2020`.
190
- # The first token is the lowercase type code; remaining tokens are
191
- # number and optional year.
192
- def self.convert_supplement(supp)
193
- tokens = supp.split(".")
194
- type = tokens.shift&.upcase
195
- year = tokens.last&.match?(/\A\d{4}\z/) ? tokens.pop : nil
196
- number = tokens.join(" ")
197
-
198
- result = type.to_s
199
- result += " #{number}" unless number.empty?
200
- result += ":#{year}" if year
201
- result
202
- end
203
91
  end
204
92
  end
205
93
  end
206
-
@@ -9,7 +9,7 @@ module Pubid
9
9
 
10
10
  def build(parsed)
11
11
  # Check for annex supplement first
12
- if parsed[:base] && parsed[:annex_letter]
12
+ if parsed[:base_identifier] && parsed[:annex_letter]
13
13
  return build_annex(parsed)
14
14
  end
15
15
 
@@ -29,11 +29,7 @@ module Pubid
29
29
  }
30
30
 
31
31
  params[:annex] = parsed[:annex].to_s.to_i if parsed[:annex]
32
- # Only Handbook carries an edition; a legacy Latin TR captures the
33
- # edition slice via the shared handbook rule, so drop it here.
34
- if parsed[:edition] && klass == Identifiers::Handbook
35
- params[:edition] = parsed[:edition].to_s
36
- end
32
+ params[:edition] = parsed[:edition].to_s if parsed[:edition]
37
33
 
38
34
  klass.new(**params)
39
35
  end
@@ -42,10 +38,10 @@ module Pubid
42
38
 
43
39
  def build_annex(parsed)
44
40
  # Recursively parse base identifier
45
- base = build(parsed[:base])
41
+ base = build(parsed[:base_identifier])
46
42
 
47
43
  Identifiers::Annex.new(
48
- base: base,
44
+ base_identifier: base,
49
45
  letter: parsed[:annex_letter].to_s,
50
46
  )
51
47
  end
@@ -2,54 +2,50 @@
2
2
 
3
3
  module Pubid
4
4
  module Plateau
5
- # Base class for all PLATEAU identifiers. Canonical name
6
- # Pubid::Plateau::Identifier.
7
- class Identifier < ::Pubid::Identifier
8
- # Delegate to the flavor module so callers can use
9
- # `Pubid::Plateau::Identifier.parse` consistently with other flavors.
10
- def self.parse(identifier)
11
- Pubid::Plateau.parse(identifier)
12
- end
13
-
14
- attribute :number, :integer
15
- attribute :annex, :integer, default: -> {}
16
-
17
- # Stored as a plain string (always "PLATEAU") so it round-trips through
18
- # to_hash/from_hash. Was a `def publisher` method, which made lutaml
19
- # serialize a String against the Components::Publisher attribute.
20
- attribute :publisher, :string, default: -> { "PLATEAU" }
5
+ module Identifiers
6
+ # Base class for all PLATEAU identifiers
7
+ class Base < Pubid::Identifier
8
+ # Generate URN for this identifier
9
+ #
10
+ # @return [String] URN representation
11
+ attribute :number, :integer
12
+ attribute :annex, :integer, default: -> {}
13
+
14
+ def publisher
15
+ "PLATEAU"
16
+ end
21
17
 
22
- # Subclasses must implement type_string
23
- def type_string
24
- raise NotImplementedError, "Subclasses must implement type_string"
25
- end
18
+ # Subclasses must implement type_string
19
+ def type_string
20
+ raise NotImplementedError, "Subclasses must implement type_string"
21
+ end
26
22
 
27
- def formatted_number
28
- "#%02d" % number
29
- end
23
+ def formatted_number
24
+ "#%02d" % number
25
+ end
30
26
 
31
- def formatted_annex
32
- annex ? "-#{annex}" : ""
33
- end
27
+ def formatted_annex
28
+ annex ? "-#{annex}" : ""
29
+ end
34
30
 
35
- def ==(other)
36
- return false unless other.class == self.class
31
+ def ==(other)
32
+ return false unless other.class == self.class
37
33
 
38
- number == other.number &&
39
- annex == other.annex
40
- end
34
+ number == other.number &&
35
+ annex == other.annex
36
+ end
41
37
 
42
- # Include type_string and annex in serialization for round-trip compatibility
43
- def base_hash
44
- hash = super
45
- if self.class.attributes.key?(:type_string) && type_string
46
- hash[:type] =
47
- type_string
38
+ # Include type_string and annex in serialization for round-trip compatibility
39
+ def base_hash
40
+ hash = super
41
+ if self.class.attributes.key?(:type_string) && type_string
42
+ hash[:type] =
43
+ type_string
44
+ end
45
+ hash[:annex] = annex if annex
46
+ hash
48
47
  end
49
- hash[:annex] = annex if annex
50
- hash
51
48
  end
52
49
  end
53
-
54
50
  end
55
51
  end