bitbank 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,14 @@
1
- ### EDGE
1
+ ### 0.1.1 / 2011-07-11
2
+
3
+ * Added direct account lookup
4
+ * Added ability to move / transfer funds between accounts
5
+
6
+ ### 0.1.0 / 2011-07-04
2
7
 
3
8
  * get_work specifications added
4
9
  * block_number
5
10
  * connection_count
6
11
 
7
-
8
12
  ### 0.0.1 / 2011-06-13
9
13
 
10
14
  * Initial release
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{bitbank}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nick Plante"]
12
- s.date = %q{2011-07-04}
12
+ s.date = %q{2011-07-11}
13
13
  s.description = %q{Easy to use Ruby interface to the Bitcoind JSON-RPC API}
14
14
  s.email = %q{nap@zerosum.org}
15
15
  s.extra_rdoc_files = [
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
38
38
  "spec/client_spec.rb",
39
39
  "spec/fixtures/vcr_cassettes/account/address.yml",
40
40
  "spec/fixtures/vcr_cassettes/account/balance.yml",
41
+ "spec/fixtures/vcr_cassettes/account/move.yml",
41
42
  "spec/fixtures/vcr_cassettes/account/new_address.yml",
42
43
  "spec/fixtures/vcr_cassettes/account/pay.yml",
43
44
  "spec/fixtures/vcr_cassettes/account/transactions.yml",
@@ -1,32 +1,59 @@
1
1
  module Bitbank
2
2
  class Account
3
- attr_reader :name, :balance
3
+ attr_reader :name
4
4
 
5
- def initialize(client, name, balance=nil)
5
+ def initialize(client, name, balance=nil, check=false)
6
6
  @client = client
7
7
  @name = name
8
- @balance = balance
8
+ @balance = balance # currently unused
9
+
10
+ # validate the address if a check is requested
11
+ # (bitcoind creates it if it didn't previous exist)
12
+ address if check
9
13
  end
10
14
 
15
+ # Returns the current bitcoin address for receiving payments to this
16
+ # account.
11
17
  def address
12
18
  @client.request('getaccountaddress', name)
13
19
  end
14
20
 
21
+ # Returns the balance in this account.
15
22
  def balance
16
23
  @client.balance(name)
17
24
  end
18
25
 
26
+ # Move funds from one account in your wallet to another.
27
+ # First parameter can either by an account name or an actual account
28
+ # object.
29
+ def move(name_or_account, amount)
30
+ to_name = if name_or_account.is_a?(Bitbank::Account)
31
+ name_or_account.name
32
+ else
33
+ name_or_account
34
+ end
35
+
36
+ @client.request('move', name, to_name, amount)
37
+ end
38
+
39
+ alias :transfer :move
40
+
41
+ # Returns a new bitcoin address for receiving payments to this account.
19
42
  def new_address
20
43
  @client.new_address(name)
21
44
  end
22
45
 
46
+ # Send funds from this account to the recipient identified by +address+.
47
+ # Note that +amount+ is a real and is rounded to 8 decimal places.
48
+ # Returns the transaction if successful.
23
49
  def pay(address, amount)
24
50
  txid = @client.request('sendfrom', name, address, amount)
25
51
  Transaction.new(@client, txid)
26
52
  end
27
53
 
28
- def transactions
29
- @client.transactions(name)
54
+ # Returns a list of the most recent transactions for this account.
55
+ def transactions(count = 10)
56
+ @client.transactions(name, count)
30
57
  end
31
58
 
32
59
  def ==(other)
@@ -6,15 +6,21 @@ module Bitbank
6
6
  "@#{config[:host]}:#{config[:port]}"
7
7
  end
8
8
 
9
+ # Retrieve a particular named account.
10
+ def account(name)
11
+ Bitbank::Account.new(self, name, nil, true)
12
+ end
13
+
9
14
  # Returns a list of local accounts.
10
15
  def accounts
11
16
  account_data = request('listaccounts')
12
17
  account_data.map do |account_name, account_value|
13
- Account.new(self, account_name, account_value)
18
+ Account.new(self, account_name, account_value, false)
14
19
  end
15
20
  end
16
21
 
17
- # If an account is not specified, returns the server's total available balance.
22
+ # If an account is not specified, returns the server's total available
23
+ # balance.
18
24
  #
19
25
  # If an account is specified, returns the balance in the account.
20
26
  def balance(account_name=nil)
@@ -36,15 +42,16 @@ module Bitbank
36
42
  request('getconnectioncount')
37
43
  end
38
44
 
39
- # Returns the proof-of-work difficulty as a multiple of the minimum difficulty.
45
+ # Returns the proof-of-work difficulty as a multiple of the minimum
46
+ # difficulty.
40
47
  def difficulty
41
48
  request('getdifficulty')
42
49
  end
43
50
 
44
51
  # If data is not specified, returns formatted hash data to work on.
45
52
  #
46
- # If data is specified, bitcoind will try to solve the block and will return
47
- # true or false indicating whether or not it was successful.
53
+ # If data is specified, bitcoind will try to solve the block and will
54
+ # return true or false indicating whether or not it was successful.
48
55
  def get_work(data=nil)
49
56
  request('getwork', data)
50
57
  end
@@ -54,10 +61,17 @@ module Bitbank
54
61
  request('getinfo')
55
62
  end
56
63
 
64
+ # Returns a new bitcoin account for receiving payments (along with a new
65
+ # address).
66
+ def new_account(name)
67
+ account(name)
68
+ end
69
+
57
70
  # Returns a new bitcoin address for receiving payments.
58
71
  #
59
72
  # If an account is specified (recommended), the new address is added to the
60
- # address book so payments received with the address are credited to the account.
73
+ # address book so payments received with the address are credited to the
74
+ # account.
61
75
  def new_address(account_name=nil)
62
76
  request('getnewaddress', account_name)
63
77
  end
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
3
  describe "Bitbank::Account" do
4
4
  before(:each) do
5
5
  @client = Bitbank.new(File.join(File.dirname(__FILE__), '..', 'config.yml'))
6
- @account = Bitbank::Account.new(@client, 'adent', 0.02)
6
+ @account = Bitbank::Account.new(@client, 'adent')
7
7
  end
8
8
 
9
9
  it 'should have a name' do
@@ -16,6 +16,11 @@ describe "Bitbank::Account" do
16
16
  it 'should retrieve the address for this account' do
17
17
  @account.address.should == '1NqwGDRi9Gs4xm1BmPnGeMwgz1CowP6CeQ'
18
18
  end
19
+
20
+ it 'should be validated on account creation if a check was requested (default)' do
21
+ Bitbank::Account.any_instance.expects(:address)
22
+ Bitbank::Account.new(@client, 'trill', nil, true)
23
+ end
19
24
  end
20
25
 
21
26
  describe 'balance' do
@@ -26,6 +31,24 @@ describe "Bitbank::Account" do
26
31
  end
27
32
  end
28
33
 
34
+ describe 'move' do
35
+ use_vcr_cassette 'account/move'
36
+
37
+ before(:each) do
38
+ @to_account = Bitbank::Account.new(@client, 'prefect')
39
+ end
40
+
41
+ it 'should move funds between accounts using an account name' do
42
+ @account.move('prefect', 0.01).should be_true
43
+ @to_account.balance.should == 0.01
44
+ end
45
+
46
+ it 'should move funds between accounts using an account object' do
47
+ @account.move(@to_account, 0.01).should be_true
48
+ @to_account.balance.should == 0.01
49
+ end
50
+ end
51
+
29
52
  describe 'new_address' do
30
53
  use_vcr_cassette 'account/new_address'
31
54
 
@@ -22,6 +22,13 @@ describe "Bitbank::Client" do
22
22
  end
23
23
  end
24
24
 
25
+ describe 'account' do
26
+ it 'should retrieve a named account' do
27
+ Bitbank::Account.any_instance.expects(:address).returns(true) # check
28
+ @client.account('newaccount').should == Bitbank::Account.new(@client, 'newaccount')
29
+ end
30
+ end
31
+
25
32
  describe 'accounts' do
26
33
  use_vcr_cassette 'client/accounts'
27
34
 
@@ -133,8 +140,15 @@ describe "Bitbank::Client" do
133
140
  end
134
141
  end
135
142
 
143
+ describe 'new_account' do
144
+ it 'should create a new account and a new address' do
145
+ Bitbank::Account.any_instance.expects(:address).returns(true) # check
146
+ @client.new_account('newname').should == Bitbank::Account.new(@client, 'newname')
147
+ end
148
+ end
149
+
136
150
  describe 'new_address' do
137
- use_vcr_cassette 'client/new_address', :record => :new_episodes
151
+ use_vcr_cassette 'client/new_address'
138
152
 
139
153
  it 'should create a new address and return it' do
140
154
  @client.new_address.should == '1EzxbYD4rFvZBjUEbtnKZ9KJdrqHB7mkZE'
@@ -0,0 +1,59 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: http://testuser:testpass@localhost:8332/
6
+ body: ! '{"id":"jsonrpc","method":"move","params":["adent","prefect",0.01]}'
7
+ headers:
8
+ accept:
9
+ - ! '*/*; q=0.5, application/xml'
10
+ accept-encoding:
11
+ - gzip, deflate
12
+ content-length:
13
+ - '66'
14
+ response: !ruby/struct:VCR::Response
15
+ status: !ruby/struct:VCR::ResponseStatus
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ date:
20
+ - Mon, 11 Jul 2011 14:40:40 +0000
21
+ content-length:
22
+ - '44'
23
+ content-type:
24
+ - application/json
25
+ server:
26
+ - bitcoin-json-rpc/0.3.21-beta
27
+ body: ! '{"result":true,"error":null,"id":"jsonrpc"}
28
+
29
+ '
30
+ http_version: '1.1'
31
+ - !ruby/struct:VCR::HTTPInteraction
32
+ request: !ruby/struct:VCR::Request
33
+ method: :post
34
+ uri: http://testuser:testpass@localhost:8332/
35
+ body: ! '{"id":"jsonrpc","method":"getbalance","params":["prefect"]}'
36
+ headers:
37
+ accept:
38
+ - ! '*/*; q=0.5, application/xml'
39
+ accept-encoding:
40
+ - gzip, deflate
41
+ content-length:
42
+ - '59'
43
+ response: !ruby/struct:VCR::Response
44
+ status: !ruby/struct:VCR::ResponseStatus
45
+ code: 200
46
+ message: OK
47
+ headers:
48
+ date:
49
+ - Mon, 11 Jul 2011 14:40:40 +0000
50
+ content-length:
51
+ - '50'
52
+ content-type:
53
+ - application/json
54
+ server:
55
+ - bitcoin-json-rpc/0.3.21-beta
56
+ body: ! '{"result":0.01000000,"error":null,"id":"jsonrpc"}
57
+
58
+ '
59
+ http_version: '1.1'
@@ -17,7 +17,7 @@
17
17
  message: OK
18
18
  headers:
19
19
  date:
20
- - Mon, 13 Jun 2011 04:36:13 +0000
20
+ - Mon, 11 Jul 2011 15:06:23 +0000
21
21
  content-length:
22
22
  - '76'
23
23
  content-type:
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitbank
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-07-04 00:00:00.000000000 -04:00
12
+ date: 2011-07-11 00:00:00.000000000 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rest-client
17
- requirement: &2156491140 !ruby/object:Gem::Requirement
17
+ requirement: &2156535100 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.6.3
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2156491140
25
+ version_requirements: *2156535100
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activesupport
28
- requirement: &2156490540 !ruby/object:Gem::Requirement
28
+ requirement: &2156533820 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 3.0.7
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2156490540
36
+ version_requirements: *2156533820
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: i18n
39
- requirement: &2156489940 !ruby/object:Gem::Requirement
39
+ requirement: &2156532820 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 0.5.0
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *2156489940
47
+ version_requirements: *2156532820
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rspec
50
- requirement: &2156489380 !ruby/object:Gem::Requirement
50
+ requirement: &2156531960 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 2.6.0
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2156489380
58
+ version_requirements: *2156531960
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: yard
61
- requirement: &2156488760 !ruby/object:Gem::Requirement
61
+ requirement: &2156530920 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: 0.6.0
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2156488760
69
+ version_requirements: *2156530920
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: bundler
72
- requirement: &2156488240 !ruby/object:Gem::Requirement
72
+ requirement: &2156529420 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ~>
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 1.0.0
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *2156488240
80
+ version_requirements: *2156529420
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: jeweler
83
- requirement: &2156487640 !ruby/object:Gem::Requirement
83
+ requirement: &2156527580 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ~>
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: 1.6.2
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *2156487640
91
+ version_requirements: *2156527580
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: webmock
94
- requirement: &2156487020 !ruby/object:Gem::Requirement
94
+ requirement: &2156526680 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ~>
@@ -99,10 +99,10 @@ dependencies:
99
99
  version: 1.6.4
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *2156487020
102
+ version_requirements: *2156526680
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: vcr
105
- requirement: &2156486420 !ruby/object:Gem::Requirement
105
+ requirement: &2156525400 !ruby/object:Gem::Requirement
106
106
  none: false
107
107
  requirements:
108
108
  - - ! '>='
@@ -110,10 +110,10 @@ dependencies:
110
110
  version: 1.10.0
111
111
  type: :development
112
112
  prerelease: false
113
- version_requirements: *2156486420
113
+ version_requirements: *2156525400
114
114
  - !ruby/object:Gem::Dependency
115
115
  name: mocha
116
- requirement: &2156485820 !ruby/object:Gem::Requirement
116
+ requirement: &2156524120 !ruby/object:Gem::Requirement
117
117
  none: false
118
118
  requirements:
119
119
  - - ! '>='
@@ -121,10 +121,10 @@ dependencies:
121
121
  version: 0.9.12
122
122
  type: :development
123
123
  prerelease: false
124
- version_requirements: *2156485820
124
+ version_requirements: *2156524120
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rcov
127
- requirement: &2156485220 !ruby/object:Gem::Requirement
127
+ requirement: &2156522940 !ruby/object:Gem::Requirement
128
128
  none: false
129
129
  requirements:
130
130
  - - ! '>='
@@ -132,10 +132,10 @@ dependencies:
132
132
  version: '0'
133
133
  type: :development
134
134
  prerelease: false
135
- version_requirements: *2156485220
135
+ version_requirements: *2156522940
136
136
  - !ruby/object:Gem::Dependency
137
137
  name: fuubar
138
- requirement: &2156484580 !ruby/object:Gem::Requirement
138
+ requirement: &2156521480 !ruby/object:Gem::Requirement
139
139
  none: false
140
140
  requirements:
141
141
  - - ! '>='
@@ -143,10 +143,10 @@ dependencies:
143
143
  version: 0.0.5
144
144
  type: :development
145
145
  prerelease: false
146
- version_requirements: *2156484580
146
+ version_requirements: *2156521480
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: autotest
149
- requirement: &2156483980 !ruby/object:Gem::Requirement
149
+ requirement: &2156520680 !ruby/object:Gem::Requirement
150
150
  none: false
151
151
  requirements:
152
152
  - - ! '>='
@@ -154,7 +154,7 @@ dependencies:
154
154
  version: 4.4.6
155
155
  type: :development
156
156
  prerelease: false
157
- version_requirements: *2156483980
157
+ version_requirements: *2156520680
158
158
  description: Easy to use Ruby interface to the Bitcoind JSON-RPC API
159
159
  email: nap@zerosum.org
160
160
  executables: []
@@ -184,6 +184,7 @@ files:
184
184
  - spec/client_spec.rb
185
185
  - spec/fixtures/vcr_cassettes/account/address.yml
186
186
  - spec/fixtures/vcr_cassettes/account/balance.yml
187
+ - spec/fixtures/vcr_cassettes/account/move.yml
187
188
  - spec/fixtures/vcr_cassettes/account/new_address.yml
188
189
  - spec/fixtures/vcr_cassettes/account/pay.yml
189
190
  - spec/fixtures/vcr_cassettes/account/transactions.yml
@@ -221,7 +222,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
221
222
  version: '0'
222
223
  segments:
223
224
  - 0
224
- hash: 2105660465701470600
225
+ hash: -404184776927923942
225
226
  required_rubygems_version: !ruby/object:Gem::Requirement
226
227
  none: false
227
228
  requirements: