strftime 1.0.0 → 2.0.0.alpha
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 → README.md} +6 -3
- data/bin/strfd +15 -0
- data/features/possible_options_for_date.feature +47 -0
- data/features/support/env.rb +2 -0
- data/lib/kernel.rb +9 -0
- data/lib/strftime.rb +6 -65
- data/lib/strftime/directive.rb +261 -0
- data/lib/strftime/directive_matchers.rb +7 -0
- data/lib/strftime/instruction_set.rb +46 -0
- data/lib/strftime/version.rb +2 -2
- data/spec/lib/strftime/directive_spec.rb +75 -0
- data/spec/lib/strftime/instruction_set_spec.rb +21 -0
- data/spec/spec_helper.rb +6 -0
- data/strftime.gemspec +14 -10
- metadata +65 -17
data/{README → README.md}
RENAMED
@@ -1,11 +1,14 @@
|
|
1
1
|
# strftime
|
2
2
|
|
3
|
+
It's pronounced "strftime", not "strftime".
|
4
|
+
|
3
5
|
With strftime you'll have descriptions of time format directives at your fingertips in Ruby.
|
4
6
|
|
5
|
-
`Strftime::
|
7
|
+
`Strftime::Directive.all` contains an array of these directive objects
|
8
|
+
holding a key, description and example.
|
6
9
|
|
7
|
-
Just use `Strftime::Directives['%M']` to get a description and example, or use the shorthand method `strfd
|
10
|
+
Just use `Strftime::Directives['%M']` to get a description and example, or use the shorthand method `strfd '%M'`
|
8
11
|
|
9
12
|
Strftime::Directives['%M'].description #=> 'Minute of the hour'
|
10
13
|
|
11
|
-
This might be useful for you, or for users of a system which are able to specify string formats for dates and times.
|
14
|
+
This might be useful for you, or for users of a system which are able to specify string formats for dates and times.
|
data/bin/strfd
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/strftime.rb')
|
5
|
+
|
6
|
+
# If the argument appears like "%y" just output the description
|
7
|
+
# otherwise, find the format for the given date
|
8
|
+
|
9
|
+
given_date = ARGV[0]
|
10
|
+
|
11
|
+
if given_date
|
12
|
+
STDOUT.puts Strftime::InstructionSet.new(given_date).to_s
|
13
|
+
else
|
14
|
+
STDOUT.puts Strftime::Directive.all.sort
|
15
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
Feature: using the command line
|
2
|
+
As a command line user
|
3
|
+
I want to see the time parsing directives for a date
|
4
|
+
so that I may better use and understand time parsing
|
5
|
+
|
6
|
+
Scenario: Displaying all options
|
7
|
+
When I run "strfd"
|
8
|
+
Then the output should contain "%A"
|
9
|
+
And the output should contain "Saturday"
|
10
|
+
And the output should contain "English day of the week"
|
11
|
+
And the exit status should be 0
|
12
|
+
|
13
|
+
Scenario: Displaying complex directives
|
14
|
+
When I run "strfd 'February 18, 2007'"
|
15
|
+
Then the output should contain "%B %d, %Y"
|
16
|
+
And the exit status should be 0
|
17
|
+
|
18
|
+
Scenario: Four digit year directive
|
19
|
+
When I run "strfd '2010'"
|
20
|
+
Then the output should contain "%Y"
|
21
|
+
|
22
|
+
Scenario: Time zone offset directive
|
23
|
+
When I run "strfd '+0000'"
|
24
|
+
Then the output should contain "%z"
|
25
|
+
|
26
|
+
Scenario: Two digit directive
|
27
|
+
When I run "strfd '10'"
|
28
|
+
Then the output should contain "%g"
|
29
|
+
And the output should contain "%S"
|
30
|
+
And the output should contain "%H"
|
31
|
+
And the output should contain "%I"
|
32
|
+
And the output should contain "%U"
|
33
|
+
And the output should contain "%V"
|
34
|
+
And the output should contain "%k"
|
35
|
+
And the output should contain "%W"
|
36
|
+
And the output should contain "%m"
|
37
|
+
And the output should contain "%M"
|
38
|
+
And the output should contain "%C"
|
39
|
+
And the output should contain "%y"
|
40
|
+
And the output should contain "%d"
|
41
|
+
|
42
|
+
Scenario: One digit directive
|
43
|
+
When I run "strfd '3'"
|
44
|
+
Then the output should contain "%e"
|
45
|
+
Then the output should contain "%l"
|
46
|
+
Then the output should contain "%u"
|
47
|
+
Then the output should contain "%w"
|
data/lib/kernel.rb
ADDED
data/lib/strftime.rb
CHANGED
@@ -1,67 +1,8 @@
|
|
1
|
+
require 'date'
|
2
|
+
require File.dirname(__FILE__) + '/strftime/version'
|
3
|
+
require File.dirname(__FILE__) + '/strftime/directive'
|
4
|
+
require File.dirname(__FILE__) + '/strftime/directive_matchers'
|
5
|
+
require File.dirname(__FILE__) + '/strftime/instruction_set'
|
6
|
+
require File.dirname(__FILE__) + '/kernel'
|
1
7
|
module Strftime
|
2
|
-
Directives = Hash.new do |hash, key|
|
3
|
-
mod = ('%' << key.to_s)
|
4
|
-
hash[mod] if hash.keys.include?(mod)
|
5
|
-
end
|
6
|
-
Directives.merge!({
|
7
|
-
'%a' => { :description => 'The abbreviated weekday name', :example => "Sun"},
|
8
|
-
'%A' => { :description => 'The full weekday name', :example => "Sunday"},
|
9
|
-
'%b' => { :description => 'The abbreviated month name', :example => "Jan"},
|
10
|
-
'%B' => { :description => 'The full month name', :example => "January"},
|
11
|
-
'%c' => { :description => 'The preferred local date and time representation'},
|
12
|
-
'%C' => { :description => 'Century (20 in 2009)'},
|
13
|
-
'%d' => { :description => 'Day of the month', :example => "01..31"},
|
14
|
-
'%D' => { :description => 'Date (%m/%d/%y)'},
|
15
|
-
'%e' => { :description => 'Day of the month, blank-padded', :example => "1..31"},
|
16
|
-
'%F' => { :description => 'Equivalent to %Y-%m-%d (the ISO 8601 date format)'},
|
17
|
-
'%h' => { :description => 'Equivalent to %b'},
|
18
|
-
'%H' => { :description => 'Hour of the day, 24-hour clock', :example => "00..23"},
|
19
|
-
'%I' => { :description => 'Hour of the day, 12-hour clock', :example => "01..12)"},
|
20
|
-
'%j' => { :description => 'Day of the year', :example => "001..366"},
|
21
|
-
'%k' => { :description => 'hour, 24-hour clock, blank-padded', :example => "0..23"},
|
22
|
-
'%l' => { :description => 'hour, 12-hour clock, blank-padded', :example => "0..12"},
|
23
|
-
'%L' => { :description => 'Millisecond of the second', :example => "000..999"},
|
24
|
-
'%m' => { :description => 'Month of the year', :example => "01..12"},
|
25
|
-
'%M' => { :description => 'Minute of the hour', :example => "00..59"},
|
26
|
-
'%n' => { :description => 'Newline (\n)'},
|
27
|
-
'%N' => { :description => 'Fractional seconds digits, default is 9 digits (nanosecond)
|
28
|
-
%3N millisecond (3 digits)
|
29
|
-
%6N microsecond (6 digits)
|
30
|
-
%9N nanosecond (9 digits)'},
|
31
|
-
'%p' => { :description => 'Meridian indicator', :example => "(``AM'' or ``PM'')"},
|
32
|
-
'%P' => { :description => 'Meridian indicator', :example => "(``am'' or ``pm'')"},
|
33
|
-
'%r' => { :description => 'time, 12-hour', :example => "same as %I:%M:%S %p"},
|
34
|
-
'%R' => { :description => 'time, 24-hour', :example => "%H:%M"},
|
35
|
-
'%s' => { :description => 'Number of seconds since 1970-01-01 00:00:00 UTC.'},
|
36
|
-
'%S' => { :description => 'Second of the minute', :example => "00..60"},
|
37
|
-
'%t' => { :description => 'Tab character', :example => "\t"},
|
38
|
-
'%T' => { :description => 'time, 24-hour', :example => "%H:%M:%S"},
|
39
|
-
'%u' => { :description => 'Day of the week as a decimal, Monday being 1.', :example => "1..7"},
|
40
|
-
'%U' => { :description => 'Week number of the current year,
|
41
|
-
starting with the first Sunday as the first
|
42
|
-
day of the first week', :example => "00..53"},
|
43
|
-
'%v' => { :description => 'VMS date', :example => "%e-%b-%Y"},
|
44
|
-
'%V' => { :description => 'Week number of year according to ISO 8601', :example => "01..53"},
|
45
|
-
'%W' => { :description => 'Week number of the current year,
|
46
|
-
starting with the first Monday as the first
|
47
|
-
day of the first week', :example => "00..53"},
|
48
|
-
'%w' => { :description => 'Day of the week', :example => "Sunday is 0, 0..6"},
|
49
|
-
'%x' => { :description => 'Preferred representation for the date alone, no time'},
|
50
|
-
'%X' => { :description => 'Preferred representation for the time alone, no date'},
|
51
|
-
'%y' => { :description => 'Year without a century', :example => "00..99"},
|
52
|
-
'%Y' => { :description => 'Year with century'},
|
53
|
-
'%z' => { :description => 'Time zone as hour offset from UTC (e.g. +0900)'},
|
54
|
-
'%Z' => { :description => 'Time zone name'},
|
55
|
-
'%%' => { :description => "Literal ``%'' character"}
|
56
|
-
})
|
57
8
|
end
|
58
|
-
|
59
|
-
class Object
|
60
|
-
def strfd(arg=nil)
|
61
|
-
if arg
|
62
|
-
Strftime::Directives[arg]
|
63
|
-
else
|
64
|
-
Strftime::Directives
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -0,0 +1,261 @@
|
|
1
|
+
module Strftime
|
2
|
+
class Directive
|
3
|
+
attr_accessor :key
|
4
|
+
attr_accessor :description
|
5
|
+
attr_accessor :example
|
6
|
+
attr_accessor :matcher
|
7
|
+
attr_accessor :related
|
8
|
+
|
9
|
+
@all = []
|
10
|
+
|
11
|
+
def initialize(key, options={})
|
12
|
+
self.key = key
|
13
|
+
self.description = options[:description]
|
14
|
+
self.example = options[:example]
|
15
|
+
self.matcher = options[:matcher]
|
16
|
+
self.related = options[:related]
|
17
|
+
self.class.all << self
|
18
|
+
self
|
19
|
+
end
|
20
|
+
def <=>(directive)
|
21
|
+
key <=> directive.key
|
22
|
+
end
|
23
|
+
def to_s
|
24
|
+
%{ #{key} #=> #{example}
|
25
|
+
#{description}}
|
26
|
+
end
|
27
|
+
class << self
|
28
|
+
attr_accessor :all
|
29
|
+
attr_reader :default_collection
|
30
|
+
|
31
|
+
def [](key)
|
32
|
+
all.find{|d| d.key == key}
|
33
|
+
end
|
34
|
+
|
35
|
+
def matching(string)
|
36
|
+
Strftime::Directive.all.select{|d|
|
37
|
+
d.matcher.match(string)
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@default_collection = {
|
42
|
+
'%A' => {:description => %{English day of the week},
|
43
|
+
:example => %{Saturday},
|
44
|
+
:matcher => Regexp.union(Date::DAYNAMES),
|
45
|
+
:related => ['%a']},
|
46
|
+
|
47
|
+
'%a' => {:description => %{Abbreviated English day of the week},
|
48
|
+
:example => %{Sat},
|
49
|
+
:matcher => Regexp.union(Date::ABBR_DAYNAMES),
|
50
|
+
:related => %w{%A %d %e}},
|
51
|
+
|
52
|
+
'%B' => {:description => %{English month of the year},
|
53
|
+
:example => %{December},
|
54
|
+
:matcher => Regexp.union(Date::MONTHNAMES.compact),
|
55
|
+
:related => %w{%b}},
|
56
|
+
|
57
|
+
'%b' => {:description => %{English month of the year},
|
58
|
+
:example => %{Dec},
|
59
|
+
:matcher => Regexp.union(Date::ABBR_MONTHNAMES.compact),
|
60
|
+
:related => %w{%B %v}},
|
61
|
+
|
62
|
+
'%C' => {:description => %{The century part of the year, zero-padded if necessary.},
|
63
|
+
:example => %{20},
|
64
|
+
:matcher => /\A\d\d\Z/,
|
65
|
+
:related => %w{%y %Y}},
|
66
|
+
|
67
|
+
'%c' => {:description => %{This prints the date and time in a way that looks like the default string representation of Time, but without the timezone. Equivalent to '%a %b %e %H:%M:%S %Y'},
|
68
|
+
:example => %{Sat Dec 31 13:22:33 2005},
|
69
|
+
:matcher => "(#{Date::ABBR_DAYNAMES.join('|')}) (#{Date::ABBR_MONTHNAMES.compact.join('|')}) [123]\\d [012]\\d:\\d{2}:\\d{2} \\d{4}",
|
70
|
+
:related => %w{%a %b %e %H %M %S %Y}},
|
71
|
+
|
72
|
+
'%D' => {:description => %{American-style short date format with two-digit year. Equivalent to "%m/%d/%y"},
|
73
|
+
:example => %{12/31/05},
|
74
|
+
:matcher => /[012]\d\/[012]\d\/\d{2}/,
|
75
|
+
:related => %w{%m %d %y %x}},
|
76
|
+
|
77
|
+
'%d' => {:description => %{Day of the month, zero-padded},
|
78
|
+
:example => %{03},
|
79
|
+
:matcher => /[01]\d/,
|
80
|
+
:related => %w{%e}},
|
81
|
+
|
82
|
+
'%e' => {:description => %{Day of the month, not zero-padded},
|
83
|
+
:example => %{3},
|
84
|
+
:matcher => /[123]?\d/,
|
85
|
+
:related => %w{%d %v}},
|
86
|
+
|
87
|
+
'%F' => {:description => %{Short date format with 4-digit year.; equivalent to "%Y-%m-%d"},
|
88
|
+
:example => %{2005-12-31},
|
89
|
+
:matcher => /\d{4}-[01]\d-[0123]\d/,
|
90
|
+
:related => %w{%Y %m %d %D}},
|
91
|
+
|
92
|
+
'%G' => {:description => %{Commercial year with century, zero-padded to a minimum of four digits and with a minus sign prepended for dates BCE. For the calendar year, use %Y)},
|
93
|
+
:example => %{2005},
|
94
|
+
:matcher => /\d{4}/,
|
95
|
+
:related => %w{%g %Y %y}},
|
96
|
+
|
97
|
+
'%g' => {:description => %{Year without century, zero-padded to two digits},
|
98
|
+
:example => %{05},
|
99
|
+
:matcher => /\d{2}/,
|
100
|
+
:related => %w{%G %Y %y}},
|
101
|
+
|
102
|
+
'%H' => {:description => %{Hour of the day, 24-hour clock, zero-padded to two digits},
|
103
|
+
:example => %{13},
|
104
|
+
:matcher => /[012]\d/,
|
105
|
+
:related => %w{%I}},
|
106
|
+
|
107
|
+
'%h' => {:description => %{Abbreviated month of the year; the same as "%b"},
|
108
|
+
:example => %{Dec},
|
109
|
+
:matcher => Regexp.union(Date::ABBR_MONTHNAMES.compact),
|
110
|
+
:related => %w{%b}},
|
111
|
+
|
112
|
+
'%I' => {:description => %{Hour of the day, 12-hour clock, zero-padded to two digits},
|
113
|
+
:example => %{01},
|
114
|
+
:matcher => /[01]\d/,
|
115
|
+
:related => %w{%H %l}},
|
116
|
+
|
117
|
+
'%j' => {:description => %{Julian day of the year, padded to three digits (from 001 to 366)},
|
118
|
+
:example => %{365},
|
119
|
+
:matcher => /\d{3}/,
|
120
|
+
:related => %w{}},
|
121
|
+
|
122
|
+
'%k' => {:description => %{Hour of the day, 24-hour clock, not zero-padded; like %H but with no padding},
|
123
|
+
:example => %{13},
|
124
|
+
:matcher => /\d?\d/,
|
125
|
+
:related => %w{%H}},
|
126
|
+
|
127
|
+
'%l' => {:description => %{Hour of the day, 12-hour clock, not zero-padded; like %I but with no padding},
|
128
|
+
:example => %{1},
|
129
|
+
:matcher => /\d?\d/,
|
130
|
+
:related => %w{%I}},
|
131
|
+
|
132
|
+
'%M' => {:description => %{Minute of the hour, padded to two digits},
|
133
|
+
:example => %{22},
|
134
|
+
:matcher => /\d{2}/,
|
135
|
+
:related => %w{}},
|
136
|
+
|
137
|
+
'%m' => {:description => %{Month of the year, padded to two digits},
|
138
|
+
:example => %{12},
|
139
|
+
:matcher => /\d{2}/,
|
140
|
+
:related => %w{}},
|
141
|
+
|
142
|
+
'%n' => {:description => %{A newline; don't use this; just put a newline in the formatting string},
|
143
|
+
:example => %{\n},
|
144
|
+
:matcher => /.+/m,
|
145
|
+
:related => %w{}},
|
146
|
+
|
147
|
+
'%P' => {:description => %{Lowercase meridian indicator ("am" or "pm")},
|
148
|
+
:example => %{pm},
|
149
|
+
:matcher => /am|pm/,
|
150
|
+
:related => %w{%p}},
|
151
|
+
|
152
|
+
'%p' => {:description => %{Upper meridian indicator. Like %P, except gives "AM" or "PM"; yes, the uppercase P gives the lowercase meridian, and vice versa},
|
153
|
+
:example => %{PM},
|
154
|
+
:matcher => /PM|AM/,
|
155
|
+
:related => %w{%P}},
|
156
|
+
|
157
|
+
'%R' => {:description => %{Short 24-hour time format; equivalent to "%H:%M"},
|
158
|
+
:example => %{13:22},
|
159
|
+
:matcher => /[012]\d:\d{2}/,
|
160
|
+
:related => %w{}},
|
161
|
+
|
162
|
+
'%r' => {:description => %{Long 12-hour time format; equivalent to "%I:%M:%S %p"},
|
163
|
+
:example => %{01:22:33 PM},
|
164
|
+
:matcher => /[01]\d:\d{2}:\d{2} (AM|PM)/,
|
165
|
+
:related => %w{}},
|
166
|
+
|
167
|
+
'%S' => {:description => %{Second of the minute, zero-padded to two digits},
|
168
|
+
:example => %{33},
|
169
|
+
:matcher => /\d{2}/,
|
170
|
+
:related => %w{}},
|
171
|
+
|
172
|
+
'%s' => {:description => %{Seconds since the Unix epoch},
|
173
|
+
:example => %{1136053353},
|
174
|
+
:matcher => /\d+/,
|
175
|
+
:related => %w{}},
|
176
|
+
|
177
|
+
'%T' => {:description => %{Long 24-hour time format; equivalent to "%H:%M:%S"},
|
178
|
+
:example => %{13:22:33},
|
179
|
+
:matcher => /[012]\d:\d{2}:\d{2}/,
|
180
|
+
:related => %w{%X}},
|
181
|
+
|
182
|
+
'%t' => {:description => %{A tab; don't use this; just put a tab in the formatting string},
|
183
|
+
:example => %{\t},
|
184
|
+
:matcher => /\Z\A/,
|
185
|
+
:related => %w{}},
|
186
|
+
|
187
|
+
'%U' => {:description => %{Calendar week number of the year: assumes that the first week of the year starts on the first Sunday; if a date comes before the first Sunday of the year, it's counted as part of "week zero" and "00" is returned},
|
188
|
+
:example => %{52},
|
189
|
+
:matcher => /\d{2}/,
|
190
|
+
:related => %w{}},
|
191
|
+
|
192
|
+
'%u' => {:description => %{Commercial weekday of the year, from 1 to 7, with Monday being day 1},
|
193
|
+
:example => %{6},
|
194
|
+
:matcher => /[1-7]/,
|
195
|
+
:related => %w{}},
|
196
|
+
|
197
|
+
'%V' => {:description => %{Commercial week number of the year},
|
198
|
+
:example => %{52},
|
199
|
+
:matcher => /\d{2}/,
|
200
|
+
:related => %w{%W}},
|
201
|
+
|
202
|
+
'%W' => {:description => %{The same as %V, but if a date is before the first Monday of the year, it's counted as part of "week zero" and "00" is returned},
|
203
|
+
:example => %{52},
|
204
|
+
:matcher => /\d{2}/,
|
205
|
+
:related => %w{%V}},
|
206
|
+
|
207
|
+
'%w' => {:description => %{Calendar day of the week, from 0 to 6, with Sunday being day 0},
|
208
|
+
:example => %{6},
|
209
|
+
:matcher => /\A[0-6]\Z/,
|
210
|
+
:related => %w{}},
|
211
|
+
|
212
|
+
'%X' => {:description => %{Preferred representation for the time; equivalent to "%H:%M:%S"},
|
213
|
+
:example => %{13:22:33},
|
214
|
+
:matcher => /[012]\d:\d{2}:\d{2}/,
|
215
|
+
:related => %w{%H %M %S %T}},
|
216
|
+
|
217
|
+
'%x' => {:description => %{Preferred representation for the date; equivalent to "%m/%d/%y"},
|
218
|
+
:example => %{12/31/05},
|
219
|
+
:matcher => /[012]\d\/[012]\d\/\d{2}/,
|
220
|
+
:related => %w{%m %d %y %D}},
|
221
|
+
|
222
|
+
'%Y' => {:description => %{Year with century, zero-padded to four digits and with a minus sign prepended for dates BCE},
|
223
|
+
:example => %{2005},
|
224
|
+
:matcher => /-?\d{4}/,
|
225
|
+
:related => %w{%y}},
|
226
|
+
|
227
|
+
'%y' => {:description => %{Year without century, zero-padded to two digits},
|
228
|
+
:example => %{05},
|
229
|
+
:matcher => /\A\d{2}\Z/,
|
230
|
+
:related => %w{%Y}},
|
231
|
+
|
232
|
+
'%Z' => {:description => %{The timezone abbreviation (Time) or GMT offset (Date). Date will use "Z" instead of "+0000" if a time is in GMT},
|
233
|
+
:example => %{"GMT" for Time, "Z" for Date},
|
234
|
+
:matcher => Regexp.new(Regexp.union(Date::Format::ZONES.sort_by{|z| z[0].length}.reverse.collect{|f| f[0]}).source,true),
|
235
|
+
:related => %w{%z}},
|
236
|
+
|
237
|
+
'%z' => {:description => %{The timezone as a GMT offset},
|
238
|
+
:example => %{+0000},
|
239
|
+
:matcher => /\A\\+\d{4}\Z/,
|
240
|
+
:related => %w{}},
|
241
|
+
|
242
|
+
'%%' => {:description => %{A literal percent sign},
|
243
|
+
:example => %{%},
|
244
|
+
:matcher => /\A%\Z/,
|
245
|
+
:related => %w{}},
|
246
|
+
|
247
|
+
'%v' => {:description => %{European-style date format with month abbreviation; equivalent to "%e-%b-%Y"},
|
248
|
+
:example => %{31-Dec-2005},
|
249
|
+
:matcher => Regexp.new("[123]?\\d-(#{Date::ABBR_MONTHNAMES.compact.join('|')})-\\d{4}"),
|
250
|
+
:related => %w{%e %b %Y}},
|
251
|
+
|
252
|
+
'%+' => {:description => %{Prints a Dateobject as though it were a Timeobject converted to a string; like %c, but includes the timezone information; equivalent to "%a %b %e %H:%M:%S %Z %Y"},
|
253
|
+
:example => %{Sat Dec 31 13:22:33 Z 2005},
|
254
|
+
:matcher => Regexp.new("#{Regexp.union(Date::ABBR_DAYNAMES)}\ #{Regexp.union(Date::ABBR_MONTHNAMES.compact)}\ [123]?\\d\ [012]\\d:\\d{2}:\\d{2}\ #{Regexp.new(Regexp.union(Date::Format::ZONES.sort_by{|z| z[0].length}.reverse.collect{|f| f[0]}).source,true).source}\\d{4}"),
|
255
|
+
:related => %w{%a %b %e %H %M %S %Z %Y}}
|
256
|
+
}.each do |k,v|
|
257
|
+
Strftime::Directive.new(k, v)
|
258
|
+
end
|
259
|
+
@default_collection = all
|
260
|
+
end
|
261
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Strftime
|
2
|
+
class InstructionSet
|
3
|
+
include Strftime::DirectiveMatchers
|
4
|
+
attr_reader :example
|
5
|
+
attr_writer :example
|
6
|
+
attr_reader :instructions
|
7
|
+
attr_writer :instructions
|
8
|
+
def initialize(given)
|
9
|
+
self.example = given
|
10
|
+
self.instructions = []
|
11
|
+
test_date = given.dup
|
12
|
+
|
13
|
+
# Single replacements
|
14
|
+
test_date.gsub!(MONTHNAMES_REGEXP,'%B')
|
15
|
+
test_date.gsub!(TIMEZONE_OFFSET_REGEXP,'%z')
|
16
|
+
test_date.gsub!(FOUR_DIGIT_YEAR_REGEXP,'%Y')
|
17
|
+
|
18
|
+
# 2 digit options
|
19
|
+
two_digit_directives = Strftime::Directive.all.select{|d|
|
20
|
+
d.example.match(/^\d{2}$/) rescue false
|
21
|
+
}
|
22
|
+
test_date.scan(/\d\d/).each do |found|
|
23
|
+
two_digit_directives.each do |directive|
|
24
|
+
self.instructions << test_date.sub(Regexp.new(found),directive.key)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
one_character_directives = Strftime::Directive.all.select{|d|
|
28
|
+
d.example.match(/^[^%\W]{1}$/) rescue false
|
29
|
+
}
|
30
|
+
test_date.scan(/\d/).each do |found|
|
31
|
+
one_character_directives.each do |directive|
|
32
|
+
self.instructions << test_date.sub(Regexp.new(found),directive.key)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
self.instructions << test_date if self.instructions.empty?
|
36
|
+
|
37
|
+
self.instructions.map!{|i| %{#{i} #=> #{Time.now.strftime(i)}}}
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
content = 'Using the current time as the formatting date:'
|
42
|
+
self.instructions.join('
|
43
|
+
')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/strftime/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module Strftime
|
2
|
-
VERSION = "
|
3
|
-
end
|
2
|
+
VERSION = "2.0.0.alpha"
|
3
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Strftime::Directive do
|
4
|
+
context '.matching' do
|
5
|
+
it 'should return all Directives that match the given string' do
|
6
|
+
Strftime::Directive.all = Strftime::Directive.default_collection
|
7
|
+
debugger
|
8
|
+
Strftime::Directive.matching('+1234').length.should == 1
|
9
|
+
end
|
10
|
+
end
|
11
|
+
context '.initialize' do
|
12
|
+
it 'should require a key' do
|
13
|
+
lambda{ Strftime::Directive.new }.should raise_error
|
14
|
+
end
|
15
|
+
it 'should set the first argument to the key' do
|
16
|
+
d = Strftime::Directive.new('%A')
|
17
|
+
d.key.should == '%A'
|
18
|
+
end
|
19
|
+
it 'should set the description from the given :description' do
|
20
|
+
d = Strftime::Directive.new('%B', :description => 'B directive')
|
21
|
+
d.description.should == 'B directive'
|
22
|
+
end
|
23
|
+
it 'should set the example from the given :example' do
|
24
|
+
d = Strftime::Directive.new('%C', :example => 'some format display')
|
25
|
+
d.example.should == 'some format display'
|
26
|
+
end
|
27
|
+
it "should set the matcher to a regular expression which matches it's replaceable text" do
|
28
|
+
d = Strftime::Directive.new('%D', :matcher => /ZOMG/)
|
29
|
+
d.matcher.should == /ZOMG/
|
30
|
+
end
|
31
|
+
end
|
32
|
+
context '.all=' do
|
33
|
+
it 'should set the collection of Strftime::Directive objects' do
|
34
|
+
Strftime::Directive.all.size.should be > 0
|
35
|
+
Strftime::Directive.all = []
|
36
|
+
Strftime::Directive.all.size.should == 0
|
37
|
+
end
|
38
|
+
end
|
39
|
+
context '.all' do
|
40
|
+
it 'should return a collection of all Strftime::Directive objects' do
|
41
|
+
directives = []
|
42
|
+
Strftime::Directive.all = []
|
43
|
+
directives << Strftime::Directive.new('%ZZ')
|
44
|
+
Strftime::Directive.all.should =~ directives
|
45
|
+
end
|
46
|
+
end
|
47
|
+
context '.default_collection' do
|
48
|
+
it 'should return the standard collection of Strftime::Directive objects' do
|
49
|
+
defaults = Strftime::Directive.default_collection
|
50
|
+
end
|
51
|
+
it 'should not be settable' do
|
52
|
+
lambda{ Strftime::Directive.default_collection = [] }.should raise_error(NoMethodError)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
context '.[]' do
|
56
|
+
it 'should return a Directive with the key of the given argument' do
|
57
|
+
q = Strftime::Directive.new('%q')
|
58
|
+
Strftime::Directive['%q'].should == q
|
59
|
+
end
|
60
|
+
end
|
61
|
+
context '#<=>' do
|
62
|
+
it 'should compare the key to the given directive key' do
|
63
|
+
a = Strftime::Directive.new('%a')
|
64
|
+
b = Strftime::Directive.new('%b')
|
65
|
+
(a <=> b).should == -1
|
66
|
+
end
|
67
|
+
end
|
68
|
+
context '#to_s' do
|
69
|
+
it 'should output formatted contents' do
|
70
|
+
c = Strftime::Directive.new('%c', :description => 'Test sample.', :example => 'output something!')
|
71
|
+
c.to_s.should == ' %c #=> output something!
|
72
|
+
Test sample.'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Strftime::InstructionSet do
|
4
|
+
context '.initialize' do
|
5
|
+
Strftime::Directive.all = Strftime::Directive.default_collection
|
6
|
+
it 'should require an example string' do
|
7
|
+
lambda{ Strftime::InstructionSet.new }.should raise_error
|
8
|
+
end
|
9
|
+
it 'should have a collection of instructions' do
|
10
|
+
Array.should === Strftime::InstructionSet.new('test').instructions
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context '#to_s' do
|
15
|
+
it 'should output all instructions joined by a new line' do
|
16
|
+
test_set = Strftime::InstructionSet.new('January 01')
|
17
|
+
test_set.to_s.should == test_set.instructions.join('
|
18
|
+
')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/strftime.gemspec
CHANGED
@@ -16,18 +16,22 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
|
-
|
19
|
+
|
20
|
+
s.add_development_dependency('rspec', '~> 2.3.0')
|
21
|
+
s.add_development_dependency('aruba', '~> 0.3.2')
|
22
|
+
|
20
23
|
s.post_install_message = %{
|
21
24
|
Thanks for installing strftime. You can use these methods to
|
22
25
|
better understand the formats used in Date and Time strftime
|
23
|
-
|
24
|
-
Strftime::
|
25
|
-
Strftime::
|
26
|
-
|
27
|
-
|
28
|
-
Strftime::
|
29
|
-
|
30
|
-
|
31
|
-
strfd
|
26
|
+
|
27
|
+
Strftime::Directive.all #=> a full array of directives
|
28
|
+
Strftime::Directive['%y'] #=> a Strftime::Directive with
|
29
|
+
# a key of the given argument
|
30
|
+
|
31
|
+
Strftime::Directive.default_collection #=> standard directives
|
32
|
+
# unchanged by your code
|
33
|
+
|
34
|
+
strfd #=> shorthand to get directives
|
35
|
+
strfd('%y') #=> shorthand to get details
|
32
36
|
}
|
33
37
|
end
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: strftime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: -1851332194
|
5
|
+
prerelease: true
|
6
6
|
segments:
|
7
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
9
|
- 0
|
10
|
-
|
10
|
+
- alpha
|
11
|
+
version: 2.0.0.alpha
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- Jim Gay
|
@@ -15,15 +16,46 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date:
|
19
|
+
date: 2011-01-14 00:00:00 -05:00
|
19
20
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: rspec
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 2
|
33
|
+
- 3
|
34
|
+
- 0
|
35
|
+
version: 2.3.0
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: aruba
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 23
|
47
|
+
segments:
|
48
|
+
- 0
|
49
|
+
- 3
|
50
|
+
- 2
|
51
|
+
version: 0.3.2
|
52
|
+
type: :development
|
53
|
+
version_requirements: *id002
|
22
54
|
description: Convenient list of strftime format directives
|
23
55
|
email:
|
24
56
|
- jim@saturnflyer.com
|
25
|
-
executables:
|
26
|
-
|
57
|
+
executables:
|
58
|
+
- strfd
|
27
59
|
extensions: []
|
28
60
|
|
29
61
|
extra_rdoc_files: []
|
@@ -32,16 +64,26 @@ files:
|
|
32
64
|
- .gitignore
|
33
65
|
- Gemfile
|
34
66
|
- LICENSE
|
35
|
-
- README
|
67
|
+
- README.md
|
36
68
|
- Rakefile
|
69
|
+
- bin/strfd
|
70
|
+
- features/possible_options_for_date.feature
|
71
|
+
- features/support/env.rb
|
72
|
+
- lib/kernel.rb
|
37
73
|
- lib/strftime.rb
|
74
|
+
- lib/strftime/directive.rb
|
75
|
+
- lib/strftime/directive_matchers.rb
|
76
|
+
- lib/strftime/instruction_set.rb
|
38
77
|
- lib/strftime/version.rb
|
78
|
+
- spec/lib/strftime/directive_spec.rb
|
79
|
+
- spec/lib/strftime/instruction_set_spec.rb
|
80
|
+
- spec/spec_helper.rb
|
39
81
|
- strftime.gemspec
|
40
82
|
has_rdoc: true
|
41
83
|
homepage: http://rubygems.org/gems/strftime
|
42
84
|
licenses: []
|
43
85
|
|
44
|
-
post_install_message: "\n Thanks for installing strftime. You can use these methods to\n better understand the formats used in Date and Time strftime\n
|
86
|
+
post_install_message: "\n Thanks for installing strftime. You can use these methods to\n better understand the formats used in Date and Time strftime\n\n Strftime::Directive.all #=> a full array of directives\n Strftime::Directive['%y'] #=> a Strftime::Directive with\n # a key of the given argument\n\n Strftime::Directive.default_collection #=> standard directives\n # unchanged by your code\n\n strfd #=> shorthand to get directives\n strfd('%y') #=> shorthand to get details\n "
|
45
87
|
rdoc_options: []
|
46
88
|
|
47
89
|
require_paths:
|
@@ -58,12 +100,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
101
|
none: false
|
60
102
|
requirements:
|
61
|
-
- - "
|
103
|
+
- - ">"
|
62
104
|
- !ruby/object:Gem::Version
|
63
|
-
hash:
|
105
|
+
hash: 25
|
64
106
|
segments:
|
65
|
-
-
|
66
|
-
|
107
|
+
- 1
|
108
|
+
- 3
|
109
|
+
- 1
|
110
|
+
version: 1.3.1
|
67
111
|
requirements: []
|
68
112
|
|
69
113
|
rubyforge_project:
|
@@ -71,5 +115,9 @@ rubygems_version: 1.3.7
|
|
71
115
|
signing_key:
|
72
116
|
specification_version: 3
|
73
117
|
summary: Convenient list of strftime format directives
|
74
|
-
test_files:
|
75
|
-
|
118
|
+
test_files:
|
119
|
+
- features/possible_options_for_date.feature
|
120
|
+
- features/support/env.rb
|
121
|
+
- spec/lib/strftime/directive_spec.rb
|
122
|
+
- spec/lib/strftime/instruction_set_spec.rb
|
123
|
+
- spec/spec_helper.rb
|