xdr 3.0.1 → 3.0.2
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.
- 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
|