pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.4

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 (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +25 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +4 -55
  6. data/lib/pubid/amca/identifiers/base.rb +58 -47
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -21
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -17
  9. data/lib/pubid/amca/identifiers/standard.rb +0 -4
  10. data/lib/pubid/amca/renderer.rb +82 -0
  11. data/lib/pubid/amca/single_identifier.rb +0 -23
  12. data/lib/pubid/amca/urn_generator.rb +2 -1
  13. data/lib/pubid/amca/urn_parser.rb +28 -0
  14. data/lib/pubid/amca.rb +42 -1
  15. data/lib/pubid/ansi/builder.rb +5 -3
  16. data/lib/pubid/ansi/identifier.rb +1 -43
  17. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  18. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  19. data/lib/pubid/ansi/renderer.rb +53 -0
  20. data/lib/pubid/ansi/single_identifier.rb +2 -31
  21. data/lib/pubid/ansi/urn_generator.rb +3 -38
  22. data/lib/pubid/ansi/urn_parser.rb +23 -0
  23. data/lib/pubid/ansi.rb +38 -3
  24. data/lib/pubid/api/builder.rb +33 -74
  25. data/lib/pubid/api/identifier.rb +5 -52
  26. data/lib/pubid/api/identifiers/base.rb +2 -14
  27. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  28. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  29. data/lib/pubid/api/identifiers/mpms.rb +0 -20
  30. data/lib/pubid/api/identifiers/publication.rb +0 -2
  31. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  32. data/lib/pubid/api/identifiers/specification.rb +0 -2
  33. data/lib/pubid/api/identifiers/standard.rb +0 -2
  34. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  35. data/lib/pubid/api/identifiers/typeless_standard.rb +0 -16
  36. data/lib/pubid/api/identifiers.rb +18 -0
  37. data/lib/pubid/api/renderer.rb +89 -0
  38. data/lib/pubid/api/single_identifier.rb +5 -20
  39. data/lib/pubid/api/urn_generator.rb +0 -18
  40. data/lib/pubid/api/urn_parser.rb +35 -0
  41. data/lib/pubid/api.rb +51 -5
  42. data/lib/pubid/ashrae/builder.rb +3 -3
  43. data/lib/pubid/ashrae/identifier.rb +7 -55
  44. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  45. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  46. data/lib/pubid/ashrae/identifiers/base.rb +29 -15
  47. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  48. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  49. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  50. data/lib/pubid/ashrae/parser.rb +4 -0
  51. data/lib/pubid/ashrae/renderer.rb +117 -0
  52. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  53. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  54. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  55. data/lib/pubid/ashrae.rb +46 -1
  56. data/lib/pubid/asme/components/code.rb +10 -2
  57. data/lib/pubid/asme/identifier.rb +0 -46
  58. data/lib/pubid/asme/identifiers/base.rb +0 -60
  59. data/lib/pubid/asme/renderer.rb +66 -0
  60. data/lib/pubid/asme/single_identifier.rb +3 -1
  61. data/lib/pubid/asme/urn_parser.rb +31 -0
  62. data/lib/pubid/asme.rb +42 -1
  63. data/lib/pubid/astm/components/code.rb +9 -0
  64. data/lib/pubid/{jis → astm}/components.rb +1 -1
  65. data/lib/pubid/astm/identifier.rb +0 -77
  66. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  67. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  68. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  69. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  70. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  71. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  72. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  73. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  74. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  75. data/lib/pubid/astm/identifiers.rb +18 -0
  76. data/lib/pubid/astm/renderer.rb +172 -0
  77. data/lib/pubid/astm/single_identifier.rb +3 -11
  78. data/lib/pubid/astm/urn_parser.rb +30 -0
  79. data/lib/pubid/astm.rb +39 -27
  80. data/lib/pubid/bsi/builder.rb +21 -12
  81. data/lib/pubid/bsi/identifier.rb +5 -85
  82. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -36
  83. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +8 -48
  84. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +8 -39
  85. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +2 -55
  86. data/lib/pubid/bsi/identifiers/amendment.rb +2 -22
  87. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +1 -6
  88. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  89. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -87
  90. data/lib/pubid/bsi/identifiers/committee_document.rb +0 -16
  91. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -87
  92. data/lib/pubid/bsi/identifiers/corrigendum.rb +2 -10
  93. data/lib/pubid/bsi/identifiers/detailed_specification.rb +0 -36
  94. data/lib/pubid/bsi/identifiers/disc.rb +0 -29
  95. data/lib/pubid/bsi/identifiers/draft_document.rb +2 -46
  96. data/lib/pubid/bsi/identifiers/electronic_book.rb +2 -38
  97. data/lib/pubid/bsi/identifiers/expert_commentary.rb +2 -18
  98. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +0 -47
  99. data/lib/pubid/bsi/identifiers/flex.rb +0 -35
  100. data/lib/pubid/bsi/identifiers/handbook.rb +1 -15
  101. data/lib/pubid/bsi/identifiers/index.rb +0 -32
  102. data/lib/pubid/bsi/identifiers/method.rb +0 -41
  103. data/lib/pubid/bsi/identifiers/national_annex.rb +4 -29
  104. data/lib/pubid/bsi/identifiers/practice_guide.rb +1 -6
  105. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +2 -54
  106. data/lib/pubid/bsi/identifiers/published_document.rb +2 -54
  107. data/lib/pubid/bsi/identifiers/section.rb +0 -30
  108. data/lib/pubid/bsi/identifiers/set.rb +3 -20
  109. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +0 -9
  110. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -24
  111. data/lib/pubid/bsi/identifiers/supplementary_index.rb +0 -46
  112. data/lib/pubid/bsi/identifiers/technical_specification.rb +2 -47
  113. data/lib/pubid/bsi/identifiers/test_method.rb +0 -32
  114. data/lib/pubid/bsi/identifiers/value_added_publication.rb +2 -17
  115. data/lib/pubid/bsi/identifiers.rb +0 -1
  116. data/lib/pubid/bsi/renderer.rb +1050 -0
  117. data/lib/pubid/bsi/single_identifier.rb +33 -78
  118. data/lib/pubid/bsi/urn_generator.rb +2 -3
  119. data/lib/pubid/bsi/urn_parser.rb +52 -0
  120. data/lib/pubid/bsi.rb +232 -2
  121. data/lib/pubid/builder/base.rb +57 -10
  122. data/lib/pubid/bundled_identifier.rb +0 -1
  123. data/lib/pubid/ccsds/builder.rb +4 -3
  124. data/lib/pubid/ccsds/identifier.rb +53 -68
  125. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  126. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  127. data/lib/pubid/ccsds/parser.rb +4 -2
  128. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  129. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  130. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  131. data/lib/pubid/ccsds.rb +39 -1
  132. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  133. data/lib/pubid/cen_cenelec/identifier.rb +11 -40
  134. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +9 -4
  135. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +0 -10
  136. data/lib/pubid/cen_cenelec/identifiers/base.rb +2 -45
  137. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +0 -27
  140. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +0 -15
  141. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +2 -8
  143. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +0 -4
  145. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  146. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  147. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  148. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  149. data/lib/pubid/cen_cenelec/single_identifier.rb +9 -90
  150. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  151. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  152. data/lib/pubid/cen_cenelec.rb +172 -1
  153. data/lib/pubid/cie/components/code.rb +8 -0
  154. data/lib/pubid/cie/identifier.rb +10 -57
  155. data/lib/pubid/cie/single_identifier.rb +4 -4
  156. data/lib/pubid/cie/urn_parser.rb +28 -0
  157. data/lib/pubid/cie.rb +47 -1
  158. data/lib/pubid/components/adoption.rb +104 -0
  159. data/lib/pubid/components/code.rb +22 -8
  160. data/lib/pubid/components/date.rb +23 -16
  161. data/lib/pubid/components/edition.rb +9 -6
  162. data/lib/pubid/components/iteration.rb +32 -0
  163. data/lib/pubid/components/language.rb +6 -4
  164. data/lib/pubid/components/locality.rb +10 -1
  165. data/lib/pubid/components/publisher.rb +9 -6
  166. data/lib/pubid/components/relationship.rb +151 -0
  167. data/lib/pubid/components/stage.rb +5 -14
  168. data/lib/pubid/components/supplement.rb +184 -0
  169. data/lib/pubid/components/type.rb +5 -15
  170. data/lib/pubid/components/typed_stage.rb +10 -11
  171. data/lib/pubid/components.rb +4 -1
  172. data/lib/pubid/core/update_codes.rb +28 -7
  173. data/lib/pubid/csa/identifier.rb +9 -59
  174. data/lib/pubid/csa/identifiers/base.rb +0 -123
  175. data/lib/pubid/csa/identifiers/cec.rb +0 -103
  176. data/lib/pubid/csa/identifiers/series.rb +0 -104
  177. data/lib/pubid/csa/renderer.rb +292 -0
  178. data/lib/pubid/csa/single_identifier.rb +1 -1
  179. data/lib/pubid/csa/urn_generator.rb +1 -1
  180. data/lib/pubid/csa/urn_parser.rb +33 -0
  181. data/lib/pubid/csa.rb +46 -1
  182. data/lib/pubid/etsi/components/code.rb +10 -9
  183. data/lib/pubid/etsi/components/version.rb +0 -5
  184. data/lib/pubid/etsi/identifier.rb +4 -55
  185. data/lib/pubid/etsi/identifiers/base.rb +31 -27
  186. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +1 -11
  187. data/lib/pubid/etsi/renderer.rb +42 -0
  188. data/lib/pubid/etsi/urn_parser.rb +34 -0
  189. data/lib/pubid/etsi.rb +44 -1
  190. data/lib/pubid/export/exporter.rb +4 -46
  191. data/lib/pubid/export/flavor_exporter.rb +111 -278
  192. data/lib/pubid/export.rb +0 -6
  193. data/lib/pubid/identifier.rb +92 -18
  194. data/lib/pubid/identifier_metadata.rb +1 -1
  195. data/lib/pubid/idf/builder.rb +3 -3
  196. data/lib/pubid/idf/identifier.rb +7 -66
  197. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  198. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  199. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  200. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  201. data/lib/pubid/idf/parser.rb +3 -2
  202. data/lib/pubid/idf/renderer.rb +84 -0
  203. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  204. data/lib/pubid/idf/urn_generator.rb +4 -39
  205. data/lib/pubid/idf/urn_parser.rb +25 -0
  206. data/lib/pubid/idf.rb +55 -1
  207. data/lib/pubid/iec/builder.rb +46 -64
  208. data/lib/pubid/iec/components/code.rb +8 -32
  209. data/lib/pubid/iec/components/publisher.rb +0 -1
  210. data/lib/pubid/iec/components.rb +14 -0
  211. data/lib/pubid/iec/identifier.rb +251 -213
  212. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  213. data/lib/pubid/iec/identifiers/base.rb +5 -33
  214. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  215. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  216. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +23 -26
  217. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  218. data/lib/pubid/iec/identifiers/fragment_identifier.rb +35 -24
  219. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  220. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  221. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  222. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  223. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  224. data/lib/pubid/iec/identifiers/sheet_identifier.rb +17 -11
  225. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  226. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  227. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  228. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  229. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  230. data/lib/pubid/iec/identifiers/test_report_form.rb +3 -35
  231. data/lib/pubid/iec/identifiers/vap_identifier.rb +24 -21
  232. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  233. data/lib/pubid/iec/identifiers/working_document.rb +2 -50
  234. data/lib/pubid/iec/identifiers.rb +30 -0
  235. data/lib/pubid/iec/parser.rb +13 -12
  236. data/lib/pubid/iec/renderer.rb +254 -0
  237. data/lib/pubid/iec/single_identifier.rb +6 -12
  238. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  239. data/lib/pubid/iec/urn_generator.rb +3 -3
  240. data/lib/pubid/iec/urn_parser.rb +3 -3
  241. data/lib/pubid/iec.rb +43 -67
  242. data/lib/pubid/ieee/builder.rb +12 -12
  243. data/lib/pubid/ieee/components/code.rb +8 -0
  244. data/lib/pubid/ieee/components/draft.rb +14 -0
  245. data/lib/pubid/ieee/components/relationship.rb +5 -149
  246. data/lib/pubid/ieee/identifier.rb +5 -52
  247. data/lib/pubid/ieee/identifiers/adopted_standard.rb +0 -9
  248. data/lib/pubid/ieee/identifiers/base.rb +221 -556
  249. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +0 -10
  250. data/lib/pubid/ieee/identifiers/corrigendum.rb +0 -12
  251. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +0 -10
  252. data/lib/pubid/ieee/identifiers/dual_identifier.rb +0 -4
  253. data/lib/pubid/ieee/identifiers/dual_published.rb +0 -4
  254. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +0 -9
  255. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +0 -10
  256. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  257. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +0 -18
  258. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +0 -6
  259. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  260. data/lib/pubid/ieee/identifiers/redlined_standard.rb +0 -7
  261. data/lib/pubid/ieee/identifiers/si_standard.rb +0 -38
  262. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  263. data/lib/pubid/ieee/pre_parser.rb +301 -0
  264. data/lib/pubid/ieee/renderer.rb +307 -0
  265. data/lib/pubid/ieee/urn_parser.rb +34 -0
  266. data/lib/pubid/ieee.rb +66 -1
  267. data/lib/pubid/ieee_debug.rb +0 -1
  268. data/lib/pubid/iho/builder.rb +2 -2
  269. data/lib/pubid/iho/identifier.rb +7 -59
  270. data/lib/pubid/iho/identifiers/base.rb +64 -31
  271. data/lib/pubid/iho/parser.rb +3 -3
  272. data/lib/pubid/iho/renderer.rb +30 -0
  273. data/lib/pubid/iho/urn_generator.rb +2 -2
  274. data/lib/pubid/iho/urn_parser.rb +58 -0
  275. data/lib/pubid/iho.rb +52 -1
  276. data/lib/pubid/iso/builder.rb +55 -53
  277. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  278. data/lib/pubid/iso/components/code.rb +7 -19
  279. data/lib/pubid/iso/components/publisher.rb +10 -8
  280. data/lib/pubid/iso/components.rb +2 -4
  281. data/lib/pubid/iso/identifier.rb +219 -252
  282. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  283. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  284. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  285. data/lib/pubid/iso/identifiers/data.rb +0 -1
  286. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  287. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  288. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  289. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  290. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  291. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  292. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  293. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  294. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  295. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  296. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  297. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  298. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  299. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  300. data/lib/pubid/iso/identifiers.rb +0 -1
  301. data/lib/pubid/iso/normalizer.rb +89 -0
  302. data/lib/pubid/iso/parser.rb +22 -4
  303. data/lib/pubid/iso/single_identifier.rb +0 -4
  304. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  305. data/lib/pubid/iso/urn_generator.rb +66 -182
  306. data/lib/pubid/iso/urn_parser.rb +12 -7
  307. data/lib/pubid/iso.rb +177 -2
  308. data/lib/pubid/itu/builder.rb +0 -12
  309. data/lib/pubid/itu/components/code.rb +9 -7
  310. data/lib/pubid/itu/components/sector.rb +15 -4
  311. data/lib/pubid/itu/components/series.rb +0 -4
  312. data/lib/pubid/itu/components.rb +11 -0
  313. data/lib/pubid/itu/identifier.rb +4 -116
  314. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  315. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  316. data/lib/pubid/itu/identifiers/base.rb +124 -128
  317. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  318. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  319. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  320. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  321. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  322. data/lib/pubid/itu/urn_parser.rb +23 -0
  323. data/lib/pubid/itu.rb +44 -1
  324. data/lib/pubid/jcgm/builder.rb +16 -8
  325. data/lib/pubid/jcgm/identifier.rb +0 -43
  326. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -9
  327. data/lib/pubid/jcgm/identifiers/gum_guide.rb +0 -12
  328. data/lib/pubid/jcgm/renderer.rb +68 -0
  329. data/lib/pubid/jcgm/single_identifier.rb +0 -8
  330. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  331. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  332. data/lib/pubid/jcgm.rb +43 -2
  333. data/lib/pubid/jis/builder.rb +44 -52
  334. data/lib/pubid/jis/identifier.rb +120 -46
  335. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  336. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  337. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  338. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  339. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  340. data/lib/pubid/jis/identifiers.rb +1 -1
  341. data/lib/pubid/jis/parser.rb +31 -5
  342. data/lib/pubid/jis/renderer.rb +69 -0
  343. data/lib/pubid/jis/single_identifier.rb +6 -12
  344. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  345. data/lib/pubid/jis/urn_parser.rb +23 -0
  346. data/lib/pubid/jis.rb +42 -2
  347. data/lib/pubid/nist/builder.rb +63 -1871
  348. data/lib/pubid/nist/caster.rb +1272 -0
  349. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  350. data/lib/pubid/nist/components/code.rb +9 -20
  351. data/lib/pubid/nist/components/supplement.rb +2 -2
  352. data/lib/pubid/nist/components.rb +0 -1
  353. data/lib/pubid/nist/identifier.rb +8 -60
  354. data/lib/pubid/nist/identifiers/base.rb +564 -492
  355. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  356. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  358. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  359. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  360. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  361. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  362. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  363. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  364. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  365. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  366. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  367. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  368. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  369. data/lib/pubid/nist/identifiers/report.rb +4 -2
  370. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  371. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  372. data/lib/pubid/nist/identifiers.rb +1 -0
  373. data/lib/pubid/nist/parser.rb +62 -452
  374. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  375. data/lib/pubid/nist/preprocessor.rb +428 -0
  376. data/lib/pubid/nist/renderer.rb +43 -0
  377. data/lib/pubid/nist/router.rb +148 -0
  378. data/lib/pubid/nist/series/base.rb +58 -0
  379. data/lib/pubid/nist/series/crpl.rb +13 -0
  380. data/lib/pubid/nist/series/fips.rb +14 -0
  381. data/lib/pubid/nist/series/ir.rb +60 -0
  382. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  383. data/lib/pubid/nist/series/mono.rb +19 -0
  384. data/lib/pubid/nist/series/ncstar.rb +20 -0
  385. data/lib/pubid/nist/series.rb +49 -0
  386. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  387. data/lib/pubid/nist/urn_parser.rb +67 -0
  388. data/lib/pubid/nist.rb +86 -4
  389. data/lib/pubid/oiml/builder.rb +21 -3
  390. data/lib/pubid/oiml/components/code.rb +17 -0
  391. data/lib/pubid/oiml/identifier.rb +40 -46
  392. data/lib/pubid/oiml/identifiers/annex.rb +13 -46
  393. data/lib/pubid/oiml/identifiers/errata.rb +15 -0
  394. data/lib/pubid/oiml/identifiers.rb +1 -1
  395. data/lib/pubid/oiml/parser.rb +59 -12
  396. data/lib/pubid/oiml/renderer.rb +171 -0
  397. data/lib/pubid/oiml/single_identifier.rb +61 -42
  398. data/lib/pubid/oiml/supplement_identifier.rb +31 -17
  399. data/lib/pubid/oiml/urn_generator.rb +0 -8
  400. data/lib/pubid/oiml/urn_parser.rb +22 -0
  401. data/lib/pubid/oiml.rb +42 -1
  402. data/lib/pubid/plateau/identifier.rb +4 -55
  403. data/lib/pubid/plateau/identifiers/base.rb +45 -36
  404. data/lib/pubid/plateau/identifiers/handbook.rb +0 -6
  405. data/lib/pubid/plateau/identifiers/technical_report.rb +0 -4
  406. data/lib/pubid/plateau/renderer.rb +51 -0
  407. data/lib/pubid/plateau/supplement_identifier.rb +0 -4
  408. data/lib/pubid/plateau/urn_parser.rb +43 -0
  409. data/lib/pubid/plateau.rb +43 -1
  410. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  411. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  412. data/lib/pubid/renderers/human_readable.rb +18 -7
  413. data/lib/pubid/rendering/context.rb +28 -19
  414. data/lib/pubid/rendering.rb +0 -3
  415. data/lib/pubid/sae/components/date.rb +8 -0
  416. data/lib/pubid/sae/components/type.rb +5 -1
  417. data/lib/pubid/sae/identifier.rb +4 -35
  418. data/lib/pubid/sae/identifiers/base.rb +26 -31
  419. data/lib/pubid/sae/renderer.rb +36 -0
  420. data/lib/pubid/sae/urn_generator.rb +2 -10
  421. data/lib/pubid/sae/urn_parser.rb +36 -0
  422. data/lib/pubid/sae.rb +42 -1
  423. data/lib/pubid/urn_generator/base.rb +12 -12
  424. data/lib/pubid/urn_parser/base.rb +81 -0
  425. data/lib/pubid/urn_parser/errors.rb +9 -0
  426. data/lib/pubid/urn_parser.rb +14 -0
  427. data/lib/pubid/version.rb +1 -1
  428. data/lib/pubid.rb +45 -7
  429. data/lib/tasks/export.rake +6 -5
  430. data/lib/tasks/website-data.json +1940 -1882
  431. metadata +75 -45
  432. data/lib/pubid/amca/scheme.rb +0 -16
  433. data/lib/pubid/ansi/scheme.rb +0 -15
  434. data/lib/pubid/api/scheme.rb +0 -66
  435. data/lib/pubid/ashrae/scheme.rb +0 -53
  436. data/lib/pubid/asme/scheme.rb +0 -37
  437. data/lib/pubid/astm/scheme.rb +0 -55
  438. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  439. data/lib/pubid/bsi/scheme.rb +0 -243
  440. data/lib/pubid/ccsds/scheme.rb +0 -57
  441. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  442. data/lib/pubid/cie/scheme.rb +0 -64
  443. data/lib/pubid/components/factory.rb +0 -50
  444. data/lib/pubid/csa/scheme.rb +0 -44
  445. data/lib/pubid/etsi/scheme.rb +0 -42
  446. data/lib/pubid/export/data_class_exporter.rb +0 -59
  447. data/lib/pubid/export/ieee_exporter.rb +0 -78
  448. data/lib/pubid/export/itu_exporter.rb +0 -66
  449. data/lib/pubid/export/nist_exporter.rb +0 -64
  450. data/lib/pubid/export/registry_exporter.rb +0 -90
  451. data/lib/pubid/export/scheme_exporter.rb +0 -70
  452. data/lib/pubid/identifier_registry.rb +0 -198
  453. data/lib/pubid/idf/scheme.rb +0 -61
  454. data/lib/pubid/iec/scheme.rb +0 -71
  455. data/lib/pubid/ieee/scheme.rb +0 -90
  456. data/lib/pubid/iho/scheme.rb +0 -29
  457. data/lib/pubid/iso/identifiers/base.rb +0 -115
  458. data/lib/pubid/iso/scheme.rb +0 -193
  459. data/lib/pubid/itu/scheme.rb +0 -174
  460. data/lib/pubid/jcgm/scheme.rb +0 -60
  461. data/lib/pubid/jis/components/code.rb +0 -59
  462. data/lib/pubid/jis/identifiers/base.rb +0 -72
  463. data/lib/pubid/jis/scheme.rb +0 -49
  464. data/lib/pubid/nist/components/publisher.rb +0 -24
  465. data/lib/pubid/nist/scheme.rb +0 -199
  466. data/lib/pubid/oiml/identifiers/base.rb +0 -36
  467. data/lib/pubid/oiml/scheme.rb +0 -46
  468. data/lib/pubid/plateau/scheme.rb +0 -45
  469. data/lib/pubid/rendering/base.rb +0 -73
  470. data/lib/pubid/rendering/common.rb +0 -211
  471. data/lib/pubid/rendering/format.rb +0 -25
  472. data/lib/pubid/sae/scheme.rb +0 -47
  473. data/lib/pubid/scheme.rb +0 -219
data/lib/pubid/iso.rb CHANGED
@@ -11,9 +11,9 @@ module Pubid
11
11
  autoload :FormatResolver, "#{__dir__}/iso/format_resolver"
12
12
  autoload :Identifier, "#{__dir__}/iso/identifier"
13
13
  autoload :Identifiers, "#{__dir__}/iso/identifiers"
14
+ autoload :Normalizer, "#{__dir__}/iso/normalizer"
14
15
  autoload :Parser, "#{__dir__}/iso/parser"
15
16
  autoload :RenderingStyle, "#{__dir__}/iso/rendering_style"
16
- autoload :Scheme, "#{__dir__}/iso/scheme"
17
17
  autoload :SingleIdentifier, "#{__dir__}/iso/single_identifier"
18
18
  autoload :SupplementIdentifier, "#{__dir__}/iso/supplement_identifier"
19
19
  autoload :UrnGenerator, "#{__dir__}/iso/urn_generator"
@@ -25,6 +25,10 @@ module Pubid
25
25
  # @param format [Symbol] :auto, :human, :mr_string, or :urn
26
26
  # @return [Identifier] the parsed identifier
27
27
  def self.parse(identifier, format: :auto)
28
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
29
+ raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
30
+ end
31
+
28
32
  format = Pubid::FormatDetector.detect(identifier) if format == :auto
29
33
 
30
34
  case format
@@ -33,9 +37,77 @@ module Pubid
33
37
  when :mr_string
34
38
  Pubid::Parsers::MrString.parse(identifier)
35
39
  else
36
- Scheme.parse(identifier)
40
+ Normalizer.apply(identifier)
41
+ end
42
+ end
43
+
44
+ # Build an ISO identifier from attributes.
45
+ #
46
+ # This is the public seam: callers in other flavors should never reach
47
+ # into `Pubid::Iso::Identifiers::*` or `Pubid::Iso::Components::*`
48
+ # directly — go through this method so the internal class registry can
49
+ # change without breaking callers.
50
+ #
51
+ # Accepts either raw values (Strings/Integers) or pre-built components.
52
+ # Raw values are wrapped in the appropriate ISO component internally.
53
+ #
54
+ # @param type [Symbol] the type key (e.g. :is, :tr, :ts, :guide)
55
+ # @param publisher [String, Pubid::Iso::Components::Publisher] primary publisher
56
+ # @param copublishers [Array<String>, Array<Pubid::Components::Publisher>]
57
+ # @param number [String, Integer, Pubid::Iso::Components::Code]
58
+ # @param year [String, Integer, Pubid::Components::Date, nil]
59
+ # @param attrs [Hash] additional identifier attributes
60
+ # @return [Pubid::Iso::Identifier]
61
+ def self.build(type:, publisher: nil, copublishers: nil, number: nil,
62
+ year: nil, **attrs)
63
+ klass = locate_type(type) || raise(ArgumentError, "unknown ISO type: #{type.inspect}")
64
+
65
+ copub_list = Array(copublishers)
66
+ attrs[:publisher] = build_publisher(publisher, copub_list) if publisher || copub_list.any?
67
+ attrs[:copublishers] = build_copublishers(copub_list) if copub_list.any?
68
+ attrs[:number] = build_code(number) if number
69
+ attrs[:date] = build_date(year) if year
70
+
71
+ klass.new(attrs)
72
+ end
73
+
74
+ # @!visibility private
75
+ def self.build_publisher(value, copublishers = [])
76
+ return value if value.is_a?(Components::Publisher) && copublishers.empty?
77
+
78
+ copub_strings = copublishers.map { |cp| cp.is_a?(Components::Publisher) ? cp.publisher : cp.to_s }
79
+ Components::Publisher.new(
80
+ publisher: value.is_a?(Components::Publisher) ? value.publisher : value.to_s,
81
+ copublisher: copub_strings,
82
+ )
83
+ end
84
+ private_class_method :build_publisher
85
+
86
+ # @!visibility private
87
+ def self.build_copublishers(list)
88
+ Array(list).map do |cp|
89
+ next cp if cp.is_a?(Components::Publisher)
90
+
91
+ Components::Publisher.new(publisher: cp.to_s)
37
92
  end
38
93
  end
94
+ private_class_method :build_copublishers
95
+
96
+ # @!visibility private
97
+ def self.build_code(value)
98
+ return value if value.is_a?(Components::Code)
99
+
100
+ Components::Code.new(value: value.to_s)
101
+ end
102
+ private_class_method :build_code
103
+
104
+ # @!visibility private
105
+ def self.build_date(value)
106
+ return value if value.is_a?(::Pubid::Components::Date)
107
+
108
+ ::Pubid::Components::Date.new(year: value.to_s)
109
+ end
110
+ private_class_method :build_date
39
111
 
40
112
  # Parse an ISO URN string
41
113
  # @param urn [String] the URN string to parse
@@ -44,6 +116,109 @@ module Pubid
44
116
  def self.parse_urn(urn)
45
117
  UrnParser.parse(urn)
46
118
  end
119
+
120
+ # Build an ISO identifier from a Parslet parse-tree hash (used by other
121
+ # flavors when parsing joint identifiers, e.g. IEC's `IEC … | ISO …` form).
122
+ #
123
+ # This is the public seam: callers should never reach into
124
+ # `Pubid::Iso::Builder` directly.
125
+ #
126
+ # @param hash [Hash] parse tree for an ISO identifier
127
+ # @return [Pubid::Iso::Identifier]
128
+ def self.build_from_parse(hash)
129
+ builder.build(hash)
130
+ end
131
+
132
+ # Return the named Parslet rule atom from the ISO parser, for embedding in
133
+ # another flavor's grammar (e.g. IEC joint identifiers).
134
+ #
135
+ # This is the public seam: callers should never instantiate
136
+ # `Pubid::Iso::Parser` directly.
137
+ #
138
+ # @param rule_name [Symbol] the parser rule to expose
139
+ # @return [Parslet::Atoms::Base]
140
+ def self.joint_grammar_atom(rule_name)
141
+ parser.public_send(rule_name)
142
+ end
143
+
144
+ # Auto-discover all identifier types from the Identifiers namespace
145
+ # @return [Array<Class>] identifier classes that define a self.type Hash
146
+ def self.identifier_types
147
+ @identifier_types ||= Identifiers.constants
148
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
149
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
150
+ .select { |c| c.type.is_a?(Hash) }
151
+ end
152
+
153
+ # Build typed stage index from identifier types
154
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
155
+ def self.all_typed_stages
156
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
157
+ if klass.const_defined?(:TYPED_STAGES)
158
+ klass.const_get(:TYPED_STAGES)
159
+ else
160
+ []
161
+ end
162
+ end
163
+ end
164
+
165
+ # Memoized builder instance used by Normalizer / URN parser
166
+ # @return [Pubid::Iso::Builder]
167
+ def self.builder
168
+ @builder ||= Builder.new
169
+ end
170
+
171
+ # Memoized parser instance used by Normalizer
172
+ # @return [Pubid::Iso::Parser]
173
+ def self.parser
174
+ @parser ||= Parser.new
175
+ end
176
+
177
+ # Lookup: type code -> identifier class
178
+ # @param code [String, Symbol] the type key to find
179
+ # @return [Class, nil] the matching identifier class
180
+ def self.locate_type(code)
181
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
182
+ end
183
+
184
+ # Lookup: abbreviation -> typed stage
185
+ # @param abbr [String, Symbol] the abbreviation to find
186
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
187
+ def self.locate_stage(abbr)
188
+ abbr_str = abbr.to_s.upcase
189
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
190
+ end
191
+
192
+ # Lookup: stage code -> typed stage
193
+ # @param stage_code [String, Symbol]
194
+ # @return [Pubid::Components::TypedStage, nil]
195
+ def self.locate_stage_by_stage_code(stage_code)
196
+ stage_code_sym = stage_code.to_sym
197
+ all_typed_stages.find { |s| s.stage_code.to_sym == stage_code_sym }
198
+ end
199
+
200
+ # Lookup: per-typed-stage code -> typed stage
201
+ # @param code [String, Symbol]
202
+ # @return [Pubid::Components::TypedStage, nil]
203
+ def self.locate_stage_by_code(code)
204
+ code_sym = code.to_sym
205
+ all_typed_stages.find { |s| s.code&.to_sym == code_sym }
206
+ end
207
+
208
+ # Lookup: harmonized stage code -> typed stage
209
+ # @param harmonized_code [String]
210
+ # @return [Pubid::Components::TypedStage, nil]
211
+ def self.locate_stage_by_harmonized_code(harmonized_code)
212
+ harmonized_str = harmonized_code.to_s
213
+ all_typed_stages.find { |s| s.harmonized_stages&.include?(harmonized_str) }
214
+ end
215
+
216
+ # Default typed stage used when no type_with_stage is present
217
+ # (e.g., the bare International Standard published stage)
218
+ # @return [Pubid::Components::TypedStage]
219
+ def self.default_typed_stage
220
+ locate_stage("") || all_typed_stages.first
221
+ end
47
222
  end
48
223
  end
49
224
 
@@ -1,17 +1,5 @@
1
1
  # frozen_string_literal: true
2
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
3
  module Pubid
16
4
  module Itu
17
5
  class Builder
@@ -8,16 +8,14 @@ module Pubid
8
8
  # ITU Code component
9
9
  # Format: NUMBER[.SUBSERIES][-PART]
10
10
  # Examples: 1234, 1234.5, 1234-1, 1234.5-2
11
+ #
12
+ # Stays independent of Pubid::Components::Code because ITU uses
13
+ # +subseries+ (dot-separated, flavor-specific) and +parts+
14
+ # (dash-separated).
11
15
  class Code < Lutaml::Model::Serializable
12
16
  attribute :number, :string
13
17
  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
18
+ attribute :parts, :string, collection: true, default: []
21
19
 
22
20
  def to_s
23
21
  result = number.to_s
@@ -26,6 +24,10 @@ module Pubid
26
24
  result
27
25
  end
28
26
 
27
+ def render(context: nil)
28
+ to_s
29
+ end
30
+
29
31
  def ==(other)
30
32
  return false unless other.is_a?(Code)
31
33
 
@@ -12,12 +12,23 @@ module Pubid
12
12
 
13
13
  VALID_SECTORS = %w[R T D].freeze
14
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"
15
+ # Accept either a positional Hash (lutaml-model's call style:
16
+ # `Sector.new({lutaml_register: :default})` then attribute assignment)
17
+ # or a literal `sector:` kwarg (`Sector.new(sector: "R")`). Both call
18
+ # paths funnel through the same validate-then-set flow so the attribute
19
+ # stays lutaml-tracked and round-trips through to_hash/from_hash.
20
+ def initialize(attrs = {}, options = {})
21
+ super
22
+ sector_val = attrs[:sector] || attrs["sector"]
23
+ return if sector_val.nil?
24
+
25
+ normalized = sector_val.to_s.upcase
26
+ unless VALID_SECTORS.include?(normalized)
27
+ raise ArgumentError,
28
+ "Invalid sector: #{sector_val}. Must be R, T, or D"
18
29
  end
19
30
 
20
- @sector = sector.to_s.upcase
31
+ self.sector = normalized
21
32
  end
22
33
 
23
34
  def to_s
@@ -10,10 +10,6 @@ module Pubid
10
10
  class Series < Lutaml::Model::Serializable
11
11
  attribute :series, :string # e.g., BO, V, X, R, SG1, OB
12
12
 
13
- def initialize(series:)
14
- @series = series
15
- end
16
-
17
13
  def to_s
18
14
  series
19
15
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Itu
5
+ module Components
6
+ autoload :Sector, "#{__dir__}/components/sector"
7
+ autoload :Series, "#{__dir__}/components/series"
8
+ autoload :Code, "#{__dir__}/components/code"
9
+ end
10
+ end
11
+ end
@@ -1,118 +1,6 @@
1
1
  # frozen_string_literal: true
2
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 pubid 1.x's `Pubid::Itu::Identifier.create` API.
21
- # Dispatch on `:type`:
22
- # * nil → Recommendation (or SpecialPublication for series "OB")
23
- # * :recommendation → Identifiers::Recommendation
24
- # * :annex → Identifiers::Annex
25
- # * :special_publication → Identifiers::SpecialPublication
26
- #
27
- # Component-typed kwargs are accepted as primitives and coerced:
28
- # * sector: "T" → Components::Sector.new(sector: "T")
29
- # * series: "X" → Components::Series.new(series: "X")
30
- # * number: "509" → Components::Code.new(number: "509")
31
- # * year: "2020" → Pubid::Components::Date.new(year: "2020")
32
- TYPE_KEY_TO_KLASS = {
33
- recommendation: "Recommendation",
34
- annex: "Annex",
35
- special_publication: "SpecialPublication",
36
- }.freeze
37
-
38
- def self.create(type: nil, **kwargs)
39
- # Backward-compat: nil type + series "OB" → SpecialPublication.
40
- if type.nil? && kwargs[:series].to_s == "OB"
41
- return create_special_publication(**kwargs)
42
- end
43
-
44
- klass = resolve_create_class(type)
45
- klass.new(**coerce_create_attrs(kwargs, klass: klass))
46
- end
47
-
48
- def self.resolve_create_class(type)
49
- return Identifiers::Recommendation if type.nil?
50
-
51
- klass_name = TYPE_KEY_TO_KLASS[type.to_sym]
52
- raise ArgumentError, "Unknown ITU type: #{type.inspect}" unless klass_name
53
-
54
- Identifiers.const_get(klass_name)
55
- end
56
-
57
- # Backward-compat helper retained for the OB-series shortcut.
58
- def self.create_special_publication(number:, series: "OB", date: nil,
59
- language: nil)
60
- Identifiers::SpecialPublication.new(
61
- series: Components::Series.new(series: series.to_s),
62
- code: Components::Code.new(number: number.to_s),
63
- date: date,
64
- language: language&.to_s,
65
- )
66
- end
67
-
68
- def self.coerce_create_attrs(opts, klass: nil)
69
- attrs = {}
70
- if (v = opts[:sector])
71
- attrs[:sector] = if v.is_a?(Components::Sector)
72
- v
73
- else
74
- Components::Sector.new(sector: v.to_s.upcase)
75
- end
76
- end
77
- if (v = opts[:series])
78
- attrs[:series] = if v.is_a?(Components::Series)
79
- v
80
- else
81
- Components::Series.new(series: v.to_s)
82
- end
83
- end
84
- if opts[:number] || opts[:code]
85
- code_value = opts[:code]
86
- if code_value.is_a?(Components::Code)
87
- attrs[:code] = code_value
88
- else
89
- attrs[:code] = Components::Code.new(
90
- number: (opts[:number] || code_value).to_s,
91
- subseries: opts[:subseries]&.to_s,
92
- parts: opts[:parts] ? Array(opts[:parts]).map(&:to_s) : nil,
93
- )
94
- end
95
- end
96
- if (v = opts[:year])
97
- attrs[:date] = Pubid::Components::Date.new(year: v.to_s)
98
- end
99
- attrs[:date] = opts[:date] if opts[:date].is_a?(Pubid::Components::Date)
100
- attrs[:language] = opts[:language].to_s if opts[:language]
101
-
102
- # Pass through any subclass-specific kwarg the chosen class
103
- # declares (e.g. Annex#base) — preserves callers that already pass
104
- # an explicit attribute that our coercion table doesn't cover.
105
- if klass
106
- consumed = %i[sector series number code subseries parts year date
107
- language]
108
- opts.each do |k, v|
109
- next if consumed.include?(k) || attrs.key?(k)
110
- attrs[k] = v if klass.attributes.key?(k)
111
- end
112
- end
113
- attrs
114
- end
115
- private_class_method :resolve_create_class, :coerce_create_attrs
116
- end
117
- end
118
- end
3
+ # Pubid::Itu::Identifier is the ITU base class (a real Pubid::Identifier
4
+ # subclass); its body, `.parse`, and the Identifiers::Base back-compat alias
5
+ # live in identifiers/base.rb. This file just ensures it is loaded.
6
+ require_relative "identifiers/base"
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "supplement"
4
-
5
3
  module Pubid
6
4
  module Itu
7
5
  module Identifiers
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Itu
7
5
  module Identifiers