stamp 0.0.1 → 0.0.2

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/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stamp (0.0.1)
4
+ stamp (0.0.2)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -17,6 +17,7 @@ GEM
17
17
  gherkin (2.4.1)
18
18
  json (>= 1.4.6)
19
19
  json (1.5.3)
20
+ rake (0.9.2)
20
21
  term-ansicolor (1.0.5)
21
22
 
22
23
  PLATFORMS
@@ -24,4 +25,5 @@ PLATFORMS
24
25
 
25
26
  DEPENDENCIES
26
27
  cucumber
28
+ rake
27
29
  stamp!
data/LICENSE.txt ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2011 Jeremy Weiskotten
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # stamp
2
2
 
3
- Format dates and times based on examples, not arcane strftime directives.
3
+ Format dates (and times, soon) based on examples, not arcane strftime directives.
4
4
 
5
5
  [![Build Status](http://travis-ci.org/jeremyw/stamp.png)](http://travis-ci.org/jeremyw/stamp)
6
6
 
@@ -10,13 +10,49 @@ Just `gem install stamp`, or add stamp to your Gemfile and `bundle install`.
10
10
 
11
11
  ## Usage
12
12
 
13
+ Date objects get a powerful new method: #stamp. Provide an example date string
14
+ with whatever month, day, year, and weekday parts you'd like, and your date
15
+ will be formatted accordingly:
16
+
13
17
  ```ruby
14
18
  date = Date.new(2011, 6, 9)
15
- date.stamp("January 1, 1999") # June 6, 2011
16
- date.stamp("Jan 09, 1999") # Jun 06, 2011
17
- date.stamp("Jan 1") # Jun 6
19
+ date.stamp("March 1, 1999") # "June 9, 2011"
20
+ date.stamp("Jan 1, 1999") # "Jun 9, 2011"
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"
18
26
  ```
19
27
 
28
+ ### Features
29
+
30
+ * Abbreviated and full names of months and weekdays are recognized.
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
+ * Include any extraneous text you'd like, e.g. "DOB:".
35
+
36
+ ### Limitations
37
+
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
+ * Support for time formatting by example is coming soon. Patches welcome!
43
+
44
+ Did I mention? Patches welcome!
45
+
46
+ If you need more obscure formatting options, you can include any valid
47
+ [strftime](http://strfti.me) directives in your example string, and they'll
48
+ just be passed along:
49
+
50
+ ```ruby
51
+ date.stamp("Week #%U, %Y") # "Week #23, 2011"
52
+ ````
53
+
54
+ [Check out http://strfti.me](http://strfti.me) for more ideas.
55
+
20
56
  More coming soon, including time formats by example.
21
57
 
22
58
  ## Contributing to stamp
data/cucumber.yml ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ default: --tags ~@wip --strict
@@ -3,18 +3,47 @@ Feature: Stamping a date
3
3
  the stamp method
4
4
  formats a date given a human-readable example.
5
5
 
6
- Scenario Outline: Various examples
6
+ Scenario Outline: Formatting dates by example
7
7
  Given the date December 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
- | pass-through | pass-through |
15
- | January | December |
16
- | Jan | Dec |
17
- | Jan 1 | Dec 9 |
18
- | Jan 01 | Dec 09 |
19
- | Jan 10 | Dec 09 |
20
- | Jan 1, 1999 | Dec 9, 2011 |
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 |
30
+
31
+ @wip
32
+ Scenario Outline: Examples that aren't supported quite yet
33
+ Given the date December 9, 2011
34
+ When I stamp the example "<example>"
35
+ Then I produce "<output>"
36
+
37
+ Examples:
38
+ | example | output |
39
+ | 01-Jan-1999 | 09-Dec-2011 |
40
+
41
+ Scenario: strftime directives just get passed through
42
+ Given the date December 21, 2012
43
+ When I stamp the example "John Cusack was in a movie about %b %d, %Y, but it wasn't very good."
44
+ Then I produce "John Cusack was in a movie about Dec 21, 2012, but it wasn't very good."
45
+
46
+ Scenario: Plain text just gets passed through
47
+ Given the date December 9, 2011
48
+ When I stamp the example "Just some plain old text."
49
+ Then I produce "Just some plain old text."
data/lib/stamp.rb CHANGED
@@ -13,8 +13,18 @@ module Stamp
13
13
  # end
14
14
 
15
15
  module InstanceMethods
16
- MONTHNAMES_REGEXP = /(#{Date::MONTHNAMES.compact.join('|')})/i
16
+
17
+ MONTHNAMES_REGEXP = /(#{Date::MONTHNAMES.compact.join('|')})/i
17
18
  ABBR_MONTHNAMES_REGEXP = /(#{Date::ABBR_MONTHNAMES.compact.join('|')})/i
19
+ DAYNAMES_REGEXP = /(#{Date::DAYNAMES.join('|')})/i
20
+ ABBR_DAYNAMES_REGEXP = /(#{Date::ABBR_DAYNAMES.join('|')})/i
21
+
22
+ ONE_DIGIT_REGEXP = /\d{1}/
23
+ TWO_DIGIT_REGEXP = /\d{2}/
24
+ FOUR_DIGIT_REGEXP = /\d{4}/
25
+
26
+ DATE_DELIMITER_REGEXP = /(\/|\-)/ # forward slash or dash
27
+
18
28
 
19
29
  def stamp(example)
20
30
  strftime(strftime_directives(example))
@@ -22,31 +32,51 @@ module Stamp
22
32
 
23
33
  def strftime_directives(example)
24
34
  directives = []
35
+ previous_directive = nil
36
+
25
37
  terms = example.split(/\b/)
26
38
 
27
39
  terms.each_with_index do |term, index|
28
- previous_term = (index == 0) ? nil : terms[index - 1]
29
- next_term = (index == terms.size-1) ? nil : terms[index + 1]
40
+ directive = strftime_directive(term, previous_directive)
41
+ directives << (directive || term)
30
42
 
31
- directives << (strftime_directive(term, previous_term, next_term) || term)
43
+ previous_term = term
44
+ previous_directive = directive unless directive.nil?
32
45
  end
33
46
 
34
47
  directives.join
35
48
  end
36
49
  private :strftime_directives
37
50
 
38
- def strftime_directive(term, previous_term=nil, next_term=nil)
51
+ def strftime_directive(term, previous_directive=nil)
39
52
  case term
40
53
  when MONTHNAMES_REGEXP
41
54
  '%B'
55
+
42
56
  when ABBR_MONTHNAMES_REGEXP
43
57
  '%b'
44
- when /\d{4}/
58
+
59
+ when DAYNAMES_REGEXP
60
+ '%A'
61
+
62
+ when ABBR_DAYNAMES_REGEXP
63
+ '%a'
64
+
65
+ when FOUR_DIGIT_REGEXP
45
66
  '%Y'
46
- when /\d{2}/
47
- '%d'
48
- when /\d{1}/
49
- '%e'
67
+
68
+ 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
74
+ else
75
+ '%m' # month
76
+ end
77
+
78
+ when ONE_DIGIT_REGEXP
79
+ '%e' # day without leading zero
50
80
  end
51
81
  end
52
82
  private :strftime_directive
data/lib/stamp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Stamp
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/stamp.gemspec CHANGED
@@ -17,4 +17,5 @@ Gem::Specification.new do |s|
17
17
  s.require_paths = ["lib"]
18
18
 
19
19
  s.add_development_dependency "cucumber"
20
+ s.add_development_dependency "rake"
20
21
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jeremy Weiskotten
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-06-29 00:00:00 -04:00
17
+ date: 2011-06-30 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -30,6 +30,19 @@ dependencies:
30
30
  version: "0"
31
31
  type: :development
32
32
  version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
33
46
  description: Format dates and times based on examples, not arcane strftime directives.
34
47
  email:
35
48
  - jeremy@weiskotten.com
@@ -44,8 +57,10 @@ files:
44
57
  - .rvmrc
45
58
  - Gemfile
46
59
  - Gemfile.lock
60
+ - LICENSE.txt
47
61
  - README.md
48
62
  - Rakefile
63
+ - cucumber.yml
49
64
  - features/stamp.feature
50
65
  - features/step_definitions/stamp_steps.rb
51
66
  - features/step_definitions/turtle_steps.rb