Merge pull request #4508 from marvinmednick/pathconf_names

Pathconf names
This commit is contained in:
Jeong YunWon
2023-02-22 00:03:43 +09:00
committed by GitHub
2 changed files with 29 additions and 2 deletions

View File

@@ -507,3 +507,10 @@ if "win" not in sys.platform:
for arg in [None, 1, 1.0, TabError]:
assert_raises(TypeError, os.system, arg)
# Testing for os.pathconf_names
if sys.platform.startswith('linux'):
assert len(os.pathconf_names) > 0
assert 'PC_NAME_MAX' in os.pathconf_names
for option,index in os.pathconf_names.items():
assert os.pathconf('/', index) == os.pathconf('/', option)

View File

@@ -51,7 +51,7 @@ pub mod module {
fs, io,
os::unix::{ffi as ffi_ext, io::RawFd},
};
use strum_macros::EnumString;
use strum_macros::{EnumString, EnumVariantNames};
#[pyattr]
use libc::{PRIO_PGRP, PRIO_PROCESS, PRIO_USER};
@@ -1681,7 +1681,7 @@ pub mod module {
// Copy from [nix::unistd::PathconfVar](https://docs.rs/nix/0.21.0/nix/unistd/enum.PathconfVar.html)
// Change enum name to fit python doc
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, EnumString)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, EnumString, EnumVariantNames)]
#[repr(i32)]
#[allow(non_camel_case_types)]
pub enum PathconfVar {
@@ -1881,6 +1881,26 @@ pub mod module {
pathconf(PathOrFd::Fd(fd), name, vm)
}
// TODO: this is expected to be run on macOS as a unix, but somehow not.
#[cfg(target_os = "linux")]
#[pyattr]
fn pathconf_names(vm: &VirtualMachine) -> PyDictRef {
use std::str::FromStr;
use strum::VariantNames;
let pathname = vm.ctx.new_dict();
for variant in PathconfVar::VARIANTS {
// get the name of variant as a string to use as the dictionary key
let key = vm.ctx.new_str(variant.to_string());
// get the enum from the string and convert it to an integer for the dictionary value
let value: PyObjectRef = vm
.ctx
.new_int(PathconfVar::from_str(variant).unwrap() as u8)
.into();
pathname.set_item(&*key, value, vm).unwrap();
}
pathname
}
#[cfg(any(target_os = "linux", target_os = "macos"))]
#[derive(FromArgs)]
struct SendFileArgs {