pubid 2.0.0.pre.alpha.1 → 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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +27 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +7 -0
  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 -1
  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 -4
  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 -0
  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/identifiers/base.rb +0 -60
  55. data/lib/pubid/asme/renderer.rb +66 -0
  56. data/lib/pubid/asme/urn_parser.rb +31 -0
  57. data/lib/pubid/asme.rb +42 -1
  58. data/lib/pubid/astm/components/code.rb +9 -0
  59. data/lib/pubid/{jis → astm}/components.rb +1 -1
  60. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  61. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  62. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  63. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  64. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  65. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  66. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  67. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  68. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  69. data/lib/pubid/astm/identifiers.rb +18 -0
  70. data/lib/pubid/astm/renderer.rb +172 -0
  71. data/lib/pubid/astm/single_identifier.rb +0 -10
  72. data/lib/pubid/astm/urn_parser.rb +30 -0
  73. data/lib/pubid/astm.rb +39 -27
  74. data/lib/pubid/bsi/builder.rb +21 -12
  75. data/lib/pubid/bsi/identifier.rb +8 -2
  76. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  77. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  78. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  79. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  80. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  81. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  82. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  83. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  84. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  85. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  87. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  88. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  89. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  90. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  91. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  92. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  93. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  94. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  95. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  96. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  97. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  98. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  99. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  100. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  101. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  102. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  103. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  104. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  105. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  106. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  107. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  108. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  109. data/lib/pubid/bsi/identifiers.rb +0 -1
  110. data/lib/pubid/bsi/renderer.rb +1050 -0
  111. data/lib/pubid/bsi/single_identifier.rb +6 -70
  112. data/lib/pubid/bsi/urn_generator.rb +2 -3
  113. data/lib/pubid/bsi/urn_parser.rb +52 -0
  114. data/lib/pubid/bsi.rb +224 -1
  115. data/lib/pubid/builder/base.rb +57 -10
  116. data/lib/pubid/bundled_identifier.rb +0 -1
  117. data/lib/pubid/ccsds/builder.rb +4 -3
  118. data/lib/pubid/ccsds/identifier.rb +66 -1
  119. data/lib/pubid/ccsds/identifiers/base.rb +11 -50
  120. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  121. data/lib/pubid/ccsds/parser.rb +4 -2
  122. data/lib/pubid/ccsds/single_identifier.rb +4 -1
  123. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  124. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  125. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  126. data/lib/pubid/ccsds.rb +39 -1
  127. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  128. data/lib/pubid/cen_cenelec/identifier.rb +8 -2
  129. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  130. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  131. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  132. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  133. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  135. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  136. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  137. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  138. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  140. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  141. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  143. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  144. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  145. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  146. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  147. data/lib/pubid/cen_cenelec.rb +168 -1
  148. data/lib/pubid/cie/components/code.rb +8 -0
  149. data/lib/pubid/cie/identifier.rb +6 -4
  150. data/lib/pubid/cie/urn_parser.rb +28 -0
  151. data/lib/pubid/cie.rb +43 -1
  152. data/lib/pubid/components/adoption.rb +104 -0
  153. data/lib/pubid/components/code.rb +22 -8
  154. data/lib/pubid/components/date.rb +23 -16
  155. data/lib/pubid/components/edition.rb +9 -6
  156. data/lib/pubid/components/iteration.rb +32 -0
  157. data/lib/pubid/components/language.rb +6 -4
  158. data/lib/pubid/components/locality.rb +10 -1
  159. data/lib/pubid/components/publisher.rb +9 -6
  160. data/lib/pubid/components/relationship.rb +151 -0
  161. data/lib/pubid/components/stage.rb +5 -14
  162. data/lib/pubid/components/supplement.rb +184 -0
  163. data/lib/pubid/components/type.rb +5 -15
  164. data/lib/pubid/components/typed_stage.rb +11 -8
  165. data/lib/pubid/components.rb +4 -0
  166. data/lib/pubid/core/update_codes.rb +28 -7
  167. data/lib/pubid/csa/identifier.rb +0 -3
  168. data/lib/pubid/csa/identifiers/base.rb +2 -122
  169. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  170. data/lib/pubid/csa/identifiers/series.rb +2 -102
  171. data/lib/pubid/csa/renderer.rb +292 -0
  172. data/lib/pubid/csa/urn_generator.rb +1 -1
  173. data/lib/pubid/csa/urn_parser.rb +33 -0
  174. data/lib/pubid/csa.rb +42 -1
  175. data/lib/pubid/etsi/components/code.rb +9 -2
  176. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  177. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  178. data/lib/pubid/etsi/renderer.rb +42 -0
  179. data/lib/pubid/etsi/urn_parser.rb +34 -0
  180. data/lib/pubid/etsi.rb +42 -1
  181. data/lib/pubid/export/exporter.rb +4 -46
  182. data/lib/pubid/export/flavor_exporter.rb +111 -278
  183. data/lib/pubid/export.rb +0 -6
  184. data/lib/pubid/identifier.rb +10 -18
  185. data/lib/pubid/identifier_facade.rb +114 -0
  186. data/lib/pubid/identifier_metadata.rb +1 -1
  187. data/lib/pubid/idf/builder.rb +3 -3
  188. data/lib/pubid/idf/identifier.rb +3 -6
  189. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  190. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  191. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  192. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  193. data/lib/pubid/idf/parser.rb +3 -2
  194. data/lib/pubid/idf/renderer.rb +84 -0
  195. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  196. data/lib/pubid/idf/urn_generator.rb +4 -39
  197. data/lib/pubid/idf/urn_parser.rb +25 -0
  198. data/lib/pubid/idf.rb +51 -1
  199. data/lib/pubid/iec/builder.rb +48 -65
  200. data/lib/pubid/iec/components/code.rb +9 -32
  201. data/lib/pubid/iec/components/publisher.rb +1 -1
  202. data/lib/pubid/iec/components.rb +14 -0
  203. data/lib/pubid/iec/identifier.rb +276 -3
  204. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  205. data/lib/pubid/iec/identifiers/base.rb +8 -28
  206. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  207. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  208. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -30
  209. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  210. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -26
  211. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  212. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  213. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  214. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  215. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  216. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -15
  217. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  218. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  219. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  220. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  222. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  223. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -23
  224. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  225. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  226. data/lib/pubid/iec/identifiers.rb +30 -0
  227. data/lib/pubid/iec/parser.rb +20 -14
  228. data/lib/pubid/iec/renderer.rb +254 -0
  229. data/lib/pubid/iec/single_identifier.rb +6 -12
  230. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  231. data/lib/pubid/iec/urn_generator.rb +57 -171
  232. data/lib/pubid/iec/urn_parser.rb +53 -252
  233. data/lib/pubid/iec.rb +40 -68
  234. data/lib/pubid/ieee/builder.rb +12 -12
  235. data/lib/pubid/ieee/components/code.rb +8 -0
  236. data/lib/pubid/ieee/components/draft.rb +14 -0
  237. data/lib/pubid/ieee/components/relationship.rb +5 -149
  238. data/lib/pubid/ieee/identifier.rb +6 -0
  239. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  240. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  241. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  242. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  243. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  245. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  246. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  247. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  248. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  249. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  250. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  251. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  252. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  253. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  254. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  255. data/lib/pubid/ieee/pre_parser.rb +301 -0
  256. data/lib/pubid/ieee/renderer.rb +307 -0
  257. data/lib/pubid/ieee/urn_parser.rb +34 -0
  258. data/lib/pubid/ieee.rb +62 -1
  259. data/lib/pubid/ieee_debug.rb +0 -1
  260. data/lib/pubid/iho/builder.rb +2 -2
  261. data/lib/pubid/iho/identifier.rb +8 -0
  262. data/lib/pubid/iho/identifiers/base.rb +49 -10
  263. data/lib/pubid/iho/identifiers/bibliographic.rb +0 -4
  264. data/lib/pubid/iho/identifiers/circular_letter.rb +0 -4
  265. data/lib/pubid/iho/identifiers/miscellaneous.rb +0 -4
  266. data/lib/pubid/iho/identifiers/publication.rb +0 -4
  267. data/lib/pubid/iho/identifiers/standard.rb +0 -4
  268. data/lib/pubid/iho/parser.rb +3 -3
  269. data/lib/pubid/iho/renderer.rb +30 -0
  270. data/lib/pubid/iho/urn_generator.rb +3 -3
  271. data/lib/pubid/iho/urn_parser.rb +58 -0
  272. data/lib/pubid/iho.rb +50 -1
  273. data/lib/pubid/iso/builder.rb +59 -53
  274. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  275. data/lib/pubid/iso/components/code.rb +7 -19
  276. data/lib/pubid/iso/components/publisher.rb +10 -8
  277. data/lib/pubid/iso/components.rb +2 -4
  278. data/lib/pubid/iso/identifier.rb +233 -6
  279. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  280. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  281. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  282. data/lib/pubid/iso/identifiers/data.rb +0 -1
  283. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  284. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  285. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  286. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  287. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  288. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  289. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  290. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  291. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  292. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  293. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  294. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  295. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  296. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  297. data/lib/pubid/iso/identifiers.rb +0 -1
  298. data/lib/pubid/iso/normalizer.rb +89 -0
  299. data/lib/pubid/iso/parser.rb +26 -6
  300. data/lib/pubid/iso/single_identifier.rb +6 -3
  301. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  302. data/lib/pubid/iso/urn_generator.rb +74 -176
  303. data/lib/pubid/iso/urn_parser.rb +28 -9
  304. data/lib/pubid/iso.rb +173 -2
  305. data/lib/pubid/itu/builder.rb +0 -12
  306. data/lib/pubid/itu/components/code.rb +8 -0
  307. data/lib/pubid/itu/components.rb +11 -0
  308. data/lib/pubid/itu/identifier.rb +6 -39
  309. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  310. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  311. data/lib/pubid/itu/identifiers/base.rb +0 -6
  312. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  313. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  314. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  315. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  316. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  317. data/lib/pubid/itu/urn_parser.rb +23 -0
  318. data/lib/pubid/itu.rb +42 -1
  319. data/lib/pubid/jcgm/builder.rb +16 -8
  320. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  321. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  322. data/lib/pubid/jcgm/renderer.rb +68 -0
  323. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  324. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  325. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  326. data/lib/pubid/jcgm.rb +43 -2
  327. data/lib/pubid/jis/builder.rb +44 -52
  328. data/lib/pubid/jis/identifier.rb +132 -3
  329. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  330. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  331. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  332. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  333. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  334. data/lib/pubid/jis/identifiers.rb +1 -1
  335. data/lib/pubid/jis/parser.rb +31 -5
  336. data/lib/pubid/jis/renderer.rb +69 -0
  337. data/lib/pubid/jis/single_identifier.rb +6 -12
  338. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  339. data/lib/pubid/jis/urn_parser.rb +23 -0
  340. data/lib/pubid/jis.rb +42 -2
  341. data/lib/pubid/nist/builder.rb +122 -1761
  342. data/lib/pubid/nist/caster.rb +1272 -0
  343. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  344. data/lib/pubid/nist/components/code.rb +9 -20
  345. data/lib/pubid/nist/components/edition.rb +16 -0
  346. data/lib/pubid/nist/components/supplement.rb +88 -21
  347. data/lib/pubid/nist/components.rb +0 -1
  348. data/lib/pubid/nist/identifier.rb +25 -0
  349. data/lib/pubid/nist/identifiers/base.rb +206 -64
  350. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  351. data/lib/pubid/nist/identifiers/circular_supplement.rb +3 -2
  352. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  353. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  354. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  355. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -11
  356. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  357. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -16
  358. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  359. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  360. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  361. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  362. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  363. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  364. data/lib/pubid/nist/identifiers/report.rb +4 -3
  365. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  366. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  367. data/lib/pubid/nist/identifiers.rb +1 -0
  368. data/lib/pubid/nist/parser.rb +67 -424
  369. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  370. data/lib/pubid/nist/preprocessor.rb +416 -0
  371. data/lib/pubid/nist/renderer.rb +43 -0
  372. data/lib/pubid/nist/router.rb +148 -0
  373. data/lib/pubid/nist/series/base.rb +58 -0
  374. data/lib/pubid/nist/series/crpl.rb +13 -0
  375. data/lib/pubid/nist/series/fips.rb +14 -0
  376. data/lib/pubid/nist/series/ir.rb +60 -0
  377. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  378. data/lib/pubid/nist/series/mono.rb +19 -0
  379. data/lib/pubid/nist/series/ncstar.rb +20 -0
  380. data/lib/pubid/nist/series.rb +49 -0
  381. data/lib/pubid/nist/supplement_identifier.rb +11 -25
  382. data/lib/pubid/nist/urn_generator.rb +14 -8
  383. data/lib/pubid/nist/urn_parser.rb +67 -0
  384. data/lib/pubid/nist.rb +83 -4
  385. data/lib/pubid/oiml/components/code.rb +10 -0
  386. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  387. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  388. data/lib/pubid/oiml/renderer.rb +161 -0
  389. data/lib/pubid/oiml/single_identifier.rb +6 -45
  390. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  391. data/lib/pubid/oiml/urn_generator.rb +0 -8
  392. data/lib/pubid/oiml/urn_parser.rb +22 -0
  393. data/lib/pubid/oiml.rb +42 -1
  394. data/lib/pubid/plateau/identifier.rb +23 -0
  395. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  396. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  397. data/lib/pubid/plateau/renderer.rb +51 -0
  398. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  399. data/lib/pubid/plateau/urn_parser.rb +43 -0
  400. data/lib/pubid/plateau.rb +44 -1
  401. data/lib/pubid/renderers/base.rb +34 -0
  402. data/lib/pubid/renderers/directives_renderer.rb +27 -14
  403. data/lib/pubid/renderers/guide_renderer.rb +7 -1
  404. data/lib/pubid/renderers/human_readable.rb +31 -8
  405. data/lib/pubid/renderers/iwa_renderer.rb +5 -1
  406. data/lib/pubid/renderers/supplement_renderer.rb +4 -1
  407. data/lib/pubid/rendering/context.rb +33 -21
  408. data/lib/pubid/rendering.rb +0 -3
  409. data/lib/pubid/sae/components/date.rb +8 -0
  410. data/lib/pubid/sae/components/type.rb +5 -1
  411. data/lib/pubid/sae/identifiers/base.rb +2 -16
  412. data/lib/pubid/sae/renderer.rb +36 -0
  413. data/lib/pubid/sae/urn_generator.rb +2 -10
  414. data/lib/pubid/sae/urn_parser.rb +36 -0
  415. data/lib/pubid/sae.rb +42 -1
  416. data/lib/pubid/urn_generator/base.rb +12 -12
  417. data/lib/pubid/urn_parser/base.rb +81 -0
  418. data/lib/pubid/urn_parser/errors.rb +9 -0
  419. data/lib/pubid/urn_parser.rb +14 -0
  420. data/lib/pubid/version.rb +1 -1
  421. data/lib/pubid.rb +29 -7
  422. data/lib/tasks/website-data.json +1940 -1882
  423. metadata +77 -43
  424. data/lib/pubid/amca/scheme.rb +0 -16
  425. data/lib/pubid/ansi/scheme.rb +0 -15
  426. data/lib/pubid/api/scheme.rb +0 -66
  427. data/lib/pubid/ashrae/scheme.rb +0 -53
  428. data/lib/pubid/asme/scheme.rb +0 -37
  429. data/lib/pubid/astm/scheme.rb +0 -55
  430. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  431. data/lib/pubid/bsi/scheme.rb +0 -243
  432. data/lib/pubid/ccsds/scheme.rb +0 -57
  433. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  434. data/lib/pubid/cie/scheme.rb +0 -64
  435. data/lib/pubid/csa/scheme.rb +0 -44
  436. data/lib/pubid/etsi/scheme.rb +0 -42
  437. data/lib/pubid/export/data_class_exporter.rb +0 -59
  438. data/lib/pubid/export/ieee_exporter.rb +0 -78
  439. data/lib/pubid/export/itu_exporter.rb +0 -66
  440. data/lib/pubid/export/nist_exporter.rb +0 -64
  441. data/lib/pubid/export/registry_exporter.rb +0 -90
  442. data/lib/pubid/export/scheme_exporter.rb +0 -70
  443. data/lib/pubid/identifier_registry.rb +0 -198
  444. data/lib/pubid/idf/scheme.rb +0 -61
  445. data/lib/pubid/iec/scheme.rb +0 -71
  446. data/lib/pubid/ieee/scheme.rb +0 -90
  447. data/lib/pubid/iho/scheme.rb +0 -29
  448. data/lib/pubid/iso/identifiers/base.rb +0 -115
  449. data/lib/pubid/iso/scheme.rb +0 -187
  450. data/lib/pubid/itu/scheme.rb +0 -174
  451. data/lib/pubid/jcgm/scheme.rb +0 -60
  452. data/lib/pubid/jis/components/code.rb +0 -59
  453. data/lib/pubid/jis/identifiers/base.rb +0 -72
  454. data/lib/pubid/jis/scheme.rb +0 -49
  455. data/lib/pubid/nist/components/publisher.rb +0 -24
  456. data/lib/pubid/nist/scheme.rb +0 -199
  457. data/lib/pubid/oiml/scheme.rb +0 -46
  458. data/lib/pubid/plateau/scheme.rb +0 -45
  459. data/lib/pubid/rendering/base.rb +0 -73
  460. data/lib/pubid/rendering/common.rb +0 -211
  461. data/lib/pubid/rendering/format.rb +0 -25
  462. data/lib/pubid/sae/scheme.rb +0 -47
  463. data/lib/pubid/scheme.rb +0 -207
@@ -5,13 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  class ResearchReport < Base
7
7
  attribute :committee, :string # A01, C09
8
-
9
- def to_s
10
- parts = []
11
- parts << publisher if publisher
12
- parts << "RR:#{committee}-#{code.number}" if committee && code
13
- parts.join(" ")
14
- end
15
8
  end
16
9
  end
17
10
  end
@@ -7,45 +7,6 @@ module Pubid
7
7
  attribute :sub_year, :string # a, b, c
8
8
  attribute :reapproval, :string # (2023)
9
9
  attribute :edition, :string # e1
10
-
11
- def to_s
12
- parts = []
13
- parts << publisher if publisher
14
-
15
- # Code with potential dual unit
16
- if code
17
- code_str = code.to_s
18
- # Check if this is a dual unit designation
19
- if code.dual_m
20
- # F1862/F1862M format
21
- base_code = "#{code.letter}#{code.number}"
22
- code_str = "#{base_code}/#{base_code}M"
23
- end
24
- parts << code_str
25
- end
26
-
27
- # Join parts with space (ASTM E2938)
28
- result = parts.join(" ")
29
-
30
- # Append year directly without space
31
- if year
32
- result += "-#{year_portion}"
33
- result += sub_year if sub_year
34
- end
35
-
36
- # Append reapproval
37
- result += "(#{reapproval})" if reapproval
38
-
39
- # Append edition
40
- result += "e#{edition}" if edition
41
-
42
- result
43
- end
44
-
45
- def year_portion
46
- # Convert 4-digit to 2-digit (e.g., 2015 → 15)
47
- year.to_s.length == 4 ? year.to_s[-2..] : year.to_s
48
- end
49
10
  end
50
11
  end
51
12
  end
@@ -4,19 +4,6 @@ module Pubid
4
4
  module Astm
5
5
  module Identifiers
6
6
  class TechnicalReport < Base
7
- def to_s
8
- # Check if ISO/ASTM format: publisher "ISO/ASTM" without TR letter in code
9
- if publisher == "ISO/ASTM" && (code.nil? || code.letter.nil?)
10
- result = "ISO/ASTMTR"
11
- else
12
- # Simple TR format
13
- result = "TR"
14
- result += code.letter if code&.letter
15
- end
16
- result += code.number if code&.number
17
- result += format_suffix if format_suffix
18
- result
19
- end
20
7
  end
21
8
  end
22
9
  end
@@ -4,17 +4,6 @@ module Pubid
4
4
  module Astm
5
5
  module Identifiers
6
6
  class WorkInProgress < Base
7
- def to_s
8
- parts = []
9
- parts << publisher if publisher
10
-
11
- result = parts.join(" ")
12
- result += " " if publisher && !result.end_with?(" ")
13
-
14
- result += "WK"
15
- result += code.number if code
16
- result
17
- end
18
7
  end
19
8
  end
20
9
  end
@@ -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
@@ -10,16 +10,6 @@ module Pubid
10
10
  attribute :code, Components::Code
11
11
  attribute :year, :string
12
12
  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
13
  end
24
14
  end
25
15
  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,
@@ -2,7 +2,14 @@
2
2
 
3
3
  module Pubid
4
4
  module Bsi
5
+ # `extend Pubid::IdentifierFacade` adds polymorphic `from_hash` and pairs
6
+ # with `include Pubid::Bsi::Identifier` in SingleIdentifier (BSI's common
7
+ # ancestor — there is no Identifiers::Base) for identity (`is_a?`/`===`), so
8
+ # a consumer handed this module can deserialize and identity-check BSI ids
9
+ # through it.
5
10
  module Identifier
11
+ extend Pubid::IdentifierFacade
12
+
6
13
  def self.parse(string)
7
14
  # Delegate to IEC for bare IEC identifiers
8
15
  # This handles IEC-specific features like VAP suffixes (CSV, RLV, etc.)
@@ -15,10 +22,9 @@ module Pubid
15
22
  end
16
23
 
17
24
  parser = Parser.new
18
- scheme = Scheme.new
19
25
 
20
26
  parsed = parser.parse(string)
21
- Builder.build(parsed, scheme)
27
+ Builder.build(parsed)
22
28
  rescue Parslet::ParseFailed => e
23
29
  raise StandardError, "Failed to parse '#{string}': #{e.message}"
24
30
  end
@@ -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: -> {
@@ -22,37 +22,7 @@ module Pubid
22
22
  } # Separator before Addendum (":" or " ")
23
23
 
24
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
25
+ render(format: :human, lang: lang, lang_single: lang_single)
56
26
  end
57
27
 
58
28
  def publisher
@@ -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,17 @@ 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
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
26
+ end
64
27
 
65
- result
28
+ def to_s(lang: :en, lang_single: false)
29
+ render(format: :human, lang: lang, lang_single: lang_single)
66
30
  end
67
31
 
68
32
  # Delegate common methods to adopted identifier