timeframe 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document CHANGED
@@ -1,5 +1,5 @@
1
- README.rdoc
2
- lib/**/*.rb
3
- bin/*
4
- features/**/*.feature
5
- LICENSE
1
+ README.markdown
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore CHANGED
@@ -15,7 +15,8 @@ tmtags
15
15
 
16
16
  ## PROJECT::GENERAL
17
17
  coverage
18
- rdoc
18
+ doc/
19
+ .yardoc/
19
20
  pkg
20
21
 
21
22
  ## PROJECT::SPECIFIC
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
- source "http://rubygems.org"
1
+ source :rubygems
2
2
 
3
- # Specify your gem's dependencies in timeframe.gemspec
4
3
  gemspec
4
+
5
+ # development dependencies
6
+ gem 'yard'
7
+ gem 'minitest'
8
+ gem 'rake'
data/LICENSE CHANGED
@@ -1,20 +1,20 @@
1
- Copyright (c) 2009 Andy Rossmeissl
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ Copyright (c) 2009 Andy Rossmeissl
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,42 @@
1
+ # timeframe
2
+
3
+ A Ruby class for describing and interacting with timeframes.
4
+
5
+ ## Based on ISO 8601
6
+
7
+ As [documented by wikipedia](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals), time intervals are like:
8
+
9
+ 1. Start and end, such as `2007-03-01T13:00:00Z/2008-05-11T15:30:00Z`
10
+ 2. Start and duration, such as `2007-03-01T13:00:00Z/P1Y2M10DT2H30M`
11
+ 3. Duration and end, such as `P1Y2M10DT2H30M/2008-05-11T15:30:00Z`
12
+ 4. Duration only, such as `P1Y2M10DT2H30M`, with additional context information [not supported]
13
+
14
+ or more simply
15
+
16
+ <start>/<end>
17
+ <start>/<duration>
18
+ <duration>/<end>
19
+ <duration> [not supported]
20
+
21
+ ## Precision
22
+
23
+ Currently the end result is precise to 1 day, so these are the same:
24
+
25
+ * `2007-03-01T00:00:00Z/2008-05-11T00:00:00Z`
26
+ * `2007-03-01/2008-05-11`
27
+
28
+ This may change in the future.
29
+
30
+ ## Documentation
31
+
32
+ http://rdoc.info/projects/rossmeissl/timeframe
33
+
34
+ ## Acknowledgements
35
+
36
+ The good parts of Timeframe all came from the gentlemen at Fingertips[http://fngtps.com].
37
+
38
+ Thanks to @artemk for https://github.com/rossmeissl/timeframe/pull/5
39
+
40
+ ## Copyright
41
+
42
+ Copyright (c) 2012 Andy Rossmeissl, Seamus Abshere
data/Rakefile CHANGED
@@ -1,8 +1,3 @@
1
- # must be included before rubygems or bundler
2
- if ENV['TIMEFRAME_HOME_RUN'] == 'true'
3
- require 'home_run'
4
- end
5
-
6
1
  require 'bundler'
7
2
  Bundler::GemHelper.install_tasks
8
3
 
@@ -17,10 +12,5 @@ end
17
12
 
18
13
  task :default => :test
19
14
 
20
- require 'rdoc/task'
21
- RDoc::Task.new do |rdoc|
22
- rdoc.rdoc_dir = 'rdoc'
23
- rdoc.title = "timeframe"
24
- rdoc.rdoc_files.include('README*')
25
- rdoc.rdoc_files.include('lib/**/*.rb')
26
- end
15
+ require 'yard'
16
+ YARD::Rake::YardocTask.new
@@ -3,6 +3,8 @@ require 'multi_json'
3
3
  require 'active_support/version'
4
4
  require 'active_support/core_ext' if ActiveSupport::VERSION::MAJOR >= 3
5
5
 
6
+ require 'timeframe/iso_8601'
7
+
6
8
  # Encapsulates a timeframe between two dates. The dates provided to the class are always until the last date. That means
7
9
  # that the last date is excluded.
8
10
  #
@@ -43,8 +45,14 @@ class Timeframe
43
45
  # Construct a new Timeframe by parsing an ISO 8601 time interval string
44
46
  # http://en.wikipedia.org/wiki/ISO_8601#Time_intervals
45
47
  def from_iso8601(str)
46
- raise ArgumentError, 'Intervals should be specified according to ISO 8601, method 1, eliding times' unless str =~ /^\d\d\d\d-\d\d-\d\d\/\d\d\d\d-\d\d-\d\d$/
47
- new *str.split('/')
48
+ delimiter = str.include?('/') ? '/' : '--'
49
+ a_raw, b_raw = str.split delimiter
50
+ if a_raw.blank? or b_raw.blank?
51
+ raise ArgumentError, "Interval must be specified according to ISO 8601 <start>/<end>, <start>/<duration>, or <duration>/<end>."
52
+ end
53
+ a = Iso8601::A.new a_raw
54
+ b = Iso8601::B.new b_raw
55
+ new a.to_time(b), b.to_time(a)
48
56
  end
49
57
 
50
58
  # Construct a new Timeframe from a hash with keys startDate and endDate
@@ -68,14 +76,14 @@ class Timeframe
68
76
  when ::String
69
77
  str = input.strip
70
78
  if str.start_with?('{')
71
- from_hash ::MultiJson.decode(str)
79
+ from_hash MultiJson.decode(str)
72
80
  elsif input =~ /\A\d\d\d\d\z/
73
81
  from_year input
74
82
  else
75
83
  from_iso8601 str
76
84
  end
77
85
  else
78
- raise ::ArgumentError, "Must be String or Hash"
86
+ raise ArgumentError, "Must be String or Hash"
79
87
  end
80
88
  end
81
89
  alias :interval :parse
@@ -256,7 +264,7 @@ class Timeframe
256
264
  b = timeframes.collect(&:start_date) + [ end_date ]
257
265
 
258
266
  a.zip(b).map do |gap|
259
- Timeframe.new(*gap, :skip_year_boundary_crossing_check => true) if gap[1] > gap[0]
267
+ Timeframe.new(*gap) if gap[1] > gap[0]
260
268
  end.compact
261
269
  end
262
270
 
@@ -284,7 +292,27 @@ class Timeframe
284
292
  end
285
293
  alias :to_s :iso8601
286
294
  alias :to_param :iso8601
287
-
295
+
296
+ def dates
297
+ dates = []
298
+ cursor = start_date
299
+ while cursor < end_date
300
+ dates << cursor
301
+ cursor = cursor.succ
302
+ end
303
+ dates
304
+ end
305
+
306
+ def first_days_of_months
307
+ dates = []
308
+ cursor = start_date.beginning_of_month
309
+ while cursor < end_date
310
+ dates << cursor
311
+ cursor = cursor >> 1
312
+ end
313
+ dates
314
+ end
315
+
288
316
  # Deprecated
289
317
  def from # :nodoc:
290
318
  @start_date
@@ -0,0 +1,93 @@
1
+ class Timeframe
2
+ module Iso8601
3
+ # Internal use.
4
+ #
5
+ # Parses a duration like 'P1Y2M4DT3H4M2S'
6
+ class Duration < ::Struct.new(:date_part, :time_part)
7
+ def seconds
8
+ (y*31_556_926 + m*2_629_743.83 + d*86_400 + h*3_600 + minutes*60 + s).ceil
9
+ end
10
+ private
11
+ def y; @y ||= parse(date_part, :Y); end
12
+ def m; @m ||= parse(date_part, :M); end
13
+ def d; @d ||= parse(date_part, :D); end
14
+ def h; @h ||= parse(time_part, :H); end
15
+ def minutes; @minutes ||= parse(time_part, :M); end
16
+ def s; @s ||= parse(time_part, :S); end
17
+ def parse(part, indicator)
18
+ if part =~ /(\d+)#{indicator.to_s}/
19
+ $1.to_f
20
+ else
21
+ 0
22
+ end
23
+ end
24
+ end
25
+
26
+ # Internal use.
27
+ class Side
28
+ # We add one day because so that it can be excluded per timeframe's conventions.
29
+ EXCLUDED_LAST_DAY = 86_400
30
+ attr_reader :date_part, :time_part
31
+ def to_time(counterpart)
32
+ if date_part.start_with?('P')
33
+ counterpart.resolve_time(self) + resolve_offset + EXCLUDED_LAST_DAY
34
+ else
35
+ resolve_time counterpart
36
+ end
37
+ end
38
+ end
39
+
40
+ # Internal use.
41
+ #
42
+ # The "A" side of "A/B"
43
+ class A < Side
44
+ def initialize(raw)
45
+ raw = raw.upcase
46
+ @date_part, @time_part = raw.split('T')
47
+ @time_part ||= ''
48
+ end
49
+ def resolve_time(*)
50
+ Time.parse [date_part, time_part].join('T')
51
+ end
52
+ # When A is a period, it counts as a negative offset to B.
53
+ def resolve_offset
54
+ 0.0 - Duration.new(date_part, time_part).seconds
55
+ end
56
+ end
57
+
58
+ # Internal use.
59
+ #
60
+ # The "B" side of "A/B"
61
+ class B < Side
62
+ def initialize(raw)
63
+ raw = raw.upcase
64
+ if raw.include?(':') and not raw.include?('T')
65
+ # it's just a shorthand for time
66
+ @date_part = ''
67
+ @time_part = raw
68
+ else
69
+ @date_part, @time_part = raw.split('T')
70
+ @time_part ||= ''
71
+ end
72
+ end
73
+ # When shorthand is used, we need to peek at our counterpart (A) in order to steal letters
74
+ # Shorthand can only be used on the B side, and only in <start>/<end> format.
75
+ def resolve_time(counterpart)
76
+ filled_in_date_part = unless date_part.count('-') == 2
77
+ counterpart.date_part[0..(0-date_part.length-1)] + date_part
78
+ else
79
+ date_part
80
+ end
81
+ filled_in_time_part = if time_part.count(':') < 2
82
+ counterpart.time_part[0..(0-time_part.length-1)] + time_part
83
+ else
84
+ time_part
85
+ end
86
+ Time.parse [filled_in_date_part, filled_in_time_part].join('T')
87
+ end
88
+ def resolve_offset
89
+ Duration.new(date_part, time_part).seconds
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,3 +1,3 @@
1
1
  class Timeframe
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -59,7 +59,7 @@ describe Timeframe do
59
59
  end
60
60
  end
61
61
 
62
- describe '.constrained_new' do
62
+ describe :constrained_new do
63
63
  let(:start) { Date.parse('2008-02-14') }
64
64
  let(:finish) { Date.parse('2008-05-10') }
65
65
  let(:constraint_start) { Date.parse('2008-01-01') }
@@ -108,7 +108,7 @@ describe Timeframe do
108
108
  end
109
109
  end
110
110
 
111
- describe '.this_year' do
111
+ describe :this_year do
112
112
  it "should return the current year" do
113
113
  Timeframe.this_year.must_equal Timeframe.new(:year => Time.now.year)
114
114
  end
@@ -190,7 +190,7 @@ describe Timeframe do
190
190
 
191
191
  describe '#/' do
192
192
  it "should return a fraction of another timeframe" do
193
- (Timeframe.new(:month => 4, :year => 2009) / Timeframe.new(:year => 2009)).must_equal (30.0 / 365.0)
193
+ (Timeframe.new(:month => 4, :year => 2009) / Timeframe.new(:year => 2009)).must_equal(30.0 / 365.0)
194
194
  end
195
195
  end
196
196
 
@@ -224,10 +224,50 @@ describe Timeframe do
224
224
  end
225
225
  end
226
226
 
227
- describe '.parse' do
228
- it 'understands ISO8601' do
229
- Timeframe.parse('2009-01-01/2010-01-01').must_equal Timeframe.new(:year => 2009)
227
+ describe :parse do
228
+ describe 'ISO 8601 <start>/<end>' do
229
+ it 'works without time' do
230
+ Timeframe.parse('2007-03-01/2008-05-11').must_equal Timeframe.new(Date.new(2007, 3, 1), Date.new(2008, 5, 11))
231
+ Timeframe.parse('2007-03-01--2008-05-11').must_equal Timeframe.new(Date.new(2007, 3, 1), Date.new(2008, 5, 11))
232
+ end
233
+ it 'works with time' do
234
+ Timeframe.parse('2007-03-01T13:00:00Z/2008-05-11T15:30:00Z').must_equal Timeframe.new(Date.new(2007, 3, 1), Date.new(2008, 5, 11))
235
+ Timeframe.parse('2007-03-01T13:00:00Z--2008-05-11T15:30:00Z').must_equal Timeframe.new(Date.new(2007, 3, 1), Date.new(2008, 5, 11))
236
+ end
237
+ it 'takes shorthand' do
238
+ Timeframe.parse('2007-11-13/15').must_equal Timeframe.new(Date.new(2007, 11, 13), Date.new(2007, 11, 15)) # "2007-11-13/15", i.e. from any time on 2007-11-13 to any time on 2007-11-15
239
+ Timeframe.parse("2008-02-15/03-14").must_equal Timeframe.new(Date.new(2008, 2, 15), Date.new(2008, 3, 14)) # "2008-02-15/2008-03-14"
240
+ Timeframe.parse("2007-12-14T13:30/15:30").must_equal Timeframe.new(Date.new(2007, 12, 14), Date.new(2007, 12, 14)) # "2007-12-14T13:30/2007-12-14T15:30".. imprecise!
241
+ end
242
+ end
243
+
244
+ describe 'ISO 8601 <start>/<duration>' do
245
+ it 'works without time' do
246
+ Timeframe.parse('2007-03-01/P1Y2M10DT2H30M').must_equal Timeframe.new(Date.new(2007, 3, 1), Date.new(2008, 5, 11))
247
+ Timeframe.parse('2007-03-01--P1Y2M10DT2H30M').must_equal Timeframe.new(Date.new(2007, 3, 1), Date.new(2008, 5, 11))
248
+ end
249
+ it 'works with time' do
250
+ Timeframe.parse('2007-03-01T13:00:00Z/P1Y2M10DT2H30M').must_equal Timeframe.new(Date.new(2007, 3, 1), Date.new(2008, 5, 11))
251
+ Timeframe.parse('2007-03-01T13:00:00Z--P1Y2M10DT2H30M').must_equal Timeframe.new(Date.new(2007, 3, 1), Date.new(2008, 5, 11))
252
+ end
253
+ end
254
+
255
+ # note that 2008 was a leap year
256
+ describe 'ISO 8601 <duration>/<end>' do
257
+ it 'works with leap years' do
258
+ Timeframe.parse('2007-02-28--P1Y').must_equal Timeframe.new(Date.new(2007, 2, 28), Date.new(2008, 2, 29))
259
+ Timeframe.parse('P1Y--2008-02-29').must_equal Timeframe.new(Date.new(2007, 3, 1), Date.new(2008, 2, 29))
260
+ end
261
+ it 'works without time' do
262
+ Timeframe.parse('P1Y2M10DT2H30M/2008-05-11').must_equal Timeframe.new(Date.new(2007, 3, 2), Date.new(2008, 5, 11))
263
+ Timeframe.parse('P1Y2M10DT2H30M--2008-05-11').must_equal Timeframe.new(Date.new(2007, 3, 2), Date.new(2008, 5, 11))
264
+ end
265
+ it 'works with time' do
266
+ Timeframe.parse('P1Y2M10DT2H30M/2008-05-11T15:30:00Z').must_equal Timeframe.new(Date.new(2007, 3, 3), Date.new(2008, 5, 11))
267
+ Timeframe.parse('P1Y2M10DT2H30M--2008-05-11T15:30:00Z').must_equal Timeframe.new(Date.new(2007, 3, 3), Date.new(2008, 5, 11))
268
+ end
230
269
  end
270
+
231
271
  it 'understands plain year' do
232
272
  plain_year = 2009
233
273
  Timeframe.parse(plain_year).must_equal Timeframe.new(:year => plain_year)
@@ -271,6 +311,23 @@ EOS
271
311
  Timeframe.new(Date.parse('2008-01-01'), Date.parse('2010-01-01')).to_s.must_equal "2008-01-01/2010-01-01"
272
312
  end
273
313
  end
314
+
315
+ describe '#dates' do
316
+ it "should enumerate all dates between start and end" do
317
+ dates = Timeframe.new(:year => 2008).dates
318
+ dates.min.must_equal Date.new(2008,1,1)
319
+ dates.max.must_equal Date.new(2008,12,31)
320
+ dates.uniq.length.must_equal 366
321
+ dates.select { |d| d.month == 2 }.length.must_equal 29
322
+ end
323
+ end
324
+
325
+ describe '#first_days_of_months' do
326
+ it "should enumerate all the first days of included months" do
327
+ dates = Timeframe.parse('2011-05-01/2012-02-01').first_days_of_months
328
+ dates.must_equal [Date.new(2011,5,1), Date.new(2011,6,1), Date.new(2011,7,1), Date.new(2011,8,1), Date.new(2011,9,1), Date.new(2011,10,1), Date.new(2011,11,1), Date.new(2011,12,1), Date.new(2012,1,1)]
329
+ end
330
+ end
274
331
 
275
332
  describe "Array#multiple_timeframes_gaps_left_by" do
276
333
  it "should raise error if not a Timeframes are going to be merged" do
@@ -19,9 +19,6 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_development_dependency "minitest"
23
- s.add_development_dependency 'home_run'
24
- s.add_development_dependency 'rake'
25
22
  s.add_runtime_dependency 'activesupport', '>=2.3.5'
26
23
  s.add_runtime_dependency 'i18n'
27
24
  s.add_runtime_dependency 'multi_json'
metadata CHANGED
@@ -1,165 +1,96 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: timeframe
3
- version: !ruby/object:Gem::Version
4
- hash: 27
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Andy Rossmeissl
14
9
  - Seamus Abshere
15
10
  - Derek Kastner
16
11
  autorequire:
17
12
  bindir: bin
18
13
  cert_chain: []
19
-
20
- date: 2012-01-06 00:00:00 Z
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
23
- name: minitest
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
- - 0
33
- version: "0"
34
- type: :development
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: home_run
38
- prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
40
- none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 3
45
- segments:
46
- - 0
47
- version: "0"
48
- type: :development
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: rake
52
- prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
54
- none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- hash: 3
59
- segments:
60
- - 0
61
- version: "0"
62
- type: :development
63
- version_requirements: *id003
64
- - !ruby/object:Gem::Dependency
14
+ date: 2012-03-07 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
65
17
  name: activesupport
66
- prerelease: false
67
- requirement: &id004 !ruby/object:Gem::Requirement
18
+ requirement: &2164797740 !ruby/object:Gem::Requirement
68
19
  none: false
69
- requirements:
70
- - - ">="
71
- - !ruby/object:Gem::Version
72
- hash: 9
73
- segments:
74
- - 2
75
- - 3
76
- - 5
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
77
23
  version: 2.3.5
78
24
  type: :runtime
79
- version_requirements: *id004
80
- - !ruby/object:Gem::Dependency
81
- name: i18n
82
25
  prerelease: false
83
- requirement: &id005 !ruby/object:Gem::Requirement
26
+ version_requirements: *2164797740
27
+ - !ruby/object:Gem::Dependency
28
+ name: i18n
29
+ requirement: &2164797080 !ruby/object:Gem::Requirement
84
30
  none: false
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- hash: 3
89
- segments:
90
- - 0
91
- version: "0"
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
92
35
  type: :runtime
93
- version_requirements: *id005
94
- - !ruby/object:Gem::Dependency
95
- name: multi_json
96
36
  prerelease: false
97
- requirement: &id006 !ruby/object:Gem::Requirement
37
+ version_requirements: *2164797080
38
+ - !ruby/object:Gem::Dependency
39
+ name: multi_json
40
+ requirement: &2164796260 !ruby/object:Gem::Requirement
98
41
  none: false
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- hash: 3
103
- segments:
104
- - 0
105
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
106
46
  type: :runtime
107
- version_requirements: *id006
47
+ prerelease: false
48
+ version_requirements: *2164796260
108
49
  description: A Ruby class for describing and interacting with timeframes.
109
- email:
50
+ email:
110
51
  - andy@rossmeissl.net
111
52
  executables: []
112
-
113
53
  extensions: []
114
-
115
54
  extra_rdoc_files: []
116
-
117
- files:
55
+ files:
118
56
  - .document
119
57
  - .gitignore
120
58
  - Gemfile
121
59
  - LICENSE
122
- - README.rdoc
60
+ - README.markdown
123
61
  - Rakefile
124
62
  - lib/timeframe.rb
125
63
  - lib/timeframe/core_ext/array.rb
64
+ - lib/timeframe/iso_8601.rb
126
65
  - lib/timeframe/version.rb
127
66
  - spec/spec_helper.rb
128
67
  - spec/timeframe_spec.rb
129
68
  - timeframe.gemspec
130
69
  homepage: http://github.com/rossmeissl/timeframe
131
70
  licenses: []
132
-
133
71
  post_install_message:
134
72
  rdoc_options: []
135
-
136
- require_paths:
73
+ require_paths:
137
74
  - lib
138
- required_ruby_version: !ruby/object:Gem::Requirement
75
+ required_ruby_version: !ruby/object:Gem::Requirement
139
76
  none: false
140
- requirements:
141
- - - ">="
142
- - !ruby/object:Gem::Version
143
- hash: 3
144
- segments:
145
- - 0
146
- version: "0"
147
- required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
82
  none: false
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- hash: 3
153
- segments:
154
- - 0
155
- version: "0"
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
156
87
  requirements: []
157
-
158
88
  rubyforge_project: timeframe
159
- rubygems_version: 1.8.8
89
+ rubygems_version: 1.8.15
160
90
  signing_key:
161
91
  specification_version: 3
162
92
  summary: Date intervals
163
- test_files: []
164
-
93
+ test_files:
94
+ - spec/spec_helper.rb
95
+ - spec/timeframe_spec.rb
165
96
  has_rdoc:
@@ -1,17 +0,0 @@
1
- = timeframe
2
-
3
- A Ruby class for describing and interacting with timeframes.
4
-
5
- == Documentation
6
-
7
- http://rdoc.info/projects/rossmeissl/timeframe
8
-
9
- == Acknowledgements
10
-
11
- The good parts of Timeframe all came from the gentlemen at Fingertips[http://fngtps.com].
12
-
13
- Thanks to @artemk for https://github.com/rossmeissl/timeframe/pull/5
14
-
15
- == Copyright
16
-
17
- Copyright (c) 2010 Andy Rossmeissl.