time_span 0.0.1.beta.01 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/time_span.rb CHANGED
@@ -1,18 +1,29 @@
1
- #require "time_span/version"
1
+ require "time_span/version"
2
2
 
3
+ # @author Craig A. Cook
3
4
  module TimeSpan
4
5
 
5
- #######################################################################################################
6
- # this classes' object have a starting and ending RelativeTime, and both times must be on the same TimeLine
7
- #
8
- # it implements a large selection of comparators, both for start / end times (single time compartors),
9
- # and also range comparators
6
+ # this class' objects have a starting and ending TimeSpan::RelativeTime, and both times must be on the same TimeSpan::TimeLine
7
+ # implements a large selection of comparators, both for start / end times (single time compartors),
8
+ # and also range comparators
9
+ # @author Craig A. Cook
10
10
  class TimeSpan
11
11
 
12
- attr_accessor :starts, :ends, :time_line, :name # RelativeTime objects
13
-
12
+ # TimeSpan::RelativeTime start time
13
+ attr_accessor :starts
14
+ # TimeSpan::RelativeTime end time
15
+ attr_accessor :ends
16
+ # TimeSpan::TimeLine this TimeSpan is associated with
17
+ attr_accessor :time_line
18
+ attr_accessor :name
19
+
20
+ # @param [TimeSpan::RelativeTime] starting_at is when the span starts
21
+ # @param [TimeSpan::RelativeTime] ending_at is when the spa nends
22
+ # @param [TimeSpan::TimeLIne] is the associated TimeLine
23
+ # @param [String] The name of the TimeSpan (Actually any Ruby Object for which '#respond_to?(:to_s) == true')
24
+ # @return [Boolean] true if passed arguments are valid to create a TimeSpan
14
25
  def initialize(starting_at, ending_at, t_line, nom="(unnamed)")
15
- raise "Cannot make a span unless both points are on the same time_line" unless starting_at.colinear_with?(ending_at)
26
+ raise ArgumentError, "Cannot make a span unless both points are on the same time_line" unless starting_at.colinear_with?(ending_at)
16
27
  self.starts = starting_at
17
28
  self.ends = ending_at
18
29
  self.time_line = t_line
@@ -21,6 +32,8 @@ module TimeSpan
21
32
  starting_at.kind_of?(RelativeTime) && ending_at.kind_of?(RelativeTime) && (starting_at <= ending_at)
22
33
  end
23
34
 
35
+ # returns the 'statuses' for the start and end times
36
+ # @return start and end time statuses in a hash with key is self
24
37
  def endpoint_statuses
25
38
  {self => [self.starts.reference_to, self.ends.reference_to]}
26
39
  end
@@ -31,61 +44,102 @@ module TimeSpan
31
44
  # #
32
45
  #######################################################################################################
33
46
 
34
- def starts_before?(b)
35
- starts < b.starts
47
+ # tests if one TimeSpan starts before another (on the same TimeLine)
48
+ # @param [TimeSpan::TimeSpan] other_time_span the TimeSpan being compared to self
49
+ # @return true if self starts before b starts
50
+ def starts_before?(other_time_span)
51
+ starts < other_time_span.starts
36
52
  end
37
53
 
38
- def starts_after?(b)
39
- starts > b.starts
54
+ # tests if one TimeSpan starts after another (on the same TimeLine)
55
+ # @param (see #starts_before? )
56
+ # @return true if self starts after other_time_span starts
57
+ def starts_after?(other_time_span)
58
+ starts > other_time_span.starts
40
59
  end
41
60
 
42
- def starts_on_or_after?(b)
43
- starts >= b.starts
61
+ # tests if one TimeSpan starts with or after another (on the same TimeLine)
62
+ # @param (see #starts_before? )
63
+ # @return true if self starts on or after other_time_span starts
64
+ def starts_on_or_after?(other_time_span)
65
+ starts >= other_time_span.starts
44
66
  end
45
67
 
46
-
47
- def starts_with?(b)
48
- starts == b.starts
68
+ # tests if one TimeSpan starts at the same time as another (on the same TimeLine)
69
+ # @param (see #starts_before? )
70
+ # @return true if self starts at the same time as other_time_span starts
71
+ def starts_with?(other_time_span)
72
+ starts == other_time_span.starts
49
73
  end
