zold 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/bin/zold +1 -1
- data/lib/zold/commands/fetch.rb +3 -3
- data/lib/zold/commands/node.rb +6 -4
- data/lib/zold/commands/remote.rb +20 -16
- data/lib/zold/node/front.rb +1 -1
- data/lib/zold/remotes.rb +6 -4
- data/lib/zold/score.rb +2 -1
- data/lib/zold/version.rb +1 -1
- data/test/commands/test_fetch.rb +21 -1
- data/test/commands/test_merge.rb +26 -0
- data/test/test_remotes.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fcd55eac89ac43ca95643798755ef3a9ead2e5d
|
4
|
+
data.tar.gz: 8a002e688b432c4f1ab1c728db82488c9d8e3b50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ebc8d2d233d646fe7f49c1b910a943b28353e52f4114f5b4fe6b8689481ac3823bfbe16b0e0a15a02406bcdafd444098e922dd021ae90a9af2314bd9dad708c
|
7
|
+
data.tar.gz: 7d6a387331acf862a6c47a0096547b019b865c367d0fd0c7d5d01c24167d974d23b6c8aa8e43d4fb66bd699c4c0c789d4261f9562e37ce8630bb931262b1118b
|
data/README.md
CHANGED
@@ -95,7 +95,7 @@ arbitrary text (has to match `[a-zA-Z0-9]+`) to the end of it and to calculate S
|
|
95
95
|
in the hexadecimal format, for example:
|
96
96
|
|
97
97
|
```
|
98
|
-
Input: "2017-07-19T21:24:51Z b1.zold.io
|
98
|
+
Input: "2017-07-19T21:24:51Z b1.zold.io 4096 the-suffix"
|
99
99
|
SHA-256: "eba36e52e1ee674d198f486e07c8496853ffc8879e7fe25329523177646a96a0"
|
100
100
|
```
|
101
101
|
|
@@ -104,7 +104,7 @@ SHA-256 hash that ends with `00000000` (eight zeros). For example, this
|
|
104
104
|
suffix `11edb424c` works (it took 212 minutes to find it on 2.3GHz Intel Core i7):
|
105
105
|
|
106
106
|
```
|
107
|
-
Input: "2017-07-19T21:24:51Z b1.zold.io
|
107
|
+
Input: "2017-07-19T21:24:51Z b1.zold.io 4096 11edb424c"
|
108
108
|
SHA-256: "34f48e0eee1ed12ad74cb39418f2f6e7442a776a7b6182697957650e00000000"
|
109
109
|
```
|
110
110
|
|
@@ -276,7 +276,7 @@ The directory `.zold` is automatically created and contains system data.
|
|
276
276
|
these columns:
|
277
277
|
|
278
278
|
* Address or IP;
|
279
|
-
*
|
279
|
+
* TCP port (usually 4096);
|
280
280
|
* Score (positive integer);
|
281
281
|
* Time of score update, ISO 8601.
|
282
282
|
|
data/bin/zold
CHANGED
@@ -155,7 +155,7 @@ Available options:"
|
|
155
155
|
require_relative '../lib/zold/commands/fetch'
|
156
156
|
args.each do |id|
|
157
157
|
Zold::Fetch.new(
|
158
|
-
|
158
|
+
id: Zold::Id.new(id),
|
159
159
|
remotes: remotes,
|
160
160
|
copies: Zold::Copies.new(File.join(copies, id)),
|
161
161
|
log: log
|
data/lib/zold/commands/fetch.rb
CHANGED
@@ -32,8 +32,8 @@ require_relative '../score.rb'
|
|
32
32
|
module Zold
|
33
33
|
# FETCH pulling command
|
34
34
|
class Fetch
|
35
|
-
def initialize(
|
36
|
-
@
|
35
|
+
def initialize(id:, remotes:, copies:, log: Log::Quiet.new)
|
36
|
+
@id = id
|
37
37
|
@remotes = remotes
|
38
38
|
@copies = copies
|
39
39
|
@log = log
|
@@ -42,7 +42,7 @@ module Zold
|
|
42
42
|
def run(_ = [])
|
43
43
|
total = 0
|
44
44
|
@remotes.all.each do |r|
|
45
|
-
uri = URI("#{r[:home]}wallet/#{@
|
45
|
+
uri = URI("#{r[:home]}wallet/#{@id}")
|
46
46
|
res = Http.new(uri).get
|
47
47
|
unless res.code == '200'
|
48
48
|
@log.error("#{r[:host]}:#{r[:port]} \
|
data/lib/zold/commands/node.rb
CHANGED
@@ -37,10 +37,12 @@ module Zold
|
|
37
37
|
def run(args = [])
|
38
38
|
opts = Slop.parse(args, help: true) do |o|
|
39
39
|
o.banner = 'Usage: zold node [options]'
|
40
|
-
o.integer '--port',
|
41
|
-
default:
|
42
|
-
|
43
|
-
|
40
|
+
o.integer '--port',
|
41
|
+
"TCP port to open for the Net (default: #{Remotes::PORT})",
|
42
|
+
default: Remotes::PORT
|
43
|
+
o.integer '--bind-port',
|
44
|
+
"TCP port to listen on (default: #{Remotes::PORT})",
|
45
|
+
default: Remotes::PORT
|
44
46
|
o.string '--host', 'Host name (default: 127.0.0.1)',
|
45
47
|
default: '127.0.0.1'
|
46
48
|
o.string '--home', 'Home directory (default: current directory)',
|
data/lib/zold/commands/remote.rb
CHANGED
@@ -40,6 +40,24 @@ module Zold
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def run(args = [])
|
43
|
+
opts = Slop.parse(args, help: true) do |o|
|
44
|
+
o.banner = "Usage: zold remote <command> [options]
|
45
|
+
Available commands:
|
46
|
+
#{Rainbow('remote show').green}
|
47
|
+
Show all registered remote nodes
|
48
|
+
#{Rainbow('remote clean').green}
|
49
|
+
Remove all registered remote nodes
|
50
|
+
#{Rainbow('remote reset').green}
|
51
|
+
Restore it back to the default list of nodes
|
52
|
+
#{Rainbow('remote add').green} host port
|
53
|
+
Add a new remote node
|
54
|
+
#{Rainbow('remote remove').green} host port
|
55
|
+
Remove the remote node
|
56
|
+
#{Rainbow('remote update').green}
|
57
|
+
Check each registered remote node for availability
|
58
|
+
Available options:"
|
59
|
+
o.bool '--help', 'Print instructions'
|
60
|
+
end
|
43
61
|
command = args[0]
|
44
62
|
case command
|
45
63
|
when 'show'
|
@@ -75,21 +93,7 @@ module Zold
|
|
75
93
|
@log.debug("There are #{total} known remotes")
|
76
94
|
end
|
77
95
|
else
|
78
|
-
@log.info(
|
79
|
-
"Available commands:
|
80
|
-
#{Rainbow('remote show').green}
|
81
|
-
Show all registered remote nodes
|
82
|
-
#{Rainbow('remote clean').green}
|
83
|
-
Remove all registered remote nodes
|
84
|
-
#{Rainbow('remote reset').green}
|
85
|
-
Restore it back to the default list of nodes
|
86
|
-
#{Rainbow('remote add').green} host port
|
87
|
-
Add a new remote node
|
88
|
-
#{Rainbow('remote remove').green} host port
|
89
|
-
Remove the remote node
|
90
|
-
#{Rainbow('remote update').green}
|
91
|
-
Check each registered remote node for availability"
|
92
|
-
)
|
96
|
+
@log.info(opts.to_s)
|
93
97
|
end
|
94
98
|
end
|
95
99
|
|
@@ -123,7 +127,7 @@ module Zold
|
|
123
127
|
@remotes.rescore(r[:host], r[:port], score.value)
|
124
128
|
json['all'].each do |s|
|
125
129
|
unless @remotes.exists?(s['host'], s['port'])
|
126
|
-
run(['add', s['host'], s['port']])
|
130
|
+
run(['add', s['host'], s['port'].to_s])
|
127
131
|
end
|
128
132
|
end
|
129
133
|
@log.info("#{r[:host]}:#{r[:port]}: #{Rainbow(score.value).green} \
|
data/lib/zold/node/front.rb
CHANGED
@@ -115,7 +115,7 @@ module Zold
|
|
115
115
|
wallet = wallets.find(id)
|
116
116
|
request.body.rewind
|
117
117
|
cps = copies(id)
|
118
|
-
cps.add(request.body.read, 'remote',
|
118
|
+
cps.add(request.body.read, 'remote', Remotes::PORT, 0)
|
119
119
|
Zold::Merge.new(wallet: wallet, copies: cps).run
|
120
120
|
"Success, #{wallet.id} balance is #{wallet.balance}"
|
121
121
|
end
|
data/lib/zold/remotes.rb
CHANGED
@@ -29,6 +29,8 @@ require 'fileutils'
|
|
29
29
|
module Zold
|
30
30
|
# All remotes
|
31
31
|
class Remotes
|
32
|
+
PORT = 4096
|
33
|
+
|
32
34
|
def initialize(file)
|
33
35
|
@file = file
|
34
36
|
end
|
@@ -53,24 +55,24 @@ module Zold
|
|
53
55
|
)
|
54
56
|
end
|
55
57
|
|
56
|
-
def exists?(host, port =
|
58
|
+
def exists?(host, port = Remotes::PORT)
|
57
59
|
!load.find { |r| r[:host] == host && r[:port] == port }.nil?
|
58
60
|
end
|
59
61
|
|
60
|
-
def add(host, port =
|
62
|
+
def add(host, port = Remotes::PORT)
|
61
63
|
list = load
|
62
64
|
list << { host: host, port: port, score: 0 }
|
63
65
|
list.uniq! { |r| "#{r[:host]}:#{r[:port]}" }
|
64
66
|
save(list)
|
65
67
|
end
|
66
68
|
|
67
|
-
def remove(host, port =
|
69
|
+
def remove(host, port = Remotes::PORT)
|
68
70
|
list = load
|
69
71
|
list.reject! { |r| r[:host] == host && r[:port] == port }
|
70
72
|
save(list)
|
71
73
|
end
|
72
74
|
|
73
|
-
def score(host, port =
|
75
|
+
def score(host, port = Remotes::PORT)
|
74
76
|
load.find { |r| r[:host] == host && r[:port] == port }[:score]
|
75
77
|
end
|
76
78
|
|
data/lib/zold/score.rb
CHANGED
@@ -20,6 +20,7 @@
|
|
20
20
|
|
21
21
|
require 'digest'
|
22
22
|
require 'time'
|
23
|
+
require_relative 'remotes'
|
23
24
|
|
24
25
|
# The score.
|
25
26
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
@@ -41,7 +42,7 @@ module Zold
|
|
41
42
|
@strength = strength
|
42
43
|
end
|
43
44
|
|
44
|
-
ZERO = Score.new(Time.now, 'localhost',
|
45
|
+
ZERO = Score.new(Time.now, 'localhost', Remotes::PORT)
|
45
46
|
|
46
47
|
def self.parse(text, strength: DEFAULT_STRENGTH)
|
47
48
|
_, time, host, port, suffixes = text.split(' ', 5)
|
data/lib/zold/version.rb
CHANGED
data/test/commands/test_fetch.rb
CHANGED
@@ -57,7 +57,27 @@ class TestFetch < Minitest::Test
|
|
57
57
|
)
|
58
58
|
remotes.add('fake-1', 80)
|
59
59
|
remotes.add('fake-2', 80)
|
60
|
-
Zold::Fetch.new(
|
60
|
+
Zold::Fetch.new(id: id, copies: copies, remotes: remotes).run
|
61
|
+
assert_equal(copies.all[0][:name], '1')
|
62
|
+
assert_equal(copies.all[0][:score], 0)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_fetches_empty_wallet
|
67
|
+
Dir.mktmpdir 'test' do |dir|
|
68
|
+
id = Zold::Id.new
|
69
|
+
copies = Zold::Copies.new(File.join(dir, 'copies'))
|
70
|
+
remotes = Zold::Remotes.new(File.join(dir, 'remotes.csv'))
|
71
|
+
remotes.clean
|
72
|
+
stub_request(:get, "http://fake-1/wallet/#{id}").to_return(
|
73
|
+
status: 200,
|
74
|
+
body: {
|
75
|
+
'score': Zold::Score::ZERO.to_h,
|
76
|
+
'body': 'the body'
|
77
|
+
}.to_json
|
78
|
+
)
|
79
|
+
remotes.add('fake-1', 80)
|
80
|
+
Zold::Fetch.new(id: id, copies: copies, remotes: remotes).run
|
61
81
|
assert_equal(copies.all[0][:name], '1')
|
62
82
|
assert_equal(copies.all[0][:score], 0)
|
63
83
|
end
|
data/test/commands/test_merge.rb
CHANGED
@@ -59,4 +59,30 @@ class TestMerge < Minitest::Test
|
|
59
59
|
Zold::Merge.new(wallet: wallet, copies: copies).run
|
60
60
|
end
|
61
61
|
end
|
62
|
+
|
63
|
+
def test_merges_into_empty_wallet
|
64
|
+
Dir.mktmpdir 'test' do |dir|
|
65
|
+
id = Zold::Id.new
|
66
|
+
file = File.join(dir, id.to_s)
|
67
|
+
wallet = Zold::Wallet.new(file)
|
68
|
+
wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
|
69
|
+
first = Zold::Wallet.new(File.join(dir, 'copy-1'))
|
70
|
+
File.write(first.path, File.read(wallet.path))
|
71
|
+
second = Zold::Wallet.new(File.join(dir, 'copy-2'))
|
72
|
+
File.write(second.path, File.read(wallet.path))
|
73
|
+
Zold::Pay.new(
|
74
|
+
payer: first,
|
75
|
+
receiver: second,
|
76
|
+
amount: Zold::Amount.new(zld: 14.95),
|
77
|
+
pvtkey: Zold::Key.new(file: 'fixtures/id_rsa')
|
78
|
+
).run(['--force'])
|
79
|
+
copies = Zold::Copies.new(File.join(dir, 'copies'))
|
80
|
+
copies.add(File.read(first.path), 'host-1', 80, 5)
|
81
|
+
copies.add(File.read(second.path), 'host-2', 80, 5)
|
82
|
+
Zold::Merge.new(
|
83
|
+
wallet: Zold::Wallet.new(File.join(dir, Zold::Id.new.to_s)),
|
84
|
+
copies: copies
|
85
|
+
).run
|
86
|
+
end
|
87
|
+
end
|
62
88
|
end
|
data/test/test_remotes.rb
CHANGED
@@ -66,7 +66,7 @@ class TestRemotes < Minitest::Test
|
|
66
66
|
remotes = Zold::Remotes.new(file)
|
67
67
|
remotes.add('127.0.0.1', 80)
|
68
68
|
remotes.rescore('127.0.0.1', 80, 15)
|
69
|
-
assert_equal(remotes.score('127.0.0.1'), 15)
|
69
|
+
assert_equal(remotes.score('127.0.0.1', 80), 15)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
end
|