natural-date 1.1 → 1.2

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: 681980a99568f3977ab2a0f7925e2a43574a20be
4
- data.tar.gz: 07bc28df9cf1d66ac45af4a4a971676c651029e7
3
+ metadata.gz: 542d489e665790093de2be56251385422e79d4e2
4
+ data.tar.gz: 7ee809b6b7bfad9535bdca731effad0bef68108e
5
5
  SHA512:
6
- metadata.gz: fdd7ed1788c36fb31512244e08190535fe222d1789ce19a7c1fbe2fd18572fdcba75bd1dab01be1d782580a80ae096c124a0856cfa04029f6b3320aa7c18934f
7
- data.tar.gz: d23c7b259592c867df2e2cf44c7b6a689aad23a6c1bb4e2b7f27175d022a25da4b3ecd059f2ad97443ed43774bd59b5cdc13454f0d6ba6489ef71406da3930e8
6
+ metadata.gz: 55711080ed2742f5ed38ecacc94db1a9ef9a45035d0714151146f46dd6e88ca2214d3f77fd40025e647713641e95ced01939ee487223071bb72608f48ca4d06c
7
+ data.tar.gz: f83fbd5aae5cd47e64a3b50ecdaf599de0dc6ee7143b10e33a894d51784351739203579f9a97cfe72f3357cd21aa299358999dc32c6ca486d3546543e29847f4
data/README.md CHANGED
@@ -24,33 +24,93 @@ Or install it yourself as:
24
24
  ```ruby
25
25
  require 'natural-date'
26
26
 
27
- # First you need to create a NaturalDateExpressionFactory with a specific locale. only pt-BR and en is supported by now =(
27
+ # First you need to create a NaturalDateExpressionFactory with a specific locale.
28
+ # Only pt-BR and en is supported by now.
28
29
  factory = NaturalDateExpressionFactory.new(:en)
29
30
 
30
- # then create a natural date expression passing a string expression and a reference date.
31
+ # Then create a natural date expression passing a string expression and a reference date.
31
32
  # In the example below as we set the reference date to 9th of Dezember, 2016 the natural_date is
32
- # going to match only '2017-8-1'
33
+ # going to match only '2017-8-1'.
34
+ # When no reference date is provided the Date.today is going to be used.
33
35
  natural_date = factory.create('1th of august', Date.parse('2016-12-9'))
34
36
 
35
- # Test against a Date
36
- puts natural_date.match(Date.new(2016, 8, 1)) # => {:match=>false, :first_matched_expression=>nil}
37
- puts natural_date.match(Date.new(2017, 8, 1)) # => {:match=>true, :first_matched_expression=>{:day=>[1], :month=>[8], :year=>[2017]}}
37
+ # NaturalDateExpression does not generate Dates (due it can represent a
38
+ # recurrent date expression like 'every monday') instead you need to
39
+ # match a particular date to the expression using the *=~* or *match?*.
40
+ puts natural_date =~ Date.new(2016, 8, 1) # => false
41
+ puts natural_date =~ Date.new(2017, 8, 1) # => true
42
+
43
+ # or using match?
44
+ natural_date.match?(Date.new(2016, 8, 1))
45
+ # => false
46
+ natural_date.match?(Date.new(2017, 8, 1))
47
+ # => true
48
+
49
+ # You can also get some matched dates in a given interval
50
+ natural_date.fetch_dates(Date.today..(Date.today + 5))
51
+ # => array with dates matched inside the interval
52
+
53
+ # If you don't pass any interval a default interval of Date.today..Date.today + 365 will be given
54
+ natural_date.fetch_dates
55
+ # => array with dates matched inside the interval
38
56
  ```
39
57
 
40
- TODO: Write other examples
58
+ ## Types of expressions
41
59
 
42
- ## Development
60
+ You can create lots of different types of expressions, using days months, years and week days, the expression can
61
+ refer both single and recurring dates.
43
62
 
44
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
63
+ - **Days**: Can be written as numbers `1..31` or ordinals like `['1st'..'31st']`.
64
+ - **Months**: Can be written using the whole name `['January'..'December']` or using the first 3 letters `['Jan'..'Dec']`, also they are case insensitive `'JAN' == 'Jan' == 'jAn'` also you can use numbers if you use the 'of' world before `'1 of 12' == '1st December'`.
65
+ - **Years**: You can write the year as usual 4 digits number like `2016` or you can ignore the year, if you ignore it the year is going to be guessed based on the expression and the reference date
66
+ - **Week Days**: As months you can write both whole name and abbreviation (first 3 letters) 'monday' == 'mon'.
45
67
 
46
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
68
+ ```ruby
69
+ factory = NaturalDateExpressionFactory.new(:en)
70
+
71
+ # Day and month
72
+ factory.create('1st of November, 2016')
73
+ # => '1st November 2016'
74
+ factory.create('1 sep 2016')
75
+ # => '1st September 2016'
76
+ factory.create('1 of 1 2016')
77
+ # => '1st September 2016'
78
+ factory.create('1 of July', Date.new(2016, 1, 1)
79
+ # => '1st July 2016' due the reference date is before '1st July, 2016'
80
+ factory.create('1st of Apr', Date.new(2016, 9, 9)
81
+ # => '1st April 2017' due the reference date is after '1st April, 2016'
82
+
83
+ # Multiple days in a month
84
+ factory.create('1 8 and 15 of July, 2016')
85
+ # => ['1st July 2016', '8th July 2016', '15th July 2016']
86
+ factory.create('1st 8 and 15th of September, 2016')
87
+ # => ['1st July 2016', '8th July 2016', '15th July 2016'], not the best consistency but still ok
88
+
89
+ # Single day in multiple months
90
+ factory.create('1 of July and August 2016')
91
+ # => ['1st July 2016', '1st August 2016']
92
+
93
+ # Multiple days and multiple months
94
+ factory.create('1, 7 of May and March 2016')
95
+ # => ['1st May 2016', '7st May 2016', '1st March, 2016', '7st March 2016']
96
+
97
+ # You can also set ranges in both days and months using *till* or *until*
98
+ factory.create('1 till 7 of Jan 2016')
99
+ # => ['1st January 2016'..'7st January 2016']
100
+ factory.create('1 of Jan until April 2016')
101
+ # => ['1st January 2016', '1st January 2016', '1st January 2016', '1st January 2016']
102
+
103
+ # Also you can set week days like 'monday', 'sunday', 'sat'
104
+ factory.create('every monday of January')
105
+ # => every monday of January any year
106
+ factory.create('every monday and friday')
107
+ # => every monday and friday of any month and any year.
108
+ ```
47
109
 
