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.
Files changed (6) hide show
  1. data/CHANGES +7 -1
  2. data/README +44 -41
  3. data/Rakefile +20 -10
  4. data/lib/win32/nio.rb +202 -183
  5. data/win32-nio.gemspec +22 -24
  6. 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
- require 'win32/nio'
7
- include Win32
9
+ require 'win32/nio'
10
+ include Win32
8
11
 
9
- p NIO.read('some_file.text')
12
+ p NIO.read('some_file.text')
10
13
 
11
- p NIO.readlines('some_file.txt')
14
+ p NIO.readlines('some_file.txt')
12
15
 
13
16
  = Proof of Concept
14
- This code is ALPHA!
15
-
16
- This code is mostly a proof of concept to see how to implement Ruby's
17
- IO functions in pure Windows functions. While it does offer a couple of
18
- features over and above Ruby's IO interface, such as the ability to supply
19
- an event or a block to the NIO.read method, it offers little practical
20
- advantage at the moment.
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
- In addition, it is currently using pure Ruby (via win32-api), which means
23
- it isn't optimized for speed.
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
- Using my HP Windows XP Pro laptop, with a 1.66 core duo Pentium T5500 and
28
- 2gb of RAM, I saw these results, which were typical in repeated runs:
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
- IO.read(small) 0.016000 0.047000 0.063000 ( 0.063000)
32
- NIO.read(small) 0.109000 0.000000 0.109000 ( 0.109000)
33
- IO.read(medium) 0.422000 0.094000 0.516000 ( 0.532000)
34
- NIO.read(medium) 0.937000 0.062000 0.999000 ( 1.047000)
35
- IO.read(large) 3.282000 1.063000 4.345000 ( 4.468000)
36
- NIO.read(large) 8.187000 1.062000 9.249000 ( 9.454000)
37
- IO.readlines(small) 0.156000 0.063000 0.219000 ( 0.234000)
38
- NIO.readlines(small) 0.141000 0.000000 0.141000 ( 0.797000)
39
- IO.readlines(medium) 2.984000 0.250000 3.234000 ( 3.625000)
40
- NIO.readlines(medium) 1.172000 0.062000 1.234000 ( 3.406000)
41
- IO.readlines(large) 18.625000 2.281000 20.906000 ( 21.532000)
42
- NIO.readlines(large) 12.406000 0.563000 12.969000 (122.643000)
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
- Note that, in most cases, the user and system time has decreased, but
45
- the real time has increased.
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
- None that I know of. Please log any other bug reports on the RubyForge
49
- project page at http://www.rubyforge.net/projects/win32utils
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
- The pure Ruby code is really only meant for prototyping. The eventual
53
- plan is to convert the Ruby code to equivalent C code in order to improve
54
- performance.
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
- Artistic 2.0
60
+ Artistic 2.0
58
61
 
59
62
  = Copyright
60
- (C) 2008-2009 Daniel J. Berger, All Rights Reserved
63
+ (C) 2008-2010 Daniel J. Berger, All Rights Reserved
61
64
 
62
65
  = Warranty
63
- This package is provided "as is" and without any express or
64
- implied warranties, including, without limitation, the implied
65
- warranties of merchantability and fitness for a particular purpose.
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
- Daniel Berger
69
- Park Heesob
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
- desc 'Install the win32-nio library (non-gem)'
7
- task :install do
8
- sitelibdir = CONFIG['sitelibdir']
9
- installdir = File.join(sitelibdir, 'win32')
10
- file = 'lib\win32\nio.rb'
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
- Dir.mkdir(installdir) unless File.exists?(installdir)
13
- FileUtils.cp(file, installdir, :verbose => true)
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
- sh "ruby -Ilib benchmarks/win32_nio_benchmarks.rb"
27
+ sh "ruby -Ilib benchmarks/win32_nio_benchmarks.rb"
28
+ end
19
29
 
20
30
  Rake::TestTask.new do |t|
21
- t.verbose = true
22
- t.warning = true
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
- # 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
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
- # 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, 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
- def self.read(port_name, length=nil, offset=0, event=nil, &block)
56
- if length
57
- raise TypeError unless length.is_a?(Fixnum)
58
- raise ArgumentError if length < 0
59
- end
60
-
61
- if offset
62
- raise TypeError unless offset.is_a?(Fixnum)
63
- raise ArgumentError if offset < 0
64
- end
65
-
66
- if event
67
- raise TypeError unless event.is_a?(Win32::Event)
68
- end
69
-
70
- flags = FILE_FLAG_SEQUENTIAL_SCAN
71
-
72
- overlapped = 0.chr * 20 # sizeof(OVERLAPPED)
73
- overlapped[8,4] = [offset].pack('L') # OVERLAPPED.Offset
74
-
75
- if offset > 0 || event
76
- flags |= FILE_FLAG_OVERLAPPED
77
- overlapped[16,4] = [event.handle].pack('L') if event
78
- end
79
-
80
- handle = CreateFile(
81
- port_name,
82
- FILE_READ_DATA,
83
- FILE_SHARE_READ,
84
- 0,
85
- OPEN_EXISTING,
86
- flags,
87
- 0
88
- )
89
-
90
- if handle == INVALID_HANDLE_VALUE
91
- raise Error, get_last_error
92
- end
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
- # Ruby's File.size is broken, so we implement it here. Also, if an
95
- # offset is provided, we can reduce the size to only what we need.
96
- if length.nil?
97
- size = [0].pack('Q')
98
- GetFileSizeEx(handle, size)
99
- length = size.unpack('Q').first
100
- length -= offset if offset
101
- end
102
-
103
- buf = 0.chr * length
104
-
105
- begin
106
- if block_given?
107
- callback = Win32::API::Callback.new('LLP', 'V'){ block.call }
108
- bool = ReadFileEx(handle, buf, length, overlapped, callback)
109
- else
110
- bytes = [0].pack('L')
111
- bool = ReadFile(handle, buf, length, bytes, overlapped)
112
- end
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
- errno = GetLastError()
133
+ errno = GetLastError()
115
134
 
116
- SleepEx(1, true) # Must be in alertable wait state
135
+ SleepEx(1, true) # Must be in alertable wait state
117
136
 
118
- unless bool
119
- if errno = ERROR_IO_PENDING
120
- unless GetOverlappedResult(handle, overlapped, bytes, true)
121
- raise Error, get_last_error
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
- event.wait if event
129
- ensure
130
- CloseHandle(handle)
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
- if handle == INVALID_HANDLE_VALUE
154
- raise Error, get_last_error
155
- end
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
- sysbuf = 0.chr * 40
158
- GetSystemInfo(sysbuf)
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
- file_size = [0].pack('Q')
161
- GetFileSizeEx(handle, file_size)
162
- file_size = file_size.unpack('Q')[0]
179
+ file_size = [0].pack('Q')
180
+ GetFileSizeEx(handle, file_size)
181
+ file_size = file_size.unpack('Q')[0]
163
182
 
164
- page_size = sysbuf[4,4].unpack('L')[0] # dwPageSize
165
- page_num = (file_size.to_f / page_size).ceil
183
+ page_size = sysbuf[4,4].unpack('L')[0] # dwPageSize
184
+ page_num = (file_size.to_f / page_size).ceil
166
185
 
167
- begin
168
- base_address = VirtualAlloc(
169
- nil,
170
- page_size * page_num,
171
- MEM_COMMIT,
172
- PAGE_READWRITE
173
- )
186
+ begin
187
+ base_address = VirtualAlloc(
188
+ nil,
189
+ page_size * page_num,
190
+ MEM_COMMIT,
191
+ PAGE_READWRITE
192
+ )
174
193
 
175
- buf_list = []
194
+ buf_list = []
176
195
 
177
- for i in 0...page_num
178
- buf_list.push(base_address + page_size * i)
179
- end
196
+ for i in 0...page_num
197
+ buf_list.push(base_address + page_size * i)
198
+ end
180
199
 
181
- seg_array = buf_list.pack('Q*') + 0.chr * 8
182
- overlapped = 0.chr * 20
200
+ seg_array = buf_list.pack('Q*') + 0.chr * 8
201
+ overlapped = 0.chr * 20
183
202
 
184
- bool = ReadFileScatter(
185
- handle,
186
- seg_array,
187
- page_size * page_num,
188
- nil,
189
- overlapped
190
- )
191
-
192
- unless bool
193
- error = GetLastError()
194
- if error != ERROR_IO_PENDING
195
- raise Error, get_last_error(error)
196
- end
197
- end
198
-
199
- SleepEx(1, true) unless HasOverlappedIoCompleted(overlapped)
200
-
201
- buffer = 0.chr * file_size
202
- memcpy(buffer, buf_list[0], file_size)
203
- ensure
204
- CloseHandle(handle)
205
- VirtualFree(base_address, 0, MEM_RELEASE)
206
- end
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
- buffer
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
- end
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
- spec = Gem::Specification.new do |gem|
4
- gem.name = 'win32-nio'
5
- gem.version = '0.0.2'
6
- gem.author = 'Daniel J. Berger'
7
- gem.license = 'Artistic 2.0'
8
- gem.email = 'djberg96@gmail.com'
9
- gem.homepage = 'http://www.rubyforge.org/projects/win32utils'
10
- gem.platform = Gem::Platform::RUBY
11
- gem.summary = 'Native IO for MS Windows'
12
- gem.has_rdoc = true
13
- gem.files = Dir['**/*'].reject{ |f| f.include?('CVS') }
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
- gem.rubyforge_project = 'Win32Utils'
16
- gem.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
15
+ spec.rubyforge_project = 'Win32Utils'
16
+ spec.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
17
17
 
18
- gem.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
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
- gem.add_dependency('windows-pr', '>= 0.9.5')
26
- gem.add_dependency('win32-event', '>= 0.5.0')
27
- gem.add_development_dependency('test-unit', '>= 2.0.3')
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
- version: 0.0.2
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: 2009-08-06 00:00:00 -06:00
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
- type: :runtime
18
- version_requirement:
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
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
35
  name: win32-event
27
- type: :runtime
28
- version_requirement:
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
- version:
46
+ type: :runtime
47
+ version_requirements: *id002
35
48
  - !ruby/object:Gem::Dependency
36
49
  name: test-unit
37
- type: :development
38
- version_requirement:
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
- version:
45
- 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"
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.4
108
+ rubygems_version: 1.3.6
90
109
  signing_key:
91
110
  specification_version: 3
92
111
  summary: Native IO for MS Windows