capital-iq 0.0.7 → 0.0.11
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 +8 -8
- data/Gemfile +7 -4
- data/Gemfile.lock +7 -3
- data/README.rdoc +69 -10
- data/Rakefile +3 -3
- data/VERSION +1 -1
- data/capital-iq.gemspec +30 -24
- data/lib/capital-iq.rb +12 -4
- data/lib/capital-iq/api_error.rb +4 -0
- data/lib/capital-iq/api_response.rb +73 -0
- data/lib/capital-iq/cache.rb +89 -0
- data/lib/capital-iq/client.rb +78 -0
- data/lib/capital-iq/functions.rb +21 -0
- data/lib/capital-iq/request.rb +19 -9
- data/lib/capital-iq/request_result.rb +28 -0
- data/spec/capital-iq_spec.rb +46 -3
- metadata +53 -24
- data/lib/capital-iq/api-error.rb +0 -4
- data/lib/capital-iq/base.rb +0 -77
- data/lib/capital-iq/transaction.rb +0 -8
- data/spec/request_spec.rb +0 -7
- data/spec/responses/capiq_ibm.json +0 -0
- data/spec/spec_helper.rb +0 -22
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZTdhNTlhNjg1YTY2ZmY3ZjlmNmE1OTBlNjU5OTdjN2Y4YTUyYjdiNQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MmNlYjA5ZDI1YzBlODM4NTVkYjIxNzU1NGNhMTMwZGUxNmY5MzU1Mg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDM4YzcxZTcwY2M5NjE3ZTExOTI5N2U0YjYwMTQxZGFjODY0NmVhZTcxNGY5
|
10
|
+
YjE0MjZiOTdhMmFkZjQzOGMwOWQ1MTNjOTNmZmQxOGM3OGUyYzQ5ZjM2MjY2
|
11
|
+
ZTg0MzEwYmYwOTZhM2FjYThkZWFiMGFkNzAwMDIwMjFhMWZiYzk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ODQ3NWYwZmIzZTc4Zjk2ODY1ZjY3YWRiYTBjMjNmN2Y0ZjE0MzBmYmExMDcz
|
14
|
+
YzY1MjJiMjk2Zjk0OGQ2N2U2MGU4ZGE0OTZjYThjYjEwZjljOTdmOGMzZWI2
|
15
|
+
N2E4OWI3YjkwMGI5YzZhMmM4ZDJlMjcwOTA3ODJkMmNhNWRjZTk=
|
data/Gemfile
CHANGED
@@ -1,16 +1,19 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
|
+
ruby "1.9.3"
|
2
3
|
|
3
4
|
group :development do
|
4
|
-
gem "rspec"
|
5
|
-
gem "rdoc"
|
5
|
+
gem "rspec"
|
6
|
+
gem "rdoc"
|
6
7
|
gem "bundler"
|
7
|
-
gem "jeweler"
|
8
|
+
gem "jeweler"
|
8
9
|
gem 'guard'
|
9
10
|
gem 'guard-rspec'
|
10
11
|
gem 'webmock'
|
12
|
+
gem 'dotenv'
|
11
13
|
gem 'vcr'
|
14
|
+
gem 'redis'
|
12
15
|
end
|
13
16
|
|
14
17
|
gem 'httparty'
|
15
18
|
gem 'json'
|
16
|
-
gem 'hashie'
|
19
|
+
gem 'hashie'
|
data/Gemfile.lock
CHANGED
@@ -9,6 +9,7 @@ GEM
|
|
9
9
|
crack (0.4.2)
|
10
10
|
safe_yaml (~> 1.0.0)
|
11
11
|
diff-lcs (1.1.3)
|
12
|
+
dotenv (1.0.2)
|
12
13
|
faraday (0.8.9)
|
13
14
|
multipart-post (~> 1.2.0)
|
14
15
|
ffi (1.9.3)
|
@@ -72,6 +73,7 @@ GEM
|
|
72
73
|
ffi (>= 0.5.0)
|
73
74
|
rdoc (3.12.2)
|
74
75
|
json (~> 1.4)
|
76
|
+
redis (3.1.0)
|
75
77
|
rspec (2.8.0)
|
76
78
|
rspec-core (~> 2.8.0)
|
77
79
|
rspec-expectations (~> 2.8.0)
|
@@ -94,13 +96,15 @@ PLATFORMS
|
|
94
96
|
|
95
97
|
DEPENDENCIES
|
96
98
|
bundler
|
99
|
+
dotenv
|
97
100
|
guard
|
98
101
|
guard-rspec
|
99
102
|
hashie
|
100
103
|
httparty
|
101
|
-
jeweler
|
104
|
+
jeweler
|
102
105
|
json
|
103
|
-
rdoc
|
104
|
-
|
106
|
+
rdoc
|
107
|
+
redis
|
108
|
+
rspec
|
105
109
|
vcr
|
106
110
|
webmock
|
data/README.rdoc
CHANGED
@@ -2,22 +2,81 @@
|
|
2
2
|
|
3
3
|
Ruby API wrapper to Capital IQ API.
|
4
4
|
|
5
|
+
== Compatibility Warning
|
6
|
+
|
7
|
+
Breaking changes were introduced in versions following v0.0.7. This was necessary to provide support for new features such as multi-identifier/multi-mnemonic calls.
|
8
|
+
|
9
|
+
v0.0.7 design is no longer maintained and can be found here: https://github.com/exitround/capital-iq/tree/v0.0.7
|
5
10
|
|
6
11
|
== Installation
|
7
12
|
|
8
13
|
gem install capital-iq
|
9
|
-
|
10
14
|
|
11
|
-
==
|
15
|
+
== Capital IQ API Basics
|
12
16
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
Each request to Capital IQ API contains three required parameters: function, identifier, mnemonic, and one optional parameter: properties. The corresponding result will contain a rowset with "headers" and "rows". For single-value mnemonics the result would usually consist of a single header and a single row. The header name would usually match the name of the input mnemonic. Multi-value mnemonics, however, often contain additional headers (such as "change date" etc) and multiple rows.
|
18
|
+
|
19
|
+
Please refer to Capital IQ support and documentation for specific function/mnemonic instructions and data retrieval pricing information.
|
20
|
+
|
21
|
+
== Gem Usage
|
22
|
+
|
23
|
+
To start, initialize the client object with the user name and password. This example assumes that they are stored in the environment variables:
|
24
|
+
client = CapitalIQ::Client.new(ENV['CAPIQ_USER'], ENV['CAPIQ_PWD'])
|
25
|
+
|
26
|
+
=== API Calls Based on Request Objects
|
27
|
+
|
28
|
+
This is the most basic way of using the gem. Create a request, call the api, get the result. Here, the function is GDSHE, the identifier is 'microsoft' and the mnemonic is IQ_COMPANY_ID_QUICK_MATCH:
|
29
|
+
|
30
|
+
req = CapitalIQ::Request.new(CapitalIQ::Functions::GDSHE, 'microsoft', 'IQ_COMPANY_ID_QUICK_MATCH')
|
31
|
+
res = client.base_request(req)
|
32
|
+
|
33
|
+
|
34
|
+
You have an option of passing multiple requst objects into a call. They are all executed in one round trip. Beware of the API limits however.
|
35
|
+
|
36
|
+
req1 = CapitalIQ::Request.new(CapitalIQ::Functions::GDSHE, 'microsoft', 'IQ_COMPANY_ID_QUICK_MATCH')
|
37
|
+
req2 = CapitalIQ::Request.new(CapitalIQ::Functions::GDSHE, 'google', 'IQ_COMPANY_ID_QUICK_MATCH')
|
38
|
+
res = client.base_request([req1, req2])
|
39
|
+
|
40
|
+
=== Convenience Methods - request_xxxxx
|
41
|
+
|
42
|
+
You may choose to use the convenience methods provided by the +Client+ class - +request_xxxxx+, where xxxxx - is the name of Capital IQ API function). They allow to forgo creating the request objects explicity, (the requsts objects do get created underneath though):
|
43
|
+
|
44
|
+
res = client.request_gdshe('microsoft', 'IQ_COMPANY_ID_QUICK_MATCH', {startRank:1, endRank:20})
|
45
|
+
|
46
|
+
The returned values are accessed by the identifier and the header name:
|
47
|
+
|
48
|
+
res_val = res['microsoft']['IQ_COMPANY_ID_QUICK_MATCH']
|
49
|
+
|
50
|
+
When using GDSHE or GDSHV functions, the result is represented by an array. Therefore +res_val+ above is an array. We'll use +first+ method to get the actual value:
|
51
|
+
|
52
|
+
ms_id = res_val.first
|
53
|
+
|
54
|
+
You can use the +scalar+ method when querying on a single identifier, so the above example can be shortened to:
|
55
|
+
|
56
|
+
ms_id = res.scalar['IQ_COMPANY_ID_QUICK_MATCH'].first
|
57
|
+
|
58
|
+
=== Multiple identifier / single mnemonic requests
|
59
|
+
|
60
|
+
This example generates two requests:
|
61
|
+
|
62
|
+
res = client.request_gdshe(['microsoft', 'google'], 'IQ_COMPANY_ID_QUICK_MATCH', {startRank:1, endRank:20})
|
63
|
+
ms_id = res['microsoft']['IQ_COMPANY_ID_QUICK_MATCH'].first
|
64
|
+
google_id = res['google']['IQ_COMPANY_ID_QUICK_MATCH'].first
|
65
|
+
|
66
|
+
=== Multiple identifier / multiple mnemonic queries
|
67
|
+
|
68
|
+
This call generates (2 identifiers times 3 mnemonics) = 6 requests (they're still executed in a batch)
|
69
|
+
|
70
|
+
res = client.request_gdsp([ms_id, google_id], %w(IQ_COMPANY_WEBSITE IQ_COMPANY_NAME IQ_BUSINESS_DESCRIPTION))
|
71
|
+
|
72
|
+
You can use the +to_hash+ method to retrieve all values for a given identifier
|
73
|
+
|
74
|
+
# All values for +ms_id+
|
75
|
+
ms_data = res[ms_id].to_hash
|
76
|
+
|
77
|
+
Or you can retrieve all values for all identifiers:
|
78
|
+
|
79
|
+
all_data = res.to_hash
|
21
80
|
|
22
81
|
|
23
82
|
== Contributing to capital-iq
|
data/Rakefile
CHANGED
@@ -15,12 +15,12 @@ require 'jeweler'
|
|
15
15
|
Jeweler::Tasks.new do |gem|
|
16
16
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
17
|
gem.name = "capital-iq"
|
18
|
-
gem.homepage = "http://github.com/
|
18
|
+
gem.homepage = "http://github.com/exitround/capital-iq"
|
19
19
|
gem.license = "MIT"
|
20
20
|
gem.summary = %Q{Ruby wrapper for the CapIQ API}
|
21
21
|
gem.description = %Q{Ruby wrapper for the CapIQ API}
|
22
|
-
gem.email = "
|
23
|
-
gem.authors = ["
|
22
|
+
gem.email = "dev@exitround.com"
|
23
|
+
gem.authors = ["Val Savvateev", "Greg Dean"]
|
24
24
|
# dependencies defined in Gemfile
|
25
25
|
end
|
26
26
|
Jeweler::RubygemsDotOrgTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.11
|
data/capital-iq.gemspec
CHANGED
@@ -2,17 +2,18 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: capital-iq 0.0.
|
5
|
+
# stub: capital-iq 0.0.11 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "capital-iq"
|
9
|
-
s.version = "0.0.
|
9
|
+
s.version = "0.0.11"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
-
s.
|
13
|
-
s.
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.authors = ["Val Savvateev", "Greg Dean"]
|
14
|
+
s.date = "2015-02-24"
|
14
15
|
s.description = "Ruby wrapper for the CapIQ API"
|
15
|
-
s.email = "
|
16
|
+
s.email = "dev@exitround.com"
|
16
17
|
s.extra_rdoc_files = [
|
17
18
|
"LICENSE.txt",
|
18
19
|
"README.rdoc"
|
@@ -27,19 +28,18 @@ Gem::Specification.new do |s|
|
|
27
28
|
"VERSION",
|
28
29
|
"capital-iq.gemspec",
|
29
30
|
"lib/capital-iq.rb",
|
30
|
-
"lib/capital-iq/
|
31
|
-
"lib/capital-iq/
|
31
|
+
"lib/capital-iq/api_error.rb",
|
32
|
+
"lib/capital-iq/api_response.rb",
|
33
|
+
"lib/capital-iq/cache.rb",
|
34
|
+
"lib/capital-iq/client.rb",
|
35
|
+
"lib/capital-iq/functions.rb",
|
32
36
|
"lib/capital-iq/request.rb",
|
33
|
-
"lib/capital-iq/
|
34
|
-
"spec/capital-iq_spec.rb"
|
35
|
-
"spec/request_spec.rb",
|
36
|
-
"spec/responses/capiq_ibm.json",
|
37
|
-
"spec/spec_helper.rb"
|
37
|
+
"lib/capital-iq/request_result.rb",
|
38
|
+
"spec/capital-iq_spec.rb"
|
38
39
|
]
|
39
|
-
s.homepage = "http://github.com/
|
40
|
+
s.homepage = "http://github.com/exitround/capital-iq"
|
40
41
|
s.licenses = ["MIT"]
|
41
|
-
s.
|
42
|
-
s.rubygems_version = "2.1.11"
|
42
|
+
s.rubygems_version = "2.4.5"
|
43
43
|
s.summary = "Ruby wrapper for the CapIQ API"
|
44
44
|
|
45
45
|
if s.respond_to? :specification_version then
|
@@ -49,39 +49,45 @@ Gem::Specification.new do |s|
|
|
49
49
|
s.add_runtime_dependency(%q<httparty>, [">= 0"])
|
50
50
|
s.add_runtime_dependency(%q<json>, [">= 0"])
|
51
51
|
s.add_runtime_dependency(%q<hashie>, [">= 0"])
|
52
|
-
s.add_development_dependency(%q<rspec>, ["
|
53
|
-
s.add_development_dependency(%q<rdoc>, ["
|
52
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
53
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
54
54
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
55
|
-
s.add_development_dependency(%q<jeweler>, ["
|
55
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
56
56
|
s.add_development_dependency(%q<guard>, [">= 0"])
|
57
57
|
s.add_development_dependency(%q<guard-rspec>, [">= 0"])
|
58
58
|
s.add_development_dependency(%q<webmock>, [">= 0"])
|
59
|
+
s.add_development_dependency(%q<dotenv>, [">= 0"])
|
59
60
|
s.add_development_dependency(%q<vcr>, [">= 0"])
|
61
|
+
s.add_development_dependency(%q<redis>, [">= 0"])
|
60
62
|
else
|
61
63
|
s.add_dependency(%q<httparty>, [">= 0"])
|
62
64
|
s.add_dependency(%q<json>, [">= 0"])
|
63
65
|
s.add_dependency(%q<hashie>, [">= 0"])
|
64
|
-
s.add_dependency(%q<rspec>, ["
|
65
|
-
s.add_dependency(%q<rdoc>, ["
|
66
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
67
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
66
68
|
s.add_dependency(%q<bundler>, [">= 0"])
|
67
|
-
s.add_dependency(%q<jeweler>, ["
|
69
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
68
70
|
s.add_dependency(%q<guard>, [">= 0"])
|
69
71
|
s.add_dependency(%q<guard-rspec>, [">= 0"])
|
70
72
|
s.add_dependency(%q<webmock>, [">= 0"])
|
73
|
+
s.add_dependency(%q<dotenv>, [">= 0"])
|
71
74
|
s.add_dependency(%q<vcr>, [">= 0"])
|
75
|
+
s.add_dependency(%q<redis>, [">= 0"])
|
72
76
|
end
|
73
77
|
else
|
74
78
|
s.add_dependency(%q<httparty>, [">= 0"])
|
75
79
|
s.add_dependency(%q<json>, [">= 0"])
|
76
80
|
s.add_dependency(%q<hashie>, [">= 0"])
|
77
|
-
s.add_dependency(%q<rspec>, ["
|
78
|
-
s.add_dependency(%q<rdoc>, ["
|
81
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
82
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
79
83
|
s.add_dependency(%q<bundler>, [">= 0"])
|
80
|
-
s.add_dependency(%q<jeweler>, ["
|
84
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
81
85
|
s.add_dependency(%q<guard>, [">= 0"])
|
82
86
|
s.add_dependency(%q<guard-rspec>, [">= 0"])
|
83
87
|
s.add_dependency(%q<webmock>, [">= 0"])
|
88
|
+
s.add_dependency(%q<dotenv>, [">= 0"])
|
84
89
|
s.add_dependency(%q<vcr>, [">= 0"])
|
90
|
+
s.add_dependency(%q<redis>, [">= 0"])
|
85
91
|
end
|
86
92
|
end
|
87
93
|
|
data/lib/capital-iq.rb
CHANGED
@@ -1,9 +1,17 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'ostruct'
|
1
3
|
require 'httparty'
|
2
4
|
require 'json'
|
3
|
-
|
4
|
-
|
5
|
-
require_relative 'capital-iq/api-error'
|
6
|
-
require_relative 'capital-iq/transaction'
|
5
|
+
require 'digest'
|
6
|
+
require 'zlib'
|
7
7
|
|
8
8
|
module CapitalIQ
|
9
9
|
end
|
10
|
+
|
11
|
+
require_relative 'capital-iq/cache'
|
12
|
+
require_relative 'capital-iq/functions'
|
13
|
+
require_relative 'capital-iq/api_error'
|
14
|
+
require_relative 'capital-iq/request'
|
15
|
+
require_relative 'capital-iq/request_result'
|
16
|
+
require_relative 'capital-iq/api_response'
|
17
|
+
require_relative 'capital-iq/client'
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module CapitalIQ
|
2
|
+
class ApiResponse
|
3
|
+
class IdentifierResultGroup
|
4
|
+
attr_reader :identifier
|
5
|
+
def initialize(identifier)
|
6
|
+
@identifier = identifier
|
7
|
+
@header_map = {}
|
8
|
+
@results = []
|
9
|
+
end
|
10
|
+
def <<(result)
|
11
|
+
raise "Result contains wrong identifier" if result.Identifier != self.identifier
|
12
|
+
@results << result
|
13
|
+
(result.Headers || []).each { |h| @header_map[h] = result }
|
14
|
+
end
|
15
|
+
def headers
|
16
|
+
@header_map.keys
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](header)
|
20
|
+
@header_map[header][header]
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_hash
|
24
|
+
Hash[self.headers.collect { |h| [h, self[h]] }]
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
to_hash().to_s()
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(response_data)
|
33
|
+
@response_data = response_data
|
34
|
+
|
35
|
+
@results = []
|
36
|
+
@identifier_results = Hash.new {|hash, key| hash[key] = IdentifierResultGroup.new(key)}
|
37
|
+
raw_results = response_data["GDSSDKResponse"]
|
38
|
+
return if !raw_results.is_a?(Array)
|
39
|
+
|
40
|
+
# create wrappers for each response
|
41
|
+
@results = raw_results.collect { |r| RequestResult.new(r) }
|
42
|
+
# build a map from header to corresponding result wrappers
|
43
|
+
@results.each { |r| @identifier_results[r.Identifier] << r }
|
44
|
+
end
|
45
|
+
|
46
|
+
def has_errors?(header=nil)
|
47
|
+
return true if @response_data.include?("Errors")
|
48
|
+
@results.find { |r| r.has_errors?(header)}
|
49
|
+
end
|
50
|
+
|
51
|
+
def [](identifier)
|
52
|
+
return nil unless @identifier_results.has_key?(identifier)
|
53
|
+
@identifier_results[identifier]
|
54
|
+
end
|
55
|
+
|
56
|
+
def scalar
|
57
|
+
return nil if @identifier_results.length == 0
|
58
|
+
@identifier_results.first[1]
|
59
|
+
end
|
60
|
+
|
61
|
+
def identifiers
|
62
|
+
@identifier_results.keys
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_hash
|
66
|
+
Hash[self.identifiers.collect { |id| [id, self[id]] }]
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_s
|
70
|
+
to_hash().to_s()
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module CapitalIQ
|
2
|
+
class Cache
|
3
|
+
|
4
|
+
def initialize(store, prefix)
|
5
|
+
@store = store
|
6
|
+
@prefix = prefix
|
7
|
+
end
|
8
|
+
|
9
|
+
##
|
10
|
+
# Read from the Cache.
|
11
|
+
#
|
12
|
+
def [](url)
|
13
|
+
interpret case
|
14
|
+
when store.respond_to?(:[])
|
15
|
+
store[key_for(url)]
|
16
|
+
when store.respond_to?(:get)
|
17
|
+
store.get key_for(url)
|
18
|
+
when store.respond_to?(:read)
|
19
|
+
store.read key_for(url)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Write to the Cache.
|
25
|
+
#
|
26
|
+
def []=(url, value)
|
27
|
+
case
|
28
|
+
when store.respond_to?(:[]=)
|
29
|
+
store[key_for(url)] = value
|
30
|
+
when store.respond_to?(:set)
|
31
|
+
store.set key_for(url), value
|
32
|
+
when store.respond_to?(:write)
|
33
|
+
store.write key_for(url), value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Delete cache entry for given URL,
|
39
|
+
# or pass <tt>:all</tt> to clear all URLs.
|
40
|
+
#
|
41
|
+
def expire(url)
|
42
|
+
if url == :all
|
43
|
+
urls.each{ |u| expire(u) }
|
44
|
+
else
|
45
|
+
expire_single_url(url)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
private # ----------------------------------------------------------------
|
51
|
+
|
52
|
+
attr_reader :prefix, :store
|
53
|
+
|
54
|
+
##
|
55
|
+
# Cache key for a given URL.
|
56
|
+
#
|
57
|
+
def key_for(url)
|
58
|
+
[prefix, url].join
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Array of keys with the currently configured prefix
|
63
|
+
# that have non-nil values.
|
64
|
+
#
|
65
|
+
def keys
|
66
|
+
store.keys.select{ |k| k.match /^#{prefix}/ and interpret(store[k]) }
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# Array of cached URLs.
|
71
|
+
#
|
72
|
+
def urls
|
73
|
+
keys.map{ |k| k[/^#{prefix}(.*)/, 1] }
|
74
|
+
end
|
75
|
+
|
76
|
+
##
|
77
|
+
# Clean up value before returning. Namely, convert empty string to nil.
|
78
|
+
# (Some key/value stores return empty string instead of nil.)
|
79
|
+
#
|
80
|
+
def interpret(value)
|
81
|
+
value == "" ? nil : value
|
82
|
+
end
|
83
|
+
|
84
|
+
def expire_single_url(url)
|
85
|
+
key = key_for(url)
|
86
|
+
store.respond_to?(:del) ? store.del(key) : store.delete(key)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module CapitalIQ
|
2
|
+
class Client
|
3
|
+
attr_reader :cache
|
4
|
+
|
5
|
+
ENDPOINT = 'https://sdk.gds.standardandpoors.com/gdssdk/rest/v2/clientservice.json'
|
6
|
+
include HTTParty
|
7
|
+
format :json
|
8
|
+
|
9
|
+
def initialize(username, password, cache_store=nil, cache_prefix="CAPIQ_")
|
10
|
+
@auth = {username: username, password: password}
|
11
|
+
@cache = Cache.new(cache_store, cache_prefix)
|
12
|
+
end
|
13
|
+
|
14
|
+
def base_request(requests)
|
15
|
+
# build request
|
16
|
+
requests = [requests] unless requests.class == Array
|
17
|
+
request_array = requests.collect { |r| r.to_hash }
|
18
|
+
request_body = {inputRequests: {inputRequests: request_array}.to_json}
|
19
|
+
|
20
|
+
# send request
|
21
|
+
response_data = from_cache(request_body) || self.class.post(
|
22
|
+
ENDPOINT, body: request_body, basic_auth: @auth, ssl_version: :SSLv3
|
23
|
+
).parsed_response
|
24
|
+
|
25
|
+
# analyze response
|
26
|
+
response = ApiResponse.new(response_data)
|
27
|
+
raise ApiError if response.has_errors?
|
28
|
+
to_cache(request_body, response_data)
|
29
|
+
response
|
30
|
+
end
|
31
|
+
|
32
|
+
def request(function, identifiers, mnemonics, properties=nil)
|
33
|
+
mnemonics = [mnemonics] unless mnemonics.is_a? Enumerable
|
34
|
+
identifiers = [identifiers] unless identifiers.is_a? Enumerable
|
35
|
+
requests = []
|
36
|
+
identifiers.each do |identifier|
|
37
|
+
requests.unshift(*mnemonics.collect {|m| CapitalIQ::Request.new(function, identifier, m, properties)})
|
38
|
+
end
|
39
|
+
base_request(requests)
|
40
|
+
end
|
41
|
+
|
42
|
+
def method_missing(meth, *args, &block)
|
43
|
+
if meth.to_s =~ /^request_(.+)$/
|
44
|
+
function = $1.upcase
|
45
|
+
if Functions.all.include?(function)
|
46
|
+
request(*([function]+args))
|
47
|
+
else
|
48
|
+
super
|
49
|
+
end
|
50
|
+
else
|
51
|
+
super
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def to_cache(request_body, response_data)
|
58
|
+
return if @cache.nil?
|
59
|
+
@cache[cache_key(request_body)] = Zlib::Deflate.deflate(response_data.to_json)
|
60
|
+
end
|
61
|
+
|
62
|
+
def from_cache(request_body)
|
63
|
+
return nil if @cache.nil?
|
64
|
+
result = @cache[cache_key(request_body)]
|
65
|
+
return nil if result.nil?
|
66
|
+
JSON.parse(Zlib::Inflate.inflate(result))
|
67
|
+
end
|
68
|
+
|
69
|
+
def cache_key(request_body)
|
70
|
+
Digest::MD5.hexdigest(request_body.to_s)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
# b/w compatibility with 0.07
|
76
|
+
|
77
|
+
Base = Client
|
78
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CapitalIQ
|
2
|
+
class Functions
|
3
|
+
GDSP ||= 'GDSP'
|
4
|
+
GDSPV ||= 'GDSPV'
|
5
|
+
GDSG ||= 'GDSG'
|
6
|
+
GDSHE ||= 'GDSHE'
|
7
|
+
GDSHV ||= 'GDSHV'
|
8
|
+
GDST ||= 'GDST'
|
9
|
+
|
10
|
+
@all ||= Set.new([GDSP,GDSPV,GDSG,GDSHE,GDSHV,GDST])
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
attr_reader :all
|
15
|
+
|
16
|
+
def is_array_function(function)
|
17
|
+
function == GDSHE || function == GDSHV
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/capital-iq/request.rb
CHANGED
@@ -1,14 +1,24 @@
|
|
1
1
|
module CapitalIQ
|
2
2
|
class Request
|
3
|
-
attr_reader :
|
4
|
-
|
5
|
-
def initialize(function, identifier, mnemonic, properties)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
attr_reader :function, :identifier, :mnemonic, :properties
|
4
|
+
|
5
|
+
def initialize(function, identifier, mnemonic, properties = nil)
|
6
|
+
@function = function
|
7
|
+
@identifier = identifier
|
8
|
+
@mnemonic = mnemonic
|
9
|
+
@properties = properties
|
10
|
+
|
11
|
+
@hash = {
|
12
|
+
function: self.function,
|
13
|
+
identifier: self.identifier,
|
14
|
+
mnemonic: self.mnemonic
|
15
|
+
}
|
16
|
+
@hash[:properties] = properties unless properties.nil?
|
11
17
|
end
|
12
|
-
|
18
|
+
|
19
|
+
def to_hash
|
20
|
+
@hash
|
21
|
+
end
|
22
|
+
|
13
23
|
end
|
14
24
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module CapitalIQ
|
2
|
+
class RequestResult < OpenStruct
|
3
|
+
def initialize(raw_result)
|
4
|
+
@raw_result = raw_result
|
5
|
+
super raw_result
|
6
|
+
end
|
7
|
+
|
8
|
+
def has_errors?(header=nil)
|
9
|
+
!self.ErrMsg.nil? && (header.nil? || header.in?(self.Headers))
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](header)
|
13
|
+
result = value_array(header)
|
14
|
+
return result if Functions.is_array_function(self.Function)
|
15
|
+
result.first
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def value_array(header)
|
20
|
+
header_idx = self.Headers.index(header)
|
21
|
+
raise ArgumentError, "Unknown header '#{header}'" if header_idx.nil?
|
22
|
+
self.Rows.collect do |row|
|
23
|
+
v = row["Row"][header_idx]
|
24
|
+
v == 'Data Unavailable' ? nil : v
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/capital-iq_spec.rb
CHANGED
@@ -1,7 +1,50 @@
|
|
1
|
-
require
|
1
|
+
require 'webmock/rspec'
|
2
|
+
require 'vcr'
|
3
|
+
require 'dotenv'
|
4
|
+
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/capital-iq.rb')
|
6
|
+
|
7
|
+
Dotenv.load
|
8
|
+
|
9
|
+
VCR.configure do |c|
|
10
|
+
c.cassette_library_dir = 'spec/vcr_cassettes'
|
11
|
+
c.hook_into :webmock
|
12
|
+
end
|
2
13
|
|
3
14
|
describe "CapitalIq" do
|
4
|
-
|
5
|
-
|
15
|
+
VCR.use_cassette("spec") do
|
16
|
+
client = CapitalIQ::Client.new(ENV['CAPIQ_USER'], ENV['CAPIQ_PWD'])
|
17
|
+
|
18
|
+
# Call based on a request object
|
19
|
+
# All requests passed to the base_request method are executed withing one roundtrip
|
20
|
+
req1 = CapitalIQ::Request.new(CapitalIQ::Functions::GDSHE, 'microsoft', 'IQ_COMPANY_ID_QUICK_MATCH')
|
21
|
+
req2 = CapitalIQ::Request.new(CapitalIQ::Functions::GDSHE, 'google', 'IQ_COMPANY_ID_QUICK_MATCH')
|
22
|
+
res = client.base_request([req1, req2])
|
23
|
+
|
24
|
+
# Shortened form - no need to create request objects explicitly, although they do get created underneath:
|
25
|
+
res = client.request_gdshe('microsoft', 'IQ_COMPANY_ID_QUICK_MATCH', {startRank:1, endRank:20})
|
26
|
+
|
27
|
+
# Returned values are accessed by identifier and mnemonic:
|
28
|
+
res_val = res['microsoft']['IQ_COMPANY_ID_QUICK_MATCH']
|
29
|
+
|
30
|
+
# When using GDSHE or GDSHV, the result is represented by an array (so we'll use 'first' here)
|
31
|
+
ms_id = res_val.first
|
32
|
+
|
33
|
+
# You can use 'scalar' when querying on a single identifier, so we can shorten the whole thing to:
|
34
|
+
ms_id = res.scalar['IQ_COMPANY_ID_QUICK_MATCH'].first
|
35
|
+
|
36
|
+
# Multiple identifier / single mnemonic requests
|
37
|
+
# This example generates two requests
|
38
|
+
res = client.request_gdshe(['microsoft', 'google'], 'IQ_COMPANY_ID_QUICK_MATCH', {startRank:1, endRank:20})
|
39
|
+
ms_id = res['microsoft']['IQ_COMPANY_ID_QUICK_MATCH'].first
|
40
|
+
google_id = res['google']['IQ_COMPANY_ID_QUICK_MATCH'].first
|
41
|
+
|
42
|
+
# Multiple identifier / multiple mnemonic queries
|
43
|
+
# This call generates (2 identifiers times 3 mnemonics) = 6 requests (they're still executed in a batch)
|
44
|
+
res = client.request_gdsp([ms_id, google_id], %w(IQ_COMPANY_WEBSITE IQ_COMPANY_NAME IQ_BUSINESS_DESCRIPTION))
|
45
|
+
# You can use the 'to_hash' method to retrieve all mnemonic values for a given identifier
|
46
|
+
ms_data = res[ms_id].to_hash # all mnemonics for ms_id
|
47
|
+
# Or you can retrieve all values for all identifiers
|
48
|
+
google_data = res[google_id].to_hash # all mnemonics for google_id
|
6
49
|
end
|
7
50
|
end
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capital-iq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Val Savvateev
|
8
|
+
- Greg Dean
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2015-02-24 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: httparty
|
@@ -56,30 +57,30 @@ dependencies:
|
|
56
57
|
name: rspec
|
57
58
|
requirement: !ruby/object:Gem::Requirement
|
58
59
|
requirements:
|
59
|
-
- -
|
60
|
+
- - ! '>='
|
60
61
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
62
|
+
version: '0'
|
62
63
|
type: :development
|
63
64
|
prerelease: false
|
64
65
|
version_requirements: !ruby/object:Gem::Requirement
|
65
66
|
requirements:
|
66
|
-
- -
|
67
|
+
- - ! '>='
|
67
68
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
69
|
+
version: '0'
|
69
70
|
- !ruby/object:Gem::Dependency
|
70
71
|
name: rdoc
|
71
72
|
requirement: !ruby/object:Gem::Requirement
|
72
73
|
requirements:
|
73
|
-
- -
|
74
|
+
- - ! '>='
|
74
75
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
76
|
+
version: '0'
|
76
77
|
type: :development
|
77
78
|
prerelease: false
|
78
79
|
version_requirements: !ruby/object:Gem::Requirement
|
79
80
|
requirements:
|
80
|
-
- -
|
81
|
+
- - ! '>='
|
81
82
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
83
|
+
version: '0'
|
83
84
|
- !ruby/object:Gem::Dependency
|
84
85
|
name: bundler
|
85
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,16 +99,16 @@ dependencies:
|
|
98
99
|
name: jeweler
|
99
100
|
requirement: !ruby/object:Gem::Requirement
|
100
101
|
requirements:
|
101
|
-
- -
|
102
|
+
- - ! '>='
|
102
103
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
104
|
+
version: '0'
|
104
105
|
type: :development
|
105
106
|
prerelease: false
|
106
107
|
version_requirements: !ruby/object:Gem::Requirement
|
107
108
|
requirements:
|
108
|
-
- -
|
109
|
+
- - ! '>='
|
109
110
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
111
|
+
version: '0'
|
111
112
|
- !ruby/object:Gem::Dependency
|
112
113
|
name: guard
|
113
114
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +151,20 @@ dependencies:
|
|
150
151
|
- - ! '>='
|
151
152
|
- !ruby/object:Gem::Version
|
152
153
|
version: '0'
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: dotenv
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
type: :development
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ! '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
153
168
|
- !ruby/object:Gem::Dependency
|
154
169
|
name: vcr
|
155
170
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,8 +179,22 @@ dependencies:
|
|
164
179
|
- - ! '>='
|
165
180
|
- !ruby/object:Gem::Version
|
166
181
|
version: '0'
|
182
|
+
- !ruby/object:Gem::Dependency
|
183
|
+
name: redis
|
184
|
+
requirement: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - ! '>='
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: '0'
|
189
|
+
type: :development
|
190
|
+
prerelease: false
|
191
|
+
version_requirements: !ruby/object:Gem::Requirement
|
192
|
+
requirements:
|
193
|
+
- - ! '>='
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: '0'
|
167
196
|
description: Ruby wrapper for the CapIQ API
|
168
|
-
email:
|
197
|
+
email: dev@exitround.com
|
169
198
|
executables: []
|
170
199
|
extensions: []
|
171
200
|
extra_rdoc_files:
|
@@ -181,15 +210,15 @@ files:
|
|
181
210
|
- VERSION
|
182
211
|
- capital-iq.gemspec
|
183
212
|
- lib/capital-iq.rb
|
184
|
-
- lib/capital-iq/
|
185
|
-
- lib/capital-iq/
|
213
|
+
- lib/capital-iq/api_error.rb
|
214
|
+
- lib/capital-iq/api_response.rb
|
215
|
+
- lib/capital-iq/cache.rb
|
216
|
+
- lib/capital-iq/client.rb
|
217
|
+
- lib/capital-iq/functions.rb
|
186
218
|
- lib/capital-iq/request.rb
|
187
|
-
- lib/capital-iq/
|
219
|
+
- lib/capital-iq/request_result.rb
|
188
220
|
- spec/capital-iq_spec.rb
|
189
|
-
|
190
|
-
- spec/responses/capiq_ibm.json
|
191
|
-
- spec/spec_helper.rb
|
192
|
-
homepage: http://github.com/seeingidog/capital-iq
|
221
|
+
homepage: http://github.com/exitround/capital-iq
|
193
222
|
licenses:
|
194
223
|
- MIT
|
195
224
|
metadata: {}
|
@@ -209,7 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
209
238
|
version: '0'
|
210
239
|
requirements: []
|
211
240
|
rubyforge_project:
|
212
|
-
rubygems_version: 2.
|
241
|
+
rubygems_version: 2.4.5
|
213
242
|
signing_key:
|
214
243
|
specification_version: 4
|
215
244
|
summary: Ruby wrapper for the CapIQ API
|
data/lib/capital-iq/api-error.rb
DELETED
data/lib/capital-iq/base.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
module CapitalIQ
|
2
|
-
class Base
|
3
|
-
ENDPOINT = 'https://sdk.gds.standardandpoors.com/gdssdk/rest/v2/clientservice.json'
|
4
|
-
include HTTParty
|
5
|
-
format :json
|
6
|
-
|
7
|
-
def initialize(username, password)
|
8
|
-
@auth = {username: username, password: password}
|
9
|
-
end
|
10
|
-
|
11
|
-
def request(function, identifier, mnemonic, properties)
|
12
|
-
request_body = Request.new(function, identifier, mnemonic, properties).request
|
13
|
-
response_data = self.class.post(ENDPOINT, body: request_body, basic_auth: @auth, ssl_version: :SSLv3).parsed_response
|
14
|
-
response = response_data[response_data.keys.first]
|
15
|
-
raise CapitalIQ::APIError if response == "Error Processing the Request"
|
16
|
-
raise CapitalIQ::APIError, response.first['ErrMsg'] if response.first['ErrMsg']
|
17
|
-
response.first
|
18
|
-
end
|
19
|
-
|
20
|
-
def gdst_request(identifier, mnemonic)
|
21
|
-
response = request('GDST', identifier, mnemonic, {PERIODTYPE: "IQ_FQ"})
|
22
|
-
response['Rows'].first['Row'].first
|
23
|
-
end
|
24
|
-
|
25
|
-
def gdsp_request(identifier, mnemonic)
|
26
|
-
response = request('GDSP', identifier, mnemonic, nil)
|
27
|
-
response['Rows'].first['Row'].first
|
28
|
-
end
|
29
|
-
|
30
|
-
def gdshe_request(identifier, mnemonic, properties)
|
31
|
-
response = request('GDSHE', identifier, mnemonic, properties)
|
32
|
-
response['Rows'].first['Row'].first
|
33
|
-
end
|
34
|
-
|
35
|
-
def quick_match(name)
|
36
|
-
gdshe_request(name, 'IQ_COMPANY_ID_QUICK_MATCH', {startRank:"1", endRank:"5"})
|
37
|
-
end
|
38
|
-
|
39
|
-
def match_and_request(name, mnemonic)
|
40
|
-
identifier = quick_match(name)
|
41
|
-
gdsp_request(identifier, mnemonic)
|
42
|
-
end
|
43
|
-
|
44
|
-
def transaction_list(identifier)
|
45
|
-
transaction_items = ['IQ_TR_CURRENCY', 'IQ_TR_TARGET_ID', 'IQ_TR_BUYER_ID', 'IQ_TR_SELLER_ID', 'IQ_TR_STATUS', 'IQ_TR_CLOSED_DATE', 'IQ_TR_IMPLIED_EV_FINAL']
|
46
|
-
walk_transactions(identifier, 'IQ_TRANSACTION_LIST_MA', transaction_items)
|
47
|
-
end
|
48
|
-
|
49
|
-
def pe_transactions(identifier)
|
50
|
-
transaction_items = ['IQ_PRIMARY_SIC_CODE', 'IQ_EMPLOYEES']
|
51
|
-
walk_transactions(identifier, 'IQ_INVESTMENTS_ALL_ID', transaction_items)
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
def walk_transactions(identifier, list_identifier, transaction_items)
|
56
|
-
acquisitions = {}
|
57
|
-
transaction_list = request('GDSHE', identifier, list_identifier, {startRank:"1", endRank:"20"})
|
58
|
-
return nil if transaction_list['Rows'].first["Row"].first == 'Data Unavailable'
|
59
|
-
transaction_list['Rows'].each do |transaction|
|
60
|
-
acquisitions[transaction['Row'].first] = transaction_items.map {|transaction_item|
|
61
|
-
Hash[transaction_item, request('GDSP', transaction['Row'].first, transaction_item, nil)['Rows'].map {|a|
|
62
|
-
next if a['Row'].first == 'Data Unavailable'
|
63
|
-
if a['Row'].first.include?(',')
|
64
|
-
a['Row'].first.split(', ')
|
65
|
-
else
|
66
|
-
a['Row'].first
|
67
|
-
end
|
68
|
-
}.first
|
69
|
-
]
|
70
|
-
}.reduce({}, :merge)
|
71
|
-
end
|
72
|
-
acquisitions
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
end
|
data/spec/request_spec.rb
DELETED
File without changes
|
data/spec/spec_helper.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
-
require 'rspec'
|
4
|
-
require 'capital-iq'
|
5
|
-
require 'webmock/rspec'
|
6
|
-
require 'vcr'
|
7
|
-
|
8
|
-
# Requires supporting files with custom matchers and macros, etc,
|
9
|
-
# in ./support/ and its subdirectories.
|
10
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
11
|
-
|
12
|
-
RSpec.configure do |config|
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
WebMock.disable_net_connect!
|
17
|
-
WebMock.stub_request(:post. "https://sdk.gds.standardandpoors.com/gdssdk/rest/v2/clientservice.json").to_return(:status => 200, :body => File.new(File.dirname(__FILE__) + '/responses/capiq_ibm.json'), :headers => {})
|
18
|
-
|
19
|
-
VCR.config do |c|
|
20
|
-
c.cassette_library_dir = 'spec/fixtures/dish_cassettes'
|
21
|
-
c.stub_with :webmock
|
22
|
-
end
|