lib/cloud_powers/zenv.rb in cloud_powers-0.2.1 vs lib/cloud_powers/zenv.rb in cloud_powers-0.2.2

- old
+ new

@@ -5,27 +5,34 @@ # This module provides some environment variable management and functionality # 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 weeks module Zenv include Smash::CloudPowers::Helper - # 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. - # @params: key <String>: The key to search for - # @return: <String> - # TODO: implement a search for all 3 that can find close matches - def zfind(key) - 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 + + # Attempts to find a file by searching the current directory for the file + # then walking up the file tree and searching at each stop + # @param: name <String>: name of the file or directory to find + # @return: Pathname: path to the file or directory given as the `name` param + 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 + # Search through the .env variables for a key or if no key is given, + # return all the .env-vars and their values + def env_vars(key = '') + return ENV if key.empty? + ENV[to_snake(key).upcase] + end + # Search through the instance variables for a key or if no key is given, # return all the i-vars and their values # @params: [key <String]: The key to search for # @return: def i_vars(key = '') @@ -35,17 +42,33 @@ end end self.instance_variable_get(to_i_var(key)) end - # Search through the .env variables for a key or if no key is given, - # return all the .env-vars and their values - def env_vars(key = '') - return ENV if key.empty? - ENV[to_snake(key).upcase] + # 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. + # @return: Path to the project root or where ever `pwd` resolves to <Pathname> + # 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. + 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 + # Manually set the `@project_root` i-var as a `Pathname` object. + # @param: New path to the project root <String|Pathname> + # @return: @project_root <Pathname> + def project_root=(var) + @project_root = Pathname.new(var) + end + # Search through the system environment variables for a key or if no key # is given, return all the system-env-vars and their values # @params: [key <String>]: The key to search for # @return: Value <String> for the given key or if no key was given, a # Hash with { key => value, ... } is returned for all keys with a value. @@ -66,29 +89,25 @@ res = `printf "#{to_snake(key).upcase}"` return res.empty? ? nil : res end end - # 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. - # @return: Path to the project root or where ever `pwd` resolves to <Pathname> - # 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. - def project_root - if @project_root.nil? - pr = (PROJECT_ROOT rescue nil) or zfind('PROJECT_ROOT') or system('pwd') - @project_root = Pathname.new(pr) - else - @project_root - end - end - - # Manually set the `@project_root` i-var as a `Pathname` object. - # @param: New path to the project root <String|Pathname> - # @return: @project_root <Pathname> - def project_root=(var) - @project_root = Pathname.new(var) + # 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. + # @params: key <String>: The key to search for + # @return: <String> + # TODO: implement a search for all 3 that can find close matches + 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 end end end