lib/dtc_rake/config.rb in dtc_rake-0.2.0 vs lib/dtc_rake/config.rb in dtc_rake-1.0.0.pre.beta.1

- old
+ new

@@ -1,31 +1,35 @@ require "rake" require "pathname" module DtcRake def configure(&block) - yield Config.instance + config = Config.instance + yield config + config.validate! end module_function :configure class Config include Singleton def initialize - @root_dir = Dir.pwd - @output_dir = "target" - @colorize = true - @appbox_meta_artifact_code = "UU.OS/RUNTIME/APP_BOX" - @upload_app_descriptor = false + self.root_dir = Dir.pwd + self.output_dir = "target" + self.colorize = true + self.upload_readme = false + self.appbox_meta_artifact_code = "UU.OS/RUNTIME/APP_BOX" + self.upload_uucloud_descriptor = false + self.version_files = [] guess_vendor_and_app end # Code of application. Guessed from root_dir name if not set. attr_accessor :app - # Code of appbox artifact. Guessed from vendor, app and version in uuApp - # deployment descriptor if not set. + # Code of appbox artifact. Guessed from product_code and appbox_version + # if not set. attr_accessor :appbox_artifact_code # Code of appbox location (folder or organization unit). Required. attr_accessor :appbox_location_code @@ -38,75 +42,364 @@ # Path to uarchive with contents of appbox artifact. Default value: nil. # If not set, appbox is created with empty content. # Relative path is relative to root_dir. attr_accessor :appbox_uarchive - # Path to uuApp deployment descriptor. Guessed from vendor and app if not set. - attr_accessor :app_descriptor_path + # Appbox version. Read from VERSION file located in the same directory + # as Rakefile if not set. + attr_accessor :appbox_version # Print messages in colors. Default value: true. attr_accessor :colorize # Name of folder with build products. Default value: target. # Relative path is relative to root_dir. attr_accessor :output_dir + # Code of product the appbox belongs to. Required. + attr_accessor :product_code + + # Name of product the appbox belongs to. Required. + attr_accessor :product_name + # Appbox project root folder. Default value: current working directory. attr_accessor :root_dir + # Upload README.md or README.txt to appbox artifact. Default value: false. + attr_accessor :upload_readme + # Upload uuApp deployment descriptor to appbox artifact. Default value: false. - attr_accessor :upload_app_descriptor + attr_accessor :upload_uucloud_descriptor + # Path to uuApp deployment descriptor. Default value: uucloud_descriptor.json. + attr_accessor :uucloud_descriptor_path + # Code of vendor. Guessed from root_dir name if not set. attr_accessor :vendor + # List of files (or glob patterns) determining which files get updated by + # version:* tasks. Default: none. + attr_accessor :version_files + + def validate! + %w(appbox_location_code appbox_territory_code product_code product_name).each do |param| + if instance_variable_get("@#{param}").nil? + _error "Required parameter #{param} is not set. Set it within DtcRake.configure in your Rakefile." + end + end + end + def app=(name) @app = name.downcase unless name.nil? end + def appbox_artifact_code + return @appbox_artifact_code if @appbox_artifact_code + + @appbox_artifact_code = ENV["DTC_RAKE_APPBOX_ARTIFACT_CODE"] + + if @appbox_artifact_code.nil? + default_code = "#{product_code}/APPBOX-#{appbox_version}" + @appbox_artifact_code = default_code + end + + @appbox_artifact_code + end + + def appbox_artifact_code=(code) + env = ENV["DTC_RAKE_APPBOX_ARTIFACT_CODE"] + # environment variable takes precedence + @appbox_artifact_code = env.nil? ? code : env + @appbox_artifact_code + end + + def appbox_location_code + return @appbox_location_code if @appbox_location_code + + @appbox_location_code = ENV["DTC_RAKE_APPBOX_LOCATION_CODE"] + @appbox_location_code + end + + def appbox_location_code=(code) + env = ENV["DTC_RAKE_APPBOX_LOCATION_CODE"] + # environment variable takes precedence + @appbox_location_code = env.nil? ? code : env + @appbox_location_code + end + + def appbox_meta_artifact_code + return @appbox_meta_artifact_code if @appbox_meta_artifact_code + + @appbox_meta_artifact_code = ENV["DTC_RAKE_APPBOX_META_ARTIFACT_CODE"] + @appbox_meta_artifact_code + end + + def appbox_meta_artifact_code=(code) + env = ENV["DTC_RAKE_APPBOX_META_ARTIFACT_CODE"] + # environment variable takes precedence + @appbox_meta_artifact_code = env.nil? ? code : env + @appbox_meta_artifact_code + end + + def appbox_territory_code + return @appbox_territory_code if @appbox_territory_code + + @appbox_territory_code = ENV["DTC_RAKE_APPBOX_TERRITORY_CODE"] + @appbox_territory_code + end + + def appbox_territory_code=(code) + env = ENV["DTC_RAKE_APPBOX_TERRITORY_CODE"] + # environment variable takes precedence + @appbox_territory_code = env.nil? ? code : env + @appbox_territory_code + end + + def appbox_uarchive + return @appbox_uarchive if @appbox_uarchive + + @appbox_uarchive = ENV["DTC_RAKE_APPBOX_UARCHIVE"] + @appbox_uarchive + end + def appbox_uarchive=(path) + env = ENV["DTC_RAKE_APPBOX_UARCHIVE"] + # environment variable takes precedence + path = env unless env.nil? + unless path.nil? - path = File.join(root_dir, path) if Pathname.new(path).relative? # File.expand_path converts path to absolute and expands "~" to real user home path - @appbox_uarchive = File.expand_path(path) + path = File.expand_path(path) + + if Pathname.new(path).relative? + @appbox_uarchive = File.join(root_dir, path) + else + @appbox_uarchive = path + end end end - def app_descriptor_path - return @app_descriptor_path if @app_descriptor_path + def appbox_version + return @appbox_version if @appbox_version - default_file_path = File.expand_path(File.join(root_dir, "#{vendor}_#{app}-uuapp-deploy.json")) + @appbox_version = ENV["DTC_RAKE_APPBOX_VERSION"] - Dir.chdir(root_dir) do - unless File.file?(default_file_path) - abort "uuApp deployment descriptor not found. Please create file #{default_file_path} or configure its path in Rakefile." + if @appbox_version.nil? + version_file = File.join(root_dir, 'VERSION') + unless File.file?(version_file) + _error "Unknown appbox version. Set it in #{version_file} file or DTC_RAKE_APPBOX_VERSION environment variable." end - @app_descriptor_path = default_file_path + version = File.binread(version_file).strip + @appbox_version = version end end + def appbox_version=(code) + env = ENV["DTC_RAKE_APPBOX_VERSION"] + # environment variable takes precedence + @appbox_version = env.nil? ? code : env + @appbox_version + end + + def colorize + return @colorize if @colorize + + env = ENV["DTC_RAKE_COLORIZE"] + unless env.nil? + @colorize = to_bool(env) + end + @colorize + end + + def colorize=(flag) + env = ENV["DTC_RAKE_COLORIZE"] + # environment variable takes precedence + if env.nil? + @colorize = flag + else + @colorize = to_bool(env) + end + @colorize + end + + def output_dir + return @output_dir if @output_dir + + @output_dir = ENV["DTC_RAKE_OUTPUT_DIR"] + @output_dir + end + def output_dir=(path) + env = ENV["DTC_RAKE_OUTPUT_DIR"] + # environment variable takes precedence + path = env unless env.nil? + unless path.nil? - path = File.join(root_dir, path) if Pathname.new(path).relative? # File.expand_path converts path to absolute and expands "~" to real user home path - @output_dir = File.expand_path(path) + path = File.expand_path(path) + + if Pathname.new(path).relative? + @output_dir = File.join(root_dir, path) + else + @output_dir = path + end end end + def product_code + return @product_code if @product_code + + @product_code = ENV["DTC_RAKE_PRODUCT_CODE"] + @product_code + end + + def product_code=(code) + env = ENV["DTC_RAKE_PRODUCT_CODE"] + # environment variable takes precedence + @product_code = env.nil? ? code : env + @product_code + end + + def product_name + return @product_name if @product_name + + @product_name = ENV["DTC_RAKE_PRODUCT_NAME"] + @product_name + end + + def product_name=(name) + env = ENV["DTC_RAKE_PRODUCT_NAME"] + # environment variable takes precedence + @product_name = env.nil? ? name : env + @product_name + end + + def root_dir + return @root_dir if @root_dir + + @root_dir = ENV["DTC_RAKE_ROOT_DIR"] + @root_dir = Dir.pwd if @root_dir.nil? + + @root_dir + end + + def root_dir=(path) + env = ENV["DTC_RAKE_ROOT_DIR"] + # environment variable takes precedence + path = env unless env.nil? + + unless path.nil? + # File.expand_path converts path to absolute and expands "~" to real user home path + # If the path is relative, it gets evaluated against to current working directory (Dir.pwd) + @root_dir = File.expand_path(path) + end + end + + def upload_readme + return @upload_readme if @upload_readme + + @upload_readme = to_bool(ENV["DTC_RAKE_UPLOAD_README"]) + @upload_readme + end + + def upload_readme=(flag) + env = ENV["DTC_RAKE_UPLOAD_README"] + # environment variable takes precedence + if env.nil? + @upload_readme = flag + else + @upload_readme = to_bool(env) + end + @upload_readme + end + + def upload_uucloud_descriptor + return @upload_uucloud_descriptor if @upload_uucloud_descriptor + + @upload_uucloud_descriptor = to_bool(ENV["DTC_RAKE_UPLOAD_UUCLOUD_DESCRIPTOR"]) + @upload_uucloud_descriptor + end + + def upload_uucloud_descriptor=(flag) + env = ENV["DTC_RAKE_UPLOAD_UUCLOUD_DESCRIPTOR"] + # environment variable takes precedence + if env.nil? + @upload_uucloud_descriptor = flag + else + @upload_uucloud_descriptor = to_bool(env) + end + @upload_uucloud_descriptor + end + + def uucloud_descriptor_path + return @uucloud_descriptor_path if @uucloud_descriptor_path + + env = ENV["DTC_RAKE_UUCLOUD_DESCRIPTOR_PATH"] + if env.nil? + default_file_path = File.expand_path(File.join(root_dir, "uucloud_descriptor.json")) + + Dir.chdir(root_dir) do + unless File.file?(default_file_path) + _error "uuCloud deployment descriptor not found. Please create file #{default_file_path} or configure its path in Rakefile." \ + " Or you can configure its path in DTC_RAKE_UUCLOUD_DESCRIPTOR_PATH environment variable." + end + @uucloud_descriptor_path = default_file_path + end + else + env = File.expand_path(env) + unless File.file?(env) + _error "uuCloud deployment descriptor not found. Please create file #{env} or configure its path in" \ + " DTC_RAKE_UUCLOUD_DESCRIPTOR_PATH environment variable." + end + @uucloud_descriptor_path = env + end + end + def vendor=(name) @vendor = name.downcase unless name.nil? end + def version_files=(list) + if list.nil? + @version_files = [] + elsif list.is_a?(Array) + @version_files = list + else + _error "Invalid version_files value - #{list} (#{list})." \ + " Use an array of strings (representing file names or glob patterns)." + end + end + private + def to_bool(value) + (value =~ /^true|1|yes$/i) == 0 + end + def guess_vendor_and_app - base_name = File.basename(root_dir) - if /([^_]+)_([^-]+)-appbox/ =~ base_name - @vendor = $1 - @app = $2 + env_vendor = ENV["DTC_RAKE_VENDOR"] + env_app = ENV["DTC_RAKE_APP"] + + if env_vendor.nil? || env_app.nil? + base_name = File.basename(root_dir) + if /([^_]+)_([^-]+)-appbox/ =~ base_name + @vendor = env_vendor.nil? ? $1 : env_vendor + @app = env_app.nil? ? $2 : env_app + else + _error "Appbox root folder (#{base_name}) does not match naming convention <vendor>_<app>-appbox." \ + " Either change the folder name or configure 'vendor' and 'app' within DtcRake.configure in Rakefile." \ + " Or you can set DTC_RAKE_VENDOR and DTC_RAKE_APP environment variables to specify those." + end else - abort "Appbox root folder (#{base_name}) does not match naming convention <vendor>_<app>-appbox." \ - " Either change the folder name or configure 'vendor' and 'app' in Rakefile." + @vendor = env_vendor + @app = env_app end + end + + def _error(msg) + # this avoids cycle between dtc_rake/config and dtc_rake/ui + require "dtc_rake/ui" + self.class.send(:include, DtcRake::UI) unless self.class.include?(DtcRake::UI) + error(msg) end end end