trecs 0.1.8 → 0.1.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -2
- data/Gemfile.lock +1 -1
- data/README.org +6 -6
- data/bin/trecs +5 -1
- data/bin/trecs_record +2 -1
- data/lib/trecs/readers/json_reader.rb +1 -1
- data/lib/trecs/recorder.rb +4 -1
- data/lib/trecs/recording_strategies/raw_file_strategy.rb +1 -1
- data/lib/trecs/recording_strategies/strategy.rb +1 -1
- data/lib/trecs/recording_strategies/tmux_session_strategy.rb +57 -0
- data/lib/trecs/tickers/clock_ticker.rb +52 -0
- data/lib/trecs/version.rb +1 -1
- data/spec/trecs/player_spec.rb +2 -3
- data/spec/trecs/readers/json_reader_spec.rb +8 -0
- data/spec/trecs/readers/yaml_store_reader_spec.rb +8 -0
- data/spec/trecs/recorder_spec.rb +43 -20
- data/spec/trecs/tickers/clock_ticker_spec.rb +204 -0
- metadata +10 -9
- data/lib/players/zip_file_player.rb +0 -56
- data/lib/recorders/message_recorder.rb +0 -18
- data/lib/recorders/raw_file_recorder.rb +0 -20
- data/lib/recorders/ttyrec_recorder.rb +0 -20
- data/lib/recording_strategy.rb +0 -10
- data/lib/timestamps.rb +0 -22
- data/lib/trecs/tickers/ticker.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85b986835b557733be0281419b97267c135835d7
|
4
|
+
data.tar.gz: 832eed9640a038f96ecdaeb8eec94f48b2b6a165
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13e2d53be38305a06433479bd86a9c22a6801227648a1a23abf142c4b59796246ea5b3599e5f09353fc6b4ec53a2a76f3f41a55bd93b41e9b9e59ca7fb76d61b
|
7
|
+
data.tar.gz: 1f253c8af422baa7b4a49602053908fb30afe189a7a398c861f59b6c9ab3860110d2b8e72f9248aac87a9775c654834084d17f011484611551caf993ff54a7ec
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.org
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
* T-Recs
|
2
|
-
|
2
|
+
|
3
3
|
[[https://travis-ci.org/iachettifederico/trecs][Build State]] [[https://travis-ci.org/iachettifederico/trecs.svg]]
|
4
4
|
|
5
5
|
#+BEGIN_EXAMPLE
|
@@ -13,8 +13,8 @@
|
|
13
13
|
/\ _| ===E
|
14
14
|
\ \___| |
|
15
15
|
\___ /
|
16
|
-
_____ ____ _/
|
17
|
-
|_ _| _ \ ___ ___ ___
|
16
|
+
_____ ____ _/
|
17
|
+
|_ _| _ \ ___ ___ ___
|
18
18
|
| | | |_) / _ \/ __/ __|
|
19
19
|
| | | _ < __/ (__\__ \
|
20
20
|
|_| |_| \_\___|\___|___/
|
@@ -114,7 +114,7 @@ Where =<frame>= will be eplaced by the frame contents inside double quotes
|
|
114
114
|
|
115
115
|
And these are the generated frames with its corresponding commands:
|
116
116
|
|
117
|
-
- 0 millis ::
|
117
|
+
- 0 millis ::
|
118
118
|
- frame ::
|
119
119
|
#+BEGIN_SRC bash
|
120
120
|
0
|
@@ -150,7 +150,7 @@ And these are the generated frames with its corresponding commands:
|
|
150
150
|
#+BEGIN_EXAMPLE
|
151
151
|
echo "TRe" | wc -c
|
152
152
|
#+END_EXAMPLE
|
153
|
-
- 200 millis ::
|
153
|
+
- 200 millis ::
|
154
154
|
- frame ::
|
155
155
|
#+BEGIN_SRC bash
|
156
156
|
4
|
@@ -178,7 +178,7 @@ Right now, you can extend TRecs in three possible ways
|
|
178
178
|
|
179
179
|
- Recording Strategies :: This is the object that defines what to record and how to process the input to be converted into frames. To give an example, the IncrementalStrategy (provided by TRecs), will take an input string, make an array with each of it's characters and, for each char, append it to an output string and save the frame.
|
180
180
|
- Formats :: The format corresponds to the way the frames are stored. For example, using YamlStore, a tar file or a database.
|
181
|
-
- Tickers :: The Ticker is the way the user tells TRecs to advance frames.
|
181
|
+
- Tickers :: The Ticker is the way the user tells TRecs to advance frames.
|
182
182
|
|
183
183
|
# *** TODO Recording Strategies
|
184
184
|
# *** TODO Formats
|
data/bin/trecs
CHANGED
@@ -11,7 +11,11 @@ opts = Trollop::options do
|
|
11
11
|
|
12
12
|
opt :step, "Time in ms between frames", short: 's', default: 100
|
13
13
|
opt :format, "File format", type: String, default: "json"
|
14
|
-
opt :ticker, "Ticker", type: String, default: ""
|
14
|
+
opt :ticker, "Ticker", type: String, default: "clock"
|
15
|
+
|
16
|
+
opt :from, "Play from", type: Integer, default: 0
|
17
|
+
opt :to, "Play to", type: Integer, default: 0
|
18
|
+
opt :speed, "Playinx speed", type: Integer, default: 1
|
15
19
|
|
16
20
|
opt :ticker_file, "File to watch", type: String, default: "/tmp/ticker"
|
17
21
|
|
data/bin/trecs_record
CHANGED
@@ -15,9 +15,10 @@ opts = Trollop::options do
|
|
15
15
|
|
16
16
|
opt :message, "Message to record", type: String, default: "TRecs!"
|
17
17
|
opt :width, "Width", type: Integer, default: 10
|
18
|
-
opt :command, "Command" ,
|
18
|
+
opt :command, "Command" , short: "c", type: String
|
19
19
|
opt :input_file, "File to record", type: String, default: ""
|
20
20
|
opt :terminal, "Launch terminal", default: true
|
21
|
+
opt :color, "Record colors", default: true
|
21
22
|
|
22
23
|
opt :audio, "Record audio", type: String
|
23
24
|
|
data/lib/trecs/recorder.rb
CHANGED
@@ -3,6 +3,7 @@ module TRecs
|
|
3
3
|
attr_reader :writer
|
4
4
|
attr_reader :strategy
|
5
5
|
attr_reader :step
|
6
|
+
attr_reader :offset
|
6
7
|
attr_reader :recording
|
7
8
|
attr_reader :current_time
|
8
9
|
attr_reader :current_content
|
@@ -16,6 +17,7 @@ module TRecs
|
|
16
17
|
@strategy.recorder = self
|
17
18
|
|
18
19
|
@step = options.fetch(:step) { 100 }
|
20
|
+
@offset = options.fetch(:offset) { 0 }
|
19
21
|
@recording = false
|
20
22
|
@current_time = nil
|
21
23
|
end
|
@@ -36,7 +38,8 @@ module TRecs
|
|
36
38
|
@current_content = content
|
37
39
|
|
38
40
|
if @previous_content != content
|
39
|
-
|
41
|
+
new_current_time = current_time + offset
|
42
|
+
writer.create_frame(time: new_current_time, content: current_content)
|
40
43
|
@previous_content = content
|
41
44
|
end
|
42
45
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "recording_strategies/strategy"
|
2
|
+
module TRecs
|
3
|
+
class TmuxSessionStrategy
|
4
|
+
include Strategy
|
5
|
+
attr_reader :recording
|
6
|
+
attr_reader :step
|
7
|
+
|
8
|
+
def initialize(options={})
|
9
|
+
@frames = []
|
10
|
+
@step = options.fetch(:step) { 100 } / 1000.0
|
11
|
+
@color = options.fetch(:color) { true }
|
12
|
+
set_color_or_bw
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform
|
16
|
+
start_recording
|
17
|
+
while(recording)
|
18
|
+
get_frames do |frame|
|
19
|
+
recorder.current_frame(content: frame)
|
20
|
+
end
|
21
|
+
sleep(step)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def command
|
27
|
+
@command ||=
|
28
|
+
set_command
|
29
|
+
end
|
30
|
+
|
31
|
+
def stop
|
32
|
+
@recording = false
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def start_recording
|
37
|
+
@recording = true
|
38
|
+
end
|
39
|
+
|
40
|
+
def set_color_or_bw
|
41
|
+
@color = @color ? "-e" : "-C"
|
42
|
+
end
|
43
|
+
|
44
|
+
def set_command
|
45
|
+
command = %W[tmux capture-pane]
|
46
|
+
command << @color if @color
|
47
|
+
command
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_frames
|
51
|
+
system *command
|
52
|
+
IO.popen(%W[tmux show-buffer]) do |out|
|
53
|
+
yield out.read
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module TRecs
|
2
|
+
class ClockTicker
|
3
|
+
attr_accessor :player
|
4
|
+
attr_reader :delayer
|
5
|
+
attr_reader :from
|
6
|
+
attr_reader :to
|
7
|
+
attr_reader :speed
|
8
|
+
|
9
|
+
def initialize(options={})
|
10
|
+
@delayer = options.fetch(:delayer) { Kernel }
|
11
|
+
@timestamps = options.fetch(:timestamps) { nil }
|
12
|
+
@from = options.fetch(:from) { nil }
|
13
|
+
@to = options.fetch(:to) { nil }
|
14
|
+
@speed = options.fetch(:speed) { 1 }
|
15
|
+
end
|
16
|
+
|
17
|
+
def start
|
18
|
+
prev_time = timestamps.first
|
19
|
+
timestamps.each do |time|
|
20
|
+
player.tick(time)
|
21
|
+
sleep(time - prev_time)
|
22
|
+
prev_time = time
|
23
|
+
end
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
def timestamps
|
28
|
+
@timestamps ||= player.timestamps
|
29
|
+
if from
|
30
|
+
@timestamps = @timestamps.select { |t| t > from }
|
31
|
+
@timestamps.unshift(from)
|
32
|
+
end
|
33
|
+
if to && to > 0
|
34
|
+
@timestamps = @timestamps.select { |t| t < to }
|
35
|
+
@timestamps.push(to)
|
36
|
+
end
|
37
|
+
@timestamps
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
"<#{self.class}>"
|
42
|
+
end
|
43
|
+
alias :inspect :to_s
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def sleep(time)
|
48
|
+
sleep_time = time / (1000.0 * speed)
|
49
|
+
delayer.sleep(sleep_time)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/trecs/version.rb
CHANGED
data/spec/trecs/player_spec.rb
CHANGED
@@ -23,7 +23,7 @@ module TRecs
|
|
23
23
|
Then { player.ticker == ticker }
|
24
24
|
Then { ticker.player == player}
|
25
25
|
|
26
|
-
Then { player.step
|
26
|
+
Then { player.step == 100}
|
27
27
|
Then { player.screen == screen}
|
28
28
|
end
|
29
29
|
|
@@ -37,7 +37,7 @@ module TRecs
|
|
37
37
|
|
38
38
|
When { player.play }
|
39
39
|
|
40
|
-
Then { Spy.calls[1] == ["reader", :setup,
|
40
|
+
Then { Spy.calls[1] == ["reader", :setup, []] }
|
41
41
|
Then { Spy.calls[2] == ["ticker", :start, []] }
|
42
42
|
end
|
43
43
|
|
@@ -104,7 +104,6 @@ module TRecs
|
|
104
104
|
|
105
105
|
Then { player.time_to_play(1000) == 200 }
|
106
106
|
Then { player.tick(1000) == "c" }
|
107
|
-
|
108
107
|
end
|
109
108
|
end
|
110
109
|
end
|
data/spec/trecs/recorder_spec.rb
CHANGED
@@ -128,32 +128,14 @@ module TRecs
|
|
128
128
|
}
|
129
129
|
|
130
130
|
context "setting current frame and time with content duplicates" do
|
131
|
-
When
|
132
|
-
result = []
|
131
|
+
When {
|
133
132
|
strategy.action = -> {
|
134
133
|
recorder.current_frame(time: 10, content: "CONTENT")
|
135
|
-
result << {
|
136
|
-
time: recorder.current_time,
|
137
|
-
content: recorder.current_content,
|
138
|
-
}
|
139
134
|
recorder.current_frame(time: 15, content: "CONTENT 2")
|
140
|
-
result << {
|
141
|
-
time: recorder.current_time,
|
142
|
-
content: recorder.current_content,
|
143
|
-
}
|
144
135
|
recorder.current_frame(time: 20, content: "CONTENT 2")
|
145
|
-
result << {
|
146
|
-
time: recorder.current_time,
|
147
|
-
content: recorder.current_content,
|
148
|
-
}
|
149
136
|
recorder.current_frame(time: 25, content: "CONTENT 3")
|
150
|
-
result << {
|
151
|
-
time: recorder.current_time,
|
152
|
-
content: recorder.current_content,
|
153
|
-
}
|
154
137
|
}
|
155
138
|
recorder.record
|
156
|
-
result
|
157
139
|
}
|
158
140
|
|
159
141
|
Then {
|
@@ -207,7 +189,7 @@ module TRecs
|
|
207
189
|
end
|
208
190
|
end
|
209
191
|
|
210
|
-
context "#
|
192
|
+
context "#stop" do
|
211
193
|
Given { Spy.clear }
|
212
194
|
Given(:writer) { OpenStruct.new }
|
213
195
|
Given(:strategy) { Spy.new("strategy").ignore(:recorder=) }
|
@@ -223,5 +205,46 @@ module TRecs
|
|
223
205
|
|
224
206
|
Then { strategy.calls[1] == [:stop, []] }
|
225
207
|
end
|
208
|
+
|
209
|
+
context "Offset" do
|
210
|
+
Given { Spy.clear }
|
211
|
+
Given(:writer) { Spy.new("Writer").ignore(:recorder=, :setup, :render) }
|
212
|
+
Given(:strategy) { CustomStrategy.new }
|
213
|
+
|
214
|
+
Given(:recorder) {
|
215
|
+
Recorder.new(writer: writer, strategy: strategy, offset: 7)
|
216
|
+
}
|
217
|
+
|
218
|
+
context "setting current frame and time with content duplicates" do
|
219
|
+
When {
|
220
|
+
strategy.action = -> {
|
221
|
+
recorder.current_frame(time: 0, content: "CONTENT")
|
222
|
+
recorder.current_frame(time: 10, content: "CONTENT 2")
|
223
|
+
recorder.current_frame(time: 12, content: "CONTENT 3")
|
224
|
+
}
|
225
|
+
recorder.record
|
226
|
+
}
|
227
|
+
|
228
|
+
Then {
|
229
|
+
writer.calls[1] == [
|
230
|
+
:create_frame,
|
231
|
+
[ { time: 7, content: "CONTENT" } ]
|
232
|
+
]
|
233
|
+
}
|
234
|
+
Then {
|
235
|
+
writer.calls[2] == [
|
236
|
+
:create_frame,
|
237
|
+
[ { time: 17, content: "CONTENT 2" } ]
|
238
|
+
]
|
239
|
+
}
|
240
|
+
Then {
|
241
|
+
writer.calls[3] == [
|
242
|
+
:create_frame,
|
243
|
+
[ { time: 19, content: "CONTENT 3" } ]
|
244
|
+
]
|
245
|
+
}
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|
226
249
|
end
|
227
250
|
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "tickers/clock_ticker"
|
3
|
+
|
4
|
+
module TRecs
|
5
|
+
class DummyDelayer
|
6
|
+
def sleep(*)
|
7
|
+
end
|
8
|
+
def self.sleep(*)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module TRecs
|
14
|
+
describe ClockTicker do
|
15
|
+
context "player" do
|
16
|
+
Given(:ticker) {
|
17
|
+
ClockTicker.new
|
18
|
+
}
|
19
|
+
Given(:player) { Object.new }
|
20
|
+
When { ticker.player = player }
|
21
|
+
Then { ticker.player == player }
|
22
|
+
end
|
23
|
+
|
24
|
+
context "#delayer" do
|
25
|
+
context "constructor" do
|
26
|
+
Given(:delayer) { Object.new }
|
27
|
+
Given(:ticker) { ClockTicker.new(delayer: delayer) }
|
28
|
+
Then { ticker.delayer == delayer }
|
29
|
+
end
|
30
|
+
|
31
|
+
context "default" do
|
32
|
+
Given(:ticker) { ClockTicker.new }
|
33
|
+
Then { ticker.delayer == Kernel }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "timestamps" do
|
38
|
+
context "from player by default" do
|
39
|
+
|
40
|
+
Given(:timestamps) { [1, 2, 3] }
|
41
|
+
Given(:player) { OpenStruct.new(timestamps: timestamps) }
|
42
|
+
|
43
|
+
Given(:ticker) { ClockTicker.new }
|
44
|
+
|
45
|
+
When { ticker.player = player }
|
46
|
+
|
47
|
+
Then { ticker.timestamps == timestamps }
|
48
|
+
end
|
49
|
+
|
50
|
+
context "force" do
|
51
|
+
Given(:timestamps) { [10, 20, 30] }
|
52
|
+
Given(:player) { Object.new }
|
53
|
+
|
54
|
+
Given(:ticker) { ClockTicker.new(timestamps: timestamps) }
|
55
|
+
|
56
|
+
When { ticker.player = player }
|
57
|
+
|
58
|
+
Then { ticker.timestamps == timestamps }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "ticking" do
|
63
|
+
Given(:delayer) { Spy.new(:delayer) }
|
64
|
+
Given(:player) { Spy.new(:player) }
|
65
|
+
Given(:ticker) { ClockTicker.new(delayer: delayer, timestamps: [0, 10, 30, 60, 160]) }
|
66
|
+
|
67
|
+
When { ticker.player = player }
|
68
|
+
When { ticker.start }
|
69
|
+
|
70
|
+
context "player" do
|
71
|
+
Then { player.calls[1] == [:tick, [0]] }
|
72
|
+
Then { player.calls[2] == [:tick, [10]] }
|
73
|
+
Then { player.calls[3] == [:tick, [30]] }
|
74
|
+
Then { player.calls[4] == [:tick, [60]] }
|
75
|
+
Then { player.calls[5] == [:tick, [160]] }
|
76
|
+
end
|
77
|
+
|
78
|
+
context "delayer" do
|
79
|
+
Then { delayer.calls[1] == [:sleep, [0]] }
|
80
|
+
Then { delayer.calls[2] == [:sleep, [0.01]] }
|
81
|
+
Then { delayer.calls[3] == [:sleep, [0.02]] }
|
82
|
+
Then { delayer.calls[4] == [:sleep, [0.03]] }
|
83
|
+
Then { delayer.calls[5] == [:sleep, [0.1]] }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "#from and #to" do
|
88
|
+
Given(:player) { Object.new }
|
89
|
+
|
90
|
+
When { ticker.player = player }
|
91
|
+
|
92
|
+
context "#from" do
|
93
|
+
context "exact" do
|
94
|
+
Given(:ticker) { ClockTicker.new(from: 20, timestamps: [0, 10, 20, 30, 40]) }
|
95
|
+
Then { ticker.timestamps == [20, 30, 40] }
|
96
|
+
end
|
97
|
+
|
98
|
+
context "not exact" do
|
99
|
+
Given(:ticker) { ClockTicker.new(from: 19, timestamps: [0, 10, 20, 30, 40]) }
|
100
|
+
Then { ticker.timestamps == [19, 20, 30, 40] }
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
context "#to" do
|
106
|
+
context "exact" do
|
107
|
+
Given(:ticker) { ClockTicker.new(to: 20, timestamps: [0, 10, 20, 30, 40]) }
|
108
|
+
Then { ticker.timestamps == [0, 10, 20] }
|
109
|
+
end
|
110
|
+
|
111
|
+
context "zero" do
|
112
|
+
Given(:ticker) { ClockTicker.new(to: 0, timestamps: [0, 10, 20, 30, 40]) }
|
113
|
+
Then { ticker.timestamps == [0, 10, 20, 30, 40] }
|
114
|
+
end
|
115
|
+
|
116
|
+
context "not exact" do
|
117
|
+
Given(:ticker) { ClockTicker.new(to: 23, timestamps: [0, 10, 20, 30, 40]) }
|
118
|
+
Then { ticker.timestamps == [0, 10, 20, 23] }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context "full example" do
|
123
|
+
Given(:delayer) { Spy.new(:delayer) }
|
124
|
+
Given(:delayer) { Spy.new(:delayer) }
|
125
|
+
Given(:player) { Spy.new(:player) }
|
126
|
+
Given(:ticker) {
|
127
|
+
ClockTicker.new(
|
128
|
+
from: 3,
|
129
|
+
to: 28,
|
130
|
+
timestamps: [0, 10, 20, 30, 40],
|
131
|
+
delayer: delayer)
|
132
|
+
}
|
133
|
+
|
134
|
+
When { ticker.start }
|
135
|
+
|
136
|
+
Then { ticker.timestamps == [3, 10, 20, 28] }
|
137
|
+
|
138
|
+
context "player" do
|
139
|
+
Then { player.calls[1] == [:tick, [3]] }
|
140
|
+
Then { player.calls[2] == [:tick, [10]] }
|
141
|
+
Then { player.calls[3] == [:tick, [20]] }
|
142
|
+
Then { player.calls[4] == [:tick, [28]] }
|
143
|
+
end
|
144
|
+
|
145
|
+
context "delayer" do
|
146
|
+
Then { delayer.calls[1] == [:sleep, [0]] }
|
147
|
+
Then { delayer.calls[2] == [:sleep, [0.007]] }
|
148
|
+
Then { delayer.calls[3] == [:sleep, [0.01]] }
|
149
|
+
Then { delayer.calls[4] == [:sleep, [0.008]] }
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "#speed" do
|
155
|
+
Given { Spy.clear }
|
156
|
+
|
157
|
+
Given(:player) { Spy.new(:player) }
|
158
|
+
Given(:delayer) { Spy.new(:delayer) }
|
159
|
+
|
160
|
+
When { ticker.player = player }
|
161
|
+
When { ticker.start }
|
162
|
+
|
163
|
+
context "2x" do
|
164
|
+
Given(:ticker) {
|
165
|
+
ClockTicker.new(
|
166
|
+
speed: 2,
|
167
|
+
delayer: delayer,
|
168
|
+
timestamps: [0, 100, 300]
|
169
|
+
)
|
170
|
+
}
|
171
|
+
Then { player.calls[1] == [:tick, [0]] }
|
172
|
+
Then { delayer.calls[1] == [:sleep, [0]] }
|
173
|
+
|
174
|
+
Then { player.calls[2] == [:tick, [100]] }
|
175
|
+
Then { delayer.calls[2] == [:sleep, [0.05]] }
|
176
|
+
|
177
|
+
Then { player.calls[3] == [:tick, [300]] }
|
178
|
+
Then { delayer.calls[3] == [:sleep, [0.1]] }
|
179
|
+
end
|
180
|
+
|
181
|
+
context "1.5x" do
|
182
|
+
Given(:ticker) {
|
183
|
+
ClockTicker.new(
|
184
|
+
speed: 1.5,
|
185
|
+
delayer: delayer,
|
186
|
+
timestamps: [0, 100, 300]
|
187
|
+
)
|
188
|
+
}
|
189
|
+
Then { player.calls[1] == [:tick, [0]] }
|
190
|
+
Then { delayer.calls[1] == [:sleep, [0]] }
|
191
|
+
|
192
|
+
Then { player.calls[2] == [:tick, [100]] }
|
193
|
+
Then { delayer.calls[2] == [:sleep, [0.06666666666666667]] }
|
194
|
+
|
195
|
+
Then { player.calls[3] == [:tick, [300]] }
|
196
|
+
Then { delayer.calls[3] == [:sleep, [0.13333333333333333]] }
|
197
|
+
end
|
198
|
+
|
199
|
+
context "negative" do
|
200
|
+
skip("Test negtive speeds")
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trecs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Federico Iachetti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trollop
|
@@ -102,12 +102,6 @@ files:
|
|
102
102
|
- bin/trecs
|
103
103
|
- bin/trecs_record
|
104
104
|
- doc/steps.org
|
105
|
-
- lib/players/zip_file_player.rb
|
106
|
-
- lib/recorders/message_recorder.rb
|
107
|
-
- lib/recorders/raw_file_recorder.rb
|
108
|
-
- lib/recorders/ttyrec_recorder.rb
|
109
|
-
- lib/recording_strategy.rb
|
110
|
-
- lib/timestamps.rb
|
111
105
|
- lib/trecs.rb
|
112
106
|
- lib/trecs/player.rb
|
113
107
|
- lib/trecs/readers/json_reader.rb
|
@@ -120,10 +114,11 @@ files:
|
|
120
114
|
- lib/trecs/recording_strategies/raw_file_strategy.rb
|
121
115
|
- lib/trecs/recording_strategies/shell_command_strategy.rb
|
122
116
|
- lib/trecs/recording_strategies/strategy.rb
|
117
|
+
- lib/trecs/recording_strategies/tmux_session_strategy.rb
|
123
118
|
- lib/trecs/recording_strategies/ttyrec_strategy.rb
|
124
119
|
- lib/trecs/screens/terminal_screen.rb
|
120
|
+
- lib/trecs/tickers/clock_ticker.rb
|
125
121
|
- lib/trecs/tickers/terminal_input_ticker.rb
|
126
|
-
- lib/trecs/tickers/ticker.rb
|
127
122
|
- lib/trecs/tickers/watch_file_ticker.rb
|
128
123
|
- lib/trecs/version.rb
|
129
124
|
- lib/trecs/writers/in_memory_writer.rb
|
@@ -143,12 +138,15 @@ files:
|
|
143
138
|
- sandbox/record_script_file
|
144
139
|
- spec/spec_helper.rb
|
145
140
|
- spec/trecs/player_spec.rb
|
141
|
+
- spec/trecs/readers/json_reader_spec.rb
|
142
|
+
- spec/trecs/readers/yaml_store_reader_spec.rb
|
146
143
|
- spec/trecs/recorder_spec.rb
|
147
144
|
- spec/trecs/recording_strategies/fly_from_right_strategy_spec.rb
|
148
145
|
- spec/trecs/recording_strategies/hash_strategy_spec.rb
|
149
146
|
- spec/trecs/recording_strategies/incremental_strategy_spec.rb
|
150
147
|
- spec/trecs/recording_strategies/raw_file_strategy_spec.rb
|
151
148
|
- spec/trecs/recording_strategies/shell_command_strategy_spec.rb
|
149
|
+
- spec/trecs/tickers/clock_ticker_spec.rb
|
152
150
|
- spec/trecs/writers/in_memory_writer_spec.rb
|
153
151
|
- tmp/.gitignore
|
154
152
|
- trecs.gemspec
|
@@ -181,10 +179,13 @@ summary: 'TRecs: Text Recordings.'
|
|
181
179
|
test_files:
|
182
180
|
- spec/spec_helper.rb
|
183
181
|
- spec/trecs/player_spec.rb
|
182
|
+
- spec/trecs/readers/json_reader_spec.rb
|
183
|
+
- spec/trecs/readers/yaml_store_reader_spec.rb
|
184
184
|
- spec/trecs/recorder_spec.rb
|
185
185
|
- spec/trecs/recording_strategies/fly_from_right_strategy_spec.rb
|
186
186
|
- spec/trecs/recording_strategies/hash_strategy_spec.rb
|
187
187
|
- spec/trecs/recording_strategies/incremental_strategy_spec.rb
|
188
188
|
- spec/trecs/recording_strategies/raw_file_strategy_spec.rb
|
189
189
|
- spec/trecs/recording_strategies/shell_command_strategy_spec.rb
|
190
|
+
- spec/trecs/tickers/clock_ticker_spec.rb
|
190
191
|
- spec/trecs/writers/in_memory_writer_spec.rb
|
@@ -1,56 +0,0 @@
|
|
1
|
-
require "zip"
|
2
|
-
require "player"
|
3
|
-
|
4
|
-
module TRecs
|
5
|
-
class ZipFilePlayer < Player
|
6
|
-
include FileUtils
|
7
|
-
|
8
|
-
def initialize(options={})
|
9
|
-
@file_name = options.fetch(:file_name)
|
10
|
-
|
11
|
-
create_directory
|
12
|
-
extract_file
|
13
|
-
|
14
|
-
super
|
15
|
-
end
|
16
|
-
|
17
|
-
# this
|
18
|
-
def get_frame(time)
|
19
|
-
File.read(file_to_read(time))
|
20
|
-
end
|
21
|
-
|
22
|
-
# this
|
23
|
-
def get_timestamps
|
24
|
-
return [] unless file_name
|
25
|
-
Dir.glob("#{dir}/*").each.map do |line|
|
26
|
-
line[/\/(\d++)\Z/, 1].to_i
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
attr_reader :file_name
|
32
|
-
attr_reader :dir
|
33
|
-
|
34
|
-
def file_to_read(time)
|
35
|
-
file_array = []
|
36
|
-
file_array << @dir
|
37
|
-
file_array << "/"
|
38
|
-
file_array << time
|
39
|
-
file_to_read = file_array.join
|
40
|
-
end
|
41
|
-
|
42
|
-
def create_directory
|
43
|
-
@dir = Dir.mktmpdir
|
44
|
-
end
|
45
|
-
|
46
|
-
def extract_file
|
47
|
-
Zip::File.open(file_name) do |file|
|
48
|
-
file.each do |f|
|
49
|
-
f.extract "#{dir}/#{f.name}"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require "timestamps"
|
2
|
-
|
3
|
-
require "recorders/zip_file_recorder"
|
4
|
-
require "recording_strategies/incremental_recording_strategy"
|
5
|
-
|
6
|
-
|
7
|
-
module TRecs
|
8
|
-
class MessageRecorder < ZipFileRecorder
|
9
|
-
attr_reader :message
|
10
|
-
|
11
|
-
def initialize(options={})
|
12
|
-
@message = options.fetch(:message)
|
13
|
-
@recording_strategy = IncrementalRecordingStrategy.new(recorder: self, message: message)
|
14
|
-
super(options)
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require "timestamps"
|
2
|
-
|
3
|
-
require "recorders/zip_file_recorder"
|
4
|
-
require "recording_strategies/raw_file_recording_strategy"
|
5
|
-
|
6
|
-
module TRecs
|
7
|
-
class RawFileRecorder < ZipFileRecorder
|
8
|
-
def initialize(options={})
|
9
|
-
input_file = options.fetch(:input_file)
|
10
|
-
output_file = options.fetch(:output_file)
|
11
|
-
|
12
|
-
options[:recorder] = self
|
13
|
-
options[:file] = input_file
|
14
|
-
@recording_strategy = RawFileRecordingStrategy.new(options)
|
15
|
-
|
16
|
-
options[:file_name] = output_file
|
17
|
-
super(options)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require "timestamps"
|
2
|
-
|
3
|
-
require "recorders/zip_file_recorder"
|
4
|
-
require "recording_strategies/ttyrec_recording_strategy"
|
5
|
-
|
6
|
-
module TRecs
|
7
|
-
class TtyrecRecorder < ZipFileRecorder
|
8
|
-
def initialize(options={})
|
9
|
-
input_file = options.fetch(:input_file)
|
10
|
-
output_file = options.fetch(:output_file)
|
11
|
-
|
12
|
-
options[:recorder] = self
|
13
|
-
options[:file] = input_file
|
14
|
-
@recording_strategy = TtyrecRecordingStrategy.new(options)
|
15
|
-
|
16
|
-
options[:file_name] = output_file
|
17
|
-
super(options)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/recording_strategy.rb
DELETED
data/lib/timestamps.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
class Timestamps
|
2
|
-
attr_reader :collection
|
3
|
-
|
4
|
-
def initialize(collection)
|
5
|
-
@collection = collection
|
6
|
-
end
|
7
|
-
|
8
|
-
def time_at(time=0)
|
9
|
-
time = time.to_s.to_i
|
10
|
-
return 0 if collection.empty?
|
11
|
-
return collection.first if time <= collection.first
|
12
|
-
return collection.last if time >= collection.last
|
13
|
-
collection.each_cons(2) do |a, b|
|
14
|
-
if b == time
|
15
|
-
return b
|
16
|
-
end
|
17
|
-
if b > time
|
18
|
-
return a
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/lib/trecs/tickers/ticker.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module TRecs
|
2
|
-
class Ticker
|
3
|
-
attr_accessor :player
|
4
|
-
def initialize(*)
|
5
|
-
end
|
6
|
-
|
7
|
-
def start
|
8
|
-
prev_time = 0
|
9
|
-
player.timestamps.each do |time|
|
10
|
-
player.tick(time)
|
11
|
-
sleep((time - prev_time)/1000.0)
|
12
|
-
prev_time = time
|
13
|
-
end
|
14
|
-
true
|
15
|
-
end
|
16
|
-
def to_s
|
17
|
-
"<#{self.class}>"
|
18
|
-
end
|
19
|
-
alias :inspect :to_s
|
20
|
-
end
|
21
|
-
end
|