module NetboxClientRuby::Entity

Public Class Methods

included(other_klass) click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 8
def self.included(other_klass)
  other_klass.extend ClassMethods
end
new(given_values = nil) click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 107
def initialize(given_values = nil)
  return self if given_values.nil?

  if id_fields.count == 1 && !given_values.is_a?(Hash)
    instance_variable_set("@#{id_fields.keys.first}", given_values)
    return self
  end

  given_values.each do |field, value|
    if id_fields.key? field.to_s
      instance_variable_set "@#{field}", value
    else
      # via method_missing, because it checks for readonly fields, etc.
      method_missing("#{field}=", value)
    end
  end

  self
end

Public Instance Methods

[](name) click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 186
def [](name)
  s_name = name.to_s
  dirty_data[s_name] || data[s_name]
end
[]=(name, value) click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 191
def []=(name, value)
  dirty_data[name.to_s] = value
end
create(raw_data) click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 145
def create(raw_data)
  raise LocalError, "Can't 'create', this object already exists" if ids_set?

  @dirty_data = raw_data
  post
end
data=(data) click to toggle source

:internal: Used to pre-populate an entity

# File lib/netbox_client_ruby/entity.rb, line 231
def data=(data)
  @data = data
end
delete() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 152
def delete
  raise NetboxClientRuby::LocalError, "Can't delete unless deletable=true" unless deletable
  return self if @deleted

  @data = response connection.delete path
  @deleted = true
  revert
  self
end
Also aliased as: remove
get!()
Alias for: reload
method_missing(name_as_symbol, *args, &block) click to toggle source
Calls superclass method
# File lib/netbox_client_ruby/entity.rb, line 195
def method_missing(name_as_symbol, *args, &block)
  name = name_as_symbol.to_s

  if name.end_with?('=')
    is_readonly_field = readonly_fields.include?(name[0..-2])
    is_instance_variable = instance_variables.include?("@#{name[0..-2]}".to_sym)
    not_this_classes_business = is_readonly_field || is_instance_variable

    return super if not_this_classes_business

    dirty_data[name[0..-2]] = args[0]
    return args[0]
  end

  return dirty_data[name] if dirty_data.key? name
  return objectify(data[name], object_fields[name]) if object_fields.key? name
  return data[name] if data.is_a?(Hash) && data.key?(name)

  super
end
raw_data!() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 182
def raw_data!
  data
end
reload() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 132
def reload
  raise LocalError, "Can't 'reload', this object has never been saved" unless ids_set?

  @data = get
  revert
  self
end
Also aliased as: get!
remove()
Alias for: delete
respond_to_missing?(name_as_symbol, *args) click to toggle source
Calls superclass method
# File lib/netbox_client_ruby/entity.rb, line 216
def respond_to_missing?(name_as_symbol, *args)
  name = name_as_symbol.to_s

  return false if name.end_with?('=') && readonly_fields.include?(name[0..-2])
  return false if name.end_with?('=') && instance_variables.include?(name[0..-2])

  return true if dirty_data.key? name
  return true if object_fields.key? name
  return true if data.is_a?(Hash) && data.key?(name)

  super
end
revert() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 127
def revert
  dirty_data.clear
  self
end
save() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 140
def save
  return post unless ids_set?
  patch
end
update(new_values) click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 162
def update(new_values)
  new_values.each do |attribute, values|
    s_attribute = attribute.to_s
    next if readonly_fields.include? s_attribute

    sym_attr_writer = "#{attribute}=".to_sym
    if methods.include?(sym_attr_writer)
      public_send(sym_attr_writer, values)
    else
      dirty_data[s_attribute] = values
    end
  end

  patch
end
url() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 178
def url
  "#{connection.url_prefix}#{path}"
end

Private Instance Methods

creation_path() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 299
def creation_path
  @creation_path ||= replace_path_variables_in self.class.creation_path
end
data() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 259
def data
  @data ||= get
end
data_to_obj(raw_data, klass_or_proc = nil) click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 279
def data_to_obj(raw_data, klass_or_proc = nil)
  if klass_or_proc.nil?
    hash_to_object raw_data
  elsif klass_or_proc.is_a? Proc
    klass_or_proc.call raw_data
  else
    klass_or_proc.new raw_data
  end
end
deletable() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 271
def deletable
  self.class.deletable
end
dirty_data() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 317
def dirty_data
  @dirty_data ||= {}
end
extract_ids() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 325
def extract_ids
  id_fields.each do |id_attr, id_field|
    unless data.key?(id_field)
      raise LocalError, "Can't find the id field '#{id_field}' in the received data."
    end

    instance_variable_set("@#{id_attr}", data[id_field])
  end
end
get() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 263
def get
  response connection.get path unless @deleted or !ids_set?
end
id_fields() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 321
def id_fields
  self.class.id
end
ids_set?() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 335
def ids_set?
  id_fields.map { |id_attr, _| instance_variable_get("@#{id_attr}") }.all?
end
object_fields() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 275
def object_fields
  self.class.object_fields
end
objectify(raw_data, klass_or_proc = nil) click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 289
def objectify(raw_data, klass_or_proc = nil)
  return nil if raw_data.nil?

  return data_to_obj(raw_data, klass_or_proc) unless raw_data.is_a? Array

  raw_data.map do |raw_data_entry|
    data_to_obj(raw_data_entry, klass_or_proc)
  end
end
patch() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 249
def patch
  return self if dirty_data.empty?

  @data ||= {}
  response_data = response connection.patch(path, dirty_data)
  @data.merge! response_data
  revert
  self
end
path() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 303
def path
  @path ||= replace_path_variables_in self.class.path
end
post() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 240
def post
  return self if dirty_data.empty?

  @data = response connection.post creation_path, dirty_data
  extract_ids
  revert
  self
end
readonly_fields() click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 267
def readonly_fields
  self.class.readonly_fields
end
replace_path_variables_in(path) click to toggle source
# File lib/netbox_client_ruby/entity.rb, line 307
def replace_path_variables_in(path)
  interpreted_path = path.clone
  path.scan(/:([a-zA-Z_][a-zA-Z0-9_]+[!?=]?)/) do |match, *|
    path_variable_value = send(match)
    return interpreted_path.gsub! ":#{match}", path_variable_value.to_s unless path_variable_value.nil?
    raise LocalError, "Received 'nil' while replacing ':#{match}' in '#{path}' with a value."
  end
  interpreted_path
end