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.
Files changed (33) hide show
  1. checksums.yaml +5 -13
  2. data/Gemfile.lock +13 -1
  3. data/bin/trecs_message +4 -0
  4. data/lib/trecs/player.rb +128 -0
  5. data/lib/trecs/recorder.rb +59 -0
  6. data/lib/trecs/recording_strategies/custom_strategy.rb +5 -0
  7. data/lib/trecs/recording_strategies/hash_strategy.rb +17 -0
  8. data/lib/{recording_strategies/incremental_recording_strategy.rb → trecs/recording_strategies/incremental_strategy.rb} +4 -3
  9. data/lib/trecs/recording_strategies/raw_file_strategy.rb +54 -0
  10. data/lib/{recording_strategies → trecs/recording_strategies}/ttyrec_recording_strategy.rb +0 -0
  11. data/lib/{screens → trecs/screens}/terminal_screen.rb +0 -0
  12. data/lib/trecs/version.rb +1 -1
  13. data/lib/trecs/writers/in_memory_writer.rb +17 -0
  14. data/lib/{recorders/zip_file_recorder.rb → trecs/writers/zip_file_writer.rb} +9 -7
  15. data/lib/trecs.rb +3 -0
  16. data/{spec → old_specs}/player_spec.rb +0 -0
  17. data/{spec → old_specs/recorders}/zip_file_recorder_spec.rb +11 -5
  18. data/{spec → old_specs}/timestamps_spec.rb +0 -0
  19. data/{spec → old_specs}/trecs_message_spec.rb +0 -0
  20. data/{spec → old_specs}/trecs_spec.rb +0 -0
  21. data/pkg/trecs-0.0.3.gem +0 -0
  22. data/spec/spec_helper.rb +90 -20
  23. data/spec/trecs/player_spec.rb +76 -0
  24. data/spec/trecs/recorder_spec.rb +227 -0
  25. data/spec/trecs/recording_strategies/incremental_strategy_spec.rb +43 -0
  26. data/spec/trecs/recording_strategies/raw_file_strategy_spec.rb +66 -0
  27. data/spec/trecs/writers/in_memory_writer_spec.rb +45 -0
  28. data/trecs.gemspec +4 -1
  29. metadata +78 -41
  30. data/lib/player.rb +0 -76
  31. data/lib/recorder.rb +0 -74
  32. data/lib/recording_strategies/raw_file_recording_strategy.rb +0 -42
  33. data/spec/recorder_spec.rb +0 -249
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NDJhM2IwN2MzYzlhOTFhNjNjYmY1YWRiNTExNmY2OGI4MWU3ZWNiYg==
5
- data.tar.gz: !binary |-
6
- OTk1Njk3M2RhYzJhZTFhODg5ZTBhM2IzMmZhYzI5YjcyNjY1NDQ4YQ==
2
+ SHA1:
3
+ metadata.gz: 6b9b65056214045e29a8c560870c4e53b4bc04b7
4
+ data.tar.gz: f8ed9275619e0d6afc1ab51f4580dbced02be455
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ZWYxOGI0NTU1YTM3MjRkYjk5NDgxNThjZGNjOGE3YTRhMzNmMjZjMmU5NmJm
10
- YzE0NjAwZWYyZDQxODRlMmZjYzdmMzFhZmY5NWJkNTBiYjE3NzMyNmU5Nzky
11
- YmI3YTUxYmYwYTVkMWIyNWQ3ODYwYTM4MDZhMTM0OWYzMDcwODM=
12
- data.tar.gz: !binary |-
13
- NTQzY2U1NmM2Yjc3YjkyODdjOGU3NmQxYzY2NDE4MzFkODk5ODY4YTk2YzRl
14
- MjA0YWM0M2ZmYTQ0OGM2ZTg3MGU0N2NlZTA5NTg4NmQ0ZTA2YzI3OGYwN2I0
15
- Mjc4ZDQ4MGFkNzU2ZWI4ZjlkZDU3N2NhZTE5YTQ0Y2RkOTEyOTk=
6
+ metadata.gz: 19da3e8a8954ded968fc30564efc5f6f0aebe8f331cca3cb75932a1cb45820d508432d026a090fa94d07dd15a027359e01b330db2a019c101b40bb3e68033b0b
7
+ data.tar.gz: da0ef87b85613a53b6f0345a2f1e2e3438739fcc28e37c4a0df6ecbd30fb71f371a80d030387f2df349ec0b92df90ce4bf90e3ed7595d2e187ecbb54a1633704
data/Gemfile.lock CHANGED
@@ -1,16 +1,24 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trecs (0.0.3)
4
+ trecs (0.0.4)
5
5
  rubyzip (~> 1.1.4)
