Module: Angus::Remote::ServiceDirectory

Defined in:
lib/angus/remote/service_directory.rb

Constant Summary collapse

SERVICES_CONFIGURATION_FILE =

Path to the configuration file that has the information about the doc_url and api_url

'config/services.yml'

Class Method Summary collapse

Class Method Details

.api_url(code_name, version = nil) ⇒ Object

Returns the api url from the configuration file

If no version given, it reads the version from the configuration file.

Parameters:

  • code_name (String)

    Name of the service.

  • version (String) (defaults to: nil)

    Version of the service.

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



76
77
78
79
80
81
82
# File 'lib/angus/remote/service_directory.rb', line 76

def self.api_url(code_name, version = nil)
  version ||= service_version(code_name)

  config = service_configuration(code_name)

  config["v#{version}"]["api_url"]
end

.doc_url(code_name, version = nil) ⇒ Object

Returns the documentation url from the configuration file

If no version given, it reads the version from the configuration file.

Parameters:

  • code_name (String)

    Name of the service.

  • version (String) (defaults to: nil)

    Version of the service.

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



47
48
49
50
51
52
53
# File 'lib/angus/remote/service_directory.rb', line 47

def self.doc_url(code_name, version = nil)
  version ||= service_version(code_name)

  config = service_configuration(code_name)

  config["v#{version}"]['doc_url']
end

.get_service_definition(code_name, version = nil) ⇒ Angus::SDoc::Definitions::Service

Requests a service definition.

Parameters:

  • code_name (String)

    Service code name

  • version (String) (defaults to: nil)

    Service version

Returns:

  • (Angus::SDoc::Definitions::Service)

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



173
174
175
176
177
178
179
180
181
182
183
# File 'lib/angus/remote/service_directory.rb', line 173

def self.get_service_definition(code_name, version = nil)
  version ||= service_version(code_name)
  doc_url = self.doc_url(code_name, version)

  if doc_url.match('file://(.*)') || doc_url.match('file:///(.*)')
    Angus::SDoc::DefinitionsReader.service_definition($1)
  else
    definition_hash = fetch_remote_service_definition(doc_url)
    Angus::SDoc::DefinitionsReader.build_service_definition(definition_hash)
  end
end

.join_proxy(code_name, version, remote_code_name) ⇒ Angus::SDoc::Definitions::Service

Queries a service for definitions of proxy operations for the given remote service.

Merges those definitions and returns the result.

Parameters:

  • code_name (String)

    Service that acts as a proxy.

  • version (String)

    Service version.

  • remote_code_name (String)

    Remote service that implements operations for the proxy service

Returns:

  • (Angus::SDoc::Definitions::Service)


145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/angus/remote/service_directory.rb', line 145

def self.join_proxy(code_name, version, remote_code_name)

  service_definition = self.service_definition(code_name, version)

  @service_definitions_proxies ||= []
  if @service_definitions_proxies.include?([code_name, version, remote_code_name])
    return service_definition
  end

  proxy_doc_url = self.proxy_doc_url(code_name, version, remote_code_name)

  definition_hash = fetch_remote_service_definition(proxy_doc_url)

  proxy_service_definition = Angus::SDoc::DefinitionsReader.build_service_definition(definition_hash)

  service_definition.merge(proxy_service_definition)

  service_definition
end

.lookup(code_name, version = nil) ⇒ Object

Builds and returns a Client object for the service and version received



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/angus/remote/service_directory.rb', line 19

def self.lookup(code_name, version = nil)

  version ||= service_version(code_name)

  @clients_cache ||= {}
  if @clients_cache.include?([code_name, version])
    return @clients_cache[[code_name, version]]
  end

  begin
    service_definition = self.service_definition(code_name, version)
    client = Angus::Remote::Builder.build(code_name, service_definition,
                                            self.api_url(code_name, version))
    @clients_cache[[code_name, version]] = client

  rescue Errno::ECONNREFUSED
    raise RemoteConnectionError.new(self.api_url(code_name, version))
  end
end

.proxy_doc_url(code_name, version, remote_code_name) ⇒ String

Returns the documentation url for proxy operations hosted by the service.

Parameters:

  • code_name (String)

    Service code name.

  • version (String)

    Service version.

  • remote_code_name (String)

    Service which implements proxy operations.

Returns:

  • (String)


62
63
64
65
66
# File 'lib/angus/remote/service_directory.rb', line 62

def self.proxy_doc_url(code_name, version, remote_code_name)
  doc_url = self.doc_url(code_name, version)

  "#{doc_url}/proxy/#{remote_code_name}"
end

.service_configuration(code_name) ⇒ Hash

Returns the connection configuration for a given service.

Parameters:

  • code_name (String)

    Service name

Returns:

  • (Hash)

Raises:

  • (ServiceConfigurationNotFound)

    When no configuration for the given service



108
109
110
111
112
113
# File 'lib/angus/remote/service_directory.rb', line 108

def self.service_configuration(code_name)
  @services_configuration ||= YAML.load_file(SERVICES_CONFIGURATION_FILE)

  @services_configuration[code_name] or
    raise ServiceConfigurationNotFound.new(code_name)
end

.service_definition(code_name, version = nil) ⇒ Angus::SDoc::Definitions::Service

Returns the service’s definition for the given service name and version

Parameters:

  • code_name (String)

    Service that acts as a proxy.

  • version (String) (defaults to: nil)

    Service version.

Returns:

  • (Angus::SDoc::Definitions::Service)

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



123
124
125
126
127
128
129
130
131
132
133
# File 'lib/angus/remote/service_directory.rb', line 123

def self.service_definition(code_name, version = nil)
  version ||= service_version(code_name)

  @service_definitions_cache ||= {}
  if @service_definitions_cache.include?([code_name, version])
    return @service_definitions_cache[[code_name, version]]
  end

  service_definition = self.get_service_definition(code_name, version)
  @service_definitions_cache[[code_name, version]] = service_definition
end

.service_version(code_name) ⇒ String

Returns the configured version.

Parameters:

  • code_name (String)

    Service name

Returns:

  • (String)

    Version. Ex: 0.1

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



91
92
93
94
95
96
97
98
99
# File 'lib/angus/remote/service_directory.rb', line 91

def self.service_version(code_name)
  versions = service_configuration(code_name).keys

  if versions.length == 1
    versions.first.gsub(/^v/, '')
  else
    raise TooManyServiceVersions.new(code_name)
  end
end