james 0.0.12-universal-darwin-10 → 0.1.0-universal-darwin-10
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/aux/james/cli.rb +11 -12
- data/bin/james +4 -2
- data/lib/james.rb +19 -6
- data/lib/james/builtin/{core_dialogue.rb → core_dialog.rb} +7 -7
- data/lib/james/controller.rb +17 -17
- data/lib/james/dialog_api.rb +34 -0
- data/lib/james/{dialogue_internals.rb → dialog_internals.rb} +2 -3
- data/lib/james/dialogs.rb +43 -0
- data/lib/james/framework.rb +1 -0
- data/lib/james/inputs/base.rb +1 -1
- data/lib/james/state_api.rb +2 -8
- data/lib/james/visitor.rb +1 -1
- data/lib/james/visitors.rb +7 -3
- data/spec/aux/james/cli_spec.rb +3 -3
- data/spec/integration/test_dialogue_spec.rb +10 -10
- data/spec/lib/james/controller_spec.rb +24 -7
- data/spec/lib/james/{dialogue_spec.rb → dialog_spec.rb} +18 -17
- metadata +12 -11
- data/lib/james/dialogue_api.rb +0 -34
- data/lib/james/dialogues.rb +0 -58
data/aux/james/cli.rb
CHANGED
@@ -4,24 +4,23 @@ module James
|
|
4
4
|
|
5
5
|
class CLI
|
6
6
|
|
7
|
-
def execute *
|
8
|
-
|
9
|
-
dialogues.select! { |dialogue| given_dialogues.any? { |given| dialogue =~ %r{#{given}_dialog(ue)?.rb$} } } unless given_dialogues.empty?
|
7
|
+
def execute *patterns
|
8
|
+
dialogs = find_dialogs_for patterns
|
10
9
|
|
11
|
-
puts "James: I haven't found anything to talk about (No
|
10
|
+
puts "James: I haven't found anything to talk about (No files found). Exiting." or exit!(1) if dialogs.empty?
|
11
|
+
puts "James: Using dialogs in #{dialogs.join(', ')} for our conversation, Sir."
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
require_all dialogues
|
13
|
+
load_all dialogs
|
16
14
|
|
17
15
|
James.listen
|
18
16
|
end
|
19
|
-
def
|
20
|
-
|
17
|
+
def find_dialogs_for patterns
|
18
|
+
patterns = ["**/*_dialog{,ue}.rb"] if patterns.empty?
|
19
|
+
Dir[*patterns]
|
21
20
|
end
|
22
|
-
def
|
23
|
-
|
24
|
-
|
21
|
+
def load_all dialogs
|
22
|
+
dialogs.each do |dialog|
|
23
|
+
load File.expand_path dialog, Dir.pwd
|
25
24
|
end
|
26
25
|
end
|
27
26
|
|
data/bin/james
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
3
|
|
4
|
-
# james
|
4
|
+
# james joke_dialog.rb phonebook_dialog.rb quote_dialog.rb # Uses just the described ones.
|
5
5
|
# OR
|
6
|
-
# james # Uses all
|
6
|
+
# james j*.rb # Uses all the dialogs matching the pattern.
|
7
|
+
# OR
|
8
|
+
# james # Uses all dialogs it can find in this dir and subdirs.
|
7
9
|
#
|
8
10
|
|
9
11
|
begin
|
data/lib/james.rb
CHANGED
@@ -8,10 +8,10 @@ require File.expand_path '../james/state_internals', __FILE__
|
|
8
8
|
require File.expand_path '../james/visitor', __FILE__
|
9
9
|
require File.expand_path '../james/visitors', __FILE__
|
10
10
|
|
11
|
-
require File.expand_path '../james/
|
12
|
-
require File.expand_path '../james/
|
11
|
+
require File.expand_path '../james/dialog_api', __FILE__
|
12
|
+
require File.expand_path '../james/dialog_internals', __FILE__
|
13
13
|
|
14
|
-
require File.expand_path '../james/
|
14
|
+
require File.expand_path '../james/dialogs', __FILE__
|
15
15
|
|
16
16
|
require File.expand_path '../james/inputs/base', __FILE__
|
17
17
|
require File.expand_path '../james/inputs/audio', __FILE__
|
@@ -20,20 +20,33 @@ require File.expand_path '../james/inputs/terminal', __FILE__
|
|
20
20
|
require File.expand_path '../james/outputs/audio', __FILE__
|
21
21
|
require File.expand_path '../james/outputs/terminal', __FILE__
|
22
22
|
|
23
|
-
require File.expand_path '../james/builtin/
|
23
|
+
require File.expand_path '../james/builtin/core_dialog', __FILE__
|
24
24
|
|
25
|
+
require File.expand_path '../james/framework', __FILE__
|
25
26
|
require File.expand_path '../james/controller', __FILE__
|
26
27
|
|
27
28
|
module James
|
28
29
|
|
30
|
+
# Use the given dialogs.
|
31
|
+
#
|
32
|
+
# If called twice or more, will just add more dialogs.
|
33
|
+
#
|
34
|
+
def self.use *dialogs
|
35
|
+
dialogs.each { |dialog| controller.add_dialog dialog }
|
36
|
+
end
|
37
|
+
|
29
38
|
# Start a new controller and listen.
|
30
39
|
#
|
31
40
|
# Will not listen again if already listening.
|
32
41
|
#
|
33
42
|
def self.listen
|
34
|
-
|
43
|
+
controller.listen unless controller.listening?
|
44
|
+
end
|
45
|
+
|
46
|
+
# Controller instance.
|
47
|
+
#
|
48
|
+
def self.controller
|
35
49
|
@controller ||= Controller.new
|
36
|
-
@controller.listen
|
37
50
|
end
|
38
51
|
|
39
52
|
end
|
@@ -1,20 +1,20 @@
|
|
1
|
-
# This is the core
|
1
|
+
# This is the core dialog every dialog will be hooking into.
|
2
2
|
#
|
3
3
|
# Eventually, the design should be such that everyone can use
|
4
|
-
# the design and core
|
4
|
+
# the design and core dialog they like best.
|
5
5
|
#
|
6
6
|
# But to get going, this suffices for now.
|
7
7
|
#
|
8
|
-
class
|
8
|
+
class CoreDialog
|
9
9
|
|
10
|
-
include James::
|
10
|
+
include James::Dialog
|
11
11
|
|
12
12
|
# The alert state.
|
13
13
|
# When James is in this state, he should be
|
14
|
-
# open for user
|
14
|
+
# open for user dialogs.
|
15
15
|
#
|
16
16
|
state :awake do
|
17
|
-
# If James is awake, he offers more
|
17
|
+
# If James is awake, he offers more dialogs
|
18
18
|
# on this state, if there are any hooked into this state.
|
19
19
|
#
|
20
20
|
chainable
|
@@ -26,7 +26,7 @@ class CoreDialogue
|
|
26
26
|
end
|
27
27
|
|
28
28
|
# The away state. James does not listen to any
|
29
|
-
# user
|
29
|
+
# user dialog hooks, but only for his name
|
30
30
|
# or the good night, i.e. exit phrase.
|
31
31
|
#
|
32
32
|
state :away do
|
data/lib/james/controller.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
framework 'AppKit'
|
2
|
-
|
3
1
|
module James
|
4
2
|
|
5
3
|
class Controller
|
6
4
|
|
7
5
|
attr_reader :visitor
|
8
6
|
|
9
|
-
# This puts together the core
|
7
|
+
# This puts together the core dialog and the user
|
10
8
|
# ones that are hooked into it.
|
11
9
|
#
|
10
|
+
# TODO Rewrite this. Design needs some refactoring.
|
11
|
+
#
|
12
12
|
def initialize
|
13
|
-
|
14
|
-
system_visitor = Visitor.new
|
15
|
-
@visitor = Visitors.new system_visitor,
|
13
|
+
@user_dialogs = Dialogs.new
|
14
|
+
system_visitor = Visitor.new CoreDialog.new.state_for(:awake)
|
15
|
+
@visitor = Visitors.new system_visitor, @user_dialogs.visitor
|
16
16
|
end
|
17
17
|
|
18
18
|
def applicationDidFinishLaunching notification
|
@@ -30,14 +30,12 @@ module James
|
|
30
30
|
# TODO
|
31
31
|
end
|
32
32
|
|
33
|
-
#
|
34
|
-
# dialogues.
|
33
|
+
# Add a dialog to the current system.
|
35
34
|
#
|
36
|
-
def
|
37
|
-
|
38
|
-
dialogues.resolve
|
39
|
-
dialogues
|
35
|
+
def add_dialog dialog
|
36
|
+
@user_dialogs << dialog
|
40
37
|
end
|
38
|
+
|
41
39
|
# Start recognizing words.
|
42
40
|
#
|
43
41
|
def start_input
|
@@ -50,18 +48,18 @@ module James
|
|
50
48
|
@output = Outputs::Audio.new
|
51
49
|
end
|
52
50
|
|
53
|
-
# Callback method from
|
51
|
+
# Callback method from dialog.
|
54
52
|
#
|
55
53
|
def say text
|
56
54
|
@output.say text
|
57
55
|
end
|
58
56
|
def hear text
|
59
|
-
|
57
|
+
visitor.hear text do |response|
|
60
58
|
say response
|
61
59
|
end
|
62
60
|
end
|
63
61
|
def expects
|
64
|
-
|
62
|
+
visitor.expects
|
65
63
|
end
|
66
64
|
|
67
65
|
def listen
|
@@ -87,12 +85,14 @@ module James
|
|
87
85
|
# window.display
|
88
86
|
# window.orderFrontRegardless
|
89
87
|
|
88
|
+
@listening = true
|
89
|
+
|
90
90
|
app.run
|
91
91
|
end
|
92
|
-
#
|
92
|
+
# If listen has been called, it is listening.
|
93
93
|
#
|
94
94
|
def listening?
|
95
|
-
|
95
|
+
!!@listening
|
96
96
|
end
|
97
97
|
|
98
98
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module James
|
2
|
+
|
3
|
+
# A dialog can be instantiated in two ways:
|
4
|
+
#
|
5
|
+
# The simple way, will directly add itself to James.
|
6
|
+
#
|
7
|
+
# James.use_dialog(optional_args_for_initialize) do
|
8
|
+
# # Your dialog.
|
9
|
+
# #
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# class MyDialog
|
13
|
+
# include James::Dialog
|
14
|
+
#
|
15
|
+
# # Your dialog.
|
16
|
+
# #
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# James.use MyDialog.new
|
20
|
+
#
|
21
|
+
module Dialog; end
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
def use_dialog *args, &block
|
26
|
+
dialog = Class.new { include James::Dialog }
|
27
|
+
dialog.class_eval &block
|
28
|
+
use dialog.new(*args)
|
29
|
+
dialog
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -1,13 +1,12 @@
|
|
1
1
|
module James
|
2
2
|
|
3
|
-
# A
|
3
|
+
# A dialog is just a container object
|
4
4
|
# for defining states and executing methods.
|
5
5
|
#
|
6
|
-
module
|
6
|
+
module Dialog
|
7
7
|
|
8
8
|
def self.included into
|
9
9
|
into.extend ClassMethods
|
10
|
-
Dialogues << into unless into == CoreDialogue # TODO Dirty as hell.
|
11
10
|
end
|
12
11
|
|
13
12
|
#
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module James
|
2
|
+
|
3
|
+
# Registers dialogs and connects their states.
|
4
|
+
#
|
5
|
+
class Dialogs
|
6
|
+
|
7
|
+
attr_reader :initial
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@initial = State.new :__initial_plugin_state__, nil
|
11
|
+
end
|
12
|
+
|
13
|
+
# Generate the graph for the dialogs.
|
14
|
+
#
|
15
|
+
# Hooks up the entry phrases of the dialog
|
16
|
+
# into the main dialog.
|
17
|
+
#
|
18
|
+
# It raises if the hook phrase of a dialog
|
19
|
+
# is already used.
|
20
|
+
#
|
21
|
+
def << dialog
|
22
|
+
resolved_entries = {}
|
23
|
+
|
24
|
+
dialog.entries.each do |(phrases, state)|
|
25
|
+
resolved_entries[phrases] = state.respond_to?(:phrases) ? state : dialog.state_for(state)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Hook the dialog into the initial state.
|
29
|
+
#
|
30
|
+
initial.hear resolved_entries
|
31
|
+
end
|
32
|
+
|
33
|
+
# Get the visitor.
|
34
|
+
#
|
35
|
+
# Initialized on the initial state.
|
36
|
+
#
|
37
|
+
def visitor
|
38
|
+
@visitor ||= Visitor.new initial
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
framework 'AppKit'
|
data/lib/james/inputs/base.rb
CHANGED
data/lib/james/state_api.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module James
|
2
2
|
|
3
|
-
# A state is defined in a
|
3
|
+
# A state is defined in a dialog.
|
4
4
|
#
|
5
5
|
# It has a name with which it can be targeted.
|
6
6
|
#
|
@@ -58,16 +58,10 @@ module James
|
|
58
58
|
@exit_block = block
|
59
59
|
end
|
60
60
|
|
61
|
-
#
|
62
|
-
#
|
63
|
-
def transition &block
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
61
|
# By default, a state is not chainable.
|
68
62
|
#
|
69
63
|
def chainable?
|
70
|
-
|
64
|
+
!!@chainable
|
71
65
|
end
|
72
66
|
def chainable
|
73
67
|
@chainable = true
|
data/lib/james/visitor.rb
CHANGED
data/lib/james/visitors.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module James
|
2
2
|
|
3
3
|
# The visitors class has a number of visitors, whose
|
4
|
-
#
|
4
|
+
# dialogs are visited in order of preference.
|
5
5
|
#
|
6
6
|
# Why?
|
7
7
|
# Discussions have multiple points where they can be.
|
@@ -22,6 +22,10 @@ module James
|
|
22
22
|
@visitors = visitors
|
23
23
|
end
|
24
24
|
|
25
|
+
def add_dialog dialog
|
26
|
+
|
27
|
+
end
|
28
|
+
|
25
29
|
# Hear tries all visitors in order
|
26
30
|
# until one hears a phrase he knows.
|
27
31
|
#
|
@@ -39,13 +43,13 @@ module James
|
|
39
43
|
end
|
40
44
|
end
|
41
45
|
|
42
|
-
# Enter enters the first
|
46
|
+
# Enter enters the first dialog.
|
43
47
|
#
|
44
48
|
def enter
|
45
49
|
visitors.first.enter
|
46
50
|
end
|
47
51
|
|
48
|
-
# Simply returns the sum of what phrases all
|
52
|
+
# Simply returns the sum of what phrases all dialogs expect.
|
49
53
|
#
|
50
54
|
# Stops as soon as a visitor is not in a chainable state anymore.
|
51
55
|
#
|
data/spec/aux/james/cli_spec.rb
CHANGED
@@ -5,14 +5,14 @@ require File.expand_path '../../../../aux/james/cli', __FILE__
|
|
5
5
|
describe James::CLI do
|
6
6
|
|
7
7
|
before(:each) do
|
8
|
-
Dir.stub! :[] => ['
|
8
|
+
Dir.stub! :[] => ['test_dialog.rb', 'test_dialog.rb', 'test/test_dialog.rb']
|
9
9
|
end
|
10
10
|
|
11
11
|
let(:cli) { James::CLI.new }
|
12
12
|
|
13
|
-
describe '
|
13
|
+
describe 'find_dialogs' do
|
14
14
|
it 'returns the right ones' do
|
15
|
-
cli.
|
15
|
+
cli.find_dialogs.should == ['test_dialog.rb', 'test_dialog.rb', 'test/test_dialog.rb']
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -2,10 +2,10 @@
|
|
2
2
|
#
|
3
3
|
require File.expand_path '../../../lib/james', __FILE__
|
4
4
|
|
5
|
-
describe '
|
5
|
+
describe 'TestDialog' do
|
6
6
|
|
7
7
|
context 'unit' do
|
8
|
-
let(:
|
8
|
+
let(:dialog) do
|
9
9
|
|
10
10
|
Class.new do
|
11
11
|
include James::Dialog
|
@@ -23,7 +23,7 @@ describe 'TestDialogue' do
|
|
23
23
|
|
24
24
|
end
|
25
25
|
let(:visitor) do
|
26
|
-
James::Visitor.new
|
26
|
+
James::Visitor.new dialog.state_for(:first)
|
27
27
|
end
|
28
28
|
|
29
29
|
describe "integration" do
|
@@ -40,8 +40,8 @@ describe 'TestDialogue' do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
# context 'integration' do
|
43
|
-
# let(:
|
44
|
-
#
|
43
|
+
# let(:dialog) do
|
44
|
+
# dialog = Class.new do
|
45
45
|
# include James::Dialog
|
46
46
|
#
|
47
47
|
# hear ['test1', 'test2'] => :first
|
@@ -54,13 +54,13 @@ describe 'TestDialogue' do
|
|
54
54
|
# end.new
|
55
55
|
# end
|
56
56
|
# it 'works correctly' do
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
57
|
+
# dialog.state.name.should == :awake
|
58
|
+
# dialog.hear 'sleep'
|
59
|
+
# dialog.state.name.should == :sleeping
|
60
60
|
# end
|
61
61
|
# it 'delegates correctly' do
|
62
|
-
#
|
63
|
-
#
|
62
|
+
# dialog.state.name.should == :awake
|
63
|
+
# dialog.hear 'test1'
|
64
64
|
# end
|
65
65
|
# end
|
66
66
|
|
@@ -1,15 +1,32 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
#
|
3
|
+
require File.expand_path '../../../../lib/james/dialog_api', __FILE__
|
4
|
+
require File.expand_path '../../../../lib/james/dialog_internals', __FILE__
|
5
|
+
require File.expand_path '../../../../lib/james/builtin/core_dialog', __FILE__
|
6
|
+
require File.expand_path '../../../../lib/james/visitors', __FILE__
|
7
|
+
require File.expand_path '../../../../lib/james/visitor', __FILE__
|
8
|
+
require File.expand_path '../../../../lib/james/state_api', __FILE__
|
9
|
+
require File.expand_path '../../../../lib/james/dialogs', __FILE__
|
3
10
|
require File.expand_path '../../../../lib/james/controller', __FILE__
|
4
11
|
|
5
12
|
describe James::Controller do
|
6
13
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
+
let(:controller) { described_class.new }
|
15
|
+
|
16
|
+
describe 'listening?' do
|
17
|
+
it 'is correct' do
|
18
|
+
controller.listening?.should == false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
describe 'expects' do
|
22
|
+
it 'delegates' do
|
23
|
+
visitor = stub! :visitor
|
24
|
+
controller.stub! :visitor => visitor
|
25
|
+
|
26
|
+
visitor.should_receive(:expects).once.with()
|
27
|
+
|
28
|
+
controller.expects
|
29
|
+
end
|
30
|
+
end
|
14
31
|
|
15
32
|
end
|
@@ -1,20 +1,21 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
#
|
3
|
+
require File.expand_path '../../../../lib/james', __FILE__
|
3
4
|
require File.expand_path '../../../../lib/james/state_api', __FILE__
|
4
|
-
require File.expand_path '../../../../lib/james/
|
5
|
-
require File.expand_path '../../../../lib/james/
|
6
|
-
require File.expand_path '../../../../lib/james/builtin/
|
7
|
-
require File.expand_path '../../../../lib/james/
|
5
|
+
require File.expand_path '../../../../lib/james/dialog_api', __FILE__
|
6
|
+
require File.expand_path '../../../../lib/james/dialog_internals', __FILE__
|
7
|
+
require File.expand_path '../../../../lib/james/builtin/core_dialog', __FILE__
|
8
|
+
require File.expand_path '../../../../lib/james/dialogs', __FILE__
|
8
9
|
|
9
|
-
describe James::
|
10
|
+
describe James::Dialog do
|
10
11
|
|
11
12
|
it 'can haz merkin spellink' do
|
12
|
-
James::
|
13
|
+
James::Dialog.should == James::Dialog
|
13
14
|
end
|
14
15
|
|
15
16
|
context 'units' do
|
16
|
-
let(:
|
17
|
-
James.
|
17
|
+
let(:dialog) do
|
18
|
+
James.use_dialog do
|
18
19
|
|
19
20
|
hear 'something' => :first
|
20
21
|
|
@@ -34,21 +35,21 @@ describe James::Dialogue do
|
|
34
35
|
end
|
35
36
|
describe 'state_for' do
|
36
37
|
it 'delegates to the class, adding itself' do
|
37
|
-
|
38
|
-
|
38
|
+
new_dialog = dialog.new
|
39
|
+
dialog.should_receive(:state_for).once.with :some_name, new_dialog
|
39
40
|
|
40
|
-
|
41
|
+
new_dialog.state_for :some_name
|
41
42
|
end
|
42
43
|
it 'returns nil on not found' do
|
43
|
-
|
44
|
+
dialog.new.state_for(:nonexistent).should == nil
|
44
45
|
end
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
48
49
|
describe 'hear with lambda' do
|
49
|
-
let(:
|
50
|
+
let(:dialog) do
|
50
51
|
class Test
|
51
|
-
include James::
|
52
|
+
include James::Dialog
|
52
53
|
|
53
54
|
def initialize
|
54
55
|
@bla = 'some bla'
|
@@ -61,7 +62,7 @@ describe James::Dialogue do
|
|
61
62
|
Test.new
|
62
63
|
end
|
63
64
|
it "is instance eval'd" do
|
64
|
-
test_state =
|
65
|
+
test_state = dialog.state_for :test
|
65
66
|
test_state.hear 'bla' do |result|
|
66
67
|
result.should == 'some bla'
|
67
68
|
end
|
@@ -72,7 +73,7 @@ describe James::Dialogue do
|
|
72
73
|
it 'can be included' do
|
73
74
|
expect do
|
74
75
|
class Test
|
75
|
-
include James::
|
76
|
+
include James::Dialog
|
76
77
|
|
77
78
|
hear 'something' => :some_state
|
78
79
|
end
|
@@ -81,7 +82,7 @@ describe James::Dialogue do
|
|
81
82
|
|
82
83
|
it 'can be defined' do
|
83
84
|
expect do
|
84
|
-
James.
|
85
|
+
James.dialog do
|
85
86
|
|
86
87
|
hear 'something' => :some_state
|
87
88
|
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: james
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0
|
5
|
+
version: 0.1.0
|
6
6
|
platform: universal-darwin-10
|
7
7
|
authors:
|
8
8
|
- Florian Hanke
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-05-
|
12
|
+
date: 2011-05-21 00:00:00 +10:00
|
13
13
|
default_executable: james
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -28,19 +28,20 @@ dependencies:
|
|
28
28
|
- - '>='
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: "0"
|
31
|
-
description: Modular Electronic Butler. Using a simple
|
32
|
-
easily add more
|
31
|
+
description: Modular Electronic Butler. Using a simple dialog system where you can
|
32
|
+
easily add more dialogs.
|
33
33
|
email: florian.hanke+james@gmail.com
|
34
34
|
executables:
|
35
35
|
- james
|
36
36
|
extensions: []
|
37
37
|
extra_rdoc_files: []
|
38
38
|
files:
|
39
|
-
- lib/james/builtin/
|
39
|
+
- lib/james/builtin/core_dialog.rb
|
40
40
|
- lib/james/controller.rb
|
41
|
-
- lib/james/
|
42
|
-
- lib/james/
|
43
|
-
- lib/james/
|
41
|
+
- lib/james/dialog_api.rb
|
42
|
+
- lib/james/dialog_internals.rb
|
43
|
+
- lib/james/dialogs.rb
|
44
|
+
- lib/james/framework.rb
|
44
45
|
- lib/james/inputs/audio.rb
|
45
46
|
- lib/james/inputs/base.rb
|
46
47
|
- lib/james/inputs/terminal.rb
|
@@ -56,7 +57,7 @@ files:
|
|
56
57
|
- spec/aux/james/cli_spec.rb
|
57
58
|
- spec/integration/test_dialogue_spec.rb
|
58
59
|
- spec/lib/james/controller_spec.rb
|
59
|
-
- spec/lib/james/
|
60
|
+
- spec/lib/james/dialog_spec.rb
|
60
61
|
- spec/lib/james/state_spec.rb
|
61
62
|
- spec/lib/james/visitor_spec.rb
|
62
63
|
- spec/lib/james/visitors_spec.rb
|
@@ -85,12 +86,12 @@ rubyforge_project:
|
|
85
86
|
rubygems_version: 1.4.2
|
86
87
|
signing_key:
|
87
88
|
specification_version: 3
|
88
|
-
summary: 'James: Modular Electronic Butler with modular
|
89
|
+
summary: 'James: Modular Electronic Butler with modular Dialogs.'
|
89
90
|
test_files:
|
90
91
|
- spec/aux/james/cli_spec.rb
|
91
92
|
- spec/integration/test_dialogue_spec.rb
|
92
93
|
- spec/lib/james/controller_spec.rb
|
93
|
-
- spec/lib/james/
|
94
|
+
- spec/lib/james/dialog_spec.rb
|
94
95
|
- spec/lib/james/state_spec.rb
|
95
96
|
- spec/lib/james/visitor_spec.rb
|
96
97
|
- spec/lib/james/visitors_spec.rb
|
data/lib/james/dialogue_api.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
module James
|
2
|
-
|
3
|
-
# A dialog(ue) can be instantiated in two ways:
|
4
|
-
#
|
5
|
-
# James.dialogue do
|
6
|
-
# # Your dialogue.
|
7
|
-
# #
|
8
|
-
# end
|
9
|
-
#
|
10
|
-
# class MyDialogue
|
11
|
-
# include James::Dialogue
|
12
|
-
#
|
13
|
-
# # Your dialogue.
|
14
|
-
# #
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
module Dialogue; end
|
18
|
-
|
19
|
-
# We don't care about the spelling.
|
20
|
-
#
|
21
|
-
Dialog = Dialogue
|
22
|
-
|
23
|
-
class << self
|
24
|
-
|
25
|
-
def dialogue &block
|
26
|
-
dialogue = Class.new { include James::Dialogue }
|
27
|
-
dialogue.class_eval &block
|
28
|
-
dialogue
|
29
|
-
end
|
30
|
-
alias dialog dialogue
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
data/lib/james/dialogues.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
module James
|
2
|
-
|
3
|
-
# Registers all dialogues and connects their states.
|
4
|
-
#
|
5
|
-
class Dialogues
|
6
|
-
|
7
|
-
attr_reader :initial, :dialogues
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@initial = State.new :__initial_plugin_state__, nil
|
11
|
-
@dialogues = self.class.dialogues.map &:new
|
12
|
-
end
|
13
|
-
|
14
|
-
class << self
|
15
|
-
|
16
|
-
attr_reader :dialogues
|
17
|
-
|
18
|
-
def << dialogue
|
19
|
-
@dialogues ||= []
|
20
|
-
@dialogues << dialogue
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
# Generate the graph for the dialogues.
|
26
|
-
#
|
27
|
-
# Hooks up the entry phrases of all dialogues
|
28
|
-
# into the main dialogue.
|
29
|
-
#
|
30
|
-
# It raises if the hook phrase of a dialogue
|
31
|
-
# is already used.
|
32
|
-
#
|
33
|
-
def resolve
|
34
|
-
# Hook dialogues into initial state.
|
35
|
-
#
|
36
|
-
resolved_entries = {}
|
37
|
-
dialogues.each do |dialogue|
|
38
|
-
dialogue.entries.each do |(phrases, state)|
|
39
|
-
resolved_entries[phrases] = state.respond_to?(:phrases) ? state : dialogue.state_for(state)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# Hook all user dialogues into the initial state.
|
44
|
-
#
|
45
|
-
initial.hear resolved_entries
|
46
|
-
end
|
47
|
-
|
48
|
-
# Get the visitor.
|
49
|
-
#
|
50
|
-
# Initialized on the initial state.
|
51
|
-
#
|
52
|
-
def visitor
|
53
|
-
@visitor ||= Visitor.new initial
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|