vanitygen-wrapper 0.0.1 → 0.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 413a2d4a3858258fe5778cc45e10b2719e56d662
4
- data.tar.gz: 6db5b7f020f2a48d2f5486444a154d1e323cbc77
3
+ metadata.gz: 7acb4fcb9c91d2780d7fd860a8fc77fc029e059b
4
+ data.tar.gz: 946aad92bb08fac89a0129d2303c30625c61e832
5
5
  SHA512:
6
- metadata.gz: a7715ee966b9a2821844df51b9df2eb85a5c063b6d79363e6759a167580215ee21635e3b018fb91c7f5c1e1bea79eafba0faf251971ac499c7eb7707b3e07f4c
7
- data.tar.gz: 32dd98358eabe88a4e847c1426389b684f2f9234da83bf8d452c5245b908e1ac6694e367a6b3b550023e9de37c9ee2c60fc2e916dbf666bf10e0751a23025572
6
+ metadata.gz: 7fe174885c90d8653dbfca10fa42cc8fa55b01f22e19222f88aff97e8d1d9ea2ca0283a67fcef7cee7288fd0b3b6d770e753eb97cf958d4133efd3d50ef05e27
7
+ data.tar.gz: 861a9d35b6be688a67e4d4426c998b068578287b20fb7962fa312dabf48b31ac1f07142c97fcd80e7bb633648e679db73b1f0bc73af65d72c7e5927a97c26c02
data/CHANGELOG.md ADDED
@@ -0,0 +1,13 @@
1
+ 0.0.1 - 2014-12-02
2
+ =====
3
+ Mostly feature complete:
4
+ * Vanitygen.network
5
+ * Vanitygen.valid?
6
+ * Vanitygen.difficulty
7
+ * Vanitygen.generate
8
+ * Vanitygen.continuous
9
+
10
+ Options supported:
11
+ * case_insensitive
12
+ * regex patterns
13
+ * that's about it...
data/README.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  Thin ruby wrapper around vanitygen executable. Sibling project of <https://github.com/bitvain/vanitygen-ruby>.
4
4
 
5
+ ## Warning
6
+
7
+ Due to rampant use of pipes, signals, and subprocesses, this gem probably does
8
+ not work in JRuby or Windows.
9
+
10
+ This also cannot be effectively tested in CI due to depending on an external
11
+ executable.
12
+
13
+ Discretion is advised.
14
+
5
15
  ## Installation
6
16
 
7
17
  Download and install <https://github.com/samr7/vanitygen>
@@ -11,7 +21,7 @@ Make sure `vanitygen` is available in your `$PATH`.
11
21
  Add this line to your application's Gemfile:
12
22
 
13
23
  ```ruby
14
- gem 'vanitygen-wrapper', require 'vanitygen'
24
+ gem 'vanitygen-wrapper', require: 'vanitygen'
15
25
  ```
16
26
 
17
27
  And then execute:
data/lib/vanitygen.rb CHANGED
@@ -9,8 +9,15 @@ module Vanitygen
9
9
  NETWORKS = {
10
10
  bitcoin: nil,
11
11
  testnet3: '-T',
12
+ namecoin: '-N',
13
+ litecoin: '-L',
12
14
  }
13
15
 
16
+ attr_accessor :executable
17
+ def executable
18
+ @executable ||= 'vanitygen'
19
+ end
20
+
14
21
  def network
15
22
  @network ||= :bitcoin
16
23
  end
@@ -25,7 +32,7 @@ module Vanitygen
25
32
  flags = flags_from({simulate: true,
26
33
  patterns: [pattern]
27
34
  }.merge(options))
28
- pid = Process.spawn('vanitygen', *flags, out: '/dev/null', err: '/dev/null')
35
+ pid = Process.spawn(executable, *flags, out: '/dev/null', err: '/dev/null')
29
36
  pid, status = Process.wait2(pid)
30
37
  status == 0
31
38
  end
@@ -35,7 +42,7 @@ module Vanitygen
35
42
  patterns: [pattern]
36
43
  }.merge(options))
37
44
  msg = ''
38
- Open3.popen3('vanitygen', *flags) do |stdin, stdout, stderr, wait_thr|
45
+ Open3.popen3(executable, *flags) do |stdin, stdout, stderr, wait_thr|
39
46
  stdin.close
40
47
  stdout.close
41
48
  while !stderr.eof?
@@ -52,7 +59,7 @@ module Vanitygen
52
59
  }.merge(options))
53
60
 
54
61
  msg = ''
55
- Open3.popen3('vanitygen', *flags) do |stdin, stdout, stderr, wait_thr|
62
+ Open3.popen3(executable, *flags) do |stdin, stdout, stderr, wait_thr|
56
63
  stdin.close
57
64
  while !stdout.eof?
58
65
  msg << stdout.read
@@ -85,23 +92,16 @@ module Vanitygen
85
92
  patterns: patterns,
86
93
  }.merge(options))
87
94
 
88
- thread = Thread.new do
89
- # FIXME: ignore EOF instead of reopening
90
- loop do
91
- File.open(tmp_pipe, 'r') do |file|
92
- while !file.eof? and (msg = file.read)
93
- parse(msg).each do |data|
94
- block.call(data)
95
- end
96
- end
95
+ # Unfortunately, vanitygen spams stdout with progress
96
+ pid_vanitygen = Process.spawn(executable, *flags, out: '/dev/null', err: '/dev/null')
97
+ while child_alive?(pid_vanitygen)
98
+ File.open(tmp_pipe, 'r') do |file|
99
+ while !file.eof? and (msg = file.read)
100
+ parse(msg).each(&block)
97
101
  end
98
102
  end
99
103
  end
100
-
101
- pid_vanitygen = Process.spawn('vanitygen', *flags, out: '/dev/null', err: '/dev/null')
102
- Process.wait(pid_vanitygen)
103
104
  ensure
104
- thread && thread.kill
105
105
  if pid_vanitygen
106
106
  begin
107
107
  Process.kill('TERM', pid_vanitygen)
@@ -120,6 +120,15 @@ module Vanitygen
120
120
 
121
121
  private
122
122
 
123
+ def child_alive?(pid)
124
+ # Very unix like
125
+ # Unfortunately, not very ruby like :(
126
+ Process.kill(0, pid)
127
+ true
128
+ rescue Errno::ESRCH
129
+ false
130
+ end
131
+
123
132
  def flags_from(options)
124
133
  [].tap do |flags|
125
134
  patterns =
@@ -1,3 +1,3 @@
1
1
  module Vanitygen
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
@@ -0,0 +1,5 @@
1
+ require 'wrong/adapters/rspec'
2
+
3
+ RSpec.configure do |c|
4
+ c.include Wrong
5
+ end
@@ -1,7 +1,8 @@
1
+ require 'spec_helper'
2
+
1
3
  require 'vanitygen'
2
4
 
3
5
  require 'bitcoin'
4
- require 'devnull'
5
6
  require 'timeout'
6
7
 
7
8
  describe Vanitygen do
@@ -16,16 +17,16 @@ describe Vanitygen do
16
17
  subject { Vanitygen.generate(pattern_string_a) }
17
18
 
18
19
  it 'has valid address' do
19
- expect(subject[:address]).to satisfy { |addr| Bitcoin.valid_address?(addr) }
20
+ assert{ Bitcoin.valid_address?(subject[:address]) }
20
21
  end
21
22
 
22
23
  it 'has address starting with pattern' do
23
- expect(subject[:address]).to start_with(pattern_string_a)
24
+ assert{ subject[:address].start_with?(pattern_string_a) }
24
25
  end
25
26
 
26
27
  it 'has correct private_key to unlock pattern' do
27
28
  bkey = Bitcoin::Key.from_base58(subject[:private_key])
28
- expect(subject[:address]).to eq(bkey.addr)
29
+ assert{ subject[:address] == bkey.addr }
29
30
  end
30
31
  end
31
32
 
@@ -33,23 +34,25 @@ describe Vanitygen do
33
34
  subject { Vanitygen.generate(pattern_regex_ab) }
34
35
 
35
36
  it 'has valid address' do
36
- expect(subject[:address]).to satisfy { |addr| Bitcoin.valid_address?(addr) }
37
+ assert{ Bitcoin.valid_address?(subject[:address]) }
37
38
  end
38
39
 
39
40
  it 'has address matching pattern' do
40
- expect(subject[:address]).to match(pattern_regex_ab)
41
+ assert{ subject[:address] =~ pattern_regex_ab }
41
42
  end
42
43
  end
43
44
  end
44
45
 
45
46
  describe '.continuous' do
46
47
  it 'requires a block' do
47
- expect{Vanitygen.continuous([pattern_any])}.to raise_error(LocalJumpError)
48
+ error = rescuing{ Vanitygen.continuous([pattern_any]) }
49
+ assert{ error.is_a?(LocalJumpError) }
48
50
  end
49
51
 
50
52
  it 'requires same type' do
51
53
  noop = proc{}
52
- expect{Vanitygen.continuous([pattern_regex_ab, pattern_string_a], &noop)}.to raise_error(TypeError)
54
+ error = rescuing{ Vanitygen.continuous([pattern_regex_ab, pattern_string_a], &noop) }
55
+ assert{ error.is_a?(TypeError) }
53
56
  end
54
57
 
55
58
  context 'threaded with capture block' do
@@ -80,42 +83,39 @@ describe Vanitygen do
80
83
  end
81
84
 
82
85
  it 'runs a lot' do
83
- expect(captured.count).to be > 10
86
+ assert{ captured.count > 10 }
84
87
  end
85
88
 
86
89
  it 'returns valid addresses' do
87
- expect(captured).to all(satisfy { |addr| Bitcoin.valid_address?(addr) })
90
+ assert{ captured.all? { |addr| Bitcoin.valid_address?(addr) } }
88
91
  end
89
92
  end
90
93
 
91
94
  context 'with string' do
92
95
  it 'starts with matching pattern' do
93
96
  continuous_with_timeout([pattern_string_a], &capture(:address))
94
- expect(captured.size).to be > 1
95
- expect(captured).to all(start_with(pattern_string_a))
97
+ assert{ captured.size > 1 }
98
+ assert{ captured.all? { |addr| addr.start_with?(pattern_string_a) } }
96
99
  end
97
100
 
98
101
  it 'matches with case insensitivity' do
99
102
  continuous_with_timeout([pattern_string_ab], case_insensitive: true, &capture(:address))
100
103
  prefixes = captured.map { |addr| addr[0..2] }
101
- expect(prefixes.uniq.size).to be > 1
104
+ assert{ prefixes.uniq.size > 1 }
102
105
  end
103
106
 
104
107
  it 'matches multiple patterns' do
105
108
  continuous_with_timeout([pattern_string_a, pattern_string_b], &capture(:address))
106
- # should be
107
- # expect(captured).to any(addr.start_with?(pattern_string_a))
108
- # expect(captured).to any(addr.start_with?(pattern_string_b))
109
- expect(captured).to satisfy { |a| a.any? { |addr| addr.start_with?(pattern_string_a) } }
110
- expect(captured).to satisfy { |a| a.any? { |addr| addr.start_with?(pattern_string_b) } }
109
+ assert{ captured.any? { |addr| addr.start_with?(pattern_string_a) } }
110
+ assert{ captured.any? { |addr| addr.start_with?(pattern_string_b) } }
111
111
  end
112
112
  end
113
113
 
114
114
  context 'with regex' do
115
115
  it 'matches the regex' do
116
116
  continuous_with_timeout([pattern_regex_ab], &capture(:address))
117
- expect(captured.size).to be > 1
118
- expect(captured).to all(match(pattern_regex_ab))
117
+ assert{ captured.size > 1 }
118
+ assert{ captured.all? { |addr| addr =~ pattern_regex_ab } }
119
119
  end
120
120
  end
121
121
  end
@@ -123,28 +123,51 @@ describe Vanitygen do
123
123
 
124
124
  describe '.difficulty' do
