pubid 1.15.18 → 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,457 @@
1
+ require_relative "../components/publisher"
2
+ # frozen_string_literal: true
3
+ require_relative "../components/code"
4
+ require_relative "../components/date"
5
+
6
+ module Pubid
7
+ module Iec
8
+ class Builder < Pubid::Builder::Base
9
+ def initialize(scheme)
10
+ @scheme = scheme
11
+ end
12
+
13
+ def locate_identifier_klass(parsed_hash)
14
+ # Check for working programme
15
+ if parsed_hash[:wp_stage]
16
+ require_relative "identifiers/working_document"
17
+ return Identifiers::WorkingDocument
18
+ end
19
+
20
+ # Check for working document
21
+ if parsed_hash[:technical_committee] && parsed_hash[:wd_number]
22
+ require_relative "identifiers/working_document"
23
+ return Identifiers::WorkingDocument
24
+ end
25
+
26
+ # Check the `:type_with_stage` to determine the identifier class
27
+ # :type_with_stage will be nil if it is an IS.
28
+ typed_stage = locate_typed_stage(parsed_hash[:type_with_stage])
29
+
30
+ @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
31
+ end
32
+
33
+ def build(parsed_hash)
34
+ # Handle sheet_supplement_identifier pattern:
35
+ # {base_identifier: {...}, sheet_number: ..., sheet_year: ..., type_with_stage: "COR", number_with_part: "1", date: "1995"}
36
+ # This is a Corrigendum/Amendment wrapping a SheetIdentifier
37
+ if parsed_hash[:base_identifier] && (parsed_hash[:sheet_number] || parsed_hash[:sheet_year]) && parsed_hash[:type_with_stage]
38
+ # Extract sheet info first
39
+ sheet_number = parsed_hash.delete(:sheet_number)
40
+ sheet_year = parsed_hash.delete(:sheet_year)
41
+
42
+ # Build the base identifier (IEC 60695-2-1 with /1:1994 -> SheetIdentifier)
43
+ base_parsed = parsed_hash[:base_identifier].dup
44
+ base_parsed[:sheet_number] = sheet_number
45
+ base_parsed[:sheet_year] = sheet_year if sheet_year
46
+ sheet_id = wrap_with_sheet(build(base_parsed), sheet_number,
47
+ sheet_year)
48
+
49
+ # Now build the supplement on top of the sheet
50
+ # We need to preserve the supplement data and create a wrapper
51
+ supplement_type = parsed_hash.delete(:type_with_stage)
52
+ supplement_number = parsed_hash.delete(:number_with_part)
53
+ supplement_date = parsed_hash.delete(:date)
54
+ supplement_edition = parsed_hash.delete(:edition)
55
+
56
+ # Locate the supplement identifier class
57
+ typed_stage = locate_typed_stage(supplement_type)
58
+ identifier_class = @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
59
+
60
+ # Create the supplement identifier
61
+ supplement = identifier_class.new
62
+ supp_attrs = identifier_class.attributes
63
+ if supp_attrs.key?(:number)
64
+ supplement.number = Components::Code.new(value: supplement_number.to_s)
65
+ end
66
+ if supplement_date && supp_attrs.key?(:date)
67
+ supplement.date = cast(:date, supplement_date)
68
+ end
69
+ if supplement_edition && supp_attrs.key?(:edition)
70
+ supplement.edition = cast(:edition, supplement_edition)
71
+ end
72
+ supplement.typed_stage = typed_stage
73
+
74
+ # Wrap the sheet with the supplement
75
+ return wrap_with_supplement(sheet_id, supplement)
76
+ end
77
+
78
+ # Handle sheet_identifier pattern: {base_identifier: {...}, sheet_number: ..., sheet_year: ...}
79
+ if parsed_hash[:base_identifier] && (parsed_hash[:sheet_number] || parsed_hash[:sheet_year])
80
+ # Build the base identifier first
81
+ base_id = build(parsed_hash[:base_identifier])
82
+ # Wrap with SheetIdentifier
83
+ sheet_number = parsed_hash.delete(:sheet_number)
84
+ sheet_year = parsed_hash.delete(:sheet_year)
85
+ return wrap_with_sheet(base_id, sheet_number, sheet_year)
86
+ end
87
+
88
+ # Extract FRAG/FRAGC indicator if present
89
+ frag_abbrs = Pubid::Iec::Identifiers::FragmentIdentifier::TYPED_STAGES
90
+ .flat_map(&:abbr)
91
+ is_fragment = frag_abbrs.include?(parsed_hash[:type_with_stage]) ||
92
+ parsed_hash[:type_with_stage] == "FRAGC"
93
+ fragment_typed_stage = nil
94
+ fragment_number = nil
95
+ fragment_edition = nil
96
+
97
+ if is_fragment
98
+ # For FRAG typed stages, look up the fragment's own typed stage
99
+ begin
100
+ fragment_typed_stage = @scheme.locate_typed_stage_by_abbr(
101
+ parsed_hash[:type_with_stage].to_s,
102
+ )
103
+ rescue ArgumentError
104
+ # FRAGC is a rendering notation, not a typed stage abbreviation
105
+ fragment_typed_stage = @scheme.locate_typed_stage_by_abbr("FRAG")
106
+ end
107
+
108
+ # For FRAG/FRAGC, we need to build the base Amendment/Corrigendum
109
+ # then wrap it with FragmentIdentifier
110
+ if parsed_hash[:number_with_part]
111
+ fragment_number = parsed_hash[:number_with_part].to_s
112
+ end
113
+
114
+ # Extract edition for fragment
115
+ fragment_edition = parsed_hash.delete(:edition)
116
+
117
+ # Build the base identifier (Amendment/Corrigendum) directly
118
+ if parsed_hash[:base_identifier]
119
+ base_id = build(parsed_hash[:base_identifier])
120
+ return wrap_with_fragment(base_id, fragment_number,
121
+ fragment_edition, fragment_typed_stage)
122
+ end
123
+ end
124
+
125
+ # Check for TRF with CISPR - build embedded identifier
126
+ trf_org = parsed_hash.delete(:trf_org)
127
+ if trf_org && parsed_hash[:number_with_part]
128
+ # Build CISPR identifier without year
129
+ cispr_number = parsed_hash.delete(:number_with_part)
130
+ cispr_id = Identifiers::InternationalStandard.new(
131
+ publisher: Components::Publisher.new(body: "CISPR"),
132
+ )
133
+ # Set number via cast
134
+ number_components = cast(:number_with_part, cispr_number)
135
+ attrs = cispr_id.class.attributes
136
+ number_components.each_pair do |k, v|
137
+ cispr_id.public_send("#{k}=", v) if attrs.key?(k.to_sym)
138
+ end
139
+ parsed_hash[:cispr_identifier] = cispr_id
140
+ end
141
+
142
+ # Extract and store wrapper data before building
143
+ consolidated_supplements_data = parsed_hash.delete(:consolidated_supplements)
144
+ vap_suffix_data = parsed_hash.delete(:vap_suffix)
145
+ # Note: sheet_number and sheet_year are now handled in sheet_identifier check above
146
+ fragment_type_data = parsed_hash.delete(:fragment_type)
147
+ fragment_number_data = parsed_hash.delete(:fragment_number)
148
+
149
+ # Instantiate the identifier based on the typed stage
150
+ identifier = locate_identifier_klass(parsed_hash).new
151
+
152
+ # For French GUIDE entries: "Guide IEC 51:1999"
153
+ if type_with_stage_fr = parsed_hash.delete(:type_with_stage_fr)
154
+ parsed_hash[:type_with_stage] = type_with_stage_fr
155
+ end
156
+
157
+ assign_attributes(identifier, parsed_hash)
158
+
159
+ # Detect rendering style from parsed abbreviation
160
+ if identifier.class.attributes.key?(:rendering_style) && identifier.typed_stage
161
+ require_relative "rendering_style"
162
+ ts = identifier.typed_stage
163
+
164
+ # Detect IEC format from parsed abbreviation
165
+ # IEC uses space to indicate long form: "Amd 1", "Cor 1"
166
+ # No space indicates short form: "AMD1", "COR1"
167
+ stage_format_long = if ts.long_abbr && ts.original_abbr&.include?(" ")
168
+ true # Long form has space: "Amd 1", "Cor 1"
169
+ elsif ts.short_abbr && ts.original_abbr && !ts.original_abbr.include?(" ")
170
+ false # Short form: "AMD1", "COR1", "CDV", "FDIS"
171
+ else
172
+ false # Default to short/canonical
173
+ end
174
+
175
+ # Detect language code format from parsed languages
176
+ langs = if identifier.class.attributes.key?(:languages)
177
+ identifier.languages
178
+ end
179
+ with_language_code = if langs&.any?
180
+ # Check if original_code was single-char (E, F, R, A, S, D)
181
+ first_lang = langs.first
182
+ if first_lang.is_a?(Components::Language) && first_lang.original_code && first_lang.original_code.length == 1
183
+ :single
184
+ else
185
+ :iso # 2-char codes (en, fr, ru, ar, es, de)
186
+ end
187
+ else
188
+ :none
189
+ end
190
+
191
+ # with_date is always true for base identifiers (show the date if present)
192
+ # Only supplements might have undated references
193
+ with_date = true
194
+
195
+ # Create custom rendering style based on parsed format
196
+ identifier.rendering_style = RenderingStyle.new(
197
+ with_language_code: with_language_code,
198
+ stage_format_long: stage_format_long,
199
+ with_date: with_date,
200
+ )
201
+ end
202
+
203
+ # After building base identifier, apply wrappers
204
+ if fragment_type_data && fragment_number_data
205
+ frag_ts = @scheme.locate_typed_stage_by_abbr("FRAG")
206
+ identifier = wrap_with_fragment(identifier, fragment_number_data.to_s,
207
+ nil, frag_ts)
208
+ end
209
+ # Note: sheet wrapping is now handled earlier in build method for sheet_identifier pattern
210
+ if consolidated_supplements_data
211
+ identifier = wrap_with_consolidated(identifier,
212
+ consolidated_supplements_data)
213
+ end
214
+ if vap_suffix_data
215
+ identifier = wrap_with_vap(identifier,
216
+ vap_suffix_data)
217
+ end
218
+
219
+ identifier
220
+ end
221
+
222
+ def handle_key(identifier, key, value)
223
+ if key == :joint_identifier
224
+ identifier.additional_identifiers ||= []
225
+ identifier.additional_identifiers << value
226
+ true
227
+ else
228
+ false
229
+ end
230
+ end
231
+
232
+ # Wrap identifier with FragmentIdentifier for /FRAGN notation
233
+ def wrap_with_fragment(base_identifier, fragment_number,
234
+ edition_data = nil, typed_stage = nil)
235
+ require_relative "identifiers/fragment_identifier"
236
+
237
+ fragment = Identifiers::FragmentIdentifier.new(
238
+ base_identifier: base_identifier,
239
+ fragment_number: fragment_number,
240
+ )
241
+
242
+ # Set typed stage if provided
243
+ fragment.typed_stage = typed_stage if typed_stage
244
+
245
+ # Set edition if provided
246
+ if edition_data
247
+ fragment.edition = cast(:edition, edition_data)
248
+ end
249
+
250
+ fragment
251
+ end
252
+
253
+ # Wrap identifier with SheetIdentifier for /N:YEAR notation
254
+ def wrap_with_sheet(base_identifier, sheet_number, sheet_year)
255
+ require_relative "identifiers/sheet_identifier"
256
+
257
+ # Only pass year if it's present
258
+ year_value = sheet_year&.to_s
259
+
260
+ Identifiers::SheetIdentifier.new(
261
+ base_identifier: base_identifier,
262
+ sheet_number: sheet_number.to_s,
263
+ year: year_value,
264
+ )
265
+ end
266
+
267
+ # Wrap base identifier with supplement (Amendment/Corrigendum)
268
+ def wrap_with_supplement(base_identifier, supplement)
269
+ supplement.base_identifier = base_identifier
270
+ supplement
271
+ end
272
+
273
+ # Wrap identifier with ConsolidatedIdentifier for +AMD chains
274
+ def wrap_with_consolidated(base_identifier, supplements_data)
275
+ require_relative "identifiers/consolidated_identifier"
276
+ require_relative "identifiers/amendment"
277
+ require_relative "identifiers/corrigendum"
278
+
279
+ supplements = supplements_data.filter_map do |supp|
280
+ type = supp[:supplement_type].to_s
281
+ number = supp[:supplement_number].to_s
282
+ year = supp[:supplement_year]
283
+
284
+ # Only create Date component if year is present
285
+ date_component = year ? Pubid::Components::Date.new(year: year.to_s) : nil
286
+
287
+ if type == "AMD"
288
+ Identifiers::Amendment.new(
289
+ number: Components::Code.new(value: number),
290
+ date: date_component,
291
+ )
292
+ elsif type == "COR"
293
+ Identifiers::Corrigendum.new(
294
+ number: Components::Code.new(value: number),
295
+ date: date_component,
296
+ )
297
+ end
298
+ end
299
+
300
+ Identifiers::ConsolidatedIdentifier.new(
301
+ identifiers: [base_identifier] + supplements,
302
+ )
303
+ end
304
+
305
+ # Wrap identifier with VapIdentifier for CSV/CMV/RLV/SER suffix
306
+ def wrap_with_vap(base_identifier, vap_suffix_data)
307
+ require_relative "identifiers/vap_identifier"
308
+ require_relative "identifiers/consolidated_identifier"
309
+ require_relative "components/vap_suffix"
310
+
311
+ vap_suffix = Components::VapSuffix.new(code: vap_suffix_data.to_s)
312
+
313
+ # Extract edition - need to go deep for ConsolidatedIdentifier
314
+ edition = nil
315
+ if base_identifier.is_a?(Identifiers::ConsolidatedIdentifier)
316
+ # Edition is on the first identifier (base document)
317
+ base_first = base_identifier.identifiers.first
318
+ if base_first && base_first.class.attributes.key?(:edition)
319
+ edition = base_first.edition
320
+ base_first.edition = nil
321
+ end
322
+ elsif base_identifier.class.attributes.key?(:edition)
323
+ edition = base_identifier.edition
324
+ base_identifier.edition = nil
325
+ end
326
+
327
+ Identifiers::VapIdentifier.new(
328
+ base_identifier: base_identifier,
329
+ vap_suffix: vap_suffix,
330
+ edition: edition,
331
+ )
332
+ end
333
+
334
+ def convert_roman_to_integer(roman_numeral)
335
+ return roman_numeral if roman_numeral.to_s.upcase == "X"
336
+
337
+ super
338
+ end
339
+
340
+ def cast(type, value)
341
+ case type
342
+ when :base_identifier
343
+ # If it has a base identifier, we need to build a supplement
344
+ # We assume that the base identifier is already a valid Identifier object
345
+ build(value)
346
+
347
+ when :publisher
348
+ Components::Publisher.new(body: value)
349
+
350
+ when :copublishers
351
+ if value.nil? || value.empty?
352
+ nil
353
+ else
354
+ value.map do |copublisher|
355
+ Components::Publisher.new(body: copublisher[:copublisher])
356
+ end
357
+ end
358
+
359
+ when :technical_committee, :wd_number, :wd_stage, :wd_language, :wp_stage, :wp_type
360
+ # Working document/programme fields - just return as string
361
+ value.to_s
362
+
363
+ when :cispr_identifier
364
+ # CISPR identifier object for TRF
365
+ value
366
+
367
+ when :number
368
+ # Plain number for sub-org identifiers (CA, IECQ CS, IECQ OD)
369
+ # Just return as Code component
370
+ { number: Components::Code.new(value: value.to_s) }
371
+
372
+ when :number_with_part
373
+ # "60038" (no part)
374
+ # or "60038-1" ('1' is part)
375
+ # or "60038-1-2" ('1' is part, '2' is subpart)
376
+ # or "29110-5-1-1" ('5' is part, '1-1' is subpart)
377
+
378
+ # Split the number into parts
379
+ normalized_value = value.to_s.tr(Parser::DASH_CHARS.join, "-")
380
+
381
+ parts = normalized_value.split("-")
382
+ number = parts.shift # The first part is always the number
383
+ part = parts.shift # The second part is the part, if present
384
+ subpart = parts.any? ? parts.join("-") : nil # The remaining parts form the subpart, if present
385
+
386
+ part = convert_roman_to_integer(part)
387
+
388
+ code_hash = { number: Components::Code.new(value: number) }
389
+
390
+ if part
391
+ code_hash[:part] = Components::Code.new(value: part)
392
+ end
393
+
394
+ if subpart
395
+ code_hash[:subpart] = Components::Code.new(value: subpart)
396
+ end
397
+
398
+ code_hash
399
+
400
+ when :type_with_stage
401
+ # "WD"
402
+ # "TS"
403
+ # "Guide"
404
+ # FRAG typed stages are handled in the is_fragment check above
405
+
406
+ iteration = value.to_s.match(/(\d+)$/)
407
+ value = value.to_s.sub(iteration.to_s, "")
408
+ typed_stage = locate_typed_stage(value || "")
409
+
410
+ ## IMPORTANT!!
411
+ # Always use TypedStage in an Identifier or separate Type and Stage.
412
+ {
413
+ stage: typed_stage.to_stage,
414
+ type: typed_stage.to_type,
415
+ typed_stage: typed_stage,
416
+ }
417
+ when :stage_iteration
418
+ # "1" or "2"
419
+ Components::Code.new(value: value.to_s)
420
+
421
+ when :date
422
+ parse_date(value)
423
+
424
+ when :edition
425
+ Pubid::Components::Edition.new(number: value)
426
+
427
+ when :sheet_number
428
+ value.to_s
429
+
430
+ when :sheet_year
431
+ value.to_s
432
+
433
+ when :languages
434
+ parse_languages(value)
435
+
436
+ when :all_parts
437
+ Pubid::Components::Locality.new(all_parts: true)
438
+
439
+ when :database
440
+ # Database flag - return true if DB suffix present
441
+ true
442
+
443
+ # Handle joint identifiers with ISO
444
+ when :joint_identifier
445
+ case value[:publisher]
446
+ when "ISO"
447
+ require_relative "../iso/builder"
448
+ Iso::Builder.new(Iso::Scheme).build(value)
449
+ end
450
+
451
+ else
452
+ raise ArgumentError, "Unknown parameter type: #{type}"
453
+ end
454
+ end
455
+ end
456
+ end
457
+ end
@@ -0,0 +1,59 @@
1
+ require "lutaml/model"
2
+ # frozen_string_literal: true
3
+
4
+ module Pubid
5
+ module Iec
6
+ module Components
7
+ class Code < Lutaml::Model::Serializable
8
+ attribute :prefix, :string, default: -> {}
9
+ attribute :number, :string
10
+ attribute :part, :string, default: -> {}
11
+
12
+ def initialize(value: nil, number: nil, prefix: nil, part: nil)
13
+ # Support both 'value' (for convenience) and 'number' (explicit)
14
+ @number = value || number
15
+ @prefix = prefix
16
+ @part = part
17
+ end
18
+
19
+ def to_s
20
+ result = ""
21
+ result += "#{prefix} " if prefix
22
+ result += number
23
+ result += "-#{part}" if part
24
+ result
25
+ end
26
+
27
+ def full_code
28
+ to_s
29
+ end
30
+
31
+ # Parse IEC code formats:
32
+ # - "60034" (just number)
33
+ # - "60034-1" (number with part)
34
+ # - "TR 61000" (with prefix)
35
+ # - "TS 62443" (with prefix)
36
+ def self.parse(string)
37
+ parts = string.strip.split(" ", 2)
38
+
39
+ if parts.size == 2
40
+ # Has prefix: "TR 61000-1-2"
41
+ prefix = parts[0]
42
+ number_part = parts[1]
43
+ else
44
+ # No prefix: "60034-1"
45
+ prefix = nil
46
+ number_part = parts[0]
47
+ end
48
+
49
+ # Split number and part
50
+ number_parts = number_part.split("-", 2)
51
+ number = number_parts[0]
52
+ part = number_parts[1]
53
+
54
+ new(prefix: prefix, number: number, part: part)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,59 @@
1
+ require "lutaml/model"
2
+ # frozen_string_literal: true
3
+
4
+ module Pubid
5
+ module Iec
6
+ module Components
7
+ # Individual Amendment within a consolidated chain
8
+ # Single Responsibility: Represents a single amendment with number and year
9
+ class Amendment < Lutaml::Model::Serializable
10
+ attribute :number, :string
11
+ attribute :year, :string, default: -> {}
12
+
13
+ def to_s
14
+ result = "AMD#{number}"
15
+ result += ":#{year}" if year
16
+ result
17
+ end
18
+ end
19
+
20
+ # Consolidated Amendment component for chained amendments
21
+ # Single Responsibility: Represents multiple amendments combined with + notation
22
+ # Example: +AMD1:2020+AMD2:2022
23
+ class ConsolidatedAmendment < Lutaml::Model::Serializable
24
+ attribute :amendments, Amendment, collection: true
25
+
26
+ def to_s
27
+ amendments.map { |amd| "+#{amd}" }.join
28
+ end
29
+
30
+ # Parse consolidated amendment string like "+AMD1:2020+AMD2:2022"
31
+ # Each amendment has number and optional year
32
+ def self.parse(string)
33
+ amendment_parts = string.split("+").reject(&:empty?)
34
+
35
+ amendments = amendment_parts.filter_map do |part|
36
+ # Parse "AMD1:2020" format
37
+ if part =~ /AMD(\d+):(\d{4})/
38
+ Amendment.new(number: $1, year: $2)
39
+ elsif part =~ /AMD(\d+)/
40
+ Amendment.new(number: $1)
41
+ end
42
+ end
43
+
44
+ new(amendments: amendments)
45
+ end
46
+
47
+ # Check if this consolidated amendment is empty
48
+ def empty?
49
+ amendments.nil? || amendments.empty?
50
+ end
51
+
52
+ # Count of amendments in the chain
53
+ def count
54
+ amendments&.size || 0
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,35 @@
1
+ require "lutaml/model"
2
+ # frozen_string_literal: true
3
+
4
+ module Pubid
5
+ module Iec
6
+ module Components
7
+ class Publisher < Lutaml::Model::Serializable
8
+ PUBLISHERS = {
9
+ "IEC" => "International Electrotechnical Commission",
10
+ "ISO/IEC" => "ISO/IEC Joint Technical Committee",
11
+ "CISPR" => "International Special Committee on Radio Interference",
12
+ "IECEE" => "IEC System of Conformity Assessment Schemes for Electrotechnical Equipment and Components",
13
+ "IECEx" => "IEC System for Certification to Standards Relating to Equipment for Use in Explosive Atmospheres",
14
+ "IECQ" => "IEC Quality Assessment System for Electronic Components",
15
+ }.freeze
16
+
17
+ attribute :body, :string
18
+
19
+ def validate!
20
+ unless PUBLISHERS.key?(body)
21
+ raise ArgumentError, "Unknown IEC publisher: #{body}"
22
+ end
23
+ end
24
+
25
+ def to_s
26
+ body
27
+ end
28
+
29
+ def full_name
30
+ PUBLISHERS[body]
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ require "lutaml/model"
2
+ # frozen_string_literal: true
3
+
4
+ module Pubid
5
+ module Iec
6
+ module Components
7
+ # Sheet component for IEC sheet notation
8
+ # Single Responsibility: Represents sheet number in IEC identifiers
9
+ # Example: IEC 60695-2-1/1:1994 (where /1 is the sheet)
10
+ class Sheet < Lutaml::Model::Serializable
11
+ attribute :number, :string
12
+
13
+ def to_s
14
+ "/#{number}"
15
+ end
16
+
17
+ # Parse sheet notation from string like "/1" or "1"
18
+ def self.parse(string)
19
+ number = string.to_s.gsub("/", "")
20
+ new(number: number)
21
+ end
22
+
23
+ # Check if sheet number is valid (should be numeric)
24
+ def validate!
25
+ unless number.to_s.match?(/^\d+$/)
26
+ raise ArgumentError, "Sheet number must be numeric: #{number}"
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,38 @@
1
+ require "lutaml/model"
2
+ # frozen_string_literal: true
3
+
4
+ module Pubid
5
+ module Iec
6
+ module Components
7
+ # TRF Info component for Test Report Form specific metadata
8
+ # Single Responsibility: Represents TRF-specific publishing information
9
+ # Example: IECEE TRF or IECEx TRF publications
10
+ class TrfInfo < Lutaml::Model::Serializable
11
+ attribute :publisher, :string, default: -> {}
12
+ attribute :series, :string, default: -> {}
13
+ attribute :version, :string, default: -> {}
14
+
15
+ def to_s
16
+ parts = []
17
+ parts << publisher if publisher
18
+ parts << series if series
19
+ parts << "Ver.#{version}" if version
20
+ parts.join(" ")
21
+ end
22
+
23
+ # Check if TRF info is empty (no data)
24
+ def empty?
25
+ publisher.nil? && series.nil? && version.nil?
26
+ end
27
+
28
+ # Validate that at least publisher or series is present
29
+ def validate!
30
+ if empty?
31
+ raise ArgumentError,
32
+ "TrfInfo must have at least publisher or series"
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end