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