timeframe 0.1.0 → 0.1.1

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/.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.