6
6
  trollop (~> 2.0)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
+ coderay (1.1.0)
11
12
  diff-lcs (1.2.5)
12
13
  given_core (3.5.4)
13
14
  sorcerer (>= 0.3.7)
15
+ method_source (0.8.2)
16
+ pry (0.9.12.6)
17
+ coderay (~> 1.0)
18
+ method_source (~> 0.8)
19
+ slop (~> 3.4)
20
+ pry-nav (0.2.3)
21
+ pry (~> 0.9.10)
14
22
  rake (10.3.2)
15
23
  rspec (2.99.0)
16
24
  rspec-core (~> 2.99.0)
@@ -24,14 +32,18 @@ GEM
24
32
  rspec (>= 2.12)
25
33
  rspec-mocks (2.99.0)
26
34
  rubyzip (1.1.4)
35
+ slop (3.5.0)
27
36
  sorcerer (1.0.2)
28
37
  trollop (2.0)
29
38
 
30
39
  PLATFORMS
40
+ java
31
41
  ruby
32
42
 
33
43
  DEPENDENCIES
34
44
  bundler (~> 1.6)
45
+ pry
46
+ pry-nav
35
47
  rake
36
48
  rspec (~> 2.12)
37
49
  rspec-given (~> 3.5.4)
data/bin/trecs_message CHANGED
@@ -13,6 +13,10 @@ options = Trollop::options do
13
13
  end
14
14
 
15
15
  if options[:file_name]
16
+
17
+ recorder = Recorder.new(
18
+ persistence_strategy: ZipFileRecorder.new(file_name: file_name),
19
+ recording_strategy: IncrementalRecordingStrategy.new(message: message)
16
20
  recorder = TRecs::MessageRecorder.new(options)
17
21
  recorder.record
18
22
  else
@@ -0,0 +1,128 @@
1
+ require "screens/terminal_screen"
2
+
3
+ module TRecs
4
+ class Player
5
+ attr_reader :reader
6
+ attr_reader :screen
7
+ attr_reader :ticker
8
+ attr_reader :step
9
+ attr_reader :current_time
10
+
11
+ def initialize(options={})
12
+ time = options.fetch(:time) { nil }
13
+ @reader = options.fetch(:reader)
14
+ @reader.player = self
15
+
16
+ @ticker = options.fetch(:ticker)
17
+ @ticker.player = self
18
+
19
+ @screen = options.fetch(:screen) { TerminalScreen.new }
20
+
21
+ @testing = options.fetch(:testing) { false }
22
+
23
+ @current_time = time
24
+ @step = options.fetch(:step) { 100 }
25
+ end
26
+
27
+ def play
28
+ reader.setup
29
+ ticker.start
30
+ end
31
+
32
+ def tick(time=current_time)
33
+ content = reader.frame_at(time)
34
+ if content != @prev_content
35
+ screen.clear
36
+ screen.puts(content)
37
+ @prev_content = content
38
+ end
39
+ end
40
+
41
+ def timestamps
42
+ reader.timestamps
43
+ end
44
+
45
+ private
46
+ attr_writer :current_time
47
+ attr_reader :testing
48
+
49
+ end
50
+ end
51
+
52
+
53
+ # require "timestamps"
54
+ # require "screens/terminal_screen"
55
+
56
+ # module TRecs
57
+ # class Player
58
+ # attr_reader :screen
59
+
60
+ # def initialize(options={})
61
+ # time = options.fetch(:time) { nil }
62
+ # @current_time = time
63
+ # @step = options.fetch(:step) { 100 }
64
+ # @screen = options.fetch(:screen) { TerminalScreen.new }
65
+ # @testing = options.fetch(:testing) { false }
66
+ # @ticks = time ? Array(time.to_i) : ticks
67
+ # end
68
+
69
+ # def play
70
+ # ticks.each do |time|
71
+ # play_frame(time)
72
+ # sleep(sleep_time) unless testing
73
+ # end
74
+ # end
75
+
76
+ # def tick(time=current_time)
77
+ # self.current_time = time
78
+ # get_frame(time)
79
+ # end
80
+
81
+ # def timestamps
82
+ # @timestamps ||= get_timestamps.sort
83
+ # end
84
+
85
+ # def generate_ticks
86
+ # ticks = [0]
87
+ # curr = 0
88
+ # while(curr < timestamps.last.to_i)
89
+ # curr += step
90
+ # ticks << curr
91
+ # end
92
+ # ticks
93
+ # end
94
+
95
+ # def ticks
96
+ # @ticks ||= generate_ticks
97
+ # end
98
+
99
+ # def play_frame(time)
100
+ # screen.clear
101
+ # screen.puts tick(time_at(time))
102
+ # end
103
+
104
+ # def time_at(time)
105
+ # Timestamps.new(timestamps).time_at(time)
106
+ # end
107
+
108
+ # private
109
+ # attr_accessor :current_time
110
+ # attr_reader :step
111
+ # attr_reader :testing
112
+
113
+
114
+
115
+ # def get_timestamps
116
+ # []
117
+ # end
118
+
119
+ # def get_frame(time)
120
+ # ""
121
+ # end
122
+
123
+ # def sleep_time
124
+ # # TODO: Fix this to use the current time
125
+ # @sleep_time ||= (step/1000.0)*0.8
126
+ # end
127
+ # end
128
+ # end
@@ -0,0 +1,59 @@
1
+ module TRecs
2
+ class Recorder
3
+ attr_reader :writer
4
+ attr_reader :strategy
5
+ attr_reader :step
6
+ attr_reader :recording
7
+ attr_reader :current_time
8
+ attr_reader :current_content
9
+
10
+
11
+ def initialize(options={})
12
+ @writer = options.fetch(:writer)
13
+ @writer.recorder = self
14
+
15
+ @strategy = options.fetch(:strategy)
16
+ @strategy.recorder = self
17
+
18
+ @step = options.fetch(:step) { 100 }
19
+ @recording = false
20
+ @current_time = nil
21
+ end
22
+
23
+ def record
24
+ self.current_time = nil
25
+ self.recording = true
26
+ writer.setup
27
+ strategy.perform
28
+ writer.render
29
+ self.recording = false
30
+ end
31
+
32
+ def current_frame(options={})
33
+ time = options.fetch(:time) { next_timestamp }
34
+ content = options.fetch(:content)
35
+ @current_time = time
36
+ @current_content = content
37
+
38
+ if @previous_content != content
39
+ writer.create_frame(time: current_time, content: current_content)
40
+ @previous_content = content
41
+ end
42
+ end
43
+
44
+ def next_timestamp
45
+ @current_time = -step unless @current_time
46
+ @current_time += step
47
+ end
48
+
49
+ def stop
50
+ strategy.stop
51
+ end
52
+
53
+ private
54
+ attr_writer :recording
55
+ attr_writer :current_time
56
+ attr_writer :current_content
57
+
58
+ end
59
+ end
@@ -0,0 +1,5 @@
1
+ CustomStrategy = Struct.new(:recorder, :action) do
2
+ def perform
3
+ self.action.call
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ class HashStrategy
2
+ attr_accessor :recorder
3
+ attr_accessor :frames
4
+
5
+ def initialize(frames)
6
+ @frames = frames || Hash.new
7
+ end
8
+
9
+ def perform
10
+ @frames.each do |time, content|
11
+ recorder.current_frame(time: time, content: content)
12
+ end
13
+ end
14
+
15
+ def stop
16
+ end
17
+ end
@@ -1,9 +1,11 @@
1
1
  require "recording_strategy"
2
2
  module TRecs
3
- class IncrementalRecordingStrategy < RecordingStrategy
3
+ class IncrementalStrategy
4
+ attr_reader :message
5
+ attr_accessor :recorder
6
+
4
7
  def initialize(options={})
5
8
  @message = options.fetch(:message)
6
- super(options)
7
9
  end
8
10
 
9
11
  def perform
@@ -16,7 +18,6 @@ module TRecs
16
18
  end
17
19
  end
18
20
  private
19
- attr_reader :message
20
21
 
21
22
  def timestamp_for(message)
22
23
  (message.size - 1) * recorder.step
@@ -0,0 +1,54 @@
1
+ require "recording_strategy"
2
+ module TRecs
3
+ class RawFileStrategy
4
+ attr_accessor :recorder
5
+ attr_reader :file
6
+
7
+ def initialize(options={})
8
+ file = options.fetch(:file)
9
+ @file = File.open(file)
10
+
11
+ @clock = options.fetch(:clock) { Time }
12
+ @testing = options.fetch(:testing) { false }
13
+ #
14
+ #@height = options.fetch(:height) { 24 }
15
+ #@width = options.fetch(:width) { 80 }
16
+ #
17
+ end
18
+
19
+ def perform
20
+ @recording = true
21
+ start_time = clock.now
22
+
23
+ while @recording
24
+ time = timestamp(clock.now - start_time)
25
+ content = File.read(@file)
26
+ recorder.current_frame(time: time, content: content)
27
+ custom_sleep(recorder.step)
28
+ end
29
+ end
30
+
31
+ def custom_sleep(millis)
32
+ if testing
33
+ clock.sleep(millis)
34
+ else
35
+ @sleep_time ||= (millis/1000.0)
36
+ sleep(@sleep_time)
37
+ end
38
+ end
39
+
40
+ def stop
41
+ @recording = false
42
+ end
43
+
44
+ private
45
+ attr_reader :clock
46
+ attr_reader :testing
47
+
48
+
49
+
50
+ def timestamp(time)
51
+ (time * 1000).to_i
52
+ end
53
+ end
54
+ end
File without changes
data/lib/trecs/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module TRecs
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -0,0 +1,17 @@
1
+ class InMemoryWriter
2
+ attr_accessor :recorder
3
+ attr_reader :frames
4
+
5
+ def setup
6
+ @frames = {}
7
+ end
8
+
9
+ def create_frame(options={})
10
+ time = options.fetch(:time)
11
+ content = options.fetch(:content)
12
+ @frames[time] = content
13
+ end
14
+
15
+ def render
16
+ end
17
+ end
@@ -2,18 +2,16 @@ require "zip"
2
2
  require "recorder"
3
3
 
4
4
  module TRecs
5
- class ZipFileRecorder < Recorder
5
+ class ZipFileRecorder
6
+ attr_accessor :recorder
7
+
6
8
  include FileUtils
7
9
  def initialize(options={})
8
- super(options)
9
10
  @file_name = options.fetch(:file_name)
10
11
  delete_file
11
12
  end
12
13
 
13
- private
14
- attr_reader :file_name
15
- attr_reader :frames
16
-
14
+
17
15
  # this
18
16
  def setup
19
17
  @frames = {}
@@ -30,10 +28,14 @@ module TRecs
30
28
  end
31
29
  end
32
30
 
31
+
33
32
  def create_frame
34
- frames[current_time] = current_content
33
+ frames[recorder.current_time] = recorder.current_content
35
34
  end
36
35
 
36
+ private
37
+ attr_reader :frames
38
+
37
39
  def delete_file
38
40
  rm file_name if File.exists? file_name
39
41
  end
data/lib/trecs.rb ADDED
@@ -0,0 +1,3 @@
1
+ $:.unshift(File.expand_path("../trecs/", __FILE__))
2
+
3
+ require "pry"
File without changes
@@ -7,11 +7,12 @@ require "players/zip_file_player"
7
7
  module TRecs
8
8
  describe ZipFileRecorder do
9
9
  class DummyRecordingStrategy
10
- attr_reader :recorder
10
+ attr_accessor :recorder
11
11
 
12
12
  def initialize(options={})
13
- @recorder = options.fetch(:recorder)
13
+ #@recorder = options.fetch(:recorder)
14
14
  end
15
+
15
16
  def perform
16
17
  recorder.current_frame(time: 0, content: "zero")
17
18
  recorder.current_frame(time: 1, content: "one")
@@ -27,12 +28,15 @@ module TRecs
27
28
  end
28
29
 
29
30
  it "expects a file name" do
30
- expect { ZipFileRecorder.new }.to raise_error
31
+ expect {
32
+ Recorder.new( persistence_strategy: ZipFileRecorder.new, recording_strategy: DummyRecordingStrategy.new) }.to raise_error
31
33
  end
32
34
 
33
35
  it "generates a .trecs compressed file" do
34
36
  file_name = "tmp/i_should_exist.trecs"
35
- recorder = DummyZipFileRecorder.new(file_name: file_name)
37
+ recorder = Recorder.new(
38
+ persistence_strategy: ZipFileRecorder.new(file_name: file_name),
39
+ recording_strategy: DummyRecordingStrategy.new)
36
40
 
37
41
  recorder.record
38
42
 
@@ -42,7 +46,9 @@ module TRecs
42
46
 
43
47
  it "has the correct frames" do
44
48
  file_name = "tmp/zero_one_two.trecs"
45
- recorder = DummyZipFileRecorder.new(file_name: file_name)
49
+ recorder = Recorder.new(
50
+ persistence_strategy: ZipFileRecorder.new(file_name: file_name),
51
+ recording_strategy: DummyRecordingStrategy.new)
46
52
 
47
53
  recorder.record
48
54
 
File without changes
File without changes
File without changes
Binary file
data/spec/spec_helper.rb CHANGED
@@ -1,32 +1,102 @@
1
- # This file was generated by the `rspec --init` command. Conventionally, all
2
- # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
- # Require this file using `require "spec_helper"` to ensure that it is only
4
- # loaded once.
5
- #
6
- # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
1
+ require File.expand_path("../../lib/trecs", __FILE__)
2
+
3
+ require "rspec/given"
4
+ require "ostruct"
5
+
7
6
  RSpec.configure do |config|
8
7
  config.treat_symbols_as_metadata_keys_with_true_values = true
9
8
  config.run_all_when_everything_filtered = true
10
9
  config.filter_run :focus
11
-
12
- # Run specs in random order to surface order dependencies. If you find an
13
- # order dependency and want to debug it, you can fix the order by providing
14
- # the seed, which is printed after each run.
15
- # --seed 1234
16
10
  config.order = 'random'
17
11
  end
18
12
 
19
- $:.unshift(File.expand_path("../lib", __FILE__))
13
+ class Spy
14
+ attr_reader :calls
15
+
16
+ @calls = {}
17
+ @index = 0
18
+
19
+ def initialize(name)
20
+ @calls = {}
21
+ @index = 0
22
+ @name = name
23
+ @skips = []
24
+ end
25
+
26
+ def self.clear
27
+ @calls = {}
28
+ @index = 0
29
+ end
30
+
31
+ def method_missing(method, *args)
32
+ unless @skips.include? method
33
+ @index = @index + 1
34
+ self.class.inc_index
35
+
36
+ @calls[@index] = add_call(method, args)
37
+ self.class.add_call(@name, method, args)
38
+ end
39
+ end
40
+
41
+ def ignore(*methods)
42
+ methods.each do |method|
43
+ @skips << method
44
+ end
45
+ self
46
+ end
47
+ alias :skip :ignore
48
+
49
+ def self.inc_index
50
+ @index = @index + 1
51
+ end
20
52
 
21
- def create_dir(dir_path)
22
- mkdir_p dir_path unless File.exist?(dir_path)
23
- dir_path
53
+ def add_call(method, args)
54
+ @calls[@index] = [method, args]
55
+ end
56
+
57
+ def self.add_call(name, method, args)
58
+ @calls[@index] = [name, method, args]
59
+ end
60
+
61
+ def self.calls
62
+ @calls
63
+ end
64
+ end
65
+
66
+
67
+ class CustomTicker
68
+ attr_accessor :player
69
+ def initialize(*ticks)
70
+ @ticks = ticks
71
+ end
72
+ def start
73
+ @ticks.each do |time|
74
+ player.tick(time)
75
+ end
76
+ end
24
77
  end
25
78
 
26
- def file_name(string=nil)
27
- if string
28
- @file_name = "#{project_dir}/#{string}.trecs"
29
- else
30
- @file_name
79
+ class CustomReader
80
+ attr_accessor :player
81
+ def initialize(frames={})
82
+ @frames = frames
83
+ end
84
+ def frame_at(n)
85
+ @frames[n]
86
+ end
87
+ def setup
31
88
  end
32
89
  end
90
+
91
+ # def create_dir(dir_path)
92
+ # mkdir_p dir_path unless File.exist?(dir_path)
93
+ # dir_path
94
+ # end
95
+
96
+ # def file_name(string=nil)
97
+ # if string
98
+ # @file_name = "#{project_dir}/#{string}.trecs"
99
+ # else
100
+ # @file_name
101
+ # end
102
+ # end
@@ -0,0 +1,76 @@
1
+ require "spec_helper"
2
+
3
+ require "player"
4
+
5
+ module TRecs
6
+ describe Player do
7
+ context "initialization" do
8
+ Given(:reader) { OpenStruct.new }
9
+ Given(:ticker) { OpenStruct.new }
10
+ Given(:screen) { Object.new }
11
+
12
+ When(:player) {
13
+ Player.new(
14
+ reader: reader,
15
+ ticker: ticker,
16
+ screen: screen,
17
+ )
18
+ }
19
+
20
+ Then { player.reader == reader }
21
+ Then { reader.player == player}
22
+
23
+ Then { player.ticker == ticker }
24
+ Then { ticker.player == player}
25
+
26
+ Then { player.step == 100}
27
+ Then { player.screen == screen}
28
+ end
29
+
30
+ context "Playing" do
31
+ Given { Spy.clear }
32
+ Given(:reader) { Spy.new("reader").ignore(:player=) }
33
+ Given(:ticker) { Spy.new("ticker").ignore(:player=) }
34
+ Given(:player) {
35
+ Player.new(reader: reader, ticker: ticker)
36
+ }
37
+
38
+ When { player.play }
39
+
40
+ Then { Spy.calls[1] == ["reader", :setup, []] }
41
+ Then { Spy.calls[2] == ["ticker", :start, []] }
42
+ end
43
+
44
+ context "Playing some frames" do
45
+ Given { Spy.clear }
46
+ Given(:screen) { Spy.new("screen") }
47
+ Given(:player) {
48
+ Player.new(reader: reader, ticker: ticker, screen: screen)
49
+ }
50
+
51
+ When { player.play }
52
+
53
+ context "no repetitions" do
54
+ Given(:reader) { CustomReader.new(0 => "a", 100 => "b") }
55
+ Given(:ticker) { CustomTicker.new(0, 100) }
56
+
57
+ Then { screen.calls[1] == [:clear, []] }
58
+ Then { screen.calls[2] == [:puts, ["a"]] }
59
+ Then { screen.calls[3] == [:clear, []] }
60
+ Then { screen.calls[4] == [:puts, ["b"]] }
61
+ Then { screen.calls.size == 4 }
62
+ end
63
+
64
+ context "with repetitions" do
65
+ Given(:reader) { CustomReader.new(0 => "a", 100 => "b", 200 => "b") }
66
+ Given(:ticker) { CustomTicker.new(0, 100, 200) }
67
+
68
+ Then { screen.calls[1] == [:clear, []] }
69
+ Then { screen.calls[2] == [:puts, ["a"]] }
70
+ Then { screen.calls[3] == [:clear, []] }
71
+ Then { screen.calls[4] == [:puts, ["b"]] }
72
+ Then { screen.calls.size == 4 }
73
+ end
74
+ end
75
+ end
76
+ end