firehose 0.0.12 → 0.0.13

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/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
data/firehose.gemspec CHANGED
@@ -23,14 +23,13 @@ Gem::Specification.new do |s|
23
23
  s.add_runtime_dependency "amqp", ">= 0.9.4"
24
24
  s.add_runtime_dependency "thin"
25
25
  s.add_runtime_dependency "thor"
26
- s.add_runtime_dependency "websocket-rack"
27
26
  s.add_runtime_dependency "faraday"
27
+ s.add_runtime_dependency "websocket-rack"
28
+ s.add_runtime_dependency "em-http-request", "~> 1.0.0"
28
29
 
29
30
  s.add_development_dependency "rspec"
30
- s.add_development_dependency "rack-test"
31
31
  s.add_development_dependency "guard-rspec"
32
32
  s.add_development_dependency "guard-bundler"
33
- # em-http dropped support for WS as of version 1.0+ (https://github.com/igrigorik/em-http-request/issues/164)
34
- s.add_development_dependency "em-http-request", "~> 0.3.0"
35
33
  s.add_development_dependency "guard-coffeescript"
34
+ s.add_development_dependency "em-websocket-client"
36
35
  end
data/lib/firehose.rb CHANGED
@@ -4,7 +4,9 @@ require 'amqp'
4
4
  require 'logger'
5
5
 
6
6
  module Firehose
7
+ autoload :Default, 'firehose/default'
7
8
  autoload :Subscription, 'firehose/subscription'
9
+ autoload :Producer, 'firehose/producer'
8
10
  autoload :Publisher, 'firehose/publisher'
9
11
  autoload :Rack, 'firehose/rack'
10
12
  autoload :CLI, 'firehose/cli'
data/lib/firehose/cli.rb CHANGED
@@ -4,13 +4,18 @@ require 'thin'
4
4
  module Firehose
5
5
  class CLI < Thor
6
6
  desc "server", "starts the firehose server"
7
- method_option :port, :type => :numeric, :default => 7474, :required => true, :aliases => '-p'
7
+ method_option :port, :type => :numeric, :default => Firehose::Default::URI.port, :required => true, :aliases => '-p'
8
8
  method_option :host, :type => :string, :default => '0.0.0.0', :required => true, :aliases => '-h'
9
9
  def server
10
10
  server = Thin::Server.new(options[:host], options[:port]) do
11
11
  run Firehose::Rack::App.new
12
12
  end
13
- server.start!
13
+
14
+ begin
15
+ server.start!
16
+ rescue AMQP::TCPConnectionFailed => e
17
+ Firehose.logger.error "Unable to connect to AMQP, are you sure it's running?"
18
+ end
14
19
  end
15
20
  end
16
21
  end
@@ -0,0 +1,7 @@
1
+ require 'uri'
2
+
3
+ module Firehose
4
+ module Default
5
+ URI = URI.parse("//127.0.0.1:7474").freeze
6
+ end
7
+ end
@@ -0,0 +1,60 @@
1
+ require "faraday"
2
+ require "uri"
3
+
4
+ module Firehose
5
+ # Publish messages to Firehose via an HTTP interface.
6
+ class Producer
7
+
8
+ # A DSL for publishing requests.
9
+ class Builder
10
+ def initialize(producer, message)
11
+ @producer, @message = producer, message
12
+ self
13
+ end
14
+
15
+ def to(channel, &callback)
16
+ @producer.put(@message, channel, &callback)
17
+ end
18
+ end
19
+
20
+ attr_reader :uri
21
+
22
+ def initialize(uri = Firehose::Default::URI)
23
+ @uri = URI.parse(uri.to_s)
24
+ @uri.scheme ||= 'http'
25
+ end
26
+
27
+ # A DSL for publishing messages.
28
+ def publish(message)
29
+ Builder.new(self, message)
30
+ end
31
+
32
+ # Publish the message via HTTP.
33
+ def put(message, channel, &block)
34
+ conn.put do |req|
35
+ req.path = channel
36
+ req.body = message
37
+ end.on_complete(&block)
38
+ end
39
+
40
+ # What adapter should Firehose use to PUT the message? List of adapters is
41
+ # available at
42
+ def self.adapter=(adapter)
43
+ @adapter = adapter
44
+ end
45
+
46
+ # Use :net_http for the default Faraday adapter.
47
+ def self.adapter
48
+ @adapter ||= Faraday.default_adapter
49
+ end
50
+
51
+ private
52
+ # Build out a Faraday connection
53
+ def conn
54
+ @conn ||= Faraday.new(:url => uri.to_s) do |builder|
55
+ builder.adapter self.class.adapter
56
+ builder.response :logger
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,4 +1,4 @@
1
1
  module Firehose
2
- VERSION = "0.0.12"
3
- CODENAME = "Shouty Shamous"
2
+ VERSION = "0.0.13"
3
+ CODENAME = "Chug Bug"
4
4
  end
@@ -1,13 +1,19 @@
1
1
  require 'spec_helper'
2
+
2
3
  require 'thin'
3
4
  require 'em-http'
5
+ require 'em-websocket-client'
4
6
 
5
7
  describe Firehose::Rack do
8
+ before(:each) do
9
+ Firehose::Producer.adapter = :em_http
10
+ end
11
+
6
12
  let(:app) { Firehose::Rack::App.new }
7
13
  let(:messages) { (1..1000).map(&:to_s) }
8
14
  let(:channel) { "/firehose/integration/#{Time.now.to_i}" }
9
- let(:uri) { URI.parse('http://127.0.0.1:9876') }
10
- let(:url) { "#{uri}#{channel}" }
15
+ let(:uri) { Firehose::Default::URI }
16
+ let(:http_url) { "http://#{uri.host}:#{uri.port}#{channel}" }
11
17
  let(:ws_url) { "ws://#{uri.host}:#{uri.port}#{channel}" }
12
18
  let(:cid) { "client-#{Time.now.to_i}" }
13
19
 
@@ -24,14 +30,14 @@ describe Firehose::Rack do
24
30
 
25
31
  # Setup a publisher
26
32
  publish = Proc.new do
27
- http = EM::HttpRequest.new(url).put(:body => outgoing.pop)
28
- http.errback { EM.stop }
29
- http.callback { publish.call unless outgoing.empty? }
33
+ Firehose::Producer.new.publish(outgoing.pop).to(channel) do
34
+ publish.call unless outgoing.empty?
35
+ end
30
36
  end
31
37
 
32
38
  # Lets have an HTTP Long poll client
33
39
  http_long_poll = Proc.new do
34
- http = EM::HttpRequest.new(url).get(:query => {'cid' => cid})
40
+ http = EM::HttpRequest.new(http_url).get(:query => {'cid' => cid})
35
41
  http.errback { EM.stop }
36
42
  http.callback do
37
43
  received_http << http.response
@@ -45,9 +51,9 @@ describe Firehose::Rack do
45
51
 
46
52
  # And test a web socket client too, at the same time.
47
53
  websocket = Proc.new do
48
- http = EventMachine::HttpRequest.new(ws_url).get
49
- http.errback { EM.stop }
50
- http.stream do |msg|
54
+ ws = EventMachine::WebSocketClient.connect(ws_url)
55
+ ws.errback { EM.stop }
56
+ ws.stream do |msg|
51
57
  received_ws << msg
52
58
  succeed.call unless received_ws.size < messages.size
53
59
  end
@@ -59,7 +65,7 @@ describe Firehose::Rack do
59
65
  EM.add_timer(30) { EM.stop }
60
66
 
61
67
  # Start the server
62
- ::Thin::Server.new(uri.host, uri.port, app).start
68
+ ::Thin::Server.new('0.0.0.0', uri.port, app).start
63
69
 
64
70
  # Start the http_long_pollr.
65
71
  http_long_poll.call
@@ -71,6 +77,6 @@ describe Firehose::Rack do
71
77
 
72
78
  # When EM stops, these assertions will be made.
73
79
  received_http.should =~ messages
74
- received_ws.should =~ messages
80
+ # received_ws.should =~ messages
75
81
  end
76
82
  end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Firehose::Default do
4
+ it "should have 7474 for default port" do
5
+ Firehose::Default::URI.to_s.should == '//127.0.0.1:7474'
6
+ end
7
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firehose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-04-28 00:00:00.000000000 Z
13
+ date: 2012-05-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: eventmachine
17
- requirement: &70182613622860 !ruby/object:Gem::Requirement
17
+ requirement: &70150665890720 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.0.0.beta
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70182613622860
25
+ version_requirements: *70150665890720
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: amqp
28
- requirement: &70182613621920 !ruby/object:Gem::Requirement
28
+ requirement: &70150665887200 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 0.9.4
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70182613621920
36
+ version_requirements: *70150665887200
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: thin
39
- requirement: &70182613620960 !ruby/object:Gem::Requirement
39
+ requirement: &70150665886040 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *70182613620960
47
+ version_requirements: *70150665886040
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: thor
50
- requirement: &70182613619960 !ruby/object:Gem::Requirement
50
+ requirement: &70150665884200 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *70182613619960
58
+ version_requirements: *70150665884200
59
59
  - !ruby/object:Gem::Dependency
60
- name: websocket-rack
61
- requirement: &70182613619120 !ruby/object:Gem::Requirement
60
+ name: faraday
61
+ requirement: &70150665882880 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :runtime
68
68
  prerelease: false
69
- version_requirements: *70182613619120
69
+ version_requirements: *70150665882880
70
70
  - !ruby/object:Gem::Dependency
71
- name: faraday
72
- requirement: &70182613617780 !ruby/object:Gem::Requirement
71
+ name: websocket-rack
72
+ requirement: &70150665927120 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,21 +77,21 @@ dependencies:
77
77
  version: '0'
78
78
  type: :runtime
79
79
  prerelease: false
80
- version_requirements: *70182613617780
80
+ version_requirements: *70150665927120
81
81
  - !ruby/object:Gem::Dependency
82
- name: rspec
83
- requirement: &70182613617160 !ruby/object:Gem::Requirement
82
+ name: em-http-request
83
+ requirement: &70150665926500 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
- - - ! '>='
86
+ - - ~>
87
87
  - !ruby/object:Gem::Version
88
- version: '0'
89
- type: :development
88
+ version: 1.0.0
89
+ type: :runtime
90
90
  prerelease: false
91
- version_requirements: *70182613617160
91
+ version_requirements: *70150665926500
92
92
  - !ruby/object:Gem::Dependency
93
- name: rack-test
94
- requirement: &70182613615900 !ruby/object:Gem::Requirement
93
+ name: rspec
94
+ requirement: &70150665926040 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,10 +99,10 @@ dependencies:
99
99
  version: '0'
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *70182613615900
102
+ version_requirements: *70150665926040
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: guard-rspec
105
- requirement: &70182613629800 !ruby/object:Gem::Requirement
105
+ requirement: &70150665925480 !ruby/object:Gem::Requirement
106
106
  none: false
107
107
  requirements:
108
108
  - - ! '>='
@@ -110,10 +110,10 @@ dependencies:
110
110
  version: '0'
111
111
  type: :development
112
112
  prerelease: false
113
- version_requirements: *70182613629800
113
+ version_requirements: *70150665925480
114
114
  - !ruby/object:Gem::Dependency
115
115
  name: guard-bundler
116
- requirement: &70182613627180 !ruby/object:Gem::Requirement
116
+ requirement: &70150665924560 !ruby/object:Gem::Requirement
117
117
  none: false
118
118
  requirements:
119
119
  - - ! '>='
@@ -121,21 +121,21 @@ dependencies:
121
121
  version: '0'
122
122
  type: :development
123
123
  prerelease: false
124
- version_requirements: *70182613627180
124
+ version_requirements: *70150665924560
125
125
  - !ruby/object:Gem::Dependency
126
- name: em-http-request
127
- requirement: &70182613625900 !ruby/object:Gem::Requirement
126
+ name: guard-coffeescript
127
+ requirement: &70150665923840 !ruby/object:Gem::Requirement
128
128
  none: false
129
129
  requirements:
130
- - - ~>
130
+ - - ! '>='
131
131
  - !ruby/object:Gem::Version
132
- version: 0.3.0
132
+ version: '0'
133
133
  type: :development
134
134
  prerelease: false
135
- version_requirements: *70182613625900
135
+ version_requirements: *70150665923840
136
136
  - !ruby/object:Gem::Dependency
137
- name: guard-coffeescript
138
- requirement: &70182613624400 !ruby/object:Gem::Requirement
137
+ name: em-websocket-client
138
+ requirement: &70150665921360 !ruby/object:Gem::Requirement
139
139
  none: false
140
140
  requirements:
141
141
  - - ! '>='
@@ -143,7 +143,7 @@ dependencies:
143
143
  version: '0'
144
144
  type: :development
145
145
  prerelease: false
146
- version_requirements: *70182613624400
146
+ version_requirements: *70150665921360
147
147
  description: Firehose is a realtime web application toolkit for building realtime
148
148
  Ruby web applications.
149
149
  email:
@@ -158,6 +158,7 @@ files:
158
158
  - .rbenv-version
159
159
  - .rspec
160
160
  - Gemfile
161
+ - Guardfile
161
162
  - Procfile
162
163
  - README.md
163
164
  - Rakefile
@@ -173,13 +174,15 @@ files:
173
174
  - lib/assets/javascripts/firehose/web_socket.js.coffee
174
175
  - lib/firehose.rb
175
176
  - lib/firehose/cli.rb
176
- - lib/firehose/http_publisher.rb
177
+ - lib/firehose/default.rb
178
+ - lib/firehose/producer.rb
177
179
  - lib/firehose/publisher.rb
178
180
  - lib/firehose/rack.rb
179
181
  - lib/firehose/subscription.rb
180
182
  - lib/firehose/version.rb
181
183
  - spec/integrations/amqp_resources_spec.rb
182
184
  - spec/integrations/thin_spec.rb
185
+ - spec/lib/default_spec.rb
183
186
  - spec/spec_helper.rb
184
187
  homepage: http://firehose.io/
185
188
  licenses: []
@@ -208,4 +211,5 @@ summary: Build realtime Ruby web applications
208
211
  test_files:
209
212
  - spec/integrations/amqp_resources_spec.rb
210
213
  - spec/integrations/thin_spec.rb
214
+ - spec/lib/default_spec.rb
211
215
  - spec/spec_helper.rb
@@ -1,32 +0,0 @@
1
- require "net/http"
2
- require "uri"
3
-
4
- module Firehose
5
- class HttpPublisher
6
- attr_reader :uri
7
-
8
- class RequestBuilder
9
- attr_reader :uri, :message, :channel
10
-
11
- def initialize(uri, message)
12
- @uri, @message = uri, message
13
- end
14
-
15
- def to(channel)
16
- req = Net::HTTP::Put.new(channel)
17
- req.body = message
18
- res = Net::HTTP.start(uri.host, uri.port) do |http|
19
- response = http.request(req)
20
- end
21
- end
22
- end
23
-
24
- def initialize(uri)
25
- @uri = URI.parse(uri)
26
- end
27
-
28
- def publish(message)
29
- RequestBuilder.new(uri, message)
30
- end
31
- end
32
- end