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
@@ -12,7 +12,7 @@ module Pubid
12
12
  # CSA C22.2 NO. 60601-1:15 PACKAGE WITH ADDENDUM
13
13
  #
14
14
  # This is a composite pattern where:
15
- # - base is the core CSA standard (recursively parsed)
15
+ # - base_identifier is the core CSA standard (recursively parsed)
16
16
  # - package_materials describes what's included in the package
17
17
  # - Package portion is metadata, not a parseable identifier
18
18
  #
@@ -33,8 +33,8 @@ module Pubid
33
33
  # false = materials BEFORE: "CSA B149.1:25 Code, Handbook & Training Package"
34
34
  attribute :materials_after_keyword, :boolean, default: -> { true }
35
35
 
36
- def to_s(**opts)
37
- result = base.to_s
36
+ def to_s
37
+ result = base_identifier.to_s
38
38
 
39
39
  # Add package materials if present
40
40
  if package_materials && !package_materials.empty?
@@ -57,7 +57,7 @@ module Pubid
57
57
  result += " PACKAGE"
58
58
  end
59
59
 
60
- annotate_plain_render(result, **opts)
60
+ result
61
61
  end
62
62
  end
63
63
  end
@@ -17,6 +17,110 @@ module Pubid
17
17
  class Series < Base
18
18
  # Series prefix (MH, RV, etc.) - optional
19
19
  attribute :series_prefix, :string
20
+
21
+ def to_s
22
+ result = publisher_prefix_portion
23
+
24
+ # Add code FIRST (before SERIES keyword)
25
+ result += code.to_s
26
+
27
+ # Add space before series prefix/SERIES keyword
28
+ result += " "
29
+
30
+ # Add series prefix if present
31
+ result += "#{series_prefix} " if series_prefix && !series_prefix.empty?
32
+
33
+ # Add SERIES keyword
34
+ result += "SERIES"
35
+
36
+ # Add year
37
+ result += year_portion
38
+
39
+ # Add language
40
+ result += language_portion
41
+
42
+ # Add reaffirmation
43
+ result += reaffirmation_portion
44
+
45
+ result
46
+ end
47
+
48
+ private
49
+
50
+ def publisher_prefix_portion
51
+ prefix = publisher_prefix || "CSA"
52
+
53
+ # Handle code_only identifiers (empty string means no prefix)
54
+ return "" if prefix == ""
55
+
56
+ # Determine if we need space after prefix
57
+ # CAN/CSA- and CAN3- end with dash, so no space needed
58
+ needs_space = !prefix.end_with?("-")
59
+
60
+ needs_space ? "#{prefix} " : prefix
61
+ end
62
+
63
+ def year_portion
64
+ return "" unless year
65
+
66
+ # Use dash if year_format is dash, otherwise colon
67
+ separator = year_format == "dash" ? "-" : ":"
68
+ year_part = separator
69
+ year_part += year_prefix if year_prefix # Add M or F prefix
70
+ year_part += "F" if french && year_format != "dash" && !year_prefix # Only add F if no prefix
71
+
72
+ # Convert 4-digit year back to 2-digit
73
+ year_str = year.to_s
74
+ year_part += if year_str.length == 4 && year_str.start_with?("20")
75
+ year_str[2..3]
76
+ else
77
+ year_str
78
+ end
79
+
80
+ year_part
81
+ end
82
+
83
+ def language_portion
84
+ "" # CSA doesn't use language codes in rendering
85
+ end
86
+
87
+ def reaffirmation_portion
88
+ return "" unless reaffirmation
89
+
90
+ # Check if year was originally 2-digit (original_year_4digit flag)
91
+ year_was_2digit = !original_year_4digit
92
+
93
+ # Check if reaffirmation was originally 4-digit (original_reaffirmation_4digit flag)
94
+ reaffirmation_was_4digit = original_reaffirmation_4digit
95
+
96
+ # Preserve original reaffirmation format
97
+ # If original was 4-digit, keep as 4-digit
98
+ # If original was 2-digit, convert from 4-digit storage back to 2-digit
99
+ reaffirmation_str = if reaffirmation_was_4digit
100
+ # Original was 4-digit, keep as-is
101
+ reaffirmation.to_s
102
+ elsif reaffirmation.to_s.length == 4 && reaffirmation.to_s.start_with?(
103
+ "19", "20"
104
+ )
105
+ # Original was 2-digit, convert 4-digit storage back to 2-digit
106
+ # (R2004) → (R04), (R1994) → (R94)
107
+ reaffirmation.to_s[2..3]
108
+ else
109
+ # Already 2-digit or other format
110
+ reaffirmation.to_s
111
+ end
112
+
113
+ # Determine spacing based on original formats
114
+ # Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
115
+ # No space if both year and reaffirmation are 2-digit, or both are 4-digit
116
+ if year_was_2digit && reaffirmation_was_4digit
117
+ # Year was 2-digit, reaffirmation was 4-digit → add space
118
+ " (R#{reaffirmation_str})"
119
+ else
120
+ # Both 2-digit, both 4-digit, or other cases → no space
121
+ "(R#{reaffirmation_str})"
122
+ end
123
+ end
20
124
  end
21
125
  end
22
126
  end
@@ -4,7 +4,7 @@ require "parslet"
4
4
 
5
5
  module Pubid
6
6
  module Csa
7
- class Parser < ::Pubid::Parser::Grammar
7
+ class Parser < Parslet::Parser
8
8
  # Basic building blocks
9
9
  rule(:space) { str(" ") }
10
10
  rule(:dash) { str("-") }
@@ -179,7 +179,7 @@ module Pubid
179
179
  # Optional series prefix (MH, RV, etc.) before SERIES keyword
180
180
  (series_prefix >> space).maybe >>
181
181
  series_keyword.as(:series_type) >>
182
- (colon_year | dash_year).maybe >>
182
+ (colon_year | dash_year) >>
183
183
  reaffirmation.maybe
184
184
  end
185
185
 
@@ -194,7 +194,7 @@ module Pubid
194
194
  ).as(:cec_part) >>
195
195
  no_notation >>
196
196
  no_number >>
197
- (colon_year | dash_year).maybe >>
197
+ (colon_year | dash_year) >>
198
198
  reaffirmation.maybe
199
199
  end
200
200
 
@@ -257,7 +257,7 @@ module Pubid
257
257
  (space >> series_keyword.as(:series) >> (colon_year | dash_year)) |
258
258
  # Option 4: just year (no series, no NO.)
259
259
  (colon_year | dash_year)
260
- ).maybe >> # trailing year optional (partial reference)
260
+ ) >>
261
261
  amendment_slash.maybe # Add amendment support here
262
262
  end
263
263
 
@@ -274,7 +274,7 @@ module Pubid
274
274
  (space >> series_keyword.as(:series) >> (colon_year | dash_year)) |
275
275
  # Option 4: just year
276
276
  (colon_year | dash_year)
277
- ).maybe # trailing year optional (partial reference)
277
+ )
278
278
  end
279
279
 
280
280
  # Continuation code (optional CSA publisher prefix, for combined identifiers)
@@ -290,7 +290,7 @@ module Pubid
290
290
  (space >> series_keyword.as(:series) >> (colon_year | dash_year)) |
291
291
  # Option 4: just year
292
292
  (colon_year | dash_year)
293
- ).maybe >> # trailing year optional (partial reference)
293
+ ) >>
294
294
  amendment_slash.maybe
295
295
  end
296
296
 
@@ -353,7 +353,7 @@ module Pubid
353
353
  (space >> series_keyword.as(:series) >> (colon_year | dash_year)) |
354
354
  # Option 3: just year
355
355
  (colon_year | dash_year)
356
- ).maybe >> # trailing year optional (partial reference)
356
+ ) >>
357
357
  (space >> str("PACKAGE")).as(:package_portion).maybe
