win32-nio 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +7 -1
- data/README +44 -41
- data/Rakefile +20 -10
- data/lib/win32/nio.rb +202 -183
- data/win32-nio.gemspec +22 -24
- metadata +37 -18
data/CHANGES
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
+
== 0.0.3 - 24-Apr-2010
|
2
|
+
* Removed inline gem building from the gemspec. That's now handled by a
|
3
|
+
Rakefile task.
|
4
|
+
* Rafactored the Rakefile, removed an old install task and added new
|
5
|
+
gem tasks.
|
6
|
+
|
1
7
|
== 0.0.2 - 6-Aug-2009
|
2
8
|
* License changed to Artistic 2.0.
|
3
9
|
* Some gemspec updates, including adding win32-event as a dependency and
|
4
10
|
test-unit as a development dependency.
|
5
11
|
|
6
12
|
== 0.0.1 - 28-Nov-2008
|
7
|
-
* Initial release
|
13
|
+
* Initial release
|
data/README
CHANGED
@@ -2,69 +2,72 @@
|
|
2
2
|
Native IO for Windows. This class matches and extends the current Ruby
|
3
3
|
IO class API, using native Windows functions underneath the hood.
|
4
4
|
|
5
|
+
= Installation
|
6
|
+
gem install win32-nio
|
7
|
+
|
5
8
|
= Synopsis
|
6
|
-
|
7
|
-
|
9
|
+
require 'win32/nio'
|
10
|
+
include Win32
|
8
11
|
|
9
|
-
|
12
|
+
p NIO.read('some_file.text')
|
10
13
|
|
11
|
-
|
14
|
+
p NIO.readlines('some_file.txt')
|
12
15
|
|
13
16
|
= Proof of Concept
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
This code is ALPHA!
|
18
|
+
|
19
|
+
This code is mostly a proof of concept to see how to implement Ruby's
|
20
|
+
IO functions in pure Windows functions. While it does offer a couple of
|
21
|
+
features over and above Ruby's IO interface, such as the ability to supply
|
22
|
+
an event or a block to the NIO.read method, it offers little practical
|
23
|
+
advantage at the moment.
|
21
24
|
|
22
|
-
|
23
|
-
|
25
|
+
In addition, it is currently using pure Ruby (via win32-api), which means
|
26
|
+
it isn't optimized for speed.
|
24
27
|
|
25
28
|
= Benchmarks
|
26
29
|
|
27
|
-
|
28
|
-
|
30
|
+
Using my HP Windows XP Pro laptop, with a 1.66 core duo Pentium T5500 and
|
31
|
+
2gb of RAM, I saw these results, which were typical in repeated runs:
|
29
32
|
|
30
33
|
user system total real
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
34
|
+
IO.read(small) 0.016000 0.047000 0.063000 ( 0.063000)
|
35
|
+
NIO.read(small) 0.109000 0.000000 0.109000 ( 0.109000)
|
36
|
+
IO.read(medium) 0.422000 0.094000 0.516000 ( 0.532000)
|
37
|
+
NIO.read(medium) 0.937000 0.062000 0.999000 ( 1.047000)
|
38
|
+
IO.read(large) 3.282000 1.063000 4.345000 ( 4.468000)
|
39
|
+
NIO.read(large) 8.187000 1.062000 9.249000 ( 9.454000)
|
40
|
+
IO.readlines(small) 0.156000 0.063000 0.219000 ( 0.234000)
|
41
|
+
NIO.readlines(small) 0.141000 0.000000 0.141000 ( 0.797000)
|
42
|
+
IO.readlines(medium) 2.984000 0.250000 3.234000 ( 3.625000)
|
43
|
+
NIO.readlines(medium) 1.172000 0.062000 1.234000 ( 3.406000)
|
44
|
+
IO.readlines(large) 18.625000 2.281000 20.906000 ( 21.532000)
|
45
|
+
NIO.readlines(large) 12.406000 0.563000 12.969000 (122.643000)
|
43
46
|
|
44
|
-
|
45
|
-
|
47
|
+
Note that, in most cases, the user and system time has decreased, but
|
48
|
+
the real time has increased.
|
46
49
|
|
47
50
|
= Known Bugs
|
48
|
-
|
49
|
-
|
51
|
+
None that I know of. Please log any other bug reports on the RubyForge
|
52
|
+
project page at http://www.rubyforge.net/projects/win32utils
|
50
53
|
|
51
54
|
= Future Plans
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
+
The pure Ruby code is really only meant for prototyping. The eventual
|
56
|
+
plan is to convert the Ruby code to equivalent C code in order to improve
|
57
|
+
performance.
|
55
58
|
|
56
59
|
= License
|
57
|
-
|
60
|
+
Artistic 2.0
|
58
61
|
|
59
62
|
= Copyright
|
60
|
-
|
63
|
+
(C) 2008-2010 Daniel J. Berger, All Rights Reserved
|
61
64
|
|
62
65
|
= Warranty
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
+
This package is provided "as is" and without any express or
|
67
|
+
implied warranties, including, without limitation, the implied
|
68
|
+
warranties of merchantability and fitness for a particular purpose.
|
66
69
|
|
67
70
|
= Author(s)
|
68
|
-
|
69
|
-
|
71
|
+
Daniel Berger
|
72
|
+
Park Heesob
|
70
73
|
|
data/Rakefile
CHANGED
@@ -3,21 +3,31 @@ require 'rake/testtask'
|
|
3
3
|
require 'rbconfig'
|
4
4
|
include Config
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
namespace 'gem' do
|
7
|
+
desc 'Remove any .gem files from the project.'
|
8
|
+
task :clean do
|
9
|
+
Dir['*.gem'].each{ |f| File.delete(f) }
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
desc 'Create the win32-nio gem'
|
13
|
+
task :create => [:clean] do
|
14
|
+
spec = eval(IO.read('win32-nio.gemspec'))
|
15
|
+
Gem::Builder.new(spec).build
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Install the win32-nio gem'
|
19
|
+
task :install => [:create] do
|
20
|
+
file = Dir['*.gem'].first
|
21
|
+
sh "gem install #{file}"
|
22
|
+
end
|
14
23
|
end
|
15
24
|
|
16
25
|
desc 'Run the benchmark suite'
|
17
26
|
task :bench do
|
18
|
-
|
27
|
+
sh "ruby -Ilib benchmarks/win32_nio_benchmarks.rb"
|
28
|
+
end
|
19
29
|
|
20
30
|
Rake::TestTask.new do |t|
|
21
|
-
|
22
|
-
|
31
|
+
t.verbose = true
|
32
|
+
t.warning = true
|
23
33
|
end
|
data/lib/win32/nio.rb
CHANGED
@@ -13,206 +13,225 @@ require 'win32/event'
|
|
13
13
|
# The Win32 module serves as a namespace only.
|
14
14
|
module Win32
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
16
|
+
# The NIO class encapsulates the native IO methods for MS Windows.
|
17
|
+
class NIO
|
18
|
+
include Windows::File
|
19
|
+
include Windows::Handle
|
20
|
+
include Windows::Error
|
21
|
+
include Windows::Synchronize
|
22
|
+
include Windows::MSVCRT::IO
|
23
|
+
include Windows::MSVCRT::Buffer
|
24
|
+
include Windows::SystemInfo
|
25
|
+
include Windows::Memory
|
26
|
+
include Windows::NIO
|
27
|
+
include Windows::Thread
|
28
|
+
|
29
|
+
extend Windows::File
|
30
|
+
extend Windows::Handle
|
31
|
+
extend Windows::Error
|
32
|
+
extend Windows::Synchronize
|
33
|
+
extend Windows::MSVCRT::IO
|
34
|
+
extend Windows::MSVCRT::Buffer
|
35
|
+
extend Windows::SystemInfo
|
36
|
+
extend Windows::Memory
|
37
|
+
extend Windows::NIO
|
38
|
+
extend Windows::Thread
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
40
|
+
# The version of the win32-nio library
|
41
|
+
VERSION = '0.0.2'
|
42
|
+
|
43
|
+
# Error typically raised if any of the native functions fail.
|
44
|
+
class Error < StandardError; end
|
45
|
+
|
46
|
+
# This method is similar to Ruby's IO.read method except that, in
|
47
|
+
# addition to using native function calls, it accepts an optional +event+
|
48
|
+
# argument for the fourth argument, which must be an instance of
|
49
|
+
# Win32::Event (if provided). The event is automatically set to a
|
50
|
+
# signaled state when the read operation completes.
|
51
|
+
#
|
52
|
+
# If a block is provided, then it is treated as a callback that fires
|
53
|
+
# when the read operation is complete.
|
54
|
+
#
|
55
|
+
# Examples:
|
56
|
+
#
|
57
|
+
# # Read everything
|
58
|
+
# Win32::NIO.read(file)
|
59
|
+
#
|
60
|
+
# # Read the first 100 bytes
|
61
|
+
# Win32::NIO.read(file, 100)
|
62
|
+
#
|
63
|
+
# # Read 50 bytes starting at offset 10
|
64
|
+
# Win32::NIO.read(file, 50, 10)
|
65
|
+
#
|
66
|
+
# # Read 25 bytes, starting at offset 5, and print "Done!" when finished.
|
67
|
+
# Win32::NIO.read(file, 25, 5){ puts "Done!" }
|
68
|
+
#
|
69
|
+
# # Attach an event that fires when finished.
|
70
|
+
# require 'win32/event'
|
71
|
+
# event = Win32::Event.new{ puts "Finished!" }
|
72
|
+
# Win32::NIO.read(file, nil, nil, event)
|
73
|
+
#
|
74
|
+
def self.read(port_name, length=nil, offset=0, event=nil, &block)
|
75
|
+
if length
|
76
|
+
raise TypeError unless length.is_a?(Fixnum)
|
77
|
+
raise ArgumentError if length < 0
|
78
|
+
end
|
79
|
+
|
80
|
+
if offset
|
81
|
+
raise TypeError unless offset.is_a?(Fixnum)
|
82
|
+
raise ArgumentError if offset < 0
|
83
|
+
end
|
84
|
+
|
85
|
+
if event
|
86
|
+
raise TypeError unless event.is_a?(Win32::Event)
|
87
|
+
end
|
88
|
+
|
89
|
+
flags = FILE_FLAG_SEQUENTIAL_SCAN
|
90
|
+
|
91
|
+
overlapped = 0.chr * 20 # sizeof(OVERLAPPED)
|
92
|
+
overlapped[8,4] = [offset].pack('L') # OVERLAPPED.Offset
|
93
|
+
|
94
|
+
if offset > 0 || event
|
95
|
+
flags |= FILE_FLAG_OVERLAPPED
|
96
|
+
overlapped[16,4] = [event.handle].pack('L') if event
|
97
|
+
end
|
98
|
+
|
99
|
+
handle = CreateFile(
|
100
|
+
port_name,
|
101
|
+
FILE_READ_DATA,
|
102
|
+
FILE_SHARE_READ,
|
103
|
+
0,
|
104
|
+
OPEN_EXISTING,
|
105
|
+
flags,
|
106
|
+
0
|
107
|
+
)
|
108
|
+
|
109
|
+
if handle == INVALID_HANDLE_VALUE
|
110
|
+
raise Error, get_last_error
|
111
|
+
end
|
93
112
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
+
# Ruby's File.size is broken, so we implement it here. Also, if an
|
114
|
+
# offset is provided, we can reduce the size to only what we need.
|
115
|
+
if length.nil?
|
116
|
+
size = [0].pack('Q')
|
117
|
+
GetFileSizeEx(handle, size)
|
118
|
+
length = size.unpack('Q').first
|
119
|
+
length -= offset if offset
|
120
|
+
end
|
121
|
+
|
122
|
+
buf = 0.chr * length
|
123
|
+
|
124
|
+
begin
|
125
|
+
if block_given?
|
126
|
+
callback = Win32::API::Callback.new('LLP', 'V'){ block.call }
|
127
|
+
bool = ReadFileEx(handle, buf, length, overlapped, callback)
|
128
|
+
else
|
129
|
+
bytes = [0].pack('L')
|
130
|
+
bool = ReadFile(handle, buf, length, bytes, overlapped)
|
131
|
+
end
|
113
132
|
|
114
|
-
|
133
|
+
errno = GetLastError()
|
115
134
|
|
116
|
-
|
135
|
+
SleepEx(1, true) # Must be in alertable wait state
|
117
136
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
end
|
123
|
-
else
|
124
|
-
raise Error, errno
|
125
|
-
end
|
137
|
+
unless bool
|
138
|
+
if errno = ERROR_IO_PENDING
|
139
|
+
unless GetOverlappedResult(handle, overlapped, bytes, true)
|
140
|
+
raise Error, get_last_error
|
126
141
|
end
|
142
|
+
else
|
143
|
+
raise Error, errno
|
144
|
+
end
|
145
|
+
end
|
127
146
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
end
|
132
|
-
|
133
|
-
buf[0, length]
|
147
|
+
event.wait if event
|
148
|
+
ensure
|
149
|
+
CloseHandle(handle)
|
134
150
|
end
|
135
|
-
|
136
|
-
# Reads the entire file specified by portname as individual lines, and
|
137
|
-
# returns those lines in an array. Lines are separated by +sep+.
|
138
|
-
#--
|
139
|
-
# The semantics are the same as the MRI version but the implementation
|
140
|
-
# is drastically different. We use a scattered IO read.
|
141
|
-
#
|
142
|
-
def self.readlines(file, sep = "\r\n")
|
143
|
-
handle = CreateFile(
|
144
|
-
file,
|
145
|
-
GENERIC_READ,
|
146
|
-
FILE_SHARE_READ,
|
147
|
-
nil,
|
148
|
-
OPEN_EXISTING,
|
149
|
-
FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING,
|
150
|
-
nil
|
151
|
-
)
|
152
151
|
|
153
|
-
|
154
|
-
|
155
|
-
|
152
|
+
buf[0, length]
|
153
|
+
end
|
154
|
+
|
155
|
+
# Reads the entire file specified by portname as individual lines, and
|
156
|
+
# returns those lines in an array. Lines are separated by +sep+.
|
157
|
+
#--
|
158
|
+
# The semantics are the same as the MRI version but the implementation
|
159
|
+
# is drastically different. We use a scattered IO read.
|
160
|
+
#
|
161
|
+
def self.readlines(file, sep = "\r\n")
|
162
|
+
handle = CreateFile(
|
163
|
+
file,
|
164
|
+
GENERIC_READ,
|
165
|
+
FILE_SHARE_READ,
|
166
|
+
nil,
|
167
|
+
OPEN_EXISTING,
|
168
|
+
FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING,
|
169
|
+
nil
|
170
|
+
)
|
156
171
|
|
157
|
-
|
158
|
-
|
172
|
+
if handle == INVALID_HANDLE_VALUE
|
173
|
+
raise Error, get_last_error
|
174
|
+
end
|
175
|
+
|
176
|
+
sysbuf = 0.chr * 40
|
177
|
+
GetSystemInfo(sysbuf)
|
159
178
|
|
160
|
-
|
161
|
-
|
162
|
-
|
179
|
+
file_size = [0].pack('Q')
|
180
|
+
GetFileSizeEx(handle, file_size)
|
181
|
+
file_size = file_size.unpack('Q')[0]
|
163
182
|
|
164
|
-
|
165
|
-
|
183
|
+
page_size = sysbuf[4,4].unpack('L')[0] # dwPageSize
|
184
|
+
page_num = (file_size.to_f / page_size).ceil
|
166
185
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
186
|
+
begin
|
187
|
+
base_address = VirtualAlloc(
|
188
|
+
nil,
|
189
|
+
page_size * page_num,
|
190
|
+
MEM_COMMIT,
|
191
|
+
PAGE_READWRITE
|
192
|
+
)
|
174
193
|
|
175
|
-
|
194
|
+
buf_list = []
|
176
195
|
|
177
|
-
|
178
|
-
|
179
|
-
|
196
|
+
for i in 0...page_num
|
197
|
+
buf_list.push(base_address + page_size * i)
|
198
|
+
end
|
180
199
|
|
181
|
-
|
182
|
-
|
200
|
+
seg_array = buf_list.pack('Q*') + 0.chr * 8
|
201
|
+
overlapped = 0.chr * 20
|
183
202
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
if sep == ""
|
209
|
-
buffer = buffer.split(/(\r\n){2,}/)
|
210
|
-
buffer.delete("\r\n")
|
211
|
-
else
|
212
|
-
buffer = buffer.split(sep)
|
213
|
-
end
|
203
|
+
bool = ReadFileScatter(
|
204
|
+
handle,
|
205
|
+
seg_array,
|
206
|
+
page_size * page_num,
|
207
|
+
nil,
|
208
|
+
overlapped
|
209
|
+
)
|
210
|
+
|
211
|
+
unless bool
|
212
|
+
error = GetLastError()
|
213
|
+
if error != ERROR_IO_PENDING
|
214
|
+
raise Error, get_last_error(error)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
SleepEx(1, true) unless HasOverlappedIoCompleted(overlapped)
|
219
|
+
|
220
|
+
buffer = 0.chr * file_size
|
221
|
+
memcpy(buffer, buf_list[0], file_size)
|
222
|
+
ensure
|
223
|
+
CloseHandle(handle)
|
224
|
+
VirtualFree(base_address, 0, MEM_RELEASE)
|
225
|
+
end
|
214
226
|
|
215
|
-
|
227
|
+
if sep == ""
|
228
|
+
buffer = buffer.split(/(\r\n){2,}/)
|
229
|
+
buffer.delete("\r\n")
|
230
|
+
else
|
231
|
+
buffer = buffer.split(sep)
|
216
232
|
end
|
217
|
-
|
233
|
+
|
234
|
+
buffer
|
235
|
+
end
|
236
|
+
end
|
218
237
|
end
|
data/win32-nio.gemspec
CHANGED
@@ -1,30 +1,28 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'win32-nio'
|
5
|
+
spec.version = '0.0.3'
|
6
|
+
spec.author = 'Daniel J. Berger'
|
7
|
+
spec.license = 'Artistic 2.0'
|
8
|
+
spec.email = 'djberg96@gmail.com'
|
9
|
+
spec.homepage = 'http://www.rubyforge.org/projects/win32utils'
|
10
|
+
spec.platform = Gem::Platform::RUBY
|
11
|
+
spec.summary = 'Native IO for MS Windows'
|
12
|
+
spec.has_rdoc = true
|
13
|
+
spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
spec.rubyforge_project = 'Win32Utils'
|
16
|
+
spec.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
spec.description = <<-EOF
|
19
|
+
The win32-nio library implements certain IO methods using native
|
20
|
+
Windows function calls rather than using the POSIX compatibility
|
21
|
+
layer that MRI typically uses. In addition, some methods provide
|
22
|
+
additional event handling capability.
|
23
|
+
EOF
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
spec.add_dependency('windows-pr', '>= 0.9.5')
|
26
|
+
spec.add_dependency('win32-event', '>= 0.5.0')
|
27
|
+
spec.add_development_dependency('test-unit', '>= 2.0.3')
|
28
28
|
end
|
29
|
-
|
30
|
-
Gem::Builder.new(spec).build
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: win32-nio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Daniel J. Berger
|
@@ -9,40 +14,52 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2010-04-24 00:00:00 -06:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: windows-pr
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 9
|
30
|
+
- 5
|
23
31
|
version: 0.9.5
|
24
|
-
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: win32-event
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ">="
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 5
|
44
|
+
- 0
|
33
45
|
version: 0.5.0
|
34
|
-
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
35
48
|
- !ruby/object:Gem::Dependency
|
36
49
|
name: test-unit
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
52
|
requirements:
|
41
53
|
- - ">="
|
42
54
|
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 2
|
57
|
+
- 0
|
58
|
+
- 3
|
43
59
|
version: 2.0.3
|
44
|
-
|
45
|
-
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
62
|
+
description: " The win32-nio library implements certain IO methods using native\n Windows function calls rather than using the POSIX compatibility\n layer that MRI typically uses. In addition, some methods provide\n additional event handling capability.\n"
|
46
63
|
email: djberg96@gmail.com
|
47
64
|
executables: []
|
48
65
|
|
@@ -75,18 +92,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
75
92
|
requirements:
|
76
93
|
- - ">="
|
77
94
|
- !ruby/object:Gem::Version
|
95
|
+
segments:
|
96
|
+
- 0
|
78
97
|
version: "0"
|
79
|
-
version:
|
80
98
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
99
|
requirements:
|
82
100
|
- - ">="
|
83
101
|
- !ruby/object:Gem::Version
|
102
|
+
segments:
|
103
|
+
- 0
|
84
104
|
version: "0"
|
85
|
-
version:
|
86
105
|
requirements: []
|
87
106
|
|
88
107
|
rubyforge_project: Win32Utils
|
89
|
-
rubygems_version: 1.3.
|
108
|
+
rubygems_version: 1.3.6
|
90
109
|
signing_key:
|
91
110
|
specification_version: 3
|
92
111
|
summary: Native IO for MS Windows
|