125
125
  it 'returns difficulty in Numeric' do
126
- expect(Vanitygen.difficulty(pattern_string_a)).to be_a Numeric
126
+ assert{ Vanitygen.difficulty(pattern_string_a).is_a?(Numeric) }
127
127
  end
128
128
  end
129
129
 
130
130
  describe '.valid?' do
131
131
  it 'is true for starting with 1' do
132
- expect(Vanitygen.valid?('1abc')).to be(true)
132
+ assert{ Vanitygen.valid?('1abc') }
133
133
  end
134
134
 
135
135
  it 'is false for starting with something else' do
136
- expect(Vanitygen.valid?('abc')).to be(false)
136
+ assert{ not Vanitygen.valid?('abc') }
137
137
  end
138
138
 
139
139
  it 'is false for really long strings' do
140
- expect(Vanitygen.valid?('1abcdefghijklmnopqrstuvwxyz')).to be(false)
140
+ assert{ not Vanitygen.valid?('1abcdefghijklmnopqrstuvwxyz') }
141
141
  end
142
142
 
143
143
  it 'is false for illegal characters' do
144
- expect(Vanitygen.valid?('10')).to be(false)
145
- expect(Vanitygen.valid?('1O')).to be(false)
146
- expect(Vanitygen.valid?('1I')).to be(false)
147
- expect(Vanitygen.valid?('1l')).to be(false)
144
+ assert{ not Vanitygen.valid?('10') }
145
+ assert{ not Vanitygen.valid?('1O') }
146
+ assert{ not Vanitygen.valid?('1I') }
147
+ assert{ not Vanitygen.valid?('1l') }
148
+ end
149
+ end
150
+
151
+ describe '.network' do
152
+ it 'switches to :testnet3' do
153
+ assert{ not Vanitygen.valid?('mm') }
154
+ Vanitygen.network = :testnet3
155
+ assert{ Vanitygen.valid?('mm') }
156
+ end
157
+
158
+ it 'switches to "testnet3"' do
159
+ Vanitygen.network = 'testnet3'
160
+ assert{ Vanitygen.valid?('mm') }
161
+ end
162
+
163
+ it 'stays on :bitcoin' do
164
+ Vanitygen.network = :bitcoin
165
+ assert{ Vanitygen.valid?('1a') }
166
+ end
167
+
168
+ it 'dies for missing network' do
169
+ error = rescuing{ Vanitygen.network = :foobar }
170
+ assert{ error.message =~ /not supported/ }
148
171
  end
149
172
  end
150
173
  end
@@ -25,4 +25,5 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'ffi', '~> 1.9'
26
26
  spec.add_development_dependency 'rake', '~> 10.0'
27
27
  spec.add_development_dependency 'rspec', '~> 3.0'
28
+ spec.add_development_dependency 'wrong', '~> 0.7.1'
28
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vanitygen-wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Feng
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-02 00:00:00.000000000 Z
11
+ date: 2014-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mkfifo
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: wrong
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.7.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.7.1
97
111
  description: Thin ruby wrapper around vanitygen executable. Sibling project of <https://github.com/bitvain/vanitygen-ruby>.
98
112
  email:
99
113
  - contact@fengb.info
@@ -102,12 +116,14 @@ extensions: []
102
116
  extra_rdoc_files: []
103
117
  files:
104
118
  - ".gitignore"
119
+ - CHANGELOG.md
105
120
  - Gemfile
106
121
  - LICENSE.txt
107
122
  - README.md
108
123
  - Rakefile
109
124
  - lib/vanitygen.rb
110
125
  - lib/vanitygen/version.rb
126
+ - spec/spec_helper.rb
111
127
  - spec/vanitygen_spec.rb
112
128
  - vanitygen-wrapper.gemspec
113
129
  homepage: https://github.com/bitvain/vanitygen-wrapper
@@ -135,4 +151,5 @@ signing_key:
135
151
  specification_version: 4
136
152
  summary: Thin ruby wrapper around vanitygen executable
137
153
  test_files:
154
+ - spec/spec_helper.rb
138
155
  - spec/vanitygen_spec.rb