48
110
  ## Contributing
49
111
 
50
112
  Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/natural-date. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
51
113
 
52
-
53
114
  ## License
54
115
 
55
116
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
56
-
@@ -1,5 +1,20 @@
1
1
  class NaturalDateExpression
2
- VERSION = "1.1"
2
+ VERSION = "1.2"
3
+
4
+ class DateMatch
5
+ attr_reader :first_matched_expression, :tested_date, :reference_date
6
+
7
+ def initialize match, first_matched_expression, tested_date, reference_date
8
+ @match = match
9
+ @first_matched_expression = first_matched_expression
10
+ @tested_date = tested_date
11
+ @reference_date = reference_date
12
+ end
13
+
14
+ def matches?
15
+ @match
16
+ end
17
+ end
3
18
 
4
19
  def initialize data, reference_date, expression_string
5
20
  @data = data
@@ -7,6 +22,14 @@ class NaturalDateExpression
7
22
  @expression_string = expression_string
8
23
  end
9
24
 
25
+ def match?
26
+ match(date).matches?
27
+ end
28
+
29
+ def =~ date
30
+ match(date).matches?
31
+ end
32
+
10
33
  def match date
11
34
  matches = @data.map do |expression_map|
12
35
  match_week?(date, expression_map) &&
@@ -16,14 +39,10 @@ class NaturalDateExpression
16
39
  match_year?(date, expression_map)
17
40
  end
18
41
 
19
- first_matched_expression = if matches.any?
20
- @data[matches.each_with_index.find { |exp, index| exp }.last]
21
- else
22
- nil
23
- end
24
-
25
- { match: matches.any?,
26
- first_matched_expression: first_matched_expression }
42
+ DateMatch.new(matches.any?,
43
+ (matches.any?? @data[matches.each_with_index.find { |exp, index| exp }.last] : nil),
44
+ @date,
45
+ @reference_date)
27
46
  end
28
47
 
29
48
  def recurrent?
@@ -35,9 +54,7 @@ class NaturalDateExpression
35
54
  end
36
55
 
37
56
  def fetch_dates dates_range = nil
38
- (dates_range || (Date.today..(Date.today + 365))).to_a.select do |date|
39
- match(date).fetch(:match)
40
- end
57
+ (dates_range || (Date.today..(Date.today + 365))).to_a.select { |date| self =~ date }
41
58
  end
42
59
 
43
60
  private
@@ -6,7 +6,7 @@ class NaturalDateExpressionFactory
6
6
  STEPS = {}
7
7
  EXPRESSION_SPLITTER_STEP = {}
8
8
 
9
- def create expression_string, reference_date
9
+ def create expression_string, reference_date = Date.today
10
10
  NaturalDateExpression.new(create_data_expression(expression_string, reference_date), reference_date, expression_string)
11
11
  end
12
12
 
@@ -17,9 +17,9 @@ keys:
17
17
  fri_5: 'friday fri'
18
18
  sat_6: 'saturday sat'
19
19
  day:
20
- day_1: '1 1th'
21
- day_2: '2 2th'
22
- day_3: '3 3th'
20
+ day_1: '1 1th 1st'
21
+ day_2: '2 2th 2nd'
22
+ day_3: '3 3th 3rd'
23
23
  day_4: '4 4th'
24
24
  day_5: '5 5th'
25
25
  day_6: '6 6th'
@@ -37,9 +37,9 @@ keys:
37
37
  day_18: '18 18th'
38
38
  day_19: '19 19th'
39
39
  day_20: '20 20th'
40
- day_21: '21 21th'
41
- day_22: '22 22th'
42
- day_23: '23 23th'
40
+ day_21: '21 21th 21st'
41
+ day_22: '22 22th 22nd'
42
+ day_23: '23 23th 23rd'
43
43
  day_24: '24 24th'
44
44
  day_25: '25 25th'
45
45
  day_26: '26 26th'
@@ -47,7 +47,7 @@ keys:
47
47
  day_28: '28 28th'
48
48
  day_29: '29 29th'
49
49
  day_30: '30 30th'
50
- day_31: '31 31th'
50
+ day_31: '31 31th 31st'
51
51
  month:
52
52
  jan_1: 'jan janeiro'
53
53
  feb_2: 'feb february'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: natural-date
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.1'
4
+ version: '1.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew S Aguiar
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-09 00:00:00.000000000 Z
11
+ date: 2016-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -110,8 +110,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
110
  version: '0'
111
111
  requirements: []
112
112
  rubyforge_project:
113
- rubygems_version: 2.5.2
113
+ rubygems_version: 2.4.8
114
114
  signing_key:
115
115
  specification_version: 4
116
116
  summary: Converts natural language in date expressions
117
117
  test_files: []
118
+ has_rdoc: