cultome_player 2.0.0

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 (73) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +24 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +7 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +325 -0
  9. data/Rakefile +8 -0
  10. data/bin/cultome_player +39 -0
  11. data/config/environment.yml +28 -0
  12. data/cultome_player.gemspec +35 -0
  13. data/db/001_create_schema.rb +58 -0
  14. data/lib/cultome_player.rb +107 -0
  15. data/lib/cultome_player/command.rb +11 -0
  16. data/lib/cultome_player/command/language.rb +61 -0
  17. data/lib/cultome_player/command/processor.rb +165 -0
  18. data/lib/cultome_player/command/reader.rb +86 -0
  19. data/lib/cultome_player/environment.rb +130 -0
  20. data/lib/cultome_player/events.rb +29 -0
  21. data/lib/cultome_player/media.rb +47 -0
  22. data/lib/cultome_player/objects.rb +15 -0
  23. data/lib/cultome_player/objects/album.rb +21 -0
  24. data/lib/cultome_player/objects/artist.rb +18 -0
  25. data/lib/cultome_player/objects/command.rb +37 -0
  26. data/lib/cultome_player/objects/drive.rb +26 -0
  27. data/lib/cultome_player/objects/genre.rb +16 -0
  28. data/lib/cultome_player/objects/parameter.rb +37 -0
  29. data/lib/cultome_player/objects/response.rb +42 -0
  30. data/lib/cultome_player/objects/song.rb +38 -0
  31. data/lib/cultome_player/player.rb +13 -0
  32. data/lib/cultome_player/player/adapter.rb +14 -0
  33. data/lib/cultome_player/player/adapter/mpg123.rb +143 -0
  34. data/lib/cultome_player/player/interactive.rb +56 -0
  35. data/lib/cultome_player/player/interface.rb +13 -0
  36. data/lib/cultome_player/player/interface/basic.rb +96 -0
  37. data/lib/cultome_player/player/interface/builtin_help.rb +368 -0
  38. data/lib/cultome_player/player/interface/extended.rb +199 -0
  39. data/lib/cultome_player/player/interface/helper.rb +300 -0
  40. data/lib/cultome_player/player/playlist.rb +280 -0
  41. data/lib/cultome_player/plugins.rb +23 -0
  42. data/lib/cultome_player/plugins/help.rb +58 -0
  43. data/lib/cultome_player/state_checker.rb +74 -0
  44. data/lib/cultome_player/utils.rb +95 -0
  45. data/lib/cultome_player/version.rb +3 -0
  46. data/spec/config.yml +0 -0
  47. data/spec/cultome_player/command/processor_spec.rb +168 -0
  48. data/spec/cultome_player/command/reader_spec.rb +45 -0
  49. data/spec/cultome_player/cultome_player_spec.rb +17 -0
  50. data/spec/cultome_player/environment_spec.rb +65 -0
  51. data/spec/cultome_player/events_spec.rb +22 -0
  52. data/spec/cultome_player/media_spec.rb +41 -0
  53. data/spec/cultome_player/player/adapter/mpg123_spec.rb +82 -0
  54. data/spec/cultome_player/player/interface/basic_spec.rb +168 -0
  55. data/spec/cultome_player/player/interface/extended/connect_spec.rb +117 -0
  56. data/spec/cultome_player/player/interface/extended/search_spec.rb +90 -0
  57. data/spec/cultome_player/player/interface/extended/show_spec.rb +36 -0
  58. data/spec/cultome_player/player/interface/extended/shuffle_spec.rb +26 -0
  59. data/spec/cultome_player/player/interface/extended_spec.rb +136 -0
  60. data/spec/cultome_player/player/interface/helper_spec.rb +63 -0
  61. data/spec/cultome_player/player/interface_spec.rb +17 -0
  62. data/spec/cultome_player/player/playlist_spec.rb +301 -0
  63. data/spec/cultome_player/plugins/help_spec.rb +21 -0
  64. data/spec/cultome_player/plugins_spec.rb +19 -0
  65. data/spec/cultome_player/utils_spec.rb +15 -0
  66. data/spec/spec_helper.rb +108 -0
  67. data/spec/test/uno/dos/dos.mp3 +0 -0
  68. data/spec/test/uno/dos/tres/tres.mp3 +0 -0
  69. data/spec/test/uno/uno.mp3 +0 -0
  70. data/tasks/console.rake +19 -0
  71. data/tasks/db.rake +19 -0
  72. data/tasks/run.rake +7 -0
  73. metadata +322 -0
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe CultomePlayer::Player::Interface::Helper do
4
+ let(:t){ TestClass.new }
5
+
6
+ it 'raise an error if processing a unknown object' do
7
+ expect{ t.process_for_search([Parameter.new({type: :object, value: 'unknown'})]) }.to raise_error 'invalid search:unknown type'
8
+ end
9
+
10
+ it 'create a progress bar' do
11
+ t.get_progress_bar(55, 200, 10).should eq "|##________|"
12
+ t.get_progress_bar(55, 100, 10).should eq "|#####_____|"
13
+ t.get_progress_bar(55, 100, 20).should eq "|###########_________|"
14
+ end
15
+
16
+ it 'create a progress bar with labels in both sides' do
17
+ t.get_progress_bar_with_labels(5, 10, 10, "left", "right").should eq "left |#####_____| right"
18
+ t.get_progress_bar_with_labels(5, 10, 10, "left").should eq "left |#####_____|"
19
+ t.get_progress_bar_with_labels(5, 10, 10, "", "right").should eq "|#####_____| right"
20
+ end
21
+
22
+ it 'format seconds to minutos:seconds' do
23
+ t.format_secs(4).should eq "00:04"
24
+ t.format_secs(75).should eq "01:15"
25
+ t.format_secs(65).should eq "01:05"
26
+ end
27
+
28
+ describe '#process_object_for_search' do
29
+ it 'returns sql criteria and values for object type artist' do
30
+ artist = double("artist", name: "artist_name")
31
+ t.should_receive(:current_artist).and_return(artist)
32
+
33
+ q,v = t.send(:process_object_for_search, [Parameter.new({type: :object, value: :artist})] )
34
+ q.should eq 'artists.name = ?'
35
+ v.should eq ["artist_name"]
36
+ end
37
+
38
+ it 'returns sql criteria and values for object type album' do
39
+ album = double("album", name: "album_name")
40
+ t.should_receive(:current_album).and_return(album)
41
+
42
+ q,v = t.send(:process_object_for_search, [Parameter.new({type: :object, value: :album})] )
43
+ q.should eq 'albums.name = ?'
44
+ v.should eq ["album_name"]
45
+ end
46
+
47
+ it 'returns sql criteria and values for object type song' do
48
+ song = double("song", name: "song_name")
49
+ t.should_receive(:current_song).and_return(song)
50
+
51
+ q,v = t.send(:process_object_for_search, [Parameter.new({type: :object, value: :song})] )
52
+ q.should eq 'songs.name = ?'
53
+ v.should eq ["song_name"]
54
+ end
55
+
56
+ it 'returns sql criteria and values for object type library' do
57
+ q,v = t.send(:process_object_for_search, [Parameter.new({type: :object, value: :library})] )
58
+ q.should eq 'songs.id > 0'
59
+ v.should be_empty
60
+ end
61
+ end
62
+
63
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe CultomePlayer::Player::Interface do
4
+ let(:t){ TestClass.new }
5
+
6
+ it 'respond to basic commands' do
7
+ [:play , :pause , :stop , :next , :prev , :quit].each do |cmd|
8
+ t.should respond_to cmd
9
+ end
10
+ end
11
+
12
+ it 'respond to extended commands' do
13
+ [:show , :enqueue , :search , :shuffle , :connect , :disconnect , :ff , :fb].each do |cmd|
14
+ t.should respond_to cmd
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,301 @@
1
+ require 'spec_helper'
2
+
3
+ describe CultomePlayer::Player::Playlist do
4
+ let(:p){ CultomePlayer::Player::Playlist::Playlists.new }
5
+
6
+ it 'add a new playlist' do
7
+ p.should be_empty
8
+ p.register(:playlist)
9
+ p.should have(1).item
10
+ end
11
+
12
+ it 'raise error if trying to use a unregistered playlist' do
13
+ expect{ p[:playlist] }.to raise_error('unknown playlist:playlist is not registered' )
14
+ end
15
+
16
+ context 'with a playlist registered' do
17
+ before :each do
18
+ p.register(:playlist)
19
+ end
20
+
21
+ it 'should return playlists object' do
22
+ p[:playlist].should be_instance_of CultomePlayer::Player::Playlist::Playlists
23
+ end
24
+
25
+ it 'raise and error if traying to register a previous registered playlist' do
26
+ expect{ p.register(:playlist) }.to raise_error('invalid registry:playlist already registered')
27
+ end
28
+
29
+ it 'get a playlist by name' do
30
+ p[:playlist].should have(1).item
31
+ p[:playlist].first.should_not be_nil
32
+ end
33
+
34
+ it 'add an element to an existing playlist' do
35
+ p[:playlist].first.should be_empty
36
+ p[:playlist] << "eleme"
37
+ p[:playlist].first.should have(1).item
38
+ p[:playlist] << "eleme"
39
+ p[:playlist].first.should have(2).item
40
+ end
41
+
42
+ it 'replace the content of a playlist' do
43
+ p[:playlist].first.should be_empty
44
+ p[:playlist] << "eleme"
45
+ p[:playlist] << "eleme"
46
+ p[:playlist].first.should have(2).item
47
+ p[:playlist] <= %w{uno dos tres cuatro}
48
+ p[:playlist].first.should have(4).item
49
+ end
50
+
51
+ it 'raise an error if trying to get the next song in an empty list' do
52
+ expect{ p[:playlist].next }.to raise_error 'playlist empty:no songs in playlists'
53
+ end
54
+
55
+ it 'change shuffle status' do
56
+ p[:playlist].should_not be_shuffling
57
+ p[:playlist].shuffle
58
+ p[:playlist].should be_shuffling
59
+ p[:playlist].order
60
+ p[:playlist].should_not be_shuffling
61
+ end
62
+
63
+ context 'with a full playlist' do
64
+ before :each do
65
+ p[:playlist] <= %w{uno dos tres cuatro}
66
+ end
67
+
68
+ it 'shuffle the content of the playlist' do
69
+ p[:playlist].first.should eq %w{uno dos tres cuatro}
70
+ p[:playlist].shuffle
71
+ p[:playlist].shuffle if p[:playlist].first == %w{uno dos tres cuatro}
72
+ p[:playlist].first.should_not eq %w{uno dos tres cuatro}
73
+ end
74
+
75
+ it 'get an element by index' do
76
+ p[:playlist].at(0).should eq "uno"
77
+ p[:playlist].at(3).should eq "cuatro"
78
+ end
79
+
80
+ it 'order the content of the playlist' do
81
+ p[:playlist].order
82
+ p[:playlist].first.should eq %w{cuatro dos tres uno}
83
+ end
84
+
85
+ it 'updated the play index' do
86
+ expect{ p[:playlist].next }.to change{ p[:playlist].play_index }.by(1)
87
+ end
88
+
89
+ it 'reset the play order when ordered' do
90
+ p[:playlist].next
91
+ p[:playlist].play_index.should eq 0
92
+ p[:playlist].next
93
+ p[:playlist].play_index.should eq 1
94
+
95
+ p[:playlist].order
96
+
97
+ p[:playlist].next
98
+ p[:playlist].play_index.should eq 0
99
+ end
100
+
101
+ it 'reset the play order when shuffled' do
102
+ p[:playlist].next
103
+ p[:playlist].play_index.should eq 0
104
+ p[:playlist].next
105
+ p[:playlist].play_index.should eq 1
106
+
107
+ p[:playlist].shuffle
108
+
109
+ p[:playlist].next
110
+ p[:playlist].play_index.should eq 0
111
+ end
112
+
113
+ it 'repeat the list if repeat is active' do
114
+ p[:playlist].repeat?.should be_true
115
+ p[:playlist].next.should eq "uno"
116
+ p[:playlist].next
117
+ p[:playlist].next
118
+ p[:playlist].next.should eq "cuatro"
119
+ p[:playlist].next.should eq "uno"
120
+ end
121
+
122
+ it 'raise an error if traying to retrive an ended playlist' do
123
+ p[:playlist].repeat false
124
+ p[:playlist].repeat?.should be_false
125
+ p[:playlist].next.should eq "uno"
126
+ p[:playlist].next
127
+ p[:playlist].next
128
+ p[:playlist].next.should eq "cuatro"
129
+ expect{ p[:playlist].next }.to raise_error("playlist empty:no songs in playlists")
130
+ end
131
+
132
+ it 'return nil if checking current song but playlist has not be played' do
133
+ p[:playlist].current.should be_nil
134
+ end
135
+
136
+ it 'return the current song in playlist' do
137
+ p[:playlist].next.should eq "uno"
138
+ p[:playlist].current.should eq "uno"
139
+ end
140
+
141
+ it 'removes and return the next song from the playlist' do
142
+ p[:playlist].should have(4).songs
143
+ p[:playlist].remove_next.should eq "uno"
144
+ p[:playlist].should have(3).songs
145
+ p[:playlist].remove_next.should eq "dos"
146
+ p[:playlist].should have(2).songs
147
+ end
148
+
149
+ it 'iterate over every song' do
150
+ pl = ":"
151
+ p[:playlist].each_song do |s|
152
+ pl << s.to_s
153
+ end
154
+ pl.should eq ":unodostrescuatro"
155
+ end
156
+
157
+ it 'check if there are songs remaining in the playlist' do
158
+ p[:playlist].repeat(false)
159
+ p[:playlist].repeat?.should be_false
160
+ p[:playlist].next?.should be_true
161
+ p[:playlist].next
162
+ p[:playlist].next
163
+ p[:playlist].next
164
+ p[:playlist].next
165
+ p[:playlist].next?.should be_false
166
+ end
167
+
168
+ it 'pop the last element inserted' do
169
+ p[:playlist].should have(4).songs
170
+ p[:playlist] << 'cinco'
171
+ p[:playlist].should have(5).songs
172
+ p[:playlist].pop.should eq 'cinco'
173
+ p[:playlist].pop.should eq 'cuatro'
174
+ p[:playlist].should have(3).songs
175
+ end
176
+
177
+ it 'rewind the playlist' do
178
+ p[:playlist].next.should eq 'uno'
179
+ p[:playlist].next.should eq 'dos'
180
+ p[:playlist].next.should eq 'tres'
181
+ p[:playlist].next.should eq 'cuatro'
182
+ p[:playlist].current.should eq 'cuatro'
183
+ p[:playlist].rewind_by(1).should eq 'tres'
184
+ p[:playlist].current.should eq 'tres'
185
+ p[:playlist].rewind_by(2).should eq 'uno'
186
+ p[:playlist].current.should eq 'uno'
187
+ end
188
+ end
189
+ end
190
+
191
+ context 'with multiple playlist registered' do
192
+ before :each do
193
+ p.register(:uno)
194
+ p.register(:dos)
195
+ end
196
+
197
+ it 'get multiples playlists by name' do
198
+ p[:uno, :dos].should have(2).item
199
+ end
200
+
201
+ it 'add an element to more than one existing playlists' do
202
+ p[:uno, :dos].each{|p| p.should be_empty }
203
+ p[:uno, :dos] << "elem"
204
+ p[:uno, :dos].each{|p| p.should have(1).item }
205
+ end
206
+
207
+ it 'replace the content of more than one existing playlists' do
208
+ p[:uno, :dos].each{|p| p.should be_empty }
209
+ p[:uno, :dos] << "elem"
210
+ p[:uno, :dos] << "elem"
211
+ p[:uno, :dos].each{|p| p.should have(2).item }
212
+ p[:uno, :dos].each{|p| p.should eq ["elem", "elem"] }
213
+ p[:uno, :dos] <= %w{uno dos tres cuatro}
214
+ p[:uno, :dos].each{|p| p.should have(4).item }
215
+ p[:uno, :dos].each{|p| p.should eq %w{uno dos tres cuatro} }
216
+ end
217
+
218
+ it 'return elements in aparence order' do
219
+ p.register(:tres)
220
+ p[:uno] << "uno"
221
+ p[:dos] << "dos"
222
+ p[:tres] << "tres"
223
+
224
+ p[:uno, :dos, :tres].next.should eq %w{uno dos tres}
225
+ end
226
+
227
+ it 'return nil if checking current song but playlist has not be played' do
228
+ p[:uno, :dos].current.should be_nil
229
+ p[:uno] << "uno"
230
+ p[:uno].next
231
+ expect{ p[:uno, :dos].current }.to raise_error "no current:no current song in one of the playlists"
232
+ end
233
+
234
+ it 'return the current song in playlist' do
235
+ p[:uno] << "uno"
236
+ p[:dos] << "tres"
237
+ p[:uno, :dos].next.should eq ["uno", "tres"]
238
+ p[:uno, :dos].current.should eq ["uno", "tres"]
239
+ end
240
+
241
+ it 'raise an error if getting the next of an empty playlist' do
242
+ p[:uno] << "uno"
243
+ expect{ p[:uno, :dos].next }.to raise_error 'playlist empty:no songs in one of the playlists'
244
+ end
245
+
246
+ it 'iterate over every song' do
247
+ p[:uno] << "uno"
248
+ p[:dos] << "dos"
249
+ pl = ":"
250
+ p.each_song do |s,idx|
251
+ pl << "#{idx}#{s.to_s}"
252
+ end
253
+ pl.should eq ":1uno2dos"
254
+ end
255
+
256
+ it 'check if there are songs remaining in the playlists' do
257
+ p[:uno, :dos].repeat false
258
+ p[:uno, :dos].repeat?.should eq [false, false]
259
+ p[:uno, :dos] << 'uno'
260
+ p[:uno] << 'dos'
261
+ p[:uno].next?.should be_true
262
+ p[:dos].next?.should be_true
263
+ p[:uno, :dos].next?.should eq [true, true]
264
+ p[:uno, :dos].next
265
+ p[:uno, :dos].next?.should eq [true, false]
266
+ end
267
+
268
+ it 'change shuffle status' do
269
+ p[:uno, :dos].shuffling?.should eq [false, false]
270
+ p[:uno, :dos].shuffle
271
+ p[:uno, :dos].shuffling?.should eq [true, true]
272
+ p[:uno, :dos].order
273
+ p[:uno, :dos].shuffling?.should eq [false, false]
274
+ end
275
+
276
+
277
+ it 'pop the last element inserted' do
278
+ p[:uno].should have(0).songs
279
+ p[:dos].should have(0).songs
280
+ p[:uno] << 'cinco'
281
+ p[:dos] << 'seis'
282
+ p[:uno].should have(1).songs
283
+ p[:dos].should have(1).songs
284
+ p[:uno, :dos].pop.should eq ['cinco', 'seis']
285
+ p[:uno].should have(0).songs
286
+ p[:dos].should have(0).songs
287
+ end
288
+
289
+ it 'rewind the playlists' do
290
+ p[:uno] << 'uno'
291
+ p[:uno] << 'dos'
292
+ p[:dos] << 'tres'
293
+ p[:dos] << 'cuatro'
294
+
295
+ p[:uno, :dos].next.should eq ['uno', 'tres']
296
+ p[:uno, :dos].next.should eq ['dos', 'cuatro']
297
+ p[:uno, :dos].current.should eq ['dos', 'cuatro']
298
+ p[:uno, :dos].rewind_by(1).should eq ['uno', 'tres']
299
+ end
300
+ end
301
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ class TestPlugin
4
+ include CultomePlayer::Plugins::Help
5
+ end
6
+
7
+ describe CultomePlayer::Plugins::Help do
8
+ let(:p){ TestPlugin.new }
9
+
10
+ it 'respond to command_help' do
11
+ p.should respond_to(:command_help)
12
+ end
13
+
14
+ it 'respond to usage_help' do
15
+ p.should respond_to(:usage_help)
16
+ end
17
+
18
+ it 'respond to description_help' do
19
+ p.should respond_to(:description_help)
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe CultomePlayer::Plugins do
4
+ let(:p){
5
+ class TestPlugin
6
+ include CultomePlayer::Plugins
7
+ end
8
+
9
+ TestPlugin.new
10
+ }
11
+ it 'check if plugins respond to a given command' do
12
+ p.plugins_respond_to?("help").should be_true
13
+ p.plugins_respond_to?("nonexistent").should_not be_true
14
+ end
15
+
16
+ it 'return the format for a command' do
17
+ p.plugin_command_sintaxis("help").should be_instance_of Regexp
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe CultomePlayer::Utils do
4
+ let(:t){ TestClass.new(:rspec) }
5
+
6
+ describe 'arrange information in columns' do
7
+ it 'everything fits in a row' do
8
+ t.arrange_in_columns(["12345", "1234567890"], [5, 10], 2).should eq "12345 1234567890"
9
+ end
10
+
11
+ it 'data bigger than column span into another row' do
12
+ t.arrange_in_columns(["12345", "123456789012345"], [5, 10], 2).should eq "12345 1234567890\n 12345"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,108 @@
1
+ require 'coveralls'
2
+ require 'database_cleaner'
3
+ require 'cultome_player'
4
+
5
+ Coveralls.wear!
6
+
7
+ include CultomePlayer::Environment
8
+ include CultomePlayer::Utils
9
+ include CultomePlayer::Objects
10
+
11
+ RSpec.configure do |config|
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.run_all_when_everything_filtered = true
14
+ config.filter_run :focus
15
+ config.filter_run_excluding :mplayer
16
+ config.order = 'random'
17
+
18
+ config.before(:suite) do
19
+ prepare_environment(:rspec)
20
+ with_connection do
21
+ DatabaseCleaner.strategy = :transaction
22
+ DatabaseCleaner.clean_with(:truncation)
23
+ end
24
+ end
25
+
26
+ config.before(:each) do
27
+ with_connection { DatabaseCleaner.start }
28
+ end
29
+
30
+ config.after(:each) do
31
+ with_connection { DatabaseCleaner.clean }
32
+ end
33
+ end
34
+
35
+ module FakeStatus
36
+ def current_artist
37
+ Artist.new(name: 'artist_uno')
38
+ end
39
+
40
+ def current_album
41
+ Album.new(name: 'album_tres')
42
+ end
43
+ end
44
+
45
+ module FakeExtractor
46
+ def extract_from_txt(filepath, opc)
47
+ filename = filepath[filepath.rindex("/")+1, filepath.length]
48
+ extension = filename[filename.rindex(".")+1, filename.length]
49
+
50
+ file_info = { filename: filename, path: filepath, extension: extension }
51
+
52
+ file_info[:relative_path] = filepath.gsub(/#{opc[:root_path]}\//, '') if opc.has_key?(:root_path)
53
+
54
+ return file_info
55
+ end
56
+ end
57
+
58
+ module MockPlayer
59
+ def send_to_player(cmd)
60
+ if cmd == 'pause'
61
+ if @paused
62
+ @paused = @stopped = false
63
+ @playing = true
64
+ else
65
+ @paused = true
66
+ @stopped = @playing = false
67
+ end
68
+ elsif cmd.start_with?('load')
69
+ @is_player_running = @playing = true
70
+ elsif cmd.start_with?('stop')
71
+ @is_player_running = @paused = @playing = false
72
+ @stopped = true
73
+ elsif cmd.start_with?('jump')
74
+ # do nothing
75
+ else
76
+ puts "ERROR: #{cmd} !!!!!!!"
77
+ end
78
+ end
79
+
80
+ def control_pipe
81
+ STDOUT
82
+ end
83
+
84
+ def start_player
85
+ @play_in_player = true
86
+ @playing = true
87
+ @paused = @stopped = false
88
+ end
89
+ end
90
+
91
+ class TestClass
92
+ include CultomePlayer
93
+ include FakeStatus
94
+ include FakeExtractor
95
+ include MockPlayer
96
+
97
+ def initialize(env=:rspec)
98
+ prepare_environment(env) unless env.nil?
99
+ playlists.register(:current)
100
+ playlists.register(:history)
101
+ playlists.register(:queue)
102
+ playlists.register(:focus)
103
+ end
104
+ end
105
+
106
+ def test_folder
107
+ File.join(File.dirname(File.expand_path(__FILE__)), 'test')
108
+ end