coinquery 0.1.1 → 0.2.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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/coinquery.rb +92 -36
- metadata +21 -1
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af2b23cb6aab30532b99a66db98e5425da892c1989219eaf25099582971beb4c
|
4
|
+
data.tar.gz: eae541068ad3050c2dda702977d51cd1ec7dbcaa7e642352448163b76fd459f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 726587aa2b8da2869e3ed6cc59dc6028a27cbcd449a825041c7d211e0ce31d8c0c99619039f912b4f326cc196028833bb8600eae17f27745fc4157cd93201dc5
|
7
|
+
data.tar.gz: 7f308647d75cf2d26083377be5376a2e46663f59d2a9d7593bc490cdc4f8204140933a01ae44d804e3189dfa25649838cf1ee7c124be020d1c01fbf82d5c8073
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/coinquery.rb
CHANGED
@@ -8,6 +8,8 @@ require 'json'
|
|
8
8
|
require 'excon'
|
9
9
|
require 'unichron'
|
10
10
|
require 'did_you_mean'
|
11
|
+
require 'recordx_sqlite'
|
12
|
+
|
11
13
|
|
12
14
|
|
13
15
|
class CoinQueryException < Exception
|
@@ -18,9 +20,11 @@ class CoinQuery
|
|
18
20
|
|
19
21
|
attr_reader :list
|
20
22
|
|
21
|
-
def initialize(autofind: true, dym: true,
|
23
|
+
def initialize(autofind: true, dym: true, timeout: 5, filepath: '.',
|
24
|
+
debug: false)
|
22
25
|
|
23
|
-
@autofind, @dym, @debug = autofind, dym, debug
|
26
|
+
@autofind, @dym, @timeout, @debug = autofind, dym, timeout, debug
|
27
|
+
@filepath = filepath
|
24
28
|
|
25
29
|
@url_base = 'https://api.coingecko.com/api/v3/'
|
26
30
|
r = ping()
|
@@ -54,14 +58,14 @@ class CoinQuery
|
|
54
58
|
|
55
59
|
if not File.exists? file then
|
56
60
|
|
57
|
-
File.open(file, 'w+') do |f|
|
61
|
+
File.open(File.join(@filepath, file), 'w+') do |f|
|
58
62
|
Marshal.dump([@list, @dym], f)
|
59
63
|
end
|
60
64
|
|
61
65
|
else
|
62
66
|
|
63
67
|
puts ('loading coins list ...').info
|
64
|
-
File.open(file) do |f|
|
68
|
+
File.open(File.join(@filepath, file)) do |f|
|
65
69
|
@list, @dym = Marshal.load(f)
|
66
70
|
end
|
67
71
|
|
@@ -69,7 +73,33 @@ class CoinQuery
|
|
69
73
|
|
70
74
|
end
|
71
75
|
end
|
76
|
+
|
77
|
+
@table = RecordxSqlite.new(File.join(@filepath, 'coinquery.db'),
|
78
|
+
table: {coins: {id: '', cname: '', price: '', date: 0}})
|
79
|
+
|
72
80
|
|
81
|
+
end
|
82
|
+
|
83
|
+
# archives the cryptocurrency prices in a local sqlite database
|
84
|
+
# note: intended for archiving prices on a daily basis
|
85
|
+
#
|
86
|
+
def archive(limit: 250)
|
87
|
+
|
88
|
+
puts 'archive: fetching coins ...'.info
|
89
|
+
a = coins(limit: limit)
|
90
|
+
|
91
|
+
puts 'archive: saving to database ...'.info
|
92
|
+
|
93
|
+
a.each do |coin|
|
94
|
+
|
95
|
+
uid = coin['id'] + Date.today.to_time.to_i.to_s
|
96
|
+
@table.create id: uid.to_s, cname: coin['name'],
|
97
|
+
price: coin['current_price'].to_s, date: Date.today.to_time.to_i
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
puts 'archive: completed'.info
|
102
|
+
|
73
103
|
end
|
74
104
|
|
75
105
|
# lists the top coins (limited to 5 by default)
|
@@ -84,6 +114,45 @@ class CoinQuery
|
|
84
114
|
def coins_list
|
85
115
|
@list
|
86
116
|
end
|
117
|
+
|
118
|
+
def find_coin(coin_name)
|
119
|
+
|
120
|
+
return coin_name unless @autofind
|
121
|
+
|
122
|
+
s = coin_name.to_s.downcase
|
123
|
+
puts 's: ' + s.inspect if @debug
|
124
|
+
r = @list.find {|coin| coin['symbol'].downcase == s || coin['name'].downcase == s}
|
125
|
+
puts 'r: ' + r.inspect if @debug
|
126
|
+
|
127
|
+
if r.nil? then
|
128
|
+
|
129
|
+
if @dym then
|
130
|
+
|
131
|
+
suggestion = @dym.correct coin_name
|
132
|
+
raise CoinQueryException, "unknown coin or token name. \n" \
|
133
|
+
+ "Did you mean %s?" % [suggestion.first]
|
134
|
+
|
135
|
+
else
|
136
|
+
|
137
|
+
raise CoinQueryException, "unknown coin or token name."
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
r
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
def find_id(name)
|
148
|
+
r = find_coin(name)
|
149
|
+
r['id']
|
150
|
+
end
|
151
|
+
|
152
|
+
def find_name(s)
|
153
|
+
r = find_coin s
|
154
|
+
r['name']
|
155
|
+
end
|
87
156
|
|
88
157
|
# returns the price of a coin for a given historical date
|
89
158
|
# e.g. historical_price('Bitcoin', '01-05-2021')
|
@@ -121,6 +190,23 @@ class CoinQuery
|
|
121
190
|
val < 1 ? val : val.round(2)
|
122
191
|
end
|
123
192
|
end
|
193
|
+
|
194
|
+
# use the database archive to query the historical price of a coin
|
195
|
+
# e.g. query_archive :btc, '1 May 2021'
|
196
|
+
#
|
197
|
+
def query_archive(coin_name, rawdate)
|
198
|
+
|
199
|
+
uc = Unichron.new(rawdate.to_s, :little_endian)
|
200
|
+
raise 'invalid date' unless uc.valid?
|
201
|
+
date = uc.to_date
|
202
|
+
|
203
|
+
coin_id = find_id coin_name
|
204
|
+
|
205
|
+
id = coin_id + date.to_time.to_i.to_s
|
206
|
+
r = @table.query "select * from coins where id == '#{id}'"
|
207
|
+
r.first if r
|
208
|
+
|
209
|
+
end
|
124
210
|
|
125
211
|
|
126
212
|
private
|
@@ -128,7 +214,7 @@ class CoinQuery
|
|
128
214
|
def api_call(api_request)
|
129
215
|
|
130
216
|
begin
|
131
|
-
Timeout::timeout(
|
217
|
+
Timeout::timeout(@timeout){
|
132
218
|
response = Excon.get(@url_base + api_request)
|
133
219
|
JSON.parse(response.body)
|
134
220
|
}
|
@@ -139,35 +225,5 @@ class CoinQuery
|
|
139
225
|
end
|
140
226
|
|
141
227
|
end
|
142
|
-
|
143
|
-
def find_id(coin_name)
|
144
|
-
|
145
|
-
return coin_name unless @autofind
|
146
|
-
|
147
|
-
s = coin_name.to_s.downcase
|
148
|
-
puts 's: ' + s.inspect if @debug
|
149
|
-
r = @list.find {|coin| coin['symbol'].downcase == s || coin['name'].downcase == s}
|
150
|
-
puts 'r: ' + r.inspect if @debug
|
151
|
-
|
152
|
-
if r.nil? then
|
153
|
-
|
154
|
-
if @dym then
|
155
|
-
|
156
|
-
suggestion = @dym.correct coin_name
|
157
|
-
raise CoinQueryException, "unknown coin or token name. \n" \
|
158
|
-
+ "Did you mean %s?" % [suggestion.first]
|
159
|
-
|
160
|
-
else
|
161
|
-
|
162
|
-
raise CoinQueryException, "unknown coin or token name."
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
end
|
167
|
-
|
168
|
-
r['id']
|
169
|
-
|
170
|
-
end
|
171
|
-
|
228
|
+
|
172
229
|
end
|
173
|
-
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coinquery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -77,6 +77,26 @@ dependencies:
|
|
77
77
|
- - ">="
|
78
78
|
- !ruby/object:Gem::Version
|
79
79
|
version: 0.3.4
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: recordx_sqlite
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - "~>"
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0.3'
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.3.3
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.3'
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 0.3.3
|
80
100
|
description:
|
81
101
|
email: digital.robertson@gmail.com
|
82
102
|
executables: []
|
metadata.gz.sig
CHANGED
Binary file
|