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
@@ -4,6 +4,129 @@ module Pubid
4
4
  module Csa
5
5
  module Identifiers
6
6
  class Base < SingleIdentifier
7
+ def to_s
8
+ prefix = publisher_prefix || "CSA"
9
+
10
+ # Handle code_only identifiers (empty string means no prefix)
11
+ if prefix == ""
12
+ # No prefix for code_only identifiers
13
+ parts = []
14
+ else
15
+ # Determine if we need space after prefix
16
+ # CAN/CSA- and CAN3- end with dash, so no space needed
17
+ needs_space = !prefix.end_with?("-")
18
+
19
+ parts = []
20
+ parts << prefix
21
+ end
22
+
23
+ # Code and year together
24
+ code_part = code.to_s if code
25
+
26
+ # NO. keyword
27
+ if no_number
28
+ code_part += " NO. #{no_number}"
29
+ end
30
+
31
+ # Series prefix and keyword (before year)
32
+ if series_prefix
33
+ code_part += " #{series_prefix} SERIES"
34
+ elsif series
35
+ # SERIES without prefix
36
+ code_part += " SERIES"
37
+ end
38
+
39
+ parts << code_part if code_part
40
+
41
+ # Year with proper format (colon or dash)
42
+ if year
43
+ # Use dash if year_format is dash, otherwise colon
44
+ separator = year_format == "dash" ? "-" : ":"
45
+ year_part = separator
46
+ year_part += year_prefix if year_prefix # Add M or F prefix
47
+ year_part += "F" if french && year_format != "dash" && !year_prefix # Only add F if no prefix
48
+ # Convert 4-digit year back to 2-digit for M/F prefix preservation
49
+ # M1983 → M83, F1983 → F83, 1983 → 83, 20xx → xx
50
+ # However, preserve original 4-digit format if the input was 4-digit (original_year_4digit)
51
+ year_str = year.to_s
52
+ year_part += if original_year_4digit
53
+ # Preserve 4-digit format (e.g., "M1981" stays "M1981")
54
+ year_str
55
+ elsif year_prefix&.match?(/^[MF]$/) && year_str.length == 4 && year_str.start_with?("19")
56
+ # M/F + 4-digit year (1900s) → convert to 2-digit with prefix
57
+ year_str[2..3]
58
+ elsif year_str.length == 4 && year_str.start_with?("20")
59
+ # 2000s → just last 2 digits
60
+ year_str[2..3]
61
+ elsif year_str.length == 4 && year_str.start_with?("19") && !original_year_4digit
62
+ # 1900s with no M/F prefix, but original was 2-digit (e.g., CAN3-Z299.0-86)
63
+ # Convert back to 2-digit
64
+ year_str[2..3]
65
+ else
66
+ # Other formats - keep as-is
67
+ year_str
68
+ end
69
+ parts[-1] += year_part
70
+ end
71
+
72
+ result = if prefix == ""
73
+ # No prefix, just join parts
74
+ parts.join(" ")
75
+ elsif needs_space
76
+ parts.join(" ")
77
+ elsif parts.length == 2
78
+ # No space after dash-ending prefix - join first two parts directly
79
+ # If there are more parts after code, they should still have spaces
80
+ parts.join
81
+ else
82
+ # More than 2 parts shouldn't happen in current design
83
+ parts.join
84
+ end
85
+
86
+ # Reaffirmation - preserve original format and determine spacing
87
+ if reaffirmation
88
+ # Check if year was originally 2-digit (original_year_4digit flag)
89
+ year_was_2digit = !original_year_4digit
90
+
91
+ # Check if reaffirmation was originally 4-digit (original_reaffirmation_4digit flag)
92
+ reaffirmation_was_4digit = original_reaffirmation_4digit
93
+
94
+ # Preserve original reaffirmation format
95
+ # If original was 4-digit, keep as 4-digit
96
+ # If original was 2-digit, convert from 4-digit storage back to 2-digit
97
+ reaffirmation_str = if reaffirmation_was_4digit
98
+ # Original was 4-digit, keep as-is
99
+ reaffirmation.to_s
100
+ elsif reaffirmation.to_s.length == 4 && reaffirmation.to_s.start_with?(
101
+ "19", "20"
102
+ )
103
+ # Original was 2-digit, convert 4-digit storage back to 2-digit
104
+ # (R2004) → (R04), (R1994) → (R94)
105
+ reaffirmation.to_s[2..3]
106
+ else
107
+ # Already 2-digit or other format
108
+ reaffirmation.to_s
109
+ end
110
+
111
+ # Determine spacing based on original formats
112
+ # Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
113
+ # No space if both year and reaffirmation are 2-digit, or both are 4-digit
114
+ if year_was_2digit && reaffirmation_was_4digit
115
+ # Year was 2-digit, reaffirmation was 4-digit → add space
116
+ result += " (R#{reaffirmation_str})"
117
+ else
118
+ # Both 2-digit, both 4-digit, or other cases → no space
119
+ result += "(R#{reaffirmation_str})"
120
+ end
121
+ end
122
+
123
+ # Package (already has leading space from parser)
124
+ if package
125
+ result += package
126
+ end
127
+
128
+ result
129
+ end
7
130
  end
8
131
  end
9
132
  end
@@ -5,33 +5,17 @@ require "lutaml/model"
5
5
  module Pubid
6
6
  module Csa
7
7
  module Identifiers
8
- class Bundled < Identifier
9
- # The consolidated base document and the amendments bundled with it.
10
- # Both are typed cross-flavor and polymorphic — see
11
- # WrapperIdentifier#base — because a bundle's base is routinely a Cec,
12
- # which is not a Standard subclass. #root is inherited: it walks
13
- # `base` to the origin document.
14
- attribute :base, ::Pubid::Identifier, polymorphic: true
15
- attribute :bundled_with, ::Pubid::Identifier, polymorphic: true,
16
- collection: true
8
+ class Bundled < Lutaml::Model::Serializable
9
+ attribute :base, Standard
10
+ attribute :bundled_with, Standard, collection: true
17
11
  attribute :reaffirmation, :string
18
12
  attribute :original_reaffirmation_4digit, :boolean, default: -> {
19
13
  false
20
14
  }
21
15
  attribute :year_format, :string # Add for compatibility with identifier.rb
22
16
 
23
- # A bundle is a base document consolidated with its amendments, so
24
- # both matching primitives peel to that base.
25
- def base_document
26
- base ? base.base_document : self
27
- end
28
-
29
- def drop_supplements
30
- base || self
31
- end
32
-
33
- def to_s(**opts)
34
- # For Cec identifiers, use normalized form (number instead of cec_part + NO.)
17
+ def to_s
18
+ # For Cec identifiers, use normalized form (code instead of cec_part + NO.)
35
19
  # This is used for "normalized form" rendering in bundled identifiers
36
20
  if base.is_a?(Cec)
37
21
  # Render base with normalized code format
@@ -47,7 +31,7 @@ module Pubid
47
31
  end
48
32
  end
49
33
  base_str = (needs_space ? "#{prefix} " : prefix) +
50
- base.number.value.to_s + # Normalized code (e.g. "C22.2-1")
34
+ base.code.value.to_s + # Use normalized code (e.g., "C22.2-1")
51
35
  ":#{year_display}"
52
36
  parts = [base_str]
53
37
  else
@@ -60,7 +44,7 @@ module Pubid
60
44
  bundled_with.each do |bundled|
61
45
  # For Cec identifiers, use normalized code format
62
46
  if bundled.is_a?(Cec)
63
- bundled_part = bundled.number.value.to_s # e.g. "C22.2-2"
47
+ bundled_part = bundled.code.value.to_s # Normalized code (e.g., "C22.2-2")
64
48
  if bundled.year
65
49
  # Use dash if year_format is dash, otherwise colon
66
50
  separator = bundled.year_format == "dash" ? "-" : ":"
@@ -78,7 +62,7 @@ module Pubid
78
62
  else
79
63
  # Standard rendering for other identifier types
80
64
  bundled_part = ""
81
- bundled_part += bundled.number.to_s if bundled.number
65
+ bundled_part += bundled.code.to_s if bundled.code
82
66
 
83
67
  if bundled.year
84
68
  # Use dash if year_format is dash, otherwise colon
@@ -133,7 +117,7 @@ module Pubid
133
117
  end
134
118
  end
135
119
 
136
- annotate_plain_render(result, **opts)
120
+ result
137
121
  end
138
122
  end
139
123
  end
@@ -12,40 +12,40 @@ module Pubid
12
12
  #
13
13
  # This is a wrapper pattern where:
14
14
  # - CAN/ indicates Canadian adoption
15
- # - The base is the actual CSA standard being adopted
15
+ # - The wrapped_identifier is the actual CSA standard being adopted
16
16
  #
17
17
  # This is semantically different from a string prefix because:
18
18
  # - CAN/ wraps an entire identifier (which may itself be complex)
19
19
  # - The wrapped identifier is recursively parsed as a full CSA identifier
20
20
  # - Proper object composition, not string manipulation
21
21
  class CanadianAdopted < WrapperIdentifier
22
- def to_s(**opts)
22
+ def to_s
23
23
  # For CAN3- identifiers, don't add CAN/ prefix (CAN3- is already complete)
24
24
  # For Series with CAN/CSA- prefix, don't add CAN/ (it's already complete)
25
25
  # For CAN/CSA- identifiers, CAN/ wraps CSA- part
26
- if base.class.attributes.key?(:publisher_prefix) && base.publisher_prefix
27
- prefix = base.publisher_prefix
26
+ if wrapped_identifier.class.attributes.key?(:publisher_prefix) && wrapped_identifier.publisher_prefix
27
+ prefix = wrapped_identifier.publisher_prefix
28
28
  # CAN3- is standalone, just render wrapped identifier
29
29
  # CAN/CSA- is already complete for Series identifiers
30
- if prefix == "CAN3-" || (prefix == "CAN/CSA-" && base.is_a?(Identifiers::Series))
31
- result = base.to_s
30
+ if prefix == "CAN3-" || (prefix == "CAN/CSA-" && wrapped_identifier.is_a?(Identifiers::Series))
31
+ result = wrapped_identifier.to_s
32
32
  else
33
33
  # For other cases, prepend CAN/ prefix
34
- result = "CAN/#{base}"
34
+ result = "CAN/#{wrapped_identifier}"
35
35
  end
36
36
  else
37
37
  # No publisher_prefix, prepend CAN/
38
- result = "CAN/#{base}"
38
+ result = "CAN/#{wrapped_identifier}"
39
39
  end
40
- # Only add reaffirmation from wrapper if base doesn't have one
40
+ # Only add reaffirmation from wrapper if wrapped_identifier doesn't have one
41
41
  # (to avoid duplicates - Identifier.parse sets it on both)
42
- if reaffirmation && !(base.class.attributes.key?(:reaffirmation) && base.reaffirmation)
42
+ if reaffirmation && !(wrapped_identifier.class.attributes.key?(:reaffirmation) && wrapped_identifier.reaffirmation)
43
43
  # Determine if space is needed before reaffirmation
44
44
  # Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
45
45
  # No space if both year and reaffirmation are 2-digit
46
46
  # Check original_year_4digit flag - if false, year was originally 2-digit
47
- year_was_2digit = base.class.attributes.key?(:original_year_4digit) &&
48
- !base.original_year_4digit
47
+ year_was_2digit = wrapped_identifier.class.attributes.key?(:original_year_4digit) &&
48
+ !wrapped_identifier.original_year_4digit
49
49
  # Check original_reaffirmation_4digit flag
50
50
  reaffirmation_was_4digit = original_reaffirmation_4digit
51
51
 
@@ -74,7 +74,7 @@ module Pubid
74
74
  result += "(R#{reaffirmation_str})"
75
75
  end
76
76
  end
77
- annotate_plain_render(result, **opts)
77
+ result
78
78
  end
79
79
  end
80
80
  end
@@ -13,52 +13,115 @@ module Pubid
13
13
  attribute :cec_part, Components::Code # C22.2, C22.3, C22.4, C22.6
14
14
  attribute :no_number, Components::Code # Number after NO.
15
15
 
16
- # `CSA C22.2 NO. 286:23` stores the joined "C22.2-286" in `number`, which
17
- # appears nowhere in the printed form; the two halves it does print live
18
- # in `cec_part` and `no_number`. Naming them gives the identifier its
19
- # docnumber spans back.
20
- def annotation_tokens
21
- super + [
22
- [:publisher_prefix, "publisher"],
23
- [:cec_part, "docnumber"],
24
- [:no_number, "docnumber"],
25
- ]
26
- end
16
+ # Combined code attribute for compatibility
17
+ # Returns cec_part + "-" + no_number (e.g., "C22.2-1")
18
+ def code
19
+ return nil unless cec_part && no_number
27
20
 
28
- # Merged with SingleIdentifier's block (lutaml combines an inherited
29
- # key_value block with a subclass one), so this adds only the half of
30
- # the code that Cec keeps separately.
31
- key_value do
32
- map "cec_part",
33
- with: { to: :cec_part_to_kv, from: :cec_part_from_kv }
21
+ @code ||= Components::Code.new(value: "#{cec_part.value}-#{no_number.value}")
34
22
  end
35
23
 
36
- def cec_part_to_kv(model, doc)
37
- emit_kv(doc, "cec_part", model.cec_part)
38
- end
24
+ def to_s
25
+ parts = []
39
26
 
40
- def cec_part_from_kv(model, value)
41
- model.cec_part = Components::Code.new(value: value.to_s)
42
- end
27
+ # Publisher prefix (CSA, CAN/CSA-, CAN3-)
28
+ prefix = publisher_prefix || "CSA"
43
29
 
44
- # The document code, synthesised from its two halves:
45
- # cec_part + "-" + no_number (e.g. "C22.2-1"). This is the index key.
46
- #
47
- # It shadows the reader lutaml generates for the inherited `number`
48
- # attribute, which is safe because Cec declares no `number` of its own
49
- # — the ITU precedent (itu/identifiers/base.rb). `cec_part` and
50
- # `no_number` are themselves serialized, so from_hash reproduces the
51
- # synthesised value.
52
- #
53
- # Deliberately NOT memoised: `@number` is the very ivar lutaml uses to
54
- # store the inherited attribute, so caching there would both discard a
55
- # value assigned through the generated writer and go stale if
56
- # `cec_part`/`no_number` were reassigned — and `number` is the relaton
57
- # index key. The concatenation is trivial, so there is nothing to save.
58
- def number
59
- return nil unless cec_part && no_number
30
+ # Determine if we need space after prefix
31
+ # CAN/CSA- and CAN3- end with dash, so no space needed
32
+ needs_space = !prefix.end_with?("-")
33
+
34
+ parts << prefix unless prefix == ""
35
+
36
+ # CEC Part (C22.2, C22.3, etc.)
37
+ parts << cec_part.value if cec_part
38
+
39
+ # NO. notation - this is the key semantic component
40
+ parts << "NO."
41
+
42
+ # Number after NO.
43
+ parts << no_number.value if no_number
44
+
45
+ # Determine separator based on prefix ending
46
+ result = if prefix == ""
47
+ parts.join(" ")
48
+ elsif needs_space
49
+ parts.join(" ")
50
+ elsif parts.length <= 2
51
+ # No space after dash-ending prefix (CAN/CSA-, CAN3-)
52
+ # Join first two parts directly, rest with spaces
53
+ parts.join
54
+ else
55
+ parts[0] + parts[1..].join(" ")
56
+ end
57
+
58
+ # Year with proper format (colon or dash)
59
+ if year
60
+ # Use dash if year_format is dash, otherwise colon
61
+ separator = year_format == "dash" ? "-" : ":"
62
+ year_part = separator
63
+
64
+ # Convert 4-digit year back to 2-digit for display
65
+ year_str = year.to_s
66
+ display_year = if year_str.length == 4 && year_str.start_with?("20")
67
+ year_str[2..3]
68
+ elsif year_str.length == 4 && year_str.start_with?("19")
69
+ year_str[2..3]
70
+ else
71
+ year_str
72
+ end
73
+
74
+ # Add prefix if present
75
+ year_part += if year_prefix
76
+ year_prefix + display_year
77
+ elsif french && year_format != "dash"
78
+ # Only add F if no prefix already set
79
+ "F#{display_year}"
80
+ else
81
+ display_year
82
+ end
83
+
84
+ result += year_part
85
+ end
86
+
87
+ # Reaffirmation - preserve original format and determine spacing
88
+ if reaffirmation
89
+ # Check if year was originally 2-digit (original_year_4digit flag)
90
+ year_was_2digit = !original_year_4digit
91
+
92
+ # Check if reaffirmation was originally 4-digit (original_reaffirmation_4digit flag)
93
+ reaffirmation_was_4digit = original_reaffirmation_4digit
94
+
95
+ # Preserve original reaffirmation format
96
+ # If original was 4-digit, keep as 4-digit
97
+ # If original was 2-digit, convert from 4-digit storage back to 2-digit
98
+ reaffirmation_str = if reaffirmation_was_4digit
99
+ # Original was 4-digit, keep as-is
100
+ reaffirmation.to_s
101
+ elsif reaffirmation.to_s.length == 4 && reaffirmation.to_s.start_with?(
102
+ "19", "20"
103
+ )
104
+ # Original was 2-digit, convert 4-digit storage back to 2-digit
105
+ # (R2004) → (R04), (R1994) → (R94)
106
+ reaffirmation.to_s[2..3]
107
+ else
108
+ # Already 2-digit or other format
109
+ reaffirmation.to_s
110
+ end
111
+
112
+ # Determine spacing based on original formats
113
+ # Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
114
+ # No space if both year and reaffirmation are 2-digit, or both are 4-digit
115
+ if year_was_2digit && reaffirmation_was_4digit
116
+ # Year was 2-digit, reaffirmation was 4-digit → add space
117
+ result += " (R#{reaffirmation_str})"
118
+ else
119
+ # Both 2-digit, both 4-digit, or other cases → no space
120
+ result += "(R#{reaffirmation_str})"
121
+ end
122
+ end
60
123
 
61
- Components::Code.new(value: "#{cec_part.value}-#{no_number.value}")
124
+ result
62
125
  end
63
126
  end
64
127
  end
@@ -5,23 +5,16 @@ require "lutaml/model"
5
5
  module Pubid
6
6
  module Csa
7
7
  module Identifiers
8
- # Combined represents CSA identifiers joined with "/" or ", "
8
+ # CombinedIdentifier represents CSA identifiers combined with "/" separator
9
9
  # Examples:
10
10
  # CSA A23.1:24/CSA A23.2:24
11
11
  # CSA N285.0:23/CSA N285.6 SERIES:23
12
12
  # CSA A123.1-05/A123.5-05 (R2015)
13
13
  # CSA B44:19/B44.1:19/B44.2:19 (triple combined)
14
- class Combined < Identifier
15
- # The co-equal designations, in printed order.
16
- #
17
- # One polymorphic collection, the IEC ConsolidatedIdentifier shape —
18
- # not the historical first/second/third triple, which hard-capped the
19
- # form at three and froze a non-standard hash shape. The first member
20
- # is the primary designation, which is what #root walks so the index
21
- # key is non-empty. Typed cross-flavor for the same reason as
22
- # WrapperIdentifier#base.
23
- attribute :identifiers, ::Pubid::Identifier, polymorphic: true,
24
- collection: true
14
+ class Combined < Lutaml::Model::Serializable
15
+ attribute :first, Standard
16
+ attribute :second, Standard
17
+ attribute :third, Standard
25
18
  attribute :reaffirmation, :string
26
19
  attribute :original_reaffirmation_4digit, :boolean, default: -> {
27
20
  false
@@ -30,74 +23,61 @@ module Pubid
30
23
  attribute :year_format, :string # Dummy for compatibility
31
24
  attribute :separator, :string, default: -> { "/" } # "/" or ", "
32
25
 
33
- # A combined id stores its members in `identifiers`, not `base`, so
34
- # walk the primary designation to the origin document
35
- # (Iec::Identifiers::ConsolidatedIdentifier does the same).
36
- def root
37
- identifiers&.first&.root || self
38
- end
26
+ def to_s
27
+ # For comma separator, render both parts with full prefix
28
+ # For slash separator, second/third parts without prefix
29
+ if separator == ", "
30
+ # Comma: Both with full CSA prefix
31
+ parts = [first.to_s, second.to_s]
32
+ parts << third.to_s if third
33
+ else
34
+ # Slash: Second and third without CSA prefix (continuation)
35
+ parts = [first.to_s]
36
+ parts << render_continuation(second)
37
+ parts << render_continuation(third) if third
38
+ end
39
39
 
40
- # Co-equal designations, so both matching primitives reduce to the
41
- # primary one — the Iec::Identifiers::ConsolidatedIdentifier shape.
42
- def base_document
43
- identifiers&.first&.base_document || self
44
- end
40
+ result = parts.join(separator || "/")
45
41
 
46
- def drop_supplements
47
- identifiers&.first || self
48
- end
42
+ # Reaffirmation - preserve original format and determine spacing
43
+ if reaffirmation
44
+ # For combined identifiers, check year format from first identifier
45
+ # to determine spacing
46
+ year_was_2digit = first.class.attributes.key?(:original_year_4digit) && !first.original_year_4digit
47
+
48
+ # Check if reaffirmation was originally 4-digit
49
+ # Note: We need to track this at the Combined level, but for now
50
+ # assume 4-digit if the value is 4 digits and starts with 19/20
51
+ reaffirmation_was_4digit = reaffirmation.to_s.length == 4 &&
52
+ reaffirmation.to_s.start_with?("19", "20")
53
+
54
+ # Determine spacing based on original formats
55
+ # Space needed if year is 2-digit and reaffirmation is 4-digit
56
+ result += if year_was_2digit && reaffirmation_was_4digit
57
+ " (R#{reaffirmation})"
58
+ else
59
+ "(R#{reaffirmation})"
60
+ end
61
+ end
49
62
 
50
- def to_s(**opts)
51
- parts = render_parts
52
- result = parts.join(separator || "/")
53
- result += render_reaffirmation if reaffirmation
54
63
  result += package if package
55
- annotate_plain_render(result, **opts)
64
+ result
56
65
  end
57
66
 
58
67
  private
59
68
 
60
- # With a comma separator every designation carries its full prefix;
61
- # with a slash the trailing ones are continuations printed bare.
62
- def render_parts
63
- return identifiers.map(&:to_s) if separator == ", "
64
-
65
- identifiers.each_with_index.map do |identifier, index|
66
- index.zero? ? identifier.to_s : render_continuation(identifier)
67
- end
68
- end
69
-
70
- # Reaffirmation - preserve original format and determine spacing.
71
- # A space is needed when the year was printed 2-digit and the
72
- # reaffirmation 4-digit; the year format comes from the primary
73
- # designation.
74
- def render_reaffirmation
75
- primary = identifiers&.first
76
- year_was_2digit =
77
- primary &&
78
- primary.class.attributes.key?(:original_year_4digit) &&
79
- !primary.original_year_4digit
80
-
81
- reaffirmation_was_4digit = reaffirmation.to_s.length == 4 &&
82
- reaffirmation.to_s.start_with?("19", "20")
83
-
84
- if year_was_2digit && reaffirmation_was_4digit
85
- " (R#{reaffirmation})"
86
- else
87
- "(R#{reaffirmation})"
88
- end
89
- end
90
-
91
69
  # Render identifier without CSA prefix (unless has_publisher is true)
92
70
  def render_continuation(identifier)
93
71
  parts = []
94
72
 
95
73
  # Add CSA prefix if present in original
96
74
  if identifier.has_publisher
97
- parts << (identifier.publisher_prefix || "CSA")
75
+ prefix = identifier.publisher_prefix || "CSA"
76
+ !prefix.end_with?("-")
77
+ parts << prefix
98
78
  end
99
79
 
100
- code_part = identifier.number.to_s if identifier.number
80
+ code_part = identifier.code.to_s if identifier.code
101
81
 
102
82
  # NO. keyword
103
83
  if identifier.no_number
@@ -112,42 +92,34 @@ module Pubid
112
92
  code_part += " SERIES"
113
93
  end
114
94
 
115
- code_part += render_continuation_year(identifier) if identifier.year
116
-
117
- parts << code_part if code_part
118
-
119
- join_continuation(identifier, parts)
120
- end
121
-
122
- # Year with proper format (colon or dash)
123
- def render_continuation_year(identifier)
124
- separator = identifier.year_format == "dash" ? "-" : ":"
125
- year_part = separator
126
- # Add M or F prefix
127
- year_part += identifier.year_prefix if identifier.year_prefix
128
- # Only add F if no prefix
129
- if identifier.french && identifier.year_format != "dash" &&
130
- !identifier.year_prefix
131
- year_part += "F"
95
+ # Year with proper format (colon or dash)
96
+ if identifier.year
97
+ separator = identifier.year_format == "dash" ? "-" : ":"
98
+ year_part = separator
99
+ year_part += identifier.year_prefix if identifier.year_prefix # Add M or F prefix
100
+ year_part += "F" if identifier.french && identifier.year_format != "dash" && !identifier.year_prefix # Only add F if no prefix
101
+ # Convert 4-digit year back to 2-digit
102
+ year_str = identifier.year.to_s
103
+ year_part += if year_str.length == 4 && year_str.start_with?("20")
104
+ year_str[2..3]
105
+ else
106
+ year_str
107
+ end
108
+ code_part += year_part
132
109
  end
133
- # Convert 4-digit year back to 2-digit
134
- year_str = identifier.year.to_s
135
- year_part + if year_str.length == 4 && year_str.start_with?("20")
136
- year_str[2..3]
137
- else
138
- year_str
139
- end
140
- end
141
110
 
142
- # Join with proper spacing based on prefix
143
- def join_continuation(identifier, parts)
144
- return parts.join(" ") unless identifier.has_publisher &&
145
- parts.length > 1
111
+ parts << code_part if code_part
146
112
 
147
- prefix = parts[0]
148
- if prefix.end_with?("-")
149
- # No space after dash-ending prefix
150
- prefix + parts[1..].join(" ")
113
+ # Join with proper spacing based on prefix
114
+ if identifier.has_publisher && parts.length > 1
115
+ prefix = parts[0]
116
+ needs_space = !prefix.end_with?("-")
117
+ if needs_space
118
+ parts.join(" ")
119
+ else
120
+ # No space after dash-ending prefix
121
+ parts[0] + parts[1..].join(" ")
122
+ end
151
123
  else
152
124
  parts.join(" ")
153
125
  end
@@ -18,16 +18,16 @@ module Pubid
18
18
  #
19
19
  # This is a wrapper pattern where:
20
20
  # - CSA prefix indicates adoption
21
- # - The base is the external standard (ISO/IEC/CISPR)
21
+ # - The wrapped_identifier is the external standard (ISO/IEC/CISPR)
22
22
  # - Wrapped identifier is recursively parsed using external flavor parsers
23
23
  class CsaAdopted < WrapperIdentifier
24
24
  # Publisher prefix (e.g., "CSA-", "CAN3-") for rendering
25
25
  # When set, uses dash format without space (e.g., "CSA-ISO" not "CSA ISO")
26
26
  attribute :publisher_prefix, :string
27
27
 
28
- def to_s(**opts)
28
+ def to_s
29
29
  # Get string representation from wrapped identifier
30
- base_str = base.to_s
30
+ base_str = wrapped_identifier.to_s
31
31
 
32
32
  # Convert 4-digit years to 2-digit for CSA adoption format
33
33
  # ISO/IEC TR 12785-3:2015 → ISO/IEC TR 12785-3:15
@@ -70,7 +70,7 @@ module Pubid
70
70
  # Append reaffirmation if present
71
71
  result += " (R#{reaffirmation})" if reaffirmation
72
72
 
73
- annotate_plain_render(result, **opts)
73
+ result
74
74
  end
75
75
  end
76
76
  end