zold 0.4.1 → 0.4.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: 295d14430d8ebdd3388c4389ac84aa4690ea589d
4
- data.tar.gz: 7f63a6461a39f5b4f14486d4ef2cf7ccf8a19795
3
+ metadata.gz: f998b2457e50fdca35b6c4ac18869a059aa3989b
4
+ data.tar.gz: 495db441ee37e8c7d4e3eb05554147bb720c1e45
5
5
  SHA512:
6
- metadata.gz: '008090bc5576401be63bb0366996f1c3e8509299d0ef9fdc691e513ee13c384fb83f35f9053294911787e50e774b8a8baa8b61525b96ea5ee186705ef24dfb5d'
7
- data.tar.gz: a0d184623087e94ec76bf33ce0954c010de8f3d5793d8638bdd2a2a2209741f7f1f4f9360ae6cbd104e935f5b1b96109e94eb8794ad24104e991464b0fffd92d
6
+ metadata.gz: 1ca78d5d43939e532d2e006e107165bb16e8daf091fe3c0da36f62758a5025261d3af405798ce6ff4d4188791a9af8cde2c6cac4be89c0366c204f19446f4d76
7
+ data.tar.gz: 2fd4122ff59c126eb7ac7796391b7bcc6f509e5d0eb2a028609f7d29be7833f5640a122cad7296f2938f16626817467e38ad029971be91279e57995ae1166b3b
data/Procfile CHANGED
@@ -1 +1 @@
1
- web: LC_ALL=UTF-8 ./bin/zold --no-colors --verbose --trace node --bind-port=$PORT --port=80 --host=b1.zold.io --threads=0
1
+ web: LC_ALL=UTF-8 ./bin/zold --no-colors --verbose --trace node --bind-port=$PORT --port=80 --host=b1.zold.io --threads=0 --standalone
data/bin/zold CHANGED
@@ -86,8 +86,8 @@ Available commands:
86
86
  Generate score for the given host and port
87
87
  Available options:"
88
88
  o.string '-d', '--dir',
89
- 'The directory where wallets are stored (default: current directory)',
90
- default: '.'
89
+ 'The directory where wallets are stored (default: .)',
90
+ default: Dir.pwd
91
91
  o.string '--private-key',
92
92
  'The location of RSA private key (default: ~/.ssh/id_rsa)',
93
93
  default: '~/.ssh/id_rsa'
@@ -120,8 +120,8 @@ Available options:"
120
120
  args = args[(args.index(command) + 1)..-1]
121
121
 
122
122
  wallets = Zold::Wallets.new(opts['dir'])
123
- remotes = Zold::Remotes.new(File.join(opts['dir'], '.zold/remotes'))
124
- copies = File.join(opts['dir'], '.zold/copies')
123
+ remotes = Zold::Remotes.new(File.join(opts['dir'], '.zoldata/remotes'))
124
+ copies = File.join(opts['dir'], '.zoldata/copies')
125
125
 
126
126
  case command
127
127
  when 'node'
@@ -11,5 +11,3 @@ for c in "${commands[@]}"
11
11
  do
12
12
  zold --trace $c --help
13
13
  done
14
-
15
- echo 'DONE'
@@ -9,7 +9,7 @@ port=`python -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.gets
9
9
 
10
10
  mkdir server
11
11
  cd server
12
- zold node --host=localhost --port=${port} --bind-port=${port} --threads=0 &
12
+ zold --trace node --host=localhost --port=${port} --bind-port=${port} --threads=0 --standalone &
13
13
  pid=$!
14
14
  trap "kill -9 $pid" EXIT
15
15
  cd ..
@@ -18,22 +18,21 @@ while ! nc -z localhost ${port}; do
18
18
  sleep 0.1
19
19
  done
20
20
 
21
- zold remote clean
22
- zold remote add localhost ${port}
23
- zold remote show
21
+ zold --trace remote clean
22
+ zold --trace remote add localhost ${port}
23
+ zold --trace remote show
24
24
 
25
- zold --public-key id_rsa.pub create 0000000000000000
25
+ zold --trace --public-key id_rsa.pub create 0000000000000000
26
26
  target=`zold --public-key id_rsa.pub create`
27
27
  invoice=`zold invoice ${target}`
28
- zold --private-key id_rsa pay 0000000000000000 ${invoice} 14.99 'To save the world!'
29
- zold propagate 0000000000000000
30
- zold show
31
- zold show 0000000000000000
32
-
33
- zold push 0000000000000000
34
- zold fetch 0000000000000000 --ignore-score-weakness
35
- zold diff 0000000000000000
36
- zold merge 0000000000000000
37
- zold clean 0000000000000000
38
-
39
- echo 'DONE'
28
+ zold --trace --private-key id_rsa pay 0000000000000000 ${invoice} 14.99 'To save the world!'
29
+ zold --trace propagate 0000000000000000
30
+ zold --trace show
31
+ zold --trace show 0000000000000000
32
+
33
+ zold --trace remote show
34
+ zold --trace push 0000000000000000
35
+ zold --trace fetch 0000000000000000 --ignore-score-weakness
36
+ zold --trace diff 0000000000000000
37
+ zold --trace merge 0000000000000000
38
+ zold --trace clean 0000000000000000
@@ -47,6 +47,9 @@ Available options:"
47
47
  o.bool '--ignore-score-weakness',
48
48
  'Don\'t complain when their score is too weak',
49
49
  default: false
50
+ o.array '--ignore-node',
51
+ 'Ignore this node and don\'t fetch from it',
52
+ default: []
50
53
  o.bool '--help', 'Print instructions'
51
54
  end
52
55
  if opts.help?
@@ -62,40 +65,50 @@ Available options:"
62
65
  def fetch(id, cps, opts)
63
66
  total = 0
64
67
  @remotes.all.each do |r|
65
- uri = URI("#{r[:home]}wallet/#{id}")
66
- res = Http.new(uri).get
67
- unless res.code == '200'
68
- @log.error("#{r[:host]}:#{r[:port]} \
69
- #{Rainbow(res.code).red}/#{res.message} at #{uri}")
70
- next
71
- end
72
- json = JSON.parse(res.body)
73
- score = Score.new(
74
- Time.parse(json['score']['time']),
75
- r[:host],
76
- r[:port],
77
- json['score']['suffixes']
68
+ total += 1 if fetch_one(id, r, cps, opts)
69
+ end
70
+ @log.debug("#{total} copies fetched, \
71
+ there are #{cps.all.count} available locally")
72
+ end
73
+
74
+ def fetch_one(id, r, cps, opts)
75
+ address = "#{r[:host]}:#{r[:port]}".downcase
76
+ if opts['ignore-node'].include?(address)
77
+ @log.info("#{address} ignored because of --ignore-node")
78
+ return false
79
+ end
80
+ uri = URI("#{r[:home]}wallet/#{id}")
81
+ res = Http.new(uri).get
82
+ unless res.code == '200'
83
+ @log.error(
84
+ "#{address} #{Rainbow(res.code).red}/#{res.message} at #{uri}"
78
85
  )
79
- unless score.valid?
80
- @log.error("#{r[:host]}:#{r[:port]} invalid score")
81
- next
82
- end
83
- if score.strength < Score::STRENGTH && !opts['ignore-score-weakness']
84
- @log.error(
85
- "#{r[:host]}:#{r[:port]} score is too weak: #{score.strength} \
86
+ return false
87
+ end
88
+ json = JSON.parse(res.body)
89
+ score = Score.new(
90
+ Time.parse(json['score']['time']),
91
+ r[:host],
92
+ r[:port],
93
+ json['score']['suffixes']
94
+ )
95
+ unless score.valid?
96
+ @log.error("#{address} invalid score")
97
+ return false
98
+ end
99
+ if score.strength < Score::STRENGTH && !opts['ignore-score-weakness']
100
+ @log.error(
101
+ "#{address} score is too weak: #{score.strength} \
86
102
  (<#{Score::STRENGTH})"
87
- )
88
- next
89
- end
90
- total += 1
91
- cps.add(json['body'], r[:host], r[:port], score.value)
92
- @log.info(
93
- "#{r[:host]}:#{r[:port]} #{json['body'].length}b/\
94
- #{Rainbow(score.value).green} (v.#{json['version']})"
95
103
  )
104
+ return false
96
105
  end
97
- @log.debug("#{total} copies fetched, \
98
- there are #{cps.all.count} available locally")
106
+ cps.add(json['body'], r[:host], r[:port], score.value)
107
+ @log.info(
108
+ "#{address} #{json['body'].length}b/\
109
+ #{Rainbow(score.value).green} (v.#{json['version']})"
110
+ )
111
+ true
99
112
  end
100
113
  end
101
114
  end
@@ -37,6 +37,7 @@ module Zold
37
37
  @log = log
38
38
  end
39
39
 
40
+ # Returns the array of modified wallets (IDs)
40
41
  def run(args = [])
41
42
  opts = Slop.parse(args, help: true) do |o|
42
43
  o.banner = "Usage: zold merge [ID...] [options]
@@ -48,12 +49,15 @@ Available options:"
48
49
  return
49
50
  end
50
51
  raise 'At least one wallet ID is required' if opts.arguments.empty?
52
+ modified = []
51
53
  opts.arguments.each do |id|
52
54
  wallet = @wallets.find(Id.new(id))
53
- merge(wallet, Copies.new(File.join(@copies, id)), opts)
55
+ next unless merge(wallet, Copies.new(File.join(@copies, id)), opts)
56
+ modified << Id.new(id)
54
57
  require_relative 'propagate'
55
- Propagate.new(wallets: @wallets, log: @log).run(args)
58
+ modified += Propagate.new(wallets: @wallets, log: @log).run(args)
56
59
  end
60
+ modified
57
61
  end
58
62
 
59
63
  def merge(wallet, cps, _)
@@ -64,8 +68,13 @@ Available options:"
64
68
  cps[1..-1].each do |c|
65
69
  patch.join(Wallet.new(c[:path]))
66
70
  end
67
- patch.save(wallet.path, overwrite: true)
68
- @log.debug("Merged successfully into #{wallet.path}")
71
+ modified = patch.save(wallet.path, overwrite: true)
72
+ if modified
73
+ @log.debug("Merged successfully into #{wallet.path}")
74
+ else
75
+ @log.debug("Nothing changed in #{wallet.path} after merge")
76
+ end
77
+ modified
69
78
  end
70
79
  end
71
80
  end
@@ -44,7 +44,7 @@ module Zold
44
44
  default: Remotes::PORT
45
45
  o.string '--host', 'Host name (default: 127.0.0.1)',
46
46
  default: '127.0.0.1'
47
- o.string '--home', 'Home directory (default: current directory)',
47
+ o.string '--home', 'Home directory (default: .)',
48
48
  default: Dir.pwd
49
49
  o.integer '--strength',
50
50
  "The strength of the score (default: #{Score::STRENGTH})",
@@ -52,6 +52,9 @@ module Zold
52
52
  o.integer '--threads',
53
53
  'How many threads to use for scores finding (default: 8)',
54
54
  default: 8
55
+ o.bool '--standalone',
56
+ 'Never communicate with other nodes (mostly for testing)',
57
+ default: false
55
58
  o.bool '--help', 'Print instructions'
56
59
  end
57
60
  if opts.help?
@@ -66,9 +69,20 @@ module Zold
66
69
  Logger: WebrickLog.new(@log),
67
70
  AccessLog: []
68
71
  )
72
+ if opts['standalone']
73
+ Zold::Front.set(:remotes, Remotes::Empty.new)
74
+ else
75
+ Zold::Front.set(
76
+ :remotes,
77
+ Remotes.new(
78
+ File.join(opts[:home], '.zoldata/remotes')
79
+ )
80
+ )
81
+ end
69
82
  Zold::Front.set(:port, opts['bind-port'])
70
83
  FileUtils.mkdir_p(opts[:home])
71
84
  Zold::Front.set(:home, opts[:home])
85
+ Zold::Front.set(:me, "#{opts[:host]}:#{opts[:port]}".downcase)
72
86
  farm = Farm.new(log: @log)
73
87
  farm.start(
74
88
  opts[:host], opts[:port],
@@ -35,6 +35,7 @@ module Zold
35
35
  @log = log
36
36
  end
37
37
 
38
+ # Returns list of Wallet IDs which were affected
38
39
  def run(args = [])
39
40
  opts = Slop.parse(args, help: true) do |o|
40
41
  o.banner = "Usage: zold propagate [ID...] [options]
@@ -46,13 +47,17 @@ Available options:"
46
47
  return
47
48
  end
48
49
  raise 'At least one wallet ID is required' if opts.arguments.empty?
50
+ modified = []
49
51
  opts.arguments.each do |id|
50
- propagate(@wallets.find(id), opts)
52
+ modified += propagate(@wallets.find(id), opts)
51
53
  end
54
+ modified
52
55
  end
53
56
 
57
+ # Returns list of Wallet IDs which were affected
54
58
  def propagate(wallet, _)
55
59
  me = wallet.id
60
+ modified = []
56
61
  wallet.txns.select { |t| t.amount.negative? }.each do |t|
57
62
  target = @wallets.find(t.bnf)
58
63
  unless target.exists?
@@ -66,8 +71,12 @@ Available options:"
66
71
  end
67
72
  target.add(t.inverse(me))
68
73
  @log.info("#{t.amount.mul(-1)} to #{t.bnf}")
74
+ modified << t.id
69
75
  end
70
- @log.debug("Wallet #{me} propagated successfully")
76
+ modified.uniq!
77
+ @log.debug("Wallet #{me} propagated successfully, \
78
+ #{modified.count} wallets affected")
79
+ modified
71
80
  end
72
81
  end
73
82
  end
@@ -19,6 +19,7 @@
19
19
  # SOFTWARE.
20
20
 
21
21
  require 'slop'
22
+ require 'json'
22
23
  require 'net/http'
23
24
  require_relative '../log'
24
25
  require_relative '../id'
@@ -55,13 +56,26 @@ Available options:"
55
56
 
56
57
  def push(wallet, _)
57
58
  raise 'The wallet is absent' unless wallet.exists?
58
- remote = @remotes.all[0]
59
- uri = URI("#{remote[:home]}wallet/#{wallet.id}")
60
- response = Http.new(uri).put(File.read(wallet.path))
61
- unless response.code == '200'
62
- raise "Failed to push to #{uri}: #{response.code}/#{response.message}"
59
+ total = 0
60
+ @remotes.all.each do |r|
61
+ uri = URI("#{r[:home]}wallet/#{wallet.id}")
62
+ response = Http.new(uri).put(File.read(wallet.path))
63
+ if response.code != '304' && response.code != '200'
64
+ @log.error("#{uri} failed as #{response.code}/#{response.message}")
65
+ next
66
+ end
67
+ json = JSON.parse(response.body)['score']
68
+ score = Score.new(
69
+ Time.parse(json['time']), json['host'],
70
+ json['port'], json['suffixes']
71
+ )
72
+ unless score.valid?
73
+ @log.error("#{uri} invalid score")
74
+ next
75
+ end
76
+ total += score.value
63
77
  end
64
- @log.info("The #{wallet.id} pushed to #{uri}")
78
+ @log.info("Total score is #{total}")
65
79
  end
66
80
  end
67
81
  end
@@ -40,7 +40,6 @@ module Zold
40
40
  def get
41
41
  http = Net::HTTP.new(@uri.host, @uri.port)
42
42
  http.read_timeout = 5
43
- http.continue_timeout = 5
44
43
  return http.request_get(@uri.path, headers)
45
44
  rescue StandardError => e
46
45
  return Net::HTTPServerError.new('1.1', '599', e.message)
@@ -48,11 +47,13 @@ module Zold
48
47
 
49
48
  def put(body)
50
49
  http = Net::HTTP.new(@uri.host, @uri.port)
51
- http.read_timeout = 5
52
- http.continue_timeout = 5
50
+ http.read_timeout = 60
53
51
  return http.request_put(
54
52
  @uri.path, body,
55
- headers.merge('Content-Type': 'text/plain')
53
+ headers.merge(
54
+ 'Content-Type': 'text/plain',
55
+ 'Content-Length': body.length.to_s
56
+ )
56
57
  )
57
58
  rescue StandardError => e
58
59
  return Net::HTTPServerError.new('1.1', '599', e.message)
@@ -50,12 +50,13 @@ module Zold
50
50
  set :log, Log.new
51
51
  set :show_exceptions, false
52
52
  set :home, Dir.pwd
53
+ set :me, 'localhost:4096'
53
54
  set :farm, Farm.new
54
55
  set :server, 'webrick'
55
56
  end
56
57
 
57
58
  before do
58
- if request.env[Http::SCORE_HEADER]
59
+ if request.env[Http::SCORE_HEADER] && !settings.remotes.empty?
59
60
  s = Score.parse(request.env[Http::SCORE_HEADER])
60
61
  error(400, 'The score is invalid') unless s.valid?
61
62
  error(400, 'The score is weak') if s.strength < Score::STRENGTH
@@ -85,7 +86,7 @@ module Zold
85
86
  wallets: wallets.all.count,
86
87
  farm: settings.farm.to_json,
87
88
  date: `date --iso-8601=seconds -u`.strip,
88
- age: (Time.now - settings.start) / (60 * 60),
89
+ hours_alive: ((Time.now - settings.start) / (60 * 60)).round(2),
89
90
  home: 'https://www.zold.io'
90
91
  )
91
92
  end
@@ -106,20 +107,38 @@ module Zold
106
107
  id = Id.new(params[:id])
107
108
  wallet = wallets.find(id)
108
109
  request.body.rewind
110
+ body = request.body.read
111
+ if wallet.exists? && File.read(wallet.path) == body
112
+ status 304
113
+ return JSON.pretty_generate(
114
+ version: VERSION, score: score.to_h
115
+ )
116
+ end
109
117
  cps = copies(id)
110
- cps.add(request.body.read, 'remote', Remotes::PORT, 0)
118
+ cps.add(body, 'remote', Remotes::PORT, 0)
111
119
  require_relative '../commands/fetch'
112
120
  Zold::Fetch.new(
113
- remotes: remotes, copies: cps.root,
121
+ remotes: settings.remotes, copies: cps.root,
114
122
  log: settings.log
115
- ).run([id.to_s])
123
+ ).run([id.to_s, "--ignore-node=#{settings.me}"])
116
124
  require_relative '../commands/merge'
117
- Zold::Merge.new(
125
+ modified = Zold::Merge.new(
118
126
  wallets: wallets, copies: cps.root,
119
127
  log: settings.log
120
128
  ).run([id.to_s])
121
129
  cps.remove('remote', Remotes::PORT)
122
- "Success, #{wallet.id} balance is #{wallet.balance}"
130
+ modified.each do |m|
131
+ Zold::Push.new(
132
+ wallets: wallets, remotes: settings.remotes,
133
+ log: settings.log
134
+ ).run([m.to_s])
135
+ end
136
+ JSON.pretty_generate(
137
+ version: VERSION,
138
+ score: score.to_h,
139
+ balance: wallet.balance,
140
+ modified: modified.count
141
+ )
123
142
  end
124
143
 
125
144
  get '/remotes' do
@@ -127,7 +146,7 @@ module Zold
127
146
  JSON.pretty_generate(
128
147
  version: VERSION,
129
148
  score: score.to_h,
130
- all: remotes.all.map do |r|
149
+ all: settings.remotes.all.map do |r|
131
150
  {
132
151
  host: r[:host],
133
152
  port: r[:port]
@@ -158,11 +177,7 @@ module Zold
158
177
  private
159
178
 
160
179
  def copies(id)
161
- Copies.new(File.join(settings.home, ".zold/copies/#{id}"))
162
- end
163
-
164
- def remotes
165
- Remotes.new(File.join(settings.home, '.zold/remotes'))
180
+ Copies.new(File.join(settings.home, ".zoldata/copies/#{id}"))
166
181
  end
167
182
 
168
183
  def wallets
@@ -49,10 +49,15 @@ module Zold
49
49
  end
50
50
  end
51
51
 
52
+ # Returns TRUE if the file was actually modified
52
53
  def save(file, overwrite: false)
54
+ before = ''
55
+ before = File.read(file) if File.exist?(file)
53
56
  wallet = Zold::Wallet.new(file)
54
57
  wallet.init(@id, @key, overwrite: overwrite)
55
58
  @txns.each { |t| wallet.add(t) }
59
+ after = File.read(file)
60
+ before != after
56
61
  end
57
62
  end
58
63
  end
@@ -31,12 +31,15 @@ module Zold
31
31
  class Remotes
32
32
  PORT = 4096
33
33
 
34
- def initialize(file)
35
- @file = file
34
+ # Empty, for standalone mode
35
+ class Empty
36
+ def all
37
+ []
38
+ end
36
39
  end
37
40
 
38
- def total
39
- load.length
41
+ def initialize(file)
42
+ @file = file
40
43
  end
41
44
 
42
45
  def all
@@ -56,7 +59,8 @@ module Zold
56
59
  end
57
60
 
58
61
  def exists?(host, port = Remotes::PORT)
59
- !load.find { |r| r[:host] == host && r[:port] == port }.nil?
62
+ raise 'Port has to be of type Integer' unless port.is_a?(Integer)
63
+ !load.find { |r| r[:host] == host.downcase && r[:port] == port }.nil?
60
64
  end
61
65
 
62
66
  def add(host, port = Remotes::PORT)
@@ -64,7 +68,7 @@ module Zold
64
68
  raise 'Port can\'t be negative' if port < 0
65
69
  raise 'Port can\'t be over 65536' if port > 0xffff
66
70
  list = load
67
- list << { host: host, port: port, score: 0 }
71
+ list << { host: host.downcase, port: port, score: 0 }
68
72
  list.uniq! { |r| "#{r[:host]}:#{r[:port]}" }
69
73
  save(list)
70
74
  end
@@ -72,20 +76,20 @@ module Zold
72
76
  def remove(host, port = Remotes::PORT)
73
77
  raise 'Port has to be of type Integer' unless port.is_a?(Integer)
74
78
  list = load
75
- list.reject! { |r| r[:host] == host && r[:port] == port }
79
+ list.reject! { |r| r[:host] == host.downcase && r[:port] == port }
76
80
  save(list)
77
81
  end
78
82
 
79
83
  def score(host, port = Remotes::PORT)
80
84
  raise 'Port has to be of type Integer' unless port.is_a?(Integer)
81
- load.find { |r| r[:host] == host && r[:port] == port }[:score]
85
+ load.find { |r| r[:host] == host.downcase && r[:port] == port }[:score]
82
86
  end
83
87
 
84
88
  def rescore(host, port, score)
85
89
  raise 'Port has to be of type Integer' unless port.is_a?(Integer)
86
90
  list = load
87
91
  list.find do |r|
88
- r[:host] == host && r[:port] == port
92
+ r[:host] == host.downcase && r[:port] == port
89
93
  end[:score] = score
90
94
  save(list)
91
95
  end
@@ -23,5 +23,5 @@
23
23
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
24
24
  # License:: MIT
25
25
  module Zold
26
- VERSION = '0.4.1'.freeze
26
+ VERSION = '0.4.2'.freeze
27
27
  end
@@ -54,10 +54,12 @@ class TestMerge < Minitest::Test
54
54
  copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
55
55
  copies.add(File.read(first.path), 'host-1', 80, 5)
56
56
  copies.add(File.read(second.path), 'host-2', 80, 5)
57
- Zold::Merge.new(
57
+ modified = Zold::Merge.new(
58
58
  wallets: Zold::Wallets.new(dir),
59
59
  copies: copies.root
60
60
  ).run([id.to_s])
61
+ assert(1, modified.count)
62
+ assert(id, modified[0])
61
63
  end
62
64
  end
63
65
 
@@ -78,10 +80,12 @@ class TestMerge < Minitest::Test
78
80
  copies = Zold::Copies.new(File.join(dir, "copies/#{id}"))
79
81
  copies.add(File.read(first.path), 'host-1', 80, 5)
80
82
  copies.add(File.read(second.path), 'host-2', 80, 5)
81
- Zold::Merge.new(
83
+ modified = Zold::Merge.new(
82
84
  wallets: Zold::Wallets.new(dir),
83
85
  copies: copies.root
84
86
  ).run([id.to_s])
87
+ assert(1, modified.count)
88
+ assert(id, modified[0])
85
89
  end
86
90
  end
87
91
  end
@@ -52,7 +52,7 @@ class TestPatch < Minitest::Test
52
52
  patch.join(second)
53
53
  patch.join(third)
54
54
  FileUtils.rm(first.path)
55
- patch.save(first.path)
55
+ assert_equal(true, patch.save(first.path))
56
56
  assert_equal(Zold::Amount.new(zld: -53), first.balance)
57
57
  end
58
58
  end
@@ -34,7 +34,7 @@ class TestRemotes < Minitest::Test
34
34
  remotes = Zold::Remotes.new(file)
35
35
  remotes.add('127.0.0.1')
36
36
  remotes.add('127.0.0.1')
37
- assert(remotes.total == 1, "#{remotes.total} is not equal to 1")
37
+ assert(1, remotes.all.count)
38
38
  end
39
39
  end
40
40
 
@@ -44,9 +44,9 @@ class TestRemotes < Minitest::Test
44
44
  FileUtils.touch(file)
45
45
  remotes = Zold::Remotes.new(file)
46
46
  remotes.add('127.0.0.1')
47
- remotes.add('localhost', 433)
47
+ remotes.add('LOCALHOST', 433)
48
48
  remotes.remove('localhost', 433)
49
- assert(remotes.total == 1, "#{remotes.total} is not equal to 1")
49
+ assert(1, remotes.all.count)
50
50
  end
51
51
  end
52
52
 
@@ -55,7 +55,7 @@ class TestRemotes < Minitest::Test
55
55
  remotes = Zold::Remotes.new(File.join(dir, 'remotes'))
56
56
  remotes.clean
57
57
  remotes.reset
58
- assert(!remotes.total.zero?)
58
+ assert(!remotes.all.empty?)
59
59
  end
60
60
  end
61
61
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zold
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko