file-temp 1.2.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
metadata CHANGED
@@ -1,55 +1,82 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: file-temp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain: []
11
- date: 2014-02-17 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MREwDwYDVQQDDAhkamJl
14
+ cmc5NjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
15
+ MB4XDTE4MDMxODE1MjIwN1oXDTI4MDMxNTE1MjIwN1owPzERMA8GA1UEAwwIZGpi
16
+ ZXJnOTYxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
17
+ bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALgfaroVM6CI06cxr0/h
18
+ A+j+pc8fgpRgBVmHFaFunq28GPC3IvW7Nvc3Y8SnAW7pP1EQIbhlwRIaQzJ93/yj
19
+ u95KpkP7tA9erypnV7dpzBkzNlX14ACaFD/6pHoXoe2ltBxk3CCyyzx70mTqJpph
20
+ 75IB03ni9a8yqn8pmse+s83bFJOAqddSj009sGPcQO+QOWiNxqYv1n5EHcvj2ebO
21
+ 6hN7YTmhx7aSia4qL/quc4DlIaGMWoAhvML7u1fmo53CYxkKskfN8MOecq2vfEmL
22
+ iLu+SsVVEAufMDDFMXMJlvDsviolUSGMSNRTujkyCcJoXKYYxZSNtIiyd9etI0X3
23
+ ctu0uhrFyrMZXCedutvXNjUolD5r9KGBFSWH1R9u2I3n3SAyFF2yzv/7idQHLJJq
24
+ 74BMnx0FIq6fCpu5slAipvxZ3ZkZpEXZFr3cIBtO1gFvQWW7E/Y3ijliWJS1GQFq
25
+ 058qERadHGu1yu1dojmFRo6W2KZvY9al2yIlbkpDrD5MYQIDAQABo3cwdTAJBgNV
26
+ HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUFZsMapgzJimzsbaBG2Tm8j5e
27
+ AzgwHQYDVR0RBBYwFIESZGpiZXJnOTZAZ21haWwuY29tMB0GA1UdEgQWMBSBEmRq
28
+ YmVyZzk2QGdtYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAW2tnYixXQtKxgGXq
29
+ /3iSWG2bLwvxS4go3srO+aRXZHrFUMlJ5W0mCxl03aazxxKTsVVpZD8QZxvK91OQ
30
+ h9zr9JBYqCLcCVbr8SkmYCi/laxIZxsNE5YI8cC8vvlLI7AMgSfPSnn/Epq1GjGY
31
+ 6L1iRcEDtanGCIvjqlCXO9+BmsnCfEVehqZkQHeYczA03tpOWb6pon2wzvMKSsKH
32
+ ks0ApVdstSLz1kzzAqem/uHdG9FyXdbTAwH1G4ZPv69sQAFAOCgAqYmdnzedsQtE
33
+ 1LQfaQrx0twO+CZJPcRLEESjq8ScQxWRRkfuh2VeR7cEU7L7KqT10mtUwrvw7APf
34
+ DYoeCY9KyjIBjQXfbj2ke5u1hZj94Fsq9FfbEQg8ygCgwThnmkTrrKEiMSs3alYR
35
+ ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
36
+ WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
37
+ -----END CERTIFICATE-----
38
+ date:
12
39
  dependencies:
13
40
  - !ruby/object:Gem::Dependency
14
41
  name: ffi
15
42
  requirement: !ruby/object:Gem::Requirement
16
43
  requirements:
17
- - - '>='
44
+ - - "~>"
18
45
  - !ruby/object:Gem::Version
19
- version: 1.0.0
46
+ version: '1.1'
20
47
  type: :runtime
21
48
  prerelease: false
22
49
  version_requirements: !ruby/object:Gem::Requirement
23
50
  requirements:
24
- - - '>='
51
+ - - "~>"
25
52
  - !ruby/object:Gem::Version
26
- version: 1.0.0
53
+ version: '1.1'
27
54
  - !ruby/object:Gem::Dependency
28
- name: test-unit
55
+ name: rspec
29
56
  requirement: !ruby/object:Gem::Requirement
30
57
  requirements:
31
- - - '>='
58
+ - - "~>"
32
59
  - !ruby/object:Gem::Version
33
- version: '0'
60
+ version: '3.9'
34
61
  type: :development
35
62
  prerelease: false
36
63
  version_requirements: !ruby/object:Gem::Requirement
37
64
  requirements:
38
- - - '>='
65
+ - - "~>"
39
66
  - !ruby/object:Gem::Version
40
- version: '0'
67
+ version: '3.9'
41
68
  - !ruby/object:Gem::Dependency
42
69
  name: rake
43
70
  requirement: !ruby/object:Gem::Requirement
44
71
  requirements:
45
- - - '>='
72
+ - - ">="
46
73
  - !ruby/object:Gem::Version
47
74
  version: '0'
48
75
  type: :development
49
76
  prerelease: false
50
77
  version_requirements: !ruby/object:Gem::Requirement
51
78
  requirements:
52
- - - '>='
79
+ - - ">="
53
80
  - !ruby/object:Gem::Version
54
81
  version: '0'
55
82
  description: |2
@@ -60,42 +87,58 @@ email: djberg96@gmail.com
60
87
  executables: []
61
88
  extensions: []
62
89
  extra_rdoc_files:
63
- - CHANGES
64
- - README
65
- - MANIFEST
90
+ - CHANGES.rdoc
91
+ - README.rdoc
92
+ - MANIFEST.rdoc
66
93
  files:
67
- - CHANGES
68
- - MANIFEST
69
- - README
70
- - Rakefile
94
+ - LICENSE
71
95
  - file-temp.gemspec
96
+ - spec
97
+ - spec/file_temp_spec.rb
98
+ - Rakefile
99
+ - certs
100
+ - certs/djberg96_pub.pem
101
+ - lib
102
+ - lib/file-temp.rb
103
+ - lib/file
72
104
  - lib/file/temp.rb
73
- - lib/file/temp_c.rb
74
- - lib/file/temp_java.rb
75
- - test/test_file_temp.rb
105
+ - lib/file/java
106
+ - lib/file/java/temp.rb
107
+ - lib/file/unix
108
+ - lib/file/unix/temp.rb
109
+ - lib/file/windows
110
+ - lib/file/windows/temp.rb
111
+ - CHANGES.rdoc
112
+ - MANIFEST.rdoc
113
+ - README.rdoc
76
114
  homepage: http://github.com/djberg96/file-temp
77
115
  licenses:
78
- - Artistic 2.0
79
- metadata: {}
116
+ - Apache-2.0
117
+ metadata:
118
+ homepage_uri: https://github.com/djberg96/file-temp
119
+ bug_tracker_uri: https://github.com/djberg96/file-temp/issues
120
+ changelog_uri: https://github.com/djberg96/file-temp/blob/master/CHANGES
121
+ documentation_uri: https://github.com/djberg96/file-temp/wiki
122
+ source_code_uri: https://github.com/djberg96/file-temp
123
+ wiki_uri: https://github.com/djberg96/file-temp/wiki
80
124
  post_install_message:
81
125
  rdoc_options: []
82
126
  require_paths:
83
127
  - lib
84
128
  required_ruby_version: !ruby/object:Gem::Requirement
85
129
  requirements:
86
- - - '>='
130
+ - - ">="
87
131
  - !ruby/object:Gem::Version
88
- version: 1.8.6
132
+ version: '0'
89
133
  required_rubygems_version: !ruby/object:Gem::Requirement
90
134
  requirements:
91
- - - '>='
135
+ - - ">="
92
136
  - !ruby/object:Gem::Version
93
137
  version: '0'
94
138
  requirements: []
95
- rubyforge_project: shards
96
- rubygems_version: 2.2.2
139
+ rubygems_version: 3.0.3
97
140
  signing_key:
98
141
  specification_version: 4
99
142
  summary: An alternative way to generate temp files
100
143
  test_files:
101
- - test/test_file_temp.rb
144
+ - spec/file_temp_spec.rb
Binary file
data/MANIFEST DELETED
@@ -1,9 +0,0 @@
1
- * CHANGES
2
- * MANIFEST
3
- * README
4
- * Rakefile
5
- * file-temp.gemspec
6
- * lib/file/temp.rb
7
- * lib/file/temp_c.rb
8
- * lib/file/temp_java.rb
9
- * test/test_file_temp.rb
data/README DELETED
@@ -1,61 +0,0 @@
1
- == Description
2
- The file-temp library is an alternate way to handle tempfile generation.
3
-
4
- == Requirements
5
- ffi 1.0.0 or later
6
-
7
- == Installation
8
- gem install file-temp
9
-
10
- == Synopsis
11
- require 'file/temp'
12
-
13
- fh = File::Temp.new
14
- fh.puts "hello"
15
- fh.close # => Tempfile automatically deleted
16
-
17
- fh = File::Temp.new(false)
18
- fh.puts "world"
19
- fh.close # => Tempfile still on your filesystem
20
-
21
- == Motivation
22
- Ruby's tempfile.rb is overwrought and susceptible to race conditions.
23
- This library uses your system's native tmpfile() or mkstemp() functions
24
- instead of trying to handle race conditions manually via pure Ruby.
25
-
26
- This library is also more secure because it restricts file permission via
27
- umask() for files created with mkstemp().
28
-
29
- Finally, this library subclasses the File class. This means you get almost
30
- exactly the same interface as the File class. The only difference is the
31
- constructor.
32
-
33
- == JRuby
34
- The implementation for JRuby uses the Java API, not the C API. The
35
- temporary file name generated by Java is different than the C version,
36
- since it uses a GUID instead of the 'XXXXXX' template, but the
37
- interface is otherwise identical.
38
-
39
- There is one test failure with JRuby (threaded tempfile creation). I am
40
- not sure why, as sample code seems to work fine. Help wanted.
41
-
42
- == MS Windows
43
- You may need to use the mingw build in order to use this library.
44
-
45
- == License
46
- Artistic 2.0
47
-
48
- == Copyright
49
- (C) 2007-2014 Daniel J. Berger
50
- All Rights Reserved
51
-
52
- == Warranty
53
- This library is provided "as is" and without any express or
54
- implied warranties, including, without limitation, the implied
55
- warranties of merchantability and fitness for a particular purpose.
56
-
57
- == Author
58
- Daniel J. Berger
59
-
60
- == See also
61
- tmpfile(), mkstemp(), tmpnam()
@@ -1,254 +0,0 @@
1
- require 'ffi'
2
- require 'tmpdir'
3
-
4
- class File::Temp < File
5
- extend FFI::Library
6
- ffi_lib FFI::Library::LIBC
7
-
8
- # :stopdoc:
9
-
10
- private
11
-
12
- if File::ALT_SEPARATOR
13
- attach_function :_close, [:int], :int
14
- attach_function :fclose, [:pointer], :int
15
- attach_function :_fdopen, [:int, :string], :pointer
16
- attach_function :_fileno, [:pointer], :int
17
- attach_function :_get_errno, [:pointer], :int
18
- attach_function :_open, [:string, :int, :int], :int
19
- attach_function :_open_osfhandle, [:long, :int], :int
20
- attach_function :tmpnam_s, [:pointer, :size_t], :int
21
- attach_function :mktemp_s, :_mktemp_s, [:pointer, :size_t], :int
22
-
23
- private_class_method :_close, :_fdopen, :_get_errno, :_open
24
- private_class_method :_open_osfhandle, :mktemp_s, :tmpnam_s
25
-
26
- ffi_lib :kernel32
27
-
28
- attach_function :CloseHandle, [:long], :bool
29
- attach_function :CreateFileW, [:buffer_in, :ulong, :ulong, :pointer, :ulong, :ulong, :ulong], :long
30
- attach_function :DeleteFileW, [:string], :bool
31
- attach_function :GetTempPathW, [:ulong, :buffer_out], :ulong
32
- attach_function :GetTempFileNameW, [:buffer_in, :string, :uint, :buffer_out], :uint
33
-
34
- private_class_method :_close, :_fdopen, :_open, :_open_osfhandle
35
- private_class_method :CloseHandle, :CreateFileW, :DeleteFileW
36
- private_class_method :GetTempPathW, :GetTempFileNameW
37
-
38
- S_IWRITE = 128
39
- S_IREAD = 256
40
- BINARY = 0x8000
41
- SHORT_LIVED = 0x1000
42
- GENERIC_READ = 0x80000000
43
- GENERIC_WRITE = 0x40000000
44
- CREATE_ALWAYS = 2
45
-
46
- FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000
47
- FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000
48
-
49
- FILE_ATTRIBUTE_NORMAL = 0x00000080
50
- FILE_FLAG_DELETE_ON_CLOSE = 0x04000000
51
- INVALID_HANDLE_VALUE = -1
52
- else
53
- attach_function :fclose, [:pointer], :int
54
- attach_function :_fileno, :fileno, [:pointer], :int
55
- attach_function :strerror, [:int], :string
56
- attach_function :tmpfile, [], :pointer
57
- attach_function :tmpnam, [:pointer], :string
58
- attach_function :mktemp, [:pointer], :string
59
-
60
- private_class_method :mktemp, :strerror, :tmpfile, :tmpnam
61
- end
62
-
63
- private_class_method :fclose, :_fileno
64
-
65
- public
66
-
67
- # :startdoc:
68
-
69
- # The version of the file-temp library.
70
- VERSION = '1.2.1'
71
-
72
- # The temporary directory used on MS Windows or Unix.
73
- if File::ALT_SEPARATOR
74
- TMPDIR = ENV['TEMP'] || ENV['TMP'] || ENV['USERPROFILE'] || Dir.tmpdir
75
- else
76
- TMPDIR = ENV['TEMP'] || ENV['TMP'] || ENV['TMPDIR'] || Dir.tmpdir
77
- end
78
-
79
- # The name of the temporary file. Set to nil if the +delete+ option to the
80
- # constructor is true.
81
- attr_reader :path
82
-
83
- # Creates a new, anonymous, temporary file in your File::Temp::TMPDIR
84
- # directory
85
- #
86
- # If the +delete+ option is set to true (the default) then the temporary file
87
- # will be deleted automatically as soon as all references to it are closed.
88
- # Otherwise, the file will live on in your File::Temp::TMPDIR path.
89
- #
90
- # If the +delete+ option is set to false, then the file is not deleted. In
91
- # addition, you can supply a string +template+ that the system replaces with
92
- # a unique filename. This template should end with 3 to 6 'X' characters.
93
- # The default template is 'rb_file_temp_XXXXXX'. In this case the temporary
94
- # file lives in the directory where it was created.
95
- #
96
- # The +template+ argument is ignored if the +delete+ argument is true.
97
- #
98
- # Example:
99
- #
100
- # fh = File::Temp.new(true, 'rb_file_temp_XXXXXX') => file
101
- # fh.puts 'hello world'
102
- # fh.close
103
- #
104
- def initialize(delete = true, template = 'rb_file_temp_XXXXXX')
105
- @fptr = nil
106
-
107
- if delete
108
- @fptr = tmpfile()
109
- fd = _fileno(@fptr)
110
- else
111
- begin
112
- omask = File.umask(077)
113
-
114
- ptr = FFI::MemoryPointer.from_string(template)
115
-
116
- if File::ALT_SEPARATOR
117
- errno = mktemp_s(ptr, ptr.size)
118
-
119
- raise SystemCallError.new('mktemp_s', errno) if errno != 0
120
- else
121
- str = mktemp(ptr)
122
-
123
- if str.nil? || str.empty?
124
- raise SystemCallError.new('mktemp', FFI.errno)
125
- end
126
- end
127
-
128
- @path = File.join(TMPDIR, ptr.read_string)
129
- @path.tr!(File::SEPARATOR, File::ALT_SEPARATOR) if File::ALT_SEPARATOR
130
- ensure
131
- File.umask(omask)
132
- end
133
- end
134
-
135
- if delete
136
- super(fd, 'wb+')
137
- else
138
- super(@path, 'wb+')
139
- end
140
- end
141
-
142
- # The close method was overridden to ensure the internal file pointer we
143
- # created in the constructor is closed. It is otherwise identical to the
144
- # File#close method.
145
- #
146
- def close
147
- super
148
- fclose(@fptr) if @fptr
149
- end
150
-
151
- # Generates a unique file name.
152
- #
153
- # Note that a file is not actually generated on the filesystem.
154
- #--
155
- # NOTE: One quirk of the Windows function is that, after the first call, it
156
- # adds a file extension of sequential numbers in base 32, e.g. .1-.1vvvvvu.
157
- #
158
- def self.temp_name
159
- if File::ALT_SEPARATOR
160
- ptr = FFI::MemoryPointer.new(:char, 1024)
161
- errno = tmpnam_s(ptr, ptr.size)
162
-
163
- raise SystemCallError.new('tmpnam_s', errno) if errno != 0
164
-
165
- TMPDIR + ptr.read_string + 'tmp'
166
- else
167
- tmpnam(nil) << '.tmp'
168
- end
169
- end
170
-
171
- private
172
-
173
- # For those times when we want the posix errno rather than a formatted string.
174
- # This is necessary because FFI.errno appears to be using GetLastError() which
175
- # does not always match what _get_errno() returns.
176
- #
177
- def get_posix_errno
178
- if File::ALT_SEPARATOR
179
- ptr = FFI::MemoryPointer.new(:int)
180
- _get_errno(ptr)
181
- ptr.read_int
182
- else
183
- FFI.errno
184
- end
185
- end
186
-
187
- if File::ALT_SEPARATOR
188
- # Simple wrapper around the GetTempPath function.
189
- #
190
- def get_temp_path
191
- buf = 0.chr * 1024
192
- buf.encode!("UTF-16LE")
193
-
194
- if GetTempPathW(buf.size, buf) == 0
195
- raise SystemCallError, FFI.errno, 'GetTempPathW'
196
- end
197
-
198
- buf.strip.chop # remove trailing slash
199
- end
200
-
201
- # The version of tmpfile() implemented by Microsoft is unacceptable.
202
- # It attempts to write to C:\ (root) instead of a temporary directory.
203
- # This is not only bad behavior, it won't work on Windows 7 and later
204
- # without admin rights due to security restrictions.
205
- #
206
- # This is a custom implementation based on some code from the Cairo
207
- # project.
208
- #
209
- def tmpfile
210
- file_name = get_temp_path()
211
- buf = 0.chr * 1024
212
- buf.encode!("UTF-16LE")
213
-
214
- if GetTempFileNameW(file_name, 'rb_', 0, buf) == 0
215
- raise SystemCallError, FFI.errno, 'GetTempFileNameW'
216
- end
217
-
218
- file_name = buf.strip
219
-
220
- handle = CreateFileW(
221
- file_name,
222
- GENERIC_READ | GENERIC_WRITE,
223
- 0,
224
- nil,
225
- CREATE_ALWAYS,
226
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE,
227
- 0
228
- )
229
-
230
- if handle == INVALID_HANDLE_VALUE
231
- error = FFI.errno
232
- DeleteFileW(file_name)
233
- raise SystemCallError.new('CreateFileW', error)
234
- end
235
-
236
- fd = _open_osfhandle(handle, 0)
237
-
238
- if fd < 0
239
- CloseHandle(handle)
240
- raise SystemCallError, get_posix_errno, '_open_osfhandle'
241
- end
242
-
243
- fp = _fdopen(fd, 'w+b')
244
-
245
- if fp.nil?
246
- _close(fd)
247
- CloseHandle(handle)
248
- raise SystemCallError, get_posix_errno, 'fdopen'
249
- end
250
-
251
- fp
252
- end
253
- end
254
- end