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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +43 -33
  3. data/examples/account/generate.rb +29 -0
  4. data/examples/account/get.rb +26 -0
  5. data/examples/account/harvests.rb +8 -0
  6. data/examples/account/historical.rb +13 -0
  7. data/examples/account/importances.rb +8 -0
  8. data/examples/account/lock.rb +8 -0
  9. data/examples/account/mosaic.rb +9 -0
  10. data/examples/account/namespace.rb +8 -0
  11. data/examples/account/status.rb +8 -0
  12. data/examples/account/transfers.rb +16 -0
  13. data/examples/account/unconfirmed_transactions.rb +8 -0
  14. data/examples/account/unlock.rb +8 -0
  15. data/examples/account/unlocked.rb +8 -0
  16. data/examples/block/at_public.rb +4 -0
  17. data/examples/block/get.rb +4 -0
  18. data/examples/debug/connections.rb +13 -0
  19. data/examples/debug/time_synchronization.rb +6 -0
  20. data/examples/local/account_transfers.rb +20 -0
  21. data/examples/local/chain_blocks_after.rb +8 -0
  22. data/examples/namespace/mosaic_definition.rb +6 -0
  23. data/examples/namespace/root.rb +6 -0
  24. data/examples/nis.rb +11 -7
  25. data/examples/node/active_peers.rb +6 -0
  26. data/examples/node/boot.rb +25 -0
  27. data/examples/node/info.rb +8 -0
  28. data/examples/node/peerlist.rb +14 -0
  29. data/examples/time_sync/network_time.rb +6 -0
  30. data/examples/transactions/get.rb +42 -0
  31. data/examples/transactions/importance_transfer.rb +6 -4
  32. data/examples/transactions/mosaic_definition_creation.rb +6 -4
  33. data/examples/transactions/mosaic_supply_change.rb +6 -4
  34. data/examples/transactions/multisig.rb +6 -4
  35. data/examples/transactions/multisig_add_cosignatory.rb +3 -1
  36. data/examples/transactions/multisig_aggregate_modification.rb +6 -4
  37. data/examples/transactions/multisig_signature.rb +6 -3
  38. data/examples/transactions/provision_namespace.rb +6 -4
  39. data/examples/transactions/transfer.rb +14 -7
  40. data/examples/transactions/transfer_mosaic.rb +5 -3
  41. data/examples/transactions/transfer_remote.rb +6 -4
  42. data/lib/nis.rb +6 -0
  43. data/lib/nis/client.rb +11 -0
  44. data/lib/nis/configuration.rb +23 -0
  45. data/lib/nis/endpoint/account/transfers.rb +24 -0
  46. data/lib/nis/endpoint/debug/connections.rb +17 -0
  47. data/lib/nis/endpoint/local/account/transfers.rb +14 -0
  48. data/lib/nis/endpoint/node/peer_list.rb +20 -0
  49. data/lib/nis/endpoint/time_sync.rb +4 -0
  50. data/lib/nis/endpoint/time_sync/network_time.rb +10 -0
  51. data/lib/nis/endpoint/transaction/get.rb +12 -0
  52. data/lib/nis/keypair.rb +13 -7
  53. data/lib/nis/struct.rb +1 -0
  54. data/lib/nis/struct/importance_transfer_transaction.rb +10 -0
  55. data/lib/nis/struct/message.rb +9 -2
  56. data/lib/nis/struct/mosaic_definition_creation_transaction.rb +15 -0
  57. data/lib/nis/struct/mosaic_supply_change_transaction.rb +12 -0
  58. data/lib/nis/struct/multisig_aggregate_modification_transaction.rb +10 -0
  59. data/lib/nis/struct/multisig_signature_transaction.rb +12 -0
  60. data/lib/nis/struct/multisig_transaction.rb +15 -0
  61. data/lib/nis/struct/network_time.rb +17 -0
  62. data/lib/nis/struct/provision_namespace_transaction.rb +16 -0
  63. data/lib/nis/struct/transaction.rb +4 -81
  64. data/lib/nis/struct/transaction_meta_data_pair.rb +17 -1
  65. data/lib/nis/struct/transfer_transaction.rb +11 -0
  66. data/lib/nis/unit/address.rb +11 -4
  67. data/lib/nis/util.rb +3 -1
  68. data/lib/nis/util/convert.rb +44 -51
  69. data/lib/nis/util/deserializer.rb +62 -77
  70. data/lib/nis/util/ed25519.rb +10 -12
  71. data/lib/nis/util/serializer.rb +117 -185
  72. data/lib/nis/version.rb +1 -1
  73. data/nis.gemspec +0 -3
  74. metadata +43 -26
  75. data/bin/nis +0 -60
  76. data/examples/account.rb +0 -44
  77. data/examples/block.rb +0 -9
  78. data/examples/debug.rb +0 -33
  79. data/examples/local.rb +0 -19
  80. data/examples/namespace.rb +0 -9
  81. data/examples/node.rb +0 -44
  82. data/examples/shutdown.rb +0 -6
@@ -4,61 +4,60 @@ module Nis::Util
4
4
  # @param [Hash] entity
5
5
  # @return [Array]
6
6
  def self.serialize_transaction(entity)
7
- method = case entity[:type]
8
- when 0x0101 then method(:serialize_transfer)
9
- when 0x0801 then method(:serialize_importance_transfer)
10
- when 0x1001 then method(:serialize_multisig_aggregate_modification)
11
- when 0x1002 then method(:serialize_multisig_signature)
12
- when 0x1004 then method(:serialize_multisig)
13
- when 0x2001 then method(:serialize_provision_namespace)
14
- when 0x4001 then method(:serialize_mosaic_definition_creation)
15
- when 0x4002 then method(:serialize_mosaic_supply_change)
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
- method.call(entity)
18
+ serialize_common(entity) + specific
19
19
  end
20
20
 
21
+ private
22
+
21
23
  def self.serialize_transfer(entity)
22
24
  a = []
23
- # Common transaction part
24
- a += serialize_common(entity)
25
- # Transfer transaction part
26
- a += serialize_safe_string(entity[:recipient])
27
- a += serialize_long(entity[:amount])
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 += serialize_int(temp.size + 8)
33
- a += serialize_int(entity[:message][:type])
34
- a += serialize_int(temp.size)
35
- a += temp
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 += serialize_common(entity)
43
- a += serialize_int(entity[:mode])
44
- temp = hex2ua(entity[:remoteAccount])
45
- a += serialize_int(temp.size)
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 += serialize_common(entity)
53
- a += serialize_int(entity[:modifications].size)
54
- a += entity[:modifications].map do |mod|
55
- b = []
56
- b += serialize_int(40)
57
- b += serialize_int(mod[:modificationType])
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.flatten
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 += serialize_int(4)
70
- a += serialize_int(entity[:minCosignatories][:relativeChange])
68
+ a.concat serialize_int(4)
69
+ a.concat serialize_int(entity[:minCosignatories][:relativeChange])
71
70
  else
72
- a += [0, 0, 0, 0]
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
- a += serialize_common(entity)
81
- temp = hex2ua(entity[:otherHash][:data])
82
- a += serialize_int(4 + temp.size)
83
- a += serialize_int(temp.size)
84
- a += temp
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
- a += serialize_common(entity)
91
- other_tx = entity[:otherTrans]
92
- tx = case other_tx[:type]
93
- when 0x0101 then serialize_transfer(other_tx)
94
- when 0x0801 then serialize_importance_transfer(other_tx)
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
- a += serialize_int(tx.size)
99
- a += tx
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 += serialize_common(entity)
106
- a += serialize_safe_string(entity[:rentalFeeSink])
107
- a += serialize_long(entity[:rentalFee])
108
- temp = hex2ua(utf8_to_hex(entity[:newPart]))
109
- a += serialize_int(temp.size)
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 += serialize_int(temp.size)
114
- a += temp
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 += [255, 255, 255, 255]
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 += serialize_common(entity)
124
- a += serialize_mosaic_definition(entity[:mosaicDefinition])
125
- a += serialize_safe_string(entity[:creationFeeSink])
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 += serialize_common(entity)
133
- mo_id = entity[:mosaicId]
134
- a_ns = hex2ua(utf8_to_hex(mo_id[:namespaceId]))
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 += serialize_int(entity[:type])
153
- a += serialize_int(entity[:version])
154
- a += serialize_int(entity[:timeStamp])
133
+ a.concat serialize_int(entity[:type])
134
+ a.concat serialize_int(entity[:version])
135
+ a.concat serialize_int(entity[:timeStamp])
155
136
 
156
- temp = hex2ua(entity[:signer])
157
- a += serialize_int(temp.size)
158
- a += temp
137
+ signer = Nis::Util::Convert.hex2ua(entity[:signer])
138
+ a.concat serialize_int(signer.size)
139
+ a.concat signer
159
140
 
160
- a += serialize_long(entity[:fee].to_i)
161
- a += serialize_int(entity[:deadline])
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 [].fill(255, 0, 4) if str.nil?
170
- return [].fill(0, 0, 4) if str.empty?
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 [].fill(255, 0, 4) if str.nil?
178
- return [].fill(0, 0, 4) if str.empty?
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
- a = [].fill(0, 0, 4)
187
- bin = sprintf('%032b', [value].pack('L').unpack('L')[0])
188
- 0.upto(bin.size / 8 - 1) do |i|
189
- a[i] = 0xFF & (value >> 8 * i)
190
- end
191
- a
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 = [].fill(0, 0, 8)
198
- bin = sprintf('%040b', [value].pack('L').unpack('L')[0])
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(mosaic)
208
- a = [].fill(0, 0, 4)
209
- serialized_mosaic_id = serialize_mosaic_id(mosaic.mosaic_id)
210
- serialized_quantity = serialize_long(mosaic.quantity)
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 = [].fill(0, 0, 4)
219
- a[0] = entities.size
220
- a + entities.map do |ent|
221
- { entity: ent,
222
- value: [
223
- ent.mosaic_id.namespace_id,
224
- ent.mosaic_id.name,
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 += serialize_safe_string(entity[:namespaceId])
239
- a += serialize_safe_string(entity[:name])
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 += serialize_safe_string(entity[:name])
248
- a += serialize_safe_string(entity[:value])
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
- a = []
262
- a = entities.sort_by { |ent| order[ent[:name]] }
263
- .map { |ent| serialize_property(ent) }.flatten
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 += serialize_int(entity[:type])
273
- a += serialize_safe_string(entity[:recipient])
274
- a += serialize_mosaic_id(entity[:mosaicId])
275
- a += serialize_long(entity[:fee])
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
- temp = hex2ua(entity[:creator])
284
- a += serialize_int(temp.size)
285
- a += temp
286
- a += serialize_mosaic_id(entity[:id])
287
- a += serialize_bin_string(hex2ua(utf8_to_hex(entity[:description])))
288
- a += serialize_properties(entity[:properties])
289
- a += serialize_levy(entity[:levy])
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
@@ -1,3 +1,3 @@
1
1
  class Nis
2
- VERSION = '0.0.16'.freeze
2
+ VERSION = '0.0.17'.freeze
3
3
  end
@@ -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