timecode 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.1.9 / 2009-02-23
2
+
3
+ * Do not be biased when rounding out frames on from_seconds
4
+
1
5
  === 0.1.8 / 2009-01-31
2
6
 
3
7
  * Bail out with empty or whitespace strings passed to Timecode.parse
data/SPECS.txt CHANGED
@@ -1,11 +1,18 @@
1
1
 
2
- == Timecode.new() should
2
+ == Timecode.new should
3
3
  * instantiate from int
4
4
  * always coerce FPS to float
5
5
  * create a zero TC with no arguments
6
6
  * accept full string SMPTE timecode as well
7
7
 
8
- == Timecode.at() should
8
+ == Timecode.validate_atoms! should
9
+ * disallow more than 99 hrs
10
+ * disallow more than 59 minutes
11
+ * disallow more than 59 seconds
12
+ * disallow more frames than what the framerate permits
13
+ * pass validation with usable values
14
+
15
+ == Timecode.at should
9
16
  * disallow more than 99 hrs
10
17
  * disallow more than 59 minutes
11
18
  * disallow more than 59 seconds
@@ -30,6 +37,11 @@
30
37
  == A Timecode of zero should
31
38
  * properly respond to zero?
32
39
 
40
+ == Timecode#to_seconds should
41
+ * return a float
42
+ * return the value in seconds
43
+ * properly roundtrip a value via Timecode.from_seconds
44
+
33
45
  == An existing Timecode on inspection should
34
46
  * properly present himself via inspect
35
47
  * properly print itself
@@ -64,8 +76,7 @@
64
76
 
65
77
  == Timecode.parse should
66
78
  * handle complete SMPTE timecode
67
- * handle complete SMPTE timecode via new
68
- * refuse to handle timecode that is out of range for the framerate
79
+ * handle timecode with fractional seconds
69
80
  * parse a row of numbers as parts of a timecode starting from the right
70
81
  * parse a number with f suffix as frames
71
82
  * parse a number with s suffix as seconds
@@ -78,6 +89,7 @@
78
89
  * parse timecode with fractional second instead of frames
79
90
  * raise when trying to parse DF timecode
80
91
  * raise on improper format
92
+ * raise on empty argument
81
93
 
82
94
  == Timecode.soft_parse should
83
95
  * parse the timecode
@@ -87,4 +99,4 @@
87
99
  * parse from a 4x4bits packed 32bit unsigned int
88
100
  * properly convert itself back to 4x4 bits 32bit unsigned int
89
101
 
90
- 60 specifications (101 requirements), 0 failures
102
+ 68 specifications (112 requirements), 0 failures
data/lib/timecode.rb CHANGED
@@ -12,7 +12,7 @@
12
12
  # :mapping => [%w(source_tc_frames total), %w(tape_fps fps)]
13
13
 
14
14
  class Timecode
15
- VERSION = '0.1.8'
15
+ VERSION = '0.1.9'
16
16
 
17
17
  include Comparable
18
18
 
@@ -80,9 +80,6 @@ class Timecode
80
80
  # Drop frame goodbye
81
81
  if (input =~ DF_TC_RE)
82
82
  raise Error, "We do not support drop-frame TC"
83
- # No empty values
84
- elsif (input =~ /A(\s+)Z/)
85
- raise CannotParse, "Empty timecode"
86
83
  # 00:00:00:00
87
84
  elsif (input =~ COMPLETE_TC_RE)
88
85
  atoms_and_fps = input.scan(COMPLETE_TC_RE).to_a.flatten.map{|e| Integer(e)} + [with_fps]
@@ -157,7 +154,7 @@ class Timecode
157
154
  # create a timecode from the number of seconds. This is how current time is supplied by
158
155
  # QuickTime and other systems which have non-frame-based timescales
159
156
  def from_seconds(seconds_float, the_fps = DEFAULT_FPS)
160
- total_frames = (seconds_float.to_f * the_fps.to_f).ceil
157
+ total_frames = (seconds_float.to_f * the_fps.to_f).to_i
161
158
  new(total_frames, the_fps)
162
159
  end
163
160
 
@@ -44,8 +44,8 @@ context "Timecode.validate_atoms! should" do
44
44
  end
45
45
 
46
46
  specify "disallow more frames than what the framerate permits" do
47
- lambda{ Timecode.validate_atoms!(1,0,60,25, 25) }.should.raise(Timecode::RangeError)
48
- lambda{ Timecode.validate_atoms!(1,0,60,32, 30) }.should.raise(Timecode::RangeError)
47
+ lambda{ Timecode.validate_atoms!(1,0,45,25, 25) }.should.raise(Timecode::RangeError)
48
+ lambda{ Timecode.validate_atoms!(1,0,45,32, 30) }.should.raise(Timecode::RangeError)
49
49
  end
50
50
 
51
51
  specify "pass validation with usable values" do
@@ -166,6 +166,13 @@ context "Timecode#to_seconds should" do
166
166
  secs = 126.3
167
167
  Timecode.new(fps * secs, fps).to_seconds.should.be.close 126.3, 0.1
168
168
  end
169
+
170
+ specify "properly roundtrip a value via Timecode.from_seconds" do
171
+ secs_in = 19.76
172
+ from_secs = Timecode.from_seconds(19.76, 25.0)
173
+ from_secs.total.should.equal 494
174
+ from_secs.to_seconds.should.be.close(secs_in, 0.001)
175
+ end
169
176
  end
170
177
 
171
178
  context "An existing Timecode on inspection should" do
@@ -271,7 +278,7 @@ context "A Timecode used with fractional number of seconds" do
271
278
 
272
279
  fraction = 7.16
273
280
  tc = Timecode.from_seconds(fraction, 12.5)
274
- tc.to_s.should.equal "00:00:07:02"
281
+ tc.to_s.should.equal "00:00:07:01"
275
282
  end
276
283
 
277
284
  end
@@ -310,6 +317,11 @@ context "Timecode.parse should" do
310
317
  Timecode.parse(simple_tc).to_s.should.equal(simple_tc)
311
318
  end
312
319
 
320
+ specify "handle timecode with fractional seconds" do
321
+ tc = Timecode.parse("10:10:10.2", 25)
322
+ tc.to_s.should.equal "10:10:10:05"
323
+ end
324
+
313
325
  specify "parse a row of numbers as parts of a timecode starting from the right" do
314
326
  Timecode.parse("10").should.equal Timecode.new(10)
315
327
  Timecode.parse("210").should.equal Timecode.new(60)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timecode
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julik
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-04 00:00:00 +01:00
12
+ date: 2009-02-23 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency