Class: OpenC3::MetadataModel

Inherits:
SortedModel show all
Defined in:
lib/openc3/models/metadata_model.rb

Constant Summary collapse

METADATA_TYPE =
'metadata'.freeze
PRIMARY_KEY =
'__METADATA'.freeze

Constants inherited from SortedModel

SortedModel::SORTED_TYPE

Instance Attribute Summary collapse

Attributes inherited from SortedModel

#start

Attributes inherited from Model

#name, #plugin, #scope, #updated_at

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from SortedModel

all, count, destroy, #destroy, get, get_current_value, #notify, range, range_destroy, #validate_start

Methods inherited from Model

all, #as_config, #deploy, #destroy, #destroyed?, filter, find_all_by_plugin, from_json, get, get_all_models, get_model, handle_config, names, set, store, #undeploy

Constructor Details

#initialize(scope:, start:, color: nil, metadata:, constraints: nil, type: METADATA_TYPE, updated_at: 0) ⇒ MetadataModel

Returns a new instance of MetadataModel.

Parameters:

  • start (Integer)
    • Time metadata is active in seconds from Epoch

  • color (String) (defaults to: nil)
    • The event color

  • metadata (Hash)
    • Hash of metadata values

  • constraints (Hash) (defaults to: nil)
    • Constraints to apply to the metadata

  • scope (String)
    • OpenC3 scope to track event to



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/openc3/models/metadata_model.rb', line 40

def initialize(
  scope:,
  start:,
  color: nil,
  metadata:,
  constraints: nil,
  type: METADATA_TYPE,
  updated_at: 0
)
  super(start: start, scope: scope, updated_at: updated_at)
  @start = start
  @color = color
  @metadata = 
  @constraints = constraints if constraints
  @type = type # For the as_json, from_json round trip
end

Instance Attribute Details

#colorObject (readonly)

Returns the value of attribute color.



33
34
35
# File 'lib/openc3/models/metadata_model.rb', line 33

def color
  @color
end

#constraintsObject (readonly)

Returns the value of attribute constraints.



33
34
35
# File 'lib/openc3/models/metadata_model.rb', line 33

def constraints
  @constraints
end

#metadataObject (readonly)

Returns the value of attribute metadata.



33
34
35
# File 'lib/openc3/models/metadata_model.rb', line 33

def 
  @metadata
end

#typeObject (readonly)

Returns the value of attribute type.



33
34
35
# File 'lib/openc3/models/metadata_model.rb', line 33

def type
  @type
end

Class Method Details

.pk(scope) ⇒ Object



29
30
31
# File 'lib/openc3/models/metadata_model.rb', line 29

def self.pk(scope)
  "#{scope}#{PRIMARY_KEY}"
end

Instance Method Details

#as_json(*a) ⇒ Hash Also known as: to_s

Returns generated from the MetadataModel.

Returns:

  • (Hash)

    generated from the MetadataModel



126
127
128
129
130
131
132
133
134
135
136
# File 'lib/openc3/models/metadata_model.rb', line 126

def as_json(*a)
  {
    'scope' => @scope,
    'start' => @start,
    'color' => @color,
    'metadata' => @metadata.as_json(*a),
    'constraints' => @constraints,
    'type' => METADATA_TYPE,
    'updated_at' => @updated_at,
  }
end

#create(update: false) ⇒ Object

Update the Redis hash at primary_key based on the initial passed start The member is set to the JSON generated via calling as_json



103
104
105
106
107
108
109
110
111
112
113
# File 'lib/openc3/models/metadata_model.rb', line 103

def create(update: false)
  validate(update: update)
  @updated_at = Time.now.to_nsec_from_epoch
  MetadataModel.destroy(scope: @scope, start: update) if update
  Store.zadd(@primary_key, @start, JSON.generate(as_json(:allow_nan => true)))
  if update
    notify(kind: 'updated')
  else
    notify(kind: 'created')
  end
end

#update(start: nil, color: nil, metadata: nil, constraints: nil) ⇒ Object

Update the model. All arguments are optional, only those set will be updated.



116
117
118
119
120
121
122
123
# File 'lib/openc3/models/metadata_model.rb', line 116

def update(start: nil, color: nil, metadata: nil, constraints: nil)
  orig_start = @start
  @start = start if start
  @color = color if color
  @metadata =  if 
  @constraints = constraints if constraints
  create(update: orig_start)
end

#validate(update: false) ⇒ Object

Validates the instance variables: @start, @color, @metadata



58
59
60
61
62
63
# File 'lib/openc3/models/metadata_model.rb', line 58

def validate(update: false)
  validate_start(update: update)
  validate_color()
  ()
  validate_constraints() if @constraints
end

#validate_colorObject



65
66
67
68
69
70
71
72
73
# File 'lib/openc3/models/metadata_model.rb', line 65

def validate_color()
  if @color.nil?
    @color = '#%06x' % (rand * 0xffffff)
  end
  unless @color =~ /(#*)([0-9,a-f,A-f]{6})/
    raise SortedInputError.new "invalid color, must be in hex format, e.g. #FF0000"
  end
  @color = "##{@color}" unless @color.start_with?('#')
end

#validate_constraintsObject



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/openc3/models/metadata_model.rb', line 84

def validate_constraints()
  unless @constraints.is_a?(Hash)
    raise SortedInputError.new "Constraints must be a hash/object: #{@constraints}"
  end
  # Convert keys to strings. This isn't quite as efficient as symbols
  # but we store as JSON which is all strings and it makes comparisons easier.
  @constraints = @constraints.transform_keys(&:to_s)
  unless (@constraints.keys - @metadata.keys).empty?
    raise SortedInputError.new "Constraints keys must be subset of metadata: #{@constraints.keys} subset #{@metadata.keys}"
  end
  @constraints.each do |key, constraint|
    unless constraint.include?(@metadata[key])
      raise SortedInputError.new "Constraint violation! key:#{key} value:#{@metadata[key]} constraint:#{constraint}"
    end
  end
end

#validate_metadataObject



75
76
77
78
79
80
81
82
# File 'lib/openc3/models/metadata_model.rb', line 75

def ()
  unless @metadata.is_a?(Hash)
    raise SortedInputError.new "Metadata must be a hash/object: #{@metadata}"
  end
  # Convert keys to strings. This isn't quite as efficient as symbols
  # but we store as JSON which is all strings and it makes comparisons easier.
  @metadata = @metadata.transform_keys(&:to_s)
end