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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9636bb4e4a7eca384e243785b78add9c259fee4
4
- data.tar.gz: c336f6ba172b1df7cf029f0ab62704e473e02aef
3
+ metadata.gz: 4db6237dd025a2faff39e7caf42712420fd75fe8
4
+ data.tar.gz: a4ce8b4cde0167699f06717f5fc56d840e43050b
5
5
  SHA512:
6
- metadata.gz: 50aaa34a9388dffdf0bc3459bfbdefa5240ab9e1437af0395871e4967119b1fb1a633d1dd4feccb05c56d060f69265785f70c889f1d179b6e7fd7396dd606180
7
- data.tar.gz: 046ff39698e836e0f6753ccd3e80520c42151b647d0daa6dfa3efc7ffa311e816c809d9c9aa6cc6cfc66d3fc6aec5de62f3b17e7f72de97a1aba6b76cd89263e
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.ago_in_words(DateTime.new(2014,12,31), true) # => 4 months 21 days ago
74
- StTools.Human.ago_in_words(DateTime.new(2013,08,01), false) # => 1 year 8 months
75
- StTools.Human.ago_in_words(Time.now - 15, true) # => 15 seconds ago
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
- extend StTools::Module::String
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
- Перевести строку в верхний или нижний регистр. Используется метод, альтернативный mb_chars (примерно в два раза производительней)
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
- extend StTools::Module::String
212
+ include StTools::Module::String
200
213
  end
201
214
 
202
215
  'санКТ-петерБург'.caps # => Санкт-Петербург
@@ -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
@@ -63,7 +63,7 @@ module StTools
63
63
  # @return [Array] массив чисел
64
64
  # @example Преобразование строки в массив чисел
65
65
  # "Москва , Питер , Владимир".split(",") #=> ['москва', 'питер', 'владимир']
66
- def split(separator, opts = {})
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.ago_in_words(self, ago)
65
+ ::StTools::Human.human_ago(self, ago)
19
66
  end
20
67
 
21
68
  end
data/lib/socr/geo.yml ADDED
@@ -0,0 +1,13 @@
1
+ startend:
2
+ - город
3
+ - район
4
+ - проспект
5
+ - проезд
6
+ - бульвар
7
+ - деревня
8
+ - станция
9
+ - станица
10
+ - санкт-петербург
11
+ synonyms:
12
+ мкрн: 'микрорайон'
13
+ мкр: 'микрорайон'
@@ -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.ago_in_words(Time.now - 23, true) #=> "23 секунды назад"
72
- # StTools::Human.ago_in_words(Time.now - 24553, false) #=> 6 часов 49 минут"
73
- # StTools::Human.ago_in_words(Time.now) #=> "сейчас"
74
- def self.ago_in_words(time, ago = true)
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
@@ -1,3 +1,3 @@
1
1
  module StTools
2
- VERSION = '0.3.3'
2
+ VERSION = '0.3.4'
3
3
  end
data/lib/st_tools.rb CHANGED
@@ -3,6 +3,7 @@ $LOAD_PATH.unshift File.join(__dir__, *%w[.. lib])
3
3
  require "st_tools/version"
4
4
 
5
5
  require 'ruby-progressbar'
6
+ require 'yaml'
6
7
 
7
8
  module StTools
8
9
  require 'st_tools/common'
@@ -31,20 +31,34 @@ describe 'Проверка методов StTools::Human.*' do
31
31
  expect(test).to include('байт')
32
32
  end
33
33
 
34
- it '.ago_in_words (:ru)' do
34
+ it '.human_ago (:ru)' do
35
35
  ::StTools::Setup.setup(:ru)
36
- test = ::StTools::Human.ago_in_words(DateTime.new(2001,2,3,4,5,6,'+7'), true)
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 '.ago_in_words (:en)' do
41
+ it '.human_ago (:en)' do
42
42
  ::StTools::Setup.setup(:en)
43
- test = ::StTools::Human.ago_in_words(DateTime.new(2001,2,3,4,5,6,'+7'), true)
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.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-04-30 00:00:00.000000000 Z
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