pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +25 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +4 -55
  6. data/lib/pubid/amca/identifiers/base.rb +58 -47
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -21
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -17
  9. data/lib/pubid/amca/identifiers/standard.rb +0 -4
  10. data/lib/pubid/amca/renderer.rb +82 -0
  11. data/lib/pubid/amca/single_identifier.rb +0 -23
  12. data/lib/pubid/amca/urn_generator.rb +2 -1
  13. data/lib/pubid/amca/urn_parser.rb +28 -0
  14. data/lib/pubid/amca.rb +42 -1
  15. data/lib/pubid/ansi/builder.rb +5 -3
  16. data/lib/pubid/ansi/identifier.rb +1 -43
  17. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  18. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  19. data/lib/pubid/ansi/renderer.rb +53 -0
  20. data/lib/pubid/ansi/single_identifier.rb +2 -31
  21. data/lib/pubid/ansi/urn_generator.rb +3 -38
  22. data/lib/pubid/ansi/urn_parser.rb +23 -0
  23. data/lib/pubid/ansi.rb +38 -3
  24. data/lib/pubid/api/builder.rb +33 -74
  25. data/lib/pubid/api/identifier.rb +5 -52
  26. data/lib/pubid/api/identifiers/base.rb +2 -14
  27. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  28. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  29. data/lib/pubid/api/identifiers/mpms.rb +0 -20
  30. data/lib/pubid/api/identifiers/publication.rb +0 -2
  31. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  32. data/lib/pubid/api/identifiers/specification.rb +0 -2
  33. data/lib/pubid/api/identifiers/standard.rb +0 -2
  34. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  35. data/lib/pubid/api/identifiers/typeless_standard.rb +0 -16
  36. data/lib/pubid/api/identifiers.rb +18 -0
  37. data/lib/pubid/api/renderer.rb +89 -0
  38. data/lib/pubid/api/single_identifier.rb +5 -20
  39. data/lib/pubid/api/urn_generator.rb +0 -18
  40. data/lib/pubid/api/urn_parser.rb +35 -0
  41. data/lib/pubid/api.rb +51 -5
  42. data/lib/pubid/ashrae/builder.rb +3 -3
  43. data/lib/pubid/ashrae/identifier.rb +7 -55
  44. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  45. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  46. data/lib/pubid/ashrae/identifiers/base.rb +29 -15
  47. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  48. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  49. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  50. data/lib/pubid/ashrae/parser.rb +4 -0
  51. data/lib/pubid/ashrae/renderer.rb +117 -0
  52. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  53. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  54. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  55. data/lib/pubid/ashrae.rb +46 -1
  56. data/lib/pubid/asme/components/code.rb +10 -2
  57. data/lib/pubid/asme/identifier.rb +0 -46
  58. data/lib/pubid/asme/identifiers/base.rb +0 -60
  59. data/lib/pubid/asme/renderer.rb +66 -0
  60. data/lib/pubid/asme/single_identifier.rb +3 -1
  61. data/lib/pubid/asme/urn_parser.rb +31 -0
  62. data/lib/pubid/asme.rb +42 -1
  63. data/lib/pubid/astm/components/code.rb +9 -0
  64. data/lib/pubid/{jis → astm}/components.rb +1 -1
  65. data/lib/pubid/astm/identifier.rb +0 -77
  66. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  67. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  68. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  69. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  70. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  71. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  72. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  73. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  74. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  75. data/lib/pubid/astm/identifiers.rb +18 -0
  76. data/lib/pubid/astm/renderer.rb +172 -0
  77. data/lib/pubid/astm/single_identifier.rb +3 -11
  78. data/lib/pubid/astm/urn_parser.rb +30 -0
  79. data/lib/pubid/astm.rb +39 -27
  80. data/lib/pubid/bsi/builder.rb +21 -12
  81. data/lib/pubid/bsi/identifier.rb +5 -85
  82. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -36
  83. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +8 -48
  84. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +8 -39
  85. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +2 -55
  86. data/lib/pubid/bsi/identifiers/amendment.rb +2 -22
  87. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +1 -6
  88. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  89. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -87
  90. data/lib/pubid/bsi/identifiers/committee_document.rb +0 -16
  91. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -87
  92. data/lib/pubid/bsi/identifiers/corrigendum.rb +2 -10
  93. data/lib/pubid/bsi/identifiers/detailed_specification.rb +0 -36
  94. data/lib/pubid/bsi/identifiers/disc.rb +0 -29
  95. data/lib/pubid/bsi/identifiers/draft_document.rb +2 -46
  96. data/lib/pubid/bsi/identifiers/electronic_book.rb +2 -38
  97. data/lib/pubid/bsi/identifiers/expert_commentary.rb +2 -18
  98. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +0 -47
  99. data/lib/pubid/bsi/identifiers/flex.rb +0 -35
  100. data/lib/pubid/bsi/identifiers/handbook.rb +1 -15
  101. data/lib/pubid/bsi/identifiers/index.rb +0 -32
  102. data/lib/pubid/bsi/identifiers/method.rb +0 -41
  103. data/lib/pubid/bsi/identifiers/national_annex.rb +4 -29
  104. data/lib/pubid/bsi/identifiers/practice_guide.rb +1 -6
  105. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +2 -54
  106. data/lib/pubid/bsi/identifiers/published_document.rb +2 -54
  107. data/lib/pubid/bsi/identifiers/section.rb +0 -30
  108. data/lib/pubid/bsi/identifiers/set.rb +3 -20
  109. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +0 -9
  110. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -24
  111. data/lib/pubid/bsi/identifiers/supplementary_index.rb +0 -46
  112. data/lib/pubid/bsi/identifiers/technical_specification.rb +2 -47
  113. data/lib/pubid/bsi/identifiers/test_method.rb +0 -32
  114. data/lib/pubid/bsi/identifiers/value_added_publication.rb +2 -17
  115. data/lib/pubid/bsi/identifiers.rb +0 -1
  116. data/lib/pubid/bsi/renderer.rb +1050 -0
  117. data/lib/pubid/bsi/single_identifier.rb +33 -78
  118. data/lib/pubid/bsi/urn_generator.rb +2 -3
  119. data/lib/pubid/bsi/urn_parser.rb +52 -0
  120. data/lib/pubid/bsi.rb +232 -2
  121. data/lib/pubid/builder/base.rb +57 -10
  122. data/lib/pubid/bundled_identifier.rb +0 -1
  123. data/lib/pubid/ccsds/builder.rb +4 -3
  124. data/lib/pubid/ccsds/identifier.rb +53 -68
  125. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  126. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  127. data/lib/pubid/ccsds/parser.rb +4 -2
  128. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  129. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  130. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  131. data/lib/pubid/ccsds.rb +39 -1
  132. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  133. data/lib/pubid/cen_cenelec/identifier.rb +11 -40
  134. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +9 -4
  135. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +0 -10
  136. data/lib/pubid/cen_cenelec/identifiers/base.rb +2 -45
  137. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +0 -27
  140. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +0 -15
  141. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +2 -8
  143. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +0 -4
  145. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  146. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  147. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  148. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  149. data/lib/pubid/cen_cenelec/single_identifier.rb +9 -90
  150. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  151. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  152. data/lib/pubid/cen_cenelec.rb +172 -1
  153. data/lib/pubid/cie/components/code.rb +8 -0
  154. data/lib/pubid/cie/identifier.rb +10 -57
  155. data/lib/pubid/cie/single_identifier.rb +4 -4
  156. data/lib/pubid/cie/urn_parser.rb +28 -0
  157. data/lib/pubid/cie.rb +47 -1
  158. data/lib/pubid/components/adoption.rb +104 -0
  159. data/lib/pubid/components/code.rb +22 -8
  160. data/lib/pubid/components/date.rb +23 -16
  161. data/lib/pubid/components/edition.rb +9 -6
  162. data/lib/pubid/components/iteration.rb +32 -0
  163. data/lib/pubid/components/language.rb +6 -4
  164. data/lib/pubid/components/locality.rb +10 -1
  165. data/lib/pubid/components/publisher.rb +9 -6
  166. data/lib/pubid/components/relationship.rb +151 -0
  167. data/lib/pubid/components/stage.rb +5 -14
  168. data/lib/pubid/components/supplement.rb +184 -0
  169. data/lib/pubid/components/type.rb +5 -15
  170. data/lib/pubid/components/typed_stage.rb +10 -11
  171. data/lib/pubid/components.rb +4 -1
  172. data/lib/pubid/core/update_codes.rb +28 -7
  173. data/lib/pubid/csa/identifier.rb +9 -59
  174. data/lib/pubid/csa/identifiers/base.rb +0 -123
  175. data/lib/pubid/csa/identifiers/cec.rb +0 -103
  176. data/lib/pubid/csa/identifiers/series.rb +0 -104
  177. data/lib/pubid/csa/renderer.rb +292 -0
  178. data/lib/pubid/csa/single_identifier.rb +1 -1
  179. data/lib/pubid/csa/urn_generator.rb +1 -1
  180. data/lib/pubid/csa/urn_parser.rb +33 -0
  181. data/lib/pubid/csa.rb +46 -1
  182. data/lib/pubid/etsi/components/code.rb +10 -9
  183. data/lib/pubid/etsi/components/version.rb +0 -5
  184. data/lib/pubid/etsi/identifier.rb +4 -55
  185. data/lib/pubid/etsi/identifiers/base.rb +31 -27
  186. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +1 -11
  187. data/lib/pubid/etsi/renderer.rb +42 -0
  188. data/lib/pubid/etsi/urn_parser.rb +34 -0
  189. data/lib/pubid/etsi.rb +44 -1
  190. data/lib/pubid/export/exporter.rb +4 -46
  191. data/lib/pubid/export/flavor_exporter.rb +111 -278
  192. data/lib/pubid/export.rb +0 -6
  193. data/lib/pubid/identifier.rb +92 -18
  194. data/lib/pubid/identifier_metadata.rb +1 -1
  195. data/lib/pubid/idf/builder.rb +3 -3
  196. data/lib/pubid/idf/identifier.rb +7 -66
  197. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  198. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  199. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  200. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  201. data/lib/pubid/idf/parser.rb +3 -2
  202. data/lib/pubid/idf/renderer.rb +84 -0
  203. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  204. data/lib/pubid/idf/urn_generator.rb +4 -39
  205. data/lib/pubid/idf/urn_parser.rb +25 -0
  206. data/lib/pubid/idf.rb +55 -1
  207. data/lib/pubid/iec/builder.rb +46 -64
  208. data/lib/pubid/iec/components/code.rb +8 -32
  209. data/lib/pubid/iec/components/publisher.rb +0 -1
  210. data/lib/pubid/iec/components.rb +14 -0
  211. data/lib/pubid/iec/identifier.rb +251 -213
  212. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  213. data/lib/pubid/iec/identifiers/base.rb +5 -33
  214. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  215. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  216. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +23 -26
  217. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  218. data/lib/pubid/iec/identifiers/fragment_identifier.rb +35 -24
  219. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  220. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  221. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  222. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  223. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  224. data/lib/pubid/iec/identifiers/sheet_identifier.rb +17 -11
  225. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  226. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  227. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  228. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  229. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  230. data/lib/pubid/iec/identifiers/test_report_form.rb +3 -35
  231. data/lib/pubid/iec/identifiers/vap_identifier.rb +24 -21
  232. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  233. data/lib/pubid/iec/identifiers/working_document.rb +2 -50
  234. data/lib/pubid/iec/identifiers.rb +30 -0
  235. data/lib/pubid/iec/parser.rb +13 -12
  236. data/lib/pubid/iec/renderer.rb +254 -0
  237. data/lib/pubid/iec/single_identifier.rb +6 -12
  238. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  239. data/lib/pubid/iec/urn_generator.rb +3 -3
  240. data/lib/pubid/iec/urn_parser.rb +3 -3
  241. data/lib/pubid/iec.rb +43 -67
  242. data/lib/pubid/ieee/builder.rb +12 -12
  243. data/lib/pubid/ieee/components/code.rb +8 -0
  244. data/lib/pubid/ieee/components/draft.rb +14 -0
  245. data/lib/pubid/ieee/components/relationship.rb +5 -149
  246. data/lib/pubid/ieee/identifier.rb +5 -52
  247. data/lib/pubid/ieee/identifiers/adopted_standard.rb +0 -9
  248. data/lib/pubid/ieee/identifiers/base.rb +221 -556
  249. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +0 -10
  250. data/lib/pubid/ieee/identifiers/corrigendum.rb +0 -12
  251. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +0 -10
  252. data/lib/pubid/ieee/identifiers/dual_identifier.rb +0 -4
  253. data/lib/pubid/ieee/identifiers/dual_published.rb +0 -4
  254. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +0 -9
  255. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +0 -10
  256. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  257. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +0 -18
  258. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +0 -6
  259. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  260. data/lib/pubid/ieee/identifiers/redlined_standard.rb +0 -7
  261. data/lib/pubid/ieee/identifiers/si_standard.rb +0 -38
  262. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  263. data/lib/pubid/ieee/pre_parser.rb +301 -0
  264. data/lib/pubid/ieee/renderer.rb +307 -0
  265. data/lib/pubid/ieee/urn_parser.rb +34 -0
  266. data/lib/pubid/ieee.rb +66 -1
  267. data/lib/pubid/ieee_debug.rb +0 -1
  268. data/lib/pubid/iho/builder.rb +2 -2
  269. data/lib/pubid/iho/identifier.rb +7 -59
  270. data/lib/pubid/iho/identifiers/base.rb +64 -31
  271. data/lib/pubid/iho/parser.rb +3 -3
  272. data/lib/pubid/iho/renderer.rb +30 -0
  273. data/lib/pubid/iho/urn_generator.rb +2 -2
  274. data/lib/pubid/iho/urn_parser.rb +58 -0
  275. data/lib/pubid/iho.rb +52 -1
  276. data/lib/pubid/iso/builder.rb +55 -53
  277. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  278. data/lib/pubid/iso/components/code.rb +7 -19
  279. data/lib/pubid/iso/components/publisher.rb +10 -8
  280. data/lib/pubid/iso/components.rb +2 -4
  281. data/lib/pubid/iso/identifier.rb +219 -252
  282. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  283. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  284. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  285. data/lib/pubid/iso/identifiers/data.rb +0 -1
  286. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  287. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  288. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  289. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  290. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  291. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  292. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  293. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  294. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  295. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  296. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  297. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  298. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  299. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  300. data/lib/pubid/iso/identifiers.rb +0 -1
  301. data/lib/pubid/iso/normalizer.rb +89 -0
  302. data/lib/pubid/iso/parser.rb +22 -4
  303. data/lib/pubid/iso/single_identifier.rb +0 -4
  304. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  305. data/lib/pubid/iso/urn_generator.rb +66 -182
  306. data/lib/pubid/iso/urn_parser.rb +12 -7
  307. data/lib/pubid/iso.rb +177 -2
  308. data/lib/pubid/itu/builder.rb +0 -12
  309. data/lib/pubid/itu/components/code.rb +9 -7
  310. data/lib/pubid/itu/components/sector.rb +15 -4
  311. data/lib/pubid/itu/components/series.rb +0 -4
  312. data/lib/pubid/itu/components.rb +11 -0
  313. data/lib/pubid/itu/identifier.rb +4 -116
  314. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  315. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  316. data/lib/pubid/itu/identifiers/base.rb +124 -128
  317. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  318. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  319. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  320. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  321. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  322. data/lib/pubid/itu/urn_parser.rb +23 -0
  323. data/lib/pubid/itu.rb +44 -1
  324. data/lib/pubid/jcgm/builder.rb +16 -8
  325. data/lib/pubid/jcgm/identifier.rb +0 -43
  326. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -9
  327. data/lib/pubid/jcgm/identifiers/gum_guide.rb +0 -12
  328. data/lib/pubid/jcgm/renderer.rb +68 -0
  329. data/lib/pubid/jcgm/single_identifier.rb +0 -8
  330. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  331. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  332. data/lib/pubid/jcgm.rb +43 -2
  333. data/lib/pubid/jis/builder.rb +44 -52
  334. data/lib/pubid/jis/identifier.rb +120 -46
  335. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  336. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  337. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  338. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  339. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  340. data/lib/pubid/jis/identifiers.rb +1 -1
  341. data/lib/pubid/jis/parser.rb +31 -5
  342. data/lib/pubid/jis/renderer.rb +69 -0
  343. data/lib/pubid/jis/single_identifier.rb +6 -12
  344. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  345. data/lib/pubid/jis/urn_parser.rb +23 -0
  346. data/lib/pubid/jis.rb +42 -2
  347. data/lib/pubid/nist/builder.rb +63 -1871
  348. data/lib/pubid/nist/caster.rb +1272 -0
  349. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  350. data/lib/pubid/nist/components/code.rb +9 -20
  351. data/lib/pubid/nist/components/supplement.rb +2 -2
  352. data/lib/pubid/nist/components.rb +0 -1
  353. data/lib/pubid/nist/identifier.rb +8 -60
  354. data/lib/pubid/nist/identifiers/base.rb +564 -492
  355. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  356. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  358. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  359. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  360. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  361. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  362. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  363. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  364. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  365. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  366. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  367. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  368. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  369. data/lib/pubid/nist/identifiers/report.rb +4 -2
  370. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  371. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  372. data/lib/pubid/nist/identifiers.rb +1 -0
  373. data/lib/pubid/nist/parser.rb +62 -452
  374. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  375. data/lib/pubid/nist/preprocessor.rb +428 -0
  376. data/lib/pubid/nist/renderer.rb +43 -0
  377. data/lib/pubid/nist/router.rb +148 -0
  378. data/lib/pubid/nist/series/base.rb +58 -0
  379. data/lib/pubid/nist/series/crpl.rb +13 -0
  380. data/lib/pubid/nist/series/fips.rb +14 -0
  381. data/lib/pubid/nist/series/ir.rb +60 -0
  382. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  383. data/lib/pubid/nist/series/mono.rb +19 -0
  384. data/lib/pubid/nist/series/ncstar.rb +20 -0
  385. data/lib/pubid/nist/series.rb +49 -0
  386. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  387. data/lib/pubid/nist/urn_parser.rb +67 -0
  388. data/lib/pubid/nist.rb +86 -4
  389. data/lib/pubid/oiml/builder.rb +21 -3
  390. data/lib/pubid/oiml/components/code.rb +17 -0
  391. data/lib/pubid/oiml/identifier.rb +40 -46
  392. data/lib/pubid/oiml/identifiers/annex.rb +13 -46
  393. data/lib/pubid/oiml/identifiers/errata.rb +15 -0
  394. data/lib/pubid/oiml/identifiers.rb +1 -1
  395. data/lib/pubid/oiml/parser.rb +59 -12
  396. data/lib/pubid/oiml/renderer.rb +171 -0
  397. data/lib/pubid/oiml/single_identifier.rb +61 -42
  398. data/lib/pubid/oiml/supplement_identifier.rb +31 -17
  399. data/lib/pubid/oiml/urn_generator.rb +0 -8
  400. data/lib/pubid/oiml/urn_parser.rb +22 -0
  401. data/lib/pubid/oiml.rb +42 -1
  402. data/lib/pubid/plateau/identifier.rb +4 -55
  403. data/lib/pubid/plateau/identifiers/base.rb +45 -36
  404. data/lib/pubid/plateau/identifiers/handbook.rb +0 -6
  405. data/lib/pubid/plateau/identifiers/technical_report.rb +0 -4
  406. data/lib/pubid/plateau/renderer.rb +51 -0
  407. data/lib/pubid/plateau/supplement_identifier.rb +0 -4
  408. data/lib/pubid/plateau/urn_parser.rb +43 -0
  409. data/lib/pubid/plateau.rb +43 -1
  410. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  411. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  412. data/lib/pubid/renderers/human_readable.rb +18 -7
  413. data/lib/pubid/rendering/context.rb +28 -19
  414. data/lib/pubid/rendering.rb +0 -3
  415. data/lib/pubid/sae/components/date.rb +8 -0
  416. data/lib/pubid/sae/components/type.rb +5 -1
  417. data/lib/pubid/sae/identifier.rb +4 -35
  418. data/lib/pubid/sae/identifiers/base.rb +26 -31
  419. data/lib/pubid/sae/renderer.rb +36 -0
  420. data/lib/pubid/sae/urn_generator.rb +2 -10
  421. data/lib/pubid/sae/urn_parser.rb +36 -0
  422. data/lib/pubid/sae.rb +42 -1
  423. data/lib/pubid/urn_generator/base.rb +12 -12
  424. data/lib/pubid/urn_parser/base.rb +81 -0
  425. data/lib/pubid/urn_parser/errors.rb +9 -0
  426. data/lib/pubid/urn_parser.rb +14 -0
  427. data/lib/pubid/version.rb +1 -1
  428. data/lib/pubid.rb +45 -7
  429. data/lib/tasks/export.rake +6 -5
  430. data/lib/tasks/website-data.json +1940 -1882
  431. metadata +75 -45
  432. data/lib/pubid/amca/scheme.rb +0 -16
  433. data/lib/pubid/ansi/scheme.rb +0 -15
  434. data/lib/pubid/api/scheme.rb +0 -66
  435. data/lib/pubid/ashrae/scheme.rb +0 -53
  436. data/lib/pubid/asme/scheme.rb +0 -37
  437. data/lib/pubid/astm/scheme.rb +0 -55
  438. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  439. data/lib/pubid/bsi/scheme.rb +0 -243
  440. data/lib/pubid/ccsds/scheme.rb +0 -57
  441. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  442. data/lib/pubid/cie/scheme.rb +0 -64
  443. data/lib/pubid/components/factory.rb +0 -50
  444. data/lib/pubid/csa/scheme.rb +0 -44
  445. data/lib/pubid/etsi/scheme.rb +0 -42
  446. data/lib/pubid/export/data_class_exporter.rb +0 -59
  447. data/lib/pubid/export/ieee_exporter.rb +0 -78
  448. data/lib/pubid/export/itu_exporter.rb +0 -66
  449. data/lib/pubid/export/nist_exporter.rb +0 -64
  450. data/lib/pubid/export/registry_exporter.rb +0 -90
  451. data/lib/pubid/export/scheme_exporter.rb +0 -70
  452. data/lib/pubid/identifier_registry.rb +0 -198
  453. data/lib/pubid/idf/scheme.rb +0 -61
  454. data/lib/pubid/iec/scheme.rb +0 -71
  455. data/lib/pubid/ieee/scheme.rb +0 -90
  456. data/lib/pubid/iho/scheme.rb +0 -29
  457. data/lib/pubid/iso/identifiers/base.rb +0 -115
  458. data/lib/pubid/iso/scheme.rb +0 -193
  459. data/lib/pubid/itu/scheme.rb +0 -174
  460. data/lib/pubid/jcgm/scheme.rb +0 -60
  461. data/lib/pubid/jis/components/code.rb +0 -59
  462. data/lib/pubid/jis/identifiers/base.rb +0 -72
  463. data/lib/pubid/jis/scheme.rb +0 -49
  464. data/lib/pubid/nist/components/publisher.rb +0 -24
  465. data/lib/pubid/nist/scheme.rb +0 -199
  466. data/lib/pubid/oiml/identifiers/base.rb +0 -36
  467. data/lib/pubid/oiml/scheme.rb +0 -46
  468. data/lib/pubid/plateau/scheme.rb +0 -45
  469. data/lib/pubid/rendering/base.rb +0 -73
  470. data/lib/pubid/rendering/common.rb +0 -211
  471. data/lib/pubid/rendering/format.rb +0 -25
  472. data/lib/pubid/sae/scheme.rb +0 -47
  473. data/lib/pubid/scheme.rb +0 -219
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ansi
5
+ # Human-readable renderer for ANSI identifiers.
6
+ #
7
+ # Produces strings like:
8
+ # "ANSI X3.4"
9
+ # "ANSI/ISO 9899"
10
+ # "ANSI X9.8-1:2007"
11
+ #
12
+ # The renderer is registered as the `:human` format in the ANSI format
13
+ # registry and invoked via `render(format: :human)`.
14
+ class Renderer < ::Pubid::Renderers::Base
15
+ def render(context: nil, **opts)
16
+ id = @id
17
+
18
+ parts = []
19
+ parts << publisher_portion(id, context)
20
+ parts << number_portion(id, context)
21
+ result = parts.compact.join(" ")
22
+
23
+ result << language_portion(id) if id.languages&.any?
24
+
25
+ result
26
+ end
27
+
28
+ private
29
+
30
+ def publisher_portion(id, context)
31
+ if id.copublishers&.any?
32
+ ([id.publisher] + id.copublishers).map { |p| p.render(context:) }.join("/")
33
+ else
34
+ id.publisher.render(context:)
35
+ end
36
+ end
37
+
38
+ def number_portion(id, context)
39
+ [
40
+ id.number.render(context:),
41
+ (id.part ? "-#{id.part.render(context:)}" : ""),
42
+ (id.date ? ":#{id.date.render(context:)}" : ""),
43
+ ].join
44
+ end
45
+
46
+ def language_portion(id)
47
+ return "" unless id.languages&.any?
48
+
49
+ "(#{id.languages.map(&:code).join(',')})"
50
+ end
51
+ end
52
+ end
53
+ end
@@ -8,37 +8,8 @@ module Pubid
8
8
  #
9
9
  # @return [String] URN representation
10
10
 
11
- def to_s(lang: :en)
12
- [].tap do |parts|
13
- parts << publisher_portion
14
- parts << number_portion
15
- end.compact.join(" ").tap do |s|
16
- s << language_portion if languages&.any?
17
- end
18
- end
19
-
20
- def publisher_portion
21
- if copublishers&.any?
22
- # ANSI/ISO 9899
23
- ([publisher] + copublishers).map(&:body).join("/")
24
- else
25
- # ANSI X3.4
26
- publisher.body
27
- end
28
- end
29
-
30
- def number_portion
31
- [
32
- number.value,
33
- (part ? "-#{part.value}" : ""),
34
- (date ? ":#{date.year}" : ""),
35
- ].join
36
- end
37
-
38
- def language_portion
39
- return "" unless languages&.any?
40
-
41
- "(#{languages.map(&:code).join(',')})"
11
+ def to_s(**opts)
12
+ render(format: :human, **opts)
42
13
  end
43
14
  end
44
15
  end
@@ -3,41 +3,6 @@
3
3
  module Pubid
4
4
  module Ansi
5
5
  class UrnGenerator < Pubid::UrnGenerator::Base
6
- def urn_number
7
- return nil unless identifier.number
8
-
9
- identifier.number.value.to_s
10
- end
11
-
12
- def urn_part
13
- return nil unless identifier.part
14
-
15
- "-#{identifier.part.value}"
16
- end
17
-
18
- def urn_subpart
19
- return nil unless identifier.subpart
20
-
21
- "-#{identifier.subpart.value}"
22
- end
23
-
24
- def urn_year
25
- if identifier.date&.year
26
- return identifier.date.year.to_s
27
- end
28
-
29
- identifier.year&.to_s
30
- end
31
-
32
- def urn_edition
33
- return nil unless identifier.edition
34
-
35
- num = identifier.edition.number
36
- return nil unless num
37
-
38
- "ed.#{num}"
39
- end
40
-
41
6
  def urn_typed_stage
42
7
  return nil unless identifier.typed_stage
43
8
 
@@ -57,12 +22,12 @@ module Pubid
57
22
  parts << urn_typed_stage if urn_typed_stage
58
23
 
59
24
  if identifier.publisher
60
- parts[1] = identifier.publisher.body.to_s.downcase
25
+ parts[1] = identifier.publisher.render(context: URN_CONTEXT)
61
26
  end
62
27
 
63
28
  if identifier.copublishers&.any?
64
- copubs = identifier.copublishers.map(&:body)
65
- parts[1] = "#{parts[1]}-#{copubs.join('-').downcase}"
29
+ copubs = identifier.copublishers.map { |cp| cp.render(context: URN_CONTEXT) }
30
+ parts[1] = "#{parts[1]}-#{copubs.join('-')}"
66
31
  end
67
32
 
68
33
  if identifier.languages&.any?
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ansi
5
+ # Parses ANSI URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits: `urn:ansi:{code}:{year}` where the code carries
8
+ # the alpha-numeric designation (e.g., "X3.4").
9
+ #
10
+ # Examples:
11
+ # - urn:ansi:X3.4:1963 → ANSI X3.4:1963
12
+ class UrnParser < Pubid::UrnParser::Base
13
+ def parse_urn(urn)
14
+ body = strip_namespace(urn)
15
+ parts = split_parts(body)
16
+ code, year = parts
17
+ text = "ANSI #{code}"
18
+ text += ":#{year}" if year
19
+ flavor_parse(text)
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/pubid/ansi.rb CHANGED
@@ -4,22 +4,57 @@ module Pubid
4
4
  module Ansi
