localbitcoins 1.0.0 → 1.1.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,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MTcyMzNjNTJjYWU2OTM0YmJhNjZlNGViM2RiYmM5ODk4ZjkxZTQ5OQ==
5
- data.tar.gz: !binary |-
6
- OTA5Mzk3ZGQ3MTdmYTg0ZGYxNmM2ZTU2OTYyMDI1Mjk5MDgwZjY4Ng==
2
+ SHA1:
3
+ metadata.gz: ab8f983a12e47f099fe346a3c2fd8929e79ca92c
4
+ data.tar.gz: 710b050fe90c87d5060dcf55b11be1fe12349b94
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NzI4ZWZhMWI4YWFiNTdlYzk2Y2UwMDcxYWE4Nzc1MmE5N2NhYTU2M2Y4NTEx
10
- MTQ4YjIyNThiNzVjMzY5OTFmYzFhNjM4NzBjYjBiODE1YmYxNWJhOWFiNTQ5
11
- NTNjY2VhMjExYzU2MWJhMDYwZGQyNzVjZWZkOTViOTgwYTAxNWE=
12
- data.tar.gz: !binary |-
13
- MzYzODlmZWUyY2U3Mjg2MWFlMmI4ODRmMzE0NjhhNzc1OTRmZjMyMmE0NGVi
14
- MmU0MjQyM2IxNzYzODhhZDU3YWU2ZmI2ZWEwNGE1Y2UzNGVjMTEwNGMwODc0
15
- ZTU0MmJmMmIwOWYzYzgyNzM3NDdhYmIyOTdjOTc4ZTNiNDgzMjk=
6
+ metadata.gz: 4d09a0f7d3a4b64beba6eb10ef81161ebd7bd0322dfc4931fe8aef5a246e6369500874f66bf716955c5ea1cad277b779f394d0c366f99c10d2b1eeb92d6d394d
7
+ data.tar.gz: a0426a7adf550aff177b91f7955cfdadf7012ae906471e4cd2e95f5630741749bfc6b4951515e76e895000633bda555a89c8588c13442634cf0ded5b8012dff2
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # LocalBitcoins API Gem 1.0.0
1
+ # LocalBitcoins API Gem 1.1.0
2
2
 
