trecs 0.0.3 → 0.0.4
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.
- checksums.yaml +5 -13
- data/Gemfile.lock +13 -1
- data/bin/trecs_message +4 -0
- data/lib/trecs/player.rb +128 -0
- data/lib/trecs/recorder.rb +59 -0
- data/lib/trecs/recording_strategies/custom_strategy.rb +5 -0
- data/lib/trecs/recording_strategies/hash_strategy.rb +17 -0
- data/lib/{recording_strategies/incremental_recording_strategy.rb → trecs/recording_strategies/incremental_strategy.rb} +4 -3
- data/lib/trecs/recording_strategies/raw_file_strategy.rb +54 -0
- data/lib/{recording_strategies → trecs/recording_strategies}/ttyrec_recording_strategy.rb +0 -0
- data/lib/{screens → trecs/screens}/terminal_screen.rb +0 -0
- data/lib/trecs/version.rb +1 -1
- data/lib/trecs/writers/in_memory_writer.rb +17 -0
- data/lib/{recorders/zip_file_recorder.rb → trecs/writers/zip_file_writer.rb} +9 -7
- data/lib/trecs.rb +3 -0
- data/{spec → old_specs}/player_spec.rb +0 -0
- data/{spec → old_specs/recorders}/zip_file_recorder_spec.rb +11 -5
- data/{spec → old_specs}/timestamps_spec.rb +0 -0
- data/{spec → old_specs}/trecs_message_spec.rb +0 -0
- data/{spec → old_specs}/trecs_spec.rb +0 -0
- data/pkg/trecs-0.0.3.gem +0 -0
- data/spec/spec_helper.rb +90 -20
- data/spec/trecs/player_spec.rb +76 -0
- data/spec/trecs/recorder_spec.rb +227 -0
- data/spec/trecs/recording_strategies/incremental_strategy_spec.rb +43 -0
- data/spec/trecs/recording_strategies/raw_file_strategy_spec.rb +66 -0
- data/spec/trecs/writers/in_memory_writer_spec.rb +45 -0
- data/trecs.gemspec +4 -1
- metadata +78 -41
- data/lib/player.rb +0 -76
- data/lib/recorder.rb +0 -74
- data/lib/recording_strategies/raw_file_recording_strategy.rb +0 -42
- data/spec/recorder_spec.rb +0 -249
data/lib/player.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
require "timestamps"
|
2
|
-
require "screens/terminal_screen"
|
3
|
-
|
4
|
-
module TRecs
|
5
|
-
class Player
|
6
|
-
attr_reader :output
|
7
|
-
|
8
|
-
def initialize(options={})
|
9
|
-
time = options.fetch(:time) { nil }
|
10
|
-
@current_time = time
|
11
|
-
@step = options.fetch(:step) { 100 }
|
12
|
-
@output = options.fetch(:output) { TerminalScreen.new }
|
13
|
-
@testing = options.fetch(:testing) { false }
|
14
|
-
@ticks = time ? Array(time.to_i) : ticks
|
15
|
-
end
|
16
|
-
|
17
|
-
def play
|
18
|
-
ticks.each do |time|
|
19
|
-
play_frame(time)
|
20
|
-
sleep(sleep_time) unless testing
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def tick(time=current_time)
|
25
|
-
self.current_time = time
|
26
|
-
get_frame(time)
|
27
|
-
end
|
28
|
-
|
29
|
-
def timestamps
|
30
|
-
@timestamps ||= get_timestamps.sort
|
31
|
-
end
|
32
|
-
|
33
|
-
def generate_ticks
|
34
|
-
ticks = [0]
|
35
|
-
curr = 0
|
36
|
-
while(curr < timestamps.last.to_i)
|
37
|
-
curr += step
|
38
|
-
ticks << curr
|
39
|
-
end
|
40
|
-
ticks
|
41
|
-
end
|
42
|
-
|
43
|
-
def ticks
|
44
|
-
@ticks ||= generate_ticks
|
45
|
-
end
|
46
|
-
|
47
|
-
def play_frame(time)
|
48
|
-
output.clear
|
49
|
-
output.puts tick(time_at(time))
|
50
|
-
end
|
51
|
-
|
52
|
-
def time_at(time)
|
53
|
-
Timestamps.new(timestamps).time_at(time)
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
attr_accessor :current_time
|
58
|
-
attr_reader :step
|
59
|
-
attr_reader :testing
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
def get_timestamps
|
64
|
-
[]
|
65
|
-
end
|
66
|
-
|
67
|
-
def get_frame(time)
|
68
|
-
""
|
69
|
-
end
|
70
|
-
|
71
|
-
def sleep_time
|
72
|
-
# TODO: Fix this to use the current time
|
73
|
-
@sleep_time ||= (step/1000.0)*0.8
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
data/lib/recorder.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
module TRecs
|
2
|
-
class Recorder
|
3
|
-
attr_writer :current_time
|
4
|
-
attr_reader :step
|
5
|
-
|
6
|
-
def initialize(options={})
|
7
|
-
@step = options.fetch(:step) { 100 }
|
8
|
-
end
|
9
|
-
|
10
|
-
def next_timestamp
|
11
|
-
@current_time = -step unless @current_time
|
12
|
-
@current_time += step
|
13
|
-
end
|
14
|
-
|
15
|
-
def current_time(time=nil)
|
16
|
-
if time
|
17
|
-
@current_time = time
|
18
|
-
end
|
19
|
-
@current_time
|
20
|
-
end
|
21
|
-
|
22
|
-
def current_content(content=nil)
|
23
|
-
if content
|
24
|
-
@current_content = content
|
25
|
-
end
|
26
|
-
@current_content
|
27
|
-
end
|
28
|
-
|
29
|
-
def current_frame(options={})
|
30
|
-
time = options.fetch(:time) { next_timestamp }
|
31
|
-
content = options.fetch(:content)
|
32
|
-
current_time(time)
|
33
|
-
current_content(content)
|
34
|
-
|
35
|
-
if previous_content != content
|
36
|
-
create_frame
|
37
|
-
self.previous_content = content
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def record
|
42
|
-
start
|
43
|
-
perform_recording
|
44
|
-
finish
|
45
|
-
end
|
46
|
-
|
47
|
-
def stop
|
48
|
-
recording_strategy.stop
|
49
|
-
end
|
50
|
-
|
51
|
-
private
|
52
|
-
attr_accessor :recording
|
53
|
-
attr_accessor :previous_content
|
54
|
-
attr_reader :recording_strategy
|
55
|
-
|
56
|
-
def start
|
57
|
-
self.current_time = nil
|
58
|
-
self.recording = true
|
59
|
-
setup
|
60
|
-
end
|
61
|
-
|
62
|
-
def finish
|
63
|
-
render
|
64
|
-
self.recording = false
|
65
|
-
end
|
66
|
-
|
67
|
-
def create_frame
|
68
|
-
end
|
69
|
-
|
70
|
-
def perform_recording
|
71
|
-
recording_strategy.perform
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require "recording_strategy"
|
2
|
-
module TRecs
|
3
|
-
class RawFileRecordingStrategy < RecordingStrategy
|
4
|
-
def initialize(options)
|
5
|
-
file = options.fetch(:file)
|
6
|
-
raise "File does not exist: #{file}" unless File.exist?(file)
|
7
|
-
@file = File.new(file)
|
8
|
-
|
9
|
-
@height = options.fetch(:height) { 24 }
|
10
|
-
@width = options.fetch(:width) { 80 }
|
11
|
-
@step = options.fetch(:step) { 100 }
|
12
|
-
|
13
|
-
super
|
14
|
-
end
|
15
|
-
|
16
|
-
def perform
|
17
|
-
@recording = true
|
18
|
-
start_time = Time.now
|
19
|
-
|
20
|
-
while @recording
|
21
|
-
time = timestamp(Time.now - start_time)
|
22
|
-
content = File.read(@file)
|
23
|
-
recorder.current_frame(time: time, content: content)
|
24
|
-
sleep(sleep_time)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def stop
|
29
|
-
@recording = false
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
def sleep_time
|
34
|
-
# TODO: Fix this to use the current time
|
35
|
-
@sleep_time ||= (@step/1000.0)
|
36
|
-
end
|
37
|
-
|
38
|
-
def timestamp(time)
|
39
|
-
(time * 1000).to_i
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/spec/recorder_spec.rb
DELETED
@@ -1,249 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
require "recorders/message_recorder"
|
4
|
-
|
5
|
-
module TRecs
|
6
|
-
describe Recorder do
|
7
|
-
class DummyRecorder < Recorder
|
8
|
-
attr_reader :result
|
9
|
-
|
10
|
-
def initialize(options={})
|
11
|
-
frames = options.fetch(:frames) { nil }
|
12
|
-
@frames = frames.is_a?(Hash) ? frames : Array(frames)
|
13
|
-
super
|
14
|
-
end
|
15
|
-
|
16
|
-
def perform_recording
|
17
|
-
if @frames.is_a?(Hash)
|
18
|
-
@frames.each do |time, content|
|
19
|
-
current_frame(time: time, content: content)
|
20
|
-
end
|
21
|
-
else
|
22
|
-
@frames.each do |content|
|
23
|
-
current_frame(content: content)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def create_frame
|
29
|
-
@result[current_time] = current_content
|
30
|
-
end
|
31
|
-
|
32
|
-
def setup
|
33
|
-
@result = {}
|
34
|
-
end
|
35
|
-
|
36
|
-
def render
|
37
|
-
# no-op
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context "recording" do
|
42
|
-
context "with custom timestamps" do
|
43
|
-
it "records a one frame trecs" do
|
44
|
-
rec = DummyRecorder.new frames: {0 => "a"}
|
45
|
-
rec.record
|
46
|
-
|
47
|
-
rec.result.should == {0 => "a"}
|
48
|
-
end
|
49
|
-
|
50
|
-
it "records a two frames trecs" do
|
51
|
-
rec = DummyRecorder.new frames: {
|
52
|
-
0 => "a",
|
53
|
-
100 => "b"
|
54
|
-
}
|
55
|
-
rec.record
|
56
|
-
|
57
|
-
rec.result.should == {
|
58
|
-
0 => "a",
|
59
|
-
100 => "b"
|
60
|
-
}
|
61
|
-
end
|
62
|
-
|
63
|
-
it "records a three frames trecs" do
|
64
|
-
rec = DummyRecorder.new frames: {
|
65
|
-
0 => "a",
|
66
|
-
100 => "b",
|
67
|
-
150 => "c"
|
68
|
-
}
|
69
|
-
rec.record
|
70
|
-
|
71
|
-
rec.result.should == {
|
72
|
-
0 => "a",
|
73
|
-
100 => "b",
|
74
|
-
150 => "c"
|
75
|
-
}
|
76
|
-
end
|
77
|
-
|
78
|
-
it "calls start_recording" do
|
79
|
-
rec = DummyRecorder.new
|
80
|
-
rec.should_receive(:setup)
|
81
|
-
|
82
|
-
rec.record
|
83
|
-
end
|
84
|
-
|
85
|
-
it "calls finish_recording" do
|
86
|
-
rec = DummyRecorder.new
|
87
|
-
rec.should_receive(:render)
|
88
|
-
|
89
|
-
rec.record
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|
93
|
-
|
94
|
-
context "with custom timestamps" do
|
95
|
-
it "records a one frame trecs" do
|
96
|
-
rec = DummyRecorder.new frames: ["a"]
|
97
|
-
rec.record
|
98
|
-
|
99
|
-
rec.result.should == {0 => "a"}
|
100
|
-
end
|
101
|
-
|
102
|
-
it "records a two frames trecs" do
|
103
|
-
rec = DummyRecorder.new frames: ["a", "b"]
|
104
|
-
rec.record
|
105
|
-
|
106
|
-
rec.result.should == {
|
107
|
-
0 => "a",
|
108
|
-
100 => "b"
|
109
|
-
}
|
110
|
-
end
|
111
|
-
|
112
|
-
it "records a three frames trecs" do
|
113
|
-
rec = DummyRecorder.new frames: ["a", "b", "c"]
|
114
|
-
rec.record
|
115
|
-
|
116
|
-
rec.result.should == {
|
117
|
-
0 => "a",
|
118
|
-
100 => "b",
|
119
|
-
200 => "c"
|
120
|
-
}
|
121
|
-
end
|
122
|
-
|
123
|
-
it "records a three frames trecs" do
|
124
|
-
rec = DummyRecorder.new frames: ["a", "b", "c"], step: 75
|
125
|
-
rec.record
|
126
|
-
|
127
|
-
rec.result.should == {
|
128
|
-
0 => "a",
|
129
|
-
75 => "b",
|
130
|
-
150 => "c"
|
131
|
-
}
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
context "sanitizing the recording" do
|
136
|
-
it "records a three frames trecs" do
|
137
|
-
rec = DummyRecorder.new frames: {
|
138
|
-
0 => "a",
|
139
|
-
50 => "b",
|
140
|
-
100 => "b",
|
141
|
-
150 => "c",
|
142
|
-
}
|
143
|
-
rec.record
|
144
|
-
|
145
|
-
rec.result.should == {
|
146
|
-
0 => "a",
|
147
|
-
50 => "b",
|
148
|
-
150 => "c",
|
149
|
-
}
|
150
|
-
end
|
151
|
-
|
152
|
-
it "records a three frames trecs" do
|
153
|
-
rec = DummyRecorder.new frames: {
|
154
|
-
0 => "a",
|
155
|
-
50 => "a",
|
156
|
-
100 => "b",
|
157
|
-
150 => "c",
|
158
|
-
}
|
159
|
-
rec.record
|
160
|
-
|
161
|
-
rec.result.should == {
|
162
|
-
0 => "a",
|
163
|
-
100 => "b",
|
164
|
-
150 => "c",
|
165
|
-
}
|
166
|
-
end
|
167
|
-
|
168
|
-
it "records a three frames trecs" do
|
169
|
-
rec = DummyRecorder.new frames: {
|
170
|
-
0 => "a",
|
171
|
-
50 => "b",
|
172
|
-
100 => "c",
|
173
|
-
150 => "c",
|
174
|
-
}
|
175
|
-
rec.record
|
176
|
-
|
177
|
-
rec.result.should == {
|
178
|
-
0 => "a",
|
179
|
-
50 => "b",
|
180
|
-
100 => "c",
|
181
|
-
}
|
182
|
-
end
|
183
|
-
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
|
188
|
-
context "timestamps" do
|
189
|
-
it "starts with 0 as the current time" do
|
190
|
-
rec = Recorder.new
|
191
|
-
|
192
|
-
rec.current_time.should == nil
|
193
|
-
end
|
194
|
-
|
195
|
-
it "calculates the next timestamp" do
|
196
|
-
rec = Recorder.new(step: 100)
|
197
|
-
|
198
|
-
rec.next_timestamp.should == 0
|
199
|
-
rec.current_time.should == 0
|
200
|
-
end
|
201
|
-
|
202
|
-
it "calculates the second next timestamp" do
|
203
|
-
rec = Recorder.new(step: 100)
|
204
|
-
|
205
|
-
rec.next_timestamp
|
206
|
-
rec.next_timestamp.should == 100
|
207
|
-
rec.current_time.should == 100
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
describe "#current_time" do
|
212
|
-
it "sets the current time" do
|
213
|
-
rec = Recorder.new
|
214
|
-
|
215
|
-
rec.current_time(40)
|
216
|
-
|
217
|
-
rec.current_time.should == 40
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
describe "#current_content" do
|
222
|
-
it "sets the current time" do
|
223
|
-
rec = Recorder.new
|
224
|
-
|
225
|
-
rec.current_content("HELLO")
|
226
|
-
|
227
|
-
rec.current_content.should == "HELLO"
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
describe "#current_frame" do
|
232
|
-
it "sets the current time and content" do
|
233
|
-
rec = Recorder.new
|
234
|
-
|
235
|
-
rec.current_frame(time: 40, content: "HELLO")
|
236
|
-
|
237
|
-
rec.current_time.should == 40
|
238
|
-
rec.current_content.should == "HELLO"
|
239
|
-
end
|
240
|
-
|
241
|
-
it "sets the current time and content" do
|
242
|
-
rec = Recorder.new()
|
243
|
-
rec.should_receive(:create_frame)
|
244
|
-
|
245
|
-
rec.current_frame(time: 40, content: "HELLO")
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
249
|
-
end
|