zold 0.16.6 → 0.16.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/zold/commands/remote.rb +2 -2
- data/lib/zold/commands/taxes.rb +3 -2
- data/lib/zold/http.rb +17 -21
- data/lib/zold/node/front.rb +11 -7
- data/lib/zold/remotes.rb +39 -31
- data/lib/zold/score.rb +47 -45
- data/lib/zold/tax.rb +5 -1
- data/lib/zold/version.rb +1 -1
- data/resources/remotes +6 -6
- data/test/node/fake_node.rb +1 -1
- data/test/node/test_front.rb +25 -25
- data/test/test_http.rb +8 -8
- data/test/test_remotes.rb +9 -0
- data/test/test_tax.rb +8 -0
- data/zold.gemspec +0 -2
- metadata +1 -30
- data/lib/zold/type.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a325af91de87bc2bd544f5d92a908eff34f4f114a88fa4cb9248ef286bff9404
|
4
|
+
data.tar.gz: 6e4fd9790fdcf55a23c206e60635c8fe6d45ad83eee4194697989b1f6bf5e51f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e827fbbefda31c28ad0fe24f23d5694d94997123f5163080a38ca8eee92c2048d4a0245b640896dab6210da8d2f22ac6dc325e3efe962b76cf3a714608534abe
|
7
|
+
data.tar.gz: 41ab159b3f635916fbb289384796e2fe5000aba409e86180248ec2903c684c86bd42642b357dd6e6d34b65b903df6648b4eda4938683cc9850880e3aaac0230a
|
data/lib/zold/commands/remote.rb
CHANGED
@@ -177,8 +177,8 @@ Available options:"
|
|
177
177
|
return
|
178
178
|
end
|
179
179
|
unless opts['skip-ping']
|
180
|
-
res = Http.new(uri: "http://#{host}:#{port}/version",
|
181
|
-
raise "The node #{host}:#{port} is not responding
|
180
|
+
res = Http.new(uri: "http://#{host}:#{port}/version", network: opts['network']).get
|
181
|
+
raise "The node #{host}:#{port} is not responding, #{res.code}:#{res.message}" unless res.code == '200'
|
182
182
|
end
|
183
183
|
@remotes.add(host, port)
|
184
184
|
@log.info("#{host}:#{port} added to the list, #{@remotes.all.count} total")
|
data/lib/zold/commands/taxes.rb
CHANGED
@@ -115,7 +115,8 @@ Available options:"
|
|
115
115
|
raise 'The wallet is absent' unless wallet.exists?
|
116
116
|
tax = Tax.new(wallet)
|
117
117
|
debt = tax.debt
|
118
|
-
@log.info("The current debt of #{wallet.id}/#{wallet.txns.count}t is #{debt} (#{debt.to_i} zents)
|
118
|
+
@log.info("The current debt of #{wallet.id}/#{wallet.txns.count}t is #{debt} (#{debt.to_i} zents), \
|
119
|
+
the balance is #{wallet.balance}: #{tax.to_text}")
|
119
120
|
unless tax.in_debt?
|
120
121
|
@log.debug("No need to pay taxes yet, while the debt is less than #{Tax::TRIAL} (#{Tax::TRIAL.to_i} zents)")
|
121
122
|
return
|
@@ -160,7 +161,7 @@ Available options:"
|
|
160
161
|
r.assert_valid_score(score)
|
161
162
|
r.assert_score_strength(score) unless opts['ignore-score-weakness']
|
162
163
|
r.assert_score_value(score, Tax::EXACT_SCORE)
|
163
|
-
@log.info("#{r}: #{Rainbow(score.value).green}")
|
164
|
+
@log.info("#{r}: #{Rainbow(score.value).green} to #{score.invoice}")
|
164
165
|
best << score
|
165
166
|
end
|
166
167
|
best.sort_by(&:value).reverse
|
data/lib/zold/http.rb
CHANGED
@@ -26,7 +26,7 @@ require 'timeout'
|
|
26
26
|
require 'net/http'
|
27
27
|
require 'backtrace'
|
28
28
|
require_relative 'version'
|
29
|
-
require_relative '
|
29
|
+
require_relative 'score'
|
30
30
|
|
31
31
|
# HTTP page.
|
32
32
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
@@ -34,7 +34,7 @@ require_relative 'type'
|
|
34
34
|
# License:: MIT
|
35
35
|
module Zold
|
36
36
|
# Http page
|
37
|
-
class Http
|
37
|
+
class Http
|
38
38
|
# HTTP header we add to each HTTP request, in order to inform
|
39
39
|
# the other node about the score. If the score is big enough,
|
40
40
|
# the remote node will add us to its list of remote nodes.
|
@@ -60,23 +60,19 @@ module Zold
|
|
60
60
|
# Connect timeout in seconds
|
61
61
|
CONNECT_TIMEOUT = 4
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
# solution
|
69
|
-
attribute :uri, (Types::Class.constructor { |v| v.is_a?(URI) ? v : URI(v) })
|
70
|
-
attribute :score, (Types::Class.constructor { |v| v.nil? ? Score::ZERO : v })
|
71
|
-
attribute :network, Types::Strict::String.optional.default('test')
|
63
|
+
def initialize(uri:, score: Score::ZERO, network: 'test')
|
64
|
+
@uri = uri.is_a?(URI) ? uri : URI(uri)
|
65
|
+
@score = score
|
66
|
+
@network = network
|
67
|
+
end
|
72
68
|
|
73
69
|
def get
|
74
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
75
|
-
http.use_ssl = uri.scheme == 'https'
|
70
|
+
http = Net::HTTP.new(@uri.host, @uri.port)
|
71
|
+
http.use_ssl = @uri.scheme == 'https'
|
76
72
|
http.read_timeout = Http::READ_TIMEOUT
|
77
73
|
http.open_timeout = Http::CONNECT_TIMEOUT
|
78
|
-
path = uri.path
|
79
|
-
path += '?' + uri.query if uri.query
|
74
|
+
path = @uri.path
|
75
|
+
path += '?' + @uri.query if @uri.query
|
80
76
|
Timeout.timeout(Http::READ_TIMEOUT + Http::CONNECT_TIMEOUT) do
|
81
77
|
http.request_get(path, headers)
|
82
78
|
end
|
@@ -85,12 +81,12 @@ module Zold
|
|
85
81
|
end
|
86
82
|
|
87
83
|
def put(body)
|
88
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
89
|
-
http.use_ssl = uri.scheme == 'https'
|
84
|
+
http = Net::HTTP.new(@uri.host, @uri.port)
|
85
|
+
http.use_ssl = @uri.scheme == 'https'
|
90
86
|
http.read_timeout = Http::READ_TIMEOUT
|
91
87
|
http.open_timeout = Http::CONNECT_TIMEOUT
|
92
|
-
path = uri.path
|
93
|
-
path += '?' + uri.query if uri.query
|
88
|
+
path = @uri.path
|
89
|
+
path += '?' + @uri.query if @uri.query
|
94
90
|
Timeout.timeout(Http::READ_TIMEOUT + Http::CONNECT_TIMEOUT) do
|
95
91
|
http.request_put(
|
96
92
|
path, body,
|
@@ -141,8 +137,8 @@ module Zold
|
|
141
137
|
}
|
142
138
|
headers[Http::VERSION_HEADER] = Zold::VERSION
|
143
139
|
headers[Http::PROTOCOL_HEADER] = Zold::PROTOCOL.to_s
|
144
|
-
headers[Http::NETWORK_HEADER] = network
|
145
|
-
headers[Http::SCORE_HEADER] = score.reduced(4).to_text if score.valid? &&
|
140
|
+
headers[Http::NETWORK_HEADER] = @network
|
141
|
+
headers[Http::SCORE_HEADER] = @score.reduced(4).to_text if @score.valid? && !@score.expired? && @score.value > 3
|
146
142
|
headers
|
147
143
|
end
|
148
144
|
end
|
data/lib/zold/node/front.rb
CHANGED
@@ -100,9 +100,7 @@ while #{settings.address} is in '#{settings.network}'")
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
check_header(Http::SCORE_HEADER) do |header|
|
103
|
-
|
104
|
-
settings.log.debug("#{request.url}: we are in standalone mode, won't update remotes")
|
105
|
-
end
|
103
|
+
settings.log.debug("#{request.url}: we are in standalone mode, won't update remotes") if all_remotes.empty?
|
106
104
|
s = Score.parse_text(header)
|
107
105
|
error(400, 'The score is invalid') unless s.valid?
|
108
106
|
error(400, 'The score is weak') if s.strength < Score::STRENGTH && !settings.ignore_score_weakness
|
@@ -195,8 +193,8 @@ in #{Age.new(@start, limit: 1)}")
|
|
195
193
|
load: settings.cache.get(:load, lifetime: 5 * 60) { Usagewatch.uw_load.to_f },
|
196
194
|
threads: "#{Thread.list.select { |t| t.status == 'run' }.count}/#{Thread.list.count}",
|
197
195
|
wallets: total_wallets,
|
198
|
-
remotes:
|
199
|
-
nscore:
|
196
|
+
remotes: all_remotes.count,
|
197
|
+
nscore: all_remotes.map { |r| r[:score] }.inject(&:+) || 0,
|
200
198
|
farm: settings.farm.to_json,
|
201
199
|
entrance: settings.entrance.to_json,
|
202
200
|
date: Time.now.utc.iso8601,
|
@@ -368,7 +366,7 @@ in #{Age.new(@start, limit: 1)}")
|
|
368
366
|
version: settings.version,
|
369
367
|
alias: settings.node_alias,
|
370
368
|
score: score.to_h,
|
371
|
-
all:
|
369
|
+
all: all_remotes,
|
372
370
|
mtime: settings.remotes.mtime.utc.iso8601
|
373
371
|
)
|
374
372
|
end
|
@@ -436,8 +434,14 @@ in #{Age.new(@start, limit: 1)}")
|
|
436
434
|
settings.wallets.all.count
|
437
435
|
end
|
438
436
|
|
437
|
+
def all_remotes
|
438
|
+
settings.cache.get(:remotes, lifetime: settings.network == Wallet::MAIN_NETWORK ? 60 : 0) do
|
439
|
+
settings.remotes.all
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
439
443
|
def score
|
440
|
-
settings.cache.get(:score, lifetime: settings.network == Wallet::MAIN_NETWORK ? 60 :
|
444
|
+
settings.cache.get(:score, lifetime: settings.network == Wallet::MAIN_NETWORK ? 60 : 0) do
|
441
445
|
b = settings.farm.best
|
442
446
|
raise 'Score is empty, there is something wrong with the Farm!' if b.empty?
|
443
447
|
b[0]
|
data/lib/zold/remotes.rb
CHANGED
@@ -32,7 +32,6 @@ require_relative 'age'
|
|
32
32
|
require_relative 'score'
|
33
33
|
require_relative 'http'
|
34
34
|
require_relative 'node/farm'
|
35
|
-
require_relative 'type'
|
36
35
|
|
37
36
|
# The list of remotes.
|
38
37
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
@@ -40,7 +39,7 @@ require_relative 'type'
|
|
40
39
|
# License:: MIT
|
41
40
|
module Zold
|
42
41
|
# All remotes
|
43
|
-
class Remotes
|
42
|
+
class Remotes
|
44
43
|
# The default TCP port all nodes are supposed to use.
|
45
44
|
PORT = 4096
|
46
45
|
|
@@ -50,9 +49,8 @@ module Zold
|
|
50
49
|
# Default number of nodes to fetch.
|
51
50
|
MAX_NODES = 16
|
52
51
|
|
53
|
-
|
54
|
-
|
55
|
-
attribute :timeout, Types::Strict::Integer.optional.default(16)
|
52
|
+
# Default nodes and their ports
|
53
|
+
DEFS = CSV.read(File.expand_path(File.join(File.dirname(__FILE__), '../../resources/remotes')))
|
56
54
|
|
57
55
|
# Empty, for standalone mode
|
58
56
|
class Empty
|
@@ -74,22 +72,22 @@ module Zold
|
|
74
72
|
end
|
75
73
|
|
76
74
|
# One remote.
|
77
|
-
class Remote
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
75
|
+
class Remote
|
76
|
+
def initialize(host:, port:, score:, idx:, network: 'test', log: Log::Quiet.new)
|
77
|
+
@host = host
|
78
|
+
@port = port
|
79
|
+
@score = score
|
80
|
+
@idx = idx
|
81
|
+
@network = network
|
82
|
+
@log = log
|
83
|
+
end
|
86
84
|
|
87
85
|
def http(path = '/')
|
88
|
-
Http.new(uri: "http://#{host}:#{port}#{path}", score: score, network: network)
|
86
|
+
Http.new(uri: "http://#{@host}:#{@port}#{path}", score: @score, network: @network)
|
89
87
|
end
|
90
88
|
|
91
89
|
def to_s
|
92
|
-
"#{host}:#{port}/#{idx}"
|
90
|
+
"#{@host}:#{@port}/#{@idx}"
|
93
91
|
end
|
94
92
|
|
95
93
|
def assert_code(code, response)
|
@@ -108,8 +106,8 @@ module Zold
|
|
108
106
|
end
|
109
107
|
|
110
108
|
def assert_score_ownership(score)
|
111
|
-
raise "Masqueraded host #{host} as #{score.host}: #{score}" if host != score.host
|
112
|
-
raise "Masqueraded port #{port} as #{score.port}: #{score}" if port != score.port
|
109
|
+
raise "Masqueraded host #{@host} as #{score.host}: #{score}" if @host != score.host
|
110
|
+
raise "Masqueraded port #{@port} as #{score.port}: #{score}" if @port != score.port
|
113
111
|
end
|
114
112
|
|
115
113
|
def assert_score_strength(score)
|
@@ -121,6 +119,12 @@ module Zold
|
|
121
119
|
end
|
122
120
|
end
|
123
121
|
|
122
|
+
def initialize(file:, network: 'test', timeout: 16)
|
123
|
+
@file = file
|
124
|
+
@network = network
|
125
|
+
@timeout = timeout
|
126
|
+
end
|
127
|
+
|
124
128
|
def all
|
125
129
|
list = load
|
126
130
|
max_score = list.map { |r| r[:score] }.max || 0
|
@@ -137,9 +141,8 @@ module Zold
|
|
137
141
|
end
|
138
142
|
|
139
143
|
def defaults
|
140
|
-
|
141
|
-
|
142
|
-
add(r[:host], r[:port])
|
144
|
+
Remotes::DEFS.each do |r|
|
145
|
+
add(r[0], r[1].to_i)
|
143
146
|
end
|
144
147
|
end
|
145
148
|
|
@@ -194,12 +197,12 @@ module Zold
|
|
194
197
|
score: score,
|
195
198
|
idx: idx,
|
196
199
|
log: log,
|
197
|
-
network: network
|
200
|
+
network: @network
|
198
201
|
)
|
199
|
-
raise 'Took too long to execute' if (Time.now - start).round > timeout
|
202
|
+
raise 'Took too long to execute' if (Time.now - start).round > @timeout
|
200
203
|
rescue StandardError => e
|
201
204
|
error(r[:host], r[:port])
|
202
|
-
log.info("#{Rainbow("#{r[:host]}:#{r[:port]}").red}: #{e.message} in #{Age.new(start)}")
|
205
|
+
log.info("#{Rainbow("#{r[:host]}:#{r[:port]}").red}: \"#{e.message}\" in #{Age.new(start)}")
|
203
206
|
log.debug(Backtrace.new(e).to_s)
|
204
207
|
remove(r[:host], r[:port]) if errors > Remotes::TOLERANCE
|
205
208
|
end
|
@@ -226,13 +229,17 @@ module Zold
|
|
226
229
|
end
|
227
230
|
|
228
231
|
def mtime
|
229
|
-
File.exist?(file) ? File.mtime(file) : Time.now
|
232
|
+
File.exist?(@file) ? File.mtime(@file) : Time.now
|
233
|
+
end
|
234
|
+
|
235
|
+
def default?(host, port)
|
236
|
+
!Remotes::DEFS.find { |r| r[0] == host && r[1].to_i == port }.nil?
|
230
237
|
end
|
231
238
|
|
232
239
|
private
|
233
240
|
|
234
241
|
def modify
|
235
|
-
Futex.new(file).open do
|
242
|
+
Futex.new(@file).open do
|
236
243
|
save(yield(load))
|
237
244
|
end
|
238
245
|
end
|
@@ -247,13 +254,14 @@ module Zold
|
|
247
254
|
end
|
248
255
|
|
249
256
|
def load
|
250
|
-
if File.exist?(file)
|
251
|
-
raw = CSV.read(file).map do |row|
|
257
|
+
if File.exist?(@file)
|
258
|
+
raw = CSV.read(@file).map do |row|
|
252
259
|
{
|
253
260
|
host: row[0],
|
254
261
|
port: row[1].to_i,
|
255
262
|
score: row[2].to_i,
|
256
|
-
errors: row[3].to_i
|
263
|
+
errors: row[3].to_i,
|
264
|
+
default: default?(row[0], row[1].to_i)
|
257
265
|
}
|
258
266
|
end
|
259
267
|
raw.reject { |r| !r[:host] || r[:port].zero? }.map do |r|
|
@@ -266,9 +274,9 @@ module Zold
|
|
266
274
|
end
|
267
275
|
|
268
276
|
def save(list)
|
269
|
-
FileUtils.mkdir_p(File.dirname(file))
|
277
|
+
FileUtils.mkdir_p(File.dirname(@file))
|
270
278
|
IO.write(
|
271
|
-
file,
|
279
|
+
@file,
|
272
280
|
list.uniq { |r| "#{r[:host]}:#{r[:port]}" }.map do |r|
|
273
281
|
[
|
274
282
|
r[:host],
|
data/lib/zold/score.rb
CHANGED
@@ -22,7 +22,6 @@
|
|
22
22
|
|
23
23
|
require 'openssl'
|
24
24
|
require 'time'
|
25
|
-
require_relative 'type'
|
26
25
|
|
27
26
|
# The score.
|
28
27
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
@@ -30,21 +29,22 @@ require_relative 'type'
|
|
30
29
|
# License:: MIT
|
31
30
|
module Zold
|
32
31
|
# Score
|
33
|
-
class Score
|
32
|
+
class Score
|
34
33
|
# Default strength for the entire system, in production mode.
|
35
34
|
STRENGTH = 6
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
36
|
+
attr_reader :time, :host, :port, :invoice, :suffixes, :strength, :created
|
37
|
+
|
38
|
+
def initialize(time: Time.now, host:, port:, invoice:, suffixes: [],
|
39
|
+
strength: Score::STRENGTH, created: Time.now)
|
40
|
+
@time = time
|
41
|
+
@host = host
|
42
|
+
@port = port
|
43
|
+
@invoice = invoice
|
44
|
+
@suffixes = suffixes
|
45
|
+
@strength = strength
|
46
|
+
@created = created
|
47
|
+
end
|
48
48
|
|
49
49
|
# The default no-value score.
|
50
50
|
ZERO = Score.new(time: Time.now, host: 'localhost', port: 80, invoice: 'NOPREFIX@ffffffffffffffff')
|
@@ -96,61 +96,62 @@ module Zold
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def hash
|
99
|
-
raise 'Score has zero value, there is no hash' if suffixes.empty?
|
100
|
-
suffixes.reduce(prefix) do |pfx, suffix|
|
99
|
+
raise 'Score has zero value, there is no hash' if @suffixes.empty?
|
100
|
+
@suffixes.reduce(prefix) do |pfx, suffix|
|
101
101
|
OpenSSL::Digest::SHA256.new("#{pfx} #{suffix}").hexdigest
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
105
|
def to_mnemo
|
106
|
-
"#{value}:#{time.strftime('%H%M')}"
|
106
|
+
"#{value}:#{@time.strftime('%H%M')}"
|
107
107
|
end
|
108
108
|
|
109
109
|
def to_text
|
110
|
-
pfx, bnf = invoice.split('@')
|
110
|
+
pfx, bnf = @invoice.split('@')
|
111
111
|
[
|
112
|
-
strength,
|
113
|
-
time.to_i.to_s(16),
|
114
|
-
host,
|
115
|
-
port.to_s(16),
|
112
|
+
@strength,
|
113
|
+
@time.to_i.to_s(16),
|
114
|
+
@host,
|
115
|
+
@port.to_s(16),
|
116
116
|
pfx,
|
117
117
|
bnf,
|
118
|
-
suffixes.join(' ')
|
118
|
+
@suffixes.join(' ')
|
119
119
|
].join(' ')
|
120
120
|
end
|
121
121
|
|
122
122
|
def to_s
|
123
123
|
[
|
124
|
-
"#{value}/#{strength}:",
|
125
|
-
time.utc.iso8601,
|
126
|
-
host,
|
127
|
-
port,
|
128
|
-
invoice,
|
129
|
-
suffixes.join(' ')
|
124
|
+
"#{value}/#{@strength}:",
|
125
|
+
@time.utc.iso8601,
|
126
|
+
@host,
|
127
|
+
@port,
|
128
|
+
@invoice,
|
129
|
+
@suffixes.join(' ')
|
130
130
|
].join(' ').strip
|
131
131
|
end
|
132
132
|
|
133
133
|
def to_h
|
134
134
|
{
|
135
135
|
value: value,
|
136
|
-
host: host,
|
137
|
-
port: port,
|
138
|
-
invoice: invoice,
|
139
|
-
time: time.utc.iso8601,
|
140
|
-
suffixes: suffixes,
|
141
|
-
strength: strength,
|
136
|
+
host: @host,
|
137
|
+
port: @port,
|
138
|
+
invoice: @invoice,
|
139
|
+
time: @time.utc.iso8601,
|
140
|
+
suffixes: @suffixes,
|
141
|
+
strength: @strength,
|
142
142
|
hash: value.zero? ? nil : hash,
|
143
143
|
expired: expired?,
|
144
144
|
valid: valid?,
|
145
145
|
age: (age / 60).round,
|
146
|
-
created: created.utc.iso8601
|
146
|
+
created: @created.utc.iso8601
|
147
147
|
}
|
148
148
|
end
|
149
149
|
|
150
150
|
def reduced(max = 4)
|
151
151
|
Score.new(
|
152
|
-
time: time, host: host, port: port, invoice: invoice,
|
153
|
-
suffixes: suffixes[0..[max, suffixes.count].min - 1],
|
152
|
+
time: @time, host: @host, port: @port, invoice: @invoice,
|
153
|
+
suffixes: @suffixes[0..[max, suffixes.count].min - 1],
|
154
|
+
strength: @strength
|
154
155
|
)
|
155
156
|
end
|
156
157
|
|
@@ -160,14 +161,15 @@ module Zold
|
|
160
161
|
loop do
|
161
162
|
suffix = idx.to_s(16)
|
162
163
|
score = Score.new(
|
163
|
-
time: time, host: host, port: port,
|
164
|
-
|
164
|
+
time: @time, host: @host, port: @port,
|
165
|
+
invoice: @invoice, suffixes: @suffixes + [suffix],
|
166
|
+
strength: @strength
|
165
167
|
)
|
166
168
|
return score if score.valid?
|
167
169
|
if score.expired?
|
168
170
|
return Score.new(
|
169
|
-
time: Time.now, host: host, port: port, invoice: invoice,
|
170
|
-
suffixes: [], strength: strength
|
171
|
+
time: Time.now, host: @host, port: @port, invoice: @invoice,
|
172
|
+
suffixes: [], strength: @strength
|
171
173
|
)
|
172
174
|
end
|
173
175
|
idx += 1
|
@@ -175,7 +177,7 @@ module Zold
|
|
175
177
|
end
|
176
178
|
|
177
179
|
def age
|
178
|
-
Time.now - time
|
180
|
+
Time.now - @time
|
179
181
|
end
|
180
182
|
|
181
183
|
def expired?(hours = 24)
|
@@ -183,15 +185,15 @@ module Zold
|
|
183
185
|
end
|
184
186
|
|
185
187
|
def prefix
|
186
|
-
"#{time.utc.iso8601} #{host} #{port} #{invoice}"
|
188
|
+
"#{@time.utc.iso8601} #{@host} #{@port} #{@invoice}"
|
187
189
|
end
|
188
190
|
|
189
191
|
def valid?
|
190
|
-
suffixes.empty? || hash.end_with?('0' * strength)
|
192
|
+
@suffixes.empty? || hash.end_with?('0' * @strength)
|
191
193
|
end
|
192
194
|
|
193
195
|
def value
|
194
|
-
suffixes.length
|
196
|
+
@suffixes.length
|
195
197
|
end
|
196
198
|
|
197
199
|
def zero?
|
data/lib/zold/tax.rb
CHANGED
@@ -40,7 +40,7 @@ module Zold
|
|
40
40
|
# The correct amount should be 1 ZLD, but we allow bigger amounts
|
41
41
|
# now since the amount of nodes in the network is still small. When
|
42
42
|
# the network grows up, let's put this number back to 1 ZLD.
|
43
|
-
MAX_PAYMENT = Amount.new(zld:
|
43
|
+
MAX_PAYMENT = Amount.new(zld: 64.0)
|
44
44
|
|
45
45
|
# This is how much we charge per one transaction per hour
|
46
46
|
# of storage. A wallet of 4096 transactions will pay
|
@@ -76,6 +76,10 @@ module Zold
|
|
76
76
|
debt > Tax::TRIAL
|
77
77
|
end
|
78
78
|
|
79
|
+
def to_text
|
80
|
+
"A=#{@wallet.age}, F=#{Tax::FEE_TXN_HOUR}, T=#{@wallet.txns.count}"
|
81
|
+
end
|
82
|
+
|
79
83
|
def debt
|
80
84
|
txns = @wallet.txns
|
81
85
|
scored = txns.map do |t|
|
data/lib/zold/version.rb
CHANGED
data/resources/remotes
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
b1.zold.io,80
|
2
|
-
b2.zold.io,4096
|
3
|
-
159.203.63.90,4096
|
4
|
-
167.99.77.100,4096
|
5
|
-
159.203.19.189,4096
|
6
|
-
138.197.140.42,4096
|
1
|
+
b1.zold.io,80
|
2
|
+
b2.zold.io,4096
|
3
|
+
159.203.63.90,4096
|
4
|
+
167.99.77.100,4096
|
5
|
+
159.203.19.189,4096
|
6
|
+
138.197.140.42,4096
|
data/test/node/fake_node.rb
CHANGED
@@ -64,7 +64,7 @@ class FakeNode
|
|
64
64
|
end
|
65
65
|
uri = "http://localhost:#{port}/"
|
66
66
|
loop do
|
67
|
-
ping = Zold::Http.new(uri: uri,
|
67
|
+
ping = Zold::Http.new(uri: uri, network: Zold::Front.network).get
|
68
68
|
break unless ping.code == '599' && node.alive?
|
69
69
|
@log.debug("Waiting for #{uri}: ##{ping.code}...")
|
70
70
|
sleep 0.5
|
data/test/node/test_front.rb
CHANGED
@@ -40,7 +40,7 @@ class FrontTest < Minitest::Test
|
|
40
40
|
|
41
41
|
def test_renders_front_json
|
42
42
|
FakeNode.new(log: test_log).run(['--no-metronome', '--network=foo', '--threads=0']) do |port|
|
43
|
-
res = Zold::Http.new(uri: "http://localhost:#{port}/", network: 'foo'
|
43
|
+
res = Zold::Http.new(uri: "http://localhost:#{port}/", network: 'foo').get
|
44
44
|
json = JSON.parse(res.body)
|
45
45
|
assert_equal(Zold::VERSION, json['version'])
|
46
46
|
assert_equal(Zold::PROTOCOL, json['protocol'])
|
@@ -83,7 +83,7 @@ class FrontTest < Minitest::Test
|
|
83
83
|
}.each do |code, paths|
|
84
84
|
paths.each do |p|
|
85
85
|
uri = URI("http://localhost:#{port}#{p}")
|
86
|
-
response = Zold::Http.new(uri: uri
|
86
|
+
response = Zold::Http.new(uri: uri).get
|
87
87
|
assert_equal(
|
88
88
|
code, response.code,
|
89
89
|
"Invalid response code for #{uri}: #{response.message}"
|
@@ -113,7 +113,7 @@ class FrontTest < Minitest::Test
|
|
113
113
|
FakeNode.new(log: test_log).run(['--threads=1', '--strength=1', '--no-metronome']) do |port|
|
114
114
|
3.times do |i|
|
115
115
|
assert_equal_wait(true) do
|
116
|
-
response = Zold::Http.new(uri: "http://localhost:#{port}/"
|
116
|
+
response = Zold::Http.new(uri: "http://localhost:#{port}/").get
|
117
117
|
assert_equal('200', response.code, response.body)
|
118
118
|
score = Zold::Score.parse_json(Zold::JsonPage.new(response.body).to_hash['score'])
|
119
119
|
score.value >= i
|
@@ -127,10 +127,10 @@ class FrontTest < Minitest::Test
|
|
127
127
|
FakeNode.new(log: test_log).run(['--ignore-score-weakness', '--standalone']) do |port|
|
128
128
|
wallet = home.create_wallet
|
129
129
|
base = "http://localhost:#{port}"
|
130
|
-
response = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
130
|
+
response = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}")
|
131
131
|
.put(IO.read(wallet.path))
|
132
132
|
assert_equal('200', response.code, response.body)
|
133
|
-
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
133
|
+
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
|
134
134
|
[
|
135
135
|
"/wallet/#{wallet.id}.txt",
|
136
136
|
"/wallet/#{wallet.id}.json",
|
@@ -141,7 +141,7 @@ class FrontTest < Minitest::Test
|
|
141
141
|
"/wallet/#{wallet.id}.bin",
|
142
142
|
"/wallet/#{wallet.id}/copies"
|
143
143
|
].each do |u|
|
144
|
-
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}#{u}"
|
144
|
+
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}#{u}").get.code }
|
145
145
|
end
|
146
146
|
end
|
147
147
|
end
|
@@ -152,13 +152,13 @@ class FrontTest < Minitest::Test
|
|
152
152
|
FakeHome.new(log: test_log).run do |home|
|
153
153
|
wallet = home.create_wallet
|
154
154
|
base = "http://localhost:#{port}"
|
155
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
156
|
-
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
155
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path))
|
156
|
+
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
|
157
157
|
threads = []
|
158
158
|
mutex = Mutex.new
|
159
159
|
Threads.new(6).assert(100) do
|
160
160
|
assert_equal_wait('200') do
|
161
|
-
res = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
161
|
+
res = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get
|
162
162
|
mutex.synchronize { threads << res.header['X-Zold-Thread'] }
|
163
163
|
res.code
|
164
164
|
end
|
@@ -175,11 +175,11 @@ class FrontTest < Minitest::Test
|
|
175
175
|
base = "http://localhost:#{port}"
|
176
176
|
assert_equal(
|
177
177
|
'200',
|
178
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
178
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path)).code
|
179
179
|
)
|
180
|
-
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
180
|
+
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
|
181
181
|
3.times do
|
182
|
-
r = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
182
|
+
r = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}")
|
183
183
|
.put(IO.read(wallet.path))
|
184
184
|
assert_equal('304', r.code, r.body)
|
185
185
|
end
|
@@ -193,8 +193,8 @@ class FrontTest < Minitest::Test
|
|
193
193
|
FakeHome.new(log: test_log).run do |home|
|
194
194
|
Threads.new(5).assert do
|
195
195
|
wallet = home.create_wallet
|
196
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
197
|
-
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
196
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path))
|
197
|
+
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
|
198
198
|
end
|
199
199
|
end
|
200
200
|
end
|
@@ -235,7 +235,7 @@ class FrontTest < Minitest::Test
|
|
235
235
|
|
236
236
|
def test_gzip
|
237
237
|
FakeNode.new(log: test_log).run(['--ignore-score-weakness']) do |port|
|
238
|
-
response = Zold::Http.new(uri: URI("http://localhost:#{port}/")
|
238
|
+
response = Zold::Http.new(uri: URI("http://localhost:#{port}/")).get
|
239
239
|
assert_equal(
|
240
240
|
'200', response.code,
|
241
241
|
"Expected HTTP 200 OK: Found #{response.code}"
|
@@ -252,7 +252,7 @@ class FrontTest < Minitest::Test
|
|
252
252
|
FakeNode.new(log: test_log).run(['--threads=4', '--strength=6', '--no-metronome', '--farmer=ruby-proc']) do |port|
|
253
253
|
Threads.new(10).assert(100) do
|
254
254
|
start = Time.now
|
255
|
-
Zold::Http.new(uri: URI("http://localhost:#{port}/")
|
255
|
+
Zold::Http.new(uri: URI("http://localhost:#{port}/")).get
|
256
256
|
times << Time.now - start
|
257
257
|
end
|
258
258
|
end
|
@@ -264,7 +264,7 @@ class FrontTest < Minitest::Test
|
|
264
264
|
def test_headers_are_being_set_correctly
|
265
265
|
Time.stub :now, Time.at(0) do
|
266
266
|
FakeNode.new(log: test_log).run(['--no-metronome', '--threads=0', '--ignore-score-weakness']) do |port|
|
267
|
-
response = Zold::Http.new(uri: URI("http://localhost:#{port}/")
|
267
|
+
response = Zold::Http.new(uri: URI("http://localhost:#{port}/")).get
|
268
268
|
assert_equal('no-cache', response.header['Cache-Control'])
|
269
269
|
assert_equal('close', response.header['Connection'])
|
270
270
|
assert_equal(app.settings.version, response.header['X-Zold-Version'])
|
@@ -284,7 +284,7 @@ class FrontTest < Minitest::Test
|
|
284
284
|
'/remotes'
|
285
285
|
].each do |path|
|
286
286
|
uri = URI("http://localhost:#{port}#{path}")
|
287
|
-
response = Zold::Http.new(uri: uri
|
287
|
+
response = Zold::Http.new(uri: uri).get
|
288
288
|
assert_match(
|
289
289
|
name,
|
290
290
|
Zold::JsonPage.new(response.body).to_hash['alias'].to_s,
|
@@ -297,7 +297,7 @@ class FrontTest < Minitest::Test
|
|
297
297
|
def test_default_alias_parameter
|
298
298
|
FakeNode.new(log: test_log).run(['--ignore-score-weakness', '--no-metronome']) do |port|
|
299
299
|
uri = URI("http://localhost:#{port}/")
|
300
|
-
response = Zold::Http.new(uri: uri
|
300
|
+
response = Zold::Http.new(uri: uri).get
|
301
301
|
assert_match(
|
302
302
|
"localhost:#{port}",
|
303
303
|
Zold::JsonPage.new(response.body).to_hash['alias'].to_s,
|
@@ -310,7 +310,7 @@ class FrontTest < Minitest::Test
|
|
310
310
|
exception = assert_raises RuntimeError do
|
311
311
|
FakeNode.new(log: test_log).run(['--ignore-score-weakness', '--alias=invalid-alias']) do |port|
|
312
312
|
uri = URI("http://localhost:#{port}/")
|
313
|
-
Zold::Http.new(uri: uri
|
313
|
+
Zold::Http.new(uri: uri).get
|
314
314
|
end
|
315
315
|
end
|
316
316
|
assert(exception.message.include?('should be a 4 to 16 char long'), exception.message)
|
@@ -322,16 +322,16 @@ class FrontTest < Minitest::Test
|
|
322
322
|
FakeHome.new(log: test_log).run do |home|
|
323
323
|
wallet = home.create_wallet(Zold::Id::ROOT)
|
324
324
|
base = "http://localhost:#{port}"
|
325
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
326
|
-
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
325
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path))
|
326
|
+
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
|
327
327
|
cycles = 50
|
328
328
|
cycles.times do
|
329
329
|
wallet.sub(Zold::Amount.new(coins: 10), "NOPREFIX@#{Zold::Id.new}", key)
|
330
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
331
|
-
assert_equal('200', Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}"
|
330
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path))
|
331
|
+
assert_equal('200', Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code)
|
332
332
|
end
|
333
333
|
assert_equal_wait(-10 * cycles) do
|
334
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}/balance"
|
334
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}/balance").get.body.to_i
|
335
335
|
end
|
336
336
|
end
|
337
337
|
end
|
data/test/test_http.rb
CHANGED
@@ -34,14 +34,14 @@ require_relative '../lib/zold/score'
|
|
34
34
|
class TestHttp < Minitest::Test
|
35
35
|
def test_pings_broken_uri
|
36
36
|
stub_request(:get, 'http://bad-host/').to_return(status: 500)
|
37
|
-
res = Zold::Http.new(uri: 'http://bad-host/'
|
37
|
+
res = Zold::Http.new(uri: 'http://bad-host/').get
|
38
38
|
assert_equal('500', res.code)
|
39
39
|
assert_equal('', res.body)
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_pings_with_exception
|
43
43
|
stub_request(:get, 'http://exception/').to_return { raise 'Intentionally' }
|
44
|
-
res = Zold::Http.new(uri: 'http://exception/'
|
44
|
+
res = Zold::Http.new(uri: 'http://exception/').get
|
45
45
|
assert_equal('599', res.code)
|
46
46
|
assert(res.body.include?('Intentionally'))
|
47
47
|
assert(!res.header['nothing'])
|
@@ -49,7 +49,7 @@ class TestHttp < Minitest::Test
|
|
49
49
|
|
50
50
|
def test_pings_live_uri
|
51
51
|
stub_request(:get, 'http://good-host/').to_return(status: 200)
|
52
|
-
res = Zold::Http.new(uri: 'http://good-host/'
|
52
|
+
res = Zold::Http.new(uri: 'http://good-host/').get
|
53
53
|
assert_equal('200', res.code)
|
54
54
|
end
|
55
55
|
|
@@ -57,7 +57,7 @@ class TestHttp < Minitest::Test
|
|
57
57
|
stub_request(:get, 'http://some-host-1/')
|
58
58
|
.with(headers: { 'X-Zold-Network' => 'xyz' })
|
59
59
|
.to_return(status: 200)
|
60
|
-
res = Zold::Http.new(uri: 'http://some-host-1/',
|
60
|
+
res = Zold::Http.new(uri: 'http://some-host-1/', network: 'xyz').get
|
61
61
|
assert_equal('200', res.code)
|
62
62
|
end
|
63
63
|
|
@@ -65,7 +65,7 @@ class TestHttp < Minitest::Test
|
|
65
65
|
stub_request(:get, 'http://some-host-2/')
|
66
66
|
.with(headers: { 'X-Zold-Protocol' => Zold::PROTOCOL })
|
67
67
|
.to_return(status: 200)
|
68
|
-
res = Zold::Http.new(uri: 'http://some-host-2/'
|
68
|
+
res = Zold::Http.new(uri: 'http://some-host-2/').get
|
69
69
|
assert_equal('200', res.code)
|
70
70
|
end
|
71
71
|
|
@@ -74,7 +74,7 @@ class TestHttp < Minitest::Test
|
|
74
74
|
sleep 100
|
75
75
|
{ body: 'This should never be returned!' }
|
76
76
|
end
|
77
|
-
res = Zold::Http.new(uri: 'http://the-fake-host-99/'
|
77
|
+
res = Zold::Http.new(uri: 'http://the-fake-host-99/').get
|
78
78
|
assert_equal('599', res.code)
|
79
79
|
end
|
80
80
|
|
@@ -82,7 +82,7 @@ class TestHttp < Minitest::Test
|
|
82
82
|
stub_request(:get, 'http://some-host-3/')
|
83
83
|
.with(headers: { 'X-Zold-Version' => Zold::VERSION })
|
84
84
|
.to_return(status: 200)
|
85
|
-
res = Zold::Http.new(uri: 'http://some-host-3/'
|
86
|
-
assert_equal('200', res.code)
|
85
|
+
res = Zold::Http.new(uri: 'http://some-host-3/').get
|
86
|
+
assert_equal('200', res.code, res)
|
87
87
|
end
|
88
88
|
end
|
data/test/test_remotes.rb
CHANGED
@@ -45,6 +45,15 @@ class TestRemotes < Minitest::Test
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
+
def test_finds_defaults
|
49
|
+
Dir.mktmpdir do |dir|
|
50
|
+
file = File.join(dir, 'remotes')
|
51
|
+
FileUtils.touch(file)
|
52
|
+
remotes = Zold::Remotes.new(file: file)
|
53
|
+
assert(remotes.default?('b1.zold.io', 80))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
48
57
|
def test_reads_broken_file
|
49
58
|
Dir.mktmpdir do |dir|
|
50
59
|
file = File.join(dir, 'remotes')
|
data/test/test_tax.rb
CHANGED
@@ -82,6 +82,14 @@ class TestTax < Minitest::Test
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
def test_prints_tax_formula
|
86
|
+
FakeHome.new(log: test_log).run do |home|
|
87
|
+
wallet = home.create_wallet
|
88
|
+
tax = Zold::Tax.new(wallet)
|
89
|
+
assert(!tax.to_text.nil?)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
85
93
|
def test_takes_tax_payment_into_account
|
86
94
|
FakeHome.new(log: test_log).run do |home|
|
87
95
|
wallet = home.create_wallet
|
data/zold.gemspec
CHANGED
@@ -58,8 +58,6 @@ and suggests a different architecture for digital wallet maintenance.'
|
|
58
58
|
s.add_runtime_dependency 'concurrent-ruby', '~>1.0'
|
59
59
|
s.add_runtime_dependency 'cucumber', '~>3' # has to stay here for Heroku
|
60
60
|
s.add_runtime_dependency 'diffy', '~>3'
|
61
|
-
s.add_runtime_dependency 'dry-struct', '~>0'
|
62
|
-
s.add_runtime_dependency 'dry-types', '~>0'
|
63
61
|
s.add_runtime_dependency 'futex', '~>0'
|
64
62
|
s.add_runtime_dependency 'get_process_mem', '~>0'
|
65
63
|
s.add_runtime_dependency 'json', '~>2'
|
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.16.
|
4
|
+
version: 0.16.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
@@ -66,34 +66,6 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: dry-struct
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: dry-types
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
69
|
- !ruby/object:Gem::Dependency
|
98
70
|
name: futex
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -574,7 +546,6 @@ files:
|
|
574
546
|
- lib/zold/tree_wallets.rb
|
575
547
|
- lib/zold/txn.rb
|
576
548
|
- lib/zold/txns.rb
|
577
|
-
- lib/zold/type.rb
|
578
549
|
- lib/zold/upgrades.rb
|
579
550
|
- lib/zold/verbose_thread.rb
|
580
551
|
- lib/zold/version.rb
|
data/lib/zold/type.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Copyright (c) 2018 Yegor Bugayenko
|
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
|
-
# @todo #394:30m/DEV Right now only Score, Http, Zold::Remotes and Zold::Remote
|
24
|
-
# classes have been refactored for using dry-types, even tough the issue has
|
25
|
-
# been boosted refactoring the whole project is very cumbersome. Please refer
|
26
|
-
# to Score and Http class on how to perform all the changes for the project to
|
27
|
-
# adopt dry-types
|
28
|
-
require 'dry-types'
|
29
|
-
require 'dry-struct'
|
30
|
-
|
31
|
-
# HTTP page.
|
32
|
-
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
33
|
-
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
34
|
-
# License:: MIT
|
35
|
-
module Types
|
36
|
-
include Dry::Types.module
|
37
|
-
end
|