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
@@ -53,7 +53,7 @@ module Pubid
53
53
  # Build base identifier (without package_portion)
54
54
  base_data = parsed_hash.dup
55
55
  base_data.delete(:package_portion)
56
- package.base = build_single(base_data)
56
+ package.base_identifier = build_single(base_data)
57
57
 
58
58
  # Set package materials
59
59
  if parsed_hash[:package_portion]
@@ -101,7 +101,7 @@ module Pubid
101
101
  else
102
102
  begin
103
103
  Pubid::Iso.parse(base_str)
104
- rescue Parslet::ParseFailed
104
+ rescue Pubid::Errors::ParseError
105
105
  Pubid::Iec.parse(base_str)
106
106
  end
107
107
  end
@@ -128,17 +128,17 @@ module Pubid
128
128
  end
129
129
  amendment_str = "#{base_str}/Amd #{parsed_hash[:adoption_amendment]}:#{wrapped_amendment_year}"
130
130
 
131
- base = if adoption_org.start_with?("ISO", "CEI")
132
- Pubid::Iso.parse(amendment_str)
133
- elsif adoption_org.start_with?("IEC")
134
- Pubid::Iec.parse(amendment_str)
135
- else
136
- begin
137
- Pubid::Iso.parse(amendment_str)
138
- rescue Parslet::ParseFailed
139
- Pubid::Iec.parse(amendment_str)
140
- end
141
- end
131
+ wrapped_identifier = if adoption_org.start_with?("ISO", "CEI")
132
+ Pubid::Iso.parse(amendment_str)
133
+ elsif adoption_org.start_with?("IEC")
134
+ Pubid::Iec.parse(amendment_str)
135
+ else
136
+ begin
137
+ Pubid::Iso.parse(amendment_str)
138
+ rescue Pubid::Errors::ParseError
139
+ Pubid::Iec.parse(amendment_str)
140
+ end
141
+ end
142
142
  else
143
143
  # No amendment, simple base identifier
144
144
  wrapped_id_str = "#{adoption_org} #{adoption_number}#{year_sep}#{wrapped_year}"
@@ -148,20 +148,20 @@ module Pubid
148
148
  wrapped_id_str = wrapped_id_str.sub("CEI/IEC", "IEC")
149
149
  end
150
150
 
151
- base = if adoption_org.start_with?("ISO", "CEI")
152
- Pubid::Iso.parse(wrapped_id_str)
153
- elsif adoption_org.start_with?("IEC")
154
- Pubid::Iec.parse(wrapped_id_str)
155
- else
156
- begin
157
- Pubid::Iso.parse(wrapped_id_str)
158
- rescue Parslet::ParseFailed
159
- Pubid::Iec.parse(wrapped_id_str)
160
- end
161
- end
151
+ wrapped_identifier = if adoption_org.start_with?("ISO", "CEI")
152
+ Pubid::Iso.parse(wrapped_id_str)
153
+ elsif adoption_org.start_with?("IEC")
154
+ Pubid::Iec.parse(wrapped_id_str)
155
+ else
156
+ begin
157
+ Pubid::Iso.parse(wrapped_id_str)
158
+ rescue Pubid::Errors::ParseError
159
+ Pubid::Iec.parse(wrapped_id_str)
160
+ end
161
+ end
162
162
  end
163
163
 
164
- adoption.base = base
164
+ adoption.wrapped_identifier = wrapped_identifier
165
165
 
166
166
  # Handle reaffirmation
167
167
  if parsed_hash[:reaffirmation]
@@ -195,25 +195,23 @@ module Pubid
195
195
  # SERIES matched - build Series identifier with CAN/CSA- prefix
196
196
  # The Series.to_s will handle rendering as "CAN/CSA-A220 SERIES-06"
197
197
  # (keeping the full prefix instead of "CAN/CSA-A220...")
198
- base = build_series(wrapped_data)
198
+ wrapped_identifier = build_series(wrapped_data)
199
199
  # Set the full publisher_prefix on the wrapped Series for proper rendering
200
- # The test expects base.publisher_prefix to be "CAN/CSA-"
200
+ # The test expects wrapped_identifier.publisher_prefix to be "CAN/CSA-"
201
201
  elsif parsed_hash.key?(:cec_part)
202
202
  # CEC matched - build Cec identifier
203
- base = build_cec(wrapped_data)
203
+ wrapped_identifier = build_cec(wrapped_data)
204
204
  else
205
205
  # Standard CSA identifier
206
- base = build_single(wrapped_data)
206
+ wrapped_identifier = build_single(wrapped_data)
207
207
  end
208
- base.publisher_prefix = original_prefix if original_prefix && base.class.attributes.key?(:publisher_prefix)
208
+ wrapped_identifier.publisher_prefix = original_prefix if original_prefix && wrapped_identifier.class.attributes.key?(:publisher_prefix)
209
209
 
210
- canadian_adopted.base = base
210
+ canadian_adopted.wrapped_identifier = wrapped_identifier
211
211
 
212
- # Handle reaffirmation - supports both 2-digit and 4-digit years.
213
- # The wrapper's own original_reaffirmation_4digit is left at its
214
- # default: CanadianAdopted#to_s only consults it when the wrapped id
215
- # carries no reaffirmation of its own, and Series/Cec track the printed
216
- # width themselves.
212
+ # Handle reaffirmation - supports both 2-digit and 4-digit years
213
+ # Note: CanadianAdopted (WrapperIdentifier) doesn't track original_reaffirmation_4digit
214
+ # That's only for Series/Cec identifiers
217
215
  if parsed_hash[:reaffirmation_4digit]
218
216
  # Original was 4-digit (e.g., "R2019")
219
217
  canadian_adopted.reaffirmation = parsed_hash[:reaffirmation_4digit].to_s
@@ -253,7 +251,7 @@ module Pubid
253
251
 
254
252
  # Code
255
253
  if parsed_hash[:code]
256
- series.number = Components::Code.new(value: parsed_hash[:code].to_s)
254
+ series.code = Components::Code.new(value: parsed_hash[:code].to_s)
257
255
  end
258
256
 
259
257
  # Year format and year
@@ -453,10 +451,10 @@ module Pubid
453
451
  def build_combined(parsed_hash)
454
452
  combined = Identifiers::Combined.new
455
453
 
456
- # Build each designation, in printed order, into one collection.
457
- combined.identifiers = %i[first second third]
458
- .filter_map { |key| parsed_hash[key] }
459
- .map { |part| build_single(part) }
454
+ # Build each part
455
+ combined.first = build_single(parsed_hash[:first])
456
+ combined.second = build_single(parsed_hash[:second])
457
+ combined.third = build_single(parsed_hash[:third]) if parsed_hash[:third]
460
458
 
461
459
  # Detect separator from parser marker
462
460
  combined.separator = if parsed_hash[:comma_separator]
@@ -497,13 +495,15 @@ module Pubid
497
495
  identifier_class = select_identifier_class(data)
498
496
  identifier = identifier_class.new
499
497
 
500
- # Publisher prefix (CAN/CSA-, CAN3-, or CSA).
501
- # A code with no prefix in the original is a code_only identifier; the
502
- # flag stops rendering from supplying the default "CSA".
498
+ # Publisher prefix (CAN/CSA-, CAN3-, or CSA)
499
+ # For code_only identifiers (no prefix in original), set to empty string
500
+ # to prevent default "CSA" from being added in rendering
503
501
  if data[:publisher_prefix]
504
502
  identifier.publisher_prefix = data[:publisher_prefix].to_s
505
- elsif data[:code]
506
- identifier.code_only = true
503
+ elsif data[:code] && !data[:publisher_prefix]
504
+ # Code exists but no publisher_prefix = code_only identifier
505
+ # Use empty string to indicate "no prefix wanted"
506
+ identifier.publisher_prefix = ""
507
507
  end
508
508
 
509
509
  # Publisher presence flag
@@ -520,13 +520,13 @@ module Pubid
520
520
  # Pattern: "C22.1-15" should become code="C22.1", year="2015"
521
521
  if !data[:year] && code_value =~ /^(.+)-(\d{2})$/
522
522
  # Split code and year
523
- identifier.number = Components::Code.new(value: $1)
523
+ identifier.code = Components::Code.new(value: $1)
524
524
  # Convert 2-digit year to 4-digit
525
525
  year_2digit = $2
526
526
  identifier.year = "20#{year_2digit}"
527
527
  identifier.year_format = "dash"
528
528
  else
529
- identifier.number = Components::Code.new(value: code_value)
529
+ identifier.code = Components::Code.new(value: code_value)
530
530
  end
531
531
  end
532
532
 
@@ -8,31 +8,20 @@ module Pubid
8
8
  # collections of other identifiers or package materials.
9
9
  #
10
10
  # Examples:
11
- # - Package: base + package materials
11
+ # - PackageIdentifier: Base + package materials
12
+ # - Future: BundleIdentifier refactor to use composite
12
13
  #
13
14
  # This follows the Composite pattern where an identifier can contain
14
15
  # other identifiers or additional metadata as a collection.
15
- class CompositeIdentifier < Identifier
16
- # The primary/base identifier. A real lutaml attribute under the uniform
17
- # `base` name, so `#root` walks it and it survives serialization — see
18
- # WrapperIdentifier#base for why the type is the cross-flavor
19
- # ::Pubid::Identifier.
20
- attribute :base, ::Pubid::Identifier, polymorphic: true
16
+ class CompositeIdentifier < Lutaml::Model::Serializable
17
+ # The primary/base identifier
18
+ # Use attr_accessor since it can be any identifier object
19
+ attr_accessor :base_identifier
21
20
 
22
21
  # Subclasses MUST implement to_s to define how they render
23
- def to_s(**_opts)
22
+ def to_s
24
23
  raise NotImplementedError, "Subclasses must implement to_s method"
25
24
  end
26
-
27
- # A package peels to the standard it packages — see
28
- # WrapperIdentifier#base_document.
29
- def base_document
30
- base ? base.base_document : self
31
- end
32
-
33
- def drop_supplements
34
- base || self
35
- end
36
25
  end
37
26
  end
38
27
  end
@@ -2,38 +2,13 @@
2
2
 
3
3
  module Pubid
4
4
  module Csa
5
- # Common base class for EVERY CSA identifier — the single-document types
6
- # through SingleIdentifier, and the container types (WrapperIdentifier,
7
- # CompositeIdentifier, Bundled, Combined) directly. So every CSA identifier
8
- # is `is_a?(Pubid::Csa::Identifier)` natively and gets the shared
9
- # polymorphic `from_hash`, `#root`, `#exclude` and MR rendering. The
10
- # containers used to be separate Lutaml::Model types, which is what made
11
- # `root.number` raise rather than return the relaton index key.
12
- class Identifier < ::Pubid::Identifier
5
+ class Identifier
13
6
  def self.parse(input)
14
- unless input.is_a?(String)
15
- raise Pubid::Errors::InvalidInputError,
16
- Pubid::INPUT_NOT_A_STRING_MESSAGE
17
- end
18
-
19
- if input.length > Pubid::MAX_INPUT_LENGTH
20
- raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
21
- end
22
-
23
7
  # Filter out comments
24
- if input.start_with?("#")
25
- raise Pubid::Errors::ParseError.new(
26
- "Not a CSA identifier (comment): #{input}",
27
- input: input, flavor: "csa",
28
- )
29
- end
8
+ return nil if input.start_with?("#")
30
9
 
31
- # Filter out non-standards (memberships, courses, newsletters)
32
- if input.match?(/^CSA (Communities|Group|Learning|OnDemand|Update)/)
33
- raise Pubid::Errors::ParseError.new(
34
- "Not a CSA standard: #{input}", input: input, flavor: "csa"
35
- )
36
- end
10
+ # Filter out non-standards
11
+ return nil if input.match?(/^CSA (Communities|Group|Learning|OnDemand|Update)/)
37
12
 
38
13
  # Preprocessing: normalize CEI to IEC (French name)
39
14
  input = input.gsub("CEI/IEC", "IEC").gsub(/\bCEI\b/, "IEC")
@@ -62,14 +37,16 @@ module Pubid
62
37
 
63
38
  # Parse normally (will create Bundled or Combined identifier)
64
39
  tree = Parser.new.parse(normalized)
65
- result = build!(tree, input)
40
+ result = Builder.new.build(tree)
66
41
 
67
42
  # Apply CAN/CSA- prefix to the appropriate parts
68
- set_publisher_prefix(result, "CAN/CSA-")
43
+ if result
44
+ set_publisher_prefix(result, "CAN/CSA-")
69
45
 
70
- # Handle reaffirmation if present
71
- if (wrapped_input =~ /\(R(\d{4})\)/) && result.class.attributes.key?(:reaffirmation)
72
- result.reaffirmation = $1
46
+ # Handle reaffirmation if present
47
+ if (wrapped_input =~ /\(R(\d{4})\)/) && result.class.attributes.key?(:reaffirmation)
48
+ result.reaffirmation = $1
49
+ end
73
50
  end
74
51
 
75
52
  return result
@@ -105,7 +82,8 @@ module Pubid
105
82
  wrapped_input = wrapped_input.sub(/^CSA-/, "CSA ")
106
83
 
107
84
  # Parse the wrapped identifier recursively
108
- base = parse(wrapped_input)
85
+ wrapped_identifier = parse(wrapped_input)
86
+ return nil unless wrapped_identifier
109
87
 
110
88
  # NOTE: Series identifiers should be wrapped in CanadianAdopted when
111
89
  # they have CAN/CSA- prefix. The Series will handle rendering correctly.
@@ -114,35 +92,32 @@ module Pubid
114
92
  # Set publisher prefix on wrapped identifier
115
93
  # For Series identifiers with CAN/ wrapper, use full "CAN/CSA-" prefix
116
94
  # For other identifiers, use the detected original_prefix ("CSA-" or "CSA")
117
- if base.class.attributes.key?(:publisher_prefix)
118
- if is_can_csa && base.is_a?(Identifiers::Series)
95
+ if wrapped_identifier.class.attributes.key?(:publisher_prefix)
96
+ if is_can_csa && wrapped_identifier.is_a?(Identifiers::Series)
119
97
  # Series gets full "CAN/CSA-" prefix for proper rendering
120
- base.publisher_prefix = "CAN/CSA-"
98
+ wrapped_identifier.publisher_prefix = "CAN/CSA-"
121
99
  elsif original_prefix
122
- # For Combined identifiers, set on the primary designation
123
- if base.is_a?(Identifiers::Combined) && base.identifiers&.first
124
- primary = base.identifiers.first
125
- if primary.class.attributes.key?(:publisher_prefix)
126
- primary.publisher_prefix = original_prefix
127
- end
100
+ # For Combined identifiers, set on first identifier
101
+ if wrapped_identifier.is_a?(Identifiers::Combined) && wrapped_identifier.first
102
+ wrapped_identifier.first.publisher_prefix = original_prefix if wrapped_identifier.first.class.attributes.key?(:publisher_prefix)
128
103
  else
129
104
  # For non-Combined identifiers, set directly
130
- base.publisher_prefix = original_prefix
105
+ wrapped_identifier.publisher_prefix = original_prefix
131
106
  end
132
107
  end
133
108
  end
134
109
 
135
- # Set reaffirmation on base if it has the attribute
136
- if base.class.attributes.key?(:reaffirmation) && reaffirm_year
137
- base.reaffirmation = reaffirm_year
138
- if base.class.attributes.key?(:original_reaffirmation_4digit)
139
- base.original_reaffirmation_4digit = reaffirmation_was_4digit
110
+ # Set reaffirmation on wrapped_identifier if it has the attribute
111
+ if wrapped_identifier.class.attributes.key?(:reaffirmation) && reaffirm_year
112
+ wrapped_identifier.reaffirmation = reaffirm_year
113
+ if wrapped_identifier.class.attributes.key?(:original_reaffirmation_4digit)
114
+ wrapped_identifier.original_reaffirmation_4digit = reaffirmation_was_4digit
140
115
  end
141
116
  end
142
117
 
143
118
  # Create CanadianAdoptedIdentifier wrapper
144
119
  result = Identifiers::CanadianAdopted.new
145
- result.base = base
120
+ result.wrapped_identifier = wrapped_identifier
146
121
  result.reaffirmation = reaffirm_year if reaffirm_year
147
122
 
148
123
  return result
@@ -173,43 +148,44 @@ module Pubid
173
148
  end
174
149
 
175
150
  # Parse the wrapped identifier recursively
176
- base = parse(wrapped_input)
151
+ wrapped_identifier = parse(wrapped_input)
152
+ return nil unless wrapped_identifier
177
153
 
178
154
  # Set year_format for dash format identifiers (preserve original 2-digit year)
179
- if has_dash_year && base.class.attributes.key?(:year_format)
180
- base.year_format = "dash"
155
+ if has_dash_year && wrapped_identifier.class.attributes.key?(:year_format)
156
+ wrapped_identifier.year_format = "dash"
181
157
  # Mark original year as 2-digit so renderer converts back (1986 → 86)
182
- if base.class.attributes.key?(:original_year_4digit)
183
- base.original_year_4digit = false
158
+ if wrapped_identifier.class.attributes.key?(:original_year_4digit)
159
+ wrapped_identifier.original_year_4digit = false
184
160
  end
185
161
  end
186
162
 
187
163
  # Check if this is a Series identifier - return it directly with CAN3- prefix
188
164
  # Series identifiers are complete identifier types and handle the prefix themselves
189
165
  # They don't need to be wrapped in CanadianAdopted
190
- if base.is_a?(Identifiers::Series)
191
- base.publisher_prefix = "CAN3-"
192
- base.reaffirmation = reaffirm_year if reaffirm_year
193
- base.original_reaffirmation_4digit = reaffirmation_was_4digit
194
- return base
166
+ if wrapped_identifier.is_a?(Identifiers::Series)
167
+ wrapped_identifier.publisher_prefix = "CAN3-"
168
+ wrapped_identifier.reaffirmation = reaffirm_year if reaffirm_year
169
+ wrapped_identifier.original_reaffirmation_4digit = reaffirmation_was_4digit
170
+ return wrapped_identifier
195
171
  end
196
172
 
197
173
  # Set CAN3- as publisher prefix on wrapped identifier
198
- if base.class.attributes.key?(:publisher_prefix)
199
- base.publisher_prefix = "CAN3-"
174
+ if wrapped_identifier.class.attributes.key?(:publisher_prefix)
175
+ wrapped_identifier.publisher_prefix = "CAN3-"
200
176
  end
201
177
 
202
- # Set reaffirmation on base if it has the attribute
203
- if base.class.attributes.key?(:reaffirmation) && reaffirm_year
204
- base.reaffirmation = reaffirm_year
205
- if base.class.attributes.key?(:original_reaffirmation_4digit)
206
- base.original_reaffirmation_4digit = reaffirmation_was_4digit
178
+ # Set reaffirmation on wrapped_identifier if it has the attribute
179
+ if wrapped_identifier.class.attributes.key?(:reaffirmation) && reaffirm_year
180
+ wrapped_identifier.reaffirmation = reaffirm_year
181
+ if wrapped_identifier.class.attributes.key?(:original_reaffirmation_4digit)
182
+ wrapped_identifier.original_reaffirmation_4digit = reaffirmation_was_4digit
207
183
  end
208
184
  end
209
185
 
210
186
  # Create CanadianAdoptedIdentifier wrapper
211
187
  result = Identifiers::CanadianAdopted.new
212
- result.base = base
188
+ result.wrapped_identifier = wrapped_identifier
213
189
  result.reaffirmation = reaffirm_year if reaffirm_year
214
190
 
215
191
  return result
@@ -265,20 +241,13 @@ module Pubid
265
241
  "/Amd #{amendment_num}#{separator}#{amend_full_year}"
266
242
  end
267
243
 
268
- # Parse with appropriate flavor parser. The helper probes several
269
- # flavors and reports failure with nil; the public contract is a
270
- # raise, so translate here.
271
- base = parse_external_standard(wrapped_input)
272
- unless base
273
- raise Pubid::Errors::ParseError.new(
274
- "Unparseable adopted standard: #{input}",
275
- input: input, flavor: "csa",
276
- )
277
- end
244
+ # Parse with appropriate flavor parser
245
+ wrapped_identifier = parse_external_standard(wrapped_input)
246
+ return nil unless wrapped_identifier
278
247
 
279
248
  # Create CsaAdoptedIdentifier wrapper
280
249
  result = Identifiers::CsaAdopted.new
281
- result.base = base
250
+ result.wrapped_identifier = wrapped_identifier
282
251
  result.reaffirmation = reaffirm_year if reaffirm_year
283
252
 
284
253
  return result
@@ -359,9 +328,12 @@ module Pubid
359
328
  break if token.match?(/^PACKAGE$/i)
360
329
 
361
330
  test_input = base_input.empty? ? token : "#{base_input} #{token}"
362
- break unless try_parse(test_input)
363
-
364
- base_input = test_input
331
+ parsed = parse(test_input)
332
+ if parsed
333
+ base_input = test_input
334
+ else
335
+ break
336
+ end
365
337
  end
366
338
 
367
339
  # Extract materials as everything between base and PACKAGE
@@ -373,20 +345,13 @@ module Pubid
373
345
  end
374
346
  end
375
347
 
376
- # Parse the base identifier recursively. An unparseable base is a
377
- # failed package, not a nil.
378
- if base_input.nil? || base_input.empty?
379
- raise Pubid::Errors::ParseError.new(
380
- "Unparseable package base: #{input}",
381
- input: input, flavor: "csa",
382
- )
383
- end
384
-
385
- base = parse(base_input)
348
+ # Parse base identifier recursively
349
+ base_identifier = base_input ? parse(base_input) : nil
350
+ return nil unless base_identifier
386
351
 
387
352
  # Create PackageIdentifier
388
353
  result = Identifiers::Package.new
389
- result.base = base
354
+ result.base_identifier = base_identifier
390
355
  # Set materials if present
391
356
  if package_materials && !package_materials.empty?
392
357
  result.package_materials = package_materials
@@ -419,61 +384,39 @@ module Pubid
419
384
  normalized = normalized.gsub("CAN3-", "CSA ")
420
385
 
421
386
  tree = Parser.new.parse(normalized)
422
- result = build!(tree, input)
387
+ result = Builder.new.build(tree)
423
388
 
424
389
  # Set publisher prefix if detected
425
- set_publisher_prefix(result, publisher_prefix) if publisher_prefix
390
+ if result && publisher_prefix
391
+ set_publisher_prefix(result, publisher_prefix)
392
+ end
426
393
 
427
394
  # Set year format if detected as dash and not already set
428
- result.year_format = "dash" if has_dash_year && result.year_format.nil?
395
+ if result && has_dash_year && result.year_format.nil?
396
+ result.year_format = "dash"
397
+ end
429
398
 
430
399
  result
431
400
  rescue Parslet::ParseFailed => e
432
401
  raise e
433
402
  end
434
403
 
435
- # Build a parse tree into an identifier, or fail loudly.
436
- #
437
- # Builder#build can return nil for a tree it recognises but cannot map
438
- # to a class. `parse` must return an identifier or raise — every flavor
439
- # but `api` already honours that — because a nil surfaces in the caller
440
- # as a NoMethodError far from the input that caused it, rather than as a
441
- # catchable parse failure.
442
- def self.build!(tree, input)
443
- built = Builder.new.build(tree)
444
- return built if built
445
-
446
- raise Pubid::Errors::ParseError.new(
447
- "Unparseable CSA identifier: #{input}",
448
- input: input, flavor: "csa",
449
- )
450
- end
451
-
452
- # Probe whether a string parses. The package base scan walks
453
- # progressively longer prefixes and keeps the longest that succeeds, so
454
- # it is the one caller that genuinely wants a nil rather than a raise.
455
- def self.try_parse(input)
456
- parse(input)
457
- rescue Parslet::ParseFailed, ArgumentError
458
- nil
459
- end
460
-
461
404
  def self.set_publisher_prefix(obj, prefix)
462
405
  # Set on main object if it has the attribute
463
406
  if obj.class.attributes.key?(:publisher_prefix)
464
407
  obj.publisher_prefix = prefix
465
408
  end
466
409
 
467
- # Set on combined identifier parts. The primary designation always
468
- # takes the prefix; a trailing one only when it printed a publisher of
469
- # its own (a bare continuation must stay bare).
410
+ # Set on combined identifier parts
470
411
  if obj.is_a?(Identifiers::Combined)
471
- Array(obj.identifiers).each_with_index do |part, index|
472
- next unless part.class.attributes.key?(:publisher_prefix)
473
- next if index.positive? &&
474
- !(part.class.attributes.key?(:has_publisher) && part.has_publisher)
475
-
476
- part.publisher_prefix = prefix
412
+ if obj.first&.class&.attributes&.key?(:publisher_prefix)
413
+ obj.first.publisher_prefix = prefix
414
+ end
415
+ if obj.second && obj.second.class.attributes.key?(:has_publisher) && obj.second.has_publisher && obj.second.class.attributes.key?(:publisher_prefix)
416
+ obj.second.publisher_prefix = prefix
417
+ end
418
+ if obj.third && obj.third.class.attributes.key?(:has_publisher) && obj.third.has_publisher && obj.third.class.attributes.key?(:publisher_prefix)
419
+ obj.third.publisher_prefix = prefix
477
420
  end
478
421
  end
479
422
 
@@ -484,6 +427,9 @@ module Pubid
484
427
  end
485
428
 
486
429
  def self.parse_external_standard(input)
430
+ # Ensure full Pubid is loaded (handles Scheme and all flavors)
431
+ require_relative "../../pubid" unless defined?(Pubid::Iso) && defined?(Pubid::Iec)
432
+
487
433
  # Try ISO/IEC first (most common)
488
434
  if input.match?(/^(ISO\/IEC|ISO|IEC|CEI|CEI\/IEC)\s/)
489
435
  begin
@@ -506,65 +452,6 @@ module Pubid
506
452
 
507
453
  nil
508
454
  end
509
-
510
- # CSA stores the publication year in its own plain `year` string
511
- # attribute (not a `Components::Date`), so the base `#exclude`'s
512
- # `:year`->`:date` remap nils the unused inherited `date` and leaves
513
- # `year` intact. Override to nil `year` (and its formatting metadata)
514
- # when `:year`/`:date` is excluded, so a partial (year-less) CSA
515
- # reference is a year wildcard under `matches?(row, ignore: [:year])`.
516
- # The metadata attrs (`year_format`, `year_prefix`,
517
- # `original_year_4digit`, `french`) are year-derived — a year-less
518
- # parse leaves them nil/false, so they must be reset here too or `==`
519
- # would still differ. `french` in particular is only ever set from a
520
- # `:F` year prefix (the French-edition form `CSA B149.1:F20`), so a
521
- # bare `CSA B149.1` reference must wildcard it to match both the
522
- # English and French editions of a document number. `super` preserves
523
- # the base recursion into nested identifiers (adoption wrappers
524
- # delegate their year to an inner id and lack a `year` accessor, hence
525
- # the `respond_to?` guard). Mirrors BIPM.
526
- def exclude(*args)
527
- result = super
528
- year_keys = args & %i[year date]
529
- if !year_keys.empty? && result.respond_to?(:year=)
530
- result.year = nil
531
- result.year_format = nil
532
- result.year_prefix = nil
533
- result.original_year_4digit = false
534
- result.french = nil
535
- end
536
- result
537
- end
538
-
539
- # CSA encodes its identity across many shape-specific attributes
540
- # (`publisher_prefix`, `number`, `no_number`, `series`, `series_prefix`,
541
- # `package`, `reaffirmation`, `year` with prefix/format/French markers,
542
- # etc.) that the generic MrString renderer doesn't know about. The
543
- # CSA `to_s` already round-trips losslessly through the CSA parser, so
544
- # MR mirrors it: ` ` → `.`, `:` → `.` (so the year never looks like
545
- # another code segment), `/` → `-` (CAN/CSA- prefix), then lowercased
546
- # to match the all-lowercase MR convention (issue #142).
547
- #
548
- # Those three are the SEMANTIC mappings — they carry CSA's segment
549
- # structure. Everything else is then neutralised by CHARSET, not by an
550
- # enumerated escape list, so a character that appears in a future
551
- # reference cannot leak into what `to_slug` hands a filesystem. CSA
552
- # references really do carry `(`, `)`, `,`, `&` and `+` today
553
- # (`CSA C22.2 NO. 100:14 (R2024)`, `… Code, Handbook & Training
554
- # Package`, `… + A1:15`), and the old `tr` chain let all of them
555
- # through — 601 of 816 slugs were not filename-safe. The BIPM `mr_slug`
556
- # precedent.
557
- def to_mr_string
558
- to_s
559
- .downcase
560
- .tr(" ", ".").tr(":", ".").tr("/", "-")
561
- .gsub(/[^a-z0-9._-]+/, "-")
562
- .gsub(/\A[-.]+|[-.]+\z/, "")
563
- end
564
-
565
- def to_slug
566
- to_mr_string
567
- end
568
455
  end
569
456
  end
570
457
  end