pubid 1.15.19 → 2.0.0.pre.alpha.2

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 (604) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.adoc +2041 -53
  4. data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
  5. data/archived-gems/pubid-iec/stages.yaml +129 -0
  6. data/archived-gems/pubid-iec/update_codes.yaml +67 -0
  7. data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
  8. data/archived-gems/pubid-iso/stages.yaml +106 -0
  9. data/archived-gems/pubid-iso/update_codes.yaml +4 -0
  10. data/archived-gems/pubid-itu/i18n.yaml +13 -0
  11. data/archived-gems/pubid-itu/series.yaml +42 -0
  12. data/archived-gems/pubid-nist/publishers.yaml +6 -0
  13. data/archived-gems/pubid-nist/series.yaml +121 -0
  14. data/archived-gems/pubid-nist/stages.yaml +16 -0
  15. data/archived-gems/pubid-nist/update_codes.yaml +93 -0
  16. data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
  17. data/data/ccsds/update_codes.yaml +1 -0
  18. data/data/iec/update_codes.yaml +67 -0
  19. data/data/ieee/update_codes.yaml +104 -0
  20. data/data/iso/update_codes.yaml +21 -0
  21. data/data/nist/update_codes.yaml +89 -0
  22. data/data/plateau/update_codes.yaml +6 -0
  23. data/lib/pubid/amca/builder.rb +176 -0
  24. data/lib/pubid/amca/identifier.rb +57 -0
  25. data/lib/pubid/amca/identifiers/base.rb +64 -0
  26. data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
  27. data/lib/pubid/amca/identifiers/publication.rb +47 -0
  28. data/lib/pubid/amca/identifiers/standard.rb +22 -0
  29. data/lib/pubid/amca/identifiers.rb +12 -0
  30. data/lib/pubid/amca/parser.rb +153 -0
  31. data/lib/pubid/amca/scheme.rb +16 -0
  32. data/lib/pubid/amca/single_identifier.rb +33 -0
  33. data/lib/pubid/amca/urn_generator.rb +50 -0
  34. data/lib/pubid/amca.rb +26 -0
  35. data/lib/pubid/ansi/builder.rb +52 -0
  36. data/lib/pubid/ansi/identifier.rb +55 -0
  37. data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
  38. data/lib/pubid/ansi/identifiers/standard.rb +16 -0
  39. data/lib/pubid/ansi/identifiers.rb +11 -0
  40. data/lib/pubid/ansi/parser.rb +91 -0
  41. data/lib/pubid/ansi/scheme.rb +15 -0
  42. data/lib/pubid/ansi/single_identifier.rb +45 -0
  43. data/lib/pubid/ansi/urn_generator.rb +76 -0
  44. data/lib/pubid/ansi.rb +27 -0
  45. data/lib/pubid/api/builder.rb +85 -0
  46. data/lib/pubid/api/components/code.rb +9 -0
  47. data/lib/pubid/api/identifier.rb +68 -0
  48. data/lib/pubid/api/identifiers/base.rb +24 -0
  49. data/lib/pubid/api/identifiers/bulletin.rb +15 -0
  50. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
  51. data/lib/pubid/api/identifiers/mpms.rb +44 -0
  52. data/lib/pubid/api/identifiers/publication.rb +15 -0
  53. data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
  54. data/lib/pubid/api/identifiers/specification.rb +15 -0
  55. data/lib/pubid/api/identifiers/standard.rb +15 -0
  56. data/lib/pubid/api/identifiers/technical_report.rb +15 -0
  57. data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
  58. data/lib/pubid/api/parser.rb +140 -0
  59. data/lib/pubid/api/scheme.rb +66 -0
  60. data/lib/pubid/api/single_identifier.rb +46 -0
  61. data/lib/pubid/api/urn_generator.rb +41 -0
  62. data/lib/pubid/api.rb +17 -0
  63. data/lib/pubid/ashrae/builder.rb +498 -0
  64. data/lib/pubid/ashrae/identifier.rb +57 -0
  65. data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
  66. data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
  67. data/lib/pubid/ashrae/identifiers/base.rb +23 -0
  68. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
  69. data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
  70. data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
  71. data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
  72. data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
  73. data/lib/pubid/ashrae/identifiers.rb +16 -0
  74. data/lib/pubid/ashrae/parser.rb +724 -0
  75. data/lib/pubid/ashrae/scheme.rb +53 -0
  76. data/lib/pubid/ashrae/single_identifier.rb +23 -0
  77. data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
  78. data/lib/pubid/ashrae/urn_generator.rb +59 -0
  79. data/lib/pubid/ashrae.rb +21 -0
  80. data/lib/pubid/asme/builder.rb +153 -0
  81. data/lib/pubid/asme/components/code.rb +18 -0
  82. data/lib/pubid/asme/identifier.rb +61 -0
  83. data/lib/pubid/asme/identifiers/base.rb +70 -0
  84. data/lib/pubid/asme/identifiers/standard.rb +12 -0
  85. data/lib/pubid/asme/identifiers.rb +10 -0
  86. data/lib/pubid/asme/parser.rb +308 -0
  87. data/lib/pubid/asme/scheme.rb +37 -0
  88. data/lib/pubid/asme/single_identifier.rb +29 -0
  89. data/lib/pubid/asme/urn_generator.rb +133 -0
  90. data/lib/pubid/asme.rb +21 -0
  91. data/lib/pubid/astm/builder.rb +159 -0
  92. data/lib/pubid/astm/components/code.rb +33 -0
  93. data/lib/pubid/astm/identifier.rb +92 -0
  94. data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
  95. data/lib/pubid/astm/identifiers/base.rb +13 -0
  96. data/lib/pubid/astm/identifiers/data_series.rb +25 -0
  97. data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
  98. data/lib/pubid/astm/identifiers/manual.rb +40 -0
  99. data/lib/pubid/astm/identifiers/monograph.rb +25 -0
  100. data/lib/pubid/astm/identifiers/research_report.rb +18 -0
  101. data/lib/pubid/astm/identifiers/standard.rb +52 -0
  102. data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
  103. data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
  104. data/lib/pubid/astm/parser.rb +244 -0
  105. data/lib/pubid/astm/scheme.rb +55 -0
  106. data/lib/pubid/astm/single_identifier.rb +25 -0
  107. data/lib/pubid/astm/urn_generator.rb +99 -0
  108. data/lib/pubid/astm.rb +38 -0
  109. data/lib/pubid/bsi/builder.rb +1483 -0
  110. data/lib/pubid/bsi/components/code.rb +11 -0
  111. data/lib/pubid/bsi/components/date.rb +11 -0
  112. data/lib/pubid/bsi/components/publisher.rb +11 -0
  113. data/lib/pubid/bsi/components/type.rb +11 -0
  114. data/lib/pubid/bsi/identifier.rb +87 -0
  115. data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
  116. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
  117. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
  118. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
  119. data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
  120. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  121. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
  122. data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
  123. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
  124. data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
  125. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
  126. data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
  127. data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
  128. data/lib/pubid/bsi/identifiers/disc.rb +56 -0
  129. data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
  130. data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
  131. data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
  132. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
  133. data/lib/pubid/bsi/identifiers/flex.rb +61 -0
  134. data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
  135. data/lib/pubid/bsi/identifiers/index.rb +62 -0
  136. data/lib/pubid/bsi/identifiers/method.rb +76 -0
  137. data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
  138. data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
  139. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
  140. data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
  141. data/lib/pubid/bsi/identifiers/section.rb +62 -0
  142. data/lib/pubid/bsi/identifiers/set.rb +46 -0
  143. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
  144. data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
  145. data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
  146. data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
  147. data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
  148. data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
  149. data/lib/pubid/bsi/identifiers.rb +52 -0
  150. data/lib/pubid/bsi/model.rb +196 -0
  151. data/lib/pubid/bsi/parser.rb +659 -0
  152. data/lib/pubid/bsi/scheme.rb +243 -0
  153. data/lib/pubid/bsi/single_identifier.rb +129 -0
  154. data/lib/pubid/bsi/urn_generator.rb +84 -0
  155. data/lib/pubid/bsi.rb +32 -0
  156. data/lib/pubid/builder/base.rb +138 -0
  157. data/lib/pubid/bundled_identifier.rb +126 -0
  158. data/lib/pubid/ccsds/builder.rb +56 -0
  159. data/lib/pubid/ccsds/identifier.rb +84 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +89 -0
  161. data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
  162. data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
  163. data/lib/pubid/ccsds/identifiers.rb +10 -0
  164. data/lib/pubid/ccsds/parser.rb +71 -0
  165. data/lib/pubid/ccsds/scheme.rb +57 -0
  166. data/lib/pubid/ccsds/single_identifier.rb +77 -0
  167. data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
  168. data/lib/pubid/ccsds/urn_generator.rb +115 -0
  169. data/lib/pubid/ccsds.rb +21 -0
  170. data/lib/pubid/cen_cenelec/builder.rb +330 -0
  171. data/lib/pubid/cen_cenelec/identifier.rb +52 -0
  172. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
  173. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
  174. data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
  175. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
  176. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
  177. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
  178. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
  179. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
  180. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
  181. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
  182. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
  183. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
  184. data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
  185. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
  186. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
  187. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
  188. data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
  189. data/lib/pubid/cen_cenelec/parser.rb +144 -0
  190. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  191. data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
  192. data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
  193. data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
  194. data/lib/pubid/cen_cenelec.rb +21 -0
  195. data/lib/pubid/cie/builder.rb +399 -0
  196. data/lib/pubid/cie/components/code.rb +72 -0
  197. data/lib/pubid/cie/components/language.rb +58 -0
  198. data/lib/pubid/cie/identifier.rb +71 -0
  199. data/lib/pubid/cie/identifiers/bundle.rb +20 -0
  200. data/lib/pubid/cie/identifiers/conference.rb +32 -0
  201. data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
  202. data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
  203. data/lib/pubid/cie/identifiers/identical.rb +64 -0
  204. data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
  205. data/lib/pubid/cie/identifiers/standard.rb +58 -0
  206. data/lib/pubid/cie/identifiers/supplement.rb +45 -0
  207. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
  208. data/lib/pubid/cie/identifiers.rb +17 -0
  209. data/lib/pubid/cie/parser.rb +347 -0
  210. data/lib/pubid/cie/scheme.rb +64 -0
  211. data/lib/pubid/cie/single_identifier.rb +30 -0
  212. data/lib/pubid/cie/supplement_identifier.rb +26 -0
  213. data/lib/pubid/cie/urn_generator.rb +123 -0
  214. data/lib/pubid/cie.rb +28 -0
  215. data/lib/pubid/components/code.rb +33 -0
  216. data/lib/pubid/components/date.rb +49 -0
  217. data/lib/pubid/components/edition.rb +32 -0
  218. data/lib/pubid/components/factory.rb +50 -0
  219. data/lib/pubid/components/language.rb +37 -0
  220. data/lib/pubid/components/locality.rb +10 -0
  221. data/lib/pubid/components/publisher.rb +36 -0
  222. data/lib/pubid/components/stage.rb +54 -0
  223. data/lib/pubid/components/type.rb +58 -0
  224. data/lib/pubid/components/typed_stage.rb +59 -0
  225. data/lib/pubid/components.rb +16 -0
  226. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  227. data/lib/pubid/core/update_codes.rb +77 -0
  228. data/lib/pubid/core.rb +8 -0
  229. data/lib/pubid/csa/builder.rb +671 -0
  230. data/lib/pubid/csa/components/code.rb +9 -0
  231. data/lib/pubid/csa/components.rb +9 -0
  232. data/lib/pubid/csa/composite_identifier.rb +27 -0
  233. data/lib/pubid/csa/identifier.rb +513 -0
  234. data/lib/pubid/csa/identifiers/base.rb +133 -0
  235. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  236. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  237. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  238. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  239. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  240. data/lib/pubid/csa/identifiers/package.rb +65 -0
  241. data/lib/pubid/csa/identifiers/series.rb +127 -0
  242. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  243. data/lib/pubid/csa/identifiers.rb +17 -0
  244. data/lib/pubid/csa/parser.rb +445 -0
  245. data/lib/pubid/csa/scheme.rb +44 -0
  246. data/lib/pubid/csa/single_identifier.rb +30 -0
  247. data/lib/pubid/csa/urn_generator.rb +80 -0
  248. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  249. data/lib/pubid/csa.rb +25 -0
  250. data/lib/pubid/etsi/builder.rb +133 -0
  251. data/lib/pubid/etsi/components/code.rb +42 -0
  252. data/lib/pubid/etsi/components/version.rb +37 -0
  253. data/lib/pubid/etsi/components.rb +10 -0
  254. data/lib/pubid/etsi/identifier.rb +57 -0
  255. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  256. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  257. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  258. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  259. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  260. data/lib/pubid/etsi/identifiers.rb +14 -0
  261. data/lib/pubid/etsi/parser.rb +133 -0
  262. data/lib/pubid/etsi/scheme.rb +42 -0
  263. data/lib/pubid/etsi/urn_generator.rb +76 -0
  264. data/lib/pubid/etsi.rb +21 -0
  265. data/lib/pubid/export/auditor.rb +89 -0
  266. data/lib/pubid/export/data_class_exporter.rb +59 -0
  267. data/lib/pubid/export/exporter.rb +74 -0
  268. data/lib/pubid/export/flavor_exporter.rb +402 -0
  269. data/lib/pubid/export/ieee_exporter.rb +78 -0
  270. data/lib/pubid/export/itu_exporter.rb +66 -0
  271. data/lib/pubid/export/nist_exporter.rb +64 -0
  272. data/lib/pubid/export/registry_exporter.rb +90 -0
  273. data/lib/pubid/export/result.rb +97 -0
  274. data/lib/pubid/export/scheme_exporter.rb +70 -0
  275. data/lib/pubid/export.rb +18 -0
  276. data/lib/pubid/format_detector.rb +16 -0
  277. data/lib/pubid/format_registry.rb +42 -0
  278. data/lib/pubid/identifier.rb +242 -0
  279. data/lib/pubid/identifier_metadata.rb +148 -0
  280. data/lib/pubid/identifier_registry.rb +198 -0
  281. data/lib/pubid/idf/builder.rb +82 -0
  282. data/lib/pubid/idf/identifier.rb +129 -0
  283. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  284. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  285. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  286. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  287. data/lib/pubid/idf/identifiers.rb +13 -0
  288. data/lib/pubid/idf/parser.rb +143 -0
  289. data/lib/pubid/idf/scheme.rb +61 -0
  290. data/lib/pubid/idf/single_identifier.rb +19 -0
  291. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  292. data/lib/pubid/idf/urn_generator.rb +84 -0
  293. data/lib/pubid/idf.rb +25 -0
  294. data/lib/pubid/iec/builder.rb +458 -0
  295. data/lib/pubid/iec/components/code.rb +60 -0
  296. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  297. data/lib/pubid/iec/components/publisher.rb +36 -0
  298. data/lib/pubid/iec/components/sheet.rb +32 -0
  299. data/lib/pubid/iec/components/trf_info.rb +38 -0
  300. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  301. data/lib/pubid/iec/identifier.rb +256 -0
  302. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  303. data/lib/pubid/iec/identifiers/base.rb +82 -0
  304. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  305. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  306. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +82 -0
  307. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  308. data/lib/pubid/iec/identifiers/fragment_identifier.rb +137 -0
  309. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  310. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  311. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  312. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  313. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  314. data/lib/pubid/iec/identifiers/sheet_identifier.rb +62 -0
  315. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  316. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  317. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  319. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  320. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  321. data/lib/pubid/iec/identifiers/vap_identifier.rb +73 -0
  322. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  323. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  324. data/lib/pubid/iec/parser.rb +417 -0
  325. data/lib/pubid/iec/rendering_style.rb +113 -0
  326. data/lib/pubid/iec/scheme.rb +71 -0
  327. data/lib/pubid/iec/single_identifier.rb +80 -0
  328. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  329. data/lib/pubid/iec/urn_generator.rb +79 -0
  330. data/lib/pubid/iec/urn_parser.rb +90 -0
  331. data/lib/pubid/iec.rb +85 -0
  332. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  333. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  334. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  335. data/lib/pubid/ieee/aiee.rb +11 -0
  336. data/lib/pubid/ieee/builder.rb +1237 -0
  337. data/lib/pubid/ieee/components/code.rb +102 -0
  338. data/lib/pubid/ieee/components/draft.rb +93 -0
  339. data/lib/pubid/ieee/components/relationship.rb +157 -0
  340. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  341. data/lib/pubid/ieee/identifier.rb +54 -0
  342. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  343. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  344. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  345. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  346. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  347. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  348. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  349. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  350. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  351. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  352. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  353. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  354. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  355. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  356. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  358. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  359. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  360. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  361. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  362. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  363. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  364. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  365. data/lib/pubid/ieee/identifiers.rb +33 -0
  366. data/lib/pubid/ieee/ire/builder.rb +61 -0
  367. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  368. data/lib/pubid/ieee/ire/parser.rb +91 -0
  369. data/lib/pubid/ieee/ire.rb +11 -0
  370. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  371. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  372. data/lib/pubid/ieee/nesc.rb +10 -0
  373. data/lib/pubid/ieee/parser.rb +1226 -0
  374. data/lib/pubid/ieee/scheme.rb +90 -0
  375. data/lib/pubid/ieee/typed_stages.rb +172 -0
  376. data/lib/pubid/ieee/urn_generator.rb +188 -0
  377. data/lib/pubid/ieee.rb +32 -0
  378. data/lib/pubid/ieee_debug.rb +31 -0
  379. data/lib/pubid/iho/builder.rb +37 -0
  380. data/lib/pubid/iho/identifier.rb +61 -0
  381. data/lib/pubid/iho/identifiers/base.rb +41 -0
  382. data/lib/pubid/iho/identifiers/bibliographic.rb +16 -0
  383. data/lib/pubid/iho/identifiers/circular_letter.rb +15 -0
  384. data/lib/pubid/iho/identifiers/miscellaneous.rb +16 -0
  385. data/lib/pubid/iho/identifiers/publication.rb +15 -0
  386. data/lib/pubid/iho/identifiers/standard.rb +15 -0
  387. data/lib/pubid/iho/identifiers.rb +14 -0
  388. data/lib/pubid/iho/parser.rb +68 -0
  389. data/lib/pubid/iho/scheme.rb +29 -0
  390. data/lib/pubid/iho/urn_generator.rb +29 -0
  391. data/lib/pubid/iho.rb +21 -0
  392. data/lib/pubid/iso/builder.rb +309 -0
  393. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  394. data/lib/pubid/iso/combined_identifier.rb +22 -0
  395. data/lib/pubid/iso/components/code.rb +36 -0
  396. data/lib/pubid/iso/components/publisher.rb +60 -0
  397. data/lib/pubid/iso/components.rb +12 -0
  398. data/lib/pubid/iso/format_resolver.rb +45 -0
  399. data/lib/pubid/iso/identifier.rb +330 -0
  400. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  401. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  402. data/lib/pubid/iso/identifiers/base.rb +115 -0
  403. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  404. data/lib/pubid/iso/identifiers/data.rb +76 -0
  405. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  406. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  407. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  408. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  409. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  410. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  411. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  412. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  413. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  414. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  415. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  416. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  417. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  418. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  419. data/lib/pubid/iso/identifiers.rb +33 -0
  420. data/lib/pubid/iso/parser.rb +512 -0
  421. data/lib/pubid/iso/rendering_style.rb +120 -0
  422. data/lib/pubid/iso/scheme.rb +193 -0
  423. data/lib/pubid/iso/single_identifier.rb +64 -0
  424. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  425. data/lib/pubid/iso/urn_generator.rb +426 -0
  426. data/lib/pubid/iso/urn_parser.rb +437 -0
  427. data/lib/pubid/iso/utilities.rb +86 -0
  428. data/lib/pubid/iso.rb +50 -0
  429. data/lib/pubid/itu/builder.rb +171 -0
  430. data/lib/pubid/itu/components/code.rb +39 -0
  431. data/lib/pubid/itu/components/sector.rb +35 -0
  432. data/lib/pubid/itu/components/series.rb +29 -0
  433. data/lib/pubid/itu/i18n.rb +9 -0
  434. data/lib/pubid/itu/i18n.yaml +30 -0
  435. data/lib/pubid/itu/identifier.rb +118 -0
  436. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  437. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  438. data/lib/pubid/itu/identifiers/base.rb +154 -0
  439. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  440. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  441. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  442. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  443. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  444. data/lib/pubid/itu/identifiers.rb +16 -0
  445. data/lib/pubid/itu/model.rb +111 -0
  446. data/lib/pubid/itu/parser.rb +225 -0
  447. data/lib/pubid/itu/scheme.rb +174 -0
  448. data/lib/pubid/itu/urn_generator.rb +105 -0
  449. data/lib/pubid/itu.rb +22 -0
  450. data/lib/pubid/jcgm/builder.rb +88 -0
  451. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  452. data/lib/pubid/jcgm/components.rb +9 -0
  453. data/lib/pubid/jcgm/identifier.rb +54 -0
  454. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  455. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  456. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  457. data/lib/pubid/jcgm/identifiers.rb +11 -0
  458. data/lib/pubid/jcgm/parser.rb +84 -0
  459. data/lib/pubid/jcgm/scheme.rb +60 -0
  460. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  461. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  462. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  463. data/lib/pubid/jcgm.rb +31 -0
  464. data/lib/pubid/jis/builder.rb +124 -0
  465. data/lib/pubid/jis/components/code.rb +59 -0
  466. data/lib/pubid/jis/components.rb +9 -0
  467. data/lib/pubid/jis/identifier.rb +61 -0
  468. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  469. data/lib/pubid/jis/identifiers/base.rb +72 -0
  470. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  471. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  472. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  473. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  474. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  475. data/lib/pubid/jis/identifiers.rb +17 -0
  476. data/lib/pubid/jis/parser.rb +109 -0
  477. data/lib/pubid/jis/scheme.rb +49 -0
  478. data/lib/pubid/jis/single_identifier.rb +37 -0
  479. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  480. data/lib/pubid/jis/urn_generator.rb +25 -0
  481. data/lib/pubid/jis.rb +23 -0
  482. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  483. data/lib/pubid/nist/builder.rb +2269 -0
  484. data/lib/pubid/nist/components/code.rb +38 -0
  485. data/lib/pubid/nist/components/edition.rb +134 -0
  486. data/lib/pubid/nist/components/issue_number.rb +28 -0
  487. data/lib/pubid/nist/components/part.rb +77 -0
  488. data/lib/pubid/nist/components/publisher.rb +24 -0
  489. data/lib/pubid/nist/components/stage.rb +53 -0
  490. data/lib/pubid/nist/components/supplement.rb +188 -0
  491. data/lib/pubid/nist/components/translation.rb +42 -0
  492. data/lib/pubid/nist/components/update.rb +103 -0
  493. data/lib/pubid/nist/components/version.rb +35 -0
  494. data/lib/pubid/nist/components/volume.rb +32 -0
  495. data/lib/pubid/nist/components.rb +19 -0
  496. data/lib/pubid/nist/configuration.rb +77 -0
  497. data/lib/pubid/nist/identifier.rb +62 -0
  498. data/lib/pubid/nist/identifiers/base.rb +578 -0
  499. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  500. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  501. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  502. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  503. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  504. data/lib/pubid/nist/identifiers/crpl_report.rb +132 -0
  505. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +104 -0
  506. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  507. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  508. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  509. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  510. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  511. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  512. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  513. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  514. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  515. data/lib/pubid/nist/identifiers/report.rb +67 -0
  516. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  517. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  518. data/lib/pubid/nist/identifiers.rb +33 -0
  519. data/lib/pubid/nist/parser.rb +1117 -0
  520. data/lib/pubid/nist/scheme.rb +199 -0
  521. data/lib/pubid/nist/supplement_identifier.rb +67 -0
  522. data/lib/pubid/nist/urn_generator.rb +133 -0
  523. data/lib/pubid/nist.rb +37 -0
  524. data/lib/pubid/oiml/builder.rb +189 -0
  525. data/lib/pubid/oiml/components/code.rb +20 -0
  526. data/lib/pubid/oiml/components.rb +9 -0
  527. data/lib/pubid/oiml/identifier.rb +61 -0
  528. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  529. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  530. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  531. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  536. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  537. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  538. data/lib/pubid/oiml/identifiers.rb +18 -0
  539. data/lib/pubid/oiml/parser.rb +173 -0
  540. data/lib/pubid/oiml/scheme.rb +46 -0
  541. data/lib/pubid/oiml/single_identifier.rb +90 -0
  542. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  543. data/lib/pubid/oiml/urn_generator.rb +64 -0
  544. data/lib/pubid/oiml.rb +26 -0
  545. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  546. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  547. data/lib/pubid/parser.rb +8 -0
  548. data/lib/pubid/parsers/base.rb +11 -0
  549. data/lib/pubid/parsers/mr_string.rb +93 -0
  550. data/lib/pubid/plateau/builder.rb +50 -0
  551. data/lib/pubid/plateau/identifier.rb +57 -0
  552. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  553. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  554. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  555. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  556. data/lib/pubid/plateau/identifiers.rb +12 -0
  557. data/lib/pubid/plateau/parser.rb +63 -0
  558. data/lib/pubid/plateau/scheme.rb +45 -0
  559. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  560. data/lib/pubid/plateau/urn_generator.rb +29 -0
  561. data/lib/pubid/plateau.rb +26 -0
  562. data/lib/pubid/renderers/base.rb +53 -0
  563. data/lib/pubid/renderers/directives_renderer.rb +61 -0
  564. data/lib/pubid/renderers/guide_renderer.rb +24 -0
  565. data/lib/pubid/renderers/human_readable.rb +70 -0
  566. data/lib/pubid/renderers/iwa_renderer.rb +20 -0
  567. data/lib/pubid/renderers/mr_string.rb +16 -0
  568. data/lib/pubid/renderers/supplement_renderer.rb +36 -0
  569. data/lib/pubid/renderers/urn.rb +11 -0
  570. data/lib/pubid/renderers.rb +14 -0
  571. data/lib/pubid/rendering/base.rb +73 -0
  572. data/lib/pubid/rendering/common.rb +211 -0
  573. data/lib/pubid/rendering/context.rb +159 -0
  574. data/lib/pubid/rendering/date.rb +27 -0
  575. data/lib/pubid/rendering/format.rb +25 -0
  576. data/lib/pubid/rendering/language.rb +21 -0
  577. data/lib/pubid/rendering/numbering.rb +24 -0
  578. data/lib/pubid/rendering/publisher.rb +25 -0
  579. data/lib/pubid/rendering/stage.rb +38 -0
  580. data/lib/pubid/rendering/supplement.rb +46 -0
  581. data/lib/pubid/rendering.rb +16 -0
  582. data/lib/pubid/sae/builder.rb +32 -0
  583. data/lib/pubid/sae/components/code.rb +9 -0
  584. data/lib/pubid/sae/components/date.rb +19 -0
  585. data/lib/pubid/sae/components/type.rb +19 -0
  586. data/lib/pubid/sae/components.rb +11 -0
  587. data/lib/pubid/sae/identifier.rb +37 -0
  588. data/lib/pubid/sae/identifiers/base.rb +42 -0
  589. data/lib/pubid/sae/identifiers.rb +9 -0
  590. data/lib/pubid/sae/parser.rb +55 -0
  591. data/lib/pubid/sae/scheme.rb +47 -0
  592. data/lib/pubid/sae/urn_generator.rb +38 -0
  593. data/lib/pubid/sae.rb +19 -0
  594. data/lib/pubid/scheme.rb +219 -0
  595. data/lib/pubid/urn_generator/base.rb +110 -0
  596. data/lib/pubid/utils/string_normalizer.rb +196 -0
  597. data/lib/pubid/utils.rb +7 -0
  598. data/lib/pubid/version.rb +3 -1
  599. data/lib/pubid.rb +137 -13
  600. data/lib/tasks/docs.rake +37 -0
  601. data/lib/tasks/export.rake +38 -0
  602. data/lib/tasks/website-data.json +7488 -0
  603. metadata +616 -171
  604. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Csa
