pathname 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c42dd90f7949c457dd8225ff9f04ab3919a972ec4c4f41781784ee22e3957c47
4
- data.tar.gz: 67971cc891a87efcadb29c62dea3bf429d74c5261711a83b8ccd45bbb2322028
3
+ metadata.gz: 222ab05e8698152edf5c4d2db5215d1385281d77e408234a03e9417d8f7e33c6
4
+ data.tar.gz: f267783875853911d60d63e08d7e871ba4562a84a73a335d1b72b453c3665a59
5
5
  SHA512:
6
- metadata.gz: 0bc313f05de84a963277fb5814202b52c73dec674b195944f4255f80fc35b72a9dd00baea026826438524393baac08da00a723dcdc1fcf24bb49dff24a323be2
7
- data.tar.gz: 1f4f1ec1ca815d7e857929ba474378d80b6e36ce5071fac4b3c1c12799a5a38eb951fc68361395274957c02ee67864dca30b8a2310d4521b65c51d97354b4788
6
+ metadata.gz: 0b2b4a31d31f5e5dc9fe356c6a25a5a8f40b573604c073b9090ec53c09bafac5aafa61339b1396136659ef0ddeb1932955eb4e43f2ab7d83a906509a9412b313
7
+ data.tar.gz: 789a9cd9d5929793cabecde7d8a023ce153d1b5c11ef85da85aa8e0a74a427c85162c7cc0d09e85c3f33e8ee2f2d43bfeabed665fdd5f2742dec3611662204dd
@@ -0,0 +1,7 @@
1
+ # This is a file used by GitHub to ignore the following commits on `git blame`.
2
+ #
3
+ # You can also do the same thing in your local repository with:
4
+ # $ git config --local blame.ignoreRevsFile .git-blame-ignore-revs
5
+
6
+ # Expand tabs
7
+ 93e8aaadc7c7945895b1b0b6d9909134409517ff
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: 'github-actions'
4
+ directory: '/'
5
+ schedule:
6
+ interval: 'weekly'
@@ -7,18 +7,21 @@ jobs:
7
7
  name: build (${{ matrix.ruby }} / ${{ matrix.os }})
8
8
  strategy:
9
9
  matrix:
10
- ruby: [ 2.7, 2.6, 2.5, head ]
11
- os: [ ubuntu-latest, macos-latest ]
10
+ ruby: [ 2.7, '3.0', 3.1, head ]
11
+ os: [ ubuntu-latest, macos-latest, windows-latest ]
12
+ exclude:
13
+ - { os: windows-latest , ruby: head }
14
+ include:
15
+ - { os: windows-latest , ruby: mingw }
16
+ - { os: windows-latest , ruby: mswin }
12
17
  runs-on: ${{ matrix.os }}
13
18
  steps:
14
- - uses: actions/checkout@master
19
+ - uses: actions/checkout@v3
15
20
  - name: Set up Ruby
16
21
  uses: ruby/setup-ruby@v1
17
22
  with:
18
23
  ruby-version: ${{ matrix.ruby }}
19
24
  - name: Install dependencies
20
- run: |
21
- gem install bundler --no-document
22
- bundle install
25
+ run: bundle install
23
26
  - name: Run test
24
27
  run: rake compile test
data/.gitignore CHANGED
@@ -6,3 +6,6 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ Gemfile.lock
10
+ *.bundle
11
+ *.so
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ gemspec
4
4
 
5
5
  gem "rake"
6
6
  gem "rake-compiler"
7
+ gem "test-unit"
data/README.md CHANGED
@@ -1,8 +1,24 @@
1
1
  # Pathname
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/pathname`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ Pathname represents the name of a file or directory on the filesystem,
4
+ but not the file itself.
4
5
 
5
- TODO: Delete this and the text above, and describe your gem
6
+ The pathname depends on the Operating System: Unix, Windows, etc.
7
+ This library works with pathnames of local OS, however non-Unix pathnames
8
+ are supported experimentally.
9
+
10
+ A Pathname can be relative or absolute. It's not until you try to
11
+ reference the file that it even matters whether the file exists or not.
12
+
13
+ Pathname is immutable. It has no method for destructive update.
14
+
15
+ The goal of this class is to manipulate file path information in a neater
16
+ way than standard Ruby provides. The examples below demonstrate the
17
+ difference.
18
+
19
+ *All* functionality from File, FileTest, and some from Dir and FileUtils is
20
+ included, in an unsurprising way. It is essentially a facade for all of
21
+ these, and more.
6
22
 
7
23
  ## Installation
8
24
 
@@ -22,15 +38,25 @@ Or install it yourself as:
22
38
 
23
39
  ## Usage
24
40
 
25
- TODO: Write usage instructions here
41
+ ```ruby
42
+ require 'pathname'
43
+ pn = Pathname.new("/usr/bin/ruby")
44
+ size = pn.size # 27662
45
+ isdir = pn.directory? # false
46
+ dir = pn.dirname # Pathname:/usr/bin
47
+ base = pn.basename # Pathname:ruby
48
+ dir, base = pn.split # [Pathname:/usr/bin, Pathname:ruby]
49
+ data = pn.read
50
+ pn.open { |f| _ }
51
+ pn.each_line { |line| _ }
52
+ ```
26
53
 
27
54
  ## Development
28
55
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
56
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake` to compile this and run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
57
 
31
58
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
59
 
33
60
  ## Contributing
34
61
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/hsbpathname.
36
-
62
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/pathname.
data/Rakefile CHANGED
@@ -3,9 +3,17 @@ require "rake/testtask"
3
3
 
4
4
  Rake::TestTask.new(:test) do |t|
5
5
  t.libs << "test/lib"
6
+ t.ruby_opts << "-rhelper"
6
7
  t.test_files = FileList["test/**/test_*.rb"]
7
8
  end
8
9
 
10
+ task :sync_tool do
11
+ require 'fileutils'
12
+ FileUtils.cp "../ruby/tool/lib/core_assertions.rb", "./test/lib"
13
+ FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
14
+ FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
15
+ end
16
+
9
17
  require 'rake/extensiontask'
10
18
  Rake::ExtensionTask.new("pathname")
11
19
 
@@ -35,6 +35,7 @@ static ID id_lchmod;
35
35
  static ID id_lchown;
36
36
  static ID id_link;
37
37
  static ID id_lstat;
38
+ static ID id_lutime;
38
39
  static ID id_mkdir;
39
40
  static ID id_mtime;
40
41
  static ID id_open;
@@ -360,10 +361,10 @@ path_each_line(int argc, VALUE *argv, VALUE self)
360
361
  args[0] = get_strpath(self);
361
362
  n = rb_scan_args(argc, argv, "03", &args[1], &args[2], &args[3]);
362
363
  if (rb_block_given_p()) {
363
- return rb_block_call(rb_cFile, id_foreach, 1+n, args, 0, 0);
364
+ return rb_block_call_kw(rb_cFile, id_foreach, 1+n, args, 0, 0, RB_PASS_CALLED_KEYWORDS);
364
365
  }
365
366
  else {
366
- return rb_funcallv(rb_cFile, id_foreach, 1+n, args);
367
+ return rb_funcallv_kw(rb_cFile, id_foreach, 1+n, args, RB_PASS_CALLED_KEYWORDS);
367
368
  }
368
369
  }
369
370
 
@@ -764,6 +765,19 @@ path_utime(VALUE self, VALUE atime, VALUE mtime)
764
765
  return rb_funcall(rb_cFile, id_utime, 3, atime, mtime, get_strpath(self));
765
766
  }
766
767
 
768
+ /*
769
+ * Update the access and modification times of the file.
770
+ *
771
+ * Same as Pathname#utime, but does not follow symbolic links.
772
+ *
773
+ * See File.lutime.
774
+ */
775
+ static VALUE
776
+ path_lutime(VALUE self, VALUE atime, VALUE mtime)
777
+ {
778
+ return rb_funcall(rb_cFile, id_lutime, 3, atime, mtime, get_strpath(self));
779
+ }
780
+
767
781
  /*
768
782
  * Returns the last component of the path.
769
783
  *
@@ -834,7 +848,7 @@ path_split(VALUE self)
834
848
  VALUE str = get_strpath(self);
835
849
  VALUE ary, dirname, basename;
836
850
  ary = rb_funcall(rb_cFile, id_split, 1, str);
837
- ary = rb_check_array_type(ary);
851
+ Check_Type(ary, T_ARRAY);
838
852
  dirname = rb_ary_entry(ary, 0);
839
853
  basename = rb_ary_entry(ary, 1);
840
854
  dirname = rb_class_new_instance(1, &dirname, rb_obj_class(self));
@@ -1212,7 +1226,7 @@ path_entries(VALUE self)
1212
1226
  ary = rb_funcall(rb_cDir, id_entries, 1, str);
1213
1227
  ary = rb_convert_type(ary, T_ARRAY, "Array", "to_ary");
1214
1228
  for (i = 0; i < RARRAY_LEN(ary); i++) {
1215
- VALUE elt = RARRAY_AREF(ary, i);
1229
+ VALUE elt = RARRAY_AREF(ary, i);
1216
1230
  elt = rb_class_new_instance(1, &elt, klass);
1217
1231
  rb_ary_store(ary, i, elt);
1218
1232
  }
@@ -1274,6 +1288,7 @@ static VALUE
1274
1288
  path_each_entry(VALUE self)
1275
1289
  {
1276
1290
  VALUE args[1];
1291
+ RETURN_ENUMERATOR(self, 0, 0);
1277
1292
 
1278
1293
  args[0] = get_strpath(self);
1279
1294
  return rb_block_call(rb_cDir, id_foreach, 1, args, each_entry_i, rb_obj_class(self));
@@ -1464,6 +1479,7 @@ path_f_pathname(VALUE self, VALUE str)
1464
1479
  * - #make_symlink(old)
1465
1480
  * - #truncate(length)
1466
1481
  * - #utime(atime, mtime)
1482
+ * - #lutime(atime, mtime)
1467
1483
  * - #basename(*args)
1468
1484
  * - #dirname
1469
1485
  * - #extname
@@ -1512,6 +1528,10 @@ path_f_pathname(VALUE self, VALUE str)
1512
1528
  void
1513
1529
  Init_pathname(void)
1514
1530
  {
1531
+ #ifdef HAVE_RB_EXT_RACTOR_SAFE
1532
+ rb_ext_ractor_safe(true);
1533
+ #endif
1534
+
1515
1535
  InitVM(pathname);
1516
1536
 
1517
1537
  rb_cPathname = rb_define_class("Pathname", rb_cObject);
@@ -1558,6 +1578,7 @@ Init_pathname(void)
1558
1578
  rb_define_method(rb_cPathname, "make_symlink", path_make_symlink, 1);
1559
1579
  rb_define_method(rb_cPathname, "truncate", path_truncate, 1);
1560
1580
  rb_define_method(rb_cPathname, "utime", path_utime, 2);
1581
+ rb_define_method(rb_cPathname, "lutime", path_lutime, 2);
1561
1582
  rb_define_method(rb_cPathname, "basename", path_basename, -1);
1562
1583
  rb_define_method(rb_cPathname, "dirname", path_dirname, 0);
1563
1584
  rb_define_method(rb_cPathname, "extname", path_extname, 0);
@@ -1641,6 +1662,7 @@ InitVM_pathname(void)
1641
1662
  id_lchown = rb_intern("lchown");
1642
1663
  id_link = rb_intern("link");
1643
1664
  id_lstat = rb_intern("lstat");
1665
+ id_lutime = rb_intern("lutime");
1644
1666
  id_mkdir = rb_intern("mkdir");
1645
1667
  id_mtime = rb_intern("mtime");
1646
1668
  id_open = rb_intern("open");
@@ -338,6 +338,8 @@ class Pathname
338
338
 
339
339
  #
340
340
  # Appends a pathname fragment to +self+ to produce a new Pathname object.
341
+ # Since +other+ is considered as a path relative to +self+, if +other+ is
342
+ # an absolute path, the new Pathname object is created from just +other+.
341
343
  #
342
344
  # p1 = Pathname.new("/usr") # Pathname:/usr
343
345
  # p2 = p1 + "bin/ruby" # Pathname:/usr/bin/ruby
@@ -399,6 +401,8 @@ class Pathname
399
401
 
400
402
  #
401
403
  # Joins the given pathnames onto +self+ to create a new Pathname object.
404
+ # This is effectively the same as using Pathname#+ to append +self+ and
405
+ # all arguments sequentially.
402
406
  #
403
407
  # path0 = Pathname.new("/usr") # Pathname:/usr
404
408
  # path0 = path0.join("bin/ruby") # Pathname:/usr/bin/ruby
@@ -574,25 +578,26 @@ class Pathname # * Find *
574
578
  end
575
579
 
576
580
 
581
+ autoload(:FileUtils, 'fileutils')
582
+
577
583
  class Pathname # * FileUtils *
578
584
  # Creates a full path, including any intermediate directories that don't yet
579
585
  # exist.
580
586
  #
581
587
  # See FileUtils.mkpath and FileUtils.mkdir_p
582
- def mkpath
583
- require 'fileutils'
584
- FileUtils.mkpath(@path)
588
+ def mkpath(mode: nil)
589
+ FileUtils.mkpath(@path, mode: mode)
585
590
  nil
586
591
  end
587
592
 
588
593
  # Recursively deletes a directory, including all directories beneath it.
589
594
  #
590
- # See FileUtils.rm_r
591
- def rmtree
595
+ # See FileUtils.rm_rf
596
+ def rmtree(noop: nil, verbose: nil, secure: nil)
592
597
  # The name "rmtree" is borrowed from File::Path of Perl.
593
598
  # File::Path provides "mkpath" and "rmtree".
594
599
  require 'fileutils'
595
- FileUtils.rm_r(@path)
600
+ FileUtils.rm_rf(@path, noop: noop, verbose: verbose, secure: secure)
596
601
  nil
597
602
  end
598
603
  end
data/pathname.gemspec CHANGED
@@ -1,13 +1,13 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "pathname"
3
- spec.version = "0.1.0"
3
+ spec.version = "0.2.1"
4
4
  spec.authors = ["Tanaka Akira"]
5
5
  spec.email = ["akr@fsij.org"]
6
6
 
7
7
  spec.summary = %q{Representation of the name of a file or directory on the filesystem}
8
8
  spec.description = %q{Representation of the name of a file or directory on the filesystem}
9
9
  spec.homepage = "https://github.com/ruby/pathname"
10
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
10
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
11
11
  spec.licenses = ["Ruby", "BSD-2-Clause"]
12
12
 
13
13
  spec.metadata["homepage_uri"] = spec.homepage
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
20
  end
21
21
  spec.bindir = "exe"
22
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.executables = []
23
23
  spec.require_paths = ["lib"]
24
24
  spec.extensions = %w[ext/pathname/extconf.rb]
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pathname
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tanaka Akira
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-03 00:00:00.000000000 Z
11
+ date: 2022-12-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Representation of the name of a file or directory on the filesystem
14
14
  email:
@@ -18,6 +18,8 @@ extensions:
18
18
  - ext/pathname/extconf.rb
19
19
  extra_rdoc_files: []
20
20
  files:
21
+ - ".git-blame-ignore-revs"
22
+ - ".github/dependabot.yml"
21
23
  - ".github/workflows/test.yml"
22
24
  - ".gitignore"
23
25
  - Gemfile
@@ -27,8 +29,8 @@ files:
27
29
  - bin/console
28
30
  - bin/setup
29
31
  - ext/pathname/extconf.rb
30
- - ext/pathname/lib/pathname.rb
31
32
  - ext/pathname/pathname.c
33
+ - lib/pathname.rb
32
34
  - pathname.gemspec
33
35
  homepage: https://github.com/ruby/pathname
34
36
  licenses:
@@ -45,14 +47,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
45
47
  requirements:
46
48
  - - ">="
47
49
  - !ruby/object:Gem::Version
48
- version: 2.3.0
50
+ version: 2.7.0
49
51
  required_rubygems_version: !ruby/object:Gem::Requirement
50
52
  requirements:
51
53
  - - ">="
52
54
  - !ruby/object:Gem::Version
53
55
  version: '0'
54
56
  requirements: []
55
- rubygems_version: 3.2.0.rc.2
57
+ rubygems_version: 3.4.0.dev
56
58
  signing_key:
57
59
  specification_version: 4
58
60
  summary: Representation of the name of a file or directory on the filesystem