zold 0.8 → 0.9

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: 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