Skip to content

Commit a68d691

Browse files
committed
feat: add versioning to env vars
1 parent 6f7d0dc commit a68d691

6 files changed

Lines changed: 442 additions & 17 deletions

File tree

crates/uv-dev/src/generate_env_vars_reference.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,27 +80,31 @@ fn generate() -> String {
8080
// Partition and sort environment variables into UV_ and external variables.
8181
let (uv_vars, external_vars): (BTreeSet<_>, BTreeSet<_>) = EnvVars::metadata()
8282
.iter()
83-
.partition(|(var, _)| var.starts_with("UV_"));
83+
.partition(|(var, _, _)| var.starts_with("UV_"));
8484

8585
output.push_str("uv defines and respects the following environment variables:\n\n");
8686

87-
for (var, doc) in uv_vars {
88-
output.push_str(&render(var, doc));
87+
for (var, doc, added_in) in uv_vars {
88+
output.push_str(&render(var, doc, added_in));
8989
}
9090

9191
output.push_str("\n\n## Externally defined variables\n\n");
9292
output.push_str("uv also reads the following externally defined environment variables:\n\n");
9393

94-
for (var, doc) in external_vars {
95-
output.push_str(&render(var, doc));
94+
for (var, doc, added_in) in external_vars {
95+
output.push_str(&render(var, doc, added_in));
9696
}
9797

9898
output
9999
}
100100

101101
/// Render an environment variable and its documentation.
102-
fn render(var: &str, doc: &str) -> String {
103-
format!("### `{var}`\n\n{doc}\n\n")
102+
fn render(var: &str, doc: &str, added_in: Option<&str>) -> String {
103+
if let Some(added_in) = added_in {
104+
format!("### `{var}`\n<small class=\"added-in\">added in `{added_in}`</small>\n\n{doc}\n\n")
105+
} else {
106+
format!("### `{var}`\n\n{doc}\n\n")
107+
}
104108
}
105109

106110
#[cfg(test)]

crates/uv-macros/src/lib.rs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ fn get_env_var_pattern_from_attr(attrs: &[Attribute]) -> Option<String> {
7777
.map(|lit_str| lit_str.value())
7878
}
7979

80+
fn get_added_in(attrs: &[Attribute]) -> Option<String> {
81+
attrs
82+
.iter()
83+
.find(|a| a.path().is_ident("attr_added_in"))
84+
.and_then(|attr| attr.parse_args::<LitStr>().ok())
85+
.map(|lit_str| lit_str.value())
86+
}
87+
8088
fn is_hidden(attrs: &[Attribute]) -> bool {
8189
attrs.iter().any(|attr| attr.path().is_ident("attr_hidden"))
8290
}
@@ -92,6 +100,7 @@ pub fn attribute_env_vars_metadata(_attr: TokenStream, input: TokenStream) -> To
92100
.filter_map(|item| match item {
93101
ImplItem::Const(item) if !is_hidden(&item.attrs) => {
94102
let doc = get_doc_comment(&item.attrs);
103+
let added_in = get_added_in(&item.attrs);
95104
let syn::Expr::Lit(syn::ExprLit {
96105
lit: syn::Lit::Str(lit),
97106
..
@@ -100,13 +109,14 @@ pub fn attribute_env_vars_metadata(_attr: TokenStream, input: TokenStream) -> To
100109
return None;
101110
};
102111
let name = lit.value();
103-
Some((name, doc))
112+
Some((name, doc, added_in))
104113
}
105114
ImplItem::Fn(item) if !is_hidden(&item.attrs) => {
106115
// Extract the environment variable patterns.
107116
if let Some(pattern) = get_env_var_pattern_from_attr(&item.attrs) {
108117
let doc = get_doc_comment(&item.attrs);
109-
Some((pattern, doc))
118+
let added_in = get_added_in(&item.attrs);
119+
Some((pattern, doc, added_in))
110120
} else {
111121
None // Skip if pattern extraction fails.
112122
}
@@ -116,9 +126,11 @@ pub fn attribute_env_vars_metadata(_attr: TokenStream, input: TokenStream) -> To
116126
.collect();
117127

118128
let struct_name = &ast.self_ty;
119-
let pairs = constants.iter().map(|(name, doc)| {
120-
quote! {
121-
(#name, #doc)
129+
let pairs = constants.iter().map(|(name, doc, added_in)| {
130+
if let Some(added_in) = added_in {
131+
quote! { (#name, #doc, Some(#added_in)) }
132+
} else {
133+
quote! { (#name, #doc, None) }
122134
}
123135
});
124136

@@ -127,7 +139,7 @@ pub fn attribute_env_vars_metadata(_attr: TokenStream, input: TokenStream) -> To
127139

128140
impl #struct_name {
129141
/// Returns a list of pairs of env var and their documentation defined in this impl block.
130-
pub fn metadata<'a>() -> &'a [(&'static str, &'static str)] {
142+
pub fn metadata<'a>() -> &'a [(&'static str, &'static str, Option<&'static str>)] {
131143
&[#(#pairs),*]
132144
}
133145
}
@@ -145,3 +157,8 @@ pub fn attr_hidden(_attr: TokenStream, item: TokenStream) -> TokenStream {
145157
pub fn attr_env_var_pattern(_attr: TokenStream, item: TokenStream) -> TokenStream {
146158
item
147159
}
160+
161+
#[proc_macro_attribute]
162+
pub fn attr_added_in(_attr: TokenStream, item: TokenStream) -> TokenStream {
163+
item
164+
}

0 commit comments

Comments
 (0)