Class: OpenC3::WidgetModel

Inherits:
Model show all
Defined in:
lib/openc3/models/widget_model.rb

Constant Summary collapse

PRIMARY_KEY =
'openc3_widgets'

Instance Attribute Summary collapse

Attributes inherited from Model

#plugin, #scope, #updated_at

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Model

#create, #destroy, #destroyed?, filter, find_all_by_plugin, from_json, get_all_models, get_model, set, store, #update

Constructor Details

#initialize(name:, updated_at: nil, plugin: nil, needs_dependencies: false, scope:) ⇒ WidgetModel

Returns a new instance of WidgetModel.



83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/openc3/models/widget_model.rb', line 83

def initialize(
  name:,
  updated_at: nil,
  plugin: nil,
  needs_dependencies: false,
  scope:
)
  super("#{scope}__#{PRIMARY_KEY}", name: name, plugin: plugin, updated_at: updated_at, scope: scope)
  @full_name = @name.capitalize + 'Widget'
  @filename = @full_name + '.umd.min.js'
  @bucket_key = 'widgets/' + @full_name + '/' + @filename
  @needs_dependencies = needs_dependencies
end

Instance Attribute Details

#bucket_keyObject

Returns the value of attribute bucket_key.



36
37
38
# File 'lib/openc3/models/widget_model.rb', line 36

def bucket_key
  @bucket_key
end

#filenameObject

Returns the value of attribute filename.



35
36
37
# File 'lib/openc3/models/widget_model.rb', line 35

def filename
  @filename
end

#full_nameObject

Returns the value of attribute full_name.



34
35
36
# File 'lib/openc3/models/widget_model.rb', line 34

def full_name
  @full_name
end

#nameObject

Returns the value of attribute name.



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

def name
  @name
end

#needs_dependenciesObject

Returns the value of attribute needs_dependencies.



37
38
39
# File 'lib/openc3/models/widget_model.rb', line 37

def needs_dependencies
  @needs_dependencies
end

Class Method Details

.all(scope: nil) ⇒ Object



53
54
55
56
57
58
59
# File 'lib/openc3/models/widget_model.rb', line 53

def self.all(scope: nil)
  tools = Store.hgetall("#{scope}__#{PRIMARY_KEY}")
  tools.each do |key, value|
    tools[key] = JSON.parse(value, :allow_nan => true, :create_additions => true)
  end
  return tools
end

.all_scopesObject



61
62
63
64
65
66
67
68
69
# File 'lib/openc3/models/widget_model.rb', line 61

def self.all_scopes
  result = {}
  scopes = OpenC3::ScopeModel.all
  scopes.each do |key, _scope|
    widgets = all(scope: key)
    result.merge!(widgets)
  end
  result
end

.get(name:, scope: nil) ⇒ Object

NOTE: The following three class methods are used by the ModelController and are reimplemented to enable various Model class methods to work



41
42
43
# File 'lib/openc3/models/widget_model.rb', line 41

def self.get(name:, scope: nil)
  super("#{scope}__#{PRIMARY_KEY}", name: name)
end

.handle_config(parser, keyword, parameters, plugin: nil, needs_dependencies: false, scope:) ⇒ Object

Called by the PluginModel to allow this class to validate it’s top-level keyword: “WIDGET”



72
73
74
75
76
77
78
79
80
81
# File 'lib/openc3/models/widget_model.rb', line 72

def self.handle_config(parser, keyword, parameters, plugin: nil, needs_dependencies: false, scope:)
  case keyword
  when 'WIDGET'
    parser.verify_num_parameters(1, 1, "WIDGET <Name>")
    return self.new(name: parameters[0], plugin: plugin, needs_dependencies: needs_dependencies, scope: scope)
  else
    raise ConfigParser::Error.new(parser, "Unknown keyword and parameters for Widget: #{keyword} #{parameters.join(" ")}")
  end
  return nil
end

.names(scope: nil) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/openc3/models/widget_model.rb', line 45

def self.names(scope: nil)
  array = []
  all(scope: scope).each do |name, _widget|
    array << name
  end
  array
end

Instance Method Details

#as_json(*a) ⇒ Object



97
98
99
100
101
102
103
104
# File 'lib/openc3/models/widget_model.rb', line 97

def as_json(*a)
  {
    'name' => @name,
    'updated_at' => @updated_at,
    'plugin' => @plugin,
    'needs_dependencies' => @needs_dependencies,
  }
end

#deploy(gem_path, variables, validate_only: false) ⇒ Object



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/openc3/models/widget_model.rb', line 110

def deploy(gem_path, variables, validate_only: false)
  # Ensure tools bucket exists
  bucket = nil
  unless validate_only
    bucket = Bucket.getClient()
    bucket.ensure_public(ENV['OPENC3_TOOLS_BUCKET'])
  end

  filename = gem_path + "/tools/widgets/" + @full_name + '/' + @filename

  # Load widget file
  data = File.read(filename, mode: "rb")
  OpenC3.set_working_dir(File.dirname(filename)) do
    data = ERB.new(data, trim_mode: "-").result(binding.set_variables(variables)) if data.is_printable?
  end
  unless validate_only
    cache_control = BucketUtilities.get_cache_control(@filename)
    # TODO: support widgets that aren't just a single js file (and its associated map file)
    bucket.put_object(bucket: ENV['OPENC3_TOOLS_BUCKET'], content_type: 'application/javascript', cache_control: cache_control, key: @bucket_key, body: data)
    data = File.read(filename + '.map', mode: "rb")
    bucket.put_object(bucket: ENV['OPENC3_TOOLS_BUCKET'], content_type: 'application/json', cache_control: cache_control, key: @bucket_key + '.map', body: data)
  end
end

#handle_config(parser, keyword, parameters) ⇒ Object



106
107
108
# File 'lib/openc3/models/widget_model.rb', line 106

def handle_config(parser, keyword, parameters)
  raise ConfigParser::Error.new(parser, "Unknown keyword and parameters for Widget: #{keyword} #{parameters.join(" ")}")
end

#undeployObject



134
135
136
137
138
# File 'lib/openc3/models/widget_model.rb', line 134

def undeploy
  bucket = Bucket.getClient()
  bucket.delete_object(bucket: ENV['OPENC3_TOOLS_BUCKET'], key: @bucket_key)
  bucket.delete_object(bucket: ENV['OPENC3_TOOLS_BUCKET'], key: @bucket_key + '.map')
end