firering 0.1.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,206 @@
1
+ require 'spec_helper'
2
+
3
+ describe Firering::Room do
4
+
5
+ it "gets a single room" do
6
+ EM.run {
7
+ conn.room(304355) do |room|
8
+
9
+ room.name.should == "test2"
10
+ room.created_at.should == Date.parse("2010/05/29 21:38:02 +0000")
11
+ room.updated_at.should == Date.parse("2010/05/29 21:38:02 +0000")
12
+ room.topic.should == "this and the test room should be deleted by a campfire admin."
13
+ room.should_not be_full
14
+ room.id.should == 304355
15
+ room.should_not be_open_to_guests
16
+ room.membership_limit.should == 12
17
+ room.should_not be_locked
18
+
19
+ room.users do |users|
20
+ users.each do |u|
21
+ u.should be_an_instance_of(Firering::User)
22
+ end
23
+ end
24
+
25
+ EM.stop
26
+ end
27
+ }
28
+ end
29
+
30
+ it "gets all rooms" do
31
+ EM.run {
32
+ conn.rooms do |rooms|
33
+ rooms.each do |room|
34
+ room.should be_an_instance_of(Firering::Room)
35
+ room.users do |users|
36
+ users.should be_an_instance_of(Array)
37
+ users.should_not be_empty
38
+ end
39
+ end
40
+ EM.stop
41
+ end
42
+ }
43
+ end
44
+
45
+ it "updates a room and then calls the block" do
46
+ EM.run {
47
+ conn.room(304355) do |room|
48
+ room.update(:topic => "some topic") do
49
+ EM.stop
50
+ end
51
+ end
52
+ }
53
+ end
54
+
55
+ it "returns the messages of today for a given room" do
56
+ EM.run {
57
+ conn.room(304355) do |room|
58
+ room.today_transcript do |messages|
59
+ messages.length.should == 33
60
+
61
+ messages.each do |m|
62
+ m.should be_an_instance_of(Firering::Message)
63
+ end
64
+
65
+ message = messages.last
66
+
67
+ message.should be_paste
68
+ message.room_id.should == 304355
69
+ message.created_at.should == Date.parse("2010/05/29 22:41:34 +0000")
70
+ message.body.should == "paste\ntext"
71
+ message.id.should == 224590114
72
+ message.user_id.should == 415731
73
+
74
+ EM.stop
75
+ end
76
+ end
77
+ }
78
+ end
79
+
80
+ it "returns the messages of an specific date for a given room" do
81
+ EM.run {
82
+ conn.room(304355) do |room|
83
+ room.transcript(2010, 12, 12) do |messages|
84
+
85
+ messages.length.should == 33
86
+
87
+ messages.each do |m|
88
+ m.should be_an_instance_of(Firering::Message)
89
+ end
90
+
91
+ message = messages.last
92
+
93
+ message.should be_paste
94
+ message.room_id.should == 304355
95
+ message.created_at.should == Date.parse("2010/05/29 22:41:34 +0000")
96
+ message.body.should == "paste\ntext"
97
+ message.id.should == 224590114
98
+ message.user_id.should == 415731
99
+
100
+ EM.stop
101
+ end
102
+ end
103
+ }
104
+ end
105
+
106
+ it "joins a room" do
107
+ EM.run {
108
+ conn.room(304355) { |room|
109
+ room.join {
110
+ EM.stop
111
+ }
112
+ }
113
+ }
114
+ end
115
+
116
+ it "leaves a room" do
117
+ EM.run {
118
+ conn.room(304355) { |room|
119
+ room.leave {
120
+ EM.stop
121
+ }
122
+ }
123
+ }
124
+ end
125
+
126
+ it "unlocks a room an call a block" do
127
+ EM.run {
128
+ conn.room(304355) { |room|
129
+ room.unlock {
130
+ EM.stop
131
+ }
132
+ }
133
+ }
134
+ end
135
+
136
+ it "locks a room an call a block" do
137
+ EM.run {
138
+ conn.room(304355) { |room|
139
+ room.lock {
140
+ EM.stop
141
+ }
142
+ }
143
+ }
144
+ end
145
+
146
+ it "is able to speak a text message" do
147
+ EM.run {
148
+ conn.room(304355) { |room|
149
+ room.text("some text") {
150
+ EM.stop
151
+ }
152
+ }
153
+ }
154
+ end
155
+
156
+ it "is able to speak a paste message" do
157
+ EM.run {
158
+ conn.room(304355) { |room|
159
+ room.paste("some\ntext") {
160
+ EM.stop
161
+ }
162
+ }
163
+ }
164
+ end
165
+
166
+ it "is able to speak a tweet" do
167
+ EM.run {
168
+ conn.room(304355) { |room|
169
+ room.tweet("http://twitter.com/message") {
170
+ EM.stop
171
+ }
172
+ }
173
+ }
174
+ end
175
+
176
+ it "is able to play a rimshot" do
177
+ EM.run {
178
+ conn.room(304355) { |room|
179
+ room.rimshot {
180
+ EM.stop
181
+ }
182
+ }
183
+ }
184
+ end
185
+
186
+ it "is able to play crickets" do
187
+ EM.run {
188
+ conn.room(304355) { |room|
189
+ room.crickets {
190
+ EM.stop
191
+ }
192
+ }
193
+ }
194
+ end
195
+
196
+ it "is able to play a trombone" do
197
+ EM.run {
198
+ conn.room(304355) { |room|
199
+ room.trombone {
200
+ EM.stop
201
+ }
202
+ }
203
+ }
204
+ end
205
+
206
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Firering::User do
4
+
5
+ it "gets a user info" do
6
+ EM.run {
7
+ conn.user(415731) do |user|
8
+
9
+ user.type.should == "Member"
10
+ user.created_at.should == Date.parse("2009/01/27 19:54:36 +0000")
11
+ user.email_address.should == "eoga@mail.com"
12
+ user.should_not be_admin
13
+ user.id.should == 415731
14
+ user.name.should == "Emmanuel"
15
+
16
+ EM.stop
17
+ end
18
+ }
19
+ end
20
+
21
+ end
@@ -1,21 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  class TestData < Firering::Data
4
- key :a, :b
4
+ data_attributes :a, :b
5
5
  end
