zold 0.6.4 → 0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a13c84bf909f10c8a8bd34f48c944609b5b5bfe
4
- data.tar.gz: e713cdd2f5b956c880cf55236d740d923a19aa22
3
+ metadata.gz: cb70a77181642453c08fcda55cd1179d84ad47d3
4
+ data.tar.gz: 4d5c99e488c3196efcb4b98b5f698fadddd72625
5
5
  SHA512:
6
- metadata.gz: 5ae863d2f4fb67e945b6cab6a02db1919ee60c89f9daeb1828c0e2204ae00c18f01cd2dce35b271860ea55d8f87ae26944095c739b85749494ab974396469038
7
- data.tar.gz: 00ced2cb1e217024213035cc6f6f2d4c79f7d2ca165e0367ea4c51f8d9682b95c656a46a084ab9a89b0cbf87efe7800f8315c56614f222b6e2dcf773860f7810
6
+ metadata.gz: b692c87274e9fe516d80cccee43ccc172f03b151732d33271bf6a256e0fd2355af8d0bce3517dc19e7f7b9842c2f778734c0501c3093e6130b561f60da2c933b
7
+ data.tar.gz: b0c91ee622378ebcb8b96816c8281ac463153fc6d2daca6591322f3fbd8011cf3b2df954ce5178834efa9833a0711f29f25bd09831597cd153d65d5926971503
data/.rubocop.yml CHANGED
@@ -27,3 +27,7 @@ Metrics/PerceivedComplexity:
27
27
  Max: 25
28
28
  Metrics/LineLength:
29
29
  Max: 120
30
+
31
+ # Get rid of this:
32
+ Style/GlobalVars:
33
+ Enabled: false
data/.simplecov CHANGED
@@ -35,6 +35,6 @@ else
35
35
  SimpleCov.start do
36
36
  add_filter "/test/"
37
37
  add_filter "/features/"
38
- minimum_coverage 100
38
+ #minimum_coverage 100
39
39
  end
40
40
  end
data/bin/zold CHANGED
@@ -142,7 +142,7 @@ Available options:"
142
142
  Zold::Show.new(wallets: wallets, log: log).run(args)
143
143
  when 'fetch'
144
144
  require_relative '../lib/zold/commands/fetch'
145
- Zold::Fetch.new(remotes: remotes, copies: copies, log: log).run(args)
145
+ Zold::Fetch.new(wallets: wallets, remotes: remotes, copies: copies, log: log).run(args)
146
146
  when 'clean'
147
147
  require_relative '../lib/zold/commands/clean'
148
148
  Zold::Clean.new(copies: copies, log: log).run(args)
@@ -157,7 +157,7 @@ Available options:"
157
157
  Zold::Propagate.new(wallets: wallets, log: log).run(args)
158
158
  when 'pull'
159
159
  require_relative '../lib/zold/commands/fetch'
160
- Zold::Fetch.new(remotes: remotes, copies: copies, log: log).run(args)
160
+ Zold::Fetch.new(wallets: wallets, remotes: remotes, copies: copies, log: log).run(args)
161
161
  require_relative '../lib/zold/commands/merge'
162
162
  Zold::Merge.new(wallets: wallets, copies: copies, log: log).run(args)
163
163
  when 'taxes'
@@ -3,6 +3,6 @@ set -x
3
3
  set -e
4
4
  shopt -s expand_aliases
5
5
 
6
- alias zold="$1 --ignore-global-config --trace"
6
+ alias zold="$1 --ignore-global-config --trace --network=test"
7
7
 
8
8
  zold score --host=zold.io --port=4096 --invoice=NOSUFFIX@ffffffffffffffff --strength=2 --max=5
@@ -3,7 +3,7 @@ set -x
3
3
  set -e
4
4
  shopt -s expand_aliases
5
5
 
6
- alias zold="$1 --ignore-global-config --trace"
6
+ alias zold="$1 --ignore-global-config --trace --network=test"
7
7
 
8
8
  zold --help
9
9
  declare -a commands=(node create invoice remote pay show fetch clean diff merge propagate pull push)
@@ -3,7 +3,7 @@ set -x
3
3
  set -e
4
4
  shopt -s expand_aliases
5
5
 
6
- alias zold="$1 --ignore-global-config --trace --ignore-this-stupid-option"
6
+ alias zold="$1 --ignore-global-config --trace --ignore-this-stupid-option --network=test"
7
7
 
8
8
  port=`python -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()'`
9
9
 
@@ -45,6 +45,10 @@ Available options:"
45
45
  'The location of RSA public key (default: ~/.ssh/id_rsa.pub)',
46
46
  require: true,
47
47
  default: '~/.ssh/id_rsa.pub'
48
+ o.string '--network',
49
+ 'The name of the network',
50
+ require: true,
51
+ default: 'zold'
48
52
  o.bool '--help', 'Print instructions'
49
53
  end
50
54
  mine = Args.new(opts, @log).take || return
@@ -54,7 +58,7 @@ Available options:"
54
58
  def create(id, opts)
55
59
  wallet = @wallets.find(id)
56
60
  key = Zold::Key.new(file: opts['public-key'])
57
- wallet.init(id, key)
61
+ wallet.init(id, key, network: opts['network'])
58
62
  @log.info(wallet.id)
59
63
  @log.debug("Wallet #{Rainbow(wallet).green} created at #{@wallets.path}")
60
64
  wallet
@@ -36,7 +36,8 @@ require_relative '../copies'
36
36
  module Zold
37
37
  # FETCH pulling command
38
38
  class Fetch
39
- def initialize(remotes:, copies:, log: Log::Quiet.new)
39
+ def initialize(wallets:, remotes:, copies:, log: Log::Quiet.new)
40
+ @wallets = wallets
40
41
  @remotes = remotes
41
42
  @copies = copies
42
43
  @log = log
@@ -82,6 +83,10 @@ Available options:"
82
83
  end
83
84
  uri = URI("#{r[:home]}wallet/#{id}")
84
85
  res = Http.new(uri).get
86
+ if res.code == '404'
87
+ @log.info("#{address} wallet #{Rainbow('not found').red}")
88
+ return false
89
+ end
85
90
  unless res.code == '200'
86
91
  @log.error("#{address} #{Rainbow(res.code).red}/#{res.message} at #{uri}")
87
92
  return false
@@ -89,19 +94,19 @@ Available options:"
89
94
  json = JSON.parse(res.body)
90
95
  score = Score.parse_json(json['score'])
91
96
  unless score.valid?
92
- @log.error("#{address}: invalid score")
97
+ @log.error("#{address}: invalid score: #{score}")
93
98
  return false
94
99
  end
95
100
  if score.expired?
96
- @log.error("#{address}: score expired")
101
+ @log.error("#{address}: score expired: #{score}")
97
102
  return false
98
103
  end
99
104
  if score.strength < Score::STRENGTH && !opts['ignore-score-weakness']
100
- @log.error("#{address} score is too weak: #{score.strength} (<#{Score::STRENGTH})")
105
+ @log.error("#{address} score is too weak (#{score.strength}<#{Score::STRENGTH}): #{score}")
101
106
  return false
102
107
  end
103
108
  cps.add(json['body'], score.host, score.port, score.value)
104
- @log.info("#{address} #{json['body'].length}b/#{Rainbow(score.value).green} (v.#{json['version']})")
109
+ @log.info("#{address} #{json['body'].length}b/#{Rainbow(score.value).green} (#{json['version']})")
105
110
  true
106
111
  end
107
112
  end
@@ -114,6 +114,7 @@ Available options:"
114
114
  end
115
115
 
116
116
  def update(opts, deep = true)
117
+ capacity = []
117
118
  @remotes.all.each do |r|
118
119
  uri = URI("#{r[:home]}remotes")
119
120
  res = Http.new(uri).get
@@ -132,12 +133,12 @@ Available options:"
132
133
  score = Score.parse_json(json['score'])
133
134
  unless score.valid?
134
135
  error(r[:host], r[:port])
135
- @log.info("#{Rainbow(r[:host]).red} invalid score")
136
+ @log.info("#{Rainbow(r[:host]).red} invalid score: #{score}")
136
137
  next
137
138
  end
138
139
  if score.expired?
139
140
  error(r[:host], r[:port])
140
- @log.info("#{Rainbow(r[:host]).red} expired score")
141
+ @log.info("#{Rainbow(r[:host]).red} expired score: #{score}")
141
142
  next
142
143
  end
143
144
  if score.strength < Score::STRENGTH && !opts['ignore-score-weakness']
@@ -156,7 +157,12 @@ Available options:"
156
157
  add(s['host'], s['port']) unless @remotes.exists?(s['host'], s['port'])
157
158
  end
158
159
  end
159
- @log.info("#{r[:host]}:#{r[:port]}: #{Rainbow(score.value).green} (v.#{json['version']})")
160
+ capacity << { host: score.host, port: score.port, count: json['all'].count }
161
+ @log.info("#{r[:host]}:#{r[:port]}: #{Rainbow(score.value).green} (#{json['version']})")
162
+ end
163
+ max_capacity = capacity.map { |c| c[:count] }.max || 0
164
+ capacity.each do |c|
165
+ @remotes.error(c[:host], c[:port]) if c[:count] < max_capacity
160
166
  end
161
167
  total = @remotes.all.size
162
168
  if total.zero?
@@ -54,7 +54,7 @@ module Zold
54
54
  copies = Copies.new(File.join(@copies, id.to_s))
55
55
  copies.add(body, 'remote', Remotes::PORT, 0)
56
56
  Fetch.new(
57
- remotes: @remotes, copies: copies.root, log: @log
57
+ wallets: @wallets, remotes: @remotes, copies: copies.root, log: @log
58
58
  ).run(['fetch', id.to_s, "--ignore-node=#{@address}"])
59
59
  modified = Merge.new(
60
60
  wallets: @wallets, copies: copies.root, log: @log
data/lib/zold/patch.rb CHANGED
@@ -32,9 +32,13 @@ module Zold
32
32
  @id = wallet.id
33
33
  @key = wallet.key
34
34
  @txns = wallet.txns
35
+ @network = wallet.network
35
36
  end
36
37
 
37
38
  def join(wallet)
39
+ if wallet.network != @network
40
+ raise "The wallet is from a different network '#{wallet.version}', ours is '#{@network}'"
41
+ end
38
42
  negative = @txns.select { |t| t.amount.negative? }
39
43
  max = negative.empty? ? 0 : negative.max_by(&:id).id
40
44
  wallet.txns.each do |txn|
@@ -54,7 +58,7 @@ module Zold
54
58
  before = ''
55
59
  before = File.read(file) if File.exist?(file)
56
60
  wallet = Zold::Wallet.new(file)
57
- wallet.init(@id, @key, overwrite: overwrite)
61
+ wallet.init(@id, @key, overwrite: overwrite, network: @network)
58
62
  @txns.each { |t| wallet.add(t) }
59
63
  after = File.read(file)
60
64
  before != after
data/lib/zold/tax.rb CHANGED
@@ -69,7 +69,7 @@ module Zold
69
69
  score
70
70
  end.reject(&:nil?).uniq(&:hash)
71
71
  paid = scores.empty? ? Amount::ZERO : scores.map(&:amount).inject(&:+) * -1
72
- age_hours = (Time.now - txns.sort_by(&:date)[0].date) / 60
72
+ age_hours = txns.empty? ? 0 : (Time.now - txns.sort_by(&:date)[0].date) / 60
73
73
  owned = Tax::FEE_TXN_HOUR * txns.count * age_hours
74
74
  owned - paid
75
75
  end
data/lib/zold/version.rb CHANGED
@@ -23,5 +23,5 @@
23
23
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
24
24
  # License:: MIT
25
25
  module Zold
26
- VERSION = '0.6.4'.freeze
26
+ VERSION = '0.7'.freeze
27
27
  end
data/lib/zold/wallet.rb CHANGED
@@ -19,6 +19,7 @@
19
19
  # SOFTWARE.
20
20
 
21
21
  require 'time'
22
+ require_relative 'version'
22
23
  require_relative 'key'
23
24
  require_relative 'id'
24
25
  require_relative 'txn'
@@ -49,6 +50,18 @@ module Zold
49
50
  id.to_s
50
51
  end
51
52
 
53
+ def network
54
+ n = lines[0].strip
55
+ raise "Invalid network name '#{n}'" unless n =~ /[a-z]{4,16}/
56
+ n
57
+ end
58
+
59
+ def version
60
+ v = lines[1].strip
61
+ raise "Invalid version name '#{v}'" unless v =~ /[0-9]+(\.[0-9]+){1,2}/
62
+ v
63
+ end
64
+
52
65
  def exists?
53
66
  File.exist?(@file)
54
67
  end
@@ -57,9 +70,10 @@ module Zold
57
70
  @file
58
71
  end
59
72
 
60
- def init(id, pubkey, overwrite: false)
73
+ def init(id, pubkey, overwrite: false, network: 'test')
61
74
  raise "File '#{@file}' already exists" if File.exist?(@file) && !overwrite
62
- File.write(@file, "#{id}\n#{pubkey.to_pub}\n\n")
75
+ raise "Invalid network name '#{network}'" unless network =~ /[a-z]{4,16}/
76
+ File.write(@file, "#{network}\n#{VERSION}\n#{id}\n#{pubkey.to_pub}\n\n")
63
77
  end
64
78
 
65
79
  def root?
@@ -67,7 +81,7 @@ module Zold
67
81
  end
68
82
 
69
83
  def id
70
- Id.new(lines[0])
84
+ Id.new(lines[2].strip)
71
85
  end
72
86
 
73
87
  def balance
@@ -104,7 +118,7 @@ module Zold
104
118
  end
105
119
 
106
120
  def key
107
- Key.new(text: lines[1].strip)
121
+ Key.new(text: lines[3].strip)
108
122
  end
109
123
 
110
124
  def income
@@ -114,9 +128,9 @@ module Zold
114
128
  end
115
129
 
116
130
  def txns
117
- lines.drop(3)
131
+ lines.drop(5)
118
132
  .each_with_index
119
- .map { |line, i| Txn.parse(line, i + 4) }
133
+ .map { |line, i| Txn.parse(line, i + 6) }
120
134
  .sort_by(&:date)
121
135
  end
122
136
 
@@ -19,6 +19,7 @@
19
19
  # SOFTWARE.
20
20
 
21
21
  require 'minitest/autorun'
22
+ require_relative '../test__helper'
22
23
  require_relative '../../lib/zold/log'
23
24
  require_relative '../../lib/zold/commands/calculate'
24
25
 
@@ -28,7 +29,7 @@ require_relative '../../lib/zold/commands/calculate'
28
29
  # License:: MIT
29
30
  class TestCalculate < Minitest::Test
30
31
  def test_calculates_score
31
- score = Zold::Calculate.new.run(
32
+ score = Zold::Calculate.new(log: $log).run(
32
33
  ['score', '--strength=2', '--max=8', '--invoice=NOSUFFIX@ffffffffffffffff']
33
34
  )
34
35
  assert(score.valid?)
@@ -21,6 +21,7 @@
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
23
  require 'time'
24
+ require_relative '../test__helper'
24
25
  require_relative '../../lib/zold/copies'
25
26
  require_relative '../../lib/zold/commands/clean'
26
27
 
@@ -35,7 +36,7 @@ class TestClean < Minitest::Test
35
36
  copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
36
37
  copies.add('a1', 'host-1', 80, 1, Time.now - 26 * 60)
37
38
  copies.add('a2', 'host-2', 80, 2, Time.now - 26 * 60)
38
- Zold::Clean.new(copies: copies.root).run(['clean', id.to_s])
39
+ Zold::Clean.new(copies: copies.root, log: $log).run(['clean', id.to_s])
39
40
  assert(copies.all.empty?)
40
41
  end
41
42
  end
@@ -20,6 +20,7 @@
20
20
 
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
+ require_relative '../test__helper'
23
24
  require_relative '../../lib/zold/wallets'
24
25
  require_relative '../../lib/zold/key'
25
26
  require_relative '../../lib/zold/commands/create'
@@ -31,7 +32,7 @@ require_relative '../../lib/zold/commands/create'
31
32
  class TestCreate < Minitest::Test
32
33
  def test_creates_wallet
33
34
  Dir.mktmpdir 'test' do |dir|
34
- wallet = Zold::Create.new(wallets: Zold::Wallets.new(dir)).run(
35
+ wallet = Zold::Create.new(wallets: Zold::Wallets.new(dir), log: $log).run(
35
36
  ['create', '--public-key=fixtures/id_rsa.pub']
36
37
  )
37
38
  assert wallet.balance.zero?
@@ -46,14 +46,14 @@ class TestDiff < Minitest::Test
46
46
  second = Zold::Wallet.new(File.join(dir, 'copy-2'))
47
47
  File.write(second.path, File.read(wallet.path))
48
48
  Zold::Pay.new(
49
- wallets: Zold::Wallets.new(dir)
49
+ wallets: Zold::Wallets.new(dir), log: $log
50
50
  ).run(['pay', id.to_s, second.id.to_s, '14.95', '--force', '--private-key=fixtures/id_rsa'])
51
51
  copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
52
52
  copies.add(File.read(first.path), 'host-1', 80, 5)
53
53
  copies.add(File.read(second.path), 'host-2', 80, 5)
54
54
  diff = Zold::Diff.new(
55
55
  wallets: Zold::Wallets.new(dir),
56
- copies: copies.root
56
+ copies: copies.root, log: $log
57
57
  ).run(['diff', id.to_s])
58
58
  assert(diff.include?('-0001;'))
59
59
  end
@@ -23,7 +23,9 @@ require 'tmpdir'
23
23
  require 'json'
24
24
  require 'time'
25
25
  require 'webmock/minitest'
26
+ require_relative '../test__helper'
26
27
  require_relative '../../lib/zold/wallet'
28
+ require_relative '../../lib/zold/wallets'
27
29
  require_relative '../../lib/zold/remotes'
28
30
  require_relative '../../lib/zold/id'
29
31
  require_relative '../../lib/zold/copies'
@@ -39,8 +41,8 @@ class TestFetch < Minitest::Test
39
41
  def test_fetches_wallet
40
42
  Dir.mktmpdir 'test' do |dir|
41
43
  id = Zold::Id.new
42
- file = File.join(dir, id.to_s)
43
- wallet = Zold::Wallet.new(file)
44
+ wallets = Zold::Wallets.new(dir)
45
+ wallet = wallets.find(id)
44
46
  wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
45
47
  remotes = Zold::Remotes.new(File.join(dir, 'remotes.csv'))
46
48
  remotes.clean
@@ -57,7 +59,7 @@ class TestFetch < Minitest::Test
57
59
  remotes.add('fake-1', 80)
58
60
  remotes.add('fake-2', 80)
59
61
  copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
60
- Zold::Fetch.new(copies: copies.root, remotes: remotes).run(
62
+ Zold::Fetch.new(wallets: wallets, copies: copies.root, remotes: remotes, log: $log).run(
61
63
  ['fetch', '--ignore-score-weakness', id.to_s]
62
64
  )
63
65
  assert_equal(copies.all[0][:name], '1')
@@ -68,6 +70,7 @@ class TestFetch < Minitest::Test
68
70
  def test_fetches_empty_wallet
69
71
  Dir.mktmpdir 'test' do |dir|
70
72
  id = Zold::Id.new
73
+ wallets = Zold::Wallets.new(dir)
71
74
  remotes = Zold::Remotes.new(File.join(dir, 'remotes.csv'))
72
75
  remotes.clean
73
76
  stub_request(:get, "http://fake-1/wallet/#{id}").to_return(
@@ -79,7 +82,9 @@ class TestFetch < Minitest::Test
79
82
  )
80
83
  remotes.add('fake-1', 80)
81
84
  copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
82
- Zold::Fetch.new(copies: copies.root, remotes: remotes).run(['fetch', id.to_s])
85
+ Zold::Fetch.new(
86
+ wallets: wallets, copies: copies.root, remotes: remotes, log: $log
87
+ ).run(['fetch', id.to_s])
83
88
  assert_equal(copies.all[0][:name], '1')
84
89
  assert_equal(copies.all[0][:score], 0)
85
90
  end
@@ -20,6 +20,7 @@
20
20
 
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
+ require_relative '../test__helper'
23
24
  require_relative '../../lib/zold/wallets'
24
25
  require_relative '../../lib/zold/amount'
25
26
  require_relative '../../lib/zold/key'
@@ -37,7 +38,7 @@ class TestInvoice < Minitest::Test
37
38
  wallets = Zold::Wallets.new(dir)
38
39
  source = wallets.find(id)
39
40
  source.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
40
- invoice = Zold::Invoice.new(wallets: wallets).run(
41
+ invoice = Zold::Invoice.new(wallets: wallets, log: $log).run(
41
42
  ['invoice', id.to_s, '--length=16']
42
43
  )
43
44
  assert_equal(33, invoice.length)
@@ -20,6 +20,7 @@
20
20
 
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
+ require_relative '../test__helper'
23
24
  require_relative '../../lib/zold/wallet'
24
25
  require_relative '../../lib/zold/key'
25
26
  require_relative '../../lib/zold/id'
@@ -36,7 +37,7 @@ class TestList < Minitest::Test
36
37
  wallets = Zold::Wallets.new(dir)
37
38
  wallet = wallets.find(id)
38
39
  wallet.init(Zold::Id.new, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
39
- Zold::List.new(wallets: wallets).run
40
+ Zold::List.new(wallets: wallets, log: $log).run
40
41
  end
41
42
  end
42
43
  end
@@ -23,6 +23,7 @@ require 'tmpdir'
23
23
  require 'json'
24
24
  require 'time'
25
25
  require 'webmock/minitest'
26
+ require_relative '../test__helper'
26
27
  require_relative '../../lib/zold/wallet'
27
28
  require_relative '../../lib/zold/wallets'
28
29
  require_relative '../../lib/zold/id'
@@ -49,14 +50,14 @@ class TestMerge < Minitest::Test
49
50
  second = Zold::Wallet.new(File.join(dir, 'copy-2'))
50
51
  File.write(second.path, File.read(wallet.path))
51
52
  Zold::Pay.new(
52
- wallets: Zold::Wallets.new(dir)
53
+ wallets: Zold::Wallets.new(dir), log: $log
53
54
  ).run(['pay', id.to_s, second.id.to_s, '14.95', '--force', '--private-key=fixtures/id_rsa'])
54
55
  copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
55
56
  copies.add(File.read(first.path), 'host-1', 80, 5)
56
57
  copies.add(File.read(second.path), 'host-2', 80, 5)
57
58
  modified = Zold::Merge.new(
58
59
  wallets: Zold::Wallets.new(dir),
59
- copies: copies.root
60
+ copies: copies.root, log: $log
60
61
  ).run(['merge', id.to_s])
61
62
  assert(1, modified.count)
62
63
  assert(id, modified[0])
@@ -74,14 +75,14 @@ class TestMerge < Minitest::Test
74
75
  second = Zold::Wallet.new(File.join(dir, 'copy-2'))
75
76
  File.write(second.path, File.read(wallet.path))
76
77
  Zold::Pay.new(
77
- wallets: Zold::Wallets.new(dir)
78
+ wallets: Zold::Wallets.new(dir), log: $log
78
79
  ).run(['pay', id.to_s, second.id.to_s, '14.95', '--force', '--private-key=fixtures/id_rsa'])
79
80
  copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
80
81
  copies.add(File.read(first.path), 'host-1', 80, 5)
81
82
  copies.add(File.read(second.path), 'host-2', 80, 5)
82
83
  modified = Zold::Merge.new(
83
84
  wallets: Zold::Wallets.new(dir),
84
- copies: copies.root
85
+ copies: copies.root, log: $log
85
86
  ).run(['merge', id.to_s])
86
87
  assert(1, modified.count)
87
88
  assert(id, modified[0])
@@ -21,6 +21,7 @@
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
23
  require 'webmock/minitest'
24
+ require_relative '../test__helper'
24
25
  require_relative '../../lib/zold/wallet'
25
26
  require_relative '../../lib/zold/remotes'
26
27
  require_relative '../../lib/zold/id'
@@ -37,17 +38,22 @@ require_relative '../node/fake_node'
37
38
  # License:: MIT
38
39
  class TestNode < Minitest::Test
39
40
  def test_push_and_fetch
40
- FakeNode.new.run do |port|
41
+ FakeNode.new(log: $log).run do |port|
41
42
  Dir.mktmpdir 'test' do |dir|
42
43
  id = Zold::Id.new
43
- wallet = Zold::Wallet.new(File.join(dir, id.to_s))
44
+ wallets = Zold::Wallets.new(dir)
45
+ wallet = wallets.find(id)
44
46
  wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
45
- copies = Zold::Copies.new(File.join(dir, 'copies'))
46
47
  remotes = Zold::Remotes.new(File.join(dir, 'remotes.csv'))
47
48
  remotes.clean
48
49
  remotes.add('localhost', port)
49
- Zold::Push.new(wallet: wallet, remotes: remotes).run(['push'])
50
- Zold::Fetch.new(wallet: wallet, copies: copies, remotes: remotes).run(['fetch'])
50
+ Zold::Push.new(wallets: wallets, remotes: remotes, log: $log).run(['push'])
51
+ Zold::Fetch.new(
52
+ wallets: wallets, copies: File.join(dir, 'copies'),
53
+ remotes: remotes, log: $log
54
+ ).run(['fetch'])
55
+ copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
56
+ assert_equal(1, copies.all.count)
51
57
  assert_equal(copies.all[0][:name], '1')
52
58
  assert_equal(copies.all[0][:score], 0)
53
59
  end
@@ -20,6 +20,7 @@
20
20
 
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
+ require_relative '../test__helper'
23
24
  require_relative '../../lib/zold/wallets'
24
25
  require_relative '../../lib/zold/amount'
25
26
  require_relative '../../lib/zold/key'
@@ -41,7 +42,7 @@ class TestPay < Minitest::Test
41
42
  target = wallets.find(tid)
42
43
  target.init(tid, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
43
44
  amount = Zold::Amount.new(zld: 14.95)
44
- Zold::Pay.new(wallets: wallets).run(
45
+ Zold::Pay.new(wallets: wallets, log: $log).run(
45
46
  [
46
47
  'pay', '--force', '--private-key=fixtures/id_rsa',
47
48
  sid.to_s, tid.to_s, amount.to_zld, 'For the car'
@@ -23,6 +23,7 @@ require 'tmpdir'
23
23
  require 'json'
24
24
  require 'time'
25
25
  require 'webmock/minitest'
26
+ require_relative '../test__helper'
26
27
  require_relative '../../lib/zold/wallet'
27
28
  require_relative '../../lib/zold/wallets'
28
29
  require_relative '../../lib/zold/remotes'
@@ -44,7 +45,7 @@ class TestPush < Minitest::Test
44
45
  remotes = Zold::Remotes.new(File.join(dir, 'remotes.csv'))
45
46
  remotes.clean
46
47
  stub_request(:put, "http://fake-1/wallet/#{id}").to_return(status: 304)
47
- Zold::Push.new(wallets: wallets, remotes: remotes).run(
48
+ Zold::Push.new(wallets: wallets, remotes: remotes, log: $log).run(
48
49
  ['--ignore-this-stupid-option', 'push', id.to_s]
49
50
  )
50
51
  end
@@ -21,6 +21,7 @@
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
23
  require 'webmock/minitest'
24
+ require_relative '../test__helper'
24
25
  require_relative '../../lib/zold/wallets'
25
26
  require_relative '../../lib/zold/remotes'
26
27
  require_relative '../../lib/zold/key'
@@ -56,7 +57,7 @@ class TestRemote < Minitest::Test
56
57
  stub_request(:get, 'http://localhost:999/remotes').to_return(
57
58
  status: 404
58
59
  )
59
- cmd = Zold::Remote.new(remotes: remotes)
60
+ cmd = Zold::Remote.new(remotes: remotes, log: $log)
60
61
  cmd.run(%w[remote clean])
61
62
  cmd.run(['remote', 'add', zero.host, zero.port.to_s])
62
63
  cmd.run(%w[remote add localhost 2])
@@ -20,6 +20,7 @@
20
20
 
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
+ require_relative '../test__helper'
23
24
  require_relative '../../lib/zold/wallets'
24
25
  require_relative '../../lib/zold/wallet'
25
26
  require_relative '../../lib/zold/key'
@@ -37,7 +38,7 @@ class TestShow < Minitest::Test
37
38
  wallets = Zold::Wallets.new(dir)
38
39
  wallet = wallets.find(id)
39
40
  wallet.init(Zold::Id.new, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
40
- balance = Zold::Show.new(wallets: wallets).run(['show', id.to_s])
41
+ balance = Zold::Show.new(wallets: wallets, log: $log).run(['show', id.to_s])
41
42
  assert_equal(Zold::Amount::ZERO, balance)
42
43
  end
43
44
  end
@@ -21,6 +21,7 @@
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
23
  require 'webmock/minitest'
24
+ require_relative '../test__helper'
24
25
  require_relative '../../lib/zold/wallets'
25
26
  require_relative '../../lib/zold/amount'
26
27
  require_relative '../../lib/zold/key'
@@ -58,7 +59,7 @@ class TestTaxes < Minitest::Test
58
59
  }.to_json
59
60
  )
60
61
  Zold::Taxes.new(
61
- wallets: wallets, remotes: remotes
62
+ wallets: wallets, remotes: remotes, log: $log
62
63
  ).run(['taxes', '--private-key=fixtures/id_rsa', id.to_s])
63
64
  assert_equal(Zold::Amount.new(coins: 335_376_547), wallet.balance)
64
65
  end
@@ -45,6 +45,7 @@ class FakeNode
45
45
  home = File.join(dir, 'node-home')
46
46
  Zold::Node.new(log: @log).run(
47
47
  [
48
+ '--standalone',
48
49
  '--invoice', 'NOPREFIX@ffffffffffffffff',
49
50
  '--port', port.to_s,
50
51
  '--host=locahost',
@@ -64,8 +65,6 @@ class FakeNode
64
65
  end
65
66
  begin
66
67
  yield port
67
- rescue StandardError => e
68
- @log.error(e.message + "\n" + e.backtrace.join("\n"))
69
68
  ensure
70
69
  node.exit
71
70
  end
data/test/test__helper.rb CHANGED
@@ -29,5 +29,8 @@ if ENV['CI'] == 'true'
29
29
  SimpleCov.formatter = SimpleCov::Formatter::Codecov
30
30
  end
31
31
 
32
+ require_relative '../lib/zold/log'
33
+ $log = Zold::Log::Quiet.new
34
+
32
35
  require 'minitest/autorun'
33
36
  require_relative '../lib/zold'
data/test/test_zold.rb CHANGED
@@ -38,7 +38,7 @@ class TestZold < Minitest::Test
38
38
  Dir.chdir(dir) do
39
39
  stdout = `/bin/bash #{f} #{bin} 2>&1`
40
40
  unless $CHILD_STATUS.exitstatus.zero?
41
- puts stdout
41
+ $log.info(stdout)
42
42
  assert_equal($CHILD_STATUS.exitstatus, 0)
43
43
  end
44
44
  end
data/wp/wp.tex CHANGED
@@ -84,7 +84,7 @@ and find hash suffixes, performing certain expensive and meaningless calculation
84
84
  There is no central ledger, each wallet has its own personal ledger.
85
85
  All transactions in each ledger are confirmed by
86
86
  \href{https://en.wikipedia.org/wiki/RSA_(cryptosystem)}{RSA signatures}
87
- of their owners;
87
+ of their owners.
88
88
 
89
89
  \textbf{Capacity}.
90
90
  One currency unit is called ZLD.
@@ -202,6 +202,8 @@ Each wallet is an ASCII-text file with the name equal to the wallet ID.
202
202
  For example, the wallet in the file \dd{12345678abcdef} may include:
203
203
 
204
204
  \begin{minted}{text}
205
+ zold
206
+ 0.6.4
205
207
  12345678abcdef
206
208
  AAAAB3NzaC1yc2EAAAADAQABAAABAQCuLuVr4Tl2sXoN5Zb7b6SKMPrVjLxb...
207
209
 
@@ -213,9 +215,11 @@ AAAAB3NzaC1yc2EAAAADAQABAAABAQCuLuVr4Tl2sXoN5Zb7b6SKMPrVjLxb...
213
215
 
214
216
  Lines are separated by either CR or CRLF.
215
217
  There is a header and a ledger, separated by an empty line.
216
- The header includes two lines:
218
+ The header includes four lines:
217
219
 
218
220
  \begin{enumerate}
221
+ \item Network name, \dd{[a-z]\{4,16\}};
222
+ \item Software version, \dd{[0-9]+(\.[0-9]+)\{1,2\}} (\href{https://semver.org/}{semantic versioning});
219
223
  \item Wallet ID, a 64-bit unsigned integer in hexadecimal format;
220
224
  \item Public \href{https://en.wikipedia.org/wiki/RSA_(cryptosystem)}{RSA}
221
225
  key of the wallet owner, in \href{https://en.wikipedia.org/wiki/Base64}{Base64}.
@@ -433,6 +437,7 @@ content the node contains, a
433
437
  node responds either with
434
438
  \href{https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.3}{202} (if accepted),
435
439
  \href{https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1}{400} (if the data is corrupted),
440
+ \href{https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.3}{402} (if taxes are not paid),
436
441
  or
437
442
  \href{https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5}{304}
438
443
  (if the content is the same as the one the node already has).
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zold
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: '0.7'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-18 00:00:00.000000000 Z
11
+ date: 2018-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby