Module: Angus::Remote::ServiceDirectory

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

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.



83
84
85
86
87
88
89
# File 'lib/angus/remote/service_directory.rb', line 83

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.



54
55
56
57
58
59
60
# File 'lib/angus/remote/service_directory.rb', line 54

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.



166
167
168
169
170
171
172
173
174
175
176
# File 'lib/angus/remote/service_directory.rb', line 166

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, code_name, version)
    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)


138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/angus/remote/service_directory.rb', line 138

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, code_name, version)

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

  service_definition.merge(proxy_service_definition)

  service_definition
end

.lookup(*args) ⇒ Object

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



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/angus/remote/service_directory.rb', line 17

def self.lookup(*args)
  if args.length == 1
    definition = args.first
    code_name = definition.delete(:code_name)
    version = definition.delete(:version)
    set_service_configuration(code_name, version, definition)
  else
    code_name, version = args
  end

  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),
                                          service_settings(code_name, version))
    @clients_cache[[code_name, version]] = client

  rescue Errno::ECONNREFUSED => e
    raise RemoteConnectionError.new("#{self.api_url(code_name, version)} - #{e.class}: #{e.message}")
  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)


69
70
71
72
73
# File 'lib/angus/remote/service_directory.rb', line 69

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_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.



116
117
118
119
120
121
122
123
124
125
126
# File 'lib/angus/remote/service_directory.rb', line 116

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_settings(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.



238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/angus/remote/service_directory.rb', line 238

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

  config = service_configuration(code_name)

  service_settings = config["v#{version}"] or
    raise ServiceConfigurationNotFound.new(code_name, version)

  service_settings['code_name'] = code_name
  service_settings['version'] = version

  service_settings
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.



98
99
100
101
102
103
104
105
106
# File 'lib/angus/remote/service_directory.rb', line 98

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