Feature #14405
closedAdd base option to Pathname.glob also
Description
Dir.glob
has base
option since Ruby 2.5.
https://bugs.ruby-lang.org/issues/13056
However Pathname.glob
does not have the option.
I would like to use base
option with Pathname
class.
But I feel Dir.glob('*.rb', base: 'dir').map{|path|Pathname(path)}
is lengthy, so I'd like to add the option to Pathname.glob
.
This patch adds the option to Pathname.glob
also.
For example:
require 'pathname'
p Pathname.glob('lib/i*.rb', 0) # => [#<Pathname:lib/irb.rb>, #<Pathname:lib/ipaddr.rb>]
p Dir.glob('i*.rb', 0, base: 'lib') # => ["irb.rb", "ipaddr.rb"]
p Dir.glob('i*.rb', base: 'lib') # => ["irb.rb", "ipaddr.rb"]
p Pathname.glob('i*.rb', 0, base: 'lib') # => [#<Pathname:irb.rb>, #<Pathname:ipaddr.rb>]
p Pathname.glob('i*.rb', base: 'lib') # => [#<Pathname:irb.rb>, #<Pathname:ipaddr.rb>]
p Pathname.glob('i*.rb', base: Pathname('lib')) # => [#<Pathname:irb.rb>, #<Pathname:ipaddr.rb>]
p Pathname.glob('i*.rb', base: Pathname(`pwd`.chomp) / 'lib') # => [#<Pathname:irb.rb>, #<Pathname:ipaddr.rb>]
p Pathname.glob('i*.rb', base: File.join(`pwd`.chomp, 'lib')) # => [#<Pathname:irb.rb>, #<Pathname:ipaddr.rb>]
Pathname.glob('i*.rb', foo: 'bar') rescue p $! # => #<ArgumentError: unknown keyword: foo>
Pathname.glob('i*.rb', foo: 'bar') rescue p $!.backtrace # => ["<...>/test.rb:13:in `glob'", "<...>/test.rb:13:in `glob'", "<...>/test.rb:13:in `<main>'"]
If the patch is OK, I'll do the follwoing TODOs.
- Add documentation
- Add tests to here. https://github.com/ruby/ruby/blob/d891056e3a6232163e99636cfcbb7bbfe1291404/test/pathname/test_pathname.rb#L1231-L1241
Files
Updated by shevegen (Robert A. Heiler) almost 7 years ago
Probably makes sense so people can use either variant by default
depending on their personal preferences.
I personally love "Dir"-related methods; I think Dir[] is probably
the method I use the most in general when I need to find/obtain
files and directory. For me, Pathname was too lengthy. :)
Updated by nobu (Nobuyoshi Nakada) almost 7 years ago
- Status changed from Open to Feedback
Pathname
has glob
instance method.
p Pathname('lib').glob('i*.rb', 0) => [#<Pathname:lib/ipaddr.rb>, #<Pathname:lib/irb.rb>]
This looks brief enough.
Updated by pocke (Masataka Kuwabara) almost 7 years ago
nobu (Nobuyoshi Nakada) wrote:
Pathname
hasglob
instance method.p Pathname('lib').glob('i*.rb', 0) => [#<Pathname:lib/ipaddr.rb>, #<Pathname:lib/irb.rb>]
This looks brief enough.
Definitely. I also noticed it after created this ticket.
However I think Pathname.glob
makes sense for two reasons.
Firstly, I think Pathname.glob
should have same interface as Dir.glob
. For example, if they have the same interface, we can replace Dir.glob
with Pathname.glob
more easily.
# before
Dir.glob('*', base: 'path/to/dir')
# When I'd like to get pathnames:
# If they don't have the same interface, I should rewrite the whole code.
Pathname('path/to/dir').glob('*')
# If they have the same interface, I'll just replace `Dir` with `Pathname` only. I think it is more easily.
Pathname.glob('*', base: 'path/to/dir')
Secondly, I feel the Pathname('path/to/dir')
is a subject in Pathname('path/to/dir').glob('*')
, and base: 'path/to/dir'
is not a subject in Pathname.glob('*', base: 'path/to/dir')
.
I guess a base directory is not a subject of the glob
methods in many cases, so I'd like to use the keyword argument style in many cases.
(ここの英語でちゃんと伝えきれているかわからないので、日本語で補足させてください。
Pathname('path/to/dir').glob('*')
では、Pathname('path/to/dir')
がこのコードの主役のように感じます。一方Pathname.glob('*', base: 'path/to/dir')
の方ではbase: 'path/to/dir'
はコードの主役ではないように感じます。
多くのケースにおいて、baseディレクトリと言うのはglob
の主役ではない(パターンがこのメソッドの主役)と思うので、その関係をより色濃く反映したkeyword引数のスタイルの方を使いたいです。)
What do you think?
Updated by nobu (Nobuyoshi Nakada) almost 7 years ago
- Status changed from Feedback to Assigned
- Assignee set to akr (Akira Tanaka)
Updated by akr (Akira Tanaka) over 5 years ago
- Status changed from Assigned to Closed
Applied in changeset git|4d9504fe13c6470d9da74540f92a247e8c1d9b99.
Delegates 3 arguments for Pathname.glob.
Thanks for the patch by pocke (Masataka Kuwabara) [Feature #14405].