6
6
 
7
7
  describe Firering::Data do
8
8
 
9
- it "can be initialized from a hash" do
10
- object = TestData.new({:testdata => { :a => 1, :b => 2}}, :testdata)
11
- object.a.should == 1
12
- object.b.should == 2
13
- end
14
-
15
- it "can be initialized from a json string" do
16
- object = TestData.new('{"testdata" : { "a" : 1, "b" : 2}}', :testdata)
9
+ it "initializes an object from a hash with a base key, and defines accessors" do
10
+ object = TestData.instantiate(:connection, {:test_data => { :a => 1, :b => 2}}, :test_data)
17
11
  object.a.should == 1
18
12
  object.b.should == 2
13
+ object.connection.should == :connection
19
14
  end
20
15
 
21
16
  end
@@ -1,31 +1,58 @@
1
1
  require 'open-uri'
2
2
 
3
- server_file = File.join(File.dirname(__FILE__), 'server.rb')
3
+ class MyLogger < Logger
4
+ alias write <<
5
+ end
4
6
 
5
- port = 4567
7
+ class FixtureServer < Struct.new(:logger)
8
+ def call(env)
9
+ req = Rack::Request.new(env)
10
+ res = Rack::Response.new
11
+ res.write read_fixture(req)
12
+ res.finish
13
+ end
6
14
 
7
- pid = fork do
8
- exec("`which ruby` #{server_file}")
15
+ def read_fixture(req)
16
+ return "It Works!" if req.path == "" || req.path == "/"
17
+ fixture = ([req.request_method.to_s.downcase] + req.path.split("/")).join("_").squeeze("_").gsub(/\d+/, "ID")
18
+ path = File.expand_path(File.join(File.dirname(__FILE__), "json", fixture))
19
+ logger.info("opening fixture: #{path}, #{File.file?(path)}")
20
+ output = File.file?(path) ? File.read(path) : "FIXTURE NOT FOUND #{path}"
21
+ logger.info("\n\n#{output}\n")
22
+ output
23
+ end
9
24
  end
10
25
 
11
- start = Time.now
12
- spawned = false
13
-
14
- while Time.now - start < 5
15
- begin
16
- open(URI("http://localhost:#{port}/"))
17
- rescue Errno::ECONNREFUSED
18
- sleep 1
19
- rescue OpenURI::HTTPError
20
- spawned = true
21
- break
26
+ def start_fixtures_server(port)
27
+ pid = fork do
28
+ require 'rack'
29
+ require 'logger'
30
+
31
+ $stdout = $stderr = File.open("/dev/null", "w")
32
+
33
+ logger = MyLogger.new(File.join(File.dirname(__FILE__), '..', '..', 'log', "specs.log"))
34
+ logger.info("\n#{'-'*80}\n")
35
+
36
+ app = FixtureServer.new(logger)
37
+ app = Rack::ShowStatus.new(Rack::ShowExceptions.new(app))
38
+ app = Rack::CommonLogger.new(app, logger)
39
+
40
+ Rack::Handler::WEBrick.run app, :Port => $specs_port
22
41
  end
