talks 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +1 -1
- data/README.md +57 -23
- data/bin/talking +1 -1
- data/lib/talks.rb +14 -3
- data/lib/talks/configuration.rb +19 -6
- data/lib/talks/hooks.rb +18 -3
- data/lib/talks/version.rb +1 -1
- data/spec/talks/basic_spec.rb +15 -7
- data/talks.gemspec +5 -0
- metadata +52 -3
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
coverage/
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,21 +1,33 @@
|
|
1
1
|
# Talks gem — now your ruby and command-line tools can talk with you
|
2
2
|
|
3
|
-
### This is beta now.
|
4
|
-
|
5
3
|
### Build Status ![http://travis-ci.org/ruby-talks/talks](https://secure.travis-ci.org/ruby-talks/talks.png)
|
6
4
|
|
7
5
|
If you want to HEAR some response from your code or command-line tools, just use this gem.
|
8
6
|
|
9
|
-
You can use this gem on MacOS X and on other linux/unix systems with
|
7
|
+
You can use this gem on MacOS X and on other linux/unix systems with [espeak](http://espeak.sourceforge.net) installed.
|
8
|
+
|
9
|
+
Now with support for notifiers through [notifier](https://github.com/fnando/notifier) gem!
|
10
|
+
Check the notifier's
|
11
|
+
[README](https://github.com/fnando/notifier/blob/master/README.rdoc) and
|
12
|
+
find what notifier you want to use - there is support for every OS!
|
13
|
+
|
14
|
+
I added in all sections of this readme notes about usage notifier
|
15
|
+
functionality.
|
10
16
|
|
11
17
|
Sponsored by Evil Martians <http://evilmartians.com>
|
12
18
|
|
13
19
|
## Why?
|
14
20
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
21
|
+
### Example
|
22
|
+
|
23
|
+
You're running some really long task and you leave the desk to drink some coffee, read a book or surf the internet
|
24
|
+
and you want to be notified that the task has finished its execution. You don't want to check your machine each minute. With this gem
|
25
|
+
you can just add a little hook at the end of your code and when the execution ends - you will hear it in voice
|
26
|
+
that you have chosen from MacOS X `say` function collection or from `espeak` collection.
|
27
|
+
|
28
|
+
Now if you forgot power on you sound on machine you can always see
|
29
|
+
notifications by notifiers like Growl, Kdialog, Knotify, etc. Full list of notifiers is
|
30
|
+
[here](https://github.com/fnando/notifier/blob/master/README.rdoc).
|
19
31
|
|
20
32
|
You can find some examples of `talks` usage in organization [ruby-talks](https://github.com/ruby-talks):
|
21
33
|
|
@@ -25,10 +37,12 @@ You can find some examples of `talks` usage in organization [ruby-talks](https:/
|
|
25
37
|
|
26
38
|
## How?
|
27
39
|
|
28
|
-
On MacOS X this gem just using native MacOS X `say` command line tool.
|
29
|
-
On linix/unix this gem using espeak speech synthesis.
|
40
|
+
On MacOS X this gem is just using the native MacOS X `say` command line tool.
|
41
|
+
On linix/unix this gem is using espeak speech synthesis.
|
42
|
+
|
43
|
+
For notifications this gem uses [notifier](https://github.com/fnando/notifier/blob/master/README.rdoc) gem.
|
30
44
|
|
31
|
-
### In all examples below I used MacOS X voice types. For espeak you can read section [Using talks with espeak](https://github.com/ruby-talks/talks#using-talks-with-espeak)
|
45
|
+
### In all examples below I've used MacOS X voice types. For espeak you can read section [Using talks with espeak](https://github.com/ruby-talks/talks#using-talks-with-espeak)
|
32
46
|
|
33
47
|
### Configuration
|
34
48
|
|
@@ -38,6 +52,7 @@ You can configure default voices and messages for `talks` with `~/.talksrc` file
|
|
38
52
|
```yml
|
39
53
|
default_voice: 'whisper'
|
40
54
|
engine: 'say'
|
55
|
+
notifier: 'off' # if this option passed - you will not receive notifications at all
|
41
56
|
voices:
|
42
57
|
info: 'pipe'
|
43
58
|
messages:
|
@@ -45,8 +60,9 @@ messages:
|
|
45
60
|
warn: 'WE GONNA DIE!!!'
|
46
61
|
```
|
47
62
|
|
48
|
-
|
49
|
-
|
63
|
+
You can also do it in your code dynamically through Talks.config instance.
|
64
|
+
|
65
|
+
You can configure only the default voice for `say` method and voices and messages for 4 types of talks: `info, warn, success, error`
|
50
66
|
|
51
67
|
For command-line commands you can configure default voices and hook messages:
|
52
68
|
|
@@ -56,6 +72,9 @@ bundle:
|
|
56
72
|
voice: 'vicki'
|
57
73
|
before_message: 'Bundler again will do all right'
|
58
74
|
after_message: "Bundler's job is done here"
|
75
|
+
before_notify: 'This will go to notification before `before_message`'
|
76
|
+
after_notify: 'This will go to notification after `after_message`'
|
77
|
+
# notifier: 'off' # this option will turn off notifications for this command
|
59
78
|
```
|
60
79
|
|
61
80
|
You can create your own default preferences for each command-line tool which you want to run with `talks` or `talking` command in front:
|
@@ -65,7 +84,10 @@ You can create your own default preferences for each command-line tool which you
|
|
65
84
|
ls:
|
66
85
|
voice: 'bad'
|
67
86
|
before_message: 'Now we will see what in the directory'
|
68
|
-
after_message: ''
|
87
|
+
after_message: '.'
|
88
|
+
before_notify: 'This will go to notification before `before_message`'
|
89
|
+
after_notify: 'This will go to notification after `after_message`'
|
90
|
+
# notifier: 'off' # this option will turn off notifications for this command
|
69
91
|
cap:
|
70
92
|
...
|
71
93
|
vim:
|
@@ -84,13 +106,20 @@ $ talking bundle install
|
|
84
106
|
```
|
85
107
|
|
86
108
|
After that `talks` will wrap execution of this command with voice messages. By default messages will be like 'command_name task started/ended'.
|
87
|
-
You can preconfigure messages in your `~/.talksrc` file or you can send options right in talking command:
|
109
|
+
You can preconfigure messages in your `~/.talksrc` file or you can send options right in the talking command:
|
88
110
|
|
89
111
|
```bash
|
90
112
|
$ talking -v agnes -bm 'We gonna die!' -am 'Not sure if we can hear that' rm -rf ./
|
91
113
|
# the same
|
92
114
|
$ talking --voice agnes --before-message 'We...' --after-message 'Not...' rm -rf ./
|
93
115
|
```
|
116
|
+
The same with notifications:
|
117
|
+
|
118
|
+
```bash
|
119
|
+
$ talking -v agnes -bn 'We gonna die!' -an 'Not sure if we can hear that' rm -rf ./
|
120
|
+
# the same
|
121
|
+
$ talking --voice agnes --before-notify 'We...' --after-notify 'Not...' rm -rf ./
|
122
|
+
```
|
94
123
|
|
95
124
|
### Using talks in your code
|
96
125
|
|
@@ -110,16 +139,17 @@ Talks.info 'This is info'
|
|
110
139
|
# Talks.warn 'Some text'
|
111
140
|
# Talks.success 'Some text'
|
112
141
|
# Talks.error 'Some text'
|
142
|
+
Talks.notify 'This will be shown to you by your notifier'
|
113
143
|
```
|
114
144
|
|
115
|
-
`Talks.say` can be customized with type of message and voice by adding options to
|
145
|
+
`Talks.say` can be customized with type of message and voice by adding options to this method parameters:
|
116
146
|
|
117
147
|
```ruby
|
118
148
|
Talks.say 'Hello like pipe', voice: 'pipe'
|
119
149
|
Talks.say 'Hello like error', type: :error # the same as using Talks.error
|
120
150
|
```
|
121
151
|
|
122
|
-
All voices which I found in
|
152
|
+
All voices which I've found in `say` manual:
|
123
153
|
```ruby
|
124
154
|
VOICES = %w(
|
125
155
|
agnes albert alex bad bahh bells boing bruce bubbles cellos
|
@@ -130,16 +160,16 @@ VOICES = %w(
|
|
130
160
|
|
131
161
|
### Using talks with espeak
|
132
162
|
|
133
|
-
You can configure your `talks`
|
163
|
+
You can configure your `talks` engine even to tell MacOS X to use [espeak](http://espeak.sourceforge.net):
|
134
164
|
|
135
165
|
`~/.talksrc`
|
136
166
|
```yml
|
137
167
|
engine: 'espeak'
|
138
168
|
```
|
139
169
|
|
140
|
-
Otherwise `talks` will set engine by default to `say` on MacOS X and to `espeak` on all other OS if command `which espeak` returns
|
170
|
+
Otherwise `talks` will set engine by default. It will be set to `say` on MacOS X and to `espeak` on all other OS-es if command `which espeak` returns non-empty string.
|
141
171
|
|
142
|
-
|
172
|
+
You can even configure your language in espeak (this gem still doesn't support different languages). Voices for espeak:
|
143
173
|
|
144
174
|
```ruby
|
145
175
|
Talks.voices[:espeak]
|
@@ -152,7 +182,7 @@ Talks.voices[:espeak]
|
|
152
182
|
|
153
183
|
## Who?
|
154
184
|
|
155
|
-
I did it
|
185
|
+
I did it myself.
|
156
186
|
|
157
187
|
### Contributors
|
158
188
|
|
@@ -160,11 +190,15 @@ I did it by myself
|
|
160
190
|
|
161
191
|
### A lot of thanks
|
162
192
|
|
163
|
-
* @
|
193
|
+
* @kossnocorp - for idea with notifiers.
|
194
|
+
|
195
|
+
* @shime - for grammar fixes in readme and better explanation of my idea.
|
196
|
+
|
197
|
+
* @aderyabin - extended customization of talks is his idea.
|
164
198
|
|
165
|
-
* @brainopia - bro helps me with any
|
199
|
+
* @brainopia - bro helps me with any idea of mine. He advised me to do command line tool talks.
|
166
200
|
|
167
|
-
You can help me with this fun gem and I'll gladly add you here, or above
|
201
|
+
You can help me with this fun gem and I'll gladly add you here, or above.
|
168
202
|
|
169
203
|
## License
|
170
204
|
|
data/bin/talking
CHANGED
data/lib/talks.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require File.expand_path('../talks/configuration.rb', __FILE__)
|
2
2
|
require File.expand_path('../talks/hooks.rb', __FILE__)
|
3
|
+
require 'notifier'
|
3
4
|
|
4
5
|
module Talks
|
5
|
-
|
6
|
+
extend self
|
6
7
|
|
7
8
|
VOICES = {
|
8
9
|
:say => %w(
|
@@ -35,10 +36,21 @@ module Talks
|
|
35
36
|
when 'espeak'
|
36
37
|
`espeak -v #{say_voice(type, options)} '#{message}'`
|
37
38
|
else
|
38
|
-
abort "
|
39
|
+
abort "Undefined engine: #{config.engine}"
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
43
|
+
def notify(message, options = {})
|
44
|
+
Notifier.notify message: message, title: 'Talks', image: ''
|
45
|
+
end
|
46
|
+
|
47
|
+
def execute(command)
|
48
|
+
before_notify, command, after_notify = command
|
49
|
+
Talks.notify before_notify if before_notify
|
50
|
+
system command
|
51
|
+
Talks.notify after_notify if after_notify
|
52
|
+
end
|
53
|
+
|
42
54
|
def add_hooks(command)
|
43
55
|
Talks::Hooks.create command
|
44
56
|
end
|
@@ -62,7 +74,6 @@ module Talks
|
|
62
74
|
end
|
63
75
|
end
|
64
76
|
|
65
|
-
end
|
66
77
|
end
|
67
78
|
|
68
79
|
require File.expand_path('../talks/runner.rb', __FILE__)
|
data/lib/talks/configuration.rb
CHANGED
@@ -11,10 +11,10 @@ module Talks
|
|
11
11
|
:error => 'bad'
|
12
12
|
},
|
13
13
|
:espeak => {
|
14
|
-
:info => '
|
15
|
-
:warn => '
|
16
|
-
:success => '
|
17
|
-
:error => '
|
14
|
+
:info => 'en+f3',
|
15
|
+
:warn => 'en+m1',
|
16
|
+
:success => 'en+f3',
|
17
|
+
:error => 'en+m3'
|
18
18
|
}
|
19
19
|
}
|
20
20
|
|
@@ -25,7 +25,7 @@ module Talks
|
|
25
25
|
:error => 'Error'
|
26
26
|
}
|
27
27
|
|
28
|
-
attr_accessor :voices, :messages, :default_voice, :options, :engine
|
28
|
+
attr_accessor :voices, :messages, :default_voice, :options, :engine, :notifier
|
29
29
|
|
30
30
|
def initialize(opts)
|
31
31
|
@options = symbolize_hash_keys(opts)
|
@@ -59,6 +59,19 @@ module Talks
|
|
59
59
|
options[command][(position == :before ? :before_message : :after_message)]
|
60
60
|
end
|
61
61
|
|
62
|
+
def notifier_for(command_name)
|
63
|
+
command = command_name.to_sym
|
64
|
+
(options[:notifier] != 'off') &&
|
65
|
+
options[command] &&
|
66
|
+
(options[command][:notifier] != 'off')
|
67
|
+
end
|
68
|
+
|
69
|
+
def notify_message_for(command_name, position = :after)
|
70
|
+
command = command_name.to_sym
|
71
|
+
options[command] &&
|
72
|
+
options[command][(position == :before ? :before_notify : :after_notify)]
|
73
|
+
end
|
74
|
+
|
62
75
|
def voice_for(command_name)
|
63
76
|
command = command_name.to_sym
|
64
77
|
options[command] &&
|
@@ -84,7 +97,7 @@ module Talks
|
|
84
97
|
elsif !(`which espeak`.empty?)
|
85
98
|
'espeak'
|
86
99
|
else
|
87
|
-
abort '
|
100
|
+
abort 'Talks is supported on Mac OS X and linux only, but you can help with support for other OSes'
|
88
101
|
end
|
89
102
|
end
|
90
103
|
|
data/lib/talks/hooks.rb
CHANGED
@@ -6,13 +6,14 @@ module Talks
|
|
6
6
|
engine = Talks.config.engine
|
7
7
|
options, args = shift_options(args.dup)
|
8
8
|
command_name = command args
|
9
|
-
voice, before_message, after_message
|
9
|
+
voice, before_message, after_message, before_notify, after_notify = \
|
10
|
+
parse options, command_name
|
10
11
|
|
11
12
|
before_hook = hook(engine, voice, before_message)
|
12
13
|
after_hook = hook(engine, voice, after_message)
|
13
14
|
command = args.join(' ')
|
14
15
|
|
15
|
-
[before_hook, command, after_hook].join('; ')
|
16
|
+
[before_notify, [before_hook, command, after_hook].join('; '), after_notify]
|
16
17
|
end
|
17
18
|
|
18
19
|
private
|
@@ -50,7 +51,21 @@ module Talks
|
|
50
51
|
Talks.config.message_for(command_name, :after) ||
|
51
52
|
Talks.config.default_message_for(command_name, :after)
|
52
53
|
|
53
|
-
|
54
|
+
before_notify = Talks.config.notifier_for(command_name) &&
|
55
|
+
(
|
56
|
+
options['-bn'] || options['--before-notify'] ||
|
57
|
+
Talks.config.notify_message_for(command_name, :before) ||
|
58
|
+
Talks.config.default_message_for(command_name, :before)
|
59
|
+
)
|
60
|
+
|
61
|
+
after_notify = Talks.config.notifier_for(command_name) &&
|
62
|
+
(
|
63
|
+
options['-an'] || options['--after-notify'] ||
|
64
|
+
Talks.config.notify_message_for(command_name, :after) ||
|
65
|
+
Talks.config.default_message_for(command_name, :after)
|
66
|
+
)
|
67
|
+
|
68
|
+
[voice, before_message, after_message, before_notify, after_notify]
|
54
69
|
end
|
55
70
|
|
56
71
|
def hook(engine, voice, message)
|
data/lib/talks/version.rb
CHANGED
data/spec/talks/basic_spec.rb
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
3
|
+
|
1
4
|
OPTS_INITFILE = 'spec/test_data/talksrc'
|
2
5
|
require 'talks'
|
3
6
|
|
7
|
+
def talk_command
|
8
|
+
Talks.config.engine
|
9
|
+
end
|
10
|
+
|
4
11
|
describe Talks do
|
5
12
|
|
6
13
|
it 'should have default methods' do
|
@@ -25,7 +32,8 @@ describe Talks do
|
|
25
32
|
end
|
26
33
|
|
27
34
|
it 'should return voice for type' do
|
28
|
-
Talks.config.voice(:info).should == 'vicki'
|
35
|
+
Talks.config.voice(:info).should == 'vicki' if talk_command == 'say'
|
36
|
+
Talks.config.voice(:info).should == 'en+f3' if talk_command == 'espeak'
|
29
37
|
end
|
30
38
|
|
31
39
|
it 'should return message for type' do
|
@@ -51,24 +59,24 @@ describe Talks do
|
|
51
59
|
context 'hooks' do
|
52
60
|
|
53
61
|
it 'should create hooks for any command by default' do
|
54
|
-
Talks.add_hooks(['ls']).should == "
|
62
|
+
Talks.add_hooks(['ls']).should == "#{talk_command} -v agnes 'ls task started'; ls; #{talk_command} -v agnes 'ls task ended'"
|
55
63
|
end
|
56
64
|
|
57
65
|
it 'should create preconfigured hooks for command from .talksrc' do
|
58
|
-
Talks.add_hooks(['bundle']).should == "
|
66
|
+
Talks.add_hooks(['bundle']).should == "#{talk_command} -v bad 'Bundle before message'; bundle; #{talk_command} -v bad 'Bundle after message'"
|
59
67
|
end
|
60
68
|
|
61
69
|
it 'should change voice if option sended' do
|
62
|
-
Talks.add_hooks(['-v', 'vicki', 'ls']).should == "
|
70
|
+
Talks.add_hooks(['-v', 'vicki', 'ls']).should == "#{talk_command} -v vicki 'ls task started'; ls; #{talk_command} -v vicki 'ls task ended'"
|
63
71
|
end
|
64
72
|
|
65
73
|
it 'should change messages if option sended' do
|
66
|
-
Talks.add_hooks(['-bm', 'test', 'ls']).should == "
|
67
|
-
Talks.add_hooks(['-am', 'test', 'ls']).should == "
|
74
|
+
Talks.add_hooks(['-bm', 'test', 'ls']).should == "#{talk_command} -v agnes 'test'; ls; #{talk_command} -v agnes 'ls task ended'"
|
75
|
+
Talks.add_hooks(['-am', 'test', 'ls']).should == "#{talk_command} -v agnes 'ls task started'; ls; #{talk_command} -v agnes 'test'"
|
68
76
|
end
|
69
77
|
|
70
78
|
it 'should create hooks for command inside `bundle exec` by default' do
|
71
|
-
Talks.add_hooks(['bundle', 'exec', 'ls']).should == "
|
79
|
+
Talks.add_hooks(['bundle', 'exec', 'ls']).should == "#{talk_command} -v agnes 'ls task started'; bundle exec ls; #{talk_command} -v agnes 'ls task ended'"
|
72
80
|
end
|
73
81
|
|
74
82
|
end
|
data/talks.gemspec
CHANGED
@@ -14,6 +14,11 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.rubyforge_project = "talks"
|
16
16
|
|
17
|
+
s.add_dependency("notifier")
|
18
|
+
|
19
|
+
s.add_development_dependency("rspec")
|
20
|
+
s.add_development_dependency("simplecov")
|
21
|
+
|
17
22
|
s.files = `git ls-files`.split("\n")
|
18
23
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
24
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: talks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,56 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-06-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: notifier
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: simplecov
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
14
62
|
description: This gem can be used for wraping command-lines with `talks` command or
|
15
63
|
for adding hooks in ruby code which would tell you something
|
16
64
|
email:
|
@@ -21,6 +69,7 @@ executables:
|
|
21
69
|
extensions: []
|
22
70
|
extra_rdoc_files: []
|
23
71
|
files:
|
72
|
+
- .gitignore
|
24
73
|
- .travis.yml
|
25
74
|
- CHANGELOG.md
|
26
75
|
- Gemfile
|