orator 0.0.1 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +113 -27
- data/lib/generators/orator/config_generator.rb +14 -0
- data/lib/generators/orator/handler_generator.rb +15 -0
- data/lib/generators/templates/config.yml +7 -0
- data/lib/generators/templates/handlers/example_handler.rb +31 -0
- data/lib/generators/templates/template_handler.rb +6 -0
- data/lib/orator/cli.rb +9 -18
- data/lib/orator/handlers/base.rb +46 -21
- data/lib/orator/middle_ground.rb +13 -0
- data/lib/orator/version.rb +1 -1
- data/lib/orator.rb +5 -0
- data/lib/tasks/orator.rake +3 -0
- data/spec/base_handler_spec.rb +33 -3
- data/spec/spec_helper.rb +2 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
M2JlMGJkOWU0OGIzMWEwM2ZmNmRjMTZkZDFhZTlmMGI5ZDUzZjlhZg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MTI4Yzg5NmZlOTJhNTc4ZmM1MzI4ZTlmNzYxMTVjYWUzOWVhMDIyNQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OWYxOGY0ZDVmNWEzY2JmNTkxZjdkMjlmMTc5OTI4NTgxNDdhMzFlYjQxYWVl
|
10
|
+
N2IwOTE4YzlkZjU4ZjQzYmEwNzI0NTIwZmFlYTlhOWUxNWQ4MWFhM2VjNGJk
|
11
|
+
YmU5NDg1ZTYxNWFlMzNhYzhjMjM2ODRhYTNjNjRjZTRjNzQyNDU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OTQ3YzgzOTc5YmY5YmY5OTk1MzcyMWM3YzNjNGU1YzI5ZmEzZmI4OTg2NzU4
|
14
|
+
ZjNjOTQ4MjkyZTJmNDc3ZGE5MDQ0NjFjN2Q3MmM2OGJiZDUxOGZjZTM4YWJh
|
15
|
+
YzFkYWU2OTU3YmFiOWU1MmNlZjBlMzM3MDg5NmE1Nzc4YzEyNWQ=
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ well as [em-websocket](https://github.com/igrigorik/em-websocket).
|
|
9
9
|
## Ruby on Rails Integration
|
10
10
|
Orator integrates easily with Ruby on Rails. Just add
|
11
11
|
|
12
|
-
gem 'orator'
|
12
|
+
gem 'orator'
|
13
13
|
|
14
14
|
to your Gemfile and `bundle install` away. In order to use it, you'll need to
|
15
15
|
add the following line to your `application.js` file:
|
@@ -19,51 +19,142 @@ add the following line to your `application.js` file:
|
|
19
19
|
Now you can use the orator client in your JavaScript! If the browser doesn't
|
20
20
|
support JavaScript, it'll fall back to a flash object.
|
21
21
|
|
22
|
+
## Server Handlers
|
23
|
+
We'll start with the server-side stuff. A simple `rails g orator:config` will
|
24
|
+
place the file `orator_config.yml` in `config/`, and an example handler in
|
25
|
+
`app/handlers`. Feel free to modify the configuration file (I'll add
|
26
|
+
documentation to it). Let's set up a handler here:
|
27
|
+
|
28
|
+
```Ruby
|
29
|
+
class TestHandler < Orator::Handlers::Base
|
30
|
+
```
|
31
|
+
|
32
|
+
This is important. Orator will not accept the Handler unless it is a child
|
33
|
+
of `Orator::Handlers::Base`. `Orator::Handlers::Base` implements methods that
|
34
|
+
are used by Orator.
|
35
|
+
|
36
|
+
```Ruby
|
37
|
+
before do
|
38
|
+
self.number_of_messages ||= 0
|
39
|
+
self.number_of_messages += 1
|
40
|
+
|
41
|
+
if self.number_of_messages > 9_000
|
42
|
+
prevent_event
|
43
|
+
end
|
44
|
+
end
|
45
|
+
```
|
46
|
+
|
47
|
+
Here we have a basic before block that increments a number every time we get
|
48
|
+
a message. If the number of messages is over 9,000, it will prevent the event
|
49
|
+
from occuring (but any after blocks will still run).
|
50
|
+
|
51
|
+
```Ruby
|
52
|
+
on :ping
|
53
|
+
def ping(data)
|
54
|
+
send message('test.pong', message: 'pong')
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
Here we define a basic event named `ping`. When the server receives it, it
|
59
|
+
sends back an event named `test.pong`, with the message `pong`. Cool, eh?
|
60
|
+
|
61
|
+
```Ruby
|
62
|
+
on :pong
|
63
|
+
def pong(data)
|
64
|
+
puts data["message"] # => "pong"
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
In this we're assuming that somewhere else in our code the client sent us a
|
69
|
+
`test.pong` event; maybe they did so in response to a ping that we sent.
|
70
|
+
Either way, we're outputting a message that we received.
|
71
|
+
|
72
|
+
```Ruby
|
73
|
+
end
|
74
|
+
|
75
|
+
Orator.add_handler(TestHandler)
|
76
|
+
```
|
77
|
+
|
78
|
+
Here we register our handler with Orator, so it can use it for routing events.
|
79
|
+
But say we also want to handle a `socket.open` event. Our handler above can't
|
80
|
+
handle that, sadly, so we use this method:
|
81
|
+
|
82
|
+
```Ruby
|
83
|
+
Orator.add_handler do |events|
|
84
|
+
events.on('socket.open') do |data|
|
85
|
+
self.user = {}
|
86
|
+
|
87
|
+
send mesasge('test.ping', message: 'ping')
|
88
|
+
end
|
89
|
+
|
90
|
+
events.on('user.alias') do |data|
|
91
|
+
self.user[:name] = json["name"]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
```
|
95
|
+
|
96
|
+
So when the socket opens in `socket.open`, we set `#user` to an empty hash and
|
97
|
+
send a ping message (whose response will be handled by our TestHandler). When
|
98
|
+
we receive the `user.alias` message, we set the key-pair `:name => json["name"]`
|
99
|
+
on the `#user` hash. Cool, eh?
|
100
|
+
|
22
101
|
## JavaScript Client
|
23
102
|
Let's go through an example together.
|
24
|
-
|
25
|
-
|
26
|
-
|
103
|
+
|
104
|
+
```JavaScript
|
105
|
+
$(document).ready(function() {
|
106
|
+
Orator.setup("ws://host:port/path?query", function(events){
|
107
|
+
```
|
27
108
|
|
28
109
|
`Orator.setup` handles setting up our socket for us. It also sets up the
|
29
110
|
events and routing, as well. There are some locally defined events that are
|
30
111
|
triggered even if the server hadn't sent them, such as `socket.open` and
|
31
112
|
`socket.close`.
|
32
113
|
|
33
|
-
|
114
|
+
```JavaScript
|
115
|
+
events.on('some.event', function() {})
|
116
|
+
```
|
34
117
|
|
35
118
|
Here we're binding some event named `some.event` to an empty function. Boring.
|
36
119
|
Note that the name of the event doesn't matter here.
|
37
120
|
|
38
|
-
|
39
|
-
|
40
|
-
|
121
|
+
```JavaScript
|
122
|
+
events.on('test.ping', function() {
|
123
|
+
this.server.send('test.pong', { message: 'pong' });
|
124
|
+
});
|
125
|
+
```
|
41
126
|
|
42
127
|
Here we're responding to a ping that a server might send to this client. We
|
43
128
|
send back a `test.pong` event, with the message 'pong'. The contents of the
|
44
129
|
event can be anything.
|
45
130
|
|
46
|
-
|
47
|
-
|
48
|
-
|
131
|
+
```JavaScript
|
132
|
+
events.on('test.pong', function(data) {
|
133
|
+
console.log(data.message) // => "pong"
|
134
|
+
});
|
135
|
+
```
|
49
136
|
|
50
137
|
Here we received a pong back from the server - this was triggered by the server
|
51
138
|
in response to our ping, which we could have sent at any time.
|
52
139
|
|
53
|
-
|
54
|
-
|
140
|
+
```JavaScript
|
141
|
+
events.on('socket.open', function() {
|
142
|
+
this.user = {}
|
55
143
|
|
56
|
-
|
57
|
-
|
144
|
+
this.server.send('user.alias', { name: some_name })
|
145
|
+
});
|
146
|
+
```
|
58
147
|
|
59
148
|
Here we defined an event that will set up a an empty object on the property
|
60
149
|
user of `this`. This will become important. We then send the event
|
61
150
|
`user.alias` to the server (which probably changes the name of the user) with
|
62
151
|
the new name (assuming `some_name` has a string value).
|
63
152
|
|
64
|
-
|
65
|
-
|
66
|
-
|
153
|
+
```JavaScript
|
154
|
+
events.on('user.alias', function(data) {
|
155
|
+
this.user.name = data.name;
|
156
|
+
});
|
157
|
+
```
|
67
158
|
|
68
159
|
It is common place for the server's response events to be named the same as the
|
69
160
|
request events (although the response events may be sent at any time, with no
|
@@ -71,15 +162,10 @@ context). Here we see setting the name of the user object to the name the
|
|
71
162
|
server sent back. This is the same user object that we defined in the event
|
72
163
|
above.
|
73
164
|
|
74
|
-
|
165
|
+
```JavaScript
|
166
|
+
});
|
75
167
|
|
76
|
-
|
168
|
+
});
|
169
|
+
```
|
77
170
|
|
78
171
|
And we close our braces.
|
79
|
-
|
80
|
-
## Server Stuff
|
81
|
-
I'm not entirely sure how to set this part up... any ideas?
|
82
|
-
|
83
|
-
I'm trying to provide support for all types of rails applications, including
|
84
|
-
those on passenger. I'll probably require a settings file in
|
85
|
-
`Rails.root/config` for orator...
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Orator
|
2
|
+
module Generators
|
3
|
+
class ConfigGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
source_root File.expand_path('../../templates', __FILE__)
|
6
|
+
|
7
|
+
def copy_configuration
|
8
|
+
template "config.yml", "config/orator_config.yml"
|
9
|
+
directory "handlers", "app/handlers"
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Orator
|
2
|
+
module Generators
|
3
|
+
class HandlerGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
source_root File.expand_path('../../templates', __FILE__)
|
6
|
+
argument :handler_name, :required => true,
|
7
|
+
:desc => "The name of the handler to use."
|
8
|
+
|
9
|
+
def copy_configuration
|
10
|
+
template "template_handler.rb", "app/handlers/#{handler_name}_handler.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class ExampleHandler < Orator::Handlers::Base
|
2
|
+
|
3
|
+
# This defines the name of the handler. THIS IS REQUIRED. Orator will not
|
4
|
+
# be able to correctly route your events to this handler if it is not put
|
5
|
+
# here.
|
6
|
+
#handler_name 'example'
|
7
|
+
|
8
|
+
# This defines a before event. It can take a block or a symbol. If it's a
|
9
|
+
# symbol, it'll call the method.
|
10
|
+
#before do
|
11
|
+
# something
|
12
|
+
#end
|
13
|
+
|
14
|
+
# This defines the event `some_event`. Note that the two have to have the
|
15
|
+
# same value. If they're different, you need to add a second argument
|
16
|
+
# describing the method name (i.e. `on 'some_event', :some_method`).
|
17
|
+
#on 'some_event'
|
18
|
+
#def some_event(json)
|
19
|
+
# do_something
|
20
|
+
#end
|
21
|
+
|
22
|
+
# Inline syntax.
|
23
|
+
#on 'other_event' do; end
|
24
|
+
|
25
|
+
#after do
|
26
|
+
# other_thing
|
27
|
+
#end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
#Orator.add_handler(ExampleHandler)
|
data/lib/orator/cli.rb
CHANGED
@@ -8,7 +8,7 @@ module Orator
|
|
8
8
|
|
9
9
|
DEFAULT_OPTIONS = {
|
10
10
|
:command => :help,
|
11
|
-
:file => "
|
11
|
+
:file => "config/orator_config.yml",
|
12
12
|
:daemonize => false
|
13
13
|
}
|
14
14
|
|
@@ -27,10 +27,14 @@ module Orator
|
|
27
27
|
@options[:command] = command
|
28
28
|
end
|
29
29
|
|
30
|
-
opts.on('-
|
30
|
+
opts.on('-d', '--[no-]daemonize', "Whether or not to daemonize the process.") do |d|
|
31
31
|
@options[:daemonize] = d
|
32
32
|
end
|
33
33
|
|
34
|
+
opts.on('-D', '--debug', "Run Orator in debug mode.") do
|
35
|
+
Orator.debug = true
|
36
|
+
end
|
37
|
+
|
34
38
|
opts.on('-h', '--help', "Shows this message.") { puts opts; exit }
|
35
39
|
opts.on('-v', '--version', "Shows the version of orator.") do
|
36
40
|
puts Orator::VERSION
|
@@ -45,7 +49,6 @@ module Orator
|
|
45
49
|
end
|
46
50
|
|
47
51
|
def handle_command
|
48
|
-
Orator.debug = yaml_options[:debug]
|
49
52
|
send(@options[:command])
|
50
53
|
end
|
51
54
|
|
@@ -119,21 +122,9 @@ module Orator
|
|
119
122
|
#
|
120
123
|
# @return [void]
|
121
124
|
def load_handlers
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
end
|
126
|
-
|
127
|
-
if yaml_options[:handlers]
|
128
|
-
handlers.concat(yaml_options[:handlers])
|
129
|
-
end
|
130
|
-
|
131
|
-
handlers.each do |handler|
|
132
|
-
begin
|
133
|
-
require_relative handler
|
134
|
-
rescue LoadError
|
135
|
-
require handler
|
136
|
-
end
|
125
|
+
p yaml_options, yaml_options[:handlers_path]
|
126
|
+
Dir[yaml_options[:handlers_path]].each do |file|
|
127
|
+
load file
|
137
128
|
end
|
138
129
|
end
|
139
130
|
|
data/lib/orator/handlers/base.rb
CHANGED
@@ -20,23 +20,17 @@ module Orator
|
|
20
20
|
#
|
21
21
|
# @param event [Symbol, String] the event to trigger.
|
22
22
|
# @raise [NoMethodError] if the event isn't defined on the handler.
|
23
|
-
# @return [Array<Object
|
23
|
+
# @return [Array<Object>, nil] the values of the trigger, or nil if the
|
24
|
+
# event was prevented.
|
24
25
|
def __trigger(event, *args)
|
25
26
|
handler, method_name = event.to_s.split('.')
|
27
|
+
__check_event(handler, method_name)
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
return
|
31
|
-
elsif !__method_exists?(method_name)
|
32
|
-
raise NoMethodError,
|
33
|
-
"Method #{method_name} does not exist on #{self.class.name}"
|
34
|
-
return
|
35
|
-
end
|
29
|
+
__run_callbacks(:before)
|
30
|
+
out = __run_event(method_name, args) unless @__prevent_event
|
31
|
+
__run_callbacks(:after)
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
__run_event(method_name, args) unless @__prevent_event
|
33
|
+
out
|
40
34
|
end
|
41
35
|
|
42
36
|
# Checks the event list to see if this class responds to it.
|
@@ -86,23 +80,54 @@ module Orator
|
|
86
80
|
|
87
81
|
private
|
88
82
|
|
83
|
+
# Run the event.
|
89
84
|
def __run_event(method_name, args)
|
90
85
|
result = __event_list[method_name].map do |responder|
|
91
86
|
responder = method(responder) if responder.is_a? Symbol
|
92
87
|
instance_exec *args, &responder
|
93
88
|
end
|
94
89
|
|
95
|
-
self.class.after_list.map { |a| instance_exec &a }
|
96
|
-
|
97
90
|
result
|
98
91
|
end
|
99
92
|
|
93
|
+
# Check the event, making sure that this handler can respond to it.
|
94
|
+
def __check_event(handler, method)
|
95
|
+
if handler != self.class.handler_name
|
96
|
+
raise NoMethodError,
|
97
|
+
"Event #{handler} does not match #{self.class.name}"
|
98
|
+
return
|
99
|
+
elsif !__method_exists?(method)
|
100
|
+
raise NoMethodError,
|
101
|
+
"Method #{method} does not exist on #{self.class.name}"
|
102
|
+
return
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Runs the callbacks.
|
107
|
+
def __run_callbacks(type)
|
108
|
+
self.class.send("#{type}_list").map do |cb|
|
109
|
+
if cb.is_a? Symbol
|
110
|
+
method(cb).call
|
111
|
+
else
|
112
|
+
instance_exec &cb
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
100
117
|
module ClassMethods
|
101
|
-
|
102
|
-
# the handler
|
118
|
+
|
119
|
+
# This manages the handler's name. If an argument is passed, the name
|
120
|
+
# is set to that. Otherwise, it returns the handler's name.
|
103
121
|
#
|
104
|
-
# @
|
105
|
-
|
122
|
+
# @param value [String, nil] the new name.
|
123
|
+
# @return [String] the handler name.
|
124
|
+
def handler_name(value = nil)
|
125
|
+
if value
|
126
|
+
@_handler_name = value
|
127
|
+
end
|
128
|
+
|
129
|
+
@_handler_name
|
130
|
+
end
|
106
131
|
|
107
132
|
# This registers a method for this Handler.
|
108
133
|
#
|
@@ -132,7 +157,7 @@ module Orator
|
|
132
157
|
# @param event_handler [EventHandler]
|
133
158
|
def register_with(event_handler)
|
134
159
|
event_list.keys.each do |event|
|
135
|
-
event_handler.on("#{self.
|
160
|
+
event_handler.on("#{self.handler_name}.#{event}", self)
|
136
161
|
end
|
137
162
|
end
|
138
163
|
|
@@ -150,7 +175,7 @@ module Orator
|
|
150
175
|
end
|
151
176
|
|
152
177
|
extend ClassMethods
|
153
|
-
|
178
|
+
handler_name ''
|
154
179
|
|
155
180
|
end
|
156
181
|
|
data/lib/orator/middle_ground.rb
CHANGED
@@ -11,6 +11,7 @@ module Orator
|
|
11
11
|
# Initialize the class.
|
12
12
|
def initialize(client)
|
13
13
|
@client = client
|
14
|
+
@struct = OpenStruct.new
|
14
15
|
end
|
15
16
|
|
16
17
|
# This sends a message to the client.
|
@@ -34,5 +35,17 @@ module Orator
|
|
34
35
|
|
35
36
|
new_data
|
36
37
|
end
|
38
|
+
|
39
|
+
# This delegates the rest of the requests to the struct.
|
40
|
+
def method_missing(method, *args, &block)
|
41
|
+
super unless respond_to_missing?(method)
|
42
|
+
|
43
|
+
@struct.__send__(method, *args, &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Lets ruby know we're doing some {#method_missing} magic.
|
47
|
+
def respond_to_missing?(method, include_private = false)
|
48
|
+
@struct.respond_to?(method, include_private)
|
49
|
+
end
|
37
50
|
end
|
38
51
|
end
|
data/lib/orator/version.rb
CHANGED
data/lib/orator.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'oj'
|
4
4
|
require 'set'
|
5
|
+
require 'ostruct'
|
5
6
|
require 'em-websocket'
|
6
7
|
|
7
8
|
require 'orator/server'
|
@@ -17,5 +18,9 @@ module Orator
|
|
17
18
|
|
18
19
|
class << self; attr_accessor :debug; end
|
19
20
|
Orator.debug = false
|
21
|
+
|
22
|
+
def self.add_handler(*args, &block)
|
23
|
+
Orator::CLI.add_handler(*args, &block)
|
24
|
+
end
|
20
25
|
|
21
26
|
end
|
data/spec/base_handler_spec.rb
CHANGED
@@ -3,7 +3,7 @@ describe Orator::Handlers::Base do
|
|
3
3
|
something = double('something')
|
4
4
|
something.should_receive(:to_call)
|
5
5
|
klass = Class.new(described_class) do
|
6
|
-
|
6
|
+
handler_name 'test'
|
7
7
|
before { something.to_call }
|
8
8
|
on 'some_event'
|
9
9
|
def some_event; end
|
@@ -21,7 +21,7 @@ describe Orator::Handlers::Base do
|
|
21
21
|
something = double('something')
|
22
22
|
something.should_not_receive(:to_call)
|
23
23
|
klass = Class.new(described_class) do
|
24
|
-
|
24
|
+
handler_name 'test'
|
25
25
|
before { prevent_event }
|
26
26
|
on('some_event') { something.to_call }
|
27
27
|
end
|
@@ -33,7 +33,7 @@ describe Orator::Handlers::Base do
|
|
33
33
|
event_handler = double('event_handler')
|
34
34
|
|
35
35
|
klass = Class.new(described_class) do
|
36
|
-
|
36
|
+
handler_name 'test'
|
37
37
|
|
38
38
|
on('some_event') { }
|
39
39
|
end
|
@@ -42,4 +42,34 @@ describe Orator::Handlers::Base do
|
|
42
42
|
|
43
43
|
klass.register_with(event_handler)
|
44
44
|
end
|
45
|
+
|
46
|
+
it "should be able to take a before method" do
|
47
|
+
something = double('something')
|
48
|
+
something.should_not_receive(:to_call)
|
49
|
+
|
50
|
+
klass = Class.new(described_class) do
|
51
|
+
handler_name 'test'
|
52
|
+
|
53
|
+
before :do_something
|
54
|
+
|
55
|
+
def do_something; prevent_event; end
|
56
|
+
|
57
|
+
on 'some_event' do; something.to_call; end
|
58
|
+
end
|
59
|
+
|
60
|
+
klass.new(nil).__trigger('test.some_event')
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should be able to use a different method" do
|
64
|
+
|
65
|
+
klass = Class.new(described_class) do
|
66
|
+
handler_name 'test'
|
67
|
+
|
68
|
+
on 'some_event', :other_method
|
69
|
+
def other_method; end
|
70
|
+
def some_event; raise StandardError; end
|
71
|
+
end
|
72
|
+
|
73
|
+
klass.new(nil).__trigger('test.some_event')
|
74
|
+
end
|
45
75
|
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Rodi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-websocket
|
@@ -84,9 +84,16 @@ files:
|
|
84
84
|
- lib/orator/handlers/base.rb
|
85
85
|
- lib/orator/engine.rb
|
86
86
|
- lib/orator/event_handler.rb
|
87
|
+
- lib/generators/orator/handler_generator.rb
|
88
|
+
- lib/generators/orator/config_generator.rb
|
89
|
+
- lib/generators/templates/template_handler.rb
|
90
|
+
- lib/generators/templates/config.yml
|
91
|
+
- lib/generators/templates/handlers/example_handler.rb
|
87
92
|
- lib/orator.rb
|
93
|
+
- lib/tasks/orator.rake
|
88
94
|
- bin/orator
|
89
95
|
- spec/client_spec.rb
|
96
|
+
- spec/spec_helper.rb
|
90
97
|
- spec/middle_ground_spec.rb
|
91
98
|
- spec/event_handler_spec.rb
|
92
99
|
- spec/base_handler_spec.rb
|