adhearsion 2.3.5 → 2.4.0.beta1

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -1
  3. data/CHANGELOG.md +14 -0
  4. data/Gemfile +2 -0
  5. data/README.markdown +21 -2
  6. data/adhearsion.gemspec +5 -4
  7. data/features/cli_plugin.feature +41 -0
  8. data/features/cli_start.feature +12 -4
  9. data/features/step_definitions/cli_steps.rb +12 -0
  10. data/features/support/env.rb +1 -1
  11. data/features/support/utils.rb +0 -1
  12. data/lib/adhearsion.rb +4 -1
  13. data/lib/adhearsion/call.rb +92 -22
  14. data/lib/adhearsion/call_controller.rb +19 -15
  15. data/lib/adhearsion/call_controller/dial.rb +157 -25
  16. data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +8 -0
  17. data/lib/adhearsion/call_controller/output/async_player.rb +1 -1
  18. data/lib/adhearsion/call_controller/output/formatter.rb +1 -1
  19. data/lib/adhearsion/call_controller/output/player.rb +1 -1
  20. data/lib/adhearsion/calls.rb +2 -0
  21. data/lib/adhearsion/cli_commands.rb +3 -163
  22. data/lib/adhearsion/cli_commands/ahn_command.rb +141 -0
  23. data/lib/adhearsion/cli_commands/plugin_command.rb +74 -0
  24. data/lib/adhearsion/cli_commands/thor_errors.rb +36 -0
  25. data/lib/adhearsion/console.rb +14 -6
  26. data/lib/adhearsion/generators/app/templates/spec/call_controllers/simon_game_spec.rb +36 -36
  27. data/lib/adhearsion/generators/controller/templates/spec/controller_spec.rb +1 -1
  28. data/lib/adhearsion/generators/plugin/templates/plugin-template.gemspec.tt +0 -1
  29. data/lib/adhearsion/generators/plugin/templates/spec/plugin-template/controller_methods_spec.rb.tt +1 -1
  30. data/lib/adhearsion/generators/plugin/templates/spec/spec_helper.rb.tt +0 -1
  31. data/lib/adhearsion/logging.rb +5 -1
  32. data/lib/adhearsion/outbound_call.rb +16 -0
  33. data/lib/adhearsion/punchblock_plugin.rb +0 -2
  34. data/lib/adhearsion/punchblock_plugin/initializer.rb +7 -12
  35. data/lib/adhearsion/version.rb +1 -1
  36. data/spec/adhearsion/call_controller/dial_spec.rb +785 -32
  37. data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +10 -0
  38. data/spec/adhearsion/call_controller/output/async_player_spec.rb +1 -1
  39. data/spec/adhearsion/call_controller/output/player_spec.rb +1 -1
  40. data/spec/adhearsion/call_controller/output_spec.rb +3 -3
  41. data/spec/adhearsion/call_controller/record_spec.rb +1 -1
  42. data/spec/adhearsion/call_controller_spec.rb +13 -9
  43. data/spec/adhearsion/call_spec.rb +216 -51
  44. data/spec/adhearsion/calls_spec.rb +1 -1
  45. data/spec/adhearsion/console_spec.rb +20 -9
  46. data/spec/adhearsion/outbound_call_spec.rb +40 -6
  47. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +9 -21
  48. data/spec/adhearsion/punchblock_plugin_spec.rb +1 -1
  49. data/spec/adhearsion/router_spec.rb +1 -1
  50. data/spec/spec_helper.rb +11 -15
  51. data/spec/support/call_controller_test_helpers.rb +2 -2
  52. data/spec/support/punchblock_mocks.rb +2 -2
  53. metadata +41 -16
@@ -125,7 +125,7 @@ module Adhearsion
125
125
 
126
126
  it "is sends a hangup command for the call" do
127
127
  call_id = call.id
128
- PunchblockPlugin.stub :client => mock('Client')
128
+ PunchblockPlugin.stub :client => double('Client')
129
129
  PunchblockPlugin.client.should_receive(:execute_command).once.with(Punchblock::Command::Hangup.new, :async => true, :call_id => call_id)
130
130
 
131
131
  subject << call
@@ -15,15 +15,17 @@ module Adhearsion
15
15
  end
16
16
  end
17
17
 
18
- describe 'testing for libedit vs. readline' do
19
- it 'should return true when detecting readline' do
20
- Readline.should_receive(:emacs_editing_mode).once.and_return true
21
- Console.libedit?.should be false
22
- end
18
+ unless defined? JRUBY_VERSION # These tests are not valid on JRuby
19
+ describe 'testing for readline' do
20
+ it 'should return false when detecting readline' do
21
+ Readline.should_receive(:emacs_editing_mode).once.and_return true
22
+ Console.cruby_with_readline?.should be true
23
+ end
23
24
 
24
- it 'should return false when detecting libedit' do
25
- Readline.should_receive(:emacs_editing_mode).once.and_raise NotImplementedError
26
- Console.libedit?.should be true
25
+ it 'should return true when detecting libedit' do
26
+ Readline.should_receive(:emacs_editing_mode).once.and_raise NotImplementedError
27
+ Console.cruby_with_readline?.should be false
28
+ end
27
29
  end
28
30
  end
29
31
 
@@ -64,12 +66,21 @@ module Adhearsion
64
66
  end
65
67
  end
66
68
 
69
+ describe "#originate" do
70
+ it "should be an alias for Adhearsion::OutboundCall.originate" do
71
+ foo = nil
72
+ Adhearsion::OutboundCall.should_receive(:originate).once.with(:foo, :bar).and_yield
73
+ Console.originate(:foo, :bar) { foo = :bar}
74
+ foo.should == :bar
75
+ end
76
+ end
77
+
67
78
  describe "#take" do
68
79
  let(:call) { Call.new }
69
80
  let(:call_id) { rand.to_s }
70
81
 
71
82
  before do
72
- Adhearsion.active_calls.clear!
83
+ Adhearsion.active_calls.clear
73
84
  call.stub(:id => call_id)
74
85
  end
75
86
 
@@ -9,13 +9,14 @@ module Adhearsion
9
9
  its(:id) { should be_nil }
10
10
  its(:variables) { should be == {} }
11
11
 
12
- let(:mock_client) { mock 'Punchblock Client' }
12
+ let(:mock_client) { double 'Punchblock Client' }
13
13
 
14
14
  before do
15
15
  PunchblockPlugin::Initializer.client = mock_client
16
16
  end
17
17
 
18
18
  its(:client) { should be mock_client }
19
+ its(:start_time) { should be nil }
19
20
 
20
21
  describe ".originate" do
21
22
  let(:to) { 'sip:foo@bar.com' }
@@ -86,7 +87,7 @@ module Adhearsion
86
87
  end
87
88
 
88
89
  describe "event handlers" do
89
- let(:response) { mock 'Response' }
90
+ let(:response) { double 'Response' }
90
91
 
91
92
  describe "for answered events" do
92
93
  let(:event) { Punchblock::Event::Answered.new }
@@ -96,20 +97,43 @@ module Adhearsion
96
97
  subject.on_answer { |event| response.call event }
97
98
  subject << event
98
99
  end
100
+
101
+ it "should record the call start time" do
102
+ originate_time = Time.local(2008, 9, 1, 12, 0, 0)
103
+ Timecop.freeze originate_time
104
+ subject.duration.should == 0.0
105
+
106
+ mid_point_time = Time.local(2008, 9, 1, 12, 0, 20)
107
+ Timecop.freeze mid_point_time
108
+ subject.duration.should == 0.0
109
+
110
+ answer_time = Time.local(2008, 9, 1, 12, 0, 40)
111
+ Timecop.freeze answer_time
112
+ subject << event
113
+ subject.start_time.should == answer_time
114
+
115
+ later_time = Time.local(2008, 9, 1, 12, 0, 50)
116
+ Timecop.freeze later_time
117
+ subject.duration.should == 10.0
118
+ end
99
119
  end
100
120
  end
101
121
 
102
122
  describe "#dial" do
103
123
  def expect_message_waiting_for_response(message)
104
124
  subject.wrapped_object.should_receive(:write_and_await_response).once.with(message, 60).and_return do
125
+ message.transport = transport
105
126
  message.target_call_id = call_id
127
+ message.domain = domain
106
128
  message
107
129
  end
108
130
  end
109
131
 
110
- let(:call_id) { 'abc123' }
111
- let(:to) { '+1800 555-0199' }
112
- let(:from) { '+1800 555-0122' }
132
+ let(:transport) { 'footransport' }
133
+ let(:call_id) { 'abc123' }
134
+ let(:domain) { 'rayo.net' }
135
+ let(:to) { '+1800 555-0199' }
136
+ let(:from) { '+1800 555-0122' }
113
137
 
