text-to-noise 0.1.4 → 0.2.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/bin/play_noise +11 -4
- data/bin/text_to_noise +53 -4
- data/features/commandline.feature +33 -0
- data/lib/text_to_noise.rb +2 -1
- data/lib/text_to_noise/command_line.rb +7 -1
- data/lib/text_to_noise/player.rb +26 -8
- data/lib/text_to_noise/version.rb +1 -1
- data/spec/text_to_noise/command_line_spec.rb +58 -52
- metadata +3 -1
data/bin/play_noise
CHANGED
@@ -7,10 +7,17 @@ require 'text_to_noise'
|
|
7
7
|
|
8
8
|
player = TextToNoise::Player.new
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
begin
|
11
|
+
ARGV.each do |sound|
|
12
|
+
sound += ".wav" unless sound =~ /\.wav$/
|
13
|
+
player.play sound
|
14
|
+
sleep 1
|
15
|
+
end
|
16
|
+
rescue TextToNoise::Player::SoundNotFound => e
|
17
|
+
$stderr.puts e.message
|
18
|
+
$stderr.puts "Sorry, but I know how to play these sounds:\n"
|
19
|
+
$stderr.print "\t"
|
20
|
+
$stderr.puts player.available_sounds.join( "\n\t" )
|
14
21
|
end
|
15
22
|
|
16
23
|
sleep 1 while player.playing?
|
data/bin/text_to_noise
CHANGED
@@ -12,15 +12,64 @@ options = {
|
|
12
12
|
:config => "sample.sounds.rb"
|
13
13
|
}
|
14
14
|
|
15
|
-
OptionParser.new do |opts|
|
15
|
+
arg_parser = OptionParser.new do |opts|
|
16
16
|
opts.banner = "Usage: #{$0} [options]"
|
17
|
-
|
17
|
+
opts.separator ""
|
18
|
+
opts.separator "Options:"
|
19
|
+
|
18
20
|
opts.on( "-f", "--file FILE",
|
19
21
|
"Read input from FILE. Defaults to stdin" ) { |f| options[:input] = File.open( f, "r" ) }
|
20
22
|
opts.on( "-c", "--config MAPPING_CONFIG",
|
21
23
|
"Read input to sound mapping configuration from MAPPING_CONFIG" ) { |c| options[:config] = c }
|
22
24
|
opts.on( "-m", "--mute",
|
23
25
|
"Don't play any sounds, just print what matched" ) { options[:mute] = true }
|
24
|
-
|
26
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
27
|
+
puts opts
|
28
|
+
exit
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
arg_parser.parse!
|
33
|
+
|
34
|
+
begin
|
35
|
+
TextToNoise::CommandLine.new( options ).run
|
36
|
+
rescue ArgumentError
|
37
|
+
$stderr.puts arg_parser
|
38
|
+
$stderr.puts <<-EOS
|
39
|
+
|
40
|
+
ERROR!
|
41
|
+
|
42
|
+
Could not locate a noise configuration.
|
43
|
+
Specify a configuration with the -c option.
|
44
|
+
|
45
|
+
Try this one if you're processing a Rails log:
|
46
|
+
|
47
|
+
match /Rendered/ => %w(crickets canary)
|
48
|
+
match /Rendering/ => "cardinal"
|
49
|
+
match /User Load/ => "nightingale"
|
50
|
+
match /Processing/ => "finch"
|
51
|
+
match /SessionsController#new/ => "owl"
|
52
|
+
match /404 Not Found/ => "hawk"
|
53
|
+
|
54
|
+
Or maybe you're watching your ssh access:
|
55
|
+
|
56
|
+
match /sshd.*Accepted/ => %w[rooster hawk chicken crow]
|
57
|
+
|
58
|
+
Copy one of those into a file and pass it along to text_to_noise.
|
59
|
+
|
60
|
+
For example:
|
61
|
+
|
62
|
+
echo 'match /sshd.*Accepted/ => %w[rooster hawk chicken crow]' > ssh.sounds.rb
|
63
|
+
tail -f /var/log/secure.log | text_to_noise -c ssh.sounds.rb
|
64
|
+
|
65
|
+
Still having problems?
|
66
|
+
Try logging an issue at https://github.com/tobytripp/text_to_noise/issues
|
67
|
+
or try bothering me on Twitter http://twitter.com/tobytripp
|
68
|
+
|
69
|
+
|
70
|
+
Thanks for playing!
|
71
|
+
|
25
72
|
|
26
|
-
|
73
|
+
EOS
|
74
|
+
exit 1
|
75
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
Feature: Running text_to_noise
|
2
|
+
|
3
|
+
Use the command-line to tell text-to-noise where to find your config file, the
|
4
|
+
input to parse, and whether it should actually make any noise.
|
5
|
+
|
6
|
+
Scenario: Calling with no arguments
|
7
|
+
When I run `text_to_noise`
|
8
|
+
|
9
|
+
Then the output should contain:
|
10
|
+
"""
|
11
|
+
Could not locate a noise configuration.
|
12
|
+
Specify a configuration with the -c option.
|
13
|
+
|
14
|
+
Try this one if you're processing a Rails log:
|
15
|
+
|
16
|
+
match /Rendered/ => %w(crickets canary)
|
17
|
+
match /Rendering/ => "cardinal"
|
18
|
+
match /User Load/ => "nightingale"
|
19
|
+
match /Processing/ => "finch"
|
20
|
+
match /SessionsController#new/ => "owl"
|
21
|
+
match /404 Not Found/ => "hawk"
|
22
|
+
|
23
|
+
Or maybe you're watching your ssh access:
|
24
|
+
|
25
|
+
match /sshd.*Accepted/ => %w[rooster hawk chicken crow]
|
26
|
+
|
27
|
+
Copy one of those into a file and pass it along to text_to_noise.
|
28
|
+
|
29
|
+
For example:
|
30
|
+
|
31
|
+
echo 'match /sshd.*Accepted/ => %w[rooster hawk chicken crow]' > ssh.sounds.rb
|
32
|
+
tail -f /var/log/secure.log | text_to_noise -c ssh.sounds.rb
|
33
|
+
"""
|
data/lib/text_to_noise.rb
CHANGED
@@ -2,11 +2,12 @@ LIB_DIR = File.dirname File.expand_path( __FILE__ )
|
|
2
2
|
APP_ROOT = File.join LIB_DIR, '..'
|
3
3
|
$LOAD_PATH << LIB_DIR
|
4
4
|
|
5
|
+
require 'logger'
|
6
|
+
|
5
7
|
Dir["#{LIB_DIR}/text_to_noise/*.rb"].each { |lib|
|
6
8
|
lib =~ %r<lib/(.*)\.rb$>
|
7
9
|
require $1
|
8
10
|
}
|
9
|
-
require 'logger'
|
10
11
|
|
11
12
|
module TextToNoise
|
12
13
|
def self.player
|
@@ -1,11 +1,17 @@
|
|
1
|
+
require 'text_to_noise/logging'
|
2
|
+
|
1
3
|
module TextToNoise
|
2
4
|
class CommandLine
|
5
|
+
include Logging
|
3
6
|
attr_reader :options, :mapping
|
4
7
|
|
5
8
|
def initialize( options={} )
|
6
9
|
@options = {
|
7
10
|
:input => $stdin
|
8
11
|
}.merge options
|
12
|
+
|
13
|
+
raise ArgumentError, "No configuration file provided." unless @options[:config]
|
14
|
+
|
9
15
|
@mapping = Mapper.parse File.read( @options[:config] )
|
10
16
|
TextToNoise.player = self.player
|
11
17
|
rescue Errno::ENOENT => e
|
@@ -14,7 +20,7 @@ module TextToNoise
|
|
14
20
|
|
15
21
|
def run
|
16
22
|
LogReader.new( options[:input], mapping ).call
|
17
|
-
|
23
|
+
info "Input processing complete. Waiting for playback to finish..."
|
18
24
|
while TextToNoise.player.playing?
|
19
25
|
sleep 1
|
20
26
|
end
|
data/lib/text_to_noise/player.rb
CHANGED
@@ -10,14 +10,7 @@ module TextToNoise
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def initialize()
|
13
|
-
|
14
|
-
require 'rubygame'
|
15
|
-
rescue LoadError
|
16
|
-
require 'rubygems'
|
17
|
-
require 'rubygame'
|
18
|
-
end
|
19
|
-
|
20
|
-
raise "No Mixer found! Make sure sdl_mixer is installed." unless defined? Rubygame::Sound
|
13
|
+
self.class.load_rubygame
|
21
14
|
|
22
15
|
Rubygame::Sound.autoload_dirs << SOUND_DIR
|
23
16
|
themes = Dir.new(SOUND_DIR).entries.reject { |e| e =~ /[.]/ }
|
@@ -41,5 +34,30 @@ module TextToNoise
|
|
41
34
|
@sounds = @sounds.select &:playing?
|
42
35
|
not @sounds.empty?
|
43
36
|
end
|
37
|
+
|
38
|
+
def available_sounds()
|
39
|
+
Rubygame::Sound.autoload_dirs.map do |dir|
|
40
|
+
Dir[ "#{dir}/*.wav" ].map { |f| File.basename f }
|
41
|
+
end.flatten
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.load_rubygame()
|
45
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
46
|
+
old_stream, stream = $stdout.dup, $stdout
|
47
|
+
stream.reopen '/dev/null'
|
48
|
+
stream.sync = true
|
49
|
+
|
50
|
+
begin
|
51
|
+
require 'rubygame'
|
52
|
+
rescue LoadError
|
53
|
+
require 'rubygems'
|
54
|
+
require 'rubygame'
|
55
|
+
end
|
56
|
+
|
57
|
+
raise "No Mixer found! Make sure sdl_mixer is installed." unless defined? Rubygame::Sound
|
58
|
+
ensure
|
59
|
+
$VERBOSE = old_verbose
|
60
|
+
stream.reopen(old_stream)
|
61
|
+
end
|
44
62
|
end
|
45
63
|
end
|
@@ -1,70 +1,76 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
module TextToNoise
|
4
|
-
describe TextToNoise::CommandLine do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
describe "#initialize" do
|
15
|
-
it "accepts an options object" do
|
16
|
-
CommandLine.new( {} )
|
4
|
+
describe TextToNoise::CommandLine do
|
5
|
+
let( :mapping ) { double( Mapping ) }
|
6
|
+
let( :reader ) { double( LogReader, :call => nil ) }
|
7
|
+
|
8
|
+
before :each do
|
9
|
+
Mapper.stub!( :parse ).and_return mapping
|
10
|
+
LogReader.stub!( :new ).and_return reader
|
11
|
+
File.stub!( :read ).with( "sound_map.rb" ).and_return "config"
|
17
12
|
end
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
14
|
+
describe "#initialize" do
|
15
|
+
it "accepts an options object" do
|
16
|
+
CommandLine.new( { :config => "sound_map.rb" } )
|
17
|
+
end
|
18
|
+
|
19
|
+
it "throws an error if no config file is given" do
|
20
|
+
lambda {
|
21
|
+
CommandLine.new
|
22
|
+
}.should raise_error( ArgumentError )
|
23
|
+
end
|
24
|
+
|
25
|
+
it "raises an error if the config file cannot be found" do
|
26
|
+
File.stub!( :read ).and_raise Errno::ENOENT
|
27
|
+
lambda {
|
28
|
+
CommandLine.new :config => "not_found"
|
29
|
+
}.should raise_error( ArgumentError )
|
30
|
+
end
|
25
31
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
+
context "when given a 'config' option" do
|
33
|
+
it "instantiates a Mapping object with the specified configuration" do
|
34
|
+
File.should_receive( :read ).with( "sound_map.rb" ).and_return "config"
|
35
|
+
Mapper.should_receive( :parse ).with( "config" )
|
36
|
+
|
37
|
+
CommandLine.new :config => "sound_map.rb"
|
38
|
+
end
|
32
39
|
end
|
33
|
-
end
|
34
40
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
41
|
+
context "when given the 'mute' option" do
|
42
|
+
it "sets the global Player to an instance of MutePlayer" do
|
43
|
+
TextToNoise.should_receive( :player= ).with instance_of( MutePlayer )
|
44
|
+
CommandLine.new :mute => true, :config => "sound_map.rb"
|
45
|
+
end
|
39
46
|
end
|
40
47
|
end
|
41
|
-
end
|
42
48
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
49
|
+
describe "#run" do
|
50
|
+
let( :options ) { Hash[:input, :io, :config, "sound_map.rb"] }
|
51
|
+
|
52
|
+
subject { CommandLine.new( options ) }
|
47
53
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
54
|
+
|
55
|
+
it "creates a new LogReader object" do
|
56
|
+
LogReader.should_receive( :new )
|
57
|
+
subject.run
|
58
|
+
end
|
53
59
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
60
|
+
it "passes the contents of the file in :input option to the reader" do
|
61
|
+
LogReader.should_receive( :new ).with( :io, anything )
|
62
|
+
subject.run
|
63
|
+
end
|
58
64
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
65
|
+
it "passes an instance of a Mapping to the LogReader" do
|
66
|
+
LogReader.should_receive( :new ).with( anything, mapping )
|
67
|
+
subject.run
|
68
|
+
end
|
63
69
|
|
64
|
-
|
65
|
-
|
66
|
-
|
70
|
+
it "calls #call on the LogReader" do
|
71
|
+
reader.should_receive :call
|
72
|
+
subject.run
|
73
|
+
end
|
67
74
|
end
|
68
75
|
end
|
69
76
|
end
|
70
|
-
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: text-to-noise
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Toby Tripp
|
@@ -77,6 +77,7 @@ files:
|
|
77
77
|
- bin/play_noise
|
78
78
|
- bin/text_to_noise
|
79
79
|
- cucumber.yml
|
80
|
+
- features/commandline.feature
|
80
81
|
- features/configuration.feature
|
81
82
|
- features/step_definitions/debugger_steps.rb
|
82
83
|
- features/support/env.rb
|
@@ -155,6 +156,7 @@ signing_key:
|
|
155
156
|
specification_version: 3
|
156
157
|
summary: Play sounds based on string matches.
|
157
158
|
test_files:
|
159
|
+
- features/commandline.feature
|
158
160
|
- features/configuration.feature
|
159
161
|
- features/step_definitions/debugger_steps.rb
|
160
162
|
- features/support/env.rb
|