FilePathsBase.jl
FilePathsBase.jl copied to clipboard
Should `readdir` return a path?
It is kind of annoying that I can't do
readdir.(readdir(somepath))
to exact the 2 level hierachy.
One solution to this would be for readdir
to always return a path type.
Wether this is a fully qualified path of the same type as its input,
or wether it is some kind of PathPart{<:AbstractPath} <:AbstractPath
type that
both Strings
into just the last component,
but readdir
s as a fully path using a remembered parent,
or some other solution
I am not sure.
This seems related to https://github.com/rofinn/FilePathsBase.jl/issues/20. I think the current behaviour of readdir
is correct in that it just returns the basename paths, similar to how it works in base julia:
julia> readdir(cwd())
8-element Array{PosixPath,1}:
p".git"
p".travis.yml"
p"LICENSE.md"
p"README.md"
p"REQUIRE"
p"appveyor.yml"
p"src"
p"test"
julia> readdir(pwd())
8-element Array{String,1}:
".git"
".travis.yml"
"LICENSE.md"
"README.md"
"REQUIRE"
"appveyor.yml"
"src"
"test"
To do what you're proposing you probably want to write.
readdir.(joinpath.(Ref(somepath), readdir(somepath)))
Better support for directory walking and globbing would probably help with these kinds of operations though.
I agree it alighs with Base julia, but can we do better?
One option we could have that I alluded to is
struct SubPath{T,S}
part::S
parent::T
end
returned by readdir
,
with the properties such as
string(p::SubPath) = print(io, p::SubPath) = print(io, p.part)
open(p::SubPath,args...) = open(p.parent, args...)
joinpath(p::SubPath, x) = joinpath(p.parent, x)
joinpath(x, p::SubPath) = joinpath(x, p.part)
This could be pretty cool, I think.
It might be a nicer structure to actually use for walking around
(I find walkdir
kinda annoying most of the time)
Though I am not 100% on it,
it would take some playing with I think.
Hmmm, I did want to do something similar for a restricted/sandboxed path type which would essentially work like a chroot:
struct RestrictedPath{P<:AbstractPath} <: Abstractpath
parent::P
parts
end
It would have special rules to prevent you from operating outside of the parent path.
Would it make sense for SubPath
to work more like SubString
and just store an index into the parent.parts
?
Would it make sense for SubPath to work more like SubString and just store an index into the parent.parts?
I was thinking that, but didn't want to complicate the example.
This kind of reminds me of Haskell's path library http://hackage.haskell.org/package/path
(not that I've used it).
which divides path types into Absolute
and Relative
.
join=true
helps a lot with this, at least from experience with AWSS3 (ref #110)
For now, I think I'm gonna support join
and sort
for both readdir
/readpath
. The distinction between those two functions will simply be:
- Return strings vs paths
- Default values for
join
to avoid a breaking changes
Since readdir
now supports more of what readpath
does, I may introduce a breaking release in readpath
is deprecated and the readdir
output is simply determined by the input as suggested here, so we aren't introducing unnecessary type instabilities.