| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- require 'ceedling/constants'
- class ProjectFileLoader
- attr_reader :main_file, :user_file
- constructor :yaml_wrapper, :stream_wrapper, :system_wrapper, :file_wrapper
- def setup
- @main_file = nil
- @mixin_files = []
- @user_file = nil
- @main_project_filepath = ''
- @mixin_project_filepaths = []
- @user_project_filepath = ''
- end
- def find_project_files
- # first go hunting for optional user project file by looking for environment variable and then default location on disk
- user_filepath = @system_wrapper.env_get('CEEDLING_USER_PROJECT_FILE')
- if ( not user_filepath.nil? and @file_wrapper.exist?(user_filepath) )
- @user_project_filepath = user_filepath
- elsif (@file_wrapper.exist?(DEFAULT_CEEDLING_USER_PROJECT_FILE))
- @user_project_filepath = DEFAULT_CEEDLING_USER_PROJECT_FILE
- end
- # next check for mixin project files by looking for environment variable
- mixin_filepaths = @system_wrapper.env_get('CEEDLING_MIXIN_PROJECT_FILES')
- if ( not mixin_filepaths.nil? )
- mixin_filepaths.split(File::PATH_SEPARATOR).each do |filepath|
- if ( @file_wrapper.exist?(filepath) )
- @mixin_project_filepaths.push(filepath)
- end
- end
- end
- # next check for main project file by looking for environment variable and then default location on disk;
- # blow up if we don't find this guy -- like, he's so totally important
- main_filepath = @system_wrapper.env_get('CEEDLING_MAIN_PROJECT_FILE')
- if ( not main_filepath.nil? and @file_wrapper.exist?(main_filepath) )
- @main_project_filepath = main_filepath
- elsif (@file_wrapper.exist?(DEFAULT_CEEDLING_MAIN_PROJECT_FILE))
- @main_project_filepath = DEFAULT_CEEDLING_MAIN_PROJECT_FILE
- else
- # no verbosity checking since this is lowest level reporting anyhow &
- # verbosity checking depends on configurator which in turns needs this class (circular dependency)
- @stream_wrapper.stderr_puts('Found no Ceedling project file (*.yml)')
- raise
- end
- @main_file = File.basename( @main_project_filepath )
- @mixin_project_filepaths.each do |filepath|
- @mixin_files.push(File.basename( filepath ))
- end
- @user_file = File.basename( @user_project_filepath ) if ( not @user_project_filepath.empty? )
- end
- def yaml_merger(y1, y2)
- o1 = y1
- y2.each_pair do |k,v|
- if o1[k].nil?
- o1[k] = v
- else
- if (o1[k].instance_of? Hash)
- o1[k] = yaml_merger(o1[k], v)
- elsif (o1[k].instance_of? Array)
- o1[k] += v
- else
- o1[k] = v
- end
- end
- end
- return o1
- end
- def load_project_config
- config_hash = @yaml_wrapper.load(@main_project_filepath)
- # if there are mixin project files, then use them
- @mixin_project_filepaths.each do |filepath|
- mixin = @yaml_wrapper.load(filepath)
- config_hash = yaml_merger( config_hash, mixin )
- end
- # if there's a user project file, then use it
- if ( not @user_project_filepath.empty? )
- user_hash = @yaml_wrapper.load(@user_project_filepath)
- config_hash = yaml_merger( config_hash, user_hash )
- end
- return config_hash
- end
- end
|