wtf 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (8) hide show
  1. data/CHANGELOG +2 -0
  2. data/LICENSE +21 -0
  3. data/README +17 -0
  4. data/Rakefile +48 -0
  5. data/lib/wtf.rb +288 -0
  6. data/test/test_helper.rb +3 -0
  7. data/test/wtf_test.rb +138 -0
  8. metadata +63 -0
@@ -0,0 +1,2 @@
1
+ 0.0.1 (November 29, 2009)
2
+ * Initial release.
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2009 Wyatt M. Greene
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,17 @@
1
+ = World Time Format Converter
2
+
3
+ == Description
4
+
5
+ The WTF gem provides a Ruby class to convert between standard
6
+ time and World Time Format. For more information, visit
7
+ http://www.worldtimeformat.com
8
+
9
+ == Examples
10
+
11
+ WTF::Date.new("FIWIT:NAAAA").as_utc # converts a WTF datetime to a Ruby Time object
12
+ WTF::Date.new(time).as_wtf # converts from a Ruby Time object to a WTF string
13
+ WTF::Date.now.as_wtf # returns a WTF string representing the current datetime
14
+ WTF::Date.now.date_part # returns a WTF string representing the current date
15
+ WTF::Date.now.time_part # returns a WTF string representing the current time
16
+ WTF::Date.convert("FIWIT:NAAAA") # convenience method for converting
17
+ WTF::Date.convert(time) # convenience method for converting
@@ -0,0 +1,48 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test WTF.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.pattern = 'test/**/*_test.rb'
12
+ t.verbose = true
13
+ end
14
+
15
+ desc 'Generate documentation for WTF.'
16
+ Rake::RDocTask.new(:rdoc) do |rdoc|
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = 'WTF'
19
+ rdoc.rdoc_files.include('README')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ begin
24
+ require 'jeweler'
25
+ Jeweler::Tasks.new do |s|
26
+ s.name = "wtf"
27
+ s.version = "0.0.1"
28
+ s.author = "Wyatt Greene"
29
+ s.email = "techiferous@gmail.com"
30
+ s.summary = "Converts between World Time Format and standard dates and times."
31
+ s.description = %Q{
32
+ The WTF gem provides a Ruby class to convert between standard
33
+ time and World Time Format. For more information, visit
34
+ http://www.worldtimeformat.com
35
+ }
36
+ s.require_path = "lib"
37
+ s.files = ["lib/wtf.rb", "LICENSE", "Rakefile", "README",
38
+ "CHANGELOG",
39
+ "test/wtf_test.rb", "test/test_helper.rb"]
40
+ s.homepage = "http://github.com/techiferous/wtf"
41
+ s.requirements << "none"
42
+ s.has_rdoc = true
43
+ s.test_files = Dir.glob("test/**/*.rb")
44
+ end
45
+ Jeweler::GemcutterTasks.new
46
+ rescue LoadError
47
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
48
+ end
@@ -0,0 +1,288 @@
1
+ require 'date'
2
+
3
+ module WTF
4
+ class Date
5
+
6
+ # creates a new WTF::Date object. The argument can be a string representing the
7
+ # date and/or time in World Time Format, or it can be a Time object. If the
8
+ # argument is missing, Time.now is assumed.
9
+ #
10
+ # Examples:
11
+ #
12
+ # WTF::Date.new(":NB") #=> returns a new WTF::Date object for the WTF time :NB
13
+ # WTF::Date.new(":RJA") #=> returns a new WTF::Date object for the WTF date :RJA
14
+ # WTF::Date.new("MM:BRT") #=> returns a new WTF::Date object for the WTF datetime MM:BRT
15
+ # WTF::Date.new #=> returns a new WTF::Date object corresponding to right now
16
+ # WTF::Date.new(Time.utc(2010, 5, 6)) #=> returns a new WTF::Date object for the given Time
17
+ #
18
+ # If the argument is in World Time Format, it must can contain a date part,
19
+ # a time part, and a colon to separate them. Here are some examples of valid formats:
20
+ #
21
+ # - "FJKRM:BROMQ" -- This is a fully specified World Time Format date and
22
+ # time. The first part is the date part and the second part is the time
23
+ # part. The date part cannot be longer than five characters. The time
24
+ # part can be longer than five characters, but any characters after
25
+ # the fifth character are ignored when calculating.
26
+ # - ":BROMQ" -- You can leave out the date part. Today is assumed.
27
+ # - "FJKRM:" -- You can leave out the time part. The beginning of the
28
+ # Julian day is assumed (which is noon).
29
+ # - "BROMQ" -- If you leave out the colon, it is assumed that you are
30
+ # giving the time, not the date.
31
+ # - "RM:BROMQ" -- You can leave out some of the digits for the date. If
32
+ # you do, the remaining digits will be filled in according to today's
33
+ # date. If today's date is FMBAZ, then "RM:BROMQ" becomes
34
+ # "FMBRM:BROMQ".
35
+ # - ":BR" -- You don't have to specify all five of the time digits.
36
+ # - "A:B" -- This is a valid format.
37
+ #
38
+ # Also note:
39
+ #
40
+ # - The date conversion does not work before the Gregorian calendar change
41
+ # that happened in October 1582.
42
+ # - Since the date part is limited to five characters, there is an upper
43
+ # bound for how far into the future you can do a date conversion.
44
+ # - The time part is limited to five characters and therefore the
45
+ # time precision is limited to about 10 milliseconds.
46
+ # - Leap seconds were not taken into account.
47
+ #
48
+ def initialize(time = nil)
49
+ if time
50
+ if time.is_a? String
51
+ @time = convert_from_wtf(time)
52
+ elsif time.is_a? Time
53
+ @time = time
54
+ else
55
+ raise ArgumentError.new("Argument must be a String or a Time.")
56
+ end
57
+ else
58
+ @time = ::Time.now
59
+ end
60
+ @wtf = convert_to_wtf(@time)
61
+ end
62
+
63
+ # now is a synonym for WTF::Date.new. It returns a WTF::Date object initialized with
64
+ # the current date and time.
65
+ #
66
+ def self.now
67
+ self.new
68
+ end
69
+
70
+ # convert is a convenience method to make it easier to convert between WTF
71
+ # times and standard times.
72
+ #
73
+ # Examples:
74
+ #
75
+ # WTF::Date.convert("FIWIT:NAAAA") #=> same as WTF::Date.new("FIWIT:NAAAA").as_utc
76
+ # WTF::Date.convert(time) #=> same as WTF::Date.new(time).as_wtf
77
+ #
78
+ def self.convert(arg)
79
+ return nil if arg.nil?
80
+ return self.new(arg).as_utc if arg.is_a?(String)
81
+ return self.new(arg).as_wtf if arg.is_a?(Time)
82
+ raise ArgumentError.new("Argument must be a String or a Time.")
83
+ end
84
+
85
+ # returns a Time object representing the WTF::Date's date and time in UTC.
86
+ #
87
+ # Examples:
88
+ #
89
+ # standard_time = WTF::Date.new("FIWIT:NAAAA").as_utc
90
+ # standard_time = WTF::Date.new(":BJR").as_utc
91
+ # standard_time = WTF::Date.new("XQ:ARM").as_utc
92
+ #
93
+ def as_utc
94
+ @time
95
+ end
96
+
97
+ # returns a string representing the date and time in World Time Format.
98
+ #
99
+ # Example:
100
+ #
101
+ # wtf_date = WTF::Date.new(Time.utc(2002, 7, 10, 13, 55, 1, 777000))
102
+ # wtf_date.as_wtf #=> "FJNXQ:CCAAA"
103
+ #
104
+ def as_wtf
105
+ @wtf
106
+ end
107
+
108
+ # returns just the World Time Format date.
109
+ #
110
+ # Example:
111
+ #
112
+ # wtf_date = WTF::Date.new(Time.utc(2002, 7, 10, 13, 55, 1, 777000))
113
+ # wtf_date.date_part #=> "FJNXQ"
114
+ #
115
+ def date_part
116
+ @wtf =~ /^([A-Z]{0,5}):([A-Z]*)$/
117
+ $1
118
+ end
119
+
120
+ # returns just the World Time Format time.
121
+ #
122
+ # Example:
123
+ #
124
+ # wtf_date = WTF::Date.new(Time.utc(2002, 7, 10, 13, 55, 1, 777000))
125
+ # wtf_date.time_part #=> "CCAAA"
126
+ #
127
+ def time_part
128
+ @wtf =~ /^([A-Z]{0,5}):([A-Z]*)$/
129
+ $2
130
+ end
131
+
132
+ #--------------------#
133
+ # PRIVATE METHODS #
134
+ #++
135
+
136
+ private
137
+
138
+ SECONDS_IN_A_DAY = 86400
139
+ MILLIS_IN_A_DAY = SECONDS_IN_A_DAY * 1000 # millis means milliseconds
140
+
141
+ def convert_from_wtf(wtf)
142
+
143
+ raise ArgumentError.new("Argument is empty.") if wtf.nil? || wtf.empty?
144
+
145
+ # If no colon is given, we assume we have a time, not a date.
146
+ if !wtf.include?(":")
147
+ wtf = ":" + wtf
148
+ end
149
+
150
+ if wtf !~ /^([A-Z]{0,5}):([A-Z]*)$/
151
+ raise ArgumentError.new("Time format error")
152
+ end
153
+ wtf_date = $1
154
+ wtf_time = $2
155
+
156
+ # we need to fill in ambiguous dates. If today is FJSTR: and the given
157
+ # date is BM:, we fill in the blanks according to today's date
158
+ # like so: FJSBM:
159
+ if wtf_date.length < 5
160
+ reference_date = self.class.now.date_part
161
+ wtf_date = reference_date[0, 5-wtf_date.length] + wtf_date
162
+ end
163
+
164
+ # we don't care about anything more precise than 5 time digits
165
+ if wtf_time.length > 5
166
+ wtf_time = wtf_time[0, 5]
167
+ end
168
+
169
+ julian_date = 0
170
+ # compute integer part of Julian Date
171
+ for i in (0..4) do
172
+ julian_date += (wtf_date[i]-65) * (26**(4-i))
173
+ end
174
+ # compute fractional part of Julian Date
175
+ fractional = 0
176
+ for i in (0..(wtf_time.length-1)) do
177
+ fractional += (wtf_time[i]-65) / (26**(i+1)).to_f
178
+ end
179
+
180
+ # adjust for the astronomical Julian day, which starts at noon
181
+ if fractional >= 0.5
182
+ fractional -= 0.5
183
+ julian_date += 1
184
+ else
185
+ fractional += 0.5
186
+ end
187
+
188
+ date = ::Date.jd(julian_date+fractional)
189
+
190
+ # Normally I love Ruby and how it gets out of my way, but this is
191
+ # absolutely ridiculous. I expect to be able to create a Date object,
192
+ # initialize it with the Julian Day, then simply call to_time.
193
+ # Why Ruby doesn't provide a to_time method, I don't know. So I'm resorting
194
+ # to calling private (!) methods on the Date class. Shame on Ruby
195
+ # and shame on me! :)
196
+ fraction_of_seconds = date.send(:sec_fraction) * SECONDS_IN_A_DAY
197
+ microseconds = fraction_of_seconds * 1000000
198
+ utc_time = ::Time.utc(date.year,
199
+ date.month,
200
+ date.day,
201
+ date.send(:hour),
202
+ date.send(:min),
203
+ date.send(:sec),
204
+ microseconds)
205
+
206
+ utc_time.getlocal
207
+
208
+ end
209
+
210
+ def convert_to_wtf(time)
211
+ utc = time.utc
212
+ date = ::Date.civil(utc.year, utc.month, utc.day)
213
+ julian_day = date.jd.to_i
214
+ # adjust for the astronomical Julian day, which starts at noon
215
+ if utc.hour >= 12
216
+ hour = utc.hour - 12
217
+ else
218
+ hour = utc.hour + 12
219
+ julian_day -= 1
220
+ end
221
+ fractional = hour * 3600 + utc.min * 60 + utc.sec + (utc.usec / 1000000.0)
222
+ date_part = self.class.send(:decimal_to_alphabase, julian_day)
223
+ time_part = self.class.send(:time_to_wtf, fractional*1000)
224
+ date_part + ':' + time_part
225
+ end
226
+
227
+ # Given a number in base 10, return a number in alphabase. Note that
228
+ # alphabase is different than base 26. Base 26 uses digits within the range
229
+ # 0-9,a-p. Alphabase is also based on a radix of 26, but uses digits within
230
+ # the range A-Z.
231
+ #
232
+ # To simplify the algorithm, this function does not accept real numbers as
233
+ # input, only integers.
234
+ #
235
+ def self.decimal_to_alphabase(decimal)
236
+ if (decimal.floor != decimal)
237
+ raise ArgumentError.new("Floats are not supported.")
238
+ end
239
+ alphabase = ""
240
+ base26 = decimal.to_s(26)
241
+ for i in (0..(base26.length-1))
242
+ c = base26[i]
243
+ if (c == 45) # hyphen for negative numbers
244
+ alphabase += "-"
245
+ elsif ((c >= 97) && (c <= 112)) # lower case a-p -> K-Z
246
+ alphabase += (c-22).chr
247
+ elsif ((c >= 48) && (c <= 57)) # number 0-9 -> A-J
248
+ alphabase += (c+17).chr
249
+ else
250
+ raise "Unexpected character."
251
+ end
252
+ end
253
+ alphabase
254
+ end
255
+ private_class_method :decimal_to_alphabase
256
+
257
+ # Given an integer representing the number of milliseconds into the Julian
258
+ # day, return a five-character string representing the time in World Time
259
+ # Format.
260
+ #
261
+ def self.time_to_wtf(millis_into_the_day)
262
+ if (millis_into_the_day < 0)
263
+ raise ArgumentError.new("Negative values are not supported.")
264
+ end
265
+ if (millis_into_the_day >= MILLIS_IN_A_DAY)
266
+ message = "Value (#{millis_into_the_day}) must be smaller than"
267
+ message << " the number of milliseconds in a day (#{MILLIS_IN_A_DAY})."
268
+ raise ArgumentError.new(message)
269
+ end
270
+ result = ""
271
+ # For the first loop iteration, the unit represents the number of
272
+ # milliseconds in an entire day. Then it represents the number of
273
+ # milliseconds in an alphabetic hour, then in an alphabetic minute, all
274
+ # the way down to the number of milliseconds in an alphabetic subsubsecond.
275
+ unit = MILLIS_IN_A_DAY
276
+ remainder = millis_into_the_day # milliseconds left to process
277
+ 5.times do
278
+ unit /= 26.0
279
+ num_units = (remainder.floor / unit).to_i
280
+ remainder -= (num_units * unit)
281
+ result += (num_units.to_i+65).chr
282
+ end
283
+ result
284
+ end
285
+ private_class_method :time_to_wtf
286
+
287
+ end
288
+ end
@@ -0,0 +1,3 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'redgreen'
@@ -0,0 +1,138 @@
1
+ require 'test/test_helper'
2
+ require 'wtf'
3
+
4
+ class WtfTest < Test::Unit::TestCase
5
+
6
+ #--------------------------#
7
+ # Testing private methods. #
8
+ #--------------------------#
9
+
10
+ def test_alphabase_conversion_with_whole_numbers
11
+ assert_equal "A", WTF::Date.send(:decimal_to_alphabase, 0)
12
+ assert_equal "B", WTF::Date.send(:decimal_to_alphabase, 1)
13
+ assert_equal "C", WTF::Date.send(:decimal_to_alphabase, 2)
14
+ assert_equal "J", WTF::Date.send(:decimal_to_alphabase, 9)
15
+ assert_equal "Z", WTF::Date.send(:decimal_to_alphabase, 25)
16
+ assert_equal "BA", WTF::Date.send(:decimal_to_alphabase, 26)
17
+ assert_equal "BB", WTF::Date.send(:decimal_to_alphabase, 27)
18
+ assert_equal "BAA", WTF::Date.send(:decimal_to_alphabase, 676)
19
+ assert_equal "BAB", WTF::Date.send(:decimal_to_alphabase, 677)
20
+ assert_equal "BAC", WTF::Date.send(:decimal_to_alphabase, 678)
21
+ end
22
+
23
+ def test_alphabase_conversion_with_negative_numbers
24
+ assert_equal "-B", WTF::Date.send(:decimal_to_alphabase, -1)
25
+ assert_equal "-C", WTF::Date.send(:decimal_to_alphabase, -2)
26
+ assert_equal "-BB", WTF::Date.send(:decimal_to_alphabase, -27)
27
+ assert_equal "-BAA", WTF::Date.send(:decimal_to_alphabase, -676)
28
+ end
29
+
30
+ def test_alphabase_conversion_with_floats
31
+ assert_raise ArgumentError do
32
+ WTF::Date.send(:decimal_to_alphabase, 7.7)
33
+ end
34
+ end
35
+
36
+ def test_time_to_wtf
37
+ assert_equal "AAAAA", WTF::Date.send(:time_to_wtf, 0) # midnight
38
+ assert_equal "NAAAA", WTF::Date.send(:time_to_wtf, 12*60*60*1000) # noon
39
+ assert_equal "BAAAA", WTF::Date.send(:time_to_wtf, 3323077)
40
+ end
41
+
42
+ #---------------------#
43
+ # Testing public API. #
44
+ #---------------------#
45
+
46
+ def test_converting_to_wtf
47
+
48
+ time = Time.utc(1970, 1, 1, 0)
49
+ wtf = WTF::Date.new(time)
50
+ assert_equal "FIWIT", wtf.date_part
51
+ assert_equal "NAAAA", wtf.time_part
52
+ assert_equal "FIWIT:NAAAA", wtf.as_wtf
53
+
54
+ time = Time.utc(1969, 12, 31, 12)
55
+ wtf = WTF::Date.new(time)
56
+ assert_equal "FIWIT", wtf.date_part
57
+ assert_equal "AAAAA", wtf.time_part
58
+ assert_equal "FIWIT:AAAAA", wtf.as_wtf
59
+
60
+ time = Time.utc(2002, 7, 10, 12)
61
+ wtf = WTF::Date.new(time)
62
+ assert_equal "FJNXQ", wtf.date_part
63
+ assert_equal "AAAAA", wtf.time_part
64
+ assert_equal "FJNXQ:AAAAA", wtf.as_wtf
65
+
66
+ time = Time.utc(2002, 7, 10, 13, 55, 1, 777000)
67
+ wtf = WTF::Date.new(time)
68
+ assert_equal "FJNXQ", wtf.date_part
69
+ assert_equal "CCAAA", wtf.time_part
70
+ assert_equal "FJNXQ:CCAAA", wtf.as_wtf
71
+
72
+ end
73
+
74
+ def test_converting_to_standard_time
75
+ time = Time.utc(1970, 1, 1, 0)
76
+ assert_equal time, WTF::Date.new("FIWIT:NAAAA").as_utc
77
+ assert_equal time, WTF::Date.new("FIWIT:NAAA").as_utc
78
+ assert_equal time, WTF::Date.new("FIWIT:NAA").as_utc
79
+ assert_equal time, WTF::Date.new("FIWIT:NA").as_utc
80
+ assert_equal time, WTF::Date.new("FIWIT:N").as_utc
81
+ time = Time.utc(1969, 12, 31, 12)
82
+ assert_equal time, WTF::Date.new("FIWIT:AAAAA").as_utc
83
+ assert_equal time, WTF::Date.new("FIWIT:AAAA").as_utc
84
+ assert_equal time, WTF::Date.new("FIWIT:AAA").as_utc
85
+ assert_equal time, WTF::Date.new("FIWIT:AA").as_utc
86
+ assert_equal time, WTF::Date.new("FIWIT:A").as_utc
87
+ assert_equal time, WTF::Date.new("FIWIT:").as_utc
88
+ assert_equal time, WTF::Date.new("IWIT:").as_utc
89
+ assert_equal time, WTF::Date.new("IWIT:A").as_utc
90
+ assert_equal time, WTF::Date.new("IWIT:AA").as_utc
91
+ time = Time.utc(2002, 7, 10, 12)
92
+ assert_equal time, WTF::Date.new("FJNXQ:AAAAA").as_utc
93
+ assert_equal time, WTF::Date.new("FJNXQ:").as_utc
94
+ assert_equal time, WTF::Date.new("NXQ:").as_utc
95
+ time = Time.utc(2002, 7, 10, 13, 55, 1, 777000)
96
+ assert_in_delta time.to_f, WTF::Date.new("FJNXQ:CCAAA").as_utc.to_f, 0.006
97
+ assert_in_delta time.to_f, WTF::Date.new("FJNXQ:CC").as_utc.to_f, 0.006
98
+ assert_equal 12, WTF::Date.new(":AA").as_utc.hour
99
+ assert_equal 0, WTF::Date.new(":AA").as_utc.min
100
+ assert_equal 0, WTF::Date.new(":N").as_utc.hour
101
+ assert_equal 0, WTF::Date.new(":N").as_utc.min
102
+ assert_equal 0, WTF::Date.new("N").as_utc.hour
103
+ assert_equal 0, WTF::Date.new("N").as_utc.min
104
+ assert_equal 12, WTF::Date.new(":").as_utc.hour
105
+ assert_equal 0, WTF::Date.new(":").as_utc.min
106
+ assert_raise ArgumentError do
107
+ WTF::Date.new("").as_utc
108
+ end
109
+ assert_raise ArgumentError do
110
+ WTF::Date.new("ABCDEF:ABC").as_utc # date part can't be longer than five characters
111
+ end
112
+ assert_nothing_raised do
113
+ WTF::Date.new("FJCDE:ABCDEFGHIJ").as_utc # time part can be longer than five characters
114
+ end
115
+ end
116
+
117
+ def test_now
118
+ wtf = WTF::Date.now
119
+ wtf2 = WTF::Date.now
120
+ time = wtf.as_utc
121
+ time2 = wtf2.as_utc
122
+ past = Time.utc(2009, 11, 28)
123
+ future = Time.utc(2030, 1, 12)
124
+ assert time <= time2
125
+ assert time < future
126
+ assert time > past
127
+ end
128
+
129
+ def test_convert
130
+ time = Time.utc(1970, 1, 1, 0)
131
+ assert_equal time, WTF::Date.convert("FIWIT:NAAAA")
132
+ assert_equal time, WTF::Date.convert("FIWIT:NAA")
133
+ assert_equal time, WTF::Date.convert("FIWIT:N")
134
+ assert_equal time, WTF::Date.convert("IWIT:N")
135
+ assert_equal "FIWIT:NAAAA", WTF::Date.convert(time)
136
+ end
137
+
138
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wtf
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Wyatt Greene
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-29 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: "\n The WTF gem provides a Ruby class to convert between standard\n time and World Time Format. For more information, visit\n http://www.worldtimeformat.com\n "
17
+ email: techiferous@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - LICENSE
24
+ - README
25
+ files:
26
+ - CHANGELOG
27
+ - LICENSE
28
+ - README
29
+ - Rakefile
30
+ - lib/wtf.rb
31
+ - test/test_helper.rb
32
+ - test/wtf_test.rb
33
+ has_rdoc: true
34
+ homepage: http://github.com/techiferous/wtf
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options:
39
+ - --charset=UTF-8
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ requirements:
55
+ - none
56
+ rubyforge_project:
57
+ rubygems_version: 1.3.5
58
+ signing_key:
59
+ specification_version: 3
60
+ summary: Converts between World Time Format and standard dates and times.
61
+ test_files:
62
+ - test/test_helper.rb
63
+ - test/wtf_test.rb