nyan-cat-formatter 0.8.0 → 0.9.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.
data/.travis.yml CHANGED
@@ -4,7 +4,6 @@ before_script:
4
4
 
5
5
  rvm:
6
6
  - 1.8.7
7
- - 1.9.2
8
7
  - 1.9.3
9
8
  - 2.1.0
10
9
  - ree
@@ -1,8 +1,6 @@
1
1
  module NyanCatFormat
2
2
  module Music
3
3
 
4
- MUSIC_LENGTH = 27.06 # seconds
5
-
6
4
  def osx?
7
5
  platform.downcase.include?("darwin")
8
6
  end
@@ -33,30 +31,8 @@ module NyanCatFormat
33
31
 
34
32
  def start input
35
33
  super
36
- t = Thread.new do
37
- loop do
38
- if osx?
39
- kernel.system("afplay #{nyan_mp3} &")
40
- elsif linux?
41
- play_on_linux
42
- end
43
- Thread.current["started_playing"] ||= true
44
- sleep MUSIC_LENGTH
45
- end
46
- end
47
- until t["started_playing"]
48
- sleep 0.001
49
- end
50
- end
51
-
52
- def kill_music
53
- if File.exists? nyan_mp3
54
- if osx?
55
- system("killall -9 afplay &>/dev/null")
56
- elsif linux?
57
- kill_music_on_linux
58
- end
59
- end
34
+ @music_thread = Thread.new { start_music_or_kill(Thread.current) }
35
+ wait_for_music_to_start(@music_thread)
60
36
  end
61
37
 
62
38
  def dump_summary(*args)
@@ -66,15 +42,42 @@ module NyanCatFormat
66
42
 
67
43
  private
68
44
 
69
- def play_on_linux
70
- kernel.system("[ -e #{nyan_mp3} ] && type mpg321 &>/dev/null && mpg321 #{nyan_mp3} &>/dev/null &") if kernel.system('which mpg321 &>/dev/null && type mpg321 &>/dev/null')
71
- kernel.system("[ -e #{nyan_mp3} ] && type mpg123 &>/dev/null && mpg123 #{nyan_mp3} &>/dev/null &") if kernel.system('which mpg123 &>/dev/null && type mpg123 &>/dev/null')
45
+ def kill_music
46
+ if @music_thread && @music_thread['music_pid']
47
+ @music_thread.kill
48
+ Process.kill('KILL', @music_thread['music_pid'])
49
+ end
72
50
  end
73
51
 
74
- def kill_music_on_linux
75
- system("killall -9 mpg321 &>/dev/null") if kernel.system("which mpg321 &>/dev/null && type mpg321 &>/dev/null")
76
- system("killall -9 mpg123 &>/dev/null") if kernel.system("which mpg123 &>/dev/null && type mpg123 &>/dev/null")
52
+ def linux_player
53
+ %w{mpg321 mpg123}.find {|player|
54
+ kernel.system("which #{ player } &>/dev/null && type #{ player } &>/dev/null")
55
+ }
77
56
  end
78
57
 
58
+ def music_command
59
+ # this isn't really threadsafe but it'll work if we're careful
60
+ return @music_command if @music_command
61
+ if osx?
62
+ @music_command = "afplay #{nyan_mp3}"
63
+ elsif linux? && linux_player
64
+ @music_command = "#{ linux_player } #{ nyan_mp3 } &>/dev/null"
65
+ end
66
+ end
67
+
68
+ def start_music_or_kill(thread)
69
+ thread.exit unless File.exists?(nyan_mp3) && music_command
70
+ loop do
71
+ thread['music_pid'] = kernel.spawn(music_command)
72
+ thread["started_playing"] ||= true
73
+ Process.wait(thread['music_pid'])
74
+ end
75
+ end
76
+
77
+ def wait_for_music_to_start(music_thread)
78
+ while !music_thread["started_playing"] && music_thread.status
79
+ sleep 0.001
80
+ end
81
+ end
79
82
  end
80
83
  end
@@ -2,7 +2,7 @@ $:.push File.expand_path("../lib", __FILE__)
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "nyan-cat-formatter"
5
- s.version = "0.8.0"
5
+ s.version = "0.9.0"
6
6
  s.authors = ["Matt Sears"]
7
7
  s.email = ["matt@mattsears.com"]
8
8
  s.homepage = "https://github.com/mattsears/nyan-cat-formatter"
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'stringio'
3
+ require 'fileutils'
3
4
  require 'nyan_cat_music_formatter'
4
5
 
5
6
  class MockKernel
@@ -7,6 +8,11 @@ class MockKernel
7
8
  seen << string
8
9
  end
9
10
 
11
+ def spawn(string)
12
+ seen << string
13
+ rand(10000)
14
+ end
15
+
10
16
  def seen
11
17
  @seen ||= []
12
18
  end
@@ -45,6 +51,11 @@ describe NyanCatMusicFormatter do
45
51
  end
46
52
 
47
53
  describe 'start' do
54
+ before do
55
+ allow(Process).to receive(:wait) { sleep 1 }
56
+ allow(Process).to receive(:kill).and_return(true)
57
+ end
58
+
48
59
  it 'sets the total amount of specs' do
49
60
  formatter.start 3
50
61
  expect(formatter.example_count).to eql(3)
@@ -60,20 +71,29 @@ describe NyanCatMusicFormatter do
60
71
 
61
72
  it 'plays the song in the background' do
62
73
  formatter.start 3
63
- expect(mock_kernel.seen).to include("afplay #{path_to_mp3} &")
74
+ expect(mock_kernel.seen).to include("afplay #{path_to_mp3}")
64
75
  end
65
76
  end
66
77
 
67
78
  context 'when on linux' do
68
79
  before { formatter.platform = 'linux'}
69
- it 'plays the song for linux too' do
80
+
81
+ it 'plays the song for linux too with mpg123 when available' do
82
+ allow(mock_kernel).to receive(:system).with(match(/which mpg123/)).and_return(true)
83
+ allow(mock_kernel).to receive(:system).with(match(/which mpg321/)).and_return(false)
84
+ formatter.start 10
85
+ expect(mock_kernel.seen.any? { |entry| entry. end_with? "mpg123 #{path_to_mp3} &>/dev/null" }).to be
86
+ end
87
+
88
+ it 'plays the song for linux too with mpg321 when available' do
89
+ allow(mock_kernel).to receive(:system).with(match(/which mpg321/)).and_return(true)
90
+ allow(mock_kernel).to receive(:system).with(match(/which mpg123/)).and_return(false)
70
91
  formatter.start 10
71
- expect(mock_kernel.seen.any? { |entry| entry. end_with? "mpg321 #{path_to_mp3} &>/dev/null &" }).to be
72
- expect(mock_kernel.seen.any? { |entry| entry. end_with? "mpg123 #{path_to_mp3} &>/dev/null &" }).to be
92
+ expect(mock_kernel.seen.any? { |entry| entry. end_with? "mpg321 #{path_to_mp3} &>/dev/null" }).to be
73
93
  end
74
94
  end
75
95
 
76
- context 'when not on OS X' do
96
+ context 'when on Windows' do
77
97
  before { formatter.platform = 'windows' }
78
98
 
79
99
  it 'does not play the song' do
@@ -81,5 +101,20 @@ describe NyanCatMusicFormatter do
81
101
  expect(mock_kernel.seen).to be_empty
82
102
  end
83
103
  end
104
+
105
+ context 'when the music file does not exist' do
106
+ before do
107
+ FileUtils.mv path_to_mp3, "#{ path_to_mp3 }.tmp"
108
+ end
109
+
110
+ after do
111
+ FileUtils.mv "#{ path_to_mp3 }.tmp", path_to_mp3
112
+ end
113
+
114
+ it "won't try to play anything" do
115
+ formatter.start 42
116
+ expect(mock_kernel.seen).to be_empty
117
+ end
118
+ end
84
119
  end
85
120
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nyan-cat-formatter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-06-08 00:00:00.000000000 Z
12
+ date: 2014-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec