rlp-lite 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b94a62e8d77c1f5752f02e1088db2394fb281800a444fc744bcb17e2c8bb1d3f
4
- data.tar.gz: 4708183e54acac23ef32ebd0f74c2b78cdced4778752dbe6b2d51260363dd6b8
3
+ metadata.gz: 1ebdf026e59948e13d720bef7940d7b7235cd9f03ae9e8327431c0cbb71cf041
4
+ data.tar.gz: 49f5ea7e8a42793686d997919dd546f91578be192da69c85ac57558591309997
5
5
  SHA512:
6
- metadata.gz: 5fadf8e0fe94f689ba0ee198bd7e2d94c5bd6d606261d26c2308a2a676fe9ddb9e5489ec00ff31b2e592987727982b02bdeb48dea3ee105c8ab8ca1fa8b9988a
7
- data.tar.gz: 390a76f7d97500ee445e653a98eb250ff254f0936167e6900444f5e3540439453023f463c7272ed5d453416d2f2d2a46cd884736dc9399f26b6b1eb95c1c1f0a
6
+ metadata.gz: 56e0042122a25d23770570cb7837d67d31acc511957bd8c8e42e6b3d9e491dc52e7691909cc50d1d286118080b8429ab933f966ca8cb49116a2f9bce7070d9cd
7
+ data.tar.gz: 42f3bb460973d8cb111f1bcb3d7b10a36eb5ca1921a8eebbf575f90c3ed4f6c66d82146887675c81f09e1a292ff98657389d2db966ac770b38032f9d8221a225
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Recursive Length Prefix (RLP) Lite
2
2
 
3
3
 
4
- rlp-lite - light-weight machinery to serialize / deserialze via rlp
4
+ rlp-lite - light-weight machinery to serialize / deserialze via rlp (recursive length prefix)
5
5
 
6
6
 
7
7
 
@@ -15,9 +15,67 @@ rlp-lite - light-weight machinery to serialize / deserialze via rlp
15
15
 
16
16
  ## Usage
17
17
 
18
- to be done
19
18
 
19
+ ``` ruby
20
+ require 'rlp-lite'
20
21
 
22
+ ######
23
+ ## encode
24
+
25
+ list = ['ruby', 'rlp', 255]
26
+
27
+ encoded = Rlp.encode( list )
28
+ #=> "\xCB\x84ruby\x83rlp\x81\xFF".b
29
+
30
+ #######
31
+ ## decode
32
+
33
+ decoded = Rlp.decode( "\xCB\x84ruby\x83rlp\x81\xFF".b )
34
+ #=> ["ruby", "rlp", "\xFF".b]
35
+ ```
36
+
37
+
38
+
39
+ Note: All integers get returned (decoded) as big integers in binary buffers (that is, string with binary "ASCII-8BIT" encoding)
40
+ e.g. `"\xFF".b` and not `255`.
41
+
42
+
43
+
44
+ More examples from the official ethereum rlp tests,
45
+ see [test/data/rlptest.json](test/data/rlptest.json).
46
+
47
+
48
+ ``` ruby
49
+ ######
50
+ # lists of lists
51
+ obj = [ [ [], [] ], [] ]
52
+ encoded = Rlp.encode( obj )
53
+ #=> "\xC4\xC2\xC0\xC0\xC0".b
54
+
55
+ decoded = Rlp.decode( "\xC4\xC2\xC0\xC0\xC0".b )
56
+ #=> [[[], []], []]
57
+
58
+ # or using a hex string (not a binary buffer)
59
+ decoded = Rlp.decode( "0xc4c2c0c0c0" )
60
+ #=> [[[], []], []]
61
+
62
+
63
+ #####
64
+ # dict(onary)
65
+ obj = [["key1", "val1"],
66
+ ["key2", "val2"],
67
+ ["key3", "val3"],
68
+ ["key4", "val4"]]
69
+ encoded = Rlp.encode( obj )
70
+ #=> "\xEC\xCA\x84key1\x84val1\xCA\x84key2\x84val2\xCA\x84key3\x84val3\xCA\x84key4\x84val4".b
71
+
72
+ decoded = Rlp.decode( "\xEC\xCA\x84key1\x84val1\xCA\x84key2\x84val2\xCA\x84key3\x84val3\xCA\x84key4\x84val4".b )
73
+ #=> [["key1", "val1"], ["key2", "val2"], ["key3", "val3"], ["key4", "val4"]]
74
+
75
+ # or using a hex string (not a binary buffer)
76
+ decoded = Rlp.decode( "0xecca846b6579318476616c31ca846b6579328476616c32ca846b6579338476616c33ca846b6579348476616c34" )
77
+ #=> [["key1", "val1"], ["key2", "val2"], ["key3", "val3"], ["key4", "val4"]]
78
+ ```
21
79
 
22
80
 
23
81
  ## License
data/Rakefile CHANGED
@@ -2,6 +2,14 @@ require 'hoe'
2
2
  require './lib/rlp-lite/version.rb'
3
3
 
4
4
 
5
+ ###
6
+ # hack/ quick fix for broken intuit_values - overwrite with dummy
7
+ class Hoe
8
+ def intuit_values( input ); end
9
+ end
10
+
11
+
12
+
5
13
  Hoe.spec 'rlp-lite' do
6
14
 
7
15
  self.version = Rlp::VERSION
@@ -1,17 +1,17 @@
1
1
  module Rlp
2
2
 
3
+
3
4
  # Provides an RLP-decoder.
4
- module Decoder
5
- extend self
5
+ class Decoder
6
6
 
7
7
  # Decodes an RLP-encoded object.
8
8
  #
9
9
  # @param rlp [String] an RLP-encoded object.
10
10
  # @return [Object] the decoded and maybe deserialized object.
11
- # @raise [Eth::Rlp::DecodingError] if the input string does not end after
11
+ # @raise [Rlp::DecodingError] if the input string does not end after
12
12
  # the root item.
13
- def perform(rlp)
14
- rlp = Util.hex_to_bin( rlp ) if Util.is_hex?( rlp )
13
+ def perform( rlp )
14
+ rlp = Util.hex_to_bin( rlp ) if Util.is_hex?( rlp )
15
15
  rlp = Util.str_to_bytes( rlp )
16
16
  begin
17
17
  item, next_start = consume_item( rlp, 0 )
@@ -23,6 +23,7 @@
23
23
  end
24
24
 
25
25
 
26
+
26
27
  private
27
28
 
28
29
  # Consume an RLP-encoded item from the given start.
@@ -1,33 +1,40 @@
1
1
 
2
- # Provides an recursive-length prefix (RLP) encoder and decoder.
3
2
  module Rlp
4
3
 
4
+
5
5
  # Provides an RLP-encoder.
6
- module Encoder
7
- extend self
6
+ class Encoder
7
+
8
8
 
9
9
  # Encodes a Ruby object in RLP format.
10
10
  #
11
11
  # @param obj [Object] a Ruby object.
12
12
  # @return [String] the RLP encoded item.
13
- # @raise [Eth::Rlp::EncodingError] in the rather unlikely case that the item
13
+ # @raise [Rlp::EncodingError] in the rather unlikely case that the item
14
14
  # is too big to encode (will not happen).
15
- # @raise [Eth::Rlp::SerializationError] if the serialization fails.
16
- def perform(obj)
15
+ # @raise [Rlp::SerializationError] if the serialization fails.
16
+ def perform( obj )
17
17
  item = Sedes.infer(obj).serialize(obj)
18
18
  result = encode_raw( item )
19
19
  end
20
20
 
21
- private
21
+
22
+ private
22
23
 
23
24
  # Encodes the raw item.
24
- def encode_raw(item)
25
- return item if item.instance_of? Rlp::Data
26
- return encode_primitive item if Sedes.is_primitive? item
27
- return encode_list item if Sedes.is_list? item
28
- raise EncodingError "Cannot encode object of type #{item.class.name}"
25
+ def encode_raw( item )
26
+ if item.instance_of?( Rlp::Data )
27
+ item
28
+ elsif Util.is_primitive?( item )
29
+ encode_primitive item
30
+ elsif Util.is_list?( item )
31
+ encode_list item
32
+ else
33
+ raise EncodingError "Cannot encode object of type #{item.class.name}"
34
+ end
29
35
  end
30
36
 
37
+
31
38
  # Encodes a single primitive.
32
39
  def encode_primitive(item)
33
40
  return Util.str_to_bytes item if item.size == 1 && item.ord < PRIMITIVE_PREFIX_OFFSET
@@ -56,4 +63,4 @@
56
63
  end
57
64
  end
58
65
  end
59
- end # module Rlp
66
+ end # module Rlp
@@ -24,7 +24,7 @@
24
24
  raise SerializationError, "Can only serialize integers" unless obj.is_a?(Integer)
25
25
  raise SerializationError, "Cannot serialize negative integers" if obj < 0
26
26
  raise SerializationError, "Integer too large (does not fit in #{@size} bytes)" if @size && obj >= 256 ** @size
27
- s = obj == 0 ? BYTE_EMPTY : _int_to_big_endian(obj)
27
+ s = obj == 0 ? BYTE_EMPTY : _int_to_big_endian( obj )
28
28
  @size ? "#{BYTE_ZERO * [0, @size - s.size].max}#{s}" : s
29
29
  end
30
30
 
@@ -38,7 +38,7 @@
38
38
  raise DeserializationError, "Invalid serialization (wrong size)" if @size && serial.size != @size
39
39
  raise DeserializationError, "Invalid serialization (not minimal length)" if !@size && serial.size > 0 && serial[0] == BYTE_ZERO
40
40
  serial = serial || BYTE_ZERO
41
- _big_endian_to_int(serial)
41
+ _big_endian_to_int( serial )
42
42
  end
43
43
 
44
44
 
@@ -9,16 +9,18 @@
9
9
  # @param l [Integer] the fixed size of the binary.
10
10
  # @param allow_empty [Boolean] indicator wether empty binaries should be allowed.
11
11
  # @return [Eth::Rlp::Sedes::Binary] a serializable binary of fixed size.
12
- def self.fixed_length(l, allow_empty: false)
13
- new(min_length: l, max_length: l, allow_empty: allow_empty)
12
+ def self.fixed_length( l, allow_empty: false )
13
+ new( min_length: l,
14
+ max_length: l,
15
+ allow_empty: allow_empty )
14
16
  end
15
17
 
16
18
  # Checks wether the given object is of a valid binary type.
17
19
  #
18
20
  # @param obj [Object] the supposed binary item to check.
19
21
  # @return [Boolean] true if valid.
20
- def self.valid_type?(obj)
21
- obj.instance_of? String
22
+ def self.valid_type?( obj )
23
+ obj.instance_of?( String )
22
24
  end
23
25
 
24
26
 
@@ -27,7 +29,7 @@
27
29
  # @param min_length [Integer] the minimum size of the binary.
28
30
  # @param max_length [Integer] the maximum size of the binary.
29
31
  # @param allow_empty [Boolean] indicator wether empty binaries should be allowed.
30
- def initialize(min_length: 0, max_length: INFINITY, allow_empty: false)
32
+ def initialize( min_length: 0, max_length: INFINITY, allow_empty: false )
31
33
  @min_length = min_length
32
34
  @max_length = max_length
33
35
  @allow_empty = allow_empty
@@ -39,13 +41,17 @@
39
41
  # @return [Object] a serialized binary.
40
42
  # @raise [SerializationError] if provided object is of invalid type.
41
43
  # @raise [SerializationError] if provided binary is of invalid length.
42
- def serialize(obj)
43
- raise SerializationError, "Object is not a serializable (#{obj.class})" unless self.class.valid_type? obj
44
- serial = _str_to_bytes( obj )
45
- raise SerializationError, "Object has invalid length" unless valid_length? serial.size
44
+ def serialize( obj )
45
+ raise SerializationError, "Object is not a serializable (#{obj.class})" unless self.class.valid_type?( obj )
46
+
47
+ ## make sure string is with binary encoding (ASCII-8BIT)
48
+ ## note: was Util.str_to_bytes( obj )
49
+ serial = obj.encoding.name == 'ASCII-8BIT' ? obj : obj.b
50
+ raise SerializationError, "Object has invalid length" unless valid_length?( serial.size )
46
51
  serial
47
52
  end
48
53
 
54
+
49
55
  # Deserializes a binary.
50
56
  #
51
57
  # @param serial [Object] the serialized binary.
@@ -53,8 +59,8 @@
53
59
  # @raise [DeserializationError] if provided serial is of wrong type.
54
60
  # @raise [DeserializationError] if provided serial is of wrong length.
55
61
  def deserialize(serial)
56
- raise DeserializationError, "Objects of type #{serial.class} cannot be deserialized" unless _is_primitive? serial
57
- raise DeserializationError, "#{serial.class} has invalid length" unless valid_length? serial.size
62
+ raise DeserializationError, "Objects of type #{serial.class} cannot be deserialized" unless serial.instance_of?(String)
63
+ raise DeserializationError, "#{serial.class} has invalid length" unless valid_length?( serial.size )
58
64
  serial
59
65
  end
60
66
 
@@ -63,39 +69,11 @@
63
69
  #
64
70
  # @param length [Integer] the supposed length of the binary item.
65
71
  # @return [Boolean] true if valid.
66
- def valid_length?(length)
72
+ def valid_length?( length )
67
73
  (@min_length <= length && length <= @max_length) ||
68
74
  (@allow_empty && length == 0)
69
75
  end
70
76
 
71
- #######
72
- # private helpers
73
-
74
- # Converts a binary string to bytes.
75
- #
76
- # @param str [String] binary string to be converted.
77
- # @return [Object] the string bytes.
78
- def _str_to_bytes(str)
79
- _is_bytes?(str) ? str : str.b
80
- end
81
-
82
- # Checks if a string is a byte-string.
83
- #
84
- # @param str [String] a string to check.
85
- # @return [Boolean] true if it's an ASCII-8bit encoded byte-string.
86
- def _is_bytes?(str)
87
- str && str.instance_of?(String) && str.encoding.name == 'ASCII-8BIT'
88
- end
89
-
90
- # Checks if the given item is a string primitive.
91
- #
92
- # @param item [Object] the item to check.
93
- # @return [Boolean] true if it's a string primitive.
94
- def _is_primitive?(item)
95
- item.instance_of?(String)
96
- end
97
-
98
-
99
77
  end # class Binary
100
78
 
101
79
 
@@ -9,14 +9,14 @@
9
9
  #
10
10
  # @param elements [Array] an array indicating the structure of the list.
11
11
  # @param strict [Boolean] an option to enforce the given structure.
12
- def initialize(elements: [], strict: true)
12
+ def initialize( elements: [], strict: true )
13
13
  super()
14
14
 
15
15
  @strict = strict
16
16
  elements.each do |e|
17
17
  if Sedes.is_sedes?(e)
18
18
  push e
19
- elsif Sedes.is_list?(e)
19
+ elsif Util.is_list?(e)
20
20
  push List.new(elements: e)
21
21
  else
22
22
  raise TypeError, "Instances of List must only contain sedes objects or nested sequences thereof."
@@ -30,8 +30,8 @@
30
30
  # @return [Array] a serialized list.
31
31
  # @raise [SerializationError] if provided array is not a sequence.
32
32
  # @raise [SerializationError] if provided array is of wrong length.
33
- def serialize(obj)
34
- raise SerializationError, "Can only serialize sequences" unless Sedes.is_list?(obj)
33
+ def serialize( obj )
34
+ raise SerializationError, "Can only serialize sequences" unless Util.is_list?(obj)
35
35
  raise SerializationError, "List has wrong length" if (@strict && self.size != obj.size) || self.size < obj.size
36
36
  result = []
37
37
  obj.zip(self).each_with_index do |(element, sedes), i|
@@ -47,7 +47,7 @@
47
47
  # @raise [DeserializationError] if provided serial is not a sequence.
48
48
  # @raise [DeserializationError] if provided serial is of wrong length.
49
49
  def deserialize(serial)
50
- raise DeserializationError, "Can only deserialize sequences" unless Sedes.is_list?(serial)
50
+ raise DeserializationError, "Can only deserialize sequences" unless Util.is_list?(serial)
51
51
  raise DeserializationError, "List has wrong length" if @strict && serial.size != self.size
52
52
  result = []
53
53
  len = [serial.size, self.size].min
@@ -3,8 +3,7 @@
3
3
  module Rlp
4
4
  module Sedes
5
5
 
6
- # Provides a singleton {Rlp::Sedes} class to infer objects and types.
7
- class << self
6
+ # Provides a {Rlp::Sedes} module to infer objects and types.
8
7
 
9
8
  # Tries to find a sedes objects suitable for a given Ruby object.
10
9
  #
@@ -14,12 +13,18 @@
14
13
  #
15
14
  # @param obj [Object] the Ruby object for which to find a sedes object.
16
15
  # @raise [TypeError] if no appropriate sedes could be found.
17
- def infer(obj)
18
- return obj.class if is_sedes?( obj.class )
19
- return big_endian_int if obj.is_a?(Integer) && obj >= 0
20
- return binary if Binary.valid_type? obj
21
- return List.new(elements: obj.map { |item| infer( item ) }) if is_list?( obj )
22
- raise TypeError, "Did not find sedes handling type #{obj.class.name}"
16
+ def self.infer( obj )
17
+ if is_sedes?( obj.class )
18
+ obj.class
19
+ elsif obj.is_a?(Integer) && obj >= 0
20
+ big_endian_int
21
+ elsif Binary.valid_type?( obj ) ## note: same as obj.is_a?( String )
22
+ binary
23
+ elsif Util.is_list?( obj )
24
+ List.new( elements: obj.map { |item| infer( item ) } )
25
+ else
26
+ raise TypeError, "Did not find sedes handling type #{obj.class.name}"
27
+ end
23
28
  end
24
29
 
25
30
 
@@ -27,7 +32,7 @@
27
32
  #
28
33
  # @param obj [Object] the object to check.
29
34
  # @return [Boolean] true if it's serializable and deserializable.
30
- def is_sedes?(obj)
35
+ def self.is_sedes?(obj)
31
36
  obj.respond_to?(:serialize) && obj.respond_to?(:deserialize)
32
37
  end
33
38
 
@@ -35,39 +40,19 @@
35
40
  # unspecified length.
36
41
  #
37
42
  # @return [Rlp::Sedes::BigEndianInt] a big-endian, unsigned integer sedes.
38
- def big_endian_int
43
+ def self.big_endian_int
39
44
  @big_endian_int ||= BigEndianInt.new
40
45
  end
41
46
 
42
47
  # A utility to use a binary sedes type.
43
48
  #
44
49
  # @return [Rlp::Sedes::Binary] a binary sedes.
45
- def binary
50
+ def self.binary
46
51
  @binary ||= Binary.new
47
52
  end
48
53
 
49
- ##############################
50
- ### more helpers
51
54
 
52
- # Checks if the given item is a string primitive.
53
- #
54
- # @param item [Object] the item to check.
55
- # @return [Boolean] true if it's a string primitive.
56
- def is_primitive?(item)
57
- item.instance_of?(String)
58
- end
59
55
 
60
- # Checks if the given item is a list.
61
- #
62
- # @param item [Object] the item to check.
63
- # @return [Boolean] true if it's a list.
64
- def is_list?(item)
65
- !is_primitive?(item) && item.respond_to?(:each)
66
- end
67
56
 
68
-
69
-
70
-
71
- end
72
- end
73
- end # module Rlp
57
+ end # module Sedes
58
+ end # module Rlp
data/lib/rlp-lite/util.rb CHANGED
@@ -11,8 +11,8 @@ module Util
11
11
  # @param str [String] a string to be checked.
12
12
  # @return [String] a match if true; `nil` if not.
13
13
  def is_hex?(str)
14
- return false unless str.is_a? String
15
- str = remove_hex_prefix str
14
+ return false unless str.is_a?( String )
15
+ str = remove_hex_prefix( str )
16
16
  str.match /\A[0-9a-fA-F]*\z/
17
17
  end
18
18
 
@@ -21,7 +21,7 @@ module Util
21
21
  # @param hex [String] a prefixed hex-string.
22
22
  # @return [String] an unprefixed hex-string.
23
23
  def remove_hex_prefix(hex)
24
- return hex[2..-1] if is_prefixed? hex
24
+ return hex[2..-1] if is_prefixed?( hex )
25
25
  return hex
26
26
  end
27
27
 
@@ -39,9 +39,9 @@ module Util
39
39
  # @param hex [String] a hexa-decimal string to be packed.
40
40
  # @return [String] a packed binary string.
41
41
  # @raise [TypeError] if value is not a string or string is not hex.
42
- def hex_to_bin(hex)
42
+ def hex_to_bin( hex )
43
43
  raise TypeError, "Value must be an instance of String" unless hex.instance_of? String
44
- hex = remove_hex_prefix hex
44
+ hex = remove_hex_prefix( hex )
45
45
  raise TypeError, "Non-hexadecimal digit found" unless is_hex? hex
46
46
  [hex].pack("H*")
47
47
  end
@@ -104,5 +104,24 @@ module Util
104
104
  end
105
105
 
106
106
 
107
+ # Checks if the given item is a string primitive.
108
+ #
109
+ # @param item [Object] the item to check.
110
+ # @return [Boolean] true if it's a string primitive.
111
+ def is_primitive?( item )
112
+ item.instance_of?(String)
113
+ end
114
+
115
+ # Checks if the given item is a list.
116
+ #
117
+ # @param item [Object] the item to check.
118
+ # @return [Boolean] true if it's a list.
119
+ def is_list?( item )
120
+ !is_primitive?(item) && item.respond_to?(:each)
121
+ end
122
+
123
+
124
+
125
+
107
126
  end # module Util
108
127
  end # module Rlp
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Rlp
3
- VERSION='0.0.1'
3
+ VERSION='0.1.0'
4
4
  end
5
5
 
data/lib/rlp-lite.rb CHANGED
@@ -22,23 +22,14 @@ module Rlp
22
22
  ## todo/check - use encoding -ascii-8bit for source file or ? - why? why not?
23
23
  ## use #b/.b to ensure binary encoding? - why? why not?
24
24
  BYTE_EMPTY = "".freeze # The empty byte is defined as "".
25
- BYTE_ZERO = "\x00".freeze # The zero byte is 0x00.
26
- BYTE_ONE = "\x01".freeze # The byte one is 0x01.
25
+ BYTE_ZERO = "\x00".freeze # The zero byte is 0x00.
26
+ BYTE_ONE = "\x01".freeze # The byte one is 0x01.
27
27
 
28
28
 
29
-
30
- # The RLP short length limit.
31
- SHORT_LENGTH_LIMIT = 56
32
-
33
- # The RLP long length limit.
34
- LONG_LENGTH_LIMIT = (256 ** 8)
35
-
36
- # The RLP primitive type offset.
37
- PRIMITIVE_PREFIX_OFFSET = 0x80
38
-
39
- # The RLP array type offset.
40
- LIST_PREFIX_OFFSET = 0xc0
41
-
29
+ SHORT_LENGTH_LIMIT = 56 # The RLP short length limit.
30
+ LONG_LENGTH_LIMIT = (256 ** 8) # The RLP long length limit.
31
+ PRIMITIVE_PREFIX_OFFSET = 0x80 # The RLP primitive type offset.
32
+ LIST_PREFIX_OFFSET = 0xc0 # The RLP array type offset.
42
33
 
43
34
  # Infinity as constant for convenience.
44
35
  INFINITY = (1.0 / 0.0)
@@ -63,18 +54,24 @@ module Rlp
63
54
  class Data < String; end
64
55
 
65
56
 
57
+ def self.encoder() @encoder ||= Encoder.new; end
58
+ def self.decoder() @decoder ||= Decoder.new; end
59
+
60
+
66
61
  # Performes an {Rlp::Encoder} on any ruby object.
67
62
  #
68
63
  # @param obj [Object] any ruby object.
69
64
  # @return [String] a packed, RLP-encoded item.
70
- def self.encode(obj) Encoder.perform( obj ); end
65
+ def self.encode(obj) encoder.perform( obj ); end
71
66
 
72
67
 
73
68
  # Performes an {Rlp::Decoder} on any RLP-encoded item.
74
69
  #
75
70
  # @param rlp [String] a packed, RLP-encoded item.
76
71
  # @return [Object] a decoded ruby object.
77
- def self.decode(rlp) Decoder.perform( rlp ); end
72
+ def self.decode(rlp) decoder.perform( rlp ); end
73
+
74
+
78
75
  end # module Rlp
79
76
 
80
77
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rlp-lite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer