bitcoin 0.1.0 → 0.1.2
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.
- data/.rvmrc +1 -1
- data/Gemfile.lock +56 -4
- data/Guardfile +38 -0
- data/README.markdown +21 -2
- data/bin/rbcoin +8 -1
- data/bitcoin.gemspec +17 -5
- data/config/cucumber.yml +3 -3
- data/config/darcs.boring +121 -0
- data/doc/DEFINITION_OF_DONE.markdown +12 -0
- data/doc/HISTORY.markdown +19 -0
- data/{LICENCE.markdown → doc/LICENCE.markdown} +1 -1
- data/doc/TODO.markdown +31 -0
- data/doc/UBIQUITOUS_LANGUAGE.markdown +15 -0
- data/features/descriptions/command_help.feature +31 -0
- data/features/descriptions/satoshi_wallet/add_address.feature +49 -0
- data/features/descriptions/satoshi_wallet/show_addresses.feature +18 -0
- data/features/descriptions/satoshi_wallet/show_version.feature +17 -0
- data/features/descriptions/satoshi_wallet/subcommand_help.feature +20 -0
- data/features/fixtures/ABOUT_FIXTURES.markdown +6 -0
- data/features/fixtures/addressbook_wallet.dat +0 -0
- data/features/fixtures/new_wallet.dat +0 -0
- data/features/step_definitions/command_steps.rb +3 -0
- data/features/step_definitions/wallet_steps.rb +11 -0
- data/features/support/env.rb +8 -1
- data/lib/bitcoin/cli.rb +35 -0
- data/lib/bitcoin/commands.rb +3 -0
- data/lib/bitcoin/commands/help_command.rb +32 -0
- data/lib/bitcoin/commands/satoshi_wallet.rb +11 -0
- data/lib/bitcoin/commands/satoshi_wallet/add_address_command.rb +61 -0
- data/lib/bitcoin/commands/satoshi_wallet/show_addresses_command.rb +16 -0
- data/lib/bitcoin/commands/satoshi_wallet/show_version_command.rb +15 -0
- data/lib/bitcoin/commands/satoshi_wallet_command.rb +37 -0
- data/lib/bitcoin/commands/satoshi_wallet_command_environment.rb +28 -0
- data/lib/bitcoin/console/capturing_stream_bundle.rb +42 -0
- data/lib/bitcoin/console/stream_bundle.rb +21 -0
- data/lib/bitcoin/data_access/satoshi/bdb_satoshi_wallet_repository.rb +155 -0
- data/lib/bitcoin/data_access/satoshi/satoshi_version.rb +58 -0
- data/lib/bitcoin/data_access/satoshi/satoshi_wallet.rb +39 -0
- data/lib/bitcoin/domain/address_book.rb +19 -0
- data/lib/bitcoin/domain/bitcoin_address.rb +33 -0
- data/lib/bitcoin/filesystem/empty_temp_dir.rb +74 -0
- data/lib/bitcoin/rspec/argument_matchers.rb +1 -0
- data/lib/bitcoin/rspec/argument_matchers/block_evaluating_to_matcher.rb +23 -0
- data/lib/bitcoin/rspec/directory_helpers.rb +22 -0
- data/lib/bitcoin/version.rb +1 -1
- data/spec/bitcoin/cli_spec.rb +128 -0
- data/spec/bitcoin/commands/help_command_spec.rb +53 -0
- data/spec/bitcoin/commands/satoshi_wallet/add_address_command_spec.rb +149 -0
- data/spec/bitcoin/commands/satoshi_wallet/show_addresses_command_spec.rb +26 -0
- data/spec/bitcoin/commands/satoshi_wallet/show_version_command_spec.rb +26 -0
- data/spec/bitcoin/commands/satoshi_wallet_command_environment_spec.rb +76 -0
- data/spec/bitcoin/commands/satoshi_wallet_command_spec.rb +73 -0
- data/spec/bitcoin/console/_contracts/stream_bundle_contract.rb +29 -0
- data/spec/bitcoin/console/capturing_stream_bundle_spec.rb +74 -0
- data/spec/bitcoin/console/stream_bundle_spec.rb +13 -0
- data/spec/bitcoin/data_access/satoshi/bdb_satoshi_wallet_repository_spec.rb +78 -0
- data/spec/bitcoin/data_access/satoshi/satoshi_version_spec.rb +112 -0
- data/spec/bitcoin/data_access/satoshi/satoshi_wallet_spec.rb +102 -0
- data/spec/bitcoin/domain/address_book_spec.rb +63 -0
- data/spec/bitcoin/domain/bitcoin_address_spec.rb +52 -0
- data/spec/bitcoin/filesystem/empty_temp_dir_spec.rb +170 -0
- data/spec/bitcoin/rspec/argument_matchers/block_evaluating_to_matcher_spec.rb +36 -0
- data/spec/spec_helper.rb +29 -1
- metadata +221 -18
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'bitcoin/domain/address_book'
|
4
|
+
|
5
|
+
module Bitcoin
|
6
|
+
module Domain
|
7
|
+
describe AddressBook do
|
8
|
+
context "made with no addresses" do
|
9
|
+
subject { AddressBook.new }
|
10
|
+
its(:to_a) { should eq [ ] }
|
11
|
+
end
|
12
|
+
|
13
|
+
context "made with addresses" do
|
14
|
+
let(:address_hashes) {
|
15
|
+
[
|
16
|
+
{ address: "14Z1mazY4HfysZyMaKudFr63EwHqQT2njz", name: "Bitcoin Monitor" },
|
17
|
+
{ address: "1Nqr3MqVyUp6k3o3QPePAdn4Yg4tzgB9kw", name: "Bitcoincharts" }
|
18
|
+
]
|
19
|
+
}
|
20
|
+
|
21
|
+
subject {
|
22
|
+
AddressBook.new(address_hashes)
|
23
|
+
}
|
24
|
+
|
25
|
+
its(:to_a) {
|
26
|
+
should =~ [
|
27
|
+
{ address: "14Z1mazY4HfysZyMaKudFr63EwHqQT2njz", name: "Bitcoin Monitor" },
|
28
|
+
{ address: "1Nqr3MqVyUp6k3o3QPePAdn4Yg4tzgB9kw", name: "Bitcoincharts" }
|
29
|
+
]
|
30
|
+
}
|
31
|
+
|
32
|
+
# We're assuming the output comes out in the input order, so this example is
|
33
|
+
# overly precise until we know how we'll handle presentation
|
34
|
+
its(:to_s) {
|
35
|
+
should eq(
|
36
|
+
-%{
|
37
|
+
14Z1mazY4HfysZyMaKudFr63EwHqQT2njz Bitcoin Monitor
|
38
|
+
1Nqr3MqVyUp6k3o3QPePAdn4Yg4tzgB9kw Bitcoincharts
|
39
|
+
}
|
40
|
+
)
|
41
|
+
}
|
42
|
+
|
43
|
+
describe "argument cloning" do
|
44
|
+
# Ensure this is created before we try changing the input arguments
|
45
|
+
before(:each) { subject }
|
46
|
+
|
47
|
+
it "does not mutate the args" do
|
48
|
+
expect {
|
49
|
+
address_hashes.delete_if { true }
|
50
|
+
}.to_not change {
|
51
|
+
subject.to_a.length
|
52
|
+
}.from(2).to(0)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "makes a deep copy" do
|
56
|
+
address_hashes.first[:name] = "changed"
|
57
|
+
subject.to_a.map { |hash| hash[:name] }.should_not include("changed")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'bitcoin/domain/bitcoin_address'
|
4
|
+
|
5
|
+
module Bitcoin
|
6
|
+
module Domain
|
7
|
+
describe BitcoinAddress do
|
8
|
+
context "created with a valid real network address" do
|
9
|
+
subject { BitcoinAddress.new("14Z1mazY4HfysZyMaKudFr63EwHqQT2njz") }
|
10
|
+
|
11
|
+
its(:to_s) { should eq "14Z1mazY4HfysZyMaKudFr63EwHqQT2njz" }
|
12
|
+
|
13
|
+
describe "#==" do
|
14
|
+
it "is equal to another BitcoinAddress with the same address" do
|
15
|
+
subject.should eq BitcoinAddress.new("14Z1mazY4HfysZyMaKudFr63EwHqQT2njz")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "is not equal to a BitcoinAddress with a different address" do
|
19
|
+
subject.should_not eq BitcoinAddress.new("1Nqr3MqVyUp6k3o3QPePAdn4Yg4tzgB9kw")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "is not equal to a String" do
|
23
|
+
subject.should_not eq "14Z1mazY4HfysZyMaKudFr63EwHqQT2njz"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "creating with an invalid address" do
|
29
|
+
invalid_addresses = [
|
30
|
+
# Not actually sure the reasons here are valid in general but it's just enough to
|
31
|
+
# get us going (the point of the exercise is to put an error protocol in place)
|
32
|
+
{ address: "14Z1mazY4HfysZyMaKudFr63EwHqQT2nj", because: "this is too short" },
|
33
|
+
{ address: "14Z1mazY4HfysZyMaKudFr63EwHqQT2njzX", because: "this is too long" }
|
34
|
+
# Hash doesn't match
|
35
|
+
# Wrong version
|
36
|
+
# ... etc ...
|
37
|
+
# (When we know more about Bitcoin crypto we can come back and finish this off)
|
38
|
+
]
|
39
|
+
|
40
|
+
invalid_addresses.each do |invalid_address|
|
41
|
+
it "raises an error for address #{invalid_address[:address]} because #{invalid_address[:because]}" do
|
42
|
+
expect {
|
43
|
+
BitcoinAddress.new(invalid_address[:address])
|
44
|
+
}.to raise_error(BitcoinAddress::InvalidBitcoinAddressError) { |error|
|
45
|
+
error.message.should eq %'The address "#{invalid_address[:address]}" is not a valid Bitcoin address'
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'bitcoin/filesystem/empty_temp_dir'
|
4
|
+
require 'bitcoin/rspec/directory_helpers'
|
5
|
+
|
6
|
+
module Bitcoin
|
7
|
+
module FileSystem
|
8
|
+
describe EmptyTempDir do
|
9
|
+
include Bitcoin::RSpec::DirectoryHelpers
|
10
|
+
|
11
|
+
TEMP_TEST_DIR = File.join(PROJECT_ROOT, "tmp", "test").freeze
|
12
|
+
|
13
|
+
ensure_empty_test_dir(TEMP_TEST_DIR)
|
14
|
+
|
15
|
+
describe ".open" do
|
16
|
+
describe "integration" do # refactoring invariant
|
17
|
+
it "lets you create a temporary file inside the temporary directory" do
|
18
|
+
expected_temp_dir_name = File.join(TEMP_TEST_DIR, "temp_dir")
|
19
|
+
|
20
|
+
EmptyTempDir.open(with_name: "temp_dir", parallel_to: File.join(TEMP_TEST_DIR, "wallet.dat")) do |temp_dir|
|
21
|
+
File.open(File.join(temp_dir.absolute_path, "test_file"), "w") do |file|
|
22
|
+
file << "some unimportant contents"
|
23
|
+
end
|
24
|
+
Dir.entries(temp_dir.absolute_path).should eq %w[ . .. test_file ]
|
25
|
+
end
|
26
|
+
|
27
|
+
File.exist?(expected_temp_dir_name).should be_false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "interactions" do
|
32
|
+
let(:block_runner) { mock(EmptyTempDir::BlockRunner, run: :block_runner_run_value) }
|
33
|
+
|
34
|
+
before(:each) do
|
35
|
+
EmptyTempDir::BlockRunner.stub(new: block_runner)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "raises an error if no block is provided", because: "this would be a pointless thing to do" do
|
39
|
+
expect {
|
40
|
+
EmptyTempDir.open(with_name: "temp_dir", parallel_to: File.join(TEMP_TEST_DIR, "wallet.dat"))
|
41
|
+
}.to raise_error(ArgumentError) { |error|
|
42
|
+
error.message.should =~ /you must provide a block to EmptyTempDir\.open/i
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "creating the BlockRunner" do
|
47
|
+
it "calculates a directory name parallel to the file" do
|
48
|
+
EmptyTempDir::BlockRunner.should_receive(:new).with("/foo/bar/temp_dir")
|
49
|
+
EmptyTempDir.open(with_name: "temp_dir", parallel_to: "/foo/bar/baz", & -> { :noop })
|
50
|
+
end
|
51
|
+
|
52
|
+
it "always passed absolute directories" do
|
53
|
+
EmptyTempDir::BlockRunner.should_receive(:new).with(File.join(PROJECT_ROOT, "/foo/bar/anything"))
|
54
|
+
EmptyTempDir.open(with_name: "anything", parallel_to: "foo/bar/baz", & -> { :noop })
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it "runs the block" do
|
59
|
+
block = -> { :block_value }
|
60
|
+
block_runner.should_receive(:run).with(block_evaluating_to(:block_value))
|
61
|
+
EmptyTempDir.open(with_name: "anything", parallel_to: "/foo/bar/baz", &block)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "returns the value of the block" do
|
65
|
+
EmptyTempDir.open(with_name: "temp_dir", parallel_to: "/foo/bar/baz", & -> { :noop }).should eq :block_runner_run_value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe EmptyTempDir::BlockRunner do
|
71
|
+
describe ".new" do
|
72
|
+
# Yes, I actually did this to myself.
|
73
|
+
describe "raising an error on unsafe paths", because: "otherwise it could format your hard drive!" do
|
74
|
+
[ "", "/", "//" ].each do |unacceptable_path|
|
75
|
+
it "blocks #{unacceptable_path.inspect}" do
|
76
|
+
expect {
|
77
|
+
EmptyTempDir::BlockRunner.new(unacceptable_path)
|
78
|
+
}.to raise_error(ArgumentError) { |error|
|
79
|
+
error.message.should eq "Unacceptable directory name for EmptyTempDir"
|
80
|
+
}
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#run" do
|
87
|
+
shared_examples "EmptyTempDir::BlockRunner#run" do
|
88
|
+
let(:expected_temp_dir_name) { File.join(TEMP_TEST_DIR, "temp_dir") }
|
89
|
+
subject { EmptyTempDir::BlockRunner.new(expected_temp_dir_name) }
|
90
|
+
|
91
|
+
it "ensures the directory exists" do
|
92
|
+
subject.run(
|
93
|
+
->(temp_dir) { File.directory?(expected_temp_dir_name) }
|
94
|
+
).should be_true
|
95
|
+
end
|
96
|
+
|
97
|
+
it "ensures the directory is empty" do
|
98
|
+
subject.run(
|
99
|
+
->(temp_dir) { Dir.entries(expected_temp_dir_name) }
|
100
|
+
).should =~ %w[ . .. ]
|
101
|
+
end
|
102
|
+
|
103
|
+
it "removes the directory at the end (even if a file was created inside it)" do
|
104
|
+
subject.run(
|
105
|
+
->(temp_dir) {
|
106
|
+
File.open(File.join(temp_dir.absolute_path, "test_file"), "w") do |file|
|
107
|
+
file << "unimportant contents"
|
108
|
+
end
|
109
|
+
Dir.entries(temp_dir.absolute_path).should eq %w[ . .. test_file ]
|
110
|
+
}
|
111
|
+
)
|
112
|
+
|
113
|
+
File.exist?(expected_temp_dir_name).should be_false
|
114
|
+
end
|
115
|
+
|
116
|
+
it "removes the directory even if the block raises an error" do
|
117
|
+
expect {
|
118
|
+
subject.run(->(temp_dir) { raise RuntimeError.new("I'm trying to make the temp dir persist!") })
|
119
|
+
}.to raise_error
|
120
|
+
|
121
|
+
File.exist?(expected_temp_dir_name).should be_false
|
122
|
+
end
|
123
|
+
|
124
|
+
it "re-raises any error thrown in the block" do
|
125
|
+
expected_error = RuntimeError.new("I'm trying to make the temp dir persist!")
|
126
|
+
|
127
|
+
expect {
|
128
|
+
subject.run(->(temp_dir) { raise expected_error })
|
129
|
+
}.to raise_error { |actual_error|
|
130
|
+
actual_error.should equal expected_error
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
134
|
+
it "has the expected path name" do
|
135
|
+
subject.run(->(temp_dir) { temp_dir.absolute_path.should eq expected_temp_dir_name })
|
136
|
+
end
|
137
|
+
|
138
|
+
it "returns the value of the block", because: "all the examples rely on this" do
|
139
|
+
subject.run(->(temp_dir) {
|
140
|
+
:block_value
|
141
|
+
}).should eq :block_value
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context "where the target directory does not exist" do
|
146
|
+
before(:each) do
|
147
|
+
FileUtils.rm_rf(expected_temp_dir_name)
|
148
|
+
end
|
149
|
+
|
150
|
+
it_behaves_like "EmptyTempDir::BlockRunner#run"
|
151
|
+
end
|
152
|
+
|
153
|
+
context "where the target directory exists" do
|
154
|
+
before(:each) do
|
155
|
+
existing_file_name = File.join(expected_temp_dir_name, "intermediate_dir", "test_file")
|
156
|
+
|
157
|
+
# Make the target directory and a file inside a nested folder inside it
|
158
|
+
FileUtils.mkdir_p(File.dirname(existing_file_name))
|
159
|
+
File.open(existing_file_name, "w") do |file|
|
160
|
+
file << "some unimportant contents"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
it_behaves_like "EmptyTempDir::BlockRunner#run"
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Bitcoin
|
4
|
+
module RSpec
|
5
|
+
module ArgumentMatchers
|
6
|
+
describe BlockEvaluatingToMatcher do
|
7
|
+
include ArgumentMatchers
|
8
|
+
|
9
|
+
it "describes itself properly" do
|
10
|
+
BlockEvaluatingToMatcher.new(:foo).description.should == "block_evaluating_to(:foo)"
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "passing" do
|
14
|
+
it "matches a block returning the value" do
|
15
|
+
block_evaluating_to("foo").should == -> { "foo" }
|
16
|
+
end
|
17
|
+
|
18
|
+
it "matches non-Proc objects responding to #call", because: "I couldn't think of a reason why not" do
|
19
|
+
fake_block = "foo"
|
20
|
+
def fake_block.call
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
block_evaluating_to("foo").should == fake_block
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "failing" do
|
29
|
+
it "does not match a block returning a different value" do
|
30
|
+
block_evaluating_to("foo").should_not == -> { "bar" }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1 +1,29 @@
|
|
1
|
-
|
1
|
+
PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), "..")).freeze
|
2
|
+
|
3
|
+
GUARD = ENV["GUARD"]
|
4
|
+
|
5
|
+
# Gem dependencies
|
6
|
+
require 'lstrip-on-steroids'
|
7
|
+
require 'fakefs/spec_helpers'
|
8
|
+
|
9
|
+
# Project dependencies
|
10
|
+
require 'bitcoin/rspec/argument_matchers'
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.filter_run(focus: true)
|
14
|
+
config.filter_run_excluding(adapter: :slow) if GUARD == "fast"
|
15
|
+
config.run_all_when_everything_filtered = true
|
16
|
+
config.mock_with(:rspec)
|
17
|
+
config.include(Bitcoin::RSpec::ArgumentMatchers)
|
18
|
+
end
|
19
|
+
|
20
|
+
module SpecHelperObjectExtensions
|
21
|
+
def contract(name, &block)
|
22
|
+
shared_examples_for(name, &block)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
include SpecHelperObjectExtensions
|
26
|
+
|
27
|
+
RSpec.configure do |config|
|
28
|
+
config.alias_it_should_behave_like_to(:it_satisfies_contract, 'satisfies contract:')
|
29
|
+
end
|
metadata
CHANGED
@@ -1,19 +1,42 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitcoin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ash Moran
|
9
|
+
- Andy Shipman
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2011-
|
13
|
+
date: 2011-08-29 00:00:00.000000000Z
|
13
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: sbdb
|
17
|
+
requirement: &70201048457280 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.0.12.2
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *70201048457280
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: lstrip-on-steroids
|
28
|
+
requirement: &70201048456780 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *70201048456780
|
14
37
|
- !ruby/object:Gem::Dependency
|
15
38
|
name: rake
|
16
|
-
requirement: &
|
39
|
+
requirement: &70201048488880 !ruby/object:Gem::Requirement
|
17
40
|
none: false
|
18
41
|
requirements:
|
19
42
|
- - ! '>='
|
@@ -21,10 +44,21 @@ dependencies:
|
|
21
44
|
version: '0'
|
22
45
|
type: :development
|
23
46
|
prerelease: false
|
24
|
-
version_requirements: *
|
47
|
+
version_requirements: *70201048488880
|
25
48
|
- !ruby/object:Gem::Dependency
|
26
49
|
name: cucumber
|
27
|
-
requirement: &
|
50
|
+
requirement: &70201048488420 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *70201048488420
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: aruba
|
61
|
+
requirement: &70201048488000 !ruby/object:Gem::Requirement
|
28
62
|
none: false
|
29
63
|
requirements:
|
30
64
|
- - ! '>='
|
@@ -32,10 +66,21 @@ dependencies:
|
|
32
66
|
version: '0'
|
33
67
|
type: :development
|
34
68
|
prerelease: false
|
35
|
-
version_requirements: *
|
69
|
+
version_requirements: *70201048488000
|
36
70
|
- !ruby/object:Gem::Dependency
|
37
71
|
name: rspec
|
38
|
-
requirement: &
|
72
|
+
requirement: &70201048487580 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *70201048487580
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: fuubar
|
83
|
+
requirement: &70201048487160 !ruby/object:Gem::Requirement
|
39
84
|
none: false
|
40
85
|
requirements:
|
41
86
|
- - ! '>='
|
@@ -43,10 +88,32 @@ dependencies:
|
|
43
88
|
version: '0'
|
44
89
|
type: :development
|
45
90
|
prerelease: false
|
46
|
-
version_requirements: *
|
91
|
+
version_requirements: *70201048487160
|
47
92
|
- !ruby/object:Gem::Dependency
|
48
93
|
name: guard
|
49
|
-
requirement: &
|
94
|
+
requirement: &70201048486740 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
type: :development
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: *70201048486740
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: guard-rspec
|
105
|
+
requirement: &70201048486320 !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
type: :development
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: *70201048486320
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: guard-cucumber
|
116
|
+
requirement: &70201048485900 !ruby/object:Gem::Requirement
|
50
117
|
none: false
|
51
118
|
requirements:
|
52
119
|
- - ! '>='
|
@@ -54,10 +121,21 @@ dependencies:
|
|
54
121
|
version: '0'
|
55
122
|
type: :development
|
56
123
|
prerelease: false
|
57
|
-
version_requirements: *
|
124
|
+
version_requirements: *70201048485900
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: guard-bundler
|
127
|
+
requirement: &70201048485480 !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: *70201048485480
|
58
136
|
- !ruby/object:Gem::Dependency
|
59
137
|
name: rb-fsevent
|
60
|
-
requirement: &
|
138
|
+
requirement: &70201048485060 !ruby/object:Gem::Requirement
|
61
139
|
none: false
|
62
140
|
requirements:
|
63
141
|
- - ! '>='
|
@@ -65,10 +143,54 @@ dependencies:
|
|
65
143
|
version: '0'
|
66
144
|
type: :development
|
67
145
|
prerelease: false
|
68
|
-
version_requirements: *
|
146
|
+
version_requirements: *70201048485060
|
69
147
|
- !ruby/object:Gem::Dependency
|
70
148
|
name: growl
|
71
|
-
requirement: &
|
149
|
+
requirement: &70201048484640 !ruby/object:Gem::Requirement
|
150
|
+
none: false
|
151
|
+
requirements:
|
152
|
+
- - ! '>='
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
type: :development
|
156
|
+
prerelease: false
|
157
|
+
version_requirements: *70201048484640
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: fakefs
|
160
|
+
requirement: &70201048484220 !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: *70201048484220
|
169
|
+
- !ruby/object:Gem::Dependency
|
170
|
+
name: awesome_print
|
171
|
+
requirement: &70201048483800 !ruby/object:Gem::Requirement
|
172
|
+
none: false
|
173
|
+
requirements:
|
174
|
+
- - ! '>='
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '0'
|
177
|
+
type: :development
|
178
|
+
prerelease: false
|
179
|
+
version_requirements: *70201048483800
|
180
|
+
- !ruby/object:Gem::Dependency
|
181
|
+
name: looksee
|
182
|
+
requirement: &70201048483380 !ruby/object:Gem::Requirement
|
183
|
+
none: false
|
184
|
+
requirements:
|
185
|
+
- - ! '>='
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: *70201048483380
|
191
|
+
- !ruby/object:Gem::Dependency
|
192
|
+
name: growl_notify
|
193
|
+
requirement: &70201048482960 !ruby/object:Gem::Requirement
|
72
194
|
none: false
|
73
195
|
requirements:
|
74
196
|
- - ! '>='
|
@@ -76,10 +198,11 @@ dependencies:
|
|
76
198
|
version: '0'
|
77
199
|
type: :development
|
78
200
|
prerelease: false
|
79
|
-
version_requirements: *
|
201
|
+
version_requirements: *70201048482960
|
80
202
|
description: Bitcoin client
|
81
203
|
email:
|
82
204
|
- ash.moran@patchspace.co.uk
|
205
|
+
- andy@cllearview.com
|
83
206
|
executables:
|
84
207
|
- rbcoin
|
85
208
|
extensions: []
|
@@ -89,18 +212,71 @@ files:
|
|
89
212
|
- ./.rvmrc
|
90
213
|
- ./Gemfile
|
91
214
|
- ./Gemfile.lock
|
92
|
-
- ./
|
215
|
+
- ./Guardfile
|
93
216
|
- ./README.markdown
|
94
217
|
- ./Rakefile
|
95
218
|
- ./bitcoin.gemspec
|
96
219
|
- ./bin/rbcoin
|
97
220
|
- ./config/cucumber.yml
|
221
|
+
- ./config/darcs.boring
|
222
|
+
- ./doc/DEFINITION_OF_DONE.markdown
|
223
|
+
- ./doc/HISTORY.markdown
|
224
|
+
- ./doc/LICENCE.markdown
|
225
|
+
- ./doc/TODO.markdown
|
226
|
+
- ./doc/UBIQUITOUS_LANGUAGE.markdown
|
227
|
+
- ./features/descriptions/command_help.feature
|
228
|
+
- ./features/descriptions/satoshi_wallet/add_address.feature
|
229
|
+
- ./features/descriptions/satoshi_wallet/show_addresses.feature
|
230
|
+
- ./features/descriptions/satoshi_wallet/show_version.feature
|
231
|
+
- ./features/descriptions/satoshi_wallet/subcommand_help.feature
|
232
|
+
- ./features/fixtures/ABOUT_FIXTURES.markdown
|
233
|
+
- ./features/fixtures/addressbook_wallet.dat
|
234
|
+
- ./features/fixtures/new_wallet.dat
|
235
|
+
- ./features/step_definitions/command_steps.rb
|
236
|
+
- ./features/step_definitions/wallet_steps.rb
|
98
237
|
- ./features/support/env.rb
|
99
238
|
- ./lib/bitcoin.rb
|
239
|
+
- ./lib/bitcoin/cli.rb
|
240
|
+
- ./lib/bitcoin/commands.rb
|
100
241
|
- ./lib/bitcoin/version.rb
|
242
|
+
- ./lib/bitcoin/commands/help_command.rb
|
243
|
+
- ./lib/bitcoin/commands/satoshi_wallet.rb
|
244
|
+
- ./lib/bitcoin/commands/satoshi_wallet_command.rb
|
245
|
+
- ./lib/bitcoin/commands/satoshi_wallet_command_environment.rb
|
246
|
+
- ./lib/bitcoin/commands/satoshi_wallet/add_address_command.rb
|
247
|
+
- ./lib/bitcoin/commands/satoshi_wallet/show_addresses_command.rb
|
248
|
+
- ./lib/bitcoin/commands/satoshi_wallet/show_version_command.rb
|
249
|
+
- ./lib/bitcoin/console/capturing_stream_bundle.rb
|
250
|
+
- ./lib/bitcoin/console/stream_bundle.rb
|
251
|
+
- ./lib/bitcoin/data_access/satoshi/bdb_satoshi_wallet_repository.rb
|
252
|
+
- ./lib/bitcoin/data_access/satoshi/satoshi_version.rb
|
253
|
+
- ./lib/bitcoin/data_access/satoshi/satoshi_wallet.rb
|
254
|
+
- ./lib/bitcoin/domain/address_book.rb
|
255
|
+
- ./lib/bitcoin/domain/bitcoin_address.rb
|
256
|
+
- ./lib/bitcoin/filesystem/empty_temp_dir.rb
|
257
|
+
- ./lib/bitcoin/rspec/argument_matchers.rb
|
258
|
+
- ./lib/bitcoin/rspec/directory_helpers.rb
|
259
|
+
- ./lib/bitcoin/rspec/argument_matchers/block_evaluating_to_matcher.rb
|
101
260
|
- ./spec/spec_helper.rb
|
261
|
+
- ./spec/bitcoin/cli_spec.rb
|
262
|
+
- ./spec/bitcoin/commands/help_command_spec.rb
|
263
|
+
- ./spec/bitcoin/commands/satoshi_wallet_command_environment_spec.rb
|
264
|
+
- ./spec/bitcoin/commands/satoshi_wallet_command_spec.rb
|
265
|
+
- ./spec/bitcoin/commands/satoshi_wallet/add_address_command_spec.rb
|
266
|
+
- ./spec/bitcoin/commands/satoshi_wallet/show_addresses_command_spec.rb
|
267
|
+
- ./spec/bitcoin/commands/satoshi_wallet/show_version_command_spec.rb
|
268
|
+
- ./spec/bitcoin/console/capturing_stream_bundle_spec.rb
|
269
|
+
- ./spec/bitcoin/console/stream_bundle_spec.rb
|
270
|
+
- ./spec/bitcoin/console/_contracts/stream_bundle_contract.rb
|
271
|
+
- ./spec/bitcoin/data_access/satoshi/bdb_satoshi_wallet_repository_spec.rb
|
272
|
+
- ./spec/bitcoin/data_access/satoshi/satoshi_version_spec.rb
|
273
|
+
- ./spec/bitcoin/data_access/satoshi/satoshi_wallet_spec.rb
|
274
|
+
- ./spec/bitcoin/domain/address_book_spec.rb
|
275
|
+
- ./spec/bitcoin/domain/bitcoin_address_spec.rb
|
276
|
+
- ./spec/bitcoin/filesystem/empty_temp_dir_spec.rb
|
277
|
+
- ./spec/bitcoin/rspec/argument_matchers/block_evaluating_to_matcher_spec.rb
|
102
278
|
- bin/rbcoin
|
103
|
-
homepage: http://
|
279
|
+
homepage: http://rbcoin.org/
|
104
280
|
licenses: []
|
105
281
|
post_install_message:
|
106
282
|
rdoc_options: []
|
@@ -120,10 +296,37 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
296
|
version: '0'
|
121
297
|
requirements: []
|
122
298
|
rubyforge_project:
|
123
|
-
rubygems_version: 1.8.
|
299
|
+
rubygems_version: 1.8.9
|
124
300
|
signing_key:
|
125
301
|
specification_version: 3
|
126
|
-
summary:
|
302
|
+
summary: bitcoin-0.1.2
|
127
303
|
test_files:
|
304
|
+
- ./features/descriptions/command_help.feature
|
305
|
+
- ./features/descriptions/satoshi_wallet/add_address.feature
|
306
|
+
- ./features/descriptions/satoshi_wallet/show_addresses.feature
|
307
|
+
- ./features/descriptions/satoshi_wallet/show_version.feature
|
308
|
+
- ./features/descriptions/satoshi_wallet/subcommand_help.feature
|
309
|
+
- ./features/fixtures/ABOUT_FIXTURES.markdown
|
310
|
+
- ./features/fixtures/addressbook_wallet.dat
|
311
|
+
- ./features/fixtures/new_wallet.dat
|
312
|
+
- ./features/step_definitions/command_steps.rb
|
313
|
+
- ./features/step_definitions/wallet_steps.rb
|
128
314
|
- ./features/support/env.rb
|
129
315
|
- ./spec/spec_helper.rb
|
316
|
+
- ./spec/bitcoin/cli_spec.rb
|
317
|
+
- ./spec/bitcoin/commands/help_command_spec.rb
|
318
|
+
- ./spec/bitcoin/commands/satoshi_wallet_command_environment_spec.rb
|
319
|
+
- ./spec/bitcoin/commands/satoshi_wallet_command_spec.rb
|
320
|
+
- ./spec/bitcoin/commands/satoshi_wallet/add_address_command_spec.rb
|
321
|
+
- ./spec/bitcoin/commands/satoshi_wallet/show_addresses_command_spec.rb
|
322
|
+
- ./spec/bitcoin/commands/satoshi_wallet/show_version_command_spec.rb
|
323
|
+
- ./spec/bitcoin/console/capturing_stream_bundle_spec.rb
|
324
|
+
- ./spec/bitcoin/console/stream_bundle_spec.rb
|
325
|
+
- ./spec/bitcoin/console/_contracts/stream_bundle_contract.rb
|
326
|
+
- ./spec/bitcoin/data_access/satoshi/bdb_satoshi_wallet_repository_spec.rb
|
327
|
+
- ./spec/bitcoin/data_access/satoshi/satoshi_version_spec.rb
|
328
|
+
- ./spec/bitcoin/data_access/satoshi/satoshi_wallet_spec.rb
|
329
|
+
- ./spec/bitcoin/domain/address_book_spec.rb
|
330
|
+
- ./spec/bitcoin/domain/bitcoin_address_spec.rb
|
331
|
+
- ./spec/bitcoin/filesystem/empty_temp_dir_spec.rb
|
332
|
+
- ./spec/bitcoin/rspec/argument_matchers/block_evaluating_to_matcher_spec.rb
|