ruby-ole 1.2.11.4 → 1.2.11.5

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.
data/ChangeLog CHANGED
@@ -1,3 +1,10 @@
1
+ == 1.2.11.5 / 2012-11-06
2
+
3
+ - Fix breakage of IO.parse_mode on Rubinius (issue #10).
4
+ - Make tests pass on rubinius (issue #11).
5
+ - Improve RangesIO test coverage.
6
+ - Don't warn when mbat_start is AVAIL instead of EOC (github #9).
7
+
1
8
  == 1.2.11.4 / 2012-07-03
2
9
 
3
10
  - Embed PropertySet meta data GUIDs and field lists, to avoid hitting the
@@ -1,6 +1,6 @@
1
1
  # encoding: ASCII-8BIT
2
2
 
3
- # need IO::Mode
3
+ # need Ole::IOMode
4
4
  require 'ole/support'
5
5
 
6
6
  #
@@ -57,7 +57,7 @@ class RangesIO
57
57
  mode, params = 'r', mode if Hash === mode
58
58
  ranges = params[:ranges]
59
59
  @params = {:close_parent => false}.merge params
60
- @mode = IO::Mode.new mode
60
+ @mode = Ole::IOMode.new mode
61
61
  @io = io
62
62
  # initial position in the file
63
63
  @pos = 0
@@ -255,7 +255,7 @@ end
255
255
  class RangesIONonResizeable < RangesIO # :nodoc:
256
256
  def initialize io, mode='r', params={}
257
257
  mode, params = 'r', mode if Hash === mode
258
- flags = IO::Mode.new(mode).flags & ~IO::TRUNC
258
+ flags = Ole::IOMode.new(mode).flags & ~IO::TRUNC
259
259
  super io, flags, params
260
260
  end
261
261
  end
@@ -50,21 +50,16 @@ module Ole # :nodoc:
50
50
  raise ArgumentError, 'unable to specify mode string with io object' if mode
51
51
  [false, arg]
52
52
  end
53
- # do we have this file opened for writing? don't know of a better way to tell
54
- # (unless we parse the mode string in the open case)
55
- # hmmm, note that in ruby 1.9 this doesn't work anymore. which is all the more
56
- # reason to use mode string parsing when available, and fall back to something like
57
- # io.writeable? otherwise.
53
+ # do we have this file opened for writing? use mode when provided,
54
+ # otherwise try no-op methods which will raise if read-only
58
55
  @writeable = begin
59
56
  if mode
60
- IO::Mode.new(mode).writeable?
57
+ IOMode.new(mode).writeable?
61
58
  else
59
+ # works on mri 1.8 & jruby
62
60
  @io.flush
63
- # this is for the benefit of ruby-1.9
64
- # generates warnings on jruby though... :/
65
- if RUBY_PLATFORM != 'java' and @io.respond_to?(:syswrite)
66
- @io.syswrite('')
67
- end
61
+ # works on mri 1.9 & rubinius
62
+ @io.write_nonblock('') if @io.respond_to?(:write_nonblock)
68
63
  true
69
64
  end
70
65
  rescue IOError
@@ -390,7 +385,7 @@ module Ole # :nodoc:
390
385
  # 3 for this value.
391
386
  # transacting_signature != "\x00" * 4 or
392
387
  if threshold != 4096 or
393
- num_mbat == 0 && mbat_start != AllocationTable::EOC or
388
+ num_mbat == 0 && ![AllocationTable::EOC, AllocationTable::AVAIL].include?(mbat_start) or
394
389
  reserved != "\x00" * 6
395
390
  Log.warn "may not be a valid OLE2 structured storage file"
396
391
  end
@@ -151,7 +151,7 @@ module Ole # :nodoc:
151
151
  end
152
152
 
153
153
  def open path, mode='r', &block
154
- if IO::Mode.new(mode).create?
154
+ if IOMode.new(mode).create?
155
155
  begin
156
156
  dirent = dirent_from_path path
157
157
  rescue Errno::ENOENT
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Ole # :nodoc:
4
4
  class Storage
5
- VERSION = '1.2.11.4'
5
+ VERSION = '1.2.11.5'
6
6
  end
7
7
  end
8
8
 
@@ -11,14 +11,6 @@ require 'stringio'
11
11
  require 'enumerator'
12
12
 
13
13
  class String # :nodoc:
14
- # plural of String#index. returns all offsets of +string+. rename to indices?
15
- #
16
- # note that it doesn't check for overlapping values.
17
- def indexes string
18
- # in some ways i'm surprised that $~ works properly in this case...
19
- to_enum(:scan, /#{Regexp.quote string}/m).map { $~.begin 0 }
20
- end
21
-
22
14
  def each_chunk size
23
15
  (length / size.to_f).ceil.times { |i| yield self[i * size, size] }
24
16
  end
@@ -165,34 +157,8 @@ module RecursivelyEnumerable # :nodoc:
165
157
  end
166
158
  end
167
159
 
168
- # can include File::Constants
169
- class IO
170
- # this is for jruby
171
- include File::Constants unless defined?(RDONLY)
172
-
173
- # nabbed from rubinius, and modified
174
- def self.parse_mode mode
175
- ret = 0
176
-
177
- case mode[0, 1]
178
- when 'r'; ret |= RDONLY
179
- when 'w'; ret |= WRONLY | CREAT | TRUNC
180
- when 'a'; ret |= WRONLY | CREAT | APPEND
181
- else raise ArgumentError, "illegal access mode #{mode}"
182
- end
183
-
184
- (1...mode.length).each do |i|
185
- case mode[i, 1]
186
- when '+'; ret = (ret & ~(RDONLY | WRONLY)) | RDWR
187
- when 'b'; ret |= Mode::BINARY
188
- else raise ArgumentError, "illegal access mode #{mode}"
189
- end
190
- end
191
-
192
- ret
193
- end
194
-
195
- class Mode
160
+ module Ole
161
+ class IOMode
196
162
  # ruby 1.9 defines binary as 0, which isn't very helpful.
197
163
  # its 4 in rubinius. no longer using
198
164
  #
@@ -207,9 +173,31 @@ class IO
207
173
  include Constants
208
174
  NAMES = %w[rdonly wronly rdwr creat trunc append binary]
209
175
 
176
+ # nabbed from rubinius, and modified
177
+ def self.parse_mode mode
178
+ ret = 0
179
+
180
+ case mode[0, 1]
181
+ when 'r'; ret |= RDONLY
182
+ when 'w'; ret |= WRONLY | CREAT | TRUNC
183
+ when 'a'; ret |= WRONLY | CREAT | APPEND
184
+ else raise ArgumentError, "illegal access mode #{mode}"
185
+ end
186
+
187
+ (1...mode.length).each do |i|
188
+ case mode[i, 1]
189
+ when '+'; ret = (ret & ~(RDONLY | WRONLY)) | RDWR
190
+ when 'b'; ret |= BINARY
191
+ else raise ArgumentError, "illegal access mode #{mode}"
192
+ end
193
+ end
194
+
195
+ ret
196
+ end
197
+
210
198
  attr_reader :flags
211
199
  def initialize flags
212
- flags = IO.parse_mode flags.to_str if flags.respond_to? :to_str
200
+ flags = self.class.parse_mode flags.to_str if flags.respond_to? :to_str
213
201
  raise ArgumentError, "invalid flags - #{flags.inspect}" unless Fixnum === flags
214
202
  @flags = flags
215
203
  end
@@ -251,7 +239,7 @@ class IO
251
239
  =end
252
240
 
253
241
  def inspect
254
- names = NAMES.map { |name| name if (flags & Mode.const_get(name.upcase)) != 0 }
242
+ names = NAMES.map { |name| name if (flags & IOMode.const_get(name.upcase)) != 0 }
255
243
  names.unshift 'rdonly' if (flags & 0x3) == 0
256
244
  "#<#{self.class} #{names.compact * '|'}>"
257
245
  end
@@ -29,6 +29,14 @@ class TestRangesIO < Test::Unit::TestCase
29
29
  assert_equal true, f.closed?
30
30
  end
31
31
 
32
+ def test_combine
33
+ ranges = [[0, 100], 100...200, [200, 100]]
34
+ io = RangesIO.new STDOUT, 'r+', :ranges => ranges
35
+ assert_equal [[0, 300]], io.ranges
36
+ io = RangesIO.new STDOUT, 'r+', :ranges => ranges, :combine => false
37
+ assert_equal [[0, 100], [100, 100], [200, 100]], io.ranges
38
+ end
39
+
32
40
  def test_basics
33
41
  assert_equal 160, @io.size
34
42
  assert_match %r{size=160}, @io.inspect
@@ -44,6 +52,8 @@ class TestRangesIO < Test::Unit::TestCase
44
52
  @io.seek(-10, IO::SEEK_CUR)
45
53
  @io.pos += 20
46
54
  assert_equal 70, @io.pos
55
+ @io.rewind
56
+ assert_equal 0, @io.pos
47
57
  # seeking past the end doesn't throw an exception for normal
48
58
  # files, even in read mode, but RangesIO does
49
59
  assert_raises(Errno::EINVAL) { @io.seek 500 }
@@ -97,7 +107,7 @@ class TestRangesIO < Test::Unit::TestCase
97
107
  end
98
108
  # will be fine
99
109
  @io = RangesIONonResizeable.new(StringIO.new, 'w', :ranges => [])
100
- assert_equal '#<IO::Mode wronly|creat>', @io.instance_variable_get(:@mode).inspect
110
+ assert_equal '#<Ole::IOMode wronly|creat>', @io.instance_variable_get(:@mode).inspect
101
111
  end
102
112
  end
103
113
 
@@ -36,15 +36,6 @@ class TestSupport < Test::Unit::TestCase
36
36
  assert_equal str, dst.string
37
37
  end
38
38
 
39
- def test_string
40
- str = "aa aa ||| aa aa"
41
- assert_equal [0, 3, 10, 13], str.indexes('aa')
42
- # this is mostly a check that regexp quote is used.
43
- assert_equal [6, 7, 8], str.indexes('|')
44
- # note not [6, 7] - no overlaps
45
- assert_equal [6], str.indexes('||')
46
- end
47
-
48
39
  def test_symbol
49
40
  array = (1..10).to_a
50
41
  assert_equal 55, array.inject(&:+)
@@ -53,7 +44,7 @@ end
53
44
 
54
45
  class TestIOMode < Test::Unit::TestCase
55
46
  def mode s
56
- IO::Mode.new s
47
+ Ole::IOMode.new s
57
48
  end
58
49
 
59
50
  def test_parse
@@ -83,9 +74,9 @@ class TestIOMode < Test::Unit::TestCase
83
74
  end
84
75
 
85
76
  def test_inspect
86
- assert_equal '#<IO::Mode rdonly>', IO::Mode.new('r').inspect
87
- assert_equal '#<IO::Mode rdwr|creat|trunc|binary>', IO::Mode.new('wb+').inspect
88
- assert_equal '#<IO::Mode wronly|creat|append>', IO::Mode.new('a').inspect
77
+ assert_equal '#<Ole::IOMode rdonly>', mode('r').inspect
78
+ assert_equal '#<Ole::IOMode rdwr|creat|trunc|binary>', mode('wb+').inspect
79
+ assert_equal '#<Ole::IOMode wronly|creat|append>', mode('a').inspect
89
80
  end
90
81
  end
91
82
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-ole
3
3
  version: !ruby/object:Gem::Version
4
- hash: 107
4
+ hash: 105
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
9
  - 11
10
- - 4
11
- version: 1.2.11.4
10
+ - 5
11
+ version: 1.2.11.5
12
12
  platform: ruby
13
13
  authors:
14
14
  - Charles Lowe
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-07-03 00:00:00 +10:00
19
+ date: 2012-11-06 00:00:00 +11:00
20
20
  default_executable:
21
21
  dependencies: []
22
22