dater 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -11,8 +11,12 @@ spec/reports
11
11
  test/tmp
12
12
  test/version_tmp
13
13
  tmp
14
-
14
+ *.lock
15
+ *.txt
16
+ Rakefile
15
17
  # YARD artifacts
16
18
  .yardoc
17
19
  _yardoc
18
20
  doc/
21
+ test.rb
22
+ Gemfile.lock
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dater (0.3.1)
4
+ dater (0.3.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/Rakefile CHANGED
@@ -1 +1,9 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ task :uninstall do
4
+
5
+ system "gem uninstall dater"
6
+ system "rm -rf pkg"
7
+ system "rake install"
8
+
9
+ end
data/lib/dater/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dater
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
data/lib/dater.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  # encoding: utf-8
2
2
  require 'date'
3
+ require_relative 'translator'
3
4
 
4
5
  module Dater
5
6
 
6
7
  class Resolver
7
8
 
8
- attr_accessor :format, :lang
9
+ attr_accessor :format
9
10
 
10
11
 
11
12
  # Creates a Dater::Resolver object
@@ -16,7 +17,7 @@ module Dater
16
17
  def initialize(format='%Y-%m-%d', lang="en", today_for_nil=false)
17
18
  @today_for_nil=today_for_nil
18
19
  @format=format
19
- @lang=lang if ["en","es","pt"].include? lang
20
+ @translate=Dater::Translator.new(lang)
20
21
  end
21
22
 
22
23
 
@@ -30,7 +31,8 @@ module Dater
30
31
  period = now.strftime(@format) if today_for_nil
31
32
  return period
32
33
  else
33
- @last_date = @date = time_for_period(period)
34
+ translated = @translate.this period
35
+ @last_date = @date = time_for_period(no_special_chars(translated))
34
36
  @date.strftime(@format) if @date.respond_to? :strftime
35
37
  end
36
38
  end
@@ -41,52 +43,12 @@ module Dater
41
43
  self.for(period)
42
44
  end
43
45
 
46
+ def lang= lang
47
+ @translate=Dater::Translator.new(lang)
48
+ end
44
49
 
45
50
  private
46
51
 
47
- PORTUGUESE = {
48
- day:/dia/i,
49
- week:/semana/i,
50
- month:/mes/i,
51
- year:/ano/i,
52
- today:/hoje/,
53
- tomorrow:/amanhã/i,
54
- yesterday:/ontem/i,
55
- in:/em/i,
56
- next:/prox/i,
57
- later:/depois/i,
58
- ago:/atras/i,
59
- before:/antes/i,
60
- monday:/segunda/i,
61
- tuesday:/terca/i,
62
- wednesday:/quarta/i,
63
- thursday:/quinta/i,
64
- friday:/sexta/i,
65
- saturday:/sabado/i,
66
- sunday:/domingo/i
67
- }
68
-
69
- SPANISH = {
70
- day:/dia/i,
71
- week:/semana/i,
72
- month:/mes/i,
73
- year:/año/i,
74
- today:/hoy/i,
75
- tomorrow:/mañana/i,
76
- yesterday:/ayer/i,
77
- in:/en/i,
78
- next:/prox/i,
79
- later:/despues/i,
80
- ago:/atras/i,
81
- before:/antes/i,
82
- monday:/lunes/i,
83
- tuesday:/martes/i,
84
- wednesday:/miercoles/i,
85
- thursday:/jueves/i,
86
- friday:/viernes/i,
87
- saturday:/sabado/i,
88
- sunday:/domingo/i
89
- }
90
52
 
91
53
  TIME_IN_SECONDS = {
92
54
  day: 86400,
@@ -97,79 +59,58 @@ module Dater
97
59
 
98
60
  WEEKDAYS = [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"]
99
61
 
100
- def spanish_translator word
101
- word.split(" ").map do |word|
102
- translate_from_spanish word
103
- end.join(" ")
104
- end
105
62
 
106
- def translate_from_spanish word
107
- SPANISH.each_pair do |k,v|
108
- return k.to_s if word =~ v
109
- end
110
- word
111
- end
112
-
113
- def portuguese_translator word
114
- word.split(" ").map do |word|
115
- translate_from_portuguese word
116
- end.join(" ")
117
- end
118
-
119
- def translate_from_portuguese word
120
- PORTUGUESE.each_pair do |k,v|
121
- return k.to_s if word =~ v
122
- end
123
- word
124
- end
125
63
 
126
64
  # Returns the formatted date according to the given period of time expresed in a literal way
127
65
  #
128
66
  # @param [String] period = time expressed literally (e.g: in 2 days)
129
67
  # @return [String] formatted time
130
- def time_for_period(period=nil)
131
- word = english_for no_special_chars(period)
68
+ def time_for_period(string=nil)
132
69
 
133
- @last_date = case word
134
70
 
135
- when /today/i
71
+ @last_date = case string
72
+
73
+ when /today/,/now/
136
74
  now
137
75
 
138
- when /tomorrow/i
76
+ when /tomorrow/
139
77
  tomorrow_time
140
78
 
141
- when /yesterday/i
79
+ when /yesterday/
142
80
  yesterday_time
143
81
 
144
- when /sunday/i, /monday/i, /tuesday/i, /wednesday/i, /thursday/i, /friday/i, /saturday/i
145
- time_for_weekday(word)
82
+ when /sunday/, /monday/, /tuesday/, /wednesday/, /thursday/, /friday/, /saturday/
83
+ time_for_weekday(string)
146
84
 
147
- when /next/i
148
- now + period_of_time_from_string(word.gsub("next","1"))
85
+ when /next/
86
+ now + period_of_time_from_string(string.gsub("next","1"))
149
87
 
150
- when /last/i
151
- now - period_of_time_from_string(word.gsub("last","1"))
88
+ when /last/
89
+ now - period_of_time_from_string(string.gsub("last","1"))
152
90
 
153
- when /before/i
91
+ when /\d[\sa-zA-Z]+\sbefore/
154
92
  @last_date ||= now
155
- @last_date -= period_of_time_from_string(word)
93
+ @last_date -= period_of_time_from_string(string)
156
94
 
157
- when /ago/i
95
+ when /\d[\sa-zA-Z]+\sago/
158
96
  @last_date ||= now
159
- now - period_of_time_from_string(word)
97
+ now - period_of_time_from_string(string)
160
98
 
161
- when /later/i
99
+ when /\d[\sa-zA-Z]+\slater/
162
100
  @last_date ||= now
163
- @last_date += period_of_time_from_string(word)
164
-
165
- when /in/i
166
- now + period_of_time_from_string(word)
101
+ @last_date += period_of_time_from_string(string)
167
102
 
168
- when /day/i, /month/i, /week/i, /year/i
169
- move_to(word)
103
+ when /in/,/\d\sdays?/, /\d\smonths?/, /\d\sweeks?/, /\d\syears?/
104
+ now + period_of_time_from_string(string)
170
105
 
171
106
  when /\d+.\d+.\d+/
172
- time_from_date(word)
107
+ time_from_date(string)
108
+
109
+ when /rand/,/future/
110
+ now + rand(100_000_000)
111
+
112
+ when /past/
113
+ now - rand(100_000_000)
173
114
  end
174
115
 
175
116
  return @last_date
@@ -189,23 +130,7 @@ module Dater
189
130
  @last_date = Time.now + TIME_IN_SECONDS[:day]
190
131
  end
191
132
 
192
- def english_for(word=nil)
193
- unless word.nil?
194
- word = no_special_chars(word.downcase)
195
- end
196
- case @lang
197
- when /es/,/sp/
198
- spanish_translator word
199
- when /pt/,/port/
200
- portuguese_translator word
201
- else
202
- word
203
- end
204
- end
205
-
206
-
207
133
 
208
-
209
134
  # Returns one week/month/year of difference from today's date. Formatted or not according to formatted param
210
135
  #
211
136
  # @param [String] period = the factor of difference (day, week, month, year) from today's date
@@ -229,17 +154,27 @@ module Dater
229
154
  end
230
155
 
231
156
  def time_for_weekday(word)
232
- day = WEEKDAYS.select{ |day| day if day==word.scan(/[a-zA-Z]+/).last }.join
157
+ day = extract_day_from word
233
158
  @count = Time.now
234
-
235
- # Add one day if today is the same required week day
236
- @count += move_a_day(word) if is_required_day?(@count, day)
237
-
238
- until is_required_day?(@count, day)
159
+ begin
239
160
  @count+= move_a_day(word)
240
- end
161
+ end until is_required_day?(@count, day)
241
162
  @count
163
+ end
242
164
 
165
+ def extract_day_from word
166
+ WEEKDAYS.select{ |day| day if day==word.scan(/[a-zA-Z]+/).last }.join
167
+ end
168
+
169
+ # Method to know if the day is the required day
170
+ #
171
+ # @param [Time] time
172
+ # @param [String] day = to match in case statement
173
+ # @return [Boolean] = true if day is the required day
174
+ def is_required_day?(time, day)
175
+ day_to_ask = "#{day}?"
176
+ result = eval("time.#{day_to_ask}") if time.respond_to? day_to_ask.to_sym
177
+ return result
243
178
  end
244
179
 
245
180
  # Return a day to add or substrac according to the given word
@@ -272,7 +207,7 @@ module Dater
272
207
  # @param [String] period
273
208
  # @return [Fixnum] multiplication factor for a day
274
209
  def day_mult(period)
275
- TIME_IN_SECONDS[:day] if is_day?(english_for period)
210
+ TIME_IN_SECONDS[:day] if is_day? period
276
211
  end
277
212
 
278
213
  # Scans if period has week word
@@ -288,7 +223,7 @@ module Dater
288
223
  # @param [String] period
289
224
  # @return [Fixnum] multiplication factor for a week
290
225
  def week_mult(period)
291
- TIME_IN_SECONDS[:week] if is_week?(english_for period)
226
+ TIME_IN_SECONDS[:week] if is_week? period
292
227
  end
293
228
 
294
229
  # Scans if period has month word
@@ -304,7 +239,7 @@ module Dater
304
239
  # @param [String] period
305
240
  # @return [Fixnum] multiplication factor for a month
306
241
  def month_mult(period)
307
- TIME_IN_SECONDS[:month] if is_month?(english_for period)
242
+ TIME_IN_SECONDS[:month] if is_month? period
308
243
  end
309
244
 
310
245
  # Scans if period string contain year word
@@ -320,42 +255,18 @@ module Dater
320
255
  # @param [String] period = the string to convert to
321
256
  # @return [Fixnum] multiplication factor for a year
322
257
  def year_mult(period)
323
- TIME_IN_SECONDS[:year] if is_year?(english_for period)
258
+ TIME_IN_SECONDS[:year] if is_year? period
324
259
  end
325
260
 
326
261
  # Returns seconds to multiply by for the given string
327
262
  #
328
263
  # @param [String] period = the period of time expressed in a literal way
329
264
  # @return [Fixnum] number to multiply by
330
- def multiply_by(period)
331
- return day_mult(period) || week_mult(period) || month_mult(period) || year_mult(period) || 1
265
+ def multiply_by(string)
266
+ return day_mult(string) || week_mult(string) || month_mult(string) || year_mult(string) || 1
332
267
  end
333
268
 
334
- # Method to know if the day is the required day
335
- #
336
- # @param [Time] time
337
- # @param [String] day = to match in case statement
338
- # @return [Boolean] = true if day is the required day
339
- def is_required_day?(time, day)
340
- case english_for(day).to_s
341
- when /monday/i
342
- time.monday?
343
- when /tuesday/i
344
- time.tuesday?
345
- when /wednesday/i
346
- time.wednesday?
347
- when /thursday/i
348
- time.thursday?
349
- when /friday/i
350
- time.friday?
351
- when /saturday/i
352
- time.saturday?
353
- when /sunday/i
354
- time.sunday?
355
- else
356
- false
357
- end
358
- end
269
+
359
270
 
360
271
  # Return the Time object according to the splitted date in the given array
361
272
  #
@@ -380,7 +291,6 @@ module Dater
380
291
  #
381
292
  #
382
293
  def method_missing(meth)
383
- # if meth.to_s =~ /^(next_|próximo_|proximo_|last_|último_|ultimo_|in_|\d_|for).+$/i
384
294
  self.class.send :define_method, meth do
385
295
  string = meth.to_s.gsub("_"," ")
386
296
  self.for("for('#{string}')")
@@ -393,20 +303,7 @@ module Dater
393
303
  end
394
304
 
395
305
  def no_special_chars(arg)
396
- arg.\
397
- gsub('á', 'a').\
398
- gsub('é', 'e').\
399
- gsub('í', 'i').\
400
- gsub('ó', 'o').\
401
- gsub('ú', 'u').\
402
- gsub('ç', 'c').\
403
- gsub('Á', 'a').\
404
- gsub('É', 'e').\
405
- gsub('Í', 'i').\
406
- gsub('Ó', 'o').\
407
- gsub('Ú', 'u').\
408
- gsub('Ñ', 'n').\
409
- gsub('Ç', 'c')
306
+ arg.gsub(/(á|Á)/, 'a').gsub(/(é|É)/, 'e').gsub(/(í|Í)/, 'i').gsub(/(ó|Ó)/, 'o').gsub(/(ú|Ú)/, 'u').gsub(/(ç|Ç)/, 'c').downcase
410
307
  end
411
308
  end
412
309
  end
data/lib/translator.rb ADDED
@@ -0,0 +1,126 @@
1
+ # encoding: utf-8
2
+
3
+ module Dater
4
+
5
+ class Translator
6
+
7
+ SUPPORTED_LANGUAGES = ["en","es","pt"]
8
+
9
+ PORTUGUESE = {
10
+ day:/dia/,
11
+ week:/semana/,
12
+ month:/mes/,
13
+ year:/ano/,
14
+ today:/hoje/,
15
+ tomorrow:/amanhã/,
16
+ yesterday:/ontem/,
17
+ in:/em/,
18
+ next:/prox/,
19
+ later:/depois/,
20
+ ago:/atras/,
21
+ before:/antes/,
22
+ monday:/segunda/,
23
+ tuesday:/terca/,
24
+ wednesday:/quarta/,
25
+ thursday:/quinta/,
26
+ friday:/sexta/,
27
+ saturday:/sabado/,
28
+ sunday:/domingo/,
29
+ rand:/acaso/,
30
+ futura:/futur/,
31
+ past:/passad/
32
+ }
33
+
34
+ SPANISH = {
35
+ day:/dia/,
36
+ week:/semana/,
37
+ month:/mes/,
38
+ year:/año/,
39
+ today:/hoy/,
40
+ tomorrow:/mañana/,
41
+ yesterday:/ayer/,
42
+ in:/en/,
43
+ next:/prox/,
44
+ later:/despues/,
45
+ ago:/atras/,
46
+ before:/antes/,
47
+ monday:/lunes/,
48
+ tuesday:/martes/,
49
+ wednesday:/miercoles/,
50
+ thursday:/jueves/,
51
+ friday:/viernes/,
52
+ saturday:/sabado/,
53
+ sunday:/domingo/,
54
+ rand:/aleator/,
55
+ future:/futur/,
56
+ past:/pasad/
57
+ }
58
+
59
+ def initialize(lang)
60
+ raise "Languaje #{lang} not supported" unless SUPPORTED_LANGUAGES.include? lang
61
+ @lang = lang
62
+ @dictionary = @lang == "es" ? SPANISH : PORTUGUESE
63
+ end
64
+
65
+ def this word
66
+ return word if @lang=="en"
67
+ mapper word
68
+ end
69
+
70
+ def mapper word
71
+ word.split(" ").map do |word|
72
+ get_english_for word
73
+ end.join(" ")
74
+ end
75
+
76
+ def get_english_for word
77
+ @dictionary.each_pair do |k,v|
78
+ return k.to_s if word =~ v
79
+ end
80
+ word
81
+ end
82
+
83
+
84
+
85
+
86
+ # def english_for(word=nil)
87
+
88
+ # case @lang
89
+ # when "es"
90
+ # spanish_translator word
91
+ # when "pt"
92
+ # portuguese_translator word
93
+ # else
94
+ # word
95
+ # end
96
+ # end
97
+
98
+ # def spanish_translator word
99
+ # word.split(" ").map do |word|
100
+ # translate_from_spanish word
101
+ # end.join(" ")
102
+ # end
103
+
104
+ # def translate_from_spanish word
105
+ # SPANISH.each_pair do |k,v|
106
+ # return k.to_s if word =~ v
107
+ # end
108
+ # word
109
+ # end
110
+
111
+ # def portuguese_translator word
112
+ # word.split(" ").map do |word|
113
+ # translate_from_portuguese word
114
+ # end.join(" ")
115
+ # end
116
+
117
+ # def translate_from_portuguese word
118
+ # PORTUGUESE.each_pair do |k,v|
119
+ # return k.to_s if word =~ v
120
+ # end
121
+ # word
122
+ # end
123
+
124
+
125
+ end
126
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dater
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-02 00:00:00.000000000 Z
12
+ date: 2013-12-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -60,6 +60,7 @@ files:
60
60
  - dater.gemspec
61
61
  - lib/dater.rb
62
62
  - lib/dater/version.rb
63
+ - lib/translator.rb
63
64
  homepage: http://romgrod.github.io/dater/
64
65
  licenses:
65
66
  - MIT
@@ -75,7 +76,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
75
76
  version: '0'
76
77
  segments:
77
78
  - 0
78
- hash: 3507902839117874013
79
+ hash: 3211044642615986663
79
80
  required_rubygems_version: !ruby/object:Gem::Requirement
80
81
  none: false
81
82
  requirements:
@@ -84,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
85
  version: '0'
85
86
  segments:
86
87
  - 0
87
- hash: 3507902839117874013
88
+ hash: 3211044642615986663
88
89
  requirements: []
89
90
  rubyforge_project:
90
91
  rubygems_version: 1.8.25