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,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,134 @@
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
+ # Identity ignores original_prefix: it records how the edition was
53
+ # spelled in the source ("Rev. " vs "r") for round-trip rendering
54
+ # only. "r1" and "Rev. 1" are the same edition.
55
+ def ==(other)
56
+ return false unless other.is_a?(self.class)
57
+
58
+ type == other.type && id == other.id &&
59
+ additional_text == other.additional_text
60
+ end
61
+
62
+ alias eql? ==
63
+
64
+ def hash
65
+ [self.class, type, id, additional_text].hash
66
+ end
67
+
68
+ private
69
+
70
+ # Build short format: "e2", "e2.June1908", "e2.1908", "e2.50", "r1963", "-April1909", "r1a"
71
+ # If original_prefix is set, preserves original format (e.g., "Rev. 5" not "r5")
72
+ def build_short_format
73
+ # For revision type, use original prefix if available (format preservation)
74
+ if type == "r" && original_prefix && !original_prefix.empty?
75
+ # Build base format with original prefix
76
+ result = "#{original_prefix}#{id}"
77
+ # Add additional text (letter suffix) if present, preserve UPPERCASE
78
+ if additional_text && !additional_text.empty?
79
+ # For letter suffixes, append uppercase letter directly: " r5A" or "r5A"
80
+ if additional_text.match?(/^[A-Za-z]$/)
81
+ result += additional_text.upcase
82
+ else
83
+ # For other additional text (years, etc.), use dot separator
84
+ result += ".#{additional_text}"
85
+ end
86
+ end
87
+ return result
88
+ end
89
+
90
+ # For dash-year editions (type "e" with original_prefix "-"), preserve dash format
91
+ # Example: "-1979" for patterns like "NBS HB 130-1979"
92
+ if type == "e" && original_prefix == "-" && id.match?(/^\d{4}$/)
93
+ return "-#{id}"
94
+ end
95
+
96
+ result = "#{type}#{id}"
97
+
98
+ if additional_text && !additional_text.empty?
99
+ # For historical editions ("-") with month names, NO dot separator
100
+ # Pattern: "-April1909" not "-.April1909"
101
+ if type == "-" && additional_text.match?(/^[A-Z][a-z]+\d{4}$/)
102
+ result = "-#{additional_text}"
103
+ # For letter suffixes (single letter like "a", "A", "b", "B", etc.), NO dot separator
104
+ # Use UPPERCASE for consistency: "r5A" for SP patterns like 800-53r5a
105
+ elsif additional_text.match?(/^[A-Za-z]$/)
106
+ result += additional_text.upcase # Normalize to UPPERCASE: r5A
107
+ else
108
+ # For ALL years (2-digit or 4-digit) and month+year, use DOT separator
109
+ # Examples: e2.50, e2.1915, e2.June1908
110
+ result += ".#{additional_text}"
111
+ end
112
+ end
113
+
114
+ result
115
+ end
116
+
117
+ # Build long format: "Edition 2021", "Revision 5", etc.
118
+ def build_long_format
119
+ case type
120
+ when "e"
121
+ "Edition #{id}"
122
+ when "r"
123
+ "Revision #{id}"
124
+ when "-"
125
+ # Historical precedent - render as dash-number
126
+ "-#{id}"
127
+ else
128
+ "#{type}#{id}"
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ 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,188 @@
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) # => "sup2"
13
+ # Supplement.new(year: "1925").to_s(:short) # => "sup1925"
14
+ # Supplement.new(number: "3", year: "1926").to_s(:short) # => "sup3/1926"
15
+ # Supplement.new(month: "Jan", year: "1924").to_s(:short) # => "supJan1924"
16
+ # Supplement.new(has_revision: true).to_s(:short) # => "suprev"
17
+ class Supplement < Lutaml::Model::Serializable
18
+ attribute :number, :string # Supplement number (e.g., "2" in "supp2")
19
+ attribute :year, :string # Year (4 digits); range START year
20
+ attribute :month, :string # Month abbreviation; range START month
21
+ # Date ranges reuse :month/:year as the start and add the end below. A
22
+ # present :month_end/:year_end is what marks a value as a range, so a
23
+ # lone month-year supplement is just a range with no end — and :year is
24
+ # the single field to filter on for both.
25
+ attribute :month_end, :string # Date range end month
26
+ attribute :year_end, :string # Date range end year
27
+ attribute :has_revision, :boolean, default: -> {
28
+ false
29
+ } # "supprev" pattern
30
+ attribute :suffix, :string # General suffix for other patterns
31
+
32
+ # Build a Supplement from the flat string the parser/builder produces
33
+ # ("1924" year, "Jan1924" month+year, "1" number, "A" suffix, "" bare).
34
+ # has_revision is supplied separately. Returns a present-but-empty
35
+ # Supplement for an empty/nil value so callers can distinguish a bare
36
+ # supplement ("sup") from no supplement (nil).
37
+ def self.from_raw(value, has_revision: false)
38
+ supp = new
39
+ if has_revision
40
+ supp.has_revision = true
41
+ elsif value.nil? || value.to_s.empty?
42
+ # bare marker: present but no isolated parts
43
+ elsif (m = value.to_s.match(/\A([A-Za-z]{3,9})(\d{4})\z/))
44
+ supp.month = m[1]
45
+ supp.year = m[2]
46
+ elsif value.to_s.match?(/\A(?:18|19|20)\d{2}\z/)
47
+ supp.year = value.to_s
48
+ elsif value.to_s.match?(/\A\d+\z/)
49
+ supp.number = value.to_s
50
+ else
51
+ supp.suffix = value.to_s
52
+ end
53
+ supp
54
+ end
55
+
56
+ # Render supplement in specified format
57
+ # @param format [:short, :mr, :long] The output format
58
+ # @return [String] The formatted supplement representation
59
+ def to_s(format = :short)
60
+ return "" if number.nil? && year.nil? && month.nil? && !has_revision &&
61
+ suffix.nil? && month_end.nil? && year_end.nil?
62
+
63
+ case format
64
+ when :short, :mr
65
+ build_short_format
66
+ when :long
67
+ build_long_format
68
+ else
69
+ build_short_format
70
+ end
71
+ end
72
+
73
+ # True when this supplement is a date range (start reuses month/year).
74
+ def range?
75
+ date_range?
76
+ end
77
+
78
+ # The text after the "sup" marker for the simple (non-range, non-rev)
79
+ # forms: "1924" / "Jan1924" / "1" / "A"; "" for a bare supplement. Used
80
+ # by URN rendering, which handles range/revision separately.
81
+ def value_string
82
+ return "" if has_revision || date_range?
83
+ return suffix.to_s if suffix
84
+ return "#{month}#{year}" if month && year
85
+ return "#{number}/#{year}" if number && year
86
+ return year.to_s if year
87
+ return number.to_s if number
88
+
89
+ ""
90
+ end
91
+
92
+ # Value equality over the isolated parts, so a structured supplement
93
+ # participates correctly in Identifier#== and #matches? (two supplements
94
+ # with the same number/year/month/range/revision are the same).
95
+ IDENTITY_FIELDS = %i[
96
+ number year month month_end year_end has_revision suffix
97
+ ].freeze
98
+
99
+ def ==(other)
100
+ return false unless other.is_a?(self.class)
101
+
102
+ IDENTITY_FIELDS.all? { |f| send(f) == other.send(f) }
103
+ end
104
+
105
+ alias eql? ==
106
+
107
+ def hash
108
+ [self.class, *IDENTITY_FIELDS.map { |f| send(f) }].hash
109
+ end
110
+
111
+ private
112
+
113
+ # Build short format: "sup2", "sup1925", "sup3/1926", "supJan1924", "suprev"
114
+ # NIST/NBS canonical short form is single-p "sup" with the suffix
115
+ # attached directly (relaton-data-nist uses "sup2", "sup1940", "supA").
116
+ def build_short_format
117
+ return "suprev" if has_revision
118
+ return "sup#{suffix}" if suffix
119
+ return build_date_range_format if date_range?
120
+ return build_month_year_format if month && year
121
+ return build_number_year_format if number && year
122
+ return build_year_format if year
123
+ return build_number_format if number
124
+
125
+ ""
126
+ end
127
+
128
+ # Build long format: "Supplement 2", "Supplement 1925", etc.
129
+ def build_long_format
130
+ return "Supplement with Revision" if has_revision
131
+ return "Supplement #{suffix}" if suffix
132
+ return build_long_date_range_format if date_range?
133
+ return build_long_month_year_format if month && year
134
+ return build_long_number_year_format if number && year
135
+ return build_long_year_format if year
136
+ return build_long_number_format if number
137
+
138
+ ""
139
+ end
140
+
141
+ # A range is marked by the presence of an END; START reuses month/year.
142
+ def date_range?
143
+ month && year && month_end && year_end
144
+ end
145
+
146
+ def build_date_range_format
147
+ "sup#{month}#{year}-#{month_end}#{year_end}"
148
+ end
149
+
150
+ def build_month_year_format
151
+ "sup#{month}#{year}"
152
+ end
153
+
154
+ def build_number_year_format
155
+ "sup#{number}/#{year}"
156
+ end
157
+
158
+ def build_year_format
159
+ "sup#{year}"
160
+ end
161
+
162
+ def build_number_format
163
+ "sup#{number}"
164
+ end
165
+
166
+ def build_long_date_range_format
167
+ "Supplement #{month} #{year}-#{month_end} #{year_end}"
168
+ end
169
+
170
+ def build_long_month_year_format
171
+ "Supplement #{month} #{year}"
172
+ end
173
+
174
+ def build_long_number_year_format
175
+ "Supplement #{number}/#{year}"
176
+ end
177
+
178
+ def build_long_year_format
179
+ "Supplement #{year}"
180
+ end
181
+
182
+ def build_long_number_format
183
+ "Supplement #{number}"
184
+ end
185
+ end
186
+ end
187
+ end
188
+ 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