358
358
  end
359
359
 
@@ -367,11 +367,7 @@ module Pubid
367
367
  # Preprocessing to normalize input
368
368
  def parse(input)
369
369
  # Skip comment lines
370
- if input.strip.start_with?("#")
371
- raise Pubid::Errors::ParseError.new(
372
- "Comment line", input: input, flavor: "csa"
373
- )
374
- end
370
+ raise Parslet::ParseFailed.new("Comment line") if input.strip.start_with?("#")
375
371
 
376
372
  # Remove CONSOLIDATED notation FIRST (before other processing)
377
373
  normalized = input.gsub(/\s*\(\s*CONSOLIDATED\s*\)\s*/, " ")
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Csa
5
+ class Scheme < Pubid::Scheme
6
+ class << self
7
+ def identifiers
8
+ @identifiers ||= [
9
+ Identifiers::Standard,
10
+ Identifiers::Bundled,
11
+ Identifiers::CanadianAdopted,
12
+ Identifiers::CsaAdopted,
13
+ Identifiers::Package,
14
+ Identifiers::Series,
15
+ Identifiers::Cec,
16
+ Identifiers::Combined,
17
+ ].freeze
18
+ end
19
+
20
+ def supplement_identifiers
21
+ @supplement_identifiers ||= [].freeze
22
+ end
23
+
24
+ def typed_stages
25
+ @typed_stages ||= [].freeze
26
+ end
27
+
28
+ def supplement_typed_stages
29
+ @supplement_typed_stages ||= [].freeze
30
+ end
31
+
32
+ def locate_typed_stage_by_abbr(_abbr)
33
+ raise ArgumentError,
34
+ "CSA identifiers do not use typed stages"
35
+ end
36
+
37
+ def locate_identifier_klass_by_type_code(_type_code)
38
+ raise ArgumentError,
39
+ "CSA identifiers do not use type codes"
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -2,19 +2,12 @@
2
2
 
3
3
  module Pubid
4
4
  module Csa
5
- class SingleIdentifier < Identifier
6
- # The document code — "B149.1", "Z240", "C22.2" — and the relaton index
7
- # key: Relaton::Index sorts and bsearches every row on
8
- # `id.root.number.to_s`, so it must never be empty.
5
+ class SingleIdentifier < Pubid::Identifier
6
+ # Generate URN for this identifier
9
7
  #
10
- # It is the `number` INHERITED from ::Pubid::Identifier, not a
11
- # redeclaration: Pubid::Csa::Components::Code is a bare alias of
12
- # Pubid::Components::Code, which is exactly the parent's declared type.
13
- # That matters. CSA's base is split across two files (csa/identifier.rb +
14
- # csa/single_identifier.rb) — the IEEE shape in which a leaf can snapshot
15
- # a half-built parent attribute table (CLAUDE.md, the `number`
16
- # determinism landmine). Declaring nothing here keeps CSA clear of it.
17
- # The attribute was named `code` before; there is no alias.
8
+ # @return [String] URN representation
9
+
10
+ attribute :code, Components::Code
18
11
  attribute :no_number, :string
19
12
  attribute :year, :string
20
13
  attribute :year_format, :string # "colon" or "dash"
@@ -32,88 +25,6 @@ module Pubid
32
25
  attribute :series, :boolean # Track if SERIES keyword present
33
26
  attribute :package, :string # Package portion (Code, Handbook, etc.)
34
27
  attribute :publisher_prefix, :string # Original prefix: "CAN/CSA-", "CSA", "CAN3-"
