Class: Kennel::Models::Base

Inherits:
Object
  • Object
show all
Extended by:
SubclassTracking
Defined in:
lib/kennel/models/base.rb

Direct Known Subclasses

Dashboard, Monitor, Project, Team

Defined Under Namespace

Classes: ValidationError

Constant Summary collapse

LOCK =
"\u{1F512}"
READONLY_ATTRIBUTES =
[
  :deleted, :matching_downtimes, :id, :created, :created_at, :creator, :org_id, :modified,
  :overall_state_modified, :overall_state, :api_resource
].freeze
REQUEST_DEFAULTS =
{
  style: { width: "normal", palette: "dog_classic", type: "solid" },
  conditional_formats: [],
  aggregator: "avg"
}.freeze
OVERRIDABLE_METHODS =
[:name, :kennel_id].freeze

Class Method Summary collapse

Instance Method Summary collapse

Methods included from SubclassTracking

recursive_subclasses, subclasses

Constructor Details

#initialize(options = {}) ⇒ Base

Returns a new instance of Base.



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/kennel/models/base.rb', line 100

def initialize(options = {})
  validate_options(options)

  options.each do |name, block|
    self.class.validate_setting_exists name
    define_singleton_method name, &block
  end

  # need expand_path so it works wih rake and when run individually
  pwd = /^#{Regexp.escape(Dir.pwd)}\//
  @invocation_location = caller.detect do |l|
    if found = File.expand_path(l).sub!(pwd, "")
      break found
    end
  end
end

Class Method Details

.defaults(options) ⇒ Object



46
47
48
49
50
51
# File 'lib/kennel/models/base.rb', line 46

def defaults(options)
  options.each do |name, block|
    validate_setting_exists name
    define_method name, &block
  end
end

.inherited(child) ⇒ Object



53
54
55
56
# File 'lib/kennel/models/base.rb', line 53

def inherited(child)
  super
  child.instance_variable_set(:@set, (@set || []).dup)
end

.settings(*names) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/kennel/models/base.rb', line 25

def settings(*names)
  duplicates = (@set & names)
  if duplicates.any?
    raise ArgumentError, "Settings #{duplicates.map(&:inspect).join(", ")} are already defined"
  end

  overrides = ((instance_methods - OVERRIDABLE_METHODS) & names)
  if overrides.any?
    raise ArgumentError, "Settings #{overrides.map(&:inspect).join(", ")} are already used as methods"
  end

  @set.concat names
  names.each do |name|
    next if method_defined?(name)
    define_method name do
      message = "Trying to call #{name} for #{self.class} but it was never set or passed as option"
      raise_with_location ArgumentError, message
    end
  end
end

.validate_setting_exists(name) ⇒ Object

Raises:

  • (ArgumentError)


58
59
60
61
62
# File 'lib/kennel/models/base.rb', line 58

def validate_setting_exists(name)
  return if !@set || @set.include?(name)
  supported = @set.map(&:inspect)
  raise ArgumentError, "Unsupported setting #{name.inspect}, supported settings are #{supported.join(", ")}"
end

Instance Method Details

#diff(actual) ⇒ Object



129
130
131
132
133
134
135
136
# File 'lib/kennel/models/base.rb', line 129

def diff(actual)
  expected = as_json
  expected.delete(:id)

  self.class.send(:normalize, expected, actual)

  HashDiff.diff(actual, expected, use_lcs: false)
end

#kennel_idObject



117
118
119
120
121
122
123
# File 'lib/kennel/models/base.rb', line 117

def kennel_id
  name = self.class.name
  if name.start_with?("Kennel::")
    raise_with_location ArgumentError, "Set :kennel_id"
  end
  @kennel_id ||= Utils.snake_case name
end

#nameObject



125
126
127
# File 'lib/kennel/models/base.rb', line 125

def name
  self.class.name
end

#resolve_linked_tracking_idsObject



146
147
# File 'lib/kennel/models/base.rb', line 146

def resolve_linked_tracking_ids(*)
end

#to_jsonObject

Raises:

  • (NotImplementedError)


142
143
144
# File 'lib/kennel/models/base.rb', line 142

def to_json
  raise NotImplementedError, "Use as_json"
end

#tracking_idObject



138
139
140
# File 'lib/kennel/models/base.rb', line 138

def tracking_id
  "#{project.kennel_id}:#{kennel_id}"
end