sibit 0.21.2 → 0.21.3

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: 593c0f45e8be8a5469ad09ec98484016660f50b0ea96d7759c7f0b4b26888846
4
- data.tar.gz: 4ff151ef6106f75130eff546a28f2559c0e6b6e2cc2d292db7283b318769d3f1
3
+ metadata.gz: c72b1319eee0a3b3dc8370b7dd1447109cfd96d86754b5a3aa3444986fb8f9e7
4
+ data.tar.gz: 7694b4e1284ac6d656b0794c7e58e5ed4d8be6eabd62e126608395f355986635
5
5
  SHA512:
6
- metadata.gz: 2de6950c08eb3fccc207c46ee71220cac5cefffc942df930b607ac8db0d789b077877cb69444c7a7bfc8696b2704ec5d38af47d346f7b814d235cbcf199873f6
7
- data.tar.gz: 8ea109679ddb4d0374ef766faacfc7bae6ed0d31f11b9f50e764493d896b03a7351169e80dfe0924479c5f30c03a9e91d04ad463a90d75e73fabc8558f94f0a1
6
+ metadata.gz: 60c20d72c1b6b6c37c785bb3c0252d5cf37ed9f55892e51ff8675c17ee8870d5f968dbeeb150efb10b959f7f3dc419a56e7f3a31531b76a4216b62654aea6323
7
+ data.tar.gz: 7da7246776833039f185b63c2829f387f4fa20f506ba5085d1746e31814d470a3064caf6928b125a2ec9d34226297a2cd6e50d2fd53cb898498cc022f4deec6c
@@ -20,13 +20,14 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
- require 'uri'
23
+ require 'iri'
24
24
  require 'json'
25
- require_relative 'version'
25
+ require 'uri'
26
26
  require_relative 'error'
27
- require_relative 'log'
28
27
  require_relative 'http'
29
28
  require_relative 'json'
29
+ require_relative 'log'
30
+ require_relative 'version'
30
31
 
31
32
  # Bitcoinchain.com API.
32
33
  #
@@ -56,7 +57,7 @@ class Sibit
56
57
  # Get hash of the block after this one.
57
58
  def next_of(hash)
58
59
  block = Sibit::Json.new(http: @http, log: @log).get(
59
- URI("https://api-r.bitcoinchain.com/v1/block/#{hash}")
60
+ Iri.new('https://api-r.bitcoinchain.com/v1/block').append(hash)
60
61
  )[0]
61
62
  raise Sibit::Error, "Block #{hash} not found" if block.nil?
62
63
  nxt = block['next_block']
@@ -69,7 +70,7 @@ class Sibit
69
70
  # Gets the balance of the address, in satoshi.
70
71
  def balance(address)
71
72
  json = Sibit::Json.new(http: @http, log: @log).get(
72
- URI("https://api-r.bitcoinchain.com/v1/address/#{address}"),
73
+ Iri.new('https://api-r.bitcoinchain.com/v1/address').append(address),
73
74
  accept: [200, 409]
74
75
  )[0]
75
76
  b = json['balance']
@@ -91,7 +92,7 @@ class Sibit
91
92
  # Gets the hash of the latest block.
92
93
  def latest
93
94
  hash = Sibit::Json.new(http: @http, log: @log).get(
94
- URI('https://api-r.bitcoinchain.com/v1/status')
95
+ Iri.new('https://api-r.bitcoinchain.com/v1/status')
95
96
  )['hash']
96
97
  @log.info("The latest block hash is #{hash}")
97
98
  hash
@@ -111,11 +112,11 @@ class Sibit
111
112
  # an exception if the block is not found.
112
113
  def block(hash)
113
114
  head = Sibit::Json.new(http: @http, log: @log).get(
114
- URI("https://api-r.bitcoinchain.com/v1/block/#{hash}")
115
+ Iri.new('https://api-r.bitcoinchain.com/v1/block').append(hash)
115
116
  )[0]
116
117
  raise Sibit::Error, "The block #{hash} is not found" if head.nil?
117
118
  txs = Sibit::Json.new(http: @http, log: @log).get(
118
- URI("https://api-r.bitcoinchain.com/v1/block/txs/#{hash}")
119
+ Iri.new('https://api-r.bitcoinchain.com/v1/block/txs').append(hash)
119
120
  )
120
121
  nxt = head['next_block']
121
122
  nxt = nil if nxt == '0000000000000000000000000000000000000000000000000000000000000000'
@@ -21,12 +21,13 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require 'bitcoin'
24
+ require 'iri'
24
25
  require 'json'
25
26
  require 'uri'
26
- require_relative 'version'
27
27
  require_relative 'error'
28
28
  require_relative 'http'
29
29
  require_relative 'json'
30
+ require_relative 'version'
30
31
 
31
32
  # Blockchain.info API.
32
33
  #
@@ -49,7 +50,7 @@ class Sibit
49
50
  # Current price of BTC in USD (float returned).
50
51
  def price(currency = 'USD')
51
52
  h = Sibit::Json.new(http: @http, log: @log).get(
52
- URI('https://blockchain.info/ticker')
53
+ Iri.new('https://blockchain.info/ticker')
53
54
  )[currency]
54
55
  raise Error, "Unrecognized currency #{currency}" if h.nil?
55
56
  price = h['15m']
@@ -61,7 +62,7 @@ class Sibit
61
62
  def next_of(_hash)
62
63
  raise Sibit::NotSupportedError, 'next_of() in Blockchain API is broken, always returns NULL'
63
64
  # json = Sibit::Json.new(http: @http, log: @log).get(
64
- # URI("https://blockchain.info/rawblock/#{hash}")
65
+ # Iri.new('https://blockchain.info/rawblock').append(hash)
65
66
  # )
66
67
  # nxt = json['next_block'][0]
67
68
  # if nxt.nil?
@@ -75,7 +76,7 @@ class Sibit
75
76
  # The height of the block.
76
77
  def height(hash)
77
78
  json = Sibit::Json.new(http: @http, log: @log).get(
78
- URI("https://blockchain.info/rawblock/#{hash}")
79
+ Iri.new('https://blockchain.info/rawblock').append(hash)
79
80
  )
80
81
  h = json['height']
81
82
  @log.info("The height of #{hash} is #{h}")
@@ -85,7 +86,7 @@ class Sibit
85
86
  # Gets the balance of the address, in satoshi.
86
87
  def balance(address)
87
88
  json = Sibit::Json.new(http: @http, log: @log).get(
88
- URI("https://blockchain.info/rawaddr/#{address}?limit=0"),
89
+ Iri.new('https://blockchain.info/rawaddr').append(address).add(limit: 0),
89
90
  accept: [200, 500]
90
91
  )
91
92
  b = json['final_balance']
@@ -102,7 +103,7 @@ class Sibit
102
103
  # of Bitcoin addresses.
103
104
  def utxos(sources)
104
105
  Sibit::Json.new(http: @http, log: @log).get(
105
- URI("https://blockchain.info/unspent?active=#{sources.join('|')}&limit=1000")
106
+ Iri.new('https://blockchain.info/unspent').add(active: sources.join('|'), limit: 1000)
106
107
  )['unspent_outputs'].map do |u|
107
108
  {
108
109
  value: u['value'],
@@ -118,7 +119,7 @@ class Sibit
118
119
  def push(hex)
119
120
  return if @dry
120
121
  Sibit::Json.new(http: @http, log: @log).post(
121
- URI('https://blockchain.info/pushtx'),
122
+ Iri.new('https://blockchain.info/pushtx'),
122
123
  hex
123
124
  )
124
125
  end
@@ -126,7 +127,7 @@ class Sibit
126
127
  # Gets the hash of the latest block.
127
128
  def latest
128
129
  hash = Sibit::Json.new(http: @http, log: @log).get(
129
- URI('https://blockchain.info/latestblock')
130
+ Iri.new('https://blockchain.info/latestblock')
130
131
  )['hash']
131
132
  @log.info("The latest block hash is #{hash}")
132
133
  hash
@@ -135,7 +136,7 @@ class Sibit
135
136
  # This method should fetch a Blockchain block and return as a hash.
136
137
  def block(hash)
137
138
  json = Sibit::Json.new(http: @http, log: @log).get(
138
- URI("https://blockchain.info/rawblock/#{hash}")
139
+ Iri.new('https://blockchain.info/rawblock').append(hash)
139
140
  )
140
141
  {
141
142
  hash: json['hash'],
@@ -20,14 +20,15 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
- require 'uri'
24
- require 'json'
25
23
  require 'cgi'
26
- require_relative 'version'
24
+ require 'iri'
25
+ require 'json'
26
+ require 'uri'
27
27
  require_relative 'error'
28
- require_relative 'log'
29
28
  require_relative 'http'
30
29
  require_relative 'json'
30
+ require_relative 'log'
31
+ require_relative 'version'
31
32
 
32
33
  # Blockchair.com API.
33
34
  #
@@ -64,7 +65,7 @@ class Sibit
64
65
  # Gets the balance of the address, in satoshi.
65
66
  def balance(address)
66
67
  json = Sibit::Json.new(http: @http, log: @log).get(
67
- URI("https://api.blockchair.com/bitcoin/dashboards/address/#{address}?#{the_key}")
68
+ Iri.new('https://api.blockchair.com/bitcoin/dashboards/address').append(address).fragment(the_key)
68
69
  )['data'][address]
69
70
  if json.nil?
70
71
  @log.info("Address #{address} not found")
@@ -94,7 +95,7 @@ class Sibit
94
95
  # Push this transaction (in hex format) to the network.
95
96
  def push(hex)
96
97
  Sibit::Json.new(http: @http, log: @log).post(
97
- URI("https://api.blockchair.com/bitcoin/push/transaction?#{the_key}"),
98
+ Iri.new('https://api.blockchair.com/bitcoin/push/transaction').fragment(the_key),
98
99
  "data=#{hex}"
99
100
  )
100
101
  @log.info("Transaction (#{hex.length} in hex) has been pushed to Blockchair")
@@ -20,13 +20,14 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
- require 'uri'
23
+ require 'iri'
24
24
  require 'json'
25
- require_relative 'version'
25
+ require 'uri'
26
26
  require_relative 'error'
27
- require_relative 'log'
28
27
  require_relative 'http'
29
28
  require_relative 'json'
29
+ require_relative 'log'
30
+ require_relative 'version'
30
31
 
31
32
  # Btc.com API.
32
33
  #
@@ -52,7 +53,7 @@ class Sibit
52
53
 
53
54
  # Gets the balance of the address, in satoshi.
54
55
  def balance(address)
55
- uri = URI("https://chain.api.btc.com/v3/address/#{address}/unspent")
56
+ uri = Iri.new('https://chain.api.btc.com/v3/address').append(address).append('unspent')
56
57
  json = Sibit::Json.new(http: @http, log: @log).get(uri)
57
58
  if json['err_no'] == 1
58
59
  @log.info("The balance of #{address} is zero (not found)")
@@ -76,13 +77,13 @@ class Sibit
76
77
  # Get hash of the block after this one.
77
78
  def next_of(hash)
78
79
  head = Sibit::Json.new(http: @http, log: @log).get(
79
- URI("https://chain.api.btc.com/v3/block/#{hash}")
80
+ Iri.new('https://chain.api.btc.com/v3/block').append(hash)
80
81
  )
81
82
  data = head['data']
82
83
  raise Sibit::Error, "The block #{hash} not found" if data.nil?
83
84
  nxt = data['next_block_hash']
84
85
  nxt = nil if nxt == '0000000000000000000000000000000000000000000000000000000000000000'
85
- @log.info("The block #{hash} is the latest, there is no next block") if nxt.nil?
86
+ @log.info("In BTC.com the block #{hash} is the latest, there is no next block") if nxt.nil?
86
87
  @log.info("The next block of #{hash} is #{nxt}") unless nxt.nil?
87
88
  nxt
88
89
  end
@@ -90,7 +91,7 @@ class Sibit
90
91
  # The height of the block.
91
92
  def height(hash)
92
93
  json = Sibit::Json.new(http: @http, log: @log).get(
93
- URI("https://chain.api.btc.com/v3/block/#{hash}")
94
+ Iri.new('https://chain.api.btc.com/v3/block').append(hash)
94
95
  )
95
96
  data = json['data']
96
97
  raise Sibit::Error, "The block #{hash} not found" if data.nil?
@@ -107,7 +108,7 @@ class Sibit
107
108
 
108
109
  # Gets the hash of the latest block.
109
110
  def latest
110
- uri = URI('https://chain.api.btc.com/v3/block/latest')
111
+ uri = Iri.new('https://chain.api.btc.com/v3/block/latest')
111
112
  json = Sibit::Json.new(http: @http, log: @log).get(uri)
112
113
  data = json['data']
113
114
  raise Sibit::Error, 'The latest block not found' if data.nil?
@@ -121,7 +122,7 @@ class Sibit
121
122
  txns = []
122
123
  sources.each do |hash|
123
124
  json = Sibit::Json.new(http: @http, log: @log).get(
124
- URI("https://chain.api.btc.com/v3/address/#{hash}/unspent")
125
+ Iri.new('https://chain.api.btc.com/v3/address').append(hash).append('unspent')
125
126
  )
126
127
  data = json['data']
127
128
  raise Sibit::Error, "The address #{hash} not found" if data.nil?
@@ -129,7 +130,7 @@ class Sibit
129
130
  next if txns.nil?
130
131
  txns.each do |u|
131
132
  outs = Sibit::Json.new(http: @http, log: @log).get(
132
- URI("https://chain.api.btc.com/v3/tx/#{u['tx_hash']}?verbose=3")
133
+ Iri.new('https://chain.api.btc.com/v3/tx').append(u['tx_hash']).add(verbose: 3)
133
134
  )['data']['outputs']
134
135
  outs.each_with_index do |o, i|
135
136
  next unless o['addresses'].include?(hash)
@@ -154,7 +155,7 @@ class Sibit
154
155
  # This method should fetch a Blockchain block and return as a hash.
155
156
  def block(hash)
156
157
  head = Sibit::Json.new(http: @http, log: @log).get(
157
- URI("https://chain.api.btc.com/v3/block/#{hash}")
158
+ Iri.new('https://chain.api.btc.com/v3/block').append(hash)
158
159
  )
159
160
  data = head['data']
160
161
  raise Sibit::Error, "The block #{hash} not found" if data.nil?
@@ -177,7 +178,8 @@ class Sibit
177
178
  all = []
178
179
  loop do
179
180
  data = Sibit::Json.new(http: @http, log: @log).get(
180
- URI("https://chain.api.btc.com/v3/block/#{hash}/tx?page=#{page}&pagesize=#{psize}")
181
+ Iri.new('https://chain.api.btc.com/v3/block')
182
+ .append(hash).append('tx').add(page: page, pagesize: psize)
181
183
  )['data']
182
184
  raise Sibit::Error, "The block #{hash} has no data at page #{page}" if data.nil?
183
185
  list = data['list']
@@ -45,7 +45,7 @@ class Sibit
45
45
  # Current price of BTC in USD (float returned).
46
46
  def price(currency = 'USD')
47
47
  json = Sibit::Json.new(http: @http, log: @log).get(
48
- URI("https://cex.io/api/last_price/BTC/#{currency}")
48
+ Iri.new('https://cex.io/api/last_price/BTC').append(currency)
49
49
  )
50
50
  p = json['lprice'].to_f
51
51
  @log.info("The price of BTC is #{p} #{currency}")
@@ -20,13 +20,14 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
- require 'uri'
23
+ require 'iri'
24
24
  require 'json'
25
- require_relative 'version'
25
+ require 'uri'
26
26
  require_relative 'error'
27
- require_relative 'log'
28
27
  require_relative 'http'
29
28
  require_relative 'json'
29
+ require_relative 'log'
30
+ require_relative 'version'
30
31
 
31
32
  # Cryptoapis.io API.
32
33
  #
@@ -52,7 +53,7 @@ class Sibit
52
53
  # Get hash of the block after this one.
53
54
  def next_of(hash)
54
55
  nxt = Sibit::Json.new(http: @http, log: @log).get(
55
- URI("https://api.cryptoapis.io/v1/bc/btc/mainnet/blocks/#{hash}"),
56
+ Iri.new('https://api.cryptoapis.io/v1/bc/btc/mainnet/blocks').append(hash),
56
57
  headers: headers
57
58
  )['payload']['hash']
58
59
  @log.info("The block #{hash} is the latest, there is no next block") if nxt.nil?
@@ -63,7 +64,7 @@ class Sibit
63
64
  # The height of the block.
64
65
  def height(hash)
65
66
  json = Sibit::Json.new(http: @http, log: @log).get(
66
- URI("https://api.cryptoapis.io/v1/bc/btc/mainnet/blocks/#{hash}"),
67
+ Iri.new('https://api.cryptoapis.io/v1/bc/btc/mainnet/blocks').append(hash),
67
68
  headers: headers
68
69
  )['payload']
69
70
  h = json['height']
@@ -74,7 +75,7 @@ class Sibit
74
75
  # Gets the balance of the address, in satoshi.
75
76
  def balance(address)
76
77
  json = Sibit::Json.new(http: @http, log: @log).get(
77
- URI("https://api.cryptoapis.io/v1/bc/btc/mainnet/address/#{address}"),
78
+ Iri.new('https://api.cryptoapis.io/v1/bc/btc/mainnet/address').append(address),
78
79
  headers: headers
79
80
  )['payload']
80
81
  b = (json['balance'].to_f * 100_000_000).to_i
@@ -90,7 +91,7 @@ class Sibit
90
91
  # Gets the hash of the latest block.
91
92
  def latest
92
93
  hash = Sibit::Json.new(http: @http, log: @log).get(
93
- URI('https://api.cryptoapis.io/v1/bc/btc/mainnet/blocks/latest'),
94
+ Iri.new('https://api.cryptoapis.io/v1/bc/btc/mainnet/blocks/latest'),
94
95
  headers: headers
95
96
  )['payload']['hash']
96
97
  @log.info("The latest block hash is #{hash}")
@@ -105,7 +106,7 @@ class Sibit
105
106
  # Push this transaction (in hex format) to the network.
106
107
  def push(hex)
107
108
  Sibit::Json.new(http: @http, log: @log).post(
108
- URI('https://api.cryptoapis.io/v1/bc/btc/testnet/txs/send'),
109
+ Iri.new('https://api.cryptoapis.io/v1/bc/btc/testnet/txs/send'),
109
110
  JSON.pretty_generate(hex: hex),
110
111
  headers: headers
111
112
  )
@@ -114,7 +115,7 @@ class Sibit
114
115
  # This method should fetch a Blockchain block and return as a hash.
115
116
  def block(hash)
116
117
  head = Sibit::Json.new(http: @http, log: @log).get(
117
- URI("https://api.cryptoapis.io/v1/bc/btc/mainnet/blocks/#{hash}"),
118
+ Iri.new('https://api.cryptoapis.io/v1/bc/btc/mainnet/blocks').append(hash),
118
119
  headers: headers
119
120
  )['payload']
120
121
  {
@@ -141,12 +142,8 @@ class Sibit
141
142
  all = []
142
143
  loop do
143
144
  txns = Sibit::Json.new(http: @http, log: @log).get(
144
- URI(
145
- [
146
- 'https://api.cryptoapis.io/v1/bc/btc/mainnet/txs/block/',
147
- "#{hash}?index=#{index}&limit=#{limit}"
148
- ].join
149
- ),
145
+ Iri.new('https://api.cryptoapis.io/v1/bc/btc/mainnet/txs/block/')
146
+ .append(hash).add(index: index, limit: limit),
150
147
  headers: headers
151
148
  )['payload'].map do |t|
152
149
  {
@@ -20,12 +20,13 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
+ require 'iri'
23
24
  require 'json'
24
25
  require 'uri'
25
- require_relative 'version'
26
26
  require_relative 'error'
27
27
  require_relative 'http'
28
28
  require_relative 'json'
29
+ require_relative 'version'
29
30
 
30
31
  # Earn.com API.
31
32
  #
@@ -66,7 +67,7 @@ class Sibit
66
67
  # a hash: { S: 12, M: 45, L: 100, XL: 200 }
67
68
  def fees
68
69
  json = Sibit::Json.new(http: @http, log: @log).get(
69
- URI('https://bitcoinfees.earn.com/api/v1/fees/recommended')
70
+ Iri.new('https://bitcoinfees.earn.com/api/v1/fees/recommended')
70
71
  )
71
72
  @log.info("Current recommended Bitcoin fees: \
72
73
  #{json['hourFee']}/#{json['halfHourFee']}/#{json['fastestFee']} sat/byte")
@@ -48,8 +48,9 @@ class Sibit
48
48
  # Send GET request to the HTTP and return JSON response.
49
49
  # This method will also log the process and will validate the
50
50
  # response for correctness.
51
- def get(uri, headers: {}, accept: [200])
51
+ def get(address, headers: {}, accept: [200])
52
52
  start = Time.now
53
+ uri = URI(address.to_s)
53
54
  res = @http.client(uri).get(
54
55
  "#{uri.path.empty? ? '/' : uri.path}#{uri.query ? "?#{uri.query}" : ''}",
55
56
  {
@@ -66,8 +67,9 @@ class Sibit
66
67
  JSON.parse(res.body)
67
68
  end
68
69
 
69
- def post(uri, body, headers: {})
70
+ def post(address, body, headers: {})
70
71
  start = Time.now
72
+ uri = URI(address.to_s)
71
73
  res = @http.client(uri).post(
72
74
  "#{uri.path}?#{uri.query}",
73
75
  "tx=#{CGI.escape(body)}",
@@ -26,5 +26,5 @@
26
26
  # License:: MIT
27
27
  class Sibit
28
28
  # Current version of the library.
29
- VERSION = '0.21.2'
29
+ VERSION = '0.21.3'
30
30
  end
@@ -50,6 +50,7 @@ and Ruby 2.3+.'
50
50
  s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
51
51
  s.add_runtime_dependency 'backtrace', '~> 0.3'
52
52
  s.add_runtime_dependency 'bitcoin-ruby', '0.0.19'
53
+ s.add_runtime_dependency 'iri', '~> 0.5'
53
54
  s.add_runtime_dependency 'json', '~> 2'
54
55
  s.add_runtime_dependency 'retriable_proxy', '1.0.2'
55
56
  s.add_runtime_dependency 'slop', '~> 4.6'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sibit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.2
4
+ version: 0.21.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-21 00:00:00.000000000 Z
11
+ date: 2020-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.0.19
41
+ - !ruby/object:Gem::Dependency
42
+ name: iri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.5'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.5'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: json
43
57
  requirement: !ruby/object:Gem::Requirement