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
# File 'lib/cli_application/app.rb', line 37

def initialize(argv, appfolder, classfolder, lang = :ru)
  ::StTools::Setup.setup(lang)

  @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
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)

    нет



85
86
87
# File 'lib/cli_application/app.rb', line 85

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

#executed_atFloat

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

Examples:

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

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

Returns:

  • (Float)

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



102
103
104
# File 'lib/cli_application/app.rb', line 102

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

#exenameString

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

Returns:

  • (String)

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



92
93
94
# File 'lib/cli_application/app.rb', line 92

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)

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



71
72
73
74
# File 'lib/cli_application/app.rb', line 71

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 выводится полное описание, при других значениях не выводится подсказка по аргументам командной строки



236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/cli_application/app.rb', line 236

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


171
172
173
# File 'lib/cli_application/app.rb', line 171

def init_active_records

end

#init_appObject

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

Examples:

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

def init_app
  super

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


183
184
185
186
187
188
189
# File 'lib/cli_application/app.rb', line 183

def init_app
  @cli_stat_record.last_started_at = ::Time.zone.now
  @started_at = ::Time.now
  @exitcode = 0

  init_active_records
end

#mainInteger

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

Returns:

  • (Integer)

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



219
220
221
222
# File 'lib/cli_application/app.rb', line 219

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

#reserved_methodsObject



252
253
254
255
256
# File 'lib/cli_application/app.rb', line 252

def reserved_methods
  out = ['argv', 'folders', 'config', 'mail', 'executed_at', 'version', 'description', 'footer', 'databases']
  out += ['help', 'run']
  out.sort
end

#runObject

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



225
226
227
228
229
230
231
# File 'lib/cli_application/app.rb', line 225

def run
  self.exitcode = main || 255
  self.executed_at = (::Time.now - @started_at).to_f
  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)

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



213
214
215
# File 'lib/cli_application/app.rb', line 213

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