tempfile 0.1.2 → 0.2.0

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: 9b8084e7784024b9c63dd21c662696342c2c3d7cc39047bccdefb5ea8a487fa9
4
- data.tar.gz: '09b7e833cf5393f68814b1a0b616e5e1b27ed88eeb59baf92b24eb25c09d3128'
3
+ metadata.gz: 441e2cb96bc4f1d0c808dbde645e2985849607d7edd297b2e26fa427094eaa59
4
+ data.tar.gz: fcaf9af92f27ac9c91877ae3542dcada76e95e4c31196fbf01fa7a6213d47fea
5
5
  SHA512:
6
- metadata.gz: 6af21a139b69773da702d514009c82eebf573cfb9cd2ccea99316098e76208f6ba838ac9cdacaa8a508f0ceb75311ec2b437a5576228ed74ed3041cfbadd14d3
7
- data.tar.gz: a4a7f9e10aa3a8b4879d6a3cdd6f39f8a071e4c7e94b5249167b6ee32d481b69c8b633229c562cd33aa33758b5c50a7a13e9efb08cfd3018fff06ebfc6f9f88d
6
+ metadata.gz: 664dd5cdf708cf51e87f1ed8b375bf754c48dfecac717c119cfff8298018132762a4debc1b65d420128071ef6db28f893e589a5f0dc6a5e13738afc167c7436b
7
+ data.tar.gz: 4237b4700b4a8d365931e286e1e199a79c362f70ce9349d1c19bc43fb2a78f461b384e4ba1e49c7ca8967d0ae474865018c45481c8813d979bf63a47561cd2bf
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: 'github-actions'
4
+ directory: '/'
5
+ schedule:
6
+ interval: 'weekly'
@@ -3,15 +3,21 @@ name: ubuntu
3
3
  on: [push, pull_request]
4
4
 
5
5
  jobs:
6
- build:
6
+ ruby-versions:
7
+ uses: ruby/actions/.github/workflows/ruby_versions.yml@master
8
+ with:
9
+ engine: cruby
10
+ min_version: 2.5
11
+ test:
12
+ needs: ruby-versions
7
13
  name: build (${{ matrix.ruby }} / ${{ matrix.os }})
8
14
  strategy:
9
15
  matrix:
10
- ruby: [ 2.7, 2.6, 2.5, head ]
11
- os: [ ubuntu-latest, macos-latest ]
16
+ ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
17
+ os: [ ubuntu-latest, macos-latest, windows-latest ]
12
18
  runs-on: ${{ matrix.os }}
13
19
  steps:
14
- - uses: actions/checkout@v2
20
+ - uses: actions/checkout@v4
15
21
  - name: Set up Ruby
16
22
  uses: ruby/setup-ruby@v1
17
23
  with:
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ gemspec
4
4
 
5
5
  gem "rake"
6
6
  gem "test-unit"
7
+ gem "test-unit-ruby-core"
data/Rakefile CHANGED
@@ -7,11 +7,4 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.test_files = FileList["test/**/test_*.rb"]
8
8
  end
9
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
-
17
10
  task :default => :test
data/lib/tempfile.rb CHANGED
@@ -57,7 +57,7 @@ require 'tmpdir'
57
57
  # Note that Tempfile.create returns a File instance instead of a Tempfile, which
58
58
  # also avoids the overhead and complications of delegation.
59
59
  #
60
- # Tempfile.open('foo') do |file|
60
+ # Tempfile.create('foo') do |file|
61
61
  # # ...do something with file...
62
62
  # end
63
63
  #
@@ -87,50 +87,66 @@ require 'tmpdir'
87
87
  # same Tempfile object from multiple threads then you should protect it with a
88
88
  # mutex.
89
89
  class Tempfile < DelegateClass(File)
90
- # Creates a temporary file with permissions 0600 (= only readable and
91
- # writable by the owner) and opens it with mode "w+".
90
+
91
+ VERSION = "0.2.0"
92
+
93
+ # Creates a file in the underlying file system;
94
+ # returns a new \Tempfile object based on that file.
95
+ #
96
+ # If possible, consider instead using Tempfile.create, which:
97
+ #
98
+ # - Avoids the performance cost of delegation,
99
+ # incurred when Tempfile.new calls its superclass <tt>DelegateClass(File)</tt>.
100
+ # - Does not rely on a finalizer to close and unlink the file,
101
+ # which can be unreliable.
102
+ #
103
+ # Creates and returns file whose:
104
+ #
105
+ # - Class is \Tempfile (not \File, as in Tempfile.create).
106
+ # - Directory is the system temporary directory (system-dependent).
107
+ # - Generated filename is unique in that directory.
108
+ # - Permissions are <tt>0600</tt>;
109
+ # see {File Permissions}[https://docs.ruby-lang.org/en/master/File.html#label-File+Permissions].
110
+ # - Mode is <tt>'w+'</tt> (read/write mode, positioned at the end).
92
111
  #
93
- # It is recommended to use Tempfile.create { ... } instead when possible,
94
- # because that method avoids the cost of delegation and does not rely on a
95
- # finalizer to close and unlink the file, which is unreliable.
112
+ # The underlying file is removed when the \Tempfile object dies
113
+ # and is reclaimed by the garbage collector.
96
114
  #
97
- # The +basename+ parameter is used to determine the name of the
98
- # temporary file. You can either pass a String or an Array with
99
- # 2 String elements. In the former form, the temporary file's base
100
- # name will begin with the given string. In the latter form,
101
- # the temporary file's base name will begin with the array's first
102
- # element, and end with the second element. For example:
115
+ # Example:
103
116
  #
104
- # file = Tempfile.new('hello')
105
- # file.path # => something like: "/tmp/hello2843-8392-92849382--0"
117
+ # f = Tempfile.new # => #<Tempfile:/tmp/20220505-17839-1s0kt30>
118
+ # f.class # => Tempfile
119
+ # f.path # => "/tmp/20220505-17839-1s0kt30"
120
+ # f.stat.mode.to_s(8) # => "100600"
121
+ # File.exist?(f.path) # => true
122
+ # File.unlink(f.path) #
123
+ # File.exist?(f.path) # => false
106
124
  #
107
- # # Use the Array form to enforce an extension in the filename:
108
- # file = Tempfile.new(['hello', '.jpg'])
109
- # file.path # => something like: "/tmp/hello2843-8392-92849382--0.jpg"
125
+ # Argument +basename+, if given, may be one of:
110
126
  #
111
- # The temporary file will be placed in the directory as specified
112
- # by the +tmpdir+ parameter. By default, this is +Dir.tmpdir+.
127
+ # - A string: the generated filename begins with +basename+:
113
128
  #
114
- # file = Tempfile.new('hello', '/home/aisaka')
115
- # file.path # => something like: "/home/aisaka/hello2843-8392-92849382--0"
129
+ # Tempfile.new('foo') # => #<Tempfile:/tmp/foo20220505-17839-1whk2f>
116
130
  #
117
- # You can also pass an options hash. Under the hood, Tempfile creates
118
- # the temporary file using +File.open+. These options will be passed to
119
- # +File.open+. This is mostly useful for specifying encoding
120
- # options, e.g.:
131
+ # - An array of two strings <tt>[prefix, suffix]</tt>:
132
+ # the generated filename begins with +prefix+ and ends with +suffix+:
121
133
  #
122
- # Tempfile.new('hello', '/home/aisaka', encoding: 'ascii-8bit')
134
+ # Tempfile.new(%w/foo .jpg/) # => #<Tempfile:/tmp/foo20220505-17839-58xtfi.jpg>
123
135
  #
124
- # # You can also omit the 'tmpdir' parameter:
125
- # Tempfile.new('hello', encoding: 'ascii-8bit')
136
+ # With arguments +basename+ and +tmpdir+, the file is created in directory +tmpdir+:
126
137
  #
127
- # Note: +mode+ keyword argument, as accepted by Tempfile, can only be
128
- # numeric, combination of the modes defined in File::Constants.
138
+ # Tempfile.new('foo', '.') # => #<Tempfile:./foo20220505-17839-xfstr8>
129
139
  #
130
- # === Exceptions
140
+ # Keyword arguments +mode+ and +options+ are passed directly to method
141
+ # {File.open}[https://docs.ruby-lang.org/en/master/File.html#method-c-open]:
142
+ #
143
+ # - The value given with +mode+ must be an integer,
144
+ # and may be expressed as the logical OR of constants defined in
145
+ # {File::Constants}[https://docs.ruby-lang.org/en/master/File/Constants.html].
146
+ # - For +options+, see {Open Options}[https://docs.ruby-lang.org/en/master/IO.html#class-IO-label-Open+Options].
147
+ #
148
+ # Related: Tempfile.create.
131
149
  #
132
- # If Tempfile.new cannot find a unique filename within a limited
133
- # number of tries, then it will raise an exception.
134
150
  def initialize(basename="", tmpdir=nil, mode: 0, **options)
135
151
  warn "Tempfile.new doesn't call the given block.", uplevel: 1 if block_given?
136
152
 
@@ -325,26 +341,61 @@ class Tempfile < DelegateClass(File)
325
341
  end
326
342
  end
327
343
 
328
- # Creates a temporary file as a usual File object (not a Tempfile).
329
- # It does not use finalizer and delegation, which makes it more efficient and reliable.
344
+ # Creates a file in the underlying file system;
345
+ # returns a new \File object based on that file.
330
346
  #
331
- # If no block is given, this is similar to Tempfile.new except
332
- # creating File instead of Tempfile. In that case, the created file is
333
- # not removed automatically. You should use File.unlink to remove it.
347
+ # With no block given and no arguments, creates and returns file whose:
334
348
  #