23
- end
24
42
 
25
- unless spawned
26
- raise "Could not run the fixtures server"
27
- end
43
+ spawned, start = false, Time.now
44
+
45
+ while Time.now - start < 5
46
+ begin
47
+ open(URI("http://localhost:#{$specs_port}/"))
48
+ rescue
49
+ sleep 1
50
+ else
51
+ break spawned = true
52
+ end
53
+ end
54
+
55
+ raise "Could not run the fixtures server" unless spawned
28
56
 
29
- at_exit do
30
- Process.kill(:KILL, pid) if pid
57
+ pid
31
58
  end
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,18 @@ require 'firering'
5
5
  require 'spec'
6
6
  require 'spec/autorun'
7
7
  require 'fixtures/load_server'
8
+ require 'support/helpers'
9
+ require 'ap'
8
10
 
9
11
  Spec::Runner.configure do |config|
12
+ config.include Helpers
13
+
14
+ config.before :all do
15
+ $specs_logger = Logger.new(File.join(File.dirname(__FILE__), '..', 'log', "specs.log"))
16
+ $pid = start_fixtures_server($specs_port = 8909)
17
+ end
18
+
19
+ config.after :all do
20
+ Process.kill(:KILL, $pid) if $pid
21
+ end
10
22
  end
@@ -0,0 +1,11 @@
1
+ module Helpers
2
+
3
+ def conn
4
+ @conn ||= Firering::Connection.new("http://localhost:#{$specs_port}", "http://localhost:#{$specs_port}") do |conn|
5
+ conn.logger = $specs_logger
6
+ conn.login = "user"
7
+ conn.password = "password"
8
+ end
9
+ end
10
+
11
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firering
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
- - 0
8
- - 1
9
7
  - 1
10
- version: 0.1.1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Emmanuel Oga
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-08 00:00:00 -03:00
18
+ date: 2010-08-16 00:00:00 -03:00
19
19
  default_executable: campf-notify
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -119,16 +119,19 @@ files:
119
119
  - examples/update_room.rb
120
120
  - firering.gemspec
121
121
  - lib/firering.rb
122
+ - lib/firering/connection.rb
122
123
  - lib/firering/data.rb
123
124
  - lib/firering/data/message.rb
124
125
  - lib/firering/data/room.rb
125
126
  - lib/firering/data/upload.rb
126
127
  - lib/firering/data/user.rb
127
- - lib/firering/http.rb
128
128
  - lib/firering/requests.rb
129
- - lib/firering/streaming.rb
129
+ - log/.gitignore
130
+ - spec/firering/connection_spec.rb
131
+ - spec/firering/data/message_spec.rb
132
+ - spec/firering/data/room_spec.rb
133
+ - spec/firering/data/user_spec.rb
130
134
  - spec/firering/data_spec.rb
131
- - spec/firering/requests_spec.rb
132
135
  - spec/fixtures/headers/delete_messages_ID_star.json
133
136
  - spec/fixtures/headers/get_room_ID.json
134
137
  - spec/fixtures/headers/get_room_ID_live.json
@@ -166,8 +169,8 @@ files:
166
169
  - spec/fixtures/json/put_room_ID.json
167
170
  - spec/fixtures/load_server.rb
168
171
  - spec/fixtures/retrieve.rb
169
- - spec/fixtures/server.rb
170
172
  - spec/spec_helper.rb
173
+ - spec/support/helpers.rb
171
174
  has_rdoc: true
172
175
  homepage: http://github.com/EmmanuelOga/firering
173
176
  licenses: []
@@ -203,8 +206,11 @@ signing_key:
203
206
  specification_version: 2
204
207
  summary: Campfire API interface powered by EventMachine and Yajl.
205
208
  test_files:
209
+ - spec/firering/connection_spec.rb
210
+ - spec/firering/data/message_spec.rb
211
+ - spec/firering/data/room_spec.rb
212
+ - spec/firering/data/user_spec.rb
206
213
  - spec/firering/data_spec.rb
207
- - spec/firering/requests_spec.rb
208
214
  - spec/fixtures/headers/delete_messages_ID_star.json
209
215
  - spec/fixtures/headers/get_room_ID.json
210
216
  - spec/fixtures/headers/get_room_ID_live.json
@@ -242,5 +248,5 @@ test_files:
242
248
  - spec/fixtures/json/put_room_ID.json
243
249
  - spec/fixtures/load_server.rb
244
250
  - spec/fixtures/retrieve.rb
245
- - spec/fixtures/server.rb
246
251
  - spec/spec_helper.rb
252
+ - spec/support/helpers.rb
data/lib/firering/http.rb DELETED
@@ -1,53 +0,0 @@
1
- module Firering
2
- module HTTP
3
- extend self
4
-
5
- attr_accessor :host, :retry_delay
6
-
7
- HTTP.host = "campfirenow.com"
8
- HTTP.retry_delay = 2
9
-
10
- # helper to perform an http request following redirects
11
- def http(method, path, data = nil, user = Firering.token, password = "X", &block)
12
-
13
- if (path =~ /^http/)
14
- url = path
15
- else
16
- # handle nil subdomain for testing (e.g a fake localhost campfire server)
17
- url = "http://#{[Firering.subdomain, HTTP.host].compact.join(".")}#{path}"
18
- end
19
-
20
- parameters = { :head => {'authorization' => [user, password], "Content-Type" => "application/json" } }
21
- parameters.merge!(:body => data.is_a?(String) ? data : Yajl::Encoder.encode(data)) if data
22
-
23
- http = EventMachine::HttpRequest.new(url).send method, parameters
24
-
25
- http.errback do
26
- if EventMachine.reactor_running?
27
- puts "Error: #{http.error}. Trying again in #{HTTP.retry_delay} seconds..."
28
-
29
- EventMachine::add_timer(HTTP.retry_delay) do
30
- puts "reconnecting"
31
- http(method, path, data, user, password, &block)
32
- end
33
- else
34
- raise Firering::Error, "#{http.error}\n#{url}, #{method}, #{parameters.inspect}\n#{http.response_header.status}\n#{http.response}"
35
- end
36
- end
37
-
38
- http.callback do
39
- case http.response_header.status.to_s
40
- when /^2../
41
- block.call(http)
42
- when "302"
43
- http(method, http.response_header["Location"], user, password, &block) # follow redirects
44
- else
45
- raise Firering::Error, "#{http.error}\n#{url}, #{method}, #{parameters.inspect}\n#{http.response_header.status}\n#{http.response}"
46
- end
47
- end
48
-
49
- http
50
- end
51
-
52
- end
53
- end
@@ -1,51 +0,0 @@
1
- module Firering
2
- module Streaming
3
- extend self
4
-
5
- attr_accessor :protocol, :host, :reconnect_delay
6
-
7
- Streaming.host = "streaming.campfirenow.com"
8
- Streaming.protocol = "https"
9
- Streaming.reconnect_delay = 5
10
-
11
- # Streaming
12
- #
13
- # The Streaming API allows you to monitor a room in real time. The
14
- # authenticated user must already have joined the room in order to use this
15
- # API.
16
- def stream(room_id, url = nil, &block)
17
- parser = Yajl::Parser.new(:symbolize_keys => true)
18
-
19
- parser.on_parse_complete = proc do |hash|
20
- block.call(Firering::Message.new(hash))
21
- end
22
-
23
- url ||= "#{Streaming.protocol}://#{Streaming.host}/room/#{room_id}/live.json"
24
-
25
- params = { :head => {'authorization' => [Firering.token, "X"], "Content-Type" => "application/json" } }
26
-
27
- http = EventMachine::HttpRequest.new(url).get(params)
28
-
29
- http.stream { |chunk| parser << chunk }
30
-
31
- # campfire servers will try to hold the streaming connections open indefinitely.
32
- # However, API clients must be able to handle occasional timeouts or
33
- # disruptions. Upon unexpected disconnection, API clients should wait for a
34
- # few seconds before trying to reconnect. Formats
35
- http.errback do
36
- if EventMachine.reactor_running?
37
- puts "Error: #{http.error}. Reconnecting in #{Streaming.reconnect_delay} seconds..."
38
-
39
- EventMachine::add_timer(Streaming.reconnect_delay) do
40
- puts "reconnecting"
41
- stream(room_id, url, &block)
42
- end
43
- else
44
- puts "EventMachine loop stopped."
45
- end
46
- end
47
- end
48
-
49
- end
50
- end
51
-