bit_wallet 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +17 -0
- data/bit_wallet.gemspec +1 -0
- data/lib/bit_wallet/account.rb +13 -1
- data/lib/bit_wallet/accounts.rb +4 -0
- data/lib/bit_wallet/address.rb +4 -0
- data/lib/bit_wallet/transaction.rb +32 -0
- data/lib/bit_wallet/version.rb +1 -1
- data/lib/bit_wallet/wallet.rb +7 -0
- data/lib/bit_wallet.rb +1 -0
- data/spec/bit_wallet/account_spec.rb +40 -0
- data/spec/bit_wallet/accounts_spec.rb +19 -0
- data/spec/bit_wallet/transaction_spec.rb +30 -0
- data/spec/bit_wallet/wallet_spec.rb +27 -0
- data/spec/spec_helper.rb +5 -12
- metadata +22 -4
- /data/{spec → lib}/bit_wallet/errors.rb +0 -0
data/README.md
CHANGED
@@ -19,15 +19,32 @@ Or install it yourself as:
|
|
19
19
|
## Usage
|
20
20
|
|
21
21
|
wallet = BitWallet.new(:username => 'username', :password => 'password')
|
22
|
+
wallet.accounts.with_balance # returns array of the accounts with balance > 0
|
22
23
|
account = wallet.accounts.new('account name')
|
23
24
|
account.addresses.count # 1, as it already comes with an address
|
24
25
|
account.balance # returns the balance of the account
|
25
26
|
address = account.addresses.new
|
26
27
|
address.address # 8hdsakdjh82d9327ccb64642c - the address hash
|
27
28
|
account.send_amount 5.5, to: '8hdsakdjh82d9327ccb64642c' # sends 5.5 bitcoin to the address
|
29
|
+
account.send_amount 5.5, to: address # sends 5.5 bitcoin to the BitWallet::Address#address
|
28
30
|
account.total_received # returns the total amount received by the account
|
31
|
+
account.transactions # returns array of 10 BitWallet::Transaction
|
32
|
+
account.transactions(limit: 5) # returns array of 5 BitWallet::Transaction
|
29
33
|
address.total_received # returns the total amount received by the address
|
30
34
|
|
35
|
+
### Transaction
|
36
|
+
|
37
|
+
A transaction has the following methods:
|
38
|
+
|
39
|
+
- `account`: the account it belongs to
|
40
|
+
- `address`: the address it belongs to
|
41
|
+
- `amount`: how much was transferred
|
42
|
+
- `category`: returns the category value of the transaction
|
43
|
+
- `confirmation`: how many times this has been confirmed by the network
|
44
|
+
- `id`: the transaction id
|
45
|
+
- `occurred_at`: Ruby Time object for the `time` value returned by bitcoind
|
46
|
+
- `received_at`: Ruby Time object for the `timereceived` value returned by bitcoind
|
47
|
+
|
31
48
|
## Contributing
|
32
49
|
|
33
50
|
1. Fork it
|
data/bit_wallet.gemspec
CHANGED
data/lib/bit_wallet/account.rb
CHANGED
@@ -19,9 +19,12 @@ module BitWallet
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def send_amount(amount, options={})
|
22
|
-
|
22
|
+
if options[:to]
|
23
|
+
options[:to] = options[:to].address if options[:to].is_a?(Address)
|
24
|
+
else
|
23
25
|
fail ArgumentError, 'address must be specified'
|
24
26
|
end
|
27
|
+
|
25
28
|
client.sendfrom(self.name,
|
26
29
|
options[:to],
|
27
30
|
amount,
|
@@ -34,6 +37,15 @@ module BitWallet
|
|
34
37
|
client.getreceivedbyaccount(self.name, BitWallet.config.min_conf)
|
35
38
|
end
|
36
39
|
|
40
|
+
def ==(other_account)
|
41
|
+
self.name == other_account.name
|
42
|
+
end
|
43
|
+
|
44
|
+
def recent_transactions(options={})
|
45
|
+
count = options.delete(:limit) || 10
|
46
|
+
client.listtransactions self.name, count
|
47
|
+
end
|
48
|
+
|
37
49
|
private
|
38
50
|
|
39
51
|
def parse_error(response)
|
data/lib/bit_wallet/accounts.rb
CHANGED
data/lib/bit_wallet/address.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
module BitWallet
|
2
|
+
class Transaction
|
3
|
+
|
4
|
+
attr_reader(:account,
|
5
|
+
:amount,
|
6
|
+
:category,
|
7
|
+
:confirmations,
|
8
|
+
:id,
|
9
|
+
:occurred_at,
|
10
|
+
:received_at)
|
11
|
+
|
12
|
+
def initialize(wallet, args)
|
13
|
+
args = args.with_indifferent_access
|
14
|
+
@wallet = wallet
|
15
|
+
@account = wallet.accounts.new(args[:account])
|
16
|
+
@id = args[:txid]
|
17
|
+
@address_str = args[:address]
|
18
|
+
@amount = args[:amount]
|
19
|
+
@confirmations = args[:confirmations]
|
20
|
+
@occurred_at = Time.at(args[:time])
|
21
|
+
@received_at = Time.at(args[:timereceived])
|
22
|
+
@category = args[:category]
|
23
|
+
end
|
24
|
+
|
25
|
+
def address
|
26
|
+
@address ||= @account.addresses.find do |address|
|
27
|
+
address.address == @address_str
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
data/lib/bit_wallet/version.rb
CHANGED
data/lib/bit_wallet/wallet.rb
CHANGED
@@ -9,6 +9,13 @@ module BitWallet
|
|
9
9
|
@accounts ||= Accounts.new(self)
|
10
10
|
end
|
11
11
|
|
12
|
+
def recent_transactions(options={})
|
13
|
+
count = options.delete(:limit) || 10
|
14
|
+
client.listtransactions(nil, count).map do |hash|
|
15
|
+
Transaction.new self, hash
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
12
19
|
private
|
13
20
|
|
14
21
|
def client
|
data/lib/bit_wallet.rb
CHANGED
@@ -67,6 +67,18 @@ describe BitWallet::Account do
|
|
67
67
|
nona_account.balance.should == expected_balance
|
68
68
|
end
|
69
69
|
|
70
|
+
context ':to is a BitWallet::Address' do
|
71
|
+
it 'should send it to the #address of the given BitWallet::Address' do
|
72
|
+
default_account = wallet.accounts.new('')
|
73
|
+
nona_account = wallet.accounts.new('nona')
|
74
|
+
nona_address = nona_account.addresses.first
|
75
|
+
|
76
|
+
expected_balance = nona_account.balance + 5.2
|
77
|
+
default_account.send_amount 5.2, to: nona_address
|
78
|
+
nona_account.balance.should == expected_balance
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
70
82
|
context 'account does not have enough money' do
|
71
83
|
it 'should fail with the InsufficientFunds error' do
|
72
84
|
default_account = wallet.accounts.new('')
|
@@ -89,4 +101,32 @@ describe BitWallet::Account do
|
|
89
101
|
end
|
90
102
|
end
|
91
103
|
|
104
|
+
describe '#recent_transactions' do
|
105
|
+
it 'should default to list 10 transactions' do
|
106
|
+
wallet = build(:wallet)
|
107
|
+
default_account = wallet.accounts.new('')
|
108
|
+
account_1 = wallet.accounts.new('1')
|
109
|
+
|
110
|
+
1.upto(11).each do |n|
|
111
|
+
default_account.send_amount n, to: account_1.addresses.first
|
112
|
+
end
|
113
|
+
|
114
|
+
account_1.recent_transactions.size.should == 10
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when transaction limit is 5' do
|
118
|
+
it 'should list the 5 most recent transactions' do
|
119
|
+
wallet = build(:wallet)
|
120
|
+
default_account = wallet.accounts.new('')
|
121
|
+
account_1 = wallet.accounts.new('1')
|
122
|
+
|
123
|
+
1.upto(6).each do |n|
|
124
|
+
default_account.send_amount n, to: account_1.addresses.first
|
125
|
+
end
|
126
|
+
|
127
|
+
account_1.recent_transactions(limit: 5).size.should == 5
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
92
132
|
end
|
@@ -27,4 +27,23 @@ describe BitWallet::Accounts do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
describe '.with_balance' do
|
31
|
+
it 'should return accounts with a balance > 0' do
|
32
|
+
default_account = subject.new('')
|
33
|
+
account_1 = subject.new('nomoney')
|
34
|
+
account_2 = subject.new('moneyd')
|
35
|
+
|
36
|
+
default_account.send_amount 10, to: account_2.addresses.first
|
37
|
+
|
38
|
+
accounts_with_balance = subject.with_balance
|
39
|
+
accounts_with_balance.should include(default_account)
|
40
|
+
accounts_with_balance.should_not include(account_1)
|
41
|
+
accounts_with_balance.should include(account_2)
|
42
|
+
|
43
|
+
account_1.send_amount account_1.balance, to: default_account.addresses.first
|
44
|
+
|
45
|
+
subject.with_balance.should_not include(account_1)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
30
49
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BitWallet::Transaction do
|
4
|
+
|
5
|
+
describe 'on initialization' do
|
6
|
+
it 'should be able to take a bitcoind hash' do
|
7
|
+
wallet = build(:wallet)
|
8
|
+
account = wallet.accounts.new('numba')
|
9
|
+
address = account.addresses.new('mi3G43CcN')
|
10
|
+
args = {"account" => 'numba',
|
11
|
+
"address" => "mi3G43CcN",
|
12
|
+
"category" => "receive",
|
13
|
+
"amount" => 1.5,
|
14
|
+
"confirmations" => 0,
|
15
|
+
"txid" => "a363e027",
|
16
|
+
"time" => 1362239334,
|
17
|
+
"timereceived" => 1362239346}
|
18
|
+
transaction = described_class.new(wallet, args)
|
19
|
+
transaction.account.should == account
|
20
|
+
transaction.address.should == address
|
21
|
+
transaction.category.should == 'receive'
|
22
|
+
transaction.amount.should == 1.5
|
23
|
+
transaction.confirmations.should == 0
|
24
|
+
transaction.id.should == 'a363e027'
|
25
|
+
transaction.occurred_at.to_i.should == 1362239334
|
26
|
+
transaction.received_at.to_i.should == 1362239346
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -9,4 +9,31 @@ describe BitWallet::Wallet do
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
describe '#recent_transactions' do
|
13
|
+
it 'should return the most recent transactions of all accounts defaulting to 10 transactions' do
|
14
|
+
wallet = build(:wallet)
|
15
|
+
default_account = wallet.accounts.new('')
|
16
|
+
account_1 = wallet.accounts.new('1')
|
17
|
+
|
18
|
+
1.upto(11).each do |n|
|
19
|
+
default_account.send_amount n, to: account_1.addresses.first
|
20
|
+
end
|
21
|
+
|
22
|
+
wallet.recent_transactions.size.should == 10
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should allow overriding of the transaction limit' do
|
26
|
+
pending "Fix when bitcoin-client this is resolved: https://github.com/sinisterchipmunk/bitcoin-client/issues/4"
|
27
|
+
wallet = build(:wallet)
|
28
|
+
default_account = wallet.accounts.new('')
|
29
|
+
account_1 = wallet.accounts.new('1')
|
30
|
+
|
31
|
+
1.upto(11).each do |n|
|
32
|
+
default_account.send_amount n, to: account_1.addresses.first
|
33
|
+
end
|
34
|
+
|
35
|
+
wallet.recent_transactions(limit: 5).size.should == 5
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
12
39
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'bundler/setup'
|
2
2
|
APP_ENV = 'test'
|
3
|
-
Bundler.require(APP_ENV)
|
3
|
+
Bundler.require(:default, APP_ENV)
|
4
4
|
|
5
5
|
require 'bit_wallet'
|
6
6
|
require 'ostruct'
|
@@ -9,6 +9,7 @@ require 'active_support/core_ext/hash/slice'
|
|
9
9
|
require 'pry'
|
10
10
|
require 'factory_girl'
|
11
11
|
require_relative 'factories'
|
12
|
+
require 'bitcoin_testnet'
|
12
13
|
|
13
14
|
Config = {}
|
14
15
|
yaml_config_file = File.open(File.join(File.dirname(__FILE__), 'config.yml'))
|
@@ -16,22 +17,14 @@ yaml_config = YAML.load(yaml_config_file).with_indifferent_access
|
|
16
17
|
Config[:username] = yaml_config[:rpcuser]
|
17
18
|
Config[:port] = yaml_config[:rpcport]
|
18
19
|
Config[:password] = yaml_config[:rpcpassword]
|
19
|
-
|
20
|
+
|
21
|
+
BitcoinTestnet.configure_rspec!
|
22
|
+
BitcoinTestnet.dir = File.join(File.dirname(__FILE__), 'testnet')
|
20
23
|
|
21
24
|
RSpec.configure do |config|
|
22
25
|
config.include FactoryGirl::Syntax::Methods
|
23
|
-
config.before(:suite) do
|
24
|
-
# Ensure that the testnet is running.
|
25
|
-
bitcoin_processes = `ps -ef | grep bitcoin | grep -v grep`.split("\n")
|
26
|
-
unless bitcoin_processes.size == 2
|
27
|
-
fail "Please make sure the testnet has started. Run `cd #{TESTNET_DIR} && make start`"
|
28
|
-
end
|
29
|
-
end
|
30
26
|
|
31
27
|
config.before(:each) do
|
32
|
-
system("cd #{TESTNET_DIR} && make clean > /dev/null")
|
33
|
-
|
34
|
-
# Do not wait for confirmations in tests -- too long!
|
35
28
|
BitWallet.config.min_conf = 0
|
36
29
|
end
|
37
30
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bit_wallet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bitcoin-client
|
@@ -91,6 +91,22 @@ dependencies:
|
|
91
91
|
- - '='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: 4.2.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: bitcoin_testnet
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - '='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.0.1
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - '='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.0.1
|
94
110
|
description: Ruby-esque handling of Bitcoin wallet
|
95
111
|
email:
|
96
112
|
- ramon.tayag@gmail.com
|
@@ -110,6 +126,8 @@ files:
|
|
110
126
|
- lib/bit_wallet/accounts.rb
|
111
127
|
- lib/bit_wallet/address.rb
|
112
128
|
- lib/bit_wallet/addresses.rb
|
129
|
+
- lib/bit_wallet/errors.rb
|
130
|
+
- lib/bit_wallet/transaction.rb
|
113
131
|
- lib/bit_wallet/version.rb
|
114
132
|
- lib/bit_wallet/wallet.rb
|
115
133
|
- rvmrc.sample
|
@@ -117,7 +135,7 @@ files:
|
|
117
135
|
- spec/bit_wallet/accounts_spec.rb
|
118
136
|
- spec/bit_wallet/address_spec.rb
|
119
137
|
- spec/bit_wallet/addresses_spec.rb
|
120
|
-
- spec/bit_wallet/
|
138
|
+
- spec/bit_wallet/transaction_spec.rb
|
121
139
|
- spec/bit_wallet/wallet_spec.rb
|
122
140
|
- spec/bit_wallet_spec.rb
|
123
141
|
- spec/config.yml
|
@@ -152,7 +170,7 @@ test_files:
|
|
152
170
|
- spec/bit_wallet/accounts_spec.rb
|
153
171
|
- spec/bit_wallet/address_spec.rb
|
154
172
|
- spec/bit_wallet/addresses_spec.rb
|
155
|
-
- spec/bit_wallet/
|
173
|
+
- spec/bit_wallet/transaction_spec.rb
|
156
174
|
- spec/bit_wallet/wallet_spec.rb
|
157
175
|
- spec/bit_wallet_spec.rb
|
158
176
|
- spec/config.yml
|
File without changes
|