marcandre-packable 1.2.1 → 1.3.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.
- data/CHANGELOG.rdoc +5 -0
- data/README.rdoc +2 -2
- data/VERSION.yml +2 -2
- data/lib/packable/extensions/float.rb +4 -1
- data/lib/packable/extensions/integer.rb +5 -2
- data/test/packing_test.rb +14 -0
- metadata +2 -2
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
= Packable --- History
|
2
2
|
|
3
|
+
== Version 1.3 - April 8, 2009
|
4
|
+
Added :endian => :native for Integers and Floats (thanks to Jay Daley)
|
5
|
+
Raises an exception if :endian is not one of :little, :big, :network or :native
|
6
|
+
Added some tests for Bignum
|
7
|
+
|
3
8
|
== Version 1.2 - April 2nd, 2009
|
4
9
|
Compatible with ruby 1.9.1.
|
5
10
|
The 'jungle_survival_kit' is now in its own 'backports' gem.
|
data/README.rdoc
CHANGED
@@ -73,12 +73,12 @@ These are the options for core types:
|
|
73
73
|
|
74
74
|
=== Integer
|
75
75
|
[+bytes+] Number of bytes (default is 4) to use.
|
76
|
-
[+endian+] Either <tt>:big</tt> (or
|
76
|
+
[+endian+] Either <tt>:big</tt> (or <tt>:network</tt>, default), <tt>:little</tt> or <tt>:native</tt>.
|
77
77
|
[+signed+] Either +true+ (default) or +false+. This will make a difference only when unpacking.
|
78
78
|
|
79
79
|
=== Float
|
80
80
|
[+precision+] Either <tt>:single</tt> (default) or <tt>:double</tt>.
|
81
|
-
[+endian+] Either <tt>:big</tt> (or
|
81
|
+
[+endian+] Either <tt>:big</tt> (or <tt>:network</tt>, default), <tt>:little</tt> or <tt>:native</tt>.
|
82
82
|
|
83
83
|
=== String
|
84
84
|
[+bytes+] Total length (default is the full length)
|
data/VERSION.yml
CHANGED
@@ -19,8 +19,11 @@ module Packable
|
|
19
19
|
end
|
20
20
|
|
21
21
|
module ClassMethods #:nodoc:
|
22
|
+
ENDIAN_TO_FORMAT = Hash.new{|h, endian| raise ArgumentError, "Endian #{endian} is not valid. It must be one of #{h.keys.join(', ')}"}.
|
23
|
+
merge!(:big => "G", :network => "G", :little => "E", :native => "F").freeze
|
24
|
+
|
22
25
|
def pack_option_to_format(options)
|
23
|
-
format =
|
26
|
+
format = ENDIAN_TO_FORMAT[options[:endian]]
|
24
27
|
format.downcase! if options[:precision] == :single
|
25
28
|
format
|
26
29
|
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module Packable
|
2
2
|
module Extensions #:nodoc:
|
3
3
|
module Integer #:nodoc:
|
4
|
+
NEEDS_REVERSAL = Hash.new{|h, endian| raise ArgumentError, "Endian #{endian} is not valid. It must be one of #{h.keys.join(', ')}"}.
|
5
|
+
merge!(:little => true, :big => false, :network => false, :native => "*\x00\x00\x00".unpack('L').first == 42).freeze
|
6
|
+
|
4
7
|
def self.included(base)
|
5
8
|
base.class_eval do
|
6
9
|
include Packable
|
@@ -25,13 +28,13 @@ module Packable
|
|
25
28
|
val >>= 8
|
26
29
|
byte.chr
|
27
30
|
end
|
28
|
-
chars.reverse! unless options[:endian]
|
31
|
+
chars.reverse! unless NEEDS_REVERSAL[options[:endian]]
|
29
32
|
io << chars.join
|
30
33
|
end
|
31
34
|
|
32
35
|
module ClassMethods #:nodoc:
|
33
36
|
def unpack_string(s,options)
|
34
|
-
s = s.reverse if options[:endian]
|
37
|
+
s = s.reverse if NEEDS_REVERSAL[options[:endian]]
|
35
38
|
r = 0
|
36
39
|
s.each_byte {|b| r = (r << 8) + b}
|
37
40
|
r -= 1 << (8 * options[:bytes]) if options[:signed] && (1 == r >> (8 * options[:bytes] - 1))
|
data/test/packing_test.rb
CHANGED
@@ -47,6 +47,20 @@ class TestingPack < Test::Unit::TestCase
|
|
47
47
|
assert_equal 258, Integer.unpack("\002\001\000", :bytes => 3, :endian => :little)
|
48
48
|
assert_equal (1<<24)-1, -1.pack(:bytes => 3).unpack(Integer, :bytes => 3, :signed => false)
|
49
49
|
assert_equal -1, -1.pack(:bytes => 3).unpack(Integer, :bytes => 3, :signed => true)
|
50
|
+
assert_equal 42, 42.pack('L').unpack(Integer, :bytes => 4, :endian => :native)
|
51
|
+
assert_raise(ArgumentError){ 42.pack(:endian => "Geronimo")}
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_bignum
|
55
|
+
assert_equal 1.pack(:long), ((1 << 69) + 1).pack(:long)
|
56
|
+
assert_equal "*" + ("\000" * 15), (42 << (8*15)).pack(:bytes => 16)
|
57
|
+
assert_equal 42 << (8*15), (42 << (8*15)).pack(:bytes => 16).unpack(Integer, :bytes => 16)
|
58
|
+
assert_equal 42 << (8*15), (42 << (8*15)).pack(:bytes => 16).unpack(Bignum, :bytes => 16)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_float
|
62
|
+
assert_equal Math::PI.pack(:precision => :double, :endian => :native), Math::PI.pack('F')
|
63
|
+
assert_raise(ArgumentError){ Math::PI.pack(:endian => "Geronimo")}
|
50
64
|
end
|
51
65
|
|
52
66
|
def test_io
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: marcandre-packable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Marc-Andr\xC3\xA9 Lafortune"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-08 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|