Module: Smash::CloudPowers::Zenv

Overview

This module provides some environment variable management and functionality Hopefully it should provide us with some "Zen", when dealing with normally annoying env issues. Meh, it probably won't but I like the name, so it stays :} System ENV, dotenv ENV and instance variables are considered for now but this will also use elasticache/redis...some other stuff too, in the coming versions

Instance Method Summary collapse

Methods included from Helper

#attr_map!, #available_resources, #called_from, #create_logger, #deep_modify_keys_with, #format_error_message, #log_file, #logger, #modify_keys_with, #smart_retry, #task_path, #task_require_path, #to_camel, #to_hyph, #to_i_var, #to_pascal, #to_ruby_file_name, #to_snake, #update_message_body, #valid_json?, #valid_url?

Instance Method Details

#env_vars(key = '') ⇒ Object

Search through the Dotenv variables for a key or if no key is given, return all the .env-vars and their values

Parameters

  • key String -


41
42
43
44
# File 'lib/cloud_powers/zenv.rb', line 41

def env_vars(key = '')
  return ENV if key.empty?
  ENV[to_snake(key).upcase]
end

#file_tree_search(name) ⇒ Object

Attempts to find a file by searching the current directory for the file then walking up the file tree and searching at each stop all the way up to the root directory

Parameters

  • name String - name of the file or directory to find

Returns Pathname - path to the file or directory given as the name parameter



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/cloud_powers/zenv.rb', line 23

def file_tree_search(name)
  next_dir = Pathname.new(`pwd`.strip).parent
  current_dir = Pathname.new(`pwd`.strip)
  until(next_dir == current_dir) do
    path = Dir.glob("#{current_dir}/#{name}").first
    return current_dir unless path.nil?
    current_dir = next_dir
    next_dir = next_dir.parent
  end
  return nil
end

#i_vars(key = '') ⇒ Object

Search through the instance variables for a key or if no key is given, return all the i-vars and their values

Parameters [key <String]: The key to search for

Returns the value of the key searched for



53
54
55
56
57
58
59
60
# File 'lib/cloud_powers/zenv.rb', line 53

def i_vars(key = '')
  if key.empty?
    return self.instance_variables.inject({}) do |r,v|
      r.tap { |h| h[to_snake(v)] = self.instance_variable_get(to_i_var(v)) }
    end
  end
  self.instance_variable_get(to_i_var(key))
end

#project_root ⇒ Object

PROJECT_ROOT should be set as early as possible in this Node's initilize method. This method tries to search for it, using #zfind() and if a nil result is returned from that search, pwd is used as the PROJECT_ROOT.

Returns Pathname - path to the project root or where ever pwd</tt> resolves to for the caller

Notes

  • TODO: improve this...it needs to find the gem's method's caller's project root or at least the gem's method's caller's file's location.

Example

called from cerebrum/cerebrum.rb in /home/ubuntu

project_root

=> '/home/ubuntu/cerebrum/'

or

called from go_nuts.rb#begin_going_crazy():(line -999999999.9) in /Users/crazyman/.ssh/why/all/the/madness/

project_root

=> '/Users/crazyman/.ssh/why/all/the/madness/'



82
83
84
85
86
87
88
89
90
# File 'lib/cloud_powers/zenv.rb', line 82

def project_root
  if @project_root.nil?
    file_home = Pathname.new(
      caller_locations.first.path.strip.split(/\//).last).realdirpath.parent
    # path = (zfind('PROJECT_ROOT') or file_home)
    @project_root = Pathname.new(file_home)
  end
  @project_root
end

#project_root=(var) ⇒ Object

Manually set the @project_root i-var as a Pathname object.

Parameters New path to the project root +String+|+Pathname+

Returns Pathname - @project_root

Example project_root

=> '/home/ubuntu/cerebrum/'

project_root = Pathname.new(pwd) project_root == pwd

=> true



104
105
106
# File 'lib/cloud_powers/zenv.rb', line 104

def project_root=(var)
  @project_root = Pathname.new(var)
end

#system_vars(key = '') ⇒ Object

Search through the system environment variables for a key or if no key is given, return all the system-env-vars and their values

Parameters [key ]: The key to search for

Returns

  • if a key is given as a parameter, String
  • if no key is given as a parameter, Hash with this structure { key => value, ... } is returned for all keys with a value. Keys with no value are ommitted from the result.


118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/cloud_powers/zenv.rb', line 118

def system_vars(key = '')
  if key.empty?
    # Separate key-value pairs from the large string received by `ENV`
    separate_pairs = `ENV`.split(/\n/).map do |string_pair|
      string_pair.split('=')
    end
    # Separate key-value pairs from each other into a hash of
    # { key => value, other_key => other_value }
    #   * keys with no value are removed
    separate_pairs.inject({}) do |res, pair|
      res.tap { |h_res| h_res[pair.first] = pair.last unless (pair.first == pair.last) }
    end
  else
    res = `printf "#{to_snake(key).upcase}"`
    return res.empty? ? nil : res
  end
end

#zfind(key) ⇒ Object

ZFind looks for the key in a preditermined order of importance:

  • i-vars are considered first becuase they might be tracking different locations for multiple tasks or something like that.
  • dotenv files are second because they were manually set, so for sure it's important
  • System Env variables are up next. Hopefully by this time we've found our information but if not, it should "search" through the system env too.

Parameters

  • key +String+|+Symbol+ - the key to search for

Returns String

Notes

  • TODO: implement a search for all 3 that can find close matches


152
153
154
155
156
157
158
# File 'lib/cloud_powers/zenv.rb', line 152

def zfind(key)
  project_root if @project_root.nil?
  res = (i_vars[to_snake(key).upcase] or
    env_vars[to_snake(key).upcase] unless @project_root.nil?) or
    system_vars[to_snake(key).upcase]
  (res.nil? or res.empty?) ? nil : res
end