reuters 0.8.1
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 +15 -0
- data/.gitignore +23 -0
- data/.rubocop.enabled.yml +23 -0
- data/.rubocop.yml +15 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +28 -0
- data/CONTRIBUTING.md +37 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +209 -0
- data/Rakefile +5 -0
- data/lib/reuters.rb +98 -0
- data/lib/reuters/builder.rb +117 -0
- data/lib/reuters/client.rb +12 -0
- data/lib/reuters/client/base.rb +132 -0
- data/lib/reuters/client/fundamentals.rb +20 -0
- data/lib/reuters/client/search.rb +19 -0
- data/lib/reuters/client/search/base.rb +26 -0
- data/lib/reuters/client/search/equity.rb +64 -0
- data/lib/reuters/client/token.rb +101 -0
- data/lib/reuters/credentials.rb +79 -0
- data/lib/reuters/namespaces.rb +25 -0
- data/lib/reuters/namespaces/base.rb +47 -0
- data/lib/reuters/namespaces/common.rb +30 -0
- data/lib/reuters/namespaces/fundamentals.rb +31 -0
- data/lib/reuters/namespaces/search.rb +48 -0
- data/lib/reuters/namespaces/search/equity.rb +32 -0
- data/lib/reuters/namespaces/token.rb +30 -0
- data/lib/reuters/response.rb +32 -0
- data/lib/reuters/version.rb +6 -0
- data/lib/reuters/wsdls.rb +25 -0
- data/lib/reuters/wsdls/base.rb +44 -0
- data/lib/reuters/wsdls/fundamentals.rb +21 -0
- data/lib/reuters/wsdls/search.rb +13 -0
- data/lib/reuters/wsdls/search/equity.rb +25 -0
- data/lib/reuters/wsdls/token.rb +22 -0
- data/reuters.gemspec +41 -0
- data/spec/fixtures/responses/token.xml +11 -0
- data/spec/reuters/builder_spec.rb +189 -0
- data/spec/reuters/client/fundamentals_spec.rb +11 -0
- data/spec/reuters/client/search/equity_spec.rb +46 -0
- data/spec/reuters/client/token_spec.rb +91 -0
- data/spec/reuters/client_spec.rb +0 -0
- data/spec/reuters/credentials_spec.rb +68 -0
- data/spec/reuters/namespaces/common_spec.rb +5 -0
- data/spec/reuters/namespaces/fundamentals_spec.rb +5 -0
- data/spec/reuters/namespaces/search/equity_spec.rb +5 -0
- data/spec/reuters/namespaces/search_spec.rb +31 -0
- data/spec/reuters/namespaces/token_spec.rb +5 -0
- data/spec/reuters/namespaces_spec.rb +31 -0
- data/spec/reuters/response_spec.rb +54 -0
- data/spec/reuters/version_spec.rb +9 -0
- data/spec/reuters/wsdls/fundamentals_spec.rb +5 -0
- data/spec/reuters/wsdls/search/equity_spec.rb +5 -0
- data/spec/reuters/wsdls/token_spec.rb +5 -0
- data/spec/reuters/wsdls_spec.rb +31 -0
- data/spec/reuters_spec.rb +10 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/client/search_shared.rb +5 -0
- data/spec/support/client_shared.rb +70 -0
- data/spec/support/configurable_shared.rb +9 -0
- data/spec/support/namespaces_actions_shared.rb +36 -0
- data/spec/support/namespaces_shared.rb +42 -0
- data/spec/support/wsdls_actions_shared.rb +36 -0
- data/spec/support/wsdls_shared.rb +53 -0
- metadata +333 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
module Reuters
|
2
|
+
|
3
|
+
# The {Credentials} module handles storing the
|
4
|
+
# configured credentials for the {Reuters} gem.
|
5
|
+
#
|
6
|
+
# @example Configuring credentials.
|
7
|
+
# Reuters.configure do |config|
|
8
|
+
# config.credentials do |login|
|
9
|
+
# # Set username
|
10
|
+
# login.username = "my_username"
|
11
|
+
# # Set my password
|
12
|
+
# login.password = "my_super_secret_password"
|
13
|
+
# # Set application ID
|
14
|
+
# login.application_id = "application_id"
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
module Credentials
|
18
|
+
|
19
|
+
# @!attribute username
|
20
|
+
# @!scope class
|
21
|
+
# The username to use to authenticate against the
|
22
|
+
# Reuter's API with.
|
23
|
+
# @return [String, Nil] The configured username, or nil if
|
24
|
+
# none is set.
|
25
|
+
|
26
|
+
# @!attribute password
|
27
|
+
# @!scope class
|
28
|
+
# The password to use to authenticate against the
|
29
|
+
# Reuter's API with.
|
30
|
+
# @return [String, Nil] The configured password, or nil if
|
31
|
+
# none is set.
|
32
|
+
|
33
|
+
# @!attribute app_id
|
34
|
+
# @!scope class
|
35
|
+
# The application ID to use for all requests to the
|
36
|
+
# Reuter's API.
|
37
|
+
# @return [String, Nil] The configured appication ID, or nil if
|
38
|
+
# none is set.
|
39
|
+
|
40
|
+
mattr_accessor :username
|
41
|
+
self.username = nil
|
42
|
+
|
43
|
+
mattr_accessor :password
|
44
|
+
self.password = nil
|
45
|
+
|
46
|
+
mattr_accessor :app_id
|
47
|
+
self.app_id = nil
|
48
|
+
|
49
|
+
# Yields the configured credentials to connect to the
|
50
|
+
# Reuter's API with.
|
51
|
+
#
|
52
|
+
# @yield [username, password, app_id] Yields authentication information.
|
53
|
+
#
|
54
|
+
# @yieldparam [String, Nil] username configured, or nil if one is not set.
|
55
|
+
# @yieldparam [String, Nil] password configured, or nil if one is not set.
|
56
|
+
# @yieldparam [String, Nil] app_id configured, or nil if one is not set.
|
57
|
+
def self.details
|
58
|
+
yield @@username, @@password, @@app_id
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns credentials that have been configured as a Hash.
|
62
|
+
#
|
63
|
+
# @return [Hash] the credentials that have been configured.
|
64
|
+
def self.to_h
|
65
|
+
{ username: username, password: password, app_id: app_id }
|
66
|
+
end
|
67
|
+
|
68
|
+
# Enables credentials to be configured by passing in
|
69
|
+
# itself as a block which enables static variables to
|
70
|
+
# be set.
|
71
|
+
#
|
72
|
+
# @yield [config] The credentials to be configured.
|
73
|
+
def self.configure
|
74
|
+
yield self
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'reuters/namespaces/base'
|
2
|
+
require 'reuters/namespaces/token'
|
3
|
+
require 'reuters/namespaces/common'
|
4
|
+
require 'reuters/namespaces/fundamentals'
|
5
|
+
require 'reuters/namespaces/search'
|
6
|
+
|
7
|
+
module Reuters
|
8
|
+
# The {Namespaces} module contains sets of endpoints that
|
9
|
+
# are used by Reuters in their internal API. Different
|
10
|
+
# Namespaces are used by various clients to gain access
|
11
|
+
# to data via API Calls to these namespaced endpoints.
|
12
|
+
module Namespaces
|
13
|
+
|
14
|
+
# Configure a Namespaces stored configurations.
|
15
|
+
#
|
16
|
+
# @note The passed in namespace is converted to a string
|
17
|
+
# and capitalized. It should be in the correct form.
|
18
|
+
#
|
19
|
+
# @param [Symbol] namespace to configure endpoints for.
|
20
|
+
def self.configure(namespace, &block)
|
21
|
+
const_get(namespace.to_s).configure(&block)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Reuters
|
2
|
+
module Namespaces
|
3
|
+
# The Base Namespace module is not meant to be directly
|
4
|
+
# used as it does not provided any Namespace definitions.
|
5
|
+
# Instead, it is included inside other Namespace modules as
|
6
|
+
# it provides useful helpers.
|
7
|
+
module Base
|
8
|
+
|
9
|
+
# Class based methods that are set in every
|
10
|
+
# module that includes this base module.
|
11
|
+
module ClassMethods
|
12
|
+
|
13
|
+
# Represents the fully resolved namespace endpoint
|
14
|
+
# for the Namespace module that has included this
|
15
|
+
# class method.
|
16
|
+
#
|
17
|
+
# @note The returned string is prefixed with the configured
|
18
|
+
# #namespaces_endpoint.
|
19
|
+
#
|
20
|
+
# @return [String] the fully resolved namespace endpoint.
|
21
|
+
def endpoint
|
22
|
+
"#{Reuters.namespaces_endpoint}/#{year}/#{month}/#{day}/webservices/rkd/#{name}"
|
23
|
+
end
|
24
|
+
|
25
|
+
# Enables this namespace to be configured by passing in
|
26
|
+
# itself as a block which enables static variables to
|
27
|
+
# be set.
|
28
|
+
#
|
29
|
+
# @yield [config] The namespace to be configured.
|
30
|
+
def configure
|
31
|
+
yield self
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# @!parse extend ClassMethods
|
37
|
+
extend ClassMethods
|
38
|
+
|
39
|
+
# Extend the including class with the defined
|
40
|
+
# class methods.
|
41
|
+
def self.included(klass)
|
42
|
+
klass.extend(ClassMethods)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Reuters
|
2
|
+
module Namespaces
|
3
|
+
# Common namespaces are used in most API Calls and represent
|
4
|
+
# the common set of Namespaces shared amongst most Reuters
|
5
|
+
# API requests.
|
6
|
+
module Common
|
7
|
+
|
8
|
+
# @!parse include Base
|
9
|
+
|
10
|
+
include Base
|
11
|
+
|
12
|
+
# Year for the Common endpoint.
|
13
|
+
mattr_accessor :year
|
14
|
+
self.year = '2006'
|
15
|
+
|
16
|
+
# Month for the Common endpoint.
|
17
|
+
mattr_accessor :month
|
18
|
+
self.month = '05'
|
19
|
+
|
20
|
+
# Day for the Common endpoint.
|
21
|
+
mattr_accessor :day
|
22
|
+
self.day = '01'
|
23
|
+
|
24
|
+
# Name for the Common endpoint.
|
25
|
+
mattr_accessor :name
|
26
|
+
self.name = 'Common_1'
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Reuters
|
2
|
+
module Namespaces
|
3
|
+
# The Fundamentals namespace can be used for ascertain
|
4
|
+
# important information about companies appearing on the
|
5
|
+
# Reuters API. This Namespace is used by all the accompanying
|
6
|
+
# Fundamental Client API calls.
|
7
|
+
module Fundamentals
|
8
|
+
|
9
|
+
# @!parse include Base
|
10
|
+
|
11
|
+
include Base
|
12
|
+
|
13
|
+
# Year for the Fundamentals endpoint.
|
14
|
+
mattr_accessor :year
|
15
|
+
self.year = '2009'
|
16
|
+
|
17
|
+
# Month for the Fundamentals endpoint.
|
18
|
+
mattr_accessor :month
|
19
|
+
self.month = '01'
|
20
|
+
|
21
|
+
# Day for the Fundamentals endpoint.
|
22
|
+
mattr_accessor :day
|
23
|
+
self.day = '26'
|
24
|
+
|
25
|
+
# Name for the Fundamentals endpoint.
|
26
|
+
mattr_accessor :name
|
27
|
+
self.name = 'Fundamentals_1'
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'reuters/namespaces/search/equity'
|
2
|
+
|
3
|
+
module Reuters
|
4
|
+
module Namespaces
|
5
|
+
# Represents the base search namespaces. Note that because
|
6
|
+
# search is quite a broad namespace inside the Reuters api,
|
7
|
+
# it is better to use a more specific namespace such as
|
8
|
+
# {Reuters::Namespaces::Search::Equity}.
|
9
|
+
module Search
|
10
|
+
|
11
|
+
# @!parse include Base
|
12
|
+
|
13
|
+
include Base
|
14
|
+
|
15
|
+
# Year for the Search Equity endpoint.
|
16
|
+
mattr_accessor :year
|
17
|
+
self.year = '2006'
|
18
|
+
|
19
|
+
# Month for the Search Equity endpoint.
|
20
|
+
mattr_accessor :month
|
21
|
+
self.month = '05'
|
22
|
+
|
23
|
+
# Day for the Search Equity endpoint.
|
24
|
+
mattr_accessor :day
|
25
|
+
self.day = '01'
|
26
|
+
|
27
|
+
# Name for the Search Equity endpoint.
|
28
|
+
mattr_accessor :name
|
29
|
+
self.name = 'Search'
|
30
|
+
|
31
|
+
# Define a custom name or endpoint that Reuters uses
|
32
|
+
# to define XML Namespaces inside the request body.
|
33
|
+
#
|
34
|
+
# @example Defining a custom namespace
|
35
|
+
# str = Reuters::Namespaces::Search.define(:equity_quote, :query_spec, 1)
|
36
|
+
# puts str #=> "http://.../Search/EquityQuote_QuerySpec_1"
|
37
|
+
# @param [String] strs to convert into a valid namespace
|
38
|
+
#
|
39
|
+
# @return [String] A full namespaced endpoint with a underscore
|
40
|
+
# separated camelized definition.
|
41
|
+
def self.define(*strs)
|
42
|
+
str = strs.map { |s| s.to_s.camelize }.join('_')
|
43
|
+
"#{endpoint}/#{str}"
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Reuters
|
2
|
+
module Namespaces
|
3
|
+
module Search
|
4
|
+
# Represents the Search Equity namespace that can be
|
5
|
+
# used to query for information about Company
|
6
|
+
# financial information.
|
7
|
+
module Equity
|
8
|
+
|
9
|
+
# @!parse include Base
|
10
|
+
|
11
|
+
include Base
|
12
|
+
|
13
|
+
# Year for the Search Equity endpoint.
|
14
|
+
mattr_accessor :year
|
15
|
+
self.year = '2006'
|
16
|
+
|
17
|
+
# Month for the Search Equity endpoint.
|
18
|
+
mattr_accessor :month
|
19
|
+
self.month = '05'
|
20
|
+
|
21
|
+
# Day for the Search Equity endpoint.
|
22
|
+
mattr_accessor :day
|
23
|
+
self.day = '01'
|
24
|
+
|
25
|
+
# Name for the Search Equity endpoint.
|
26
|
+
mattr_accessor :name
|
27
|
+
self.name = 'Search/EquityQuote_1'
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Reuters
|
2
|
+
module Namespaces
|
3
|
+
# Represents namespaces used by Reuters in their internal API for
|
4
|
+
# managing Access Tokens that are granted when valid credentials
|
5
|
+
# are used to authenticate.
|
6
|
+
module Token
|
7
|
+
|
8
|
+
# @!parse include Base
|
9
|
+
|
10
|
+
include Base
|
11
|
+
|
12
|
+
# Year for the TokenManagement endpoint.
|
13
|
+
mattr_accessor :year
|
14
|
+
self.year = '2006'
|
15
|
+
|
16
|
+
# Month for the TokenManagement endpoint.
|
17
|
+
mattr_accessor :month
|
18
|
+
self.month = '05'
|
19
|
+
|
20
|
+
# Day for the TokenManagement endpoint.
|
21
|
+
mattr_accessor :day
|
22
|
+
self.day = '01'
|
23
|
+
|
24
|
+
# Name for the TokenManagement endpoint.
|
25
|
+
mattr_accessor :name
|
26
|
+
self.name = 'TokenManagement_1'
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Reuters
|
2
|
+
# This class parses Savon response bodies into more practical
|
3
|
+
# accessible objects, by using a recursive strategy for parsing
|
4
|
+
# the content.
|
5
|
+
#
|
6
|
+
# @note All attributes for XML elements can be accessed via the
|
7
|
+
# attributes accessor.
|
8
|
+
class Response < Hash
|
9
|
+
|
10
|
+
attr_accessor :body, :attributes
|
11
|
+
|
12
|
+
def initialize(body = {})
|
13
|
+
unless body.empty?
|
14
|
+
merge! body
|
15
|
+
attribs = body.keep_if { |k| k.match(/@/) }
|
16
|
+
attribs = Hash[attribs.map { |k, v| [k.to_s.gsub(/@/, '').to_sym, v] }]
|
17
|
+
@attributes = self.class.new attribs
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def method_missing(name)
|
22
|
+
if key?(name)
|
23
|
+
if (val = self[name]).is_a? String
|
24
|
+
val
|
25
|
+
else
|
26
|
+
self.class.new val
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'reuters/wsdls/base'
|
2
|
+
require 'reuters/wsdls/token'
|
3
|
+
require 'reuters/wsdls/fundamentals'
|
4
|
+
require 'reuters/wsdls/search'
|
5
|
+
|
6
|
+
module Reuters
|
7
|
+
# The {Wsdls} module contains sets of endpoints that
|
8
|
+
# are used by Reuters in their internal API. Wsdls describe
|
9
|
+
# valid operations that can be carried out through API
|
10
|
+
# requests. Each API group should have an accompanying
|
11
|
+
# WSDL, as they are used to make {Client} requests.
|
12
|
+
module Wsdls
|
13
|
+
|
14
|
+
# Configure a Wsdls stored configurations.
|
15
|
+
#
|
16
|
+
# @note The passed in wsdl is converted to a string
|
17
|
+
# and capitalized. It should be in the correct form.
|
18
|
+
#
|
19
|
+
# @param [Symbol] wsdl to configure endpoints for.
|
20
|
+
def self.configure(wsdl, &block)
|
21
|
+
const_get(wsdl.to_s).configure(&block)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Reuters
|
2
|
+
module Wsdls
|
3
|
+
# The Base WSDL module is not meant to be directly
|
4
|
+
# used as it does not provided any WSDL definitions.
|
5
|
+
# Instead, it is included inside other WSDL modules as
|
6
|
+
# it provides useful helpers.
|
7
|
+
module Base
|
8
|
+
|
9
|
+
# Class based methods that are set in every
|
10
|
+
# module that includes this base module.
|
11
|
+
module ClassMethods
|
12
|
+
|
13
|
+
# Returns the fully resolved WSDL endpoint for the
|
14
|
+
# including Module.
|
15
|
+
#
|
16
|
+
# @return [String] the fully resolved wsdl endpoint
|
17
|
+
# (including http://...)
|
18
|
+
def endpoint
|
19
|
+
"#{Reuters.wsdl_endpoint}/#{name}/wsdl/#{method}"
|
20
|
+
end
|
21
|
+
|
22
|
+
# Enables this WSDL to be configured by passing in
|
23
|
+
# itself as a block which enables static variables to
|
24
|
+
# be set.
|
25
|
+
#
|
26
|
+
# @yield [config] The WSDL to be configured.
|
27
|
+
def configure
|
28
|
+
yield self
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
# @!parse extend ClassMethods
|
34
|
+
extend ClassMethods
|
35
|
+
|
36
|
+
# Extend the including class with the defined
|
37
|
+
# class methods.
|
38
|
+
def self.included(klass)
|
39
|
+
klass.extend(ClassMethods)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|