time_teller 0.0.5
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.
- checksums.yaml +7 -0
- data/bin/tell_time +37 -0
- data/lib/time_teller.rb +124 -0
- metadata +88 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b4129d49f68a0abe669174a42b2ad275ec23dfd3
|
4
|
+
data.tar.gz: 2a2110a91577713b2cab6c368f204a116ca375eb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e7941330159919c6a1ced6b07a4788b3b71ab6b0463d99f82270a171998000cfaa96715e5d03abf813037c920ea4285294e6861a35561eb50a292303cfb40d81
|
7
|
+
data.tar.gz: fd2475b94c61c9b786c4e2ad7c999250cf167cc51904c3f87e4fddbd791d95daae956d0e96bed4a6aca412bdc68978d6bf5953acbaad3fdb35617c7713a41e51
|
data/bin/tell_time
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler/setup'
|
6
|
+
|
7
|
+
require 'time_teller'
|
8
|
+
require 'docopt'
|
9
|
+
|
10
|
+
doc = <<DOCOPT
|
11
|
+
Speak the current time.
|
12
|
+
|
13
|
+
Usage: #{__FILE__} [options]
|
14
|
+
|
15
|
+
--chance CHANCE 1 in CHANCE times chance that time is spoken.
|
16
|
+
--sleep SECONDS Sleep up to X seconds before speaking.
|
17
|
+
--synth SYNTH Change what synthesizer to use (espeak, aplay, say). [default: say].
|
18
|
+
--voice VOICE Use VOICE name (for Mac say command)
|
19
|
+
--random Use a random voice (for Mac say command)
|
20
|
+
--voices Print available voices (for Mac say command)
|
21
|
+
-h, --help Print this help message.
|
22
|
+
DOCOPT
|
23
|
+
|
24
|
+
begin
|
25
|
+
opts = Docopt::docopt(doc)
|
26
|
+
#puts opts.inspect
|
27
|
+
rescue Docopt::Exit => e
|
28
|
+
$stderr.puts e.message
|
29
|
+
exit 1
|
30
|
+
end
|
31
|
+
|
32
|
+
begin
|
33
|
+
TimeTeller.new(opts).run
|
34
|
+
rescue TimeTellerError => e
|
35
|
+
$stderr.puts e.message
|
36
|
+
exit 2
|
37
|
+
end
|
data/lib/time_teller.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'fuzzy_time'
|
4
|
+
|
5
|
+
class TimeTellerError < StandardError; end
|
6
|
+
|
7
|
+
class TimeTeller
|
8
|
+
def initialize(opts = {})
|
9
|
+
@action = :default
|
10
|
+
@synth = :mac
|
11
|
+
parse(opts)
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse(opts)
|
15
|
+
@voice = opts["--voice"] || 'english'
|
16
|
+
if opts["--synth"] == 'espeak'
|
17
|
+
@synth = :espeak
|
18
|
+
elsif opts["--synth"] == 'aplay'
|
19
|
+
@synth = :aplay
|
20
|
+
else
|
21
|
+
@voice = opts["--voice"] || 'Vicki'
|
22
|
+
end
|
23
|
+
@voice = voices.sample if opts["--random"]
|
24
|
+
unless voices.include?(@voice)
|
25
|
+
raise TimeTellerError.new "Voice not available: #{@voice}"
|
26
|
+
end
|
27
|
+
if opts["--chance"]
|
28
|
+
@action = :chance
|
29
|
+
@value = opts["--chance"].to_i
|
30
|
+
end
|
31
|
+
if opts["--sleep"]
|
32
|
+
@action = :sleep
|
33
|
+
@value = opts["--sleep"].to_i
|
34
|
+
end
|
35
|
+
if opts["--voices"]
|
36
|
+
@action = :voices
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def voices
|
41
|
+
@voices ||= if [:espeak, :aplay].include? @synth
|
42
|
+
%x(espeak --voices=en | tail -n +2 | sed 's/^ *//' | tr -s ' '| cut -d ' ' -f 4).split
|
43
|
+
else
|
44
|
+
%x(say --voice ? | awk '{print $1;}').split
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def time
|
49
|
+
time = Time.now.fuzzy
|
50
|
+
#puts "Time is: #{time}"
|
51
|
+
time
|
52
|
+
end
|
53
|
+
|
54
|
+
def tell_time
|
55
|
+
#puts "Running command: #{synth_command}"
|
56
|
+
%x(#{synth_command})
|
57
|
+
end
|
58
|
+
|
59
|
+
def formatted_time
|
60
|
+
"It is #{time}."
|
61
|
+
end
|
62
|
+
|
63
|
+
def randomize
|
64
|
+
Random.new.rand(@value) unless @value.nil?
|
65
|
+
end
|
66
|
+
|
67
|
+
# TODO: Refactor into class
|
68
|
+
def run
|
69
|
+
method = "#{@action}_action".to_sym
|
70
|
+
raise TimeTellerError.new "Action not available: #{@action}" unless respond_to?(method)
|
71
|
+
send(method)
|
72
|
+
end
|
73
|
+
|
74
|
+
def chance_action
|
75
|
+
#puts "Randomizing: #{random}"
|
76
|
+
tell_time if randomize == 0
|
77
|
+
end
|
78
|
+
|
79
|
+
def sleep_action
|
80
|
+
#puts "Sleeping #{random}s"
|
81
|
+
sleep randomize
|
82
|
+
tell_time
|
83
|
+
end
|
84
|
+
|
85
|
+
def voices_action
|
86
|
+
puts "Available voices: #{voices.join ', '}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def default_action
|
90
|
+
tell_time
|
91
|
+
end
|
92
|
+
|
93
|
+
# TODO: Refactor into class
|
94
|
+
def synth_command
|
95
|
+
method = "#{@synth}_synth".to_sym
|
96
|
+
raise TimeTellerError.new "Synth not available: #{@synth}" unless respond_to?(method)
|
97
|
+
send(method)
|
98
|
+
end
|
99
|
+
|
100
|
+
def aplay_synth
|
101
|
+
args = []
|
102
|
+
args << "-v #{@voice}" unless @voice.nil?
|
103
|
+
#puts "voice: #{@voice}"
|
104
|
+
"espeak '#{formatted_time}' #{args.join ' '} --stdout 2>/dev/null | aplay -q -D 'default'"
|
105
|
+
end
|
106
|
+
|
107
|
+
def espeak_synth
|
108
|
+
args = []
|
109
|
+
args << "-v #{@voice}" unless @voice.nil?
|
110
|
+
#puts "voice: #{@voice}"
|
111
|
+
"espeak '#{formatted_time}' #{args.join ' '}"
|
112
|
+
end
|
113
|
+
|
114
|
+
def mac_synth
|
115
|
+
args = []
|
116
|
+
args << "--voice #{@voice}" unless @voice.nil?
|
117
|
+
"say '#{formatted_time}' #{args.join ' '}"
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
if __FILE__ == $0
|
123
|
+
TimeTeller.new(ARGV).run
|
124
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: time_teller
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Olle Johansson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-05-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: fuzzy_time
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: docopt
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.5'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.2'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.2'
|
55
|
+
description: Speaks the time in English.
|
56
|
+
email: Olle@Johansson.com
|
57
|
+
executables:
|
58
|
+
- tell_time
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- bin/tell_time
|
63
|
+
- lib/time_teller.rb
|
64
|
+
homepage: http://rubygems.org/gems/time_teller
|
65
|
+
licenses:
|
66
|
+
- MIT
|
67
|
+
metadata: {}
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
requirements: []
|
83
|
+
rubyforge_project:
|
84
|
+
rubygems_version: 2.2.2
|
85
|
+
signing_key:
|
86
|
+
specification_version: 4
|
87
|
+
summary: Tell time
|
88
|
+
test_files: []
|