st_tools 0.3.3 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|