class Databricks::Resource

Encapsulate a resource identified in the API. A resource can have some properties, directly accessible, and also gives access to eventual sub-resources to get a hierarchical organization of the API.

Attributes

properties[R]

Get an accessor on all properties of this resource Hash< Symbol, Object >

Public Class Methods

new(connector) click to toggle source

Constructor

Parameters
# File lib/databricks/resource.rb, line 39
def initialize(connector)
  @connector = connector
  # Keep a map of sub-resources instantiated, per resource name.
  # Hash< Symbol, Resource >
  @sub_resources = {}
  # Properties linked to this resource
  # Hash< Symbol, Object >
  @properties = {}
end
sub_resources(*resource_names) click to toggle source

Declare sub-resources accessors. This will make sure this resource has methods named after the sub-resources identifiers.

Parameters
  • resource_names (Array<Symbol>): Resource names to instantiate

# File lib/databricks/resource.rb, line 27
def self.sub_resources(*resource_names)
  resource_names.flatten.each do |resource_name|
    self.define_method(resource_name) do
      sub_resource(resource_name)
    end
  end
end

Public Instance Methods

add_properties(properties, replace: false) click to toggle source

Add/replace properties for this resource. Properties will be deep-symbolized.

Parameters
  • properties (Hash<Symbol or String,Object>): Properties for this resource

  • replace (Boolean): Should we replace properties instead of merging them? [default: false]

# File lib/databricks/resource.rb, line 55
def add_properties(properties, replace: false)
  symbolized_properties = deep_symbolize(properties)
  # Define getters for properties
  (symbolized_properties.keys - @properties.keys).each do |property_name|
    if self.respond_to?(property_name)
      raise "Can't define a property named #{property_name} - It's already used."
    else
      define_singleton_method(property_name) { @properties[property_name] }
    end
  end
  if replace
    @properties = symbolized_properties
  else
    @properties.merge!(symbolized_properties)
  end
end
inspect() click to toggle source

Return a simple string representation of this resource

Result
  • String: Default representation

# File lib/databricks/resource.rb, line 76
def inspect
  "#<#{self.class.name.split('::').last} - #{@properties}>"
end
new_resource(resource_name, properties = {}) click to toggle source

Instantiate a new resource, with optional properties

Parameters
  • resource_name (Symbol): The resource's name.

  • properties (Hash<Symbol or String,Object>): This resource's initial properties [default = {}]

Result
  • Resource: The corresponding resource

# File lib/databricks/resource.rb, line 99
def new_resource(resource_name, properties = {})
  require "#{__dir__}/resources/#{resource_name}.rb"
  resource = Resources.const_get(resource_name.to_s.split('_').collect(&:capitalize).join.to_sym).new(@connector)
  resource.add_properties(properties)
  resource
end
sub_resource(resource_name) click to toggle source

Instantiate a sub-resource. Keep a cache of it.

Parameters
  • resource_name (Symbol): Resource name.

Result
  • Resource: Corresponding sub-resource

# File lib/databricks/resource.rb, line 87
def sub_resource(resource_name)
  @sub_resources[resource_name] = new_resource(resource_name) unless @sub_resources.key?(resource_name)
  @sub_resources[resource_name]
end

Private Instance Methods

deep_symbolize(json) click to toggle source

Deep-symbolize a JSON object

Parameters
  • json (Object): The JSON object

Result
  • Object: Symbolized JSON object

# File lib/databricks/resource.rb, line 114
def deep_symbolize(json)
  case json
  when Hash
    Hash[json.map do |k, v|
      [
        k.is_a?(String) ? k.to_sym : k,
        deep_symbolize(v)
      ]
    end]
  when Array
    json.map { |e| deep_symbolize(e) }
  else
    json
  end
end