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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e38f1fcbfcf313cbb527ee22c0c61b00b4364bfc
4
- data.tar.gz: 081d03b77b6698d931cf1be2b9e2fe7807c935fd
3
+ metadata.gz: 85b986835b557733be0281419b97267c135835d7
4
+ data.tar.gz: 832eed9640a038f96ecdaeb8eec94f48b2b6a165
5
5
  SHA512:
6
- metadata.gz: 655d12ca6d054f13fd1eebad2595ed3a9dc549166aabb20148a296ba293adcad9324cf19bee48729e48ca9d8c5cb53a865b7414d28471c45beffbb4d1ed6d0a7
7
- data.tar.gz: 2685a98427201028eddcb024093aa5bfc7cfb61542297b93e2de770e62fd96cadda0700c39032c8ae182f9fadff5f46b3752b61b25beca61010f2712283371b3
6
+ metadata.gz: 13e2d53be38305a06433479bd86a9c22a6801227648a1a23abf142c4b59796246ea5b3599e5f09353fc6b4ec53a2a76f3f41a55bd93b41e9b9e59ca7fb76d61b
7
+ data.tar.gz: 1f253c8af422baa7b4a49602053908fb30afe189a7a398c861f59b6c9ab3860110d2b8e72f9248aac87a9775c654834084d17f011484611551caf993ff54a7ec
data/Gemfile CHANGED
@@ -1,3 +1,2 @@
1
1
  source "https://rubygems.org"
2
- gemspec
3
-
2
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trecs (0.1.8)
4
+ trecs (0.1.10)
5
5
  trollop (~> 2.0)
6
6
 
7
7
  GEM
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" , type: String
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
 
@@ -16,7 +16,7 @@ module TRecs
16
16
  parsed_json.each do |time, content|
17
17
  @frames[Integer(time)] = content
18
18
  end
19
-
19
+
20
20
  @timestamps = @frames.keys
21
21
  end
22
22
 
@@ -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
- writer.create_frame(time: current_time, content: current_content)
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
@@ -24,7 +24,7 @@ module TRecs
24
24
  current_time(timestamp(clock.now - start_time))
25
25
  current_content(File.read(@file))
26
26
  save_frame
27
-
27
+
28
28
  custom_sleep(recorder.step)
29
29
  end
30
30
  end
@@ -4,7 +4,7 @@ module TRecs
4
4
 
5
5
  def stop
6
6
  end
7
-
7
+
8
8
  private
9
9
 
10
10
  attr_accessor :__time
@@ -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
@@ -1,3 +1,3 @@
1
1
  module TRecs
2
- VERSION = "0.1.8"
2
+ VERSION = "0.1.10"
3
3
  end
@@ -23,7 +23,7 @@ module TRecs
23
23
  Then { player.ticker == ticker }
24
24
  Then { ticker.player == player}
25
25
 
26
- Then { player.step == 100}
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
@@ -0,0 +1,8 @@
1
+ require "spec_helper"
2
+ require "readers/json_reader"
3
+
4
+ module TRecs
5
+ describe JsonReader do
6
+ Then { skip("Test JsonReader") }
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require "spec_helper"
2
+ require "readers/yaml_store_reader"
3
+
4
+ module TRecs
5
+ describe YamlStoreReader do
6
+ Then { skip("Test YamlStoreReader") }
7
+ end
8
+ end
@@ -128,32 +128,14 @@ module TRecs
128
128
  }
129
129
 
130
130
  context "setting current frame and time with content duplicates" do
131
- When(:result) {
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 "#next_timestamp" do
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.8
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-07 00:00:00.000000000 Z
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
@@ -1,10 +0,0 @@
1
- module TRecs
2
- class RecordingStrategy
3
- def initialize(options={})
4
- @recorder = options.fetch(:recorder)
5
- end
6
-
7
- private
8
- attr_reader :recorder
9
- end
10
- end
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
@@ -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