adhearsion 2.0.0.alpha2 → 2.0.0.alpha3
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/.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
|