pubid 1.15.19 → 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 (601) 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 +87 -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 +18 -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 +13 -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 +21 -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 +18 -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 +15 -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 +15 -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 +27 -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 +16 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +78 -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 +74 -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 +15 -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 +18 -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/language.rb +37 -0
  219. data/lib/pubid/components/locality.rb +10 -0
  220. data/lib/pubid/components/publisher.rb +36 -0
  221. data/lib/pubid/components/stage.rb +54 -0
  222. data/lib/pubid/components/type.rb +58 -0
  223. data/lib/pubid/components/typed_stage.rb +55 -0
  224. data/lib/pubid/components.rb +15 -0
  225. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  226. data/lib/pubid/core/update_codes.rb +77 -0
  227. data/lib/pubid/core.rb +8 -0
  228. data/lib/pubid/csa/builder.rb +671 -0
  229. data/lib/pubid/csa/components/code.rb +9 -0
  230. data/lib/pubid/csa/components.rb +9 -0
  231. data/lib/pubid/csa/composite_identifier.rb +27 -0
  232. data/lib/pubid/csa/identifier.rb +457 -0
  233. data/lib/pubid/csa/identifiers/base.rb +133 -0
  234. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  235. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  236. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  237. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  238. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  239. data/lib/pubid/csa/identifiers/package.rb +65 -0
  240. data/lib/pubid/csa/identifiers/series.rb +127 -0
  241. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  242. data/lib/pubid/csa/identifiers.rb +17 -0
  243. data/lib/pubid/csa/parser.rb +445 -0
  244. data/lib/pubid/csa/scheme.rb +44 -0
  245. data/lib/pubid/csa/single_identifier.rb +30 -0
  246. data/lib/pubid/csa/urn_generator.rb +80 -0
  247. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  248. data/lib/pubid/csa.rb +25 -0
  249. data/lib/pubid/etsi/builder.rb +133 -0
  250. data/lib/pubid/etsi/components/code.rb +42 -0
  251. data/lib/pubid/etsi/components/version.rb +37 -0
  252. data/lib/pubid/etsi/components.rb +10 -0
  253. data/lib/pubid/etsi/identifier.rb +14 -0
  254. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  255. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  256. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  257. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  258. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  259. data/lib/pubid/etsi/identifiers.rb +14 -0
  260. data/lib/pubid/etsi/parser.rb +133 -0
  261. data/lib/pubid/etsi/scheme.rb +42 -0
  262. data/lib/pubid/etsi/urn_generator.rb +76 -0
  263. data/lib/pubid/etsi.rb +21 -0
  264. data/lib/pubid/export/auditor.rb +89 -0
  265. data/lib/pubid/export/data_class_exporter.rb +59 -0
  266. data/lib/pubid/export/exporter.rb +74 -0
  267. data/lib/pubid/export/flavor_exporter.rb +402 -0
  268. data/lib/pubid/export/ieee_exporter.rb +78 -0
  269. data/lib/pubid/export/itu_exporter.rb +66 -0
  270. data/lib/pubid/export/nist_exporter.rb +64 -0
  271. data/lib/pubid/export/registry_exporter.rb +90 -0
  272. data/lib/pubid/export/result.rb +97 -0
  273. data/lib/pubid/export/scheme_exporter.rb +70 -0
  274. data/lib/pubid/export.rb +18 -0
  275. data/lib/pubid/format_detector.rb +16 -0
  276. data/lib/pubid/format_registry.rb +42 -0
  277. data/lib/pubid/identifier.rb +235 -0
  278. data/lib/pubid/identifier_metadata.rb +148 -0
  279. data/lib/pubid/identifier_registry.rb +198 -0
  280. data/lib/pubid/idf/builder.rb +82 -0
  281. data/lib/pubid/idf/identifier.rb +69 -0
  282. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  283. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  284. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  285. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  286. data/lib/pubid/idf/identifiers.rb +13 -0
  287. data/lib/pubid/idf/parser.rb +143 -0
  288. data/lib/pubid/idf/scheme.rb +61 -0
  289. data/lib/pubid/idf/single_identifier.rb +19 -0
  290. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  291. data/lib/pubid/idf/urn_generator.rb +84 -0
  292. data/lib/pubid/idf.rb +25 -0
  293. data/lib/pubid/iec/builder.rb +457 -0
  294. data/lib/pubid/iec/components/code.rb +59 -0
  295. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  296. data/lib/pubid/iec/components/publisher.rb +35 -0
  297. data/lib/pubid/iec/components/sheet.rb +32 -0
  298. data/lib/pubid/iec/components/trf_info.rb +38 -0
  299. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  300. data/lib/pubid/iec/identifier.rb +21 -0
  301. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  302. data/lib/pubid/iec/identifiers/base.rb +78 -0
  303. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  304. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  305. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +86 -0
  306. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  307. data/lib/pubid/iec/identifiers/fragment_identifier.rb +141 -0
  308. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  309. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  310. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  311. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  312. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  313. data/lib/pubid/iec/identifiers/sheet_identifier.rb +66 -0
  314. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  315. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  316. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  317. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  319. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  320. data/lib/pubid/iec/identifiers/vap_identifier.rb +77 -0
  321. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  322. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  323. data/lib/pubid/iec/parser.rb +412 -0
  324. data/lib/pubid/iec/rendering_style.rb +113 -0
  325. data/lib/pubid/iec/scheme.rb +71 -0
  326. data/lib/pubid/iec/single_identifier.rb +80 -0
  327. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  328. data/lib/pubid/iec/urn_generator.rb +193 -0
  329. data/lib/pubid/iec/urn_parser.rb +289 -0
  330. data/lib/pubid/iec.rb +85 -0
  331. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  332. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  333. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  334. data/lib/pubid/ieee/aiee.rb +11 -0
  335. data/lib/pubid/ieee/builder.rb +1237 -0
  336. data/lib/pubid/ieee/components/code.rb +102 -0
  337. data/lib/pubid/ieee/components/draft.rb +93 -0
  338. data/lib/pubid/ieee/components/relationship.rb +157 -0
  339. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  340. data/lib/pubid/ieee/identifier.rb +13 -0
  341. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  342. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  343. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  344. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  345. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  346. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  347. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  348. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  349. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  350. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  351. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  352. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  353. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  354. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  355. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  356. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  358. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  359. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  360. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  361. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  362. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  363. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  364. data/lib/pubid/ieee/identifiers.rb +33 -0
  365. data/lib/pubid/ieee/ire/builder.rb +61 -0
  366. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  367. data/lib/pubid/ieee/ire/parser.rb +91 -0
  368. data/lib/pubid/ieee/ire.rb +11 -0
  369. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  370. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  371. data/lib/pubid/ieee/nesc.rb +10 -0
  372. data/lib/pubid/ieee/parser.rb +1226 -0
  373. data/lib/pubid/ieee/scheme.rb +90 -0
  374. data/lib/pubid/ieee/typed_stages.rb +172 -0
  375. data/lib/pubid/ieee/urn_generator.rb +188 -0
  376. data/lib/pubid/ieee.rb +32 -0
  377. data/lib/pubid/ieee_debug.rb +31 -0
  378. data/lib/pubid/iho/builder.rb +37 -0
  379. data/lib/pubid/iho/identifier.rb +19 -0
  380. data/lib/pubid/iho/identifiers/base.rb +41 -0
  381. data/lib/pubid/iho/identifiers/bibliographic.rb +20 -0
  382. data/lib/pubid/iho/identifiers/circular_letter.rb +19 -0
  383. data/lib/pubid/iho/identifiers/miscellaneous.rb +20 -0
  384. data/lib/pubid/iho/identifiers/publication.rb +19 -0
  385. data/lib/pubid/iho/identifiers/standard.rb +19 -0
  386. data/lib/pubid/iho/identifiers.rb +14 -0
  387. data/lib/pubid/iho/parser.rb +68 -0
  388. data/lib/pubid/iho/scheme.rb +29 -0
  389. data/lib/pubid/iho/urn_generator.rb +29 -0
  390. data/lib/pubid/iho.rb +21 -0
  391. data/lib/pubid/iso/builder.rb +305 -0
  392. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  393. data/lib/pubid/iso/combined_identifier.rb +22 -0
  394. data/lib/pubid/iso/components/code.rb +36 -0
  395. data/lib/pubid/iso/components/publisher.rb +60 -0
  396. data/lib/pubid/iso/components.rb +12 -0
  397. data/lib/pubid/iso/format_resolver.rb +45 -0
  398. data/lib/pubid/iso/identifier.rb +69 -0
  399. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  400. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  401. data/lib/pubid/iso/identifiers/base.rb +115 -0
  402. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  403. data/lib/pubid/iso/identifiers/data.rb +76 -0
  404. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  405. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  406. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  407. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  408. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  409. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  410. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  411. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  412. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  413. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  414. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  415. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  416. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  417. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  418. data/lib/pubid/iso/identifiers.rb +33 -0
  419. data/lib/pubid/iso/parser.rb +510 -0
  420. data/lib/pubid/iso/rendering_style.rb +120 -0
  421. data/lib/pubid/iso/scheme.rb +187 -0
  422. data/lib/pubid/iso/single_identifier.rb +61 -0
  423. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  424. data/lib/pubid/iso/urn_generator.rb +412 -0
  425. data/lib/pubid/iso/urn_parser.rb +423 -0
  426. data/lib/pubid/iso/utilities.rb +86 -0
  427. data/lib/pubid/iso.rb +50 -0
  428. data/lib/pubid/itu/builder.rb +171 -0
  429. data/lib/pubid/itu/components/code.rb +39 -0
  430. data/lib/pubid/itu/components/sector.rb +35 -0
  431. data/lib/pubid/itu/components/series.rb +29 -0
  432. data/lib/pubid/itu/i18n.rb +9 -0
  433. data/lib/pubid/itu/i18n.yaml +30 -0
  434. data/lib/pubid/itu/identifier.rb +53 -0
  435. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  436. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  437. data/lib/pubid/itu/identifiers/base.rb +154 -0
  438. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  439. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  440. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  441. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  442. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  443. data/lib/pubid/itu/identifiers.rb +16 -0
  444. data/lib/pubid/itu/model.rb +111 -0
  445. data/lib/pubid/itu/parser.rb +225 -0
  446. data/lib/pubid/itu/scheme.rb +174 -0
  447. data/lib/pubid/itu/urn_generator.rb +105 -0
  448. data/lib/pubid/itu.rb +22 -0
  449. data/lib/pubid/jcgm/builder.rb +88 -0
  450. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  451. data/lib/pubid/jcgm/components.rb +9 -0
  452. data/lib/pubid/jcgm/identifier.rb +11 -0
  453. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  454. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  455. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  456. data/lib/pubid/jcgm/identifiers.rb +11 -0
  457. data/lib/pubid/jcgm/parser.rb +84 -0
  458. data/lib/pubid/jcgm/scheme.rb +60 -0
  459. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  460. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  461. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  462. data/lib/pubid/jcgm.rb +31 -0
  463. data/lib/pubid/jis/builder.rb +124 -0
  464. data/lib/pubid/jis/components/code.rb +59 -0
  465. data/lib/pubid/jis/components.rb +9 -0
  466. data/lib/pubid/jis/identifier.rb +18 -0
  467. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  468. data/lib/pubid/jis/identifiers/base.rb +72 -0
  469. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  470. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  471. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  472. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  473. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  474. data/lib/pubid/jis/identifiers.rb +17 -0
  475. data/lib/pubid/jis/parser.rb +109 -0
  476. data/lib/pubid/jis/scheme.rb +49 -0
  477. data/lib/pubid/jis/single_identifier.rb +37 -0
  478. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  479. data/lib/pubid/jis/urn_generator.rb +25 -0
  480. data/lib/pubid/jis.rb +23 -0
  481. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  482. data/lib/pubid/nist/builder.rb +2100 -0
  483. data/lib/pubid/nist/components/code.rb +38 -0
  484. data/lib/pubid/nist/components/edition.rb +118 -0
  485. data/lib/pubid/nist/components/issue_number.rb +28 -0
  486. data/lib/pubid/nist/components/part.rb +77 -0
  487. data/lib/pubid/nist/components/publisher.rb +24 -0
  488. data/lib/pubid/nist/components/stage.rb +53 -0
  489. data/lib/pubid/nist/components/supplement.rb +121 -0
  490. data/lib/pubid/nist/components/translation.rb +42 -0
  491. data/lib/pubid/nist/components/update.rb +103 -0
  492. data/lib/pubid/nist/components/version.rb +35 -0
  493. data/lib/pubid/nist/components/volume.rb +32 -0
  494. data/lib/pubid/nist/components.rb +19 -0
  495. data/lib/pubid/nist/configuration.rb +77 -0
  496. data/lib/pubid/nist/identifiers/base.rb +499 -0
  497. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  498. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  499. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  500. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  501. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  502. data/lib/pubid/nist/identifiers/crpl_report.rb +135 -0
  503. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +94 -0
  504. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  505. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  506. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  507. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  508. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  509. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  510. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  511. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  512. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  513. data/lib/pubid/nist/identifiers/report.rb +68 -0
  514. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  515. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  516. data/lib/pubid/nist/identifiers.rb +33 -0
  517. data/lib/pubid/nist/parser.rb +1084 -0
  518. data/lib/pubid/nist/scheme.rb +199 -0
  519. data/lib/pubid/nist/supplement_identifier.rb +83 -0
  520. data/lib/pubid/nist/urn_generator.rb +127 -0
  521. data/lib/pubid/nist.rb +36 -0
  522. data/lib/pubid/oiml/builder.rb +189 -0
  523. data/lib/pubid/oiml/components/code.rb +20 -0
  524. data/lib/pubid/oiml/components.rb +9 -0
  525. data/lib/pubid/oiml/identifier.rb +11 -0
  526. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  527. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  528. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  529. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  530. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  531. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  536. data/lib/pubid/oiml/identifiers.rb +18 -0
  537. data/lib/pubid/oiml/parser.rb +173 -0
  538. data/lib/pubid/oiml/scheme.rb +46 -0
  539. data/lib/pubid/oiml/single_identifier.rb +90 -0
  540. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  541. data/lib/pubid/oiml/urn_generator.rb +64 -0
  542. data/lib/pubid/oiml.rb +26 -0
  543. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  544. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  545. data/lib/pubid/parser.rb +8 -0
  546. data/lib/pubid/parsers/base.rb +11 -0
  547. data/lib/pubid/parsers/mr_string.rb +93 -0
  548. data/lib/pubid/plateau/builder.rb +50 -0
  549. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  550. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  551. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  552. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  553. data/lib/pubid/plateau/identifiers.rb +12 -0
  554. data/lib/pubid/plateau/parser.rb +63 -0
  555. data/lib/pubid/plateau/scheme.rb +45 -0
  556. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  557. data/lib/pubid/plateau/urn_generator.rb +29 -0
  558. data/lib/pubid/plateau.rb +25 -0
  559. data/lib/pubid/renderers/base.rb +19 -0
  560. data/lib/pubid/renderers/directives_renderer.rb +62 -0
  561. data/lib/pubid/renderers/guide_renderer.rb +20 -0
  562. data/lib/pubid/renderers/human_readable.rb +58 -0
  563. data/lib/pubid/renderers/iwa_renderer.rb +16 -0
  564. data/lib/pubid/renderers/mr_string.rb +16 -0
  565. data/lib/pubid/renderers/supplement_renderer.rb +33 -0
  566. data/lib/pubid/renderers/urn.rb +11 -0
  567. data/lib/pubid/renderers.rb +14 -0
  568. data/lib/pubid/rendering/base.rb +73 -0
  569. data/lib/pubid/rendering/common.rb +211 -0
  570. data/lib/pubid/rendering/context.rb +156 -0
  571. data/lib/pubid/rendering/date.rb +27 -0
  572. data/lib/pubid/rendering/format.rb +25 -0
  573. data/lib/pubid/rendering/language.rb +21 -0
  574. data/lib/pubid/rendering/numbering.rb +24 -0
  575. data/lib/pubid/rendering/publisher.rb +25 -0
  576. data/lib/pubid/rendering/stage.rb +38 -0
  577. data/lib/pubid/rendering/supplement.rb +46 -0
  578. data/lib/pubid/rendering.rb +16 -0
  579. data/lib/pubid/sae/builder.rb +32 -0
  580. data/lib/pubid/sae/components/code.rb +9 -0
  581. data/lib/pubid/sae/components/date.rb +19 -0
  582. data/lib/pubid/sae/components/type.rb +19 -0
  583. data/lib/pubid/sae/components.rb +11 -0
  584. data/lib/pubid/sae/identifier.rb +14 -0
  585. data/lib/pubid/sae/identifiers/base.rb +42 -0
  586. data/lib/pubid/sae/identifiers.rb +9 -0
  587. data/lib/pubid/sae/parser.rb +55 -0
  588. data/lib/pubid/sae/scheme.rb +47 -0
  589. data/lib/pubid/sae/urn_generator.rb +38 -0
  590. data/lib/pubid/sae.rb +19 -0
  591. data/lib/pubid/scheme.rb +207 -0
  592. data/lib/pubid/urn_generator/base.rb +110 -0
  593. data/lib/pubid/utils/string_normalizer.rb +196 -0
  594. data/lib/pubid/utils.rb +7 -0
  595. data/lib/pubid/version.rb +3 -1
  596. data/lib/pubid.rb +137 -13
  597. data/lib/tasks/docs.rake +37 -0
  598. data/lib/tasks/export.rake +38 -0
  599. data/lib/tasks/website-data.json +7488 -0
  600. metadata +613 -171
  601. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ccsds
5
+ class UrnGenerator < Pubid::UrnGenerator::Base
6
+ def generate
7
+ if identifier.is_a?(SupplementIdentifier)
8
+ generate_supplement_urn
9
+ else
10
+ generate_base_urn
11
+ end
12
+ end
13
+
14
+ protected
15
+
16
+ def generate_base_urn
17
+ parts = ["urn", "ccsds"]
18
+
19
+ identifier_parts = []
20
+
21
+ series = maybe(:series)
22
+ if series
23
+ s = series.to_s
24
+ identifier_parts << s if s && !s.empty?
25
+ end
26
+
27
+ if identifier.number
28
+ number = identifier.number.to_s
29
+ identifier_parts << number if number && !number.empty?
30
+ end
31
+
32
+ part = maybe(:part)
33
+ if part
34
+ p = part.to_s
35
+ identifier_parts << ".#{p}" if p && !p.empty?
36
+ end
37
+
38
+ book_color = maybe(:book_color)
39
+ if book_color
40
+ bc = book_color.to_s
41
+ identifier_parts << "-#{bc}" if bc && !bc.empty?
42
+ elsif identifier.type
43
+ t = identifier.type.to_s
44
+ identifier_parts << "-#{t}" if t && !t.empty?
45
+ end
46
+
47
+ edition = maybe(:edition)
48
+ if edition
49
+ e = if edition.is_a?(Pubid::Components::Edition)
50
+ edition.number || edition.value
51
+ else
52
+ edition.to_s
53
+ end
54
+ identifier_parts << "-#{e}" if e && !e.to_s.empty?
55
+ end
56
+
57
+ retired = maybe(:retired)
58
+ if retired
59
+ identifier_parts << "-S"
60
+ else
61
+ suffix = maybe(:suffix)
62
+ if suffix
63
+ s = suffix.to_s
64
+ identifier_parts << "-#{s}" if s && !s.empty?
65
+ end
66
+ end
67
+
68
+ parts << identifier_parts.join unless identifier_parts.empty?
69
+
70
+ language = maybe(:language)
71
+ if language
72
+ lang_code = if language&.code
73
+ language.code
74
+ elsif language.is_a?(String)
75
+ language
76
+ else
77
+ language.to_s
78
+ end
79
+ lang_code = lang_code.gsub(/ Translated$/, "").downcase if lang_code
80
+ parts << lang_code if lang_code && !lang_code.empty?
81
+ end
82
+
83
+ parts.join(":")
84
+ end
85
+
86
+ def generate_supplement_urn
87
+ parts = ["urn", "ccsds"]
88
+
89
+ current = identifier
90
+ supplement_chain = []
91
+
92
+ while current.is_a?(SupplementIdentifier)
93
+ supplement_chain.unshift(current)
94
+ current = current.base_identifier
95
+ end
96
+
97
+ base_gen = self.class.new(current)
98
+ base_urn = base_gen.generate_base_urn
99
+
100
+ base_identifier_part = base_urn.sub(/^urn:ccsds:/, "")
101
+ parts << base_identifier_part
102
+
103
+ supplement_chain.each do |supp|
104
+ if supp.number&.value
105
+ parts << "cor.#{supp.number.value}"
106
+ elsif supp.typed_stage
107
+ parts << supp.typed_stage.type_code.to_s
108
+ end
109
+ end
110
+
111
+ parts.join(":")
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ccsds
5
+ autoload :Builder, "#{__dir__}/ccsds/builder"
6
+ autoload :Identifier, "#{__dir__}/ccsds/identifier"
7
+ autoload :Identifiers, "#{__dir__}/ccsds/identifiers"
8
+ autoload :Parser, "#{__dir__}/ccsds/parser"
9
+ autoload :Scheme, "#{__dir__}/ccsds/scheme"
10
+ autoload :SingleIdentifier, "#{__dir__}/ccsds/single_identifier"
11
+ autoload :SupplementIdentifier, "#{__dir__}/ccsds/supplement_identifier"
12
+ autoload :UrnGenerator, "#{__dir__}/ccsds/urn_generator"
13
+
14
+ def self.parse(identifier)
15
+ Identifier.parse(identifier)
16
+ end
17
+ end
18
+ end
19
+
20
+ # Register Uccsds flavor with the registry
21
+ Pubid::Registry.register(:ccsds, Pubid::Ccsds)
@@ -0,0 +1,330 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module CenCenelec
5
+ class Builder < Pubid::Builder::Base
6
+ def initialize(scheme)
7
+ @scheme = scheme
8
+ end
9
+
10
+ def self.build(parsed_data, scheme = Scheme.new)
11
+ new(scheme).build(parsed_data)
12
+ end
13
+
14
+ def build(data)
15
+ data = flatten_array(data) if data.is_a?(Array)
16
+
17
+ # Store data for access in cast method
18
+ @data = data
19
+
20
+ # Check if this is a fragment identifier (AMD + FRAG)
21
+ if data[:fragment_number]
22
+ return build_fragment_identifier(data)
23
+ end
24
+
25
+ # Check if this is an adopted identifier (EN ISO, EN IEC, etc.)
26
+ if data[:adopted_string]
27
+ # Special case: ENV can adopt ISO/IEC standards
28
+ if data[:publisher]&.to_s == "ENV"
29
+ return build_env_adopted_identifier(data)
30
+ end
31
+
32
+ return build_adopted_identifier(data)
33
+ end
34
+
35
+ # Check if this is a standalone amendment/corrigendum (slash separator)
36
+ if has_slash_supplements?(data)
37
+ return build_standalone_supplement(data)
38
+ end
39
+
40
+ # Extract supplements before building base identifier (only plus/bundled)
41
+ supplements_data = extract_supplements(data)
42
+
43
+ # Determine identifier class using Scheme
44
+ identifier = locate_identifier_klass(data).new
45
+ assign_attributes(identifier, data)
46
+
47
+ # Wrap with consolidated if supplements present (plus/bundled only)
48
+ if supplements_data.any?
49
+ wrap_with_consolidated(identifier, supplements_data)
50
+ else
51
+ identifier
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def build_fragment_identifier(data)
58
+ # Build base identifier first (without amendment/fragment)
59
+ base_data = data.dup
60
+ base_data.delete(:amendment_number)
61
+ base_data.delete(:fragment_number)
62
+
63
+ base_identifier = locate_identifier_klass(base_data).new
64
+ assign_attributes(base_identifier, base_data)
65
+
66
+ # Build Amendment identifier wrapping the base
67
+ amendment = Identifiers::Amendment.new(
68
+ base_identifier: base_identifier,
69
+ amendment_number: data[:amendment_number].to_s,
70
+ )
71
+
72
+ # Build Fragment wrapping the amendment
73
+ Identifiers::Fragment.new(
74
+ base_identifier: amendment,
75
+ fragment_number: data[:fragment_number].to_s,
76
+ )
77
+ end
78
+
79
+ def locate_identifier_klass(parsed_hash)
80
+ # Special case: Use adopted_european_norm for adopted identifiers
81
+ return Identifiers::AdoptedEuropeanNorm if parsed_hash[:adopted_string]
82
+
83
+ # Check if publisher is actually a type code (CWA, HD, ES, CR, ENV act as publisher)
84
+ publisher_str = parsed_hash[:publisher].to_s
85
+ if %w[CWA HD ES CR ENV].include?(publisher_str)
86
+ typed_stage = @scheme.locate_typed_stage_by_abbr(publisher_str)
87
+ return @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
88
+ end
89
+
90
+ # Use type or stage to determine class via Scheme
91
+ type_or_stage = parsed_hash[:type_with_stage] || parsed_hash[:type] || parsed_hash[:stage] || ""
92
+ typed_stage = @scheme.locate_typed_stage_by_abbr(type_or_stage)
93
+ @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
94
+ end
95
+
96
+ def cast(type, value)
97
+ case type
98
+ when :type_with_stage
99
+ # Lookup from register
100
+ typed_stage = @scheme.locate_typed_stage_by_abbr(value || "")
101
+ {
102
+ stage: typed_stage.to_stage,
103
+ type: typed_stage.to_type,
104
+ typed_stage: typed_stage,
105
+ }
106
+
107
+ when :publisher
108
+ Components::Publisher.new(body: value.to_s)
109
+
110
+ when :copublisher
111
+ # Map singular :copublisher to :copublishers array
112
+ { copublishers: [Components::Publisher.new(body: value.to_s)] }
113
+
114
+ when :copublishers
115
+ # Handle array of copublishers
116
+ Array(value).map do |v|
117
+ Components::Publisher.new(body: v[:copublisher].to_s)
118
+ end
119
+
120
+ when :number
121
+ Components::Code.new(value: value.to_s)
122
+
123
+ when :parts
124
+ # Extract first part, preserve full multi-level part string
125
+ parts_array = Array(value)
126
+ if parts_array.any?
127
+ # Get the part string - it may contain multiple dashes like "5-1-1"
128
+ part_str = parts_array.first[:part].to_s
129
+
130
+ # Store the full part value for multi-level parts
131
+ { part: Components::Code.new(value: part_str) }
132
+ end
133
+
134
+ when :part
135
+ Components::Code.new(value: value[:part].to_s) if value.is_a?(Hash)
136
+
137
+ when :year, :date
138
+ # Check if month is present in the data and include it
139
+ month_val = @data[:month]&.to_s
140
+ date_attrs = { year: value.to_s }
141
+ date_attrs[:month] = month_val if month_val && !month_val.empty?
142
+ { date: Components::Date.new(**date_attrs) }
143
+
144
+ when :month
145
+ # Month is handled together with year, so skip it here
146
+ nil
147
+
148
+ when :type
149
+ Components::Type.new(abbr: value.to_s)
150
+
151
+ when :stage
152
+ # Lookup stage in TYPED_STAGES register
153
+ typed_stage = @scheme.locate_typed_stage_by_abbr(value.to_s)
154
+ {
155
+ stage: typed_stage.to_stage,
156
+ typed_stage: typed_stage,
157
+ }
158
+
159
+ when :edition
160
+ value.to_s
161
+
162
+ when :adopted_string
163
+ # Don't cast here, handled in build_adopted_identifier
164
+ nil
165
+
166
+ when :supplements
167
+ # Handled separately by extract_supplements
168
+ nil
169
+
170
+ else
171
+ value
172
+ end
173
+ end
174
+
175
+ def build_adopted_identifier(data)
176
+ # Parse the adopted identifier string with appropriate flavor
177
+ adopted_str = data[:adopted_string]&.to_s&.strip
178
+ return nil unless adopted_str && !adopted_str.empty?
179
+
180
+ adopted_id = if adopted_str.start_with?("ISO/IEC") || adopted_str.include?("ISO/IEC")
181
+ Pubid::Iso.parse(adopted_str)
182
+ elsif adopted_str.start_with?("ISO")
183
+ Pubid::Iso.parse(adopted_str)
184
+ elsif adopted_str.start_with?("IEC")
185
+ Pubid::Iec.parse(adopted_str)
186
+ elsif adopted_str.start_with?("CISPR")
187
+ # CISPR might need specific handling
188
+ nil
189
+ end
190
+
191
+ # Build publishers array (EN is default for adoptions)
192
+ publishers = []
193
+ publishers << data[:publisher].to_s if data[:publisher]
194
+
195
+ # Handle copublishers array
196
+ if data[:copublishers]
197
+ Array(data[:copublishers]).each do |copub|
198
+ publishers << copub[:copublisher].to_s
199
+ end
200
+ elsif data[:copublisher]
201
+ publishers << data[:copublisher].to_s
202
+ end
203
+
204
+ publishers = ["EN"] if publishers.empty?
205
+
206
+ Identifiers::AdoptedEuropeanNorm.new(
207
+ publisher: publishers,
208
+ adopted_identifier: adopted_id,
209
+ )
210
+ end
211
+
212
+ def build_env_adopted_identifier(data)
213
+ # Parse the adopted identifier string
214
+ adopted_str = data[:adopted_string]&.to_s&.strip
215
+ return nil unless adopted_str && !adopted_str.empty?
216
+
217
+ adopted_id = if adopted_str.start_with?("ISO/IEC") || adopted_str.include?("ISO/IEC")
218
+ Pubid::Iso.parse(adopted_str)
219
+ elsif adopted_str.start_with?("ISO")
220
+ Pubid::Iso.parse(adopted_str)
221
+ elsif adopted_str.start_with?("IEC")
222
+ Pubid::Iec.parse(adopted_str)
223
+ end
224
+
225
+ Identifiers::EuropeanPrestandard.new(
226
+ adopted_identifier: adopted_id,
227
+ )
228
+ end
229
+
230
+ def wrap_with_consolidated(base_identifier, supplements_data)
231
+ supplement_ids = supplements_data.map do |supp|
232
+ if supp[:type] == :amendment
233
+ Identifiers::Amendment.new(
234
+ base_identifier: base_identifier,
235
+ amendment_number: supp[:number],
236
+ amendment_year: supp[:year]&.to_i,
237
+ )
238
+ else
239
+ corr_attrs = {
240
+ base_identifier: base_identifier,
241
+ corrigendum_number: supp[:number],
242
+ corrigendum_year: supp[:year]&.to_i,
243
+ }
244
+ corr_attrs[:corrigendum_month] = supp[:month] if supp[:month]
245
+ Identifiers::Corrigendum.new(**corr_attrs)
246
+ end
247
+ end
248
+
249
+ Identifiers::ConsolidatedIdentifier.new(
250
+ identifiers: [base_identifier] + supplement_ids,
251
+ )
252
+ end
253
+
254
+ def extract_supplements(data)
255
+ return [] unless data[:supplements]
256
+
257
+ supps_array = data[:supplements]
258
+ return [] if supps_array.empty?
259
+
260
+ # Only extract supplements with PLUS separator (bundled)
261
+ # Slash-separated supplements are standalone identifiers, not bundled
262
+ supps_array.select do |s|
263
+ supp_data = s.is_a?(Hash) && s[:supplement] ? s[:supplement] : s
264
+ # Only include if it has plus separator
265
+ supp_data[:amd_sep_plus]
266
+ end.map do |s|
267
+ supp_data = s.is_a?(Hash) && s[:supplement] ? s[:supplement] : s
268
+
269
+ # Extract year and month if present
270
+ year_val = (supp_data[:amd_year] || supp_data[:year])&.to_s
271
+ month_val = supp_data[:month]&.to_s
272
+
273
+ {
274
+ type: supp_data[:amd_number] ? :amendment : :corrigendum,
275
+ number: (supp_data[:amd_number] || supp_data[:cor_number])&.to_s,
276
+ year: year_val,
277
+ month: month_val,
278
+ }
279
+ end
280
+ end
281
+
282
+ def has_slash_supplements?(data)
283
+ return false unless data[:supplements]
284
+
285
+ supps_array = data[:supplements]
286
+ return false if supps_array.empty?
287
+
288
+ # Check if any supplement has slash separator
289
+ supps_array.any? do |s|
290
+ supp_data = s.is_a?(Hash) && s[:supplement] ? s[:supplement] : s
291
+ supp_data[:amd_sep_slash]
292
+ end
293
+ end
294
+
295
+ def build_standalone_supplement(data)
296
+ # Build base identifier first (without supplements)
297
+ base_data = data.dup
298
+ base_data.delete(:supplements)
299
+ base_identifier = locate_identifier_klass(base_data).new
300
+ assign_attributes(base_identifier, base_data)
301
+
302
+ # Get the first supplement (slash means only one supplement)
303
+ supp_array = data[:supplements]
304
+ supp_data = supp_array.first
305
+ supp_data = supp_data[:supplement] if supp_data.is_a?(Hash) && supp_data[:supplement]
306
+
307
+ # Build appropriate supplement identifier
308
+ if supp_data[:amd_number]
309
+ Identifiers::Amendment.new(
310
+ base_identifier: base_identifier,
311
+ amendment_number: supp_data[:amd_number].to_s,
312
+ amendment_year: supp_data[:amd_year]&.to_i,
313
+ )
314
+ else
315
+ corr_attrs = {
316
+ base_identifier: base_identifier,
317
+ corrigendum_number: supp_data[:cor_number]&.to_s,
318
+ corrigendum_year: (supp_data[:cor_year] || supp_data[:year])&.to_i,
319
+ }
320
+ month_val = supp_data[:month]&.to_s
321
+ if month_val && !month_val.empty?
322
+ corr_attrs[:corrigendum_month] =
323
+ month_val
324
+ end
325
+ Identifiers::Corrigendum.new(**corr_attrs)
326
+ end
327
+ end
328
+ end
329
+ end
330
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module CenCenelec
5
+ module Identifier
6
+ def self.parse(identifier)
7
+ scheme = Scheme.new
8
+ parsed = Parser.parse(identifier)
9
+ Builder.new(scheme).build(parsed)
10
+ rescue Parslet::ParseFailed => e
11
+ raise "Failed to parse CEN identifier '#{identifier}': #{e.message}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module CenCenelec
5
+ module Identifiers
6
+ # AdoptedEuropeanNorm wraps ISO/IEC identifiers
7
+ # Example: "EN ISO 8601:2019" where ISO 8601:2019 is an ISO identifier object
8
+ class AdoptedEuropeanNorm < EuropeanNorm
9
+ attribute :adopted_identifier, Base, polymorphic: true # ISO/IEC/IEEE object
10
+
11
+ def to_s
12
+ result = publisher.is_a?(Array) ? publisher.join("/") : publisher.join("/")
13
+ result += " #{adopted_identifier}" if adopted_identifier
14
+ result
15
+ end
16
+
17
+ # Delegate common methods to adopted identifier
18
+ def number
19
+ adopted_identifier&.number
20
+ end
21
+
22
+ def year
23
+ adopted_identifier&.year if adopted_identifier&.methods&.include?(:year)
24
+ end
25
+
26
+ def date
27
+ adopted_identifier&.date if adopted_identifier&.methods&.include?(:date)
28
+ end
29
+
30
+ def parts
31
+ adopted_identifier&.parts if adopted_identifier&.methods&.include?(:parts)
32
+ end
33
+
34
+ def part
35
+ adopted_identifier&.part if adopted_identifier&.methods&.include?(:part)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module CenCenelec
5
+ module Identifiers
6
+ # Amendment Identifier
7
+ # Contains a base identifier plus amendment parameters
8
+ class Amendment < Base
9
+ attribute :base_identifier, Base, polymorphic: true
10
+ attribute :amendment_number, :string
11
+ attribute :amendment_year, :integer
12
+
13
+ def to_s
14
+ result = if base_identifier
15
+ "#{base_identifier}/A#{amendment_number}"
16
+ else
17
+ "/A#{amendment_number}"
18
+ end
19
+ result += ":#{amendment_year}" if amendment_year
20
+ result
21
+ end
22
+
23
+ def publisher
24
+ base_identifier&.publisher
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module CenCenelec
5
+ module Identifiers
6
+ # Base CEN identifier
7
+ # Format: {PUBLISHER} NUMBER[-PART]:YEAR
8
+ class Base < Pubid::Identifier
9
+ # Generate URN for this identifier
10
+ #
11
+ # @return [String] URN representation
12
+
13
+ attribute :publisher, :string, collection: true # EN, CEN, CLC, etc.
14
+ attribute :type, :string # TR, TS, Guide
15
+ attribute :number, :string
16
+ attribute :parts, :string, collection: true
17
+ attribute :year, :integer
18
+ attribute :stage, :string # prEN, FprEN
19
+ attribute :supplements, :string, collection: true # Amendments and corrigenda
20
+ attribute :adopted_identifier, Base, polymorphic: true # Nested identifier object (ISO, IEC, etc.)
21
+ attribute :edition, :string # Edition number
22
+
23
+ def to_s
24
+ result = ""
25
+
26
+ # Stage or Publisher
27
+ if stage
28
+ result += stage
29
+ elsif publisher&.any?
30
+ result += publisher.join("/")
31
+ end
32
+
33
+ # If we have adopted_identifier, render it (contains all info)
34
+ if adopted_identifier
35
+ result += " #{adopted_identifier}"
36
+ # Don't add our own number/parts/year - they're in adopted_identifier
37
+ else
38
+ # Only render our own fields if no adoption
39
+ # Type - use space for Guide, slash for TR/TS
40
+ if type
41
+ sep = type == "Guide" ? " " : "/"
42
+ result += "#{sep}#{type}"
43
+ end
44
+
45
+ result += " #{number}"
46
+ result += parts.map { |p| "-#{p}" }.join if parts&.any?
47
+ result += ":#{year}" if year
48
+
49
+ # Supplements
50
+ if supplements&.any?
51
+ supplements.each do |supp|
52
+ sep = supp[:type] == :amendment ? "/" : "+"
53
+ result += "#{sep}#{supp[:type] == :amendment ? 'A' : 'AC'}"
54
+ result += supp[:number] if supp[:number] && !supp[:number].empty?
55
+ result += ":#{supp[:year]}" if supp[:year]
56
+ end
57
+ end
58
+
59
+ # Edition
60
+ result += " ED#{edition}" if edition
61
+ end
62
+
63
+ result
64
+ end
65
+
66
+ def ==(other)
67
+ return false unless other.is_a?(Base)
68
+
69
+ publisher == other.publisher && number == other.number &&
70
+ parts == other.parts && year == other.year
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module CenCenelec
7
+ module Identifiers
8
+ class CenReport < SingleIdentifier
9
+ attribute :type, Components::Type, default: -> { self.class.type[:key] }
10
+
11
+ TYPED_STAGES = [
12
+ Components::TypedStage.new(
13
+ code: :pubcr,
14
+ stage_code: :published,
15
+ type_code: :cr,
16
+ abbr: ["CR"],
17
+ name: "CEN Report",
18
+ harmonized_stages: %w[60.00 60.60],
19
+ ),
20
+ ].freeze
21
+
22
+ def self.type
23
+ { key: :cr, title: "CEN Report", short: "CR" }
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ require "lutaml/model"
2
+ # frozen_string_literal: true
3
+
4
+ module Pubid
5
+ module CenCenelec
6
+ module Identifiers
7
+ class CenWorkshopAgreement < SingleIdentifier
8
+ attribute :type, Components::Type, default: -> { self.class.type[:key] }
9
+
10
+ TYPED_STAGES = [
11
+ Components::TypedStage.new(
12
+ code: :pubcwa,
13
+ stage_code: :published,
14
+ type_code: :cwa,
15
+ abbr: ["CWA"],
16
+ name: "CEN Workshop Agreement",
17
+ harmonized_stages: %w[60.00 60.60],
18
+ ),
19
+ ].freeze
20
+
21
+ def self.type
22
+ { key: :cwa, title: "CEN Workshop Agreement", short: "CWA" }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end