5
5
  autoload :Builder, "#{__dir__}/ansi/builder"
6
6
  autoload :Identifier, "#{__dir__}/ansi/identifier"
7
- autoload :Identifiers, "#{__dir__}/ansi/identifiers/standard"
7
+ autoload :Identifiers, "#{__dir__}/ansi/identifiers"
8
8
  autoload :Parser, "#{__dir__}/ansi/parser"
9
- autoload :Scheme, "#{__dir__}/ansi/scheme"
9
+ autoload :Renderer, "#{__dir__}/ansi/renderer"
10
10
  autoload :SingleIdentifier, "#{__dir__}/ansi/single_identifier"
11
11
  autoload :UrnGenerator, "#{__dir__}/ansi/urn_generator"
12
+ autoload :UrnParser, "#{__dir__}/ansi/urn_parser"
12
13
 
13
14
  # Parse an ANSI identifier string
14
15
  # @param identifier [String] the identifier string to parse
15
16
  # @return [Identifier] the parsed identifier
16
17
  def self.parse(identifier)
17
18
  parser = Parser.new
18
- builder = Builder.new(Scheme)
19
+ builder = Builder.new
19
20
 
20
21
  parsed = parser.parse(identifier)
21
22
  builder.build(parsed)
22
23
  end
24
+
25
+ # Per-flavor format registry: inherits global formats, overrides :human
26
+ Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
27
+ Identifier.format_registry.register(:human, renderer: Ansi::Renderer)
28
+
29
+ # Auto-discover all identifier types from the Identifiers namespace
30
+ # @return [Array<Class>] identifier classes that define a self.type Hash
31
+ def self.identifier_types
32
+ @identifier_types ||= Identifiers.constants
33
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
34
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
35
+ .select { |c| c.type.is_a?(Hash) }
36
+ end
37
+
38
+ # ANSI does not define typed stages; typed_stage lookup is not used by
39
+ # the builder. Provided here for API consistency with other flavors.
40
+ # @return [Array] always empty for ANSI
41
+ def self.all_typed_stages
42
+ []
43
+ end
44
+
45
+ # Lookup: type code -> identifier class
46
+ # @param code [String, Symbol] the type key to find
47
+ # @return [Class, nil] the matching identifier class
48
+ def self.locate_type(code)
49
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
50
+ end
51
+
52
+ # Lookup: abbreviation -> typed stage
53
+ # @param _abbr [String, Symbol] unused; ANSI has no typed stages
54
+ # @return [nil] always nil for ANSI
55
+ def self.locate_stage(_abbr)
56
+ nil
57
+ end
23
58
  end
