Class: ZoweeOptimizer

Inherits:
Object
  • Object
show all
Defined in:
lib/util/zowee_optimizer.rb

Instance Method Summary collapse

Constructor Details

#initialize(initial_vars = {}) ⇒ ZoweeOptimizer

The ZoweeOptimizer class is responsible for optimizing the environment variable definitions. It is used by the git-evars command to generate a script with shorter and more readable variable names.



4
5
6
7
8
9
10
# File 'lib/util/zowee_optimizer.rb', line 4

def initialize(initial_vars = {})
  @defined_vars = {}
  initial_vars.each do |var_ref, paths|
    var_name = var_ref.tr("'$", '')
    @defined_vars[var_name] = paths.first if paths.any?
  end
end

Instance Method Details

#generate_var_name(path) ⇒ String

Generates a valid environment variable name from a path.

Parameters:

  • path (String)

    the path to generate the variable name from.

Returns:

  • (String)

    a valid environment variable name.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/util/zowee_optimizer.rb', line 47

def generate_var_name(path)
  basename = File.basename(path)
  return nil if basename.empty?

  parts = basename.split('.')
  name = if parts.first == 'www' && parts.length > 1
           parts[1]
         else
           parts.first
         end.tr('-', '_')

  if @defined_vars.key?(name) && @defined_vars[name] != path
    # Collision. Try to disambiguate.
    parent_name = File.basename(File.dirname(path))
    name = "#{parent_name}_#{name}"
  end

  # Sanitize the name
  name.gsub!(/[^a-zA-Z0-9_]/, '_')

  # Prepend underscore if it starts with a digit
  name = "_#{name}" if name.match?(/^[0-9]/)

  name
end

#optimize(paths, initial_roots) ⇒ Array<String>

Optimizes a list of paths to generate a script with environment variable definitions.

Parameters:

  • paths (Array<String>)

    are provided in breadth-first order, so no sorting is needed.

  • initial_roots (Array<String>)

    a list of initial root variables.

Returns:

  • (Array<String>)

    a list of strings, where each string is an export statement for an environment variable.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/util/zowee_optimizer.rb', line 16

def optimize(paths, initial_roots)
  output = []

  # Find common prefixes and define intermediate variables
  define_intermediate_vars(paths)

  paths.each do |path|
    var_name = generate_var_name(path)
    next if var_name.nil?

    # Skip defining a var for a root that was passed in.
    next if initial_roots.include?("$#{var_name}") && @defined_vars[var_name] == path

    best_substitution = find_best_substitution(path)

    value = if best_substitution
              "$#{best_substitution[:var]}/#{path.sub("#{best_substitution[:path]}/", '')}"
            else
              path
            end

    output << "export #{var_name}=#{value}"
    @defined_vars[var_name] = path
  end

  (@intermediate_vars.values + output).uniq
end