time_span 0.0.1.beta.01 → 0.0.2

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