pubid 2.0.0.pre.alpha.8 → 2.0.0.pre.alpha.11

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 (672) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +33 -11
  3. data/conformance/pending.yaml +4 -0
  4. data/data/bipm/update_codes.yaml +9 -0
  5. data/data/iec/update_codes.yaml +3 -0
  6. data/data/ieee/update_codes.yaml +107 -1
  7. data/{archived-gems/pubid-nist → data/nist}/series.yaml +34 -0
  8. data/data/nist/update_codes.yaml +8 -0
  9. data/lib/pubid/adobe/builder.rb +52 -0
  10. data/lib/pubid/adobe/identifier.rb +47 -0
  11. data/lib/pubid/adobe/identifiers/publication.rb +31 -0
  12. data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
  13. data/lib/pubid/adobe/identifiers.rb +10 -0
  14. data/lib/pubid/adobe/parser.rb +136 -0
  15. data/lib/pubid/adobe/renderer.rb +39 -0
  16. data/lib/pubid/adobe/urn_generator.rb +42 -0
  17. data/lib/pubid/adobe/urn_parser.rb +69 -0
  18. data/lib/pubid/adobe.rb +61 -0
  19. data/lib/pubid/amca/builder.rb +4 -4
  20. data/lib/pubid/amca/identifier.rb +1 -3
  21. data/lib/pubid/amca/identifiers/base.rb +50 -33
  22. data/lib/pubid/amca/identifiers/interpretation.rb +18 -10
  23. data/lib/pubid/amca/identifiers/publication.rb +14 -10
  24. data/lib/pubid/amca/identifiers/standard.rb +3 -1
  25. data/lib/pubid/amca/identifiers.rb +0 -1
  26. data/lib/pubid/amca/parser.rb +1 -1
  27. data/lib/pubid/amca/renderer.rb +4 -4
  28. data/lib/pubid/amca/single_identifier.rb +1 -1
  29. data/lib/pubid/amca/urn_generator.rb +2 -2
  30. data/lib/pubid/amca.rb +5 -4
  31. data/lib/pubid/ansi/builder.rb +2 -2
  32. data/lib/pubid/ansi/identifier.rb +18 -0
  33. data/lib/pubid/ansi/parser.rb +1 -1
  34. data/lib/pubid/ansi/renderer.rb +2 -2
  35. data/lib/pubid/ansi.rb +5 -5
  36. data/lib/pubid/api/builder.rb +16 -2
  37. data/lib/pubid/api/identifier.rb +25 -4
  38. data/lib/pubid/api/identifiers/mpms.rb +10 -8
  39. data/lib/pubid/api/parser.rb +1 -1
  40. data/lib/pubid/api/renderer.rb +16 -7
  41. data/lib/pubid/api/single_identifier.rb +5 -12
  42. data/lib/pubid/api.rb +1 -0
  43. data/lib/pubid/ashrae/builder.rb +53 -32
  44. data/lib/pubid/ashrae/identifier.rb +3 -4
  45. data/lib/pubid/ashrae/identifiers/addenda_package.rb +7 -1
  46. data/lib/pubid/ashrae/identifiers/addendum.rb +9 -1
  47. data/lib/pubid/ashrae/identifiers/base.rb +94 -12
  48. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +8 -1
  49. data/lib/pubid/ashrae/identifiers/errata.rb +9 -0
  50. data/lib/pubid/ashrae/identifiers/guideline.rb +3 -0
  51. data/lib/pubid/ashrae/identifiers/interpretation.rb +16 -0
  52. data/lib/pubid/ashrae/identifiers/standard.rb +3 -0
  53. data/lib/pubid/ashrae/identifiers.rb +0 -1
  54. data/lib/pubid/ashrae/parser.rb +37 -17
  55. data/lib/pubid/ashrae/renderer.rb +20 -20
  56. data/lib/pubid/ashrae/single_identifier.rb +1 -1
  57. data/lib/pubid/ashrae/supplement_identifier.rb +21 -6
  58. data/lib/pubid/ashrae/urn_generator.rb +8 -2
  59. data/lib/pubid/ashrae.rb +10 -4
  60. data/lib/pubid/asme/builder.rb +11 -2
  61. data/lib/pubid/asme/identifier.rb +9 -0
  62. data/lib/pubid/asme/identifiers/standard.rb +86 -2
  63. data/lib/pubid/asme/parser.rb +1 -1
  64. data/lib/pubid/asme/renderer.rb +3 -3
  65. data/lib/pubid/asme/single_identifier.rb +8 -1
  66. data/lib/pubid/asme/urn_generator.rb +2 -2
  67. data/lib/pubid/asme.rb +1 -0
  68. data/lib/pubid/astm/builder.rb +10 -3
  69. data/lib/pubid/astm/identifier.rb +9 -0
  70. data/lib/pubid/astm/identifiers/adjunct.rb +16 -1
  71. data/lib/pubid/astm/identifiers/code_number.rb +81 -0
  72. data/lib/pubid/astm/identifiers/data_series.rb +2 -0
  73. data/lib/pubid/astm/identifiers/iso_dual_published.rb +16 -0
  74. data/lib/pubid/astm/identifiers/manual.rb +10 -0
  75. data/lib/pubid/astm/identifiers/monograph.rb +2 -0
  76. data/lib/pubid/astm/identifiers/research_report.rb +10 -0
  77. data/lib/pubid/astm/identifiers/standard.rb +10 -0
  78. data/lib/pubid/astm/identifiers/technical_report.rb +2 -0
  79. data/lib/pubid/astm/identifiers/work_in_progress.rb +2 -0
  80. data/lib/pubid/astm/identifiers.rb +1 -0
  81. data/lib/pubid/astm/parser.rb +1 -1
  82. data/lib/pubid/astm/renderer.rb +1 -1
  83. data/lib/pubid/astm/single_identifier.rb +31 -1
  84. data/lib/pubid/astm/urn_generator.rb +7 -5
  85. data/lib/pubid/astm.rb +1 -0
  86. data/lib/pubid/bipm/builder.rb +163 -0
  87. data/lib/pubid/bipm/identifier.rb +285 -0
  88. data/lib/pubid/bipm/identifiers/committee_document.rb +36 -0
  89. data/lib/pubid/bipm/identifiers/guide.rb +35 -0
  90. data/lib/pubid/bipm/identifiers/meeting.rb +53 -0
  91. data/lib/pubid/bipm/identifiers/mep.rb +33 -0
  92. data/lib/pubid/bipm/identifiers/metrologia_article.rb +48 -0
  93. data/lib/pubid/bipm/identifiers/si_brochure.rb +33 -0
  94. data/lib/pubid/bipm/identifiers.rb +15 -0
  95. data/lib/pubid/bipm/parser.rb +237 -0
  96. data/lib/pubid/bipm/renderer.rb +118 -0
  97. data/lib/pubid/bipm/urn_generator.rb +58 -0
  98. data/lib/pubid/bipm/urn_parser.rb +60 -0
  99. data/lib/pubid/bipm.rb +92 -0
  100. data/lib/pubid/bsi/builder.rb +62 -52
  101. data/lib/pubid/bsi/identifier.rb +0 -1
  102. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
  103. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +36 -7
  104. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +7 -6
  105. data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
  106. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +0 -1
  107. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +10 -0
  108. data/lib/pubid/bsi/identifiers/committee_document.rb +10 -1
  109. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +6 -0
  110. data/lib/pubid/bsi/identifiers/corrigendum.rb +4 -4
  111. data/lib/pubid/bsi/identifiers/expert_commentary.rb +5 -5
  112. data/lib/pubid/bsi/identifiers/handbook.rb +0 -2
  113. data/lib/pubid/bsi/identifiers/practice_guide.rb +0 -1
  114. data/lib/pubid/bsi/identifiers/set.rb +11 -0
  115. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -1
  116. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -2
  117. data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
  118. data/lib/pubid/bsi/parser.rb +1 -1
  119. data/lib/pubid/bsi/renderer.rb +71 -59
  120. data/lib/pubid/bsi/single_identifier.rb +64 -7
  121. data/lib/pubid/bsi/urn_generator.rb +11 -2
  122. data/lib/pubid/bsi.rb +7 -1
  123. data/lib/pubid/builder/base.rb +23 -11
  124. data/lib/pubid/bundled_identifier.rb +19 -9
  125. data/lib/pubid/calconnect/builder.rb +38 -0
  126. data/lib/pubid/calconnect/identifier.rb +121 -0
  127. data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
  128. data/lib/pubid/calconnect/identifiers.rb +9 -0
  129. data/lib/pubid/calconnect/parser.rb +54 -0
  130. data/lib/pubid/calconnect/renderer.rb +36 -0
  131. data/lib/pubid/calconnect/urn_generator.rb +33 -0
  132. data/lib/pubid/calconnect/urn_parser.rb +34 -0
  133. data/lib/pubid/calconnect.rb +83 -0
  134. data/lib/pubid/ccsds/builder.rb +1 -1
  135. data/lib/pubid/ccsds/identifier.rb +10 -3
  136. data/lib/pubid/ccsds/identifiers/base.rb +4 -2
  137. data/lib/pubid/ccsds/identifiers/corrigendum.rb +4 -4
  138. data/lib/pubid/ccsds/parser.rb +1 -1
  139. data/lib/pubid/ccsds/single_identifier.rb +2 -2
  140. data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
  141. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  142. data/lib/pubid/ccsds.rb +1 -0
  143. data/lib/pubid/cen_cenelec/builder.rb +131 -72
  144. data/lib/pubid/cen_cenelec/identifier.rb +115 -3
  145. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +27 -16
  146. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +46 -6
  147. data/lib/pubid/cen_cenelec/identifiers/base.rb +8 -9
  148. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -1
  149. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -1
  150. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +1 -1
  151. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +29 -14
  152. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +47 -8
  153. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
  154. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +27 -2
  155. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -1
  156. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +15 -5
  157. data/lib/pubid/cen_cenelec/identifiers/guide.rb +1 -1
  158. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -1
  159. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -1
  160. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -1
  161. data/lib/pubid/cen_cenelec/parser.rb +1 -1
  162. data/lib/pubid/cen_cenelec/renderer.rb +55 -60
  163. data/lib/pubid/cen_cenelec/single_identifier.rb +20 -2
  164. data/lib/pubid/cen_cenelec/urn_generator.rb +66 -44
  165. data/lib/pubid/cen_cenelec.rb +104 -82
  166. data/lib/pubid/cie/builder.rb +149 -24
  167. data/lib/pubid/cie/identifier.rb +13 -4
  168. data/lib/pubid/cie/identifiers/bundle.rb +35 -5
  169. data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
  170. data/lib/pubid/cie/identifiers/conference.rb +11 -6
  171. data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
  172. data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
  173. data/lib/pubid/cie/identifiers/identical.rb +9 -9
  174. data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
  175. data/lib/pubid/cie/identifiers/proceedings.rb +41 -0
  176. data/lib/pubid/cie/identifiers/standard.rb +43 -8
  177. data/lib/pubid/cie/identifiers/supplement.rb +27 -25
  178. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +7 -3
  179. data/lib/pubid/cie/identifiers.rb +2 -0
  180. data/lib/pubid/cie/parser.rb +55 -6
  181. data/lib/pubid/cie/single_identifier.rb +40 -1
  182. data/lib/pubid/cie/supplement_identifier.rb +29 -16
  183. data/lib/pubid/cie/urn_generator.rb +11 -8
  184. data/lib/pubid/cie.rb +7 -2
  185. data/lib/pubid/components/date.rb +21 -5
  186. data/lib/pubid/conformance/checks.rb +72 -0
  187. data/lib/pubid/conformance/corpus/case.rb +55 -0
  188. data/lib/pubid/conformance/corpus.rb +36 -0
  189. data/lib/pubid/conformance/generator.rb +212 -0
  190. data/lib/pubid/conformance/pending.rb +63 -0
  191. data/lib/pubid/conformance/runner.rb +153 -0
  192. data/lib/pubid/conformance.rb +55 -0
  193. data/lib/pubid/core.rb +2 -0
  194. data/lib/pubid/csa/builder.rb +48 -48
  195. data/lib/pubid/csa/composite_identifier.rb +18 -7
  196. data/lib/pubid/csa/identifier.rb +187 -80
  197. data/lib/pubid/csa/identifiers/bundled.rb +25 -9
  198. data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
  199. data/lib/pubid/csa/identifiers/cec.rb +44 -4
  200. data/lib/pubid/csa/identifiers/combined.rb +97 -69
  201. data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
  202. data/lib/pubid/csa/identifiers/package.rb +4 -4
  203. data/lib/pubid/csa/parser.rb +12 -8
  204. data/lib/pubid/csa/renderer.rb +13 -5
  205. data/lib/pubid/csa/single_identifier.rb +93 -4
  206. data/lib/pubid/csa/urn_generator.rb +9 -2
  207. data/lib/pubid/csa/wrapper_identifier.rb +43 -10
  208. data/lib/pubid/csa.rb +7 -1
  209. data/lib/pubid/doi/builder.rb +18 -0
  210. data/lib/pubid/doi/identifier.rb +49 -0
  211. data/lib/pubid/doi/identifiers/resource.rb +30 -0
  212. data/lib/pubid/doi/identifiers.rb +9 -0
  213. data/lib/pubid/doi/parser.rb +52 -0
  214. data/lib/pubid/doi/renderer.rb +13 -0
  215. data/lib/pubid/doi.rb +56 -0
  216. data/lib/pubid/easc/builder.rb +55 -0
  217. data/lib/pubid/easc/identifier.rb +59 -0
  218. data/lib/pubid/easc/identifiers/pmg.rb +20 -0
  219. data/lib/pubid/easc/identifiers/rmg.rb +19 -0
  220. data/lib/pubid/easc/identifiers.rb +10 -0
  221. data/lib/pubid/easc/parser.rb +88 -0
  222. data/lib/pubid/easc/renderer.rb +48 -0
  223. data/lib/pubid/easc/urn_generator.rb +46 -0
  224. data/lib/pubid/easc/urn_parser.rb +57 -0
  225. data/lib/pubid/easc.rb +53 -0
  226. data/lib/pubid/ecma/builder.rb +45 -0
  227. data/lib/pubid/ecma/identifier.rb +147 -0
  228. data/lib/pubid/ecma/identifiers/memento.rb +30 -0
  229. data/lib/pubid/ecma/identifiers/standard.rb +31 -0
  230. data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
  231. data/lib/pubid/ecma/identifiers.rb +11 -0
  232. data/lib/pubid/ecma/parser.rb +76 -0
  233. data/lib/pubid/ecma/renderer.rb +67 -0
  234. data/lib/pubid/ecma/urn_generator.rb +46 -0
  235. data/lib/pubid/ecma/urn_parser.rb +51 -0
  236. data/lib/pubid/ecma.rb +68 -0
  237. data/lib/pubid/errors.rb +80 -0
  238. data/lib/pubid/etsi/builder.rb +13 -4
  239. data/lib/pubid/etsi/identifier.rb +1 -3
  240. data/lib/pubid/etsi/identifiers/base.rb +43 -11
  241. data/lib/pubid/etsi/identifiers/etsi_standard.rb +207 -4
  242. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +45 -3
  243. data/lib/pubid/etsi/identifiers.rb +0 -1
  244. data/lib/pubid/etsi/parser.rb +9 -3
  245. data/lib/pubid/etsi/renderer.rb +8 -2
  246. data/lib/pubid/etsi.rb +6 -5
  247. data/lib/pubid/evs/builder.rb +26 -0
  248. data/lib/pubid/evs/identifier.rb +37 -0
  249. data/lib/pubid/evs/identifiers/national_adoption.rb +17 -0
  250. data/lib/pubid/evs/identifiers.rb +9 -0
  251. data/lib/pubid/evs/parser.rb +27 -0
  252. data/lib/pubid/evs/renderer.rb +30 -0
  253. data/lib/pubid/evs/urn_generator.rb +30 -0
  254. data/lib/pubid/evs/urn_parser.rb +80 -0
  255. data/lib/pubid/evs.rb +90 -0
  256. data/lib/pubid/export/exporter.rb +2 -1
  257. data/lib/pubid/export/flavor_exporter.rb +18 -3
  258. data/lib/pubid/export.rb +1 -0
  259. data/lib/pubid/format_detector.rb +1 -0
  260. data/lib/pubid/gb/builder.rb +45 -0
  261. data/lib/pubid/gb/identifier.rb +67 -0
  262. data/lib/pubid/gb/identifiers/standard.rb +34 -0
  263. data/lib/pubid/gb/identifiers.rb +9 -0
  264. data/lib/pubid/gb/parser.rb +63 -0
  265. data/lib/pubid/gb/renderer.rb +35 -0
  266. data/lib/pubid/gb.rb +88 -0
  267. data/lib/pubid/gost/builder.rb +185 -0
  268. data/lib/pubid/gost/identifier.rb +47 -0
  269. data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
  270. data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
  271. data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
  272. data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
  273. data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
  274. data/lib/pubid/gost/identifiers.rb +13 -0
  275. data/lib/pubid/gost/parser.rb +105 -0
  276. data/lib/pubid/gost/renderer.rb +48 -0
  277. data/lib/pubid/gost/urn_generator.rb +46 -0
  278. data/lib/pubid/gost/urn_parser.rb +52 -0
  279. data/lib/pubid/gost.rb +50 -0
  280. data/lib/pubid/iala/builder.rb +22 -27
  281. data/lib/pubid/iala/identifier.rb +36 -8
  282. data/lib/pubid/iala/identifiers/advice.rb +1 -1
  283. data/lib/pubid/iala/identifiers/annex.rb +10 -10
  284. data/lib/pubid/iala/identifiers/general_assembly.rb +5 -2
  285. data/lib/pubid/iala/identifiers/guideline.rb +3 -1
  286. data/lib/pubid/iala/identifiers/letter.rb +1 -1
  287. data/lib/pubid/iala/identifiers/manual.rb +3 -1
  288. data/lib/pubid/iala/identifiers/model_course.rb +3 -1
  289. data/lib/pubid/iala/identifiers/recommendation.rb +3 -1
  290. data/lib/pubid/iala/identifiers/report.rb +1 -1
  291. data/lib/pubid/iala/identifiers/resolution.rb +1 -1
  292. data/lib/pubid/iala/identifiers/standard.rb +3 -1
  293. data/lib/pubid/iala/identifiers.rb +0 -1
  294. data/lib/pubid/iala/parser.rb +10 -2
  295. data/lib/pubid/iala/renderer.rb +1 -1
  296. data/lib/pubid/iala/urn_generator.rb +1 -1
  297. data/lib/pubid/iala/urn_parser.rb +24 -3
  298. data/lib/pubid/iala.rb +5 -4
  299. data/lib/pubid/iana/builder.rb +22 -0
  300. data/lib/pubid/iana/identifier.rb +140 -0
  301. data/lib/pubid/iana/identifiers/registry.rb +69 -0
  302. data/lib/pubid/iana/identifiers.rb +9 -0
  303. data/lib/pubid/iana/parser.rb +38 -0
  304. data/lib/pubid/iana/renderer.rb +32 -0
  305. data/lib/pubid/iana/urn_generator.rb +19 -0
  306. data/lib/pubid/iana/urn_parser.rb +24 -0
  307. data/lib/pubid/iana.rb +70 -0
  308. data/lib/pubid/identifier.rb +797 -26
  309. data/lib/pubid/identifier_metadata.rb +1 -0
  310. data/lib/pubid/idf/builder.rb +4 -4
  311. data/lib/pubid/idf/identifier.rb +18 -9
  312. data/lib/pubid/idf/parser.rb +3 -3
  313. data/lib/pubid/idf/renderer.rb +5 -5
  314. data/lib/pubid/idf/supplement_identifier.rb +3 -3
  315. data/lib/pubid/idf/urn_generator.rb +1 -1
  316. data/lib/pubid/idf.rb +7 -1
  317. data/lib/pubid/iec/builder.rb +49 -32
  318. data/lib/pubid/iec/components.rb +0 -1
  319. data/lib/pubid/iec/identifier.rb +112 -77
  320. data/lib/pubid/iec/identifiers/amendment.rb +6 -2
  321. data/lib/pubid/iec/identifiers/base.rb +2 -2
  322. data/lib/pubid/iec/identifiers/component_specification.rb +0 -10
  323. data/lib/pubid/iec/identifiers/conformity_assessment.rb +0 -10
  324. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
  325. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -2
  326. data/lib/pubid/iec/identifiers/fragment_identifier.rb +13 -15
  327. data/lib/pubid/iec/identifiers/guide.rb +0 -16
  328. data/lib/pubid/iec/identifiers/international_standard.rb +22 -6
  329. data/lib/pubid/iec/identifiers/operational_document.rb +0 -10
  330. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +0 -12
  331. data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
  332. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +0 -10
  333. data/lib/pubid/iec/identifiers/systems_reference_document.rb +0 -10
  334. data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
  335. data/lib/pubid/iec/identifiers/technical_report.rb +1 -18
  336. data/lib/pubid/iec/identifiers/technical_specification.rb +1 -18
  337. data/lib/pubid/iec/identifiers/technology_report.rb +0 -10
  338. data/lib/pubid/iec/identifiers/test_report_form.rb +0 -11
  339. data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
  340. data/lib/pubid/iec/identifiers/white_paper.rb +0 -10
  341. data/lib/pubid/iec/identifiers/working_document.rb +24 -10
  342. data/lib/pubid/iec/identifiers.rb +1 -0
  343. data/lib/pubid/iec/parser.rb +53 -28
  344. data/lib/pubid/iec/renderer.rb +31 -18
  345. data/lib/pubid/iec/single_identifier.rb +34 -11
  346. data/lib/pubid/iec/supplement_identifier.rb +32 -19
  347. data/lib/pubid/iec/urn_generator.rb +227 -61
  348. data/lib/pubid/iec/urn_parser.rb +42 -4
  349. data/lib/pubid/iec.rb +2 -6
  350. data/lib/pubid/ieee/aiee/builder.rb +17 -3
  351. data/lib/pubid/ieee/aiee/identifier.rb +46 -62
  352. data/lib/pubid/ieee/aiee/parser.rb +1 -1
  353. data/lib/pubid/ieee/builder.rb +386 -69
  354. data/lib/pubid/ieee/compaction.rb +121 -0
  355. data/lib/pubid/ieee/components/draft.rb +47 -7
  356. data/lib/pubid/ieee/identifier.rb +1 -3
  357. data/lib/pubid/ieee/identifiers/adopted_standard.rb +62 -5
  358. data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
  359. data/lib/pubid/ieee/identifiers/base.rb +148 -18
  360. data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
  361. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +6 -2
  362. data/lib/pubid/ieee/identifiers/corrigendum.rb +17 -2
  363. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +24 -3
  364. data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
  365. data/lib/pubid/ieee/identifiers/dual_published.rb +58 -3
  366. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
  367. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +25 -1
  368. data/lib/pubid/ieee/identifiers/joint_development.rb +64 -15
  369. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +58 -6
  370. data/lib/pubid/ieee/identifiers/nesc/base.rb +90 -19
  371. data/lib/pubid/ieee/identifiers/nesc/draft.rb +20 -5
  372. data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
  373. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +16 -5
  374. data/lib/pubid/ieee/identifiers/nesc/redline.rb +11 -2
  375. data/lib/pubid/ieee/identifiers/nesc/standard.rb +18 -3
  376. data/lib/pubid/ieee/identifiers/nesc.rb +1 -0
  377. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +3 -3
  378. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +14 -6
  379. data/lib/pubid/ieee/identifiers/redlined_standard.rb +4 -4
  380. data/lib/pubid/ieee/identifiers/si_standard.rb +4 -1
  381. data/lib/pubid/ieee/identifiers/standard.rb +4 -1
  382. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +26 -7
  383. data/lib/pubid/ieee/identifiers.rb +2 -1
  384. data/lib/pubid/ieee/ire/builder.rb +7 -6
  385. data/lib/pubid/ieee/ire/identifier.rb +48 -33
  386. data/lib/pubid/ieee/ire/parser.rb +1 -1
  387. data/lib/pubid/ieee/nesc/builder.rb +33 -20
  388. data/lib/pubid/ieee/nesc/parser.rb +16 -15
  389. data/lib/pubid/ieee/parser.rb +462 -44
  390. data/lib/pubid/ieee/pre_parser.rb +1 -1
  391. data/lib/pubid/ieee/renderer.rb +158 -57
  392. data/lib/pubid/ieee/typed_stages.rb +12 -1
  393. data/lib/pubid/ieee/urn_generator.rb +35 -8
  394. data/lib/pubid/ieee.rb +63 -4
  395. data/lib/pubid/ieee_debug.rb +1 -0
  396. data/lib/pubid/ietf/builder.rb +78 -0
  397. data/lib/pubid/ietf/identifier.rb +5 -0
  398. data/lib/pubid/ietf/identifiers/base.rb +72 -0
  399. data/lib/pubid/ietf/identifiers/bcp.rb +36 -0
  400. data/lib/pubid/ietf/identifiers/fyi.rb +36 -0
  401. data/lib/pubid/ietf/identifiers/internet_draft.rb +45 -0
  402. data/lib/pubid/ietf/identifiers/rfc.rb +27 -0
  403. data/lib/pubid/ietf/identifiers/serialization.rb +51 -0
  404. data/lib/pubid/ietf/identifiers/std.rb +36 -0
  405. data/lib/pubid/ietf/identifiers.rb +14 -0
  406. data/lib/pubid/ietf/parser.rb +61 -0
  407. data/lib/pubid/ietf/renderer.rb +64 -0
  408. data/lib/pubid/ietf/urn_generator.rb +37 -0
  409. data/lib/pubid/ietf/urn_parser.rb +43 -0
  410. data/lib/pubid/ietf.rb +86 -0
  411. data/lib/pubid/iho/identifier.rb +1 -3
  412. data/lib/pubid/iho/identifiers/base.rb +11 -10
  413. data/lib/pubid/iho/identifiers/bibliographic.rb +1 -1
  414. data/lib/pubid/iho/identifiers/circular_letter.rb +1 -1
  415. data/lib/pubid/iho/identifiers/miscellaneous.rb +1 -1
  416. data/lib/pubid/iho/identifiers/publication.rb +1 -1
  417. data/lib/pubid/iho/identifiers/standard.rb +1 -1
  418. data/lib/pubid/iho/identifiers.rb +0 -1
  419. data/lib/pubid/iho/parser.rb +1 -1
  420. data/lib/pubid/iho.rb +8 -7
  421. data/lib/pubid/isbn/builder.rb +44 -0
  422. data/lib/pubid/isbn/check_digit.rb +53 -0
  423. data/lib/pubid/isbn/identifier.rb +81 -0
  424. data/lib/pubid/isbn/identifiers/book.rb +30 -0
  425. data/lib/pubid/isbn/identifiers.rb +9 -0
  426. data/lib/pubid/isbn/parser.rb +45 -0
  427. data/lib/pubid/isbn/renderer.rb +16 -0
  428. data/lib/pubid/isbn.rb +53 -0
  429. data/lib/pubid/iso/builder.rb +9 -4
  430. data/lib/pubid/iso/bundled_identifier.rb +5 -3
  431. data/lib/pubid/iso/combined_identifier.rb +6 -4
  432. data/lib/pubid/iso/identifier.rb +29 -8
  433. data/lib/pubid/iso/identifiers/directives_supplement.rb +12 -12
  434. data/lib/pubid/iso/normalizer.rb +2 -2
  435. data/lib/pubid/iso/parser.rb +17 -13
  436. data/lib/pubid/iso/supplement_identifier.rb +19 -6
  437. data/lib/pubid/iso/urn_generator.rb +4 -1
  438. data/lib/pubid/iso/urn_parser.rb +1 -1
  439. data/lib/pubid/iso.rb +7 -1
  440. data/lib/pubid/itu/builder.rb +230 -29
  441. data/lib/pubid/itu/components/code.rb +48 -5
  442. data/lib/pubid/itu/components/designation.rb +35 -0
  443. data/lib/pubid/itu/components.rb +1 -0
  444. data/lib/pubid/itu/identifier.rb +1 -3
  445. data/lib/pubid/itu/identifiers/addendum.rb +15 -0
  446. data/lib/pubid/itu/identifiers/amendment.rb +7 -29
  447. data/lib/pubid/itu/identifiers/annex.rb +13 -2
  448. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
  449. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
  450. data/lib/pubid/itu/identifiers/base.rb +357 -25
  451. data/lib/pubid/itu/identifiers/combined_identifier.rb +99 -23
  452. data/lib/pubid/itu/identifiers/corrigendum.rb +16 -23
  453. data/lib/pubid/itu/identifiers/errata.rb +15 -0
  454. data/lib/pubid/itu/identifiers/handbook.rb +38 -0
  455. data/lib/pubid/itu/identifiers/question.rb +63 -0
  456. data/lib/pubid/itu/identifiers/recommendation.rb +3 -2
  457. data/lib/pubid/itu/identifiers/report.rb +39 -0
  458. data/lib/pubid/itu/identifiers/special_publication.rb +3 -1
  459. data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
  460. data/lib/pubid/itu/identifiers/supplement.rb +119 -14
  461. data/lib/pubid/itu/identifiers.rb +10 -1
  462. data/lib/pubid/itu/model.rb +1 -1
  463. data/lib/pubid/itu/parser.rb +481 -27
  464. data/lib/pubid/itu/urn_generator.rb +36 -6
  465. data/lib/pubid/itu/urn_parser.rb +8 -0
  466. data/lib/pubid/itu.rb +12 -3
  467. data/lib/pubid/jcgm/builder.rb +24 -14
  468. data/lib/pubid/jcgm/identifier.rb +10 -0
  469. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -2
  470. data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
  471. data/lib/pubid/jcgm/identifiers/gum_guide.rb +3 -3
  472. data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
  473. data/lib/pubid/jcgm/identifiers.rb +2 -0
  474. data/lib/pubid/jcgm/parser.rb +74 -7
  475. data/lib/pubid/jcgm/renderer.rb +33 -12
  476. data/lib/pubid/jcgm/single_identifier.rb +84 -6
  477. data/lib/pubid/jcgm/supplement_identifier.rb +39 -4
  478. data/lib/pubid/jcgm/urn_generator.rb +21 -13
  479. data/lib/pubid/jcgm/urn_parser.rb +164 -10
  480. data/lib/pubid/jcgm.rb +10 -0
  481. data/lib/pubid/jis/identifier.rb +62 -3
  482. data/lib/pubid/jis/parser.rb +1 -1
  483. data/lib/pubid/jis.rb +1 -0
  484. data/lib/pubid/nist/builder.rb +29 -9
  485. data/lib/pubid/nist/caster.rb +7 -45
  486. data/lib/pubid/nist/circular_supplement_builder.rb +7 -5
  487. data/lib/pubid/nist/components/stage.rb +2 -2
  488. data/lib/pubid/nist/components/supplement.rb +5 -2
  489. data/lib/pubid/nist/configuration.rb +6 -2
  490. data/lib/pubid/nist/identifier.rb +1 -3
  491. data/lib/pubid/nist/identifiers/base.rb +133 -39
  492. data/lib/pubid/nist/identifiers/circular.rb +10 -3
  493. data/lib/pubid/nist/identifiers/circular_supplement.rb +14 -5
  494. data/lib/pubid/nist/identifiers/commercial_standard.rb +1 -1
  495. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +1 -1
  496. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +8 -2
  497. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -2
  498. data/lib/pubid/nist/identifiers/dated_document.rb +1 -1
  499. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +1 -1
  500. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +1 -1
  501. data/lib/pubid/nist/identifiers/handbook.rb +10 -3
  502. data/lib/pubid/nist/identifiers/internal_report.rb +13 -6
  503. data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
  504. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +15 -7
  505. data/lib/pubid/nist/identifiers/monograph.rb +15 -8
  506. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  507. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  508. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  509. data/lib/pubid/nist/identifiers/report.rb +15 -7
  510. data/lib/pubid/nist/identifiers/special_publication.rb +10 -1
  511. data/lib/pubid/nist/identifiers/technical_note.rb +1 -1
  512. data/lib/pubid/nist/identifiers.rb +0 -1
  513. data/lib/pubid/nist/parser.rb +27 -4
  514. data/lib/pubid/nist/preprocessor.rb +15 -0
  515. data/lib/pubid/nist/router.rb +2 -2
  516. data/lib/pubid/nist/series/ir.rb +0 -3
  517. data/lib/pubid/nist/supplement_identifier.rb +24 -9
  518. data/lib/pubid/nist.rb +19 -13
  519. data/lib/pubid/oasis/builder.rb +79 -0
  520. data/lib/pubid/oasis/identifier.rb +160 -0
  521. data/lib/pubid/oasis/identifiers/standard.rb +29 -0
  522. data/lib/pubid/oasis/identifiers.rb +9 -0
  523. data/lib/pubid/oasis/parser.rb +34 -0
  524. data/lib/pubid/oasis/renderer.rb +29 -0
  525. data/lib/pubid/oasis/urn_generator.rb +25 -0
  526. data/lib/pubid/oasis/urn_parser.rb +22 -0
  527. data/lib/pubid/oasis.rb +80 -0
  528. data/lib/pubid/ogc/builder.rb +33 -0
  529. data/lib/pubid/ogc/identifier.rb +81 -0
  530. data/lib/pubid/ogc/identifiers/document.rb +26 -0
  531. data/lib/pubid/ogc/identifiers.rb +10 -0
  532. data/lib/pubid/ogc/parser.rb +40 -0
  533. data/lib/pubid/ogc/renderer.rb +33 -0
  534. data/lib/pubid/ogc/urn_generator.rb +14 -0
  535. data/lib/pubid/ogc/urn_parser.rb +22 -0
  536. data/lib/pubid/ogc.rb +72 -0
  537. data/lib/pubid/oiml/builder.rb +36 -8
  538. data/lib/pubid/oiml/identifier.rb +9 -1
  539. data/lib/pubid/oiml/identifiers/basic_publication.rb +2 -0
  540. data/lib/pubid/oiml/identifiers/bulletin.rb +36 -0
  541. data/lib/pubid/oiml/identifiers/code_number.rb +90 -0
  542. data/lib/pubid/oiml/identifiers/document.rb +2 -0
  543. data/lib/pubid/oiml/identifiers/expert_report.rb +2 -0
  544. data/lib/pubid/oiml/identifiers/guide.rb +2 -0
  545. data/lib/pubid/oiml/identifiers/recommendation.rb +2 -0
  546. data/lib/pubid/oiml/identifiers/seminar_report.rb +2 -0
  547. data/lib/pubid/oiml/identifiers/vocabulary.rb +2 -0
  548. data/lib/pubid/oiml/identifiers.rb +1 -0
  549. data/lib/pubid/oiml/parser.rb +12 -13
  550. data/lib/pubid/oiml/renderer.rb +13 -13
  551. data/lib/pubid/oiml/single_identifier.rb +41 -37
  552. data/lib/pubid/oiml/supplement_identifier.rb +36 -9
  553. data/lib/pubid/oiml/urn_parser.rb +23 -6
  554. data/lib/pubid/oiml.rb +10 -0
  555. data/lib/pubid/omg/builder.rb +20 -0
  556. data/lib/pubid/omg/identifier.rb +61 -0
  557. data/lib/pubid/omg/identifiers/specification.rb +32 -0
  558. data/lib/pubid/omg/identifiers.rb +9 -0
  559. data/lib/pubid/omg/parser.rb +93 -0
  560. data/lib/pubid/omg/renderer.rb +31 -0
  561. data/lib/pubid/omg.rb +52 -0
  562. data/lib/pubid/parser/grammar.rb +74 -0
  563. data/lib/pubid/parser.rb +2 -0
  564. data/lib/pubid/parsers/mr_string.rb +120 -7
  565. data/lib/pubid/plateau/builder.rb +8 -4
  566. data/lib/pubid/plateau/identifier.rb +1 -3
  567. data/lib/pubid/plateau/identifiers/base.rb +1 -6
  568. data/lib/pubid/plateau/identifiers/handbook.rb +1 -1
  569. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  570. data/lib/pubid/plateau/identifiers.rb +0 -1
  571. data/lib/pubid/plateau/parser.rb +16 -6
  572. data/lib/pubid/plateau/renderer.rb +1 -1
  573. data/lib/pubid/plateau/supplement_identifier.rb +11 -11
  574. data/lib/pubid/plateau.rb +14 -4
  575. data/lib/pubid/prefixes_support.rb +1 -0
  576. data/lib/pubid/renderers/annotator.rb +233 -0
  577. data/lib/pubid/renderers/base.rb +13 -0
  578. data/lib/pubid/renderers/directives_renderer.rb +3 -3
  579. data/lib/pubid/renderers/human_readable.rb +6 -4
  580. data/lib/pubid/renderers/mr_string.rb +54 -6
  581. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  582. data/lib/pubid/renderers.rb +1 -0
  583. data/lib/pubid/rendering/numbering.rb +25 -7
  584. data/lib/pubid/rendering/supplement.rb +4 -4
  585. data/lib/pubid/rendering.rb +1 -0
  586. data/lib/pubid/sae/builder.rb +1 -1
  587. data/lib/pubid/sae/identifier.rb +1 -3
  588. data/lib/pubid/sae/identifiers/base.rb +19 -9
  589. data/lib/pubid/sae/identifiers.rb +0 -1
  590. data/lib/pubid/sae/parser.rb +1 -1
  591. data/lib/pubid/sae.rb +4 -3
  592. data/lib/pubid/schema/declaration.rb +33 -0
  593. data/lib/pubid/schema/error.rb +14 -0
  594. data/lib/pubid/schema/identifier_type.rb +23 -0
  595. data/lib/pubid/schema/loader.rb +117 -0
  596. data/lib/pubid/schema/typed_stage.rb +24 -0
  597. data/lib/pubid/schema.rb +25 -0
  598. data/lib/pubid/tgpp/builder.rb +41 -0
  599. data/lib/pubid/tgpp/identifier.rb +107 -0
  600. data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
  601. data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
  602. data/lib/pubid/tgpp/identifiers.rb +11 -0
  603. data/lib/pubid/tgpp/parser.rb +78 -0
  604. data/lib/pubid/tgpp/renderer.rb +52 -0
  605. data/lib/pubid/tgpp/urn_generator.rb +39 -0
  606. data/lib/pubid/tgpp/urn_parser.rb +30 -0
  607. data/lib/pubid/tgpp.rb +84 -0
  608. data/lib/pubid/type_resolver.rb +74 -0
  609. data/lib/pubid/un/builder.rb +42 -0
  610. data/lib/pubid/un/identifier.rb +40 -0
  611. data/lib/pubid/un/identifiers/document.rb +24 -0
  612. data/lib/pubid/un/identifiers.rb +9 -0
  613. data/lib/pubid/un/parser.rb +25 -0
  614. data/lib/pubid/un/renderer.rb +11 -0
  615. data/lib/pubid/un.rb +47 -0
  616. data/lib/pubid/urn_parser/errors.rb +8 -1
  617. data/lib/pubid/urn_parser.rb +1 -0
  618. data/lib/pubid/utils.rb +1 -0
  619. data/lib/pubid/version.rb +1 -1
  620. data/lib/pubid/w3c/builder.rb +55 -0
  621. data/lib/pubid/w3c/identifier.rb +130 -0
  622. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
  623. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
  624. data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
  625. data/lib/pubid/w3c/identifiers/note.rb +30 -0
  626. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
  627. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
  628. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
  629. data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
  630. data/lib/pubid/w3c/identifiers/standard.rb +12 -0
  631. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
  632. data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
  633. data/lib/pubid/w3c/identifiers.rb +25 -0
  634. data/lib/pubid/w3c/parser.rb +43 -0
  635. data/lib/pubid/w3c/renderer.rb +35 -0
  636. data/lib/pubid/w3c/urn_generator.rb +18 -0
  637. data/lib/pubid/w3c/urn_parser.rb +36 -0
  638. data/lib/pubid/w3c.rb +68 -0
  639. data/lib/pubid/xsf/builder.rb +17 -0
  640. data/lib/pubid/xsf/identifier.rb +66 -0
  641. data/lib/pubid/xsf/identifiers/xep.rb +31 -0
  642. data/lib/pubid/xsf/identifiers.rb +9 -0
  643. data/lib/pubid/xsf/parser.rb +38 -0
  644. data/lib/pubid/xsf/renderer.rb +23 -0
  645. data/lib/pubid/xsf/urn_generator.rb +13 -0
  646. data/lib/pubid/xsf/urn_parser.rb +18 -0
  647. data/lib/pubid/xsf.rb +82 -0
  648. data/lib/pubid.rb +424 -22
  649. data/lib/tasks/conformance.rake +34 -0
  650. data/lib/tasks/docs.rake +3 -3
  651. data/lib/tasks/schema.rake +88 -0
  652. data/schema/core/joint_prefixes.yaml +24 -0
  653. data/schema/iec.yaml +1017 -0
  654. data/schema/iso.yaml +1586 -0
  655. data/schema/schema.schema.yaml +96 -0
  656. metadata +241 -19
  657. data/archived-gems/pubid-ccsds/update_codes.yaml +0 -1
  658. data/archived-gems/pubid-iec/stages.yaml +0 -129
  659. data/archived-gems/pubid-iec/update_codes.yaml +0 -67
  660. data/archived-gems/pubid-ieee/update_codes.yaml +0 -104
  661. data/archived-gems/pubid-iso/stages.yaml +0 -106
  662. data/archived-gems/pubid-iso/update_codes.yaml +0 -4
  663. data/archived-gems/pubid-itu/i18n.yaml +0 -13
  664. data/archived-gems/pubid-itu/series.yaml +0 -42
  665. data/archived-gems/pubid-nist/publishers.yaml +0 -6
  666. data/archived-gems/pubid-nist/update_codes.yaml +0 -93
  667. data/archived-gems/pubid-plateau/update_codes.yaml +0 -6
  668. data/lib/pubid/cen_cenelec/supplement_identifier.rb +0 -48
  669. data/lib/pubid/cie/components/code.rb +0 -80
  670. data/lib/pubid/iala/identifiers/base.rb +0 -14
  671. data/lib/pubid/iec/components/code.rb +0 -36
  672. /data/{archived-gems/pubid-nist → data/nist}/stages.yaml +0 -0
@@ -13,6 +13,15 @@ module Pubid
13
13
  class Errata < SupplementIdentifier
14
14
  attribute :errata_date, :string
15
15
 
16
+ # Make Renderers::MrString recurse into `base` instead of slugging the
17
+ # supplement flat off attributes it does not have. Without it every
18
+ # erratum of every standard shared one filename, and `to_slug` is what
19
+ # consumers use as an output filename.
20
+ def mr_supplement_suffix
21
+ ["errata", mr_sanitize(errata_date)]
22
+ .compact.reject(&:empty?).join(".")
23
+ end
24
+
16
25
  TYPED_STAGES = [
17
26
  Components::TypedStage.new(
18
27
  abbr: ["Errata"],
@@ -8,6 +8,9 @@ module Pubid
8
8
  # ASHRAE Guideline identifier
9
9
  # Example: ASHRAE Guideline 0-2019, ASHRAE Guideline 1.5
10
10
  class Guideline < SingleIdentifier
11
+ # The relaton index key. Declared on the LEAF, not on the shared
12
+ # Identifier that SupplementIdentifier also inherits — see base.rb.
13
+ attribute :number, :string
11
14
  attribute :type, :string, default: "Guideline"
12
15
 
13
16
  TYPED_STAGES = [
@@ -11,6 +11,22 @@ module Pubid
11
11
  # - Interpretations for Standard 15.2-2022
12
12
  # - Interpretations for Standard 52.1-1992
13
13
  class Interpretation < SupplementIdentifier
14
+ # Mirrors its four sibling supplement types: without it
15
+ # Renderers::MrString slugs the interpretation FLAT off attributes it
16
+ # does not have, instead of recursing into `base`.
17
+ #
18
+ # Currently unreachable, and NOT because of alternation ordering:
19
+ # rule(:interpretation_identifier) is reached and does match, but it
20
+ # never wraps its output in `.as(:interpretation_identifier)`, so
21
+ # Builder#build's branch for that key is dead code and the tree falls
22
+ # through to the plain-Standard path (pre-existing; pinned in
23
+ # spec/pubid/ashrae/root_number_spec.rb, hand-off
24
+ # ashrae-interpretation-collapses-onto-base). Added anyway so that
25
+ # fixing the dispatch does not silently ship malformed filenames.
26
+ def mr_supplement_suffix
27
+ "interp"
28
+ end
29
+
14
30
  TYPED_STAGES = [
15
31
  Components::TypedStage.new(
16
32
  abbr: ["Interpretations"],
@@ -8,6 +8,9 @@ module Pubid
8
8
  # ASHRAE Standard identifier
9
9
  # Example: ASHRAE Standard 15-2024, ASHRAE Standard 90.1-2022
10
10
  class Standard < SingleIdentifier
11
+ # The relaton index key. Declared on the LEAF, not on the shared
12
+ # Identifier that SupplementIdentifier also inherits — see base.rb.
13
+ attribute :number, :string
11
14
  attribute :type, :string, default: "Standard"
12
15
 
13
16
  TYPED_STAGES = [
@@ -5,7 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  autoload :AddendaPackage, "#{__dir__}/identifiers/addenda_package"
7
7
  autoload :Addendum, "#{__dir__}/identifiers/addendum"
8
- autoload :Base, "#{__dir__}/identifiers/base"
9
8
  autoload :CombinedAddenda, "#{__dir__}/identifiers/combined_addenda"
10
9
  autoload :Errata, "#{__dir__}/identifiers/errata"
11
10
  autoload :Guideline, "#{__dir__}/identifiers/guideline"
@@ -6,7 +6,7 @@ module Pubid
6
6
  module Ashrae
7
7
  # Parser class for ASHRAE identifiers
8
8
  # Single Responsibility: Parsing ASHRAE identifier syntax
9
- class Parser < Parslet::Parser
9
+ class Parser < ::Pubid::Parser::Grammar
10
10
  # Basic building blocks
11
11
  rule(:space) { str(" ") }
12
12
  rule(:space?) { space.maybe }
@@ -54,15 +54,25 @@ module Pubid
54
54
  end
55
55
 
56
56
  # Code with year pattern (e.g., 34-2024, 62.1-2022, 90A-2010) - used when type is missing
57
+ #
58
+ # The code portion MUST be captured with `.as(:code)`. Without it the
59
+ # digits were matched and then discarded — only the year was named — so
60
+ # every identifier reaching this rule lost its document number: 48 corpus
61
+ # ids rendered as "ANSI/ASHRAE Addendum a to ASHRAE Standard -2024",
62
+ # number gone and a dangling dash left behind. Builder#extract_base_attributes
63
+ # already read `code_with_year[:code]`; it was waiting for a value the
64
+ # grammar never produced.
57
65
  rule(:code_with_year) do
58
66
  (
59
- digits >> # First part (e.g., 34, 62)
60
- (dot >> digits).repeat(0, 2) >> # Optional dotted parts (e.g., .1)
61
- # Special pattern for codes like "90A,B,C-2010"
62
67
  (
63
- letter >> # Single letter after digits
64
- (comma >> letter).repeat(0, 10) # Optional comma-separated letters
65
- ).maybe >>
68
+ digits >> # First part (e.g., 34, 62)
69
+ (dot >> digits).repeat(0, 2) >> # Optional dotted parts (e.g., .1)
70
+ # Special pattern for codes like "90A,B,C-2010"
71
+ (
72
+ letter >> # Single letter after digits
73
+ (comma >> letter).repeat(0, 10) # Optional comma-separated letters
74
+ ).maybe
75
+ ).as(:code) >>
66
76
  space?.maybe >> dash >>
67
77
  year_digits.as(:year)
68
78
  ).as(:code_with_year)
@@ -166,7 +176,7 @@ module Pubid
166
176
  (space >> additional_copublisher).maybe >>
167
177
  suffix.maybe >>
168
178
  reaffirmed.maybe
169
- ).as(:base_identifier) >>
179
+ ).as(:base) >>
170
180
  space >>
171
181
  str("Errata").as(:errata_keyword) >>
172
182
  (
@@ -188,7 +198,7 @@ module Pubid
188
198
  (space >> additional_copublisher).maybe >>
189
199
  suffix.maybe >>
190
200
  reaffirmed.maybe
191
- ).as(:base_identifier) >>
201
+ ).as(:base) >>
192
202
  space >>
193
203
  str("Errata").as(:errata_keyword) >>
194
204
  (
@@ -207,7 +217,7 @@ module Pubid
207
217
  (space >> additional_copublisher).maybe >>
208
218
  suffix.maybe >>
209
219
  reaffirmed.maybe
210
- ).as(:base_identifier) >>
220
+ ).as(:base) >>
211
221
  space >>
212
222
  str("Errata").as(:errata_keyword) >>
213
223
  errata_date.maybe >>
@@ -219,7 +229,7 @@ module Pubid
219
229
  rule(:interpretation_identifier) do
220
230
  str("Interpretations") >> space >>
221
231
  str("for") >> space >>
222
- (type.as(:type) >> space >> code >> (dash >> year_digits.as(:year)).maybe).as(:base_identifier)
232
+ (type.as(:type) >> space >> code >> (dash >> year_digits.as(:year)).maybe).as(:base)
223
233
  end
224
234
 
225
235
  # Combined Addenda pattern (multiple addendums grouped together)
@@ -607,9 +617,12 @@ module Pubid
607
617
  year_first_addenda_package_identifier |
608
618
  addenda_package_identifier |
609
619
  addendum_identifier |
610
- # Standalone copublisher pattern (ANSI/AMCA 210-99, AMCA 210-99)
611
- (((str("ANSI") >> slash).maybe >> letter.repeat(2,
612
- 10)).as(:copublisher) >>
620
+ # Standalone copublisher pattern (ANSI/AMCA 210-99, AMCA 210-99).
621
+ # The literal "ASHRAE" is excluded here so a bare "ASHRAE <code>-<year>"
622
+ # is not swallowed as a copublisher and instead falls through to the
623
+ # ASHRAE-publisher branch below.
624
+ (((str("ANSI") >> slash).maybe >> (str("ASHRAE").absent? >> letter).repeat(2,
625
+ 10)).as(:copublisher) >>
613
626
  space >>
614
627
  code_with_year >>
615
628
  optional_suffix.repeat(0, 2)) |
@@ -635,9 +648,11 @@ module Pubid
635
648
  suffix.maybe >>
636
649
  reaffirmed.maybe >>
637
650
  optional_suffix.repeat(0, 2)) |
638
- # Standard ASHRAE pattern
651
+ # Standard ASHRAE pattern. The type keyword is optional so a bare
652
+ # partial reference "ASHRAE <code>" (no "Standard"/"Guideline") parses;
653
+ # the builder defaults the absent type to "Standard".
639
654
  (publisher.as(:publisher) >> space >>
640
- type.as(:type) >> space >>
655
+ (type.as(:type) >> space).maybe >>
641
656
  code >>
642
657
  (space?.maybe >> dash >> year_digits.as(:year)).maybe >>
643
658
  (space >> additional_copublisher).maybe >>
@@ -650,8 +665,13 @@ module Pubid
650
665
  root(:identifier)
651
666
 
652
667
  def self.parse(string)
668
+ unless string.is_a?(String)
669
+ raise Pubid::Errors::InvalidInputError,
670
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
671
+ end
672
+
653
673
  if string.length > Pubid::MAX_INPUT_LENGTH
654
- raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
674
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
655
675
  end
656
676
 
657
677
  # Strip leading/trailing whitespace
@@ -46,7 +46,7 @@ module Pubid
46
46
  parts << id.type.to_s if id.type
47
47
  result = parts.join(" ")
48
48
  result += " " if result.length.positive?
49
- result += id.code.to_s
49
+ result += id.number.to_s
50
50
  result += "-#{id.year}" if id.year
51
51
  result += " (#{id.amendment})" if id.amendment
52
52
  result += id.suffix if id.suffix
@@ -56,48 +56,48 @@ module Pubid
56
56
 
57
57
  # Addendum: "ASHRAE Addendum a to Standard 15-2001"
58
58
  def render_addendum(id)
59
- return id.base_identifier.to_s unless id.base_identifier
59
+ return id.base.to_s unless id.base
60
60
 
61
- base_type = id.base_identifier.type || "Standard"
61
+ base_type = id.base.type || "Standard"
62
62
 
63
63
  if id.copublisher
64
- "#{id.copublisher} Addendum #{id.addendum_code} to #{id.base_identifier}"
64
+ "#{id.copublisher} Addendum #{id.addendum_code} to #{id.base}"
65
65
  else
66
- result = "ASHRAE Addendum #{id.addendum_code} to #{base_type} #{id.base_identifier.code}"
67
- result += "-#{id.base_identifier.year}" if id.base_identifier.year
66
+ result = "ASHRAE Addendum #{id.addendum_code} to #{base_type} #{id.base.number}"
67
+ result += "-#{id.base.year}" if id.base.year
68
68
  result
69
69
  end.tap { |r| r << " (#{id.addendum_date})" if id.addendum_date }
70
70
  end
71
71
 
72
72
  # AddendaPackage: "ASHRAE Standard 52.2-1999: Addenda Supplement Package"
73
73
  def render_addenda_package(id)
74
- return id.base_identifier.to_s unless id.base_identifier
74
+ return id.base.to_s unless id.base
75
75
 
76
- result = "ASHRAE #{id.base_identifier.type || 'Standard'} #{id.base_identifier.code}"
77
- result += "-#{id.base_identifier.year}" if id.base_identifier.year
76
+ result = "ASHRAE #{id.base.type || 'Standard'} #{id.base.number}"
77
+ result += "-#{id.base.year}" if id.base.year
78
78
  result += ": Addenda #{id.package_description}" if id.package_description
79
79
  result
80
80
  end
81
81
 
82
82
  # CombinedAddenda: "ASHRAE Addenda c and d to Standard 15-1994"
83
83
  def render_combined_addenda(id)
84
- return id.base_identifier.to_s unless id.base_identifier
84
+ return id.base.to_s unless id.base
85
85
 
86
- base_type = id.base_identifier.type || "Standard"
86
+ base_type = id.base.type || "Standard"
87
87
  if id.addendum_codes
88
- result = "ASHRAE Addenda #{id.addendum_codes} to #{base_type} #{id.base_identifier.code}"
88
+ result = "ASHRAE Addenda #{id.addendum_codes} to #{base_type} #{id.base.number}"
89
89
  else
90
- result = "ASHRAE Addenda to #{base_type} #{id.base_identifier.code}"
90
+ result = "ASHRAE Addenda to #{base_type} #{id.base.number}"
91
91
  end
92
- result += "-#{id.base_identifier.year}" if id.base_identifier.year
92
+ result += "-#{id.base.year}" if id.base.year
93
93
  result
94
94
  end
95
95
 
96
96
  # Errata: "ASHRAE Guideline 0-2005 Errata (September 28, 2011)"
97
97
  def render_errata(id)
98
- return id.base_identifier.to_s unless id.base_identifier
98
+ return id.base.to_s unless id.base
99
99
 
100
- result = id.base_identifier.to_s
100
+ result = id.base.to_s
101
101
  result += " Errata"
102
102
  result += " (#{id.errata_date})" if id.errata_date
103
103
  result
@@ -105,11 +105,11 @@ module Pubid
105
105
 
106
106
  # Interpretation: "Interpretations for Standard 15.2-2022"
107
107
  def render_interpretation(id)
108
- return id.base_identifier.to_s unless id.base_identifier
108
+ return id.base.to_s unless id.base
109
109
 
110
- base_type = id.base_identifier.type || "Standard"
111
- result = "Interpretations for #{base_type} #{id.base_identifier.code}"
112
- result += "-#{id.base_identifier.year}" if id.base_identifier.year
110
+ base_type = id.base.type || "Standard"
111
+ result = "Interpretations for #{base_type} #{id.base.number}"
112
+ result += "-#{id.base.year}" if id.base.year
113
113
  result
114
114
  end
115
115
  end
@@ -4,7 +4,7 @@ module Pubid
4
4
  module Ashrae
5
5
  # Base class for single (non-supplement) ASHRAE identifiers
6
6
  # Includes: Guideline, Standard
7
- class SingleIdentifier < Identifiers::Base
7
+ class SingleIdentifier < Identifier
8
8
  end
9
9
  end
10
10
  end
@@ -6,17 +6,32 @@ module Pubid
6
6
  module Ashrae
7
7
  # Base class for supplement identifiers (addendums, errata, interpretations)
8
8
  # Supplements modify or add to a base document
9
- class SupplementIdentifier < Identifiers::Base
10
- attribute :base_identifier, Identifiers::Base, polymorphic: true
9
+ class SupplementIdentifier < Identifier
10
+ attribute :base, Identifier, polymorphic: true
11
11
 
12
- # Delegate publisher to base_identifier
12
+ # Delegate publisher to base
13
13
  def publisher
14
- base_identifier&.publisher
14
+ base&.publisher
15
15
  end
16
16
 
17
- # Delegate code to base_identifier
17
+ # Delegate the document code to the base standard.
18
+ #
19
+ # The BODY had to move with the `code` -> `number` rename — it was
20
+ # `base&.code`, and `code` no longer exists anywhere in the hierarchy, so
21
+ # it raised NoMethodError on every Errata/Addendum/CombinedAddenda/
22
+ # AddendaPackage/Interpretation. Nothing inside lib/pubid/ashrae calls
23
+ # it, which is exactly why the suite stayed green while a public method
24
+ # on five types was broken.
25
+ #
26
+ # The NAME deliberately stays `code`. Renaming it to `number` looks
27
+ # tidier and is wrong twice over: `number` is an inherited lutaml
28
+ # attribute typed Components::Code, so a String-returning method of that
29
+ # name makes `to_hash` raise IncorrectModelError on every supplement —
30
+ # and even typed correctly it would serialize a duplicate of the base's
31
+ # number onto the wrapper. `code` is not an attribute anywhere, so it is
32
+ # free to be a plain reader. Use `#root.number` for the index key.
18
33
  def code
19
- base_identifier&.code
34
+ base&.number
20
35
  end
21
36
  end
22
37
  end
@@ -3,10 +3,16 @@
3
3
  module Pubid
4
4
  module Ashrae
5
5
  class UrnGenerator < Pubid::UrnGenerator::Base
6
+ # A supplement carries no number of its own — only the two
7
+ # single-document leaves declare one — so reach it through #root, which
8
+ # walks `base` to the standard the supplement attaches to. Without the
9
+ # fallback every Errata/Addendum URN lost its number when `code` moved
10
+ # off the shared base onto the leaves.
6
11
  def urn_number
7
- return nil unless identifier.code
12
+ num = identifier.number || identifier.root.number
13
+ return nil if num.nil? || num.to_s.empty?
8
14
 
9
- identifier.code.to_s
15
+ num.to_s
10
16
  end
11
17
 
12
18
  def urn_suffix
data/lib/pubid/ashrae.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module Ashrae
5
6
  extend Pubid::PrefixesSupport
@@ -9,7 +10,7 @@ module Pubid
9
10
  PREFIXES = ["ASHRAE"].freeze
10
11
 
11
12
  autoload :Builder, "#{__dir__}/ashrae/builder"
12
- autoload :Identifier, "#{__dir__}/ashrae/identifier"
13
+ autoload :Identifier, "#{__dir__}/ashrae/identifiers/base"
13
14
  autoload :Identifiers, "#{__dir__}/ashrae/identifiers"
14
15
  autoload :Parser, "#{__dir__}/ashrae/parser"
15
16
  autoload :Renderer, "#{__dir__}/ashrae/renderer"
@@ -19,8 +20,13 @@ module Pubid
19
20
  autoload :UrnParser, "#{__dir__}/ashrae/urn_parser"
20
21
 
21
22
  def self.parse(identifier)
23
+ unless identifier.is_a?(String)
24
+ raise Pubid::Errors::InvalidInputError,
25
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
26
+ end
27
+
22
28
  if identifier.length > Pubid::MAX_INPUT_LENGTH
23
- raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
29
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
24
30
  end
25
31
 
26
32
  Identifier.parse(identifier)
@@ -68,5 +74,5 @@ end
68
74
  Pubid::Registry.register(:ashrae, Pubid::Ashrae)
69
75
 
70
76
  # Per-flavor format registry: inherits global formats, overrides :human
71
- Pubid::Ashrae::Identifiers::Base.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
72
- Pubid::Ashrae::Identifiers::Base.format_registry.register(:human, renderer: Pubid::Ashrae::Renderer)
77
+ Pubid::Ashrae::Identifier.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
78
+ Pubid::Ashrae::Identifier.format_registry.register(:human, renderer: Pubid::Ashrae::Renderer)
@@ -21,9 +21,18 @@ module Pubid
21
21
  identifier.publisher = "ASME"
22
22
  end
23
23
 
24
- # Build code component
24
+ # The code is stored as flat index columns on the leaf (see
25
+ # Identifiers::Standard) — `number` is what relaton-index keys on — so
26
+ # the Code built below is unpacked rather than assigned.
25
27
  if parsed_hash[:designator]
26
- identifier.code = build_code(parsed_hash)
28
+ identifier.number = build_code(parsed_hash).to_s
29
+ elsif parsed_hash[:number]
30
+ # A joint-published reference ("ISO/ASME 14414-2015") parses to a bare
31
+ # `number` with no designator. The designator-only guard above dropped
32
+ # it, so the document number was lost from BOTH the identifier and its
33
+ # rendering: `to_s` was "ISO/ASME-2015". Pre-existing; recovering it
34
+ # is what gives these ids an index key.
35
+ identifier.number = parsed_hash[:number].to_s
27
36
  end
28
37
 
29
38
  # Set PTC suffix
@@ -4,6 +4,15 @@ module Pubid
4
4
  module Asme
5
5
  class Identifier < Pubid::Identifier
6
6
  def self.parse(str)
7
+ unless str.is_a?(String)
8
+ raise Pubid::Errors::InvalidInputError,
9
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
10
+ end
11
+
12
+ if str.length > Pubid::MAX_INPUT_LENGTH
13
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
14
+ end
15
+
7
16
  parser = Parser.new
8
17
  builder = Builder.new
9
18
 
@@ -4,8 +4,92 @@ module Pubid
4
4
  module Asme
5
5
  module Identifiers
6
6
  class Standard < Base
7
- # Standard extends Base with no additional attributes
8
- # All functionality inherited from Base
7
+ # --- Index columns -------------------------------------------------
8
+ #
9
+ # relaton-index sorts and bsearches every row on
10
+ # `id.root.number.to_s`. ASME used to keep the code inside an
11
+ # Asme::Components::Code under a `code` attribute, leaving the
12
+ # inherited `number` nil and every row keyed "".
13
+ #
14
+ # `number` holds the WHOLE printed code — "B18.3", "A112.19.12",
15
+ # "BPVC-CC-BPV" — not a designator/number split.
16
+ #
17
+ # The split looks tempting (it is what IEEE does) but it cannot key
18
+ # this corpus: 152 of the 731 fixture ids are Boiler and Pressure
19
+ # Vessel Code documents whose entire identity IS the designator
20
+ # ("BPVC COMPLETE CODE BIND", "BPVC.CC.BPV") with no numeric part at
21
+ # all. Splitting leaves every one of them with an empty key, and
22
+ # inventing a number for them would be inventing data.
23
+ #
24
+ # Nothing is lost by joining: Components::Code#render is a plain
25
+ # concatenation of designator and number, and the only readers of
26
+ # `code` anywhere in lib/pubid/asme are `code.to_s` (renderer.rb,
27
+ # urn_generator.rb). Keying on the whole code also clusters editions of
28
+ # one document, which is what relaton narrows on — an ASME reference is
29
+ # always written "ASME B18.3", never "18.3" alone.
30
+ #
31
+ # LANDMINE: `number` redefines the Components::Code attribute inherited
32
+ # from ::Pubid::Identifier, which resolves nondeterministically when
33
+ # declared on a class others inherit from. Standard is the only
34
+ # concrete ASME type and has no subclasses, so it is declared here and
35
+ # never on SingleIdentifier / Identifiers::Base.
36
+ # spec/pubid/asme/root_number_spec.rb carries the tripwire and is only
37
+ # meaningful under the full `rake` suite.
38
+ # There is deliberately no `#code` reader here. An earlier draft had one
39
+ # composing `Components::Code.new(number: number)` so the renderer and
40
+ # the URN generator would not have to change — but because `number`
41
+ # holds the whole printed code, that Code never carried a designator and
42
+ # `code.to_s` equalled `number` for all 731 corpus ids. It wrapped a
43
+ # string in an object whose only job was to unwrap to the same string.
44
+ # Both readers now use `number` directly.
45
+ #
46
+ # ASTM keeps its composed `#code` (Identifiers::CodeNumber) for the
47
+ # opposite reason: its renderer reads `code.letter` / `code.dual_m`
48
+ # field-by-field, so the component there carries real structure.
49
+ attribute :number, :string
50
+
51
+ # MR slug. Before the index column landed, every ASME slug was just
52
+ # "asme": 722 of 731 documents shared one filename, and `to_slug` is
53
+ # what consumers use as an output filename.
54
+ #
55
+ # `handbook` is identity-bearing — it is in the serialized hash and in
56
+ # `==`, and "ASME A17.1/CSA B44-2019" and "ASME A17.1/CSA B44
57
+ # Handbook-2019" are different documents — so it has to reach the slug
58
+ # too. CLAUDE.md's rule: a marker that only reaches `==` still lets two
59
+ # documents share a filename.
60
+ def mr_number_with_part
61
+ mr_join(mr_sanitize(number), (handbook ? "handbook" : nil))
62
+ end
63
+
64
+ # ASME keeps its edition in a plain `year` string, not the inherited
65
+ # `date`, so the base `mr_year` hook read nil and every edition of one
66
+ # standard shared a slug.
67
+ def mr_year
68
+ year&.to_s
69
+ end
70
+
71
+ # ASME keeps a translation marker in a plain `language` string, not the
72
+ # inherited `languages` collection the base hook reads. Without this,
73
+ # "ASME B31.8-2016" and its Spanish edition "ASME B31.8 (SPANISH)-2016"
74
+ # — different documents, and #== agrees — share one filename.
75
+ def mr_languages
76
+ language&.to_s&.downcase
77
+ end
78
+
79
+ # An ASME code legitimately contains "." (B18.3), "-" (BPVC-CC-BPV),
80
+ # "&" (V&V) and spaces ("BPVC COMPLETE CODE BIND"). Renderers::MrString
81
+ # joins SEGMENTS with ".", so a dot inside one breaks that structure —
82
+ # filter by charset, the BIPM `mr_slug` precedent, rather than by an
83
+ # enumerated escape list. The output emptiness check matters: a value
84
+ # made only of out-of-charset characters collapses to "", which is
85
+ # truthy in Ruby and would reach the renderer as a blank segment.
86
+ def mr_sanitize(value)
87
+ return nil if value.nil? || value.to_s.empty?
88
+
89
+ sanitized = value.to_s.downcase
90
+ .gsub(/[^a-z0-9-]+/, "-").gsub(/\A-+|-+\z/, "")
91
+ sanitized.empty? ? nil : sanitized
92
+ end
9
93
  end
10
94
  end
11
95
  end
@@ -4,7 +4,7 @@ require "parslet"
4
4
 
5
5
  module Pubid
6
6
  module Asme
7
- class Parser < Parslet::Parser
7
+ class Parser < ::Pubid::Parser::Grammar
8
8
  # Basic building blocks
9
9
  rule(:space) { str(" ") }
10
10
  # Regular dash, en-dash, em-dash
@@ -22,15 +22,15 @@ module Pubid
22
22
  parts << id.first_publisher
23
23
  parts << id.first_code
24
24
  parts << "/#{id.second_publisher}" if id.second_publisher
25
- parts << id.code.to_s if id.code && id.code.to_s != ""
25
+ parts << id.number.to_s if id.number && id.number.to_s != ""
26
26
  elsif id.joint_publisher
27
27
  # ISO/ASME or ASME/ANS format
28
28
  parts << id.joint_publisher
29
- parts << id.code.to_s if id.code && id.code.to_s != ""
29
+ parts << id.number.to_s if id.number && id.number.to_s != ""
30
30
  else
31
31
  # Standard ASME format
32
32
  parts << id.publisher if id.publisher
33
- parts << id.code.to_s if id.code
33
+ parts << id.number.to_s if id.number
34
34
  end
35
35
 
36
36
  result = parts.join(" ")
@@ -10,7 +10,14 @@ module Pubid
10
10
  # @return [String] URN representation
11
11
 
12
12
  attribute :publisher, :string
13
- attribute :code, Components::Code
13
+ # The document code lives on the concrete leaf as a single `number`
14
+ # column holding the WHOLE printed code ("B18.3", "BPVC-CC-BPV") — see
15
+ # Identifiers::Standard, which explains why it is not split into
16
+ # designator + number. It cannot be declared here: SingleIdentifier is
17
+ # inherited by Identifiers::Base and Identifiers::Standard, and
18
+ # redefining the `number` that ::Pubid::Identifier types as a
19
+ # Components::Code on an inherited-from class resolves
20
+ # nondeterministically under multi-flavor load.
14
21
  attribute :year, :string
15
22
  attribute :reaffirmation, :string # R2020
16
23
  attribute :language, :string # (SPANISH)
@@ -11,8 +11,8 @@ module Pubid
11
11
 
12
12
  parts << publisher_component
13
13
 
14
- if identifier.code
15
- parts << identifier.code.to_s
14
+ if identifier.number
15
+ parts << identifier.number.to_s
16
16
  end
17
17
 
18
18
  part = maybe(:part)
data/lib/pubid/asme.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pubid"
3
4
  module Pubid
4
5
  module Asme
5
6
  extend Pubid::PrefixesSupport
@@ -8,9 +8,16 @@ module Pubid
8
8
  identifier_class = determine_identifier_class(parsed_hash)
9
9
  identifier = identifier_class.new
10
10
 
11
- # Build code component if present
11
+ # The code is stored as flat index columns on every concrete class (see
12
+ # Identifiers::CodeNumber) — `number` is what relaton-index keys on —
13
+ # so the Code built below is unpacked rather than assigned.
12
14
  if parsed_hash[:letter] || parsed_hash[:number]
13
- identifier.code = build_code(parsed_hash)
15
+ code = build_code(parsed_hash)
16
+ identifier.letter = code.letter
17
+ identifier.number = code.number
18
+ identifier.suffix = code.suffix
19
+ identifier.subseries = code.subseries
20
+ identifier.dual_m = code.dual_m || false
14
21
  end
15
22
 
16
23
  # Set publisher
@@ -119,7 +126,7 @@ module Pubid
119
126
 
120
127
  # Adjunct
121
128
  if identifier.is_a?(Identifiers::Adjunct)
122
- identifier.designation = parsed_hash[:designation].to_s if parsed_hash[:designation]
129
+ identifier.number = parsed_hash[:designation].to_s if parsed_hash[:designation]
123
130
  identifier.ea_suffix = true if parsed_hash[:ea_suffix]
124
131
  identifier.dvd_suffix = true if parsed_hash[:dvd_suffix]
125
132
  end
@@ -4,6 +4,15 @@ module Pubid
4
4
  module Astm
5
5
  class Identifier < Pubid::Identifier
6
6
  def self.parse(str)
7
+ unless str.is_a?(String)
8
+ raise Pubid::Errors::InvalidInputError,
9
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
10
+ end
11
+
12
+ if str.length > Pubid::MAX_INPUT_LENGTH
13
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
14
+ end
15
+
7
16
  parser = Parser.new
8
17
  builder = Builder.new
9
18