class Aws::Resources::Definition

Given a resource definition document, a {Definition} can build a set of related resource classes.

Public Class Methods

new(definition = {}, options = {}) click to toggle source

@param [Hash] definition @option options [String] :source_path

# File lib/aws-sdk-resources/definition.rb, line 12
def initialize(definition = {}, options = {})
  @source = definition
  @source_path = options[:source_path]
end

Public Instance Methods

apply(namespace) click to toggle source

@param [Module<Service>] namespace @return [void]

# File lib/aws-sdk-resources/definition.rb, line 19
def apply(namespace)
  build_resource_classes(namespace)
  each_resource_class(namespace) do |resource, definition|
    define_load(namespace, resource, definition['load'])
    define_actions(namespace, resource, definition['actions'] || {})
    define_batch_actions(namespace, resource, definition['batchActions'] || {})
    define_waiters(namespace, resource, definition['waiters'] || {})
    define_has(namespace, resource, definition['has'] || {})
    define_has_many(namespace, resource, definition['hasMany'] || {})
    define_data_attributes(namespace, resource, definition)
  end
end

Private Instance Methods

boolean_request_param(definition)
build_basic_action(namespace, resource, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 126
def build_basic_action(namespace, resource, definition)
  Operations::Operation.new(
    request: define_request(definition['request']),
    source: source(definition)
  )
end
build_operation(namespace, resource, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 118
def build_operation(namespace, resource, definition)
  if definition['resource']
    build_resource_action(namespace, resource, definition)
  else
    build_basic_action(namespace, resource, definition)
  end
end
build_resource_action(namespace, resource, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 133
def build_resource_action(namespace, resource, definition)
  builder = define_builder(namespace, definition['resource'])
  if path = definition['resource']['path']
    builder.sources << BuilderSources::ResponsePath.new({
      source: underscore(path),
      target: :data,
    })
  end
  Operations::ResourceOperation.new(
    request: define_request(definition['request']),
    builder: builder,
    source: source(definition)
  )
end
build_resource_classes(namespace) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 34
def build_resource_classes(namespace)
  each_definition do |name, definition|
    resource_class = Class.new(Resource)
    resource_class.client_class = namespace::Client
    resource_class.resource_name = name
    (definition['identifiers'] || []).each do |identifier|
      resource_class.add_identifier(underscore(identifier['name']))
    end
    namespace.const_set(name, resource_class)
  end
end
build_waiter_operation(namespace, resource, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 163
def build_waiter_operation(namespace, resource, definition)
  Operations::WaiterOperation.new(
    waiter_name: underscore(definition['waiterName']).to_sym,
    waiter_params: request_params(definition['params']),
    path: underscore(definition['path'])
  )
end
builder_sources(sources) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 253
def builder_sources(sources)
  sources.map do |definition|
    send("#{definition['source']}_builder_source", definition)
  end
end
dangerous?(name, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 61
def dangerous?(name, definition)
  if
    name.match(/delete/i) ||
    name.match(/terminate/i) ||
    definition['request']['operation'].match(/delete/i) ||
    definition['request']['operation'].match(/terminate/i)
  then
    true
  else
    false
  end
end
data_attribute_is_an_identifier?(attr_name, resource, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 90
def data_attribute_is_an_identifier?(attr_name, resource, definition)
  resource.identifiers.include?(attr_name) ||
  definition['identifiers'].any? { |i| underscore(i['dataMember']) == attr_name.to_s }
end
data_builder_source(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 272
def data_builder_source(definition)
  BuilderSources::DataMember.new({
    source: underscore(definition['path']),
    target: underscore(definition['target']),
  })
end
data_request_param(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 201
def data_request_param(definition)
  RequestParams::DataMember.new({
    target: underscore(definition['target']),
    path: underscore(definition['path']),
  })
end
define_actions(namespace, resource, actions) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 104
def define_actions(namespace, resource, actions)
  actions.each do |name, action|
    operation = build_operation(namespace, resource, action)
    resource.add_operation(underscore(name), operation)
  end
end
define_batch_actions(namespace, resource, batch_actions) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 52
def define_batch_actions(namespace, resource, batch_actions)
  batch_actions.each do |name, definition|
    method_name = "batch_" + underscore(name)
    method_name += '!' if dangerous?(name, definition)
    operation = build_operation(namespace, resource, definition)
    resource.add_batch_operation(method_name, operation)
  end
end
define_builder(namespace, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 246
def define_builder(namespace, definition)
  Builder.new(
    resource_class: namespace.const_get(definition['type']),
    sources: builder_sources(definition['identifiers'] || [])
  )
end
define_data_attributes(namespace, resource, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 74
def define_data_attributes(namespace, resource, definition)
  if shape_name = definition['shape']
    shape = resource.client_class.api.metadata['shapes'][shape_name]
    shape.member_names.each do |member_name|
      if
        resource.instance_methods.include?(member_name) ||
        data_attribute_is_an_identifier?(member_name, resource, definition)
      then
        next # some data attributes are duplicates to identifiers
      else
        resource.add_data_attribute(member_name)
      end
    end
  end
end
define_has(namespace, resource, has) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 226
def define_has(namespace, resource, has)
  has.each do |name, definition|
    has_operation(namespace, resource, name, definition)
  end
end
define_has_many(namespace, resource, has_many) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 219
def define_has_many(namespace, resource, has_many)
  has_many.each do |name, definition|
    operation = has_many(namespace, resource, definition)
    resource.add_operation(underscore(name), operation)
  end
end
define_load(namespace, resource, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 95
def define_load(namespace, resource, definition)
  return unless definition
  resource.load_operation = Operations::LoadOperation.new(
    request: define_request(definition['request']),
    path: underscore(definition['path']),
    source: source(definition),
  )
end
define_request(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 181
def define_request(definition)
  Request.new(
    method_name: underscore(definition['operation']),
    params: request_params(definition['params'] || [])
  )
end
define_waiters(namespace, resource, waiters) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 111
def define_waiters(namespace, resource, waiters)
  waiters.each do |name, definition|
    operation = build_waiter_operation(namespace, resource, definition)
    resource.add_operation("wait_until_#{underscore(name)}", operation)
  end
end
each_definition() { |'Resource', svc_definition| ... } click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 308
def each_definition(&block)
  yield('Resource', svc_definition)
  resource_definitions.each(&block)
end
each_resource_class(namespace) { |const, definition| ... } click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 46
def each_resource_class(namespace, &block)
  each_definition do |name, definition|
    yield(namespace.const_get(name), definition)
  end
end
float_request_param(definition)
has_many(namespace, resource, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 148
def has_many(namespace, resource, definition)
  builder = define_builder(namespace, definition['resource'])
  if path = definition['resource']['path']
    builder.sources << BuilderSources::ResponsePath.new({
      source: underscore(path),
      target: :data,
    })
  end
  Operations::HasManyOperation.new(
    request: define_request(definition['request']),
    builder: builder,
    source: source(definition),
    limit_key: limit_key(resource, definition))
end
has_operation(namespace, resource, name, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 232
def has_operation(namespace, resource, name, definition)
  builder = define_builder(namespace, definition['resource'])
  if path = definition['resource']['path']
    builder.sources << BuilderSources::DataMember.new({
      source: underscore(path),
      target: :data,
    })
  end
  operation = Operations::HasOperation.new(
    builder: builder,
    source: source(definition))
  resource.add_operation(underscore(name), operation)
end
identifier_builder_source(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 265
def identifier_builder_source(definition)
  BuilderSources::Identifier.new({
    source: underscore(definition['name']),
    target: underscore(definition['target']),
  })
end
identifier_request_param(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 194
def identifier_request_param(definition)
  RequestParams::Identifier.new({
    target: underscore(definition['target']),
    name: underscore(definition['name']).to_sym,
  })
end
input_builder_source(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 259
def input_builder_source(definition)
  BuilderSources::Argument.new({
    target: underscore(definition['target']),
  })
end
integer_request_param(definition)
limit_key(resource, definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 171
def limit_key(resource, definition)
  operation_name = definition['request']['operation']
  operation = resource.client_class.api.operation(underscore(operation_name))
  if operation[:pager]
    operation[:pager].limit_key
  else
    nil
  end
end
null_request_param(definition)
requestParameter_builder_source(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 279
def requestParameter_builder_source(definition)
  BuilderSources::RequestParameter.new({
    source: underscore(definition['path']),
    target: underscore(definition['target']),
  })
end
request_params(params) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 188
def request_params(params)
  params.map do |definition|
    send("#{definition['source']}_request_param", definition)
  end
end
resource_definitions() click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 304
def resource_definitions
  @source['resources'] || {}
end
response_builder_source(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 286
def response_builder_source(definition)
  BuilderSources::ResponsePath.new({
    source: underscore(definition['path']),
    target: underscore(definition['target']),
  })
end
source(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 319
def source(definition)
  if ENV['SOURCE']
    Source.new(definition, @source_path)
  else
    nil
  end
end
string_builder_source(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 293
def string_builder_source(definition)
  BuilderSources::ResponsePath.new({
    source: underscore(definition['value']),
    target: underscore(definition['target']),
  })
end
string_request_param(definition) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 208
def string_request_param(definition)
  RequestParams::Literal.new({
    target: underscore(definition['target']),
    value: definition['value'],
  })
end
svc_definition() click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 300
def svc_definition
  @source['service'] || {}
end
underscore(str) click to toggle source
# File lib/aws-sdk-resources/definition.rb, line 313
def underscore(str)
  if str
    str.gsub(/\w+/) { |part| Seahorse::Util.underscore(part) }
  end
end