hara 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7f83818ae52c8a4eb9db097c057149a4b1c4078e
4
+ data.tar.gz: ba02fe00a42900cea3af4d7ee8a60aa74ecb31f8
5
+ SHA512:
6
+ metadata.gz: 4b60a714370f02384741883e26995d5f3136166e7df01236691502b3a739510e49d0eea863e487f21711bbdb87dcfd6c2aba7300a84449119edc386ad330e7b3
7
+ data.tar.gz: f33ffb17c068aab2a9cb35b02b8f17a98084884e7700113474ad3d4d52f507a573e94f85964084efb15e1df4a9e0fb868f91cd2f128d7f703c8fd7d6e2e70372
data/README.md CHANGED
@@ -3,13 +3,11 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/hara.png)](http://badge.fury.io/rb/hara)
4
4
  [![Build Status](https://travis-ci.org/jjyr/hara.png?branch=master)](https://travis-ci.org/jjyr/hara)
5
5
 
6
- Hara is a simple framework, help you build async-io & concurrent websocket server.
6
+ Hara is a websocket based application framework, build upon [em-websocket](https://github.com/igrigorik/em-websocket).
7
7
 
8
- Hara's async-io ability from [em-websocket](https://github.com/igrigorik/em-websocket),
9
-
10
- Hara's concurrent ability from [celluloid](https://github.com/celluloid/celluloid).
11
-
12
- Seems eventmachine and celluloid work well together :smile:
8
+ * Simple, easy to use.
9
+ * OO, Actor model(Celluloid).
10
+ * Event-io(em-websocket).
13
11
 
14
12
  ## Installation
15
13
 
@@ -25,26 +23,28 @@ Or install it yourself as:
25
23
 
26
24
  $ gem install hara
27
25
 
28
- ## BasicUsage
26
+ ## Basic Usage
29
27
 
30
28
  *server*
31
29
  ```ruby
32
30
  #test.rb
33
31
  require 'hara'
34
32
 
35
- class Echo
33
+ class Echo
36
34
  include Hara::App
37
35
 
38
36
  define_action :echo do |str|
39
- socket.send str
37
+ send_msg str
40
38
  end
41
39
  end
40
+
41
+ Hara::Server.start 'localhost', '3000'
42
42
  ```
43
43
 
44
44
  *client*
45
45
  ```javascript
46
46
  var msg = JSON.stringify({action: 'echo',args:['hello world']})
47
- var ws = new WebSocket('ws://localhost:3210')
47
+ var ws = new WebSocket('ws://localhost:3000')
48
48
  ws.onmessage = function(msg){alert(msg.data)}
49
49
 
50
50
  //after a while
@@ -60,11 +60,11 @@ ws.send(msg)
60
60
  ## Full Usages
61
61
 
62
62
  ```ruby
63
- require 'hara/base'
63
+ require 'hara'
64
64
 
65
- class Echo
66
- #include Hara::App, make you Echo class become Celluloid::Actor,
67
- # and per actor handle a socket
65
+ class Echo
66
+ #include Hara::App make your Echo class become Celluloid::Actor,
67
+ #hara use actor per connection
68
68
  include Hara::App
69
69
 
70
70
  #Hara::App provide some callbacks
@@ -80,8 +80,8 @@ class Echo
80
80
 
81
81
  define_action :echo do |str|
82
82
  puts "#{client_ip} #{client_port}"
83
- #send message to socket
84
- socket.send str
83
+ #send message to client
84
+ send_msg str
85
85
  end
86
86
 
87
87
  define_action :exit do
@@ -95,7 +95,7 @@ class Echo
95
95
  end
96
96
 
97
97
  def action_missing action, *args
98
- socket.send 'error'
98
+ send_msg 'error'
99
99
  super
100
100
  end
101
101
 
@@ -104,7 +104,34 @@ class Echo
104
104
  end
105
105
  end
106
106
 
107
- #if you require 'hara/base' you need start server you self, like below
107
+ # you can pass some options to start
108
+ server_options = {
109
+ #...some options, same as EM::Websocket.run
110
+ }
111
+ Hara::Server.start 'localhost', '3000', server_options
112
+
113
+
114
+ # Hara::Filter
115
+ # Filter can help you filter some connections before dispatched to app actor.
116
+ # Example: use Filter to authentication
117
+ require 'cgi/cookie'
118
+
119
+ class Echo
120
+ include Hara::App
121
+ #..some code
122
+ end
123
+
124
+ #class name is not matter
125
+ class Authentication
126
+ include Hara::Filter
127
+
128
+ # You must implement filter method, return value should be ture or false
129
+ def filter
130
+ # You can use some helper methods(headers, client_ip, send_msg...), just like Hara::App
131
+ CGI::Cookie.parse(headers['cookie'])['foo'] == ['bar']
132
+ end
133
+ end
134
+
108
135
  Hara::Server.start 'localhost', '3000'
109
136
  ```
110
137
 
data/hara.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Hara::VERSION
9
9
  spec.authors = ["jjy"]
10
10
  spec.email = ["jjyruby@gmail.com"]
11
- spec.description = %q{Hara help you build async-io & concurrent websocket server.}
12
- spec.summary = %q{In fact, hara just a combination of em-websocket and celluloid, but it really help you write applications easily.}
11
+ spec.description = %q{Hara is a websocket based application framework.}
12
+ spec.summary = %q{Hara build upon em-websocket, easy to use.}
13
13
  spec.homepage = "http://github.com/jjyr/hara"
14
14
  spec.license = "MIT"
15
15
 
@@ -19,8 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
 
22
- spec.add_dependency "em-websocket", "~> 0.5.0"
23
- spec.add_dependency "celluloid", "~> 0.14.1"
22
+ spec.add_dependency "em-websocket", ">= 0.5.0"
23
+ spec.add_dependency "eventmachine"
24
+ spec.add_dependency "celluloid", ">= 0.14.1"
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.3"
26
27
  spec.add_development_dependency "rake"
data/lib/hara/app.rb CHANGED
@@ -1,52 +1,32 @@
1
- require "hara/version"
1
+ require 'hara/client_interaction'
2
2
  require 'celluloid'
3
3
  require 'socket'
4
4
  require 'json'
5
5
 
6
6
  module Hara
7
- class << self
8
- def env
9
- @_env ||= (ENV['APP_ENV'] || :development).to_sym
10
- end
11
-
12
- def env= env
13
- @_env = env
14
- end
15
-
16
- #decode message, return action and args
17
- def decode_msg msg
18
- msg = JSON.parse(msg)
19
- msg.values_at 'action', 'args'
20
- end
21
-
22
- def encode_msg action, *args
23
- {action: action, args: args}.to_json
24
- end
25
- end
26
-
27
7
  module App
28
- attr_reader :socket, :handshake, :client_ip, :client_port
8
+ include ClientInteraction
29
9
 
30
10
  Actions = {}
31
11
 
32
12
  class << self
33
13
  def included klass
34
- klass.send :include, Celluloid
35
- klass.send :include, Celluloid::Logger
36
- klass.send :finalizer, :app_finalizer
37
- klass.send :extend, ClassMethods
38
- ::Hara.const_set :Application, klass
14
+ klass.send :include, Celluloid
15
+ klass.send :include, Celluloid::Logger
16
+ klass.send :finalizer, :app_finalizer
17
+ klass.send :extend, ClassMethods
18
+ ::Hara.const_set :Application, klass
39
19
  end
40
20
  end
41
21
 
42
22
  module ClassMethods
43
23
  def define_action action, &block
44
- action = action.to_s
45
- warn "Action #{action} duplication defined" if Actions.has_key? action
46
- Hara::Application.send :define_method, action, &block
47
- method = Hara::Application.send :instance_method, action
48
- Hara::Application.send :remove_method, action
49
- Actions[action] = method
24
+ action = action.to_s
25
+ warn "Action #{action} duplication defined" if Actions.has_key? action
26
+ Hara::Application.send :define_method, action, &block
27
+ method = Hara::Application.send :instance_method, action
28
+ Hara::Application.send :remove_method, action
29
+ Actions[action] = method
50
30
  end
51
31
  end
52
32
 
@@ -72,22 +52,10 @@ module Hara
72
52
  raise NoMethodError, "undefined action '#{action}' for #{self}:#{self.class}"
73
53
  end
74
54
 
75
- #get client headers
76
- def headers
77
- handshake.headers_downcased
78
- end
79
-
80
- # close connection
81
- def close code = nil, body = nil
82
- @socket.close code, body
83
- end
84
-
85
55
  #below are internal functions(should not been overriding)
86
56
 
87
57
  def initialize handshake, socket
88
- @handshake = handshake
89
- @socket = socket
90
- @client_port, @client_ip = Socket.unpack_sockaddr_in(socket.get_peername) #to get ip address of user
58
+ socket_setup handshake, socket
91
59
  async.hara_setup
92
60
  end
93
61
 
@@ -109,9 +77,9 @@ module Hara
109
77
 
110
78
  def call_action action, *args
111
79
  if Actions.has_key? action
112
- Actions[action].bind(self).call *args
80
+ Actions[action].bind(self).call *args
113
81
  else
114
- action_missing action, *args
82
+ action_missing action, *args
115
83
  end
116
84
  end
117
85
 
@@ -0,0 +1,26 @@
1
+ module Hara
2
+ module ClientInteraction
3
+ attr_reader :socket, :handshake, :client_ip, :client_port
4
+
5
+ def socket_setup handshake, socket
6
+ @handshake = handshake
7
+ @socket = socket
8
+ @client_port, @client_ip = Socket.unpack_sockaddr_in(socket.get_peername) #to get ip address of user
9
+ end
10
+
11
+ # get client headers
12
+ def headers
13
+ handshake.headers_downcased
14
+ end
15
+
16
+ # send msg to client
17
+ def send_msg msg
18
+ socket.send msg
19
+ end
20
+
21
+ # close connection
22
+ def close code = nil, body = nil
23
+ @socket.close code, body
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ require 'hara/filter'
2
+
3
+ class DefaultFilter
4
+ include Hara::Filter
5
+
6
+ def filter
7
+ true
8
+ end
9
+ end
@@ -0,0 +1,60 @@
1
+ require 'celluloid'
2
+ require 'hara/client_interaction'
3
+
4
+ module Hara
5
+ module Filter
6
+ include ClientInteraction
7
+
8
+ class << self
9
+ def included klass
10
+ klass.send :include, Celluloid
11
+ klass.send :include, Celluloid::Logger
12
+ Hara.filter_class = klass
13
+ klass.send :extend, ClassMethods
14
+ end
15
+ end
16
+
17
+ module ClassMethods
18
+ def pool_size= size
19
+ Hara.filter_pool_size = size
20
+ end
21
+
22
+ def pool_size
23
+ Hara.filter_pool_size
24
+ end
25
+ end
26
+
27
+ def setup_socket_callbacks handshake, ws
28
+ actor = Hara::Application.new handshake, ws
29
+
30
+ ws.onclose { |close_info = {}|
31
+ begin
32
+ actor.async.set_close_info close_info
33
+ actor.terminate! if actor.alive?
34
+ rescue Celluloid::DeadActorError => e
35
+ end
36
+ }
37
+
38
+ ws.onmessage { |msg|
39
+ actor.async.process_msg msg
40
+ }
41
+ end
42
+
43
+ def run_filter handshake, socket
44
+ exclusive do
45
+ socket_setup handshake, socket
46
+ pass = self.filter
47
+ if pass
48
+ setup_socket_callbacks handshake, socket
49
+ else
50
+ close
51
+ end
52
+ end
53
+ end
54
+
55
+ # you should implement this method and return true or false
56
+ def filter
57
+ raise NotImplementedError, 'You must implement method filter, return value can be true or false.'
58
+ end
59
+ end
60
+ end
data/lib/hara/server.rb CHANGED
@@ -1,34 +1,22 @@
1
1
  require 'em-websocket'
2
2
  require 'eventmachine'
3
- require 'hara/base'
4
3
 
5
4
  module Hara
6
5
  class Server
7
6
  class << self
8
- def start host, port
9
- puts "Server starting on #{host}:#{port}"
10
- EM.epoll
11
- EM.run {
12
- EM::WebSocket.run(host: host, port: port) do |ws|
13
- actor = nil
7
+ def start host, port, options = {}
8
+ puts "Server starting on #{host}:#{port}"
9
+ options = options.merge(host: host, port: port)
10
+ EM.epoll
11
+ EM.run do
14
12
 
15
- ws.onopen { |handshake|
16
- actor = Hara::Application.new handshake, ws
17
- }
13
+ EM::WebSocket.run(options) do |ws|
14
+ ws.onopen { |handshake|
15
+ Hara.filter_pool.async.run_filter handshake, ws
16
+ }
17
+ end
18
18
 
19
- ws.onclose {|close_info = {}|
20
- begin
21
- actor.async.set_close_info close_info
22
- actor.terminate! if actor.alive?
23
- rescue Celluloid::DeadActorError => e
24
- end
25
- }
26
-
27
- ws.onmessage { |msg|
28
- actor.async.process_msg msg
29
- }
30
- end
31
- }
19
+ end
32
20
  end
33
21
  end
34
22
  end
data/lib/hara/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hara
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/hara.rb CHANGED
@@ -1,2 +1,40 @@
1
- require 'hara/base'
2
- require 'hara/main'
1
+ require "hara/version"
2
+
3
+ module Hara
4
+ class << self
5
+ #decode message, return action and args
6
+ def decode_msg msg
7
+ msg = JSON.parse(msg)
8
+ msg.values_at 'action', 'args'
9
+ end
10
+
11
+ def encode_msg action, *args
12
+ {action: action, args: args}.to_json
13
+ end
14
+
15
+ def filter_class
16
+ @filter_class || DefaultFilter
17
+ end
18
+
19
+ def filter_class= klass
20
+ @filter_class = klass
21
+ end
22
+
23
+ def filter_pool_size= size
24
+ @filter_pool_size = size
25
+ end
26
+
27
+ def filter_pool_size
28
+ @filter_pool_size || 10
29
+ end
30
+
31
+ def filter_pool
32
+ @filter_pool ||= filter_class.pool(size: filter_pool_size)
33
+ end
34
+ end
35
+ end
36
+
37
+ require 'hara/app'
38
+ require 'hara/filter'
39
+ require 'hara/default_filter'
40
+ require 'hara/server'
data/spec/app_spec.rb CHANGED
@@ -6,35 +6,35 @@ describe Hara::App do
6
6
  include Hara::App
7
7
 
8
8
  def after_connect
9
- @states = []
9
+ @states = []
10
10
  end
11
11
 
12
12
  def before_action action, *args
13
- @states << [:before_action, action, args]
13
+ @states << [:before_action, action, args]
14
14
  end
15
15
 
16
16
  def after_action action, *args
17
- @states << [:after_action, action, args]
17
+ @states << [:after_action, action, args]
18
18
  end
19
19
 
20
20
  def on_close close_info
21
- @states << :closed
21
+ @states << :closed
22
22
  end
23
23
 
24
24
  def action_missing action, *args
25
- socket.send [:action_missing, action, args]
25
+ send_msg [:action_missing, action, args]
26
26
  end
27
27
 
28
28
  define_action :hello do |msg|
29
- socket.send "hello#{msg}"
29
+ send_msg "hello#{msg}"
30
30
  end
31
31
 
32
32
  define_action :exit do
33
- close 3333, "Bye"
33
+ close 3333, "Bye"
34
34
  end
35
35
 
36
36
  def states
37
- @states
37
+ @states
38
38
  end
39
39
  end
40
40
  end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hara::Filter do
4
+ before :all do
5
+ @filter = Class.new do
6
+ include Hara::Filter
7
+ self.pool_size = 3
8
+
9
+ def filter
10
+ socket.remote_ip == 'localhost'
11
+ end
12
+ end
13
+ end
14
+
15
+ it 'Hara.filter_class should be set' do
16
+ Hara.filter_class.should == @filter
17
+ end
18
+
19
+ it 'Hara.filter_pool_size should be set' do
20
+ Hara.filter_pool_size.should == 3
21
+ end
22
+
23
+ it 'Hara.filter_pool should work' do
24
+ wait_until{Hara.filter_pool}
25
+ Hara.filter_pool.nil?.should == false
26
+ end
27
+
28
+ describe 'filter' do
29
+ before :each do
30
+ @handshake = FayeHandshake.new
31
+ @socket = FayeSocket.new
32
+ @socket.alive = true
33
+ wait_until{Hara.filter_pool}
34
+ end
35
+
36
+ it 'filter should close socket if not pass' do
37
+ @socket.remote_ip = '127.0.0.1'
38
+ Hara.filter_pool.run_filter @handshake, @socket
39
+ wait_until{!@socket.alive?}
40
+ @socket.alive?.should == false
41
+ end
42
+
43
+ it 'filter should set callbacks on socket if pass' do
44
+ @socket.remote_ip = 'localhost'
45
+ Hara.filter_pool.run_filter @handshake, @socket
46
+ wait_until{@socket.onclose_block}
47
+ @socket.onmessage_block.should.is_a? Proc
48
+ @socket.onclose_block.should.is_a? Proc
49
+ end
50
+ end
51
+ end
data/spec/hara_spec.rb CHANGED
@@ -8,10 +8,6 @@ describe Hara do
8
8
  App.should == Hara::Application
9
9
  end
10
10
 
11
- it 'Hara.env should be development' do
12
- Hara.env.should == :development
13
- end
14
-
15
11
  it 'Hara.encode_msg & decode_msg should work' do
16
12
  action = 'hello_world'
17
13
  args = ['hello', 'world']
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'hara/base'
1
+ require 'hara'
2
2
 
3
3
  Celluloid.logger = nil
4
4
 
@@ -33,6 +33,10 @@ class FayeSocket
33
33
  defined?(JRuby) ? @jruby_peername : @mri_peername
34
34
  end
35
35
 
36
+ def alive= alive
37
+ @alive = alive
38
+ end
39
+
36
40
  def alive?
37
41
  @alive
38
42
  end
@@ -41,7 +45,7 @@ class FayeSocket
41
45
  if @alive
42
46
  @close_info = [code, body]
43
47
  @alive = false
44
- @app.terminate!
48
+ @app.terminate! if @app
45
49
  end
46
50
  end
47
51
 
@@ -52,4 +56,12 @@ class FayeSocket
52
56
  def client_read
53
57
  @client_messages.shift
54
58
  end
59
+
60
+ [:onclose, :onmessage, :onopen].each do |method|
61
+ attribute = "#{method}_block".to_sym
62
+ attr_accessor attribute
63
+ define_method method do |&blk|
64
+ __send__ "#{attribute}=", blk
65
+ end
66
+ end
55
67
  end
metadata CHANGED
@@ -1,52 +1,60 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
5
- prerelease:
4
+ version: 0.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - jjy
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-17 00:00:00.000000000 Z
11
+ date: 2013-07-29 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: em-websocket
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 0.5.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: 0.5.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: eventmachine
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
30
41
  - !ruby/object:Gem::Dependency
31
42
  name: celluloid
32
43
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
44
  requirements:
35
- - - ~>
45
+ - - '>='
36
46
  - !ruby/object:Gem::Version
37
47
  version: 0.14.1
38
48
  type: :runtime
39
49
  prerelease: false
40
50
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
51
  requirements:
43
- - - ~>
52
+ - - '>='
44
53
  - !ruby/object:Gem::Version
45
54
  version: 0.14.1
46
55
  - !ruby/object:Gem::Dependency
47
56
  name: bundler
48
57
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
58
  requirements:
51
59
  - - ~>
52
60
  - !ruby/object:Gem::Version
@@ -54,7 +62,6 @@ dependencies:
54
62
  type: :development
55
63
  prerelease: false
56
64
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
65
  requirements:
59
66
  - - ~>
60
67
  - !ruby/object:Gem::Version
@@ -62,20 +69,18 @@ dependencies:
62
69
  - !ruby/object:Gem::Dependency
63
70
  name: rake
64
71
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
72
  requirements:
67
- - - ! '>='
73
+ - - '>='
68
74
  - !ruby/object:Gem::Version
69
75
  version: '0'
70
76
  type: :development
71
77
  prerelease: false
72
78
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
79
  requirements:
75
- - - ! '>='
80
+ - - '>='
76
81
  - !ruby/object:Gem::Version
77
82
  version: '0'
78
- description: Hara help you build async-io & concurrent websocket server.
83
+ description: Hara is a websocket based application framework.
79
84
  email:
80
85
  - jjyruby@gmail.com
81
86
  executables: []
@@ -91,40 +96,41 @@ files:
91
96
  - hara.gemspec
92
97
  - lib/hara.rb
93
98
  - lib/hara/app.rb
94
- - lib/hara/base.rb
95
- - lib/hara/main.rb
99
+ - lib/hara/client_interaction.rb
100
+ - lib/hara/default_filter.rb
101
+ - lib/hara/filter.rb
96
102
  - lib/hara/server.rb
97
103
  - lib/hara/version.rb
98
104
  - spec/app_spec.rb
105
+ - spec/filter_spec.rb
99
106
  - spec/hara_spec.rb
100
107
  - spec/spec_helper.rb
101
108
  homepage: http://github.com/jjyr/hara
102
109
  licenses:
103
110
  - MIT
111
+ metadata: {}
104
112
  post_install_message:
105
113
  rdoc_options: []
106
114
  require_paths:
107
115
  - lib
108
116
  required_ruby_version: !ruby/object:Gem::Requirement
109
- none: false
110
117
  requirements:
111
- - - ! '>='
118
+ - - '>='
112
119
  - !ruby/object:Gem::Version
113
120
  version: '0'
114
121
  required_rubygems_version: !ruby/object:Gem::Requirement
115
- none: false
116
122
  requirements:
117
- - - ! '>='
123
+ - - '>='
118
124
  - !ruby/object:Gem::Version
119
125
  version: '0'
120
126
  requirements: []
121
127
  rubyforge_project:
122
- rubygems_version: 1.8.23
128
+ rubygems_version: 2.0.5
123
129
  signing_key:
124
- specification_version: 3
125
- summary: In fact, hara just a combination of em-websocket and celluloid, but it really
126
- help you write applications easily.
130
+ specification_version: 4
131
+ summary: Hara build upon em-websocket, easy to use.
127
132
  test_files:
128
133
  - spec/app_spec.rb
134
+ - spec/filter_spec.rb
129
135
  - spec/hara_spec.rb
130
136
  - spec/spec_helper.rb
data/lib/hara/base.rb DELETED
@@ -1,3 +0,0 @@
1
- require "hara/version"
2
- require 'hara/app'
3
- require 'hara/server'
data/lib/hara/main.rb DELETED
@@ -1,15 +0,0 @@
1
- require 'hara/base'
2
-
3
- start_options = {host: 'localhost', port: 3210}
4
-
5
- #like sinatra..
6
- if ARGV.any?
7
- require 'optparse'
8
- OptionParser.new { |op|
9
- op.on('-p port', "set the port (default is #{start_options[:port]})") { |val| start_options[:port] = val.to_i }
10
- op.on('-o addr', "set the host (default is #{start_options[:host]})") { |val| srart_options[:host] = val }
11
- op.on('-e env', 'set the environment (default is development)') { |val| Hara.env = val.to_sym }
12
- }.parse!(ARGV.dup)
13
- end
14
-
15
- at_exit { Hara::Server.start(start_options[:host], start_options[:port]) if $!.nil? }