tinder 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +5 -1
- data/Manifest.txt +0 -3
- data/lib/tinder.rb +4 -1
- data/lib/tinder/campfire.rb +50 -12
- data/lib/tinder/room.rb +33 -5
- data/lib/tinder/version.rb +1 -1
- data/test/remote/remote_campfire_test.rb +16 -6
- data/test/unit/room_test.rb +30 -0
- metadata +13 -12
- data/test/test_helper.rb +0 -7
- data/test/unit/campfire_test.rb +0 -61
data/CHANGELOG.txt
CHANGED
data/Manifest.txt
CHANGED
data/lib/tinder.rb
CHANGED
data/lib/tinder/campfire.rb
CHANGED
@@ -11,7 +11,7 @@ module Tinder
|
|
11
11
|
attr_reader :subdomain, :uri
|
12
12
|
|
13
13
|
# Create a new connection to the campfire account with the given +subdomain+.
|
14
|
-
# There's an
|
14
|
+
# There's an +:ssl+ option to use SSL for the connection.
|
15
15
|
#
|
16
16
|
# c = Tinder::Campfire.new("mysubdomain", :ssl => true)
|
17
17
|
def initialize(subdomain, options = {})
|
@@ -23,11 +23,15 @@ module Tinder
|
|
23
23
|
|
24
24
|
# Log in to campfire using your +email+ and +password+
|
25
25
|
def login(email, password)
|
26
|
-
|
26
|
+
unless verify_response(post("login", :email_address => email, :password => password), :redirect_to => url_for(:only_path => false))
|
27
|
+
raise Error, "Campfire login failed"
|
28
|
+
end
|
29
|
+
@logged_in = true
|
27
30
|
end
|
28
31
|
|
32
|
+
# Returns true when successfully logged in
|
29
33
|
def logged_in?
|
30
|
-
@logged_in
|
34
|
+
@logged_in === true
|
31
35
|
end
|
32
36
|
|
33
37
|
def logout
|
@@ -35,16 +39,27 @@ module Tinder
|
|
35
39
|
@logged_in = !result
|
36
40
|
end
|
37
41
|
end
|
42
|
+
|
43
|
+
# Get an array of all the available rooms
|
44
|
+
# TODO: detect rooms that are full (no link)
|
45
|
+
def rooms
|
46
|
+
Hpricot(get.body).search("//h2/a").collect do |a|
|
47
|
+
Room.new(self, room_id_from_url(a.attributes['href']), a.inner_html)
|
48
|
+
end
|
49
|
+
end
|
38
50
|
|
51
|
+
# Find a campfire room by name
|
52
|
+
def find_room_by_name(name)
|
53
|
+
rooms.detect {|room| room.name == name }
|
54
|
+
end
|
55
|
+
|
39
56
|
# Creates and returns a new Room with the given +name+ and optionally a +topic+
|
40
57
|
def create_room(name, topic = nil)
|
41
58
|
find_room_by_name(name) if verify_response(post("account/create/room?from=lobby", {:room => {:name => name, :topic => topic}}, :ajax => true), :success)
|
42
59
|
end
|
43
60
|
|
44
|
-
|
45
|
-
|
46
|
-
link = Hpricot(get.body).search("//h2/a").detect { |a| a.inner_html == name }
|
47
|
-
link.blank? ? nil : Room.new(self, link.attributes['href'].scan(/room\/(\d*)$/).to_s, name)
|
61
|
+
def find_or_create_room_by_name(name)
|
62
|
+
find_room_by_name(name) || create_room(name)
|
48
63
|
end
|
49
64
|
|
50
65
|
# List the users that are currently chatting in any room
|
@@ -56,7 +71,23 @@ module Tinder
|
|
56
71
|
end
|
57
72
|
users.flatten.compact.uniq.sort
|
58
73
|
end
|
59
|
-
|
74
|
+
|
75
|
+
# Get the dates of the available transcripts by room
|
76
|
+
#
|
77
|
+
# campfire.available_transcripts
|
78
|
+
# #=> {"15840" => [#<Date: 4908311/2,0,2299161>, #<Date: 4908285/2,0,2299161>]}
|
79
|
+
#
|
80
|
+
def available_transcripts(room = nil)
|
81
|
+
url = "files%2Btranscripts"
|
82
|
+
url += "?room_id#{room}" if room
|
83
|
+
transcripts = (Hpricot(get(url).body) / ".transcript").inject({}) do |result,transcript|
|
84
|
+
link = (transcript / "a").first.attributes['href']
|
85
|
+
(result[room_id_from_url(link)] ||= []) << Date.parse(link.scan(/\/transcript\/(\d{4}\/\d{2}\/\d{2})/).to_s)
|
86
|
+
result
|
87
|
+
end
|
88
|
+
room ? transcripts[room.to_s] : transcripts
|
89
|
+
end
|
90
|
+
|
60
91
|
# Deprecated: only included for backwards compatability
|
61
92
|
def host #:nodoc:
|
62
93
|
uri.host
|
@@ -68,9 +99,15 @@ module Tinder
|
|
68
99
|
end
|
69
100
|
|
70
101
|
private
|
102
|
+
|
103
|
+
def room_id_from_url(url)
|
104
|
+
url.scan(/room\/(\d*)/).to_s
|
105
|
+
end
|
71
106
|
|
72
|
-
def url_for(
|
73
|
-
|
107
|
+
def url_for(*args)
|
108
|
+
options = {:only_path => true}.merge(args.last.is_a?(Hash) ? args.pop : {})
|
109
|
+
path = args.shift
|
110
|
+
"#{options[:only_path] ? '' : uri}/#{path}"
|
74
111
|
end
|
75
112
|
|
76
113
|
def post(path, data = {}, options = {})
|
@@ -88,6 +125,7 @@ module Tinder
|
|
88
125
|
|
89
126
|
def prepare_request(request, options = {})
|
90
127
|
returning request do
|
128
|
+
request.add_field 'User-Agent', "Tinder/#{Tinder::VERSION::STRING} (http://tinder.rubyforge.org)"
|
91
129
|
request.add_field 'Cookie', @cookie if @cookie
|
92
130
|
if options[:ajax]
|
93
131
|
request.add_field 'X-Requested-With', 'XMLHttpRequest'
|
@@ -106,7 +144,7 @@ module Tinder
|
|
106
144
|
end
|
107
145
|
end
|
108
146
|
|
109
|
-
# flatten a nested hash
|
147
|
+
# flatten a nested hash (:room => {:name => 'foobar'} to 'user[name]' => 'foobar')
|
110
148
|
def flatten(params)
|
111
149
|
params = params.dup
|
112
150
|
params.stringify_keys!.each do |k,v|
|
@@ -131,6 +169,6 @@ module Tinder
|
|
131
169
|
false
|
132
170
|
end
|
133
171
|
end
|
134
|
-
|
172
|
+
|
135
173
|
end
|
136
174
|
end
|
data/lib/tinder/room.rb
CHANGED
@@ -12,31 +12,37 @@ module Tinder
|
|
12
12
|
# Join the room. Pass +true+ to join even if you've already joined.
|
13
13
|
def join(force = false)
|
14
14
|
@room = returning(get("room/#{id}")) do |room|
|
15
|
-
|
15
|
+
raise Error, "Could not join room" unless verify_response(room, :success)
|
16
16
|
@membership_key = room.body.scan(/\"membershipKey\": \"([a-z0-9]+)\"/).to_s
|
17
17
|
@user_id = room.body.scan(/\"userID\": (\d+)/).to_s
|
18
18
|
@last_cache_id = room.body.scan(/\"lastCacheID\": (\d+)/).to_s
|
19
19
|
@timestamp = room.body.scan(/\"timestamp\": (\d+)/).to_s
|
20
|
-
end
|
20
|
+
end if @room.nil? || force
|
21
21
|
true
|
22
22
|
end
|
23
23
|
|
24
24
|
# Leave a room
|
25
25
|
def leave
|
26
|
-
returning verify_response(
|
26
|
+
returning verify_response(post("room/#{id}/leave"), :redirect) do
|
27
27
|
@room, @membership_key, @user_id, @last_cache_id, @timestamp = nil
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
# Toggle guest access on or off
|
32
32
|
def toggle_guest_access
|
33
|
-
|
33
|
+
# re-join the room to get the guest url
|
34
|
+
verify_response(post("room/#{id}/toggle_guest_access"), :success) && join(true)
|
34
35
|
end
|
35
36
|
|
36
37
|
# Get the url for guest access
|
37
38
|
def guest_url
|
38
39
|
join
|
39
|
-
(Hpricot(@room.body)/"#guest_access h4").first
|
40
|
+
link = (Hpricot(@room.body)/"#guest_access h4").first
|
41
|
+
link.inner_html if link
|
42
|
+
end
|
43
|
+
|
44
|
+
def guest_access_enabled?
|
45
|
+
!guest_url.nil?
|
40
46
|
end
|
41
47
|
|
42
48
|
# The invite code use for guest
|
@@ -136,6 +142,28 @@ module Tinder
|
|
136
142
|
end
|
137
143
|
messages
|
138
144
|
end
|
145
|
+
|
146
|
+
# Get the dates for the available transcripts for this room
|
147
|
+
def available_transcripts
|
148
|
+
@campfire.available_transcripts(id)
|
149
|
+
end
|
150
|
+
|
151
|
+
# Get the transcript for the given date (Returns a hash in the same format as #listen)
|
152
|
+
#
|
153
|
+
# room.transcript(room.available_transcripts.first)
|
154
|
+
# #=> [{:message=>"foobar!", :user_id=>"99999", :person=>"Brandon", :id=>"18659245"}]
|
155
|
+
#
|
156
|
+
def transcript(date)
|
157
|
+
(Hpricot(get("room/#{id}/transcript/#{date.to_date.strftime('%Y/%m/%d')}").body) / ".message").collect do |message|
|
158
|
+
person = (message / '.person span').first
|
159
|
+
body = (message / '.body div').first
|
160
|
+
{:id => message.attributes['id'].scan(/message_(\d+)/).to_s,
|
161
|
+
:person => person ? person.inner_html : nil,
|
162
|
+
:user_id => message.attributes['class'].scan(/user_(\d+)/).to_s,
|
163
|
+
:message => body ? body.inner_html : nil
|
164
|
+
}
|
165
|
+
end
|
166
|
+
end
|
139
167
|
|
140
168
|
private
|
141
169
|
|
data/lib/tinder/version.rb
CHANGED
@@ -3,24 +3,34 @@ require File.dirname(__FILE__) + '/../test_helper'
|
|
3
3
|
class RemoteCampfireTest < Test::Unit::TestCase
|
4
4
|
|
5
5
|
def setup
|
6
|
-
@campfire = Tinder::Campfire.new '
|
7
|
-
|
6
|
+
@campfire = Tinder::Campfire.new 'domain'
|
7
|
+
#@user, @pass = 'email@example.com', 'password'
|
8
|
+
raise "Set your campfire credentials before running the remote tests" unless @user && @pass
|
8
9
|
end
|
9
10
|
|
10
11
|
def test_create_and_delete_room
|
11
12
|
assert login
|
12
|
-
|
13
|
+
assert @campfire.logged_in?
|
13
14
|
|
14
|
-
|
15
|
+
room = @campfire.create_room("Testing#{Time.now.to_i}")
|
16
|
+
|
17
|
+
assert_instance_of Tinder::Room, room
|
15
18
|
assert_not_nil room.id
|
16
|
-
|
19
|
+
|
20
|
+
room.name = "new name"
|
21
|
+
assert_equal "new name", room.name
|
17
22
|
|
18
23
|
room.destroy
|
19
|
-
assert_nil @campfire.find_room_by_name(
|
24
|
+
assert_nil @campfire.find_room_by_name(room.name)
|
25
|
+
|
26
|
+
assert @campfire.logout
|
27
|
+
ensure
|
28
|
+
room.destroy rescue nil
|
20
29
|
end
|
21
30
|
|
22
31
|
def test_failed_login
|
23
32
|
assert !@campfire.login(@user, 'notmypassword')
|
33
|
+
assert !@campfire.logged_in?
|
24
34
|
end
|
25
35
|
|
26
36
|
def test_find_nonexistent_room
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class RoomTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@campfire = Tinder::Campfire.new("foobar")
|
7
|
+
@room = Tinder::Room.new(@campfire, 1, "Room 1")
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_toggle_guest_access_rejoins_room
|
11
|
+
@response = mock("response")
|
12
|
+
@response.expects(:code).returns("200")
|
13
|
+
@campfire.expects(:post).with('room/1/toggle_guest_access').returns(@response)
|
14
|
+
@campfire.expects(:get).with('room/1').returns(@response)
|
15
|
+
@room.toggle_guest_access
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_guest_access?
|
19
|
+
mock_response :guest_access_enabled
|
20
|
+
assert @room.guest_access_enabled?
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def mock_response(response)
|
26
|
+
FakeWeb.register_uri('http://foobar.campfirenow.com/room/1',
|
27
|
+
:file => "#{FIXTURE_DIR}/pages/room/#{response}.html")
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.2
|
3
3
|
specification_version: 1
|
4
4
|
name: tinder
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.1.4
|
7
|
+
date: 2007-07-23 00:00:00 +03:00
|
8
8
|
summary: An (unofficial) Campfire API
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -25,6 +25,7 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
25
|
platform: ruby
|
26
26
|
signing_key:
|
27
27
|
cert_chain:
|
28
|
+
post_install_message:
|
28
29
|
authors:
|
29
30
|
- Brandon Keepers
|
30
31
|
files:
|
@@ -37,16 +38,16 @@ files:
|
|
37
38
|
- lib/tinder/campfire.rb
|
38
39
|
- lib/tinder/room.rb
|
39
40
|
- lib/tinder/version.rb
|
40
|
-
- test/remote/remote_campfire_test.rb
|
41
|
-
- test/test_helper.rb
|
42
|
-
- test/unit/campfire_test.rb
|
43
41
|
test_files:
|
44
42
|
- test/remote/remote_campfire_test.rb
|
45
|
-
- test/unit/
|
46
|
-
rdoc_options:
|
47
|
-
|
48
|
-
|
49
|
-
|
43
|
+
- test/unit/room_test.rb
|
44
|
+
rdoc_options:
|
45
|
+
- --main
|
46
|
+
- README.txt
|
47
|
+
extra_rdoc_files:
|
48
|
+
- CHANGELOG.txt
|
49
|
+
- Manifest.txt
|
50
|
+
- README.txt
|
50
51
|
executables: []
|
51
52
|
|
52
53
|
extensions: []
|
@@ -79,5 +80,5 @@ dependencies:
|
|
79
80
|
requirements:
|
80
81
|
- - ">="
|
81
82
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.1
|
83
|
+
version: 1.2.1
|
83
84
|
version:
|
data/test/test_helper.rb
DELETED
data/test/unit/campfire_test.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
-
|
3
|
-
class CampfireTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
def setup
|
6
|
-
@campfire = Tinder::Campfire.new("foobar")
|
7
|
-
@response = mock("response")
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_verify_response_redirect_true
|
11
|
-
@response.expects(:code).returns(302)
|
12
|
-
assert true === @campfire.send(:verify_response, @response, :redirect)
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_verify_response_redirect_false
|
16
|
-
@response.expects(:code).returns(200)
|
17
|
-
assert false === @campfire.send(:verify_response, @response, :redirect)
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_verify_response_success
|
21
|
-
@response.expects(:code).returns(200)
|
22
|
-
assert true === @campfire.send(:verify_response, @response, :success)
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_verify_response_redirect_to
|
26
|
-
@response.expects(:code).returns(304)
|
27
|
-
@response.expects(:[]).with('location').returns("/foobar")
|
28
|
-
assert true === @campfire.send(:verify_response, @response, :redirect_to => '/foobar')
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_verify_response_redirect_to_without_redirect
|
32
|
-
@response.expects(:code).returns(200)
|
33
|
-
assert false === @campfire.send(:verify_response, @response, :redirect_to => '/foobar')
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_verify_response_redirect_to_wrong_path
|
37
|
-
@response.expects(:code).returns(302)
|
38
|
-
@response.expects(:[]).with('location').returns("/baz")
|
39
|
-
assert false === @campfire.send(:verify_response, @response, :redirect_to => '/foobar')
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_prepare_request_returns_request
|
43
|
-
request = Net::HTTP::Get.new("does_not_matter")
|
44
|
-
assert_equal request, @campfire.send(:prepare_request, request)
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_prepare_request_sets_cookie
|
48
|
-
request = Net::HTTP::Get.new("does_not_matter")
|
49
|
-
@campfire.instance_variable_set("@cookie", "foobar")
|
50
|
-
assert_equal "foobar", @campfire.send(:prepare_request, request)['Cookie']
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_perform_request
|
54
|
-
response = mock("response")
|
55
|
-
Net::HTTP.any_instance.stubs(:request).returns(response)
|
56
|
-
request = Net::HTTP::Get.new("does_not_matter")
|
57
|
-
response.expects(:[]).with('set-cookie')
|
58
|
-
|
59
|
-
assert_equal response, @campfire.send(:perform_request) { request }
|
60
|
-
end
|
61
|
-
end
|