Class: StTools::Human

Inherits:
Object
  • Object
show all
Defined in:
lib/st_tools/human.rb

Class Method Summary collapse

Class Method Details

.ago_in_words_one_pair(val1, val2, tag1, tag2) ⇒ Object



158
159
160
# File 'lib/st_tools/human.rb', line 158

def self.ago_in_words_one_pair(val1, val2, tag1, tag2)
  return [ago_in_words_one_value(val1, tag1), ago_in_words_one_value(val2, tag2)]
end

.ago_in_words_one_value(val, tag) ⇒ Object



162
163
164
165
166
167
168
169
# File 'lib/st_tools/human.rb', line 162

def self.ago_in_words_one_value(val, tag)
  num100 = val % 100
  num10 = val % 10
  return val.to_s + " " + I18n.t("common.ago.#{tag}.other") if (num100 >=5 && num100 <= 20)
  return val.to_s + " " + I18n.t("common.ago.#{tag}.one") if (num10 == 1)
  return val.to_s + " " + I18n.t("common.ago.#{tag}.two") if ([2, 3, 4].include?(num10))
  return val.to_s + " " + I18n.t("common.ago.#{tag}.other")
end

.ago_in_words_pair(secs) ⇒ Object



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/st_tools/human.rb', line 142

def self.ago_in_words_pair(secs)
  mins = (secs / 60).to_i
  hours = (mins / 60).to_i
  days = (hours / 24).to_i
  years = (days / 365).to_i
  months = (days / (365/12)).to_i
  # puts "#{secs}, #{mins}, #{hours}, #{days}, #{months}, #{years}"

  return ago_in_words_one_pair(years, months - (years*12), "year", "month") if (months > 12)
  return ago_in_words_one_pair(months, days - (months*(365/12)), "month", "day") if (days > 28)
  return ago_in_words_one_pair(days, hours - (days*24), "day", "hour") if (hours > 24)
  return ago_in_words_one_pair(hours, mins - (hours*60), "hour", "minute") if (mins > 60)
  return ago_in_words_one_pair(mins, secs - (mins*60), "minute", "second") if (secs > 60)
  return [ago_in_words_one_value(secs, "second")]
end

.bytes(val) ⇒ String

Метод форматирует число, добавляя суффиксы ‘кбайт’, ‘Мбайт’ и др.

Examples:

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

StTools::Human.bytes(123)           #=> "123 байта"
StTools::Human.bytes(14563)         #=> "14 кбайт"
StTools::Human.bytes(763552638)     #=> "728.2 Мбайт"

Parameters:

  • val (Integer)

    исходное числовое значение в байтах

Returns:

  • (String)

    строка вида “512,4 Мбайт”



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/st_tools/human.rb', line 38

def self.bytes(val)
  # todo: локлаизовать через i18N
  # noinspection RubyStringKeysInHashInspection
  arr = {'байт' => 1024, 'кбайт' => 1024 * 1024, 'Мбайт' => 1024 * 1024 * 1024,
         'Гбайт' => 1024 * 1024 * 1024 * 1024, 'Тбайт' => 1024 * 1024 * 1024 * 1024 * 1024}

  arr.each_pair do |e, s|
    if val < s
      if %w(байт кбайт).include?(e)
        return "#{(val.to_f / (s / 1024)).round(0)} #{e}"
      else
        return "#{(val.to_f / (s / 1024)).round(1)} #{e}"
      end
    end
  end
end

.format_time(time, what, type) ⇒ String

Метод переводит DateTime в строку на русском или иных языках. Предварительно необходимо вызвать StTools.setup(:ru или :en).

Examples:

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

StTools::Setup.setup(:ru)
StTools::Human.format_time(Time.now, :full, :full)       #=> "30 апреля 2015 г. 08:54:34"
StTools::Human.format_time(Time.now, :date, :full)       #=> "30 апреля 2015 г."
StTools::Human.format_time(Time.now, :time, :full)       #=> "08:54:34"
StTools::Human.format_time(Time.now, :full, :short)      #=> "30/04/2015 08:55"
StTools::Human.format_time(Time.now, :date, :short)      #=> "30/04/2015"
StTools::Human.format_time(Time.now, :time, :short)      #=> "08:55"

Parameters:

  • time (DateTime)

    исходные время и дата

  • what (Sym)

    формат возвращаемого результата, принимает одно из следующих значений

  • type (Sym)

    форма в которой возращать результат: длинная (“28 апреля 2015 г. 10:34:52”) или короткая (“28/04/2015 10:34”)

  • :full (Hash)

    a customizable set of options

  • :date (Hash)

    a customizable set of options

  • :time (Hash)

    a customizable set of options

  • :short (Hash)

    a customizable set of options

Returns:

  • (String)

    строка с форматированными датой и временем



127
128
129
130
131
132
133
# File 'lib/st_tools/human.rb', line 127

def self.format_time(time, what, type)
  unless [:full, :date, :time].include?(what)
    warn "WARNING: what ':#{what.to_s}' must be in [:full, :date, :time]. Use ':full' now (at line #{__LINE__} of StTools::#{File.basename(__FILE__)})"
    what = :full
  end
  return I18n.l(time, :format => "#{what.to_s}_#{type.to_s}".to_sym)
end

.human_ago(time, ago = true) ⇒ String

Метод переводит DateTime в строку на русском или иных языках вида “4 дня 23 часа назад”. Предварительно необходимо вызвать StTools.setup(:ru или :en).

Examples:

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

StTools::Setup.setup(:ru)
StTools::Human.human_ago(Time.now - 23, true)       #=> "23 секунды назад"
StTools::Human.human_ago(Time.now - 24553, false)   #=> 6 часов 49 минут"
StTools::Human.human_ago(Time.now)                  #=> "сейчас"

Parameters:

  • time (DateTime)

    время и дата

  • ago (Boolean) (defaults to: true)

    true, если надо добавить слово “назад” в конец строки

Returns:

  • (String)

    строка вида “3 дня 12 часов” или “3 дня 12 часов назад”



74
75
76
77
78
79
80
81
82
83
84
# File 'lib/st_tools/human.rb', line 74

def self.human_ago(time, ago = true)
  now = self.to_time(Time.now.strftime('%Y-%m-%d %H:%M:%S UTC'))
  slf = self.to_time(time.strftime('%Y-%m-%d %H:%M:%S UTC'))
  secs = (now - slf).to_i
  return I18n.t('common.ago.very_long') if time.year < 1800
  return I18n.t('common.ago.just_now') if secs > -1 && secs < 1
  return '' if secs <= -1
  pair = self.ago_in_words_pair(secs)
  pair << I18n.t("common.ago.ago_word") if ago == true
  pair.join(' ')
end

.memoryString

Метод возвращает форматированную строку с объемом памяти, занимаемым текущим процессом (pid).

Returns:

  • (String)

    строка вида “512,4 Мбайт”



58
59
60
61
# File 'lib/st_tools/human.rb', line 58

def self.memory
  val = ::StTools::System.memory
  return self.bytes(val)
end

.number(val) ⇒ String

Метод форматирует число, добавляя суффиксы ‘тыс.’, ‘млн.’ и пр.

Examples:

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

StTools::Human.number(123)           #=> "123"
StTools::Human.number(14563)         #=> "14 тыс."
StTools::Human.number(763552638)     #=> "763.6 млн."

Parameters:

  • val (Integer)

    исходное числовое значение

Returns:

  • (String)

    строка вида “512,4 тыс.”



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/st_tools/human.rb', line 13

def self.number(val)
  # todo: локлаизовать через i18N
  # noinspection RubyStringKeysInHashInspection
  arr = {'' => 1000, 'тыс.' => 1000 * 1000, 'млн.' => 1000 * 1000 * 1000,
         'млрд.' => 1000 * 1000 * 1000 * 1000, 'трлн.' => 1000 * 1000 * 1000 * 1000 * 1000}

  arr.each_pair do |e, s|
    if val < s
      if ['', ' тыс.'].include?(e)
        return "#{(val.to_f / (s / 1000)).round(0)} #{e}"
      else
        return "#{(val.to_f / (s / 1000)).round(1)} #{e}"
      end
    end
  end
end

.seconds_ago(secs, ago = true) ⇒ String

Метод принимает параметр - количество секунд между двумя любыми событиями в секундах, и переводит их в строку на русском или иных языках вида “4 дня 23 часа назад”. Предварительно необходимо вызвать StTools.setup(:ru или :en).

Examples:

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

StTools::Setup.setup(:ru)
StTools::Human.seconds_ago(23, true)       #=> "23 секунды назад"
StTools::Human.seconds_ago(24553, false)   #=> 6 часов 49 минут"
StTools::Human.seconds_ago(0)              #=> "сейчас"

Parameters:

  • sesc (DateTime)

    количество секунд

  • ago (Boolean) (defaults to: true)

    true, если надо добавить слово “назад” в конец строки

Returns:

  • (String)

    строка вида “3 дня 12 часов” или “3 дня 12 часов назад”



98
99
100
101
102
103
104
105
# File 'lib/st_tools/human.rb', line 98

def self.seconds_ago(secs, ago = true)
  secs_i = secs.to_i
  return I18n.t('common.ago.just_now') if secs_i > -1 && secs_i < 1
  return '' if secs_i <= -1
  pair = self.ago_in_words_pair(secs_i)
  pair << I18n.t("common.ago.ago_word") if ago == true
  pair.join(' ')
end

.to_time(time, form = :local) ⇒ Object



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/st_tools/human.rb', line 171

def self.to_time(time, form = :local)
  parts = Date._parse(time, false)
  return if parts.empty?

  now = Time.now
  time = Time.new(
      parts.fetch(:year, now.year),
      parts.fetch(:mon, now.month),
      parts.fetch(:mday, now.day),
      parts.fetch(:hour, 0),
      parts.fetch(:min, 0),
      parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0),
      parts.fetch(:offset, form == :utc ? 0 : nil)
  )

  form == :utc ? time.utc : time.getlocal
end