3
3
  This gem provides a simple, extensible Ruby wrapper to access the [LocalBitcoins API](https://localbitcoins.com/api-docs/).
4
4
 
@@ -16,8 +16,11 @@ gem 'localbitcoins'
16
16
 
17
17
  You can use the gem with or without OAuth2 for authentication. Without authentication the API only allows access to the public endpoints documented [here (Ad Listings)](https://localbitcoins.com/api-docs/public/) and [here (Market Data)](https://localbitcoins.com/api-docs/#toc7)
18
18
 
19
+
19
20
  ### Setting Up The Client
20
21
 
22
+ **TODO: Document HMAC requests.**
23
+
21
24
  For authenticated requests to the LocalBitcoins API, you must [register your application](https://localbitcoins.com/accounts/api/) and get your API credentials. Use the Client ID and Client Secret to receive an access token via OAuth2. There are a number of ways to implement OAuth2, and it is largely left up to you to decide how to do it. If you've never used OAuth2 before, reading [this tutorial](http://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified) is a good place to start!
22
25
 
23
26
  Once you have your token, you can get to setting up the LocalBitcoins client.
@@ -380,6 +383,7 @@ places = client.places(params)
380
383
  * [Will Newman](http://willnewman.me)
381
384
  * [Albert Brown](https://www.linkedin.com/pub/albert-brown/36/515/a2)
382
385
  * [Coincove](https://coincove.co)
386
+ * [Maros Hluska](http://mhluska.com)
383
387
 
384
388
  ## License
385
389
 
@@ -21,18 +21,19 @@ module LocalBitcoins
21
21
  unless options.kind_of?(Hash)
22
22
  raise ArgumentError, "Options hash required."
23
23
  end
24
-
24
+
25
25
  @@options[:client_id] = options[:client_id]
26
26
  @@options[:client_secret] = options[:client_secret]
27
+ @@options[:use_hmac] = options[:use_hmac]
27
28
  @@options
28
29
  end
29
-
30
+
30
31
  # Returns global configuration hash
31
32
  #
32
33
  def self.configuration
33
34
  @@options
34
35
  end
35
-
36
+
36
37
  # Resets the global configuration
37
38
  #
38
39
  def self.reset_configuration
@@ -20,7 +20,7 @@ module LocalBitcoins
20
20
  include LocalBitcoins::Public
21
21
 
22
22
 
23
- attr_reader :oauth_client, :access_token
23
+ attr_reader :oauth_client, :access_token, :use_hmac, :client_id, :client_secret
24
24
 
25
25
  # Initialize a LocalBitcoins::Client instance
26
26
  #
@@ -33,18 +33,24 @@ module LocalBitcoins
33
33
  raise ArgumentError, "Options hash required."
34
34
  end
35
35
 
36
- @oauth_client = OAuth2::Client.new(
37
- options[:client_id],
38
- options[:client_secret],
39
- authorize_url: "/oauth2/authorize",
40
- token_url: "/oauth2/access_token",
41
- site: "https://localbitcoins.com"
42
- )
36
+ @use_hmac = options[:use_hmac]
37
+ @client_id = options[:client_id]
38
+ @client_secret = options[:client_secret]
43
39
 
44
- @access_token = OAuth2::AccessToken.new(
45
- oauth_client,
46
- options[:oauth_token]
47
- )
40
+ unless @use_hmac
41
+ @oauth_client = OAuth2::Client.new(
42
+ @client_id,
43
+ @client_secret,
44
+ authorize_url: "/oauth2/authorize",
45
+ token_url: "/oauth2/access_token",
46
+ site: "https://localbitcoins.com"
47
+ )
48
+
49
+ @access_token = OAuth2::AccessToken.new(
50
+ oauth_client,
51
+ options[:oauth_token]
52
+ )
53
+ end
48
54
  end
49
55
  end
50
56
  end
@@ -2,7 +2,7 @@ module LocalBitcoins
2
2
  module Ads
3
3
  # Get a list of the token owner's ads
4
4
  def ads
5
- oauth_request(:get, '/api/ads/').data
5
+ request(:get, '/api/ads/').data
6
6
  end
7
7
 
8
8
  # Update one of the token owner's ads
@@ -23,7 +23,7 @@ module LocalBitcoins
23
23
  :max_amount => old_ad.max_amount,
24
24
  :visible => old_ad.visible
25
25
  }.merge(params)
26
- oauth_request(:post, "/api/ad/#{id}/", updated_params).data
26
+ request(:post, "/api/ad/#{id}/", updated_params).data
27
27
  end
28
28
 
29
29
  # Create a new ad for the token owner
@@ -45,16 +45,16 @@ module LocalBitcoins
45
45
  # currency - three letter fiat representation [string]
46
46
  #
47
47
  def create_ad(params={})
48
- oauth_request(:post, '/api/ad-create/', params).data
48
+ request(:post, '/api/ad-create/', params).data
49
49
  end
50
50
 
51
51
  # ads - comma separated list of ad ids [string]
52
52
  def ad_list(ads)
53
- oauth_request(:get, "/api/ad-get/", {:ads=>ads}).data
53
+ request(:get, "/api/ad-get/", {:ads=>ads}).data
54
54
  end
55
55
 
56
56
  def ad(ad_id)
57
- oauth_request(:get, "/api/ad-get/#{ad_id}/").data.ad_list[0]
57
+ request(:get, "/api/ad-get/#{ad_id}/").data.ad_list[0]
58
58
  end
59
59
  end
60
60
  end
@@ -4,40 +4,40 @@ module LocalBitcoins
4
4
  # contact_id - id number associated with the contact
5
5
 
6
6
  def mark_contact_as_paid(contact_id)
7
- oauth_request(:post, "/api/contact_mark_as_paid/#{contact_id}/")
7
+ request(:post, "/api/contact_mark_as_paid/#{contact_id}/")
8
8
  end
9
9
 
10
10
  def messages_from_contact(contact_id)
11
- oauth_request(:get, "/api/contact_messages/#{contact_id}/").data
11
+ request(:get, "/api/contact_messages/#{contact_id}/").data
12
12
  end
13
13
 
14
14
  def message_contact(contact_id, msg)
15
- oauth_request(:post, "/api/contact_message_post/#{contact_id}/", {:msg=>msg}).data
15
+ request(:post, "/api/contact_message_post/#{contact_id}/", {:msg=>msg}).data
16
16
  end
17
17
 
18
18
  def dispute_contact(contact_id)
19
- oauth_request(:post, "/api/contact_dispute/#{contact_id}/")
19
+ request(:post, "/api/contact_dispute/#{contact_id}/")
20
20
  end
21
21
 
22
22
  def cancel_contact(contact_id)
23
- oauth_request(:post, "/api/contact_cancel/#{contact_id}/").data
23
+ request(:post, "/api/contact_cancel/#{contact_id}/").data
24
24
  end
25
25
 
26
26
  def fund_contact(contact_id)
27
- oauth_request(:post, "/api/contact_fund/#{contact_id}/")
27
+ request(:post, "/api/contact_fund/#{contact_id}/")
28
28
  end
29
29
 
30
30
  def create_contact(ad_id, amount, message=nil)
31
- oauth_request(:post, "/api/contact_create/#{ad_id}/", {:amount=>amount, :message=>message})
31
+ request(:post, "/api/contact_create/#{ad_id}/", {:amount=>amount, :message=>message})
32
32
  end
33
33
 
34
34
  def contact_info(contact_id)
35
- oauth_request(:get, "/api/contact_info/#{contact_id}/")
35
+ request(:get, "/api/contact_info/#{contact_id}/")
36
36
  end
37
37
 
38
38
  # contacts - comma separated list of contact ids [string]
39
39
  def contacts_info(contacts)
40
- oauth_request(:get, '/api/contact_info/', {:contacts=>contacts}).data
40
+ request(:get, '/api/contact_info/', {:contacts=>contacts}).data
41
41
  end
42
42
 
43
43
  # Dashboard contact endpoints
@@ -45,22 +45,22 @@ module LocalBitcoins
45
45
  #
46
46
  def active_contacts(contact_type = nil)
47
47
  contact_type<<'/' unless contact_type.nil?
48
- oauth_request(:get, "/api/dashboard/#{contact_type}").data
48
+ request(:get, "/api/dashboard/#{contact_type}").data
49
49
  end
50
50
 
51
51
  def released_contacts(contact_type = nil)
52
52
  contact_type<<'/' unless contact_type.nil?
53
- oauth_request(:get, "/api/dashboard/released/#{contact_type}").data
53
+ request(:get, "/api/dashboard/released/#{contact_type}").data
54
54
  end
55
55
 
56
56
  def canceled_contacts(contact_type = nil)
57
57
  contact_type<<'/' unless contact_type.nil?
58
- oauth_request(:get, "/api/dashboard/canceled/#{contact_type}").data
58
+ request(:get, "/api/dashboard/canceled/#{contact_type}").data
59
59
  end
60
60
 
61
61
  def closed_contacts(contact_type = nil)
62
62
  contact_type<<'/' unless contact_type.nil?
63
- oauth_request(:get, "/api/dashboard/closed/#{contact_type}").data
63
+ request(:get, "/api/dashboard/closed/#{contact_type}").data
64
64
  end
65
65
  end
66
66
  end
@@ -1,9 +1,9 @@
1
1
  module LocalBitcoins
2
2
  module Escrows
3
- # Get a list of the token owner's releaseable escrows
3
+ # Get a list of the token owner's releaseable escrows
4
4
  # NOTE: This endpoint is not documented so it may or may not work
5
5
  def escrows
6
- oauth_request(:get, '/api/escrows/').data
6
+ request(:get, '/api/escrows/').data
7
7
  end
8
8
 
9
9
  # Release an escrow
@@ -11,7 +11,7 @@ module LocalBitcoins
11
11
  # NOTE: LocalBitcoins documentation calls this the "escrow_id",
12
12
  # it is actually just the contact number the escrow is associated with
13
13
  def escrow_release(id)
14
- oauth_request(:post, "/api/escrow_release/#{id}/").data
14
+ request(:post, "/api/escrow_release/#{id}/").data
15
15
  end
16
16
  end
17
17
  end
@@ -1,16 +1,16 @@
1
1
  module LocalBitcoins
2
2
  module Users
3
3
  def myself
4
- oauth_request(:get, '/api/myself/').data
4
+ request(:get, '/api/myself/').data
5
5
  end
6
6
 
7
7
  def account_info(username)
8
- oauth_request(:get, "/api/account_info/#{username}/").data
8
+ request(:get, "/api/account_info/#{username}/").data
9
9
  end
10
10
 
11
11
  # immediately expires the currently authorized access_token
12
12
  def logout
13
- oauth_request(:post, '/api/logout/')
13
+ request(:post, '/api/logout/')
14
14
  end
15
15
  end
16
16
  end
@@ -2,27 +2,27 @@ module LocalBitcoins
2
2
  module Wallet
3
3
  # Gets information about the token owner's wallet balance
4
4
  def wallet
5
- oauth_request(:get, '/api/wallet/').data
5
+ request(:get, '/api/wallet/').data
6
6
  end
7
7
 
8
8
  def wallet_balance
9
- oauth_request(:get, '/api/wallet-balance/').data
9
+ request(:get, '/api/wallet-balance/').data
10
10
  end
11
11
 
12
12
  def wallet_send(address, amount)
13
- oauth_request(:post, '/api/wallet-send/', {:address=>address, :amount=>amount}).data
13
+ request(:post, '/api/wallet-send/', {:address=>address, :amount=>amount}).data
14
14
  end
15
15
 
16
16
  def wallet_pin_send(address, amount, pin)
17
- oauth_request(:post, '/api/wallet-send/', {:address=>address, :amount=>amount, :pin=>pin}).data if valid_pin?(pin)
17
+ request(:post, '/api/wallet-send/', {:address=>address, :amount=>amount, :pin=>pin}).data if valid_pin?(pin)
18
18
  end
19
19
 
20
20
  def valid_pin?(pin)
21
- oauth_request(:post, '/api/pincode/', {:pincode=>pin}).data.pincode_ok
21
+ request(:post, '/api/pincode/', {:pincode=>pin}).data.pincode_ok
22
22
  end
23
23
 
24
24
  def wallet_addr
25
- oauth_request(:post, '/api/wallet-addr/').data
25
+ request(:post, '/api/wallet-addr/').data
26
26
  end
27
27
  end
28
28
  end
@@ -3,6 +3,9 @@ require 'active_support/core_ext'
3
3
  require 'json'
4
4
  require 'hashie'
5
5
  require 'oauth2'
6
+ require 'openssl'
7
+ require 'date'
8
+ require 'uri'
6
9
 
7
10
  module LocalBitcoins
8
11
  module Request
@@ -10,7 +13,40 @@ module LocalBitcoins
10
13
 
11
14
  protected
12
15
 
13
- # Perform an OAuth API request. The client must be initialized
16
+ def request(*args)
17
+ resp = @use_hmac ? self.hmac_request(*args) : self.oauth_request(*args)
18
+
19
+ hash = Hashie::Mash.new(JSON.parse(resp.body))
20
+ raise Error.new(hash.error) if hash.error
21
+ raise Error.new(hash.errors.join(',')) if hash.errors
22
+ hash
23
+ end
24
+
25
+ def hmac_request(http_method, path, body={})
26
+ raise 'Client ID and secret required!' unless @client_id && @client_secret
27
+
28
+ digest = OpenSSL::Digest.new('sha256')
29
+ nonce = DateTime.now.strftime('%Q')
30
+ params = URI.encode_www_form(body)
31
+ data = [nonce, @client_id, path, params].join
32
+ signature = OpenSSL::HMAC.hexdigest(digest, @client_secret, data)
33
+ url = "#{API_URL}#{path}"
34
+
35
+ headers = {
36
+ 'Apiauth-Key' => @client_id,
37
+ 'Apiauth-Nonce' => nonce,
38
+ 'Apiauth-Signature' => signature,
39
+ }
40
+
41
+ # TODO(maros): Get the `RestClient::Request.execute` API to work.
42
+ if http_method == :get
43
+ RestClient.get("#{url}?#{params}", headers)
44
+ else
45
+ RestClient.post(url, params, headers)
46
+ end
47
+ end
48
+
49
+ # Perform an OAuth API request. The client must be initialized
14
50
  # with a valid OAuth access token to make requests with this method
15
51
  #
16
52
  # path - Request path
@@ -27,10 +63,8 @@ module LocalBitcoins
27
63
  when Net::HTTPNotFound
28
64
  raise LocalBitcoins::NotFound
29
65
  end
30
- hash = Hashie::Mash.new(JSON.parse(resp.body))
31
- raise Error.new(hash.error) if hash.error
32
- raise Error.new(hash.errors.join(',')) if hash.errors
33
- hash
66
+
67
+ resp
34
68
  end
35
69
  end
36
70
  end
@@ -1,5 +1,5 @@
1
1
  module LocalBitcoins
2
2
  unless defined?(LocalBitcoins::VERSION)
3
- VERSION = '1.0.0'
3
+ VERSION = '1.1.0'
4
4
  end
5
5
  end
@@ -6,15 +6,14 @@ Gem::Specification.new do |s|
6
6
  s.summary = "LocalBitcoins API wrapper"
7
7
  s.description = "Ruby wrapper for the LocalBitcoins API"
8
8
  s.homepage = "http://github.com/pemulis/localbitcoins"
9
- s.authors = ["John Shutt", "Will Newman", "Albert Brown"]
10
- s.email = ["john.d.shutt@gmail.com","will.newman@rutgers.edu", "albert_brown@brown.edu"]
11
- s.homepage = "http://shutt.in"
9
+ s.authors = ["John Shutt", "Will Newman", "Albert Brown", "Maros Hluska"]
10
+ s.email = ["john.d.shutt@gmail.com","will.newman@rutgers.edu", "albert_brown@brown.edu", "me@mhluska.com"]
12
11
  s.license = "MIT"
13
12
 
14
13
  s.add_development_dependency 'rspec', '~> 2.13'
15
14
  s.add_development_dependency 'webmock', '~> 1.11'
16
15
 
17
- s.add_runtime_dependency 'json', '~> 1.8.0'
16
+ s.add_runtime_dependency 'json', '~> 1.8'
18
17
  s.add_runtime_dependency 'rest-client', '~> 1.6'
19
18
  s.add_runtime_dependency 'hashie', '~> 2.0.2'
20
19
  s.add_runtime_dependency 'activesupport', '~> 3'
@@ -5,7 +5,8 @@ describe 'Client' do
5
5
  let(:client) { LocalBitcoins::Client.new(
6
6
  client_id: 'CLIENT_ID',
7
7
  client_secret: 'CLIENT_SECRET',
8
- oauth_token: 'ACCESS_TOKEN'
8
+ oauth_token: 'ACCESS_TOKEN',
9
+ use_hmac: ENV['USE_HMAC'],
9
10
  )}
10
11
 
11
12
  describe "#escrows" do
@@ -84,8 +85,7 @@ describe 'Client' do
84
85
  ad = client.ad("12345")
85
86
  expect(ad).to be_a Hashie::Mash
86
87
  expect(ad.count).to eq 2
87
- expect(ad.ad_list[0].data.ad_id).to eq 12345
88
- expect(ad.ad_count).to eq 1
88
+ expect(ad.data.ad_id).to eq 12345
89
89
  end
90
90
  end
91
91
 
@@ -11,32 +11,34 @@ RSpec.configure do |config|
11
11
  config.color = true
12
12
  end
13
13
 
14
- def stub_get(path, fixture_name, params={})
15
- stub_request(:get, api_url(path)).
16
- with(:query => {"Accept" => "application/json", "access_token" => "ACCESS_TOKEN"}.merge!(params),
17
- :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
18
- 'Authorization'=>'Bearer ACCESS_TOKEN','Content-Type'=>'application/x-www-form-urlencoded',
19
- 'User-Agent'=>'Faraday v0.9.0'}).to_return(:status => 200, :body => fixture(fixture_name),
20
- :headers => {})
14
+ def stub_auth(method, path, fixture_name, params={})
15
+ headers = {}
16
+
17
+ if client.use_hmac
18
+ headers['Apiauth-Key'] = 'CLIENT_ID'
19
+ headers['Apiauth-Nonce'] = /\d+/
20
+ headers['Apiauth-Signature'] = /[a-f0-9]+/
21
+ else
22
+ headers['Authorization'] = 'Bearer ACCESS_TOKEN'
23
+ params['access_token'] = 'ACCESS_TOKEN'
24
+ end
25
+
26
+ stub_request(method, api_url(path))
27
+ .with(query: hash_including(params), headers: headers)
28
+ .to_return(status: 200, body: fixture(fixture_name), headers: {})
21
29
  end
22
30
 
23
- def stub_get_unauth(path, fixture_name)
24
- stub_request(:get, api_url(path)).
25
- with(
26
- # :query => {"Accept" => "application/json"},
27
- :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
28
- #'Content-Type'=>'application/x-www-form-urlencoded',
29
- 'User-Agent'=>'Ruby'}).to_return(:status => 200, :body => fixture(fixture_name),
30
- :headers => {})
31
+ def stub_get(path, fixture_name, params={})
32
+ stub_auth(:get, path, fixture_name, params)
31
33
  end
32
34
 
33
35
  def stub_post(path, fixture_name)
34
- stub_request(:post, api_url(path)).
35
- with(:query => {"Accept" => "application/json", "access_token" => "ACCESS_TOKEN"},
36
- :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
37
- 'Authorization'=>'Bearer ACCESS_TOKEN', 'Content-Type'=>'application/x-www-form-urlencoded',
38
- 'User-Agent'=>'Faraday v0.9.0'}).to_return(:status => 200, :body => fixture(fixture_name),
39
- :headers => {})
36
+ stub_auth(:post, path, fixture_name)
37
+ end
38
+
39
+ def stub_get_unauth(path, fixture_name)
40
+ stub_request(:get, api_url(path))
41
+ .to_return(status: 200, body: fixture(fixture_name), headers: {})
40
42
  end
41
43
 
42
44
  def fixture_path(file=nil)
metadata CHANGED
@@ -1,113 +1,114 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: localbitcoins
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Shutt
8
8
  - Will Newman
9
9
  - Albert Brown
10
+ - Maros Hluska
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2014-07-09 00:00:00.000000000 Z
14
+ date: 2015-01-20 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: rspec
17
18
  requirement: !ruby/object:Gem::Requirement
18
19
  requirements:
19
- - - ~>
20
+ - - "~>"
20
21
  - !ruby/object:Gem::Version
21
22
  version: '2.13'
22
23
  type: :development
23
24
  prerelease: false
24
25
  version_requirements: !ruby/object:Gem::Requirement
25
26
  requirements:
26
- - - ~>
27
+ - - "~>"
27
28
  - !ruby/object:Gem::Version
28
29
  version: '2.13'
29
30
  - !ruby/object:Gem::Dependency
30
31
  name: webmock
31
32
  requirement: !ruby/object:Gem::Requirement
32
33
  requirements:
33
- - - ~>
34
+ - - "~>"
34
35
  - !ruby/object:Gem::Version
35
36
  version: '1.11'
36
37
  type: :development
37
38
  prerelease: false
38
39
  version_requirements: !ruby/object:Gem::Requirement
39
40
  requirements:
40
- - - ~>
41
+ - - "~>"
41
42
  - !ruby/object:Gem::Version
42
43
  version: '1.11'
43
44
  - !ruby/object:Gem::Dependency
44
45
  name: json
45
46
  requirement: !ruby/object:Gem::Requirement
46
47
  requirements:
47
- - - ~>
48
+ - - "~>"
48
49
  - !ruby/object:Gem::Version
49
- version: 1.8.0
50
+ version: '1.8'
50
51
  type: :runtime
51
52
  prerelease: false
52
53
  version_requirements: !ruby/object:Gem::Requirement
53
54
  requirements:
54
- - - ~>
55
+ - - "~>"
55
56
  - !ruby/object:Gem::Version
56
- version: 1.8.0
57
+ version: '1.8'
57
58
  - !ruby/object:Gem::Dependency
58
59
  name: rest-client
59
60
  requirement: !ruby/object:Gem::Requirement
60
61
  requirements:
61
- - - ~>
62
+ - - "~>"
62
63
  - !ruby/object:Gem::Version
63
64
  version: '1.6'
64
65
  type: :runtime
65
66
  prerelease: false
66
67
  version_requirements: !ruby/object:Gem::Requirement
67
68
  requirements:
68
- - - ~>
69
+ - - "~>"
69
70
  - !ruby/object:Gem::Version
70
71
  version: '1.6'
71
72
  - !ruby/object:Gem::Dependency
72
73
  name: hashie
73
74
  requirement: !ruby/object:Gem::Requirement
74
75
  requirements:
75
- - - ~>
76
+ - - "~>"
76
77
  - !ruby/object:Gem::Version
77
78
  version: 2.0.2
78
79
  type: :runtime
79
80
  prerelease: false
80
81
  version_requirements: !ruby/object:Gem::Requirement
81
82
  requirements:
82
- - - ~>
83
+ - - "~>"
83
84
  - !ruby/object:Gem::Version
84
85
  version: 2.0.2
85
86
  - !ruby/object:Gem::Dependency
86
87
  name: activesupport
87
88
  requirement: !ruby/object:Gem::Requirement
88
89
  requirements:
89
- - - ~>
90
+ - - "~>"
90
91
  - !ruby/object:Gem::Version
91
92
  version: '3'
92
93
  type: :runtime
93
94
  prerelease: false
94
95
  version_requirements: !ruby/object:Gem::Requirement
95
96
  requirements:
96
- - - ~>
97
+ - - "~>"
97
98
  - !ruby/object:Gem::Version
98
99
  version: '3'
99
100
  - !ruby/object:Gem::Dependency
100
101
  name: oauth2
101
102
  requirement: !ruby/object:Gem::Requirement
102
103
  requirements:
103
- - - ~>
104
+ - - "~>"
104
105
  - !ruby/object:Gem::Version
105
106
  version: 0.9.4
106
107
  type: :runtime
107
108
  prerelease: false
108
109
  version_requirements: !ruby/object:Gem::Requirement
109
110
  requirements:
110
- - - ~>
111
+ - - "~>"
111
112
  - !ruby/object:Gem::Version
112
113
  version: 0.9.4
113
114
  description: Ruby wrapper for the LocalBitcoins API
@@ -115,11 +116,12 @@ email:
115
116
  - john.d.shutt@gmail.com
116
117
  - will.newman@rutgers.edu
117
118
  - albert_brown@brown.edu
119
+ - me@mhluska.com
118
120
  executables: []
119
121
  extensions: []
120
122
  extra_rdoc_files: []
121
123
  files:
122
- - .gitignore
124
+ - ".gitignore"
123
125
  - Gemfile
124
126
  - Gemfile.lock
125
127
  - README.md
@@ -179,7 +181,7 @@ files:
179
181
  - spec/fixtures/wallet_send.json
180
182
  - spec/localbitcoins_spec.rb
181
183
  - spec/spec_helper.rb
182
- homepage: http://shutt.in
184
+ homepage: http://github.com/pemulis/localbitcoins
183
185
  licenses:
184
186
  - MIT
185
187
  metadata: {}
@@ -189,17 +191,17 @@ require_paths:
189
191
  - lib
190
192
  required_ruby_version: !ruby/object:Gem::Requirement
191
193
  requirements:
192
- - - ! '>='
194
+ - - ">="
193
195
  - !ruby/object:Gem::Version
194
196
  version: '0'
195
197
  required_rubygems_version: !ruby/object:Gem::Requirement
196
198
  requirements:
197
- - - ! '>='
199
+ - - ">="
198
200
  - !ruby/object:Gem::Version
199
201
  version: '0'
200
202
  requirements: []
201
203
  rubyforge_project:
202
- rubygems_version: 2.3.0
204
+ rubygems_version: 2.2.2
203
205
  signing_key:
204
206
  specification_version: 4
205
207
  summary: LocalBitcoins API wrapper