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
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ module Identifiers
6
+ autoload :Base, "#{__dir__}/identifiers/base"
7
+ autoload :Standard, "#{__dir__}/identifiers/standard"
8
+ autoload :IsoDualPublished, "#{__dir__}/identifiers/iso_dual_published"
9
+ autoload :Manual, "#{__dir__}/identifiers/manual"
10
+ autoload :ResearchReport, "#{__dir__}/identifiers/research_report"
11
+ autoload :DataSeries, "#{__dir__}/identifiers/data_series"
12
+ autoload :TechnicalReport, "#{__dir__}/identifiers/technical_report"
13
+ autoload :Monograph, "#{__dir__}/identifiers/monograph"
14
+ autoload :Adjunct, "#{__dir__}/identifiers/adjunct"
15
+ autoload :WorkInProgress, "#{__dir__}/identifiers/work_in_progress"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ # Human-readable renderer for ASTM identifiers.
6
+ #
7
+ # Consolidates the per-type rendering logic that used to live inline on
8
+ # each identifier class. Produces strings like:
9
+ # "ASTM E2938-15"
10
+ # "ASTM RR:A01-1234"
11
+ # "ASTM MNL45-EB"
12
+ # "ASTM ADJD2148"
13
+ class Renderer < ::Pubid::Renderers::Base
14
+ def render(context: nil, **opts)
15
+ id = @id
16
+
17
+ case id
18
+ when Identifiers::Standard
19
+ render_standard(id)
20
+ when Identifiers::IsoDualPublished
21
+ render_standard(id)
22
+ when Identifiers::ResearchReport
23
+ render_research_report(id)
24
+ when Identifiers::DataSeries
25
+ render_data_series(id)
26
+ when Identifiers::TechnicalReport
27
+ render_technical_report(id)
28
+ when Identifiers::Monograph
29
+ render_monograph(id)
30
+ when Identifiers::Adjunct
31
+ render_adjunct(id)
32
+ when Identifiers::WorkInProgress
33
+ render_work_in_progress(id)
34
+ when Identifiers::Manual
35
+ render_manual(id)
36
+ else
37
+ render_single(id)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def render_single(id)
44
+ parts = []
45
+ parts << id.publisher if id.publisher
46
+ parts << id.prefix if id.class.attributes.key?(:prefix) && id.prefix
47
+ parts << id.code.to_s if id.code
48
+ parts << "-#{id.year}" if id.year
49
+ parts << id.format_suffix if id.format_suffix
50
+ parts.join(" ")
51
+ end
52
+
53
+ def render_standard(id)
54
+ parts = []
55
+ parts << id.publisher if id.publisher
56
+
57
+ if id.code
58
+ code_str = id.code.to_s
59
+ if id.code.dual_m
60
+ base_code = "#{id.code.letter}#{id.code.number}"
61
+ code_str = "#{base_code}/#{base_code}M"
62
+ end
63
+ parts << code_str
64
+ end
65
+
66
+ result = parts.join(" ")
67
+
68
+ if id.year
69
+ result += "-#{year_portion(id)}"
70
+ result += id.sub_year if id.sub_year
71
+ end
72
+
73
+ result += "(#{id.reapproval})" if id.reapproval
74
+ result += "e#{id.edition}" if id.edition
75
+
76
+ result
77
+ end
78
+
79
+ def year_portion(id)
80
+ year_str = id.year.to_s
81
+ year_str.length == 4 ? year_str[-2..] : year_str
82
+ end
83
+
84
+ def render_research_report(id)
85
+ parts = []
86
+ parts << id.publisher if id.publisher
87
+ parts << "RR:#{id.committee}-#{id.code.number}" if id.committee && id.code
88
+ parts.join(" ")
89
+ end
90
+
91
+ def render_data_series(id)
92
+ parts = []
93
+ parts << id.publisher if id.publisher
94
+
95
+ result = parts.join(" ")
96
+ result += " " if id.publisher && !result.end_with?(" ")
97
+
98
+ result += "DS"
99
+ result += id.code.to_s if id.code
100
+ result += "HOL" if id.hol_suffix
101
+ result += id.format_suffix if id.format_suffix
102
+ result
103
+ end
104
+
105
+ def render_technical_report(id)
106
+ if id.publisher == "ISO/ASTM" && (id.code.nil? || id.code.letter.nil?)
107
+ result = "ISO/ASTMTR"
108
+ else
109
+ result = "TR"
110
+ result += id.code.letter if id.code&.letter
111
+ end
112
+ result += id.code.number if id.code&.number
113
+ result += id.format_suffix if id.format_suffix
114
+ result
115
+ end
116
+
117
+ def render_monograph(id)
118
+ parts = []
119
+ parts << id.publisher if id.publisher
120
+
121
+ result = parts.join(" ")
122
+ result += " " if id.publisher && !result.end_with?(" ")
123
+
124
+ result += "MONO"
125
+ result += id.code.number if id.code
126
+ result += "-#{id.edition}" if id.edition
127
+ result += id.format_suffix if id.format_suffix
128
+ result
129
+ end
130
+
131
+ def render_adjunct(id)
132
+ result = []
133
+ result << id.publisher if id.publisher && !id.ea_suffix && !id.dvd_suffix
134
+ result << "ADJ#{id.designation}#{'-EA' if id.ea_suffix}#{'DVD' if id.dvd_suffix}"
135
+ result.compact.join(" ")
136
+ end
137
+
138
+ def render_work_in_progress(id)
139
+ parts = []
140
+ parts << id.publisher if id.publisher
141
+
142
+ result = parts.join(" ")
143
+ result += " " if id.publisher && !result.end_with?(" ")
144
+
145
+ result += "WK"
146
+ result += id.code.number if id.code
147
+ result
148
+ end
149
+
150
+ def render_manual(id)
151
+ parts = []
152
+ parts << id.publisher if id.publisher
153
+ parts << "MNL"
154
+ parts << "TP" if id.tp_designation
155
+ parts << id.code.number if id.code
156
+
157
+ result = parts.join
158
+
159
+ result += "-#{id.edition}" if id.edition
160
+
161
+ if id.publisher
162
+ result = "#{id.publisher} #{result[id.publisher.length..]}"
163
+ end
164
+
165
+ result += "-SUP" if id.supplement
166
+ result += id.format_suffix if id.format_suffix
167
+
168
+ result
169
+ end
170
+ end
171
+ end
172
+ end
@@ -2,7 +2,9 @@
2
2
 
3
3
  module Pubid
4
4
  module Astm
5
- class SingleIdentifier < Pubid::Identifier
5
+ # Descends from Pubid::Astm::Identifier (the flavor base) so every concrete
6
+ # ASTM identifier is `is_a?(Pubid::Astm::Identifier)`.
7
+ class SingleIdentifier < Identifier
6
8
  # Generate URN for this identifier
7
9
  #
8
10
  # @return [String] URN representation
@@ -10,16 +12,6 @@ module Pubid
10
12
  attribute :code, Components::Code
11
13
  attribute :year, :string
12
14
  attribute :format_suffix, :string # -EB for eBook
13
-
14
- def to_s
15
- parts = []
16
- parts << publisher if publisher
17
- parts << prefix if self.class.attributes.key?(:prefix) && prefix
18
- parts << code.to_s if code
19
- parts << "-#{year}" if year
20
- parts << format_suffix if format_suffix
21
- parts.join(" ")
22
- end
23
15
  end
24
16
  end
25
17
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ # Parses ASTM URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits:
8
+ # urn:astm:{publisher}:{code}:{year}[:sub_year][:reapp.X][:eX][:wip][:wk.X]
9
+ #
10
+ # The publisher slot is the lowercase publisher string ("astm" or
11
+ # "pub-copub"). The code slot is the alphanumeric ASTM code (e.g.,
12
+ # "D2148", "A1"). Year is **2 digits** in the URN.
13
+ #
14
+ # Examples:
15
+ # - urn:astm:astm:D2148:2022 → ASTM D2148-22
16
+ # - urn:astm:astm:A1:2002 → ASTM A1-02
17
+ class UrnParser < Pubid::UrnParser::Base
18
+ def parse_urn(urn)
19
+ body = strip_namespace(urn)
20
+ parts = split_parts(body)
21
+
22
+ _publisher, code, year = parts
23
+
24
+ text = "ASTM #{code}"
25
+ text += "-#{year[-2..]}" if year && year.length >= 2
26
+ flavor_parse(text)
27
+ end
28
+ end
29
+ end
30
+ end
data/lib/pubid/astm.rb CHANGED
@@ -1,38 +1,50 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "parslet"
4
- require "lutaml/model"
5
- require_relative "identifier"
6
- require_relative "astm/identifier"
7
- require_relative "astm/components/code"
8
- require_relative "astm/single_identifier"
9
- require_relative "astm/parser"
10
- require_relative "astm/builder"
11
-
12
- # Identifier classes
13
- require_relative "astm/identifiers/base"
14
- require_relative "astm/identifiers/standard"
15
- require_relative "astm/identifiers/iso_dual_published"
16
- require_relative "astm/identifiers/manual"
17
- require_relative "astm/identifiers/research_report"
18
- require_relative "astm/identifiers/data_series"
19
- require_relative "astm/identifiers/technical_report"
20
- require_relative "astm/identifiers/monograph"
21
- require_relative "astm/identifiers/adjunct"
22
- require_relative "astm/identifiers/work_in_progress"
23
-
24
- # Scheme (must be loaded after identifiers)
25
- require_relative "astm/scheme"
26
-
27
3
  module Pubid
28
4
  module Astm
5
+ autoload :Components, "#{__dir__}/astm/components"
6
+ autoload :Identifier, "#{__dir__}/astm/identifier"
7
+ autoload :Identifiers, "#{__dir__}/astm/identifiers"
8
+ autoload :SingleIdentifier, "#{__dir__}/astm/single_identifier"
9
+ autoload :Parser, "#{__dir__}/astm/parser"
10
+ autoload :Builder, "#{__dir__}/astm/builder"
11
+ autoload :Renderer, "#{__dir__}/astm/renderer"
12
+ autoload :UrnGenerator, "#{__dir__}/astm/urn_generator"
13
+ autoload :UrnParser, "#{__dir__}/astm/urn_parser"
14
+
29
15
  def self.parse(str)
30
16
  Identifier.parse(str)
31
17
  end
32
- end
33
18
 
34
- # Register this flavor with the Pubid registry
19
+ def self.identifier_types
20
+ @identifier_types ||= Identifiers.constants
21
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
22
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
23
+ .select { |c| c.type.is_a?(Hash) }
24
+ end
25
+
26
+ def self.all_typed_stages
27
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
28
+ if klass.const_defined?(:TYPED_STAGES)
29
+ klass.const_get(:TYPED_STAGES)
30
+ else
31
+ []
32
+ end
33
+ end
34
+ end
35
+
36
+ def self.locate_type(code)
37
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
38
+ end
39
+
40
+ def self.locate_stage(abbr)
41
+ abbr_str = abbr.to_s.upcase
42
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
43
+ end
44
+ end
35
45
  end
36
46
 
37
- # Register Uastm flavor with the registry
38
47
  Pubid::Registry.register(:astm, Pubid::Astm)
48
+
49
+ Pubid::Astm::SingleIdentifier.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
50
+ Pubid::Astm::SingleIdentifier.format_registry.register(:human, renderer: Pubid::Astm::Renderer)
@@ -3,12 +3,19 @@
3
3
  module Pubid
4
4
  module Bsi
5
5
  class Builder < Pubid::Builder::Base
6
- def initialize(scheme)
7
- @scheme = scheme
8
- end
9
-
10
- def self.build(parsed_data, scheme = Scheme.new)
11
- new(scheme).build(parsed_data)
6
+ # Default typed stage used when an abbreviation lookup yields no match.
7
+ # Empty/unknown abbreviations fall back to the published British Standard.
8
+ DEFAULT_TYPED_STAGE = Pubid::Components::TypedStage.new(
9
+ code: :pubbs,
10
+ stage_code: :published,
11
+ type_code: :bs,
12
+ abbr: ["BS"],
13
+ name: "British Standard",
14
+ harmonized_stages: %w[60.00 60.60],
15
+ ).freeze
16
+
17
+ def self.build(parsed_data)
18
+ new.build(parsed_data)
12
19
  end
13
20
 
14
21
  def build(data)
@@ -122,7 +129,7 @@ module Pubid
122
129
  return identifier
123
130
  end
124
131
 
125
- # Determine identifier class using Scheme
132
+ # Determine identifier class using the module's lookup helpers
126
133
  identifier = locate_identifier_klass(data).new
127
134
  assign_attributes(identifier, data)
128
135
 
@@ -934,17 +941,19 @@ module Pubid
934
941
  return Identifiers::AdoptedEuropeanNorm if parsed_hash[:adopted_string]&.match?(/^EN\s+\d/)
935
942
  return Identifiers::AdoptedInternationalStandard if parsed_hash[:adopted_string]
936
943
 
937
- # Use type to determine class via Scheme
944
+ # Use type to determine class via Pubid::Bsi.locate_stage / locate_type.
945
+ # Unknown abbreviations fall back to DEFAULT_TYPED_STAGE (published BS).
938
946
  type_str = parsed_hash[:type] || parsed_hash[:stage] || ""
939
- typed_stage = @scheme.locate_typed_stage_by_abbr(type_str)
940
- @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
947
+ typed_stage = Bsi.locate_stage(type_str.to_s.upcase) || DEFAULT_TYPED_STAGE
948
+ Bsi.locate_type(typed_stage.type_code) || Identifiers::BritishStandard
941
949
  end
942
950
 
943
951
  def cast(type, value)
944
952
  case type
945
953
  when :type
946
- # Lookup from register
947
- typed_stage = @scheme.locate_typed_stage_by_abbr(value || "")
954
+ # Lookup from register via Pubid::Bsi.locate_stage.
955
+ # Unknown abbreviations fall back to DEFAULT_TYPED_STAGE (published BS).
956
+ typed_stage = Bsi.locate_stage(value.to_s.upcase) || DEFAULT_TYPED_STAGE
948
957
  {
949
958
  stage: typed_stage.to_stage,
950
959
  type: typed_stage.to_type,
@@ -1,87 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Pubid
4
- module Bsi
5
- module Identifier
6
- def self.parse(string)
7
- # Delegate to IEC for bare IEC identifiers
8
- # This handles IEC-specific features like VAP suffixes (CSV, RLV, etc.)
9
- # and consolidated supplements (+AMD1:2001)
10
- if string.match?(/\bIEC\b/) &&
11
- (string.match?(/\s+(CSV|CMV|RLV|SER|EXV|PAC|PRV)\b/) ||
12
- string.match?(/\+AMD\d+:/) ||
13
- string.match?(/\+COR\d+:/))
14
- return Pubid::Iec.parse(string)
15
- end
16
-
17
- parser = Parser.new
18
- scheme = Scheme.new
19
-
20
- parsed = parser.parse(string)
21
- Builder.build(parsed, scheme)
22
- rescue Parslet::ParseFailed => e
23
- raise StandardError, "Failed to parse '#{string}': #{e.message}"
24
- end
25
-
26
- # Factory mirroring pubid 1.x's `Pubid::Bsi::Identifier.create` API.
27
- # Dispatches via {Pubid::Bsi::Scheme}'s IDENTIFIER_CLASS_MAP and
28
- # TYPED_STAGES_REGISTRY; default subclass is BritishStandard.
29
- #
30
- # BSI's renderer requires BSI-namespaced Component subclasses
31
- # (`Bsi::Components::*`), so coercion is inlined rather than reusing
32
- # {Pubid::Components::Factory}.
33
- def self.create(type: nil, stage: nil, **opts)
34
- klass = resolve_create_class(type: type, stage: stage)
35
- attrs = coerce_create_attrs(opts)
36
- ts = resolve_create_typed_stage(klass, stage)
37
- attrs[:typed_stage] = ts if ts
38
- klass.new(**attrs)
39
- end
40
-
41
- def self.resolve_create_class(type:, stage:)
42
- scheme = Scheme.new
43
- klass = nil
44
- if type
45
- klass = scheme.locate_identifier_klass_by_type_code(type)
46
- elsif stage
47
- ts = scheme.locate_typed_stage_by_abbr(stage.to_s)
48
- klass = scheme.locate_identifier_klass_by_type_code(ts.type_code) if ts
49
- end
50
- klass || Identifiers::BritishStandard
51
- end
52
-
53
- def self.resolve_create_typed_stage(klass, stage)
54
- if stage
55
- Scheme.new.locate_typed_stage_by_abbr(stage.to_s)
56
- elsif klass.const_defined?(:TYPED_STAGES)
57
- klass.const_get(:TYPED_STAGES).find do |ts|
58
- ts.stage_code.to_sym == :published
59
- end
60
- end
61
- end
62
-
63
- def self.coerce_create_attrs(opts)
64
- attrs = {}
65
- if (v = opts[:publisher])
66
- attrs[:publisher] = Components::Publisher.new(body: v.to_s)
67
- end
68
- %i[number part subpart].each do |k|
69
- v = opts[k]
70
- attrs[k] = Components::Code.new(value: v.to_s) unless v.nil?
71
- end
72
- if (v = opts[:year])
73
- attrs[:date] = Components::Date.new(year: v.to_s)
74
- end
75
- # BSI :edition is a plain string attribute (not a Component).
76
- attrs[:edition] = opts[:edition].to_s if opts[:edition]
77
- # TODO(create-shim): BSI also has prefix, flex_prefix, iteration,
78
- # second_number, month, translation_lang/upper attributes that
79
- # aren't yet wired through. Add as call sites require them.
80
- attrs
81
- end
82
- private_class_method :resolve_create_class,
83
- :resolve_create_typed_stage,
84
- :coerce_create_attrs
85
- end
86
- end
87
- end
3
+ # Pubid::Bsi::Identifier is the BSI base class (a real Pubid::Identifier
4
+ # subclass); its body, `.parse` (including the IEC-delegation logic), and the
5
+ # SingleIdentifier back-compat alias live in single_identifier.rb. This file
6
+ # just ensures it is loaded when a consumer references Pubid::Bsi::Identifier.
7
+ require_relative "single_identifier"
@@ -10,8 +10,8 @@ module Pubid
10
10
  # "BS 1902-2.3:Addendum No. 1:1976"
11
11
  # "BS 2000-0:Addendum 1:1983"
12
12
  # "BS 6034:1981:Addendum No. 1:1986"
13
- class AddendumDocument < Base
14
- attribute :base_identifier, Base, polymorphic: true
13
+ class AddendumDocument < SingleIdentifier
14
+ attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
15
15
  attribute :addendum_number, :string
16
16
  attribute :addendum_year, :integer
17
17
  attribute :addendum_type, :string, default: -> {
@@ -21,40 +21,6 @@ module Pubid
21
21
  ":"
22
22
  } # Separator before Addendum (":" or " ")
23
23
 
24
- def to_s(lang: :en, lang_single: false)
25
- result = base_identifier.to_s(lang: lang, lang_single: lang_single)
26
-
27
- # Determine separator - if separator is explicitly ":", use it
28
- # Otherwise if base has year and doesn't already have double colon, use space
29
- base_has_year = base_identifier.to_s =~ /:(\d{4})$/
30
-
31
- sep = if separator == ":"
32
- ":"
33
- elsif base_has_year && base_identifier.to_s !~ /:\d{4}:/
34
- " "
35
- else
36
- separator
37
- end
38
-
39
- # Format: "BASE:Addendum No. N:YEAR" or "BASE Addendum No. N:YEAR" or "BASE:Addendum N:YEAR"
40
- result += sep
41
- result += "Addendum"
42
-
43
- # Add space after "Addendum" if there's a type prefix (like "No.")
44
- if addendum_type.empty?
45
- # No type prefix, but still need space before number
46
- else
47
- result += " #{addendum_type}"
48
- end
49
- result += " "
50
- result += " "
51
-
52
- result += addendum_number.to_s
53
- result += ":#{addendum_year}" if addendum_year
54
-
55
- result
56
- end
57
-
58
24
  def publisher
59
25
  base_identifier&.publisher
60
26
  end
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Example: "BS EN 10077-1:2006" where EN 10077-1:2006 is a CEN identifier object
8
8
  # Example: "BS EN ISO 8601:2019" where EN ISO 8601:2019 is a CEN AdoptedEuropeanNorm wrapping ISO
9
9
  class AdoptedEuropeanNorm < BritishStandard
10
- attribute :adopted_identifier, Base, polymorphic: true # CEN object
10
+ attribute :adopted_identifier, ::Pubid::Identifier, polymorphic: true # CEN object
11
11
  attribute :edition, :string
12
12
  attribute :translation_lang, :string
13
13
  attribute :translation_upper, :string
@@ -16,53 +16,13 @@ module Pubid
16
16
  attribute :expert_commentary, :boolean
17
17
  attribute :expert_commentary_topic, :string
18
18
 
19
- def to_s(lang: :en, lang_single: false)
20
- # Get the BSI prefix (BS, PD, DD)
21
- prefix = case publisher
22
- when Components::Publisher
23
- publisher.body
24
- when Array
25
- publisher.join("/")
26
- when String
27
- publisher
28
- else
29
- "BS"
30
- end
31
-
32
- result = prefix
33
- result += " #{adopted_identifier}" if adopted_identifier
34
- result += " ED#{edition}" if edition
35
-
36
- # Reaffirmation notation like (R2004)
37
- result += " (R#{reaffirmation_year})" if reaffirmation_year
38
-
39
- # Translation - preserve the "version" or "Translation" suffix if present
40
- if translation_lang
41
- result += if translation_suffix_type == "version"
42
- " (#{translation_lang} version)"
43
- elsif translation_suffix_type == "Translation"
44
- " (#{translation_lang} Translation)"
45
- else
46
- " (#{translation_lang})"
47
- end
48
- elsif translation_upper
49
- result += if translation_suffix_type == "Translation"
50
- " (#{translation_upper} Translation)"
51
- else
52
- " (#{translation_upper})"
53
- end
54
- end
55
-
56
- # ExpertCommentary suffix
57
- if expert_commentary
58
- result += if expert_commentary_topic
59
- " ExComm (#{expert_commentary_topic})"
60
- else
61
- " ExComm"
62
- end
63
- end
64
-
65
- result
19
+ # Override self.type to return nil so this polymorphic wrapper is not
20
+ # registered as a base type. Inherits `:bs` from BritishStandard which
21
+ # would otherwise shadow it in Bsi.locate_type(:bs) auto-discovery.
22
+ # AdoptedEuropeanNorm is constructed explicitly by the builder, not
23
+ # selected by type-code lookup.
24
+ def self.type
25
+ nil
66
26
  end
67
27
 
68
28
  # Delegate common methods to adopted identifier
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Example: "BS ISO 8601:2019" where ISO 8601:2019 is an ISO identifier object
8
8
  # Example: "BS IEC 62600:2020" where IEC 62600:2020 is an IEC identifier object
9
9
  class AdoptedInternationalStandard < BritishStandard
10
- attribute :adopted_identifier, Base, polymorphic: true # ISO/IEC object
10
+ attribute :adopted_identifier, ::Pubid::Identifier, polymorphic: true # ISO/IEC object
11
11
  attribute :edition, :string
12
12
  attribute :translation_lang, :string
13
13
  attribute :translation_upper, :string
@@ -16,44 +16,13 @@ module Pubid
16
16
  attribute :expert_commentary, :boolean
17
17
  attribute :expert_commentary_topic, :string
18
18
 
19
- def to_s
20
- # Get the BSI prefix (BS, PD, DD)
21
- prefix = case publisher
22
- when Components::Publisher
23
- publisher.body
24
- when Array
25
- publisher.join("/")
26
- when String
27
- publisher
28
- else
29
- "BS"
30
- end
31
-
32
- result = prefix
33
- result += " #{adopted_identifier}" if adopted_identifier
34
- result += " ED#{edition}" if edition
35
-
36
- # Reaffirmation notation like (R2004)
37
- result += " (R#{reaffirmation_year})" if reaffirmation_year
38
-
39
- # Translation - normalize to just "(Language)" format
40
- # "(French version)", "(French Translation)", "(French)" all become "(French)"
41
- if translation_lang
42
- result += " (#{translation_lang})"
43
- elsif translation_upper
44
- result += " (#{translation_upper})"
45
- end
46
-
47
- # ExpertCommentary suffix
48
- if expert_commentary
49
- result += if expert_commentary_topic
50
- " ExComm (#{expert_commentary_topic})"
51
- else
52
- " ExComm"
53
- end
54
- end
55
-
56
- result
19
+ # Override self.type to return nil so this polymorphic wrapper is not
20
+ # registered as a base type. Inherits `:bs` from BritishStandard which
21
+ # would otherwise shadow it in Bsi.locate_type(:bs) auto-discovery.
22
+ # AdoptedInternationalStandard is constructed explicitly by the builder,
23
+ # not selected by type-code lookup.
24
+ def self.type
25
+ nil
57
26
  end
58
27
 
59
28
  # Delegate common methods to adopted identifier