114
138
  let(:expected_dial_command) { Punchblock::Command::Dial.new(:to => to, :from => from) }
115
139
 
@@ -126,11 +150,21 @@ module Adhearsion
126
150
  subject.dial_command.should be == expected_dial_command
127
151
  end
128
152
 
129
- it "should set the call ID from the dial command" do
153
+ it "should set the URI from the reference" do
154
+ subject.dial to, :from => from
155
+ subject.uri.should be == "footransport:abc123@rayo.net"
156
+ end
157
+
158
+ it "should set the call ID from the reference" do
130
159
  subject.dial to, :from => from
131
160
  subject.id.should be == call_id
132
161
  end
133
162
 
163
+ it "should set the call domain from the reference" do
164
+ subject.dial to, :from => from
165
+ subject.domain.should be == domain
166
+ end
167
+
134
168
  it "should set the to from the dial command" do
135
169
  subject.dial to, :from => from
136
170
  subject.to.should be == to
@@ -15,8 +15,6 @@ module Adhearsion
15
15
  config.port = nil
16
16
  config.certs_directory = nil
17
17
  config.root_domain = nil
18
- config.calls_domain = nil
19
- config.mixers_domain = nil
20
18
  config.connection_timeout = 60
21
19
  config.reconnect_attempts = 1.0/0.0
22
20
  config.reconnect_timer = 5
@@ -36,8 +34,6 @@ module Adhearsion
36
34
  config.port = options[:port] if options.has_key?(:port)
37
35
  config.certs_directory = options[:certs_directory] if options.has_key?(:certs_directory)
38
36
  config.root_domain = options[:root_domain] if options.has_key?(:root_domain)
39
- config.calls_domain = options[:calls_domain] if options.has_key?(:calls_domain)
40
- config.mixers_domain = options[:mixers_domain] if options.has_key?(:mixers_domain)
41
37
  config.connection_timeout = options[:connection_timeout] if options.has_key?(:connection_timeout)
42
38
  config.reconnect_attempts = options[:reconnect_attempts] if options.has_key?(:reconnect_attempts)
43
39
  config.reconnect_timer = options[:reconnect_timer] if options.has_key?(:reconnect_timer)
@@ -52,7 +48,7 @@ module Adhearsion
52
48
  let(:call_id) { rand }
53
49
  let(:offer) { Punchblock::Event::Offer.new :target_call_id => call_id }
54
50
  let(:mock_call) { Call.new }
55
- let(:mock_client) { mock 'Client' }
51
+ let(:mock_client) { double 'Client' }
56
52
 
57
53
  before do
58
54
  mock_call.stub :id => call_id
@@ -90,14 +86,6 @@ module Adhearsion
90
86
  subject.root_domain.should be_nil
91
87
  end
92
88
 
93
- it "should set properly the calls_domain value" do
94
- subject.calls_domain.should be_nil
95
- end
96
-
97
- it "should set properly the mixers_domain value" do
98
- subject.mixers_domain.should be_nil
99
- end
100
-
101
89
  it "should properly set the reconnect_attempts value" do
102
90
  subject.reconnect_attempts.should be == 1.0/0.0
103
91
  end
@@ -123,14 +111,14 @@ module Adhearsion
123
111
  end
124
112
 
125
113
  it "starts the client with any overridden settings" do
126
- Punchblock::Connection::XMPP.should_receive(:new).once.with(username: 'userb@127.0.0.1/foo', password: '123', host: 'foo.bar.com', port: 200, certs: '/foo/bar', connection_timeout: 20, root_domain: 'foo.com', calls_domain: 'call.foo.com', mixers_domain: 'mixer.foo.com', media_engine: :swift, default_voice: :hal).and_return mock_client
127
- initialize_punchblock username: 'userb@127.0.0.1/foo', password: '123', host: 'foo.bar.com', port: 200, certs_directory: '/foo/bar', connection_timeout: 20, root_domain: 'foo.com', calls_domain: 'call.foo.com', mixers_domain: 'mixer.foo.com', media_engine: :swift, default_voice: :hal
114
+ Punchblock::Connection::XMPP.should_receive(:new).once.with(username: 'userb@127.0.0.1/foo', password: '123', host: 'foo.bar.com', port: 200, certs: '/foo/bar', connection_timeout: 20, root_domain: 'foo.com', media_engine: :swift, default_voice: :hal).and_return mock_client
115
+ initialize_punchblock username: 'userb@127.0.0.1/foo', password: '123', host: 'foo.bar.com', port: 200, certs_directory: '/foo/bar', connection_timeout: 20, root_domain: 'foo.com', media_engine: :swift, default_voice: :hal
128
116
  end
129
117
 
130
118
  describe "#connect" do
131
119
  it 'should block until the connection is established' do
132
120
  reset_default_config
133
- mock_connection = mock :mock_connection
121
+ mock_connection = double :mock_connection
134
122
  mock_connection.should_receive(:register_event_handler).once
135
123
  Punchblock::Client.should_receive(:new).once.and_return mock_connection
136
124
  mock_connection.should_receive(:run).once
@@ -184,7 +172,7 @@ module Adhearsion
184
172
  end
185
173
 
186
174
  describe 'using Asterisk' do
187
- let(:overrides) { {:username => 'test', :password => '123', :host => 'foo.bar.com', :port => 200, :certs => nil, :connection_timeout => 20, :root_domain => 'foo.com', :calls_domain => 'call.foo.com', :mixers_domain => 'mixer.foo.com', :media_engine => :swift, :default_voice => :hal} }
175
+ let(:overrides) { {:username => 'test', :password => '123', :host => 'foo.bar.com', :port => 200, :certs => nil, :connection_timeout => 20, :root_domain => 'foo.com', :media_engine => :swift, :default_voice => :hal} }
188
176
 
189
177
  it 'should start an Asterisk PB connection' do
190
178
  Punchblock::Connection::Asterisk.should_receive(:new).once.with(overrides).and_return mock_client
@@ -193,7 +181,7 @@ module Adhearsion
193
181
  end
194
182
 
195
183
  describe 'using FreeSWITCH' do
196
- let(:overrides) { {:username => 'test', :password => '123', :host => 'foo.bar.com', :port => 200, :certs => nil, :connection_timeout => 20, :root_domain => 'foo.com', :calls_domain => 'call.foo.com', :mixers_domain => 'mixer.foo.com', :media_engine => :swift, :default_voice => :hal} }
184
+ let(:overrides) { {:username => 'test', :password => '123', :host => 'foo.bar.com', :port => 200, :certs => nil, :connection_timeout => 20, :root_domain => 'foo.com', :media_engine => :swift, :default_voice => :hal} }
197
185
 
198
186
  it 'should start a FreeSWITCH PB connection' do
199
187
  Punchblock::Connection::Freeswitch.should_receive(:new).once.with(overrides).and_return mock_client
@@ -255,8 +243,8 @@ module Adhearsion
255
243
  end
256
244
 
257
245
  describe "dispatching a component event" do
258
- let(:component) { mock 'ComponentNode' }
259
- let(:mock_event) { mock 'Event' }
246
+ let(:component) { double 'ComponentNode' }
247
+ let(:mock_event) { double 'Event' }
260
248
 
261
249
  before { mock_event.stub target_call_id: call_id, source: component }
262
250
 
@@ -271,7 +259,7 @@ module Adhearsion
271
259
  end
272
260
 
273
261
  describe "dispatching a call event" do
274
- let(:mock_event) { mock 'Event' }
262
+ let(:mock_event) { double 'Event' }
275
263
 
276
264
  before { mock_event.stub target_call_id: call_id }
277
265
 
@@ -13,7 +13,7 @@ module Adhearsion
13
13
  describe '#execute_component' do
14
14
  let(:message) { Punchblock::Command::Accept.new }
15
15
  let(:response) { :foo }
16
- let(:mock_client) { mock 'Client' }
16
+ let(:mock_client) { double 'Client' }
17
17
 
18
18
  let(:execute_expectation) { PunchblockPlugin.client.should_receive(:execute_command).once }
19
19
 
@@ -9,7 +9,7 @@ module Adhearsion
9
9
  describe 'a new router' do
10
10
  subject { Router.new {} }
11
11
 
12
- let(:call) { mock 'Adhearsion::Call' }
12
+ let(:call) { double 'Adhearsion::Call' }
13
13
  before { call.stub id: 'abc123' }
14
14
 
15
15
  it "should make the router available to the block" do
@@ -2,27 +2,15 @@
2
2
 
3
3
  $testing = true
4
4
 
5
- unless ENV['SKIP_RCOV']
6
- require 'simplecov'
7
- require 'simplecov-rcov'
8
- class SimpleCov::Formatter::MergedFormatter
9
- def format(result)
10
- SimpleCov::Formatter::HTMLFormatter.new.format(result)
11
- SimpleCov::Formatter::RcovFormatter.new.format(result)
12
- end
13
- end
14
- SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
15
- SimpleCov.start do
16
- add_filter "/vendor/"
17
- add_filter "/spec/"
18
- end
19
- end
5
+ require 'coveralls'
6
+ Coveralls.wear!
20
7
 
21
8
  %w{
22
9
  bundler/setup
23
10
  active_support
24
11
  stringio
25
12
  countdownlatch
13
+ timecop
26
14
  adhearsion
27
15
  }.each { |f| require f }
28
16
 
@@ -39,6 +27,10 @@ RSpec.configure do |config|
39
27
  config.run_all_when_everything_filtered = true
40
28
  config.color_enabled = true
41
29
 
30
+ config.mock_with :rspec do |mocks|
31
+ mocks.add_stub_and_should_receive_to Celluloid::AbstractProxy, ThreadSafeArray
32
+ end
33
+
42
34
  config.before :suite do
43
35
  Adhearsion::Logging.start Adhearsion::Logging.default_appenders, :trace, Adhearsion.config.platform.logging.formatter
44
36
  end
@@ -46,6 +38,10 @@ RSpec.configure do |config|
46
38
  config.before :each do
47
39
  Adhearsion.router = nil
48
40
  end
41
+
42
+ config.after :each do
43
+ Timecop.return
44
+ end
49
45
  end
50
46
 
51
47
  Adhearsion::Events.exeption do |e|
@@ -11,7 +11,7 @@ module CallControllerTestHelpers
11
11
  test_case.subject { controller }
12
12
 
13
13
  test_case.before do
14
- call.stub :write_command => true, :id => call_id
14
+ call.wrapped_object.stub :write_command => true, :id => call_id
15
15
  end
16
16
  end
17
17
 
@@ -50,7 +50,7 @@ module CallControllerTestHelpers
50
50
 
51
51
  def expect_input_component_complete_event(utterance)
52
52
  complete_event = Punchblock::Event::Complete.new
53
- complete_event.stub reason: mock(utterance: utterance, name: :input)
53
+ complete_event.stub reason: double(utterance: utterance, name: :input)
54
54
  Punchblock::Component::Input.any_instance.stub(complete?: true, complete_event: complete_event)
55
55
  end
56
56
  end
@@ -2,8 +2,8 @@
2
2
 
3
3
  def mock_offer(id = nil, headers = {})
4
4
  id ||= rand
5
- mock("Offer: #{id}").tap do |offer|
6
- offer.stub :call_id => id, :headers_hash => headers
5
+ double("Offer: #{id}").tap do |offer|
6
+ offer.stub :call_id => id, :headers => headers
7
7
  offer.as_null_object
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adhearsion
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.5
4
+ version: 2.4.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jay Phillips
@@ -11,22 +11,28 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-06-06 00:00:00.000000000 Z
14
+ date: 2013-08-21 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
- - - ~>
20
+ - - '>='
21
21
  - !ruby/object:Gem::Version
22
- version: '3.0'
22
+ version: 3.0.0
23
+ - - <
24
+ - !ruby/object:Gem::Version
25
+ version: 5.0.0
23
26
  type: :runtime
24
27
  prerelease: false
25
28
  version_requirements: !ruby/object:Gem::Requirement
26
29
  requirements:
27
- - - ~>
30
+ - - '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 3.0.0
33
+ - - <
28
34
  - !ruby/object:Gem::Version
29
- version: '3.0'
35
+ version: 5.0.0
30
36
  - !ruby/object:Gem::Dependency
31
37
  name: adhearsion-loquacious
32
38
  requirement: !ruby/object:Gem::Requirement
@@ -173,14 +179,14 @@ dependencies:
173
179
  requirements:
174
180
  - - ~>
175
181
  - !ruby/object:Gem::Version
176
- version: '1.4'
182
+ version: 2.0.0.beta1
177
183
  type: :runtime
178
184
  prerelease: false
179
185
  version_requirements: !ruby/object:Gem::Requirement
180
186
  requirements:
181
187
  - - ~>
182
188
  - !ruby/object:Gem::Version
183
- version: '1.4'
189
+ version: 2.0.0.beta1
184
190
  - !ruby/object:Gem::Dependency
185
191
  name: rake
186
192
  requirement: !ruby/object:Gem::Requirement
@@ -201,14 +207,14 @@ dependencies:
201
207
  requirements:
202
208
  - - ~>
203
209
  - !ruby/object:Gem::Version
204
- version: '1.0'
210
+ version: '2.0'
205
211
  type: :runtime
206
212
  prerelease: false
207
213
  version_requirements: !ruby/object:Gem::Requirement
208
214
  requirements:
209
215
  - - ~>
210
216
  - !ruby/object:Gem::Version
211
- version: '1.0'
217
+ version: '2.0'
212
218
  - !ruby/object:Gem::Dependency
213
219
  name: thor
214
220
  requirement: !ruby/object:Gem::Requirement
@@ -308,7 +314,7 @@ dependencies:
308
314
  - !ruby/object:Gem::Version
309
315
  version: '2.11'
310
316
  - !ruby/object:Gem::Dependency
311
- name: ruby_gntp
317
+ name: simplecov
312
318
  requirement: !ruby/object:Gem::Requirement
313
319
  requirements:
314
320
  - - '>='
@@ -322,7 +328,7 @@ dependencies:
322
328
  - !ruby/object:Gem::Version
323
329
  version: '0'
324
330
  - !ruby/object:Gem::Dependency
325
- name: simplecov
331
+ name: simplecov-rcov
326
332
  requirement: !ruby/object:Gem::Requirement
327
333
  requirements:
328
334
  - - '>='
@@ -336,7 +342,7 @@ dependencies:
336
342
  - !ruby/object:Gem::Version
337
343
  version: '0'
338
344
  - !ruby/object:Gem::Dependency
339
- name: simplecov-rcov
345
+ name: yard
340
346
  requirement: !ruby/object:Gem::Requirement
341
347
  requirements:
342
348
  - - '>='
@@ -350,7 +356,21 @@ dependencies:
350
356
  - !ruby/object:Gem::Version
351
357
  version: '0'
352
358
  - !ruby/object:Gem::Dependency
353
- name: yard
359
+ name: coveralls
360
+ requirement: !ruby/object:Gem::Requirement
361
+ requirements:
362
+ - - '>='
363
+ - !ruby/object:Gem::Version
364
+ version: '0'
365
+ type: :development
366
+ prerelease: false
367
+ version_requirements: !ruby/object:Gem::Requirement
368
+ requirements:
369
+ - - '>='
370
+ - !ruby/object:Gem::Version
371
+ version: '0'
372
+ - !ruby/object:Gem::Dependency
373
+ name: timecop
354
374
  requirement: !ruby/object:Gem::Requirement
355
375
  requirements:
356
376
  - - '>='
@@ -389,6 +409,7 @@ files:
389
409
  - features/cli_create.feature
390
410
  - features/cli_daemon.feature
391
411
  - features/cli_generate.feature
412
+ - features/cli_plugin.feature
392
413
  - features/cli_restart.feature
393
414
  - features/cli_start.feature
394
415
  - features/cli_stop.feature
@@ -423,6 +444,9 @@ files:
423
444
  - lib/adhearsion/calls.rb
424
445
  - lib/adhearsion/cli.rb
425
446
  - lib/adhearsion/cli_commands.rb
447
+ - lib/adhearsion/cli_commands/ahn_command.rb
448
+ - lib/adhearsion/cli_commands/plugin_command.rb
449
+ - lib/adhearsion/cli_commands/thor_errors.rb
426
450
  - lib/adhearsion/configuration.rb
427
451
  - lib/adhearsion/console.rb
428
452
  - lib/adhearsion/events.rb
@@ -547,9 +571,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
547
571
  version: '0'
548
572
  required_rubygems_version: !ruby/object:Gem::Requirement
549
573
  requirements:
550
- - - '>='
574
+ - - '>'
551
575
  - !ruby/object:Gem::Version
552
- version: '0'
576
+ version: 1.3.1
553
577
  requirements: []
554
578
  rubyforge_project:
555
579
  rubygems_version: 2.0.3
@@ -562,6 +586,7 @@ test_files:
562
586
  - features/cli_create.feature
563
587
  - features/cli_daemon.feature
564
588
  - features/cli_generate.feature
589
+ - features/cli_plugin.feature
565
590
  - features/cli_restart.feature
566
591
  - features/cli_start.feature
567
592
  - features/cli_stop.feature