50
74
 
51
- def starts_before_or_with?(b)
52
- starts <= b.starts
75
+ # tests if one TimeSpan starts before or at the same time as another (on the same TimeLine)
76
+ # @param (see #starts_before? )
77
+ # @return true if self starts before or at the same time as other_time_span starts
78
+ def starts_before_or_with?(other_time_span)
79
+ starts <= other_time_span.starts
53
80
  end
54
81
 
55
- def ends_before?(b)
56
- ends < b.ends
82
+ # tests if one TimeSpan ends before another starts (on the same TimeLine)
83
+ # @param (see #starts_before? )
84
+ # @return true if self ends before another time_span starts
85
+ def ends_before?(other_time_span)
86
+ ends < other_time_span.ends
57
87
  end
58
88
 
59
- def ends_on_or_before?(b)
60
- ends <= b.ends
89
+ # tests if one TimeSpan end before or at the same time as another ends (on the same TimeLine)
90
+ # @param (see #starts_before? )
91
+ # @return true if self ends before or at the same time as another time_span ends
92
+ def ends_on_or_before?(other_time_span)
93
+ ends <= other_time_span.ends
61
94
  end
62
95
 
63
- def ends_on_or_after?(b)
64
- ends >= b.ends
96
+ # tests if one TimeSpan ends after or at the same time as another (on the same TimeLine)
97
+ # @param (see #starts_before? )
98
+ # @return true if self ends after or at the same time as another time_span ends
99
+ def ends_on_or_after?(other_time_span)
100
+ ends >= other_time_span.ends
65
101
  end
66
102
 
67
- def ends_after?(b)
68
- ends > b.ends
103
+ # tests if one TimeSpan ends after another (on the same TimeLine)
104
+ # @param (see #starts_before? )
105
+ # @return true if self ends after another time_span ends
106
+ def ends_after?(other_time_span)
107
+ ends > other_time_span.ends
69
108
  end
70
109
 
71
- def ends_with?(b)
72
- ends == b.ends
110
+ # tests if one TimeSpan ends at the same time as another (on the same TimeLine)
111
+ # @param (see #starts_before? )
112
+ # @return true if self ends at the same time as another time_span ends
113
+ def ends_with?(other_time_span)
114
+ ends == other_time_span.ends
73
115
  end
74
116
 
75
- def ends_before_other_starts?(b)
76
- ends < b.starts
117
+ # tests if one TimeSpan ends before another starts (on the same TimeLine)
118
+ # @param (see #starts_before? )
119
+ # @return true if self ends before another time_span starts
120
+ def ends_before_other_starts?(other_time_span)
121
+ ends < other_time_span.starts
77
122
  end
78
123
 
79
- def ends_as_other_starts?(b)
80
- ends == b.starts
124
+ # tests if one TimeSpan ends at the same time as another starts (on the same TimeLine)
125
+ # @param (see #starts_before? )
126
+ # @return true if self ends at the same time as another time_span starts (no gap)
127
+ def ends_as_other_starts?(other_time_span)
128
+ ends == other_time_span.starts
81
129
  end
82
130
 
83
- def starts_after_other_ends?(b)
84
- starts > b.ends
131
+ # tests if one TimeSpan ends at the same time as another (on the same TimeLine)
132
+ # @param (see #starts_before? )
133
+ # @return true if self ends at the same time as another time_span ends
134
+ def starts_after_other_ends?(other_time_span)
135
+ starts > other_time_span.ends
85
136
  end
86
137
 
87
- def starts_as_other_ends?(b)
88
- starts == b.ends
138
+ # tests if one TimeSpan starts at the same time as another ends (on the same TimeLine)
139
+ # @param (see #starts_before? )
140
+ # @return true if self starts at the same time as another time_span ends
141
+ def starts_as_other_ends?(other_time_span)
142
+ starts == other_time_span.ends
89
143
  end
90
144
 
91
145
  ##################################
@@ -98,36 +152,62 @@ module TimeSpan
98
152
  ## unless it is meant < XOR =
99
153
 
100
154
 
101
- def == (b)
102
- ends_with?(b) && starts_with?(b)
155
+ # tests if one TimeSpan is the same as another (on the same TimeLine)
156
+ # @param (see #starts_before? )
157
+ # @return [Boolean] true if same as the other
158
+ def == (other_time_span)
159
+ ends_with?(other_time_span) && starts_with?(other_time_span)
103
160
  end
104
161
 
105
- def != (b)
106
- !end_with(b) || !starts_with(b)
162
+ # tests if one TimeSpan is not the same as another (on the same TimeLine)
163
+ # @param (see #starts_before? )
164
+ # @return [Boolean] true if not same as the other
165
+ def != (other_time_span)
166
+ !end_with(other_time_span) || !starts_with(other_time_span)
107
167
  end
108
168
 
109
- def < (b)
110
- ends_before_other_starts?(b)
169
+ # tests if one TimeSpan ends before another starts (on the same TimeLine)
170
+ # alias for '#ends_before_other_starts'
171
+ # @param (see #starts_before? )
172
+ # @return [Boolean] true if self ends before another starts
173
+ def < (other_time_span)
174
+ ends_before_other_starts?(other_time_span)
111
175
  end
112
176
 
113
- def > (b)
114
- starts_after_other_ends?(b)
177
+ # tests if one TimeSpan starts after another ends (on the same TimeLine)
178
+ # alias for '#starts_after_other_ends'
179
+ # @param (see #starts_before? )
180
+ # @return [Boolean] true if self starts after another ends
181
+ def > (other_time_span)
182
+ starts_after_other_ends?(other_time_span)
115
183
  end
116
184
 
117
- def contained_fully_inside?(b)
118
- starts_after?(b) && ends_before?(b)
185
+ # tests if one TimeSpan is contained within another (on the same TimeLine)
186
+ # @param (see #starts_before? )
187
+ # @return true if self contained inside another
188
+ def contained_fully_inside?(other_time_span)
189
+ starts_after?(other_time_span) && ends_before?(other_time_span)
119
190
  end
120
191
 
121
- def contained_inside?(b)
122
- starts_on_or_after?(b) && ends_on_or_before?(b)
192
+ # tests if one TimeSpan is contained within another, possibly begining as or ends as another (on the same TimeLine)
193
+ # @param (see #starts_before? )
194
+ # @return true if self contained inside another, including same endpoints
195
+ def contained_inside?(other_time_span)
196
+ starts_on_or_after?(other_time_span) && ends_on_or_before?(other_time_span)
123
197
  end
124
198
 
125
- def contains_fully?(b)
126
- starts_before?(b) && ends_after?(b)
199
+ # tests if one TimeSpan contains another (on the same TimeLine)
200
+ # @param (see #starts_before? )
201
+ # @return true if self contains another
202
+ def contains_fully?(other_time_span)
203
+ starts_before?(other_time_span) && ends_after?(other_time_span)
127
204
  end
128
205
 
129
- def contains?(b)
130
- starts_before_or_with?(b) && ends_on_or_after?(b)
206
+ # tests if one TimeSpan contains within another (on the same TimeLine)
207
+ # @param (see #starts_before? )
208
+ # @return true if self contains another
209
+ def contains?(other_time_span)
210
+ starts_before_or_with?(other_time_span) && ends_on_or_after?(other_time_span)
131
211
  end
132
212
 
133
213
  end
@@ -152,44 +232,58 @@ module TimeSpan
152
232
  # compress! -- compresses the TimeLine, removing [] and adjusting the index accordingly #
153
233
  # #
154
234
  #######################################################################################################
235
+ # @author Craig A. .Cook
155
236
  class TimeLine < Array
156
237
 
157
238
  attr_accessor :line, :indices_of, :name, :spans
158
239
 
240
+
241
+ def initialize(name="")
242
+ @name = name
243
+ @line = []
244
+ @indices_of = {}
245
+ @spans = []
246
+ end
247
+
248
+ # returns the TimeLine's name
249
+ # @return [String] TimeLine's name'
159
250
  def to_s
160
251
  name.to_s
161
252
  end
162
253
 
254
+ # endpoint statuses for all TimeSpans on the TimeLine, plus TimeLine name
255
+ # @return [String] TimeSpan endpoint statuses + TimeLine name
163
256
  def inspect
164
257
  line.inspect + name
165
258
  end
166
259
 
260
+ # @return [Array] endpoint statuses for all TimeSpan s on the TimeLine
167
261
  def all_endpoint_statuses
168
262
  spans.inject({}){ |acc, span| acc.merge!(span.endpoint_statuses) }
169
263
  end
170
264
 
171
- ## attached times only
265
+ ## attached times only (internal API)
266
+ # @return [Array] indices of keys
172
267
  def relative_times
173
268
  indices_of.keys
174
269
  end
175
270
 
271
+ # all statuses on the TimeLine
272
+ # @return [Array] statuses for all attached RelativeTime s on the TimeLine
176
273
  def all_relative_time_statuses
177
274
  relative_times.inject([]) {|acc, v| acc << v.reference_to }
178
275
  end
179
276
 
180
- def initialize(name="")
181
- @name = name
182
- @line = []
183
- @indices_of = {}
184
- @spans = []
185
- end
186
-
187
277
  ## indices methods
188
278
 
279
+ ## find the position of a RelativeTime on the TimeLine
280
+ # @return [Fixnum] RelativeTime's position on the TimeLine (self)
189
281
  def position_of(obj)
190
282
  @indices_of[obj]
191
283
  end
192
284
 
285
+ # bump up indices after a point, so that a RelativeTime may be inserted
286
+ # @return nil no return value, helper method to keep data structures up to date.
193
287
  def increase_after(pos, by=1)
194
288
  @indices_of.each_key do |key|
195
289
  @indices_of[key] += by if (@indices_of[key] >= pos)
@@ -199,16 +293,25 @@ module TimeSpan
199
293
  ## insertion
200
294
 
201
295
  # add to the end of the TimeLine
296
+ # @param obj object to be inserted into the TimeLine
297
+ # @return (see #insert_at)
202
298
  def append(obj)
203
299
  insert_at(@line.size, obj)
204
300
  end
205
301
 
206
302
  # inserts to the end of the relative object's time, becoming equal with it
303
+ # @param relative_obj object after which to insert obj
304
+ # @param obj object inserted after relative_object
305
+ # @return (see #insert_at)
207
306
  def append_to_next(relative_obj, obj, relative=1)
208
307
  insert_at(position_of(relative_obj)+relative, obj)
209
308
  end
210
309
 
211
310
  ## inserts into a new space before the relative object (first parameter)
311
+ # inserts obj before relative_obj by offset
312
+ # @param relative_obj object for computing position where obj is inserted
313
+ # @param the inserted object
314
+ # @return (see #insert_at)
212
315
  def insert_before_next(relative_obj, obj, relative_offset=1)
213
316
  relative_position = position_of(relative_obj)
214
317
  increase_after(relative_position + relative_offset, relative_offset)
@@ -217,8 +320,11 @@ module TimeSpan
217
320
  end
218
321
 
219
322
  ## place obj at the numbered position
323
+ # @param pos where to insert obj in the TimeLIne
324
+ # @param obj obj inserted into the TimeLIne
325
+ # @return [Fixnum] ]the (relative) position where the object was inserted
220
326
  def insert_at(pos, obj)
221
- raise "can only add a time to its own time_line" unless obj.time_line.equal? self
327
+ raise ArgumentError, "can only add a time to its own time_line" unless obj.time_line.equal? self
222
328
  if @line[pos].nil?
223
329
  @line[pos] = [obj]
224
330
  else
@@ -231,6 +337,8 @@ module TimeSpan
231
337
 
232
338
  # cannot remove [] or the @indices_of will be wrong
233
339
  # call #compress to remove the extra []s
340
+ # @param obj object to be removed from the TimeLIne
341
+ # @return []nil|Fixnum] position of deleted object
234
342
  def remove(obj)
235
343
  pos = position_of(obj)
236
344
  if pos # do nothing if it isn't there'
@@ -241,6 +349,7 @@ module TimeSpan
241
349
 
242
350
  ## removes all [] elements, and decrements accordingly the @indices_of
243
351
  ## ideally this should be transactional
352
+ # @return [nil] cleanup method
244
353
  def compress!
245
354
  mod_level = 0
246
355
  offsets = []
@@ -278,41 +387,56 @@ module TimeSpan
278
387
  # #
279
388
  # RelativeTime must be within a TimeLine #
280
389
  #######################################################################################################
390
+ #
391
+ # @author Craig A. Cook
281
392
  class RelativeTime
282
393
 
283
- attr_accessor :time_line, :reference_to # reference_to should respond_to? :to_s
394
+ attr_accessor :time_line # TimeLine on which this RelativeTime is placed
395
+ attr_accessor :reference_to # Object (PORO) reference_to should respond_to? :to_s
284
396
 
285
397
  # create a realtive time *within a time_line* after position
398
+ # @param tline [TimeSpan::TimeLine] TimeLIne on which this RelativeTime is placed
399
+ # @param ref [Object] the object placed on the timeline
400
+ # @return the .to_s of the referenced object
286
401
  def initialize tline, ref
287
402
  @time_line= tline
288
403
  @reference_to= ref
289
404
  end
290
405
 
406
+ # @return [String] the string representation of referenced object
291
407
  def to_s
292
- reference_to.to_s
408
+ @reference_to.to_s
293
409
  end
294
410
 
411
+ # comparator methods
412
+ # @param [TimeSpan::RelativeTime] other_relative_time time being compared to
413
+ # @return [Boolean] depending on the relationship
295
414
  ## any method on fixnum with 1 RelativeTime param can be in the list below
296
415
  %w{< <= == != >= >}.each{ |meth|
297
- self.send(:define_method, meth) {|b|
298
- raise "can only compare to other times on the same time_line." unless valid_and_comparable_with?(b) # can NOT compare across TimeLines
299
- self.time_line.position_of(self).send(meth, b.time_line.position_of(b))
416
+ self.send(:define_method, meth) {|other_relative_time|
417
+ raise ArgumentError, "can only compare to other times on the same time_line." unless valid_and_comparable_with?(other_relative_time) # can NOT compare across TimeLines
418
+ self.time_line.position_of(self).send(meth, other_relative_time.time_line.position_of(other_relative_time))
300
419
  }
301
420
  }
302
421
 
422
+ # @return [Boolean] true if self has been properly placed on a TimeLine
303
423
  def positioned?
304
424
  self.time_line && self.time_line.indices_of.include?(self)
305
425
  end
306
426
 
307
- def colinear_with?(b)
308
- b.kind_of?(self.class) && b.positioned? && positioned? && time_line.equal?(b.time_line)
427
+ # @param [TimeSpan::RelativeTime] other time to be sure is on self's TimeLIne
428
+ # @return [Boolean] true if both are on the same TimeLine
429
+ def colinear_with?(other_relative_time)
430
+ other_relative_time.kind_of?(self.class) && other_relative_time.positioned? && positioned? && time_line.equal?(other_relative_time.time_line)
309
431
  end
310
432
 
311
433
 
312
434
  protected
313
435
 
314
- def valid_and_comparable_with?(b)
315
- !self.time_line.nil? && !b.time_line.nil? && colinear_with?(b)
436
+ # @param [TimeSpan::RelativeTime] RelativeTime to check for comparability with
437
+ # @return [Boolean] true if they can be compared
438
+ def valid_and_comparable_with?(other_relative_time)
439
+ !self.time_line.nil? && !other_relative_time.time_line.nil? && colinear_with?(other_relative_time)
316
440
  end
317
441
 
318
442
 
@@ -31,6 +31,7 @@ describe "TimeSpan" do
31
31
  timeline.append time_a
32
32
  timeline.append time_b
33
33
  timeline.append time_c
34
+ timeline.spans << time_span
34
35
  end
35
36
 
36
37
 
@@ -40,6 +41,10 @@ describe "TimeSpan" do
40
41
 
41
42
  context "statues" do
42
43
 
44
+ it "should have non-empty endpoint statuses" do
45
+ timeline.all_endpoint_statuses.should_not be_empty
46
+ end
47
+
43
48
  it "should get all the endpoint statuses" do
44
49
  timeline.all_endpoint_statuses.should == {time_span => [time_span.starts.reference_to, time_span.ends.reference_to]}
45
50
  end
@@ -69,7 +74,7 @@ describe "TimeSpan" do
69
74
  it "won't insert into the wrong timeline" do
70
75
  timeline_b = TimeSpan::TimeLine.new "Another Timeline"
71
76
  lambda {
72
- timeline_b.append(time_a) }.should raise_error RuntimeError
77
+ timeline_b.append(time_a) }.should raise_error ArgumentError
73
78
  end
74
79
 
75
80
  it "populates the index hash" do
@@ -182,12 +187,16 @@ describe "TimeSpan" do
182
187
 
183
188
  context "creation" do
184
189
 
190
+ it "should have a timeline associated" do
191
+ timeline.spans.should_not be_empty
192
+ end
193
+
185
194
  it "should not allow creation when RelativeTime elements which are not on the same TimeLine" do
186
195
  other_timeline = TimeSpan::TimeLine.new "another timeline"
187
196
  time_other = TimeSpan::RelativeTime.new other_timeline, "Time on other timeline"
188
197
  lambda {
189
198
  TimeSpan::TimeSpan.new(time_a, time_other)
190
- }.should raise_error
199
+ }.should raise_error ArgumentError
191
200
  end
192
201
 
193
202
  end
@@ -353,4 +362,4 @@ describe "TimeSpan" do
353
362
 
354
363
  end
355
364
 
356
- end
365
+ end
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time_span
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.beta.01
5
- prerelease: 6
4
+ version: 0.0.2
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Craig A. Cook
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-09 00:00:00.000000000 Z
12
+ date: 2012-03-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &77411640 !ruby/object:Gem::Requirement
16
+ requirement: &73419500 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *77411640
24
+ version_requirements: *73419500
25
25
  description: Time spans, including many comparators
26
26
  email:
27
27
  - craig.a.cook@gmail.com
@@ -31,6 +31,7 @@ extra_rdoc_files: []
31
31
  files:
32
32
  - .gitignore
33
33
  - Gemfile
34
+ - Gemfile.lock
34
35
  - README.md
35
36
  - Rakefile
36
37
  - doc/Gemfile.html
@@ -39,7 +40,15 @@ files:
39
40
  - doc/TimeSpan/RelativeTime.html
40
41
  - doc/TimeSpan/TimeLine.html
41
42
  - doc/TimeSpan/TimeSpan.html
43
+ - doc/_index.html
44
+ - doc/class_list.html
42
45
  - doc/created.rid
46
+ - doc/css/common.css
47
+ - doc/css/full_list.css
48
+ - doc/css/style.css
49
+ - doc/file.README.html
50
+ - doc/file_list.html
51
+ - doc/frames.html
43
52
  - doc/images/brick.png
44
53
  - doc/images/brick_link.png
45
54
  - doc/images/bug.png
@@ -61,15 +70,19 @@ files:
61
70
  - doc/images/wrench_orange.png
62
71
  - doc/images/zoom.png
63
72
  - doc/index.html
73
+ - doc/js/app.js
64
74
  - doc/js/darkfish.js
75
+ - doc/js/full_list.js
65
76
  - doc/js/jquery.js
66
77
  - doc/js/quicksearch.js
67
78
  - doc/js/thickbox-compressed.js
68
79
  - doc/lib/time_span/version_rb.html
69
80
  - doc/lib/time_span_rb.html
81
+ - doc/method_list.html
70
82
  - doc/rdoc.css
71
83
  - doc/spec/spec_helper_rb.html
72
84
  - doc/spec/time_span/time_span_spec_rb.html
85
+ - doc/top-level-namespace.html
73
86
  - lib/time_span.rb
74
87
  - lib/time_span/version.rb
75
88
  - spec/spec_helper.rb
@@ -91,14 +104,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
104
  required_rubygems_version: !ruby/object:Gem::Requirement
92
105
  none: false
93
106
  requirements:
94
- - - ! '>'
107
+ - - ! '>='
95
108
  - !ruby/object:Gem::Version
96
- version: 1.3.1
109
+ version: '0'
97
110
  requirements: []
98
111
  rubyforge_project: time_span
99
- rubygems_version: 1.8.12
112
+ rubygems_version: 1.8.11
100
113
  signing_key:
101
114
  specification_version: 3
102
115
  summary: Time Span
103
116
  test_files: []
104
- has_rdoc: