adhearsion 1.1.1 → 1.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.
Files changed (83) hide show
  1. data/.gitignore +3 -0
  2. data/.rspec +3 -0
  3. data/CHANGELOG +12 -0
  4. data/README.markdown +1 -10
  5. data/Rakefile +6 -28
  6. data/adhearsion.gemspec +21 -38
  7. data/app_generators/ahn/ahn_generator.rb +3 -4
  8. data/app_generators/ahn/templates/config/environment.rb +4 -0
  9. data/app_generators/ahn/templates/config/startup.rb +11 -5
  10. data/app_generators/ahn/templates/script/ahn +8 -0
  11. data/lib/adhearsion/cli.rb +5 -298
  12. data/lib/adhearsion/commands.rb +308 -0
  13. data/lib/adhearsion/events_support.rb +0 -20
  14. data/lib/adhearsion/initializer/asterisk.rb +0 -1
  15. data/lib/adhearsion/initializer/configuration.rb +4 -1
  16. data/lib/adhearsion/logging.rb +18 -3
  17. data/lib/adhearsion/script_ahn_loader.rb +30 -0
  18. data/lib/adhearsion/tasks/testing.rb +39 -8
  19. data/lib/adhearsion/version.rb +2 -2
  20. data/lib/adhearsion/voip/asterisk/agi_server.rb +15 -8
  21. data/lib/adhearsion/voip/asterisk/commands.rb +340 -86
  22. data/lib/adhearsion/voip/asterisk/manager_interface.rb +0 -2
  23. data/lib/adhearsion/voip/call.rb +11 -3
  24. data/lib/adhearsion/voip/commands.rb +5 -1
  25. data/lib/adhearsion/voip/dial_plan.rb +4 -0
  26. data/lib/theatre/invocation.rb +3 -0
  27. data/spec/{ahn_command_spec.rb → adhearsion/cli_spec.rb} +11 -0
  28. data/spec/{component_manager_spec.rb → adhearsion/component_manager_spec.rb} +0 -0
  29. data/spec/{constants_spec.rb → adhearsion/constants_spec.rb} +0 -0
  30. data/spec/{drb_spec.rb → adhearsion/drb_spec.rb} +0 -0
  31. data/spec/{fixtures → adhearsion/fixtures}/dialplan.rb +0 -0
  32. data/spec/{foundation → adhearsion/foundation}/event_socket_spec.rb +0 -0
  33. data/spec/{host_definitions_spec.rb → adhearsion/host_definitions_spec.rb} +0 -0
  34. data/spec/{initializer → adhearsion/initializer}/configuration_spec.rb +21 -0
  35. data/spec/{initializer → adhearsion/initializer}/loading_spec.rb +0 -0
  36. data/spec/{initializer → adhearsion/initializer}/paths_spec.rb +0 -0
  37. data/spec/{initialization_spec.rb → adhearsion/initializer_spec.rb} +0 -0
  38. data/spec/{logging_spec.rb → adhearsion/logging_spec.rb} +6 -0
  39. data/spec/{relationship_properties_spec.rb → adhearsion/relationship_properties_spec.rb} +0 -0
  40. data/spec/{voip → adhearsion/voip}/asterisk/agi_server_spec.rb +0 -0
  41. data/spec/{voip → adhearsion/voip}/asterisk/ami/ami_spec.rb +1 -0
  42. data/spec/{voip → adhearsion/voip}/asterisk/ami/lexer/ami_fixtures.yml +0 -0
  43. data/spec/{voip → adhearsion/voip}/asterisk/ami/lexer/lexer_story +0 -0
  44. data/spec/{voip → adhearsion/voip}/asterisk/ami/lexer/lexer_story.rb +0 -0
  45. data/spec/{voip → adhearsion/voip}/asterisk/ami/lexer/story_helper.rb +0 -0
  46. data/spec/{voip → adhearsion/voip}/asterisk/commands_spec.rb +549 -47
  47. data/spec/{voip → adhearsion/voip}/asterisk/config_file_generators/agents_spec.rb +0 -0
  48. data/spec/{voip → adhearsion/voip}/asterisk/config_file_generators/queues_spec.rb +0 -0
  49. data/spec/{voip → adhearsion/voip}/asterisk/config_file_generators/voicemail_spec.rb +0 -0
  50. data/spec/{voip → adhearsion/voip}/asterisk/config_manager_spec.rb +0 -0
  51. data/spec/{voip → adhearsion/voip}/asterisk/menu_command/calculated_match_spec.rb +0 -0
  52. data/spec/{voip → adhearsion/voip}/asterisk/menu_command/matchers_spec.rb +0 -0
  53. data/spec/{voip → adhearsion/voip}/call_routing_spec.rb +0 -0
  54. data/spec/{voip → adhearsion/voip}/dialplan_manager_spec.rb +0 -0
  55. data/spec/{voip → adhearsion/voip}/dsl/dialing_dsl_spec.rb +1 -1
  56. data/spec/{voip → adhearsion/voip}/dsl/dispatcher_spec.rb +0 -0
  57. data/spec/{voip → adhearsion/voip}/dsl/dispatcher_spec_helper.rb +0 -0
  58. data/spec/{voip → adhearsion/voip}/dsl/parser_spec.rb +0 -0
  59. data/spec/{voip → adhearsion/voip}/freeswitch/basic_connection_manager_spec.rb +0 -0
  60. data/spec/{voip → adhearsion/voip}/freeswitch/inbound_connection_manager_spec.rb +0 -0
  61. data/spec/{voip → adhearsion/voip}/freeswitch/oes_server_spec.rb +0 -0
  62. data/spec/{voip → adhearsion/voip}/numerical_string_spec.rb +0 -0
  63. data/spec/{voip → adhearsion/voip}/phone_number_spec.rb +0 -0
  64. data/spec/spec_helper.rb +36 -89
  65. data/spec/support/initializer_stubs.rb +47 -0
  66. data/spec/support/the_following_code.rb +3 -0
  67. data/{theatre-spec → spec/theatre}/dsl_examples/simple_before_call.rb +0 -0
  68. data/{theatre-spec → spec/theatre}/dsl_spec.rb +26 -0
  69. data/{theatre-spec → spec/theatre}/invocation_spec.rb +6 -10
  70. data/{theatre-spec → spec/theatre}/namespace_spec.rb +0 -0
  71. data/{theatre-spec → spec/theatre}/spec_helper_spec.rb +0 -0
  72. data/{theatre-spec → spec/theatre}/theatre_class_spec.rb +2 -5
  73. metadata +254 -271
  74. data/app_generators/ahn/templates/components/disabled/sandbox/sandbox.rb +0 -104
  75. data/app_generators/ahn/templates/components/disabled/sandbox/sandbox.yml +0 -2
  76. data/lib/adhearsion/voip/asterisk/super_manager.rb +0 -19
  77. data/spec/silence.rb +0 -10
  78. data/spec/voip/asterisk/ami/old_tests.rb +0 -204
  79. data/spec/voip/asterisk/ami/super_manager/super_manager_story +0 -25
  80. data/spec/voip/asterisk/ami/super_manager/super_manager_story.rb +0 -15
  81. data/spec/voip/asterisk/ami/super_manager/super_manager_story_helper.rb +0 -5
  82. data/theatre-spec/dsl_examples/dynamic_stomp.rb +0 -7
  83. data/theatre-spec/spec_helper.rb +0 -37
data/.gitignore CHANGED
@@ -8,3 +8,6 @@ vendor
8
8
  Gemfile.lock
9
9
  .bundle
10
10
  .rvmrc
11
+ coverage
12
+ spec/reports
13
+ doc
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --colour
3
+ --tty
data/CHANGELOG CHANGED
@@ -1,3 +1,15 @@
1
+ 1.2.0
2
+ - New method: #play_or_speak allows playback of an audio file with TTS fallback
3
+ - #input now takes :speak as a hash for TTS prompt or fallback
4
+ - New method: #speak provides abstracted TTS rendering for UniMRCP and Cepstral
5
+ - Allow leading "+" in Caller ID (E.164 format)
6
+ - Allow using --pid-file without "daemon" for JRuby
7
+ - Allow passing a block to #input to enable caller to detect when enough digits are collected.
8
+ - Fix some issues with starting apps outside of their directory, generally related to Bundler/gem environments
9
+ - Allow configuration of logging outputters/formatters
10
+ - Using ahn_log in a dialplan context or on a call object logs to the call's context, named after its unique identifier
11
+ - New method: #record_to_file with more useful return values
12
+
1
13
  1.1.1
2
14
  - Command#play now returns false if audio failed to play
3
15
  - Added new commands (#play!, #interruptible_play!, #input!) which raise PlaybackError if audio fails to play
@@ -16,18 +16,9 @@ Adhearsion has...
16
16
  * Easy interactive communication via XMPP instant messages using the Blather library
17
17
  * Good regression test coverage
18
18
 
19
- Use the public Adhearsion sandbox!
20
- ==================================
21
-
22
- Don't want to screw with setting up a telephony system? You can test your Adhearsion applications using our public sandbox!
23
-
24
- Visit [http://adhearsion.com/getting_started](http://adhearsion.com/getting_started) for more information!
25
-
26
- Yes, in minutes you can be controlling your cell phone for free! :)
27
-
28
19
  Documentation
29
20
  =============
30
21
 
31
22
  Visit [Adhearsion's website](http://adhearsion.com) for code examples and more information about the project. Also checkout the [Adhearsion wiki on Github](http://github.com/adhearsion/adhearsion/wiki) for community documentation.
32
23
 
33
- If you're having trouble, you may want to try asking your question on the IRC channel (#adhearsion on irc.freenode.net), [mailing list](http://groups.google.com/group/adhearsion) or, if you've found a bug, report it on the [bug tracker](http://adhearsion.lighthouseapp.com/projects/5871-adhearsion/overview).
24
+ If you're having trouble, you may want to try asking your question on the IRC channel (#adhearsion on irc.freenode.net), [mailing list](http://groups.google.com/group/adhearsion) or, if you've found a bug, report it on the [bug tracker](https://github.com/adhearsion/adhearsion/issues).
data/Rakefile CHANGED
@@ -2,41 +2,19 @@
2
2
  ENV['RUBY_FLAGS'] = "-I#{%w(lib ext bin spec).join(File::PATH_SEPARATOR)}"
3
3
 
4
4
  require 'rubygems'
5
- require 'bundler'
6
- Bundler::GemHelper.install_tasks
5
+ require 'bundler/gem_tasks'
6
+ require 'bundler/setup'
7
7
  require 'date'
8
8
  require 'adhearsion/version'
9
9
 
10
10
  task :default => :spec
11
11
  task :gem => :build
12
12
 
13
- begin
14
- gem 'rspec', '>= 2.3.0'
15
- require 'rspec/core/rake_task'
16
- rescue LoadError
17
- abort "You must install RSpec: sudo gem install rspec"
18
- end
13
+ require 'rspec/core/rake_task'
14
+ RSpec::Core::RakeTask.new
19
15
 
20
- RSpec::Core::RakeTask.new do |t|
21
- end
22
-
23
- desc "Run all RSpecs for Theatre"
24
- RSpec::Core::RakeTask.new(:theatre_specs) do |t|
25
- t.pattern = 'theatre-spec/**/*_spec.rb'
26
- end
27
-
28
- begin
29
- require 'rcov/rcovtask'
30
- Rcov::RcovTask.new do |t|
31
- t.libs << "spec"
32
- t.test_files = Dir['spec/**/*_spec.rb']
33
- t.output_dir = 'coverage'
34
- t.verbose = true
35
- t.rcov_opts.concat %w[--sort coverage --sort-reverse -x gems -x /var]
36
- end
37
- rescue LoadError
38
- STDERR.puts "Could not load rcov tasks -- rcov does not appear to be installed. Continuing anyway."
39
- end
16
+ require 'ci/reporter/rake/rspec'
17
+ task :ci => ['ci:setup:rspec', :spec]
40
18
 
41
19
  begin
42
20
  require 'yard'
@@ -13,48 +13,31 @@ Gem::Specification.new do |s|
13
13
  s.description = "Adhearsion is an open-source telephony development framework"
14
14
  s.date = Date.today.to_s
15
15
 
16
- s.rubyforge_project = "adhearsion"
17
- s.rubygems_version = "1.2.0"
18
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
19
-
20
16
  s.files = `git ls-files`.split("\n")
21
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
19
  s.require_paths = ["lib"]
24
20
 
25
- if s.respond_to? :specification_version then
26
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
27
- s.specification_version = 2
28
-
29
- if current_version >= 3 then
30
- # Runtime dependencies
31
- s.add_runtime_dependency("bundler", [">= 1.0.10"])
32
- s.add_runtime_dependency("log4r", [">= 1.0.5"])
33
- s.add_runtime_dependency("activesupport", [">= 2.1.0"])
34
- # i18n is only strictly a dependency for ActiveSupport >= 3.0.0
35
- # Since it doesn't conflict with <3.0.0 we'll require it to be
36
- # on the safe side.
37
- s.add_runtime_dependency("i18n")
38
- s.add_runtime_dependency("rubigen", [">= 1.5.6"])
39
- s.add_runtime_dependency("rake")
40
- s.add_runtime_dependency("pry")
21
+ # Runtime dependencies
22
+ s.add_runtime_dependency "bundler", [">= 1.0.10"]
23
+ s.add_runtime_dependency "log4r", [">= 1.0.5"]
24
+ s.add_runtime_dependency "activesupport", [">= 2.1.0"]
25
+ # i18n is only strictly a dependency for ActiveSupport >= 3.0.0
26
+ # Since it doesn't conflict with <3.0.0 we'll require it to be
27
+ # on the safe side.
28
+ s.add_runtime_dependency "i18n"
29
+ s.add_runtime_dependency "json"
30
+ s.add_runtime_dependency "rubigen", [">= 1.5.6"]
31
+ s.add_runtime_dependency "rake"
32
+ s.add_runtime_dependency "pry"
41
33
 
42
- # Development dependencies
43
- s.add_development_dependency('rubigen', [">= 1.5.6"])
44
- s.add_development_dependency('rspec', [">= 2.4.0"])
45
- s.add_development_dependency('flexmock')
46
- s.add_development_dependency('activerecord')
47
- s.add_development_dependency('rake')
48
- else
49
- s.add_dependency("bundler", [">= 1.0.10"])
50
- s.add_dependency("log4r", [">= 1.0.5"])
51
- s.add_dependency("activesupport", [">= 2.1.0"])
52
- s.add_dependency("rake")
53
- end
54
- else
55
- s.add_dependency("bundler", [">= 1.0.10"])
56
- s.add_dependency("log4r", [">= 1.0.5"])
57
- s.add_dependency("activesupport", [">= 2.1.0"])
58
- s.add_dependency("rake")
59
- end
34
+ # Development dependencies
35
+ s.add_development_dependency 'rubigen', [">= 1.5.6"]
36
+ s.add_development_dependency 'rspec', [">= 2.4.0"]
37
+ s.add_development_dependency 'flexmock'
38
+ s.add_development_dependency 'activerecord', [">= 2.1.0"]
39
+ s.add_development_dependency 'rake'
40
+ s.add_development_dependency 'simplecov'
41
+ s.add_development_dependency 'simplecov-rcov'
42
+ s.add_development_dependency 'ci_reporter'
60
43
  end
@@ -41,15 +41,14 @@ class AhnGenerator < RubiGen::Base
41
41
  m.file *["components/disabled/restful_rpc/example-client.rb"]*2
42
42
  m.file *["components/disabled/restful_rpc/spec/restful_rpc_spec.rb"]*2
43
43
 
44
- m.file *["components/disabled/sandbox/sandbox.yml"]*2
45
- m.file *["components/disabled/sandbox/sandbox.rb"]*2
46
-
44
+ m.file *["config/environment.rb"]*2
47
45
  m.file *["config/startup.rb"]*2
48
46
  m.file *["dialplan.rb"]*2
49
47
  m.file *["events.rb"]*2
50
48
  m.file *["README"]*2
51
49
  m.file *["Rakefile"]*2
52
50
  m.file *["Gemfile"]*2
51
+ m.file *["script/ahn"]*2
53
52
 
54
53
  # m.dependency "install_rubigen_scripts", [destination_root, 'ahn', 'adhearsion', 'test_spec'],
55
54
  # :shebang => options[:shebang], :collision => :force
@@ -89,9 +88,9 @@ EOS
89
88
  components/simon_game
90
89
  components/disabled/stomp_gateway
91
90
  components/disabled/xmpp_gateway
92
- components/disabled/sandbox
93
91
  components/ami_remote
94
92
  components/disabled/restful_rpc/spec
95
93
  config
94
+ script
96
95
  )
97
96
  end
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup
4
+ Bundler.require
@@ -1,7 +1,4 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- Bundler.setup
4
- Bundler.require
1
+ require File.join(File.dirname(__FILE__), 'environment')
5
2
 
6
3
  Adhearsion::Configuration.configure do |config|
7
4
 
@@ -12,7 +9,11 @@ Adhearsion::Configuration.configure do |config|
12
9
  # List the gem names here:
13
10
  # config.add_component "ahn_test_component"
14
11
 
15
- # Supported levels (in increasing severity) -- :debug < :info < :warn < :error < :fatal
12
+ # Log configuration
13
+ # :level : Supported levels (in increasing severity) -- :debug < :info < :warn < :error < :fatal
14
+ # :outputters : An array of log outputters to use. The default is to log to stdout and log/adhearsion.log
15
+ # :formatters : An array of log formatters to apply to the outputters in use
16
+ # :formatter : A log formatter to apply to all active outputters
16
17
  config.logging :level => :info
17
18
 
18
19
  # Whether incoming calls be automatically answered. Defaults to true.
@@ -32,6 +33,11 @@ Adhearsion::Configuration.configure do |config|
32
33
  config.enable_asterisk :argument_delimiter => '|'
33
34
  # config.asterisk.enable_ami :host => "127.0.0.1", :username => "admin", :password => "password", :events => true
34
35
 
36
+ # Adhearsion supports two possible speech engines with Asterisk: UniMRCP and Cepstral.
37
+ # Uncomment one of the below if you have it available.
38
+ # config.asterisk.speech_engine = :cepstral
39
+ # config.asterisk.speech_engine = :unimrcp
40
+
35
41
  # config.enable_drb
36
42
 
37
43
  # Streamlined Rails integration! The first argument should be a relative or absolute path to
@@ -0,0 +1,8 @@
1
+ # This command will automatically be run when you run "ahn" with the Adhearsion gem installed from the root of your application.
2
+
3
+ require File.expand_path('../../config/environment', __FILE__)
4
+
5
+ require 'adhearsion'
6
+ require 'adhearsion/commands'
7
+
8
+ Adhearsion::CLI::AhnCommand.execute!
@@ -1,300 +1,7 @@
1
- require 'fileutils'
1
+ require 'adhearsion/script_ahn_loader'
2
2
 
3
- module Adhearsion
4
- module CLI
5
- module AhnCommand
6
- USAGE = <<USAGE
7
- Usage:
8
- ahn create /path/to/directory
9
- ahn start [console|daemon] [/path/to/directory]
10
- ahn version|-v|--v|-version|--version
11
- ahn help|-h|--h|--help|-help
3
+ # If we are inside an Adhearsion application this method performs an exec and thus
4
+ # the rest of this script is not run.
5
+ Adhearsion::ScriptAhnLoader.exec_script_ahn!
12
6
 
13
- ahn enable component COMPONENT_NAME
14
- ahn disable component COMPONENT_NAME
15
- ahn create component COMPONENT_NAME
16
- USAGE
17
- class << self
18
-
19
- def execute!
20
- CommandHandler.send(*parse_arguments)
21
- rescue CommandHandler::CLIException => error
22
- fail_and_print_usage error
23
- end
24
-
25
- ##
26
- # Provides a small abstraction of Kernel::abort().
27
- #
28
- def fail_and_print_usage(error)
29
- Kernel.abort "#{error.message}\n\n#{USAGE}"
30
- end
31
-
32
- def parse_arguments(args=ARGV.clone)
33
- action = args.shift
34
- case action
35
- when /^-?-?h(elp)?$/, nil then [:help]
36
- when /^-?-?v(ersion)?$/ then [:version]
37
- when "create"
38
- [:create, *args]
39
- when 'start'
40
- pid_file_regexp = /^--pid-file=(.+)$/
41
- if args.size > 3
42
- raise CommandHandler::CLIException, "Too many arguments supplied!" if args.size > 3
43
- elsif args.size == 3
44
- raise CommandHandler::CLIException, "Unrecognized final argument #{args.last}" unless args.last =~ pid_file_regexp
45
- pid_file = args.pop[pid_file_regexp, 1]
46
- else
47
- pid_file = nil
48
- end
49
-
50
- if args.size == 2
51
- path = args.last
52
- if args.first =~ /daemon|console/
53
- mode = args.first.to_sym
54
- else
55
- raise CommandHandler::CLIException, "Invalid start mode requested: #{args.first}"
56
- end
57
- elsif args.size == 1
58
- path, mode = args.first, :foreground
59
- else
60
- raise CommandHandler::CLIException, "Invalid format for the start CLI command!"
61
- end
62
- [:start, path, mode, pid_file]
63
- when '-'
64
- [:start, Dir.pwd]
65
- when "enable", "disable"
66
- if args.size == 1
67
- raise CommandHandler::UnknownCommand, "Must supply an argument for what you wish to #{action}"
68
- elsif args.size == 2
69
- [action, *args]
70
- else
71
- raise CommandHandler::UnknownCommand, "Too many arguments supplied!"
72
- end
73
- else
74
- [action, *args]
75
- end
76
- end
77
- end
78
-
79
- module CommandHandler
80
- class << self
81
-
82
- def create(*args)
83
- if args.size.zero?
84
- raise CommandHandler::UnknownCommand.new("Must specify something to create!")
85
- elsif args.size == 1
86
- # We're creating a project
87
- path = args.first
88
- require 'rubigen'
89
- require 'rubigen/scripts/generate'
90
- source = RubiGen::PathSource.new(:application,
91
- File.join(File.dirname(__FILE__), "../../app_generators"))
92
- RubiGen::Base.reset_sources
93
- RubiGen::Base.append_sources source
94
- RubiGen::Scripts::Generate.new.run([path], :generator => 'ahn')
95
- elsif args.size == 2
96
- # We're creating a feature (e.g. a component)
97
- feature_type, component_name = args
98
-
99
- if feature_type != "component"
100
- # At the moment, only components can be created.
101
- raise CommandHandler::UnknownCommand.new("Don't know how to create '#{feature_type}'")
102
- end
103
-
104
- if component_name !~ /^[a-z][\w_]+$/
105
- raise CommandHandler::ComponentError.new("Component name must be lowercase alphanumeric characters " +
106
- "and begin with a character")
107
- end
108
-
109
- app_path = PathString.from_application_subdirectory Dir.pwd
110
-
111
- if app_path.nil?
112
- new_component_dir = File.join Dir.pwd, component_name
113
- else
114
- puts "Adhearsion application detected. Creating new component at components/#{component_name}"
115
- new_component_dir = File.join app_path, "components", component_name
116
- end
117
-
118
- raise ComponentError.new("Component #{component_name} already exists!") if File.exists?(new_component_dir)
119
-
120
- # Everything's good. Let's create the component
121
- Dir.mkdir new_component_dir
122
-
123
- # Initial component code file
124
- Dir.mkdir File.join(new_component_dir, "lib")
125
- fn = File.join("lib", "#{component_name}.rb")
126
- puts "- #{fn}: Initial component code file"
127
- File.open(File.join(new_component_dir, fn),"w") do |file|
128
- file.puts <<-RUBY
129
- # See http://docs.adhearsion.com for more information on how to write components or
130
- # look at the examples in newly-created projects.
131
- RUBY
132
- end
133
-
134
- # Component configuration
135
- Dir.mkdir File.join(new_component_dir, "config")
136
- fn = File.join("config", "#{component_name}.yml")
137
- puts "- #{fn}: Example component configuration YAML"
138
- File.open(File.join(new_component_dir, fn),"w") do |file|
139
- file.puts '# You can use this file for component-specific configuration.'
140
- end
141
-
142
- # Component example gemspec
143
- fn = File.join("#{component_name}.gemspec")
144
- puts "- #{fn}: Example component gemspec"
145
- File.open(File.join(new_component_dir, fn), "w") do |file|
146
- file.puts <<-RUBY
147
- GEM_FILES = %w{
148
- #{component_name}.gemspec
149
- lib/#{component_name}.rb
150
- config/#{component_name}.yml
151
- }
152
-
153
- Gem::Specification.new do |s|
154
- s.name = "#{component_name}"
155
- s.version = "0.0.1"
156
-
157
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
158
- s.authors = ["Your Name Here!"]
159
-
160
- s.date = Date.today.to_s
161
- s.description = "This Adhearsion component gem has not yet been described."
162
- s.email = "noreply@example.com"
163
-
164
- s.files = GEM_FILES
165
-
166
- s.has_rdoc = false
167
- s.homepage = "http://adhearsion.com"
168
- s.require_paths = ["lib"]
169
- s.rubygems_version = "1.2.0"
170
- s.summary = "This Adhearsion component gem has no summary."
171
-
172
- s.specification_version = 2
173
- end
174
- RUBY
175
- end
176
-
177
- # Component example spec
178
- Dir.mkdir File.join(new_component_dir, "spec")
179
- fn = File.join("spec", "#{component_name}_spec.rb")
180
- puts "- #{fn}: Example component spec"
181
- File.open(File.join(new_component_dir, fn), "w") do |file|
182
- file.puts <<-RUBY
183
- require 'rubygems'
184
- require 'bundler'
185
- Bundler.setup
186
- Bundler.require
187
-
188
- require 'adhearsion/component_manager/spec_framework'
189
-
190
- component_name.upcase = ComponentTester.new("#{component_name}", File.dirname(__FILE__) + "/../..")
191
- RUBY
192
- end
193
- puts "Created blank component '#{component_name}' at #{new_component_dir}"
194
- else
195
- raise CommandHandler::UnknownCommand.new("Provided too many arguments to 'create'")
196
- end
197
- end
198
-
199
- def start(path, mode=:foreground, pid_file=nil)
200
- raise PathInvalid, path unless File.exists? path + "/.ahnrc"
201
- Adhearsion::Initializer.start path, :mode => mode, :pid_file => pid_file
202
- end
203
-
204
- def version
205
- puts "Adhearsion v#{Adhearsion::VERSION::STRING}"
206
- end
207
-
208
- def help
209
- puts USAGE
210
- end
211
-
212
- def enable(type, name)
213
- case type
214
- when "component"
215
- app_path = PathString.from_application_subdirectory Dir.pwd
216
- if app_path
217
- disabled_component_path = File.join app_path, "components", "disabled", name
218
- disabled_components_path = File.join app_path, "components", "disabled"
219
- enabled_component_path = File.join app_path, "components", name
220
- if File.directory? disabled_component_path
221
- FileUtils.mv disabled_component_path, enabled_component_path
222
- puts "Enabled component #{name}"
223
- elsif File.directory? enabled_component_path
224
- raise ComponentError.new("This component is already enabled.")
225
- elsif !File.directory? disabled_components_path
226
- raise ComponentError.new("There is no components/disabled directory!")
227
- else
228
- raise ComponentError.new("The requested component was not found.")
229
- end
230
- else
231
- raise PathInvalid.new(Dir.pwd)
232
- end
233
- else
234
- raise UnknownCommand.new("enable #{type}")
235
- end
236
- end
237
-
238
- def disable(type, name)
239
- case type
240
- when "component"
241
- app_path = PathString.from_application_subdirectory Dir.pwd
242
- if app_path
243
- disabled_dir = File.join app_path, "components", "disabled"
244
-
245
- disabled_component_path = File.join disabled_dir, name
246
- enabled_component_path = File.join app_path, "components", name
247
-
248
- Dir.mkdir disabled_dir unless File.directory?(disabled_dir)
249
-
250
- if File.directory? enabled_component_path
251
- if File.directory?(disabled_component_path)
252
- raise ComponentError.new("There is already a disabled component at #{disabled_component_path}")
253
- else
254
- FileUtils.mv enabled_component_path, disabled_component_path
255
- puts "Disabled component #{name}"
256
- end
257
- else
258
- raise ComponentError.new("Could not find component #{name} at #{enabled_component_path} !")
259
- end
260
- else
261
- raise PathInvalid.new(Dir.pwd)
262
- end
263
- else
264
- raise UnknownCommand.new("disable #{type}")
265
- end
266
- end
267
-
268
- def method_missing(action, *args)
269
- raise UnknownCommand, [action, *args] * " "
270
- end
271
-
272
- private
273
-
274
- end
275
-
276
- class CLIException < StandardError; end
277
-
278
- class UnknownCommand < CLIException
279
- def initialize(cmd)
280
- super "Unknown command: #{cmd}"
281
- end
282
- end
283
-
284
- class ComponentError < CLIException; end
285
-
286
- class UnknownProject < CLIException
287
- def initialize(project)
288
- super "Application #{project} does not exist! Have you installed it?"
289
- end
290
- end
291
-
292
- class PathInvalid < CLIException
293
- def initialize(path)
294
- super "Directory #{path} does not belong to an Adhearsion project!"
295
- end
296
- end
297
- end
298
- end
299
- end
300
- end
7
+ require 'adhearsion/commands'