35
-
36
- # True when the reference printed no publisher at all ("C22.1-15"), so
37
- # rendering must not supply the default "CSA".
38
- #
39
- # This used to be an empty-string `publisher_prefix` sentinel, which the
40
- # canonical `to_hash` drops (it strips empty and default-valued
41
- # attributes by design) — so a code-only identifier came back
42
- # from `from_hash` with a nil prefix and re-rendered as
43
- # "CSA C22.1-15". Named for the RARE case with a `false` default,
44
- # per CLAUDE.md, so it is dropped from every ordinary row.
45
- attribute :code_only, :boolean, default: -> { false }
46
-
47
- # A flat, index-friendly serialized shape: the `Components::Code`
48
- # attributes collapse to bare scalars (`number: C22.2-286`, not
49
- # `number: {value: C22.2-286}`), the ISO/ETSI/ITU `key_value` pattern.
50
- #
51
- # This is deliberately a serialization mapping rather than an
52
- # `attribute :number, :string` redeclaration. CSA's base is split across
53
- # two files (csa/identifier.rb + csa/single_identifier.rb) — the IEEE
54
- # shape in which a leaf can snapshot a half-built parent attribute table
55
- # — so a retype here would reintroduce the `number` determinism landmine
56
- # recorded in CLAUDE.md. The runtime attribute stays a Components::Code;
57
- # only the hash is flat.
58
- #
59
- # A lutaml key_value block is EXHAUSTIVE — an unmapped attribute is
60
- # dropped, `_type` included — so every attribute above appears here. It
61
- # lives on SingleIdentifier, which only the single-document types
62
- # inherit; the container types descend from Csa::Identifier directly and
63
- # keep the default shape for their nested `base`/`identifiers`.
64
- key_value do
65
- map "_type", to: :_type
66
- map "number", with: { to: :number_to_kv, from: :number_from_kv }
67
- map "no_number",
68
- with: { to: :no_number_to_kv, from: :no_number_from_kv }
69
- map "year", to: :year
70
- map "year_format", to: :year_format
71
- map "year_prefix", to: :year_prefix
72
- map "original_year_4digit", to: :original_year_4digit
73
- map "french", to: :french
74
- map "reaffirmation", to: :reaffirmation
75
- map "original_reaffirmation_4digit", to: :original_reaffirmation_4digit
76
- map "has_publisher", to: :has_publisher
77
- map "series_prefix", to: :series_prefix
78
- map "series", to: :series
79
- map "package", to: :package
80
- map "publisher_prefix", to: :publisher_prefix
81
- map "code_only", to: :code_only
82
- end
83
-
84
- def number_to_kv(model, doc)
85
- emit_kv(doc, "number", model.number)
86
- end
87
-
88
- def number_from_kv(model, value)
89
- model.number = Components::Code.new(value: value.to_s)
90
- end
91
-
92
- # `no_number` is a plain :string here but a Components::Code on Cec, so
93
- # the converter reads through whichever it is given.
94
- def no_number_to_kv(model, doc)
95
- emit_kv(doc, "no_number", model.no_number)
96
- end
97
-
98
- def no_number_from_kv(model, value)
99
- model.no_number =
100
- if model.class.attributes[:no_number].type == Components::Code
101
- Components::Code.new(value: value.to_s)
102
- else
103
- value.to_s
104
- end
105
- end
106
-
107
- # Emit a scalar, skipping a nil or empty value so the canonical
108
- # no-defaults hash never gains an empty key.
109
- def emit_kv(doc, key, value)
110
- text = value.respond_to?(:value) ? value.value : value
111
- return if text.nil? || text.to_s.empty?
112
-
113
- doc.add_child(
114
- Lutaml::KeyValue::DataModel::Element.new(key, text.to_s),
115
- )
116
- end
117
28
  end
118
29
  end
119
30
  end
@@ -3,23 +3,16 @@
3
3
  module Pubid
4
4
  module Csa
5
5
  class UrnGenerator < Pubid::UrnGenerator::Base
6
- # A code_only identifier printed no publisher, so it keeps an empty
7
- # publisher segment rather than falling back to "csa" in #generate.
8
6
  def urn_publisher_prefix
9
- return "" if code_only?
10
7
  return nil unless identifier.publisher_prefix
11
8
 
12
9
  identifier.publisher_prefix.to_s.downcase
13
10
  end
14
11
 
15
- def code_only?
16
- identifier.respond_to?(:code_only) && identifier.code_only
17
- end
18
-
19
12
  def urn_number
20
- return nil unless identifier.number
13
+ return nil unless identifier.code
21
14
 
22
- identifier.number.render(context: URN_CONTEXT)
15
+ identifier.code.value.to_s
23
16
  end
24
17
 
25
18
  def urn_no_number
@@ -4,61 +4,28 @@ require "lutaml/model"
4
4
 
5
5
  module Pubid
6
6
  module Csa
7
- # WrapperIdentifier is the base class for all CSA identifiers that wrap
8
- # other identifiers.
7
+ # WrapperIdentifier is the base class for all CSA identifiers that wrap other identifiers
9
8
  # Examples:
10
- # - CanadianAdopted: CAN/{base}
11
- # - CsaAdopted: CSA {ISO/IEC/CISPR identifier}
9
+ # - CanadianAdoptedIdentifier: CAN/{wrapped_identifier}
10
+ # - CsaAdoptedIdentifier: CSA {ISO/IEC/CISPR identifier}
12
11
  #
13
- # The wrapper pattern allows proper MODEL-DRIVEN architecture where
14
- # adoptions are objects that contain other identifier objects, not string
15
- # prefixes.
16
- class WrapperIdentifier < Identifier
17
- # The wrapped identifier (recursively parsed).
18
- #
19
- # A real lutaml attribute, not an attr_accessor: the accessor was
20
- # invisible to `to_hash`, `from_hash` AND `#exclude` (which iterates
21
- # `self.class.attributes`), so a wrapper serialized to a hash with no
22
- # identifier in it at all. It is named `base` — the uniform parent
23
- # accessor every flavor uses — so the inherited `#root` walks it to the
24
- # origin document and `exclude_from_nested` reaches inside. There is no
25
- # `wrapped_identifier` alias.
26
- #
27
- # Typed as the cross-flavor `::Pubid::Identifier`, not the CSA one:
28
- # CsaAdopted wraps ISO/IEC/CISPR ids, and lutaml enforces the declared
29
- # type — `polymorphic: true` widens it only to SUBCLASSES, so a narrower
30
- # type raises Lutaml::Model::IncorrectModelError on `to_hash`. The
31
- # Ieee::Identifiers::AdoptedStandard precedent. The nested child carries
32
- # its own `_type`, so `from_hash` routes it back via TypeResolver.
33
- attribute :base, ::Pubid::Identifier, polymorphic: true
12
+ # The wrapper pattern allows proper MODEL-DRIVEN architecture where adoptions
13
+ # are objects that contain other identifier objects, not string prefixes.
14
+ class WrapperIdentifier < Lutaml::Model::Serializable
15
+ # The wrapped identifier (recursively parsed)
16
+ # Use attr_accessor since it can be any identifier object (CSA, ISO, IEC, etc.)
17
+ attr_accessor :wrapped_identifier
34
18
 
35
19
  # Reaffirmation year (common across wrappers)
36
20
  attribute :reaffirmation, :string
37
21
 
38
- # Whether the reaffirmation was printed 4-digit ("(R2004)") rather than
39
- # 2-digit ("(R04)"). CanadianAdopted#to_s reads it to choose the spacing
40
- # and to render the year back in its original width.
41
- attribute :original_reaffirmation_4digit, :boolean, default: -> { false }
42
-
43
22
  # Year format tracking (for compatibility)
44
23
  attribute :year_format, :string
45
24
 
46
25
  # Subclasses MUST implement to_s
47
- def to_s(**_opts)
26
+ def to_s
48
27
  raise NotImplementedError, "Subclasses must implement to_s method"
49
28
  end
50
-
51
- # The matching primitives relaton uses to normalise a reference before
52
- # comparing it. An adoption wrapper peels to the document it adopts;
53
- # without these the inherited defaults return the WRAPPER, which is a
54
- # silently wrong answer rather than a loud one.
55
- def base_document
56
- base ? base.base_document : self
57
- end
58
-
59
- def drop_supplements
60
- base || self
61
- end
62
29
  end
63
30
  end
64
31
  end
data/lib/pubid/csa.rb CHANGED
@@ -2,71 +2,20 @@
2
2
 
3
3
  module Pubid
4
4
  module Csa
5
- extend Pubid::PrefixesSupport
6
-
7
- # Sole CSA publisher token (see the parser's `publisher` rule).
8
- PREFIXES = ["CSA"].freeze
9
-
10
5
  autoload :Builder, "#{__dir__}/csa/builder"
11
6
  autoload :Identifier, "#{__dir__}/csa/identifier"
12
7
  autoload :Identifiers, "#{__dir__}/csa/identifiers"
13
8
  autoload :Parser, "#{__dir__}/csa/parser"
14
- autoload :Renderer, "#{__dir__}/csa/renderer"
9
+ autoload :Scheme, "#{__dir__}/csa/scheme"
15
10
  autoload :SingleIdentifier, "#{__dir__}/csa/single_identifier"
16
11
  autoload :UrnGenerator, "#{__dir__}/csa/urn_generator"
17
- autoload :UrnParser, "#{__dir__}/csa/urn_parser"
18
12
  autoload :WrapperIdentifier, "#{__dir__}/csa/wrapper_identifier"
19
13
  autoload :CompositeIdentifier, "#{__dir__}/csa/composite_identifier"
20
14
  autoload :Components, "#{__dir__}/csa/components"
21
15
 
22
16
  def self.parse(identifier_string)
23
- unless identifier_string.is_a?(String)
24
- raise Pubid::Errors::InvalidInputError,
25
- Pubid::INPUT_NOT_A_STRING_MESSAGE
26
- end
27
-
28
- if identifier_string.length > Pubid::MAX_INPUT_LENGTH
29
- raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
30
- end
31
-
32
17
  Identifier.parse(identifier_string)
33
18
  end
34
-
35
- # Auto-discover all identifier types from the Identifiers namespace
36
- # @return [Array<Class>] identifier classes that define a self.type Hash
37
- def self.identifier_types
38
- @identifier_types ||= Identifiers.constants
39
- .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
40
- .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
41
- .select { |c| c.type.is_a?(Hash) }
42
- end
43
-
44
- # Build typed stage index from identifier types
45
- # @return [Array<Pubid::Components::TypedStage>] all typed stages
46
- def self.all_typed_stages
47
- @all_typed_stages ||= identifier_types.flat_map do |klass|
48
- if klass.const_defined?(:TYPED_STAGES)
49
- klass.const_get(:TYPED_STAGES)
50
- else
51
- []
52
- end
53
- end
54
- end
55
-
56
- # Lookup: type code -> identifier class
57
- # @param code [String, Symbol] the type key to find
58
- # @return [Class, nil] the matching identifier class
59
- def self.locate_type(code)
60
- identifier_types.find { |t| t.type[:key].to_s == code.to_s }
61
- end
62
-
63
- # Lookup: abbreviation -> typed stage
64
- # @param abbr [String, Symbol] the abbreviation to find
65
- # @return [Pubid::Components::TypedStage, nil] the matching typed stage
66
- def self.locate_stage(abbr)
67
- abbr_str = abbr.to_s.upcase
68
- all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
69
- end
70
19
  end
71
20
 
72
21
  # Register this flavor with the Pubid registry
@@ -74,7 +23,3 @@ end
74
23
 
75
24
  # Register Ucsa flavor with the registry
76
25
  Pubid::Registry.register(:csa, Pubid::Csa)
77
-
78
- # Per-flavor format registry: inherits global formats, overrides :human
79
- Pubid::Csa::SingleIdentifier.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
80
- Pubid::Csa::SingleIdentifier.format_registry.register(:human, renderer: Pubid::Csa::Renderer)
@@ -52,14 +52,9 @@ module Pubid
52
52
  version = build_version(data)
53
53
  date = build_date(data)
54
54
 
55
- # The code fields are stored as flat index columns on the leaf (see
56
- # EtsiStandard) — `number` is what relaton-index keys on — so the Code
57
- # object built above is unpacked rather than assigned.
58
55
  Identifiers::EtsiStandard.new(
59
56
  type: data[:type].to_s,
60
- number: code.number,
61
- minor: code.minor,
62
- parts: code.parts || [],
57
+ code: code,
63
58
  version: version,
64
59
  date: date,
65
60
  )
@@ -100,23 +95,19 @@ module Pubid
100
95
  end
101
96
 
102
97
  def build_version(data)
103
- # Handle both version and edition. A partial reference omits both, in
104
- # which case version is left nil (not defaulted) so exclude/matches?
105
- # treat it as a wildcard.
98
+ # Handle both version and edition
106
99
  if data[:version]
107
100
  Components::Version.new(version: data[:version].to_s,
108
101
  is_edition: false)
109
102
  elsif data[:edition]
110
103
  Components::Version.new(version: data[:edition].to_s,
111
104
  is_edition: true)
105
+ else
106
+ Components::Version.new(version: "1.0.0", is_edition: false)
112
107
  end
113
108
  end
114
109
 
115
110
  def build_date(data)
116
- # A partial reference omits the date; leave it nil rather than building
117
- # an empty Date, so the canonical to_hash drops it entirely.
118
- return nil unless data[:year]
119
-
120
111
  Pubid::Components::Date.new(
121
112
  year: data[:year].to_s,
122
113
  month: data[:month].to_s,
@@ -10,13 +10,16 @@ module Pubid
10
10
  # Simple: 012, 123, 456
11
11
  # GSM: GSM 02.01, 02.01
12
12
  # Complex: ABC 123, ABC-DEF 123
13
- #
14
- # Stays independent of Pubid::Components::Code because ETSI uses
15
- # +minor+ (a flavor-specific sub-number) plus +parts+.
16
13
  class Code < Lutaml::Model::Serializable
17
- attribute :number, :string # Main number
18
- attribute :minor, :string # Optional minor part
19
- attribute :parts, :string, collection: true, default: [] # Parts array
14
+ attribute :number, :string # Main number (can contain dots, letters, etc.)
15
+ attribute :minor, :string # Optional minor part
16
+ attribute :parts, :string, collection: true # Parts array
17
+
18
+ def initialize(number:, minor: nil, parts: nil)
19
+ @number = number
20
+ @minor = minor
21
+ @parts = parts || []
22
+ end
20
23
 
21
24
  # Render code with space for minor and dash-separated parts
22
25
  def to_s
@@ -26,10 +29,6 @@ module Pubid
26
29
  result
27
30
  end
28
31
 
29
- def render(context: nil)
30
- to_s
31
- end
32
-
33
32
  def ==(other)
34
33
  return false unless other.is_a?(Code)
35
34
 
@@ -13,6 +13,11 @@ module Pubid
13
13
  false
14
14
  } # true for ed.N format
15
15
 
16
+ def initialize(version:, is_edition: false)
17
+ @version = version
18
+ @is_edition = is_edition
19
+ end
20
+
16
21
  def to_s
17
22
  if is_edition
18
23
  "ed.#{version}"
@@ -1,4 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Pubid::Etsi::Identifier is the ETSI base class (a real Pubid::Identifier
4
- # subclass); its body and `.parse` live in identifiers/base.rb. This file just ensures it is loaded.
3
+ module Pubid
4
+ module Etsi
5
+ class Identifier
6
+ def self.parse(identifier)
7
+ parsed = Parser.parse(identifier)
8
+ Builder.build(parsed)
9
+ rescue Parslet::ParseFailed => e
10
+ raise "Failed to parse ETSI identifier '#{identifier}': #{e.message}"
11
+ end
12
+ end
13
+ end
14
+ end