ciri-rlp 0.2.2 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a9c3349059c761090b9c9fd81eea54c8247d5ea7fa5b33d879822c12b3f0a1f0
4
- data.tar.gz: 3646c2b7ddcac8185eb4875c71c9a4ed802198f616155144c2f45466f1816399
3
+ metadata.gz: 9d767ee2b245808b3803b1de37c0560e8180b3ca4f5346caf268e0abf90d2b85
4
+ data.tar.gz: 4f7787004fdc1d205c9667cfa1b099291948996c37eae8fe4bdae00d6dc03f6b
5
5
  SHA512:
6
- metadata.gz: e7e175ab3452d4eda0487008a5cd1f6f3f6b14f922413d37672aa0f622cb76e0468feee44e558b00d4744c14499ffa6d7582b3fef005e603dadb3e01987e3c1e
7
- data.tar.gz: 35739e554737cc4314878f3e92c603a30dd984cbd6f788839071891de75bcdcb4052526154a3e1025466fa4bcd3d4b233471b152f5d6d8067535057ac55ec2eb
6
+ metadata.gz: 007ee152a9ba605c2499c8f7f55e204ce0674626de104985c300073f0ed135794cf6339616ca0fa7cfae5de80017bb2752e3dd93807ea7e8c15b969abc96ce0a
7
+ data.tar.gz: 727f98939b3c91f644cddbbcd94d5782c4fbf55659babddfe8441f997d4c0885578fb6d82acb0eba2ebc76574883ea79085b6f7cd7b162a6c8c8a075bef31ebf
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ciri-rlp (0.2.2)
4
+ ciri-rlp (1.0.0)
5
5
  ciri-utils (~> 0.2.1)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -34,17 +34,18 @@ Structure:
34
34
  ```ruby
35
35
  # declare a RLP structure
36
36
  class Doge
37
+ include Ciri
37
38
  include Ciri::RLP::Serializable
38
39
 
39
40
  # RLP is a low level encoding format, only support string(bytes) and list.
40
41
  # so we use a list to present structure data
41
42
  # we also need to declare column type clearly if column is not string
42
- schema [
43
- :name,
44
- {age: Integer}, # declare age is a Integer type
45
- :gender,
46
- {has_master: Ciri::RLP::Bool} # dechare bool
47
- ]
43
+ schema(
44
+ name: RLP::Bytes, # declare name a Bytes type, represent as normal ruby string
45
+ age: Integer, # declare age as a Integer type
46
+ gender: RLP::Bytes,
47
+ has_master: Ciri::RLP::Bool # dechare bool
48
+ )
48
49
  end
49
50
 
50
51
  doge = Doge.new(name: 'neo doge', age: 5, gender: "boy", has_master: false)
@@ -73,13 +73,13 @@ module Ciri
73
73
  i += 1
74
74
  end
75
75
  end
76
- elsif type == RawString
76
+ elsif type == Bytes
77
77
  str = decode_stream(s)
78
- raise RLP::InvalidError.new "decode #{str.class} from RawString" unless str.is_a?(String)
78
+ raise RLP::InvalidError.new "decode #{str.class} from Bytes" unless str.is_a?(String)
79
79
  str
80
- elsif type == RawList
80
+ elsif type == List
81
81
  list = decode_stream(s)
82
- raise RLP::InvalidError.new "decode #{list.class} from RawList" unless list.is_a?(Array)
82
+ raise RLP::InvalidError.new "decode #{list.class} from List" unless list.is_a?(Array)
83
83
  list
84
84
  elsif type == Raw
85
85
  decode_stream(s)
@@ -74,10 +74,10 @@ module Ciri
74
74
  end
75
75
  elsif type == Raw
76
76
  encode_raw(item)
77
- elsif type == RawString
77
+ elsif type == Bytes
78
78
  raise RLP::InvalidError.new "expect String, got #{item.class}" unless item.is_a?(String)
79
79
  encode_raw(item)
80
- elsif type == RawList
80
+ elsif type == List
81
81
  raise RLP::InvalidError.new "expect Array, got #{item.class}" unless item.is_a?(Array)
82
82
  encode_raw(item)
83
83
  else
@@ -30,24 +30,21 @@ module Ciri
30
30
  class Raw
31
31
  end
32
32
 
33
+ # represent Bytes
33
34
  class Bytes
34
35
  end
35
36
 
36
- RawString = Bytes
37
-
37
+ # represent List
38
38
  class List
39
39
  end
40
40
 
41
- RawList = List
42
-
43
41
  # Serializable module allow ruby objects serialize/deserialize to or from RLP encoding.
44
42
  # See Ciri::RLP::Serializable::TYPES for supported type.
45
43
  #
46
44
  # schema method define ordered data structure for class, and determine how to encoding objects.
47
45
  #
48
46
  # schema follow `{attr_name: type}` format,
49
- # if attr is raw type(string or array of string), you can just use `:attr_name` to define it
50
- # schema simple types include Integer, Bool, String, Array...
47
+ # schema support simple types: Integer, RLP::Bool, RLP::Bytes, RLP::List...
51
48
  #
52
49
  # schema also support complex types: array and serializable.
53
50
  #
@@ -59,21 +56,22 @@ module Ciri
59
56
  #
60
57
  # class AuthMsgV4
61
58
  # include Ciri::RLP::Serializable
59
+ # include Ciri
62
60
  #
63
61
  # # define schema
64
- # schema [
65
- # :signature, # raw type: string
66
- # {initiator_pubkey: MySerializableKey}, # this attr is a RLP serializable object
67
- # {nonce: [Integer]},
68
- # {version: Integer}
69
- # ]
62
+ # schema(
63
+ # signature: RLP::Bytes, # raw type: string
64
+ # initiator_pubkey: MySerializableKey, # this attr is a RLP serializable object
65
+ # nonce: [Integer],
66
+ # version: Integer
67
+ # )
70
68
  #
71
69
  # # default values
72
- # default_data(got_plain: false)
70
+ # default_data(version: 1)
73
71
  # end
74
72
  #
75
73
  # msg = AuthMsgV4.new(signature: "\x00", initiator_pubkey: my_pubkey, nonce: [1, 2, 3], version: 4)
76
- # encoded = msg.rlp_encode
74
+ # encoded = AuthMsgV4.rlp_encode(msg)
77
75
  # msg2 = AuthMsgV4.rlp_decode(encoded)
78
76
  # msg == msg2 # true
79
77
  #
@@ -93,24 +91,16 @@ module Ciri
93
91
  # keys return data columns array
94
92
  attr_reader :keys
95
93
 
96
- KeySchema = Struct.new(:type, :options, keyword_init: true)
94
+ KeySchema = Struct.new(:type, keyword_init: true)
97
95
 
98
96
  def initialize(schema)
99
97
  keys = []
100
98
  @_schema = {}
101
99
 
102
- schema.each do |key|
103
- if key.is_a?(Hash)
104
- options = [:optional].map {|o| [o, key.delete(o)]}.to_h
105
- raise InvalidSchemaError.new("include unknown options #{key}") unless key.size == 1
106
- key, type = key.to_a[0]
107
- else
108
- options = {}
109
- type = Raw
110
- end
100
+ schema.each do |key, type|
111
101
  raise InvalidSchemaError.new("incorrect type on key #{key}, #{type} is not a valid RLP class") unless check_key_type(type)
112
102
  keys << key
113
- @_schema[key] = KeySchema.new(type: type, options: options)
103
+ @_schema[key] = KeySchema.new(type: type)
114
104
  end
115
105
 
116
106
  @_schema.freeze
@@ -141,7 +131,6 @@ module Ciri
141
131
  data_list = []
142
132
  used_keys.each do |key|
143
133
  value = data[key]
144
- next if value.nil? && self[key].options[:optional]
145
134
  data_list << encode_with_type(value, self[key].type)
146
135
  end
147
136
  encode_list(data_list)
@@ -151,7 +140,6 @@ module Ciri
151
140
  values = decode_list(input) do |list, stream|
152
141
  keys.each do |key|
153
142
  # decode data by type
154
- next if stream.eof? && self[key].options[:optional]
155
143
  list << decode_with_type(stream, self[key].type)
156
144
  end
157
145
  end
@@ -1,5 +1,5 @@
1
1
  module Ciri
2
2
  module RLP
3
- VERSION = "0.2.2"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ciri-rlp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jiang Jinyang
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-21 00:00:00.000000000 Z
11
+ date: 2018-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ciri-utils