quata 0.1.2 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +54 -2
- data/lib/quata/command_line.rb +23 -7
- data/lib/quata/quandl.rb +20 -4
- data/lib/quata/version.rb +1 -1
- data/lib/quata/web_api.rb +11 -27
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7974b74f540308b621c8a7fc0de260af55852223
|
4
|
+
data.tar.gz: e1277a24096c30ddc75b819cdc62be04740a4b68
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8475fd5c7e82dcac96a77744f2e45b3c8ef6c18b9e576f48391553bdd9827c8a0bf0ba513c89ff679895bbdebf5aa7cb2b26184b87ab8ce2358c135f4882e3a3
|
7
|
+
data.tar.gz: 998facc8591d26543bcdc618d9bfa96654bcb1dee09d7f75102aad7ebf36bc5f4689aed56a173b3932eb2a94d919159b5e28be0bd74ddd53cb83be80297a58f9
|
data/README.md
CHANGED
@@ -15,6 +15,19 @@ It provides direct access to all of the [Quandl API][1] endpoints.
|
|
15
15
|
|
16
16
|
---
|
17
17
|
|
18
|
+
Install
|
19
|
+
--------------------------------------------------
|
20
|
+
|
21
|
+
```
|
22
|
+
$ gem install quata
|
23
|
+
```
|
24
|
+
|
25
|
+
Or with bundler:
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
gem 'quata'
|
29
|
+
```
|
30
|
+
|
18
31
|
Features
|
19
32
|
--------------------------------------------------
|
20
33
|
|
@@ -23,6 +36,7 @@ Features
|
|
23
36
|
* Access any Quandl endpoint directly.
|
24
37
|
* Display output in various formats.
|
25
38
|
* Save output to a file, including bulk downloads.
|
39
|
+
* Includes a built in file cache (disabled by default).
|
26
40
|
|
27
41
|
Usage
|
28
42
|
--------------------------------------------------
|
@@ -60,14 +74,14 @@ result = quandl.get! "datasets/WIKI/AAPL.csv", rows: 3 # => CSV string
|
|
60
74
|
To save the output directly to a file, use the `save` method:
|
61
75
|
|
62
76
|
```ruby
|
63
|
-
|
77
|
+
quandl.save "aapl.csv", "datasets/WIKI/AAPL.csv", rows: 3
|
64
78
|
```
|
65
79
|
|
66
80
|
Debugging your request and adding "sticky" query parameters that stay with
|
67
81
|
you for the following requests is also easy:
|
68
82
|
|
69
83
|
```ruby
|
70
|
-
quandl.debug true
|
84
|
+
quandl.debug = true
|
71
85
|
quandl.param rows: 10, order: 'asc'
|
72
86
|
puts quandl.get 'WIKI/AAPL'
|
73
87
|
# => https://www.quandl.com/api/v3/WIKI/AAPL.json?auth_token=key&rows=10&order=asc
|
@@ -125,7 +139,45 @@ $ quata url datasets/WIKI/AAPL rows:5
|
|
125
139
|
# => https://www.quandl.com/api/v3/datasets/WIKI/AAPL.csv?auth_token=YOUR_KEY&rows=5
|
126
140
|
```
|
127
141
|
|
142
|
+
Caching
|
143
|
+
--------------------------------------------------
|
144
|
+
|
145
|
+
Quata uses the [WebCache][3] gem for automatic HTTP caching.
|
146
|
+
To take the path of least surprises, caching is disabled by default.
|
147
|
+
|
148
|
+
You can enable and customize it by either passing options on
|
149
|
+
initialization, or by accessing the `WebCache` object directly at
|
150
|
+
a later stage.
|
151
|
+
|
152
|
+
```ruby
|
153
|
+
quandl = Quandl.new 'Your API Key', use_cache: true
|
154
|
+
quandl = Quandl.new 'Your API Key', use_cache: true, cache_dir: 'tmp'
|
155
|
+
quandl = Quandl.new 'Your API Key', use_cache: true, cache_life: 120
|
156
|
+
|
157
|
+
# or
|
158
|
+
|
159
|
+
quandl = Quandl.new 'Your API Key'
|
160
|
+
quandl.cache.enable
|
161
|
+
quandl.cache.dir = 'tmp/cache' # Change cache folder
|
162
|
+
quandl.cache.life = 120 # Change cache life to 2 minutes
|
163
|
+
```
|
164
|
+
|
165
|
+
To enable caching for the command line, simply set one or both of
|
166
|
+
these environment variables:
|
167
|
+
|
168
|
+
```
|
169
|
+
$ export QUANDL_CACHE_DIR=cache
|
170
|
+
$ export QUANDL_CACHE_LIFE=120
|
171
|
+
$ quata get datasets/WIKI/AAPL
|
172
|
+
# => This call will be cached
|
173
|
+
```
|
174
|
+
|
175
|
+
|
176
|
+
Terminalcast
|
177
|
+
--------------------------------------------------
|
178
|
+
|
128
179
|

|
129
180
|
|
130
181
|
[1]: https://www.quandl.com/blog/getting-started-with-the-quandl-api
|
131
182
|
[2]: https://github.com/DannyBen/quata/blob/master/lib/quata/docopt.txt
|
183
|
+
[3]: https://github.com/DannyBen/webcache
|
data/lib/quata/command_line.rb
CHANGED
@@ -12,8 +12,8 @@ module Quata
|
|
12
12
|
attr_reader :quandl
|
13
13
|
|
14
14
|
def initialize
|
15
|
-
@quandl = Quandl.new api_key
|
16
|
-
@quandl.format :csv
|
15
|
+
@quandl = Quandl.new api_key, options
|
16
|
+
@quandl.format = :csv
|
17
17
|
end
|
18
18
|
|
19
19
|
# Gets an array of arguments (e.g. ARGV), executes the command if valid
|
@@ -54,20 +54,20 @@ module Quata
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def pretty(path, params)
|
57
|
-
quandl.format :json
|
57
|
+
quandl.format = :json
|
58
58
|
response = quandl.get path, translate_params(params)
|
59
59
|
puts JSON.pretty_generate response
|
60
60
|
end
|
61
61
|
|
62
62
|
def see(path, params)
|
63
|
-
quandl.format :json
|
63
|
+
quandl.format = :json
|
64
64
|
ap quandl.get path, translate_params(params)
|
65
65
|
end
|
66
66
|
|
67
67
|
def url(path, params)
|
68
|
-
quandl.debug true
|
68
|
+
quandl.debug = true
|
69
69
|
puts quandl.get path, translate_params(params)
|
70
|
-
quandl.debug false
|
70
|
+
quandl.debug = false
|
71
71
|
end
|
72
72
|
|
73
73
|
# Convert a params array like [key:value, key:value] to a hash like
|
@@ -86,6 +86,22 @@ module Quata
|
|
86
86
|
@api_key ||= ENV['QUANDL_KEY']
|
87
87
|
end
|
88
88
|
|
89
|
-
|
89
|
+
def options
|
90
|
+
return {} unless cache_dir || cache_life
|
91
|
+
result = {}
|
92
|
+
result[:use_cache] = true
|
93
|
+
result[:cache_dir] = cache_dir if cache_dir
|
94
|
+
result[:cache_life] = cache_life.to_i if cache_life
|
95
|
+
result
|
96
|
+
end
|
90
97
|
|
98
|
+
def cache_dir
|
99
|
+
ENV['QUANDL_CACHE_DIR']
|
100
|
+
end
|
101
|
+
|
102
|
+
def cache_life
|
103
|
+
ENV['QUANDL_CACHE_LIFE']
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
91
107
|
end
|
data/lib/quata/quandl.rb
CHANGED
@@ -4,13 +4,29 @@ require 'json'
|
|
4
4
|
class Quandl < Quata::WebAPI
|
5
5
|
attr_reader :api_key
|
6
6
|
|
7
|
-
def initialize(api_key=nil,
|
7
|
+
def initialize(api_key=nil, opts={})
|
8
|
+
if api_key.is_a? Hash
|
9
|
+
opts = api_key
|
10
|
+
api_key = nil
|
11
|
+
end
|
12
|
+
|
8
13
|
@api_key = api_key
|
9
14
|
|
10
|
-
|
15
|
+
defaults = {
|
16
|
+
use_cache: false,
|
17
|
+
cache_dir: nil,
|
18
|
+
cache_life: nil,
|
19
|
+
base_url: 'https://www.quandl.com/api/v3'
|
20
|
+
}
|
21
|
+
|
22
|
+
opts = defaults.merge! opts
|
23
|
+
|
24
|
+
self.cache.disable unless opts[:use_cache]
|
25
|
+
self.cache.dir = opts[:cache_dir] if opts[:cache_dir]
|
26
|
+
self.cache.life = opts[:cache_life] if opts[:cache_life]
|
11
27
|
|
12
28
|
param auth_token: api_key if api_key
|
13
|
-
format :json
|
29
|
+
self.format = :json
|
14
30
|
|
15
31
|
after_request do |response|
|
16
32
|
begin
|
@@ -20,6 +36,6 @@ class Quandl < Quata::WebAPI
|
|
20
36
|
end
|
21
37
|
end
|
22
38
|
|
23
|
-
super base_url
|
39
|
+
super opts[:base_url]
|
24
40
|
end
|
25
41
|
end
|
data/lib/quata/version.rb
CHANGED
data/lib/quata/web_api.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
require 'uri'
|
2
2
|
require 'open-uri'
|
3
|
+
require 'webcache'
|
3
4
|
|
4
5
|
module Quata
|
5
6
|
|
6
7
|
# A general purpose HTTP wrapper. This is poor man's HTTParty with
|
7
8
|
# dynamic methods.
|
8
9
|
class WebAPI
|
9
|
-
attr_reader :base_url, :after_request_block
|
10
|
+
attr_reader :base_url, :after_request_block
|
11
|
+
attr_accessor :debug, :format
|
10
12
|
|
11
13
|
def initialize(base_url)
|
12
14
|
@base_url = base_url
|
@@ -15,11 +17,7 @@ module Quata
|
|
15
17
|
# Allow using any method as the first segment of the path
|
16
18
|
# object.user 'details' becomes object.get 'user/details'
|
17
19
|
def method_missing(method_sym, *arguments, &block)
|
18
|
-
|
19
|
-
get "/#{method_sym}", *arguments
|
20
|
-
rescue
|
21
|
-
super
|
22
|
-
end
|
20
|
+
get "/#{method_sym}", *arguments
|
23
21
|
end
|
24
22
|
|
25
23
|
# Add one or more parameter to the default query string. Good for
|
@@ -31,17 +29,13 @@ module Quata
|
|
31
29
|
end
|
32
30
|
end
|
33
31
|
|
34
|
-
|
35
|
-
|
36
|
-
def format(value=nil)
|
37
|
-
@format = value if value
|
38
|
-
@format
|
32
|
+
def cache
|
33
|
+
@cache ||= WebCache.new
|
39
34
|
end
|
40
35
|
|
41
|
-
#
|
42
|
-
|
43
|
-
|
44
|
-
@debug_mode = value
|
36
|
+
# Return the last HTTP error, or false if all was good
|
37
|
+
def last_error
|
38
|
+
cache.last_error
|
45
39
|
end
|
46
40
|
|
47
41
|
# Set a block to be executed after the request. This is called only when
|
@@ -69,13 +63,13 @@ module Quata
|
|
69
63
|
path = "#{path}/#{extra}" if extra
|
70
64
|
url = construct_url path, params
|
71
65
|
|
72
|
-
|
66
|
+
debug ? url : cache.get(url)
|
73
67
|
end
|
74
68
|
|
75
69
|
# Save the response from the API to a file.
|
76
70
|
def save(filename, path, params={})
|
77
71
|
response = get! path, nil, params
|
78
|
-
return response if
|
72
|
+
return response if debug
|
79
73
|
File.write filename, response.to_s
|
80
74
|
end
|
81
75
|
|
@@ -96,15 +90,5 @@ module Quata
|
|
96
90
|
@default_params ||= {}
|
97
91
|
end
|
98
92
|
|
99
|
-
private
|
100
|
-
|
101
|
-
def http_get(url)
|
102
|
-
begin
|
103
|
-
open(url).read
|
104
|
-
rescue OpenURI::HTTPError => e
|
105
|
-
e.message
|
106
|
-
end
|
107
|
-
end
|
108
93
|
end
|
109
|
-
|
110
94
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docopt
|
@@ -39,61 +39,61 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.6'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: webcache
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
48
|
-
type: :
|
47
|
+
version: '0.1'
|
48
|
+
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
54
|
+
version: '0.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name: runfile
|
56
|
+
name: runfile
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
61
|
+
version: '0.7'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
68
|
+
version: '0.7'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: runfile-tasks
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '0.4'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '0.4'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '3.4'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '3.4'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rdoc
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|