pubid 1.15.19 → 2.0.0.pre.alpha.2

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 (604) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.adoc +2041 -53
  4. data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
  5. data/archived-gems/pubid-iec/stages.yaml +129 -0
  6. data/archived-gems/pubid-iec/update_codes.yaml +67 -0
  7. data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
  8. data/archived-gems/pubid-iso/stages.yaml +106 -0
  9. data/archived-gems/pubid-iso/update_codes.yaml +4 -0
  10. data/archived-gems/pubid-itu/i18n.yaml +13 -0
  11. data/archived-gems/pubid-itu/series.yaml +42 -0
  12. data/archived-gems/pubid-nist/publishers.yaml +6 -0
  13. data/archived-gems/pubid-nist/series.yaml +121 -0
  14. data/archived-gems/pubid-nist/stages.yaml +16 -0
  15. data/archived-gems/pubid-nist/update_codes.yaml +93 -0
  16. data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
  17. data/data/ccsds/update_codes.yaml +1 -0
  18. data/data/iec/update_codes.yaml +67 -0
  19. data/data/ieee/update_codes.yaml +104 -0
  20. data/data/iso/update_codes.yaml +21 -0
  21. data/data/nist/update_codes.yaml +89 -0
  22. data/data/plateau/update_codes.yaml +6 -0
  23. data/lib/pubid/amca/builder.rb +176 -0
  24. data/lib/pubid/amca/identifier.rb +57 -0
  25. data/lib/pubid/amca/identifiers/base.rb +64 -0
  26. data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
  27. data/lib/pubid/amca/identifiers/publication.rb +47 -0
  28. data/lib/pubid/amca/identifiers/standard.rb +22 -0
  29. data/lib/pubid/amca/identifiers.rb +12 -0
  30. data/lib/pubid/amca/parser.rb +153 -0
  31. data/lib/pubid/amca/scheme.rb +16 -0
  32. data/lib/pubid/amca/single_identifier.rb +33 -0
  33. data/lib/pubid/amca/urn_generator.rb +50 -0
  34. data/lib/pubid/amca.rb +26 -0
  35. data/lib/pubid/ansi/builder.rb +52 -0
  36. data/lib/pubid/ansi/identifier.rb +55 -0
  37. data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
  38. data/lib/pubid/ansi/identifiers/standard.rb +16 -0
  39. data/lib/pubid/ansi/identifiers.rb +11 -0
  40. data/lib/pubid/ansi/parser.rb +91 -0
  41. data/lib/pubid/ansi/scheme.rb +15 -0
  42. data/lib/pubid/ansi/single_identifier.rb +45 -0
  43. data/lib/pubid/ansi/urn_generator.rb +76 -0
  44. data/lib/pubid/ansi.rb +27 -0
  45. data/lib/pubid/api/builder.rb +85 -0
  46. data/lib/pubid/api/components/code.rb +9 -0
  47. data/lib/pubid/api/identifier.rb +68 -0
  48. data/lib/pubid/api/identifiers/base.rb +24 -0
  49. data/lib/pubid/api/identifiers/bulletin.rb +15 -0
  50. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
  51. data/lib/pubid/api/identifiers/mpms.rb +44 -0
  52. data/lib/pubid/api/identifiers/publication.rb +15 -0
  53. data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
  54. data/lib/pubid/api/identifiers/specification.rb +15 -0
  55. data/lib/pubid/api/identifiers/standard.rb +15 -0
  56. data/lib/pubid/api/identifiers/technical_report.rb +15 -0
  57. data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
  58. data/lib/pubid/api/parser.rb +140 -0
  59. data/lib/pubid/api/scheme.rb +66 -0
  60. data/lib/pubid/api/single_identifier.rb +46 -0
  61. data/lib/pubid/api/urn_generator.rb +41 -0
  62. data/lib/pubid/api.rb +17 -0
  63. data/lib/pubid/ashrae/builder.rb +498 -0
  64. data/lib/pubid/ashrae/identifier.rb +57 -0
  65. data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
  66. data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
  67. data/lib/pubid/ashrae/identifiers/base.rb +23 -0
  68. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
  69. data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
  70. data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
  71. data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
  72. data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
  73. data/lib/pubid/ashrae/identifiers.rb +16 -0
  74. data/lib/pubid/ashrae/parser.rb +724 -0
  75. data/lib/pubid/ashrae/scheme.rb +53 -0
  76. data/lib/pubid/ashrae/single_identifier.rb +23 -0
  77. data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
  78. data/lib/pubid/ashrae/urn_generator.rb +59 -0
  79. data/lib/pubid/ashrae.rb +21 -0
  80. data/lib/pubid/asme/builder.rb +153 -0
  81. data/lib/pubid/asme/components/code.rb +18 -0
  82. data/lib/pubid/asme/identifier.rb +61 -0
  83. data/lib/pubid/asme/identifiers/base.rb +70 -0
  84. data/lib/pubid/asme/identifiers/standard.rb +12 -0
  85. data/lib/pubid/asme/identifiers.rb +10 -0
  86. data/lib/pubid/asme/parser.rb +308 -0
  87. data/lib/pubid/asme/scheme.rb +37 -0
  88. data/lib/pubid/asme/single_identifier.rb +29 -0
  89. data/lib/pubid/asme/urn_generator.rb +133 -0
  90. data/lib/pubid/asme.rb +21 -0
  91. data/lib/pubid/astm/builder.rb +159 -0
  92. data/lib/pubid/astm/components/code.rb +33 -0
  93. data/lib/pubid/astm/identifier.rb +92 -0
  94. data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
  95. data/lib/pubid/astm/identifiers/base.rb +13 -0
  96. data/lib/pubid/astm/identifiers/data_series.rb +25 -0
  97. data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
  98. data/lib/pubid/astm/identifiers/manual.rb +40 -0
  99. data/lib/pubid/astm/identifiers/monograph.rb +25 -0
  100. data/lib/pubid/astm/identifiers/research_report.rb +18 -0
  101. data/lib/pubid/astm/identifiers/standard.rb +52 -0
  102. data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
  103. data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
  104. data/lib/pubid/astm/parser.rb +244 -0
  105. data/lib/pubid/astm/scheme.rb +55 -0
  106. data/lib/pubid/astm/single_identifier.rb +25 -0
  107. data/lib/pubid/astm/urn_generator.rb +99 -0
  108. data/lib/pubid/astm.rb +38 -0
  109. data/lib/pubid/bsi/builder.rb +1483 -0
  110. data/lib/pubid/bsi/components/code.rb +11 -0
  111. data/lib/pubid/bsi/components/date.rb +11 -0
  112. data/lib/pubid/bsi/components/publisher.rb +11 -0
  113. data/lib/pubid/bsi/components/type.rb +11 -0
  114. data/lib/pubid/bsi/identifier.rb +87 -0
  115. data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
  116. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
  117. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
  118. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
  119. data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
  120. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  121. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
  122. data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
  123. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
  124. data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
  125. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
  126. data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
  127. data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
  128. data/lib/pubid/bsi/identifiers/disc.rb +56 -0
  129. data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
  130. data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
  131. data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
  132. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
  133. data/lib/pubid/bsi/identifiers/flex.rb +61 -0
  134. data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
  135. data/lib/pubid/bsi/identifiers/index.rb +62 -0
  136. data/lib/pubid/bsi/identifiers/method.rb +76 -0
  137. data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
  138. data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
  139. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
  140. data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
  141. data/lib/pubid/bsi/identifiers/section.rb +62 -0
  142. data/lib/pubid/bsi/identifiers/set.rb +46 -0
  143. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
  144. data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
  145. data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
  146. data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
  147. data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
  148. data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
  149. data/lib/pubid/bsi/identifiers.rb +52 -0
  150. data/lib/pubid/bsi/model.rb +196 -0
  151. data/lib/pubid/bsi/parser.rb +659 -0
  152. data/lib/pubid/bsi/scheme.rb +243 -0
  153. data/lib/pubid/bsi/single_identifier.rb +129 -0
  154. data/lib/pubid/bsi/urn_generator.rb +84 -0
  155. data/lib/pubid/bsi.rb +32 -0
  156. data/lib/pubid/builder/base.rb +138 -0
  157. data/lib/pubid/bundled_identifier.rb +126 -0
  158. data/lib/pubid/ccsds/builder.rb +56 -0
  159. data/lib/pubid/ccsds/identifier.rb +84 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +89 -0
  161. data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
  162. data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
  163. data/lib/pubid/ccsds/identifiers.rb +10 -0
  164. data/lib/pubid/ccsds/parser.rb +71 -0
  165. data/lib/pubid/ccsds/scheme.rb +57 -0
  166. data/lib/pubid/ccsds/single_identifier.rb +77 -0
  167. data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
  168. data/lib/pubid/ccsds/urn_generator.rb +115 -0
  169. data/lib/pubid/ccsds.rb +21 -0
  170. data/lib/pubid/cen_cenelec/builder.rb +330 -0
  171. data/lib/pubid/cen_cenelec/identifier.rb +52 -0
  172. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
  173. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
  174. data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
  175. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
  176. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
  177. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
  178. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
  179. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
  180. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
  181. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
  182. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
  183. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
  184. data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
  185. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
  186. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
  187. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
  188. data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
  189. data/lib/pubid/cen_cenelec/parser.rb +144 -0
  190. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  191. data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
  192. data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
  193. data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
  194. data/lib/pubid/cen_cenelec.rb +21 -0
  195. data/lib/pubid/cie/builder.rb +399 -0
  196. data/lib/pubid/cie/components/code.rb +72 -0
  197. data/lib/pubid/cie/components/language.rb +58 -0
  198. data/lib/pubid/cie/identifier.rb +71 -0
  199. data/lib/pubid/cie/identifiers/bundle.rb +20 -0
  200. data/lib/pubid/cie/identifiers/conference.rb +32 -0
  201. data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
  202. data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
  203. data/lib/pubid/cie/identifiers/identical.rb +64 -0
  204. data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
  205. data/lib/pubid/cie/identifiers/standard.rb +58 -0
  206. data/lib/pubid/cie/identifiers/supplement.rb +45 -0
  207. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
  208. data/lib/pubid/cie/identifiers.rb +17 -0
  209. data/lib/pubid/cie/parser.rb +347 -0
  210. data/lib/pubid/cie/scheme.rb +64 -0
  211. data/lib/pubid/cie/single_identifier.rb +30 -0
  212. data/lib/pubid/cie/supplement_identifier.rb +26 -0
  213. data/lib/pubid/cie/urn_generator.rb +123 -0
  214. data/lib/pubid/cie.rb +28 -0
  215. data/lib/pubid/components/code.rb +33 -0
  216. data/lib/pubid/components/date.rb +49 -0
  217. data/lib/pubid/components/edition.rb +32 -0
  218. data/lib/pubid/components/factory.rb +50 -0
  219. data/lib/pubid/components/language.rb +37 -0
  220. data/lib/pubid/components/locality.rb +10 -0
  221. data/lib/pubid/components/publisher.rb +36 -0
  222. data/lib/pubid/components/stage.rb +54 -0
  223. data/lib/pubid/components/type.rb +58 -0
  224. data/lib/pubid/components/typed_stage.rb +59 -0
  225. data/lib/pubid/components.rb +16 -0
  226. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  227. data/lib/pubid/core/update_codes.rb +77 -0
  228. data/lib/pubid/core.rb +8 -0
  229. data/lib/pubid/csa/builder.rb +671 -0
  230. data/lib/pubid/csa/components/code.rb +9 -0
  231. data/lib/pubid/csa/components.rb +9 -0
  232. data/lib/pubid/csa/composite_identifier.rb +27 -0
  233. data/lib/pubid/csa/identifier.rb +513 -0
  234. data/lib/pubid/csa/identifiers/base.rb +133 -0
  235. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  236. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  237. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  238. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  239. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  240. data/lib/pubid/csa/identifiers/package.rb +65 -0
  241. data/lib/pubid/csa/identifiers/series.rb +127 -0
  242. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  243. data/lib/pubid/csa/identifiers.rb +17 -0
  244. data/lib/pubid/csa/parser.rb +445 -0
  245. data/lib/pubid/csa/scheme.rb +44 -0
  246. data/lib/pubid/csa/single_identifier.rb +30 -0
  247. data/lib/pubid/csa/urn_generator.rb +80 -0
  248. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  249. data/lib/pubid/csa.rb +25 -0
  250. data/lib/pubid/etsi/builder.rb +133 -0
  251. data/lib/pubid/etsi/components/code.rb +42 -0
  252. data/lib/pubid/etsi/components/version.rb +37 -0
  253. data/lib/pubid/etsi/components.rb +10 -0
  254. data/lib/pubid/etsi/identifier.rb +57 -0
  255. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  256. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  257. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  258. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  259. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  260. data/lib/pubid/etsi/identifiers.rb +14 -0
  261. data/lib/pubid/etsi/parser.rb +133 -0
  262. data/lib/pubid/etsi/scheme.rb +42 -0
  263. data/lib/pubid/etsi/urn_generator.rb +76 -0
  264. data/lib/pubid/etsi.rb +21 -0
  265. data/lib/pubid/export/auditor.rb +89 -0
  266. data/lib/pubid/export/data_class_exporter.rb +59 -0
  267. data/lib/pubid/export/exporter.rb +74 -0
  268. data/lib/pubid/export/flavor_exporter.rb +402 -0
  269. data/lib/pubid/export/ieee_exporter.rb +78 -0
  270. data/lib/pubid/export/itu_exporter.rb +66 -0
  271. data/lib/pubid/export/nist_exporter.rb +64 -0
  272. data/lib/pubid/export/registry_exporter.rb +90 -0
  273. data/lib/pubid/export/result.rb +97 -0
  274. data/lib/pubid/export/scheme_exporter.rb +70 -0
  275. data/lib/pubid/export.rb +18 -0
  276. data/lib/pubid/format_detector.rb +16 -0
  277. data/lib/pubid/format_registry.rb +42 -0
  278. data/lib/pubid/identifier.rb +242 -0
  279. data/lib/pubid/identifier_metadata.rb +148 -0
  280. data/lib/pubid/identifier_registry.rb +198 -0
  281. data/lib/pubid/idf/builder.rb +82 -0
  282. data/lib/pubid/idf/identifier.rb +129 -0
  283. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  284. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  285. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  286. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  287. data/lib/pubid/idf/identifiers.rb +13 -0
  288. data/lib/pubid/idf/parser.rb +143 -0
  289. data/lib/pubid/idf/scheme.rb +61 -0
  290. data/lib/pubid/idf/single_identifier.rb +19 -0
  291. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  292. data/lib/pubid/idf/urn_generator.rb +84 -0
  293. data/lib/pubid/idf.rb +25 -0
  294. data/lib/pubid/iec/builder.rb +458 -0
  295. data/lib/pubid/iec/components/code.rb +60 -0
  296. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  297. data/lib/pubid/iec/components/publisher.rb +36 -0
  298. data/lib/pubid/iec/components/sheet.rb +32 -0
  299. data/lib/pubid/iec/components/trf_info.rb +38 -0
  300. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  301. data/lib/pubid/iec/identifier.rb +256 -0
  302. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  303. data/lib/pubid/iec/identifiers/base.rb +82 -0
  304. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  305. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  306. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +82 -0
  307. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  308. data/lib/pubid/iec/identifiers/fragment_identifier.rb +137 -0
  309. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  310. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  311. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  312. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  313. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  314. data/lib/pubid/iec/identifiers/sheet_identifier.rb +62 -0
  315. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  316. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  317. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  319. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  320. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  321. data/lib/pubid/iec/identifiers/vap_identifier.rb +73 -0
  322. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  323. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  324. data/lib/pubid/iec/parser.rb +417 -0
  325. data/lib/pubid/iec/rendering_style.rb +113 -0
  326. data/lib/pubid/iec/scheme.rb +71 -0
  327. data/lib/pubid/iec/single_identifier.rb +80 -0
  328. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  329. data/lib/pubid/iec/urn_generator.rb +79 -0
  330. data/lib/pubid/iec/urn_parser.rb +90 -0
  331. data/lib/pubid/iec.rb +85 -0
  332. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  333. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  334. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  335. data/lib/pubid/ieee/aiee.rb +11 -0
  336. data/lib/pubid/ieee/builder.rb +1237 -0
  337. data/lib/pubid/ieee/components/code.rb +102 -0
  338. data/lib/pubid/ieee/components/draft.rb +93 -0
  339. data/lib/pubid/ieee/components/relationship.rb +157 -0
  340. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  341. data/lib/pubid/ieee/identifier.rb +54 -0
  342. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  343. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  344. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  345. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  346. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  347. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  348. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  349. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  350. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  351. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  352. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  353. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  354. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  355. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  356. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  358. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  359. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  360. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  361. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  362. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  363. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  364. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  365. data/lib/pubid/ieee/identifiers.rb +33 -0
  366. data/lib/pubid/ieee/ire/builder.rb +61 -0
  367. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  368. data/lib/pubid/ieee/ire/parser.rb +91 -0
  369. data/lib/pubid/ieee/ire.rb +11 -0
  370. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  371. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  372. data/lib/pubid/ieee/nesc.rb +10 -0
  373. data/lib/pubid/ieee/parser.rb +1226 -0
  374. data/lib/pubid/ieee/scheme.rb +90 -0
  375. data/lib/pubid/ieee/typed_stages.rb +172 -0
  376. data/lib/pubid/ieee/urn_generator.rb +188 -0
  377. data/lib/pubid/ieee.rb +32 -0
  378. data/lib/pubid/ieee_debug.rb +31 -0
  379. data/lib/pubid/iho/builder.rb +37 -0
  380. data/lib/pubid/iho/identifier.rb +61 -0
  381. data/lib/pubid/iho/identifiers/base.rb +41 -0
  382. data/lib/pubid/iho/identifiers/bibliographic.rb +16 -0
  383. data/lib/pubid/iho/identifiers/circular_letter.rb +15 -0
  384. data/lib/pubid/iho/identifiers/miscellaneous.rb +16 -0
  385. data/lib/pubid/iho/identifiers/publication.rb +15 -0
  386. data/lib/pubid/iho/identifiers/standard.rb +15 -0
  387. data/lib/pubid/iho/identifiers.rb +14 -0
  388. data/lib/pubid/iho/parser.rb +68 -0
  389. data/lib/pubid/iho/scheme.rb +29 -0
  390. data/lib/pubid/iho/urn_generator.rb +29 -0
  391. data/lib/pubid/iho.rb +21 -0
  392. data/lib/pubid/iso/builder.rb +309 -0
  393. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  394. data/lib/pubid/iso/combined_identifier.rb +22 -0
  395. data/lib/pubid/iso/components/code.rb +36 -0
  396. data/lib/pubid/iso/components/publisher.rb +60 -0
  397. data/lib/pubid/iso/components.rb +12 -0
  398. data/lib/pubid/iso/format_resolver.rb +45 -0
  399. data/lib/pubid/iso/identifier.rb +330 -0
  400. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  401. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  402. data/lib/pubid/iso/identifiers/base.rb +115 -0
  403. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  404. data/lib/pubid/iso/identifiers/data.rb +76 -0
  405. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  406. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  407. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  408. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  409. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  410. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  411. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  412. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  413. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  414. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  415. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  416. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  417. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  418. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  419. data/lib/pubid/iso/identifiers.rb +33 -0
  420. data/lib/pubid/iso/parser.rb +512 -0
  421. data/lib/pubid/iso/rendering_style.rb +120 -0
  422. data/lib/pubid/iso/scheme.rb +193 -0
  423. data/lib/pubid/iso/single_identifier.rb +64 -0
  424. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  425. data/lib/pubid/iso/urn_generator.rb +426 -0
  426. data/lib/pubid/iso/urn_parser.rb +437 -0
  427. data/lib/pubid/iso/utilities.rb +86 -0
  428. data/lib/pubid/iso.rb +50 -0
  429. data/lib/pubid/itu/builder.rb +171 -0
  430. data/lib/pubid/itu/components/code.rb +39 -0
  431. data/lib/pubid/itu/components/sector.rb +35 -0
  432. data/lib/pubid/itu/components/series.rb +29 -0
  433. data/lib/pubid/itu/i18n.rb +9 -0
  434. data/lib/pubid/itu/i18n.yaml +30 -0
  435. data/lib/pubid/itu/identifier.rb +118 -0
  436. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  437. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  438. data/lib/pubid/itu/identifiers/base.rb +154 -0
  439. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  440. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  441. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  442. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  443. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  444. data/lib/pubid/itu/identifiers.rb +16 -0
  445. data/lib/pubid/itu/model.rb +111 -0
  446. data/lib/pubid/itu/parser.rb +225 -0
  447. data/lib/pubid/itu/scheme.rb +174 -0
  448. data/lib/pubid/itu/urn_generator.rb +105 -0
  449. data/lib/pubid/itu.rb +22 -0
  450. data/lib/pubid/jcgm/builder.rb +88 -0
  451. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  452. data/lib/pubid/jcgm/components.rb +9 -0
  453. data/lib/pubid/jcgm/identifier.rb +54 -0
  454. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  455. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  456. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  457. data/lib/pubid/jcgm/identifiers.rb +11 -0
  458. data/lib/pubid/jcgm/parser.rb +84 -0
  459. data/lib/pubid/jcgm/scheme.rb +60 -0
  460. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  461. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  462. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  463. data/lib/pubid/jcgm.rb +31 -0
  464. data/lib/pubid/jis/builder.rb +124 -0
  465. data/lib/pubid/jis/components/code.rb +59 -0
  466. data/lib/pubid/jis/components.rb +9 -0
  467. data/lib/pubid/jis/identifier.rb +61 -0
  468. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  469. data/lib/pubid/jis/identifiers/base.rb +72 -0
  470. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  471. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  472. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  473. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  474. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  475. data/lib/pubid/jis/identifiers.rb +17 -0
  476. data/lib/pubid/jis/parser.rb +109 -0
  477. data/lib/pubid/jis/scheme.rb +49 -0
  478. data/lib/pubid/jis/single_identifier.rb +37 -0
  479. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  480. data/lib/pubid/jis/urn_generator.rb +25 -0
  481. data/lib/pubid/jis.rb +23 -0
  482. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  483. data/lib/pubid/nist/builder.rb +2269 -0
  484. data/lib/pubid/nist/components/code.rb +38 -0
  485. data/lib/pubid/nist/components/edition.rb +134 -0
  486. data/lib/pubid/nist/components/issue_number.rb +28 -0
  487. data/lib/pubid/nist/components/part.rb +77 -0
  488. data/lib/pubid/nist/components/publisher.rb +24 -0
  489. data/lib/pubid/nist/components/stage.rb +53 -0
  490. data/lib/pubid/nist/components/supplement.rb +188 -0
  491. data/lib/pubid/nist/components/translation.rb +42 -0
  492. data/lib/pubid/nist/components/update.rb +103 -0
  493. data/lib/pubid/nist/components/version.rb +35 -0
  494. data/lib/pubid/nist/components/volume.rb +32 -0
  495. data/lib/pubid/nist/components.rb +19 -0
  496. data/lib/pubid/nist/configuration.rb +77 -0
  497. data/lib/pubid/nist/identifier.rb +62 -0
  498. data/lib/pubid/nist/identifiers/base.rb +578 -0
  499. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  500. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  501. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  502. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  503. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  504. data/lib/pubid/nist/identifiers/crpl_report.rb +132 -0
  505. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +104 -0
  506. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  507. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  508. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  509. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  510. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  511. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  512. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  513. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  514. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  515. data/lib/pubid/nist/identifiers/report.rb +67 -0
  516. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  517. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  518. data/lib/pubid/nist/identifiers.rb +33 -0
  519. data/lib/pubid/nist/parser.rb +1117 -0
  520. data/lib/pubid/nist/scheme.rb +199 -0
  521. data/lib/pubid/nist/supplement_identifier.rb +67 -0
  522. data/lib/pubid/nist/urn_generator.rb +133 -0
  523. data/lib/pubid/nist.rb +37 -0
  524. data/lib/pubid/oiml/builder.rb +189 -0
  525. data/lib/pubid/oiml/components/code.rb +20 -0
  526. data/lib/pubid/oiml/components.rb +9 -0
  527. data/lib/pubid/oiml/identifier.rb +61 -0
  528. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  529. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  530. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  531. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  536. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  537. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  538. data/lib/pubid/oiml/identifiers.rb +18 -0
  539. data/lib/pubid/oiml/parser.rb +173 -0
  540. data/lib/pubid/oiml/scheme.rb +46 -0
  541. data/lib/pubid/oiml/single_identifier.rb +90 -0
  542. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  543. data/lib/pubid/oiml/urn_generator.rb +64 -0
  544. data/lib/pubid/oiml.rb +26 -0
  545. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  546. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  547. data/lib/pubid/parser.rb +8 -0
  548. data/lib/pubid/parsers/base.rb +11 -0
  549. data/lib/pubid/parsers/mr_string.rb +93 -0
  550. data/lib/pubid/plateau/builder.rb +50 -0
  551. data/lib/pubid/plateau/identifier.rb +57 -0
  552. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  553. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  554. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  555. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  556. data/lib/pubid/plateau/identifiers.rb +12 -0
  557. data/lib/pubid/plateau/parser.rb +63 -0
  558. data/lib/pubid/plateau/scheme.rb +45 -0
  559. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  560. data/lib/pubid/plateau/urn_generator.rb +29 -0
  561. data/lib/pubid/plateau.rb +26 -0
  562. data/lib/pubid/renderers/base.rb +53 -0
  563. data/lib/pubid/renderers/directives_renderer.rb +61 -0
  564. data/lib/pubid/renderers/guide_renderer.rb +24 -0
  565. data/lib/pubid/renderers/human_readable.rb +70 -0
  566. data/lib/pubid/renderers/iwa_renderer.rb +20 -0
  567. data/lib/pubid/renderers/mr_string.rb +16 -0
  568. data/lib/pubid/renderers/supplement_renderer.rb +36 -0
  569. data/lib/pubid/renderers/urn.rb +11 -0
  570. data/lib/pubid/renderers.rb +14 -0
  571. data/lib/pubid/rendering/base.rb +73 -0
  572. data/lib/pubid/rendering/common.rb +211 -0
  573. data/lib/pubid/rendering/context.rb +159 -0
  574. data/lib/pubid/rendering/date.rb +27 -0
  575. data/lib/pubid/rendering/format.rb +25 -0
  576. data/lib/pubid/rendering/language.rb +21 -0
  577. data/lib/pubid/rendering/numbering.rb +24 -0
  578. data/lib/pubid/rendering/publisher.rb +25 -0
  579. data/lib/pubid/rendering/stage.rb +38 -0
  580. data/lib/pubid/rendering/supplement.rb +46 -0
  581. data/lib/pubid/rendering.rb +16 -0
  582. data/lib/pubid/sae/builder.rb +32 -0
  583. data/lib/pubid/sae/components/code.rb +9 -0
  584. data/lib/pubid/sae/components/date.rb +19 -0
  585. data/lib/pubid/sae/components/type.rb +19 -0
  586. data/lib/pubid/sae/components.rb +11 -0
  587. data/lib/pubid/sae/identifier.rb +37 -0
  588. data/lib/pubid/sae/identifiers/base.rb +42 -0
  589. data/lib/pubid/sae/identifiers.rb +9 -0
  590. data/lib/pubid/sae/parser.rb +55 -0
  591. data/lib/pubid/sae/scheme.rb +47 -0
  592. data/lib/pubid/sae/urn_generator.rb +38 -0
  593. data/lib/pubid/sae.rb +19 -0
  594. data/lib/pubid/scheme.rb +219 -0
  595. data/lib/pubid/urn_generator/base.rb +110 -0
  596. data/lib/pubid/utils/string_normalizer.rb +196 -0
  597. data/lib/pubid/utils.rb +7 -0
  598. data/lib/pubid/version.rb +3 -1
  599. data/lib/pubid.rb +137 -13
  600. data/lib/tasks/docs.rake +37 -0
  601. data/lib/tasks/export.rake +38 -0
  602. data/lib/tasks/website-data.json +7488 -0
  603. metadata +616 -171
  604. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,243 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Bsi
5
+ class Scheme < Pubid::Scheme
6
+ # TYPED_STAGES_REGISTRY for native BSI types
7
+ TYPED_STAGES_REGISTRY = [
8
+ # British Standard (BS)
9
+ Pubid::Components::TypedStage.new(
10
+ code: :pubbs,
11
+ stage_code: :published,
12
+ type_code: :bs,
13
+ abbr: ["BS"],
14
+ name: "British Standard",
15
+ harmonized_stages: %w[60.00 60.60],
16
+ ),
17
+ Pubid::Components::TypedStage.new(
18
+ code: :drbs,
19
+ stage_code: :draft,
20
+ type_code: :bs,
21
+ abbr: ["Draft BS", "DBS"],
22
+ name: "Draft British Standard",
23
+ harmonized_stages: %w[30.00 30.20 30.60 40.00 40.20 40.60],
24
+ ),
25
+
26
+ # Published Document (PD)
27
+ Pubid::Components::TypedStage.new(
28
+ code: :pubpd,
29
+ stage_code: :published,
30
+ type_code: :pd,
31
+ abbr: ["PD"],
32
+ name: "Published Document",
33
+ harmonized_stages: %w[60.00 60.60],
34
+ ),
35
+
36
+ # Publicly Available Specification (PAS)
37
+ Pubid::Components::TypedStage.new(
38
+ code: :pubpas,
39
+ stage_code: :published,
40
+ type_code: :pas,
41
+ abbr: ["PAS"],
42
+ name: "Publicly Available Specification",
43
+ harmonized_stages: %w[60.00 60.60],
44
+ ),
45
+
46
+ # National Annex (NA)
47
+ Pubid::Components::TypedStage.new(
48
+ code: :pubna,
49
+ stage_code: :published,
50
+ type_code: :na,
51
+ abbr: ["NA"],
52
+ name: "National Annex",
53
+ harmonized_stages: %w[60.00 60.60],
54
+ ),
55
+
56
+ # Draft Document (DD)
57
+ Pubid::Components::TypedStage.new(
58
+ code: :pubdd,
59
+ stage_code: :published,
60
+ type_code: :dd,
61
+ abbr: ["DD"],
62
+ name: "Draft Document",
63
+ harmonized_stages: %w[60.00 60.60],
64
+ ),
65
+
66
+ # Flex Document
67
+ Pubid::Components::TypedStage.new(
68
+ code: :pubflex,
69
+ stage_code: :published,
70
+ type_code: :flex,
71
+ abbr: ["Flex", "BSI Flex"],
72
+ name: "BSI Flex",
73
+ harmonized_stages: %w[60.00 60.60],
74
+ ),
75
+
76
+ # Handbook
77
+ Pubid::Components::TypedStage.new(
78
+ code: :pubhandbook,
79
+ stage_code: :published,
80
+ type_code: :handbook,
81
+ abbr: ["Handbook", "HB"],
82
+ name: "BSI Handbook",
83
+ harmonized_stages: %w[60.00 60.60],
84
+ ),
85
+
86
+ # Practice Guide (PP)
87
+ Pubid::Components::TypedStage.new(
88
+ code: :pubpp,
89
+ stage_code: :published,
90
+ type_code: :pp,
91
+ abbr: ["PP"],
92
+ name: "Published Practice",
93
+ harmonized_stages: %w[60.00 60.60],
94
+ ),
95
+
96
+ # British Industrial Practice (BIP)
97
+ Pubid::Components::TypedStage.new(
98
+ code: :pubbip,
99
+ stage_code: :published,
100
+ type_code: :bip,
101
+ abbr: ["BIP"],
102
+ name: "British Industrial Practice",
103
+ harmonized_stages: %w[60.00 60.60],
104
+ ),
105
+
106
+ # Aerospace/Specialized British Standard (with letter prefix)
107
+ Pubid::Components::TypedStage.new(
108
+ code: :pubaerospace,
109
+ stage_code: :published,
110
+ type_code: :aerospace,
111
+ abbr: ["BS A", "BS AU", "BS C", "BS M", "BS S", "BS L", "BS TA",
112
+ "BS MA", "BS PL", "BS QC", "BS G", "BS HC", "BS F", "BS X", "BS B"],
113
+ name: "Aerospace/Specialized British Standard",
114
+ harmonized_stages: %w[60.00 60.60],
115
+ ),
116
+
117
+ # Index
118
+ Pubid::Components::TypedStage.new(
119
+ code: :pubindex,
120
+ stage_code: :published,
121
+ type_code: :index,
122
+ abbr: ["Index"],
123
+ name: "BSI Index",
124
+ harmonized_stages: %w[60.00 60.60],
125
+ ),
126
+
127
+ # Method
128
+ Pubid::Components::TypedStage.new(
129
+ code: :pubmethod,
130
+ stage_code: :published,
131
+ type_code: :method,
132
+ abbr: ["Method", "Methods"],
133
+ name: "BSI Method",
134
+ harmonized_stages: %w[60.00 60.60],
135
+ ),
136
+
137
+ # Section
138
+ Pubid::Components::TypedStage.new(
139
+ code: :pubsection,
140
+ stage_code: :published,
141
+ type_code: :section,
142
+ abbr: ["Section"],
143
+ name: "BSI Section",
144
+ harmonized_stages: %w[60.00 60.60],
145
+ ),
146
+
147
+ # DISC (Delivering Information Solutions to Customers)
148
+ Pubid::Components::TypedStage.new(
149
+ code: :pubdisc,
150
+ stage_code: :published,
151
+ type_code: :disc,
152
+ abbr: ["DISC"],
153
+ name: "DISC",
154
+ harmonized_stages: %w[60.00 60.60],
155
+ ),
156
+
157
+ # Detailed Specification (with N or C notation)
158
+ Pubid::Components::TypedStage.new(
159
+ code: :pubdetailed_spec,
160
+ stage_code: :published,
161
+ type_code: :detailed_specification,
162
+ abbr: ["DETAILED SPEC"],
163
+ name: "Detailed Specification",
164
+ harmonized_stages: %w[60.00 60.60],
165
+ ),
166
+
167
+ # Standalone Amendment
168
+ Pubid::Components::TypedStage.new(
169
+ code: :standalone_amendment,
170
+ stage_code: :published,
171
+ type_code: :amendment,
172
+ abbr: ["AMD"],
173
+ name: "Amendment",
174
+ harmonized_stages: %w[60.00 60.60],
175
+ ),
176
+
177
+ # Technical Specification
178
+ Pubid::Components::TypedStage.new(
179
+ code: :pubts,
180
+ stage_code: :published,
181
+ type_code: :ts,
182
+ abbr: ["TS"],
183
+ name: "Technical Specification",
184
+ harmonized_stages: %w[60.00 60.60],
185
+ ),
186
+ ].freeze
187
+
188
+ # Map type codes to identifier classes
189
+ IDENTIFIER_CLASS_MAP = {
190
+ bs: "Identifiers::BritishStandard",
191
+ pd: "Identifiers::PublishedDocument",
192
+ pas: "Identifiers::PubliclyAvailableSpecification",
193
+ na: "Identifiers::NationalAnnex",
194
+ dd: "Identifiers::DraftDocument",
195
+ flex: "Identifiers::Flex",
196
+ handbook: "Identifiers::Handbook",
197
+ pp: "Identifiers::PracticeGuide",
198
+ bip: "Identifiers::BritishIndustrialPractice",
199
+ aerospace: "Identifiers::AerospaceStandard",
200
+ index: "Identifiers::Index",
201
+ method: "Identifiers::Method",
202
+ section: "Identifiers::Section",
203
+ disc: "Identifiers::Disc",
204
+ bundled: "Identifiers::BundledIdentifier",
205
+ detailed_specification: "Identifiers::DetailedSpecification",
206
+ standalone_amendment: "Identifiers::StandaloneAmendment",
207
+ ts: "Identifiers::TechnicalSpecification",
208
+ committee_document: "Identifiers::CommitteeDocument",
209
+ explanatory_supplement: "Identifiers::ExplanatorySupplement",
210
+ supplementary_index: "Identifiers::SupplementaryIndex",
211
+ test_method: "Identifiers::TestMethod",
212
+ set: "Identifiers::Set",
213
+ }.freeze
214
+
215
+ # Default typed stage for when no match is found
216
+ DEFAULT_TYPED_STAGE = Pubid::Components::TypedStage.new(
217
+ code: :pubbs,
218
+ stage_code: :published,
219
+ type_code: :bs,
220
+ abbr: ["BS"],
221
+ name: "British Standard",
222
+ harmonized_stages: %w[60.00 60.60],
223
+ ).freeze
224
+
225
+ def locate_typed_stage_by_abbr(abbr)
226
+ abbr_str = abbr.to_s.strip
227
+ TYPED_STAGES_REGISTRY.find do |ts|
228
+ ts.abbr.include?(abbr_str)
229
+ end || DEFAULT_TYPED_STAGE
230
+ end
231
+
232
+ def locate_identifier_klass_by_type_code(type_code)
233
+ class_name = IDENTIFIER_CLASS_MAP[type_code.to_sym]
234
+ return Identifiers::BritishStandard unless class_name
235
+
236
+ # Convert string to actual class
237
+ class_name.split("::").reduce(Pubid::Bsi) do |mod, name|
238
+ mod.const_get(name)
239
+ end
240
+ end
241
+ end
242
+ end
243
+ end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Bsi
5
+ class SingleIdentifier < Pubid::Identifier
6
+ # Generate URN for this identifier
7
+ #
8
+ # @return [String] URN representation
9
+
10
+ attribute :publisher, Bsi::Components::Publisher, default: -> {
11
+ Bsi::Components::Publisher.new(body: "BS")
12
+ }
13
+ attribute :prefix, :string # Specialized prefix (A, AU, C, M, 2A, etc.)
14
+ attribute :flex_prefix, :string # Flex type prefix (CECC, E9111, M, etc.)
15
+ attribute :number, Bsi::Components::Code
16
+ attribute :iteration, :string # For bracket notation like 1000[9]
17
+ attribute :part, Bsi::Components::Code
18
+ attribute :subpart, Bsi::Components::Code
19
+ attribute :second_number, Bsi::Components::Code # For collections like PAS 2035/2030
20
+ attribute :date, Bsi::Components::Date
21
+ attribute :stage, Pubid::Components::Stage
22
+ attribute :type, Bsi::Components::Type
23
+ attribute :typed_stage, Pubid::Components::TypedStage
24
+ attribute :edition, :string
25
+ attribute :month, :integer
26
+ attribute :translation_lang, :string
27
+ attribute :translation_upper, :string
28
+ attribute :explicit_prefix, :boolean, default: -> { false }
29
+ attribute :explicit_publisher, :boolean, default: -> { false }
30
+ attribute :space_separated_part, :boolean, default: -> { false }
31
+
32
+ def to_s(lang: :en, lang_single: false)
33
+ # Build string representation
34
+ parts = []
35
+
36
+ # For supplement/addendum base identifiers, flex_prefix replaces publisher+prefix
37
+ parts << publisher.to_s if publisher
38
+ if flex_prefix
39
+ # Flex prefix is the full prefix including BS (e.g., "BS CECC" becomes "BS" + space + "CECC")
40
+ parts << flex_prefix
41
+ elsif prefix
42
+ # Standard publisher
43
+
44
+ # Prefix if present (specialized prefix like A, AU, C, etc.)
45
+ parts << prefix.to_s
46
+ end
47
+
48
+ # Number with iteration, part, and subpart
49
+ if number
50
+ number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
51
+
52
+ # Collection (second number with slash)
53
+ if second_number
54
+ second_val = second_number.is_a?(Components::Code) ? second_number.value : second_number
55
+ number_str += "/#{second_val}"
56
+ end
57
+
58
+ # Part and subpart - check if space-separated
59
+ space_separated = space_separated_part
60
+ if part
61
+ part_val = part.is_a?(Components::Code) ? part.value : part
62
+ # Trim part value to remove leading/trailing spaces from parser
63
+ part_str = part_val.to_s.strip
64
+ # Use space for space-separated parts, dash otherwise
65
+ separator = space_separated ? " " : "-"
66
+ number_str += "#{separator}#{part_str}"
67
+ end
68
+ if subpart
69
+ subpart_val = subpart.is_a?(Components::Code) ? subpart.value : subpart
70
+ subpart_str = subpart_val.to_s.strip
71
+ number_str += "-#{subpart_str}"
72
+ end
73
+
74
+ # Iteration (bracket notation like 1000[9])
75
+ if iteration && !iteration.empty?
76
+ number_str += "[#{iteration}]"
77
+ end
78
+
79
+ parts << number_str
80
+ end
81
+
82
+ result = parts.join(" ")
83
+
84
+ # Date
85
+ if date
86
+ year_val = date.is_a?(Components::Date) ? date.year : date.to_i
87
+ result += ":#{year_val}"
88
+ # Month if present
89
+ result += "-#{format('%02d', month)}" if month
90
+ end
91
+
92
+ # Edition
93
+ result += " v#{edition}" if edition
94
+
95
+ # Translation
96
+ if translation_lang
97
+ result += " (#{translation_lang})"
98
+ elsif translation_upper
99
+ result += " (#{translation_upper})"
100
+ end
101
+
102
+ result
103
+ end
104
+
105
+ def <=>(other)
106
+ return nil unless other.is_a?(SingleIdentifier)
107
+
108
+ # Compare by number first
109
+ num_cmp = number.to_s <=> other.number.to_s
110
+ return num_cmp unless num_cmp.zero?
111
+
112
+ # Then by part
113
+ part_cmp = (part || Components::Code.new(value: "0")).to_s <=> (other.part || Components::Code.new(value: "0")).to_s
114
+ return part_cmp unless part_cmp.zero?
115
+
116
+ # Then by date
117
+ if date && other.date
118
+ date.to_s <=> other.date.to_s
119
+ elsif date
120
+ 1
121
+ elsif other.date
122
+ -1
123
+ else
124
+ 0
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Bsi
5
+ class UrnGenerator < Pubid::UrnGenerator::Base
6
+ def generate
7
+ parts = ["urn", "bsi"]
8
+
9
+ if identifier.publisher
10
+ pub = identifier.publisher.to_s
11
+ parts << pub.to_s.downcase
12
+ else
13
+ parts << "bs"
14
+ end
15
+
16
+ if identifier.prefix
17
+ parts << identifier.prefix.to_s.downcase
18
+ end
19
+
20
+ if identifier.flex_prefix
21
+ parts << identifier.flex_prefix.to_s.downcase
22
+ end
23
+
24
+ if identifier.number
25
+ number = identifier.number.to_s
26
+ if identifier.iteration && !identifier.iteration.empty?
27
+ number += "[#{identifier.iteration}]"
28
+ end
29
+ parts << number
30
+ end
31
+
32
+ if identifier.part
33
+ part = identifier.part.to_s
34
+ parts << "-#{part}"
35
+ end
36
+
37
+ if identifier.subpart
38
+ subpart = identifier.subpart.to_s
39
+ parts << "-#{subpart}"
40
+ end
41
+
42
+ if identifier.second_number
43
+ second = identifier.second_number.to_s
44
+ parts << "/#{second}"
45
+ end
46
+
47
+ if identifier.date
48
+ year = identifier.date.year
49
+ parts << year.to_s
50
+ elsif identifier.year
51
+ parts << identifier.year.to_s
52
+ end
53
+
54
+ if identifier.month
55
+ parts << format("%02d", identifier.month)
56
+ end
57
+
58
+ if identifier.edition
59
+ parts << "v#{identifier.edition}"
60
+ end
61
+
62
+ if identifier.translation_lang
63
+ parts << identifier.translation_lang.to_s.downcase
64
+ elsif identifier.translation_upper
65
+ parts << identifier.translation_upper.to_s.downcase
66
+ end
67
+
68
+ if identifier.type
69
+ type = identifier.type&.abbr || identifier.type.to_s
70
+ parts << type.to_s.downcase if type && type.to_s != "BS"
71
+ end
72
+
73
+ if identifier.typed_stage
74
+ stage_code = identifier.typed_stage.stage_code
75
+ if stage_code && stage_code != :published
76
+ parts << "stage.#{stage_code}"
77
+ end
78
+ end
79
+
80
+ parts.join(":")
81
+ end
82
+ end
83
+ end
84
+ end
data/lib/pubid/bsi.rb ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Bsi
5
+ module Components
6
+ autoload :Code, "#{__dir__}/bsi/components/code"
7
+ autoload :Date, "#{__dir__}/bsi/components/date"
8
+ autoload :Publisher, "#{__dir__}/bsi/components/publisher"
9
+ autoload :Type, "#{__dir__}/bsi/components/type"
10
+ end
11
+
12
+ autoload :Builder, "#{__dir__}/bsi/builder"
13
+ autoload :Identifier, "#{__dir__}/bsi/identifier"
14
+ autoload :Identifiers, "#{__dir__}/bsi/identifiers"
15
+ autoload :Model, "#{__dir__}/bsi/model"
16
+ autoload :Parser, "#{__dir__}/bsi/parser"
17
+ autoload :Scheme, "#{__dir__}/bsi/scheme"
18
+ autoload :SingleIdentifier, "#{__dir__}/bsi/single_identifier"
19
+ autoload :UrnGenerator, "#{__dir__}/bsi/urn_generator"
20
+
21
+ def self.parse(string)
22
+ Identifier.parse(string)
23
+ end
24
+
25
+ def self.transform(data)
26
+ Builder.build(data)
27
+ end
28
+ end
29
+ end
30
+
31
+ # Register Ubsi flavor with the registry
32
+ Pubid::Registry.register(:bsi, Pubid::Bsi)
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Builder
5
+ # Base class for all flavor-specific builders.
6
+ #
7
+ # Provides the shared build loop that converts parsed data into identifier
8
+ # objects. Flavors subclass and override only `cast` and optionally
9
+ # `default_identifier_class`.
10
+ #
11
+ # The build loop:
12
+ # 1. Flattens array-of-hashes input (from Parslet transforms)
13
+ # 2. Iterates each key-value pair
14
+ # 3. Calls `cast(key, value)` to convert raw values to component objects
15
+ # 4. Assigns the result to the identifier via `send`
16
+ # 5. Silently skips unknown attributes (rescue NoMethodError)
17
+ class Base
18
+ attr_reader :identifier
19
+
20
+ def initialize(identifier_class = default_identifier_class)
21
+ @identifier_class = identifier_class
22
+ end
23
+
24
+ def build(data)
25
+ data = flatten_array(data) if data.is_a?(Array)
26
+ identifier = @identifier_class.new
27
+ assign_attributes(identifier, data)
28
+ identifier
29
+ end
30
+
31
+ private
32
+
33
+ # Override in subclasses to convert raw parsed values to component objects.
34
+ # Return a Hash to assign multiple attributes, or a single value.
35
+ # Return nil to skip the assignment.
36
+ def cast(_key, value)
37
+ value
38
+ end
39
+
40
+ def default_identifier_class
41
+ raise NotImplementedError,
42
+ "#{self.class} must implement default_identifier_class"
43
+ end
44
+
45
+ def flatten_array(data)
46
+ data.each_with_object({}) do |h, acc|
47
+ acc.merge!(h)
48
+ end
49
+ end
50
+
51
+ def assign_attributes(identifier, data)
52
+ attrs = identifier.class.attributes
53
+ data.each_pair do |key, value|
54
+ realized = cast(key.to_sym, value)
55
+ next if realized.nil?
56
+
57
+ next if handle_key(identifier, key, realized)
58
+
59
+ if realized.is_a?(Hash)
60
+ realized.each_pair do |k, v|
61
+ setter = "#{k}="
62
+ identifier.public_send(setter, v) if attrs.key?(k.to_sym)
63
+ end
64
+ else
65
+ setter = "#{key}="
66
+ identifier.public_send(setter, realized) if attrs.key?(key.to_sym)
67
+ end
68
+ end
69
+ end
70
+
71
+ def handle_key(_identifier, _key, _value)
72
+ false
73
+ end
74
+
75
+ LANG_CHAR_MAP = {
76
+ "R" => "ru",
77
+ "F" => "fr",
78
+ "E" => "en",
79
+ "A" => "ar",
80
+ "S" => "es",
81
+ "D" => "de",
82
+ }.freeze
83
+
84
+ ROMAN_MAP = {
85
+ "I" => 1, "V" => 5, "X" => 10,
86
+ "L" => 50, "C" => 100, "D" => 500, "M" => 1000
87
+ }.freeze
88
+
89
+ def locate_typed_stage(typed_stage_string)
90
+ typed_stage_string = "" if typed_stage_string.nil?
91
+ @scheme.locate_typed_stage_by_abbr(typed_stage_string)
92
+ end
93
+
94
+ def convert_roman_to_integer(roman_numeral)
95
+ return roman_numeral unless roman_numeral.to_s.match?(/^[IVXLCDM]+$/i)
96
+
97
+ result = 0
98
+ prev_value = 0
99
+
100
+ roman_numeral.to_s.upcase.chars.reverse.each do |char|
101
+ value = ROMAN_MAP[char]
102
+ if value < prev_value
103
+ result -= value
104
+ else
105
+ result += value
106
+ end
107
+ prev_value = value
108
+ end
109
+
110
+ result.to_s
111
+ end
112
+
113
+ def parse_date(value)
114
+ value = value.to_s
115
+ if value.match?(/^\d{4}(-\d{2})?$/)
116
+ year, month = value.split("-")
117
+ Pubid::Components::Date.new(year: year, month: month || nil)
118
+ elsif value.is_a?(Integer) || (value.is_a?(String) && value.match?(/^\d{4}$/))
119
+ Pubid::Components::Date.new(year: value)
120
+ else
121
+ raise ArgumentError, "Invalid date format: #{value.inspect}"
122
+ end
123
+ end
124
+
125
+ def parse_languages(value)
126
+ original_value = value.to_s
127
+ normalized_value = original_value.gsub("/", ",")
128
+ normalized_value.split(",").map do |lang|
129
+ lang = lang.strip
130
+ original_lang = lang
131
+ lang = LANG_CHAR_MAP[lang] if lang.length == 1
132
+ Pubid::Components::Language.new(code: lang,
133
+ original_code: original_lang)
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end