cli_application 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,170 @@
1
+ module CliApplication
2
+ class Stat # :nodoc:
3
+ attr_reader :stat
4
+
5
+ def initialize(folders)
6
+ @stat_filename = File.join([folders[:class], 'stat', ::StTools::System.exename.gsub(/\.rb$/, '.yml')])
7
+ @stat_folder = File.join([folders[:class], 'stat'])
8
+ create_folder
9
+
10
+ init_stat
11
+ folders[:stat] = @stat_folder
12
+ @stat[:folders] = folders
13
+
14
+ @prev = load_stat
15
+ end
16
+
17
+ #-------------------------------------------------------------
18
+ #
19
+ # Функции настройки приложения
20
+ #
21
+ #-------------------------------------------------------------
22
+ def exitcode=(code)
23
+ @stat[:last][:exitcode] = code
24
+ end
25
+
26
+ def executed_at=(at)
27
+ @stat[:last][:executed_at] = at
28
+ end
29
+
30
+ def last_started_at=(at)
31
+ @stat[:last][:started_at] = at.to_s
32
+ @stat[:last_started_at] = at.to_s
33
+ end
34
+
35
+ def version=(val)
36
+ @stat[:version] = val
37
+ end
38
+
39
+ def description=(val)
40
+ @stat[:description] = val
41
+ end
42
+
43
+ def shortdescription=(val)
44
+ @stat[:shortdescription] = val
45
+ end
46
+
47
+ def releasedate=(val)
48
+ @stat[:releasedate] = val
49
+ end
50
+
51
+
52
+
53
+
54
+
55
+
56
+ def last_started_at_human
57
+ res = last_started_at
58
+ if res.nil? || res == ''
59
+ 'Ранее не запускалось'
60
+ else
61
+ "Последний запуск: #{res.to_time.human_datetime} (#{res.to_time.human_ago})"
62
+ end
63
+ end
64
+
65
+ def startes_human
66
+ res = @prev[:avg][:starts]
67
+ "Всего было #{res} запусков"
68
+ end
69
+
70
+ def last_started_at
71
+ @prev[:last][:started_at] || ::Time.zone.now
72
+ end
73
+
74
+ def load_stat
75
+ YAML.load_file(@stat_filename)
76
+ rescue
77
+ Marshal.load( Marshal.dump(init_stat))
78
+ end
79
+
80
+ def save
81
+ @prev = load_stat
82
+ update_stat
83
+ File.open(@stat_filename, 'w') {|f| f.write @prev.to_yaml }
84
+ end
85
+
86
+ def create_folder
87
+ unless Dir.exist?(@stat_folder)
88
+ Dir.mkdir(@stat_folder, 0777)
89
+ end
90
+ end
91
+
92
+ def timezone=(val)
93
+ @stat[:timezone] = val
94
+ end
95
+
96
+ def update_stat
97
+ @prev[:name] = @stat[:name]
98
+ @prev[:shortdescription] = @stat[:shortdescription]
99
+ @prev[:version] = @stat[:version]
100
+ @prev[:releasedate] = @stat[:releasedate]
101
+ @prev[:timezone] = ::Time.zone.name
102
+ @prev[:last_started_at] = @stat[:last_started_at]
103
+ @prev[:folders] = @stat[:folders]
104
+
105
+ make_averages(@prev[:avg])
106
+ make_last(@prev[:last])
107
+
108
+ tmp = Array.new
109
+ tmp << @prev[:last_started_at]
110
+ tmp << @prev[:last][:exitcode]
111
+ tmp << @prev[:last][:executed_at]
112
+ tmp << @prev[:last][:memory]
113
+
114
+ @prev[:last10].unshift(tmp.join(','))
115
+ @prev[:last10] = @prev[:last10][0,10]
116
+ end
117
+
118
+ def init_stat
119
+ @stat = Hash.new
120
+ @stat[:name] = ::StTools::System.exename
121
+ @stat[:shortdescription] = ''
122
+ @stat[:version] = ''
123
+ @stat[:releasedate] = ''
124
+ @stat[:timezone] = ''
125
+ @stat[:last_started_at] = ''
126
+ @stat[:folders] = @folders
127
+
128
+ @stat[:avg] = Hash.new
129
+ @stat[:avg][:starts] = 0
130
+ @stat[:avg][:executed_at] = 0
131
+ @stat[:avg][:executed_at_human] = ''
132
+ @stat[:avg][:memory] = 0
133
+
134
+ @stat[:last] = Hash.new
135
+ @stat[:last][:started_at] = nil
136
+ @stat[:last][:executed_at] = 0
137
+ @stat[:last][:executed_at_human] = ''
138
+ @stat[:last][:memory] = ''
139
+ @stat[:last][:exitcode] = 0
140
+
141
+ @stat[:last10] = Array.new
142
+
143
+ @stat
144
+ end
145
+
146
+ def make_averages(avg)
147
+ if avg[:starts] == 0
148
+ avg[:starts] = 1
149
+ avg[:executed_at] = @stat[:last][:executed_at]
150
+ avg[:executed_at_human] = ::StTools::Human.ago_in_words_pair(avg[:executed_at].to_i).join(' ')
151
+ avg[:memory] = ::StTools::System.memory.to_i
152
+ else
153
+ mul = avg[:starts]
154
+ avg[:starts] += 1
155
+ avg[:executed_at] = ((avg[:executed_at]*mul + @stat[:last][:executed_at]).to_f / avg[:starts]).round(6)
156
+ avg[:executed_at_human] = ::StTools::Human.ago_in_words_pair(avg[:executed_at]).join(' ')
157
+ avg[:memory] = (avg[:memory]*mul + ::StTools::System.memory).to_i / avg[:starts]
158
+ end
159
+ end
160
+
161
+ def make_last(last)
162
+ last[:started_at] = @stat[:last_started_at]
163
+ last[:executed_at] = @stat[:last][:executed_at]
164
+ last[:executed_at_human] = ::StTools::Human.ago_in_words_pair(last[:executed_at]).join(' ')
165
+ last[:memory] = ::StTools::Human.memory
166
+ last[:exitcode] = @stat[:last][:exitcode]
167
+ end
168
+
169
+ end
170
+ end
@@ -0,0 +1,3 @@
1
+ module CliApplication
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,21 @@
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
2
+
3
+ require "cli_application/version"
4
+ require 'st_tools'
5
+ require 'cli_application/includes'
6
+
7
+ require 'active_support/time'
8
+ require 'mysql2'
9
+ require 'pg'
10
+ require 'active_record'
11
+ require 'ostruct'
12
+
13
+
14
+ module CliApplication # :nodoc:
15
+ require 'cli_application/json_struct'
16
+ require 'cli_application/config'
17
+ require 'cli_application/databases'
18
+ require 'cli_application/stat'
19
+ require 'cli_application/argv'
20
+ require 'cli_application/app'
21
+ end
@@ -0,0 +1,25 @@
1
+ #encoding: utf-8
2
+
3
+ require 'ruby-progressbar'
4
+ require '../lib/cli_application.rb'
5
+
6
+ class CliExample < CliApplication::App
7
+
8
+ def initialize(argv, folder, lang = :ru)
9
+ super(argv, folder, __dir__, lang)
10
+ end
11
+
12
+ def init_app
13
+ super
14
+ add_config('class_config.yml', :class)
15
+ end
16
+
17
+ # Данный метод позволяет загружать модели ActiveRecords
18
+ def init_active_records
19
+ require './tovar.rb'
20
+ end
21
+
22
+ end
23
+
24
+ # todo: redmine wiki: создание заголовков категорий и наборов и искоренение type в mysql
25
+
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: utf-8
3
+ require './cli_example.rb'
4
+
5
+ class TestApp < CliExample
6
+
7
+ def main
8
+ puts "Hello, #{argv.user}!"
9
+ end
10
+
11
+ end
12
+
13
+ app = TestApp.new(ARGV, __dir__)
14
+
15
+ app.version = '1.0'
16
+ app.releasedate = '2015-05-11'
17
+ app.shortdescription = 'Пример 1 - Hello, world'
18
+ app.description = "CliApplication gem демо. #{app.shortdescription}"
19
+
20
+ app.set_argv(:string, 'user', 'World', 'Имя того, кого приветствуем')
21
+
22
+ app.help
23
+
24
+ app.run
25
+ exit(app.exitcode)
26
+
@@ -0,0 +1,14 @@
1
+ require '../../../lib/cli_application.rb'
2
+
3
+ class CliExample < CliApplication::App
4
+
5
+ def initialize(argv, folder, lang = :ru)
6
+ super(argv, folder, __dir__, lang)
7
+ end
8
+
9
+ def init_app
10
+ super
11
+ add_config('config.yml', :class)
12
+ end
13
+
14
+ end
@@ -0,0 +1,33 @@
1
+ ---
2
+ :name: app.rb
3
+ :shortdescription: "Пример 4 - Различные параметры командной строки"
4
+ :version: '1.0'
5
+ :releasedate: '2015-05-11'
6
+ :timezone: Moscow
7
+ :last_started_at: '2015-05-14 00:00:49 +0300'
8
+ :folders:
9
+ :app: "/Users/Stan/Documents/Development/RubyMine/cli_application/test/examples/5"
10
+ :class: "/Users/Stan/Documents/Development/RubyMine/cli_application/test/examples/1"
11
+ :stat: "/Users/Stan/Documents/Development/RubyMine/cli_application/test/examples/1/stat"
12
+ :avg:
13
+ :starts: 61
14
+ :executed_at: 0.059675
15
+ :executed_at_human: 0.059675 секунд
16
+ :memory: 32057
17
+ :last:
18
+ :started_at: '2015-05-14 00:00:49 +0300'
19
+ :executed_at: 0.045486
20
+ :executed_at_human: 0.045486 секунд
21
+ :memory: 33 кбайт
22
+ :exitcode: 0
23
+ :last10:
24
+ - 2015-05-14 00:00:49 +0300,0,0.045486,33 кбайт
25
+ - 2015-05-13 22:04:12 +0300,0,1.267228,38 кбайт
26
+ - 2015-05-13 22:02:47 +0300,0,0.034901,34 кбайт
27
+ - 2015-05-13 21:58:13 +0300,0,0.061671,32 кбайт
28
+ - 2015-05-13 21:55:36 +0300,0,0.033505,31 кбайт
29
+ - 2015-05-13 21:54:50 +0300,0,0.034287,31 кбайт
30
+ - 2015-05-13 21:50:54 +0300,255,0.045199,32 кбайт
31
+ - 2015-05-13 21:49:27 +0300,255,0.02996,31 кбайт
32
+ - 2015-05-13 21:30:34 +0300,255,0.049195,31 кбайт
33
+ - 2015-05-13 21:29:22 +0300,0,0.031453,32 кбайт
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: utf-8
3
+ require '../1/cli_example.rb'
4
+
5
+ class TestApp < CliExample
6
+
7
+ def main
8
+ puts "Приложение: #{exename}"
9
+ puts "Запущено из папки: #{folders[:app]}"
10
+ puts "Базовый класс в: #{folders[:class]}"
11
+ puts "Занимает сейчас в памяти #{StTools::Human.memory}"
12
+ puts "С момента начала выполнения прошло #{executed_at} секунд"
13
+ end
14
+
15
+ end
16
+
17
+ app = TestApp.new(ARGV, __dir__)
18
+
19
+ app.version = '1.0'
20
+ app.releasedate = '2015-05-11'
21
+ app.shortdescription = 'Пример 2 - Настройки CLI-приложения'
22
+ app.description = "CliApplication gem демо. #{app.shortdescription}"
23
+
24
+ app.help
25
+
26
+ app.run
27
+ exit(app.exitcode)
28
+
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: utf-8
3
+ require '../1/cli_example.rb'
4
+
5
+ class TestApp < CliExample
6
+
7
+ def main
8
+ return 10
9
+ end
10
+
11
+ end
12
+
13
+ app = TestApp.new(ARGV, __dir__)
14
+
15
+ app.version = '1.0'
16
+ app.releasedate = '2015-05-11'
17
+ app.shortdescription = 'Пример 3 - Настройка футера'
18
+ app.description = "CliApplication gem демо. #{app.shortdescription}"
19
+
20
+ app.help
21
+ app.footer = "{status} ({exitcode}) - приложение завершено за {executed_at} секунд (занято в памяти {memory})"
22
+
23
+ app.run
24
+ exit(app.exitcode)
25
+
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: utf-8
3
+ require '../1/cli_example.rb'
4
+
5
+ class TestApp < CliExample
6
+
7
+ def main
8
+ puts ":downcase - #{argv.ex1.inspect} (#{argv.ex1.class.to_s})"
9
+ puts ":upcase - #{argv.ex2.inspect} (#{argv.ex2.class.to_s})"
10
+ puts ":bool - #{argv.ex3.inspect} (#{argv.ex3.class.to_s})"
11
+ puts ":split - #{argv.ex4.inspect} (#{argv.ex4.class.to_s})"
12
+ puts ":range - #{argv.ex5.inspect} (#{argv.ex5.class.to_s})"
13
+ puts ":float - #{argv.ex6.inspect} (#{argv.ex6.class.to_s})"
14
+ puts ":integer - #{argv.ex7.inspect} (#{argv.ex7.class.to_s})"
15
+ puts ":normalize - #{argv.ex8.inspect} (#{argv.ex8.class.to_s})"
16
+ puts ":caps - #{argv.ex9.inspect} (#{argv.ex9.class.to_s})"
17
+ puts ":string - #{argv.ex10.inspect} (#{argv.ex10.class.to_s})"
18
+ puts "Неизвестный ключ возвращает nil - #{argv.no_key.inspect}"
19
+
20
+ puts
21
+ 0
22
+ end
23
+
24
+ end
25
+
26
+ app = TestApp.new(ARGV, __dir__)
27
+
28
+ app.version = '1.0'
29
+ app.releasedate = '2015-05-11'
30
+ app.shortdescription = 'Пример 4 - Различные параметры командной строки'
31
+ app.description = "CliApplication gem демо. #{app.shortdescription}"
32
+
33
+ app.set_argv(:downcase, 'ex1', 'НИКолай', 'Пример преобразования аргумента в нижний регистр')
34
+ app.set_argv(:upcase, 'ex2', 'НИКолай', 'Пример преобразования аргумента в верхний регистр')
35
+ app.set_argv(:bool, 'ex3', true, 'Пример преобразования логического аргумента в тип boolean')
36
+ app.set_argv(:split, 'ex4', 'Москва,Санкт-Петербург,Абакан', 'Пример преобразования входного списка в массив')
37
+ app.set_argv(:range, 'ex5', '1, 35, 23, 10-14', 'Пример преобразования диапазона в массив')
38
+ app.set_argv(:float, 'ex6', 3.14, 'Пример числа с плавающей запятой')
39
+ app.set_argv(:integer, 'ex7', 3.14, 'Пример целого числа')
40
+ app.set_argv(:normalize, 'ex8', 'Москва - крупный город ', 'Пример нормализации строки')
41
+ app.set_argv(:caps, 'ex9', 'иванов иВАН иваныч', 'Пример перевода строки в красивый human-вид')
42
+ app.set_argv(:string, 'ex10', 'ПрИвВеТ', 'Пример неизменного аргумента командной строки')
43
+
44
+ app.help
45
+ app.footer = "{status} ({exitcode}) - приложение завершено за {executed_at} секунд (занято в памяти {memory})"
46
+
47
+ app.run
48
+ exit(app.exitcode)
49
+
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: utf-8
3
+ require '../1/cli_example.rb'
4
+
5
+ class TestApp < CliExample
6
+
7
+ def main
8
+ puts "Временная зона для приложения (из конфига класса): #{config.cli.timezone}"
9
+ puts "Тестовый ключ (из доп. конфига приложения): #{config.this_app.test_key}"
10
+ puts
11
+ 0
12
+ end
13
+
14
+ def init_app
15
+ super
16
+ @config.add('app_config.yml', :app)
17
+ end
18
+
19
+ end
20
+
21
+ app = TestApp.new(ARGV, __dir__)
22
+
23
+ app.version = '1.0'
24
+ app.releasedate = '2015-05-11'
25
+ app.shortdescription = 'Пример 4 - Различные параметры командной строки'
26
+ app.description = "CliApplication gem демо. #{app.shortdescription}"
27
+
28
+ app.help
29
+ app.footer = "{status} ({exitcode}) - приложение завершено за {executed_at} секунд (занято в памяти {memory})"
30
+
31
+ app.run
32
+ exit(app.exitcode)
33
+
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: utf-8
3
+ require '../1/cli_example.rb'
4
+
5
+ class TestApp < CliExample
6
+
7
+ def main
8
+ puts Offer.first.inspect
9
+ puts
10
+ 0
11
+ end
12
+
13
+ def init_active_records
14
+ require './offer.rb'
15
+ end
16
+
17
+ end
18
+
19
+ app = TestApp.new(ARGV, __dir__)
20
+
21
+ app.version = '1.0'
22
+ app.releasedate = '2015-05-11'
23
+ app.shortdescription = 'Пример 6 - подключение ActiveRecords и баз данных'
24
+ app.description = "CliApplication gem демо. #{app.shortdescription}"
25
+
26
+ app.help
27
+ app.footer = "{status} ({exitcode}) - приложение завершено за {executed_at} секунд (занято в памяти {memory})"
28
+
29
+ app.run
30
+ exit(app.exitcode)
31
+
@@ -0,0 +1,5 @@
1
+ class Offer < ActiveRecord::Base
2
+ self.establish_connection self.configurations[:default]
3
+ self.table_name = "offers_table"
4
+
5
+ end
@@ -0,0 +1,21 @@
1
+ ---
2
+ :name: rdebug-ide
3
+ :shortdescription: ''
4
+ :version: ''
5
+ :releasedate: ''
6
+ :timezone: Moscow
7
+ :last_started_at: ''
8
+ :folders:
9
+ :avg:
10
+ :starts: 1
11
+ :executed_at: 0
12
+ :executed_at_human: 0 секунд
13
+ :memory: 28860
14
+ :last:
15
+ :started_at: ''
16
+ :executed_at: 0
17
+ :executed_at_human: 0 секунд
18
+ :memory: 28 кбайт
19
+ :exitcode: 0
20
+ :last10:
21
+ - ",0,0,28 кбайт"
@@ -0,0 +1,29 @@
1
+ ---
2
+ :name: test_app.rb
3
+ :shortdescription: "Тестовое приложение"
4
+ :version: '1.0'
5
+ :releasedate: '2015-04-28'
6
+ :timezone: Moscow
7
+ :last_started_at: '2015-05-11 20:18:08 +0300'
8
+ :folders:
9
+ :app: "/Users/Stan/Documents/Development/RubyMine/cli_application/test"
10
+ :class: "/Users/Stan/Documents/Development/RubyMine/cli_application/test"
11
+ :stat: "/Users/Stan/Documents/Development/RubyMine/cli_application/test/stat"
12
+ :avg:
13
+ :starts: 6
14
+ :executed_at: 0.457864
15
+ :executed_at_human: 0.457864 секунд
16
+ :memory: 34187
17
+ :last:
18
+ :started_at: '2015-05-11 20:18:08 +0300'
19
+ :executed_at: 1.354743
20
+ :executed_at_human: 1.354743 секунд
21
+ :memory: 38 кбайт
22
+ :exitcode: 0
23
+ :last10:
24
+ - 2015-05-11 20:18:08 +0300,0,1.354743,38 кбайт
25
+ - 2015-05-10 08:51:15 +0300,0,1.242313,39 кбайт
26
+ - 2015-05-10 08:43:39 +0300,0,0.066742,37 кбайт
27
+ - 2015-05-10 08:36:33 +0300,0,0.056735,34 кбайт
28
+ - 2015-05-08 22:33:07 +0300,0,0.02665,27 кбайт
29
+ - ",0,0,25 кбайт"
data/test/test_app.rb ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: utf-8
3
+ require './cli_example.rb'
4
+
5
+ class TestApp < CliExample
6
+
7
+ def main
8
+ # Внутри класса можно получать папки приложения или базового класса
9
+ # что эквивалентно __FILE__, но более удобно
10
+ puts "Приложение запущено из папки: #{self.folder.inspect}"
11
+ puts "Базовый класс расположен: #{self.folder(:class).inspect}"
12
+
13
+ # В базовом классе CliExample добавлена необязательная функция init_app
14
+ # в которой осуществляется подгрузка дополнительного конфига класса
15
+ puts @config.config.inspect
16
+ puts "Значение из доп. конфига класса: #{@config.config[:common][:test_key]}"
17
+
18
+ # В этот класс TestApp добавлена необязательная функция init_app
19
+ # в которой осуществляется подгрузка дополнительного конфига приложения
20
+ puts "Значение из доп. конфига приложения: #{@config.config[:app][:test_key]}"
21
+
22
+ puts "! Число конфигов неограничено"
23
+
24
+ # todo: progress_bar и методы st_tools
25
+
26
+ puts
27
+ puts "--- Часть 2 - ActiveRecords ------------------"
28
+ tc = Tovar.first
29
+ puts tc.inspect
30
+
31
+
32
+ puts
33
+ return 0
34
+ end
35
+
36
+ def init_app
37
+ super
38
+ add_config('app_config.yml', :app)
39
+ end
40
+
41
+ end
42
+
43
+ app = TestApp.new(ARGV, __dir__)
44
+
45
+ app.version = '1.0'
46
+ app.releasedate = '2015-04-28'
47
+ app.shortdescription = 'Тестовое приложение'
48
+ app.description = "CliApplication gem. #{app.shortdescription}"
49
+
50
+ app.set_argv(:donwcase, 'do', 'none', 'Начать исполнение действий')
51
+ app.set_argv(:range, 'user_id', '53,124', 'Массив идентификаторов пользователей')
52
+ app.set_argv(:range, 'empty', '', 'Массив пустых значений. Массив пустых значений. Массив пустых значений. Массив пустых значений. ')
53
+ app.set_argv(:boolean, 'debug', 'false', 'Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. Начать отладку. ')
54
+ app.set_argv(:upcase, 'city', 'Нет', 'Город для анализа')
55
+
56
+ app.help
57
+
58
+ app.run
59
+ exit(app.exitcode)
60
+
data/test/tovar.rb ADDED
@@ -0,0 +1,5 @@
1
+ class Tovar < ActiveRecord::Base
2
+ self.establish_connection self.configurations[:default]
3
+ self.table_name = "modx_vs_vs_tovar"
4
+
5
+ end