cultome_player 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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