bit_wallet 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .rvmrc
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "spec/testnet"]
2
+ path = spec/testnet
3
+ url = git://github.com/freewil/bitcoin-testnet-box.git
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bit_wallet.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 TODO: Write your name
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # BitWallet
2
+
3
+ BitWallet is a Ruby-esque interface to a bitcoin daemon. It uses the [bitcoin-client](https://github.com/sinisterchipmunk/bitcoin-client) gem to execute the RPC calls to the daemon.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'bit_wallet'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install bit_wallet
18
+
19
+ ## Usage
20
+
21
+ wallet = BitWallet.new(:username => 'username', :password => 'password')
22
+ account = wallet.accounts.new('account name')
23
+ account.addresses.count # 1, as it already comes with an address
24
+ account.balance # returns the balance of the account
25
+ address = account.addresses.new
26
+ address.address # 8hdsakdjh82d9327ccb64642c - the address hash
27
+ account.send_amount 5.5, to: '8hdsakdjh82d9327ccb64642c' # sends 5.5 bitcoin to the address
28
+ account.total_received # returns the total amount received by the account
29
+ address.total_received # returns the total amount received by the address
30
+
31
+ ## Contributing
32
+
33
+ 1. Fork it
34
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
35
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
36
+ 4. Push to the branch (`git push origin my-new-feature`)
37
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bit_wallet/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "bit_wallet"
8
+ gem.version = BitWallet::VERSION
9
+ gem.authors = ["Ramon Tayag"]
10
+ gem.email = ["ramon.tayag@gmail.com"]
11
+ gem.description = %q{Ruby-esque handling of Bitcoin wallet}
12
+ gem.summary = %q{Ruby-esque handling of Bitcoin wallet.}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency 'bitcoin-client', '0.0.1'
21
+ gem.add_dependency 'activesupport', '3.2.11'
22
+ gem.add_development_dependency 'rspec', '2.12.0'
23
+ gem.add_development_dependency 'pry'
24
+ gem.add_development_dependency 'factory_girl', '4.2.0'
25
+ end
@@ -0,0 +1,36 @@
1
+ module BitWallet
2
+ class Account
3
+
4
+ attr_reader :wallet, :name
5
+ delegate :client, to: :wallet
6
+
7
+ def initialize(wallet, name)
8
+ @wallet = wallet
9
+ @name = name
10
+ self.addresses.new
11
+ end
12
+
13
+ def addresses
14
+ @addresses ||= Addresses.new(self)
15
+ end
16
+
17
+ def balance(min_conf=BitWallet.config.min_conf)
18
+ client.getbalance(self.name, min_conf)
19
+ end
20
+
21
+ def send_amount(amount, options={})
22
+ unless options[:to]
23
+ fail ArgumentError, 'address must be specified'
24
+ end
25
+ client.sendfrom(self.name,
26
+ options[:to],
27
+ amount,
28
+ BitWallet.config.min_conf)
29
+ end
30
+
31
+ def total_received
32
+ client.getreceivedbyaccount(self.name, BitWallet.config.min_conf)
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ module BitWallet
2
+ class Accounts < Array
3
+
4
+ attr_reader :wallet
5
+ delegate :client, to: :wallet
6
+
7
+ def initialize(wallet)
8
+ @wallet = wallet
9
+
10
+ existing_accounts.each do |name|
11
+ self.new(name)
12
+ end
13
+ end
14
+
15
+ def new(name)
16
+ if self.includes_account_name?(name)
17
+ account = self.find {|a| a.name == name}
18
+ else
19
+ account = BitWallet::Account.new(wallet, name)
20
+ self << account
21
+ end
22
+ account
23
+ end
24
+
25
+ def includes_account_name?(account_name)
26
+ self.find {|a| a.name == account_name}.present?
27
+ end
28
+
29
+ private
30
+
31
+ def existing_accounts
32
+ client.listaccounts.keys
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,22 @@
1
+ module BitWallet
2
+ class Address
3
+
4
+ attr_reader :account, :address
5
+ delegate :wallet, to: :account
6
+ delegate :client, to: :wallet
7
+
8
+ def initialize(account, address=nil)
9
+ @account = account
10
+ @address = if address
11
+ address
12
+ else
13
+ client.getnewaddress(@account.name)
14
+ end
15
+ end
16
+
17
+ def total_received
18
+ client.getreceivedbyaddress(self.address, BitWallet.config.min_conf)
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ module BitWallet
2
+ class Addresses < Array
3
+
4
+ attr_reader :account
5
+
6
+ def initialize(account)
7
+ @account = account
8
+ end
9
+
10
+ def new(address_str=nil)
11
+ address = Address.new(@account, address_str)
12
+ self << address
13
+ address
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module BitWallet
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,21 @@
1
+ module BitWallet
2
+ class Wallet
3
+
4
+ def initialize(config={})
5
+ @config = config
6
+ end
7
+
8
+ def accounts
9
+ @accounts ||= Accounts.new(self)
10
+ end
11
+
12
+ private
13
+
14
+ def client
15
+ @client ||= Bitcoin::Client.new(@config[:username],
16
+ @config[:password],
17
+ @config.slice(:port))
18
+ end
19
+
20
+ end
21
+ end
data/lib/bit_wallet.rb ADDED
@@ -0,0 +1,23 @@
1
+ require "bit_wallet/version"
2
+ require 'ostruct'
3
+ require 'active_support/core_ext/module/attribute_accessors'
4
+ require 'active_support/core_ext/module/delegation'
5
+ require 'active_support/core_ext/string'
6
+ require 'bitcoin'
7
+
8
+ require 'bit_wallet/wallet'
9
+ require 'bit_wallet/account'
10
+ require 'bit_wallet/accounts'
11
+ require 'bit_wallet/addresses'
12
+ require 'bit_wallet/address'
13
+
14
+ module BitWallet
15
+
16
+ mattr_accessor :config
17
+ @@config = OpenStruct.new
18
+
19
+ def self.at(*args)
20
+ Wallet.new(*args)
21
+ end
22
+
23
+ end
data/rvmrc.sample ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.9.3-p286
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe BitWallet::Account do
4
+
5
+ let(:wallet) { build(:wallet) }
6
+ subject { described_class.new(wallet, 'name') }
7
+
8
+ its(:wallet) {should == wallet}
9
+ its(:addresses) { should be_kind_of(BitWallet::Addresses) }
10
+
11
+ describe 'on initialization' do
12
+ it 'should have a default name' do
13
+ subject.name.should_not be_blank
14
+ subject.name.should be_kind_of(String)
15
+ end
16
+
17
+ it 'should be assigned that name' do
18
+ wallet = BitWallet::Wallet.new(Config.slice(:username,
19
+ :port,
20
+ :password))
21
+ account = wallet.accounts.new('nona')
22
+
23
+ wallet.accounts.includes_account_name?('nona').should be_true
24
+ end
25
+
26
+ context 'when the account name already exists' do
27
+ it 'should return that same address' do
28
+ wallet = BitWallet::Wallet.new(Config.slice(:username,
29
+ :port,
30
+ :password))
31
+ account = wallet.accounts.new('nona')
32
+
33
+ expect {
34
+ wallet.accounts.new('nona')
35
+ }.to_not change(wallet.accounts, :size)
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '#balance' do
41
+ subject { wallet.accounts.new('nona') }
42
+
43
+ it 'should return the balance of the account' do
44
+ subject.balance.should ==
45
+ subject.client.getbalance(subject.name, BitWallet.config.min_conf)
46
+ end
47
+
48
+ it 'should default to the config min_conf' do
49
+ BitWallet.config.min_conf = 2
50
+ subject.client.should_receive(:getbalance).with(subject.name, 2)
51
+ subject.balance(2)
52
+ end
53
+
54
+ it 'should be able to override the min_conf' do
55
+ subject.client.should_receive(:getbalance).with(subject.name, 'min_conf')
56
+ subject.balance('min_conf')
57
+ end
58
+ end
59
+
60
+ describe '#send_amount' do
61
+ it 'should send money to the given address' do
62
+ default_account = wallet.accounts.new('')
63
+ nona_account = wallet.accounts.new('nona')
64
+ nona_address_str = nona_account.addresses.first.address
65
+ expected_balance = nona_account.balance + 5.5
66
+ default_account.send_amount 5.5, to: nona_address_str
67
+ nona_account.balance.should == expected_balance
68
+ end
69
+ end
70
+
71
+ describe '#total_received' do
72
+ it 'should return the total amount received by the address' do
73
+ subject.client.stub(:getreceivedbyaccount).
74
+ with(subject.name, BitWallet.config.min_conf).
75
+ and_return(2.1)
76
+ subject.total_received.should == 2.1
77
+ end
78
+ end
79
+
80
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe BitWallet::Accounts do
4
+
5
+ let(:wallet) do
6
+ build(:wallet)
7
+ end
8
+
9
+ subject do
10
+ BitWallet::Accounts.new(wallet)
11
+ end
12
+
13
+ its(:wallet) { should == wallet }
14
+
15
+ describe '#new' do
16
+ it 'should create a new BitWallet::Account with a default address' do
17
+ account = wallet.accounts.new('accountname')
18
+ account.should be_kind_of(BitWallet::Account)
19
+ account.addresses.count.should == 1
20
+ end
21
+ end
22
+
23
+ describe '#includes_account_name?(account)' do
24
+ it 'should return true if the array includes the account' do
25
+ account = subject.new('accountname')
26
+ subject.includes_account_name?('accountname').should == true
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe BitWallet::Address do
4
+
5
+ let(:account) { build(:account) }
6
+ subject { build(:address, account: account) }
7
+
8
+ its(:account) { should == account }
9
+
10
+ describe 'on initialization' do
11
+ context 'no address is given' do
12
+ it 'should create an address' do
13
+ address = described_class.new(account)
14
+ address.address.should_not be_blank
15
+ end
16
+ end
17
+
18
+ context 'address given already exists' do
19
+ it 'should not create an address' do
20
+ described_class.new(account, 'addr')
21
+ expect {
22
+ described_class.new(account, 'addr')
23
+ }.to_not change(account.addresses, :count)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe '#total_received' do
29
+ it 'should return the total amount received by the address' do
30
+ subject.client.stub(:getreceivedbyaddress).
31
+ with(subject.address, BitWallet.config.min_conf).
32
+ and_return(2.1)
33
+ subject.total_received.should == 2.1
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe BitWallet::Addresses do
4
+
5
+ let(:account) { build(:account) }
6
+ subject { BitWallet::Addresses.new(account) }
7
+
8
+ its(:account) { should == account }
9
+ its(:new) { should be_kind_of(BitWallet::Address) }
10
+
11
+ describe '#new' do
12
+ context 'without any address string given' do
13
+ it 'should return an Address that points to the same account' do
14
+ subject.new.account.should == account
15
+ end
16
+ end
17
+
18
+ context 'with address string given' do
19
+ it 'should return an Address with the given address string' do
20
+ subject.new('myaddress').address.should == 'myaddress'
21
+ end
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe BitWallet::Wallet do
4
+
5
+ describe '#accounts' do
6
+ it 'should return array of BitWallet::Accounts' do
7
+ wallet = build(:wallet)
8
+ wallet.accounts.should be_kind_of(BitWallet::Accounts)
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe BitWallet do
4
+
5
+ describe '.config' do
6
+ it 'should be a configurable object' do
7
+ described_class.config.min_conf = 22
8
+ described_class.config.min_conf.should == 22
9
+ end
10
+ end
11
+
12
+ describe '.at' do
13
+ it 'should wrap the a wallet wrapping the Bitcoin client' do
14
+ wallet = double
15
+ BitWallet::Wallet.should_receive(:new).with(args: 'a').and_return(wallet)
16
+ described_class.at(args: 'a').should == wallet
17
+ end
18
+ end
19
+
20
+ end
data/spec/config.yml ADDED
@@ -0,0 +1,3 @@
1
+ rpcport: 19001
2
+ rpcuser: admin1
3
+ rpcpassword: 123
data/spec/factories.rb ADDED
@@ -0,0 +1,24 @@
1
+ FactoryGirl.define do
2
+
3
+ factory :wallet, class: BitWallet::Wallet do
4
+ initialize_with { BitWallet::Wallet.new(Config.slice(:username,
5
+ :password,
6
+ :port)) }
7
+ end
8
+
9
+ factory :account, class: BitWallet::Account do
10
+ ignore do
11
+ wallet { build(:wallet) }
12
+ name { 'name' }
13
+ end
14
+ initialize_with { BitWallet::Account.new(wallet, name) }
15
+ end
16
+
17
+ factory :address, class: BitWallet::Address do
18
+ ignore do
19
+ account { build(:account) }
20
+ end
21
+ initialize_with { BitWallet::Address.new(account) }
22
+ end
23
+
24
+ end
@@ -0,0 +1,37 @@
1
+ require 'bundler/setup'
2
+ APP_ENV = 'test'
3
+ Bundler.require(APP_ENV)
4
+
5
+ require 'bit_wallet'
6
+ require 'ostruct'
7
+ require 'active_support/core_ext/hash/indifferent_access'
8
+ require 'active_support/core_ext/hash/slice'
9
+ require 'pry'
10
+ require 'factory_girl'
11
+ require_relative 'factories'
12
+
13
+ Config = {}
14
+ yaml_config_file = File.open(File.join(File.dirname(__FILE__), 'config.yml'))
15
+ yaml_config = YAML.load(yaml_config_file).with_indifferent_access
16
+ Config[:username] = yaml_config[:rpcuser]
17
+ Config[:port] = yaml_config[:rpcport]
18
+ Config[:password] = yaml_config[:rpcpassword]
19
+ TESTNET_DIR = File.join(File.dirname(__FILE__), 'testnet')
20
+
21
+ RSpec.configure do |config|
22
+ 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
+
31
+ 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
+ BitWallet.config.min_conf = 0
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bit_wallet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ramon Tayag
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bitcoin-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.0.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.1
30
+ - !ruby/object:Gem::Dependency
31
+ name: activesupport
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - '='
36
+ - !ruby/object:Gem::Version
37
+ version: 3.2.11
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - '='
44
+ - !ruby/object:Gem::Version
45
+ version: 3.2.11
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - '='
52
+ - !ruby/object:Gem::Version
53
+ version: 2.12.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.12.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: pry
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: factory_girl
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 4.2.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 4.2.0
94
+ description: Ruby-esque handling of Bitcoin wallet
95
+ email:
96
+ - ramon.tayag@gmail.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - .gitmodules
103
+ - Gemfile
104
+ - LICENSE.txt
105
+ - README.md
106
+ - Rakefile
107
+ - bit_wallet.gemspec
108
+ - lib/bit_wallet.rb
109
+ - lib/bit_wallet/account.rb
110
+ - lib/bit_wallet/accounts.rb
111
+ - lib/bit_wallet/address.rb
112
+ - lib/bit_wallet/addresses.rb
113
+ - lib/bit_wallet/version.rb
114
+ - lib/bit_wallet/wallet.rb
115
+ - rvmrc.sample
116
+ - spec/bit_wallet/account_spec.rb
117
+ - spec/bit_wallet/accounts_spec.rb
118
+ - spec/bit_wallet/address_spec.rb
119
+ - spec/bit_wallet/addresses_spec.rb
120
+ - spec/bit_wallet/wallet_spec.rb
121
+ - spec/bit_wallet_spec.rb
122
+ - spec/config.yml
123
+ - spec/factories.rb
124
+ - spec/spec_helper.rb
125
+ homepage: ''
126
+ licenses: []
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 1.8.24
146
+ signing_key:
147
+ specification_version: 3
148
+ summary: Ruby-esque handling of Bitcoin wallet.
149
+ test_files:
150
+ - spec/bit_wallet/account_spec.rb
151
+ - spec/bit_wallet/accounts_spec.rb
152
+ - spec/bit_wallet/address_spec.rb
153
+ - spec/bit_wallet/addresses_spec.rb
154
+ - spec/bit_wallet/wallet_spec.rb
155
+ - spec/bit_wallet_spec.rb
156
+ - spec/config.yml
157
+ - spec/factories.rb
158
+ - spec/spec_helper.rb
159
+ has_rdoc: