pubid 1.15.17 → 2.0.0.pre.alpha.1

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 (601) 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 +87 -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 +18 -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 +13 -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 +21 -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 +18 -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 +15 -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 +15 -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 +27 -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 +16 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +78 -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 +74 -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 +15 -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 +18 -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/language.rb +37 -0
  219. data/lib/pubid/components/locality.rb +10 -0
  220. data/lib/pubid/components/publisher.rb +36 -0
  221. data/lib/pubid/components/stage.rb +54 -0
  222. data/lib/pubid/components/type.rb +58 -0
  223. data/lib/pubid/components/typed_stage.rb +55 -0
  224. data/lib/pubid/components.rb +15 -0
  225. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  226. data/lib/pubid/core/update_codes.rb +77 -0
  227. data/lib/pubid/core.rb +8 -0
  228. data/lib/pubid/csa/builder.rb +671 -0
  229. data/lib/pubid/csa/components/code.rb +9 -0
  230. data/lib/pubid/csa/components.rb +9 -0
  231. data/lib/pubid/csa/composite_identifier.rb +27 -0
  232. data/lib/pubid/csa/identifier.rb +457 -0
  233. data/lib/pubid/csa/identifiers/base.rb +133 -0
  234. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  235. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  236. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  237. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  238. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  239. data/lib/pubid/csa/identifiers/package.rb +65 -0
  240. data/lib/pubid/csa/identifiers/series.rb +127 -0
  241. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  242. data/lib/pubid/csa/identifiers.rb +17 -0
  243. data/lib/pubid/csa/parser.rb +445 -0
  244. data/lib/pubid/csa/scheme.rb +44 -0
  245. data/lib/pubid/csa/single_identifier.rb +30 -0
  246. data/lib/pubid/csa/urn_generator.rb +80 -0
  247. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  248. data/lib/pubid/csa.rb +25 -0
  249. data/lib/pubid/etsi/builder.rb +133 -0
  250. data/lib/pubid/etsi/components/code.rb +42 -0
  251. data/lib/pubid/etsi/components/version.rb +37 -0
  252. data/lib/pubid/etsi/components.rb +10 -0
  253. data/lib/pubid/etsi/identifier.rb +14 -0
  254. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  255. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  256. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  257. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  258. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  259. data/lib/pubid/etsi/identifiers.rb +14 -0
  260. data/lib/pubid/etsi/parser.rb +133 -0
  261. data/lib/pubid/etsi/scheme.rb +42 -0
  262. data/lib/pubid/etsi/urn_generator.rb +76 -0
  263. data/lib/pubid/etsi.rb +21 -0
  264. data/lib/pubid/export/auditor.rb +89 -0
  265. data/lib/pubid/export/data_class_exporter.rb +59 -0
  266. data/lib/pubid/export/exporter.rb +74 -0
  267. data/lib/pubid/export/flavor_exporter.rb +402 -0
  268. data/lib/pubid/export/ieee_exporter.rb +78 -0
  269. data/lib/pubid/export/itu_exporter.rb +66 -0
  270. data/lib/pubid/export/nist_exporter.rb +64 -0
  271. data/lib/pubid/export/registry_exporter.rb +90 -0
  272. data/lib/pubid/export/result.rb +97 -0
  273. data/lib/pubid/export/scheme_exporter.rb +70 -0
  274. data/lib/pubid/export.rb +18 -0
  275. data/lib/pubid/format_detector.rb +16 -0
  276. data/lib/pubid/format_registry.rb +42 -0
  277. data/lib/pubid/identifier.rb +235 -0
  278. data/lib/pubid/identifier_metadata.rb +148 -0
  279. data/lib/pubid/identifier_registry.rb +198 -0
  280. data/lib/pubid/idf/builder.rb +82 -0
  281. data/lib/pubid/idf/identifier.rb +69 -0
  282. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  283. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  284. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  285. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  286. data/lib/pubid/idf/identifiers.rb +13 -0
  287. data/lib/pubid/idf/parser.rb +143 -0
  288. data/lib/pubid/idf/scheme.rb +61 -0
  289. data/lib/pubid/idf/single_identifier.rb +19 -0
  290. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  291. data/lib/pubid/idf/urn_generator.rb +84 -0
  292. data/lib/pubid/idf.rb +25 -0
  293. data/lib/pubid/iec/builder.rb +457 -0
  294. data/lib/pubid/iec/components/code.rb +59 -0
  295. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  296. data/lib/pubid/iec/components/publisher.rb +35 -0
  297. data/lib/pubid/iec/components/sheet.rb +32 -0
  298. data/lib/pubid/iec/components/trf_info.rb +38 -0
  299. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  300. data/lib/pubid/iec/identifier.rb +21 -0
  301. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  302. data/lib/pubid/iec/identifiers/base.rb +78 -0
  303. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  304. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  305. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +86 -0
  306. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  307. data/lib/pubid/iec/identifiers/fragment_identifier.rb +141 -0
  308. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  309. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  310. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  311. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  312. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  313. data/lib/pubid/iec/identifiers/sheet_identifier.rb +66 -0
  314. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  315. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  316. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  317. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  319. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  320. data/lib/pubid/iec/identifiers/vap_identifier.rb +77 -0
  321. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  322. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  323. data/lib/pubid/iec/parser.rb +412 -0
  324. data/lib/pubid/iec/rendering_style.rb +113 -0
  325. data/lib/pubid/iec/scheme.rb +71 -0
  326. data/lib/pubid/iec/single_identifier.rb +80 -0
  327. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  328. data/lib/pubid/iec/urn_generator.rb +193 -0
  329. data/lib/pubid/iec/urn_parser.rb +289 -0
  330. data/lib/pubid/iec.rb +85 -0
  331. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  332. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  333. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  334. data/lib/pubid/ieee/aiee.rb +11 -0
  335. data/lib/pubid/ieee/builder.rb +1237 -0
  336. data/lib/pubid/ieee/components/code.rb +102 -0
  337. data/lib/pubid/ieee/components/draft.rb +93 -0
  338. data/lib/pubid/ieee/components/relationship.rb +157 -0
  339. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  340. data/lib/pubid/ieee/identifier.rb +13 -0
  341. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  342. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  343. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  344. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  345. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  346. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  347. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  348. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  349. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  350. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  351. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  352. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  353. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  354. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  355. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  356. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  358. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  359. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  360. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  361. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  362. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  363. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  364. data/lib/pubid/ieee/identifiers.rb +33 -0
  365. data/lib/pubid/ieee/ire/builder.rb +61 -0
  366. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  367. data/lib/pubid/ieee/ire/parser.rb +91 -0
  368. data/lib/pubid/ieee/ire.rb +11 -0
  369. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  370. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  371. data/lib/pubid/ieee/nesc.rb +10 -0
  372. data/lib/pubid/ieee/parser.rb +1226 -0
  373. data/lib/pubid/ieee/scheme.rb +90 -0
  374. data/lib/pubid/ieee/typed_stages.rb +172 -0
  375. data/lib/pubid/ieee/urn_generator.rb +188 -0
  376. data/lib/pubid/ieee.rb +32 -0
  377. data/lib/pubid/ieee_debug.rb +31 -0
  378. data/lib/pubid/iho/builder.rb +37 -0
  379. data/lib/pubid/iho/identifier.rb +19 -0
  380. data/lib/pubid/iho/identifiers/base.rb +41 -0
  381. data/lib/pubid/iho/identifiers/bibliographic.rb +20 -0
  382. data/lib/pubid/iho/identifiers/circular_letter.rb +19 -0
  383. data/lib/pubid/iho/identifiers/miscellaneous.rb +20 -0
  384. data/lib/pubid/iho/identifiers/publication.rb +19 -0
  385. data/lib/pubid/iho/identifiers/standard.rb +19 -0
  386. data/lib/pubid/iho/identifiers.rb +14 -0
  387. data/lib/pubid/iho/parser.rb +68 -0
  388. data/lib/pubid/iho/scheme.rb +29 -0
  389. data/lib/pubid/iho/urn_generator.rb +29 -0
  390. data/lib/pubid/iho.rb +21 -0
  391. data/lib/pubid/iso/builder.rb +305 -0
  392. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  393. data/lib/pubid/iso/combined_identifier.rb +22 -0
  394. data/lib/pubid/iso/components/code.rb +36 -0
  395. data/lib/pubid/iso/components/publisher.rb +60 -0
  396. data/lib/pubid/iso/components.rb +12 -0
  397. data/lib/pubid/iso/format_resolver.rb +45 -0
  398. data/lib/pubid/iso/identifier.rb +69 -0
  399. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  400. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  401. data/lib/pubid/iso/identifiers/base.rb +115 -0
  402. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  403. data/lib/pubid/iso/identifiers/data.rb +76 -0
  404. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  405. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  406. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  407. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  408. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  409. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  410. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  411. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  412. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  413. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  414. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  415. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  416. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  417. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  418. data/lib/pubid/iso/identifiers.rb +33 -0
  419. data/lib/pubid/iso/parser.rb +510 -0
  420. data/lib/pubid/iso/rendering_style.rb +120 -0
  421. data/lib/pubid/iso/scheme.rb +187 -0
  422. data/lib/pubid/iso/single_identifier.rb +61 -0
  423. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  424. data/lib/pubid/iso/urn_generator.rb +412 -0
  425. data/lib/pubid/iso/urn_parser.rb +423 -0
  426. data/lib/pubid/iso/utilities.rb +86 -0
  427. data/lib/pubid/iso.rb +50 -0
  428. data/lib/pubid/itu/builder.rb +171 -0
  429. data/lib/pubid/itu/components/code.rb +39 -0
  430. data/lib/pubid/itu/components/sector.rb +35 -0
  431. data/lib/pubid/itu/components/series.rb +29 -0
  432. data/lib/pubid/itu/i18n.rb +9 -0
  433. data/lib/pubid/itu/i18n.yaml +30 -0
  434. data/lib/pubid/itu/identifier.rb +53 -0
  435. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  436. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  437. data/lib/pubid/itu/identifiers/base.rb +154 -0
  438. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  439. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  440. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  441. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  442. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  443. data/lib/pubid/itu/identifiers.rb +16 -0
  444. data/lib/pubid/itu/model.rb +111 -0
  445. data/lib/pubid/itu/parser.rb +225 -0
  446. data/lib/pubid/itu/scheme.rb +174 -0
  447. data/lib/pubid/itu/urn_generator.rb +105 -0
  448. data/lib/pubid/itu.rb +22 -0
  449. data/lib/pubid/jcgm/builder.rb +88 -0
  450. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  451. data/lib/pubid/jcgm/components.rb +9 -0
  452. data/lib/pubid/jcgm/identifier.rb +11 -0
  453. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  454. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  455. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  456. data/lib/pubid/jcgm/identifiers.rb +11 -0
  457. data/lib/pubid/jcgm/parser.rb +84 -0
  458. data/lib/pubid/jcgm/scheme.rb +60 -0
  459. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  460. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  461. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  462. data/lib/pubid/jcgm.rb +31 -0
  463. data/lib/pubid/jis/builder.rb +124 -0
  464. data/lib/pubid/jis/components/code.rb +59 -0
  465. data/lib/pubid/jis/components.rb +9 -0
  466. data/lib/pubid/jis/identifier.rb +18 -0
  467. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  468. data/lib/pubid/jis/identifiers/base.rb +72 -0
  469. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  470. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  471. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  472. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  473. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  474. data/lib/pubid/jis/identifiers.rb +17 -0
  475. data/lib/pubid/jis/parser.rb +109 -0
  476. data/lib/pubid/jis/scheme.rb +49 -0
  477. data/lib/pubid/jis/single_identifier.rb +37 -0
  478. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  479. data/lib/pubid/jis/urn_generator.rb +25 -0
  480. data/lib/pubid/jis.rb +23 -0
  481. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  482. data/lib/pubid/nist/builder.rb +2100 -0
  483. data/lib/pubid/nist/components/code.rb +38 -0
  484. data/lib/pubid/nist/components/edition.rb +118 -0
  485. data/lib/pubid/nist/components/issue_number.rb +28 -0
  486. data/lib/pubid/nist/components/part.rb +77 -0
  487. data/lib/pubid/nist/components/publisher.rb +24 -0
  488. data/lib/pubid/nist/components/stage.rb +53 -0
  489. data/lib/pubid/nist/components/supplement.rb +121 -0
  490. data/lib/pubid/nist/components/translation.rb +42 -0
  491. data/lib/pubid/nist/components/update.rb +103 -0
  492. data/lib/pubid/nist/components/version.rb +35 -0
  493. data/lib/pubid/nist/components/volume.rb +32 -0
  494. data/lib/pubid/nist/components.rb +19 -0
  495. data/lib/pubid/nist/configuration.rb +77 -0
  496. data/lib/pubid/nist/identifiers/base.rb +499 -0
  497. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  498. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  499. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  500. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  501. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  502. data/lib/pubid/nist/identifiers/crpl_report.rb +135 -0
  503. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +94 -0
  504. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  505. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  506. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  507. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  508. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  509. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  510. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  511. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  512. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  513. data/lib/pubid/nist/identifiers/report.rb +68 -0
  514. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  515. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  516. data/lib/pubid/nist/identifiers.rb +33 -0
  517. data/lib/pubid/nist/parser.rb +1084 -0
  518. data/lib/pubid/nist/scheme.rb +199 -0
  519. data/lib/pubid/nist/supplement_identifier.rb +83 -0
  520. data/lib/pubid/nist/urn_generator.rb +127 -0
  521. data/lib/pubid/nist.rb +36 -0
  522. data/lib/pubid/oiml/builder.rb +189 -0
  523. data/lib/pubid/oiml/components/code.rb +20 -0
  524. data/lib/pubid/oiml/components.rb +9 -0
  525. data/lib/pubid/oiml/identifier.rb +11 -0
  526. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  527. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  528. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  529. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  530. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  531. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  536. data/lib/pubid/oiml/identifiers.rb +18 -0
  537. data/lib/pubid/oiml/parser.rb +173 -0
  538. data/lib/pubid/oiml/scheme.rb +46 -0
  539. data/lib/pubid/oiml/single_identifier.rb +90 -0
  540. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  541. data/lib/pubid/oiml/urn_generator.rb +64 -0
  542. data/lib/pubid/oiml.rb +26 -0
  543. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  544. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  545. data/lib/pubid/parser.rb +8 -0
  546. data/lib/pubid/parsers/base.rb +11 -0
  547. data/lib/pubid/parsers/mr_string.rb +93 -0
  548. data/lib/pubid/plateau/builder.rb +50 -0
  549. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  550. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  551. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  552. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  553. data/lib/pubid/plateau/identifiers.rb +12 -0
  554. data/lib/pubid/plateau/parser.rb +63 -0
  555. data/lib/pubid/plateau/scheme.rb +45 -0
  556. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  557. data/lib/pubid/plateau/urn_generator.rb +29 -0
  558. data/lib/pubid/plateau.rb +25 -0
  559. data/lib/pubid/renderers/base.rb +19 -0
  560. data/lib/pubid/renderers/directives_renderer.rb +62 -0
  561. data/lib/pubid/renderers/guide_renderer.rb +20 -0
  562. data/lib/pubid/renderers/human_readable.rb +58 -0
  563. data/lib/pubid/renderers/iwa_renderer.rb +16 -0
  564. data/lib/pubid/renderers/mr_string.rb +16 -0
  565. data/lib/pubid/renderers/supplement_renderer.rb +33 -0
  566. data/lib/pubid/renderers/urn.rb +11 -0
  567. data/lib/pubid/renderers.rb +14 -0
  568. data/lib/pubid/rendering/base.rb +73 -0
  569. data/lib/pubid/rendering/common.rb +211 -0
  570. data/lib/pubid/rendering/context.rb +156 -0
  571. data/lib/pubid/rendering/date.rb +27 -0
  572. data/lib/pubid/rendering/format.rb +25 -0
  573. data/lib/pubid/rendering/language.rb +21 -0
  574. data/lib/pubid/rendering/numbering.rb +24 -0
  575. data/lib/pubid/rendering/publisher.rb +25 -0
  576. data/lib/pubid/rendering/stage.rb +38 -0
  577. data/lib/pubid/rendering/supplement.rb +46 -0
  578. data/lib/pubid/rendering.rb +16 -0
  579. data/lib/pubid/sae/builder.rb +32 -0
  580. data/lib/pubid/sae/components/code.rb +9 -0
  581. data/lib/pubid/sae/components/date.rb +19 -0
  582. data/lib/pubid/sae/components/type.rb +19 -0
  583. data/lib/pubid/sae/components.rb +11 -0
  584. data/lib/pubid/sae/identifier.rb +14 -0
  585. data/lib/pubid/sae/identifiers/base.rb +42 -0
  586. data/lib/pubid/sae/identifiers.rb +9 -0
  587. data/lib/pubid/sae/parser.rb +55 -0
  588. data/lib/pubid/sae/scheme.rb +47 -0
  589. data/lib/pubid/sae/urn_generator.rb +38 -0
  590. data/lib/pubid/sae.rb +19 -0
  591. data/lib/pubid/scheme.rb +207 -0
  592. data/lib/pubid/urn_generator/base.rb +110 -0
  593. data/lib/pubid/utils/string_normalizer.rb +196 -0
  594. data/lib/pubid/utils.rb +7 -0
  595. data/lib/pubid/version.rb +3 -1
  596. data/lib/pubid.rb +137 -13
  597. data/lib/tasks/docs.rake +37 -0
  598. data/lib/tasks/export.rake +38 -0
  599. data/lib/tasks/website-data.json +7488 -0
  600. metadata +613 -171
  601. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Nist
