Class: Kennel::Models::Record
Constant Summary
collapse
- MARKER_TEXT =
Apart from if you just don’t like the default for some reason, overriding MARKER_TEXT allows for namespacing within the same Datadog account. If you run one Kennel setup with marker text A and another with marker text B (assuming that A isn’t a substring of B and vice versa), then the two Kennel setups will operate independently of each other, not trampling over each other’s objects.
This could be useful for allowing multiple products / projects / teams to share a Datadog account but otherwise largely operate independently of each other. In particular, it can be useful for running a “dev” or “staging” instance of Kennel in the same account as, but mostly isolated from, a “production” instance.
ENV.fetch("KENNEL_MARKER_TEXT", "Managed by kennel")
- LOCK =
"\u{1F512}"
- TRACKING_FIELDS =
[:message, :description].freeze
- READONLY_ATTRIBUTES =
[
:deleted, :id, :created, :created_at, :creator, :org_id, :modified, :modified_at,
:klass, :tracking_id ].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
SettingsAsMethods::AS_PROCS, SettingsAsMethods::SETTING_OVERRIDABLE_METHODS
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
included
Methods inherited from Base
#kennel_id, #name, #to_json
#recursive_subclasses, #subclasses
included
Constructor Details
#initialize(project, *args) ⇒ Record
Returns a new instance of Record.
81
82
83
84
85
|
# File 'lib/kennel/models/record.rb', line 81
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
#project ⇒ Object
Returns the value of attribute project.
79
80
81
|
# File 'lib/kennel/models/record.rb', line 79
def project
@project
end
|
Class Method Details
.api_resource_map ⇒ Object
46
47
48
|
# File 'lib/kennel/models/record.rb', line 46
def api_resource_map
subclasses.map { |s| [s.api_resource, s] }.to_h
end
|
.parse_any_url(url) ⇒ Object
38
39
40
41
42
43
44
|
# File 'lib/kennel/models/record.rb', line 38
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
50
51
52
|
# File 'lib/kennel/models/record.rb', line 50
def parse_tracking_id(a)
a[self::TRACKING_FIELD].to_s[/-- #{Regexp.escape(MARKER_TEXT)} (#{ALLOWED_KENNEL_ID_FULL})/, 1]
end
|
.remove_tracking_id(a) ⇒ Object
TODO: combine with parse into a single method or a single regex
55
56
57
58
59
60
|
# File 'lib/kennel/models/record.rb', line 55
def remove_tracking_id(a)
value = a[self::TRACKING_FIELD]
a[self::TRACKING_FIELD] =
value.dup.sub!(/\n?-- #{Regexp.escape(MARKER_TEXT)} .*/, "") ||
raise("did not find tracking id in #{value}")
end
|
Instance Method Details
#add_tracking_id ⇒ Object
112
113
114
115
116
117
118
119
120
|
# File 'lib/kennel/models/record.rb', line 112
def add_tracking_id
json = as_json
if self.class.parse_tracking_id(json)
raise "#{tracking_id} Remove \"-- #{MARKER_TEXT}\" line from #{self.class::TRACKING_FIELD} to copy a resource"
end
json[self.class::TRACKING_FIELD] =
"#{json[self.class::TRACKING_FIELD]}\n" \
"-- #{MARKER_TEXT} #{tracking_id} in #{project.class.file_location}, do not modify manually".lstrip
end
|
#as_json ⇒ Object
132
133
134
135
136
137
138
139
|
# File 'lib/kennel/models/record.rb', line 132
def as_json
@as_json ||= begin
json = build_json
(id = json.delete(:id)) && json[:id] = id
validate_json(json) if validate
json
end
end
|
#build_json ⇒ Object
126
127
128
129
130
|
# File 'lib/kennel/models/record.rb', line 126
def build_json
{
id: id
}.compact
end
|
#diff(actual) ⇒ Object
87
88
89
90
91
92
93
94
95
96
97
|
# File 'lib/kennel/models/record.rb', line 87
def diff(actual)
expected = as_json
expected.delete(:id)
self.class.send(:normalize, expected, actual)
Hashdiff.diff(actual, expected, use_lcs: false, strict: false, similarity: 1)
end
|
#invalid_update!(field, old_value, new_value) ⇒ Object
145
146
147
|
# File 'lib/kennel/models/record.rb', line 145
def invalid_update!(field, old_value, new_value)
raise DisallowedUpdateError, "#{tracking_id} Datadog does not allow update of #{field} (#{old_value.inspect} -> #{new_value.inspect})"
end
|
#remove_tracking_id ⇒ Object
122
123
124
|
# File 'lib/kennel/models/record.rb', line 122
def remove_tracking_id
self.class.remove_tracking_id(as_json)
end
|
#resolve_linked_tracking_ids! ⇒ Object
109
110
|
# File 'lib/kennel/models/record.rb', line 109
def resolve_linked_tracking_ids!(*)
end
|
#tracking_id ⇒ Object
99
100
101
102
103
104
105
106
107
|
# File 'lib/kennel/models/record.rb', line 99
def tracking_id
@tracking_id ||= begin
id = "#{project.kennel_id}:#{kennel_id}"
unless id.match?(ALLOWED_KENNEL_ID_REGEX) raise "#{id} must match #{ALLOWED_KENNEL_ID_REGEX}"
end
id
end
end
|
#validate_update! ⇒ Object
Can raise DisallowedUpdateError
142
143
|
# File 'lib/kennel/models/record.rb', line 142
def validate_update!(*)
end
|