24
59
  end
25
60
 
@@ -1,84 +1,43 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "components/code"
4
- require_relative "identifiers/bulletin"
5
- require_relative "identifiers/mpms"
6
- require_relative "identifiers/recommended_practice"
7
- require_relative "identifiers/specification"
8
- require_relative "identifiers/standard"
9
- require_relative "identifiers/technical_report"
10
- require_relative "identifiers/continuous_operations_standard"
11
- require_relative "identifiers/publication"
12
- require_relative "identifiers/typeless_standard"
13
-
14
3
  module Pubid
15
4
  module Api
16
- class Builder
17
- def build(parsed_hash)
18
- # Determine identifier class based on type
19
- identifier_class = case parsed_hash[:type]&.to_s
20
- when "BULL"
21
- Identifiers::Bulletin
22
- when "MPMS"
23
- Identifiers::Mpms
24
- when "RP"
25
- Identifiers::RecommendedPractice
26
- when "SPEC"
27
- Identifiers::Specification
28
- when "STD"
29
- Identifiers::Standard
30
- when "TR"
31
- Identifiers::TechnicalReport
32
- when "COS"
33
- Identifiers::ContinuousOperationsStandard
34
- when "PUBL"
35
- Identifiers::Publication
36
- else
37
- # No type = typeless standard
38
- Identifiers::TypelessStandard
39
- end
40
-
41
- identifier = identifier_class.new
42
-
43
- # Number (for non-MPMS)
44
- if parsed_hash[:number]
45
- identifier.code = Components::Code.new(value: parsed_hash[:number].to_s)
46
- end
47
-
48
- # Part
49
- if parsed_hash[:part]
50
- identifier.part = parsed_hash[:part].to_s
51
- end
52
-
53
- # MPMS-specific attributes
54
- if parsed_hash[:chapter]
55
- identifier.chapter = parsed_hash[:chapter].to_s
56
- end
57
-
58
- if parsed_hash[:section]
59
- identifier.section = parsed_hash[:section].to_s
60
- end
61
-
62
- if parsed_hash[:subsection]
63
- identifier.subsection = parsed_hash[:subsection].to_s
64
- end
5
+ class Builder < Pubid::Builder::Base
6
+ TYPE_CLASS_MAP = {
7
+ "BULL" => Identifiers::Bulletin,
8
+ "MPMS" => Identifiers::Mpms,
9
+ "RP" => Identifiers::RecommendedPractice,
10
+ "SPEC" => Identifiers::Specification,
11
+ "STD" => Identifiers::Standard,
12
+ "TR" => Identifiers::TechnicalReport,
13
+ "COS" => Identifiers::ContinuousOperationsStandard,
14
+ "PUBL" => Identifiers::Publication,
15
+ }.freeze
16
+
17
+ private
18
+
19
+ def default_identifier_class
20
+ Identifiers::TypelessStandard
21
+ end
65
22
 
66
- # Year
67
- if parsed_hash[:year]
68
- identifier.year = parsed_hash[:year].to_s
69
- end
23
+ def select_class(data)
24
+ TYPE_CLASS_MAP[data[:type]&.to_s] || default_identifier_class
25
+ end
70
26
 
71
- # Reaffirmation (nested hash with year inside)
72
- if parsed_hash[:reaffirmation]
73
- reaffirm_data = parsed_hash[:reaffirmation]
74
- identifier.reaffirmation = if reaffirm_data.is_a?(Hash) && reaffirm_data[:year]
75
- reaffirm_data[:year].to_s
76
- else
77
- reaffirm_data.to_s
78
- end
27
+ def cast(key, value)
28
+ case key
29
+ # `:type` is consumed only by select_class for dispatch; it is not an
30
+ # identifier attribute (the concrete class is pinned by `_type`). Drop it
31
+ # so the raw Parslet::Slice never lands in the inherited :type attribute.
32
+ when :type then nil
33
+ when :number then Components::Code.new(value: value.to_s)
34
+ when :reaffirmation
35
+ value.is_a?(Hash) ? (value[:year] || value).to_s : value.to_s
36
+ when :part, :chapter, :section, :subsection, :year
37
+ value.to_s
38
+ else
39
+ super
79
40
  end
80
-
81
- identifier
82
41
  end
83
42
  end
84
43
  end
@@ -1,13 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "parser"
4
- require_relative "builder"
5
- require_relative "single_identifier"
6
- require_relative "scheme"
7
-
8
3
  module Pubid
9
4
  module Api
10
- class Identifier
5
+ # Common base class for all API identifiers. SingleIdentifier and the
6
+ # concrete Identifiers::* types descend from it, so every API identifier is
7
+ # `is_a?(Pubid::Api::Identifier)` natively and gets the shared polymorphic
8
+ # `from_hash` (no facade needed).
9
+ class Identifier < ::Pubid::Identifier
11
10
  def self.parse(input)
12
11
  # Filter out comments
13
12
  return nil if input.start_with?("#")
@@ -17,52 +16,6 @@ module Pubid
17
16
  rescue Parslet::ParseFailed => e
18
17
  raise e
19
18
  end
20
-
21
- # Factory that builds an API identifier from a hash of primitives.
22
- # Dispatch on `:type` to the matching subclass; default is
23
- # {Identifiers::Standard}.
24
- #
25
- # API identifiers have a hardcoded "API" publisher (via
26
- # SingleIdentifier#publisher method) so the `:publisher` kwarg is
27
- # silently dropped.
28
- TYPE_KEY_TO_KLASS = {
29
- std: "Standard",
30
- rp: "RecommendedPractice",
31
- spec: "Specification",
32
- tr: "TechnicalReport",
33
- bull: "Bulletin",
34
- mpms: "Mpms",
35
- cos: "ContinuousOperationsStandard",
36
- publ: "Publication",
37
- typeless: "TypelessStandard",
38
- }.freeze
39
-
40
- def self.create(type: nil, **opts)
41
- klass = resolve_create_class(type)
42
- klass.new(**coerce_create_attrs(opts))
43
- end
44
-
45
- def self.resolve_create_class(type)
46
- return Identifiers::Standard if type.nil?
47
-
48
- klass_name = TYPE_KEY_TO_KLASS[type.to_sym]
49
- raise ArgumentError, "Unknown API type: #{type.inspect}" unless klass_name
50
-
51
- Identifiers.const_get(klass_name)
52
- end
53
-
54
- def self.coerce_create_attrs(opts)
55
- attrs = {}
56
- if (v = opts[:code] || opts[:number])
57
- attrs[:code] = Pubid::Api::Components::Code.new(value: v.to_s)
58
- end
59
- %i[part year reaffirmation].each do |k|
60
- attrs[k] = opts[k].to_s unless opts[k].nil?
61
- end
62
- # TODO(create-shim): :publisher silently dropped (API hardcoded).
63
- attrs
64
- end
65
- private_class_method :resolve_create_class, :coerce_create_attrs
66
19
  end
67
20
  end
68
21
  end
@@ -1,23 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../single_identifier"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
6
+ # Base class for all API identifiers.
7
+ # Inherits common attributes from SingleIdentifier.
8
8
  class Base < SingleIdentifier
9
- # Base class for all API identifiers
10
- # Inherits common attributes from SingleIdentifier
11
-
12
- # Include type_string in serialization for round-trip compatibility
13
- def base_hash
14
- hash = super
15
- if self.class.attributes.key?(:type_string) && type_string
16
- hash[:type] =
17
- type_string
18
- end
19
- hash
20
- end
21
9
  end
22
10
  end
23
11
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
@@ -14,24 +12,6 @@ module Pubid
14
12
  "MPMS"
15
13
  end
16
14
 
17
- def to_s
18
- parts = ["API", "MPMS"]
19
-
20
- # Add chapter
21
- parts << "CH #{chapter}" if chapter
22
-
23
- # Add section/subsection
24
- if section
25
- parts << ".#{section}"
26
- parts << ".#{subsection}" if subsection
27
- end
28
-
29
- # Add year
30
- parts << "-#{year}" if year
31
-
32
- parts.join(" ").gsub(" .", ".")
33
- end
34
-
35
15
  private
36
16
 
37
17
  def code_portion
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
@@ -1,26 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
4
-
5
3
  module Pubid
6
4
  module Api
7
5
  module Identifiers
8
6
  class TypelessStandard < Base
9
7
  # No type_string method - renders without type
10
- def to_s
11
- parts = ["API"]
12
-
13
- # Add code/number
14
- parts << code_portion if code_portion
15
-
16
- # Add year
17
- parts << "-#{year}" if year
18
-
19
- # Add reaffirmation
20
- parts << " (R#{reaffirmation})" if reaffirmation
21
-
22
- parts.join(" ")
23
- end
24
8
  end
25
9
  end
26
10
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Api
5
+ module Identifiers
6
+ autoload :Base, "#{__dir__}/identifiers/base"
7
+ autoload :Bulletin, "#{__dir__}/identifiers/bulletin"
8
+ autoload :ContinuousOperationsStandard, "#{__dir__}/identifiers/continuous_operations_standard"
9
+ autoload :Mpms, "#{__dir__}/identifiers/mpms"
10
+ autoload :Publication, "#{__dir__}/identifiers/publication"
11
+ autoload :RecommendedPractice, "#{__dir__}/identifiers/recommended_practice"
12
+ autoload :Specification, "#{__dir__}/identifiers/specification"
13
+ autoload :Standard, "#{__dir__}/identifiers/standard"
14
+ autoload :TechnicalReport, "#{__dir__}/identifiers/technical_report"
15
+ autoload :TypelessStandard, "#{__dir__}/identifiers/typeless_standard"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Api
5
+ # Human-readable renderer for API identifiers.
6
+ #
7
+ # Produces strings like:
8
+ # "API Std 650"
9
+ # "API MPMS CH 4.1"
10
+ # "API 5L-2018"
11
+ #
12
+ # The renderer is registered as the +:human+ format in the API format
13
+ # registry and invoked via +render(format: :human)+.
14
+ class Renderer < ::Pubid::Renderers::Base
15
+ def render(context: nil, **opts)
16
+ id = @id
17
+
18
+ case id
19
+ when Identifiers::Mpms
20
+ render_mpms(id)
21
+ when Identifiers::TypelessStandard
22
+ render_typeless(id)
23
+ else
24
+ render_default(id)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def render_default(id)
31
+ parts = ["API"]
32
+
33
+ # Add type if available
34
+ if id.class.attributes.key?(:type_string) && id.type_string
35
+ parts << id.type_string
36
+ end
37
+
38
+ # Add code/number with part as one token
39
+ parts << code_portion(id) if code_portion(id)
40
+
41
+ result = parts.join(" ")
42
+ result += "-#{id.year}" if id.year
43
+ result += " (R#{id.reaffirmation})" if id.reaffirmation
44
+ result
45
+ end
46
+
47
+ def render_mpms(id)
48
+ parts = ["API", "MPMS"]
49
+
50
+ # Add chapter
51
+ parts << "CH #{id.chapter}" if id.chapter
52
+
53
+ # Add section/subsection
54
+ if id.section
55
+ parts << ".#{id.section}"
56
+ parts << ".#{id.subsection}" if id.subsection
57
+ end
58
+
59
+ # Add year
60
+ parts << "-#{id.year}" if id.year
61
+
62
+ parts.join(" ").gsub(" .", ".")
63
+ end
64
+
65
+ def render_typeless(id)
66
+ parts = ["API"]
67
+
68
+ # Add code/number
69
+ parts << code_portion(id) if code_portion(id)
70
+
71
+ # Add year
72
+ parts << "-#{id.year}" if id.year
73
+
74
+ # Add reaffirmation
75
+ parts << " (R#{id.reaffirmation})" if id.reaffirmation
76
+
77
+ parts.join(" ")
78
+ end
79
+
80
+ def code_portion(id)
81
+ return nil unless id.code
82
+
83
+ code_str = id.code.to_s
84
+ code_str += "-#{id.part}" if id.part
85
+ code_str
86
+ end
87
+ end
88
+ end
89
+ end