xdr 3.0.1 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -9
- data/README.md +4 -2
- data/lib/xdr/concerns/converts_to_xdr.rb +30 -31
- data/lib/xdr/union.rb +7 -4
- data/lib/xdr/version.rb +1 -1
- metadata +43 -114
- data/.gitignore +0 -15
- data/.travis.yml +0 -9
- data/.yardopts +0 -7
- data/Gemfile +0 -4
- data/Guardfile +0 -5
- data/Rakefile +0 -9
- data/examples/enum.rb +0 -30
- data/examples/struct.rb +0 -24
- data/examples/union.rb +0 -29
- data/spec/lib/xdr/array_spec.rb +0 -73
- data/spec/lib/xdr/bool_spec.rb +0 -43
- data/spec/lib/xdr/concerns/converts_to_xdr_spec.rb +0 -88
- data/spec/lib/xdr/concerns/reads_bytes_spec.rb +0 -57
- data/spec/lib/xdr/double_spec.rb +0 -38
- data/spec/lib/xdr/dsl/enum_spec.rb +0 -44
- data/spec/lib/xdr/dsl/struct_spec.rb +0 -29
- data/spec/lib/xdr/dsl/union_spec.rb +0 -69
- data/spec/lib/xdr/enum_spec.rb +0 -70
- data/spec/lib/xdr/float_spec.rb +0 -37
- data/spec/lib/xdr/hyper_spec.rb +0 -40
- data/spec/lib/xdr/int_spec.rb +0 -40
- data/spec/lib/xdr/opaque_spec.rb +0 -40
- data/spec/lib/xdr/option_spec.rb +0 -36
- data/spec/lib/xdr/quadruple_spec.rb +0 -14
- data/spec/lib/xdr/rpc/record_reader_spec.rb +0 -27
- data/spec/lib/xdr/string_spec.rb +0 -47
- data/spec/lib/xdr/struct_spec.rb +0 -101
- data/spec/lib/xdr/union_spec.rb +0 -258
- data/spec/lib/xdr/unsigned_hyper_spec.rb +0 -36
- data/spec/lib/xdr/unsigned_int_spec.rb +0 -36
- data/spec/lib/xdr/var_array_spec.rb +0 -71
- data/spec/lib/xdr/var_opaque_spec.rb +0 -50
- data/spec/lib/xdr/void_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -15
- data/spec/support/matchers/eq_bytes.rb +0 -6
- data/xdr.gemspec +0 -28
data/.gitignore
DELETED
data/.travis.yml
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- 2.2.6
|
4
|
-
- 2.3.3
|
5
|
-
- 2.4.0
|
6
|
-
- jruby
|
7
|
-
notifications:
|
8
|
-
slack:
|
9
|
-
secure: fXYggrDRoLB/4yvyW0kWwyrV5yWa/GC0btPyGu7Hx6ZOaXDC+ejiXSfx7nRyY+uZBs5UF12O4gkUXwBbnWDT5JtQRxzZd5s0cyeGQfAakALexI+FuR2jDcV1prCCaYI4IYoUt61MlfDmuCYVm8hGZ3qsgk/GPHHPnZ8a1FBd2ls=
|
data/.yardopts
DELETED
data/Gemfile
DELETED
data/Guardfile
DELETED
data/Rakefile
DELETED
data/examples/enum.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'xdr'
|
2
|
-
|
3
|
-
class Color < XDR::Enum
|
4
|
-
member :red, 0
|
5
|
-
member :green, 1
|
6
|
-
member :blue, 2
|
7
|
-
|
8
|
-
seal
|
9
|
-
end
|
10
|
-
|
11
|
-
class ResultType < XDR::Enum
|
12
|
-
member :ok, 0
|
13
|
-
member :error, 1
|
14
|
-
seal
|
15
|
-
end
|
16
|
-
|
17
|
-
Color.members # => {:red => 0, :green => 1, :blue => 2}
|
18
|
-
Color.members.keys # => [:red, :green, :blue]
|
19
|
-
|
20
|
-
# string and symbol work
|
21
|
-
# any casing that can be underscored to the correct value will work
|
22
|
-
Color.from_name(:RED) # => #<Color:... @name="red", @value=0>
|
23
|
-
Color.from_name("RED") # => #<Color:... @name="red", @value=0>
|
24
|
-
Color.from_name("red") # => #<Color:... @name="red", @value=0>
|
25
|
-
Color.from_name(:red) # => #<Color:... @name="red", @value=0>
|
26
|
-
|
27
|
-
Color.from_xdr("\x00\x00\x00\x00") # => #<Color:... @name="red", @value=0>
|
28
|
-
Color.to_xdr(Color.green) # => "\x00\x00\x00\x01"
|
29
|
-
|
30
|
-
Color.red == ResultType.ok # => false
|
data/examples/struct.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'xdr'
|
2
|
-
|
3
|
-
class Signature < XDR::Struct
|
4
|
-
attribute :public_key, XDR::Opaque[32]
|
5
|
-
attribute :data, XDR::Opaque[32]
|
6
|
-
end
|
7
|
-
|
8
|
-
class Envelope < XDR::Struct
|
9
|
-
attribute :body, XDR::VarOpaque[]
|
10
|
-
attribute :timestamp, XDR::Int
|
11
|
-
attribute :signature, Signature
|
12
|
-
end
|
13
|
-
|
14
|
-
sig = Signature.new()
|
15
|
-
sig.public_key = "\x01" * 32
|
16
|
-
sig.data = "\x00" * 32
|
17
|
-
|
18
|
-
env = Envelope.new({
|
19
|
-
signature: sig,
|
20
|
-
body: "hello",
|
21
|
-
timestamp: Time.now.to_i
|
22
|
-
})
|
23
|
-
|
24
|
-
env.to_xdr
|
data/examples/union.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'xdr'
|
2
|
-
|
3
|
-
class ResultType < XDR::Enum
|
4
|
-
member :ok, 0
|
5
|
-
member :error, 1
|
6
|
-
member :nonsense, 2
|
7
|
-
seal
|
8
|
-
end
|
9
|
-
|
10
|
-
class Result < XDR::Union
|
11
|
-
switch_on ResultType, :type
|
12
|
-
|
13
|
-
switch :ok
|
14
|
-
switch :error, :message
|
15
|
-
switch :default
|
16
|
-
|
17
|
-
attribute :message, XDR::String[]
|
18
|
-
end
|
19
|
-
|
20
|
-
r = Result.new()
|
21
|
-
r.set(:error, "hello")
|
22
|
-
r.message! # => "hello"
|
23
|
-
r.get # => "hello"
|
24
|
-
|
25
|
-
r.set(:ok)
|
26
|
-
r.get # => nil
|
27
|
-
|
28
|
-
r.set(:nonsense)
|
29
|
-
r.get # => nil
|
data/spec/lib/xdr/array_spec.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe XDR::Array, "#read" do
|
4
|
-
let(:empty) { XDR::Array[XDR::Int, 0] }
|
5
|
-
let(:one) { XDR::Array[XDR::Int, 1] }
|
6
|
-
let(:many) { XDR::Array[XDR::Int, 2] }
|
7
|
-
|
8
|
-
it "decodes values correctly" do
|
9
|
-
expect( read empty, "" ).to eq([])
|
10
|
-
expect( read empty, "\x00\x00\x00\x00" ).to eq([])
|
11
|
-
expect( read one, "\x00\x00\x00\x00" ).to eq([0])
|
12
|
-
expect( read one, "\x00\x00\x00\x01" ).to eq([1])
|
13
|
-
expect( read many, "\x00\x00\x00\x00\x00\x00\x00\x01" ).to eq([0, 1])
|
14
|
-
expect( read many, "\x00\x00\x00\x01\x00\x00\x00\x01" ).to eq([1, 1])
|
15
|
-
end
|
16
|
-
|
17
|
-
it "raises EOFError the byte stream isn't large enough" do
|
18
|
-
expect{ read many, "\x00\x00\x00\x00" }.to raise_error(EOFError)
|
19
|
-
end
|
20
|
-
|
21
|
-
def read(reader, str)
|
22
|
-
io = StringIO.new(str)
|
23
|
-
reader.read(io)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe XDR::Array, "#write" do
|
28
|
-
subject{ XDR::Array[XDR::Int, 2] }
|
29
|
-
|
30
|
-
it "encodes values correctly" do
|
31
|
-
expect(write [1,2]).to eq("\x00\x00\x00\x01\x00\x00\x00\x02")
|
32
|
-
expect(write [1,4]).to eq("\x00\x00\x00\x01\x00\x00\x00\x04")
|
33
|
-
end
|
34
|
-
|
35
|
-
it "raises a WriteError if the value is not the correct length" do
|
36
|
-
expect{ write nil }.to raise_error(XDR::WriteError)
|
37
|
-
expect{ write [] }.to raise_error(XDR::WriteError)
|
38
|
-
expect{ write [1] }.to raise_error(XDR::WriteError)
|
39
|
-
expect{ write [1,2,3] }.to raise_error(XDR::WriteError)
|
40
|
-
end
|
41
|
-
|
42
|
-
it "raises a WriteError if a child element is of the wrong type" do
|
43
|
-
expect{ write [nil] }.to raise_error(XDR::WriteError)
|
44
|
-
expect{ write ["hi"] }.to raise_error(XDR::WriteError)
|
45
|
-
expect{ write [1,2,"hi"] }.to raise_error(XDR::WriteError)
|
46
|
-
end
|
47
|
-
|
48
|
-
def write(val)
|
49
|
-
io = StringIO.new()
|
50
|
-
subject.write(val, io)
|
51
|
-
io.string
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
describe XDR::Array, "#valid?" do
|
56
|
-
subject{ XDR::Array[XDR::Int, 2] }
|
57
|
-
|
58
|
-
it "rejects an empty array" do
|
59
|
-
expect(subject.valid?([])).to be_falsey
|
60
|
-
end
|
61
|
-
|
62
|
-
it "accepts a filled array provided each element passes the child_type validator" do
|
63
|
-
expect(subject.valid?([1,2])).to be_truthy
|
64
|
-
expect(subject.valid?([2,3])).to be_truthy
|
65
|
-
end
|
66
|
-
|
67
|
-
it "rejects a filled array if any element is rejected by the child_type validator" do
|
68
|
-
expect(subject.valid?(["hello", "hello"])).to be_falsey
|
69
|
-
expect(subject.valid?([1, "hello"])).to be_falsey
|
70
|
-
expect(subject.valid?([1, nil])).to be_falsey
|
71
|
-
expect(subject.valid?([nil])).to be_falsey
|
72
|
-
end
|
73
|
-
end
|
data/spec/lib/xdr/bool_spec.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe XDR::Bool, ".read" do
|
4
|
-
subject{ XDR::Bool }
|
5
|
-
|
6
|
-
let(:false_s) { "\x00\x00\x00\x00" }
|
7
|
-
let(:true_s) { "\x00\x00\x00\x01" }
|
8
|
-
let(:two) { "\x00\x00\x00\x02" }
|
9
|
-
|
10
|
-
it "decodes values correctly" do
|
11
|
-
expect(read(false_s)).to eq(false)
|
12
|
-
expect(read(true_s)).to eq(true)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "raises ReadError if the decoded value is not 0 or 1" do
|
16
|
-
expect{ read two }.to raise_error XDR::ReadError
|
17
|
-
end
|
18
|
-
|
19
|
-
def read(str)
|
20
|
-
io = StringIO.new(str)
|
21
|
-
subject.read(io)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe XDR::Bool, ".write" do
|
26
|
-
subject{ XDR::Bool }
|
27
|
-
|
28
|
-
it "encodes values correctly" do
|
29
|
-
expect(write false).to eq("\x00\x00\x00\x00")
|
30
|
-
expect(write true).to eq("\x00\x00\x00\x01")
|
31
|
-
end
|
32
|
-
|
33
|
-
it "raises WriteError if the value is boolean" do
|
34
|
-
expect{ write 1 }.to raise_error XDR::WriteError
|
35
|
-
expect{ write "hello" }.to raise_error XDR::WriteError
|
36
|
-
end
|
37
|
-
|
38
|
-
def write(val)
|
39
|
-
io = StringIO.new()
|
40
|
-
subject.write(val, io)
|
41
|
-
io.string
|
42
|
-
end
|
43
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe XDR::Concerns::ConvertsToXDR do
|
4
|
-
subject{ UnimplementedConvertible.new }
|
5
|
-
|
6
|
-
it "requires an implementation of #read" do
|
7
|
-
expect{ subject.read(StringIO.new) }.to raise_error(NotImplementedError)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "requires an implementation of #write" do
|
11
|
-
expect{ subject.write(3, StringIO.new) }.to raise_error(NotImplementedError)
|
12
|
-
end
|
13
|
-
|
14
|
-
it "requires an implementation of #valid?" do
|
15
|
-
expect{ subject.valid?(3) }.to raise_error(NotImplementedError)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe XDR::Concerns::ConvertsToXDR, "#to_xdr" do
|
20
|
-
subject{ ImplementedConvertible.new }
|
21
|
-
|
22
|
-
it "calls through to write" do
|
23
|
-
expect(subject).to receive(:write).with("hiya", kind_of(StringIO))
|
24
|
-
subject.to_xdr("hiya")
|
25
|
-
end
|
26
|
-
|
27
|
-
context "using an actual xdr type" do
|
28
|
-
subject{ XDR::Opaque.new(4) }
|
29
|
-
|
30
|
-
it "encodes to hex" do
|
31
|
-
r = subject.to_xdr("\x00\x01\x02\x03", "hex")
|
32
|
-
expect(r).to eql("00010203")
|
33
|
-
end
|
34
|
-
|
35
|
-
it "encodes to base64" do
|
36
|
-
r = subject.to_xdr("\x00\x01\x02\x03", "base64")
|
37
|
-
expect(r).to eql("AAECAw==")
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe XDR::Concerns::ConvertsToXDR, "#from_xdr" do
|
43
|
-
subject{ ImplementedConvertible.new }
|
44
|
-
|
45
|
-
it "calls through to read" do
|
46
|
-
allow(subject).to receive(:read).and_call_original
|
47
|
-
subject.from_xdr("hiya")
|
48
|
-
expect(subject).to have_received(:read).with(kind_of(StringIO))
|
49
|
-
end
|
50
|
-
|
51
|
-
context "using an actual xdr type" do
|
52
|
-
subject{ XDR::Opaque.new(4) }
|
53
|
-
|
54
|
-
it "decodes from hex" do
|
55
|
-
r = subject.from_xdr("00010203", "hex")
|
56
|
-
expect(r).to eql("\x00\x01\x02\x03")
|
57
|
-
end
|
58
|
-
|
59
|
-
it "decodes from base64" do
|
60
|
-
r = subject.from_xdr("AAECAw==", "base64")
|
61
|
-
expect(r).to eql("\x00\x01\x02\x03")
|
62
|
-
end
|
63
|
-
|
64
|
-
it "raises an ArgumentError if the input is not fully consumed" do
|
65
|
-
expect{ subject.from_xdr("\x00\x00\x00\x00\x00") }.to raise_error(ArgumentError)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
class UnimplementedConvertible
|
71
|
-
include XDR::Concerns::ConvertsToXDR
|
72
|
-
end
|
73
|
-
|
74
|
-
class ImplementedConvertible
|
75
|
-
include XDR::Concerns::ConvertsToXDR
|
76
|
-
|
77
|
-
def read(io)
|
78
|
-
read_bytes(io, 4)
|
79
|
-
end
|
80
|
-
|
81
|
-
def write(val, io)
|
82
|
-
io.write(val)
|
83
|
-
end
|
84
|
-
|
85
|
-
def valid?(val)
|
86
|
-
true
|
87
|
-
end
|
88
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
class TestReader
|
4
|
-
include XDR::Concerns::ReadsBytes
|
5
|
-
public :read_bytes
|
6
|
-
public :read_zeros
|
7
|
-
end
|
8
|
-
|
9
|
-
|
10
|
-
describe XDR::Concerns::ReadsBytes, "#read_bytes" do
|
11
|
-
subject{ TestReader.new }
|
12
|
-
|
13
|
-
it "raises EOFError when the requested length goes beyond the length of the stream" do
|
14
|
-
expect{ read("", 1) }.to raise_error(EOFError)
|
15
|
-
expect{ read("", 2) }.to raise_error(EOFError)
|
16
|
-
expect{ read("", 10) }.to raise_error(EOFError)
|
17
|
-
expect{ read("\x00\x01\x02", 4) }.to raise_error(EOFError)
|
18
|
-
expect{ read("\x00\x01\x02", 10) }.to raise_error(EOFError)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "returns the read data" do
|
22
|
-
expect(read("", 0)).to eq("")
|
23
|
-
expect(read("\x00", 1)).to eq("\x00")
|
24
|
-
expect(read("\x01", 1)).to eq("\x01")
|
25
|
-
expect(read("\x00\x01\x02", 3)).to eq("\x00\x01\x02")
|
26
|
-
end
|
27
|
-
|
28
|
-
def read(str, length)
|
29
|
-
io = StringIO.new(str)
|
30
|
-
subject.read_bytes(io, length)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
describe XDR::Concerns::ReadsBytes, "#read_zeros" do
|
36
|
-
subject{ TestReader.new }
|
37
|
-
|
38
|
-
it "raises XDR::ReadError when the bytes read do not equal zero" do
|
39
|
-
expect{ read("\x01", 1) }.to raise_error(XDR::ReadError)
|
40
|
-
end
|
41
|
-
|
42
|
-
it "succeeds when all the bytes read are zero" do
|
43
|
-
expect{ read("\x00\x00\x00\x00", 1) }.to_not raise_error
|
44
|
-
expect{ read("\x00\x00\x00\x00", 2) }.to_not raise_error
|
45
|
-
expect{ read("\x00\x00\x00\x00", 3) }.to_not raise_error
|
46
|
-
expect{ read("\x00\x00\x00\x00", 4) }.to_not raise_error
|
47
|
-
end
|
48
|
-
|
49
|
-
it "raises EOFError when the requested length goes beyond the length of the stream" do
|
50
|
-
expect{ read("\x00\x00\x00\x00", 5) }.to raise_error(EOFError)
|
51
|
-
end
|
52
|
-
|
53
|
-
def read(str, length)
|
54
|
-
io = StringIO.new(str)
|
55
|
-
subject.read_zeros(io, length)
|
56
|
-
end
|
57
|
-
end
|
data/spec/lib/xdr/double_spec.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe XDR::Double, ".read" do
|
5
|
-
|
6
|
-
it "decodes values correctly" do
|
7
|
-
expect(read("\x00\x00\x00\x00\x00\x00\x00\x00")).to eq(0.0)
|
8
|
-
expect(read("\x80\x00\x00\x00\x00\x00\x00\x00")).to eq(-0.0)
|
9
|
-
expect(read("\x3F\xF0\x00\x00\x00\x00\x00\x00")).to eq(1.0)
|
10
|
-
expect(read("\xBF\xF0\x00\x00\x00\x00\x00\x00")).to eq(-1.0)
|
11
|
-
end
|
12
|
-
|
13
|
-
def read(str)
|
14
|
-
io = StringIO.new(str)
|
15
|
-
subject.read(io)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe XDR::Double, ".write" do
|
20
|
-
it "encodes values correctly" do
|
21
|
-
expect(write 0.0).to eq_bytes("\x00\x00\x00\x00\x00\x00\x00\x00")
|
22
|
-
expect(write -0.0).to eq_bytes("\x80\x00\x00\x00\x00\x00\x00\x00")
|
23
|
-
expect(write 1.0).to eq_bytes("\x3F\xF0\x00\x00\x00\x00\x00\x00")
|
24
|
-
expect(write -1.0).to eq_bytes("\xBF\xF0\x00\x00\x00\x00\x00\x00")
|
25
|
-
end
|
26
|
-
|
27
|
-
it "raises a WriteError when the value is not Float" do
|
28
|
-
expect{ write 3 }.to raise_error(XDR::WriteError)
|
29
|
-
expect{ write "hi" }.to raise_error(XDR::WriteError)
|
30
|
-
expect{ write "1.0" }.to raise_error(XDR::WriteError)
|
31
|
-
end
|
32
|
-
|
33
|
-
def write(val)
|
34
|
-
io = StringIO.new()
|
35
|
-
subject.write(val, io)
|
36
|
-
io.string
|
37
|
-
end
|
38
|
-
end
|