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
@@ -7,11 +7,11 @@ module Pubid
7
7
  # Single Responsibility: Wraps another identifier with sheet number and year
8
8
  # Example: "IEC 60695-2-1/1:1994" = Sheet 1 of IEC 60695-2-1 from 1994
9
9
  class SheetIdentifier < Identifier
10
- attribute :base_identifier, Identifier, polymorphic: true
10
+ attribute :base, Identifier, polymorphic: true
11
11
  attribute :sheet_number, :string
12
12
  attribute :year, :string, default: -> {}
13
13
 
14
- # Common fields are delegated to base_identifier, so serialize the
14
+ # Common fields are delegated to base, so serialize the
15
15
  # wrapped identifier under "base" plus the sheet number/year; suppress
16
16
  # the delegated common maps (they live inside "base").
17
17
  include Pubid::Iec::DelegatedFieldSuppression
@@ -23,7 +23,7 @@ module Pubid
23
23
  end
24
24
 
25
25
  def base_to_kv(model, doc)
26
- base = model.base_identifier
26
+ base = model.base
27
27
  return unless base
28
28
 
29
29
  doc.add_child(Lutaml::KeyValue::DataModel::Element.new("base",
@@ -31,36 +31,36 @@ module Pubid
31
31
  end
32
32
 
33
33
  def base_from_kv(model, value)
34
- model.base_identifier = ::Pubid::Iec::Identifier.from_hash(value) if value
34
+ model.base = ::Pubid::Iec::Identifier.from_hash(value) if value
35
35
  end
36
36
 
37
- # Delegate common attributes to base_identifier
37
+ # Delegate common attributes to base
38
38
  def publisher
39
- base_identifier&.publisher
39
+ base&.publisher
40
40
  end
41
41
 
42
42
  def copublishers
43
- base_identifier&.copublishers
43
+ base&.copublishers
44
44
  end
45
45
 
46
46
  def code
47
- base_identifier&.code
47
+ base&.code
48
48
  end
49
49
 
50
50
  def number
51
- base_identifier&.number
51
+ base&.number
52
52
  end
53
53
 
54
54
  def date
55
- base_identifier&.date
55
+ base&.date
56
56
  end
57
57
 
58
58
  def stage
59
- base_identifier&.stage
59
+ base&.stage
60
60
  end
61
61
 
62
62
  def typed_stage
63
- base_identifier&.typed_stage
63
+ base&.typed_stage
64
64
  end
65
65
  end
66
66
  end
@@ -24,16 +24,6 @@ module Pubid
24
24
  short: "Trend Report" }
25
25
  end
26
26
 
27
- # Override publisher_portion to add Trend Report
28
- def publisher_portion
29
- result = publisher.to_s
30
-
31
- if typed_stage && typed_stage.abbreviation == "Trend Report"
32
- result += " Trend Report"
33
- end
34
-
35
- result
36
- end
37
27
  end
38
28
  end
39
29
  end
@@ -23,16 +23,6 @@ module Pubid
23
23
  web: :systems_reference_document, title: "Systems Reference Document", short: "SRD" }
24
24
  end
25
25
 
26
- # Override publisher_portion to add SRD
27
- def publisher_portion
28
- result = publisher.to_s
29
-
30
- if typed_stage && typed_stage.abbreviation == "SRD"
31
- result += " SRD"
32
- end
33
-
34
- result
35
- end
36
26
  end
37
27
  end
38
28
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iec
5
+ module Identifiers
6
+ # Technical Group identifier — identifies a committee rather than a
7
+ # publication. Covers:
8
+ #
9
+ # IEC TC 1 (Technical Committee)
10
+ # IEC PC 118 (Project Committee)
11
+ # ISO/IEC JTC 1 (Joint Technical Committee)
12
+ # ISO/IEC JPC 2 (Joint Project Committee)
13
+ # ISO/IEC JTC 1/SC 7 (Joint TC with Subcommittee)
14
+ # IEC SC 100A (Subcommittee with letter suffix)
15
+ # CIS/A (CISPR Subcommittee, bare form)
16
+ # CISPR (CISPR Committee, bare form)
17
+ class TechnicalGroup < Base
18
+ attribute :technical_committee, :string
19
+ attribute :subcommittee, :string
20
+
21
+ TYPED_STAGES = [].freeze
22
+
23
+ def self.type
24
+ { key: :tg,
25
+ web: :technical_group, title: "Technical Group", short: "TG" }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -53,7 +53,7 @@ module Pubid
53
53
  code: :dtr,
54
54
  stage_code: :draft,
55
55
  type_code: :tr,
56
- abbr: ["DTR"],
56
+ abbr: %w[DTR ADTR CDTR DTRM NDTR DTSM DTRM],
57
57
  name: "Draft Technical Report",
58
58
  harmonized_stages: %w[50.00 50.20 50.60 50.92 50.98 50.99],
59
59
  ),
@@ -108,23 +108,6 @@ module Pubid
108
108
  web: :technical_report, title: "Technical Report", short: "TR" }
109
109
  end
110
110
 
111
- # Override publisher_portion to handle TR formatting
112
- # If copublishers exist, use parent implementation
113
- def publisher_portion
114
- # If copublishers, delegate to parent (SingleIdentifier) which handles them
115
- return super if copublishers&.any?
116
-
117
- # No copublishers: simple TR formatting
118
- result = publisher.to_s
119
-
120
- if typed_stage
121
- abbr = typed_stage.abbreviation
122
- # For TR: always use space (IEC convention for ALL publishers)
123
- result += " #{abbr}" unless abbr.empty?
124
- end
125
-
126
- result
127
- end
128
111
  end
129
112
  end
130
113
  end
@@ -53,7 +53,7 @@ module Pubid
53
53
  code: :dts,
54
54
  stage_code: :draft,
55
55
  type_code: :ts,
56
- abbr: ["DTS"],
56
+ abbr: %w[DTS ADTS CDTS NDTS],
57
57
  name: "Draft Technical Specification",
58
58
  harmonized_stages: %w[50.00 50.20 50.60 50.92 50.98 50.99],
59
59
  ),
@@ -108,23 +108,6 @@ module Pubid
108
108
  web: :technical_specification, title: "Technical Specification", short: "TS" }
109
109
  end
110
110
 
111
- # Override publisher_portion to handle TS formatting
112
- # If copublishers exist, use parent implementation
113
- def publisher_portion
114
- # If copublishers, delegate to parent (SingleIdentifier) which handles them
115
- return super if copublishers&.any?
116
-
117
- # No copublishers: simple TS formatting
118
- result = publisher.to_s
119
-
120
- if typed_stage
121
- abbr = typed_stage.abbreviation
122
- # TS uses space for all stages
123
- result += " #{abbr}" unless abbr.empty?
124
- end
125
-
126
- result
127
- end
128
111
  end
129
112
  end
130
113
  end
@@ -22,16 +22,6 @@ module Pubid
22
22
  { key: :tec, title: "Technology Report", short: "Technology Report" }
23
23
  end
24
24
 
25
- # Override publisher_portion to add Technology Report
26
- def publisher_portion
27
- result = publisher.to_s
28
-
29
- if typed_stage && typed_stage.abbreviation == "Technology Report"
30
- result += " Technology Report"
31
- end
32
-
33
- result
34
- end
35
25
  end
36
26
  end
37
27
  end
@@ -28,17 +28,6 @@ module Pubid
28
28
  web: :test_report_form, title: "Test Report Form", short: "TRF" }
29
29
  end
30
30
 
31
- # Override publisher_portion to add TRF with space
32
- def publisher_portion
33
- result = publisher.to_s
34
-
35
- if typed_stage && typed_stage.abbreviation == "TRF"
36
- result += " TRF"
37
- end
38
-
39
- result
40
- end
41
-
42
31
  # TRF uses special rendering via the Renderer
43
32
  end
44
33
  end
@@ -7,12 +7,12 @@ module Pubid
7
7
  # Single Responsibility: Wraps another identifier with VAP type suffix
8
8
  # Examples: "IEC 61666:2010+AMD1:2021 CSV"
9
9
  class VapIdentifier < Identifier
10
- attribute :base_identifier, Identifier, polymorphic: true
10
+ attribute :base, Identifier, polymorphic: true
11
11
  # One or more VAP codes (e.g. ["CSV"] or ["EXV", "CMV"]). Plain strings.
12
12
  attribute :vap, :string, collection: true
13
13
  attribute :edition, ::Pubid::Components::Edition, default: -> {}
14
14
 
15
- # number/date/publisher/stage are delegated to base_identifier, so
15
+ # number/date/publisher/stage are delegated to base, so
16
16
  # serialize the wrapped identifier under "base" plus the vap array; the
17
17
  # common fields live inside "base", not at the top level.
18
18
  include Pubid::Iec::DelegatedFieldSuppression
@@ -23,7 +23,7 @@ module Pubid
23
23
  end
24
24
 
25
25
  def base_to_kv(model, doc)
26
- base = model.base_identifier
26
+ base = model.base
27
27
  return unless base
28
28
 
29
29
  doc.add_child(Lutaml::KeyValue::DataModel::Element.new("base",
@@ -31,7 +31,7 @@ module Pubid
31
31
  end
32
32
 
33
33
  def base_from_kv(model, value)
34
- model.base_identifier = ::Pubid::Iec::Identifier.from_hash(value) if value
34
+ model.base = ::Pubid::Iec::Identifier.from_hash(value) if value
35
35
  end
36
36
 
37
37
  # VAP types mapping
@@ -42,33 +42,33 @@ module Pubid
42
42
  "SER" => "Serial version",
43
43
  }.freeze
44
44
 
45
- # Delegate common attributes to base_identifier
45
+ # Delegate common attributes to base
46
46
  def publisher
47
- base_identifier&.publisher
47
+ base&.publisher
48
48
  end
49
49
 
50
50
  def copublishers
51
- base_identifier&.copublishers
51
+ base&.copublishers
52
52
  end
53
53
 
54
54
  def code
55
- base_identifier&.code
55
+ base&.code
56
56
  end
57
57
 
58
58
  def number
59
- base_identifier&.number
59
+ base&.number
60
60
  end
61
61
 
62
62
  def date
63
- base_identifier&.date
63
+ base&.date
64
64
  end
65
65
 
66
66
  def stage
67
- base_identifier&.stage
67
+ base&.stage
68
68
  end
69
69
 
70
70
  def typed_stage
71
- base_identifier&.typed_stage
71
+ base&.typed_stage
72
72
  end
73
73
  end
74
74
  end
@@ -23,16 +23,6 @@ module Pubid
23
23
  web: :white_paper, title: "White Paper", short: "White Paper" }
24
24
  end
25
25
 
26
- # Override publisher_portion to add White Paper
27
- def publisher_portion
28
- result = publisher.to_s
29
-
30
- if typed_stage && typed_stage.abbreviation == "White Paper"
31
- result += " White Paper"
32
- end
33
-
34
- result
35
- end
36
26
  end
37
27
  end
38
28
  end
@@ -28,19 +28,33 @@ module Pubid
28
28
  web: :working_document, title: "Working Document", short: "WD" }
29
29
  end
30
30
 
31
- # Return stage object for PWI/PNW stage
31
+ # A working document prints its committee, number, language and stage —
32
+ # `1/2457(F)/FDIS` — and none of those is the `number` the shared token
33
+ # table looks for, so it had no annotatable token. `wd_stage` is the
34
+ # printed stage token ("FDIS"); the derived `#stage` reader covers only
35
+ # the PWI/PNW work-programme form and is nil here.
36
+ def annotation_tokens
37
+ super + [
38
+ [:technical_committee, "docnumber"],
39
+ [:wd_number, "docnumber"],
40
+ [:wd_language, "language"],
41
+ [:wd_stage, "stage"],
42
+ [:wp_stage, "stage"],
43
+ [:wp_type, "doctype"],
44
+ ]
45
+ end
46
+
47
+ # Return stage object for the PWI/PNW work-programme stage.
48
+ #
49
+ # This used to build a bare Stage from a hand-written abbreviation map,
50
+ # so the stage carried no harmonized code and "pnw" existed as a stage
51
+ # code nowhere else in the registry. It now resolves through the shared
52
+ # registry, so PWI carries 00.* and PNW carries 10.20 — which is what
53
+ # the URN generator reads.
32
54
  def stage
33
55
  return nil unless wp_stage
34
56
 
35
- # Map PWI/PNW to stage codes
36
- stage_map = {
37
- "PWI" => "pwi",
38
- "PNW" => "pnw",
39
- }
40
- stage_code = stage_map[wp_stage]
41
- return nil unless stage_code
42
-
43
- @stage ||= ::Pubid::Components::Stage.new(stage_code: stage_code)
57
+ @stage ||= Pubid::Iec.locate_stage(wp_stage)&.to_stage
44
58
  end
45
59
  end
46
60
  end
@@ -20,6 +20,7 @@ module Pubid
20
20
  autoload :SystemsReferenceDocument, "#{__dir__}/identifiers/systems_reference_document"
21
21
  autoload :TechnicalReport, "#{__dir__}/identifiers/technical_report"
22
22
  autoload :TechnicalSpecification, "#{__dir__}/identifiers/technical_specification"
23
+ autoload :TechnicalGroup, "#{__dir__}/identifiers/technical_group"
23
24
  autoload :TechnologyReport, "#{__dir__}/identifiers/technology_report"
24
25
  autoload :TestReportForm, "#{__dir__}/identifiers/test_report_form"
25
26
  autoload :VapIdentifier, "#{__dir__}/identifiers/vap_identifier"
@@ -3,7 +3,7 @@ require "parslet"
3
3
 
4
4
  module Pubid
5
5
  module Iec
6
- class Parser < Parslet::Parser
6
+ class Parser < ::Pubid::Parser::Grammar
7
7
  include ::Pubid::Parser::CommonParseRules
8
8
  include ::Pubid::Parser::CommonParseMethods
9
9
 
@@ -17,8 +17,8 @@ module Pubid
17
17
  root :identifier
18
18
 
19
19
  rule(:identifier) do
20
- working_programme_with_publisher |
21
- working_programme |
20
+ working_programme |
21
+ technical_group |
22
22
  working_document |
23
23
  sheet_supplement_identifier |
24
24
  sheet_identifier |
@@ -29,6 +29,42 @@ module Pubid
29
29
  identifier_copublishers
30
30
  end
31
31
 
32
+ # Technical Group identifier — names a committee rather than a document.
33
+ # Examples: "IEC TC 1", "ISO/IEC JTC 1", "ISO/IEC JTC 1/SC 7",
34
+ # "IEC SC 100A", "CISPR", "CIS/A".
35
+ rule(:technical_group) do
36
+ technical_group_with_publisher | technical_group_bare
37
+ end
38
+
39
+ rule(:technical_group_with_publisher) do
40
+ prefix_sole_publisher >> copublishers.maybe >> space >>
41
+ tc_body.as(:technical_committee) >>
42
+ (str("/") >> space? >> sc_body).as(:subcommittee).maybe
43
+ end
44
+
45
+ rule(:technical_group_bare) do
46
+ # CISPR / CIS-letter forms and bare TYPE NUMBER forms both default
47
+ # publisher to "IEC" via the Base class default.
48
+ tc_body.as(:technical_committee) >>
49
+ (str("/") >> space? >> sc_body).as(:subcommittee).maybe
50
+ end
51
+
52
+ # Committee body forms accepted by the parser. Order matters: longer
53
+ # or more specific patterns first so they win the ordered choice.
54
+ rule(:tc_body) do
55
+ str("CISPR") |
56
+ (str("CIS") >> str("/") >> match("[A-Z]")) |
57
+ (tc_type >> space >> digits >> match("[A-Z]").maybe)
58
+ end
59
+
60
+ rule(:sc_body) do
61
+ str("SC") >> space >> digits >> match("[A-Z]").maybe
62
+ end
63
+
64
+ rule(:tc_type) do
65
+ str("JTC") | str("JPC") | str("TC") | str("SC") | str("PC")
66
+ end
67
+
32
68
  # Working Programme format: [PWI|PNW] [TR] number edition
33
69
  # Examples: "PWI TR 100-36 ED1", "PWI 100-44 ED1", "PNW 65-915 ED1"
34
70
  # TC-style names: "PWI TR SYCSMARTENERGY-1", "PWI SyCLVDC-1 ED1"
@@ -44,21 +80,6 @@ module Pubid
44
80
  (space >> edition).maybe
45
81
  end
46
82
 
47
- # Working Programme with publisher prefix: IEC/PWI [TR] number edition
48
- # Examples: "IEC/PWI 60038", "ISO/IEC/PWI TR 100-36 ED1"
49
- rule(:working_programme_with_publisher) do
50
- prefix_with_copublishers >> str("/") >>
51
- (str("PWI") | str("PNW")).as(:wp_stage) >>
52
- space >>
53
- (
54
- (str("TR") >> space) |
55
- (str("TS") >> space) |
56
- (str("SRD") >> space)
57
- ).maybe.as(:wp_type) >>
58
- wp_number >>
59
- (space >> edition).maybe
60
- end
61
-
62
83
  # Working programme numbers can be digits or TC names
63
84
  rule(:wp_number) do
