zold 0.22.9 → 0.23.0

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
  SHA256:
3
- metadata.gz: 42d10a8522bef20fb7b2c55c247ecc7e5880ff8b54f3de789757a66f93ae5473
4
- data.tar.gz: 36961cafd7fb37eb88790efca940a8181b9ec57c42808bbb8b6a3d6766b70c44
3
+ metadata.gz: 95430a239fd73f041ab0fcff000ce6406b7d0ff89e4dc4b66b63c6aaa525967e
4
+ data.tar.gz: 592bf1dd34b5fbe895033565dd481b01cd4da65d4f92145f17008f8bbbac43f6
5
5
  SHA512:
6
- metadata.gz: 44792c5bec30388fd5cbaf793ab5a7ac6254aaf6e52ff2ee0574fb2d158144fc832e63bcd1c91bc349b3403e0931dc6b8db717570e4fd6ebd61be324e2574750
7
- data.tar.gz: c87eabcbd062862ef4538a50c1e4eb3da11e82bcbacb703e935e76ef3647934156f6e3d53f08171b1a753b2f953eb19ee243293d15b0cd44bdd9930714e37209
6
+ metadata.gz: 664086b5fac5d2ba9fc29fe4b31e5b6a3d542c6a314e9ec91cefeed825460b703bf8f85710e7104fb34ad9ea401b9c2d10fe46d80cfc4b7672f3c584590841b3
7
+ data.tar.gz: bcf469f972e7f2e2c960e19992a3c6d2fe098b2e1884d46bf5ffceb584c32559942a5c3aec42e0b0f5460cbd3afa83f824c2ca60b25d5d570d130d879fa70949
data/bin/zold CHANGED
@@ -81,6 +81,8 @@ Available commands:
81
81
  Remove expired local copies
82
82
  #{Rainbow('merge').green} [ID...] [options]
83
83
  Merge remote copies with the HEAD
84
+ #{Rainbow('rebase').green} [ID...] [options]
85
+ Rebase local copy of the wallet, removing all inconsistencies
84
86
  #{Rainbow('propagate').green} [ID...] [options]
85
87
  Propagate transactions to receiving wallets
86
88
  #{Rainbow('pull').green} [ID...] [options]
@@ -237,6 +239,9 @@ cmd = lambda do
237
239
  when 'merge'
238
240
  require_relative '../lib/zold/commands/merge'
239
241
  Zold::Merge.new(wallets: wallets, remotes: remotes, copies: copies, log: log).run(args)
242
+ when 'merge'
243
+ require_relative '../lib/zold/commands/rebase'
244
+ Zold::Rebase.new(wallets: wallets, log: log).run(args)
240
245
  when 'propagate'
241
246
  require_relative '../lib/zold/commands/propagate'
242
247
  Zold::Propagate.new(wallets: wallets, log: log).run(args)
@@ -56,6 +56,9 @@ module Zold
56
56
  # Raises when there are not enough successful nodes.
57
57
  class NoQuorum < StandardError; end
58
58
 
59
+ # Raises when the wallet wasn't found in all visible nodes.
60
+ class NotFound < StandardError; end
61
+
59
62
  def initialize(wallets:, remotes:, copies:, log: Log::NULL)
60
63
  @wallets = wallets
61
64
  @remotes = remotes
@@ -117,7 +120,8 @@ Available options:"
117
120
  end
118
121
  unless opts['quiet-if-absent']
119
122
  if done.value.zero?
120
- raise "No nodes out of #{nodes.value} have the wallet #{id}; run 'zold remote update' and try again"
123
+ raise NotFound, "No nodes out of #{nodes.value} have the wallet #{id}; \
124
+ run 'zold remote update' and try again"
121
125
  end
122
126
  if masters.value.zero? && !opts['tolerate-edges']
123
127
  raise EdgesOnly, "There are only edge nodes, run 'zold remote update' or use --tolerate-edges"
@@ -37,7 +37,7 @@ require_relative '../patch'
37
37
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
38
38
  # License:: MIT
39
39
  module Zold
40
- # MERGE pulling command
40
+ # MERGE command
41
41
  class Merge
42
42
  prepend ThreadBadge
43
43
 
@@ -128,12 +128,16 @@ into #{@wallets.acq(id, &:mnemo)} in #{Age.new(start, limit: 0.1 + cps.count * 0
128
128
  start = Time.now
129
129
  @log.debug("Building a patch for #{wallet.id} from remote copy ##{name} with #{wallet.mnemo}...")
130
130
  if opts['shallow']
131
- patch.join(wallet)
131
+ patch.join(wallet) do |txn|
132
+ @log.debug("Paying wallet #{txn.bnf} file is absent but it's a \"shallow\" MERGE: #{txn.to_text}")
133
+ false
134
+ end
132
135
  else
133
- patch.join(wallet) do |id|
136
+ patch.join(wallet) do |txn|
134
137
  Pull.new(wallets: @wallets, remotes: @remotes, copies: @copies, log: @log).run(
135
- ['pull', id.to_s, "--network=#{opts['network']}", '--shallow']
138
+ ['pull', txn.bnf.to_s, "--network=#{opts['network']}", '--shallow']
136
139
  )
140
+ true
137
141
  end
138
142
  end
139
143
  @log.debug("Copy ##{name} of #{wallet.id} merged in #{Age.new(start)}: #{patch}")
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2018-2019 Zerocracy, Inc.
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'slop'
24
+ require 'rainbow'
25
+ require 'backtrace'
26
+ require_relative 'thread_badge'
27
+ require_relative 'args'
28
+ require_relative '../age'
29
+ require_relative '../log'
30
+ require_relative '../id'
31
+ require_relative '../wallet'
32
+ require_relative '../patch'
33
+
34
+ # REBASE command.
35
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
36
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
37
+ # License:: MIT
38
+ module Zold
39
+ # REBASE command
40
+ class Rebase
41
+ prepend ThreadBadge
42
+
43
+ def initialize(wallets:, log: Log::NULL)
44
+ @wallets = wallets
45
+ @log = log
46
+ end
47
+
48
+ # Returns the array of modified wallets (IDs)
49
+ def run(args = [])
50
+ opts = Slop.parse(args, help: true, suppress_errors: true) do |o|
51
+ o.banner = "Usage: zold rebase [ID...] [options]
52
+ Available options:"
53
+ o.bool '--help', 'Print instructions'
54
+ end
55
+ mine = Args.new(opts, @log).take || return
56
+ list = mine.empty? ? @wallets.all : mine.map { |i| Id.new(i) }
57
+ list.uniq.each do |id|
58
+ rebase(id, opts)
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def rebase(id, _)
65
+ start = Time.now
66
+ patch = Patch.new(@wallets, log: @log)
67
+ @wallets.acq(id) do |wallet|
68
+ patch.join(wallet) do |txn|
69
+ @log.debug("Paying wallet #{txn.bnf} file is absent: #{txn.to_text}")
70
+ false
71
+ end
72
+ @log.debug("Wallet #{wallet.mnemo} rebased in #{Age.new(start)}")
73
+ end
74
+ end
75
+ end
76
+ end
@@ -28,6 +28,7 @@ require_relative '../tax'
28
28
  require_relative '../age'
29
29
  require_relative '../commands/clean'
30
30
  require_relative '../commands/merge'
31
+ require_relative '../commands/rebase'
31
32
  require_relative '../commands/fetch'
32
33
  require_relative '../commands/push'
33
34
 
@@ -86,6 +87,7 @@ module Zold
86
87
  @log.info("Accepted #{id} in #{Age.new(start, limit: 1)} and not modified anything")
87
88
  else
88
89
  @log.info("Accepted #{id} in #{Age.new(start, limit: 1)} and modified #{modified.join(', ')}")
90
+ Rebase.new(wallets: @wallets, log: @log).run(['rebase'] + modified.map(&:to_s))
89
91
  end
90
92
  sec = (Time.now - start).round(2)
91
93
  @mutex.synchronize do
@@ -109,20 +109,15 @@ with a new one \"#{txn.to_text}\" from #{wallet.mnemo}")
109
109
  @log.error("Payment prefix '#{txn.prefix}' doesn't match with the key of #{wallet.id}: \"#{txn.to_text}\"")
110
110
  next
111
111
  end
112
- unless @wallets.acq(txn.bnf, &:exists?)
113
- if block_given?
114
- yield(txn.bnf)
115
- unless @wallets.acq(txn.bnf, &:exists?)
116
- @log.error("Paying wallet #{txn.bnf} file is absent even after PULL: \"#{txn.to_text}\"")
117
- next
118
- end
119
- unless @wallets.acq(txn.bnf) { |p| p.includes_negative?(txn.id, wallet.id) }
120
- @log.error("The beneficiary #{@wallets.acq(txn.bnf, &:mnemo)} of #{@id} \
112
+ if !@wallets.acq(txn.bnf, &:exists?) && yield(txn)
113
+ unless @wallets.acq(txn.bnf, &:exists?)
114
+ @log.error("Paying wallet #{txn.bnf} file is absent even after PULL: \"#{txn.to_text}\"")
115
+ next
116
+ end
117
+ unless @wallets.acq(txn.bnf) { |p| p.includes_negative?(txn.id, wallet.id) }
118
+ @log.error("The beneficiary #{@wallets.acq(txn.bnf, &:mnemo)} of #{@id} \
121
119
  doesn't have this transaction: \"#{txn.to_text}\"")
122
- next
123
- end
124
- else
125
- @log.debug("Paying wallet #{txn.bnf} file is absent but it's a \"shallow\" MERGE: #{txn.to_text}")
120
+ next
126
121
  end
127
122
  end
128
123
  end
@@ -25,7 +25,7 @@
25
25
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Zold
28
- VERSION = '0.22.9'
28
+ VERSION = '0.23.0'
29
29
  PROTOCOL = 2
30
30
  REPO = 'zold-io/zold'
31
31
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2018-2019 Zerocracy, Inc.
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'minitest/autorun'
24
+ require 'tmpdir'
25
+ require_relative '../test__helper'
26
+ require_relative '../fake_home'
27
+ require_relative '../../lib/zold/commands/rebase'
28
+
29
+ # REBASE test.
30
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
31
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
32
+ # License:: MIT
33
+ class TestRebase < Zold::Test
34
+ def test_rebases_wallet
35
+ FakeHome.new(log: test_log).run do |home|
36
+ wallet = home.create_wallet
37
+ Zold::Rebase.new(wallets: home.wallets, log: test_log).run(
38
+ ['rebase', wallet.id.to_s]
39
+ )
40
+ assert_equal(0, wallet.txns.count)
41
+ end
42
+ end
43
+ end
@@ -50,9 +50,9 @@ class TestPatch < Zold::Test
50
50
  t = third.sub(Zold::Amount.new(zld: 10.0), "NOPREFIX@#{Zold::Id.new}", key)
51
51
  third.add(t.inverse(Zold::Id.new))
52
52
  patch = Zold::Patch.new(home.wallets, log: test_log)
53
- patch.join(first)
54
- patch.join(second)
55
- patch.join(third)
53
+ patch.join(first) { false }
54
+ patch.join(second) { false }
55
+ patch.join(third) { false }
56
56
  assert_equal(true, patch.save(first.path, overwrite: true))
57
57
  assert_equal(Zold::Amount.new(zld: -53.0), first.balance)
58
58
  end
@@ -65,8 +65,8 @@ class TestPatch < Zold::Test
65
65
  IO.write(second.path, IO.read(first.path))
66
66
  second.add(Zold::Txn.new(1, Time.now, Zold::Amount.new(zld: 11.0), 'NOPREFIX', Zold::Id.new, 'fake'))
67
67
  patch = Zold::Patch.new(home.wallets, log: test_log)
68
- patch.join(first)
69
- patch.join(second)
68
+ patch.join(first) { false }
69
+ patch.join(second) { false }
70
70
  assert_equal(false, patch.save(first.path, overwrite: true))
71
71
  first.flush
72
72
  assert_equal(Zold::Amount::ZERO, first.balance)
@@ -82,8 +82,8 @@ class TestPatch < Zold::Test
82
82
  key = Zold::Key.new(file: 'fixtures/id_rsa')
83
83
  second.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
84
84
  patch = Zold::Patch.new(home.wallets, log: test_log)
85
- patch.join(first)
86
- patch.join(second)
85
+ patch.join(first) { false }
86
+ patch.join(second) { false }
87
87
  assert_equal(true, patch.save(first.path, overwrite: true))
88
88
  first.flush
89
89
  assert_equal(amount * -1, first.balance)
@@ -104,8 +104,8 @@ class TestPatch < Zold::Test
104
104
  )
105
105
  )
106
106
  patch = Zold::Patch.new(home.wallets, log: test_log)
107
- patch.join(first)
108
- patch.join(second)
107
+ patch.join(first) { false }
108
+ patch.join(second) { false }
109
109
  assert_equal(true, patch.save(first.path, overwrite: true))
110
110
  first.flush
111
111
  assert_equal(Zold::Amount.new(zld: 2.0).to_s, first.balance.to_s)
@@ -138,8 +138,8 @@ class TestPatch < Zold::Test
138
138
  ).signed(key, first.id)
139
139
  )
140
140
  patch = Zold::Patch.new(home.wallets, log: test_log)
141
- patch.join(first)
142
- patch.join(second)
141
+ patch.join(first) { false }
142
+ patch.join(second) { false }
143
143
  assert_equal(true, patch.save(first.path, overwrite: true))
144
144
  first.flush
145
145
  assert_equal(3, first.txns.count)
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.22.9
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-10 00:00:00.000000000 Z
11
+ date: 2019-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
@@ -620,6 +620,7 @@ files:
620
620
  - lib/zold/commands/propagate.rb
621
621
  - lib/zold/commands/pull.rb
622
622
  - lib/zold/commands/push.rb
623
+ - lib/zold/commands/rebase.rb
623
624
  - lib/zold/commands/remote.rb
624
625
  - lib/zold/commands/remove.rb
625
626
  - lib/zold/commands/routines/audit.rb
@@ -690,6 +691,7 @@ files:
690
691
  - test/commands/test_propagate.rb
691
692
  - test/commands/test_pull.rb
692
693
  - test/commands/test_push.rb
694
+ - test/commands/test_rebase.rb
693
695
  - test/commands/test_remote.rb
694
696
  - test/commands/test_remove.rb
695
697
  - test/commands/test_show.rb
@@ -751,7 +753,7 @@ licenses:
751
753
  - MIT
752
754
  metadata: {}
753
755
  post_install_message: |-
754
- Thanks for installing Zold 0.22.9!
756
+ Thanks for installing Zold 0.23.0!
755
757
  Study our White Paper: https://papers.zold.io/wp.pdf
756
758
  Read our blog posts: https://blog.zold.io
757
759
  Try ZLD online wallet at: https://wts.zold.io
@@ -799,6 +801,7 @@ test_files:
799
801
  - test/commands/test_propagate.rb
800
802
  - test/commands/test_pull.rb
801
803
  - test/commands/test_push.rb
804
+ - test/commands/test_rebase.rb
802
805
  - test/commands/test_remote.rb
803
806
  - test/commands/test_remove.rb
804
807
  - test/commands/test_show.rb