jimmy_jukebox 0.4.2 → 0.4.3
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.
- data/lib/jimmy_jukebox/artists.rb +58 -37
- data/lib/jimmy_jukebox/jukebox.rb +3 -1
- data/lib/jimmy_jukebox/load_jukebox_code.rb +5 -2
- data/lib/jimmy_jukebox/song.rb +18 -15
- data/lib/jimmy_jukebox/song_loader.rb +21 -11
- data/lib/jimmy_jukebox/songs/Beethoven.yml +51 -0
- data/lib/jimmy_jukebox/songs/CharlieChristian.yml +8 -0
- data/lib/jimmy_jukebox/user_config.rb +9 -7
- data/lib/jimmy_jukebox/version.rb +2 -2
- data/spec/artists_spec.rb +71 -0
- data/spec/jimmy_jukebox_spec.rb +38 -32
- data/spec/song_loader_spec.rb +39 -48
- data/spec/spec_helper.rb +0 -33
- data/spec/user_config_spec.rb +23 -7
- metadata +74 -82
@@ -1,48 +1,69 @@
|
|
1
1
|
module Artists
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
:
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
3
|
+
ARTISTS = {
|
4
|
+
acb: { genre: 'BANJO', name: "archibald_camp_banjo" },
|
5
|
+
at: { genre: 'JAZZ', name: "art_tatum" },
|
6
|
+
as: { genre: 'JAZZ', name: "artie_shaw"},
|
7
|
+
bg: { genre: 'JAZZ', name: "benny_goodman"},
|
8
|
+
bh: { genre: 'JAZZ', name: "billie_holiday"},
|
9
|
+
bb: { genre: 'JAZZ', name: "bix_beiderbecke"},
|
10
|
+
bm: { genre: 'JAZZ', name: "bennie_moten"},
|
11
|
+
cc: { genre: 'JAZZ', name: "charlie_christian"},
|
12
|
+
cp: { genre: 'JAZZ', name: "charlie_parker"},
|
13
|
+
ch: { genre: 'JAZZ', name: "coleman_hawkins"},
|
14
|
+
chjb: { genre: 'JAZZ', name: "clifford_hayes_jug_blowers"},
|
15
|
+
cb: { genre: 'JAZZ', name: "count_basie"},
|
16
|
+
dx: { genre: 'JAZZ', name: "dixieland"},
|
17
|
+
dg: { genre: 'JAZZ', name: "dizzy_gillespie"},
|
18
|
+
dr: { genre: 'JAZZ', name: "django_reinhardt"},
|
19
|
+
de: { genre: 'JAZZ', name: "duke_ellington"},
|
20
|
+
eh: { genre: 'JAZZ', name: "earl_hines"},
|
21
|
+
fh: { genre: 'JAZZ', name: "fletcher_henderson"},
|
22
|
+
jj: { genre: 'JAZZ', name: "james_p_johnson"},
|
23
|
+
jrm: { genre: 'JAZZ', name: "jelly_roll_morton"},
|
24
|
+
ko: { genre: 'JAZZ', name: "king_oliver"},
|
25
|
+
la: { genre: 'JAZZ', name: "louis_armstrong"},
|
26
|
+
lh: { genre: 'JAZZ', name: "lionel_hampton"},
|
27
|
+
lvb: { genre: 'CLASSICAL', name: "beethoven"},
|
28
|
+
md: { genre: 'JAZZ', name: "miles_davis"},
|
29
|
+
odjb: { genre: 'JAZZ', name: "original_dixieland_jazz_band"},
|
30
|
+
rt: { genre: 'JAZZ', name: "ragtime"},
|
31
|
+
rn: { genre: 'JAZZ', name: "red_norvo"},
|
32
|
+
sb: { genre: 'JAZZ', name: "sidney_bechet"}
|
32
33
|
}
|
33
34
|
|
34
|
-
def
|
35
|
-
|
35
|
+
def artist_genre(key)
|
36
|
+
ARTISTS[key][:genre]
|
36
37
|
end
|
37
38
|
|
38
|
-
def
|
39
|
-
|
40
|
-
'/JAZZ/' + value.to_s.split("_").map! { |name_component| name_component.capitalize }.join("_")
|
39
|
+
def artist_name(key)
|
40
|
+
ARTISTS[key][:name]
|
41
41
|
end
|
42
42
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
43
|
+
def artist_name_to_genre(name)
|
44
|
+
p "looking for #{name}"
|
45
|
+
artists = ARTISTS.select { |k,v| v[:name] == name }
|
46
|
+
p artists
|
47
|
+
key, value = artists.first
|
48
|
+
value[:genre]
|
49
|
+
end
|
50
|
+
|
51
|
+
def artist_name_to_subdir_name(name)
|
52
|
+
return "/#{artist_name_to_genre(name)}/" + name.to_s.capitalize unless name.to_s.match(/_/)
|
53
|
+
"/#{artist_name_to_genre(name)}/" + name.to_s.split("_").map! { |name_component| name_component.capitalize }.join("_")
|
54
|
+
end
|
55
|
+
|
56
|
+
def artist_key_to_subdir_name(key)
|
57
|
+
artist_name_to_subdir_name(artist_name(key))
|
58
|
+
end
|
59
|
+
|
60
|
+
def artist_key_to_yaml_file(key)
|
61
|
+
artist_name_to_yaml_file(artist_name(key))
|
62
|
+
end
|
63
|
+
|
64
|
+
def artist_name_to_yaml_file(name)
|
65
|
+
return name.to_s.capitalize + '.yml' unless name.to_s.match(/_/)
|
66
|
+
name.to_s.split("_").map! { |name_component| name_component.capitalize }.join("") + '.yml'
|
46
67
|
end
|
47
68
|
|
48
69
|
end
|
@@ -4,6 +4,7 @@ module JimmyJukebox
|
|
4
4
|
|
5
5
|
class Jukebox
|
6
6
|
|
7
|
+
class NoSongsException < Exception; end
|
7
8
|
class NoNewSongException < Exception; end
|
8
9
|
class NoCurrentSongException < Exception; end
|
9
10
|
class NoPreviousSongException < Exception; end
|
@@ -14,6 +15,7 @@ module JimmyJukebox
|
|
14
15
|
def initialize(new_user_config = UserConfig.new, continuous_play = true)
|
15
16
|
self.user_config = new_user_config
|
16
17
|
self.continuous_play = continuous_play
|
18
|
+
raise NoSongsException if songs.empty?
|
17
19
|
end
|
18
20
|
|
19
21
|
def play_loop
|
@@ -121,7 +123,7 @@ module JimmyJukebox
|
|
121
123
|
self.songs_played << song
|
122
124
|
current_song.play(user_config, self)
|
123
125
|
p "Finished playing"
|
124
|
-
p "Songs played: " + songs_played.to_s
|
126
|
+
#p "Songs played: " + songs_played.to_s
|
125
127
|
self.current_song = nil
|
126
128
|
self.playing = false
|
127
129
|
rescue Song::SongTerminatedPrematurelyException
|
@@ -22,6 +22,9 @@ def invalid_artist
|
|
22
22
|
end
|
23
23
|
|
24
24
|
no_argv0 unless ARGV[0]
|
25
|
-
invalid_artist unless JAZZ_ARTISTS.has_key?(ARGV[0].to_sym)
|
26
|
-
JimmyJukebox::SongLoader.send(JAZZ_ARTISTS[ARGV[0].to_sym])
|
27
25
|
|
26
|
+
if ARTISTS.has_key?(ARGV[0].to_sym)
|
27
|
+
JimmyJukebox::SongLoader.send(ARTISTS[ARGV[0].to_sym][:name])
|
28
|
+
else
|
29
|
+
invalid_artist
|
30
|
+
end
|
data/lib/jimmy_jukebox/song.rb
CHANGED
@@ -94,6 +94,23 @@ module JimmyJukebox
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
+
def spawn_method
|
98
|
+
if $running_jruby
|
99
|
+
lambda { |command, arg| Spoon.spawnp(command, arg) }
|
100
|
+
else
|
101
|
+
begin
|
102
|
+
lambda { |command, arg| POSIX::Spawn::spawn(command + ' ' + arg) }
|
103
|
+
|
104
|
+
# posix/spawn is much faster than fork-exec
|
105
|
+
#pid = Process.fork do
|
106
|
+
# exec(command + ' ' + arg)
|
107
|
+
#end
|
108
|
+
rescue NotImplementedError
|
109
|
+
raise CannotSpawnProcessException, "*** Cannot play music because we found neither Spoon.spawnp (for JRuby) nor Process.fork (for MRI) ***"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
97
114
|
def play(user_config, jukebox)
|
98
115
|
set_player(user_config)
|
99
116
|
process_status = play_with_player
|
@@ -114,21 +131,7 @@ module JimmyJukebox
|
|
114
131
|
|
115
132
|
def run_command(command, arg)
|
116
133
|
# make system call and get pid so you can pause/terminate process
|
117
|
-
|
118
|
-
pid = Spoon.spawnp(command,arg)
|
119
|
-
else
|
120
|
-
begin
|
121
|
-
pid = POSIX::Spawn::spawn(command + ' ' + arg)
|
122
|
-
|
123
|
-
# posix/spawn is much faster than fork-exec
|
124
|
-
#pid = Process.fork do
|
125
|
-
# exec(command + ' ' + arg)
|
126
|
-
# exit! 127 # should never be reached
|
127
|
-
#end
|
128
|
-
rescue NotImplementedError
|
129
|
-
raise CannotSpawnProcessException, "*** Cannot play music because we found neither Spoon.spawnp (for JRuby) nor Process.fork (for MRI) ***"
|
130
|
-
end
|
131
|
-
end
|
134
|
+
pid = spawn_method.call(command, arg)
|
132
135
|
self.playing_pid = pid
|
133
136
|
end
|
134
137
|
|
@@ -27,14 +27,14 @@ module JimmyJukebox
|
|
27
27
|
def self.define_artist(name,user_config)
|
28
28
|
metaclass.instance_eval do
|
29
29
|
define_method(name) do
|
30
|
-
save_dir = user_config.default_music_dir +
|
31
|
-
songs = YAML::load_file(File.dirname(__FILE__) + "/songs/#{
|
30
|
+
save_dir = user_config.default_music_dir + artist_name_to_subdir_name(name.to_s)
|
31
|
+
songs = YAML::load_file(File.dirname(__FILE__) + "/songs/#{artist_name_to_yaml_file(name.to_s)}")
|
32
32
|
download_songs(songs, save_dir)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
ARTISTS.values.each { |artist| define_artist artist[:name].to_sym, @user_config }
|
38
38
|
|
39
39
|
def self.sample(num_songs)
|
40
40
|
# create array of all possible songs
|
@@ -80,14 +80,24 @@ module JimmyJukebox
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
def self.
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
83
|
+
def self.song_savename(song_url)
|
84
|
+
File.basename(song_url)
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.song_already_exists?(savename, save_dir)
|
88
|
+
if version_of_song_in_any_dir?(savename, save_dir)
|
89
|
+
puts "#{savename} already exists in #{save_dir}"
|
90
|
+
true
|
91
|
+
else
|
92
|
+
false
|
88
93
|
end
|
89
|
-
|
90
|
-
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.download_song(song_url, save_dir)
|
97
|
+
savename = song_savename(song_url)
|
98
|
+
return if song_already_exists?(savename, save_dir)
|
99
|
+
puts "Downloading #{savename}"
|
100
|
+
song_pathname = File.join(save_dir, savename)
|
91
101
|
open(song_pathname, 'wb') do |dst|
|
92
102
|
open(song_url) do |src|
|
93
103
|
dst.write(src.read)
|
@@ -97,7 +107,7 @@ module JimmyJukebox
|
|
97
107
|
rescue OpenURI::HTTPError
|
98
108
|
p "Warning: Could not download #{song_url}"
|
99
109
|
File.delete(song_pathname) if File.exists?(song_pathname)
|
100
|
-
|
110
|
+
nil
|
101
111
|
end
|
102
112
|
|
103
113
|
def self.check_downloaded_song_size(song_pathname)
|
@@ -0,0 +1,51 @@
|
|
1
|
+
---
|
2
|
+
- http://archive.org/download/BeethovenSymphonyNo.1/1.mp3
|
3
|
+
- http://archive.org/download/BBCSymphony2Beethoven/symphony2_beethoven_radio3.mp3
|
4
|
+
- http://archive.org/download/bbcSymphony3Beethoven_2/symphony3_beethoven_radio3.mp3
|
5
|
+
- http://archive.org/download/BeethovenSymphonyNo.3walter/I.AllegroConBrio.mp3
|
6
|
+
- http://archive.org/download/BeethovenSymphonyNo.3walter/Ii.MarciaFunebreAdagioAssai.mp3
|
7
|
+
- http://archive.org/download/BeethovenSymphonyNo.3walter/Iii.Scherzo-AllegroVivaceTrio.mp3
|
8
|
+
- http://archive.org/download/BeethovenSymphonyNo.3walter/Iv.Finale-AllegroMoltoPocoAndante.mp3
|
9
|
+
- http://archive.org/download/BeethovenSymphonyNo.4/I.Adagio_AllegroVivace.mp3
|
10
|
+
- http://archive.org/download/BeethovenSymphonyNo.4/Ii.Adagio.mp3
|
11
|
+
- http://archive.org/download/BeethovenSymphonyNo.4/Iii.Scherzo-AllegroVivace_Trio-UnPocoMenoAllegro.mp3
|
12
|
+
- http://archive.org/download/BeethovenSymphonyNo.4/Iv.AllegroMaNonTroppo.mp3
|
13
|
+
- http://archive.org/download/Beethovens5th/01SymphonyNo.5InCMinor.mp3
|
14
|
+
- http://archive.org/download/BeethovenSymphonyNo.5/ToscaniniBeethoven5.mp3
|
15
|
+
- http://archive.org/download/BBCSymphony6Beethoven/symphony6_beethoven_radio3.mp3
|
16
|
+
- http://archive.org/download/BeethovenSymphonyNo.7-ormandy/I.PocoSostenutoVivace.mp3
|
17
|
+
- http://archive.org/download/BeethovenSymphonyNo.7-ormandy/Ii.Allegretto.mp3
|
18
|
+
- http://archive.org/download/BeethovenSymphonyNo.7-ormandy/Iii.Presto.mp3
|
19
|
+
- http://archive.org/download/BeethovenSymphonyNo.7-ormandy/Iv.AllegroConMoto.mp3
|
20
|
+
- http://archive.org/download/BBCSymphony8Beethoven/symphony8_beethoven_radio3.mp3
|
21
|
+
- http://archive.org/download/BeethovenSymphonyNo.8/01.allegroVivaceEConBrio.mp3
|
22
|
+
- http://archive.org/download/BeethovenSymphonyNo.8/02.scherzandoAllegretto.mp3
|
23
|
+
- http://archive.org/download/BeethovenSymphonyNo.8/03.tempoDiMenuetto.mp3
|
24
|
+
- http://archive.org/download/BeethovenSymphonyNo.8/04.allegroVivace.mp3
|
25
|
+
- http://archive.org/download/BeethovenViolinConcertoheifetz/I.AllegroMaNonTroppo.mp3
|
26
|
+
- http://archive.org/download/BeethovenViolinConcertoheifetz/Ii.Larghetto.mp3
|
27
|
+
- http://archive.org/download/BeethovenViolinConcertoheifetz/Iii.Rondoallegro.mp3
|
28
|
+
- http://archive.org/download/BeethovenViolinConcerto-Szigeti/01I.AllegroMaNonTroppo.mp3
|
29
|
+
- http://archive.org/download/BeethovenViolinConcerto-Szigeti/02Ii.LarghettoIii.Rondo.mp3
|
30
|
+
- http://archive.org/download/BeethovenFrElise-Schnabel/Beethoven-FrEliseWoo59.mp3
|
31
|
+
- http://archive.org/download/BeethovenRondoInG/Beethoven-RondoInGMajor.mp3
|
32
|
+
- http://archive.org/download/BeethovenElevenVienneseDances/Beethoven-ElevenVienneseDancesWoo17.mp3
|
33
|
+
- http://archive.org/download/BeethovenCoriolanOverture/Beethoven-CoriolonOverture.mp3
|
34
|
+
- http://archive.org/download/MoonlightSonata_755/Beethoven-MoonlightSonata.mp3
|
35
|
+
- http://archive.org/download/BeethovenPianoSonataNo.2/BeethovenSonata2.ogg
|
36
|
+
- http://archive.org/download/BeethovenPianoSonataNo.3/BeethovenSonata3.ogg
|
37
|
+
- http://archive.org/download/BeethovenPianoSonataNo.6/BeethovenSonata6.mp3
|
38
|
+
- http://archive.org/download/BeethovenPianoSonata13/BeethovenPianoSonata13.mp3
|
39
|
+
- http://archive.org/download/BeethovenPianoSonata15/BeethovenPianoSonata15.mp3
|
40
|
+
- http://archive.org/download/BeethovenPianoSonata16/BeethovenPianoSonata16.mp3
|
41
|
+
- http://archive.org/download/BeethovenPianoSonata17/BeethovenPianoSonata17.mp3
|
42
|
+
- http://archive.org/download/BeethovenPianoSonata22/BeethovenPianoSonata22.mp3
|
43
|
+
- http://archive.org/download/BeethovenPianoSonataNo.25/BeethovenPianoSonata25.mp3
|
44
|
+
- http://archive.org/download/BeethovenSonata31Opus110/KatieAconeBeethovenSonata31Opus110.mp3
|
45
|
+
- http://archive.org/download/BeethovenTripleConcerto/01I.Allegro.mp3
|
46
|
+
- http://archive.org/download/BeethovenTripleConcerto/02Ii.LargoIii.RondoAllaPolacca.mp3
|
47
|
+
- http://archive.org/download/BeethovenTrioOp.11-Adagio/BeethovenTrio.mp3
|
48
|
+
- http://archive.org/download/GlennGould-BeethovenPianoSonatas/01-Beethoven-SonataNo.1InFMinorOp.2No.1-I.Allegro-GlennGould.mp3
|
49
|
+
- http://archive.org/download/GlennGould-BeethovenPianoSonatas/05-Beethoven-SonataNo.2InAMajorOp.2No.2-I.AllegroVivace-GlennGould.mp3
|
50
|
+
- http://archive.org/download/GlennGould-BeethovenPianoSonatas/09-Beethoven-SonataNo.3InCMajorOp.2No.3-I.AllegroConBrio-GlennGould.mp3
|
51
|
+
|
@@ -1,5 +1,13 @@
|
|
1
1
|
---
|
2
2
|
- http://archive.org/download/CharlieChristian-SevenComeEleven/02.SevenComeEleven.mp3
|
3
|
+
- http://archive.org/download/Daddy_GS_CHARLIE_CHRISTIAN_Guitar_Hero/ChristianCharlieoriginalGuitarHero-BennysBugle.mp3
|
4
|
+
- http://archive.org/download/Daddy_GS_CHARLIE_CHRISTIAN_Guitar_Hero/ChristianCharlieoriginalGuitarHero-BoyMeetsGoygrandSlam.mp3
|
5
|
+
- http://archive.org/download/Daddy_GS_CHARLIE_CHRISTIAN_Guitar_Hero/ChristianCharlieoriginalGuitarHero-BreakfastFeudsecondVersion.mp3
|
6
|
+
- http://archive.org/download/Daddy_GS_CHARLIE_CHRISTIAN_Guitar_Hero/ChristianCharlieoriginalGuitarHero-FlyingHomealternateTake.mp3
|
7
|
+
- http://archive.org/download/Daddy_GS_CHARLIE_CHRISTIAN_Guitar_Hero/ChristianCharlieoriginalGuitarHero-GoneWithwhatWindalternateTake.mp3
|
8
|
+
- http://archive.org/download/Daddy_GS_CHARLIE_CHRISTIAN_Guitar_Hero/ChristianCharlieoriginalGuitarHero-GoodEnoughToKeepairMailSpecialfirstVersion--AlternateTak.mp3
|
9
|
+
- http://archive.org/download/Daddy_GS_CHARLIE_CHRISTIAN_Guitar_Hero/ChristianCharlieoriginalGuitarHero-SevenComeEleven.mp3
|
10
|
+
- http://archive.org/download/Daddy_GS_CHARLIE_CHRISTIAN_Guitar_Hero/ChristianCharlieoriginalGuitarHero-WhollyCats.mp3
|
3
11
|
#- http://www.archive.org/download/CharlieChristian-01-08/CharlieChristian-AirmailSpecial.mp3
|
4
12
|
#- http://www.archive.org/download/CharlieChristian-01-08/CharlieChristian-BluesInB.mp3
|
5
13
|
#- http://www.archive.org/download/CharlieChristian-01-08/CharlieChristian-HoneysuckleRose1939.mp3
|
@@ -69,8 +69,6 @@ module JimmyJukebox
|
|
69
69
|
# return
|
70
70
|
#elsif (require 'rbconfig') && ['mac','darwin'].include?(RbConfig::CONFIG['host_os'])
|
71
71
|
# ogg_player = "afplay"
|
72
|
-
else
|
73
|
-
raise NoOggPlayerFoundException, "Could not find an Ogg Vorbis player"
|
74
72
|
end
|
75
73
|
end
|
76
74
|
|
@@ -96,8 +94,6 @@ module JimmyJukebox
|
|
96
94
|
# return
|
97
95
|
#elsif (require 'rbconfig') && ['mac','darwin'].include?(RbConfig::CONFIG['host_os'])
|
98
96
|
# mp3_player = "afplay"
|
99
|
-
else
|
100
|
-
raise NoMP3PlayerFoundException, "Could not find an MP3 player"
|
101
97
|
end
|
102
98
|
end
|
103
99
|
|
@@ -147,8 +143,8 @@ module JimmyJukebox
|
|
147
143
|
# puts "ARGV: " + ARGV.inspect + " (" + ARGV.class.to_s + ")"
|
148
144
|
if ARGV.empty?
|
149
145
|
music_directories << default_music_dir
|
150
|
-
elsif
|
151
|
-
music_directories << default_music_dir +
|
146
|
+
elsif ARTISTS.keys.include?(ARGV[0].to_sym)
|
147
|
+
music_directories << default_music_dir + artist_key_to_subdir_name(ARGV[0].to_sym)
|
152
148
|
elsif is_a_txt_file?(ARGV[0])
|
153
149
|
set_music_directories_from_file
|
154
150
|
elsif is_a_directory?(ARGV[0])
|
@@ -185,10 +181,16 @@ module JimmyJukebox
|
|
185
181
|
end
|
186
182
|
end
|
187
183
|
|
184
|
+
def all_subdirectories(dir)
|
185
|
+
Dir.glob(File.join(dir,"**/","*/"))
|
186
|
+
.delete_if {|dir_name| !File.directory?(dir_name)}
|
187
|
+
.map { |dir_name| File.expand_path(dir_name) }
|
188
|
+
end
|
189
|
+
|
188
190
|
def add_all_subdirectories
|
189
191
|
new_dirs = []
|
190
192
|
music_directories.each do |dir|
|
191
|
-
new_dirs = new_dirs +
|
193
|
+
new_dirs = new_dirs + all_subdirectories(dir)
|
192
194
|
end
|
193
195
|
self.music_directories = music_directories + new_dirs
|
194
196
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../lib/jimmy_jukebox/artists'
|
3
|
+
include Artists
|
4
|
+
|
5
|
+
#describe Jukebox do
|
6
|
+
|
7
|
+
describe Artists do
|
8
|
+
|
9
|
+
describe "::ARTISTS" do
|
10
|
+
it "has the correct keys" do
|
11
|
+
Artists::ARTISTS.keys.should include(:ch)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has the correct values for each key" do
|
15
|
+
Artists::ARTISTS[:eh].should == { genre: 'JAZZ', name: 'earl_hines' }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#artist_genre" do
|
20
|
+
it "provides the artist's genre" do
|
21
|
+
artist_genre(:lvb).should == 'CLASSICAL'
|
22
|
+
artist_genre(:jrm).should == 'JAZZ'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#artist_name" do
|
27
|
+
it "provides the artist's name" do
|
28
|
+
artist_name(:lh).should == 'lionel_hampton'
|
29
|
+
artist_name(:bg).should == 'benny_goodman'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#artist_name_to_genre" do
|
34
|
+
it "provides the artist's genre" do
|
35
|
+
artist_name_to_genre('sidney_bechet').should == 'JAZZ'
|
36
|
+
artist_name_to_genre('beethoven').should == 'CLASSICAL'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#artist_name_to_subdir_name" do
|
41
|
+
it "provides the artist's subdirectory name" do
|
42
|
+
artist_name_to_subdir_name('dixieland').should == '/JAZZ/Dixieland'
|
43
|
+
artist_name_to_subdir_name('miles_davis').should == '/JAZZ/Miles_Davis'
|
44
|
+
artist_name_to_subdir_name('beethoven').should == '/CLASSICAL/Beethoven'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#artist_key_to_subdir_name" do
|
49
|
+
it "provides the artist's subdirectory name" do
|
50
|
+
artist_key_to_subdir_name(:dx).should == '/JAZZ/Dixieland'
|
51
|
+
artist_key_to_subdir_name(:md).should == '/JAZZ/Miles_Davis'
|
52
|
+
artist_key_to_subdir_name(:lvb).should == '/CLASSICAL/Beethoven'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#artist_key_to_yaml_file" do
|
57
|
+
it "provides the artist's subdirectory name" do
|
58
|
+
artist_key_to_yaml_file(:dx).should == 'Dixieland.yml'
|
59
|
+
artist_key_to_yaml_file(:md).should == 'MilesDavis.yml'
|
60
|
+
artist_key_to_yaml_file(:lvb).should == 'Beethoven.yml'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#artist_name_to_yaml_file" do
|
65
|
+
it "provides the artist's subdirectory name" do
|
66
|
+
artist_name_to_yaml_file('dixieland').should == 'Dixieland.yml'
|
67
|
+
artist_name_to_yaml_file('miles_davis').should == 'MilesDavis.yml'
|
68
|
+
artist_name_to_yaml_file('beethoven').should == 'Beethoven.yml'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/spec/jimmy_jukebox_spec.rb
CHANGED
@@ -2,6 +2,15 @@ require 'spec_helper'
|
|
2
2
|
require_relative '../lib/jimmy_jukebox/jukebox'
|
3
3
|
include JimmyJukebox
|
4
4
|
|
5
|
+
# don't actually play music
|
6
|
+
module JimmyJukebox
|
7
|
+
class Song
|
8
|
+
def spawn_method(command, arg)
|
9
|
+
lambda { |command, arg| sleep(5) }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
5
14
|
describe Jukebox do
|
6
15
|
|
7
16
|
include FakeFS::SpecHelpers
|
@@ -13,54 +22,51 @@ describe Jukebox do
|
|
13
22
|
let(:jb) { Jukebox.new }
|
14
23
|
|
15
24
|
let(:uc) { double('user_config').as_null_object }
|
16
|
-
|
17
25
|
|
18
26
|
context "with no command line parameter" do
|
19
27
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
it "calls play_random_song" do
|
26
|
-
jb.stub(:play_random_song).and_return(nil)
|
27
|
-
jb.should_receive(:play_once)
|
28
|
-
jb.play_once
|
29
|
-
jb.quit
|
30
|
-
end
|
31
|
-
|
32
|
-
it "raises exception when no songs available" do
|
33
|
-
expect { jb.play_once }.to raise_error(Jukebox::NoSongException)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "has a user_config method" do
|
37
|
-
jb.user_config.is_a?(UserConfig)
|
38
|
-
end
|
39
|
-
|
40
|
-
it "generates an empty song list" do
|
41
|
-
jb.user_config.songs.should be_empty
|
42
|
-
jb.user_config.songs.length.should == 0
|
28
|
+
context "when no songs available" do
|
29
|
+
it "raises exception when no songs available" do
|
30
|
+
expect { jb }.to raise_error(Jukebox::NoSongsException)
|
31
|
+
end
|
43
32
|
end
|
44
33
|
|
45
34
|
context "when songs exist" do
|
46
35
|
|
47
|
-
let(:song1) { '
|
48
|
-
let(:song2) { '
|
49
|
-
let(:song3) { '
|
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') }
|
50
39
|
|
51
40
|
before do
|
52
41
|
[song1, song2, song3].each do |song|
|
53
42
|
FileUtils.mkdir_p(File.dirname(song))
|
54
43
|
FileUtils.touch(song)
|
55
|
-
Dir.chdir('
|
44
|
+
Dir.chdir(File.expand_path('~'))
|
56
45
|
end
|
46
|
+
File.exists?(song1).should be_true
|
57
47
|
end
|
58
48
|
|
59
49
|
it "generates a non-empty song list" do
|
60
|
-
jb.
|
61
|
-
jb.
|
62
|
-
jb.
|
63
|
-
jb.
|
50
|
+
jb.songs.should_not be_nil
|
51
|
+
jb.songs.should_not be_empty
|
52
|
+
jb.songs.length.should == 3
|
53
|
+
jb.songs.should include(/Abbey_Road.mp3/)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "can quit" do
|
57
|
+
jb.should_not be_nil
|
58
|
+
jb.quit
|
59
|
+
end
|
60
|
+
|
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
|
66
|
+
end
|
67
|
+
|
68
|
+
it "has a user_config method" do
|
69
|
+
jb.user_config.is_a?(UserConfig)
|
64
70
|
end
|
65
71
|
|
66
72
|
=begin
|
data/spec/song_loader_spec.rb
CHANGED
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'rspec/mocks'
|
3
3
|
require 'fakeweb' # apparently must be required before fakefs
|
4
4
|
FakeWeb.allow_net_connect = false
|
5
|
+
gem 'fakefs', require: 'fakefs/safe'
|
5
6
|
require 'fakefs/safe'
|
6
7
|
require 'jimmy_jukebox/song_loader'
|
7
8
|
|
@@ -13,69 +14,58 @@ describe JimmyJukebox::SongLoader do
|
|
13
14
|
# File.directory?("/home").should be_false
|
14
15
|
#end
|
15
16
|
|
16
|
-
before(:all) do
|
17
|
-
#ARGV.delete_if { |val| true }
|
18
|
-
ARGV.clear
|
19
|
-
#ARGV.pop
|
20
|
-
end
|
21
|
-
|
22
17
|
before(:each) do
|
18
|
+
ARGV.clear
|
23
19
|
@sl = JimmyJukebox::SongLoader
|
24
20
|
end
|
25
21
|
|
26
22
|
describe "#create_save_dir" do
|
23
|
+
include FakeFS::SpecHelpers
|
27
24
|
|
28
25
|
it "should create a directory" do
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
File.directory?(subdir).should be_true
|
35
|
-
end
|
26
|
+
topdir = File.join("/home","user_name4","Music")
|
27
|
+
subdir = File.join(topdir, "rock", "Beatles")
|
28
|
+
File.directory?(subdir).should be_false
|
29
|
+
@sl.create_save_dir(subdir)
|
30
|
+
File.directory?(subdir).should be_true
|
36
31
|
end
|
37
32
|
|
38
33
|
end
|
39
34
|
|
40
35
|
describe "#version_of_song_in_any_dir?" do
|
36
|
+
include FakeFS::SpecHelpers
|
41
37
|
|
42
38
|
it "should return true if song in top of directory tree" do
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
@sl.version_of_song_in_any_dir?(songname,topdir).should be_true
|
54
|
-
end
|
39
|
+
topdir = "/home/user_name1/Music"
|
40
|
+
songname = "Paperback_Writer.mp3"
|
41
|
+
File.directory?(topdir).should be_false
|
42
|
+
FileUtils.mkdir_p(topdir)
|
43
|
+
File.directory?(topdir).should be_true
|
44
|
+
Dir.chdir(topdir)
|
45
|
+
File.exists?(songname).should be_false
|
46
|
+
FileUtils.touch(songname)
|
47
|
+
File.exists?(songname).should be_true
|
48
|
+
@sl.version_of_song_in_any_dir?(songname,topdir).should be_true
|
55
49
|
end
|
56
50
|
|
57
51
|
it "should return true if song in subdirectory" do
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
@sl.version_of_song_in_any_dir?(songname,subdir).should be_true
|
67
|
-
end
|
52
|
+
topdir = "/home/user_name2/Music"
|
53
|
+
subdir = File.join(topdir, "rock", "Beatles")
|
54
|
+
songname = "Paperback_Writer.mp3"
|
55
|
+
File.directory?(subdir).should be_false
|
56
|
+
FileUtils.mkdir_p(subdir)
|
57
|
+
FileUtils.touch(File.join(subdir, songname))
|
58
|
+
File.exists?(File.join(subdir, songname)).should be_true
|
59
|
+
@sl.version_of_song_in_any_dir?(songname,subdir).should be_true
|
68
60
|
end
|
69
61
|
|
70
62
|
it "should return false if song not in directory tree" do
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
@sl.version_of_song_in_any_dir?(songname,subdir).should be_false
|
78
|
-
end
|
63
|
+
topdir = "/home/user_name3/Music"
|
64
|
+
subdir = File.join(topdir, "rock", "Beatles")
|
65
|
+
songname = "Paperback_Writer.mp3"
|
66
|
+
FileUtils.mkdir_p(subdir)
|
67
|
+
File.exists?(File.join(subdir, songname)).should be_false
|
68
|
+
@sl.version_of_song_in_any_dir?(songname,subdir).should be_false
|
79
69
|
end
|
80
70
|
|
81
71
|
end
|
@@ -121,7 +111,7 @@ describe JimmyJukebox::SongLoader do
|
|
121
111
|
it "should try to download many songs" do
|
122
112
|
dirname = File.expand_path(@sl.instance_variable_get(:@user_config).default_music_dir + '/JAZZ/Charlie_Christian')
|
123
113
|
@sl.stub!(:version_of_song_in_any_dir?).and_return(false)
|
124
|
-
@sl.should_receive(:open).exactly(
|
114
|
+
@sl.should_receive(:open).exactly(9).times
|
125
115
|
@sl.charlie_christian
|
126
116
|
File.exists?(dirname).should be_true
|
127
117
|
end
|
@@ -156,6 +146,7 @@ describe JimmyJukebox::SongLoader do
|
|
156
146
|
describe "#dizzy_gillespie with dirname" do
|
157
147
|
|
158
148
|
it "should try to download three songs" do
|
149
|
+
pending "have not yet implemented way to specify artist-specific directory"
|
159
150
|
dirname = File.expand_path(@sl.instance_variable_get(:@user_config).default_music_dir + '/JAZZ/Dizzy_Gillespie')
|
160
151
|
@sl.stub!(:version_of_song_in_any_dir?).and_return(false)
|
161
152
|
@sl.should_receive(:open).exactly(3).times
|
@@ -163,16 +154,16 @@ describe JimmyJukebox::SongLoader do
|
|
163
154
|
end
|
164
155
|
|
165
156
|
it "should successfully download three songs" do
|
166
|
-
pending
|
157
|
+
pending "use FakeWeb"
|
167
158
|
FakeWeb.register_uri(:any, "http://www.archive.org/download/DizzyGillespie-GroovinHigh/02.GroovinHigh.mp3", :response => "/home/james/Music/JAZZ/Dizzy_Gillespie/Groovin' High 1945.mp3")
|
168
159
|
FakeWeb.register_uri(:any, "http://www.archive.org/download/DizzyGillespie-Manteca/01Manteca.ogg", :response => "/home/james/Music/JAZZ/Dizzy_Gillespie/01Manteca.ogg")
|
169
160
|
FakeWeb.register_uri(:any, "http://www.archive.org/download/DizzyGillespieLouisArmstrong-UmbrellaMan/DizzyGillespieLouisArmstrong-UmbrellaMan.mp3", :response => "/home/james/Music/JAZZ/Dizzy_Gillespie/DizzyGillespieLouisArmstrong-UmbrellaMan.mp3")
|
170
161
|
dirname = File.expand_path("/home/user_name6/non-existent-dir")
|
171
162
|
File.exists?(dirname).should be_false
|
172
163
|
@sl.dizzy_gillespie(dirname)
|
173
|
-
|
174
|
-
|
175
|
-
|
164
|
+
File.exists?(dirname + "/02.GroovinHigh.mp3").should be_true
|
165
|
+
File.exists?(dirname + "/01Manteca.ogg").should be_true
|
166
|
+
File.exists?(dirname + "/DizzyGillespieLouisArmstrong-UmbrellaMan.mp3").should be_true
|
176
167
|
FakeWeb.clean_registry
|
177
168
|
end
|
178
169
|
|
data/spec/spec_helper.rb
CHANGED
@@ -6,36 +6,3 @@ end
|
|
6
6
|
|
7
7
|
require 'fakefs/spec_helpers'
|
8
8
|
|
9
|
-
# Overriding FakeFS' File.expand_path
|
10
|
-
# because it delegates to the same class
|
11
|
-
# method in the REAL file system
|
12
|
-
module FakeFS
|
13
|
-
class File
|
14
|
-
def self.expand_path(*args)
|
15
|
-
args[0].gsub(/~/,'/home/xavier')
|
16
|
-
end
|
17
|
-
end
|
18
|
-
# Started overriding FileUtils.ln because FakeFS doesn't know about it
|
19
|
-
# Instead switched to using File.link, which FakeFS knows about
|
20
|
-
end
|
21
|
-
|
22
|
-
# Overriding File.expand_path
|
23
|
-
# so it will provide the fake user's
|
24
|
-
# home directory
|
25
|
-
class File
|
26
|
-
def self.expand_path(*args)
|
27
|
-
args[0].gsub(/~/,'/home/xavier')
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Override exec() to prevent songs from actually playing
|
32
|
-
# Instead, start a brief sleep process
|
33
|
-
#module Kernel
|
34
|
-
# alias :real_exec :exec
|
35
|
-
#
|
36
|
-
# def exec(*cmd)
|
37
|
-
# real_exec("sleep 0.2")
|
38
|
-
# end
|
39
|
-
#end
|
40
|
-
|
41
|
-
|
data/spec/user_config_spec.rb
CHANGED
@@ -27,7 +27,7 @@ describe UserConfig do
|
|
27
27
|
describe "#top_music_dir" do
|
28
28
|
|
29
29
|
it "should parse '~/Music'" do
|
30
|
-
UserConfig.top_music_dir("~/Music").should == "
|
30
|
+
UserConfig.top_music_dir("~/Music").should == File.expand_path("~/Music")
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should parse '/home/xavier/Music'" do
|
@@ -35,15 +35,15 @@ describe UserConfig do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should parse '~/Music/Rock/The_Eagles/hotel_california.mp3'" do
|
38
|
-
UserConfig.top_music_dir("~/Music/Rock/The_Eagles/hotel_california.mp3").should == "
|
38
|
+
UserConfig.top_music_dir("~/Music/Rock/The_Eagles/hotel_california.mp3").should == File.expand_path("~/Music")
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should parse '~/Music/Rock/The Eagles/Hotel California.mp3'" do
|
42
|
-
UserConfig.top_music_dir("~/Music/Rock/The Eagles/Hotel California.mp3").should == "
|
42
|
+
UserConfig.top_music_dir("~/Music/Rock/The Eagles/Hotel California.mp3").should == File.expand_path("~/Music")
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should parse '~/My Music'" do
|
46
|
-
UserConfig.top_music_dir("~/My Music").should == "
|
46
|
+
UserConfig.top_music_dir("~/My Music").should == File.expand_path("~/My Music")
|
47
47
|
end
|
48
48
|
|
49
49
|
end
|
@@ -64,14 +64,30 @@ describe UserConfig do
|
|
64
64
|
|
65
65
|
end
|
66
66
|
|
67
|
-
context "with songs" do
|
67
|
+
context "with songs in ~/Music" do
|
68
|
+
|
69
|
+
before(:each) do
|
70
|
+
FileUtils.mkdir_p File.expand_path("~/Music")
|
71
|
+
FileUtils.touch File.expand_path("~/Music/Yellow_Submarine.mp3")
|
72
|
+
end
|
73
|
+
|
74
|
+
it "finds songs" do
|
75
|
+
uc.songs.should_not be_empty
|
76
|
+
uc.songs.length.should == 1
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
context "with songs in ~/Music subdirectory" do
|
68
82
|
|
69
83
|
before do
|
70
|
-
FileUtils.mkdir_p "/
|
71
|
-
FileUtils.touch "/
|
84
|
+
FileUtils.mkdir_p File.expand_path("~/Music/ROCK/Beatles")
|
85
|
+
FileUtils.touch File.expand_path("~/Music/ROCK/Beatles/Yellow_Submarine.mp3")
|
72
86
|
end
|
73
87
|
|
74
88
|
it "finds songs" do
|
89
|
+
File.directory?(File.expand_path("~/Music/ROCK/Beatles")).should be_true
|
90
|
+
p uc.songs.to_s
|
75
91
|
uc.songs.should_not be_empty
|
76
92
|
uc.songs.length.should == 1
|
77
93
|
end
|
metadata
CHANGED
@@ -1,125 +1,114 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jimmy_jukebox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
version: 0.4.3
|
5
|
+
prerelease:
|
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-
|
12
|
+
date: 2013-02-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
17
18
|
requirements:
|
18
|
-
- -
|
19
|
+
- - ! '>='
|
19
20
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
21
|
-
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
25
|
none: false
|
23
|
-
requirement: !ruby/object:Gem::Requirement
|
24
26
|
requirements:
|
25
|
-
- -
|
27
|
+
- - ! '>='
|
26
28
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
28
|
-
MA==
|
29
|
-
none: false
|
30
|
-
prerelease: false
|
31
|
-
type: :development
|
29
|
+
version: '0'
|
32
30
|
- !ruby/object:Gem::Dependency
|
33
31
|
name: rspec-core
|
34
|
-
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
35
34
|
requirements:
|
36
|
-
- -
|
35
|
+
- - ! '>='
|
37
36
|
- !ruby/object:Gem::Version
|
38
|
-
version:
|
39
|
-
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
41
|
none: false
|
41
|
-
requirement: !ruby/object:Gem::Requirement
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
46
|
-
MA==
|
47
|
-
none: false
|
48
|
-
prerelease: false
|
49
|
-
type: :development
|
45
|
+
version: '0'
|
50
46
|
- !ruby/object:Gem::Dependency
|
51
47
|
name: rspec-mocks
|
52
|
-
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
53
50
|
requirements:
|
54
|
-
- -
|
51
|
+
- - ! '>='
|
55
52
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
57
|
-
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
57
|
none: false
|
59
|
-
requirement: !ruby/object:Gem::Requirement
|
60
58
|
requirements:
|
61
|
-
- -
|
59
|
+
- - ! '>='
|
62
60
|
- !ruby/object:Gem::Version
|
63
|
-
version:
|
64
|
-
MA==
|
65
|
-
none: false
|
66
|
-
prerelease: false
|
67
|
-
type: :development
|
61
|
+
version: '0'
|
68
62
|
- !ruby/object:Gem::Dependency
|
69
63
|
name: rspec-expectations
|
70
|
-
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
71
66
|
requirements:
|
72
|
-
- -
|
67
|
+
- - ! '>='
|
73
68
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
75
|
-
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
76
73
|
none: false
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
74
|
requirements:
|
79
|
-
- -
|
75
|
+
- - ! '>='
|
80
76
|
- !ruby/object:Gem::Version
|
81
|
-
version:
|
82
|
-
MA==
|
83
|
-
none: false
|
84
|
-
prerelease: false
|
85
|
-
type: :development
|
77
|
+
version: '0'
|
86
78
|
- !ruby/object:Gem::Dependency
|
87
79
|
name: fakefs
|
88
|
-
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
89
82
|
requirements:
|
90
|
-
- -
|
83
|
+
- - ! '>='
|
91
84
|
- !ruby/object:Gem::Version
|
92
|
-
version:
|
93
|
-
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
89
|
none: false
|
95
|
-
requirement: !ruby/object:Gem::Requirement
|
96
90
|
requirements:
|
97
|
-
- -
|
91
|
+
- - ! '>='
|
98
92
|
- !ruby/object:Gem::Version
|
99
|
-
version:
|
100
|
-
MA==
|
101
|
-
none: false
|
102
|
-
prerelease: false
|
103
|
-
type: :development
|
93
|
+
version: '0'
|
104
94
|
- !ruby/object:Gem::Dependency
|
105
95
|
name: fakeweb
|
106
|
-
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
107
98
|
requirements:
|
108
|
-
- -
|
99
|
+
- - ! '>='
|
109
100
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
111
|
-
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
112
105
|
none: false
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
106
|
requirements:
|
115
|
-
- -
|
107
|
+
- - ! '>='
|
116
108
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
118
|
-
|
119
|
-
|
120
|
-
prerelease: false
|
121
|
-
type: :development
|
122
|
-
description: jimmy_jukebox plays random MP3 & OGG songs under a directory (or set of directories) and can download music
|
109
|
+
version: '0'
|
110
|
+
description: jimmy_jukebox plays random MP3 & OGG songs under a directory (or set
|
111
|
+
of directories) and can download music
|
123
112
|
email: james@jameslavin.com
|
124
113
|
executables:
|
125
114
|
- play_jukebox
|
@@ -162,6 +151,7 @@ files:
|
|
162
151
|
- lib/jimmy_jukebox/songs/CountBasie.yml
|
163
152
|
- lib/jimmy_jukebox/songs/ArchibaldCampBanjo.yml
|
164
153
|
- lib/jimmy_jukebox/songs/SidneyBechet.yml
|
154
|
+
- lib/jimmy_jukebox/songs/Beethoven.yml
|
165
155
|
- lib/jimmy_jukebox/songs/JamesPJohnson.yml
|
166
156
|
- lib/jimmy_jukebox/songs/JellyRollMorton.yml
|
167
157
|
- lib/jimmy_jukebox/songs/Ragtime.yml
|
@@ -169,39 +159,41 @@ files:
|
|
169
159
|
- spec/jimmy_jukebox_spec.rb
|
170
160
|
- spec/song_loader_spec.rb
|
171
161
|
- spec/user_config_spec.rb
|
162
|
+
- spec/artists_spec.rb
|
172
163
|
- spec/song_spec.rb
|
173
164
|
- spec/spec_helper.rb
|
174
165
|
- bin/play_jukebox
|
175
166
|
- bin/load_jukebox
|
176
167
|
homepage: https://github.com/JamesLavin/jimmy_jukebox
|
177
168
|
licenses: []
|
178
|
-
post_install_message: I really hope you enjoy the great jazz downloadable using this
|
169
|
+
post_install_message: I really hope you enjoy the great jazz downloadable using this
|
170
|
+
gem!
|
179
171
|
rdoc_options: []
|
180
172
|
require_paths:
|
181
173
|
- lib
|
182
174
|
required_ruby_version: !ruby/object:Gem::Requirement
|
175
|
+
none: false
|
183
176
|
requirements:
|
184
|
-
- -
|
177
|
+
- - ! '>='
|
185
178
|
- !ruby/object:Gem::Version
|
186
|
-
version:
|
187
|
-
MA==
|
188
|
-
none: false
|
179
|
+
version: '0'
|
189
180
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
|
+
none: false
|
190
182
|
requirements:
|
191
|
-
- -
|
183
|
+
- - ! '>='
|
192
184
|
- !ruby/object:Gem::Version
|
193
|
-
version:
|
194
|
-
MA==
|
195
|
-
none: false
|
185
|
+
version: '0'
|
196
186
|
requirements: []
|
197
187
|
rubyforge_project: jimmy_jukebox
|
198
|
-
rubygems_version: 1.8.
|
199
|
-
signing_key:
|
188
|
+
rubygems_version: 1.8.23
|
189
|
+
signing_key:
|
200
190
|
specification_version: 3
|
201
191
|
summary: plays your MP3 & OGG files and lets you easily download music
|
202
192
|
test_files:
|
203
193
|
- spec/jimmy_jukebox_spec.rb
|
204
194
|
- spec/song_loader_spec.rb
|
205
195
|
- spec/user_config_spec.rb
|
196
|
+
- spec/artists_spec.rb
|
206
197
|
- spec/song_spec.rb
|
207
198
|
- spec/spec_helper.rb
|
199
|
+
has_rdoc:
|