reuters 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +23 -0
  3. data/.rubocop.enabled.yml +23 -0
  4. data/.rubocop.yml +15 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +28 -0
  8. data/CONTRIBUTING.md +37 -0
  9. data/Gemfile +4 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +209 -0
  12. data/Rakefile +5 -0
  13. data/lib/reuters.rb +98 -0
  14. data/lib/reuters/builder.rb +117 -0
  15. data/lib/reuters/client.rb +12 -0
  16. data/lib/reuters/client/base.rb +132 -0
  17. data/lib/reuters/client/fundamentals.rb +20 -0
  18. data/lib/reuters/client/search.rb +19 -0
  19. data/lib/reuters/client/search/base.rb +26 -0
  20. data/lib/reuters/client/search/equity.rb +64 -0
  21. data/lib/reuters/client/token.rb +101 -0
  22. data/lib/reuters/credentials.rb +79 -0
  23. data/lib/reuters/namespaces.rb +25 -0
  24. data/lib/reuters/namespaces/base.rb +47 -0
  25. data/lib/reuters/namespaces/common.rb +30 -0
  26. data/lib/reuters/namespaces/fundamentals.rb +31 -0
  27. data/lib/reuters/namespaces/search.rb +48 -0
  28. data/lib/reuters/namespaces/search/equity.rb +32 -0
  29. data/lib/reuters/namespaces/token.rb +30 -0
  30. data/lib/reuters/response.rb +32 -0
  31. data/lib/reuters/version.rb +6 -0
  32. data/lib/reuters/wsdls.rb +25 -0
  33. data/lib/reuters/wsdls/base.rb +44 -0
  34. data/lib/reuters/wsdls/fundamentals.rb +21 -0
  35. data/lib/reuters/wsdls/search.rb +13 -0
  36. data/lib/reuters/wsdls/search/equity.rb +25 -0
  37. data/lib/reuters/wsdls/token.rb +22 -0
  38. data/reuters.gemspec +41 -0
  39. data/spec/fixtures/responses/token.xml +11 -0
  40. data/spec/reuters/builder_spec.rb +189 -0
  41. data/spec/reuters/client/fundamentals_spec.rb +11 -0
  42. data/spec/reuters/client/search/equity_spec.rb +46 -0
  43. data/spec/reuters/client/token_spec.rb +91 -0
  44. data/spec/reuters/client_spec.rb +0 -0
  45. data/spec/reuters/credentials_spec.rb +68 -0
  46. data/spec/reuters/namespaces/common_spec.rb +5 -0
  47. data/spec/reuters/namespaces/fundamentals_spec.rb +5 -0
  48. data/spec/reuters/namespaces/search/equity_spec.rb +5 -0
  49. data/spec/reuters/namespaces/search_spec.rb +31 -0
  50. data/spec/reuters/namespaces/token_spec.rb +5 -0
  51. data/spec/reuters/namespaces_spec.rb +31 -0
  52. data/spec/reuters/response_spec.rb +54 -0
  53. data/spec/reuters/version_spec.rb +9 -0
  54. data/spec/reuters/wsdls/fundamentals_spec.rb +5 -0
  55. data/spec/reuters/wsdls/search/equity_spec.rb +5 -0
  56. data/spec/reuters/wsdls/token_spec.rb +5 -0
  57. data/spec/reuters/wsdls_spec.rb +31 -0
  58. data/spec/reuters_spec.rb +10 -0
  59. data/spec/spec_helper.rb +17 -0
  60. data/spec/support/client/search_shared.rb +5 -0
  61. data/spec/support/client_shared.rb +70 -0
  62. data/spec/support/configurable_shared.rb +9 -0
  63. data/spec/support/namespaces_actions_shared.rb +36 -0
  64. data/spec/support/namespaces_shared.rb +42 -0
  65. data/spec/support/wsdls_actions_shared.rb +36 -0
  66. data/spec/support/wsdls_shared.rb +53 -0
  67. metadata +333 -0
