Class: CliApplication::Stat

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

Overview

:nodoc:

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(folders) ⇒ Stat

Returns a new instance of Stat.



6
7
8
9
10
11
12
13
14
15
16
# File 'lib/cli_application/stat.rb', line 6

def initialize(folders)
  @stat_filename = File.join([folders[:class], 'stat', ::StTools::System.exename.gsub(/\.rb$/, '.yml')])
  @stat_folder   = File.join([folders[:class], 'stat'])
  create_folder

  init_stat
  folders[:stat]  = @stat_folder
  @stat[:folders] = folders

  @prev = load_stat
end

Instance Attribute Details

#statObject (readonly)

Returns the value of attribute stat.



3
4
5
# File 'lib/cli_application/stat.rb', line 3

def stat
  @stat
end

Instance Method Details

#create_folderObject



96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/cli_application/stat.rb', line 96

def create_folder
  unless Dir.exist?(@stat_folder)
    Dir.mkdir(@stat_folder, 0777)
  end

# ToDo убрать в модуль Log
# 2018-01-06, добавляем проверку на доступность папки и файла. Если с этим проблема,
# то выбрасываем исключение, чтобы уже на этапе отладки было понятно, что
# при запуске приложения из под cron будут проблемы
  if File.exist?(@stat_filename)
    s = File.stat(@stat_filename)
    puts ">>>>>>>>>>>>>>>>>> #{s.mode}"
  end
end

#description=(val) ⇒ Object



45
46
47
# File 'lib/cli_application/stat.rb', line 45

def description=(val)
  @stat[:description] = val
end

#executed_at=(at) ⇒ Object



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

def executed_at=(at)
  @stat[:last][:executed_at] = at
end

#exitcode=(code) ⇒ Object


Функции настройки приложения




24
25
26
# File 'lib/cli_application/stat.rb', line 24

def exitcode=(code)
  @stat[:last][:exitcode] = code
end

#init_statObject



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/cli_application/stat.rb', line 140

def init_stat
  @stat                    = Hash.new
  @stat[:name]             = ::StTools::System.exename
  @stat[:shortdescription] = ''
  @stat[:version]          = ''
  @stat[:releasedate]      = ''
  @stat[:timezone]         = ''
  @stat[:last_started_at]  = ''
  @stat[:folders]          = @folders

  @stat[:avg]                     = Hash.new
  @stat[:avg][:starts]            = 0
  @stat[:avg][:executed_at]       = 0
  @stat[:avg][:executed_at_human] = ''
  @stat[:avg][:memory]            = 0

  @stat[:last]                     = Hash.new
  @stat[:last][:started_at]        = nil
  @stat[:last][:executed_at]       = 0
  @stat[:last][:executed_at_human] = ''
  @stat[:last][:memory]            = ''
  @stat[:last][:exitcode]          = 0

  @stat[:last10] = Array.new

  @stat
end

#last_started_atObject



76
77
78
# File 'lib/cli_application/stat.rb', line 76

def last_started_at
  @prev[:last][:started_at] || ::Time.zone.now
end

#last_started_at=(at) ⇒ Object



34
35
36
37
# File 'lib/cli_application/stat.rb', line 34

def last_started_at=(at)
  @stat[:last][:started_at] = at.to_s
  @stat[:last_started_at]   = at.to_s
end

#last_started_at_humanObject



60
61
62
63
64
65
66
67
# File 'lib/cli_application/stat.rb', line 60

def last_started_at_human
  res = last_started_at
  if res.nil? || res == ''
    'Ранее не запускалось'
  else
    "Последний запуск: #{res.to_time.human_datetime} (#{res.to_time.human_ago})"
  end
end

#load_statObject



81
82
83
84
85
86
# File 'lib/cli_application/stat.rb', line 81

def load_stat
  res = YAML.load_file(@stat_filename, {})
  res.empty? ? Marshal.load(Marshal.dump(init_stat)) : res
rescue
  Marshal.load(Marshal.dump(init_stat))
end

#make_averages(avg) ⇒ Object



169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/cli_application/stat.rb', line 169

def make_averages(avg)
  if avg[:starts] == 0
    avg[:starts]            = 1
    avg[:executed_at]       = @stat[:last][:executed_at]
    avg[:executed_at_human] = ::StTools::Human.ago_in_words_pair(avg[:executed_at].to_i).join(' ')
    avg[:memory]            = ::StTools::System.memory.to_i
  else
    mul                     = avg[:starts]
    avg[:starts]            += 1
    avg[:executed_at]       = ((avg[:executed_at] * mul + @stat[:last][:executed_at]).to_f / avg[:starts]).round(6)
    avg[:executed_at_human] = ::StTools::Human.ago_in_words_pair(avg[:executed_at]).join(' ')
    avg[:memory]            = (avg[:memory] * mul + ::StTools::System.memory).to_i / avg[:starts]
  end
end

#make_last(last) ⇒ Object



185
186
187
188
189
190
191
# File 'lib/cli_application/stat.rb', line 185

def make_last(last)
  last[:started_at]        = @stat[:last_started_at]
  last[:executed_at]       = @stat[:last][:executed_at]
  last[:executed_at_human] = ::StTools::Human.ago_in_words_pair(last[:executed_at]).join(' ')
  last[:memory]            = ::StTools::Human.memory
  last[:exitcode]          = @stat[:last][:exitcode]
end

#releasedate=(val) ⇒ Object



55
56
57
# File 'lib/cli_application/stat.rb', line 55

def releasedate=(val)
  @stat[:releasedate] = val
end

#saveObject



89
90
91
92
93
# File 'lib/cli_application/stat.rb', line 89

def save
  @prev = load_stat
  update_stat
  File.open(@stat_filename, 'w') { |f| f.write @prev.to_yaml }
end

#shortdescription=(val) ⇒ Object



50
51
52
# File 'lib/cli_application/stat.rb', line 50

def shortdescription=(val)
  @stat[:shortdescription] = val
end

#startes_humanObject



70
71
72
73
# File 'lib/cli_application/stat.rb', line 70

def startes_human
  res = @prev[:avg][:starts]
  "Всего было #{res} запусков"
end

#timezone=(val) ⇒ Object



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

def timezone=(val)
  @stat[:timezone] = val
end

#update_statObject



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/cli_application/stat.rb', line 117

def update_stat
  @prev[:name]             = @stat[:name]
  @prev[:shortdescription] = @stat[:shortdescription]
  @prev[:version]          = @stat[:version]
  @prev[:releasedate]      = @stat[:releasedate]
  @prev[:timezone]         = ::Time.zone.name
  @prev[:last_started_at]  = @stat[:last_started_at]
  @prev[:folders]          = @stat[:folders]

  make_averages(@prev[:avg])
  make_last(@prev[:last])

  tmp = Array.new
  tmp << @prev[:last_started_at]
  tmp << @prev[:last][:exitcode]
  tmp << @prev[:last][:executed_at]
  tmp << @prev[:last][:memory]

  @prev[:last10].unshift(tmp.join(','))
  @prev[:last10] = @prev[:last10][0, 10]
end

#version=(val) ⇒ Object



40
41
42
# File 'lib/cli_application/stat.rb', line 40

def version=(val)
  @stat[:version] = val
end