Skip to content

Commit 6b6c4da

Browse files
committed
Add pyarg(flatten)
1 parent e60a63d commit 6b6c4da

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

Lib/test/test_shutil.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2076,6 +2076,7 @@ def _open(filename, mode='r'):
20762076

20772077
self.assertRaises(OSError, shutil.copyfile, 'srcfile', 'destfile')
20782078

2079+
@unittest.skip("TODO: RUSTPYTHON, panics with 'no blocks left to pop'")
20792080
@unittest.skipIf(MACOS, "skipped on macOS")
20802081
def test_w_dest_open_fails(self):
20812082

@@ -2096,6 +2097,7 @@ def _open(filename, mode='r'):
20962097
self.assertEqual(srcfile._exited_with[1].args,
20972098
('Cannot open "destfile"',))
20982099

2100+
@unittest.skip("TODO: RUSTPYTHON, panics with 'no blocks left to pop'")
20992101
@unittest.skipIf(MACOS, "skipped on macOS")
21002102
def test_w_dest_close_fails(self):
21012103

derive/src/from_args.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ enum ParameterKind {
1212
PositionalOnly,
1313
PositionalOrKeyword,
1414
KeywordOnly,
15+
Flatten,
1516
}
1617

1718
impl ParameterKind {
@@ -20,6 +21,7 @@ impl ParameterKind {
2021
"positional_only" => Some(ParameterKind::PositionalOnly),
2122
"positional_or_keyword" => Some(ParameterKind::PositionalOrKeyword),
2223
"keyword_only" => Some(ParameterKind::KeywordOnly),
24+
"flatten" => Some(ParameterKind::Flatten),
2325
_ => None,
2426
}
2527
}
@@ -52,7 +54,7 @@ impl ArgAttribute {
5254
err_span!(
5355
first_arg,
5456
"The first argument to #[pyarg()] must be the parameter type, either \
55-
'positional_only', 'positional_or_keyword', or 'keyword_only'."
57+
'positional_only', 'positional_or_keyword', 'keyword_only', or 'flatten'."
5658
)
5759
})?;
5860

@@ -78,6 +80,9 @@ impl ArgAttribute {
7880
}
7981

8082
fn parse_argument(&mut self, arg: &NestedMeta) -> Result<(), Diagnostic> {
83+
if let ParameterKind::Flatten = self.kind {
84+
bail_span!(arg, "can't put additional arguments on a flatten arg")
85+
}
8186
match arg {
8287
NestedMeta::Meta(Meta::Path(path)) => {
8388
if path_eq(&path, "default") {
@@ -154,6 +159,11 @@ fn generate_field(field: &Field) -> Result<TokenStream2, Diagnostic> {
154159
});
155160
}
156161
}
162+
if let ParameterKind::Flatten = attr.kind {
163+
return Ok(quote! {
164+
#name: ::rustpython_vm::function::FromArgs::from_args(vm, args)?,
165+
});
166+
}
157167
let middle = quote! {
158168
.map(|x| ::rustpython_vm::pyobject::TryFromObject::try_from_object(vm, x)).transpose()?
159169
};
@@ -174,6 +184,7 @@ fn generate_field(field: &Field) -> Result<TokenStream2, Diagnostic> {
174184
ParameterKind::KeywordOnly => quote! {
175185
::rustpython_vm::function::ArgumentError::RequiredKeywordArgument(tringify!(#name))
176186
},
187+
ParameterKind::Flatten => unreachable!(),
177188
};
178189
quote! {
179190
.ok_or_else(|| #err)?
@@ -196,6 +207,7 @@ fn generate_field(field: &Field) -> Result<TokenStream2, Diagnostic> {
196207
#name: args.take_keyword(stringify!(#name))#middle#ending,
197208
}
198209
}
210+
ParameterKind::Flatten => unreachable!(),
199211
};
200212
Ok(file_output)
201213
}

vm/src/stdlib/os.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,6 +1476,20 @@ fn os_link(src: PyPathLike, dst: PyPathLike, vm: &VirtualMachine) -> PyResult<()
14761476
fs::hard_link(src.path, dst.path).map_err(|err| convert_io_error(vm, err))
14771477
}
14781478

1479+
#[derive(FromArgs)]
1480+
struct UtimeArgs {
1481+
#[pyarg(positional_or_keyword)]
1482+
path: PyPathLike,
1483+
#[pyarg(positional_or_keyword, default = "None")]
1484+
times: Option<PyTupleRef>,
1485+
#[pyarg(keyword_only, default = "None")]
1486+
ns: Option<PyTupleRef>,
1487+
#[pyarg(flatten)]
1488+
dir_fd: DirFd,
1489+
#[pyarg(flatten)]
1490+
follow_symlinks: FollowSymlinks,
1491+
}
1492+
14791493
fn os_utime(
14801494
_path: PyPathLike,
14811495
_time: OptionalArg<PyTupleRef>,

0 commit comments

Comments
 (0)