pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.3

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 (458) 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 +7 -39
  6. data/lib/pubid/amca/identifiers/base.rb +0 -26
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -17
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -13
  9. data/lib/pubid/amca/renderer.rb +82 -0
  10. data/lib/pubid/amca/single_identifier.rb +0 -23
  11. data/lib/pubid/amca/urn_parser.rb +28 -0
  12. data/lib/pubid/amca.rb +42 -1
  13. data/lib/pubid/ansi/builder.rb +5 -3
  14. data/lib/pubid/ansi/identifier.rb +1 -43
  15. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  16. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  17. data/lib/pubid/ansi/renderer.rb +53 -0
  18. data/lib/pubid/ansi/single_identifier.rb +2 -31
  19. data/lib/pubid/ansi/urn_generator.rb +3 -38
  20. data/lib/pubid/ansi/urn_parser.rb +23 -0
  21. data/lib/pubid/ansi.rb +38 -3
  22. data/lib/pubid/api/builder.rb +29 -74
  23. data/lib/pubid/api/identifier.rb +0 -51
  24. data/lib/pubid/api/identifiers/base.rb +0 -2
  25. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  26. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  27. data/lib/pubid/api/identifiers/mpms.rb +1 -17
  28. data/lib/pubid/api/identifiers/publication.rb +0 -2
  29. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  30. data/lib/pubid/api/identifiers/specification.rb +0 -2
  31. data/lib/pubid/api/identifiers/standard.rb +0 -2
  32. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  33. data/lib/pubid/api/identifiers/typeless_standard.rb +1 -14
  34. data/lib/pubid/api/identifiers.rb +18 -0
  35. data/lib/pubid/api/renderer.rb +89 -0
  36. data/lib/pubid/api/single_identifier.rb +1 -13
  37. data/lib/pubid/api/urn_generator.rb +0 -18
  38. data/lib/pubid/api/urn_parser.rb +35 -0
  39. data/lib/pubid/api.rb +51 -5
  40. data/lib/pubid/ashrae/builder.rb +3 -3
  41. data/lib/pubid/ashrae/identifier.rb +6 -39
  42. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  43. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  44. data/lib/pubid/ashrae/identifiers/base.rb +3 -0
  45. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  46. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  47. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  48. data/lib/pubid/ashrae/renderer.rb +117 -0
  49. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  50. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  51. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  52. data/lib/pubid/ashrae.rb +42 -1
  53. data/lib/pubid/asme/components/code.rb +10 -2
  54. data/lib/pubid/asme/identifier.rb +0 -46
  55. data/lib/pubid/asme/identifiers/base.rb +0 -60
  56. data/lib/pubid/asme/renderer.rb +66 -0
  57. data/lib/pubid/asme/urn_parser.rb +31 -0
  58. data/lib/pubid/asme.rb +42 -1
  59. data/lib/pubid/astm/components/code.rb +9 -0
  60. data/lib/pubid/{jis → astm}/components.rb +1 -1
  61. data/lib/pubid/astm/identifier.rb +0 -77
  62. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  63. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  64. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  65. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  66. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  67. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  68. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  69. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  70. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  71. data/lib/pubid/astm/identifiers.rb +18 -0
  72. data/lib/pubid/astm/renderer.rb +172 -0
  73. data/lib/pubid/astm/single_identifier.rb +0 -10
  74. data/lib/pubid/astm/urn_parser.rb +30 -0
  75. data/lib/pubid/astm.rb +39 -27
  76. data/lib/pubid/bsi/builder.rb +21 -12
  77. data/lib/pubid/bsi/identifier.rb +8 -62
  78. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  79. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  80. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  81. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  82. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  83. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  84. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  85. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  87. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  88. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  89. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  90. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  91. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  92. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  93. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  94. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  95. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  96. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  97. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  98. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  99. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  100. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  101. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  102. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  103. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  104. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  105. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  106. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  107. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  108. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  109. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  110. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  111. data/lib/pubid/bsi/identifiers.rb +0 -1
  112. data/lib/pubid/bsi/renderer.rb +1050 -0
  113. data/lib/pubid/bsi/single_identifier.rb +6 -70
  114. data/lib/pubid/bsi/urn_generator.rb +2 -3
  115. data/lib/pubid/bsi/urn_parser.rb +52 -0
  116. data/lib/pubid/bsi.rb +224 -1
  117. data/lib/pubid/builder/base.rb +57 -10
  118. data/lib/pubid/bundled_identifier.rb +0 -1
  119. data/lib/pubid/ccsds/builder.rb +4 -3
  120. data/lib/pubid/ccsds/identifier.rb +63 -66
  121. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  122. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  123. data/lib/pubid/ccsds/parser.rb +4 -2
  124. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  125. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  126. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  127. data/lib/pubid/ccsds.rb +39 -1
  128. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  129. data/lib/pubid/cen_cenelec/identifier.rb +7 -38
  130. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  131. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  132. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  133. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  135. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  136. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  137. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  139. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  140. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  141. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  143. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  145. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  146. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  147. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  148. data/lib/pubid/cen_cenelec.rb +168 -1
  149. data/lib/pubid/cie/components/code.rb +8 -0
  150. data/lib/pubid/cie/identifier.rb +6 -57
  151. data/lib/pubid/cie/urn_parser.rb +28 -0
  152. data/lib/pubid/cie.rb +43 -1
  153. data/lib/pubid/components/adoption.rb +104 -0
  154. data/lib/pubid/components/code.rb +22 -8
  155. data/lib/pubid/components/date.rb +23 -16
  156. data/lib/pubid/components/edition.rb +9 -6
  157. data/lib/pubid/components/iteration.rb +32 -0
  158. data/lib/pubid/components/language.rb +6 -4
  159. data/lib/pubid/components/locality.rb +10 -1
  160. data/lib/pubid/components/publisher.rb +9 -6
  161. data/lib/pubid/components/relationship.rb +151 -0
  162. data/lib/pubid/components/stage.rb +5 -14
  163. data/lib/pubid/components/supplement.rb +184 -0
  164. data/lib/pubid/components/type.rb +5 -15
  165. data/lib/pubid/components/typed_stage.rb +10 -11
  166. data/lib/pubid/components.rb +4 -1
  167. data/lib/pubid/core/update_codes.rb +28 -7
  168. data/lib/pubid/csa/identifier.rb +0 -59
  169. data/lib/pubid/csa/identifiers/base.rb +2 -122
  170. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  171. data/lib/pubid/csa/identifiers/series.rb +2 -102
  172. data/lib/pubid/csa/renderer.rb +292 -0
  173. data/lib/pubid/csa/urn_generator.rb +1 -1
  174. data/lib/pubid/csa/urn_parser.rb +33 -0
  175. data/lib/pubid/csa.rb +42 -1
  176. data/lib/pubid/etsi/components/code.rb +9 -2
  177. data/lib/pubid/etsi/identifier.rb +0 -43
  178. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  179. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  180. data/lib/pubid/etsi/renderer.rb +42 -0
  181. data/lib/pubid/etsi/urn_parser.rb +34 -0
  182. data/lib/pubid/etsi.rb +42 -1
  183. data/lib/pubid/export/exporter.rb +4 -46
  184. data/lib/pubid/export/flavor_exporter.rb +111 -278
  185. data/lib/pubid/export.rb +0 -6
  186. data/lib/pubid/identifier.rb +2 -17
  187. data/lib/pubid/identifier_facade.rb +114 -0
  188. data/lib/pubid/identifier_metadata.rb +1 -1
  189. data/lib/pubid/idf/builder.rb +3 -3
  190. data/lib/pubid/idf/identifier.rb +3 -66
  191. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  192. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  193. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  194. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  195. data/lib/pubid/idf/parser.rb +3 -2
  196. data/lib/pubid/idf/renderer.rb +84 -0
  197. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  198. data/lib/pubid/idf/urn_generator.rb +4 -39
  199. data/lib/pubid/idf/urn_parser.rb +25 -0
  200. data/lib/pubid/idf.rb +51 -1
  201. data/lib/pubid/iec/builder.rb +46 -64
  202. data/lib/pubid/iec/components/code.rb +8 -32
  203. data/lib/pubid/iec/components/publisher.rb +0 -1
  204. data/lib/pubid/iec/components.rb +14 -0
  205. data/lib/pubid/iec/identifier.rb +251 -213
  206. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  207. data/lib/pubid/iec/identifiers/base.rb +8 -32
  208. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  209. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  210. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -26
  211. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  212. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -22
  213. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  214. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  215. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  216. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  217. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  218. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -11
  219. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  220. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  222. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  223. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  224. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  225. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -19
  226. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  227. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  228. data/lib/pubid/iec/identifiers.rb +30 -0
  229. data/lib/pubid/iec/parser.rb +13 -12
  230. data/lib/pubid/iec/renderer.rb +254 -0
  231. data/lib/pubid/iec/single_identifier.rb +6 -12
  232. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  233. data/lib/pubid/iec/urn_generator.rb +3 -3
  234. data/lib/pubid/iec/urn_parser.rb +3 -3
  235. data/lib/pubid/iec.rb +40 -68
  236. data/lib/pubid/ieee/builder.rb +12 -12
  237. data/lib/pubid/ieee/components/code.rb +8 -0
  238. data/lib/pubid/ieee/components/draft.rb +14 -0
  239. data/lib/pubid/ieee/components/relationship.rb +5 -149
  240. data/lib/pubid/ieee/identifier.rb +6 -41
  241. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  242. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  243. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  245. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  246. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  247. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  248. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  249. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  250. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  251. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  252. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  253. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  254. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  255. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  256. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  257. data/lib/pubid/ieee/pre_parser.rb +301 -0
  258. data/lib/pubid/ieee/renderer.rb +307 -0
  259. data/lib/pubid/ieee/urn_parser.rb +34 -0
  260. data/lib/pubid/ieee.rb +62 -1
  261. data/lib/pubid/ieee_debug.rb +0 -1
  262. data/lib/pubid/iho/builder.rb +2 -2
  263. data/lib/pubid/iho/identifier.rb +8 -42
  264. data/lib/pubid/iho/identifiers/base.rb +49 -10
  265. data/lib/pubid/iho/parser.rb +3 -3
  266. data/lib/pubid/iho/renderer.rb +30 -0
  267. data/lib/pubid/iho/urn_generator.rb +2 -2
  268. data/lib/pubid/iho/urn_parser.rb +58 -0
  269. data/lib/pubid/iho.rb +50 -1
  270. data/lib/pubid/iso/builder.rb +55 -53
  271. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  272. data/lib/pubid/iso/components/code.rb +7 -19
  273. data/lib/pubid/iso/components/publisher.rb +10 -8
  274. data/lib/pubid/iso/components.rb +2 -4
  275. data/lib/pubid/iso/identifier.rb +218 -252
  276. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  277. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  278. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  279. data/lib/pubid/iso/identifiers/data.rb +0 -1
  280. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  281. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  282. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  283. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  284. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  285. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  286. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  287. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  288. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  289. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  290. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  291. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  292. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  293. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  294. data/lib/pubid/iso/identifiers.rb +0 -1
  295. data/lib/pubid/iso/normalizer.rb +89 -0
  296. data/lib/pubid/iso/parser.rb +22 -4
  297. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  298. data/lib/pubid/iso/urn_generator.rb +66 -182
  299. data/lib/pubid/iso/urn_parser.rb +12 -7
  300. data/lib/pubid/iso.rb +173 -2
  301. data/lib/pubid/itu/builder.rb +0 -12
  302. data/lib/pubid/itu/components/code.rb +8 -0
  303. data/lib/pubid/itu/components.rb +11 -0
  304. data/lib/pubid/itu/identifier.rb +6 -104
  305. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  306. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  307. data/lib/pubid/itu/identifiers/base.rb +0 -6
  308. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  309. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  310. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  311. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  312. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  313. data/lib/pubid/itu/urn_parser.rb +23 -0
  314. data/lib/pubid/itu.rb +42 -1
  315. data/lib/pubid/jcgm/builder.rb +16 -8
  316. data/lib/pubid/jcgm/identifier.rb +0 -43
  317. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  318. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  319. data/lib/pubid/jcgm/renderer.rb +68 -0
  320. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  321. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  322. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  323. data/lib/pubid/jcgm.rb +43 -2
  324. data/lib/pubid/jis/builder.rb +44 -52
  325. data/lib/pubid/jis/identifier.rb +132 -46
  326. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  327. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  328. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  329. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  330. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  331. data/lib/pubid/jis/identifiers.rb +1 -1
  332. data/lib/pubid/jis/parser.rb +31 -5
  333. data/lib/pubid/jis/renderer.rb +69 -0
  334. data/lib/pubid/jis/single_identifier.rb +6 -12
  335. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  336. data/lib/pubid/jis/urn_parser.rb +23 -0
  337. data/lib/pubid/jis.rb +42 -2
  338. data/lib/pubid/nist/builder.rb +63 -1871
  339. data/lib/pubid/nist/caster.rb +1272 -0
  340. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  341. data/lib/pubid/nist/components/code.rb +9 -20
  342. data/lib/pubid/nist/components/supplement.rb +2 -2
  343. data/lib/pubid/nist/components.rb +0 -1
  344. data/lib/pubid/nist/identifier.rb +11 -48
  345. data/lib/pubid/nist/identifiers/base.rb +110 -47
  346. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  347. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  348. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  349. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  350. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  351. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  352. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  353. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  354. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  355. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  356. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  357. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  358. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  359. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  360. data/lib/pubid/nist/identifiers/report.rb +4 -2
  361. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  362. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  363. data/lib/pubid/nist/identifiers.rb +1 -0
  364. data/lib/pubid/nist/parser.rb +62 -452
  365. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  366. data/lib/pubid/nist/preprocessor.rb +416 -0
  367. data/lib/pubid/nist/renderer.rb +43 -0
  368. data/lib/pubid/nist/router.rb +148 -0
  369. data/lib/pubid/nist/series/base.rb +58 -0
  370. data/lib/pubid/nist/series/crpl.rb +13 -0
  371. data/lib/pubid/nist/series/fips.rb +14 -0
  372. data/lib/pubid/nist/series/ir.rb +60 -0
  373. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  374. data/lib/pubid/nist/series/mono.rb +19 -0
  375. data/lib/pubid/nist/series/ncstar.rb +20 -0
  376. data/lib/pubid/nist/series.rb +49 -0
  377. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  378. data/lib/pubid/nist/urn_parser.rb +67 -0
  379. data/lib/pubid/nist.rb +82 -4
  380. data/lib/pubid/oiml/components/code.rb +10 -0
  381. data/lib/pubid/oiml/identifier.rb +0 -50
  382. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  383. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  384. data/lib/pubid/oiml/renderer.rb +161 -0
  385. data/lib/pubid/oiml/single_identifier.rb +6 -45
  386. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  387. data/lib/pubid/oiml/urn_generator.rb +0 -8
  388. data/lib/pubid/oiml/urn_parser.rb +22 -0
  389. data/lib/pubid/oiml.rb +42 -1
  390. data/lib/pubid/plateau/identifier.rb +7 -41
  391. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  392. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  393. data/lib/pubid/plateau/renderer.rb +51 -0
  394. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  395. data/lib/pubid/plateau/urn_parser.rb +43 -0
  396. data/lib/pubid/plateau.rb +43 -1
  397. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  398. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  399. data/lib/pubid/renderers/human_readable.rb +18 -7
  400. data/lib/pubid/rendering/context.rb +28 -19
  401. data/lib/pubid/rendering.rb +0 -3
  402. data/lib/pubid/sae/components/date.rb +8 -0
  403. data/lib/pubid/sae/components/type.rb +5 -1
  404. data/lib/pubid/sae/identifier.rb +0 -23
  405. data/lib/pubid/sae/identifiers/base.rb +2 -16
  406. data/lib/pubid/sae/renderer.rb +36 -0
  407. data/lib/pubid/sae/urn_generator.rb +2 -10
  408. data/lib/pubid/sae/urn_parser.rb +36 -0
  409. data/lib/pubid/sae.rb +42 -1
  410. data/lib/pubid/urn_generator/base.rb +12 -12
  411. data/lib/pubid/urn_parser/base.rb +81 -0
  412. data/lib/pubid/urn_parser/errors.rb +9 -0
  413. data/lib/pubid/urn_parser.rb +14 -0
  414. data/lib/pubid/version.rb +1 -1
  415. data/lib/pubid.rb +29 -7
  416. data/lib/tasks/website-data.json +1940 -1882
  417. metadata +75 -44
  418. data/lib/pubid/amca/scheme.rb +0 -16
  419. data/lib/pubid/ansi/scheme.rb +0 -15
  420. data/lib/pubid/api/scheme.rb +0 -66
  421. data/lib/pubid/ashrae/scheme.rb +0 -53
  422. data/lib/pubid/asme/scheme.rb +0 -37
  423. data/lib/pubid/astm/scheme.rb +0 -55
  424. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  425. data/lib/pubid/bsi/scheme.rb +0 -243
  426. data/lib/pubid/ccsds/scheme.rb +0 -57
  427. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  428. data/lib/pubid/cie/scheme.rb +0 -64
  429. data/lib/pubid/components/factory.rb +0 -50
  430. data/lib/pubid/csa/scheme.rb +0 -44
  431. data/lib/pubid/etsi/scheme.rb +0 -42
  432. data/lib/pubid/export/data_class_exporter.rb +0 -59
  433. data/lib/pubid/export/ieee_exporter.rb +0 -78
  434. data/lib/pubid/export/itu_exporter.rb +0 -66
  435. data/lib/pubid/export/nist_exporter.rb +0 -64
  436. data/lib/pubid/export/registry_exporter.rb +0 -90
  437. data/lib/pubid/export/scheme_exporter.rb +0 -70
  438. data/lib/pubid/identifier_registry.rb +0 -198
  439. data/lib/pubid/idf/scheme.rb +0 -61
  440. data/lib/pubid/iec/scheme.rb +0 -71
  441. data/lib/pubid/ieee/scheme.rb +0 -90
  442. data/lib/pubid/iho/scheme.rb +0 -29
  443. data/lib/pubid/iso/identifiers/base.rb +0 -115
  444. data/lib/pubid/iso/scheme.rb +0 -193
  445. data/lib/pubid/itu/scheme.rb +0 -174
  446. data/lib/pubid/jcgm/scheme.rb +0 -60
  447. data/lib/pubid/jis/components/code.rb +0 -59
  448. data/lib/pubid/jis/identifiers/base.rb +0 -72
  449. data/lib/pubid/jis/scheme.rb +0 -49
  450. data/lib/pubid/nist/components/publisher.rb +0 -24
  451. data/lib/pubid/nist/scheme.rb +0 -199
  452. data/lib/pubid/oiml/scheme.rb +0 -46
  453. data/lib/pubid/plateau/scheme.rb +0 -45
  454. data/lib/pubid/rendering/base.rb +0 -73
  455. data/lib/pubid/rendering/common.rb +0 -211
  456. data/lib/pubid/rendering/format.rb +0 -25
  457. data/lib/pubid/sae/scheme.rb +0 -47
  458. data/lib/pubid/scheme.rb +0 -219
data/lib/pubid/iec.rb CHANGED
@@ -2,84 +2,56 @@
2
2
 
3
3
  module Pubid
4
4
  module Iec
5
- end
6
- end
7
-
8
- # Require scheme first
9
- require_relative "scheme"
5
+ autoload :Components, "#{__dir__}/iec/components"
6
+ autoload :Identifier, "#{__dir__}/iec/identifier"
7
+ autoload :Identifiers, "#{__dir__}/iec/identifiers"
8
+ autoload :SingleIdentifier, "#{__dir__}/iec/single_identifier"
9
+ autoload :SupplementIdentifier, "#{__dir__}/iec/supplement_identifier"
10
+ autoload :Parser, "#{__dir__}/iec/parser"
11
+ autoload :Builder, "#{__dir__}/iec/builder"
12
+ autoload :UrnParser, "#{__dir__}/iec/urn_parser"
13
+ autoload :UrnGenerator, "#{__dir__}/iec/urn_generator"
14
+ autoload :RenderingStyle, "#{__dir__}/iec/rendering_style"
15
+ autoload :Renderer, "#{__dir__}/iec/renderer"
10
16
 
11
- # Require all identifier classes
12
- require_relative "iec/identifiers/international_standard"
13
- require_relative "iec/identifiers/technical_report"
14
- require_relative "iec/identifiers/technical_specification"
15
- require_relative "iec/identifiers/publicly_available_specification"
16
- require_relative "iec/identifiers/guide"
17
- require_relative "iec/identifiers/test_report_form"
18
- require_relative "iec/identifiers/interpretation_sheet"
19
- require_relative "iec/identifiers/systems_reference_document"
20
- require_relative "iec/identifiers/working_document"
21
- require_relative "iec/identifiers/amendment"
22
- require_relative "iec/identifiers/corrigendum"
17
+ def self.parse(identifier_string)
18
+ parsed = Parser.new.parse(identifier_string)
19
+ Builder.new.build(parsed)
20
+ end
23
21
 
24
- # Wrapper identifier types
25
- require_relative "iec/identifiers/vap_identifier"
26
- require_relative "iec/identifiers/sheet_identifier"
27
- require_relative "iec/identifiers/consolidated_identifier"
28
- require_relative "iec/identifiers/fragment_identifier"
22
+ def self.parse_urn(urn)
23
+ UrnParser.parse(urn)
24
+ end
29
25
 
30
- # Additional document types
31
- require_relative "iec/identifiers/component_specification"
32
- require_relative "iec/identifiers/operational_document"
33
- require_relative "iec/identifiers/societal_technology_trend_report"
34
- require_relative "iec/identifiers/white_paper"
26
+ Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
27
+ Identifier.format_registry.register(:human, renderer: Iec::Renderer)
35
28
 
36
- module Pubid
37
- module Iec
38
- # Primary document types (not supplements)
39
- IDENTIFIER_TYPES = [
40
- Identifiers::InternationalStandard,
41
- Identifiers::TechnicalReport,
42
- Identifiers::TechnicalSpecification,
43
- Identifiers::PubliclyAvailableSpecification,
44
- Identifiers::Guide,
45
- Identifiers::TestReportForm,
46
- Identifiers::InterpretationSheet,
47
- Identifiers::SystemsReferenceDocument,
48
- Identifiers::WorkingDocument,
49
- ].freeze
50
-
51
- # Supplement types (can appear with / notation)
52
- SUPPLEMENT_IDENTIFIER_TYPES = [
53
- Identifiers::Amendment,
54
- Identifiers::Corrigendum,
55
- Identifiers::InterpretationSheet, # ISH can act as supplement (/ISH1:1996)
56
- Identifiers::FragmentIdentifier, # FRAG wraps amendments/corrigenda
57
- ].freeze
29
+ def self.identifier_types
30
+ @identifier_types ||= Identifiers.constants
31
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
32
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
33
+ .select { |c| begin; c.type.is_a?(Hash); rescue NotImplementedError; false; end }
34
+ end
58
35
 
59
- # Create the Scheme registry with all identifier types
60
- Scheme = Pubid::Scheme.new(
61
- identifiers: IDENTIFIER_TYPES,
62
- supplement_identifiers: SUPPLEMENT_IDENTIFIER_TYPES,
63
- )
36
+ def self.all_typed_stages
37
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
38
+ if klass.const_defined?(:TYPED_STAGES)
39
+ klass.const_get(:TYPED_STAGES)
40
+ else
41
+ []
42
+ end
43
+ end
44
+ end
64
45
 
65
- # Main entry point for IEC identifiers
66
- def self.parse(identifier_string)
67
- parsed = Parser.new.parse(identifier_string)
68
- Builder.new(Scheme).build(parsed)
46
+ def self.locate_type(code)
47
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
69
48
  end
70
49
 
71
- # Parse an IEC URN string
72
- # @param urn [String] the URN string to parse
73
- # @return [Identifier] the parsed identifier
74
- # @raise [Errors::ParseError] if URN is invalid
75
- def self.parse_urn(urn)
76
- UrnParser.parse(urn)
50
+ def self.locate_stage(abbr)
51
+ abbr_str = abbr.to_s.upcase
52
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
77
53
  end
78
54
  end
79
55
  end
80
56
 
81
- require_relative "iec/urn_parser"
82
- require_relative "iec/builder"
83
- require_relative "iec/parser"
84
-
85
57
  Pubid::Registry.register(:iec, Pubid::Iec)
@@ -3,7 +3,7 @@
3
3
  module Pubid
4
4
  module Ieee
5
5
  # Builder class for constructing IEEE identifier scheme from parsed data
6
- # Single Responsibility: Transform parsed data into Scheme objects
6
+ # Single Responsibility: Transform parsed data into identifier objects
7
7
  class Builder
8
8
  attr_accessor :original_input
9
9
  attr_reader :identifier_class
@@ -14,7 +14,7 @@ module Pubid
14
14
 
15
15
  # Build a scheme object from parsed data
16
16
  # @param parsed [Hash, Array] the parsed identifier data
17
- # @return [Scheme] the constructed scheme object
17
+ # @return [identifier] the constructed identifier object
18
18
  def build(parsed)
19
19
  # Handle CSA dual published patterns
20
20
  if parsed[:ieee_portion] && parsed[:csa_portion]
@@ -458,7 +458,7 @@ module Pubid
458
458
  stage_abbr = attributes[:iso_stage]
459
459
  if stage_abbr
460
460
  attributes[:typed_stage] =
461
- Ieee::Scheme.locate_typed_stage_by_abbr(stage_abbr)
461
+ Pubid::Ieee.locate_stage(stage_abbr)
462
462
  end
463
463
  else
464
464
  # IEEE format - lead party is IEEE
@@ -477,7 +477,7 @@ module Pubid
477
477
 
478
478
  # Create typed_stage for IEEE project
479
479
  attributes[:typed_stage] =
480
- Ieee::Scheme.locate_typed_stage_by_abbr("P")
480
+ Pubid::Ieee.locate_stage("P")
481
481
  end
482
482
 
483
483
  Identifiers::JointDevelopment.new(**attributes)
@@ -575,7 +575,7 @@ module Pubid
575
575
  end
576
576
 
577
577
  # Determine which identifier class to use based on attributes
578
- # CRITICAL: Use Scheme for type-based decisions, NOT hardcoded logic here
578
+ # CRITICAL: Use flavor module for type-based decisions, NOT hardcoded logic here
579
579
  # Builder's job is ONLY to cast types, not make business decisions
580
580
  def determine_identifier_class(attributes)
581
581
  # Check for AIEE publisher FIRST (AIEE has its own identifier class)
@@ -584,12 +584,12 @@ module Pubid
584
584
  return Ieee::Aiee::Identifier
585
585
  end
586
586
 
587
- # Get type from attributes and use Scheme to locate class
587
+ # Get type from attributes and use flavor module to locate class
588
588
  type_code = attributes[:type]
589
589
 
590
- # Use Scheme registry for type-to-class mapping
590
+ # Use flavor module for type-to-class mapping
591
591
  if type_code
592
- klass = Ieee::Scheme.locate_identifier_klass_by_type_code(type_code)
592
+ klass = Pubid::Ieee.locate_type(type_code)
593
593
  return klass if klass
594
594
  end
595
595
 
@@ -678,7 +678,7 @@ module Pubid
678
678
 
679
679
  # Extract and normalize attributes from parsed data
680
680
  # @param parsed [Hash] the parsed data
681
- # @return [Hash] normalized attributes for Scheme
681
+ # @return [Hash] normalized attributes for identifier
682
682
  def extract_attributes(parsed)
683
683
  attributes = {}
684
684
 
@@ -785,7 +785,7 @@ module Pubid
785
785
  end
786
786
 
787
787
  # Set type attribute for backward compatibility (after P extraction)
788
- # NOTE: "P" IS a type code that maps to ProjectDraftIdentifier via Scheme
788
+ # NOTE: "P" IS a type code that maps to ProjectDraftIdentifier via flavor module
789
789
  # Type can be: "Std", "No", "P" (project draft), etc.
790
790
  attributes[:type] = type_value if type_value
791
791
 
@@ -794,7 +794,7 @@ module Pubid
794
794
  parsed)
795
795
  if typed_stage_abbr
796
796
  attributes[:typed_stage] =
797
- Ieee::Scheme.locate_typed_stage_by_abbr(typed_stage_abbr)
797
+ Pubid::Ieee.locate_stage(typed_stage_abbr)
798
798
  end
799
799
 
800
800
  attributes[:draft_status] = draft_status_value
@@ -880,7 +880,7 @@ module Pubid
880
880
  if version
881
881
  draft_abbr = "D#{version}"
882
882
  # Check if this specific draft stage is in registry
883
- stage = Ieee::Scheme.locate_typed_stage_by_abbr(draft_abbr)
883
+ stage = Pubid::Ieee.locate_stage(draft_abbr)
884
884
  return draft_abbr if stage&.abbr&.include?(draft_abbr)
885
885
  end
886
886
  end
@@ -11,6 +11,10 @@ module Pubid
11
11
  # 802.15.4 - dotted parts
12
12
  # C57.12.00 - prefix with parts
13
13
  # 11073-10404 - dashed parts
14
+ #
15
+ # Stays independent of Pubid::Components::Code because IEEE tracks
16
+ # +original_separator+ to round-trip dot vs dash notation, and uses
17
+ # +number+ rather than +value+.
14
18
  class Code < Lutaml::Model::Serializable
15
19
  attribute :prefix, :string # C, P for some identifiers
16
20
  attribute :number, :string # Main number (802, 1234, etc.)
@@ -96,6 +100,10 @@ original_separator: nil)
96
100
 
97
101
  result
98
102
  end
103
+
104
+ def render(context: nil)
105
+ to_s
106
+ end
99
107
  end
100
108
  end
101
109
  end
@@ -42,6 +42,20 @@ day: nil)
42
42
  self.day = day
43
43
  end
44
44
 
45
+ # Parse a draft string like "D5", "D3.4", or "5" into a Draft object.
46
+ # @param value [String, Draft] the value to coerce
47
+ # @return [Draft]
48
+ def self.parse(value)
49
+ return value if value.is_a?(Draft)
50
+
51
+ str = value.to_s
52
+ if str =~ /^D(\d+)(?:\.(\d+))?/
53
+ new(version: $1, revision: $2)
54
+ else
55
+ new(version: str)
56
+ end
57
+ end
58
+
45
59
  # Convert month name to numeric value
46
60
  def convert_month(month_name)
47
61
  return nil unless month_name
@@ -1,157 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "lutaml/model"
4
-
3
+ # IEEE's Relationship component is now the shared Pubid::Components::Relationship.
4
+ # This subclass exists so existing references (Pubid::Ieee::Components::Relationship,
5
+ # the VALID_TYPES constants, etc.) continue to resolve without rewriting every
6
+ # call site.
5
7
  module Pubid
6
8
  module Ieee
7
9
  module Components
8
- # Represents a relationship between IEEE identifiers
9
- # E.g., "Revision of IEEE Std X, Y" or "incorporates A, B, C"
10
- #
11
- # Relationships capture metadata about how identifiers relate to each other:
12
- # - Revision relationships (one standard revises another)
13
- # - Amendment relationships (amendments to base standards)
14
- # - Incorporation relationships (one standard incorporates others)
15
- # - Adoption relationships (adopting external standards)
16
- #
17
- # Example usage:
18
- # relationship = Relationship.new(
19
- # relationship_type: Relationship::REVISION_OF,
20
- # related_identifiers: [Base.parse("IEEE Std 802.11-2012")]
21
- # )
22
- # relationship.to_s # => "Revision of IEEE Std 802.11-2012"
23
- class Relationship < Lutaml::Model::Serializable
24
- # Relationship type constants
25
- REVISION_OF = "revision_of"
26
- AMENDMENT_TO = "amendment_to"
27
- CORRIGENDUM_TO = "corrigendum_to"
28
- INCORPORATES = "incorporates"
29
- INCORPORATING = "incorporating" # Synonym for incorporates
30
- ADOPTION_OF = "adoption_of"
31
- SUPPLEMENT_TO = "supplement_to"
32
- DRAFT_AMENDMENT_TO = "draft_amendment_to"
33
- DRAFT_REVISION_OF = "draft_revision_of"
34
- REAFFIRMATION_OF = "reaffirmation_of"
35
- REDESIGNATION_OF = "redesignation_of"
36
- SUPERSEDES = "supersedes"
37
- PREVIOUSLY_DESIGNATED_AS = "previously_designated_as"
38
- INCLUDES = "includes" # NEW Session 171: For "Includes IEEE Std X" pattern
39
-
40
- # All valid relationship types
41
- VALID_TYPES = [
42
- REVISION_OF,
43
- AMENDMENT_TO,
44
- CORRIGENDUM_TO,
45
- INCORPORATES,
46
- INCORPORATING,
47
- ADOPTION_OF,
48
- SUPPLEMENT_TO,
49
- DRAFT_AMENDMENT_TO,
50
- DRAFT_REVISION_OF,
51
- REAFFIRMATION_OF,
52
- REDESIGNATION_OF,
53
- SUPERSEDES,
54
- PREVIOUSLY_DESIGNATED_AS,
55
- INCLUDES, # NEW Session 171
56
- ].freeze
57
-
58
- # Attributes
59
- attribute :relationship_type, :string
60
-
61
- # Use regular Ruby attributes to avoid circular dependency
62
- # related_identifiers: Array of Base identifiers
63
- # intermediate_amendments: Array of Base identifiers (for "as amended by" clause)
64
- attr_accessor :related_identifiers, :intermediate_amendments,
65
- :approved_amendments_flag
66
-
67
- # Validation
68
- def initialize(**args)
69
- # Extract our non-Lutaml attributes before calling super
70
- @related_identifiers = args.delete(:related_identifiers)
71
- @intermediate_amendments = args.delete(:intermediate_amendments)
72
- @approved_amendments_flag = args.delete(:approved_amendments_flag)
73
-
74
- # Let Lutaml handle relationship_type
75
- super
76
-
77
- # Normalize INCORPORATING to INCORPORATES for consistent rendering
78
- if relationship_type == INCORPORATING
79
- self.relationship_type = INCORPORATES
80
- end
81
-
82
- # Validate after initialization
83
- validate_relationship_type if relationship_type
84
- end
85
-
86
- def validate_relationship_type
87
- unless VALID_TYPES.include?(relationship_type)
88
- raise ArgumentError, "Invalid relationship type: #{relationship_type}. " \
89
- "Valid types: #{VALID_TYPES.join(', ')}"
90
- end
91
- end
92
-
93
- # Rendering
94
- def to_s
95
- return "" if related_identifiers.nil? || related_identifiers.empty?
96
-
97
- # Format: "Relationship Type IEEE Std X, IEEE Std Y, and IEEE Std Z"
98
- prefix = format_relationship_prefix
99
- ids = format_identifier_list(related_identifiers)
100
-
101
- # Add intermediate amendments if present (for "as amended by" clause)
102
- if intermediate_amendments && !intermediate_amendments.empty?
103
- amendments = format_identifier_list(intermediate_amendments)
104
- "#{prefix} #{ids} as amended by #{amendments}"
105
- elsif approved_amendments_flag
106
- # "and its approved amendments" clause (no specific list)
107
- "#{prefix} #{ids} and its approved amendments"
108
- else
109
- "#{prefix} #{ids}"
110
- end
111
- end
112
-
113
- private
114
-
115
- # Get the human-readable prefix for the relationship type
116
- def format_relationship_prefix
117
- case relationship_type
118
- when REVISION_OF then "Revision of"
119
- when AMENDMENT_TO then "Amendment to"
120
- when CORRIGENDUM_TO then "Corrigendum to"
121
- when INCORPORATES, INCORPORATING then "incorporates"
122
- when ADOPTION_OF then "Adoption of"
123
- when SUPPLEMENT_TO then "Supplement to"
124
- when DRAFT_AMENDMENT_TO then "Draft Amendment to"
125
- when DRAFT_REVISION_OF then "Draft Revision of"
126
- when REAFFIRMATION_OF then "Reaffirmation of"
127
- when REDESIGNATION_OF then "Redesignation of"
128
- when SUPERSEDES then "Supersedes"
129
- when PREVIOUSLY_DESIGNATED_AS then "Previously designated as"
130
- when INCLUDES then "Includes" # NEW Session 171
131
- else relationship_type
132
- end
133
- end
134
-
135
- # Format a list of identifiers using proper English grammar:
136
- # - Single: "IEEE Std X"
137
- # - Two: "IEEE Std X and IEEE Std Y"
138
- # - Three+: "IEEE Std X, IEEE Std Y, and IEEE Std Z"
139
- def format_identifier_list(identifiers)
140
- return "" if identifiers.nil? || identifiers.empty?
141
-
142
- case identifiers.length
143
- when 1
144
- identifiers.first.to_s
145
- when 2
146
- "#{identifiers.first} and #{identifiers.last}"
147
- else
148
- # X, Y, and Z format (Oxford comma)
149
- last = identifiers.last
150
- others = identifiers[0..-2]
151
- "#{others.join(', ')}, and #{last}"
152
- end
153
- end
154
- end
10
+ class Relationship < ::Pubid::Components::Relationship; end
155
11
  end
156
12
  end
157
13
  end
@@ -2,52 +2,17 @@
2
2
 
3
3
  module Pubid
4
4
  module Ieee
5
+ # NOTE: intentionally does NOT `extend Pubid::IdentifierFacade`. IEEE's
6
+ # `to_hash`/`from_hash` does not round-trip yet (e.g. `code`/`year` are
7
+ # dropped on rebuild), so the facade would advertise a `from_hash` that
8
+ # silently returns lossy objects — and a consumer's `instance_of?(module)`
9
+ # validation can't catch it. Re-enable once IEEE serialization round-trips
10
+ # cleanly. See identifier_facade.rb.
5
11
  module Identifier
6
12
  class << self
7
13
  def parse(input)
8
14
  Identifiers::Base.parse(input)
9
15
  end
10
-
11
- # Factory mirroring pubid 1.x's `Pubid::Ieee::Identifier.create` API.
12
- # Dispatches via {Pubid::Ieee::Scheme.locate_identifier_klass_by_type_code}.
13
- # Default subclass (no `type:`) is Identifiers::Standard — the
14
- # canonical class produced by parsing typical IEEE identifiers.
15
- def create(type: nil, **opts)
16
- klass = type ?
17
- Scheme.locate_identifier_klass_by_type_code(type) :
18
- Identifiers::Standard
19
- attrs = coerce_create_attrs(opts)
20
- # ProjectDraftIdentifier renders the "P" prefix from typed_stage,
21
- # not from `type`. Set both so the output matches a parsed form.
22
- if klass == Identifiers::ProjectDraftIdentifier
23
- attrs[:type] = "P"
24
- attrs[:typed_stage] ||= Scheme.locate_typed_stage_by_abbr("P")
25
- end
26
- klass.new(**attrs)
27
- end
28
-
29
- private
30
-
31
- def coerce_create_attrs(opts)
32
- attrs = {}
33
- attrs[:publisher] = opts[:publisher].to_s if opts[:publisher]
34
- if opts[:copublisher]
35
- attrs[:copublisher] =
36
- Array(opts[:copublisher]).map(&:to_s)
37
- end
38
- # :code or :number alias
39
- if (v = opts[:code] || opts[:number])
40
- attrs[:code] = v.to_s
41
- end
42
- %i[year edition month day draft_status].each do |k|
43
- v = opts[k]
44
- attrs[k] = v.to_s unless v.nil?
45
- end
46
- attrs[:redline] = opts[:redline] if opts.key?(:redline)
47
- # TODO(create-shim): amendments/corrigenda/revision_of/incorporates
48
- # are nested Base relations; not yet wired through.
49
- attrs
50
- end
51
16
  end
52
17
  end
53
18
  end
@@ -16,12 +16,7 @@ module Pubid
16
16
  collection: true
17
17
 
18
18
  def to_s
19
- result = ieee_identifier.to_s
20
- if adopted_identifiers && !adopted_identifiers.empty?
21
- adopted_strs = adopted_identifiers.map(&:to_s)
22
- result += " (#{adopted_strs.join(' and ')})"
23
- end
24
- result
19
+ render(format: :human)
25
20
  end
26
21
 
27
22
  def publisher