Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Implmentation for os.pathconf_names
  • Loading branch information
mmednick authored and youknowone committed Feb 21, 2023
commit 468f1aa31236fd43120d09b6f8c995a70460a423
8 changes: 8 additions & 0 deletions extra_tests/snippets/stdlib_os.py
Original file line number Diff line number Diff line change
Expand Up @@ -507,3 +507,11 @@ def __exit__(self, exc_type, exc_val, exc_tb):

for arg in [None, 1, 1.0, TabError]:
assert_raises(TypeError, os.system, arg)

# Testing for os.pathconf_names
if not sys.platform.startswith("win"):
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)

22 changes: 20 additions & 2 deletions vm/src/stdlib/posix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,10 @@ pub mod module {
ffi::{CStr, CString},
fs, io,
os::unix::{ffi as ffi_ext, io::RawFd},
str::FromStr,
};
use strum_macros::EnumString;
use strum::VariantNames;
use strum_macros::{EnumString, EnumVariantNames};

#[pyattr]
use libc::{PRIO_PGRP, PRIO_PROCESS, PRIO_USER};
Expand Down Expand Up @@ -1681,7 +1683,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 {
Expand Down Expand Up @@ -1881,6 +1883,22 @@ pub mod module {
pathconf(PathOrFd::Fd(fd), name, vm)
}

#[pyattr]
fn pathconf_names(vm: &VirtualMachine) -> PyDictRef {
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 {
Expand Down