flame_channel_parser 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.travis.yml +4 -0
  2. data/Gemfile +10 -0
  3. data/History.txt +5 -0
  4. data/README.rdoc +4 -2
  5. data/Rakefile +23 -10
  6. data/bin/{bake_flame_timewarp → framecurve_from_flame} +5 -1
  7. data/bin/framecurve_to_flame +22 -0
  8. data/flame_channel_parser.gemspec +130 -0
  9. data/lib/builder.rb +86 -0
  10. data/lib/flame_channel_parser.rb +31 -4
  11. data/lib/framecurve_writers/base.rb +49 -0
  12. data/lib/framecurve_writers/batch_timewarp.rb +41 -0
  13. data/lib/framecurve_writers/kronos.rb +23 -0
  14. data/lib/framecurve_writers/softfx_timewarp.rb +82 -0
  15. data/lib/framecurve_writers/templates/BatchTW.xml +118 -0
  16. data/lib/framecurve_writers/templates/SampleKronos.F_Kronos +376 -0
  17. data/lib/framecurve_writers/templates/TW_Sample.timewarp +79 -0
  18. data/lib/framecurve_writers/templates/key.xml +10 -0
  19. data/lib/timewarp_extractor.rb +18 -2
  20. data/lib/xml_parser.rb +90 -0
  21. data/test/helper.rb +18 -0
  22. data/test/snaps/BatchTimewar_proper.xml +157 -0
  23. data/test/snaps/BatchTimewarp_ext1.timewarp_node +1 -0
  24. data/test/test_base_timewarp_writer.rb +22 -0
  25. data/test/test_batch_timewarp_writer.rb +18 -0
  26. data/test/test_channel.rb +1 -2
  27. data/test/test_cli.rb +14 -13
  28. data/test/test_cli_framecurve_to_flame.rb +45 -0
  29. data/test/test_cli_timewarp_extractor.rb +19 -9
  30. data/test/test_extractor.rb +1 -3
  31. data/test/test_flame_builder.rb +68 -0
  32. data/test/test_flame_channel_parser.rb +2 -2
  33. data/test/test_interpolator.rb +15 -5
  34. data/test/test_key.rb +2 -2
  35. data/test/test_kronos_timewarp_writer.rb +16 -0
  36. data/test/test_segments.rb +1 -2
  37. data/test/test_softfx_timewarp_writer.rb +16 -0
  38. data/test/test_timewarp_extractor.rb +2 -4
  39. data/test/test_xml_setup.rb +37 -0
  40. data/test/timewarp_examples/TW_16_010_v01.output.txt +430 -428
  41. data/test/timewarp_examples/simple.framecurve.txt +32 -0
  42. data/test/timewarp_export_samples/BatchTW.timewarp_node +145 -0
  43. data/test/timewarp_export_samples/Kronos.F_Kronos +403 -0
  44. data/test/timewarp_export_samples/SoftFX.timewarp +81 -0
  45. metadata +127 -168
  46. data/.gemtest +0 -0
  47. data/Manifest.txt +0 -52
@@ -0,0 +1,79 @@
1
+ TimewarpFileVersion 1.0
2
+ CreationDate Wed Dec 28 08:46:50 2011
3
+
4
+
5
+ Fields 0
6
+ Frames 28
7
+ Origin 1
8
+ RenderType yes
9
+ SamplingStep 0
10
+ Interpolation 0
11
+ FlowQuality 2
12
+ Animation
13
+ Channel Speed
14
+ Extrapolation linear
15
+ Value 100
16
+ End
17
+ Channel Timing/Timing
18
+ Extrapolation constant
19
+ Value 1
20
+ Size 3
21
+ KeyVersion 2
22
+ Key 0
23
+ Frame 1
24
+ Value 1
25
+ RHandleX 5.66666651
26
+ RHandleY 6.99977636
27
+ LHandleX 0.75
28
+ LHandleY 0.75
29
+ CurveMode bezier
30
+ CurveOrder cubic
31
+ LeftAutomaticSlope no
32
+ TangentMode manual
33
+ End
34
+ Key 1
35
+ Frame 15
36
+ Value 18.9993286
37
+ RHandleX 19.333334
38
+ RHandleY 23.3326626
39
+ LHandleX 10.333333
40
+ LHandleY 14.3326616
41
+ CurveMode bezier
42
+ CurveOrder cubic
43
+ TangentMode smooth
44
+ End
45
+ Key 2
46
+ Frame 28
47
+ Value 28
48
+ RHandleX 32.3333321
49
+ RHandleY 31.0002232
50
+ LHandleX 23.666666
51
+ LHandleY 24.9997768
52
+ CurveMode bezier
53
+ CurveOrder cubic
54
+ TangentMode smooth
55
+ End
56
+ Uncollapsed
57
+ End
58
+ Channel Mix/Mix
59
+ Extrapolation linear
60
+ Value 0
61
+ End
62
+ Channel Trail/Pre_Trail
63
+ Extrapolation linear
64
+ Value 1
65
+ End
66
+ Channel Trail/Pre_Weight
67
+ Extrapolation linear
68
+ Value 100
69
+ End
70
+ Channel Trail/Post_Trail
71
+ Extrapolation linear
72
+ Value 1
73
+ End
74
+ Channel Trail/Post_Weight
75
+ Extrapolation linear
76
+ Value 100
77
+ End
78
+ ChannelEnd
79
+ End
@@ -0,0 +1,10 @@
1
+ <Key Index="$idx">
2
+ <Frame>$frame</Frame>
3
+ <Value>$value</Value>
4
+ <RHandleX>32.666668</RHandleX>
5
+ <RHandleY>36.319729</RHandleY>
6
+ <LHandleX>16.333334</LHandleX>
7
+ <LHandleY>14.986395</LHandleY>
8
+ <CurveMode>hermite</CurveMode>
9
+ <CurveOrder>linear</CurveOrder>
10
+ </Key>
@@ -1,3 +1,5 @@
1
+ require "framecurve"
2
+
1
3
  module FlameChannelParser
2
4
  class TimewarpExtractor
3
5
 
@@ -5,7 +7,7 @@ module FlameChannelParser
5
7
  CHANNELS = %( Timing/Timing Frame )
6
8
 
7
9
  class X < Extractor
8
-
10
+
9
11
  # This one is overridden here since instead of looking for a particular channel we are looking
10
12
  # for matches from a list
11
13
  def find_channel_in(channels, channel_path)
@@ -14,8 +16,22 @@ module FlameChannelParser
14
16
  return detected_channel if detected_channel
15
17
  raise ChannelNotFoundError, compose_channel_not_found_message(CHANNELS.join(' or '), channels)
16
18
  end
19
+
20
+ FRAMECURVE_FORMAT = "%d\t%.5f\r\n"
21
+
22
+ # Overridden to force CRLF line breaks as per Framecurve spec
23
+ def write_frame(to_io, frame, value)
24
+ @c.tuple!(frame, value)
25
+ end
26
+
27
+ # Overridden to write a framecurve header
28
+ def write_channel(interpolator, to_io, from_frame_i, to_frame_i)
29
+ @c = Framecurve::Curve.new
30
+ super
31
+ Framecurve::Serializer.new.serialize(to_io, @c)
32
+ end
17
33
  end
18
-
34
+
19
35
  def extract(file_path, options)
20
36
  return X.extract(file_path, options)
21
37
  end
@@ -0,0 +1,90 @@
1
+ require 'rexml/document'
2
+ require "rexml/streamlistener"
3
+
4
+ class FlameChannelParser::XMLParser < FlameChannelParser::Parser
5
+ # Here you can assign a logger proc or a lambda that will be call'ed with progress reports
6
+ attr_accessor :logger_proc
7
+
8
+ # A SAX-based translation layer
9
+ class XMLToSetup
10
+ include REXML::StreamListener
11
+
12
+ def initialize(vanilla_setup)
13
+ @dest = vanilla_setup
14
+ @indent = 0
15
+ @in_channel = false
16
+ @path = []
17
+ end
18
+
19
+ # <KFrames>
20
+ # <Key Index="0">
21
+ # <Frame>1.000000</Frame>
22
+ # <Value>100</Value>
23
+ # <RHandleX>1.297667</RHandleX>
24
+ # <RHandleY>100.000000</RHandleY>
25
+ # <LHandleX>0.750000</LHandleX>
26
+ # <LHandleY>100.000000</LHandleY>
27
+ # <CurveMode>hermite</CurveMode>
28
+ # <CurveOrder>linear</CurveOrder>
29
+ # </Key>
30
+ # </KFrames>
31
+ def tag_start(element, attributes)
32
+ @path.push(element)
33
+ if element == "Channel"
34
+ channel_name = attributes["Name"]
35
+ @in_channel = true
36
+ # Compose the full channel name
37
+
38
+ @dest.puts("Channel %s" % channel_name)
39
+ elsif element == "Key"
40
+ @in_key = true
41
+ @dest.puts("\tKey %d" % attributes["Index"].to_i)
42
+ end
43
+ end
44
+
45
+ def text(text)
46
+ @text = text
47
+ end
48
+
49
+ def tag_end(element)
50
+ @path.pop
51
+ if element == "Channel"
52
+ @in_channel = false
53
+ @dest.puts("\tEnd")
54
+ end
55
+
56
+ if element == "Key"
57
+ @in_key = false
58
+ @dest.puts("\t\tEnd")
59
+ end
60
+
61
+ if @in_key
62
+ @dest.puts("\t\t" + transfo(element) + " " + @text)
63
+ end
64
+
65
+ if !@in_key && @in_channel
66
+ @dest.puts("\t" + transfo(element) + " " + @text)
67
+ end
68
+ end
69
+
70
+ def transfo(t)
71
+ t == "Extrap" ? "Extrapolation" : t
72
+ end
73
+ end
74
+
75
+ # Parses the setup passed in the IO. If a block is given to the method it will yield Channel
76
+ # objects one by one instead of accumulating them into an array (useful for big setups)
77
+ def parse(io)
78
+ # Ok this is gothic BUT needed. What we do is we transform the XML setup into the OLD
79
+ # setup format, after which we run it through the OLD parser all the same.
80
+ # I am almost sure that ADSK does the same.
81
+ t = Tempfile.new("bx")
82
+ REXML::Document.parse_stream(io, XMLToSetup.new(t))
83
+ t.rewind
84
+ if block_given?
85
+ super(t, &Proc.new)
86
+ else
87
+ super(t)
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,18 @@
1
+ require "test/unit"
2
+ require "stringio"
3
+ require "tempfile"
4
+ require "cli_test"
5
+
6
+ require File.dirname(__FILE__) + "/../lib/flame_channel_parser"
7
+
8
+ class Test::Unit::TestCase
9
+ def assert_same_buffer(ref_buffer, actual_buffer, message = "The line should be identical")
10
+ [ref_buffer, actual_buffer].each{|io| io.rewind }
11
+ at_line = 0
12
+ until ref_buffer.eof? && actual_buffer.eof?
13
+ at_line += 1
14
+ reference_line, output_line = ref_buffer.readline, actual_buffer.readline
15
+ assert_equal reference_line, output_line, "Line #{at_line} - #{message}"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,157 @@
1
+ <?xml version="1.0"?>
2
+ <Setup>
3
+ <Base>
4
+ <Version>7.130000</Version>
5
+ <NAME>timewarp3</NAME>
6
+ <Note/>
7
+ <Expanded>False</Expanded>
8
+ <ScrollBar>0</ScrollBar>
9
+ <Frames>0</Frames>
10
+ <Current_Time>82</Current_Time>
11
+ <Input_DataType>3</Input_DataType>
12
+ <ClampMode>0</ClampMode>
13
+ <AdapDegrad>False</AdapDegrad>
14
+ </Base>
15
+ <State>
16
+ <TW_FlowQuality>4</TW_FlowQuality>
17
+ <TW_DoBlur>False</TW_DoBlur>
18
+ <TW_BlurPhase>0</TW_BlurPhase>
19
+ <TW_DoBlurReference>False</TW_DoBlurReference>
20
+ <TW_BlurRefColor>
21
+ <R>1.000000</R>
22
+ <G>0.000000</G>
23
+ <B>0.000000</B>
24
+ <A>1.000000</A>
25
+ </TW_BlurRefColor>
26
+ <TW_FrameMode>0</TW_FrameMode>
27
+ <TW_SamplingMode>0</TW_SamplingMode>
28
+ <TW_StartFrameIn>1</TW_StartFrameIn>
29
+ <TW_EndFrameIn>102</TW_EndFrameIn>
30
+ <TW_RenderMode>0</TW_RenderMode>
31
+ <TW_ReverseCurves>False</TW_ReverseCurves>
32
+ <TW_HeadMode>0</TW_HeadMode>
33
+ <TW_TailMode>0</TW_TailMode>
34
+ <TW_Regen>False</TW_Regen>
35
+ <TW_RetimerMode>1</TW_RetimerMode>
36
+ <TW_ReferencePointX>
37
+ <Channel Name="X"/>
38
+ </TW_ReferencePointX>
39
+ <TW_ReferencePointY>
40
+ <Channel Name="Y"/>
41
+ </TW_ReferencePointY>
42
+ <TW_Speed>
43
+ <Channel Name="Speed">
44
+ <Extrap>constant</Extrap>
45
+ <Value>100</Value>
46
+ <Size>1</Size>
47
+ <KeyVersion>2.000000</KeyVersion>
48
+ <KFrames>
49
+ <Key Index="0">
50
+ <Frame>1.000000</Frame>
51
+ <Value>100</Value>
52
+ <RHandleX>1.297667</RHandleX>
53
+ <RHandleY>100.000000</RHandleY>
54
+ <LHandleX>0.750000</LHandleX>
55
+ <LHandleY>100.000000</LHandleY>
56
+ <CurveMode>hermite</CurveMode>
57
+ <CurveOrder>linear</CurveOrder>
58
+ </Key>
59
+ </KFrames>
60
+ </Channel>
61
+ </TW_Speed>
62
+ <TW_SpeedTiming>
63
+ <Channel Name="SpeedTiming">
64
+ <Extrap>linear</Extrap>
65
+ <Value>1</Value>
66
+ <Size>1</Size>
67
+ <KeyVersion>2.000000</KeyVersion>
68
+ <KFrames>
69
+ <Key Index="0">
70
+ <Frame>1.000000</Frame>
71
+ <Value>1</Value>
72
+ <RHandleX>1.250000</RHandleX>
73
+ <RHandleY>1.250000</RHandleY>
74
+ <LHandleX>0.750000</LHandleX>
75
+ <LHandleY>0.750000</LHandleY>
76
+ <CurveMode>hermite</CurveMode>
77
+ <CurveOrder>quadratic</CurveOrder>
78
+ <RAutoSlope>False</RAutoSlope>
79
+ <LAutoSlope>False</LAutoSlope>
80
+ <TangentMode>manual</TangentMode>
81
+ </Key>
82
+ </KFrames>
83
+ </Channel>
84
+ </TW_SpeedTiming>
85
+ <TW_Timing>
86
+ <Channel Name="Timing">
87
+ <Extrap>linear</Extrap>
88
+ <Value>87.7692261</Value>
89
+ <Size>4</Size>
90
+ <KeyVersion>2.000000</KeyVersion>
91
+ <KFrames>
92
+ <Key Index="0">
93
+ <Frame>1.000000</Frame>
94
+ <Value>1</Value>
95
+ <RHandleX>8.666667</RHandleX>
96
+ <RHandleY>9.000000</RHandleY>
97
+ <LHandleX>0.750000</LHandleX>
98
+ <LHandleY>0.750000</LHandleY>
99
+ <CurveMode>hermite</CurveMode>
100
+ <CurveOrder>linear</CurveOrder>
101
+ </Key>
102
+ <Key Index="1">
103
+ <Frame>24.000000</Frame>
104
+ <Value>25</Value>
105
+ <RHandleX>32.666668</RHandleX>
106
+ <RHandleY>36.319729</RHandleY>
107
+ <LHandleX>16.333334</LHandleX>
108
+ <LHandleY>14.986395</LHandleY>
109
+ <CurveMode>hermite</CurveMode>
110
+ <CurveOrder>linear</CurveOrder>
111
+ </Key>
112
+ <Key Index="2">
113
+ <Frame>50.000000</Frame>
114
+ <Value>65</Value>
115
+ <RHandleX>67.333336</RHandleX>
116
+ <RHandleY>82.111107</RHandleY>
117
+ <LHandleX>41.333332</LHandleX>
118
+ <LHandleY>56.444447</LHandleY>
119
+ <CurveMode>hermite</CurveMode>
120
+ <CurveOrder>linear</CurveOrder>
121
+ </Key>
122
+ <Key Index="3">
123
+ <Frame>102.000000</Frame>
124
+ <Value>102</Value>
125
+ <RHandleX>135.666672</RHandleX>
126
+ <RHandleY>117.420235</RHandleY>
127
+ <LHandleX>68.333336</LHandleX>
128
+ <LHandleY>86.579773</LHandleY>
129
+ <CurveMode>hermite</CurveMode>
130
+ <CurveOrder>linear</CurveOrder>
131
+ </Key>
132
+ </KFrames>
133
+ </Channel>
134
+ </TW_Timing>
135
+ <TW_BlurSamplesChannel>
136
+ <Channel Name="Samples"/>
137
+ </TW_BlurSamplesChannel>
138
+ <TW_BlurShutterChannel>
139
+ <Channel Name="Shutter"/>
140
+ </TW_BlurShutterChannel>
141
+ <TW_Mix>
142
+ <Channel Name="MixAmount"/>
143
+ </TW_Mix>
144
+ <TW_PreTrail>
145
+ <Channel Name="Pre"/>
146
+ </TW_PreTrail>
147
+ <TW_PreWeight>
148
+ <Channel Name="Pre"/>
149
+ </TW_PreWeight>
150
+ <TW_PostTrail>
151
+ <Channel Name="Post"/>
152
+ </TW_PostTrail>
153
+ <TW_PostWeight>
154
+ <Channel Name="Post"/>
155
+ </TW_PostWeight>
156
+ </State>
157
+ </Setup>
@@ -0,0 +1 @@
1
+ <Setup><Base><Version>7.130000</Version><NAME>timewarp3</NAME><Note></Note><Expanded>False</Expanded><ScrollBar>0</ScrollBar><Frames>0</Frames><Current_Time>82</Current_Time><Input_DataType>3</Input_DataType><ClampMode>0</ClampMode><AdapDegrad>False</AdapDegrad></Base><State><TW_FlowQuality>4</TW_FlowQuality><TW_DoBlur>False</TW_DoBlur><TW_BlurPhase>0</TW_BlurPhase><TW_DoBlurReference>False</TW_DoBlurReference><TW_BlurRefColor><R>1.000000</R><G>0.000000</G><B>0.000000</B><A>1.000000</A></TW_BlurRefColor><TW_FrameMode>0</TW_FrameMode><TW_SamplingMode>0</TW_SamplingMode><TW_StartFrameIn>1</TW_StartFrameIn><TW_EndFrameIn>102</TW_EndFrameIn><TW_RenderMode>0</TW_RenderMode><TW_ReverseCurves>False</TW_ReverseCurves><TW_HeadMode>0</TW_HeadMode><TW_TailMode>0</TW_TailMode><TW_Regen>False</TW_Regen><TW_RetimerMode>1</TW_RetimerMode><TW_ReferencePointX><Channel Name="X"/></TW_ReferencePointX><TW_ReferencePointY><Channel Name="Y"/></TW_ReferencePointY><TW_Speed><Channel Name="Speed"><Extrap>constant</Extrap><Value>100</Value><Size>1</Size><KeyVersion>2.000000</KeyVersion><KFrames><Key Index="0"><Frame>1.000000</Frame><Value>100</Value><RHandleX>1.297667</RHandleX><RHandleY>100.000000</RHandleY><LHandleX>0.750000</LHandleX><LHandleY>100.000000</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key></KFrames></Channel></TW_Speed><TW_SpeedTiming><Channel Name="SpeedTiming"><Extrap>linear</Extrap><Value>1</Value><Size>1</Size><KeyVersion>2.000000</KeyVersion><KFrames><Key Index="0"><Frame>1.000000</Frame><Value>1</Value><RHandleX>1.250000</RHandleX><RHandleY>1.250000</RHandleY><LHandleX>0.750000</LHandleX><LHandleY>0.750000</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>quadratic</CurveOrder><RAutoSlope>False</RAutoSlope><LAutoSlope>False</LAutoSlope><TangentMode>manual</TangentMode></Key></KFrames></Channel></TW_SpeedTiming><TW_Timing><Channel Name="Timing"><Extrap>linear</Extrap><Value>87.7692261</Value><Size>4</Size><KeyVersion>2.000000</KeyVersion><KFrames><Key Index="0"><Frame>1.000000</Frame><Value>1</Value><RHandleX>8.666667</RHandleX><RHandleY>9.000000</RHandleY><LHandleX>0.750000</LHandleX><LHandleY>0.750000</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key><Key Index="1"><Frame>24.000000</Frame><Value>25</Value><RHandleX>32.666668</RHandleX><RHandleY>36.319729</RHandleY><LHandleX>16.333334</LHandleX><LHandleY>14.986395</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key><Key Index="2"><Frame>50.000000</Frame><Value>65</Value><RHandleX>67.333336</RHandleX><RHandleY>82.111107</RHandleY><LHandleX>41.333332</LHandleX><LHandleY>56.444447</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key><Key Index="3"><Frame>102.000000</Frame><Value>102</Value><RHandleX>135.666672</RHandleX><RHandleY>117.420235</RHandleY><LHandleX>68.333336</LHandleX><LHandleY>86.579773</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key></KFrames></Channel></TW_Timing><TW_BlurSamplesChannel><Channel Name="Samples"/></TW_BlurSamplesChannel><TW_BlurShutterChannel><Channel Name="Shutter"/></TW_BlurShutterChannel><TW_Mix><Channel Name="MixAmount"/></TW_Mix><TW_PreTrail><Channel Name="Pre"/></TW_PreTrail><TW_PreWeight><Channel Name="Pre"/></TW_PreWeight><TW_PostTrail><Channel Name="Post"/></TW_PostTrail><TW_PostWeight><Channel Name="Post"/></TW_PostWeight></State></Setup>
@@ -0,0 +1,22 @@
1
+ require "helper"
2
+
3
+ class TestBaseTimewarpWriter < Test::Unit::TestCase
4
+ def test_with_each_writer
5
+ pack = []
6
+ FlameChannelParser::FramecurveWriters::Base.with_each_writer do | w |
7
+ pack.push(w)
8
+ end
9
+ assert_equal [FlameChannelParser::FramecurveWriters::SoftfxTimewarp,
10
+ FlameChannelParser::FramecurveWriters::BatchTimewarp,
11
+ FlameChannelParser::FramecurveWriters::Kronos], pack
12
+ end
13
+
14
+ def test_write_from_framecurve
15
+ c = Framecurve::Curve.new(Framecurve::Tuple.new(10, 123.45), Framecurve::Tuple.new(15, 456.78))
16
+ b = FlameChannelParser::FramecurveWriters::Base.new
17
+ buf = StringIO.new
18
+ b.run_export_from_framecurve(buf, c)
19
+ assert_equal "10 123.45000\n11 190.11600\n12 256.78200\n13 323.44800\n14 390.11400\n15 456.78000\n", buf.string
20
+ end
21
+
22
+ end
@@ -0,0 +1,18 @@
1
+ require "helper"
2
+
3
+ class TestBatchTimewarpWriter < Test::Unit::TestCase
4
+ def test_simple_export
5
+ buf = StringIO.new
6
+ w = FlameChannelParser::FramecurveWriters::BatchTimewarp.new
7
+ w.run_export(buf) do | key_writer |
8
+ key_writer.key(1, 15)
9
+ key_writer.key(15, 50)
10
+ key_writer.key(19, 102)
11
+ end
12
+
13
+ File.open(File.dirname(__FILE__) + "/timewarp_export_samples/BatchTW.timewarp_node", "wb"){|f| f.write(buf.string) }
14
+
15
+ assert_same_buffer File.open(File.dirname(__FILE__) + "/timewarp_export_samples/BatchTW.timewarp_node"), buf
16
+ end
17
+
18
+ end
@@ -1,5 +1,4 @@
1
- require "test/unit"
2
- require File.dirname(__FILE__) + "/../lib/flame_channel_parser"
1
+ require "helper"
3
2
 
4
3
  D = 0.001
5
4