adhearsion 2.0.0.alpha2 → 2.0.0.alpha3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +16 -14
- data/CHANGELOG.md +17 -1
- data/adhearsion.gemspec +14 -13
- data/features/cli_basic.feature +30 -0
- data/features/cli_create.feature +24 -0
- data/features/cli_daemon.feature +21 -0
- data/features/cli_generate.feature +9 -0
- data/features/cli_start.feature +33 -0
- data/features/cli_stop.feature +38 -0
- data/features/controller_generator.feature +19 -0
- data/features/plugin_generator.feature +55 -0
- data/lib/adhearsion.rb +5 -1
- data/lib/adhearsion/call.rb +57 -51
- data/lib/adhearsion/call_controller.rb +4 -20
- data/lib/adhearsion/call_controller/dial.rb +34 -4
- data/lib/adhearsion/calls.rb +4 -1
- data/lib/adhearsion/cli_commands.rb +31 -6
- data/lib/adhearsion/configuration.rb +2 -6
- data/lib/adhearsion/console.rb +56 -17
- data/lib/adhearsion/generators.rb +53 -2
- data/lib/adhearsion/generators/app/app_generator.rb +2 -24
- data/lib/adhearsion/generators/app/templates/config/adhearsion.rb +1 -1
- data/lib/adhearsion/generators/controller/controller_generator.rb +18 -0
- data/lib/adhearsion/generators/controller/templates/lib/controller.rb +4 -0
- data/lib/adhearsion/generators/controller/templates/spec/controller_spec.rb +3 -0
- data/lib/adhearsion/generators/generator.rb +77 -0
- data/lib/adhearsion/generators/plugin/plugin_generator.rb +33 -0
- data/lib/adhearsion/generators/plugin/templates/.gitignore +9 -0
- data/lib/adhearsion/generators/plugin/templates/Gemfile.tt +4 -0
- data/lib/adhearsion/generators/plugin/templates/README.md.tt +2 -0
- data/lib/adhearsion/generators/plugin/templates/Rakefile.tt +1 -0
- data/lib/adhearsion/generators/plugin/templates/lib/plugin-template.rb.tt +5 -0
- data/lib/adhearsion/generators/plugin/templates/lib/plugin-template/controller_methods.rb.tt +10 -0
- data/lib/adhearsion/generators/plugin/templates/lib/plugin-template/plugin.rb.tt +29 -0
- data/lib/adhearsion/generators/plugin/templates/lib/plugin-template/version.rb.tt +3 -0
- data/lib/adhearsion/generators/plugin/templates/plugin-template.gemspec.tt +35 -0
- data/lib/adhearsion/generators/plugin/templates/spec/plugin-template/controller_methods_spec.rb.tt +26 -0
- data/lib/adhearsion/generators/plugin/templates/spec/spec_helper.rb.tt +13 -0
- data/lib/adhearsion/initializer.rb +14 -22
- data/lib/adhearsion/logging.rb +25 -16
- data/lib/adhearsion/outbound_call.rb +3 -3
- data/lib/adhearsion/plugin.rb +14 -0
- data/lib/adhearsion/punchblock_plugin.rb +6 -1
- data/lib/adhearsion/punchblock_plugin/initializer.rb +8 -8
- data/lib/adhearsion/tasks/configuration.rb +1 -1
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +108 -17
- data/spec/adhearsion/call_controller_spec.rb +7 -64
- data/spec/adhearsion/call_spec.rb +48 -29
- data/spec/adhearsion/calls_spec.rb +7 -0
- data/spec/adhearsion/configuration_spec.rb +14 -14
- data/spec/adhearsion/console_spec.rb +124 -4
- data/spec/adhearsion/generators_spec.rb +17 -0
- data/spec/adhearsion/initializer_spec.rb +22 -18
- data/spec/adhearsion/logging_spec.rb +78 -48
- data/spec/adhearsion/outbound_call_spec.rb +6 -15
- data/spec/adhearsion/plugin_spec.rb +18 -0
- data/spec/adhearsion/process_spec.rb +10 -1
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +8 -6
- data/spec/spec_helper.rb +5 -2
- data/spec/support/call_controller_test_helpers.rb +1 -1
- data/spec/support/initializer_stubs.rb +1 -1
- metadata +106 -66
- data/features/cli.feature +0 -108
- data/lib/adhearsion/initializer/logging.rb +0 -33
- data/spec/adhearsion/initializer/logging_spec.rb +0 -55
@@ -0,0 +1,77 @@
|
|
1
|
+
begin
|
2
|
+
require 'thor/group'
|
3
|
+
rescue LoadError
|
4
|
+
puts "Thor is not available.\nIf you ran this command from a git checkout " \
|
5
|
+
"of Adhearsion, please make sure thor is installed,\nand run this command " \
|
6
|
+
"as `ruby #{$0} #{(ARGV | ['--dev']).join(" ")}`"
|
7
|
+
exit
|
8
|
+
end
|
9
|
+
|
10
|
+
module Adhearsion
|
11
|
+
module Generators
|
12
|
+
|
13
|
+
class Generator < Thor::Group
|
14
|
+
include Thor::Actions
|
15
|
+
|
16
|
+
argument :generate_command, :type => :string
|
17
|
+
argument :generator_name, :type => :string
|
18
|
+
|
19
|
+
# Returns the source root for this generator using default_source_root as default.
|
20
|
+
def self.source_root(path = nil)
|
21
|
+
@_source_root = path if path
|
22
|
+
@_source_root ||= default_source_root
|
23
|
+
end
|
24
|
+
|
25
|
+
# Tries to get the description from a USAGE file one folder above the source
|
26
|
+
# root otherwise uses a default description.
|
27
|
+
def self.desc(description = nil)
|
28
|
+
return super if description
|
29
|
+
usage = source_root && File.expand_path("../USAGE", source_root)
|
30
|
+
|
31
|
+
@desc ||= if usage && File.exist?(usage)
|
32
|
+
ERB.new(File.read(usage)).result(binding)
|
33
|
+
else
|
34
|
+
"Description:\n Create #{base_name.humanize.downcase} files for #{generator_name} generator."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Convenience method to get the namespace from the class name. It's the
|
39
|
+
# same as Thor default except that the Generator at the end of the class
|
40
|
+
# is removed.
|
41
|
+
def self.namespace(name = nil)
|
42
|
+
return super if name
|
43
|
+
@namespace ||= super.sub(/_generator$/, '').sub(/:generators:/, ':')
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns the default source root for a given generator. This is used internally
|
47
|
+
# by adhearsion to set its generators source root. If you want to customize your source
|
48
|
+
# root, you should use source_root.
|
49
|
+
def self.default_source_root
|
50
|
+
return unless generator_name
|
51
|
+
path = File.expand_path File.join(generator_name, 'templates'), base_root
|
52
|
+
path if File.exists?(path)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns the base root for a common set of generators. This is used to dynamically
|
56
|
+
# guess the default source root.
|
57
|
+
def self.base_root
|
58
|
+
File.dirname __FILE__
|
59
|
+
end
|
60
|
+
|
61
|
+
protected
|
62
|
+
|
63
|
+
# Removes the namespaces and get the generator name. For example,
|
64
|
+
# Adhearsion::Generators::ModelGenerator will return "model" as generator name.
|
65
|
+
#
|
66
|
+
def self.generator_name
|
67
|
+
@generator_name ||= begin
|
68
|
+
if generator = name.to_s.split('::').last
|
69
|
+
generator.sub! /Generator$/, ''
|
70
|
+
generator.underscore
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Adhearsion
|
2
|
+
module Generators
|
3
|
+
class PluginGenerator < Generator
|
4
|
+
|
5
|
+
argument :plugin_name, :type => :string
|
6
|
+
|
7
|
+
|
8
|
+
def create_plugin
|
9
|
+
@plugin_file = @plugin_name.underscore
|
10
|
+
self.destination_root = '.'
|
11
|
+
|
12
|
+
empty_directory @plugin_file
|
13
|
+
empty_directory "#{@plugin_file}/lib"
|
14
|
+
empty_directory "#{@plugin_file}/lib/#{@plugin_file}"
|
15
|
+
empty_directory "#{@plugin_file}/spec"
|
16
|
+
|
17
|
+
template 'plugin-template.gemspec.tt', "#{@plugin_file}/#{@plugin_file}.gemspec"
|
18
|
+
template 'Rakefile.tt', "#{@plugin_file}/Rakefile"
|
19
|
+
template 'README.md.tt', "#{@plugin_file}/README.md"
|
20
|
+
template 'Gemfile.tt', "#{@plugin_file}/Gemfile"
|
21
|
+
|
22
|
+
template 'lib/plugin-template.rb.tt', "#{@plugin_file}/lib/#{@plugin_file}.rb"
|
23
|
+
template 'lib/plugin-template/version.rb.tt', "#{@plugin_file}/lib/#{@plugin_file}/version.rb"
|
24
|
+
template 'lib/plugin-template/plugin.rb.tt', "#{@plugin_file}/lib/#{@plugin_file}/plugin.rb"
|
25
|
+
template 'lib/plugin-template/controller_methods.rb.tt', "#{@plugin_file}/lib/#{@plugin_file}/controller_methods.rb"
|
26
|
+
|
27
|
+
template 'spec/spec_helper.rb.tt', "#{@plugin_file}/spec/spec_helper.rb"
|
28
|
+
template 'spec/plugin-template/controller_methods_spec.rb.tt', "#{@plugin_file}/spec/#{@plugin_file}/controller_methods_spec.rb"
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module <%= @plugin_name %>
|
2
|
+
module ControllerMethods
|
3
|
+
# The methods are defined in a normal method the user will then mix in their CallControllers
|
4
|
+
# The following also contains an example of configuration usage
|
5
|
+
#
|
6
|
+
def greet(name)
|
7
|
+
play "#{Adhearsion.config[:<%= @plugin_file %>].greeting}, #{name}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module <%= @plugin_name %>
|
2
|
+
class Plugin < Adhearsion::Plugin
|
3
|
+
# Actions to perform when the plugin is loaded
|
4
|
+
#
|
5
|
+
init :<%= @plugin_file %> do
|
6
|
+
logger.warn "<%= @plugin_name %> has been loaded"
|
7
|
+
end
|
8
|
+
|
9
|
+
# Basic configuration for the plugin
|
10
|
+
#
|
11
|
+
config :<%= @plugin_file %> do
|
12
|
+
greeting "Hello", :desc => "What to use to greet users"
|
13
|
+
end
|
14
|
+
|
15
|
+
# Defining a Rake task is easy
|
16
|
+
# The following can be invoked with:
|
17
|
+
# rake plugin_demo:info
|
18
|
+
#
|
19
|
+
tasks do
|
20
|
+
namespace :<%= @plugin_file %> do
|
21
|
+
desc "Prints the PluginTemplate information"
|
22
|
+
task :info do
|
23
|
+
STDOUT.puts "<%= @plugin_name %> plugin v. #{VERSION}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "<%= @plugin_name.underscore %>/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "<%= @plugin_name.underscore %>"
|
7
|
+
s.version = <%= @plugin_name %>::VERSION
|
8
|
+
s.authors = ["Plugin Author"]
|
9
|
+
s.email = ["author@plugin.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{TODO: Write a gem summary}
|
12
|
+
s.description = %q{TODO: Write a gem description}
|
13
|
+
|
14
|
+
s.rubyforge_project = "<%= @plugin_name.underscore %>"
|
15
|
+
|
16
|
+
# Use the following if using Git
|
17
|
+
# s.files = `git ls-files`.split("\n")
|
18
|
+
# s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.files = Dir.glob("{lib}/**/*") + %w( README.md Rakefile Gemfile)
|
20
|
+
s.test_files = Dir.glob("{spec}/**/*")
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
s.add_runtime_dependency %q<adhearsion>, [">= <%= Adhearsion::VERSION %>"]
|
24
|
+
s.add_runtime_dependency %q<activesupport>, [">= 3.0.10"]
|
25
|
+
|
26
|
+
s.add_development_dependency %q<bundler>, ["~> 1.0.0"]
|
27
|
+
s.add_development_dependency %q<rspec>, [">= 2.5.0"]
|
28
|
+
s.add_development_dependency %q<ci_reporter>, [">= 1.6.3"]
|
29
|
+
s.add_development_dependency %q<simplecov>, [">= 0"]
|
30
|
+
s.add_development_dependency %q<simplecov-rcov>, [">= 0"]
|
31
|
+
s.add_development_dependency %q<yard>, ["~> 0.6.0"]
|
32
|
+
s.add_development_dependency %q<rake>, [">= 0"]
|
33
|
+
s.add_development_dependency %q<mocha>, [">= 0"]
|
34
|
+
s.add_development_dependency %q<guard-rspec>
|
35
|
+
end
|
data/lib/adhearsion/generators/plugin/templates/spec/plugin-template/controller_methods_spec.rb.tt
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module <%= @plugin_name %>
|
4
|
+
describe ControllerMethods do
|
5
|
+
describe "mixed in to a CallController" do
|
6
|
+
|
7
|
+
class TestController < Adhearsion::CallController
|
8
|
+
include <%= @plugin_name %>::ControllerMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:mock_call) { mock 'Call' }
|
12
|
+
|
13
|
+
subject do
|
14
|
+
TestController.new mock_call
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#greet" do
|
18
|
+
it "greets with the correct parameter" do
|
19
|
+
subject.expects(:play).once.with("Hello, Luca")
|
20
|
+
subject.greet "Luca"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'adhearsion'
|
2
|
+
require 'mocha'
|
3
|
+
require '<%= @plugin_file %>'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.color_enabled = true
|
7
|
+
config.tty = true
|
8
|
+
|
9
|
+
config.mock_with :mocha
|
10
|
+
config.filter_run :focus => true
|
11
|
+
config.run_all_when_everything_filtered = true
|
12
|
+
end
|
13
|
+
|
@@ -4,16 +4,14 @@ require 'adhearsion/linux_proc_name'
|
|
4
4
|
module Adhearsion
|
5
5
|
class Initializer
|
6
6
|
|
7
|
-
extend ActiveSupport::Autoload
|
8
|
-
|
9
|
-
autoload :Logging
|
10
|
-
|
11
7
|
class << self
|
12
8
|
def start(*args, &block)
|
13
9
|
new(*args, &block).start
|
14
10
|
end
|
15
11
|
end
|
16
12
|
|
13
|
+
DEFAULT_PID_FILE_NAME = 'adhearsion.pid'
|
14
|
+
|
17
15
|
attr_reader :path, :daemon, :pid_file
|
18
16
|
|
19
17
|
# Creation of pid_files
|
@@ -47,17 +45,18 @@ module Adhearsion
|
|
47
45
|
catch_termination_signal
|
48
46
|
create_pid_file
|
49
47
|
set_ahn_proc_name
|
50
|
-
logger.info "Loaded config in <#{Adhearsion.config.platform.environment}> environment"
|
51
48
|
initialize_exception_logger
|
52
49
|
update_rails_env_var
|
53
50
|
init_plugins
|
54
51
|
|
55
|
-
logger.info "Adhearsion v#{Adhearsion::VERSION} initialized!"
|
56
|
-
Adhearsion::Process.booted
|
57
|
-
|
58
52
|
run_plugins
|
59
53
|
trigger_after_initialized_hooks
|
60
54
|
|
55
|
+
if Adhearsion.status == :booting
|
56
|
+
Adhearsion::Process.booted
|
57
|
+
logger.info "Adhearsion v#{Adhearsion::VERSION} initialized with environment <#{Adhearsion.config.platform.environment}>!"
|
58
|
+
end
|
59
|
+
|
61
60
|
# This method will block until all important threads have finished.
|
62
61
|
# When it does, the process will exit.
|
63
62
|
join_important_threads
|
@@ -67,10 +66,10 @@ module Adhearsion
|
|
67
66
|
def update_rails_env_var
|
68
67
|
env = ENV['AHN_ENV']
|
69
68
|
if env && Adhearsion.config.valid_environment?(env.to_sym)
|
70
|
-
if ENV['RAILS_ENV']
|
71
|
-
logger.info "Using
|
69
|
+
if ENV['RAILS_ENV']
|
70
|
+
logger.info "Using provided RAILS_ENV value of <#{ENV['RAILS_ENV']}>"
|
72
71
|
else
|
73
|
-
logger.warn "
|
72
|
+
logger.warn "Setting RAILS_ENV variable to <#{env}>"
|
74
73
|
ENV['RAILS_ENV'] = env
|
75
74
|
end
|
76
75
|
else
|
@@ -79,7 +78,7 @@ module Adhearsion
|
|
79
78
|
logger.info "Using the configured value for RAILS_ENV : <#{env}>"
|
80
79
|
else
|
81
80
|
env = Adhearsion.config.platform.environment.to_s
|
82
|
-
logger.info "Defining
|
81
|
+
logger.info "Defining RAILS_ENV variable to <#{env}>"
|
83
82
|
ENV['RAILS_ENV'] = env
|
84
83
|
end
|
85
84
|
end
|
@@ -87,7 +86,7 @@ module Adhearsion
|
|
87
86
|
end
|
88
87
|
|
89
88
|
def default_pid_path
|
90
|
-
File.join Adhearsion.config.root,
|
89
|
+
File.join Adhearsion.config.root, DEFAULT_PID_FILE_NAME
|
91
90
|
end
|
92
91
|
|
93
92
|
def resolve_pid_file_path
|
@@ -174,14 +173,7 @@ module Adhearsion
|
|
174
173
|
if should_daemonize?
|
175
174
|
appenders
|
176
175
|
else
|
177
|
-
|
178
|
-
'stdout',
|
179
|
-
:layout => ::Logging.layouts.pattern(
|
180
|
-
:pattern => Adhearsion::Logging.adhearsion_pattern,
|
181
|
-
:color_scheme => 'bright'
|
182
|
-
)
|
183
|
-
)
|
184
|
-
appenders << stdout
|
176
|
+
appenders += Adhearsion::Logging.default_appenders
|
185
177
|
end
|
186
178
|
end
|
187
179
|
|
@@ -238,7 +230,7 @@ module Adhearsion
|
|
238
230
|
|
239
231
|
def start_logging
|
240
232
|
outputters = init_get_logging_appenders
|
241
|
-
Logging.start outputters, Adhearsion.config.platform.logging.level, Adhearsion.config.platform.logging.formatter
|
233
|
+
Adhearsion::Logging.start outputters, Adhearsion.config.platform.logging.level, Adhearsion.config.platform.logging.formatter
|
242
234
|
end
|
243
235
|
|
244
236
|
def initialize_exception_logger
|
data/lib/adhearsion/logging.rb
CHANGED
@@ -36,25 +36,40 @@ module Adhearsion
|
|
36
36
|
::Logging.reset
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
39
|
+
def init
|
40
40
|
::Logging.init LOG_LEVELS
|
41
|
-
::Logging::Logger[:root].level = :info
|
42
|
-
::Logging.logger.root.appenders = [::Logging.appenders.stdout('stdout')]
|
43
|
-
self.send :_set_formatter, ::Logging::Layouts.basic(:format_as => :string, :backtrace => true)
|
44
41
|
|
45
42
|
LOG_LEVELS.each do |level|
|
46
43
|
Adhearsion::Logging.const_defined?(level) or Adhearsion::Logging.const_set(level, ::Logging::LEVELS[::Logging.levelify(level)])
|
47
44
|
end
|
48
45
|
end
|
49
46
|
|
47
|
+
def start(_appenders = nil, level = :info, formatter = nil)
|
48
|
+
::Logging.logger.root.appenders = _appenders.nil? ? default_appenders : _appenders
|
49
|
+
|
50
|
+
::Logging.logger.root.level = level
|
51
|
+
|
52
|
+
formatter = formatter if formatter
|
53
|
+
end
|
54
|
+
|
55
|
+
def default_appenders
|
56
|
+
[::Logging.appenders.stdout(
|
57
|
+
'stdout',
|
58
|
+
:layout => ::Logging.layouts.pattern(
|
59
|
+
:pattern => adhearsion_pattern,
|
60
|
+
:color_scheme => 'bright'
|
61
|
+
)
|
62
|
+
)]
|
63
|
+
end
|
64
|
+
|
50
65
|
def logging_level=(new_logging_level)
|
51
|
-
::Logging
|
66
|
+
::Logging.logger.root.level = new_logging_level
|
52
67
|
end
|
53
68
|
|
54
69
|
alias :level= :logging_level=
|
55
70
|
|
56
71
|
def logging_level
|
57
|
-
::Logging
|
72
|
+
::Logging.logger.root.level
|
58
73
|
end
|
59
74
|
|
60
75
|
def get_logger(logger_name)
|
@@ -80,7 +95,9 @@ module Adhearsion
|
|
80
95
|
alias :appenders :outputters
|
81
96
|
|
82
97
|
def formatter=(formatter)
|
83
|
-
|
98
|
+
::Logging.logger.root.appenders.each do |appender|
|
99
|
+
appender.layout = formatter
|
100
|
+
end
|
84
101
|
end
|
85
102
|
|
86
103
|
alias :layout= :formatter=
|
@@ -91,16 +108,8 @@ module Adhearsion
|
|
91
108
|
|
92
109
|
alias :layout :formatter
|
93
110
|
|
94
|
-
private
|
95
|
-
|
96
|
-
def _set_formatter(formatter)
|
97
|
-
::Logging.logger.root.appenders.each do |appender|
|
98
|
-
appender.layout = formatter
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
111
|
end
|
103
112
|
|
104
|
-
|
113
|
+
init unless ::Logging.const_defined? :MAX_LEVEL_LENGTH
|
105
114
|
end
|
106
115
|
end
|