quata 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
![Quata Demo](https://raw.githubusercontent.com/DannyBen/quata/master/demo.gif "Quata Demo")
|
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
|