class CliApplication::App
Attributes
Ссылка на класс, который содержит аргменты командной строки или значения по умолчанию
Ссылка на класс конфигурации приложения
Структура, содержащая конфигурации баз данных
Строка - описание приложения
Код завершения приложения. Может быть использован в Bash-скриптах
Ссылка на класс - почтовик, для отсылки различных email'ов
Строка - дата релиза ПО
Строка - краткое описание (назначение) приложения
Строка - версия приложения
Public Class Methods
Конструктор экземпляра приложения
@param [Array] argv аргументы командной строки @param [String] appfolder директория, из которой запущено приложение @param [String] classfolder директория, в которой расположен базовый класс проекта @param [Sym] lang язык работы приложения (реализовано не полностью)
# File lib/cli_application/app.rb, line 37 def initialize(argv, appfolder, classfolder, lang = :ru) # ru: Настраиваем локализацию приложения # en: setup a localization StTools.configure { |config| config.locale = lang } I18n.load_path += Dir[File.join(__dir__, 'locales', '*.{rb,yml}')] I18n.available_locales = [:ru] I18n.default_locale = lang I18n.backend.load_translations @folders = Hash.new @folders[:app] = appfolder @folders[:class] = classfolder @argv = ::CliApplication::Argv.new(argv) @cli_stat_record = ::CliApplication::Stat.new(@folders) @config = ::CliApplication::Config.new(@folders) @databases = ::CliApplication::Databases.new(config.cli.databases) @mail = ::CliApplication::Mail.new(config.cli.mail, @folders) @footer = nil init_app_log init_app end
Public Instance Methods
Метод загружает конфиг и делает его доступным через единый интерфейс настроек конфигурации приложения (CliApplication::Config
) При каждом вызове данного метода все конфиги перечитываются заново.
@param [Sym] type параметр используется для указания местоположения конфига. Если указано :app или :class,
то имя файла с конфигом будет дополнено папкой класса или приложения
@option type [Sym] :app папка, из которой запущено приложение @option type [Sym] :class папка, в которой хранится базовый класс @option type [Sym] :absolute указывает на необходимость брать имя файла как задано разработчиком @return [Nil] нет
# File lib/cli_application/app.rb, line 105 def add_config(filename, type) @config.add(filename, type) end
Метод устанавливает описание приложения, которое будет выведено при старте скрипта. Данный метод используется для формирования подсказок пользователю.
@param [String] val строка с описанием приложения @example Примеры использования
app = CliApplication.new(ARGV, __dir__) app.description = 'Данное приложение обеспечивает.... (c) .... и т.д.'
# File lib/cli_application/app.rb, line 152 def description=(val) @description = val @cli_stat_record.description = val end
Метод возвращает число секунд в формате Float с момента запуска приложения. В основном используется для показа времени выполнения приложения, но может быть вызван в любой момент из любого места приложения.
@return [Float] число секунд с момента запуска приложения @example Примеры использования
puts "С момента запуска прошло #{executed_at} сек." #=> "С момента запуска прошло 23.456435 сек."
# File lib/cli_application/app.rb, line 122 def executed_at @executed_at = (::Time.now - @started_at).to_f end
Метод возвращает имя приложения
@return [String] имя приложения без параметров командной строки и пути
# File lib/cli_application/app.rb, line 112 def exename ::StTools::System.exename end
Метод устанавливает код, с которым будет завершена работа приложения.
@param [Integer] code код завершения приложения, который будет передан в операционную систему (bash)
# File lib/cli_application/app.rb, line 129 def exitcode=(code) @exitcode = code @cli_stat_record.exitcode = code end
Метод возвращает папку из которой запущено приложение или расположен базовый класс. Базовый класс обычно располагается в фиксированном месте, например, в папке cli корня проекта. Соответственно, если вызвать File.dirname(app.folder(:class)), то можно будет узнать корневую папку проекта
@param [Sym] type тип возвращаемой папки @option type [Sym] :app папка, из которой запущено приложение (по умолчанию) @option type [Sym] :class папка, в которой хранится базовый класс @option type [Sym] :stat папка, в которой хранится статистика по приложению @return [String] папка, из которой запущено приложение или расположен базовый класс
# File lib/cli_application/app.rb, line 91 def folder(type = :app) warn "Предупреждение: тип папки '#{type.inspect}' неизвестен (допустимо #{@folders.keys.inspect})" unless @folders.keys.include?(type) @folders[type] end
Метод отображает на экране информацию о приложении (версия, дата последнего запуска, дата релиза, и пр.) @param [Syn] type при указании :full выводится полное описание, при других значениях не выводится
подсказка по аргументам командной строки
# File lib/cli_application/app.rb, line 264 def help(type = :full) last_started_at_human = @cli_stat_record.last_started_at_human puts ::StTools::System.exename + ' - ' + @shortdescription puts "Версия #{@version} (#{@releasedate})" puts last_started_at_human puts @cli_stat_record.startes_human puts puts @description if type == :full @argv.help puts end end
Метод предназначен для подключения файлов-моделей ActiveRecords. Архитектура CLI-приложения, учитывающая совместимость с Rails-проектами, требует загрузки моделей после чтения файлов конфигурации и, соответственно, иницииации класса приложения. Поэтому объявить require файлов моделей в начале файла не получится, будут выводится ошибки инициализации базы данных.
@example Примеры использования
def init_active_records require 'offers.rb' require 'params.rb' require 'categories.rb' end
# File lib/cli_application/app.rb, line 191 def init_active_records end
Метод инициализации приложения. Может быть переписан с обязательным вызовом функции super
@example Примеры использования
def init_app super # Код своего приложения end
# File lib/cli_application/app.rb, line 203 def init_app @cli_stat_record.last_started_at = ::Time.zone.now @started_at = ::Time.now @exitcode = 0 init_active_records end
# File lib/cli_application/app.rb, line 63 def init_app_log log_config = ::CliApplication::Log::Config.new(@config) case log_config.type when :none @cli_log = ::CliApplication::Log::None.new when :file @cli_log = ::CliApplication::Log::File.new(self, log_config, @folders[:class]) else raise I18n.t('error.config.log_unknown', type: log_config.type.to_s.inspect) end @cli_log.save_app_start_information end
Основной метод, в котором должен быть размещен код приложения @return [Integer] метод должен возвращать код, который будет транслирован в параметр exitcode
# File lib/cli_application/app.rb, line 239 def main warn "ПРЕДУПРЕЖДЕНИЕ: необходимо переопределить функцию 'main' в вашем коде" 255 end
Метод устанавливает дату последнего изменения (выпуска) приложения. Используется в справочных целях
@param [String] val строка датой релиза (выпуска) приложения @example Примеры использования
app = CliApplication.new(ARGV, __dir__) app.releasedate = '2015-05-11'
# File lib/cli_application/app.rb, line 175 def releasedate=(val) @releasedate = val @cli_stat_record.releasedate = val end
# File lib/cli_application/app.rb, line 280 def reserved_methods out = ['argv', 'folders', 'config', 'mail', 'executed_at', 'version', 'description', 'footer', 'databases'] out += ['help', 'run'] out.sort end
При вызове данного метода начнется выполнение кода приложения (будет осуществен вызов функции main)
# File lib/cli_application/app.rb, line 245 def run @cli_log.save_app_run_information begin self.exitcode = main || 255 rescue Exception => e @cli_log.set_exception(e) raise e ensure self.executed_at = (::Time.now - @started_at).to_f @cli_log.save_app_finish_information end puts_footer @cli_stat_record.save self.exitcode end
Метод добавления аргумента командной строки. Вызывается при инициализации приложения, служит для определения списка аргументов командной строки, формирвоания подсказок и установки значения по умолчанию. В классе принят не традиционный для Linux формат командной строки. Пример вызова: add_city.rb user_id=123 name=Максим city='Верхние Луки'.
Параметры, добавленные данным методом доступны через переменную argv (см. примеры)
@param [Sym] action параметр определяет действие, которое надо произвести над параметром командной строки. @param [String] key название ключа, напрмиер 'user_id', 'name', 'city'. @param [Object] default значение по умочланию, “подставляемое” при отсутствии заданного пользователем параметра @param [String] description описание параметра (подсказка)
@example Примеры использования
app = CliApplication.new(ARGV, __dir__) app.set_argv(:integer, 'user_id', 0, 'Идентификатор пользователя') app.set_argv(:string, 'name', 'Без имени', 'Имя пользователя') app.set_argv(:caps, 'city', 'москВА', 'Город проживания пользователя') def main puts argv.user_id #=> 0 puts argv.name #=> 'Без имени' puts argv.city #=> 'Москва' end
# File lib/cli_application/app.rb, line 233 def set_argv(action, key, default, description) @argv.set_argv(action, key, default, description) end
Метод устанавливает краткое описание приложения, которое будет выведено при старте скрипта, а также отображено в файле статистики.
@param [String] val строка с кратким описанием приложения @example Примеры использования
app = CliApplication.new(ARGV, __dir__) app.shortdescription = 'Утилита форматирования диска'
# File lib/cli_application/app.rb, line 164 def shortdescription=(val) @shortdescription = val @cli_stat_record.shortdescription = val end
Метод устанавливает текущую версию приложения, которая потом отобразится в файле статистики
@param [Integer] val строка с версией приложения @example Примеры использования
app = CliApplication.new(ARGV, __dir__) app.version = '2.1'
# File lib/cli_application/app.rb, line 140 def version=(val) @version = val @cli_stat_record.version = val end
Private Instance Methods
# File lib/cli_application/app.rb, line 299 def executed_at=(at) @executed_at = at @cli_stat_record.executed_at = at end