jimmy_jukebox 0.4.5 → 0.4.6

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.
@@ -2,6 +2,8 @@ require 'jimmy_jukebox/user_config'
2
2
 
3
3
  module JimmyJukebox
4
4
 
5
+ RUNNING_JRUBY = defined?(JRUBY_VERSION) || (defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby') || RUBY_PLATFORM == 'java'
6
+
5
7
  class Jukebox
6
8
 
7
9
  class NoSongsException < Exception; end
@@ -134,7 +136,6 @@ module JimmyJukebox
134
136
  self.songs_played << song
135
137
  current_song.play(user_config, self)
136
138
  p "Finished playing"
137
- #p "Songs played: " + songs_played.to_s
138
139
  self.current_song = nil
139
140
  self.playing = false
140
141
  rescue Song::SongTerminatedPrematurelyException
@@ -99,7 +99,7 @@ module JimmyJukebox
99
99
  end
100
100
 
101
101
  def spawn_method
102
- if $running_jruby
102
+ if JimmyJukebox::RUNNING_JRUBY
103
103
  lambda { |command, arg| Spoon.spawnp(command, arg) }
104
104
  else
105
105
  begin
@@ -1,4 +1,4 @@
1
1
  module JimmyJukebox
2
- VERSION = '0.4.5'
3
- DATE = '2013-02-26'
2
+ VERSION = '0.4.6'
3
+ DATE = '2013-02-27'
4
4
  end
@@ -1,12 +1,21 @@
1
1
  require 'spec_helper'
2
- require_relative '../lib/jimmy_jukebox/jukebox'
2
+ require 'jimmy_jukebox/song'
3
+ require 'jimmy_jukebox/jukebox'
3
4
  include JimmyJukebox
4
5
 
5
6
  # don't actually play music
6
7
  module JimmyJukebox
7
8
  class Song
8
- def spawn_method(command, arg)
9
- lambda { |command, arg| sleep(5) }
9
+ def spawn_method
10
+ if JimmyJukebox::RUNNING_JRUBY
11
+ gem 'spoon'
12
+ require 'spoon'
13
+ lambda { |command, arg| Spoon.spawnp('sleep 2') }
14
+ else
15
+ gem 'posix-spawn'
16
+ require 'posix/spawn'
17
+ lambda { |command, arg| POSIX::Spawn::spawn('sleep 2') }
18
+ end
10
19
  end
11
20
  end
12
21
  end
@@ -19,50 +28,63 @@ describe Jukebox do
19
28
  ARGV.clear
20
29
  end
21
30
 
22
- let(:jb) { Jukebox.new }
23
-
24
- let(:uc) { double('user_config').as_null_object }
31
+ let(:uc) { UserConfig.new }
25
32
 
26
33
  context "with no command line parameter" do
27
34
 
28
35
  context "when no songs available" do
36
+
37
+ let(:jb) { Jukebox.new(uc, false) }
38
+
29
39
  it "raises exception when no songs available" do
30
40
  expect { jb }.to raise_error(Jukebox::NoSongsException)
31
41
  end
42
+
32
43
  end
33
44
 
34
45
  context "when songs exist" do
35
46
 
36
- let(:song1) { File.expand_path('~/Music/Rock/Beatles/Abbey_Road.mp3') }
37
- let(:song2) { File.expand_path('~/Music/Rock/Beatles/Sgt_Pepper.mp3') }
38
- let(:song3) { File.expand_path('~/Music/Rock/Eagles/Hotel_California.ogg') }
47
+ let(:song1_path) { File.expand_path('~/Music/Rock/Beatles/Abbey_Road.mp3') }
48
+ let(:song2_path) { File.expand_path('~/Music/Rock/Beatles/Sgt_Pepper.mp3') }
49
+ let(:song3_path) { File.expand_path('~/Music/Rock/Eagles/Hotel_California.ogg') }
50
+ let(:jb) { Jukebox.new(uc) }
39
51
 
40
52
  before do
41
- [song1, song2, song3].each do |song|
53
+ [song1_path, song2_path, song3_path].each do |song|
42
54
  FileUtils.mkdir_p(File.dirname(song))
43
55
  FileUtils.touch(song)
44
56
  Dir.chdir(File.expand_path('~'))
45
57
  end
46
- File.exists?(song1).should be_true
58
+ File.exists?(song1_path).should be_true
47
59
  end
48
60
 
49
61
  it "generates a non-empty song list" do
50
62
  jb.songs.should_not be_nil
51
63
  jb.songs.should_not be_empty
52
64
  jb.songs.length.should == 3
53
- jb.songs.should include(/Abbey_Road.mp3/)
65
+ jb.songs.grep(/Abbey_Road.mp3/).length.should == 1
54
66
  end
55
67
 
56
68
  it "can quit" do
57
69
  jb.should_not be_nil
70
+ #jb.stub(:songs).and_return([song1, song2, song3])
71
+ #jb.stub(:next_song).and_return(song1)
72
+ play_loop_thread = Thread.new do
73
+ jb.play_loop
74
+ end
75
+ sleep 0.5
76
+ jb.playing?.should be_true
77
+ p jb.current_song
58
78
  jb.quit
59
79
  end
60
80
 
61
- it "calls play_random_song" do
62
- jb.stub(:play_random_song).and_return(nil)
63
- jb.should_receive(:play_once)
64
- jb.play_once
65
- jb.quit
81
+ it "calls play_next_song" do
82
+ jb.should_receive(:play_next_song).at_least(:once)
83
+ play_loop_thread = Thread.new do
84
+ jb.play_loop
85
+ end
86
+ sleep 0.1
87
+ play_loop_thread.exit
66
88
  end
67
89
 
68
90
  it "has a user_config method" do
data/spec/song_spec.rb CHANGED
@@ -8,17 +8,20 @@ include JimmyJukebox
8
8
  # don't actually play music
9
9
  module JimmyJukebox
10
10
  class Song
11
- def spawn_method(command, arg)
12
- lambda { |command, arg| sleep(5) }
11
+ def spawn_method
12
+ if JimmyJukebox::RUNNING_JRUBY
13
+ require 'spoon'
14
+ lambda { |command, arg| Spoon.spawnp('sleep 2') }
15
+ else
16
+ require 'posix/spawn'
17
+ lambda { |command, arg| POSIX::Spawn::spawn('sleep 2') }
18
+ end
13
19
  end
14
20
  end
15
21
  end
16
22
 
17
23
  describe Song do
18
24
 
19
- before(:each) do
20
- end
21
-
22
25
  describe "#initialize" do
23
26
 
24
27
  it "requires a parameter" do
@@ -49,109 +52,67 @@ describe Song do
49
52
 
50
53
  before(:each) do
51
54
  @uc = UserConfig.new
52
- @jj = Jukebox.new(@uc)
55
+ @jj = Jukebox.new(@uc, false)
53
56
  @song = Song.new("~/Music/JAZZ/art_tatum.mp3")
54
57
  end
55
58
 
56
59
  it "is initially not paused" do
57
- @song.play(@uc, @jj)
60
+ @jj.play_song(@song)
58
61
  @song.paused?.should be_false
59
62
  end
60
63
 
61
64
  it "is paused after calling #pause" do
62
- @song.play
63
- @song.pause
65
+ @jj.play_song(@song)
66
+ @jj.pause_current_song
64
67
  @song.paused?.should be_true
65
68
  end
66
69
 
67
70
  it "is unpaused after calling #pause and #unpause" do
71
+ @jj.play_song(@song)
68
72
  @song.pause
73
+ @song.paused?.should be_true
69
74
  @song.unpause
70
75
  @song.paused?.should be_false
71
76
  end
72
77
 
73
78
  end
74
79
 
75
- describe "#play" do
80
+ describe "#skip_song" do
76
81
 
77
82
  before(:each) do
78
- @music_file = "~/Music/JAZZ/art_tatum.mp3"
79
- @song = Song.new(@music_file)
80
- end
81
-
82
- let(:uc) { double('user_config').as_null_object }
83
- let(:ps) { double('process_status').as_null_object}
84
-
85
- it "calls #play_with_player" do
86
- ps.stub(:exitstatus).and_return(0)
87
- @song.should_receive(:play_with_player).and_return(ps)
88
- uc.stub(:mp3_player) {"play"}
89
- uc.stub(:ogg_player) {"play"}
90
- @song.play(uc)
91
- end
92
-
93
- it "raises error when exitstatus != 0" do
94
- ps.stub(:exitstatus).and_return(1)
95
- @song.should_receive(:play_with_player).and_return(ps)
96
- uc.stub(:mp3_player) {"play"}
97
- uc.stub(:ogg_player) {"play"}
98
- expect{@song.play(uc)}.to raise_error
99
- end
100
-
101
- end
102
-
103
- describe "#play_with_player" do
104
-
105
- before(:each) do
106
- @music_file = "~/Music/JAZZ/art_tatum.mp3"
107
- @song = Song.new(@music_file)
108
- end
109
-
110
- let(:uc) { double('user_config').as_null_object }
111
- let(:ps) { double('process_status').as_null_object}
112
-
113
- it "calls #system_yield_pid" do
114
- uc.stub(:mp3_player) {"play"}
115
- uc.stub(:ogg_player) {"play"}
116
- @song.set_player(uc)
117
- @song.should_receive(:system_yield_pid).with("play",File.expand_path(@music_file)).and_return(ps)
118
- @song.play_with_player
83
+ @uc = UserConfig.new
84
+ @jj = Jukebox.new(@uc, false)
85
+ @song = Song.new("~/Music/JAZZ/art_tatum.mp3")
119
86
  end
120
87
 
121
- it "calls #system_yield_pid and captures playing_pid" do
122
- pending
123
- uc.stub(:mp3_player) {"play"}
124
- uc.stub(:ogg_player) {"play"}
125
- @song.set_player(uc)
126
- @song.should_receive(:system_yield_pid).with("play",File.expand_path(@music_file)).and_yield(1469)
127
- @song.play_with_player
128
- @song.playing_pid.should == 1469
88
+ it "is initially not paused" do
89
+ @jj.play_song(@song)
90
+ @song.playing_pid.should be_kind_of(Integer)
91
+ @jj.skip_song
92
+ @song.playing_pid.should be_nil
129
93
  end
130
94
 
131
95
  end
132
96
 
133
- describe "#playing_pid" do
97
+ describe "#play_loop" do
134
98
 
135
99
  before(:each) do
100
+ @uc = UserConfig.new
101
+ #FileUtils.mkdir_p(File.expand_path("~/Music/JAZZ"))
136
102
  @song = Song.new("~/Music/JAZZ/art_tatum.mp3")
103
+ Jukebox.any_instance.stub(:songs).and_return([@song])
104
+ Jukebox.any_instance.stub(:next_song).and_return(@song)
137
105
  end
138
106
 
139
- let(:uc) { double('user_config').as_null_object }
140
-
141
- it "is initially nil" do
142
- @song.playing_pid.should be_nil
143
- end
144
-
145
- it "is not nil after #play" do
146
- uc.stub(:mp3_player) {"play"}
147
- uc.stub(:ogg_player) {"play"}
148
- thread = Thread.new do
149
- @song.play(uc)
107
+ it "should automatically play the first song" do
108
+ @jj = Jukebox.new(@uc)
109
+ play_loop_thread = Thread.new do
110
+ @jj.play_loop
150
111
  end
151
112
  sleep 0.1
152
- @song.playing_pid.should_not be_nil
113
+ @jj.playing?.should be_true
114
+ play_loop_thread.exit
153
115
  end
154
-
155
116
  end
156
117
 
157
118
  end
@@ -87,7 +87,6 @@ describe UserConfig do
87
87
 
88
88
  it "finds songs" do
89
89
  File.directory?(File.expand_path("~/Music/ROCK/Beatles")).should be_true
90
- p uc.songs.to_s
91
90
  uc.songs.should_not be_empty
92
91
  uc.songs.length.should == 1
93
92
  end
metadata CHANGED
@@ -1,114 +1,125 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jimmy_jukebox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
5
- prerelease:
4
+ prerelease:
5
+ version: 0.4.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - James Lavin
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-26 00:00:00.000000000 Z
12
+ date: 2013-02-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
16
+ version_requirements: !ruby/object:Gem::Requirement
18
17
  requirements:
19
- - - ! '>='
18
+ - - ">="
20
19
  - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :development
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
20
+ version: !binary |-
21
+ MA==
25
22
  none: false
23
+ requirement: !ruby/object:Gem::Requirement
26
24
  requirements:
27
- - - ! '>='
25
+ - - ">="
28
26
  - !ruby/object:Gem::Version
29
- version: '0'
27
+ version: !binary |-
28
+ MA==
29
+ none: false
30
+ prerelease: false
31
+ type: :development
30
32
  - !ruby/object:Gem::Dependency
31
33
  name: rspec-core
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
+ version_requirements: !ruby/object:Gem::Requirement
34
35
  requirements:
35
- - - ! '>='
36
+ - - ">="
36
37
  - !ruby/object:Gem::Version
37
- version: '0'
38
- type: :development
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
38
+ version: !binary |-
39
+ MA==
41
40
  none: false
41
+ requirement: !ruby/object:Gem::Requirement
42
42
  requirements:
43
- - - ! '>='
43
+ - - ">="
44
44
  - !ruby/object:Gem::Version
45
- version: '0'
45
+ version: !binary |-
46
+ MA==
47
+ none: false
48
+ prerelease: false
49
+ type: :development
46
50
  - !ruby/object:Gem::Dependency
47
51
  name: rspec-mocks
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
52
+ version_requirements: !ruby/object:Gem::Requirement
50
53
  requirements:
51
- - - ! '>='
54
+ - - ">="
52
55
  - !ruby/object:Gem::Version
53
- version: '0'
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
56
+ version: !binary |-
57
+ MA==
57
58
  none: false
59
+ requirement: !ruby/object:Gem::Requirement
58
60
  requirements:
59
- - - ! '>='
61
+ - - ">="
60
62
  - !ruby/object:Gem::Version
61
- version: '0'
63
+ version: !binary |-
64
+ MA==
65
+ none: false
66
+ prerelease: false
67
+ type: :development
62
68
  - !ruby/object:Gem::Dependency
63
69
  name: rspec-expectations
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
70
+ version_requirements: !ruby/object:Gem::Requirement
66
71
  requirements:
67
- - - ! '>='
72
+ - - ">="
68
73
  - !ruby/object:Gem::Version
69
- version: '0'
70
- type: :development
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
74
+ version: !binary |-
75
+ MA==
73
76
  none: false
77
+ requirement: !ruby/object:Gem::Requirement
74
78
  requirements:
75
- - - ! '>='
79
+ - - ">="
76
80
  - !ruby/object:Gem::Version
77
- version: '0'
81
+ version: !binary |-
82
+ MA==
83
+ none: false
84
+ prerelease: false
85
+ type: :development
78
86
  - !ruby/object:Gem::Dependency
79
87
  name: fakefs
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
88
+ version_requirements: !ruby/object:Gem::Requirement
82
89
  requirements:
83
- - - ! '>='
90
+ - - ">="
84
91
  - !ruby/object:Gem::Version
85
- version: '0'
86
- type: :development
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
92
+ version: !binary |-
93
+ MA==
89
94
  none: false
95
+ requirement: !ruby/object:Gem::Requirement
90
96
  requirements:
91
- - - ! '>='
97
+ - - ">="
92
98
  - !ruby/object:Gem::Version
93
- version: '0'
99
+ version: !binary |-
100
+ MA==
101
+ none: false
102
+ prerelease: false
103
+ type: :development
94
104
  - !ruby/object:Gem::Dependency
95
105
  name: fakeweb
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
106
+ version_requirements: !ruby/object:Gem::Requirement
98
107
  requirements:
99
- - - ! '>='
108
+ - - ">="
100
109
  - !ruby/object:Gem::Version
101
- version: '0'
102
- type: :development
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
110
+ version: !binary |-
111
+ MA==
105
112
  none: false
113
+ requirement: !ruby/object:Gem::Requirement
106
114
  requirements:
107
- - - ! '>='
115
+ - - ">="
108
116
  - !ruby/object:Gem::Version
109
- version: '0'
110
- description: jimmy_jukebox downloads great music and plays random MP3 & OGG songs
111
- under a directory (or set of directories)
117
+ version: !binary |-
118
+ MA==
119
+ none: false
120
+ prerelease: false
121
+ type: :development
122
+ description: jimmy_jukebox downloads great music and plays random MP3 & OGG songs under a directory (or set of directories)
112
123
  email: james@jameslavin.com
113
124
  executables:
114
125
  - play_jukebox
@@ -173,27 +184,28 @@ files:
173
184
  - bin/load_jukebox
174
185
  homepage: https://github.com/JamesLavin/jimmy_jukebox
175
186
  licenses: []
176
- post_install_message: I really hope you enjoy the great jazz and classical music downloadable
177
- using this gem!
187
+ post_install_message: I really hope you enjoy the great jazz and classical music downloadable using this gem!
178
188
  rdoc_options: []
179
189
  require_paths:
180
190
  - lib
181
191
  required_ruby_version: !ruby/object:Gem::Requirement
182
- none: false
183
192
  requirements:
184
- - - ! '>='
193
+ - - ">="
185
194
  - !ruby/object:Gem::Version
186
- version: '0'
187
- required_rubygems_version: !ruby/object:Gem::Requirement
195
+ version: !binary |-
196
+ MA==
188
197
  none: false
198
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
199
  requirements:
190
- - - ! '>='
200
+ - - ">="
191
201
  - !ruby/object:Gem::Version
192
- version: '0'
202
+ version: !binary |-
203
+ MA==
204
+ none: false
193
205
  requirements: []
194
206
  rubyforge_project: jimmy_jukebox
195
- rubygems_version: 1.8.23
196
- signing_key:
207
+ rubygems_version: 1.8.24
208
+ signing_key:
197
209
  specification_version: 3
198
210
  summary: plays your MP3 & OGG files and lets you easily download music
199
211
  test_files:
@@ -203,4 +215,3 @@ test_files:
203
215
  - spec/artists_spec.rb
204
216
  - spec/song_spec.rb
205
217
  - spec/spec_helper.rb
206
- has_rdoc: