Class: Kennel::Models::Record

Inherits:
Base
  • Object
show all
Defined in:
lib/kennel/models/record.rb

Direct Known Subclasses

Dashboard, Monitor, Slo, SyntheticTest

Constant Summary collapse

LOCK =
"\u{1F512}"
TRACKING_FIELDS =
[:message, :description].freeze
READONLY_ATTRIBUTES =
[
  :deleted, :id, :created, :created_at, :creator, :org_id, :modified, :modified_at,
  :klass, :tracking_id # added by syncer.rb
].freeze
ALLOWED_KENNEL_ID_CHARS =
"a-zA-Z_\\d.-"
ALLOWED_KENNEL_ID_FULL =
"[#{ALLOWED_KENNEL_ID_CHARS}]+:[#{ALLOWED_KENNEL_ID_CHARS}]+"
ALLOWED_KENNEL_ID_REGEX =
/\A#{ALLOWED_KENNEL_ID_FULL}\z/.freeze

Constants inherited from Base

Base::SETTING_OVERRIDABLE_METHODS

Constants included from SettingsAsMethods

SettingsAsMethods::AS_PROCS, SettingsAsMethods::SETTING_OVERRIDABLE_METHODS

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#kennel_id, #name, #to_json

Methods included from SubclassTracking

#recursive_subclasses, #subclasses

Methods included from SettingsAsMethods

included

Constructor Details

#initialize(project, *args) ⇒ Record

Returns a new instance of Record.

Raises:

  • (ArgumentError)


61
62
63
64
65
# File 'lib/kennel/models/record.rb', line 61

def initialize(project, *args)
  raise ArgumentError, "First argument must be a project, not #{project.class}" unless project.is_a?(Project)
  @project = project
  super(*args)
end

Instance Attribute Details

#projectObject (readonly)

Returns the value of attribute project.



59
60
61
# File 'lib/kennel/models/record.rb', line 59

def project
  @project
end

Class Method Details

.api_resource_mapObject



26
27
28
# File 'lib/kennel/models/record.rb', line 26

def api_resource_map
  subclasses.map { |s| [s.api_resource, s] }.to_h
end

.parse_any_url(url) ⇒ Object



18
19
20
21
22
23
24
# File 'lib/kennel/models/record.rb', line 18

def parse_any_url(url)
  subclasses.detect do |s|
    if id = s.parse_url(url)
      break s.api_resource, id
    end
  end
end

.parse_tracking_id(a) ⇒ Object



30
31
32
# File 'lib/kennel/models/record.rb', line 30

def parse_tracking_id(a)
  a[self::TRACKING_FIELD].to_s[/-- Managed by kennel (#{ALLOWED_KENNEL_ID_FULL})/, 1]
end

.remove_tracking_id(a) ⇒ Object

TODO: combine with parse into a single method or a single regex



35
36
37
38
39
40
# File 'lib/kennel/models/record.rb', line 35

def remove_tracking_id(a)
  value = a[self::TRACKING_FIELD]
  a[self::TRACKING_FIELD] =
    value.dup.sub!(/\n?-- Managed by kennel .*/, "") ||
    raise("did not find tracking id in #{value}")
end

Instance Method Details

#add_tracking_idObject



92
93
94
95
96
97
98
99
100
# File 'lib/kennel/models/record.rb', line 92

def add_tracking_id
  json = as_json
  if self.class.parse_tracking_id(json)
    invalid! "remove \"-- Managed by kennel\" line it from #{self.class::TRACKING_FIELD} to copy a resource"
  end
  json[self.class::TRACKING_FIELD] =
    "#{json[self.class::TRACKING_FIELD]}\n" \
    "-- Managed by kennel #{tracking_id} in #{project.class.file_location}, do not modify manually".lstrip
end

#diff(actual) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/kennel/models/record.rb', line 67

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

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

  # strict: ignore Integer vs Float
  # similarity: show diff when not 100% similar
  # use_lcs: saner output
  Hashdiff.diff(actual, expected, use_lcs: false, strict: false, similarity: 1)
end

#remove_tracking_idObject



102
103
104
# File 'lib/kennel/models/record.rb', line 102

def remove_tracking_id
  self.class.remove_tracking_id(as_json)
end

#resolve_linked_tracking_ids!Object



89
90
# File 'lib/kennel/models/record.rb', line 89

def resolve_linked_tracking_ids!(*)
end

#tracking_idObject



79
80
81
82
83
84
85
86
87
# File 'lib/kennel/models/record.rb', line 79

def tracking_id
  @tracking_id ||= begin
    id = "#{project.kennel_id}:#{kennel_id}"
    unless id.match?(ALLOWED_KENNEL_ID_REGEX) # <-> parse_tracking_id
      raise ValidationError, "#{id} must match #{ALLOWED_KENNEL_ID_REGEX}"
    end
    id
  end
end

#validate_update!Object



106
107
# File 'lib/kennel/models/record.rb', line 106

def validate_update!(*)
end