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 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