st_tools 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +20 -7
- data/lib/modules/integer.rb +18 -1
- data/lib/modules/string.rb +14 -1
- data/lib/modules/time.rb +48 -1
- data/lib/socr/geo.yml +13 -0
- data/lib/st_tools/human.rb +25 -4
- data/lib/st_tools/tokenizer.rb +107 -0
- data/lib/st_tools/version.rb +1 -1
- data/lib/st_tools.rb +1 -0
- data/test/human_lib_spec.rb +18 -4
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4db6237dd025a2faff39e7caf42712420fd75fe8
|
4
|
+
data.tar.gz: a4ce8b4cde0167699f06717f5fc56d840e43050b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cf673e6c075cd4eead80ea445a2a97295ea3671e0292432f9d0711fd10f2fb693ffad4acfa5a5daf596c75fe6175d3dfe5735fae47bed6e4a596564b3a218ea
|
7
|
+
data.tar.gz: fcb305b608f8ef9ebabd66cb42967ef284df590246988b8c3e0e83e9f24264eec4b24dbee67eec0405ce4505cd6a79eeb2932b1de418a11f4985186eb298d57b
|
data/README.md
CHANGED
@@ -70,14 +70,27 @@ StTools.Human.ago_in_words(Time.now - 15, true) # => 15 сек
|
|
70
70
|
|
71
71
|
```ruby
|
72
72
|
StTools::Setup.setup(:en)
|
73
|
-
StTools.Human.
|
74
|
-
StTools.Human.
|
75
|
-
StTools.Human.
|
73
|
+
StTools.Human.human_ago(DateTime.new(2014,12,31), true) # => 4 months 21 days ago
|
74
|
+
StTools.Human.human_ago(DateTime.new(2013,08,01), false) # => 1 year 8 months
|
75
|
+
StTools.Human.human_ago(Time.now - 15, true) # => 15 seconds ago
|
76
76
|
```
|
77
77
|
|
78
78
|
Устанавливая флаг ```ago=true```, метод добавит слово "назад" или "ago" в конце фразы.
|
79
79
|
|
80
|
-
Результирующая фраза всегда состоит из одного показатели (при разнице времени событий меньше минуты)
|
80
|
+
Результирующая фраза всегда состоит из одного показатели (при разнице времени событий меньше минуты)
|
81
|
+
или из двух (минуты/секунды, часы/минуты, дни/часы, месяцы/дни, года/месяцы)
|
82
|
+
|
83
|
+
Иногда возникает другой кейс, когда нужно рассчитать разницу во времени не относительно текущей даты,
|
84
|
+
а относительно любых двух произвольных событий. Для этого может использоваться метод, в который передается
|
85
|
+
не временная метка, а просто количество секунд между двумя событиями.
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
StTools::Setup.setup(:ru)
|
89
|
+
.seconds_ago(DateTime.new(2014,12,31), true) # => 4 months 21 days ago
|
90
|
+
StTools.Human.seconds_ago(DateTime.new(2013,08,01), false) # => 1 year 8 months
|
91
|
+
StTools.Human.seconds_ago(Time.now - 15, true) # => 15 seconds ago
|
92
|
+
```
|
93
|
+
|
81
94
|
|
82
95
|
Вы имеете форматировать дату и время в соответствии с правилами русского и английского языка.
|
83
96
|
|
@@ -107,7 +120,7 @@ StTools.Human.format_time(Time.now, :time, :short) # => 09:45 am
|
|
107
120
|
StTools::Setup.setup(:ru)
|
108
121
|
|
109
122
|
class String
|
110
|
-
|
123
|
+
include StTools::Module::String
|
111
124
|
end
|
112
125
|
|
113
126
|
(Time.now - 15).human_ago # => 15 секунд назад
|
@@ -129,7 +142,7 @@ StTools::String.translit('Жмеринка') # => Zhmerinka
|
|
129
142
|
StTools::String.delat('Соль') # => Соль
|
130
143
|
```
|
131
144
|
|
132
|
-
Перевести строку в верхний или нижний регистр. Используется метод,
|
145
|
+
Перевести строку в верхний или нижний регистр. Используется метод, не использующий :mb_chars
|
133
146
|
|
134
147
|
```ruby
|
135
148
|
StTools::String.downcase('Москва') # => москва
|
@@ -196,7 +209,7 @@ StTools::String.to_range('54, 3-6, 5, 1', uniq: true, sort: true) # => [
|
|
196
209
|
StTools::Setup.setup(:ru)
|
197
210
|
|
198
211
|
class String
|
199
|
-
|
212
|
+
include StTools::Module::String
|
200
213
|
end
|
201
214
|
|
202
215
|
'санКТ-петерБург'.caps # => Санкт-Петербург
|
data/lib/modules/integer.rb
CHANGED
@@ -2,7 +2,7 @@ module StTools
|
|
2
2
|
module Module
|
3
3
|
module Integer
|
4
4
|
|
5
|
-
# Переводит число в строку с размером в
|
5
|
+
# Переводит число в строку с размером в 'тыс.', 'млн.', 'трлн.' и пр.
|
6
6
|
#
|
7
7
|
# @return [String] строка с суффиксом
|
8
8
|
def human_number
|
@@ -19,10 +19,27 @@ module StTools
|
|
19
19
|
# Переводит число в значение boolean (true или false). Любое число false кроме 1 (единицы)
|
20
20
|
#
|
21
21
|
# @return [Boolean] true или false
|
22
|
+
# @example Примеры использования
|
23
|
+
# StTools::String.to_bool("1") #=> true
|
24
|
+
# StTools::String.to_bool("0") #=> false
|
25
|
+
# StTools::String.to_bool("10") #=> false
|
26
|
+
# StTools::String.to_bool("-3") #=> false
|
22
27
|
def to_bool
|
23
28
|
::StTools::String.to_bool(self)
|
24
29
|
end
|
25
30
|
|
31
|
+
# Метод переводит целое число (число секунд) в человеко-удобное время в виде "1 минута 15 секунд назад"
|
32
|
+
#
|
33
|
+
# @return [String] строка с указанием количества секунд в форме "1 минута 15 секунд назад"
|
34
|
+
# @example Примеры использования
|
35
|
+
# StTools::Setup.setup(:ru)
|
36
|
+
# 345.seconds_ago #=> "5 минут 45 секунд назад"
|
37
|
+
# 24553.seconds_ago(false) #=> 6 часов 49 минут"
|
38
|
+
# 7364563738.seconds_ago #=> "233 года 45 месяцев назад"
|
39
|
+
def seconds_ago(ago = true)
|
40
|
+
::StTools::Human.seconds_ago(self, ago)
|
41
|
+
end
|
42
|
+
|
26
43
|
end
|
27
44
|
end
|
28
45
|
end
|
data/lib/modules/string.rb
CHANGED
@@ -63,7 +63,7 @@ module StTools
|
|
63
63
|
# @return [Array] массив чисел
|
64
64
|
# @example Преобразование строки в массив чисел
|
65
65
|
# "Москва , Питер , Владимир".split(",") #=> ['москва', 'питер', 'владимир']
|
66
|
-
def
|
66
|
+
def st_split(separator, opts = {})
|
67
67
|
::StTools::String.split(self, separator, opts)
|
68
68
|
end
|
69
69
|
|
@@ -100,6 +100,19 @@ module StTools
|
|
100
100
|
::StTools::String.to_bool(self)
|
101
101
|
end
|
102
102
|
|
103
|
+
private
|
104
|
+
|
105
|
+
# Удаляем функции downcase, upcase из оригинального класса String
|
106
|
+
# чтобы вместо них вызывались новые функции из модуля StTools::Module::String
|
107
|
+
# Если этого не делать, то всегда будут вызываться соответствующие методы оригинального
|
108
|
+
# класса String
|
109
|
+
def self.included(klass)
|
110
|
+
klass.class_eval do
|
111
|
+
remove_method :downcase
|
112
|
+
remove_method :upcase
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
103
116
|
end
|
104
117
|
end
|
105
118
|
end
|
data/lib/modules/time.rb
CHANGED
@@ -2,20 +2,67 @@ module StTools
|
|
2
2
|
module Module
|
3
3
|
module Time
|
4
4
|
|
5
|
+
# Метод переводит Date в строку на русском или иных языках. Предварительно необходимо вызвать
|
6
|
+
# StTools.setup(:ru или :en).
|
7
|
+
#
|
8
|
+
# @param [Date] time исходная дата
|
9
|
+
# @param [Sym] type форма в которой возращать результат: длинная ("28 апреля 2015 г.") или короткая ("28/04/2015")
|
10
|
+
# @option :full длинна форма
|
11
|
+
# @option :short короткая форма
|
12
|
+
# @return [String] строка с форматированной датой
|
13
|
+
# @example Примеры использования
|
14
|
+
# StTools::Setup.setup(:ru)
|
15
|
+
# Time.now.human_date(:full) #=> "30 апреля 2015 г."
|
16
|
+
# Time.now.human_date(:short) #=> "30/04/2015"
|
5
17
|
def human_date(type = :full)
|
6
18
|
::StTools::Human.format_time(self, :date, type)
|
7
19
|
end
|
8
20
|
|
21
|
+
# Метод переводит Time в строку на русском или иных языках. Предварительно необходимо вызвать
|
22
|
+
# StTools.setup(:ru или :en).
|
23
|
+
#
|
24
|
+
# @param [Time] time исходное время
|
25
|
+
# @param [Sym] type форма в которой возращать результат: длинная ("10:34:52") или короткая ("10:34")
|
26
|
+
# @option :full длинна форма
|
27
|
+
# @option :short короткая форма
|
28
|
+
# @return [String] строка с форматированным временем
|
29
|
+
# @example Примеры использования
|
30
|
+
# StTools::Setup.setup(:ru)
|
31
|
+
# Time.now.human_time(:full) #=> "08:54:34"
|
32
|
+
# Time.now.human_time(:short) #=> "08:55"
|
9
33
|
def human_time(type = :full)
|
10
34
|
::StTools::Human.format_time(self, :time, type)
|
11
35
|
end
|
12
36
|
|
37
|
+
# Метод переводит DateTime в строку на русском или иных языках. Предварительно необходимо вызвать
|
38
|
+
# StTools.setup(:ru или :en).
|
39
|
+
#
|
40
|
+
# @param [DateTime] time исходные время и дата
|
41
|
+
# @param [Sym] type форма в которой возращать результат: длинная ("28 апреля 2015 г. 10:34:52") или короткая ("28/04/2015 10:34")
|
42
|
+
# @option :full длинна форма
|
43
|
+
# @option :short короткая форма
|
44
|
+
# @return [String] строка с форматированными датой и временем
|
45
|
+
# @example Примеры использования
|
46
|
+
# StTools::Setup.setup(:ru)
|
47
|
+
# Time.now.human_datetime(:full) #=> "30 апреля 2015 г. 08:54:34"
|
48
|
+
# Time.now.human_datetime(:short) #=> "30/04/2015 08:55"
|
13
49
|
def human_datetime(type = :full)
|
14
50
|
::StTools::Human.format_time(self, :full, type)
|
15
51
|
end
|
16
52
|
|
53
|
+
# Метод переводит DateTime в строку на русском или иных языках вида "4 дня 23 часа назад".
|
54
|
+
# Предварительно необходимо вызвать StTools.setup(:ru или :en).
|
55
|
+
#
|
56
|
+
# @param [DateTime] time время и дата
|
57
|
+
# @param [Boolean] ago true, если надо добавить слово "назад" в конец строки
|
58
|
+
# @return [String] строка вида "3 дня 12 часов" или "3 дня 12 часов назад"
|
59
|
+
# @example Примеры использования
|
60
|
+
# StTools::Setup.setup(:ru)
|
61
|
+
# (Time.now - 23).human_ago #=> "23 секунды назад"
|
62
|
+
# (Time.now - 24553).human_ago(false) #=> 6 часов 49 минут"
|
63
|
+
# Time.now.human_ago #=> "сейчас"
|
17
64
|
def human_ago(ago = true)
|
18
|
-
::StTools::Human.
|
65
|
+
::StTools::Human.human_ago(self, ago)
|
19
66
|
end
|
20
67
|
|
21
68
|
end
|
data/lib/socr/geo.yml
ADDED
data/lib/st_tools/human.rb
CHANGED
@@ -68,10 +68,10 @@ module StTools
|
|
68
68
|
# @return [String] строка вида "3 дня 12 часов" или "3 дня 12 часов назад"
|
69
69
|
# @example Примеры использования
|
70
70
|
# StTools::Setup.setup(:ru)
|
71
|
-
# StTools::Human.
|
72
|
-
# StTools::Human.
|
73
|
-
# StTools::Human.
|
74
|
-
def self.
|
71
|
+
# StTools::Human.human_ago(Time.now - 23, true) #=> "23 секунды назад"
|
72
|
+
# StTools::Human.human_ago(Time.now - 24553, false) #=> 6 часов 49 минут"
|
73
|
+
# StTools::Human.human_ago(Time.now) #=> "сейчас"
|
74
|
+
def self.human_ago(time, ago = true)
|
75
75
|
now = self.to_time(Time.now.strftime('%Y-%m-%d %H:%M:%S UTC'))
|
76
76
|
slf = self.to_time(time.strftime('%Y-%m-%d %H:%M:%S UTC'))
|
77
77
|
secs = (now - slf).to_i
|
@@ -83,6 +83,27 @@ module StTools
|
|
83
83
|
pair.join(' ')
|
84
84
|
end
|
85
85
|
|
86
|
+
# Метод принимает параметр - количество секунд между двумя любыми событиями в секундах,
|
87
|
+
# и переводит их в строку на русском или иных языках вида "4 дня 23 часа назад".
|
88
|
+
# Предварительно необходимо вызвать StTools.setup(:ru или :en).
|
89
|
+
#
|
90
|
+
# @param [DateTime] sesc количество секунд
|
91
|
+
# @param [Boolean] ago true, если надо добавить слово "назад" в конец строки
|
92
|
+
# @return [String] строка вида "3 дня 12 часов" или "3 дня 12 часов назад"
|
93
|
+
# @example Примеры использования
|
94
|
+
# StTools::Setup.setup(:ru)
|
95
|
+
# StTools::Human.seconds_ago(23, true) #=> "23 секунды назад"
|
96
|
+
# StTools::Human.seconds_ago(24553, false) #=> 6 часов 49 минут"
|
97
|
+
# StTools::Human.seconds_ago(0) #=> "сейчас"
|
98
|
+
def self.seconds_ago(secs, ago = true)
|
99
|
+
secs_i = secs.to_i
|
100
|
+
return I18n.t('common.ago.just_now') if secs_i > -1 && secs_i < 1
|
101
|
+
return '' if secs_i <= -1
|
102
|
+
pair = self.ago_in_words_pair(secs_i)
|
103
|
+
pair << I18n.t("common.ago.ago_word") if ago == true
|
104
|
+
pair.join(' ')
|
105
|
+
end
|
106
|
+
|
86
107
|
# Метод переводит DateTime в строку на русском или иных языках. Предварительно необходимо вызвать
|
87
108
|
# StTools.setup(:ru или :en).
|
88
109
|
#
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module StTools
|
2
|
+
class Tokenizer
|
3
|
+
attr_reader :input, :result
|
4
|
+
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
|
9
|
+
def initialize(opts ={})
|
10
|
+
load_socr(opts[:socr])
|
11
|
+
|
12
|
+
init_class('')
|
13
|
+
end
|
14
|
+
|
15
|
+
def processing(input)
|
16
|
+
init_class(input)
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
def load_socr(socr)
|
24
|
+
if socr.nil?
|
25
|
+
@@socr = nil
|
26
|
+
return nil
|
27
|
+
end
|
28
|
+
|
29
|
+
if socr.class == Symbol
|
30
|
+
dict = ::YAML.load_file(__dir__ + "/../socr/#{socr.to_s.downcase}.yml")
|
31
|
+
else
|
32
|
+
dict = socr
|
33
|
+
end
|
34
|
+
dict = Hash[dict.map { |k, v| [k.to_sym, v] }]
|
35
|
+
|
36
|
+
# Валидация списка сокращений
|
37
|
+
raise "ОШИБКА: словарь сокращений не имеет секции :startend" if dict[:startend].nil?
|
38
|
+
raise "ОШИБКА: словарь сокращений не имеет секции :synonyms" if dict[:synonyms].nil?
|
39
|
+
|
40
|
+
@@socr = dict
|
41
|
+
end
|
42
|
+
|
43
|
+
def socr_part_processing(voc, words)
|
44
|
+
if words[0].nil? == false && words[1].nil?
|
45
|
+
return words.shift
|
46
|
+
end
|
47
|
+
return '' if words[0].nil?
|
48
|
+
|
49
|
+
voc.each do |etalon|
|
50
|
+
if etalon.match(/^#{words[0]}/) && etalon.match(/#{words[1]}$/)
|
51
|
+
words.shift
|
52
|
+
words.shift
|
53
|
+
return etalon
|
54
|
+
end
|
55
|
+
end
|
56
|
+
words.shift
|
57
|
+
end
|
58
|
+
|
59
|
+
def socr_one_processing(word)
|
60
|
+
out = Array.new
|
61
|
+
arr = word.split(/[\-\/]/)
|
62
|
+
voc = @@socr[:startend]
|
63
|
+
|
64
|
+
count = arr.count
|
65
|
+
0.upto(count) do
|
66
|
+
out << socr_part_processing(voc, arr)
|
67
|
+
end
|
68
|
+
|
69
|
+
out.count == 0 ? arr : out
|
70
|
+
end
|
71
|
+
|
72
|
+
def socr_synonyms_processing(word)
|
73
|
+
@@socr[:synonyms][word] || word
|
74
|
+
end
|
75
|
+
|
76
|
+
def socr_processing(arr)
|
77
|
+
if @@socr.nil?
|
78
|
+
arr = arr.join(' ').gsub(/\-/, ' ').split(/\s/)
|
79
|
+
else
|
80
|
+
out = Array.new
|
81
|
+
arr.each do |word|
|
82
|
+
if word.match(/[\-\/]/)
|
83
|
+
out += socr_one_processing(word)
|
84
|
+
else
|
85
|
+
out << socr_synonyms_processing(word)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
arr = out
|
89
|
+
end
|
90
|
+
return arr
|
91
|
+
end
|
92
|
+
|
93
|
+
def init_class(input)
|
94
|
+
@input = input
|
95
|
+
@tokens = Array.new
|
96
|
+
|
97
|
+
tmp = StTools::String.normalize(input).gsub(/\-\s{1,100}/, '-').gsub(/\s{1,100}\-/, '-')
|
98
|
+
.gsub(/\/\s{1,100}/, '/').gsub(/\s{1,100}\//, '/')
|
99
|
+
tmp = tmp.split(/[\s\,\.\_\(\)]/)
|
100
|
+
tmp = socr_processing(tmp)
|
101
|
+
tmp.delete_if { |x| x == '' }
|
102
|
+
|
103
|
+
@result = tmp
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
data/lib/st_tools/version.rb
CHANGED
data/lib/st_tools.rb
CHANGED
data/test/human_lib_spec.rb
CHANGED
@@ -31,20 +31,34 @@ describe 'Проверка методов StTools::Human.*' do
|
|
31
31
|
expect(test).to include('байт')
|
32
32
|
end
|
33
33
|
|
34
|
-
it '.
|
34
|
+
it '.human_ago (:ru)' do
|
35
35
|
::StTools::Setup.setup(:ru)
|
36
|
-
test = ::StTools::Human.
|
36
|
+
test = ::StTools::Human.human_ago(DateTime.new(2001,2,3,4,5,6,'+7'), true)
|
37
37
|
expect(test).to include('назад')
|
38
38
|
expect(test).to include('лет')
|
39
39
|
end
|
40
40
|
|
41
|
-
it '.
|
41
|
+
it '.human_ago (:en)' do
|
42
42
|
::StTools::Setup.setup(:en)
|
43
|
-
test = ::StTools::Human.
|
43
|
+
test = ::StTools::Human.human_ago(DateTime.new(2001,2,3,4,5,6,'+7'), true)
|
44
44
|
expect(test).to include('ago')
|
45
45
|
expect(test).to include('years')
|
46
46
|
end
|
47
47
|
|
48
|
+
it '.seconds_ago (:ru)' do
|
49
|
+
::StTools::Setup.setup(:ru)
|
50
|
+
test = ::StTools::Human.seconds_ago(67, true)
|
51
|
+
expect(test).to include('назад')
|
52
|
+
expect(test).to include('1 минута')
|
53
|
+
end
|
54
|
+
|
55
|
+
it '.seconds_ago (:en)' do
|
56
|
+
::StTools::Setup.setup(:en)
|
57
|
+
test = ::StTools::Human.seconds_ago(67, true)
|
58
|
+
expect(test).to include('ago')
|
59
|
+
expect(test).to include('1 minute')
|
60
|
+
end
|
61
|
+
|
48
62
|
it '.format_time (:ru)' do
|
49
63
|
::StTools::Setup.setup(:ru)
|
50
64
|
test = ::StTools::Human.format_time(Time.now, :full, :full)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: st_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stan Zhuravlev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- lib/modules/integer.rb
|
88
88
|
- lib/modules/string.rb
|
89
89
|
- lib/modules/time.rb
|
90
|
+
- lib/socr/geo.yml
|
90
91
|
- lib/st_tools.rb
|
91
92
|
- lib/st_tools/common.rb
|
92
93
|
- lib/st_tools/fias.rb
|
@@ -94,6 +95,7 @@ files:
|
|
94
95
|
- lib/st_tools/progress_bar.rb
|
95
96
|
- lib/st_tools/string.rb
|
96
97
|
- lib/st_tools/system.rb
|
98
|
+
- lib/st_tools/tokenizer.rb
|
97
99
|
- lib/st_tools/version.rb
|
98
100
|
- test/fias_lib_spec.rb
|
99
101
|
- test/human_lib_spec.rb
|