zold 0.8 → 0.9

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: 5ea54309f6fdd147d4338a76415d536e802ffa00
4
- data.tar.gz: 2cc82cfbe9c204480db65348cc551abad0817d92
3
+ metadata.gz: c679c519c561ea8522e9bddbf1607b376a27088f
4
+ data.tar.gz: acddc029d1978dd0ba26e8091d56a59a05a3b670
5
5
  SHA512:
6
- metadata.gz: 64bfd2b5f86befba60e4f976cef6e4e17d3233c5a8d7d48b214dc4e4bbe787afe351a4e783355baa63f844410d1ef923feac211d6186db45215512c79fc79c8e
7
- data.tar.gz: f648ceffd6b1b5c2d34fd88816cc77dc8705bf3382ae2b6a22397894fd3d1d010168736c38ce2e934196c20b50deabb41d507d6992b1c9531fc8e01a4374136a
6
+ metadata.gz: ba1472c49c84588d567e727e1dc364c474715cd9c6914e4f67e42a1addad4462efcd5e723362dddb2c20cf42027591ca15014d05ad9e838ce0a84816f92c49b6
7
+ data.tar.gz: c6ca405a5f4c99737b6b19836bb141c1b9d8604c355375c40493b2ff8c7d7c1f864e4dab8eb5bc326f6871157c1a73426287e00135ba6e8d48ad160e354df02c
data/.gitattributes CHANGED
@@ -6,3 +6,4 @@
6
6
  *.rb ident
7
7
  *.xml ident
8
8
  *.png binary
9
+ *.pdf binary
data/README.md CHANGED
@@ -5,21 +5,21 @@
5
5
  [![DevOps By Rultor.com](http://www.rultor.com/b/yegor256/Zold)](http://www.rultor.com/p/yegor256/Zold)
6
6
  [![We recommend RubyMine](http://www.elegantobjects.org/rubymine.svg)](https://www.jetbrains.com/ruby/)
7
7
 
8
- [![Build Status](https://travis-ci.org/zerocracy/zold.svg)](https://travis-ci.org/zerocracy/zold)
8
+ [![Build Status](https://travis-ci.org/yegor256/zold.svg)](https://travis-ci.org/yegor256/zold)
9
9
  [![Build status](https://ci.appveyor.com/api/projects/status/ypctxm5ohrtp2kr4?svg=true)](https://ci.appveyor.com/project/yegor256/zold)
10
- [![PDD status](http://www.0pdd.com/svg?name=zerocracy/zold)](http://www.0pdd.com/p?name=zerocracy/zold)
10
+ [![PDD status](http://www.0pdd.com/svg?name=yegor256/zold)](http://www.0pdd.com/p?name=yegor256/zold)
11
11
  [![Gem Version](https://badge.fury.io/rb/zold.svg)](http://badge.fury.io/rb/zold)
12
- [![Test Coverage](https://img.shields.io/codecov/c/github/zerocracy/zold.svg)](https://codecov.io/github/zerocracy/zold?branch=master)
12
+ [![Test Coverage](https://img.shields.io/codecov/c/github/yegor256/zold.svg)](https://codecov.io/github/yegor256/zold?branch=master)
13
13
 
14
- [![Dependency Status](https://gemnasium.com/zerocracy/zold.svg)](https://gemnasium.com/zerocracy/zold)
15
- [![Maintainability](https://api.codeclimate.com/v1/badges/7489c1d2bacde40ffc09/maintainability)](https://codeclimate.com/github/zerocracy/zold/maintainability)
14
+ [![Dependency Status](https://gemnasium.com/yegor256/zold.svg)](https://gemnasium.com/yegor256/zold)
15
+ [![Maintainability](https://api.codeclimate.com/v1/badges/7489c1d2bacde40ffc09/maintainability)](https://codeclimate.com/github/yegor256/zold/maintainability)
16
16
 
17
17
  **NOTICE**: It's an experiment and a very early draft! Please, feel free to
18
18
  submit your ideas or pull requests.
19
19
 
20
- Here is the [White Paper](https://latexonline.cc/compile?git=https%3A%2F%2Fgithub.com%2Fyegor256%2Fzold&target=wp%2Fwp.tex&command=pdflatex&trackId=1520158941887).
20
+ Here is the [White Paper](https://github.com/yegor256/zold/raw/master/wp/wp.pdf).
21
21
 
22
- The license is [MIT](https://github.com/zerocracy/zold/blob/master/LICENSE.txt).
22
+ The license is [MIT](https://github.com/yegor256/zold/blob/master/LICENSE.txt).
23
23
 
24
24
  ## How to Use
25
25
 
@@ -108,7 +108,15 @@ $ bundle update
108
108
  $ rake
109
109
  ```
110
110
 
111
- The build has to be clean. If it's not, [submit an issue](https://github.com/zerocracy/zold/issues).
111
+ The build has to be clean. If it's not, [submit an issue](https://github.com/yegor256/zold/issues).
112
112
 
113
113
  Then, make your changes, make sure the build is still clean,
114
114
  and [submit a pull request](https://www.yegor256.com/2014/04/15/github-guidelines.html).
115
+
116
+ If some test fails and you need to run it individually,
117
+ check the logging configuration inside `test__helper.rb` and make
118
+ sure the `Verbose` log is assigned to `$log`. Then, run, for example:
119
+
120
+ ```bash
121
+ ruby test/commands/test_node.rb
122
+ ```
data/Rakefile CHANGED
@@ -73,7 +73,7 @@ desc 'Validate all XML/XSL/XSD/HTML files for formatting'
73
73
  Xcop::RakeTask.new :xcop do |task|
74
74
  task.license = 'LICENSE.txt'
75
75
  task.includes = ['**/*.xml', '**/*.xsl', '**/*.xsd', '**/*.html']
76
- task.excludes = ['target/**/*', 'coverage/**/*']
76
+ task.excludes = ['target/**/*', 'coverage/**/*', 'wp/**/*']
77
77
  end
78
78
 
79
79
  task :copyright do
data/bin/zold CHANGED
@@ -136,7 +136,7 @@ Available options:"
136
136
  Zold::Invoice.new(wallets: wallets, log: log).run(args)
137
137
  when 'pay'
138
138
  require_relative '../lib/zold/commands/pay'
139
- Zold::Pay.new(wallets: wallets, log: log).run(args)
139
+ Zold::Pay.new(wallets: wallets, remotes: remotes, log: log).run(args)
140
140
  when 'show'
141
141
  require_relative '../lib/zold/commands/show'
142
142
  Zold::Show.new(wallets: wallets, log: log).run(args)
data/lib/zold/amount.rb CHANGED
@@ -27,16 +27,24 @@ require 'rainbow'
27
27
  module Zold
28
28
  # Amount
29
29
  class Amount
30
+ # How many zents are in one ZLD: 2^FRACTION
31
+ FRACTION = 32
32
+
33
+ # Maximum amount of zents
34
+ MAX = 2**63
35
+
30
36
  def initialize(coins: nil, zld: nil)
31
37
  if !coins.nil?
32
38
  raise "Integer is required, while #{coins.class} provided: #{coins}" unless coins.is_a?(Integer)
33
39
  @coins = coins
34
40
  elsif !zld.nil?
35
41
  raise "Float is required, while #{zld.class} provided: #{zld}" unless zld.is_a?(Float)
36
- @coins = (zld * 2**24).to_i
42
+ @coins = (zld * 2**Amount::FRACTION).to_i
37
43
  else
38
44
  raise 'You can\'t specify both coints and zld'
39
45
  end
46
+ raise "The amount is too big: #{@coins}" if @coins > Amount::MAX
47
+ raise "The amount is too small: #{@coins}" if @coins < -Amount::MAX
40
48
  end
41
49
 
42
50
  ZERO = Amount.new(coins: 0)
@@ -46,7 +54,7 @@ module Zold
46
54
  end
47
55
 
48
56
  def to_zld
49
- format('%0.2f', @coins.to_f / 2**24)
57
+ format('%0.2f', @coins.to_f / 2**Amount::FRACTION)
50
58
  end
51
59
 
52
60
  def to_s
@@ -98,7 +106,7 @@ module Zold
98
106
 
99
107
  def *(other)
100
108
  c = (@coins * other).to_i
101
- raise "Overflow, can't multiply #{@coins} by #{m}" if c > 2**63
109
+ raise "Overflow, can't multiply #{@coins} by #{m}" if c > Amount::MAX
102
110
  Amount.new(coins: c)
103
111
  end
104
112
  end
@@ -52,6 +52,8 @@ Available options:"
52
52
  default: 8
53
53
  o.bool '--hide-hash', 'Don\'t print hash',
54
54
  default: false
55
+ o.bool '--hide-time', 'Don\'t print calculation time per each score',
56
+ default: false
55
57
  o.bool '--help', 'Print instructions'
56
58
  end
57
59
  if opts.help?
@@ -63,6 +65,7 @@ Available options:"
63
65
 
64
66
  def calculate(opts)
65
67
  start = Time.now
68
+ mstart = Time.now
66
69
  strength = opts[:strength]
67
70
  raise "Invalid strength: #{strength}" if strength <= 0 || strength > 8
68
71
  score = Zold::Score.new(
@@ -72,8 +75,10 @@ Available options:"
72
75
  loop do
73
76
  msg = score.to_s
74
77
  msg += (score.value > 0 ? ' ' + score.hash : '') unless opts['hide-hash']
78
+ msg += " #{(Time.now - mstart).round(2)}s" unless opts['hide-time']
75
79
  @log.info(msg)
76
80
  break if score.value >= opts[:max].to_i
81
+ mstart = Time.now
77
82
  score = score.next
78
83
  end
79
84
  seconds = (Time.now - start).round(2)
@@ -69,9 +69,9 @@ Available options:"
69
69
  end
70
70
  modified = patch.save(wallet.path, overwrite: true)
71
71
  if modified
72
- @log.debug("Merged successfully into #{wallet.path}")
72
+ @log.debug("#{cps.count} copies merged successfully into #{wallet.path}")
73
73
  else
74
- @log.debug("Nothing changed in #{wallet.path} after merge")
74
+ @log.debug("Nothing changed in #{wallet.path} after merge of #{cps.count} copies")
75
75
  end
76
76
  modified
77
77
  end
@@ -30,8 +30,9 @@ require_relative '../log'
30
30
  module Zold
31
31
  # Money sending command
32
32
  class Pay
33
- def initialize(wallets:, log: Log::Quiet.new)
33
+ def initialize(wallets:, remotes:, log: Log::Quiet.new)
34
34
  @wallets = wallets
35
+ @remotes = remotes
35
36
  @log = log
36
37
  end
37
38
 
@@ -51,11 +52,14 @@ Available options:"
51
52
  o.bool '--force',
52
53
  'Ignore all validations',
53
54
  default: false
55
+ o.bool '--dont-pay-taxes',
56
+ 'Don\'t pay taxes even if the wallet is in debt',
57
+ default: false
54
58
  o.bool '--help', 'Print instructions'
55
59
  end
56
60
  mine = Args.new(opts, @log).take || return
57
61
  raise 'Payer wallet ID is required as the first argument' if mine[0].nil?
58
- from = @wallets.find(Zold::Id.new(mine[0]))
62
+ from = @wallets.find(Id.new(mine[0]))
59
63
  raise 'Wallet doesn\'t exist, do \'fetch\' first' unless from.exists?
60
64
  raise 'Recepient\'s invoice or wallet ID is required as the second argument' if mine[1].nil?
61
65
  invoice = mine[1]
@@ -64,8 +68,13 @@ Available options:"
64
68
  invoice = Invoice.new(wallets: @wallets, log: @log).run(['invoice', invoice])
65
69
  end
66
70
  raise 'Amount is required (in ZLD) as the third argument' if mine[2].nil?
67
- amount = Zold::Amount.new(zld: mine[2].to_f)
71
+ amount = Amount.new(zld: mine[2].to_f)
68
72
  details = mine[3] ? mine[3] : '-'
73
+ if Tax.new(from).in_debt? && !opts['dont-pay-taxes']
74
+ Taxes.new(wallets: @wallets, remotes: @remotes, log: @log).run(
75
+ ['taxes', "--private-key=#{opts['private-key']}", id.to_s]
76
+ )
77
+ end
69
78
  pay(from, invoice, amount, details, opts)
70
79
  end
71
80
 
@@ -87,7 +87,7 @@ Available options:"
87
87
  tax = Tax.new(wallet)
88
88
  debt = tax.debt
89
89
  @log.debug("The current debt is #{debt} (#{debt.to_i} zents)")
90
- if debt <= Tax::TRIAL
90
+ unless debt.in_debt?
91
91
  @log.debug("No need to pay taxes yet, until the debt is less than #{Tax::TRIAL} (#{Tax::TRIAL.to_i} zents)")
92
92
  return
93
93
  end
@@ -144,8 +144,8 @@ Available options:"
144
144
  @log.info("#{name} score #{Rainbow(score.value).red} is too weak (<#{Score::STRENGTH})")
145
145
  next
146
146
  end
147
- if score.value < Tax::MIN_SCORE
148
- @log.info("#{name} score #{Rainbow(score.value).red} is too small (<#{Tax::MIN_SCORE})")
147
+ if score.value < Tax::EXACT_SCORE
148
+ @log.info("#{name} score #{Rainbow(score.value).red} is too small (<#{Tax::EXACT_SCORE})")
149
149
  next
150
150
  end
151
151
  @log.info("#{score.host}:#{score.port}: #{Rainbow(score.value).green}")
@@ -40,11 +40,12 @@ module Zold
40
40
  end
41
41
 
42
42
  def quota
43
- 2**(-2048 / @root.age)
43
+ years = @root.age / (24 * 1024)
44
+ 1 - (2**-years)
44
45
  end
45
46
 
46
47
  def limit
47
- max = 2**63
48
+ max = Amount::MAX
48
49
  Amount.new(coins: (max * quota).to_i)
49
50
  end
50
51
 
@@ -61,9 +61,9 @@ module Zold
61
61
  balance = wallet.balance
62
62
  raise "The balance #{balance} is negative and it's not a root wallet" if balance.negative? && !wallet.root?
63
63
  Emission.new(wallet).check
64
- debt = Tax.new(wallet).debt
65
- if debt > Tax::TRIAL
66
- raise "Taxes are not paid, the debt is #{debt} (#{debt.to_i} zents), won't promote the wallet"
64
+ tax = Tax.new(wallet)
65
+ if tax.in_debt?
66
+ raise "Taxes are not paid, can't accept the wallet; the debt is #{tax.debt} (#{tax.debt.to_i} zents)"
67
67
  end
68
68
  end
69
69
  end
data/lib/zold/patch.rb CHANGED
@@ -19,6 +19,7 @@
19
19
  # SOFTWARE.
20
20
 
21
21
  require_relative 'wallet'
22
+ require_relative 'signature'
22
23
 
23
24
  # Patch.
24
25
  #
@@ -57,7 +58,7 @@ module Zold
57
58
  def save(file, overwrite: false)
58
59
  before = ''
59
60
  before = File.read(file) if File.exist?(file)
60
- wallet = Zold::Wallet.new(file)
61
+ wallet = Wallet.new(file)
61
62
  wallet.init(@id, @key, overwrite: overwrite, network: @network)
62
63
  @txns.each { |t| wallet.add(t) }
63
64
  after = File.read(file)
data/lib/zold/prefixes.rb CHANGED
@@ -32,7 +32,7 @@ module Zold
32
32
  @wallet = wallet
33
33
  end
34
34
 
35
- def create(length)
35
+ def create(length = 8)
36
36
  raise "Length #{length} is too small" if length < 8
37
37
  raise "Length #{length} is too big" if length > 32
38
38
  key = body
data/lib/zold/score.rb CHANGED
@@ -29,7 +29,9 @@ require_relative 'remotes'
29
29
  module Zold
30
30
  # Score
31
31
  class Score
32
+ # Default strength for the entire system, in production mode.
32
33
  STRENGTH = 6
34
+
33
35
  attr_reader :time, :host, :port, :invoice, :strength
34
36
  # time: UTC ISO 8601 string
35
37
  def initialize(time, host, port, invoice, suffixes = [], strength: STRENGTH)
@@ -140,6 +142,7 @@ module Zold
140
142
  end
141
143
 
142
144
  def reduced(max = 4)
145
+ raise "The length of the score is #{@suffixes.count}, can't reduce to #{max}" if max > @suffixes.count
143
146
  Score.new(
144
147
  @time, @host, @port, @invoice,
145
148
  @suffixes[0..max - 1], strength: @strength
data/lib/zold/tax.rb CHANGED
@@ -31,8 +31,8 @@ require_relative 'amount'
31
31
  module Zold
32
32
  # A single tax payment
33
33
  class Tax
34
- # The minimum score a wallet can buy in order to pay taxes.
35
- MIN_SCORE = 16
34
+ # The exact score a wallet can buy in order to pay taxes.
35
+ EXACT_SCORE = 16
36
36
 
37
37
  # The maximum allowed amount in one transaction.
38
38
  MAX_PAYMENT = Amount.new(zld: 1.0)
@@ -49,22 +49,38 @@ module Zold
49
49
  # For how many days to pay at once.
50
50
  DAYS_INCREMENT = 32
51
51
 
52
+ # Text prefix for taxes details
53
+ PREFIX = 'TAXES'.freeze
54
+
52
55
  def initialize(wallet)
53
56
  @wallet = wallet
54
57
  end
55
58
 
59
+ # Check whether this tax payment already exists in the wallet.
60
+ def exists?(txn)
61
+ !@wallet.txns.find { |t| t.details.start_with?("#{Tax::PREFIX} ") && t.details == txn.details }.nil?
62
+ end
63
+
64
+ def details(best)
65
+ "#{Tax::PREFIX} #{best.reduced(Tax::EXACT_SCORE).to_text}"
66
+ end
67
+
56
68
  def pay(pvt, best)
57
- fee = Tax::FEE * @wallet.txns.count * Tax::DAYS_INCREMENT * 24
58
- @wallet.sub(fee, best.invoice, pvt, "TAXES #{best.to_text}")
69
+ fee = Tax::FEE_TXN_HOUR * @wallet.txns.count * Tax::DAYS_INCREMENT * 24
70
+ @wallet.sub(fee, best.invoice, pvt, details(best))
71
+ end
72
+
73
+ def in_debt?
74
+ debt > Tax::TRIAL
59
75
  end
60
76
 
61
77
  def debt
62
78
  txns = @wallet.txns
63
79
  scores = txns.map do |t|
64
80
  pfx, body = t.details.split(' ')
65
- next if pfx != 'TAXES' || body.nil?
81
+ next if pfx != Tax::PREFIX || body.nil?
66
82
  score = Score.parse_text(body)
67
- next if !score.valid? || score.value < MIN_SCORE
83
+ next if !score.valid? || score.value != Tax::EXACT_SCORE
68
84
  next if t.amount > Tax::MAX_PAYMENT
69
85
  score
70
86
  end.reject(&:nil?).uniq(&:hash)
data/lib/zold/txn.rb CHANGED
@@ -52,11 +52,12 @@ module Zold
52
52
  raise 'Prefix can\'t be NIL' if prefix.nil?
53
53
  raise "Prefix is too short: \"#{prefix}\"" if prefix.length < 8
54
54
  raise "Prefix is too long: \"#{prefix}\"" if prefix.length > 32
55
+ raise "Prefix is wrong: \"#{prefix}\"" unless prefix =~ /^[a-zA-Z0-9]+$/
55
56
  @prefix = prefix
56
57
  raise 'Details can\'t be NIL' if details.nil?
57
58
  raise 'Details can\'t be empty' if details.empty?
58
- raise "Details are too long: \"#{details}\"" if details.length > 128
59
- raise "Details are wrong: \"#{details}\"" unless details =~ /^[a-zA-Z0-9 -\.,]{1,128}$/
59
+ raise "Details are too long: \"#{details}\"" if details.length > 512
60
+ raise "Details are wrong: \"#{details}\"" unless details =~ /^[a-zA-Z0-9 -\.,]+$/
60
61
  @details = details
61
62
  end
62
63
 
@@ -101,7 +102,7 @@ module Zold
101
102
  '([0-9a-f]{16})',
102
103
  '([A-Za-z0-9]{8,32})',
103
104
  '([0-9a-f]{16})',
104
- '([a-zA-Z0-9 -\.,]{1,128})',
105
+ '([a-zA-Z0-9 -\.,]{1,512})',
105
106
  '([A-Za-z0-9+/]+={0,3})?'
106
107
  ].join(';') + '$'
107
108
  )
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.8'.freeze
26
+ VERSION = '0.9'.freeze
27
27
  end
data/lib/zold/wallet.rb CHANGED
@@ -23,6 +23,7 @@ require_relative 'version'
23
23
  require_relative 'key'
24
24
  require_relative 'id'
25
25
  require_relative 'txn'
26
+ require_relative 'tax'
26
27
  require_relative 'amount'
27
28
  require_relative 'signature'
28
29
 
@@ -97,8 +98,10 @@ module Zold
97
98
  raise "The amount can't be negative: #{amount}" if amount.negative?
98
99
  raise 'The pvt has to be of type Key' unless pvt.is_a?(Key)
99
100
  prefix, target = invoice.split('@')
101
+ id = max + 1
102
+ raise 'Too many transactions already, can\'t add more' if max > 0xffff
100
103
  txn = Txn.new(
101
- max + 1,
104
+ id,
102
105
  Time.now,
103
106
  amount * -1,
104
107
  prefix,
@@ -112,6 +115,9 @@ module Zold
112
115
 
113
116
  def add(txn)
114
117
  raise 'The txn has to be of type Txn' unless txn.is_a?(Txn)
118
+ dup = txns.find { |t| t.bnf == txn.bnf && t.id == txn.id }
119
+ raise "The transaction with the same ID and BNF already exists: #{dup}" unless dup.nil?
120
+ raise "The tax payment already exists: #{txn}" if Tax.new(self).exists?(txn)
115
121
  open(@file, 'a') { |f| f.print "#{txn}\n" }
116
122
  end
117
123
 
@@ -19,10 +19,11 @@
19
19
  # SOFTWARE.
20
20
 
21
21
  require 'minitest/autorun'
22
- require 'tmpdir'
23
22
  require 'json'
24
23
  require 'time'
25
24
  require 'webmock/minitest'
25
+ require_relative '../test__helper'
26
+ require_relative '../fake_home'
26
27
  require_relative '../../lib/zold/wallets'
27
28
  require_relative '../../lib/zold/wallet'
28
29
  require_relative '../../lib/zold/id'
@@ -37,24 +38,21 @@ require_relative '../../lib/zold/commands/diff'
37
38
  # License:: MIT
38
39
  class TestDiff < Minitest::Test
39
40
  def test_diff_with_copies
40
- Dir.mktmpdir 'test' do |dir|
41
- id = Zold::Id.new
42
- wallet = Zold::Wallet.new(File.join(dir, id.to_s))
43
- wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
44
- first = Zold::Wallet.new(File.join(dir, 'copy-1'))
41
+ FakeHome.new.run do |home|
42
+ wallet = home.create_wallet
43
+ first = home.create_wallet
45
44
  File.write(first.path, File.read(wallet.path))
46
- second = Zold::Wallet.new(File.join(dir, 'copy-2'))
45
+ second = home.create_wallet
47
46
  File.write(second.path, File.read(wallet.path))
48
- Zold::Pay.new(
49
- wallets: Zold::Wallets.new(dir), log: $log
50
- ).run(['pay', id.to_s, second.id.to_s, '14.95', '--force', '--private-key=fixtures/id_rsa'])
51
- copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
47
+ Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: $log).run(
48
+ ['pay', wallet.id.to_s, second.id.to_s, '14.95', '--force', '--private-key=fixtures/id_rsa']
49
+ )
50
+ copies = home.copies(wallet)
52
51
  copies.add(File.read(first.path), 'host-1', 80, 5)
53
52
  copies.add(File.read(second.path), 'host-2', 80, 5)
54
- diff = Zold::Diff.new(
55
- wallets: Zold::Wallets.new(dir),
56
- copies: copies.root, log: $log
57
- ).run(['diff', id.to_s])
53
+ diff = Zold::Diff.new(wallets: home.wallets, copies: copies.root, log: $log).run(
54
+ ['diff', wallet.id.to_s]
55
+ )
58
56
  assert(diff.include?('-0001;'))
59
57
  end
60
58
  end
@@ -19,11 +19,10 @@
19
19
  # SOFTWARE.
20
20
 
21
21
  require 'minitest/autorun'
22
- require 'tmpdir'
23
- require 'json'
24
22
  require 'time'
25
23
  require 'webmock/minitest'
26
24
  require_relative '../test__helper'
25
+ require_relative '../fake_home'
27
26
  require_relative '../../lib/zold/wallet'
28
27
  require_relative '../../lib/zold/wallets'
29
28
  require_relative '../../lib/zold/id'
@@ -40,52 +39,44 @@ require_relative '../../lib/zold/commands/pay'
40
39
  # License:: MIT
41
40
  class TestMerge < Minitest::Test
42
41
  def test_merges_wallet
43
- Dir.mktmpdir 'test' do |dir|
44
- id = Zold::Id.new
45
- file = File.join(dir, id.to_s)
46
- wallet = Zold::Wallet.new(file)
47
- wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
48
- first = Zold::Wallet.new(File.join(dir, 'copy-1'))
42
+ FakeHome.new.run do |home|
43
+ wallet = home.create_wallet
44
+ first = home.create_wallet
49
45
  File.write(first.path, File.read(wallet.path))
50
- second = Zold::Wallet.new(File.join(dir, 'copy-2'))
46
+ second = home.create_wallet
51
47
  File.write(second.path, File.read(wallet.path))
52
- Zold::Pay.new(
53
- wallets: Zold::Wallets.new(dir), log: $log
54
- ).run(['pay', id.to_s, second.id.to_s, '14.95', '--force', '--private-key=fixtures/id_rsa'])
55
- copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
48
+ Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: $log).run(
49
+ ['pay', wallet.id.to_s, second.id.to_s, '14.95', '--force', '--private-key=fixtures/id_rsa']
50
+ )
51
+ copies = home.copies(wallet)
56
52
  copies.add(File.read(first.path), 'host-1', 80, 5)
57
53
  copies.add(File.read(second.path), 'host-2', 80, 5)
58
- modified = Zold::Merge.new(
59
- wallets: Zold::Wallets.new(dir),
60
- copies: copies.root, log: $log
61
- ).run(['merge', id.to_s])
54
+ modified = Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: $log).run(
55
+ ['merge', wallet.id.to_s]
56
+ )
62
57
  assert(1, modified.count)
63
- assert(id, modified[0])
58
+ assert(wallet.id, modified[0])
64
59
  end
65
60
  end
66
61
 
67
62
  def test_merges_into_empty_wallet
68
- Dir.mktmpdir 'test' do |dir|
69
- id = Zold::Id.new
70
- file = File.join(dir, id.to_s)
71
- wallet = Zold::Wallet.new(file)
72
- wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
73
- first = Zold::Wallet.new(File.join(dir, 'copy-1'))
63
+ FakeHome.new.run do |home|
64
+ wallet = home.create_wallet
65
+ first = home.create_wallet
74
66
  File.write(first.path, File.read(wallet.path))
75
- second = Zold::Wallet.new(File.join(dir, 'copy-2'))
67
+ second = home.create_wallet
76
68
  File.write(second.path, File.read(wallet.path))
77
- Zold::Pay.new(
78
- wallets: Zold::Wallets.new(dir), log: $log
79
- ).run(['pay', id.to_s, second.id.to_s, '14.95', '--force', '--private-key=fixtures/id_rsa'])
80
- copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
69
+ Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: $log).run(
70
+ ['pay', wallet.id.to_s, second.id.to_s, '14.95', '--force', '--private-key=fixtures/id_rsa']
71
+ )
72
+ copies = home.copies(wallet)
81
73
  copies.add(File.read(first.path), 'host-1', 80, 5)
82
74
  copies.add(File.read(second.path), 'host-2', 80, 5)
83
- modified = Zold::Merge.new(
84
- wallets: Zold::Wallets.new(dir),
85
- copies: copies.root, log: $log
86
- ).run(['merge', id.to_s])
75
+ modified = Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: $log).run(
76
+ ['merge', wallet.id.to_s]
77
+ )
87
78
  assert(1, modified.count)
88
- assert(id, modified[0])
79
+ assert(wallet.id, modified[0])
89
80
  end
90
81
  end
91
82
  end
@@ -54,8 +54,8 @@ class TestNode < Minitest::Test
54
54
  ).run(['fetch'])
55
55
  copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
56
56
  assert_equal(1, copies.all.count)
57
- assert_equal(copies.all[0][:name], '1')
58
- assert_equal(copies.all[0][:score], 0)
57
+ assert_equal('1', copies.all[0][:name])
58
+ assert_equal(0, copies.all[0][:score])
59
59
  end
60
60
  end
61
61
  end
@@ -33,19 +33,14 @@ require_relative '../../lib/zold/commands/pay'
33
33
  # License:: MIT
34
34
  class TestPay < Minitest::Test
35
35
  def test_sends_from_wallet_to_wallet
36
- Dir.mktmpdir 'test' do |dir|
37
- wallets = Zold::Wallets.new(dir)
38
- sid = Zold::Id.new
39
- source = wallets.find(sid)
40
- source.init(sid, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
41
- tid = Zold::Id.new
42
- target = wallets.find(tid)
43
- target.init(tid, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
36
+ FakeHome.new.run do |home|
37
+ source = home.create_wallet
38
+ target = home.create_wallet
44
39
  amount = Zold::Amount.new(zld: 14.95)
45
- Zold::Pay.new(wallets: wallets, log: $log).run(
40
+ Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: $log).run(
46
41
  [
47
42
  'pay', '--force', '--private-key=fixtures/id_rsa',
48
- sid.to_s, tid.to_s, amount.to_zld, 'For the car'
43
+ source.id.to_s, target.id.to_s, amount.to_zld, 'For the car'
49
44
  ]
50
45
  )
51
46
  assert_equal(amount * -1, source.balance)
@@ -61,7 +61,7 @@ class TestTaxes < Minitest::Test
61
61
  Zold::Taxes.new(
62
62
  wallets: wallets, remotes: remotes, log: $log
63
63
  ).run(['taxes', '--private-key=fixtures/id_rsa', id.to_s])
64
- assert_equal(Zold::Amount.new(coins: 335_376_547), wallet.balance)
64
+ assert_equal(Zold::Amount.new(coins: 85_856_396_247), wallet.balance)
65
65
  end
66
66
  end
67
67
  end