7
+ module Identifiers
8
+ class Bundled < Lutaml::Model::Serializable
9
+ attribute :base, Standard
10
+ attribute :bundled_with, Standard, collection: true
11
+ attribute :reaffirmation, :string
12
+ attribute :original_reaffirmation_4digit, :boolean, default: -> {
13
+ false
14
+ }
15
+ attribute :year_format, :string # Add for compatibility with identifier.rb
16
+
17
+ def to_s
18
+ # For Cec identifiers, use normalized form (code instead of cec_part + NO.)
19
+ # This is used for "normalized form" rendering in bundled identifiers
20
+ if base.is_a?(Cec)
21
+ # Render base with normalized code format
22
+ prefix = base.publisher_prefix || "CSA"
23
+ needs_space = !prefix.end_with?("-")
24
+ # Convert 4-digit year back to 2-digit for display
25
+ year_display = if base.year
26
+ year_str = base.year.to_s
27
+ if year_str.length == 4 && year_str.start_with?("20")
28
+ year_str[2..3]
29
+ else
30
+ year_str
31
+ end
32
+ end
33
+ base_str = (needs_space ? "#{prefix} " : prefix) +
34
+ base.code.value.to_s + # Use normalized code (e.g., "C22.2-1")
35
+ ":#{year_display}"
36
+ parts = [base_str]
37
+ else
38
+ # Standard rendering for other identifier types
39
+ parts = [base.to_s]
40
+ end
41
+
42
+ # Add bundled amendments/supplements (without CSA prefix)
43
+ if bundled_with && !bundled_with.empty?
44
+ bundled_with.each do |bundled|
45
+ # For Cec identifiers, use normalized code format
46
+ if bundled.is_a?(Cec)
47
+ bundled_part = bundled.code.value.to_s # Normalized code (e.g., "C22.2-2")
48
+ if bundled.year
49
+ # Use dash if year_format is dash, otherwise colon
50
+ separator = bundled.year_format == "dash" ? "-" : ":"
51
+ bundled_part += separator
52
+ bundled_part += bundled.year_prefix if bundled.year_prefix # Add M or F prefix
53
+ bundled_part += "F" if bundled.french && bundled.year_format != "dash" && !bundled.year_prefix
54
+ # Convert 4-digit year back to 2-digit
55
+ year_str = bundled.year.to_s
56
+ bundled_part += if year_str.length == 4 && year_str.start_with?("20")
57
+ year_str[2..3]
58
+ else
59
+ year_str
60
+ end
61
+ end
62
+ else
63
+ # Standard rendering for other identifier types
64
+ bundled_part = ""
65
+ bundled_part += bundled.code.to_s if bundled.code
66
+
67
+ if bundled.year
68
+ # Use dash if year_format is dash, otherwise colon
69
+ separator = bundled.year_format == "dash" ? "-" : ":"
70
+ bundled_part += separator
71
+ bundled_part += bundled.year_prefix if bundled.year_prefix # Add M or F prefix
72
+ bundled_part += "F" if bundled.french && bundled.year_format != "dash" && !bundled.year_prefix # Only add F if no prefix
73
+ # Convert 4-digit year back to 2-digit
74
+ # Use original_year_4digit flag to determine original format
75
+ year_str = bundled.year.to_s
76
+ bundled_part += if bundled.class.attributes.key?(:original_year_4digit) && bundled.original_year_4digit
77
+ # Preserve 4-digit format
78
+ year_str
79
+ elsif year_str.length == 4 && year_str.start_with?("20")
80
+ # 2000s → convert to 2-digit
81
+ year_str[2..3]
82
+ elsif year_str.length == 4 && year_str.start_with?("19") && bundled.class.attributes.key?(:original_year_4digit) && !bundled.original_year_4digit
83
+ # 1900s with no M/F prefix, but original was 2-digit (e.g., bundled identifier)
84
+ # Convert back to 2-digit
85
+ year_str[2..3]
86
+ else
87
+ # Other formats - keep as-is
88
+ year_str
89
+ end
90
+ end
91
+ end
92
+
93
+ parts << bundled_part
94
+ end
95
+ end
96
+
97
+ result = parts.join(" + ")
98
+
99
+ # Reaffirmation - preserve original format and determine spacing
100
+ if reaffirmation
101
+ # For bundled identifiers, check year format from base identifier
102
+ # to determine spacing
103
+ year_was_2digit = base.class.attributes.key?(:original_year_4digit) && !base.original_year_4digit
104
+
105
+ # Check if reaffirmation was originally 4-digit
106
+ # Note: We need to track this at the Bundled level, but for now
107
+ # assume 4-digit if the value is 4 digits and starts with 19/20
108
+ reaffirmation_was_4digit = reaffirmation.to_s.length == 4 &&
109
+ reaffirmation.to_s.start_with?("19", "20")
110
+
111
+ # Determine spacing based on original formats
112
+ # Space needed if year is 2-digit and reaffirmation is 4-digit
113
+ result += if year_was_2digit && reaffirmation_was_4digit
114
+ " (R#{reaffirmation})"
115
+ else
116
+ "(R#{reaffirmation})"
117
+ end
118
+ end
119
+
120
+ result
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Csa
5
+ module Identifiers
6
+ # CanadianAdoptedIdentifier represents Canadian adoption of standards
7
+ # indicated by the CAN/ prefix wrapper.
8
+ #
9
+ # Examples:
10
+ # CAN/CSA-C22.2 NO. 60601-1-9:15
11
+ # CAN/CSA-Z662:23 (R2024)
12
+ #
13
+ # This is a wrapper pattern where:
14
+ # - CAN/ indicates Canadian adoption
15
+ # - The wrapped_identifier is the actual CSA standard being adopted
16
+ #
17
+ # This is semantically different from a string prefix because:
18
+ # - CAN/ wraps an entire identifier (which may itself be complex)
19
+ # - The wrapped identifier is recursively parsed as a full CSA identifier
20
+ # - Proper object composition, not string manipulation
21
+ class CanadianAdopted < WrapperIdentifier
22
+ def to_s
23
+ # For CAN3- identifiers, don't add CAN/ prefix (CAN3- is already complete)
24
+ # For Series with CAN/CSA- prefix, don't add CAN/ (it's already complete)
25
+ # For CAN/CSA- identifiers, CAN/ wraps CSA- part
26
+ if wrapped_identifier.class.attributes.key?(:publisher_prefix) && wrapped_identifier.publisher_prefix
27
+ prefix = wrapped_identifier.publisher_prefix
28
+ # CAN3- is standalone, just render wrapped identifier
29
+ # CAN/CSA- is already complete for Series identifiers
30
+ if prefix == "CAN3-" || (prefix == "CAN/CSA-" && wrapped_identifier.is_a?(Identifiers::Series))
31
+ result = wrapped_identifier.to_s
32
+ else
33
+ # For other cases, prepend CAN/ prefix
34
+ result = "CAN/#{wrapped_identifier}"
35
+ end
36
+ else
37
+ # No publisher_prefix, prepend CAN/
38
+ result = "CAN/#{wrapped_identifier}"
39
+ end
40
+ # Only add reaffirmation from wrapper if wrapped_identifier doesn't have one
41
+ # (to avoid duplicates - Identifier.parse sets it on both)
42
+ if reaffirmation && !(wrapped_identifier.class.attributes.key?(:reaffirmation) && wrapped_identifier.reaffirmation)
43
+ # Determine if space is needed before reaffirmation
44
+ # Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
45
+ # No space if both year and reaffirmation are 2-digit
46
+ # Check original_year_4digit flag - if false, year was originally 2-digit
47
+ year_was_2digit = wrapped_identifier.class.attributes.key?(:original_year_4digit) &&
48
+ !wrapped_identifier.original_year_4digit
49
+ # Check original_reaffirmation_4digit flag
50
+ reaffirmation_was_4digit = original_reaffirmation_4digit
51
+
52
+ # Preserve original reaffirmation format
53
+ # If original was 4-digit, keep as 4-digit
54
+ # If original was 2-digit, convert from 4-digit storage back to 2-digit
55
+ reaffirmation_str = if reaffirmation_was_4digit
56
+ # Original was 4-digit, keep as-is
57
+ reaffirmation.to_s
58
+ elsif reaffirmation.to_s.length == 4 && reaffirmation.to_s.start_with?(
59
+ "19", "20"
60
+ )
61
+ # Original was 2-digit, convert 4-digit storage back to 2-digit
62
+ # (R2004) → (R04), (R1994) → (R94)
63
+ reaffirmation.to_s[2..3]
64
+ else
65
+ # Already 2-digit or other format
66
+ reaffirmation.to_s
67
+ end
68
+
69
+ if year_was_2digit && reaffirmation_was_4digit
70
+ # Year was 2-digit, reaffirmation was 4-digit → add space
71
+ result += " (R#{reaffirmation_str})"
72
+ else
73
+ # Both 2-digit or other cases → no space
74
+ result += "(R#{reaffirmation_str})"
75
+ end
76
+ end
77
+ result
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Csa
5
+ module Identifiers
6
+ # Canadian Electrical Code (CEC) identifier
7
+ # Pattern: CSA C22.{2,3,4,6} NO. {number}:{year}
8
+ # Examples: CSA C22.2 NO. 286:23, CSA C22.3 NO. 7:20
9
+ #
10
+ # The "NO." indicates a numbered standard within the C22.x series
11
+ # and must be preserved (not normalized) as a semantic component.
12
+ class Cec < SingleIdentifier
13
+ attribute :cec_part, Components::Code # C22.2, C22.3, C22.4, C22.6
14
+ attribute :no_number, Components::Code # Number after NO.
15
+
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
20
+
21
+ @code ||= Components::Code.new(value: "#{cec_part.value}-#{no_number.value}")
22
+ end
23
+
24
+ def to_s
25
+ parts = []
26
+
27
+ # Publisher prefix (CSA, CAN/CSA-, CAN3-)
28
+ prefix = publisher_prefix || "CSA"
29
+
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
123
+
124
+ result
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Csa
7
+ module Identifiers
8
+ # CombinedIdentifier represents CSA identifiers combined with "/" separator
9
+ # Examples:
10
+ # CSA A23.1:24/CSA A23.2:24
11
+ # CSA N285.0:23/CSA N285.6 SERIES:23
12
+ # CSA A123.1-05/A123.5-05 (R2015)
13
+ # CSA B44:19/B44.1:19/B44.2:19 (triple combined)
14
+ class Combined < Lutaml::Model::Serializable
15
+ attribute :first, Standard
16
+ attribute :second, Standard
17
+ attribute :third, Standard
18
+ attribute :reaffirmation, :string
19
+ attribute :original_reaffirmation_4digit, :boolean, default: -> {
20
+ false
21
+ }
22
+ attribute :package, :string
23
+ attribute :year_format, :string # Dummy for compatibility
24
+ attribute :separator, :string, default: -> { "/" } # "/" or ", "
25
+
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
+
40
+ result = parts.join(separator || "/")
41
+
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
62
+
63
+ result += package if package
64
+ result
65
+ end
66
+
67
+ private
68
+
69
+ # Render identifier without CSA prefix (unless has_publisher is true)
70
+ def render_continuation(identifier)
71
+ parts = []
72
+
73
+ # Add CSA prefix if present in original
74
+ if identifier.has_publisher
75
+ prefix = identifier.publisher_prefix || "CSA"
76
+ !prefix.end_with?("-")
77
+ parts << prefix
78
+ end
79
+
80
+ code_part = identifier.code.to_s if identifier.code
81
+
82
+ # NO. keyword
83
+ if identifier.no_number
84
+ code_part += " NO. #{identifier.no_number}"
85
+ end
86
+
87
+ # Series prefix and keyword (before year)
88
+ if identifier.series_prefix
89
+ code_part += " #{identifier.series_prefix} SERIES"
90
+ elsif identifier.series
91
+ # SERIES without prefix
92
+ code_part += " SERIES"
93
+ end
94
+
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
109
+ end
110
+
111
+ parts << code_part if code_part
112
+
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
123
+ else
124
+ parts.join(" ")
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Csa
5
+ module Identifiers
6
+ # CsaAdoptedIdentifier represents CSA adoption of international standards
7
+ # (ISO, IEC, ISO/IEC, CISPR, etc.)
8
+ #
9
+ # Examples:
10
+ # CSA ISO/IEC TR 12785-3:15
11
+ # CSA ISO/IEC TR 19758:04 (R2024)
12
+ # CSA CISPR 16-1-1:18
13
+ # CSA-ISO 10012:03 (when wrapped by CanadianAdopted)
14
+ #
15
+ # Key difference from CanadianAdopted:
16
+ # - CsaAdopted wraps ISO/IEC/CISPR standards (external)
17
+ # - CanadianAdopted wraps CSA standards (internal)
18
+ #
19
+ # This is a wrapper pattern where:
20
+ # - CSA prefix indicates adoption
21
+ # - The wrapped_identifier is the external standard (ISO/IEC/CISPR)
22
+ # - Wrapped identifier is recursively parsed using external flavor parsers
23
+ class CsaAdopted < WrapperIdentifier
24
+ # Publisher prefix (e.g., "CSA-", "CAN3-") for rendering
25
+ # When set, uses dash format without space (e.g., "CSA-ISO" not "CSA ISO")
26
+ attribute :publisher_prefix, :string
27
+
28
+ def to_s
29
+ # Get string representation from wrapped identifier
30
+ base_str = wrapped_identifier.to_s
31
+
32
+ # Convert 4-digit years to 2-digit for CSA adoption format
33
+ # ISO/IEC TR 12785-3:2015 → ISO/IEC TR 12785-3:15
34
+ # Also handle amendment years: /Amd 1:2022 → /A1:22
35
+ if base_str =~ /:(\d{4})\b/
36
+ year = $1
37
+ if year.start_with?("20")
38
+ short_year = year[2..3]
39
+ base_str = base_str.sub(":#{year}", ":#{short_year}")
40
+ elsif year.start_with?("19")
41
+ # Handle 1900s years: 1998 → 98
42
+ short_year = year[2..3]
43
+ base_str = base_str.sub(":#{year}", ":#{short_year}")
44
+ end
45
+ end
46
+
47
+ # Convert ISO/IEC amendment format to CSA format
48
+ # /Amd 1:22 → /A1:22, /Amd 1-22 → /A1-22
49
+ # Handle both 2-digit and 4-digit years
50
+ base_str = base_str.gsub(%r{/Amd\s+(\d+)([:/-])(\d{2,4})\b}) do |_match|
51
+ amendment_num = $1
52
+ separator = $2
53
+ amend_year = $3
54
+ # Convert 4-digit year to 2-digit if needed
55
+ if amend_year.length == 4 && amend_year.start_with?("20", "19")
56
+ amend_year = amend_year[2..3]
57
+ end
58
+ "/A#{amendment_num}#{separator}#{amend_year}"
59
+ end
60
+
61
+ # Apply publisher prefix format
62
+ # If publisher_prefix is "CSA-", render as "CSA-ISO..." (no space)
63
+ # Otherwise render as "CSA ISO..." (with space)
64
+ result = if publisher_prefix&.end_with?("-")
65
+ "#{publisher_prefix}#{base_str}"
66
+ else
67
+ "CSA #{base_str}"
68
+ end
69
+
70
+ # Append reaffirmation if present
71
+ result += " (R#{reaffirmation})" if reaffirmation
72
+
73
+ result
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Csa
5
+ module Identifiers
6
+ # PackageIdentifier represents CSA standards sold as packages
7
+ # with additional materials (PDF, print, addenda, etc.)
8
+ #
9
+ # Examples:
10
+ # CSA Z662:23 PACKAGE INCLUDES: +1 (PDF & ESA)
11
+ # CSA B149.1:20 PACKAGE (PDF + PRINT)
12
+ # CSA C22.2 NO. 60601-1:15 PACKAGE WITH ADDENDUM
13
+ #
14
+ # This is a composite pattern where:
15
+ # - base_identifier is the core CSA standard (recursively parsed)
16
+ # - package_materials describes what's included in the package
17
+ # - Package portion is metadata, not a parseable identifier
18
+ #
19
+ # Difference from BundledIdentifier:
20
+ # - Package: Single base + materials metadata
21
+ # - Bundled: Multiple identifiers consolidated together
22
+ class Package < CompositeIdentifier
23
+ # Package materials/contents description
24
+ # Examples: "INCLUDES: +1 (PDF & ESA)", "(PDF + PRINT)", "WITH ADDENDUM"
25
+ attribute :package_materials, :string
26
+
27
+ # Package keyword variant (for future extensibility)
28
+ # Usually "PACKAGE" but could be variations
29
+ attribute :package_keyword, :string
30
+
31
+ # Track whether materials come before or after PACKAGE keyword
32
+ # true = materials AFTER: "CSA Z662:23 PACKAGE INCLUDES: +1"
33
+ # false = materials BEFORE: "CSA B149.1:25 Code, Handbook & Training Package"
34
+ attribute :materials_after_keyword, :boolean, default: -> { true }
35
+
36
+ def to_s
37
+ result = base_identifier.to_s
38
+
39
+ # Add package materials if present
40
+ if package_materials && !package_materials.empty?
41
+ if materials_after_keyword
42
+ # Format: {base} PACKAGE {materials}
43
+ result += " PACKAGE"
44
+ result += " #{package_materials}"
45
+ elsif package_materials.match?(/\sPACKAGE\s*$/i)
46
+ # Format: {base} {materials} PACKAGE
47
+ # Check if materials already end with "Package" (to preserve exact capitalization)
48
+ # Materials already include the Package suffix
49
+ result += " #{package_materials}"
50
+ else
51
+ # Add Package suffix (use the package_keyword value)
52
+ result += " #{package_materials}"
53
+ result += " #{package_keyword}"
54
+ end
55
+ else
56
+ # No materials, just add PACKAGE keyword
57
+ result += " PACKAGE"
58
+ end
59
+
60
+ result
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end