Class: FrOData::Service

Inherits:
Object
  • Object
show all
Defined in:
lib/frodata/service.rb,
lib/frodata/service/request.rb,
lib/frodata/service/response.rb,
lib/frodata/service/response/xml.rb,
lib/frodata/service/response/atom.rb,
lib/frodata/service/response/json.rb,
lib/frodata/service/response/plain.rb
more...

Overview

Encapsulates the basic details and functionality needed to interact with an FrOData service.

Defined Under Namespace

Classes: Request, Response

Constant Summary collapse

DEFAULT_TIMEOUT =
20
METADATA_TIMEOUTS =
[20, 60]
MIME_TYPES =
{
  atom:  'application/atom+xml',
  json:  'application/json',
  xml:   'application/xml',
  plain: 'text/plain'
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(service_url, options = {}, &block) ⇒ FrOData::Service

Opens the service based on the requested URL and adds the service to Registry

Parameters:

  • service_url (String|Faraday::Connection)

    The URL to the desired FrOData service, or a Faraday connection object

  • options (Hash) (defaults to: {})

    options to pass to the service

[View source] [View on GitHub]

33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/frodata/service.rb', line 33

def initialize(service_url, options = {}, &block)
  @options = default_options.merge(options)
  if service_url.is_a? Faraday::Connection
    @connection  = service_url
    @service_url = connection.url_prefix.to_s
  else
    @service_url = service_url
    @connection  = default_connection(&block)
  end
  FrOData::ServiceRegistry.add(self)
  register_custom_types
end

Instance Attribute Details

#connectionObject (readonly)

The Faraday connection object used by the service to make requests

[View on GitHub]

9
10
11
# File 'lib/frodata/service.rb', line 9

def connection
  @connection
end

#optionsObject (readonly)

Service options

[View on GitHub]

13
14
15
# File 'lib/frodata/service.rb', line 13

def options
  @options
end

#service_urlObject (readonly)

The FrOData Service’s URL

[View on GitHub]

11
12
13
# File 'lib/frodata/service.rb', line 11

def service_url
  @service_url
end

Class Method Details

.open(service_url, options = {}, &block) ⇒ FrOData::Service

Deprecated.

Use Service.new instead.

Opens the service based on the requested URL and adds the service to Registry

Parameters:

  • service_url (String)

    the URL to the desired FrOData service

  • options (Hash) (defaults to: {})

    options to pass to the service

Returns:

[View source] [View on GitHub]

53
54
55
# File 'lib/frodata/service.rb', line 53

def self.open(service_url, options = {}, &block)
  Service.new(service_url, options, &block)
end

Instance Method Details

#[](entity_set_name) ⇒ FrOData::EntitySet

Retrieves the EntitySet associated with a specific EntityType by name

Parameters:

  • entity_set_name (to_s)

    the name of the EntitySet desired

Returns:

[View source] [View on GitHub]

102
103
104
# File 'lib/frodata/service.rb', line 102

def [](entity_set_name)
  entity_container[entity_set_name]
end

#complex_typesHash<String, FrOData::Schema::ComplexType>

Returns a list of ‘ComplexType`s used by the service.

Returns:

[View source] [View on GitHub]

125
126
127
128
129
130
131
# File 'lib/frodata/service.rb', line 125

def complex_types
  @complex_types ||= schemas.map do |namespace, schema|
    schema.complex_types.map do |name, complex_type|
      [ "#{namespace}.#{name}", complex_type ]
    end.to_h
  end.reduce({}, :merge)
end

#entity_containerObject

Returns the service’s EntityContainer (singleton)

Returns:

  • FrOData::EntityContainer

[View source] [View on GitHub]

88
89
90
# File 'lib/frodata/service.rb', line 88

def entity_container
  @entity_container ||= EntityContainer.new(self)
end

#entity_setsObject

Returns a hash of EntitySet names and their respective EntityType names

[View source] [View on GitHub]

94
95
96
# File 'lib/frodata/service.rb', line 94

def entity_sets
  entity_container.entity_sets
end

#entity_typesObject

Returns a list of ‘EntityType`s exposed by the service

[View source] [View on GitHub]

115
116
117
118
119
120
121
# File 'lib/frodata/service.rb', line 115

def entity_types
  @entity_types ||= schemas.map do |namespace, schema|
    schema.entity_types.map do |entity_type|
      "#{namespace}.#{entity_type}"
    end
  end.flatten
end

#enum_typesHash<String, FrOData::Schema::EnumType>

Returns a list of ‘EnumType`s used by the service

Returns:

[View source] [View on GitHub]

135
136
137
138
139
140
141
# File 'lib/frodata/service.rb', line 135

def enum_types
  @enum_types ||= schemas.map do |namespace, schema|
    schema.enum_types.map do |name, enum_type|
      [ "#{namespace}.#{name}", enum_type ]
    end.to_h
  end.reduce({}, :merge)
end

#execute(url_chunk, options = {}) ⇒ FrOData::Service::Response

Execute a request against the service

Parameters:

  • url_chunk (to_s)

    string to append to service URL

  • options (Hash) (defaults to: {})

    additional request options

Returns:

[View source] [View on GitHub]

153
154
155
156
# File 'lib/frodata/service.rb', line 153

def execute(url_chunk, options = {})
  options = (@options[:request] || {}).merge(options)
  Request.new(self, url_chunk, options).execute
end

#get_property_type(entity_name, property_name) ⇒ String

Get the property type for an entity from metadata.

Parameters:

  • entity_name (to_s)

    the fully qualified entity name

  • property_name (to_s)

    the property name needed

Returns:

  • (String)

    the name of the property’s type

Raises:

  • (ArgumentError)
[View source] [View on GitHub]

163
164
165
166
167
# File 'lib/frodata/service.rb', line 163

def get_property_type(entity_name, property_name)
  namespace, _, entity_name = entity_name.rpartition('.')
  raise ArgumentError, 'Namespace missing' if namespace.nil? || namespace.empty?
  schemas[namespace].get_property_type(entity_name, property_name)
end

#inspectObject

Returns a more compact inspection of the service object

[View source] [View on GitHub]

144
145
146
# File 'lib/frodata/service.rb', line 144

def inspect
  "#<#{self.class.name}:#{self.object_id} name='#{name}' service_url='#{self.service_url}'>"
end

#loggerLogger

Returns the logger instance used by the service. When Ruby on Rails has been detected, the service will use ‘Rails.logger`. The log level will NOT be changed.

When no Rails has been detected, a default logger will be used that logs to STDOUT with the log level supplied via options, or the default log level if none was given.

Returns:

  • (Logger)
[View source] [View on GitHub]

198
199
200
201
202
203
204
# File 'lib/frodata/service.rb', line 198

def logger
  @logger ||= options[:logger] || if defined?(Rails)
    Rails.logger
  else
    default_logger
  end
end

#logger=(custom_logger) ⇒ Object

Allows the logger to be set to a custom ‘Logger` instance.

Parameters:

  • custom_logger (Logger)
[View source] [View on GitHub]

208
209
210
# File 'lib/frodata/service.rb', line 208

def logger=(custom_logger)
  @logger = custom_logger
end

#metadataNokogiri::XML

Returns the service’s metadata definition.

Returns:

  • (Nokogiri::XML)
[View source] [View on GitHub]

71
72
73
# File 'lib/frodata/service.rb', line 71

def 
  @metadata ||= lambda {  }.call
end

#metadata_urlString

Returns the service’s metadata URL.

Returns:

  • (String)
[View source] [View on GitHub]

65
66
67
# File 'lib/frodata/service.rb', line 65

def 
  "#{service_url}/$metadata"
end

#nameString

Returns user supplied name for service, or its URL

Returns:

  • (String)
[View source] [View on GitHub]

59
60
61
# File 'lib/frodata/service.rb', line 59

def name
  @name ||= options[:name] || service_url
end

#namespaceString

Returns the default namespace, that is, the namespace of the schema that contains the service’s EntityContainer.

Returns:

  • (String)
[View source] [View on GitHub]

109
110
111
# File 'lib/frodata/service.rb', line 109

def namespace
  entity_container.namespace
end

#primary_key_for(entity_name) ⇒ String

Get the primary key for the supplied Entity.

Parameters:

  • entity_name (to_s)

    The fully qualified entity name

Returns:

  • (String)

Raises:

  • (ArgumentError)
[View source] [View on GitHub]

173
174
175
176
177
# File 'lib/frodata/service.rb', line 173

def primary_key_for(entity_name)
  namespace, _, entity_name = entity_name.rpartition('.')
  raise ArgumentError, 'Namespace missing' if namespace.nil? || namespace.empty?
  schemas[namespace].primary_key_for(entity_name)
end

#properties_for_entity(entity_name) ⇒ Hash

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Get the list of properties and their various options for the supplied Entity name.

Parameters:

  • entity_name (to_s)

Returns:

  • (Hash)

Raises:

  • (ArgumentError)
[View source] [View on GitHub]

184
185
186
187
188
# File 'lib/frodata/service.rb', line 184

def properties_for_entity(entity_name)
  namespace, _, entity_name = entity_name.rpartition('.')
  raise ArgumentError, 'Namespace missing' if namespace.nil? || namespace.empty?
  schemas[namespace].properties_for_entity(entity_name)
end

#schemasObject

Returns all of the service’s schemas.

[View source] [View on GitHub]

77
78
79
80
81
82
83
84
# File 'lib/frodata/service.rb', line 77

def schemas
  @schemas ||= .xpath('//Schema').map do |schema_xml|
    [
      schema_xml.attributes['Namespace'].value,
      Schema.new(schema_xml, self)
    ]
  end.to_h
end