xdr 3.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -9
  3. data/README.md +4 -2
  4. data/lib/xdr/concerns/converts_to_xdr.rb +30 -31
  5. data/lib/xdr/union.rb +7 -4
  6. data/lib/xdr/version.rb +1 -1
  7. metadata +43 -114
  8. data/.gitignore +0 -15
  9. data/.travis.yml +0 -9
  10. data/.yardopts +0 -7
  11. data/Gemfile +0 -4
  12. data/Guardfile +0 -5
  13. data/Rakefile +0 -9
  14. data/examples/enum.rb +0 -30
  15. data/examples/struct.rb +0 -24
  16. data/examples/union.rb +0 -29
  17. data/spec/lib/xdr/array_spec.rb +0 -73
  18. data/spec/lib/xdr/bool_spec.rb +0 -43
  19. data/spec/lib/xdr/concerns/converts_to_xdr_spec.rb +0 -88
  20. data/spec/lib/xdr/concerns/reads_bytes_spec.rb +0 -57
  21. data/spec/lib/xdr/double_spec.rb +0 -38
  22. data/spec/lib/xdr/dsl/enum_spec.rb +0 -44
  23. data/spec/lib/xdr/dsl/struct_spec.rb +0 -29
  24. data/spec/lib/xdr/dsl/union_spec.rb +0 -69
  25. data/spec/lib/xdr/enum_spec.rb +0 -70
  26. data/spec/lib/xdr/float_spec.rb +0 -37
  27. data/spec/lib/xdr/hyper_spec.rb +0 -40
  28. data/spec/lib/xdr/int_spec.rb +0 -40
  29. data/spec/lib/xdr/opaque_spec.rb +0 -40
  30. data/spec/lib/xdr/option_spec.rb +0 -36
  31. data/spec/lib/xdr/quadruple_spec.rb +0 -14
  32. data/spec/lib/xdr/rpc/record_reader_spec.rb +0 -27
  33. data/spec/lib/xdr/string_spec.rb +0 -47
  34. data/spec/lib/xdr/struct_spec.rb +0 -101
  35. data/spec/lib/xdr/union_spec.rb +0 -258
  36. data/spec/lib/xdr/unsigned_hyper_spec.rb +0 -36
  37. data/spec/lib/xdr/unsigned_int_spec.rb +0 -36
  38. data/spec/lib/xdr/var_array_spec.rb +0 -71
  39. data/spec/lib/xdr/var_opaque_spec.rb +0 -50
  40. data/spec/lib/xdr/void_spec.rb +0 -46
  41. data/spec/spec_helper.rb +0 -15
  42. data/spec/support/matchers/eq_bytes.rb +0 -6
  43. data/xdr.gemspec +0 -28
data/.gitignore DELETED
@@ -1,15 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/generated
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.bundle
11
- *.so
12
- *.o
13
- *.a
14
- mkmf.log
15
- .DS_Store
@@ -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
@@ -1,7 +0,0 @@
1
- --output-dir doc/generated
2
- --protected
3
- --no-private
4
- --embed-mixin ClassMethods
5
- lib/**/*.rb
6
- -
7
- doc/*.md
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in xdr.gemspec
4
- gemspec
data/Guardfile DELETED
@@ -1,5 +0,0 @@
1
- guard :rspec, cmd: 'bundle exec rspec' do
2
- watch(%r{^spec/.+_spec\.rb$})
3
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
- watch('spec/spec_helper.rb') { "spec" }
5
- end
data/Rakefile DELETED
@@ -1,9 +0,0 @@
1
- require "bundler/gem_tasks"
2
-
3
- begin
4
- require 'rspec/core/rake_task'
5
- RSpec::Core::RakeTask.new(:spec)
6
- task :default => :spec
7
- rescue LoadError
8
- end
9
-
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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