7
+ module Components
8
+ # Code component for NIST identifiers
9
+ # Handles number codes like series, volume, etc.
10
+ class Code < Lutaml::Model::Serializable
11
+ attribute :number, :string
12
+ attribute :subpart, :string
13
+
14
+ def to_s
15
+ result = number.to_s
16
+ result += ".#{subpart}" if subpart
17
+ result
18
+ end
19
+
20
+ # Alias for compatibility
21
+ def value
22
+ to_s
23
+ end
24
+
25
+ # Backward compatibility: extract part from compound numbers like "140-2"
26
+ # Returns the part number if the value contains a dash, nil otherwise
27
+ def part
28
+ return nil unless number&.include?("-")
29
+
30
+ # Split by last dash to handle patterns like "4-4" (just number-part)
31
+ # and "4-M-5" (which would return "M-5" as part)
32
+ parts = number.to_s.split("-")
33
+ parts.last if parts.length > 1
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Nist
7
+ module Components
8
+ # Edition component for NIST publications per nist-pubid-spec.md
9
+ # Format: <edition-type><edition-id>[.<additional-text>]
10
+ # Types: "-" (historical), "e" (edition), "r" (revision)
11
+ # Edition ID can be: number ("2") OR year ("2021")
12
+ # Additional text: Text AFTER "rev" prefix (WITHOUT "rev")
13
+ #
14
+ # SEMANTICS:
15
+ # - "e" or "edition" = edition (can be number or year or month+year)
16
+ # - "r" or "rev" or "revision" or "v" or "version" = revision (can be number or year or month+year)
17
+ # - If BOTH edition AND revision in same identifier:
18
+ # * Type is "e" (edition takes precedence)
19
+ # * ID is the edition value
20
+ # * additional_text is the revision part (WITHOUT "rev" prefix)
21
+ # * Renders with DOT separator: e2.June1908
22
+ #
23
+ # Examples:
24
+ # Edition.new(type: "e", id: "2").to_s # => "e2"
25
+ # Edition.new(type: "e", id: "2", additional_text: "June1908").to_s # => "e2.June1908"
26
+ # Edition.new(type: "e", id: "2", additional_text: "1908").to_s # => "e2.1908"
27
+ # Edition.new(type: "r", id: "1963").to_s # => "r1963"
28
+ # Edition.new(type: "r", id: "5").to_s # => "r5"
29
+ # Edition.new(type: "r", id: "5", original_prefix: " Rev. ").to_s # => "Rev. 5"
30
+ class Edition < Lutaml::Model::Serializable
31
+ attribute :type, :string # "-", "e", or "r"
32
+ attribute :id, :string # Edition ID (number or year)
33
+ attribute :additional_text, :string # Text after "rev" (WITHOUT "rev" prefix)
34
+ attribute :original_prefix, :string # Original format prefix for preservation (e.g., " Rev. ", " rev ", " r")
35
+
36
+ # Render edition in specified format
37
+ # @param format [:short, :mr, :long, :abbrev] The output format
38
+ # @return [String] The formatted edition representation
39
+ def to_s(format = :short)
40
+ case format
41
+ when :short, :mr
42
+ build_short_format
43
+ when :long
44
+ build_long_format
45
+ when :abbrev
46
+ build_short_format
47
+ else
48
+ build_short_format
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ # Build short format: "e2", "e2.June1908", "e2.1908", "e2.50", "r1963", "-April1909", "r1a"
55
+ # If original_prefix is set, preserves original format (e.g., "Rev. 5" not "r5")
56
+ def build_short_format
57
+ # For revision type, use original prefix if available (format preservation)
58
+ if type == "r" && original_prefix && !original_prefix.empty?
59
+ # Build base format with original prefix
60
+ result = "#{original_prefix}#{id}"
61
+ # Add additional text (letter suffix) if present, preserve UPPERCASE
62
+ if additional_text && !additional_text.empty?
63
+ # For letter suffixes, append uppercase letter directly: " r5A" or "r5A"
64
+ if additional_text.match?(/^[A-Za-z]$/)
65
+ result += additional_text.upcase
66
+ else
67
+ # For other additional text (years, etc.), use dot separator
68
+ result += ".#{additional_text}"
69
+ end
70
+ end
71
+ return result
72
+ end
73
+
74
+ # For dash-year editions (type "e" with original_prefix "-"), preserve dash format
75
+ # Example: "-1979" for patterns like "NBS HB 130-1979"
76
+ if type == "e" && original_prefix == "-" && id.match?(/^\d{4}$/)
77
+ return "-#{id}"
78
+ end
79
+
80
+ result = "#{type}#{id}"
81
+
82
+ if additional_text && !additional_text.empty?
83
+ # For historical editions ("-") with month names, NO dot separator
84
+ # Pattern: "-April1909" not "-.April1909"
85
+ if type == "-" && additional_text.match?(/^[A-Z][a-z]+\d{4}$/)
86
+ result = "-#{additional_text}"
87
+ # For letter suffixes (single letter like "a", "A", "b", "B", etc.), NO dot separator
88
+ # Use UPPERCASE for consistency: "r5A" for SP patterns like 800-53r5a
89
+ elsif additional_text.match?(/^[A-Za-z]$/)
90
+ result += additional_text.upcase # Normalize to UPPERCASE: r5A
91
+ else
92
+ # For ALL years (2-digit or 4-digit) and month+year, use DOT separator
93
+ # Examples: e2.50, e2.1915, e2.June1908
94
+ result += ".#{additional_text}"
95
+ end
96
+ end
97
+
98
+ result
99
+ end
100
+
101
+ # Build long format: "Edition 2021", "Revision 5", etc.
102
+ def build_long_format
103
+ case type
104
+ when "e"
105
+ "Edition #{id}"
106
+ when "r"
107
+ "Revision #{id}"
108
+ when "-"
109
+ # Historical precedent - render as dash-number
110
+ "-#{id}"
111
+ else
112
+ "#{type}#{id}"
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Nist
7
+ module Components
8
+ # IssueNumber component for NIST identifiers
9
+ # Represents the issue/number designation (e.g., "No. 12" in "Vol. 6, No. 12")
10
+ class IssueNumber < Lutaml::Model::Serializable
11
+ attribute :number, :string
12
+
13
+ # Short form rendering: "n12"
14
+ # Long form rendering: "No. 12"
15
+ def to_s(format = :short)
16
+ case format
17
+ when :long, :full
18
+ "No. #{number}"
19
+ when :short, :mr
20
+ "n#{number}"
21
+ else
22
+ "n#{number}"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Nist
7
+ module Components
8
+ # Part component for NIST publications
9
+ # Format: n{NUMBER}, pt{NUMBER}, or just letter depending on type
10
+ #
11
+ # Type attribute determines rendering:
12
+ # - "pt" => "pt1" (SP part notation)
13
+ # - "n" => "n1" (CSM issue notation)
14
+ # - "" => "A" (letter suffix - just the letter)
15
+ #
16
+ # Examples:
17
+ # Part.new(type: "pt", value: "1").to_s => "pt1"
18
+ # Part.new(type: "n", value: "1").to_s => "n1"
19
+ # Part.new(type: "", value: "A").to_s => "A"
20
+ #
21
+ # Used in:
22
+ # - CSM: Issue number (n1)
23
+ # - SP: Part number (pt1)
24
+ # - Letter suffixes (A, B, C, etc.)
25
+ class Part < Lutaml::Model::Serializable
26
+ attribute :type, :string # "pt" for part notation, "n" for issue, "" for letter suffix
27
+ attribute :value, :string # Part number or letter (1, 2, A, B, etc.)
28
+
29
+ # Render part with type-specific notation
30
+ # @param notation [Symbol, String, nil] Optional notation override
31
+ # - :n_notation or "n" → use "n" prefix
32
+ # - :pt_notation or "pt" → use "pt" prefix
33
+ # - :letter_notation or "" → just the value (letter suffix)
34
+ # @return [String] The formatted part representation
35
+ def to_s(notation = nil)
36
+ # Handle symbol notation parameters
37
+ notation_to_use = if notation.is_a?(Symbol)
38
+ case notation
39
+ when :n_notation then "n"
40
+ when :pt_notation then "pt"
41
+ when :letter_notation then ""
42
+ else notation.to_s
43
+ end
44
+ else
45
+ notation
46
+ end
47
+
48
+ # If notation explicitly provided, use it
49
+ if notation_to_use
50
+ return "#{notation_to_use}#{value}" unless notation_to_use.empty?
51
+
52
+ return value
53
+ end
54
+
55
+ # Otherwise use type attribute
56
+ case type
57
+ when "pt"
58
+ "pt#{value}"
59
+ when "n"
60
+ "n#{value}"
61
+ when ""
62
+ # Letter suffix - just the letter
63
+ value
64
+ else
65
+ # Fallback for nil or unknown types - default to "n" notation (CSM issue number)
66
+ "n#{value}"
67
+ end
68
+ end
69
+
70
+ # Alias for numeric comparison
71
+ def to_i
72
+ value.to_i
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Nist
7
+ module Components
8
+ # Publisher component for NIST identifiers
9
+ # Handles NIST and NBS publishers
10
+ class Publisher < Lutaml::Model::Serializable
11
+ attribute :publisher, :string
12
+
13
+ def to_s
14
+ publisher
15
+ end
16
+
17
+ # Alias for compatibility
18
+ def body
19
+ publisher
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+ require "yaml"
5
+
6
+ module Pubid
7
+ module Nist
8
+ module Components
9
+ # Stage component for NIST draft identifiers
10
+ # Combines id (i/f/1-9) with type (pd/wd/prd)
11
+ #
12
+ # Examples:
13
+ # Stage.new(id: "i", type: "pd").to_s(:short) # => "ipd"
14
+ # Stage.new(id: "f", type: "pd").to_s(:long) # => "(Final Public Draft)"
15
+ class Stage < Lutaml::Model::Serializable
16
+ attribute :id, :string # i, f, 1-9
17
+ attribute :type, :string # pd, wd, prd
18
+
19
+ # Load stages from V1 YAML config
20
+ STAGES = YAML.load_file(
21
+ File.join(File.dirname(__FILE__),
22
+ "../../../../archived-gems/pubid-nist/stages.yaml"),
23
+ ).freeze
24
+
25
+ # Render stage in specified format
26
+ # @param format [:short, :mr, :long] The output format
27
+ # @return [String] The formatted stage representation
28
+ def to_s(format = :short)
29
+ return "" if id.nil? || type.nil?
30
+
31
+ case format
32
+ when :short, :mr
33
+ "#{id}#{type}"
34
+ when :long
35
+ "(#{STAGES['id'][id]} #{STAGES['type'][type]})"
36
+ else
37
+ "#{id}#{type}"
38
+ end
39
+ end
40
+
41
+ # Validate stage id and type against YAML config
42
+ def validate!
43
+ unless STAGES["id"].key?(id.to_s)
44
+ raise ArgumentError, "Invalid stage id: #{id.inspect}"
45
+ end
46
+ unless STAGES["type"].key?(type.to_s)
47
+ raise ArgumentError, "Invalid stage type: #{type.inspect}"
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Nist
7
+ module Components
8
+ # Supplement component for NIST publications
9
+ # Represents supplement notation with number, year, month, or revision
10
+ #
11
+ # Examples:
12
+ # Supplement.new(number: "2").to_s(:short) # => "supp2"
13
+ # Supplement.new(year: "1925").to_s(:short) # => "supp-1925"
14
+ # Supplement.new(number: "3", year: "1926").to_s(:short) # => "supp3/1926"
15
+ # Supplement.new(month: "Jan", year: "1924").to_s(:short) # => "suppJan1924"
16
+ # Supplement.new(has_revision: true).to_s(:short) # => "supprev"
17
+ class Supplement < Lutaml::Model::Serializable
18
+ attribute :number, :string # Supplement number (e.g., "2" in "supp2")
19
+ attribute :year, :string # Year (4 digits)
20
+ attribute :month, :string # Month abbreviation (Jan, Feb, etc.)
21
+ attribute :month_start, :string # Date range start month
22
+ attribute :year_start, :string # Date range start year
23
+ attribute :month_end, :string # Date range end month
24
+ attribute :year_end, :string # Date range end year
25
+ attribute :has_revision, :boolean, default: -> {
26
+ false
27
+ } # "supprev" pattern
28
+ attribute :suffix, :string # General suffix for other patterns
29
+
30
+ # Render supplement in specified format
31
+ # @param format [:short, :mr, :long] The output format
32
+ # @return [String] The formatted supplement representation
33
+ def to_s(format = :short)
34
+ return "" if number.nil? && year.nil? && !has_revision && suffix.nil? &&
35
+ month_start.nil? && year_start.nil? && month_end.nil? && year_end.nil?
36
+
37
+ case format
38
+ when :short, :mr
39
+ build_short_format
40
+ when :long
41
+ build_long_format
42
+ else
43
+ build_short_format
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ # Build short format: "supp2", "supp-1925", "supp3/1926", "suppJan1924", "supprev"
50
+ def build_short_format
51
+ return "supprev" if has_revision
52
+ return "supp#{suffix}" if suffix
53
+ return build_date_range_format if date_range?
54
+ return build_month_year_format if month && year
55
+ return build_number_year_format if number && year
56
+ return build_year_format if year
57
+ return build_number_format if number
58
+
59
+ ""
60
+ end
61
+
62
+ # Build long format: "Supplement 2", "Supplement 1925", etc.
63
+ def build_long_format
64
+ return "Supplement with Revision" if has_revision
65
+ return "Supplement #{suffix}" if suffix
66
+ return build_long_date_range_format if date_range?
67
+ return build_long_month_year_format if month && year
68
+ return build_long_number_year_format if number && year
69
+ return build_long_year_format if year
70
+ return build_long_number_format if number
71
+
72
+ ""
73
+ end
74
+
75
+ def date_range?
76
+ month_start && year_start && month_end && year_end
77
+ end
78
+
79
+ def build_date_range_format
80
+ "supp#{month_start}#{year_start}-#{month_end}#{year_end}"
81
+ end
82
+
83
+ def build_month_year_format
84
+ "supp#{month}#{year}"
85
+ end
86
+
87
+ def build_number_year_format
88
+ "supp#{number}/#{year}"
89
+ end
90
+
91
+ def build_year_format
92
+ "supp-#{year}"
93
+ end
94
+
95
+ def build_number_format
96
+ "supp#{number}"
97
+ end
98
+
99
+ def build_long_date_range_format
100
+ "Supplement #{month_start} #{year_start}-#{month_end} #{year_end}"
101
+ end
102
+
103
+ def build_long_month_year_format
104
+ "Supplement #{month} #{year}"
105
+ end
106
+
107
+ def build_long_number_year_format
108
+ "Supplement #{number}/#{year}"
109
+ end
110
+
111
+ def build_long_year_format
112
+ "Supplement #{year}"
113
+ end
114
+
115
+ def build_long_number_format
116
+ "Supplement #{number}"
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Nist
7
+ module Components
8
+ # Translation component for NIST publications
9
+ # Uses 3-letter ISO 639-2 language codes
10
+ #
11
+ # Examples:
12
+ # Translation.new(code: "spa").to_s(:short) # => " spa"
13
+ # Translation.new(code: "por").to_s(:mr) # => ".por"
14
+ # Translation.new(code: "ind").to_s(:short) # => " ind"
15
+ class Translation < Lutaml::Model::Serializable
16
+ attribute :code, :string # 3-letter ISO 639-2 code: spa, por, ind, etc.
17
+
18
+ # Backward compatibility: language method returns code
19
+ # @return [String, nil] language code
20
+ def language
21
+ code
22
+ end
23
+
24
+ # Render translation in specified format
25
+ # @param format [:short, :mr, :long] The output format
26
+ # @return [String] The formatted translation representation
27
+ def to_s(format = :short)
28
+ return "" if code.nil?
29
+
30
+ case format
31
+ when :short, :long
32
+ " #{code}"
33
+ when :mr
34
+ ".#{code}"
35
+ else
36
+ " #{code}"
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+ require "date"
5
+
6
+ module Pubid
7
+ module Nist
8
+ module Components
9
+ # Update component for NIST publications
10
+ # Represents errata updates with number, year, and optional month
11
+ #
12
+ # Examples:
13
+ # Update.new(number: 1, year: 2021, month: 2).to_s(:short) # => "/Upd1-202102"
14
+ # Update.new(number: 3, year: 2015).to_s(:short) # => "/Upd3-2015"
15
+ # Update.new(number: 1, year: 2021, month: 2).to_s(:mr) # => "-upd1-202102"
16
+ # Update.new(number: 1, prefix: "dash").to_s(:short) # => "-upd1" (preserves original prefix)
17
+ class Update < Lutaml::Model::Serializable
18
+ attribute :number, :string # Update number as string
19
+ attribute :year, :string # Year (4 digits as string)
20
+ attribute :month, :string # Month (01-12 as string, optional)
21
+ attribute :prefix, :string # Original prefix: "dash" for -upd, "slash" for /Upd (default: "slash")
22
+
23
+ # Render update in specified format
24
+ # @param format [:short, :mr, :long] The output format
25
+ # @return [String] The formatted update representation
26
+ def to_s(format = :short)
27
+ # For MR format, render -upd even without number
28
+ return "-upd" if format == :mr && number.nil? && year.nil?
29
+ # For other formats, return empty string if no number
30
+ return "" if number.nil?
31
+
32
+ # Use prefix attribute to determine which prefix to use
33
+ # If prefix is "dash", always use dash prefix regardless of format
34
+ # This preserves original input format (e.g., -upd vs /Upd)
35
+ return build_dash_format if prefix == "dash"
36
+
37
+ case format
38
+ when :short
39
+ build_short_format
40
+ when :mr
41
+ build_mr_format
42
+ when :long
43
+ build_long_format
44
+ else
45
+ build_short_format
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ # Build dash format: "-upd1-202102" or "-upd3-2015" or "-upd1" (no year)
52
+ # Used when original input used dash prefix (-upd) to preserve format
53
+ def build_dash_format
54
+ if year
55
+ year_month = build_year_month_string
56
+ "-upd#{number}-#{year_month}"
57
+ else
58
+ "-upd#{number}"
59
+ end
60
+ end
61
+
62
+ # Build short format: "/Upd1-202102" or "/Upd3-2015" or "/Upd1" (no year)
63
+ def build_short_format
64
+ if year
65
+ year_month = build_year_month_string
66
+ "/Upd#{number}-#{year_month}"
67
+ else
68
+ "/Upd#{number}"
69
+ end
70
+ end
71
+
72
+ # Build machine-readable format: "-upd1-202102" or "-upd3-2015" or "-upd1" (no year)
73
+ def build_mr_format
74
+ if year
75
+ year_month = build_year_month_string
76
+ "-upd#{number}-#{year_month}"
77
+ else
78
+ "-upd#{number}"
79
+ end
80
+ end
81
+
82
+ # Build long format: "Update 1-2021 February" or "Update 3-2015"
83
+ def build_long_format
84
+ return "Update #{number}" unless year
85
+
86
+ month_str = month ? " #{Date::MONTHNAMES[month.to_i]}" : ""
87
+ "Update #{number}-#{year}#{month_str}"
88
+ end
89
+
90
+ # Build year-month string: "202102" or "2015"
91
+ def build_year_month_string
92
+ return "" unless year
93
+
94
+ if month
95
+ "#{year}#{month.to_s.rjust(2, '0')}"
96
+ else
97
+ year.to_s
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Nist
7
+ module Components
8
+ # Version component for NIST publications
9
+ # Uses dotted notation: "1.0.2", "2.0", etc.
10
+ #
11
+ # Examples:
12
+ # Version.new(value: "1.0.2").to_s(:short) # => "ver1.0.2"
13
+ # Version.new(value: "2.0").to_s(:long) # => "Version 2.0"
14
+ class Version < Lutaml::Model::Serializable
15
+ attribute :value, :string # Dotted notation: "1.0.2"
16
+
17
+ # Render version in specified format
18
+ # @param format [:short, :mr, :long] The output format
19
+ # @return [String] The formatted version representation
20
+ def to_s(format = :short)
21
+ return "" if value.nil?
22
+
23
+ case format
24
+ when :short, :mr
25
+ "ver#{value}"
26
+ when :long
27
+ "Version #{value}"
28
+ else
29
+ "ver#{value}"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Nist
7
+ module Components
8
+ # Volume component for NIST publications
9
+ # Format: v{NUMBER} where NUMBER is the volume number
10
+ #
11
+ # Examples:
12
+ # Volume.new(value: "6").to_s => "v6"
13
+ # Volume.new(value: "12").to_s => "v12"
14
+ #
15
+ # Used in:
16
+ # - CSM (Commercial Standards Monthly): Volume 6, Issue 1
17
+ # - CIRC (Circular): Volume 539
18
+ class Volume < Lutaml::Model::Serializable
19
+ attribute :value, :string
20
+
21
+ def to_s
22
+ "v#{value}"
23
+ end
24
+
25
+ # Alias for numeric comparison
26
+ def to_i
27
+ value.to_i
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end