zold 0.2 → 0.3

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -1
  3. data/bin/zold +21 -81
  4. data/fixtures/keys/1.pub +1 -0
  5. data/fixtures/keys/2 +51 -0
  6. data/fixtures/keys/2.pub +1 -0
  7. data/fixtures/scripts/print-helps.sh +15 -0
  8. data/fixtures/scripts/push-and-pull.sh +7 -3
  9. data/lib/zold/commands/clean.rb +24 -7
  10. data/lib/zold/commands/create.rb +16 -4
  11. data/lib/zold/commands/diff.rb +32 -9
  12. data/lib/zold/commands/fetch.rb +36 -9
  13. data/lib/zold/commands/invoice.rb +64 -0
  14. data/lib/zold/commands/list.rb +1 -1
  15. data/lib/zold/commands/merge.rb +31 -10
  16. data/lib/zold/commands/node.rb +6 -2
  17. data/lib/zold/commands/pay.rb +40 -17
  18. data/lib/zold/commands/propagate.rb +34 -14
  19. data/lib/zold/commands/push.rb +27 -9
  20. data/lib/zold/commands/remote.rb +63 -34
  21. data/lib/zold/commands/show.rb +34 -9
  22. data/lib/zold/copies.rb +4 -0
  23. data/lib/zold/http.rb +1 -1
  24. data/lib/zold/key.rb +17 -11
  25. data/lib/zold/node/farm.rb +8 -0
  26. data/lib/zold/node/front.rb +13 -3
  27. data/lib/zold/patch.rb +8 -8
  28. data/lib/zold/prefixes.rb +53 -0
  29. data/lib/zold/remotes.rb +6 -0
  30. data/lib/zold/score.rb +4 -4
  31. data/lib/zold/signature.rb +9 -9
  32. data/lib/zold/txn.rb +111 -0
  33. data/lib/zold/version.rb +1 -1
  34. data/lib/zold/wallet.rb +32 -59
  35. data/lib/zold/wallets.rb +2 -2
  36. data/test/commands/test_clean.rb +5 -4
  37. data/test/commands/test_create.rb +3 -3
  38. data/test/commands/test_diff.rb +16 -15
  39. data/test/commands/test_fetch.rb +13 -11
  40. data/test/commands/test_invoice.rb +46 -0
  41. data/test/commands/test_list.rb +4 -4
  42. data/test/commands/test_merge.rb +21 -22
  43. data/test/commands/test_node.rb +9 -9
  44. data/test/commands/test_pay.rb +12 -12
  45. data/test/commands/test_remote.rb +11 -11
  46. data/test/commands/test_show.rb +9 -7
  47. data/test/node/fake_node.rb +3 -3
  48. data/test/node/test_farm.rb +1 -1
  49. data/test/node/test_front.rb +6 -6
  50. data/test/test_amount.rb +1 -1
  51. data/test/test_copies.rb +1 -1
  52. data/test/test_http.rb +1 -1
  53. data/test/test_id.rb +1 -1
  54. data/test/test_key.rb +19 -1
  55. data/test/test_patch.rb +11 -11
  56. data/test/test_prefixes.rb +46 -0
  57. data/test/test_remotes.rb +1 -1
  58. data/test/test_score.rb +1 -1
  59. data/test/test_signature.rb +9 -11
  60. data/test/test_wallet.rb +22 -21
  61. data/test/test_wallets.rb +4 -4
  62. metadata +12 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dacc55ede1e95bcc4a68e0465956222384e56dfa
4
- data.tar.gz: dc19e682137b6ea95c7d84f356bfbed274b5d15d
3
+ metadata.gz: a1bcd34bba59aafa0887d0d1901844373598806a
4
+ data.tar.gz: cdc027656c02317a0087311135a89ea9d211a02a
5
5
  SHA512:
6
- metadata.gz: d3ce870271599965d9647053d6510c8fafdc6b17cc8c10d6b11dbeeac97514b48d263faac20a3b05fbf0aa983752a4c2b8a2a7bef233de435d836bc29bd96d63
7
- data.tar.gz: 41f5d7a05d611188cbc8ee970f908d716b2b9651157ab1fa4df093e8b16622b26742e829fd07d57bb34f38c7717477065c6669ac1a7364899d7eb2410f9dc2aa
6
+ metadata.gz: abc7efeaf98c35608460d912a23c7d65b8b67b1bf9f6e5e5bdaea319f1c948873ac5280a66e6cee0417d3eb1e6bb99b46a24be98c42f8c295b4f0d6fb3464f2f
7
+ data.tar.gz: 24b68ba90828a813e8c287b277bc9d1f599b8c4e15f3916aa85da6497d0deabc32ec67e24b7feab8f38dbd21fd994dbd6e1ac43f0678c631a8ea423cba0cb9fd
data/README.md CHANGED
@@ -67,7 +67,9 @@ $ zold --help
67
67
  You will need PGP keys in `~/.ssh`. To generate them, if you don't have them
68
68
  yet, you can run:
69
69
 
70
-
70
+ ```bash
71
+ ssh-keygen -t rsa -b 4096
72
+ ```
71
73
 
72
74
  ## Glossary
73
75
 
data/bin/zold CHANGED
@@ -54,12 +54,16 @@ Available commands:
54
54
  Remove expired local copies
55
55
  #{Rainbow('merge').green} [ID...]
56
56
  Merge remote copies with the HEAD
57
+ #{Rainbow('propagate').green} [ID...]
58
+ Propagate transactions to receiving wallets
57
59
  #{Rainbow('pull').green} [ID...]
58
60
  Fetch and then merge
59
61
  #{Rainbow('show').green} [ID...]
60
62
  Show all available information about the wallet
61
- #{Rainbow('pay').green} source target amount details
63
+ #{Rainbow('pay').green} from to amount details
62
64
  Pay ZOLD from one wallet to another
65
+ #{Rainbow('invoice').green} ID
66
+ Generate invoice unique ID for a payment
63
67
  #{Rainbow('status').green}
64
68
  Show status of local copies
65
69
  #{Rainbow('push').green} [ID...]
@@ -120,107 +124,43 @@ Available options:"
120
124
  ).run(args)
121
125
  when 'remote'
122
126
  require_relative '../lib/zold/commands/remote'
123
- Zold::Remote.new(
124
- remotes: remotes,
125
- log: log
126
- ).run(args)
127
+ Zold::Remote.new(remotes: remotes, log: log).run(args)
128
+ when 'invoice'
129
+ require_relative '../lib/zold/commands/invoice'
130
+ Zold::Invoice.new(wallets: wallets, log: log).run(args)
127
131
  when 'pay'
128
- raise "Payer wallet ID is required" if args[0].nil?
129
- raise "Recepient wallet ID is required" if args[1].nil?
130
- raise "Amount is required (in Zolds)" if args[2].nil?
131
132
  require_relative '../lib/zold/commands/pay'
132
133
  Zold::Pay.new(
133
- payer: wallets.find(Zold::Id.new(args[0])),
134
- receiver: Zold::Id.new(args[1]),
135
- amount: Zold::Amount.new(zld: args[2].to_f),
136
- details: opts.arguments[4] ? args[3] : '-',
134
+ wallets: wallets,
137
135
  pvtkey: Zold::Key.new(file: opts['private-key']),
138
136
  log: log
139
137
  ).run(args)
140
138
  when 'show'
141
- if args[0].nil?
142
- require_relative '../lib/zold/commands/list'
143
- Zold::List.new(
144
- wallets: wallets,
145
- log: log
146
- ).run(args)
147
- else
148
- require_relative '../lib/zold/commands/show'
149
- args.each do |id|
150
- Zold::Show.new(
151
- wallet: wallets.find(Zold::Id.new(id)),
152
- log: log
153
- ).run(args)
154
- end
155
- end
139
+ require_relative '../lib/zold/commands/show'
140
+ Zold::Show.new(wallets: wallets, log: log).run(args)
156
141
  when 'fetch'
157
142
  require_relative '../lib/zold/commands/fetch'
158
- args.each do |id|
159
- Zold::Fetch.new(
160
- id: Zold::Id.new(id),
161
- remotes: remotes,
162
- copies: Zold::Copies.new(File.join(copies, id)),
163
- log: log
164
- ).run(args)
165
- end
143
+ Zold::Fetch.new(remotes: remotes, copies: copies, log: log).run(args)
166
144
  when 'clean'
167
145
  require_relative '../lib/zold/commands/clean'
168
- if args.empty?
169
- args = Dir.new(copies).select { |f| f =~ /[0-9a-fA-F]{16}/ }
170
- end
171
- args.each do |id|
172
- Zold::Clean.new(
173
- copies: Zold::Copies.new(File.join(copies, id)),
174
- log: log
175
- ).run(args)
176
- end
146
+ Zold::Clean.new(copies: copies, log: log).run(args)
177
147
  when 'diff'
178
148
  require_relative '../lib/zold/commands/diff'
179
- args.each do |id|
180
- Zold::Diff.new(
181
- wallet: wallets.find(Zold::Id.new(id)),
182
- copies: Zold::Copies.new(File.join(copies, id)),
183
- log: log
184
- ).run(args)
185
- end
149
+ Zold::Diff.new(wallets: wallets, copies: copies, log: log).run(args)
186
150
  when 'merge'
187
151
  require_relative '../lib/zold/commands/merge'
152
+ Zold::Merge.new(wallets: wallets, copies: copies, log: log).run(args)
153
+ when 'propagate'
188
154
  require_relative '../lib/zold/commands/propagate'
189
- args.each do |id|
190
- Zold::Merge.new(
191
- wallet: wallets.find(Zold::Id.new(id)),
192
- copies: Zold::Copies.new(File.join(copies, id)),
193
- log: log
194
- ).run(args)
195
- Zold::Propagate.new(
196
- wallet: wallets.find(Zold::Id.new(id)),
197
- wallets: wallets,
198
- log: log
199
- ).run(args)
200
- end
155
+ Zold::Propagate.new(wallets: wallets, log: log).run(args)
201
156
  when 'pull'
202
157
  require_relative '../lib/zold/commands/fetch'
158
+ Zold::Fetch.new(remotes: remotes, copies: copies, log: log).run(args)
203
159
  require_relative '../lib/zold/commands/merge'
204
- args.each do |id|
205
- Zold::Fetch.new(
206
- id: Zold::Id.new(id),
207
- remotes: remotes,
208
- copies: Zold::Copies.new(File.join(copies, id)),
209
- log: log
210
- ).run(args)
211
- Zold::Merge.new(
212
- wallet: wallets.find(Zold::Id.new(id)),
213
- copies: Zold::Copies.new(File.join(copies, id)),
214
- log: log
215
- ).run(args)
216
- end
160
+ Zold::Merge.new(wallets: wallets, copies: copies, log: log).run(args)
217
161
  when 'push'
218
162
  require_relative '../lib/zold/commands/push'
219
- Zold::Push.new(
220
- wallet: wallets.find(Zold::Id.new(args[0])),
221
- remotes: remotes,
222
- log: log
223
- ).run(args)
163
+ Zold::Push.new(wallets: wallets, remotes: remotes, log: log).run(args)
224
164
  when 'score'
225
165
  require_relative '../lib/zold/score'
226
166
  if args.length != 3
@@ -0,0 +1 @@
1
+ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDFCn75hNu6+tmqn6NWtqrbN87WvlfRmGlyrUY0OLdofydrNUqEfhBzU+jPlYVM4TaMGs3mPxrhXbXhfEngZihzkQ08MJ/Sez0ecDMTsubsEVN6kDEQ3pPoCWo3YGHSsPQ8XYrufQMeqh/oCFlqXaLX5CLgjNk3q384mmdN/94JDpmsX+6nLdwhXRmgDQYSBZBJBq4nAgrjY0GC/g/k0GMshahI204xbNOlmqOvj8k2C7XYmTWAMEDtQMFedqIGHOw9dB2n6VOvLiVnfJty/u/HRuyHtZFYLt1/qhBhwousoD2gJKh7DJoOvzSnOMlIJ6TiIucx0PPR4co7Ioc2UOdjfV+srG3wte2bo48Hlbodt7AaVCJAoBldBws1+y2QkHKL+2qTIcqo0ucVEPISHT5fqA43U2njEh807pyG2oAq9BagzDKi6UgO1/4OOjsjJ+zaWAKtxjA9D8gH6JK5AG15eMhVOk4QhcWyQMNd1Wnrn6x8evkbrbbR+CoY9z1/jMBwFris9jR4OgEtNeQnahwkk24Ny21ibNZA37Yuo1I6/Fruy1FhbguIfOpoXH3MWJSWc6X91n6Fo2rTdQtPxy8KMr4bw7FYHw6iMTuVMJWuuqZQ+nADfQwxv+MxDRvLPOUSknmERjzFCO6MIPMZPZSvUmIhyYwojdXaaiMYIJYAMw== hi@example.com
data/fixtures/keys/2 ADDED
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDKJ9nvtA0t8Tek3nK25z0rh/vph1MBulQ2mbuglJpnunc1KiMuc3y1Lfwv9U5EKbIf/UB7dHh4lxSHviVKPzs5jXXDBLaiOOEQAga0mW+4OjZfxt3sMyoq3enMN3kY8/OXT/CySkSfj7bF6pdyxn9zq6OT+lSoV8bgYWDF6y1iNuV5uNSUdG0jP3ct0MxnTOyXeUhZ3vrJ2hRp/N5HEXzqg8e8zy//xB4ncLclG7WCui39Y9dHmatR47qG2yQMOei4Pcwbh3Lzqw9Kntw6HYYMcf1HrhLX7VTLMFBQtxnjxXXfCuVboEMDp9Dt7YHPNuVCTvmnj/xB3xIOFZkTNPQfdx0kH2JsQknjDZPOl/goV3rcBrbS1pqiCFOCro2WhBhWUxW0QeILDDMcFn1S11iuJTmrGZNXV2Hh8ATF//BUkShPcC3MS3KUHKjo7rXzg8C5uhscM6UiWWkRZLLiC3k7q562l4LUzMnR5+bR5yE5d/rF6wWI6DPoiXPnFoP+UbcZ96IBRA3tk1bz68LPGK4PpiPcXjA6T8Bud3MdOEzhfIPWUxqno9RXpwNfryrqsCfkVTzTDHoNLgDHoTY5FDk5PWOlx3dw8Rc1JAPEqAcdagm7Cgeak/cjV0JVbTxQb3RXOqdPBTnacIm6HNEWcbjnQvx29/8U9RCkd0vPfJWpRQ== yegor256@gmail.com
@@ -0,0 +1,15 @@
1
+ #!/bin/bash
2
+ set -x
3
+ set -e
4
+ shopt -s expand_aliases
5
+
6
+ alias zold="$1"
7
+
8
+ zold --help
9
+ declare -a commands=(node create invoice remote pay show fetch clean diff merge propagate pull push)
10
+ for c in "${commands[@]}"
11
+ do
12
+ zold --trace $c --help
13
+ done
14
+
15
+ echo 'DONE'
@@ -23,13 +23,17 @@ zold remote add localhost ${port}
23
23
  zold remote show
24
24
 
25
25
  zold --public-key id_rsa.pub create 0000000000000000
26
- zold --private-key id_rsa --trace pay 0000000000000000 af5788fcadd710c5 14.99 'To save the world!'
26
+ target=`zold --public-key id_rsa.pub create`
27
+ invoice=`zold invoice ${target}`
28
+ zold --private-key id_rsa pay 0000000000000000 ${invoice} 14.99 'To save the world!'
29
+ zold propagate 0000000000000000
27
30
  zold show
28
31
  zold show 0000000000000000
29
32
 
30
33
  zold push 0000000000000000
31
- zold fetch 0000000000000000
34
+ zold fetch 0000000000000000 --ignore-score-weakness
32
35
  zold diff 0000000000000000
33
- zold --trace merge 0000000000000000
36
+ zold merge 0000000000000000
37
+ zold clean 0000000000000000
34
38
 
35
39
  echo 'DONE'
@@ -21,9 +21,10 @@
21
21
  require 'uri'
22
22
  require 'json'
23
23
  require 'time'
24
- require_relative '../log.rb'
25
- require_relative '../http.rb'
26
- require_relative '../score.rb'
24
+ require_relative '../log'
25
+ require_relative '../http'
26
+ require_relative '../score'
27
+ require_relative '../copies'
27
28
 
28
29
  # CLEAN command.
29
30
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -37,10 +38,26 @@ module Zold
37
38
  @log = log
38
39
  end
39
40
 
40
- def run(_ = [])
41
- @copies.clean
42
- @log.debug("Expired local copies removed for #{@copies}, \
43
- #{@copies.all.count} left")
41
+ def run(args = [])
42
+ opts = Slop.parse(args, help: true) do |o|
43
+ o.banner = "Usage: zold clean [ID...] [options]
44
+ Available options:"
45
+ o.bool '--help', 'Print instructions'
46
+ end
47
+ if opts.help?
48
+ @log.info(opts.to_s)
49
+ return
50
+ end
51
+ raise 'At least one wallet ID is required' if opts.arguments.empty?
52
+ opts.arguments.each do |id|
53
+ clean(Copies.new(File.join(@copies, id)), opts)
54
+ end
55
+ end
56
+
57
+ def clean(cps, _)
58
+ cps.clean
59
+ @log.debug("Expired local copies removed for #{cps}, \
60
+ #{cps.all.count} left")
44
61
  end
45
62
  end
46
63
  end
@@ -18,9 +18,9 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
19
  # SOFTWARE.
20
20
 
21
- require_relative '../wallet.rb'
22
- require_relative '../log.rb'
23
- require_relative '../id.rb'
21
+ require_relative '../wallet'
22
+ require_relative '../log'
23
+ require_relative '../id'
24
24
 
25
25
  # CREATE command.
26
26
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -36,7 +36,19 @@ module Zold
36
36
  end
37
37
 
38
38
  def run(args = [])
39
- id = args.empty? ? Id.new : Id.new(args[0])
39
+ opts = Slop.parse(args, help: true) do |o|
40
+ o.banner = "Usage: zold create [options]
41
+ Available options:"
42
+ o.bool '--help', 'Print instructions'
43
+ end
44
+ if opts.help?
45
+ @log.info(opts.to_s)
46
+ return
47
+ end
48
+ create(opts.arguments.empty? ? Id.new : Id.new(opts.arguments[0]), opts)
49
+ end
50
+
51
+ def create(id, _)
40
52
  wallet = @wallets.find(id)
41
53
  wallet.init(id, @pubkey)
42
54
  @log.info(wallet.id)
@@ -19,10 +19,11 @@
19
19
  # SOFTWARE.
20
20
 
21
21
  require 'tempfile'
22
+ require 'slop'
22
23
  require 'diffy'
23
- require_relative '../log.rb'
24
- require_relative '../patch.rb'
25
- require_relative '../wallet.rb'
24
+ require_relative '../log'
25
+ require_relative '../patch'
26
+ require_relative '../wallet'
26
27
 
27
28
  # DIFF command.
28
29
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -31,21 +32,43 @@ require_relative '../wallet.rb'
31
32
  module Zold
32
33
  # DIFF pulling command
33
34
  class Diff
34
- def initialize(wallet:, copies:, log: Log::Quiet.new)
35
- @wallet = wallet
35
+ def initialize(wallets:, copies:, log: Log::Quiet.new)
36
+ @wallets = wallets
36
37
  @copies = copies
37
38
  @log = log
38
39
  end
39
40
 
40
- def run(_ = [])
41
- raise 'There are no remote copies, try FETCH first' if @copies.all.empty?
42
- cps = @copies.all.sort_by { |c| c[:score] }.reverse
41
+ def run(args = [])
42
+ opts = Slop.parse(args, help: true) do |o|
43
+ o.banner = "Usage: zold diff [ID...] [options]
44
+ Available options:"
45
+ o.bool '--help', 'Print instructions'
46
+ end
47
+ if opts.help?
48
+ @log.info(opts.to_s)
49
+ return
50
+ end
51
+ raise 'At least one wallet ID is required' if opts.arguments.empty?
52
+ stdout = ''
53
+ opts.arguments.each do |id|
54
+ stdout += diff(
55
+ @wallets.find(Id.new(id)),
56
+ Copies.new(File.join(@copies, id)),
57
+ opts
58
+ )
59
+ end
60
+ stdout
61
+ end
62
+
63
+ def diff(wallet, cps, _)
64
+ raise 'There are no remote copies, try FETCH first' if cps.all.empty?
65
+ cps = cps.all.sort_by { |c| c[:score] }.reverse
43
66
  patch = Patch.new
44
67
  patch.start(Wallet.new(cps[0][:path]))
45
68
  cps[1..-1].each do |c|
46
69
  patch.join(Wallet.new(c[:path]))
47
70
  end
48
- before = File.read(@wallet.path)
71
+ before = File.read(wallet.path)
49
72
  after = ''
50
73
  Tempfile.open do |f|
51
74
  patch.save(f, overwrite: true)
@@ -21,9 +21,11 @@
21
21
  require 'uri'
22
22
  require 'json'
23
23
  require 'time'
24
- require_relative '../log.rb'
25
- require_relative '../http.rb'
26
- require_relative '../score.rb'
24
+ require 'slop'
25
+ require_relative '../log'
26
+ require_relative '../http'
27
+ require_relative '../score'
28
+ require_relative '../copies'
27
29
 
28
30
  # FETCH command.
29
31
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -32,17 +34,35 @@ require_relative '../score.rb'
32
34
  module Zold
33
35
  # FETCH pulling command
34
36
  class Fetch
35
- def initialize(id:, remotes:, copies:, log: Log::Quiet.new)
36
- @id = id
37
+ def initialize(remotes:, copies:, log: Log::Quiet.new)
37
38
  @remotes = remotes
38
39
  @copies = copies
39
40
  @log = log
40
41
  end
41
42
 
42
- def run(_ = [])
43
+ def run(args = [])
44
+ opts = Slop.parse(args, help: true) do |o|
45
+ o.banner = "Usage: zold fetch [ID...] [options]
46
+ Available options:"
47
+ o.bool '--ignore-score-weakness',
48
+ 'Don\'t complain when their score is too weak',
49
+ default: false
50
+ o.bool '--help', 'Print instructions'
51
+ end
52
+ if opts.help?
53
+ @log.info(opts.to_s)
54
+ return
55
+ end
56
+ raise 'At least one wallet ID is required' if opts.arguments.empty?
57
+ opts.arguments.each do |id|
58
+ fetch(id, Copies.new(File.join(@copies, id)), opts)
59
+ end
60
+ end
61
+
62
+ def fetch(id, cps, opts)
43
63
  total = 0
44
64
  @remotes.all.each do |r|
45
- uri = URI("#{r[:home]}wallet/#{@id}")
65
+ uri = URI("#{r[:home]}wallet/#{id}")
46
66
  res = Http.new(uri).get
47
67
  unless res.code == '200'
48
68
  @log.error("#{r[:host]}:#{r[:port]} \
@@ -60,15 +80,22 @@ module Zold
60
80
  @log.error("#{r[:host]}:#{r[:port]} invalid score")
61
81
  next
62
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
+ (<#{Score::STRENGTH})"
87
+ )
88
+ next
89
+ end
63
90
  total += 1
64
- @copies.add(json['body'], r[:host], r[:port], score.value)
91
+ cps.add(json['body'], r[:host], r[:port], score.value)
65
92
  @log.info(
66
93
  "#{r[:host]}:#{r[:port]} #{json['body'].length}b/\
67
94
  #{Rainbow(score.value).green} (v.#{json['version']})"
68
95
  )
69
96
  end
70
97
  @log.debug("#{total} copies fetched, \
71
- there are #{@copies.all.count} available locally")
98
+ there are #{cps.all.count} available locally")
72
99
  end
73
100
  end
74
101
  end
@@ -0,0 +1,64 @@
1
+ # Copyright (c) 2018 Yegor Bugayenko
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the 'Software'), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+
21
+ require 'slop'
22
+ require_relative '../log'
23
+ require_relative '../prefixes'
24
+
25
+ # INVOICE command.
26
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
27
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
28
+ # License:: MIT
29
+ module Zold
30
+ # Generate invoice
31
+ class Invoice
32
+ def initialize(wallets:, log: Log::Quiet.new)
33
+ @wallets = wallets
34
+ @log = log
35
+ end
36
+
37
+ def run(args = [])
38
+ opts = Slop.parse(args, help: true) do |o|
39
+ o.banner = "Usage: zold invoice ID [options]
40
+ Where:
41
+ 'ID' is the wallet ID of the money receiver
42
+ Available options:"
43
+ o.integer '--length',
44
+ 'The length of the invoice prefix (default: 8)',
45
+ default: 8
46
+ o.bool '--help', 'Print instructions'
47
+ end
48
+ if opts.help?
49
+ @log.info(opts.to_s)
50
+ return
51
+ end
52
+ raise 'Receiver wallet ID is required' if opts.arguments[0].nil?
53
+ wallet = @wallets.find(Zold::Id.new(opts.arguments[0]))
54
+ raise 'Wallet doesn\'t exist, do \'fetch\' first' unless wallet.exists?
55
+ invoice(wallet, opts)
56
+ end
57
+
58
+ def invoice(wallet, opts)
59
+ invoice = "#{Prefixes.new(wallet).create(opts[:length])}@#{wallet.id}"
60
+ @log.info(invoice)
61
+ invoice
62
+ end
63
+ end
64
+ end
@@ -18,7 +18,7 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
19
  # SOFTWARE.
20
20
 
21
- require_relative '../log.rb'
21
+ require_relative '../log'
22
22
 
23
23
  # LIST command.
24
24
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -18,9 +18,11 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
19
  # SOFTWARE.
20
20
 
21
- require_relative '../log.rb'
22
- require_relative '../wallet.rb'
23
- require_relative '../patch.rb'
21
+ require 'slop'
22
+ require_relative '../log'
23
+ require_relative '../id'
24
+ require_relative '../wallet'
25
+ require_relative '../patch'
24
26
 
25
27
  # MERGE command.
26
28
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -29,22 +31,41 @@ require_relative '../patch.rb'
29
31
  module Zold
30
32
  # MERGE pulling command
31
33
  class Merge
32
- def initialize(wallet:, copies:, log: Log::Quiet.new)
33
- @wallet = wallet
34
+ def initialize(wallets:, copies:, log: Log::Quiet.new)
35
+ @wallets = wallets
34
36
  @copies = copies
35
37
  @log = log
36
38
  end
37
39
 
38
- def run(_ = [])
39
- raise 'There are no remote copies, try FETCH first' if @copies.all.empty?
40
- cps = @copies.all.sort_by { |c| c[:score] }.reverse
40
+ def run(args = [])
41
+ opts = Slop.parse(args, help: true) do |o|
42
+ o.banner = "Usage: zold merge [ID...] [options]
43
+ Available options:"
44
+ o.bool '--help', 'Print instructions'
45
+ end
46
+ if opts.help?
47
+ @log.info(opts.to_s)
48
+ return
49
+ end
50
+ raise 'At least one wallet ID is required' if opts.arguments.empty?
51
+ opts.arguments.each do |id|
52
+ wallet = @wallets.find(Id.new(id))
53
+ merge(wallet, Copies.new(File.join(@copies, id)), opts)
54
+ require_relative 'propagate'
55
+ Propagate.new(wallets: @wallets, log: @log).run(args)
56
+ end
57
+ end
58
+
59
+ def merge(wallet, cps, _)
60
+ raise 'There are no remote copies, try FETCH first' if cps.all.empty?
61
+ cps = cps.all.sort_by { |c| c[:score] }.reverse
41
62
  patch = Patch.new
42
63
  patch.start(Wallet.new(cps[0][:path]))
43
64
  cps[1..-1].each do |c|
44
65
  patch.join(Wallet.new(c[:path]))
45
66
  end
46
- patch.save(@wallet.path, overwrite: true)
47
- @log.debug("Merged successfully into #{@wallet.path}")
67
+ patch.save(wallet.path, overwrite: true)
68
+ @log.debug("Merged successfully into #{wallet.path}")
48
69
  end
49
70
  end
50
71
  end
@@ -47,8 +47,8 @@ module Zold
47
47
  o.string '--home', 'Home directory (default: current directory)',
48
48
  default: Dir.pwd
49
49
  o.integer '--strength',
50
- "The strength of the score (default: #{Score::DEFAULT_STRENGTH})",
51
- default: Score::DEFAULT_STRENGTH
50
+ "The strength of the score (default: #{Score::STRENGTH})",
51
+ default: Score::STRENGTH
52
52
  o.integer '--threads',
53
53
  'How many threads to use for scores finding (default: 8)',
54
54
  default: 8
@@ -96,6 +96,10 @@ module Zold
96
96
  def debug(msg)
97
97
  @log.debug(msg)
98
98
  end
99
+
100
+ def debug?
101
+ @log.debug?
102
+ end
99
103
  end
100
104
  end
101
105
  end