335
- # If a block is given, then a File object will be constructed,
336
- # and the block is invoked with the object as the argument.
337
- # The File object will be automatically closed and
338
- # the temporary file is removed after the block terminates,
339
- # releasing all resources that the block created.
340
- # The call returns the value of the block.
349
+ # - Class is {File}[https://docs.ruby-lang.org/en/master/File.html] (not \Tempfile).
350
+ # - Directory is the system temporary directory (system-dependent).
351
+ # - Generated filename is unique in that directory.
352
+ # - Permissions are <tt>0600</tt>;
353
+ # see {File Permissions}[https://docs.ruby-lang.org/en/master/File.html#label-File+Permissions].
354
+ # - Mode is <tt>'w+'</tt> (read/write mode, positioned at the end).
341
355
  #
342
- # In any case, all arguments (+basename+, +tmpdir+, +mode+, and
343
- # <code>**options</code>) will be treated the same as for Tempfile.new.
356
+ # With no block, the file is not removed automatically,
357
+ # and so should be explicitly removed.
344
358
  #
345
- # Tempfile.create('foo', '/home/temp') do |f|
346
- # # ... do something with f ...
347
- # end
359
+ # Example:
360
+ #
361
+ # f = Tempfile.create # => #<File:/tmp/20220505-9795-17ky6f6>
362
+ # f.class # => File
363
+ # f.path # => "/tmp/20220505-9795-17ky6f6"
364
+ # f.stat.mode.to_s(8) # => "100600"
365
+ # File.exist?(f.path) # => true
366
+ # File.unlink(f.path)
367
+ # File.exist?(f.path) # => false
368
+ #
369
+ # Argument +basename+, if given, may be one of:
370
+ #
371
+ # - A string: the generated filename begins with +basename+:
372
+ #
373
+ # Tempfile.create('foo') # => #<File:/tmp/foo20220505-9795-1gok8l9>
374
+ #
375
+ # - An array of two strings <tt>[prefix, suffix]</tt>:
376
+ # the generated filename begins with +prefix+ and ends with +suffix+:
377
+ #
378
+ # Tempfile.create(%w/foo .jpg/) # => #<File:/tmp/foo20220505-17839-tnjchh.jpg>
379
+ #
380
+ # With arguments +basename+ and +tmpdir+, the file is created in directory +tmpdir+:
381
+ #
382
+ # Tempfile.create('foo', '.') # => #<File:./foo20220505-9795-1emu6g8>
383
+ #
384
+ # Keyword arguments +mode+ and +options+ are passed directly to method
385
+ # {File.open}[https://docs.ruby-lang.org/en/master/File.html#method-c-open]:
386
+ #
387
+ # - The value given with +mode+ must be an integer,
388
+ # and may be expressed as the logical OR of constants defined in
389
+ # {File::Constants}[https://docs.ruby-lang.org/en/master/File/Constants.html].
390
+ # - For +options+, see {Open Options}[https://docs.ruby-lang.org/en/master/IO.html#class-IO-label-Open+Options].
391
+ #
392
+ # With a block given, creates the file as above, passes it to the block,
393
+ # and returns the block's value;
394
+ # before the return, the file object is closed and the underlying file is removed:
395
+ #
396
+ # Tempfile.create {|file| file.path } # => "/tmp/20220505-9795-rkists"
397
+ #
398
+ # Related: Tempfile.new.
348
399
  #
349
400
  def Tempfile.create(basename="", tmpdir=nil, mode: 0, **options)
350
401
  tmpfile = nil
data/tempfile.gemspec CHANGED
@@ -1,6 +1,13 @@
1
+ name = File.basename(__FILE__, ".gemspec")
2
+ version = ["lib", Array.new(name.count("-")+1).join("/")].find do |dir|
3
+ break File.foreach(File.join(__dir__, dir, "#{name.tr('-', '/')}.rb")) do |line|
4
+ /^\s*VERSION\s*=\s*"(.*)"/ =~ line and break $1
5
+ end rescue nil
6
+ end
7
+
1
8
  Gem::Specification.new do |spec|
2
- spec.name = "tempfile"
3
- spec.version = "0.1.2"
9
+ spec.name = name
10
+ spec.version = version
4
11
  spec.authors = ["Yukihiro Matsumoto"]
5
12
  spec.email = ["matz@ruby-lang.org"]
6
13
 
@@ -16,9 +23,7 @@ Gem::Specification.new do |spec|
16
23
  # Specify which files should be added to the gem when it is released.
17
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
25
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
19
- `git ls-files -z 2>/dev/null`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ `git ls-files -z 2>#{IO::NULL}`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
27
  end
21
- spec.bindir = "exe"
22
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
28
  spec.require_paths = ["lib"]
24
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tempfile
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yukihiro Matsumoto
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-19 00:00:00.000000000 Z
11
+ date: 2023-11-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A utility class for managing temporary files.
14
14
  email:
@@ -17,6 +17,7 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
+ - ".github/dependabot.yml"
20
21
  - ".github/workflows/test.yml"
21
22
  - ".gitignore"
22
23
  - Gemfile
@@ -49,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
50
  - !ruby/object:Gem::Version
50
51
  version: '0'
51
52
  requirements: []
52
- rubygems_version: 3.3.0.dev
53
+ rubygems_version: 3.5.0.dev
53
54
  signing_key:
54
55
  specification_version: 4
55
56
  summary: A utility class for managing temporary files.