Module: Packable::Extensions::IO
- Defined in:
- lib/packable/extensions/io.rb
Class Method Summary collapse
-
.included(base) ⇒ Object
:nodoc:.
Instance Method Summary collapse
-
#>>(options) ⇒ Object
Usage: io >> Class io >> [Class, options] io >> :shortcut.
- #each_with_packing(*options, &block) ⇒ Object
- #pack_and_write(*arg) ⇒ Object
-
#packed ⇒ Object
Returns (or yields) a modified IO object that will always pack/unpack when writing/reading.
-
#pos_change(&block) ⇒ Object
Returns the change in io.pos caused by the block.
-
#read_exactly(n) ⇒ Object
returns a string of exactly n bytes, or else raises an EOFError.
- #read_with_packing(*arg) ⇒ Object
- #write_with_packing(*arg) ⇒ Object
Class Method Details
.included(base) ⇒ Object
:nodoc:
7 8 9 10 11 |
# File 'lib/packable/extensions/io.rb', line 7 def self.included(base) #:nodoc: base.alias_method_chain :read, :packing base.alias_method_chain :write, :packing base.alias_method_chain :each, :packing end |
Instance Method Details
#>>(options) ⇒ Object
Usage:
io >> Class
io >> [Class, ]
io >> :shortcut
25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/packable/extensions/io.rb', line 25 def >> () r = [] class << r attr_accessor :stream def >> () self << stream.read() end end r.stream = self r >> end |
#each_with_packing(*options, &block) ⇒ Object
55 56 57 58 59 |
# File 'lib/packable/extensions/io.rb', line 55 def each_with_packing(*, &block) return each_without_packing(*, &block) if (Integer === .first) || (String === .first) return Enumerator.new(self, :each_with_packing, *) unless block_given? yield read(*) until eof? end |
#pack_and_write(*arg) ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/packable/extensions/io.rb', line 85 def pack_and_write(*arg) original_pos = pos Packable::Packers.to_object_option_list(*arg).each do |obj, | if [:write_packed] [:write_packed].bind(obj).call(self) else obj.write_packed(self, ) end end pos - original_pos end |
#packed ⇒ Object
Returns (or yields) a modified IO object that will always pack/unpack when writing/reading.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/packable/extensions/io.rb', line 38 def packed packedio = clone packedio.set_encoding("ascii-8bit") if packedio.respond_to? :set_encoding class << packedio def << (arg) arg = [arg, :default] unless arg.instance_of?(::Array) pack_and_write(*arg) self end def packed block_given? ? yield(self) : self end alias_method :write, :pack_and_write #bypass test for argument length end block_given? ? yield(packedio) : packedio end |
#pos_change(&block) ⇒ Object
Returns the change in io.pos caused by the block. Has nothing to do with packing, but quite helpful and so simpleā¦
15 16 17 18 19 |
# File 'lib/packable/extensions/io.rb', line 15 def pos_change(&block) delta =- pos yield delta += pos end |
#read_exactly(n) ⇒ Object
returns a string of exactly n bytes, or else raises an EOFError
78 79 80 81 82 83 |
# File 'lib/packable/extensions/io.rb', line 78 def read_exactly(n) return "" if n.zero? s = read_without_packing(n) raise EOFError if s.nil? || s.length < n s end |
#read_with_packing(*arg) ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/packable/extensions/io.rb', line 65 def read_with_packing(*arg) return read_without_packing(*arg) if arg.length == 0 || arg.first.nil? || arg.first.is_a?(Numeric) values = Packable::Packers.to_class_option_list(*arg).map do |klass, , original| if [:read_packed] [:read_packed].call(self) else klass.read_packed(self, ) end end return values.size > 1 ? values : values.first end |
#write_with_packing(*arg) ⇒ Object
61 62 63 |
# File 'lib/packable/extensions/io.rb', line 61 def write_with_packing(*arg) (arg.length == 1) ? write_without_packing(*arg) : pack_and_write(*arg) end |