Class: CliApplication::App

Inherits:
Object
  • Object
show all
Defined in:
lib/cli_application/app.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argv, appfolder, classfolder, lang = :ru) ⇒ App

Конструктор экземпляра приложения

Parameters:

  • argv (Array)

    аргументы командной строки

  • appfolder (String)

    директория, из которой запущено приложение

  • classfolder (String)

    директория, в которой расположен базовый класс проекта

  • lang (Sym) (defaults to: :ru)

    язык работы приложения (реализовано не полностью)



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 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

Instance Attribute Details

#argvObject (readonly)

Ссылка на класс, который содержит аргменты командной строки или значения по умолчанию



7
8
9
# File 'lib/cli_application/app.rb', line 7

def argv
  @argv
end

#configObject (readonly)

Ссылка на класс конфигурации приложения



17
18
19
# File 'lib/cli_application/app.rb', line 17

def config
  @config
end

#databasesObject (readonly)

Структура, содержащая конфигурации баз данных



27
28
29
# File 'lib/cli_application/app.rb', line 27

def databases
  @databases
end

#descriptionObject

Строка - описание приложения



21
22
23
# File 'lib/cli_application/app.rb', line 21

def description
  @description
end

#exitcodeObject

Код завершения приложения. Может быть использован в Bash-скриптах



11
12
13
# File 'lib/cli_application/app.rb', line 11

def exitcode
  @exitcode
end

#foldersObject (readonly)

Ссылка на массив, содержащий список директорий в которых исполняется приложение. Основные: folders - папка из которой запущено приложение, folders - папка, в которой хранится базовый класс проекта.



15
16
17
# File 'lib/cli_application/app.rb', line 15

def folders
  @folders
end

Строка-шаблон, вывод которой происходит после завершения работы приложения



29
30
31
# File 'lib/cli_application/app.rb', line 29

def footer
  @footer
end

#mailObject (readonly)

Ссылка на класс - почтовик, для отсылки различных email’ов



9
10
11
# File 'lib/cli_application/app.rb', line 9

def mail
  @mail
end

#releasedateObject

Строка - дата релиза ПО



25
26
27
# File 'lib/cli_application/app.rb', line 25

def releasedate
  @releasedate
end

#shortdescriptionObject

Строка - краткое описание (назначение) приложения



23
24
25
# File 'lib/cli_application/app.rb', line 23

def shortdescription
  @shortdescription
end

#versionObject

Строка - версия приложения



19
20
21
# File 'lib/cli_application/app.rb', line 19

def version
  @version
end

Instance Method Details

#add_config(filename, type) ⇒ Nil

Метод загружает конфиг и делает его доступным через единый интерфейс настроек конфигурации приложения (CliApplication::Config) При каждом вызове данного метода все конфиги перечитываются заново.

Parameters:

  • type (Sym)

    параметр используется для указания местоположения конфига. Если указано :app или :class, то имя файла с конфигом будет дополнено папкой класса или приложения

Options Hash (type):

  • :app (Sym)

    папка, из которой запущено приложение

  • :class (Sym)

    папка, в которой хранится базовый класс

  • :absolute (Sym)

    указывает на необходимость брать имя файла как задано разработчиком

Returns:

  • (Nil)

    нет



105
106
107
# File 'lib/cli_application/app.rb', line 105

def add_config(filename, type)
  @config.add(filename, type)
end

#executed_atFloat

Метод возвращает число секунд в формате Float с момента запуска приложения. В основном используется для показа времени выполнения приложения, но может быть вызван в любой момент из любого места приложения.

Examples:

Примеры использования

puts "С момента запуска прошло #{executed_at} сек."     #=> "С момента запуска прошло 23.456435 сек."

Returns:

  • (Float)

    число секунд с момента запуска приложения



122
123
124
# File 'lib/cli_application/app.rb', line 122

def executed_at
  @executed_at = (::Time.now - @started_at).to_f
end

#exenameString

Метод возвращает имя приложения

Returns:

  • (String)

    имя приложения без параметров командной строки и пути



112
113
114
# File 'lib/cli_application/app.rb', line 112

def exename
  ::StTools::System.exename
end

#folder(type = :app) ⇒ String

Метод возвращает папку из которой запущено приложение или расположен базовый класс. Базовый класс обычно располагается в фиксированном месте, например, в папке cli корня проекта. Соответственно, если вызвать File.dirname(app.folder(:class)), то можно будет узнать корневую папку проекта

Parameters:

  • type (Sym) (defaults to: :app)

    тип возвращаемой папки

Options Hash (type):

  • :app (Sym)

    папка, из которой запущено приложение (по умолчанию)

  • :class (Sym)

    папка, в которой хранится базовый класс

  • :stat (Sym)

    папка, в которой хранится статистика по приложению

Returns:

  • (String)

    папка, из которой запущено приложение или расположен базовый класс



91
92
93
94
# 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

#help(type = :full) ⇒ Object

Метод отображает на экране информацию о приложении (версия, дата последнего запуска, дата релиза, и пр.)

Parameters:

  • type (Syn) (defaults to: :full)

    при указании :full выводится полное описание, при других значениях не выводится подсказка по аргументам командной строки



264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
# 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

#init_active_recordsObject

Метод предназначен для подключения файлов-моделей ActiveRecords. Архитектура CLI-приложения, учитывающая совместимость с Rails-проектами, требует загрузки моделей после чтения файлов конфигурации и, соответственно, иницииации класса приложения. Поэтому объявить require файлов моделей в начале файла не получится, будут выводится ошибки инициализации базы данных.

Examples:

Примеры использования

def init_active_records
  require 'offers.rb'
  require 'params.rb'
  require 'categories.rb'
end


191
192
193
# File 'lib/cli_application/app.rb', line 191

def init_active_records

end

#init_appObject

Метод инициализации приложения. Может быть переписан с обязательным вызовом функции super

Examples:

Примеры использования

def init_app
  super

  # Код своего приложения
end


203
204
205
206
207
208
209
# 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

#init_app_logObject



63
64
65
66
67
68
69
70
71
72
73
74
# 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

#mainInteger

Основной метод, в котором должен быть размещен код приложения

Returns:

  • (Integer)

    метод должен возвращать код, который будет транслирован в параметр exitcode



239
240
241
242
# File 'lib/cli_application/app.rb', line 239

def main
  warn "ПРЕДУПРЕЖДЕНИЕ: необходимо переопределить функцию 'main' в вашем коде"
  255
end

#reserved_methodsObject



280
281
282
283
284
# 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

#runObject

При вызове данного метода начнется выполнение кода приложения (будет осуществен вызов функции main)



245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# 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

#set_argv(action, key, default, description) ⇒ Object

Метод добавления аргумента командной строки. Вызывается при инициализации приложения, служит для определения списка аргументов командной строки, формирвоания подсказок и установки значения по умолчанию. В классе принят не традиционный для Linux формат командной строки. Пример вызова: add_city.rb user_id=123 name=Максим city=‘Верхние Луки’.

Параметры, добавленные данным методом доступны через переменную argv (см. примеры)

Examples:

Примеры использования

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

Parameters:

  • action (Sym)

    параметр определяет действие, которое надо произвести над параметром командной строки.

  • key (String)

    название ключа, напрмиер ‘user_id’, ‘name’, ‘city’.

  • default (Object)

    значение по умочланию, “подставляемое” при отсутствии заданного пользователем параметра

  • description (String)

    описание параметра (подсказка)



233
234
235
# File 'lib/cli_application/app.rb', line 233

def set_argv(action, key, default, description)
  @argv.set_argv(action, key, default, description)
end