intrinio 0.1.3 → 0.1.4
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 +42 -18
- data/bin/intrinio +1 -1
- data/lib/intrinio.rb +0 -1
- data/lib/intrinio/api.rb +10 -51
- data/lib/intrinio/command_line.rb +7 -8
- data/lib/intrinio/exceptions.rb +0 -2
- data/lib/intrinio/version.rb +1 -1
- metadata +5 -6
- data/lib/intrinio/web_api.rb +0 -93
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf2eaeb36817a3f28f086932851aa82640d66649
|
4
|
+
data.tar.gz: e41ba73df6877e6031bafa0fce2e655aff79096a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 428dcc7137db5a06459c20b385496b6c529d69e18c085f6bcf29d5a2f42d1c1a2310159bb474d485e09524ca54984200b2e2a6dd92c2dbf45e551f0691db7a26
|
7
|
+
data.tar.gz: 86a3c2604b6bb99c8443ee9eaebedec15cdf261dc4f9a49643f89ad03624c9c95da51520a49ebde8e3d587f64b28063e99464d11c3be98367beec988e519aaa7
|
data/README.md
CHANGED
@@ -71,22 +71,57 @@ intrinio.get 'endpoint', param: value
|
|
71
71
|
intrinio.endpoint, param: value
|
72
72
|
```
|
73
73
|
|
74
|
-
|
75
|
-
|
74
|
+
as well as these two:
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
intrinio.get 'endpoint/sub', param: value
|
78
|
+
intrinio.endpoint 'sub', param: value
|
79
|
+
```
|
80
|
+
|
81
|
+
By default, you will get a ruby hash in return. If you wish to have more
|
82
|
+
control over the response, use the `get!` method instead:
|
76
83
|
|
77
84
|
```ruby
|
78
85
|
result = intrinio.get! "indices", type: 'economic', page_size: 5
|
86
|
+
|
87
|
+
# Request Object
|
88
|
+
p payload.request.class
|
89
|
+
# => HTTParty::Request
|
90
|
+
|
91
|
+
# Response Object
|
92
|
+
p payload.response.class
|
93
|
+
# => Net::HTTPOK
|
94
|
+
|
95
|
+
p payload.response.body
|
79
96
|
# => JSON string
|
97
|
+
|
98
|
+
p payload.response.code
|
99
|
+
# => 200
|
100
|
+
|
101
|
+
p payload.response.msg
|
102
|
+
# => OK
|
103
|
+
|
104
|
+
# Headers Object
|
105
|
+
p payload.headers
|
106
|
+
# => Hash with headers
|
107
|
+
|
108
|
+
# Parsed Response Object
|
109
|
+
p payload.parsed_response
|
110
|
+
# => Hash with HTTParty parsed response
|
111
|
+
# (this is the content returned with #get)
|
80
112
|
```
|
81
113
|
|
82
|
-
|
83
|
-
call `get_csv` in order to convert the data to a CSV string.
|
114
|
+
You can get the response as CSV by calling `get_csv`:
|
84
115
|
|
85
116
|
```ruby
|
86
117
|
result = intrinio.get_csv "indices", page_size: 5
|
87
118
|
# => CSV string
|
88
119
|
```
|
89
120
|
|
121
|
+
Intrinio automatically decides which part of the data to convert to CSV.
|
122
|
+
When there is an array in the response, it will be used as the CSV data.
|
123
|
+
Otherwise, the entire response will be treated as a single-row CSV.
|
124
|
+
|
90
125
|
To save the output directly to a file, use the `save` method:
|
91
126
|
|
92
127
|
```ruby
|
@@ -96,20 +131,9 @@ intrinio.save "filename.json", "indices", type: 'economic', page_size: 5
|
|
96
131
|
Or, to save CSV, use the `save_csv` method:
|
97
132
|
|
98
133
|
```ruby
|
99
|
-
intrinio.save_csv "filename.csv" "indices", page_size: 5
|
134
|
+
intrinio.save_csv "filename.csv", "indices", page_size: 5
|
100
135
|
```
|
101
136
|
|
102
|
-
Debugging your request and adding "sticky" query parameters that stay with
|
103
|
-
you for the following requests is also easy:
|
104
|
-
|
105
|
-
```ruby
|
106
|
-
intrinio.debug = true
|
107
|
-
intrinio.param page_size: 10, order_direction: 'asc'
|
108
|
-
puts intrinio.historical_data identifier: '$INTDSRUSM193N', item: 'level'
|
109
|
-
# => "https://api.intrinio.com/historical_data?page_size=10&order_direction=asc&identifier=%24INTDSRUSM193N&item=level
|
110
|
-
|
111
|
-
intrinio.param page_size: nil # remove param
|
112
|
-
```
|
113
137
|
|
114
138
|
|
115
139
|
Command Line
|
@@ -154,7 +178,7 @@ $ intrinio url indices query:interest page_size:5
|
|
154
178
|
Caching
|
155
179
|
--------------------------------------------------
|
156
180
|
|
157
|
-
We are using the [
|
181
|
+
We are using the [Lightly][3] gem for automatic HTTP caching.
|
158
182
|
To take the path of least surprises, caching is disabled by default.
|
159
183
|
|
160
184
|
You can enable and customize it by either passing options on
|
@@ -192,4 +216,4 @@ $ intrinio get indices
|
|
192
216
|
|
193
217
|
[1]: https://www.intrinio.com
|
194
218
|
[2]: https://github.com/DannyBen/intrinio/blob/master/lib/intrinio/docopt.txt
|
195
|
-
[3]: https://github.com/DannyBen/
|
219
|
+
[3]: https://github.com/DannyBen/lightly
|
data/bin/intrinio
CHANGED
data/lib/intrinio.rb
CHANGED
data/lib/intrinio/api.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
require '
|
2
|
-
require 'csv'
|
1
|
+
require 'apicake'
|
3
2
|
|
4
3
|
module Intrinio
|
5
|
-
# Provides access to all the Intrinio API endpoints
|
6
|
-
|
7
|
-
|
4
|
+
# Provides access to all the Intrinio API endpoints with dynamic methods
|
5
|
+
# anc caching.
|
6
|
+
class API < APICake::Base
|
7
|
+
base_uri 'https://api.intrinio.com'
|
8
|
+
|
9
|
+
attr_reader :username, :password
|
8
10
|
|
9
11
|
def initialize(opts={})
|
10
12
|
if opts[:auth]
|
@@ -12,58 +14,15 @@ module Intrinio
|
|
12
14
|
opts.delete :auth
|
13
15
|
end
|
14
16
|
|
15
|
-
|
16
|
-
username: nil,
|
17
|
-
password: nil,
|
18
|
-
use_cache: false,
|
19
|
-
cache_dir: nil,
|
20
|
-
cache_life: nil,
|
21
|
-
base_url: "https://api.intrinio.com"
|
22
|
-
}
|
23
|
-
|
24
|
-
opts = defaults.merge! opts
|
25
|
-
@opts = opts
|
26
|
-
|
27
|
-
username, password = opts[:username], opts[:password]
|
17
|
+
@username, @password = opts[:username], opts[:password]
|
28
18
|
|
29
19
|
cache.disable unless opts[:use_cache]
|
30
20
|
cache.dir = opts[:cache_dir] if opts[:cache_dir]
|
31
21
|
cache.life = opts[:cache_life] if opts[:cache_life]
|
32
|
-
cache.options[:http_basic_authentication] = [username, password]
|
33
|
-
|
34
|
-
after_request do |response|
|
35
|
-
begin
|
36
|
-
JSON.parse response, symbolize_names: true
|
37
|
-
rescue JSON::ParserError
|
38
|
-
response
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
super opts[:base_url]
|
43
|
-
end
|
44
|
-
|
45
|
-
def get_csv(*args)
|
46
|
-
result = get *args
|
47
|
-
|
48
|
-
raise Intrinio::BadResponse, "API said '#{result}'" if result.is_a? String
|
49
|
-
raise Intrinio::BadResponse, "Got a #{result.class}, expected a Hash" unless result.is_a? Hash
|
50
|
-
raise Intrinio::IncompatibleResponse, "There is no data attribute in the response" unless result.has_key? :data
|
51
|
-
raise Intrinio::IncompatibleResponse, "The data attribute in the response is empty" unless result[:data]
|
52
|
-
|
53
|
-
data = result[:data]
|
54
|
-
|
55
|
-
header = data.first.keys
|
56
|
-
result = CSV.generate do |csv|
|
57
|
-
csv << header
|
58
|
-
data.each { |row| csv << row.values }
|
59
|
-
end
|
60
|
-
|
61
|
-
result
|
62
22
|
end
|
63
23
|
|
64
|
-
def
|
65
|
-
|
66
|
-
File.write file, data
|
24
|
+
def default_params
|
25
|
+
{ basic_auth: { username: username, password: password } }
|
67
26
|
end
|
68
27
|
end
|
69
28
|
end
|
@@ -56,7 +56,8 @@ module Intrinio
|
|
56
56
|
if csv
|
57
57
|
puts intrinio.get_csv path, params
|
58
58
|
else
|
59
|
-
|
59
|
+
payload = intrinio.get! path, params
|
60
|
+
puts payload.response.body
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
@@ -70,8 +71,8 @@ module Intrinio
|
|
70
71
|
end
|
71
72
|
|
72
73
|
def pretty
|
73
|
-
|
74
|
-
puts JSON.pretty_generate
|
74
|
+
payload = intrinio.get path, params
|
75
|
+
puts JSON.pretty_generate payload
|
75
76
|
end
|
76
77
|
|
77
78
|
def see
|
@@ -79,19 +80,17 @@ module Intrinio
|
|
79
80
|
end
|
80
81
|
|
81
82
|
def url
|
82
|
-
intrinio.
|
83
|
-
puts intrinio.get path, params
|
84
|
-
intrinio.debug = false
|
83
|
+
puts intrinio.url path, params
|
85
84
|
end
|
86
85
|
|
87
86
|
# Convert a params array like [key:value, key:value] to a hash like
|
88
87
|
# {key: value, key: value}
|
89
88
|
def translate_params(pairs)
|
90
|
-
return nil if pairs.empty?
|
91
89
|
result = {}
|
90
|
+
return result if pairs.empty?
|
92
91
|
pairs.each do |pair|
|
93
92
|
key, value = pair.split ':'
|
94
|
-
result[key] = value
|
93
|
+
result[key.to_sym] = value
|
95
94
|
end
|
96
95
|
result
|
97
96
|
end
|
data/lib/intrinio/exceptions.rb
CHANGED
data/lib/intrinio/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: intrinio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
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: 2017-02-
|
11
|
+
date: 2017-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docopt
|
@@ -39,19 +39,19 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.7'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: apicake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
47
|
+
version: '0.1'
|
48
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
56
|
name: runfile
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -165,7 +165,6 @@ files:
|
|
165
165
|
- lib/intrinio/docopt.txt
|
166
166
|
- lib/intrinio/exceptions.rb
|
167
167
|
- lib/intrinio/version.rb
|
168
|
-
- lib/intrinio/web_api.rb
|
169
168
|
homepage: https://github.com/DannyBen/intrinio
|
170
169
|
licenses:
|
171
170
|
- MIT
|
data/lib/intrinio/web_api.rb
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'open-uri'
|
3
|
-
require 'webcache'
|
4
|
-
|
5
|
-
module Intrinio
|
6
|
-
|
7
|
-
# A general purpose HTTP wrapper. This is poor man's HTTParty with
|
8
|
-
# dynamic methods.
|
9
|
-
class WebAPI
|
10
|
-
attr_reader :base_url, :after_request_block, :last_error
|
11
|
-
attr_accessor :debug, :format
|
12
|
-
|
13
|
-
def initialize(base_url)
|
14
|
-
@base_url = base_url
|
15
|
-
end
|
16
|
-
|
17
|
-
# Allow using any method as the first segment of the path
|
18
|
-
# object.user 'details' becomes object.get 'user/details'
|
19
|
-
def method_missing(method_sym, *arguments, &_block)
|
20
|
-
get "/#{method_sym}", *arguments
|
21
|
-
end
|
22
|
-
|
23
|
-
# Add one or more parameter to the default query string. Good for
|
24
|
-
# adding keys that are always needed, like API keys.
|
25
|
-
def param(params)
|
26
|
-
params.each do |key, value|
|
27
|
-
default_params[key] = value
|
28
|
-
default_params.delete key if value.nil?
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def cache
|
33
|
-
@cache ||= WebCache.new
|
34
|
-
end
|
35
|
-
|
36
|
-
# Set a block to be executed after the request. This is called only when
|
37
|
-
# using `get` and not when using `get!`. Good for JSON decoding, for
|
38
|
-
# example.
|
39
|
-
def after_request(&block)
|
40
|
-
@after_request_block = block
|
41
|
-
end
|
42
|
-
|
43
|
-
# Return the response from the API.
|
44
|
-
def get(path, extra=nil, params={})
|
45
|
-
response = get! path, extra, params
|
46
|
-
response = after_request_block.call(response) if after_request_block
|
47
|
-
response
|
48
|
-
end
|
49
|
-
|
50
|
-
# Return the response from the API, without executing the after_request
|
51
|
-
# block.
|
52
|
-
def get!(path, extra=nil, params={})
|
53
|
-
if extra.is_a?(Hash) and params.empty?
|
54
|
-
params = extra
|
55
|
-
extra = nil
|
56
|
-
end
|
57
|
-
|
58
|
-
path = "#{path}/#{extra}" if extra
|
59
|
-
url = construct_url path, params
|
60
|
-
|
61
|
-
return url if debug
|
62
|
-
|
63
|
-
response = cache.get(url)
|
64
|
-
@last_error = response.error
|
65
|
-
response.content
|
66
|
-
end
|
67
|
-
|
68
|
-
# Save the response from the API to a file.
|
69
|
-
def save(filename, path, params={})
|
70
|
-
response = get! path, nil, params
|
71
|
-
return response if debug
|
72
|
-
File.write filename, response.to_s
|
73
|
-
end
|
74
|
-
|
75
|
-
# Build a URL from all its explicit and implicit pieces.
|
76
|
-
def construct_url(path, params={})
|
77
|
-
path = "/#{path}" unless path[0] == '/'
|
78
|
-
all_params = default_params.merge params
|
79
|
-
result = "#{base_url}#{path}"
|
80
|
-
result = "#{result}.#{format}" if format && File.extname(result) == ''
|
81
|
-
unless all_params.empty?
|
82
|
-
all_params = URI.encode_www_form all_params
|
83
|
-
result = "#{result}?#{all_params}"
|
84
|
-
end
|
85
|
-
result
|
86
|
-
end
|
87
|
-
|
88
|
-
def default_params
|
89
|
-
@default_params ||= {}
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|
93
|
-
end
|