64
85
  # TC-style: SYCSMARTENERGY-1, SyCLVDC-125
@@ -158,12 +179,16 @@ module Pubid
158
179
  end
159
180
 
160
181
  rule(:date) do
161
- # :2005-02 or optional for DB without date
182
+ # :2005-02 or :-- (undated reference — ISO/IEC undated-reference form,
183
+ # e.g. IEC 60050:--, also accepted as the em-dash variant IEC 60050:—)
162
184
  (str(":") | dash) >>
163
- (year_digits >>
164
- (dash >> month_digits).maybe >>
165
- (dash >> day_digits).maybe
166
- ).as(:date)
185
+ (
186
+ (str("--") | str("—")).as(:undated_marker) |
187
+ (year_digits >>
188
+ (dash >> month_digits).maybe >>
189
+ (dash >> day_digits).maybe
190
+ ).as(:date)
191
+ )
167
192
  end
168
193
 
169
194
  rule(:part_and_subpart) do
@@ -251,14 +276,14 @@ module Pubid
251
276
  # IEC 60695-2-1/1:1994 (sheet 1 from year 1994)
252
277
  # IEC 60695-2-1/1 (sheet 1 without year)
253
278
  rule(:sheet_identifier) do
254
- identifier_copublishers_no_third.as(:base_identifier) >>
279
+ identifier_copublishers_no_third.as(:base) >>
255
280
  (sheet_notation | sheet_notation_no_year)
256
281
  end
257
282
 
258
283
  # Sheet identifier followed by supplement: base/sheet/supplement
259
284
  # IEC 60695-2-1/1:1994/COR1:1995
260
285
  rule(:sheet_supplement_identifier) do
261
- identifier_copublishers_no_third.as(:base_identifier) >>
286
+ identifier_copublishers_no_third.as(:base) >>
262
287
  sheet_notation >>
263
288
  str("/") >> supplement_type_with_stage >>
264
289
  space? >> second_part >> third_part
@@ -353,7 +378,7 @@ module Pubid
353
378
  # ISO/IEC 17025:2017 handles copublisher in copublishers rule
354
379
  # We handle this in identifier_copublishers already
355
380
  rule(:joint_identifier) do
356
- identifier_copublishers_no_third.as(:base_identifier) >>
381
+ identifier_copublishers_no_third.as(:base) >>
357
382
  space? >> str("|") >> space? >>
358
383
  scope { iso_identifier }.as(:joint_identifier)
359
384
  end
@@ -381,7 +406,7 @@ module Pubid
381
406
 
382
407
  # IEC 60038:2009/Amd 1:2011
383
408
  rule(:supplement_identifier_no_third) do
384
- identifier_copublishers_no_third.as(:base_identifier) >>
409
+ identifier_copublishers_no_third.as(:base) >>
385
410
  str("/") >> supplement_type_with_stage >>
386
411
  space? >> second_part
387
412
  end
@@ -392,7 +417,7 @@ module Pubid
392
417
 
393
418
  # IEC 60038:2009/Amd 1:2011/Cor 1:2012
394
419
  rule(:supplement_supplement_identifier) do
395
- supplement_identifier_no_third.as(:base_identifier) >>
420
+ supplement_identifier_no_third.as(:base) >>
396
421
  str("/") >> supplement_type_with_stage >>
397
422
  space? >> second_part >> third_part
398
423
  end
@@ -37,6 +37,8 @@ module Pubid
37
37
  render_fragment(id, opts, context)
38
38
  when Identifiers::WorkingDocument
39
39
  render_working_document(id, context)
40
+ when Identifiers::TechnicalGroup
41
+ render_technical_group(id, context)
40
42
  when Identifiers::TestReportForm
41
43
  render_test_report_form(id, context)
42
44
  when SupplementIdentifier
@@ -75,11 +77,11 @@ module Pubid
75
77
  end
76
78
 
77
79
  def render_supplement(id, opts, context)
78
- id.ensure_base_identifier
80
+ id.ensure_base
79
81
 
80
82
  if id.synthetic_base?
81
83
  render_supplement_standalone(id, context)
82
- elsif id.base_identifier
84
+ elsif id.base
83
85
  render_supplement_attached(id, opts, context)
84
86
  else
85
87
  render_single(id, opts, context)
@@ -87,22 +89,27 @@ module Pubid
87
89
  end
88
90
 
89
91
  def render_supplement_standalone(id, context)
92
+ # This is a second, independent publisher/stage join that
93
+ # SingleIdentifier#publisher_portion never reaches. It follows the same
94
+ # house style: the slash separates copublishers, and a SPACE separates
95
+ # the publisher from the stage abbreviation. See issue #360 item 2.
90
96
  parts = []
91
97
 
92
98
  if id.publisher
93
- parts << id.publisher.render(context:)
99
+ publishers = [id.publisher.render(context:)]
94
100
  if id.copublishers&.any?
95
- parts << "/#{id.copublishers.map { |c| c.render(context:) }.join('/')}"
101
+ publishers += id.copublishers.map { |c| c.render(context:) }
96
102
  end
103
+ parts << publishers.join("/")
97
104
  end
98
105
 
99
106
  abbr = id.typed_stage.abbr.first
100
- number_str = id.base_identifier.number.to_s
107
+ number_str = id.base.number.to_s
101
108
  number_str += "-#{id.number}" if id.number
102
109
  number_str += "-#{id.subpart}" if id.subpart
103
110
  parts << "#{abbr} #{number_str}"
104
111
 
105
- result = parts.join("/")
112
+ result = parts.join(" ")
106
113
  result += ":#{id.date.render(context:)}" if id.date
107
114
  result += " #{id.edition.render(context:)}" if id.edition&.number
108
115
  result
@@ -110,7 +117,7 @@ module Pubid
110
117
 
111
118
  def render_supplement_attached(id, opts, context)
112
119
  parts = []
113
- parts << id.base_identifier.to_s(**opts)
120
+ parts << id.base.to_s(**opts)
114
121
 
115
122
  abbr = id.typed_stage.abbr.first.upcase
116
123
  supp_part = "/#{abbr}#{id.number}"
@@ -155,7 +162,7 @@ module Pubid
155
162
  def render_vap(id, opts, context)
156
163
  parts = []
157
164
 
158
- parts << id.base_identifier.to_s(**opts.merge(with_edition: false))
165
+ parts << id.base.to_s(**opts.merge(with_edition: false))
159
166
  parts << " #{id.vap.join('-')}" if id.vap&.any?
160
167
  parts << " #{id.edition.render(context:)}" if id.edition&.number
161
168
 
@@ -164,7 +171,7 @@ module Pubid
164
171
 
165
172
  def render_sheet(id, opts, context)
166
173
  parts = []
167
- parts << id.base_identifier.to_s(**opts)
174
+ parts << id.base.to_s(**opts)
168
175
  parts << "/#{id.sheet_number}"
169
176
  parts << ":#{id.year}" if id.year
170
177
  parts.join
@@ -172,9 +179,9 @@ module Pubid
172
179
 
173
180
  def render_fragment(id, opts, context)
174
181
  parts = []
175
- parts << id.base_identifier.to_s(**opts)
182
+ parts << id.base.to_s(**opts)
176
183
 
177
- parts << if id.base_identifier.is_a?(Identifiers::Corrigendum)
184
+ parts << if id.base.is_a?(Identifiers::Corrigendum)
178
185
  "/FRAGC#{id.fragment_number}"
179
186
  else
180
187
  "/FRAG#{id.fragment_number}"
@@ -185,16 +192,22 @@ module Pubid
185
192
  parts.join
186
193
  end
187
194
 
195
+ def render_technical_group(id, _context)
196
+ parts = []
197
+ parts << id.publisher_portion
198
+ parts << " #{id.technical_committee}"
199
+ parts << id.subcommittee if id.subcommittee
200
+ parts.join
201
+ end
202
+
188
203
  def render_working_document(id, context)
189
204
  if id.wp_stage
205
+ # A work-programme registration renders bare, as it is written:
206
+ # "PNW 65-915 ED1", not "IEC/PNW 65-915 ED1". Its number is
207
+ # TC-scoped, not an IEC document number, and prefixing "IEC " would
208
+ # break idempotence — "IEC PNW 65-915 ED1" re-parses as an
209
+ # International Standard, so rendering would not be a fixed point.
190
210
  parts = []
191
- if id.publisher
192
- parts << id.publisher.render(context:)
193
- if id.copublishers&.any?
194
- parts << "/#{id.copublishers.map { |c| c.render(context:) }.join('/')}"
195
- end
196
- parts << "/"
197
- end
198
211
  parts << id.wp_stage
199
212
  if id.wp_type && !id.wp_type.strip.empty?
200
213
  parts << " #{id.wp_type.strip}"