nis-ruby 0.0.16 → 0.0.17
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/README.md +43 -33
- data/examples/account/generate.rb +29 -0
- data/examples/account/get.rb +26 -0
- data/examples/account/harvests.rb +8 -0
- data/examples/account/historical.rb +13 -0
- data/examples/account/importances.rb +8 -0
- data/examples/account/lock.rb +8 -0
- data/examples/account/mosaic.rb +9 -0
- data/examples/account/namespace.rb +8 -0
- data/examples/account/status.rb +8 -0
- data/examples/account/transfers.rb +16 -0
- data/examples/account/unconfirmed_transactions.rb +8 -0
- data/examples/account/unlock.rb +8 -0
- data/examples/account/unlocked.rb +8 -0
- data/examples/block/at_public.rb +4 -0
- data/examples/block/get.rb +4 -0
- data/examples/debug/connections.rb +13 -0
- data/examples/debug/time_synchronization.rb +6 -0
- data/examples/local/account_transfers.rb +20 -0
- data/examples/local/chain_blocks_after.rb +8 -0
- data/examples/namespace/mosaic_definition.rb +6 -0
- data/examples/namespace/root.rb +6 -0
- data/examples/nis.rb +11 -7
- data/examples/node/active_peers.rb +6 -0
- data/examples/node/boot.rb +25 -0
- data/examples/node/info.rb +8 -0
- data/examples/node/peerlist.rb +14 -0
- data/examples/time_sync/network_time.rb +6 -0
- data/examples/transactions/get.rb +42 -0
- data/examples/transactions/importance_transfer.rb +6 -4
- data/examples/transactions/mosaic_definition_creation.rb +6 -4
- data/examples/transactions/mosaic_supply_change.rb +6 -4
- data/examples/transactions/multisig.rb +6 -4
- data/examples/transactions/multisig_add_cosignatory.rb +3 -1
- data/examples/transactions/multisig_aggregate_modification.rb +6 -4
- data/examples/transactions/multisig_signature.rb +6 -3
- data/examples/transactions/provision_namespace.rb +6 -4
- data/examples/transactions/transfer.rb +14 -7
- data/examples/transactions/transfer_mosaic.rb +5 -3
- data/examples/transactions/transfer_remote.rb +6 -4
- data/lib/nis.rb +6 -0
- data/lib/nis/client.rb +11 -0
- data/lib/nis/configuration.rb +23 -0
- data/lib/nis/endpoint/account/transfers.rb +24 -0
- data/lib/nis/endpoint/debug/connections.rb +17 -0
- data/lib/nis/endpoint/local/account/transfers.rb +14 -0
- data/lib/nis/endpoint/node/peer_list.rb +20 -0
- data/lib/nis/endpoint/time_sync.rb +4 -0
- data/lib/nis/endpoint/time_sync/network_time.rb +10 -0
- data/lib/nis/endpoint/transaction/get.rb +12 -0
- data/lib/nis/keypair.rb +13 -7
- data/lib/nis/struct.rb +1 -0
- data/lib/nis/struct/importance_transfer_transaction.rb +10 -0
- data/lib/nis/struct/message.rb +9 -2
- data/lib/nis/struct/mosaic_definition_creation_transaction.rb +15 -0
- data/lib/nis/struct/mosaic_supply_change_transaction.rb +12 -0
- data/lib/nis/struct/multisig_aggregate_modification_transaction.rb +10 -0
- data/lib/nis/struct/multisig_signature_transaction.rb +12 -0
- data/lib/nis/struct/multisig_transaction.rb +15 -0
- data/lib/nis/struct/network_time.rb +17 -0
- data/lib/nis/struct/provision_namespace_transaction.rb +16 -0
- data/lib/nis/struct/transaction.rb +4 -81
- data/lib/nis/struct/transaction_meta_data_pair.rb +17 -1
- data/lib/nis/struct/transfer_transaction.rb +11 -0
- data/lib/nis/unit/address.rb +11 -4
- data/lib/nis/util.rb +3 -1
- data/lib/nis/util/convert.rb +44 -51
- data/lib/nis/util/deserializer.rb +62 -77
- data/lib/nis/util/ed25519.rb +10 -12
- data/lib/nis/util/serializer.rb +117 -185
- data/lib/nis/version.rb +1 -1
- data/nis.gemspec +0 -3
- metadata +43 -26
- data/bin/nis +0 -60
- data/examples/account.rb +0 -44
- data/examples/block.rb +0 -9
- data/examples/debug.rb +0 -33
- data/examples/local.rb +0 -19
- data/examples/namespace.rb +0 -9
- data/examples/node.rb +0 -44
- data/examples/shutdown.rb +0 -6
data/lib/nis/util/serializer.rb
CHANGED
@@ -4,61 +4,60 @@ module Nis::Util
|
|
4
4
|
# @param [Hash] entity
|
5
5
|
# @return [Array]
|
6
6
|
def self.serialize_transaction(entity)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
specific = case entity[:type]
|
8
|
+
when 0x0101 then serialize_transfer(entity)
|
9
|
+
when 0x0801 then serialize_importance_transfer(entity)
|
10
|
+
when 0x1001 then serialize_multisig_aggregate_modification(entity)
|
11
|
+
when 0x1002 then serialize_multisig_signature(entity)
|
12
|
+
when 0x1004 then serialize_multisig(entity)
|
13
|
+
when 0x2001 then serialize_provision_namespace(entity)
|
14
|
+
when 0x4001 then serialize_mosaic_definition_creation(entity)
|
15
|
+
when 0x4002 then serialize_mosaic_supply_change(entity)
|
16
16
|
else raise "Not implemented entity type: #{entity[:type]}"
|
17
17
|
end
|
18
|
-
|
18
|
+
serialize_common(entity) + specific
|
19
19
|
end
|
20
20
|
|
21
|
+
private
|
22
|
+
|
21
23
|
def self.serialize_transfer(entity)
|
22
24
|
a = []
|
23
|
-
|
24
|
-
a
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
temp = hex2ua(entity[:message][:payload])
|
29
|
-
if temp.size == 0
|
30
|
-
a += [0, 0, 0, 0]
|
25
|
+
a.concat serialize_safe_string(entity[:recipient])
|
26
|
+
a.concat serialize_long(entity[:amount])
|
27
|
+
payload = Nis::Util::Convert.hex2ua(entity[:message][:payload])
|
28
|
+
if payload.size == 0
|
29
|
+
a.concat [0, 0, 0, 0]
|
31
30
|
else
|
32
|
-
a
|
33
|
-
a
|
34
|
-
a
|
35
|
-
a
|
31
|
+
a.concat serialize_int(payload.size + 8)
|
32
|
+
a.concat serialize_int(entity[:message][:type])
|
33
|
+
a.concat serialize_int(payload.size)
|
34
|
+
a.concat payload
|
35
|
+
end
|
36
|
+
if entity[:mosaics] && entity[:mosaics].size > 0
|
37
|
+
a.concat serialize_mosaics(entity[:mosaics])
|
36
38
|
end
|
37
39
|
a
|
38
40
|
end
|
39
41
|
|
40
42
|
def self.serialize_importance_transfer(entity)
|
41
43
|
a = []
|
42
|
-
a
|
43
|
-
|
44
|
-
|
45
|
-
a
|
46
|
-
a += temp
|
47
|
-
a
|
44
|
+
a.concat serialize_int(entity[:mode])
|
45
|
+
temp = Nis::Util::Convert.hex2ua(entity[:remoteAccount])
|
46
|
+
a.concat serialize_int(temp.size)
|
47
|
+
a.concat temp
|
48
48
|
end
|
49
49
|
|
50
50
|
def self.serialize_multisig_aggregate_modification(entity)
|
51
51
|
a = []
|
52
|
-
a
|
53
|
-
|
54
|
-
|
55
|
-
b
|
56
|
-
b
|
57
|
-
b
|
58
|
-
b += serialize_int(32)
|
59
|
-
b += hex2ua(mod[:cosignatoryAccount])
|
52
|
+
a.concat serialize_int(entity[:modifications].size)
|
53
|
+
mods = entity[:modifications].inject([]) do |b, mod|
|
54
|
+
b.concat serialize_int(40)
|
55
|
+
b.concat serialize_int(mod[:modificationType])
|
56
|
+
b.concat serialize_int(32)
|
57
|
+
b.concat Nis::Util::Convert.hex2ua(mod[:cosignatoryAccount])
|
60
58
|
b
|
61
|
-
end
|
59
|
+
end
|
60
|
+
a.concat mods
|
62
61
|
|
63
62
|
# The following part describes the minimum cosignatories modification.
|
64
63
|
# The part is optional. Version 1 aggregate modification transactions should omit this part.
|
@@ -66,10 +65,10 @@ module Nis::Util
|
|
66
65
|
# should only write the length field with value 0x00, 0x00, 0x00, 0x00.
|
67
66
|
if true # only version2
|
68
67
|
if entity[:minCosignatories][:relativeChange] > 0
|
69
|
-
a
|
70
|
-
a
|
68
|
+
a.concat serialize_int(4)
|
69
|
+
a.concat serialize_int(entity[:minCosignatories][:relativeChange])
|
71
70
|
else
|
72
|
-
a
|
71
|
+
a.concat [0, 0, 0, 0]
|
73
72
|
end
|
74
73
|
end
|
75
74
|
a
|
@@ -77,105 +76,86 @@ module Nis::Util
|
|
77
76
|
|
78
77
|
def self.serialize_multisig_signature(entity)
|
79
78
|
a = []
|
80
|
-
|
81
|
-
|
82
|
-
a
|
83
|
-
a
|
84
|
-
a
|
85
|
-
a += serialize_safe_string(entity[:otherAccount])
|
79
|
+
temp = Nis::Util::Convert.hex2ua(entity[:otherHash][:data])
|
80
|
+
a.concat serialize_int(4 + temp.size)
|
81
|
+
a.concat serialize_int(temp.size)
|
82
|
+
a.concat temp
|
83
|
+
a.concat serialize_safe_string(entity[:otherAccount])
|
86
84
|
end
|
87
85
|
|
88
86
|
def self.serialize_multisig(entity)
|
89
87
|
a = []
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
when
|
94
|
-
when
|
95
|
-
when 0x1001 then serialize_multisig_aggregate_modification(other_tx)
|
88
|
+
other = entity[:otherTrans]
|
89
|
+
tx = case other[:type]
|
90
|
+
when 0x0101 then serialize_transfer(other)
|
91
|
+
when 0x0801 then serialize_importance_transfer(other)
|
92
|
+
when 0x1001 then serialize_multisig_aggregate_modification(other)
|
96
93
|
else raise "Unexpected type #{other_tx[:type]}"
|
97
94
|
end
|
98
|
-
|
99
|
-
a
|
100
|
-
a
|
95
|
+
tx = serialize_common(other) + tx
|
96
|
+
a.concat serialize_int(tx.size)
|
97
|
+
a.concat tx
|
101
98
|
end
|
102
99
|
|
103
100
|
def self.serialize_provision_namespace(entity)
|
104
101
|
a = []
|
105
|
-
a
|
106
|
-
a
|
107
|
-
|
108
|
-
|
109
|
-
a
|
110
|
-
a += temp
|
102
|
+
a.concat serialize_safe_string(entity[:rentalFeeSink])
|
103
|
+
a.concat serialize_long(entity[:rentalFee])
|
104
|
+
temp = Nis::Util::Convert.hex2ua(Nis::Util::Convert.utf8_to_hex(entity[:newPart]))
|
105
|
+
a.concat serialize_int(temp.size)
|
106
|
+
a.concat temp
|
111
107
|
if entity[:parent]
|
112
|
-
temp = hex2ua(utf8_to_hex(entity[:parent]))
|
113
|
-
a
|
114
|
-
a
|
108
|
+
temp = Nis::Util::Convert.hex2ua(Nis::Util::Convert.utf8_to_hex(entity[:parent]))
|
109
|
+
a.concat serialize_int(temp.size)
|
110
|
+
a.concat temp
|
115
111
|
else
|
116
|
-
a
|
112
|
+
a.concat [255, 255, 255, 255]
|
117
113
|
end
|
118
114
|
a
|
119
115
|
end
|
120
116
|
|
121
117
|
def self.serialize_mosaic_definition_creation(entity)
|
122
118
|
a = []
|
123
|
-
a
|
124
|
-
a
|
125
|
-
a
|
126
|
-
a += serialize_long(entity[:creationFee])
|
127
|
-
a
|
119
|
+
a.concat serialize_mosaic_definition(entity[:mosaicDefinition])
|
120
|
+
a.concat serialize_safe_string(entity[:creationFeeSink])
|
121
|
+
a.concat serialize_long(entity[:creationFee])
|
128
122
|
end
|
129
123
|
|
130
124
|
def self.serialize_mosaic_supply_change(entity)
|
131
125
|
a = []
|
132
|
-
a
|
133
|
-
|
134
|
-
|
135
|
-
a_ns_len = serialize_int(a_ns.size)
|
136
|
-
a_mo = hex2ua(utf8_to_hex(mo_id[:name]))
|
137
|
-
a_mo_len = serialize_int(a_mo.size)
|
138
|
-
a += serialize_int((a_ns_len + a_ns + a_mo_len + a_mo).size)
|
139
|
-
a += a_ns_len
|
140
|
-
a += a_ns
|
141
|
-
a += a_mo_len
|
142
|
-
a += a_mo
|
143
|
-
a += serialize_int(entity[:supplyType])
|
144
|
-
a += serialize_long(entity[:delta])
|
145
|
-
a
|
126
|
+
a.concat serialize_mosaic_id(entity[:mosaicId])
|
127
|
+
a.concat serialize_int(entity[:supplyType])
|
128
|
+
a.concat serialize_long(entity[:delta])
|
146
129
|
end
|
147
130
|
|
148
|
-
private
|
149
|
-
|
150
131
|
def self.serialize_common(entity)
|
151
132
|
a = []
|
152
|
-
a
|
153
|
-
a
|
154
|
-
a
|
133
|
+
a.concat serialize_int(entity[:type])
|
134
|
+
a.concat serialize_int(entity[:version])
|
135
|
+
a.concat serialize_int(entity[:timeStamp])
|
155
136
|
|
156
|
-
|
157
|
-
a
|
158
|
-
a
|
137
|
+
signer = Nis::Util::Convert.hex2ua(entity[:signer])
|
138
|
+
a.concat serialize_int(signer.size)
|
139
|
+
a.concat signer
|
159
140
|
|
160
|
-
a
|
161
|
-
a
|
162
|
-
a
|
141
|
+
a.concat serialize_long(entity[:fee].to_i)
|
142
|
+
a.concat serialize_int(entity[:deadline])
|
163
143
|
end
|
164
144
|
|
165
145
|
# Safe String - Each char is 8 bit
|
166
146
|
# @param [String] str
|
167
147
|
# @return [Array]
|
168
148
|
def self.serialize_safe_string(str)
|
169
|
-
return [
|
170
|
-
return [
|
149
|
+
return [255, 255, 255, 255] if str.nil?
|
150
|
+
return [0, 0, 0, 0] if str.empty?
|
171
151
|
[str.size, 0, 0, 0] + str.bytes
|
172
152
|
end
|
173
153
|
|
174
154
|
# @param [String] str
|
175
155
|
# @return [Array]
|
176
156
|
def self.serialize_bin_string(str)
|
177
|
-
return [
|
178
|
-
return [
|
157
|
+
return [255, 255, 255, 255] if str.nil?
|
158
|
+
return [0, 0, 0, 0] if str.empty?
|
179
159
|
chars = str.is_a?(String) ? str.chars : str
|
180
160
|
[chars.size, 0, 0, 0] + chars.map(&:to_i)
|
181
161
|
end
|
@@ -183,19 +163,20 @@ module Nis::Util
|
|
183
163
|
# @param [Integer] value
|
184
164
|
# @return [Array]
|
185
165
|
def self.serialize_int(value)
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
166
|
+
[value].pack('I').unpack('C4')
|
167
|
+
# a = [0, 0, 0, 0]
|
168
|
+
# bin = sprintf('%032b', value)
|
169
|
+
# 0.upto(bin.size / 8 - 1) do |i|
|
170
|
+
# a[i] = 0xFF & (value >> 8 * i)
|
171
|
+
# end
|
172
|
+
# a
|
192
173
|
end
|
193
174
|
|
194
175
|
# @param [Integer] value
|
195
176
|
# @return [Array]
|
196
177
|
def self.serialize_long(value)
|
197
|
-
a = [
|
198
|
-
bin = sprintf('%040b',
|
178
|
+
a = [0, 0, 0, 0, 0, 0, 0, 0]
|
179
|
+
bin = sprintf('%040b', value)
|
199
180
|
0.upto(bin.size / 8 - 1) do |i|
|
200
181
|
a[i] = 0xFF & (value >> 8 * i)
|
201
182
|
end
|
@@ -204,39 +185,30 @@ module Nis::Util
|
|
204
185
|
|
205
186
|
# @param [Nis::Struct::Mosaic] mosaic
|
206
187
|
# @return [Array]
|
207
|
-
def self.serialize_mosaic_and_quantity(
|
208
|
-
a = []
|
209
|
-
|
210
|
-
|
211
|
-
a[0] = serialized_mosaic_id.size + serialized_quantity.size
|
212
|
-
a += serialized_mosaic_id + serialized_quantity
|
188
|
+
def self.serialize_mosaic_and_quantity(mosaic_attachment)
|
189
|
+
a = []
|
190
|
+
a.concat serialize_mosaic_id(mosaic_attachment[:mosaicId])
|
191
|
+
a.concat serialize_long(mosaic_attachment[:quantity])
|
213
192
|
end
|
214
193
|
|
215
194
|
# @param [Array <Nis::Struct::Mosaic>] entities
|
216
195
|
# @return [Array]
|
217
196
|
def self.serialize_mosaics(entities)
|
218
|
-
a = []
|
219
|
-
a
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
ent.quantity,
|
226
|
-
].join(':') }
|
227
|
-
end.sort_by do |ent|
|
228
|
-
ent[:value]
|
229
|
-
end.map do |ent|
|
230
|
-
serialize_mosaic_and_quantity(ent[:entity])
|
231
|
-
end.flatten
|
197
|
+
a = []
|
198
|
+
a.concat serialize_int(entities.size)
|
199
|
+
mosaics = entities.inject([]) do |memo, ent|
|
200
|
+
memo.concat serialize_mosaic_and_quantity(ent)
|
201
|
+
end
|
202
|
+
a.concat serialize_int(mosaics.size)
|
203
|
+
a.concat mosaics
|
232
204
|
end
|
233
205
|
|
234
206
|
# @param [Hash] entity
|
235
207
|
# @return [Array]
|
236
208
|
def self.serialize_mosaic_id(entity)
|
237
209
|
a = []
|
238
|
-
a
|
239
|
-
a
|
210
|
+
a.concat serialize_safe_string(entity[:namespaceId])
|
211
|
+
a.concat serialize_safe_string(entity[:name])
|
240
212
|
serialize_int(a.size) + a
|
241
213
|
end
|
242
214
|
|
@@ -244,8 +216,8 @@ module Nis::Util
|
|
244
216
|
# @return [Array]
|
245
217
|
def self.serialize_property(entity)
|
246
218
|
a = []
|
247
|
-
a
|
248
|
-
a
|
219
|
+
a.concat serialize_safe_string(entity[:name])
|
220
|
+
a.concat serialize_safe_string(entity[:value])
|
249
221
|
serialize_int(a.size) + a
|
250
222
|
end
|
251
223
|
|
@@ -258,10 +230,9 @@ module Nis::Util
|
|
258
230
|
'supplyMutable' => 3,
|
259
231
|
'transferable' => 4
|
260
232
|
}
|
261
|
-
|
262
|
-
|
263
|
-
.
|
264
|
-
serialize_int(entities.size) + a
|
233
|
+
serialize_int(entities.size) + entities
|
234
|
+
.sort_by { |ent| order[ent[:name]] }
|
235
|
+
.inject([]) { |memo, ent| memo + serialize_property(ent) }
|
265
236
|
end
|
266
237
|
|
267
238
|
# @param [Hash] entity
|
@@ -269,10 +240,10 @@ module Nis::Util
|
|
269
240
|
def self.serialize_levy(entity)
|
270
241
|
return [0, 0, 0, 0] if entity.nil?
|
271
242
|
a = []
|
272
|
-
a
|
273
|
-
a
|
274
|
-
a
|
275
|
-
a
|
243
|
+
a.concat serialize_int(entity[:type])
|
244
|
+
a.concat serialize_safe_string(entity[:recipient])
|
245
|
+
a.concat serialize_mosaic_id(entity[:mosaicId])
|
246
|
+
a.concat serialize_long(entity[:fee])
|
276
247
|
serialize_int(a.size) + a
|
277
248
|
end
|
278
249
|
|
@@ -280,53 +251,14 @@ module Nis::Util
|
|
280
251
|
# @return [Array]
|
281
252
|
def self.serialize_mosaic_definition(entity)
|
282
253
|
a = []
|
283
|
-
|
284
|
-
a
|
285
|
-
a
|
286
|
-
a
|
287
|
-
a
|
288
|
-
a
|
289
|
-
a
|
254
|
+
creator = Nis::Util::Convert.hex2ua(entity[:creator])
|
255
|
+
a.concat serialize_int(creator.size)
|
256
|
+
a.concat creator
|
257
|
+
a.concat serialize_mosaic_id(entity[:id])
|
258
|
+
a.concat serialize_bin_string(Nis::Util::Convert.hex2ua(Nis::Util::Convert.utf8_to_hex(entity[:description])))
|
259
|
+
a.concat serialize_properties(entity[:properties])
|
260
|
+
a.concat serialize_levy(entity[:levy])
|
290
261
|
serialize_int(a.size) + a
|
291
262
|
end
|
292
|
-
|
293
|
-
# @param [String] hex
|
294
|
-
# @return [Array]
|
295
|
-
def self.hex2ua(hex)
|
296
|
-
hex.scan(/../).map(&:hex)
|
297
|
-
end
|
298
|
-
|
299
|
-
# @param [String] hex
|
300
|
-
# @return [Array]
|
301
|
-
def self.hex2ua_reversed(hex)
|
302
|
-
hex2ua(hex).reverse
|
303
|
-
end
|
304
|
-
|
305
|
-
# @param [Array] bin
|
306
|
-
# @return [String]
|
307
|
-
def self.bin2hex(bin)
|
308
|
-
bin.map { |v| '%02x' % v }.join
|
309
|
-
end
|
310
|
-
|
311
|
-
# @param [String] str
|
312
|
-
# @return [String]
|
313
|
-
def self.utf8_to_hex(str)
|
314
|
-
rstr2utf8(str).each_byte.map { |b| b.to_s(16) }.join
|
315
|
-
end
|
316
|
-
|
317
|
-
# @param [String] str
|
318
|
-
# @return [String]
|
319
|
-
def self.rstr2utf8(str)
|
320
|
-
str.unpack('U*').map do |c|
|
321
|
-
case
|
322
|
-
when c < 128
|
323
|
-
c
|
324
|
-
when 128 < c && c < 2048
|
325
|
-
[((c >> 6) | 192), ((c & 63) | 128)]
|
326
|
-
else
|
327
|
-
[((c >> 12) | 224), (((c >> 6) & 63) | 128), ((c & 63) | 128)]
|
328
|
-
end
|
329
|
-
end.flatten.map(&:chr).join
|
330
|
-
end
|
331
263
|
end
|
332
264
|
end
|
data/lib/nis/version.rb
CHANGED
data/nis.gemspec
CHANGED
@@ -21,8 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
22
22
|
f.match(%r{^(test|spec|features)/})
|
23
23
|
end
|
24
|
-
spec.bindir = 'bin'
|
25
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
26
24
|
spec.require_paths = ['lib']
|
27
25
|
|
28
26
|
spec.post_install_message = '
|
@@ -45,5 +43,4 @@ Gem::Specification.new do |spec|
|
|
45
43
|
spec.add_dependency 'base32', '~> 0.3'
|
46
44
|
spec.add_dependency 'faraday', '~> 0.11'
|
47
45
|
spec.add_dependency 'faraday_middleware', '~> 0.11'
|
48
|
-
spec.add_dependency 'thor', '~> 0.19'
|
49
46
|
end
|