@@ -0,0 +1,21 @@
1
+ module Reuters
2
+ module Wsdls
3
+ # Represents the Wsdl endpoint that will be used to
4
+ # make Fundamentals Reuters API calls.
5
+ module Fundamentals
6
+
7
+ # @!parse include Base
8
+
9
+ include Base
10
+
11
+ # Wsdl for the TokenManagement endpoint.
12
+ mattr_accessor :name
13
+ self.name = 'Fundamentals'
14
+
15
+ # Method to use for the Wsdl
16
+ mattr_accessor :method
17
+ self.method = 'Fundamentals_1_HttpAndRkdToken_Soap11.wsdl'
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ require 'reuters/wsdls/search/equity'
2
+
3
+ module Reuters
4
+ module Wsdls
5
+ # Represents the WSDL endpoints for all Search API calls.
6
+ #
7
+ # @note This Wsdl module does not contain any endpoint
8
+ # information, as it is recommended to use a specific
9
+ # endpoint, such as {Reuters::Wsdls::Search::Equity}.
10
+ module Search
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ module Reuters
2
+ module Wsdls
3
+ module Search
4
+ # The Equity Search WSDL endpoint is used by the
5
+ # {Reuters::Client::Search::Equity} class to discover
6
+ # and make search-based API calls.
7
+ module Equity
8
+
9
+ # @!parse include Base
10
+
11
+ include Base
12
+
13
+ # Wsdl for the TokenManagement endpoint.
14
+ mattr_accessor :name
15
+ self.name = 'Search'
16
+
17
+ # Default method for this Wsdl
18
+ mattr_accessor :method
19
+ self.name = 'EquityQuote_1_HttpAndRkdToken_Soap11.wsdl'
20
+
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ module Reuters
2
+ module Wsdls
3
+ # Represents the WSDL used by Reuters in their internal API for
4
+ # providing information related to the operations that can be
5
+ # performed to retrieve access tokens.
6
+ module Token
7
+
8
+ # @!parse include Base
9
+
10
+ include Base
11
+
12
+ # Wsdl for the TokenManagement endpoint.
13
+ mattr_accessor :name
14
+ self.name = 'TokenManagement'
15
+
16
+ # Method to use for the Wsdl
17
+ mattr_accessor :method
18
+ self.method = 'TokenManagement_1_HttpsAndAnonymous_Soap11.wsdl'
19
+
20
+ end
21
+ end
22
+ end
data/reuters.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'reuters/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+
8
+ # Only with >= Ruby 2
9
+ spec.required_ruby_version = '>= 2.0.0'
10
+
11
+ spec.name = "reuters"
12
+ spec.version = Reuters::VERSION
13
+ spec.authors = ['Stockflare']
14
+ spec.email = ['info@stockflare.com']
15
+ spec.summary = %q(Ruby client for Thomson Reuters Knowledge Direct (TRKD) API)
16
+ spec.description = %q(Ruby Gem for interacting with the Thomson Reuters Knowledge Direct API)
17
+ spec.homepage = 'https://github.com/stockflare/reuters'
18
+ spec.license = 'MIT'
19
+
20
+ spec.files = `git ls-files -z`.split("\x0")
21
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
22
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_dependency "savon", "~> 2.5.1"
26
+ spec.add_dependency "activesupport"
27
+
28
+ spec.add_development_dependency 'bundler', '~> 1.6'
29
+ spec.add_development_dependency 'rake'
30
+ spec.add_development_dependency 'rspec'
31
+ spec.add_development_dependency 'yard'
32
+ spec.add_development_dependency 'faker'
33
+ spec.add_development_dependency 'redcarpet'
34
+ spec.add_development_dependency 'cucumber'
35
+ spec.add_development_dependency 'aruba'
36
+ spec.add_development_dependency 'factory_girl'
37
+ spec.add_development_dependency 'codeclimate-test-reporter'
38
+ spec.add_development_dependency 'coveralls'
39
+ spec.add_development_dependency 'rubocop'
40
+
41
+ end
@@ -0,0 +1,11 @@
1
+ <s:Envelope
2
+ xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
3
+ <s:Body>
4
+ <CreateServiceToken_Response_1
5
+ xmlns="http://www.reuters.com/ns/2006/05/01/webservices/rkd/TokenManagement_1"
6
+ xmlns:global="http://www.reuters.com/ns/2006/05/01/webservices/rkd/Common_1">
7
+ <Expiration>2014-05-14T19:05:04.8429795Z</Expiration>
8
+ <global:Token>92C6ECD09825AC24C977F352FB31F8E4DF10BC84502A1CBDDF4636371E6714BA6DB028EAB6B832398B64AFE7895D53521C7F4CB84AF643D902E7707887C62DBEAF7398A9AB812B817F9C06B476EA6A017B629BE78FB965F4B2B46CCC7BCCF993</global:Token>
9
+ </CreateServiceToken_Response_1>
10
+ </s:Body>
11
+ </s:Envelope>
@@ -0,0 +1,189 @@
1
+ require 'spec_helper'
2
+
3
+ describe Reuters::Builder do
4
+
5
+ before { @builder = Reuters::Builder.new }
6
+
7
+ subject { @builder }
8
+
9
+ it { should respond_to(:attributes) }
10
+
11
+ it "should correctly camelcase a body key" do
12
+ @builder.test_method
13
+ expect(@builder.keys).to include("TestMethod")
14
+ end
15
+
16
+ it "should call a block" do
17
+ expect { |b| Reuters::Builder.new &b }.to yield_control.once
18
+ end
19
+
20
+ it "should pass itself to the block" do
21
+ expect { |b| Reuters::Builder.new &b }.to yield_with_args(Reuters::Builder)
22
+ end
23
+
24
+ it "should chain body calls inside the block" do
25
+ b = Reuters::Builder.new { |b| b.test_method }
26
+ expect(b).to include("TestMethod")
27
+ end
28
+
29
+ describe "return value of #keys" do
30
+ before do
31
+ @builder.foo_test
32
+ @builder.bar_test
33
+ end
34
+
35
+ it "should include camelcased keys" do
36
+ expect(@builder.keys).to include("FooTest", "BarTest")
37
+ end
38
+
39
+ it "should not include underscored keys" do
40
+ expect(@builder.keys).to_not include(:foo_test, :bar_test, 'foo_test', 'bar_test')
41
+ end
42
+
43
+ it "should not be empty" do
44
+ expect(@builder.keys).to_not be_empty
45
+ end
46
+
47
+ it "should add new keys" do
48
+ expect { @builder.david }.to change { @builder.keys }
49
+ end
50
+
51
+ it "should not include attributes!" do
52
+ expect(@builder.keys).to_not include(:attributes!)
53
+ end
54
+ end
55
+
56
+ describe "return value of #key?" do
57
+
58
+ before { @builder.test_build }
59
+
60
+ it "should allow camelcase keys" do
61
+ expect(@builder.key?("TestBuild")).to be_true
62
+ end
63
+
64
+ it "should allow underscore keys" do
65
+ expect(@builder.key?(:test_build)).to be_true
66
+ end
67
+
68
+ end
69
+
70
+ describe "when a block is passed to a nested builder" do
71
+
72
+ it "should call the block" do
73
+ expect { |b| @builder.foo.bar &b }.to yield_control.once
74
+ end
75
+
76
+ it "should enable modifications inside the block" do
77
+ @builder.foo.bar { |body| body.test = 1 }
78
+ expect(@builder.foo.bar.key?(:test)).to_not be_false
79
+ end
80
+
81
+ end
82
+
83
+ describe "when attributes are set" do
84
+
85
+ let(:attributes) { { "xmlns" => "http://..." } }
86
+
87
+ it "should set attributes" do
88
+ @builder.test(attributes)
89
+ expect(@builder[:attributes!]["Test"]).to include "Xmlns"
90
+ end
91
+
92
+ describe "when camelcasing is disabled" do
93
+
94
+ it "should still camcelcase the key" do
95
+ @builder.test(attributes, false)
96
+ expect(@builder[:attributes!]).to include "Test"
97
+ end
98
+
99
+ it "should set attributes that aren't camelcased" do
100
+ @builder.test(attributes, false)
101
+ expect(@builder[:attributes!]["Test"]).to include "xmlns"
102
+ end
103
+
104
+ end
105
+
106
+ end
107
+
108
+ describe "when a chain of keys is set" do
109
+
110
+ it "should set all keys" do
111
+ expect(@builder.this.is.a.chain).to_not be_nil
112
+ end
113
+
114
+ it "should set attributes for a nested key" do
115
+ @builder.this(a: 1).is.a(b: 2).chain
116
+ expect(@builder[:attributes!]).to include({"This" => { "A" => 1}})
117
+ end
118
+
119
+ it "should set nested attributes for a nested key" do
120
+ @builder.this(a: 1).is.a(b: 2).chain
121
+ expect(@builder.this.is[:attributes!]).to include({"A" => { "B" => 2}})
122
+ end
123
+
124
+ end
125
+
126
+ describe "when the value is explicitly set" do
127
+
128
+ it "should set a string" do
129
+ @builder.test = "foobar"
130
+ expect(@builder).to include({"Test" => "foobar"})
131
+ end
132
+
133
+ it "should set an array" do
134
+ @builder.test = [1,2,3,4]
135
+ expect(@builder).to include({"Test" => [1,2,3,4]})
136
+ end
137
+
138
+ it "should set an integer" do
139
+ @builder.test = 1
140
+ expect(@builder).to include({"Test" => 1})
141
+ end
142
+
143
+ end
144
+
145
+ it "should set attributes for a key" do
146
+ @builder.test a: true
147
+ expect(@builder[:attributes!]).to include("Test")
148
+ end
149
+
150
+ it "should camelize attribute keys" do
151
+ @builder.test a: 1
152
+ expect(@builder[:attributes!]["Test"]).to include "A"
153
+ end
154
+
155
+ it "should set multiple attributes for a key" do
156
+ @builder.test a: 1, b: 2, c: 3
157
+ expected_attributes = { "A" => 1, "B" => 2, "C" => 3 }
158
+ expect(@builder[:attributes!]["Test"]).to include expected_attributes
159
+ end
160
+
161
+ describe "when the key is an array" do
162
+
163
+ let(:test_array) { [{a: 1, b: 2}, {a: 3, b: 4}] }
164
+
165
+ before { @builder.test test_array }
166
+
167
+ it "should set an array for the key" do
168
+ expect(@builder["Test"]).to be_a(Array)
169
+ end
170
+
171
+ it "should set an array of the correct length" do
172
+ expect(@builder["Test"].count).to eq test_array.count
173
+ end
174
+
175
+ it "should set an attribute for the key" do
176
+ expect(@builder[:attributes!]["Test"]).to be_a(Hash)
177
+ end
178
+
179
+ it "should include the attribute keys" do
180
+ expect(@builder[:attributes!]["Test"].keys).to include("A", "B")
181
+ end
182
+
183
+ it "should order the attributes correctly" do
184
+ expect(@builder[:attributes!]["Test"]["A"]).to eq ["1","3"]
185
+ end
186
+
187
+ end
188
+
189
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Reuters::Client::Fundamentals do
4
+
5
+ before { @fundamentals = Reuters::Client::Fundamentals.new }
6
+
7
+ subject { @fundamentals }
8
+
9
+ it_behaves_like "a client class"
10
+
11
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Reuters::Client::Search::Equity do
4
+
5
+ before { @equity = Reuters::Client::Search::Equity.new }
6
+
7
+ subject { @equity }
8
+
9
+ it_behaves_like "a search client class"
10
+
11
+ it { should respond_to(:data_type) }
12
+ it { should respond_to(:query_spec) }
13
+
14
+ describe "return value of #data_type" do
15
+
16
+ it "should be a string" do
17
+ expect(@equity.data_type).to be_a(String)
18
+ end
19
+
20
+ it "should be a resolved namespace" do
21
+ expect(@equity.data_type).to include(Reuters.namespaces_endpoint)
22
+ end
23
+
24
+ it "should include the camelcased data type" do
25
+ expect(@equity.data_type).to include("QuerySpecDataTypes")
26
+ end
27
+
28
+ end
29
+
30
+ describe "return value of #query_spec" do
31
+
32
+ it "should be a string" do
33
+ expect(@equity.query_spec).to be_a(String)
34
+ end
35
+
36
+ it "should be a resolved namespace" do
37
+ expect(@equity.query_spec).to include(Reuters.namespaces_endpoint)
38
+ end
39
+
40
+ it "should include the camelcased specification namespace" do
41
+ expect(@equity.query_spec).to include("EquityQuote_QuerySpec_1")
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+
3
+ describe Reuters::Client::Token do
4
+
5
+ before { @token = Reuters::Client::Token.new }
6
+
7
+ subject { @token }
8
+
9
+ it_behaves_like "a client class"
10
+
11
+ it { should respond_to(:token) }
12
+ it { should respond_to(:expiration) }
13
+
14
+ it { should respond_to(:username) }
15
+ it { should respond_to(:password) }
16
+ it { should respond_to(:app_id) }
17
+
18
+ it { should respond_to(:authenticate) }
19
+ it { should respond_to(:header) }
20
+ it { should respond_to(:message) }
21
+
22
+ describe "return value of #message" do
23
+
24
+ it "should be a request builder object" do
25
+ expect(@token.message).to be_an_instance_of(Reuters::Builder)
26
+ end
27
+
28
+ it "should include necessary authentication information" do
29
+ expect(@token.message.keys).to include("ApplicationID", "Username", "Password")
30
+ end
31
+
32
+ end
33
+
34
+ describe "return value of #header" do
35
+
36
+ include Savon::SpecHelper
37
+
38
+ before(:all) { savon.mock! }
39
+ after(:all) { savon.unmock! }
40
+
41
+ before do
42
+ test_response = File.read("spec/fixtures/responses/token.xml")
43
+ savon.expects(:create_service_token_1).with(message: :any).returns(test_response)
44
+ end
45
+
46
+ it "should be a request builder object" do
47
+ expect(@token.header).to be_an_instance_of(Reuters::Builder)
48
+ end
49
+
50
+ it "should include the token and application id" do
51
+ expect(@token.header.authorization.keys).to include("Token", "ApplicationID")
52
+ end
53
+
54
+ end
55
+
56
+ describe "when the user attempts to #authenticate" do
57
+
58
+ describe "when the credentials are valid" do
59
+
60
+ include Savon::SpecHelper
61
+
62
+ before(:all) { savon.mock! }
63
+ after(:all) { savon.unmock! }
64
+
65
+ let(:test_response) { File.read("spec/fixtures/responses/token.xml") }
66
+
67
+ before { savon.expects(:create_service_token_1).with(message: :any).returns(test_response) }
68
+
69
+ it "should return a token response object" do
70
+ expect(@token.authenticate).to be_an_instance_of Reuters::Response
71
+ end
72
+
73
+ it "authenticates the user with Reuters API" do
74
+ expect { @token.authenticate }.to_not raise_error
75
+ end
76
+
77
+ it "populates the response object" do
78
+ expect(@token.authenticate.token).to_not be_nil
79
+ end
80
+
81
+ end
82
+
83
+ describe "when the credentials are not valid" do
84
+ it "raises a Savon SOAP Client Error" do
85
+ expect { @token.authenticate }.to raise_error
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ end