nis-ruby 0.0.16 → 0.0.17
Sign up to get free protection for your applications and to get access to all the features.
- 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
|