localbitcoins 1.0.0 → 1.1.0

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