hipchat 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -1
- data/README.textile +28 -2
- data/lib/hipchat/api_version.rb +18 -0
- data/lib/hipchat/chef.rb +7 -5
- data/lib/hipchat/client.rb +1 -1
- data/lib/hipchat/rails3_tasks.rb +3 -1
- data/lib/hipchat/room.rb +72 -0
- data/lib/hipchat/version.rb +1 -1
- data/spec/hipchat_api_v2_spec.rb +60 -0
- data/spec/support/shared_contexts_for_hipchat.rb +29 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b54a53da40893dd5e1fbd4d0fafa3f75f00c685
|
4
|
+
data.tar.gz: c5f30c699dda1135934c4085faeefd3c6667a837
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a61559bdf4536909fcd9857a0f2afed9eb4ee2baf96cbe69b76a0dd4dce36f6888b7f089759189bce1a13848973c71d42cb49659f26fb75c233a9bbe1e9dbbb0
|
7
|
+
data.tar.gz: cf8f7bed717b1b5854d17b4297d680e324f131ac5d32f1ef8a509ad4fb04882a687fbb6e99156a6edf4530025b7459af5bcb6ccace87f34e5503e7295909c099
|
data/.gitignore
CHANGED
data/README.textile
CHANGED
@@ -80,12 +80,19 @@ client['my room'].history()
|
|
80
80
|
# Get history for a date in time with a particular timezone (default is latest 75 messages, timezone default is 'UTC')
|
81
81
|
client['my room'].history(:date => '2010-11-19', :timezone => 'PST')
|
82
82
|
|
83
|
+
# Get statistics from a room
|
84
|
+
client['my room'].statistics()
|
85
|
+
|
83
86
|
# Create a new room (see https://www.hipchat.com/docs/apiv2/method/create_room)
|
84
87
|
client.create_room("Name", options = {})
|
85
88
|
|
86
89
|
# Get room data (see https://www.hipchat.com/docs/apiv2/method/get_room)
|
87
90
|
client['my room'].get_room
|
88
91
|
|
92
|
+
# Update room data (see https://www.hipchat.com/docs/apiv2/method/update_room)
|
93
|
+
It's recommended to call client['my room'].get_room then pass in modified hash attributes to #update_room
|
94
|
+
client['my room'].update_room(options = {})
|
95
|
+
|
89
96
|
# Invite user to room (see https://www.hipchat.com/docs/apiv2/method/invite_user)
|
90
97
|
client['my room'].invite("USER_ID_OR_NAME", options = {})
|
91
98
|
|
@@ -125,6 +132,10 @@ client.create_room("Name", options = {})
|
|
125
132
|
# Get room data (see https://www.hipchat.com/docs/apiv2/method/get_room)
|
126
133
|
client['my room'].get_room
|
127
134
|
|
135
|
+
# Update room data (see https://www.hipchat.com/docs/apiv2/method/update_room)
|
136
|
+
It's easiest to call client['my room'].get_room, parse the json and then pass in modified hash attributes
|
137
|
+
client['my room'].update_room(options = {})
|
138
|
+
|
128
139
|
# Invite user to room (see https://www.hipchat.com/docs/apiv2/method/invite_user)
|
129
140
|
client['my room'].invite("USER_ID_OR_NAME", options = {})
|
130
141
|
|
@@ -186,7 +197,7 @@ Options like the room, API token, user name and notification flag can be set in
|
|
186
197
|
RAILS_ROOT/config/hipchat.yml:
|
187
198
|
|
188
199
|
bc.. token: "<your token>"
|
189
|
-
room: "
|
200
|
+
room: ["Room name(s) or id(s)"] # this is an array
|
190
201
|
user: "Your name" # Default to `whoami`
|
191
202
|
notify: true # Defaults to false
|
192
203
|
api_version: "v2" # optional, defaults to v1
|
@@ -209,8 +220,11 @@ end
|
|
209
220
|
h2. Chef Handler
|
210
221
|
|
211
222
|
*APIv1 ONLY, use APIv1 Key*
|
223
|
+
NOTE: APIv2 required for HipChatServer Beta
|
224
|
+
|
225
|
+
Report on Chef runs.
|
212
226
|
|
213
|
-
|
227
|
+
h3. Within a Recipe:
|
214
228
|
|
215
229
|
bc.. include_recipe 'chef_handler'
|
216
230
|
|
@@ -223,6 +237,18 @@ chef_handler 'HipChat::NotifyRoom' do
|
|
223
237
|
'hipchat', 'chef.rb')
|
224
238
|
end
|
225
239
|
|
240
|
+
h3. With client.rb:
|
241
|
+
|
242
|
+
bc.. require 'hipchat/chef'
|
243
|
+
hipchat_handler = HipChat::NotifyRoom.new("API_KEY", "HIPCHAT_ROOM")
|
244
|
+
exception_handlers << hipchat_handler
|
245
|
+
|
246
|
+
h3. With HipChat Server Beta
|
247
|
+
|
248
|
+
Add an "options" hash to set api v2 and your URL:
|
249
|
+
* arguments ['API_KEY', 'HIPCHAT_ROOM', options={api_version: "v2", server_url: "https://hipchat.example.com"}]
|
250
|
+
* hipchat_handler = HipChat::NotifyRoom.new("API_KEY", "HIPCHAT_ROOM", options={api_version: "v2", server_url: "https://hipchat.example.com"})
|
251
|
+
|
226
252
|
h2. Copyright
|
227
253
|
|
228
254
|
Copyright (c) 2012 Atlassian. See LICENSE for details.
|
data/lib/hipchat/api_version.rb
CHANGED
@@ -90,6 +90,16 @@ module HipChat
|
|
90
90
|
}[version]
|
91
91
|
end
|
92
92
|
|
93
|
+
def update_room_config
|
94
|
+
{
|
95
|
+
"v2" => {
|
96
|
+
:url => URI::escape("/#{room_id}"),
|
97
|
+
:method => :put,
|
98
|
+
:body_format => :to_json
|
99
|
+
}
|
100
|
+
}[version]
|
101
|
+
end
|
102
|
+
|
93
103
|
def invite_config
|
94
104
|
{
|
95
105
|
'v2' => {
|
@@ -137,6 +147,14 @@ module HipChat
|
|
137
147
|
}
|
138
148
|
}[version]
|
139
149
|
end
|
150
|
+
|
151
|
+
def statistics_config
|
152
|
+
{
|
153
|
+
'v2' => {
|
154
|
+
:url => URI::escape("/#{room_id}/statistics")
|
155
|
+
}
|
156
|
+
}[version]
|
157
|
+
end
|
140
158
|
end
|
141
159
|
|
142
160
|
class User
|
data/lib/hipchat/chef.rb
CHANGED
@@ -15,11 +15,13 @@ require 'hipchat'
|
|
15
15
|
module HipChat
|
16
16
|
class NotifyRoom < Chef::Handler
|
17
17
|
|
18
|
-
def initialize(api_token, room_name, notify_users=false, report_success=false, excluded_envs=[])
|
18
|
+
def initialize(api_token, room_name, options={}, msg_options={}, notify_users=false, report_success=false, excluded_envs=[], msg_prefix='')
|
19
19
|
@api_token = api_token
|
20
20
|
@room_name = room_name
|
21
|
-
@
|
21
|
+
@options = options
|
22
22
|
@report_success = report_success
|
23
|
+
@msg_options = msg_options
|
24
|
+
@msg_options[:notify] = notify_users
|
23
25
|
@excluded_envs = excluded_envs
|
24
26
|
end
|
25
27
|
|
@@ -31,13 +33,13 @@ module HipChat
|
|
31
33
|
else nil
|
32
34
|
end
|
33
35
|
|
34
|
-
color
|
36
|
+
@msg_options[:color]= if run_status.success? then 'green'
|
35
37
|
else 'red'
|
36
38
|
end
|
37
39
|
|
38
40
|
if msg
|
39
|
-
client = HipChat::Client.new(@api_token)
|
40
|
-
client[@room_name].send('Chef',
|
41
|
+
client = HipChat::Client.new(@api_token, @options)
|
42
|
+
client[@room_name].send('Chef', [msg_prefix, msg].join(' '), @msg_options)
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
data/lib/hipchat/client.rb
CHANGED
@@ -118,7 +118,7 @@ module HipChat
|
|
118
118
|
User.new(@token, r.merge(:api_version => @api_version, :user_id => r['id']))
|
119
119
|
end
|
120
120
|
else
|
121
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for
|
121
|
+
raise UnknownResponseCode, "Unexpected #{response.code} for user"
|
122
122
|
end
|
123
123
|
end
|
124
124
|
end
|
data/lib/hipchat/rails3_tasks.rb
CHANGED
@@ -42,6 +42,8 @@ namespace :hipchat do
|
|
42
42
|
|
43
43
|
client = HipChat::Client.new(options[:token], options)
|
44
44
|
|
45
|
-
|
45
|
+
options[:room].each do |r|
|
46
|
+
client[options[r]].send(options[:user], options[:message], { :color => options[:color], :notify => options[:notify] })
|
47
|
+
end
|
46
48
|
end
|
47
49
|
end
|
data/lib/hipchat/room.rb
CHANGED
@@ -34,6 +34,39 @@ module HipChat
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
# Update a room
|
38
|
+
def update_room(options = {})
|
39
|
+
options = {
|
40
|
+
:privacy => "public",
|
41
|
+
:is_archived => false,
|
42
|
+
:is_guest_accessible => false
|
43
|
+
}.merge symbolize(options)
|
44
|
+
|
45
|
+
response = self.class.send(@api.topic_config[:method], @api.update_room_config[:url],
|
46
|
+
:query => { :auth_token => @token },
|
47
|
+
:body => {
|
48
|
+
:name => options[:name],
|
49
|
+
:topic => options[:topic],
|
50
|
+
:privacy => options[:privacy],
|
51
|
+
:is_archived => @api.bool_val(options[:is_archived]),
|
52
|
+
:is_guest_accessible => @api.bool_val(options[:is_guest_accessible]),
|
53
|
+
:owner => options[:owner]
|
54
|
+
}.to_json,
|
55
|
+
:headers => @api.headers)
|
56
|
+
|
57
|
+
puts response.body
|
58
|
+
|
59
|
+
case response.code
|
60
|
+
when 200, 204; true
|
61
|
+
when 404
|
62
|
+
raise Unknown Room, "Unknown room: `#{room_id}'"
|
63
|
+
when 401
|
64
|
+
raise Unauthorized, "Access denied to room `#{room_id}'"
|
65
|
+
else
|
66
|
+
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
37
70
|
# Invite user to this room
|
38
71
|
def invite(user, reason="")
|
39
72
|
response = self.class.post(@api.invite_config[:url]+"/#{user}",
|
@@ -188,5 +221,44 @@ module HipChat
|
|
188
221
|
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
189
222
|
end
|
190
223
|
end
|
224
|
+
|
225
|
+
# Pull this room's statistics
|
226
|
+
def statistics(options = {})
|
227
|
+
|
228
|
+
response = self.class.get(@api.statistics_config[:url],
|
229
|
+
:query => {
|
230
|
+
:room_id => room_id,
|
231
|
+
:date => options[:date],
|
232
|
+
:timezone => options[:timezone],
|
233
|
+
:format => options[:format],
|
234
|
+
:auth_token => @token,
|
235
|
+
},
|
236
|
+
:headers => @api.headers
|
237
|
+
)
|
238
|
+
|
239
|
+
case response.code
|
240
|
+
when 200
|
241
|
+
response.body
|
242
|
+
when 404
|
243
|
+
raise UnknownRoom, "Unknown room: `#{room_id}'"
|
244
|
+
when 401
|
245
|
+
raise Unauthorized, "Access denied to room `#{room_id}'"
|
246
|
+
else
|
247
|
+
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
private
|
252
|
+
def symbolize(obj)
|
253
|
+
return obj.reduce({}) do |memo, (k, v)|
|
254
|
+
memo.tap { |m| m[k.to_sym] = symbolize(v) }
|
255
|
+
end if obj.is_a? Hash
|
256
|
+
|
257
|
+
return obj.reduce([]) do |memo, v|
|
258
|
+
memo << symbolize(v); memo
|
259
|
+
end if obj.is_a? Array
|
260
|
+
obj
|
261
|
+
end
|
262
|
+
|
191
263
|
end
|
192
264
|
end
|
data/lib/hipchat/version.rb
CHANGED
data/spec/hipchat_api_v2_spec.rb
CHANGED
@@ -54,6 +54,48 @@ describe "HipChat (API V2)" do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
describe "#statistics" do
|
58
|
+
include_context "HipChatV2"
|
59
|
+
it "is successful without custom options" do
|
60
|
+
mock_successful_statistics
|
61
|
+
|
62
|
+
room.statistics().should be_true
|
63
|
+
end
|
64
|
+
|
65
|
+
it "is successful from fetched room" do
|
66
|
+
mock_successful_rooms
|
67
|
+
mock_successful_statistics
|
68
|
+
|
69
|
+
subject.rooms.should be_true
|
70
|
+
subject.rooms.first.statistics.should be_true
|
71
|
+
end
|
72
|
+
|
73
|
+
it "fails when the room doen't exist" do
|
74
|
+
mock(HipChat::Room).get(anything, anything) {
|
75
|
+
OpenStruct.new(:code => 404)
|
76
|
+
}
|
77
|
+
|
78
|
+
lambda { room.statistics }.should raise_error(HipChat::UnknownRoom)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "fails when we're not allowed to do so" do
|
82
|
+
mock(HipChat::Room).get(anything, anything) {
|
83
|
+
OpenStruct.new(:code => 401)
|
84
|
+
}
|
85
|
+
|
86
|
+
lambda { room.statistics }.should raise_error(HipChat::Unauthorized)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "fails if we get an unknown response code" do
|
90
|
+
mock(HipChat::Room).get(anything, anything) {
|
91
|
+
OpenStruct.new(:code => 403)
|
92
|
+
}
|
93
|
+
|
94
|
+
lambda { room.statistics }.
|
95
|
+
should raise_error(HipChat::UnknownResponseCode)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
57
99
|
describe "#topic" do
|
58
100
|
include_context "HipChatV2"
|
59
101
|
it "is successful without custom options" do
|
@@ -182,6 +224,24 @@ describe "HipChat (API V2)" do
|
|
182
224
|
|
183
225
|
end
|
184
226
|
|
227
|
+
describe "#update_room" do
|
228
|
+
include_context "HipChatV2"
|
229
|
+
let(:room_info) {
|
230
|
+
{
|
231
|
+
"name" => "hipchat",
|
232
|
+
"topic" => "hipchat topic",
|
233
|
+
"privacy" => "public",
|
234
|
+
"is_archived" => false,
|
235
|
+
"is_guest_accessible" => false,
|
236
|
+
"owner" => { "id" => "12345" }
|
237
|
+
}
|
238
|
+
}
|
239
|
+
it "successfully" do
|
240
|
+
mock_successful_update_room("Hipchat", room_info)
|
241
|
+
room.update_room(room_info).should be_true
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
185
245
|
describe "#invite" do
|
186
246
|
include_context "HipChatV2"
|
187
247
|
|
@@ -112,6 +112,17 @@ shared_context "HipChatV2" do
|
|
112
112
|
:format => options[:format]}).to_return(canned_response)
|
113
113
|
end
|
114
114
|
|
115
|
+
def mock_successful_statistics(options={})
|
116
|
+
stub_request(:get, "https://api.hipchat.com/v2/room/Hipchat/statistics").with(:query => {:auth_token => "blah",
|
117
|
+
:room_id => "Hipchat",
|
118
|
+
:date => options[:date],
|
119
|
+
:timezone => options[:timezone],
|
120
|
+
:format => options[:format]}).to_return(
|
121
|
+
:status => 200,
|
122
|
+
:body => '{"last_active": "2014-09-02T21:33:54+00:00", "links": {"self": "https://api.hipchat.com/v2/room/12345/statistics"}, "messages_sent": 10}',
|
123
|
+
:headers => {})
|
124
|
+
end
|
125
|
+
|
115
126
|
def mock_successful_room_creation(name, options={})
|
116
127
|
stub_request(:post, "https://api.hipchat.com/v2/room").with(
|
117
128
|
:query => {:auth_token => "blah"},
|
@@ -131,6 +142,24 @@ shared_context "HipChatV2" do
|
|
131
142
|
'Content-Type' => 'application/json'}).to_return(:status => 200, :body => "{\"id\":\"#{room_id}\"}", :headers => {})
|
132
143
|
end
|
133
144
|
|
145
|
+
def mock_successful_update_room(room_id="1234", options={})
|
146
|
+
stub_request(:put, "https://api.hipchat.com/v2/room/#{room_id}").with(
|
147
|
+
:query => {:auth_token => "blah"},
|
148
|
+
:body => {
|
149
|
+
:name => "hipchat",
|
150
|
+
:topic => "hipchat topic",
|
151
|
+
:privacy => "public",
|
152
|
+
:is_archived => false,
|
153
|
+
:is_guest_accessible => false,
|
154
|
+
:owner => { :id => "12345" }
|
155
|
+
}.to_json,
|
156
|
+
:headers => {"Accept" => "application/json",
|
157
|
+
"Content-Type" => "application/json"}).to_return(
|
158
|
+
:status => 204,
|
159
|
+
:body => "",
|
160
|
+
:headers => {})
|
161
|
+
end
|
162
|
+
|
134
163
|
def mock_successful_invite(options={})
|
135
164
|
options = {:user_id => "1234"}.merge(options)
|
136
165
|
stub_request(:post, "https://api.hipchat.com/v2/room/Hipchat/invite/#{options[:user_id]}").with(
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hipchat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- HipChat/Atlassian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|