Method: Cosmos::PluginModel.install_phase1

Defined in:
lib/cosmos/models/plugin_model.rb

.install_phase1(gem_file_path, existing_variables: nil, existing_plugin_txt_lines: nil, process_existing: false, scope:, validate_only: false) ⇒ Object

Called by the PluginsController to parse the plugin variables Doesn’t actaully create the plugin during the phase



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/cosmos/models/plugin_model.rb', line 65

def self.install_phase1(gem_file_path, existing_variables: nil, existing_plugin_txt_lines: nil, process_existing: false, scope:, validate_only: false)
  gem_name = File.basename(gem_file_path).split("__")[0]

  temp_dir = Dir.mktmpdir
  tf = nil
  begin
    if File.exists?(gem_file_path)
      # Load gem to internal gem server
      Cosmos::GemModel.put(gem_file_path, gem_install: false, scope: scope) unless validate_only
    else
      gem_file_path = Cosmos::GemModel.get(temp_dir, gem_name)
    end

    # Extract gem and process plugin.txt to determine what VARIABLEs need to be filled in
    pkg = Gem::Package.new(gem_file_path)

    if existing_plugin_txt_lines and process_existing
      # This is only used in cosmos load when everything is known
      plugin_txt_lines = existing_plugin_txt_lines
      file_data = existing_plugin_txt_lines.join("\n")
      tf = Tempfile.new("plugin.txt")
      tf.write(file_data)
      tf.close
      plugin_txt_path = tf.path
    else
      # Otherwise we always process the new and return both
      pkg.extract_files(temp_dir)
      plugin_txt_path = File.join(temp_dir, 'plugin.txt')
      plugin_text = File.read(plugin_txt_path)
      plugin_txt_lines = []
      plugin_text.each_line do |line|
        plugin_txt_lines << line.chomp
      end
    end

    parser = Cosmos::ConfigParser.new("http://cosmosc2.com")

    # Phase 1 Gather Variables
    variables = {}
    parser.parse_file(plugin_txt_path,
                      false,
                      true,
                      false) do |keyword, params|
      case keyword
      when 'VARIABLE'
        usage = "#{keyword} <Variable Name> <Default Value>"
        parser.verify_num_parameters(2, nil, usage)
        variable_name = params[0]
        value = params[1..-1].join(" ")
        variables[variable_name] = value
        if existing_variables && existing_variables.key?(variable_name)
          variables[variable_name] = existing_variables[variable_name]
        end
        # Ignore everything else during phase 1
      end
    end

    model = PluginModel.new(name: gem_name, variables: variables, plugin_txt_lines: plugin_txt_lines, scope: scope)
    result = model.as_json
    result['existing_plugin_txt_lines'] = existing_plugin_txt_lines if existing_plugin_txt_lines and not process_existing and existing_plugin_txt_lines != result['plugin_txt_lines']
    return result
  ensure
    FileUtils.remove_entry(temp_dir) if temp_dir and File.exist?(temp_dir)
    tf.unlink if tf
  end
end