pubid 1.15.17 → 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,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../components/date"
4
+ require_relative "components/sector"
5
+ require_relative "components/series"
6
+ require_relative "components/code"
7
+ require_relative "identifiers/recommendation"
8
+ require_relative "identifiers/combined_identifier"
9
+ require_relative "identifiers/supplement"
10
+ require_relative "identifiers/amendment"
11
+ require_relative "identifiers/corrigendum"
12
+ require_relative "identifiers/special_publication"
13
+ require_relative "identifiers/annex"
14
+
15
+ module Pubid
16
+ module Itu
17
+ class Builder
18
+ def self.build(parsed_data)
19
+ new.build(parsed_data)
20
+ end
21
+
22
+ def build(data)
23
+ # "Annex to ..." identifier — wraps a Special Publication base
24
+ if data[:annex_to]
25
+ return build_annex(data[:annex_to])
26
+ end
27
+
28
+ # Operational Bulletin (Special Publication) — series == "OB" or
29
+ # legacy long form ("Operational Bulletin No. ...").
30
+ if data[:series].to_s == "OB" || data[:_op_bull]
31
+ return build_special_publication(data)
32
+ end
33
+
34
+ # Check if this is a supplement identifier
35
+ if data[:supplement_type]
36
+ return build_supplement(data)
37
+ end
38
+
39
+ # Build basic recommendation or combined identifier
40
+ sector = Components::Sector.new(sector: data[:sector].to_s)
41
+ series = Components::Series.new(series: data[:series].to_s) if data[:series]
42
+ code = build_code(data) if data[:number]
43
+ date = build_date(data) if data[:year]
44
+
45
+ # Check if this is a combined identifier (has combined_series and combined_number)
46
+ if data[:combined_series] || data[:combined_number]
47
+ if data[:combined_series]
48
+ combined_series = Components::Series.new(
49
+ series: data[:combined_series][:series].to_s,
50
+ )
51
+ end
52
+
53
+ if data[:combined_number]
54
+ combined_code = Components::Code.new(
55
+ number: data[:combined_number].to_s,
56
+ subseries: data[:combined_subseries]&.to_s,
57
+ parts: extract_parts(data[:combined_parts]),
58
+ )
59
+ end
60
+
61
+ return Identifiers::CombinedIdentifier.new(
62
+ sector: sector,
63
+ series: series,
64
+ code: code,
65
+ combined_series: combined_series,
66
+ combined_code: combined_code,
67
+ date: date,
68
+ language: data[:language]&.to_s,
69
+ )
70
+ end
71
+
72
+ Identifiers::Recommendation.new(
73
+ sector: sector,
74
+ series: series,
75
+ code: code,
76
+ date: date,
77
+ language: data[:language]&.to_s,
78
+ )
79
+ end
80
+
81
+ # Build Special Publication (OB). Sector is silently dropped — OB is a
82
+ # cross-bureau publication and `Identifiers::Base` rejects sector+OB
83
+ # in its constructor.
84
+ def build_special_publication(data)
85
+ Identifiers::SpecialPublication.new(
86
+ series: Components::Series.new(series: "OB"),
87
+ code: data[:number] ? build_code(data) : nil,
88
+ date: data[:year] ? build_date(data) : nil,
89
+ language: data[:language]&.to_s,
90
+ )
91
+ end
92
+
93
+ # Build "Annex to ..." identifier. The inner data is the Special
94
+ # Publication; the annex inherits its language.
95
+ def build_annex(inner_data)
96
+ base = build_special_publication(inner_data)
97
+ Identifiers::Annex.new(
98
+ base: base,
99
+ language: inner_data[:language]&.to_s,
100
+ )
101
+ end
102
+
103
+ def build_supplement(data)
104
+ # Build the base identifier first
105
+ base = build(data[:base]) if data[:base]
106
+
107
+ # Determine supplement type
108
+ supplement_type = data[:supplement_type].to_s.gsub(".", "")
109
+ klass = case supplement_type
110
+ when "Amd"
111
+ Identifiers::Amendment
112
+ when "Cor"
113
+ Identifiers::Corrigendum
114
+ when "Suppl"
115
+ Identifiers::Supplement
116
+ end
117
+
118
+ # Build supplement date (separate from base date)
119
+ supplement_date = if data[:supplement_year]
120
+ Pubid::Components::Date.new(
121
+ year: data[:supplement_year].to_s,
122
+ month: data[:supplement_month]&.to_s,
123
+ )
124
+ end
125
+
126
+ # Build supplement with extracted components
127
+ klass.new(
128
+ sector: base&.sector || Components::Sector.new(sector: data[:sector].to_s),
129
+ series: base&.series || (data[:series] ? Components::Series.new(series: data[:series].to_s) : nil),
130
+ code: base&.code,
131
+ base: base,
132
+ number: data[:supplement_number].to_s,
133
+ date: supplement_date,
134
+ language: data[:language]&.to_s,
135
+ )
136
+ end
137
+
138
+ private
139
+
140
+ def build_code(data)
141
+ Components::Code.new(
142
+ number: data[:number].to_s,
143
+ subseries: data[:subseries]&.to_s,
144
+ parts: extract_parts(data[:parts]),
145
+ )
146
+ end
147
+
148
+ def build_date(data)
149
+ Pubid::Components::Date.new(
150
+ year: data[:year].to_s,
151
+ month: data[:month]&.to_s,
152
+ )
153
+ end
154
+
155
+ def extract_parts(parts_data)
156
+ return [] unless parts_data
157
+
158
+ parts = []
159
+ if parts_data.is_a?(Array)
160
+ parts_data.each do |part_hash|
161
+ parts << part_hash[:part].to_s if part_hash[:part]
162
+ end
163
+ elsif parts_data.is_a?(Hash) && parts_data[:part]
164
+ parts << parts_data[:part].to_s
165
+ end
166
+
167
+ parts
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Components
8
+ # ITU Code component
9
+ # Format: NUMBER[.SUBSERIES][-PART]
10
+ # Examples: 1234, 1234.5, 1234-1, 1234.5-2
11
+ class Code < Lutaml::Model::Serializable
12
+ attribute :number, :string
13
+ attribute :subseries, :string
14
+ attribute :parts, :string, collection: true
15
+
16
+ def initialize(number:, subseries: nil, parts: nil)
17
+ @number = number
18
+ @subseries = subseries
19
+ @parts = parts || []
20
+ end
21
+
22
+ def to_s
23
+ result = number.to_s
24
+ result += ".#{subseries}" if subseries
25
+ result += parts.map { |p| "-#{p}" }.join if parts&.any?
26
+ result
27
+ end
28
+
29
+ def ==(other)
30
+ return false unless other.is_a?(Code)
31
+
32
+ number == other.number &&
33
+ subseries == other.subseries &&
34
+ parts == other.parts
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Components
8
+ # ITU Sector component
9
+ # Values: R (Radio), T (Telecommunications), D (Development)
10
+ class Sector < Lutaml::Model::Serializable
11
+ attribute :sector, :string # R, T, or D
12
+
13
+ VALID_SECTORS = %w[R T D].freeze
14
+
15
+ def initialize(sector:)
16
+ unless VALID_SECTORS.include?(sector.to_s.upcase)
17
+ raise ArgumentError, "Invalid sector: #{sector}. Must be R, T, or D"
18
+ end
19
+
20
+ @sector = sector.to_s.upcase
21
+ end
22
+
23
+ def to_s
24
+ sector
25
+ end
26
+
27
+ def ==(other)
28
+ return false unless other.is_a?(Sector)
29
+
30
+ sector == other.sector
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Components
8
+ # ITU Series component
9
+ # Examples: BO, V, X, A, etc.
10
+ class Series < Lutaml::Model::Serializable
11
+ attribute :series, :string # e.g., BO, V, X, R, SG1, OB
12
+
13
+ def initialize(series:)
14
+ @series = series
15
+ end
16
+
17
+ def to_s
18
+ series
19
+ end
20
+
21
+ def ==(other)
22
+ return false unless other.is_a?(Series)
23
+
24
+ series == other.series
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+
5
+ module Pubid
6
+ module Itu
7
+ I18N = YAML.load_file(File.expand_path("i18n.yaml", __dir__)).freeze
8
+ end
9
+ end
@@ -0,0 +1,30 @@
1
+ # Translations for ITU identifier rendering.
2
+ #
3
+ # Ported from v1 monorepo gems/pubid-itu/i18n.yaml — only the sections
4
+ # required by the "Annex to ITU OB" feature are populated here. The
5
+ # `type`/`publisher` sections used by the v1 recommendation renderer are
6
+ # intentionally omitted on v2: the v2 rendering pipeline does not yet wire
7
+ # them up (a separate effort).
8
+
9
+ # Translation of the "Annex to" prefix used when an annex has no number
10
+ # (i.e. the document IS the annex of a Special Publication, not a sub-annex).
11
+ # For Arabic the value is positioned as a postfix instead of a prefix.
12
+ # Languages with an annex_long entry below (fr/es/ru/zh) intentionally have
13
+ # no entry here — they use the long-form template for short rendering too,
14
+ # so French short matches French long etc. This avoids mixing the English
15
+ # "OB" abbreviation with localized text; ITU itself uses the localized
16
+ # abbreviation (e.g. "BE" in French/Spanish).
17
+ # German is not an official ITU language so no long template exists.
18
+ annex_to:
19
+ ar: "ملحق"
20
+ de: Anhang zum
21
+
22
+ # Long-form (title-style) templates for "Annex to ..." identifiers.
23
+ # Used both for to_s(format: :long) and for short rendering when no
24
+ # annex_to entry exists for the language.
25
+ annex_long:
26
+ fr: "Annexe au BE de l'UIT %{number}"
27
+ es: "Anexo al BE de la UIT N.º %{number}"
28
+ ar: "ملحق ابلنشرة التشغيلية رقم %{number}"
29
+ ru: "Приложение к ОБ МСЭ %{number}"
30
+ zh: "国际电联操作公报附件 第 %{number} 期"
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "parser"
4
+ require_relative "builder"
5
+ require_relative "identifiers"
6
+ require_relative "components/sector"
7
+ require_relative "components/series"
8
+ require_relative "components/code"
9
+
10
+ module Pubid
11
+ module Itu
12
+ module Identifier
13
+ def self.parse(identifier)
14
+ parsed = Parser.parse(identifier)
15
+ Builder.build(parsed)
16
+ rescue Parslet::ParseFailed => e
17
+ raise "Failed to parse ITU identifier '#{identifier}': #{e.message}"
18
+ end
19
+
20
+ # Factory mirroring v1's Pubid::Itu::Identifier.create API. The v1 form
21
+ # accepts a `type:` discriminator plus attribute kwargs; this v2
22
+ # implementation supports the subset needed by metanorma-itu PR #497:
23
+ # * type: :annex — builds Identifiers::Annex
24
+ # * series: "OB" (with no type:) — builds Identifiers::SpecialPublication
25
+ def self.create(type: nil, **kwargs)
26
+ case type
27
+ when :annex
28
+ Identifiers::Annex.new(**kwargs)
29
+ when nil
30
+ if kwargs[:series].to_s == "OB"
31
+ create_special_publication(**kwargs)
32
+ else
33
+ raise ArgumentError,
34
+ "Identifier.create without :type requires series: 'OB'"
35
+ end
36
+ else
37
+ raise ArgumentError,
38
+ "Unsupported type for Identifier.create: #{type.inspect}"
39
+ end
40
+ end
41
+
42
+ def self.create_special_publication(number:, series: "OB", date: nil,
43
+ language: nil)
44
+ Identifiers::SpecialPublication.new(
45
+ series: Components::Series.new(series: series.to_s),
46
+ code: Components::Code.new(number: number.to_s),
47
+ date: date,
48
+ language: language&.to_s,
49
+ )
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "supplement"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Identifiers
8
+ # Amendment identifier (Amd)
9
+ # Pattern: "ITU-T G.989 Amd 1", "ITU-T G.780/Y.1351 Amd 1 (2004)"
10
+ class Amendment < Supplement
11
+ def to_s
12
+ result = base ? base.to_s : "#{publisher}-#{sector}"
13
+
14
+ # Add series if no base
15
+ if !base && series
16
+ result += " #{series}"
17
+ end
18
+
19
+ result += " Amd #{number}"
20
+
21
+ # Add date if present
22
+ if date
23
+ result += if date.month
24
+ " (#{date.month}/#{date.year})"
25
+ else
26
+ " (#{date.year})"
27
+ end
28
+ end
29
+
30
+ result
31
+ end
32
+
33
+ def ==(other)
34
+ return false unless other.is_a?(Amendment)
35
+
36
+ base == other.base &&
37
+ number == other.number &&
38
+ date == other.date
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Identifiers
8
+ # "Annex to ..." identifier — the document IS the annex of a Special
9
+ # Publication (e.g. an annex to ITU OB), not a sub-annex with a number.
10
+ #
11
+ # Three rendering forms (per v1 PR #38):
12
+ # * default (no i18n_lang): English structural, "Annex to ITU OB No. 1000"
13
+ # * short with i18n_lang: structural translation using `annex_to`
14
+ # * long with i18n_lang + format: :long: per-language `annex_long` template
15
+ # Languages without an `annex_to` entry (fr/es/ru/zh) use the long
16
+ # template for the short form too.
17
+ class Annex < Base
18
+ attribute :base, Base, polymorphic: true
19
+
20
+ def to_urn
21
+ # Annex URN: append :annex to the inner identifier's URN.
22
+ base_urn = base&.to_urn
23
+ return "urn:itu:annex" unless base_urn
24
+
25
+ "#{base_urn}:annex"
26
+ end
27
+
28
+ def render_base(**opts)
29
+ lang = opts[:i18n_lang]&.to_s
30
+ long_template = lang && Pubid::Itu::I18N["annex_long"]&.fetch(lang,
31
+ nil)
32
+
33
+ if opts[:format] == :long && long_template
34
+ return long_template % { number: base_number }
35
+ end
36
+
37
+ annex_translation = lang && Pubid::Itu::I18N["annex_to"]&.fetch(lang,
38
+ nil)
39
+
40
+ if annex_translation
41
+ base_str = base_render(**opts)
42
+ return "#{base_str} #{annex_translation}" if lang == "ar"
43
+
44
+ return "#{annex_translation} #{base_str}"
45
+ end
46
+
47
+ if long_template
48
+ return long_template % { number: base_number }
49
+ end
50
+
51
+ "Annex to #{base_render(**opts)}"
52
+ end
53
+
54
+ def ==(other)
55
+ return false unless other.is_a?(Annex)
56
+
57
+ base == other.base && language == other.language
58
+ end
59
+
60
+ private
61
+
62
+ def base_render(**opts)
63
+ base&.render_base(**opts) || ""
64
+ end
65
+
66
+ def base_number
67
+ return code&.number if code
68
+
69
+ base&.code&.number
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../components/date"
4
+ require_relative "../components/sector"
5
+ require_relative "../components/series"
6
+ require_relative "../components/code"
7
+ require_relative "../i18n"
8
+
9
+ module Pubid
10
+ module Itu
11
+ module Identifiers
12
+ # Base class for all ITU identifiers
13
+ class Base < Pubid::Identifier
14
+ # Long-form ↔ ITU single-letter language code map. The parser produces
15
+ # single-letter codes (E/F/S/R/A/C); API callers (e.g. metanorma-itu)
16
+ # pass long-form (en/fr/es/ru/ar/zh). Storage is normalized to the
17
+ # single-letter form. Languages with no canonical letter (e.g. "de")
18
+ # pass through unchanged and produce no trailing suffix.
19
+ LANGUAGES = {
20
+ "fr" => "F", "es" => "S", "ru" => "R",
21
+ "ar" => "A", "zh" => "C", "en" => "E",
22
+ "F" => "F", "S" => "S", "R" => "R",
23
+ "A" => "A", "C" => "C", "E" => "E"
24
+ }.freeze
25
+
26
+ attribute :sector, Pubid::Itu::Components::Sector
27
+ attribute :series, Pubid::Itu::Components::Series
28
+ attribute :code, Pubid::Itu::Components::Code
29
+ attribute :date, Pubid::Components::Date
30
+ attribute :language, :string
31
+
32
+ def initialize(**kwargs)
33
+ if kwargs[:language]
34
+ kwargs = kwargs.merge(language: normalize_language(kwargs[:language]))
35
+ end
36
+
37
+ super
38
+
39
+ validate_ob_no_sector!
40
+ end
41
+
42
+ # Generate URN for this identifier
43
+ #
44
+ # @return [String] URN representation
45
+
46
+ # Override base_hash to handle ITU-specific attributes
47
+ def base_hash
48
+ hash = super
49
+ # ITU Series has a 'series' attribute, not 'number'
50
+ if hash[:series].is_a?(Hash) && series
51
+ hash[:series] = series.series
52
+ end
53
+ # Add sector (ITU-specific, has a 'sector' attribute)
54
+ hash[:sector] = sector.sector if sector
55
+ hash
56
+ end
57
+
58
+ def publisher
59
+ "ITU"
60
+ end
61
+
62
+ # Render identifier as a string.
63
+ #
64
+ # @param i18n_lang [Symbol, String] language for identifier text
65
+ # translation (e.g. :fr renders "Annex to" as "Annexe au"). Distinct
66
+ # from the identifier's `language` attribute, which is the document's
67
+ # own language and produces the trailing suffix like "-F".
68
+ # @param language [Symbol, String] deprecated alias for i18n_lang.
69
+ # @param format [Symbol] :long for title-style rendering of supported
70
+ # identifiers, otherwise the default short form.
71
+ def to_s(**opts)
72
+ opts = self.class.normalize_to_s_opts(opts)
73
+ render_base(**opts) + render_language_suffix
74
+ end
75
+
76
+ def render_base(**_opts)
77
+ result = "#{publisher}-#{sector}"
78
+
79
+ # Add series and code
80
+ result += if series
81
+ " #{series}.#{code}"
82
+ else
83
+ " #{code}"
84
+ end
85
+
86
+ # Add date if present
87
+ if date
88
+ result += if date.month
89
+ " (#{date.month}/#{date.year})"
90
+ else
91
+ " (#{date.year})"
92
+ end
93
+ end
94
+
95
+ result
96
+ end
97
+
98
+ def render_language_suffix
99
+ return "" unless language
100
+ # Only render canonical single-letter ITU language codes
101
+ # (e.g. "F", "S"). Languages with no mapping (e.g. "de") get
102
+ # no suffix — matches v1 PR #38 render_language behavior.
103
+ return "" unless LANGUAGES.value?(language)
104
+
105
+ "-#{language}"
106
+ end
107
+
108
+ # Translate `language:` opt to `i18n_lang:` opt. v1 PR #38 introduced
109
+ # `i18n_lang:` to disambiguate "rendering language" from the document
110
+ # language attribute; `language:` remains a deprecated alias.
111
+ def self.normalize_to_s_opts(opts)
112
+ opts = opts.dup
113
+ if opts.key?(:language) && !opts.key?(:i18n_lang)
114
+ opts[:i18n_lang] = opts.delete(:language)
115
+ else
116
+ opts.delete(:language)
117
+ end
118
+ opts
119
+ end
120
+
121
+ def ==(other)
122
+ return false unless other.is_a?(Base)
123
+
124
+ sector == other.sector &&
125
+ series == other.series &&
126
+ code == other.code &&
127
+ date == other.date &&
128
+ language == other.language
129
+ end
130
+
131
+ private
132
+
133
+ def normalize_language(value)
134
+ str = value.to_s
135
+ LANGUAGES[str] || str
136
+ end
137
+
138
+ # OB (Operational Bulletin) is a cross-bureau ITU publication and
139
+ # must not have a sector. Direct construction with both raises;
140
+ # the parser silently drops sector for legacy strings like
141
+ # "ITU-T OB.X" (handled in Builder).
142
+ def validate_ob_no_sector!
143
+ return unless series&.series == "OB"
144
+ return if sector.nil?
145
+ return if sector.is_a?(Components::Sector) && (sector.sector.nil? || sector.sector.to_s.empty?)
146
+
147
+ raise ArgumentError,
148
+ "OB (Operational Bulletin) is a cross-bureau ITU publication; " \
149
+ "sector must not be set"
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Identifiers
8
+ # Combined identifier for dual-series recommendations
9
+ # Format: ITU-T G.780/Y.1351
10
+ # Example: ITU-T G.780/Y.1351 (2004)
11
+ class CombinedIdentifier < Base
12
+ attribute :combined_series, Pubid::Itu::Components::Series
13
+ attribute :combined_code, Pubid::Itu::Components::Code
14
+
15
+ def to_s
16
+ result = "#{publisher}-#{sector}"
17
+
18
+ # Add primary series and code
19
+ result += if series
20
+ " #{series}.#{code}"
21
+ else
22
+ " #{code}"
23
+ end
24
+
25
+ # Add combined series and code
26
+ if combined_series && combined_code
27
+ result += "/#{combined_series}.#{combined_code}"
28
+ end
29
+
30
+ # Add date if present
31
+ if date
32
+ result += if date.month
33
+ " (#{date.month}/#{date.year})"
34
+ else
35
+ " (#{date.year})"
36
+ end
37
+ end
38
+
39
+ # Add language
40
+ result += "-#{language}" if language
41
+
42
+ result
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end