stamp 0.0.2 → 0.0.3

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.
data/README.md CHANGED
@@ -19,26 +19,33 @@ date = Date.new(2011, 6, 9)
19
19
  date.stamp("March 1, 1999") # "June 9, 2011"
20
20
  date.stamp("Jan 1, 1999") # "Jun 9, 2011"
21
21
  date.stamp("Jan 01") # "Jun 09"
22
- date.stamp("Sunday, May 1, 2000") # "Monday, June 9, 2011"
23
- date.stamp("Sun Aug 5") # "Mon Jun 9"
24
- date.stamp("01/01/99") # "06/09/11"
25
- date.stamp("DOB: 01/01/2000") # "DOB: 06/09/2011"
22
+ date.stamp("Sunday, May 1, 2000") # "Thursday, June 9, 2011"
23
+ date.stamp("Sun Aug 5") # "Thu Jun 9"
24
+ date.stamp("12/31/99") # "06/09/11"
25
+ date.stamp("DOB: 12/31/2000") # "DOB: 06/09/2011"
26
26
  ```
27
27
 
28
28
  ### Features
29
29
 
30
30
  * Abbreviated and full names of months and weekdays are recognized.
31
31
  * Days with or without a leading zero work instinctively.
32
- * You can use whatever month, weekday, day, or year value makes sense in your
33
- examples.
34
32
  * Include any extraneous text you'd like, e.g. "DOB:".
35
33
 
34
+ ### Disambiguation by value
35
+
36
+ You can use any month, weekday, day, or year value that makes sense in your
37
+ examples, and stamp can often infer your intent based on context, but there
38
+ may be times that you need to use unambiguous values to make your intent more
39
+ explicit.
40
+
41
+ For example, "01/09" could refer to January 9, September 1, or
42
+ January 2009. More explicit examples include "12/31", "31/12", and "12/99".
43
+
44
+ Using unambiguous values will also help people who read the code in the
45
+ future understand your intent.
46
+
36
47
  ### Limitations
37
48
 
38
- * "01/09/99" is assumed to be January 9, not September 1. Patches to make this
39
- configurable are welcome. Even better, make it smart enough to disambiguate
40
- given an example like 31/01/99, where 31 is obviously not a month.
41
- * "01-Jan-1999" doesn't work yet (see @wip cucumber scenario). Patches welcome!
42
49
  * Support for time formatting by example is coming soon. Patches welcome!
43
50
 
44
51
  Did I mention? Patches welcome!
@@ -60,6 +67,8 @@ More coming soon, including time formats by example.
60
67
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
61
68
  * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
62
69
  * Fork the project
70
+ * Run `bundle install`
71
+ * Run `rake` to execute the cucumber specs and make sure they all pass
63
72
  * Start a feature/bugfix branch
64
73
  * Commit and push until you are happy with your contribution
65
74
  * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
data/cucumber.yml CHANGED
@@ -1,2 +1,3 @@
1
1
  ---
2
2
  default: --tags ~@wip --strict
3
+ wip: --tags @wip --strict
@@ -4,39 +4,44 @@ Feature: Stamping a date
4
4
  formats a date given a human-readable example.
5
5
 
6
6
  Scenario Outline: Formatting dates by example
7
- Given the date December 9, 2011
7
+ Given the date October 9, 2011
8
8
  When I stamp the example "<example>"
9
9
  Then I produce "<output>"
10
10
  And I like turtles
11
11
 
12
12
  Examples:
13
- | example | output |
14
- | January | December |
15
- | Jan | Dec |
16
- | Jan 1 | Dec 9 |
17
- | Jan 01 | Dec 09 |
18
- | Jan 10 | Dec 09 |
19
- | Jan 1, 1999 | Dec 9, 2011 |
20
- | Sunday | Friday |
21
- | Sun | Fri |
22
- | Sun, Jan 1 | Fri, Dec 9 |
23
- | Sunday, January 1, 1999 | Friday, December 9, 2011 |
24
- | 01/1999 | 12/2011 |
25
- | 01/01 | 12/09 |
26
- | 01/31 | 12/09 |
27
- | 01/01/1999 | 12/09/2011 |
28
- | 01/01/99 | 12/09/11 |
29
- | DOB: 01-31-1999 | DOB: 12-09-2011 |
13
+ | example | output |
14
+ | January | October |
15
+ | Jan | Oct |
16
+ | Jan 1 | Oct 9 |
17
+ | Jan 01 | Oct 09 |
18
+ | Jan 10 | Oct 09 |
19
+ | Jan 1, 1999 | Oct 9, 2011 |
20
+ | Monday | Sunday |
21
+ | Mon | Sun |
22
+ | Tue, Jan 1 | Sun, Oct 9 |
23
+ | Tuesday, January 1, 1999 | Sunday, October 9, 2011 |
24
+ | 01/1999 | 10/2011 |
25
+ | 01/01 | 10/09 |
26
+ | 01/31 | 10/09 |
27
+ | 01/99 | 10/11 |
28
+ | 01/01/1999 | 10/09/2011 |
29
+ | 12/31/99 | 10/09/11 |
30
+ | 31/12 | 09/10 |
31
+ | 31/12/99 | 09/10/11 |
32
+ | 31-Jan-1999 | 09-Oct-2011 |
33
+ | 1999-12-31 | 2011-10-09 |
34
+ | DOB: 12-31-1999 | DOB: 10-09-2011 |
30
35
 
31
36
  @wip
32
37
  Scenario Outline: Examples that aren't supported quite yet
33
- Given the date December 9, 2011
38
+ Given the date October 9, 2011
34
39
  When I stamp the example "<example>"
35
40
  Then I produce "<output>"
36
41
 
37
42
  Examples:
38
- | example | output |
39
- | 01-Jan-1999 | 09-Dec-2011 |
43
+ | example | output |
44
+ | | |
40
45
 
41
46
  Scenario: strftime directives just get passed through
42
47
  Given the date December 21, 2012
data/lib/stamp.rb CHANGED
@@ -23,8 +23,15 @@ module Stamp
23
23
  TWO_DIGIT_REGEXP = /\d{2}/
24
24
  FOUR_DIGIT_REGEXP = /\d{4}/
25
25
 
26
- DATE_DELIMITER_REGEXP = /(\/|\-)/ # forward slash or dash
26
+ # DATE_DELIMITER_REGEXP = /(\/|\-)/ # forward slash or dash
27
27
 
28
+ # OBVIOUS_MINUTES = 32..59
29
+ # OBVIOUS_HOURS
30
+ # OBVIOUS_SECONDS
31
+
32
+ OBVIOUS_YEARS = 60..99
33
+ OBVIOUS_MONTHS = 12
34
+ OBVIOUS_DAYS = 28..31
28
35
 
29
36
  def stamp(example)
30
37
  strftime(strftime_directives(example))
@@ -40,7 +47,6 @@ module Stamp
40
47
  directive = strftime_directive(term, previous_directive)
41
48
  directives << (directive || term)
42
49
 
43
- previous_term = term
44
50
  previous_directive = directive unless directive.nil?
45
51
  end
46
52
 
@@ -66,13 +72,25 @@ module Stamp
66
72
  '%Y'
67
73
 
68
74
  when TWO_DIGIT_REGEXP
69
- case previous_directive
70
- when '%m', '%b', '%B' # a month
71
- '%d' # day with leading zero
72
- when '%d', '%e' # a day
73
- '%y' # two-digit year
75
+ # try to discern obvious intent based on the example value
76
+ case term.to_i
77
+ when OBVIOUS_YEARS
78
+ '%y'
79
+ when OBVIOUS_MONTHS
80
+ '%m'
81
+ when OBVIOUS_DAYS
82
+ '%d'
74
83
  else
75
- '%m' # month
84
+ # the intent isn't obvious based on the example value, so try to
85
+ # disambiguate based on context
86
+ case previous_directive
87
+ when '%m', '%b', '%B' # a month
88
+ '%d' # day with leading zero
89
+ when '%d', '%e' # a day
90
+ '%y' # two-digit year
91
+ else
92
+ '%m' # month
93
+ end
76
94
  end
77
95
 
78
96
  when ONE_DIGIT_REGEXP
data/lib/stamp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Stamp
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jeremy Weiskotten