ellen 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/ellen.rb +8 -6
- data/lib/ellen/adapters/base.rb +3 -18
- data/lib/ellen/adapters/shell.rb +21 -18
- data/lib/ellen/brains/base.rb +4 -2
- data/lib/ellen/brains/null.rb +2 -1
- data/lib/ellen/env.rb +0 -3
- data/lib/ellen/env/missing_required_key_error.rb +6 -0
- data/lib/ellen/env/validatable.rb +27 -0
- data/lib/ellen/handlers/help.rb +3 -6
- data/lib/ellen/robot.rb +4 -4
- data/lib/ellen/version.rb +1 -1
- data/spec/ellen/adapter_builder_spec.rb +1 -5
- data/spec/ellen/adapters/shell_spec.rb +56 -0
- data/spec/ellen/handlers/help_spec.rb +14 -0
- data/spec/ellen/handlers/ping_spec.rb +20 -0
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96e3c30b37c53dec2a1f1b781a9bbb8d21dbcb4b
|
4
|
+
data.tar.gz: ae06dedaad859870eb47f91bc121ce94bbf5e040
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6daf3ce130b28062a9f998b5a930f1699210f913d0786f93116dcd8594d48462a7cfd0ea754647232de3b0dda202439c19037229e0b45bffa35b8c9667511fe
|
7
|
+
data.tar.gz: cba65d6007a7d5fb66d970ce99914ecf93a9ebaea6254c8414a6e511ec2605dbdee15ea49c71083b0dcaa37e3e32909a7ecbbdbe445622de9a96de7a286f4adf
|
data/CHANGELOG.md
CHANGED
data/lib/ellen.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "active_support/concern"
|
1
2
|
require "active_support/core_ext/module/delegation"
|
2
3
|
require "active_support/core_ext/string/inflections"
|
3
4
|
require "bundler"
|
@@ -18,20 +19,22 @@ module Ellen
|
|
18
19
|
exit(1)
|
19
20
|
end
|
20
21
|
|
21
|
-
def adapters
|
22
|
-
{}
|
23
|
-
end
|
24
|
-
memoize :adapters
|
25
|
-
|
26
22
|
def handlers
|
27
23
|
[]
|
28
24
|
end
|
29
25
|
memoize :handlers
|
26
|
+
|
27
|
+
def actions
|
28
|
+
handlers.map(&:actions).flatten.sort_by(&:all?)
|
29
|
+
end
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
require "ellen/action"
|
34
34
|
require "ellen/adapter_builder"
|
35
|
+
require "ellen/env"
|
36
|
+
require "ellen/env/missing_required_key_error"
|
37
|
+
require "ellen/env/validatable"
|
35
38
|
require "ellen/adapters/base"
|
36
39
|
require "ellen/adapters/shell"
|
37
40
|
require "ellen/brains/base"
|
@@ -40,7 +43,6 @@ require "ellen/command_builder"
|
|
40
43
|
require "ellen/commands/base"
|
41
44
|
require "ellen/commands/generate"
|
42
45
|
require "ellen/commands/run"
|
43
|
-
require "ellen/env"
|
44
46
|
require "ellen/handlers/base"
|
45
47
|
require "ellen/handlers/help"
|
46
48
|
require "ellen/handlers/ping"
|
data/lib/ellen/adapters/base.rb
CHANGED
@@ -12,39 +12,24 @@
|
|
12
12
|
module Ellen
|
13
13
|
module Adapters
|
14
14
|
class Base
|
15
|
+
include Env::Validatable
|
16
|
+
|
15
17
|
class << self
|
16
18
|
def inherited(child_class)
|
17
19
|
Ellen::AdapterBuilder.adapter_classes << child_class
|
18
20
|
end
|
19
|
-
|
20
|
-
def env(key, description, options = {})
|
21
|
-
envs << Env.new(key, description, options)
|
22
|
-
end
|
23
|
-
|
24
|
-
def envs
|
25
|
-
@envs ||= []
|
26
|
-
end
|
27
|
-
|
28
|
-
def usage
|
29
|
-
envs.map(&:to_usage).join("\n")
|
30
|
-
end
|
31
21
|
end
|
32
22
|
|
33
23
|
attr_reader :robot
|
34
24
|
|
35
25
|
def initialize(robot)
|
36
26
|
@robot = robot
|
27
|
+
validate
|
37
28
|
end
|
38
29
|
|
39
30
|
def say(body, options = {})
|
40
31
|
Ellen.logger.info("Not implemented #{self.class}##{__method__} was called")
|
41
32
|
end
|
42
|
-
|
43
|
-
def validate
|
44
|
-
self.class.envs.each(&:validate)
|
45
|
-
rescue Env::MissingRequiredKeyError => exception
|
46
|
-
Ellen.die("#{exception}\n#{self.class.usage}")
|
47
|
-
end
|
48
33
|
end
|
49
34
|
end
|
50
35
|
end
|
data/lib/ellen/adapters/shell.rb
CHANGED
@@ -3,51 +3,54 @@ require "readline"
|
|
3
3
|
module Ellen
|
4
4
|
module Adapters
|
5
5
|
class Shell < Base
|
6
|
+
PROMPT = "> "
|
7
|
+
|
8
|
+
SOURCE = "shell"
|
9
|
+
|
10
|
+
USAGE = "Type `exit` or `quit` to end the session."
|
11
|
+
|
12
|
+
attr_accessor :stopped
|
13
|
+
|
6
14
|
def run
|
7
15
|
explain
|
8
16
|
listen
|
9
17
|
end
|
10
18
|
|
11
19
|
def say(body, options = {})
|
12
|
-
|
20
|
+
Ellen.logger.info(body)
|
13
21
|
end
|
14
22
|
|
15
23
|
private
|
16
24
|
|
17
25
|
def explain
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
def prompt
|
22
|
-
@prompt ||= "> "
|
23
|
-
end
|
24
|
-
|
25
|
-
def prompt=(str)
|
26
|
-
@prompt = str
|
26
|
+
Ellen.logger.info(USAGE)
|
27
27
|
end
|
28
28
|
|
29
29
|
def read
|
30
|
-
Readline.readline(
|
30
|
+
Readline.readline(PROMPT, true)
|
31
31
|
end
|
32
32
|
|
33
33
|
def listen
|
34
|
-
|
34
|
+
step until stopped?
|
35
35
|
rescue Interrupt
|
36
|
-
|
36
|
+
stop
|
37
37
|
end
|
38
38
|
|
39
39
|
def step
|
40
|
-
prompt
|
41
40
|
case body = read
|
42
41
|
when "exit", "quit"
|
43
|
-
|
42
|
+
stop
|
44
43
|
else
|
45
|
-
robot.receive(body: body, source:
|
44
|
+
robot.receive(body: body, source: SOURCE)
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
49
|
-
def
|
50
|
-
|
48
|
+
def stopped?
|
49
|
+
!!stopped
|
50
|
+
end
|
51
|
+
|
52
|
+
def stop
|
53
|
+
self.stopped = true
|
51
54
|
end
|
52
55
|
end
|
53
56
|
end
|
data/lib/ellen/brains/base.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Ellen
|
2
2
|
module Brains
|
3
3
|
class Base
|
4
|
+
include Env::Validatable
|
5
|
+
|
4
6
|
class << self
|
5
7
|
def inherited(child)
|
6
8
|
brain_classes << child
|
@@ -17,8 +19,8 @@ module Ellen
|
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
|
-
def
|
21
|
-
|
22
|
+
def initialize
|
23
|
+
validate
|
22
24
|
end
|
23
25
|
end
|
24
26
|
end
|
data/lib/ellen/brains/null.rb
CHANGED
data/lib/ellen/env.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ellen
|
2
|
+
class Env
|
3
|
+
module Validatable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def envs
|
8
|
+
@envs ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def env(key, description, options = {})
|
12
|
+
envs << Env.new(key, description, options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def usage
|
16
|
+
envs.map(&:to_usage).join("\n")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def validate
|
21
|
+
self.class.envs.each(&:validate)
|
22
|
+
rescue MissingRequiredKeyError => exception
|
23
|
+
Ellen.die("#{exception}\n#{self.class.usage}")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/ellen/handlers/help.rb
CHANGED
@@ -4,12 +4,9 @@ module Ellen
|
|
4
4
|
on /help\z/i, name: "help", description: "Show this help message"
|
5
5
|
|
6
6
|
def help(message)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
line
|
11
|
-
end
|
12
|
-
robot.say lines.join("\n")
|
7
|
+
robot.say Ellen.actions.map {|action|
|
8
|
+
"%-30s - #{action.description}" % "#{robot.name unless action.all?} #{action.pattern.inspect}"
|
9
|
+
}.join("\n")
|
13
10
|
end
|
14
11
|
end
|
15
12
|
end
|
data/lib/ellen/robot.rb
CHANGED
@@ -8,7 +8,7 @@ module Ellen
|
|
8
8
|
|
9
9
|
attr_reader :options
|
10
10
|
|
11
|
-
def initialize(options)
|
11
|
+
def initialize(options = {})
|
12
12
|
@options = options
|
13
13
|
end
|
14
14
|
|
@@ -16,7 +16,7 @@ module Ellen
|
|
16
16
|
dotenv
|
17
17
|
bundle
|
18
18
|
setup
|
19
|
-
|
19
|
+
remember
|
20
20
|
adapt
|
21
21
|
end
|
22
22
|
|
@@ -64,8 +64,8 @@ module Ellen
|
|
64
64
|
end
|
65
65
|
memoize :handlers
|
66
66
|
|
67
|
-
def
|
68
|
-
|
67
|
+
def remember
|
68
|
+
brain
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
data/lib/ellen/version.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Ellen::Adapters::Shell do
|
4
|
+
before do
|
5
|
+
Ellen.logger.stub(:info)
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:adapter) do
|
9
|
+
described_class.new(robot)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:robot) do
|
13
|
+
Ellen::Robot.new
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#run" do
|
17
|
+
context "with `exit`" do
|
18
|
+
it "stops" do
|
19
|
+
Readline.stub(readline: "exit")
|
20
|
+
adapter.should_receive(:stop).and_call_original
|
21
|
+
adapter.run
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "with `quit`" do
|
26
|
+
it "stops" do
|
27
|
+
Readline.stub(readline: "exit")
|
28
|
+
adapter.should_receive(:stop).and_call_original
|
29
|
+
adapter.run
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "with Inturrupt from console" do
|
34
|
+
it "stops" do
|
35
|
+
Readline.stub(:readline).and_raise(Interrupt)
|
36
|
+
adapter.should_receive(:stop).and_call_original
|
37
|
+
adapter.run
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "without `exit` nor `quit`" do
|
42
|
+
it "passes given message to robot" do
|
43
|
+
Readline.stub(:readline).and_return("a", "exit")
|
44
|
+
robot.should_receive(:receive).with(body: "a", source: described_class::SOURCE)
|
45
|
+
adapter.run
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#say" do
|
51
|
+
it "shows given message body on stdout" do
|
52
|
+
Ellen.logger.should_receive(:info).with("a")
|
53
|
+
adapter.say("a")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Ellen::Handlers::Help do
|
4
|
+
let(:robot) do
|
5
|
+
Ellen::Robot.new
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#help" do
|
9
|
+
it "responds to `@ellen help` and says each handler's usage" do
|
10
|
+
robot.should_receive(:say).with(%r<ellen /help\\z/i +- Show this help message>)
|
11
|
+
robot.receive(body: "@ellen help")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Ellen::Handlers::Ping do
|
4
|
+
let(:robot) do
|
5
|
+
Ellen::Robot.new
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#ping" do
|
9
|
+
{
|
10
|
+
"@ellen ping" => "pong",
|
11
|
+
"@ellen Ping" => "Pong",
|
12
|
+
"@ellen PING" => "PONG",
|
13
|
+
}.each do |input, output|
|
14
|
+
it "responds to `#{input}` and says `#{output}`" do
|
15
|
+
robot.should_receive(:say).with(output)
|
16
|
+
robot.receive(body: input)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ellen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -180,6 +180,8 @@ files:
|
|
180
180
|
- lib/ellen/commands/generate.rb
|
181
181
|
- lib/ellen/commands/run.rb
|
182
182
|
- lib/ellen/env.rb
|
183
|
+
- lib/ellen/env/missing_required_key_error.rb
|
184
|
+
- lib/ellen/env/validatable.rb
|
183
185
|
- lib/ellen/handlers/base.rb
|
184
186
|
- lib/ellen/handlers/help.rb
|
185
187
|
- lib/ellen/handlers/ping.rb
|
@@ -188,8 +190,11 @@ files:
|
|
188
190
|
- lib/ellen/robot.rb
|
189
191
|
- lib/ellen/version.rb
|
190
192
|
- spec/ellen/adapter_builder_spec.rb
|
193
|
+
- spec/ellen/adapters/shell_spec.rb
|
191
194
|
- spec/ellen/commands/generate_spec.rb
|
192
195
|
- spec/ellen/commands/run_spec.rb
|
196
|
+
- spec/ellen/handlers/help_spec.rb
|
197
|
+
- spec/ellen/handlers/ping_spec.rb
|
193
198
|
- spec/ellen/robot_spec.rb
|
194
199
|
- spec/spec_helper.rb
|
195
200
|
- templates/Gemfile
|
@@ -219,7 +224,11 @@ specification_version: 4
|
|
219
224
|
summary: A chatterbot framework, inspired by Hubot
|
220
225
|
test_files:
|
221
226
|
- spec/ellen/adapter_builder_spec.rb
|
227
|
+
- spec/ellen/adapters/shell_spec.rb
|
222
228
|
- spec/ellen/commands/generate_spec.rb
|
223
229
|
- spec/ellen/commands/run_spec.rb
|
230
|
+
- spec/ellen/handlers/help_spec.rb
|
231
|
+
- spec/ellen/handlers/ping_spec.rb
|
224
232
|
- spec/ellen/robot_spec.rb
|
225
233
|
- spec/spec_helper.rb
|
234
|
+
has_rdoc:
|