hipchat 1.0.1 → 1.1.0
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.
- checksums.yaml +4 -4
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/README.textile +25 -1
- data/lib/hipchat.rb +4 -206
- data/lib/hipchat/api_version.rb +80 -14
- data/lib/hipchat/capistrano2.rb +41 -1
- data/lib/hipchat/client.rb +111 -0
- data/lib/hipchat/errors.rb +10 -0
- data/lib/hipchat/rails3_tasks.rb +2 -1
- data/lib/hipchat/room.rb +193 -0
- data/lib/hipchat/user.rb +62 -0
- data/lib/hipchat/version.rb +1 -1
- data/spec/hipchat_api_v1_spec.rb +172 -0
- data/spec/hipchat_api_v2_spec.rb +217 -0
- data/spec/hipchat_spec.rb +0 -271
- data/spec/spec_helper.rb +3 -0
- data/spec/{shared_hipchat.rb → support/shared_contexts_for_hipchat.rb} +58 -7
- metadata +15 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2ec52d652412c7540c45f243508e99f5a155ec1
|
4
|
+
data.tar.gz: 0082b930a02ab0a0fac1d46d7181a7cd64202634
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0470720c384fce9a0403b3df9fc930b98cd1047d496b783a62cb0fbbec8999bdd4998db5f76153f366450ffc91e2ec48f2a44cfaeb8181c9ebcf47d11dbc9fac
|
7
|
+
data.tar.gz: 82098108cb71cffb51993058336b39072da7154ae8a579e7077365dc98a1dc6c22671a29f817f0fed68f8d5dd1bf60056ec44924a4b016a94ff6febb926e874e
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
hipchat-rb
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.0
|
data/.travis.yml
CHANGED
data/README.textile
CHANGED
@@ -40,6 +40,9 @@ client['my room'].history()
|
|
40
40
|
# Get history for a date in time with a particular timezone (default is latest 75 messages, timezone default is 'UTC')
|
41
41
|
client['my room'].history(:date => '2010-11-19', :timezone => 'PST')
|
42
42
|
|
43
|
+
# Create a new room, V1 requires owner_user_id (see https://www.hipchat.com/docs/api/method/rooms/create)
|
44
|
+
client.create_room("Name", :owner_user_id => 'user_id')
|
45
|
+
|
43
46
|
h2. "API v2":https://www.hipchat.com/docs/apiv2
|
44
47
|
|
45
48
|
bc.. client = HipChat::Client.new(api_token, :api_version => 'v2')
|
@@ -67,6 +70,18 @@ client['my room'].history()
|
|
67
70
|
# Get history for a date in time with a particular timezone (default is latest 75 messages, timezone default is 'UTC')
|
68
71
|
client['my room'].history(:date => '2010-11-19', :timezone => 'PST')
|
69
72
|
|
73
|
+
# Create a new room (see https://www.hipchat.com/docs/apiv2/method/create_room)
|
74
|
+
client.create_room("Name", options = {})
|
75
|
+
|
76
|
+
# Get room data (see https://www.hipchat.com/docs/apiv2/method/get_room)
|
77
|
+
client['my room'].get_room
|
78
|
+
|
79
|
+
# Invite user to room (see https://www.hipchat.com/docs/apiv2/method/invite_user)
|
80
|
+
client['my room'].invite("USER_ID_OR_NAME", options = {})
|
81
|
+
|
82
|
+
# Sends a user a private message. Valid value for user are user id or email address
|
83
|
+
client.user('foo@bar.org').send('I can send private messages')
|
84
|
+
|
70
85
|
h2. Capistrano
|
71
86
|
|
72
87
|
*APIv1 ONLY, use APIv1 Key*
|
@@ -96,6 +111,15 @@ To determine the user that is currently running the deploy, the capistrano tasks
|
|
96
111
|
# The git user.name var.
|
97
112
|
# The $USER environment variable.
|
98
113
|
|
114
|
+
h3. Commit log notification (only for Capistrano 2)
|
115
|
+
|
116
|
+
Send commit log with deploy notification. We currently support git and svn.
|
117
|
+
|
118
|
+
bc.. set :hipchat_commit_log, true
|
119
|
+
# Optional
|
120
|
+
set :hipchat_commit_log_format, ":time :user\n:message\n"
|
121
|
+
set :hipchat_commit_log_time_format, "%Y/%m/%d %H:%M:%S"
|
122
|
+
|
99
123
|
h2. Rails 3 Rake Task
|
100
124
|
|
101
125
|
Send a message using a rake task:
|
@@ -138,7 +162,7 @@ h2. Chef Handler
|
|
138
162
|
Report on Chef runs. Within a Recipe:
|
139
163
|
|
140
164
|
bc.. include_recipe 'chef_handler'
|
141
|
-
|
165
|
+
|
142
166
|
gem_package 'hipchat'
|
143
167
|
|
144
168
|
chef_handler 'HipChat::NotifyRoom' do
|
data/lib/hipchat.rb
CHANGED
@@ -1,211 +1,9 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
require 'ostruct'
|
3
|
-
|
4
1
|
require 'hipchat/railtie' if defined?(Rails::Railtie)
|
5
2
|
require "hipchat/version"
|
6
|
-
require 'hipchat/api_version'
|
7
3
|
|
8
4
|
module HipChat
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
class Client
|
15
|
-
include HTTParty
|
16
|
-
|
17
|
-
format :json
|
18
|
-
|
19
|
-
def initialize(token, options={})
|
20
|
-
@token = token
|
21
|
-
@api_version = options[:api_version]
|
22
|
-
@api = HipChat::ApiVersion::Client.new(@api_version)
|
23
|
-
self.class.base_uri(@api.base_uri)
|
24
|
-
http_proxy = options[:http_proxy] || ENV['http_proxy']
|
25
|
-
setup_proxy(http_proxy) if http_proxy
|
26
|
-
end
|
27
|
-
|
28
|
-
def rooms
|
29
|
-
@rooms ||= _rooms
|
30
|
-
end
|
31
|
-
|
32
|
-
def [](name)
|
33
|
-
Room.new(@token, :room_id => name, :api_version => @api_version)
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
def setup_proxy(proxy_url)
|
38
|
-
proxy_url = URI.parse(proxy_url)
|
39
|
-
|
40
|
-
self.class.http_proxy(proxy_url.host, proxy_url.port,
|
41
|
-
proxy_url.user, proxy_url.password)
|
42
|
-
HipChat::Room.http_proxy(proxy_url.host, proxy_url.port,
|
43
|
-
proxy_url.user, proxy_url.password)
|
44
|
-
end
|
45
|
-
|
46
|
-
def _rooms
|
47
|
-
response = self.class.get(@api.rooms_config[:url],
|
48
|
-
:query => {
|
49
|
-
:auth_token => @token
|
50
|
-
},
|
51
|
-
:headers => @api.headers
|
52
|
-
)
|
53
|
-
case response.code
|
54
|
-
when 200
|
55
|
-
response[@api.rooms_config[:data_key]].map do |r|
|
56
|
-
Room.new(@token, r.merge(:api_version => @api_version))
|
57
|
-
end
|
58
|
-
else
|
59
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
class Room < OpenStruct
|
65
|
-
include HTTParty
|
66
|
-
|
67
|
-
format :json
|
68
|
-
|
69
|
-
def initialize(token, params)
|
70
|
-
@token = token
|
71
|
-
@api = HipChat::ApiVersion::Room.new(params[:room_id],
|
72
|
-
params.delete(:api_version))
|
73
|
-
self.class.base_uri(@api.base_uri)
|
74
|
-
super(params)
|
75
|
-
end
|
76
|
-
|
77
|
-
# Send a message to this room.
|
78
|
-
#
|
79
|
-
# Usage:
|
80
|
-
#
|
81
|
-
# # Default
|
82
|
-
# send 'nickname', 'some message'
|
83
|
-
#
|
84
|
-
# # Notify users and color the message red
|
85
|
-
# send 'nickname', 'some message', :notify => true, :color => 'red'
|
86
|
-
#
|
87
|
-
# # Notify users (deprecated)
|
88
|
-
# send 'nickname', 'some message', true
|
89
|
-
#
|
90
|
-
# Options:
|
91
|
-
#
|
92
|
-
# +color+:: "yellow", "red", "green", "purple", or "random"
|
93
|
-
# (default "yellow")
|
94
|
-
# +notify+:: true or false
|
95
|
-
# (default false)
|
96
|
-
def send(from, message, options_or_notify = {})
|
97
|
-
if from.length > 15
|
98
|
-
raise UsernameTooLong, "Username #{from} is `#{from.length} characters long. Limit is 15'"
|
99
|
-
end
|
100
|
-
options = if options_or_notify == true or options_or_notify == false
|
101
|
-
warn "DEPRECATED: Specify notify flag as an option (e.g., :notify => true)"
|
102
|
-
{ :notify => options_or_notify }
|
103
|
-
else
|
104
|
-
options_or_notify || {}
|
105
|
-
end
|
106
|
-
|
107
|
-
options = { :color => 'yellow', :notify => false }.merge options
|
108
|
-
|
109
|
-
response = self.class.post(@api.send_config[:url],
|
110
|
-
:query => { :auth_token => @token },
|
111
|
-
:body => {
|
112
|
-
:room_id => room_id,
|
113
|
-
:from => from,
|
114
|
-
:message => message,
|
115
|
-
:message_format => options[:message_format] || 'html',
|
116
|
-
:color => options[:color],
|
117
|
-
:notify => @api.bool_val(options[:notify])
|
118
|
-
}.send(@api.send_config[:body_format]),
|
119
|
-
:headers => @api.headers
|
120
|
-
)
|
121
|
-
|
122
|
-
case response.code
|
123
|
-
when 200, 204; true
|
124
|
-
when 404
|
125
|
-
raise UnknownRoom, "Unknown room: `#{room_id}'"
|
126
|
-
when 401
|
127
|
-
raise Unauthorized, "Access denied to room `#{room_id}'"
|
128
|
-
else
|
129
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
# Change this room's topic
|
134
|
-
#
|
135
|
-
# Usage:
|
136
|
-
#
|
137
|
-
# # Default
|
138
|
-
# topic 'my awesome topic'
|
139
|
-
#
|
140
|
-
# Options:
|
141
|
-
#
|
142
|
-
# +from+:: the name of the person changing the topic
|
143
|
-
# (default "API")
|
144
|
-
def topic(new_topic, options = {})
|
145
|
-
|
146
|
-
options = { :from => 'API' }.merge options
|
147
|
-
|
148
|
-
response = self.class.send(@api.topic_config[:method], @api.topic_config[:url],
|
149
|
-
:query => { :auth_token => @token },
|
150
|
-
:body => {
|
151
|
-
:room_id => room_id,
|
152
|
-
:from => options[:from],
|
153
|
-
:topic => new_topic
|
154
|
-
}.send(@api.topic_config[:body_format]),
|
155
|
-
:headers => @api.headers
|
156
|
-
)
|
157
|
-
|
158
|
-
case response.code
|
159
|
-
when 204,200; true
|
160
|
-
when 404
|
161
|
-
raise UnknownRoom, "Unknown room: `#{room_id}'"
|
162
|
-
when 401
|
163
|
-
raise Unauthorized, "Access denied to room `#{room_id}'"
|
164
|
-
else
|
165
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
# Pull this room's history
|
170
|
-
#
|
171
|
-
# Usage
|
172
|
-
#
|
173
|
-
# # Default
|
174
|
-
#
|
175
|
-
#
|
176
|
-
# Options
|
177
|
-
#
|
178
|
-
# +date+:: Whether to return a specific day (YYYY-MM-DD format) or recent
|
179
|
-
# (default "recent")
|
180
|
-
# +timezone+:: Your timezone. Supported timezones are at: https://www.hipchat.com/docs/api/timezones
|
181
|
-
# (default "UTC")
|
182
|
-
# +format+:: Format to retrieve the history in. Valid options are JSON and XML
|
183
|
-
# (default "JSON")
|
184
|
-
def history(options = {})
|
185
|
-
|
186
|
-
options = { :date => 'recent', :timezone => 'UTC', :format => 'JSON' }.merge options
|
187
|
-
|
188
|
-
response = self.class.get(@api.history_config[:url],
|
189
|
-
:query => {
|
190
|
-
:room_id => room_id,
|
191
|
-
:date => options[:date],
|
192
|
-
:timezone => options[:timezone],
|
193
|
-
:format => options[:format],
|
194
|
-
:auth_token => @token,
|
195
|
-
},
|
196
|
-
:headers => @api.headers
|
197
|
-
)
|
198
|
-
|
199
|
-
case response.code
|
200
|
-
when 200
|
201
|
-
response.body
|
202
|
-
when 404
|
203
|
-
raise UnknownRoom, "Unknown room: `#{room_id}'"
|
204
|
-
when 401
|
205
|
-
raise Unauthorized, "Access denied to room `#{room_id}'"
|
206
|
-
else
|
207
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
5
|
+
require 'hipchat/errors'
|
6
|
+
require 'hipchat/room'
|
7
|
+
require 'hipchat/client'
|
8
|
+
require 'hipchat/user'
|
211
9
|
end
|
data/lib/hipchat/api_version.rb
CHANGED
@@ -1,16 +1,26 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
1
3
|
module HipChat
|
2
4
|
class ApiVersion
|
3
5
|
|
4
|
-
|
6
|
+
def bool_val(opt)
|
7
|
+
if version.eql?('v1')
|
8
|
+
opt ? 1 : 0
|
9
|
+
else
|
10
|
+
opt
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Client < ApiVersion
|
5
15
|
|
6
16
|
def initialize(version = 'v1')
|
7
17
|
@version = !version.nil? ? version : 'v1'
|
8
18
|
if @version.eql?('v1')
|
9
|
-
@base_uri = "https://api.hipchat.com/v1
|
19
|
+
@base_uri = "https://api.hipchat.com/v1"
|
10
20
|
@headers = {'Accept' => 'application/json',
|
11
21
|
'Content-Type' => 'application/x-www-form-urlencoded'}
|
12
22
|
else
|
13
|
-
@base_uri = "https://api.hipchat.com/v2
|
23
|
+
@base_uri = "https://api.hipchat.com/v2"
|
14
24
|
@headers = {'Accept' => 'application/json',
|
15
25
|
'Content-Type' => 'application/json'}
|
16
26
|
end
|
@@ -21,7 +31,7 @@ module HipChat
|
|
21
31
|
def rooms_config
|
22
32
|
{
|
23
33
|
'v1' => {
|
24
|
-
:url => '/list',
|
34
|
+
:url => '/rooms/list',
|
25
35
|
:data_key => 'rooms'
|
26
36
|
},
|
27
37
|
'v2' => {
|
@@ -30,9 +40,30 @@ module HipChat
|
|
30
40
|
}
|
31
41
|
}[version]
|
32
42
|
end
|
43
|
+
|
44
|
+
|
45
|
+
def create_room_config
|
46
|
+
{
|
47
|
+
'v1' => {
|
48
|
+
:url => '/rooms/create',
|
49
|
+
:body_format => :to_hash
|
50
|
+
},
|
51
|
+
'v2' => {
|
52
|
+
:url => '/room',
|
53
|
+
:body_format => :to_json
|
54
|
+
}
|
55
|
+
}[version]
|
56
|
+
end
|
57
|
+
|
58
|
+
def users_config
|
59
|
+
{
|
60
|
+
:url => '/user',
|
61
|
+
:data_key => 'items'
|
62
|
+
}
|
63
|
+
end
|
33
64
|
end
|
34
65
|
|
35
|
-
class Room
|
66
|
+
class Room < ApiVersion
|
36
67
|
|
37
68
|
def initialize(room_id, version = 'v1')
|
38
69
|
@room_id = room_id
|
@@ -50,6 +81,23 @@ module HipChat
|
|
50
81
|
|
51
82
|
attr_reader :version, :base_uri, :room_id, :headers
|
52
83
|
|
84
|
+
def get_room_config
|
85
|
+
{
|
86
|
+
'v2' => {
|
87
|
+
:url => URI::escape("/#{room_id}")
|
88
|
+
}
|
89
|
+
}[version]
|
90
|
+
end
|
91
|
+
|
92
|
+
def invite_config
|
93
|
+
{
|
94
|
+
'v2' => {
|
95
|
+
:url => URI::escape("/#{room_id}/invite"),
|
96
|
+
:body_format => :to_json
|
97
|
+
}
|
98
|
+
}[version]
|
99
|
+
end
|
100
|
+
|
53
101
|
def send_config
|
54
102
|
{
|
55
103
|
'v1' => {
|
@@ -57,7 +105,7 @@ module HipChat
|
|
57
105
|
:body_format => :to_hash
|
58
106
|
},
|
59
107
|
'v2' => {
|
60
|
-
:url => "/#{room_id}/notification",
|
108
|
+
:url => URI::escape("/#{room_id}/notification"),
|
61
109
|
:body_format => :to_json
|
62
110
|
}
|
63
111
|
}[version]
|
@@ -71,7 +119,7 @@ module HipChat
|
|
71
119
|
:body_format => :to_hash
|
72
120
|
},
|
73
121
|
'v2' => {
|
74
|
-
:url => "/#{room_id}/topic",
|
122
|
+
:url => URI::escape("/#{room_id}/topic"),
|
75
123
|
:method => :put,
|
76
124
|
:body_format => :to_json
|
77
125
|
}
|
@@ -84,19 +132,37 @@ module HipChat
|
|
84
132
|
:url => '/history'
|
85
133
|
},
|
86
134
|
'v2' => {
|
87
|
-
:url => "/#{room_id}/history"
|
135
|
+
:url => URI::escape("/#{room_id}/history")
|
88
136
|
}
|
89
137
|
}[version]
|
90
138
|
end
|
139
|
+
end
|
91
140
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
141
|
+
class User
|
142
|
+
|
143
|
+
def initialize(user_id, version)
|
144
|
+
@user_id = user_id
|
145
|
+
raise InvalidApiVersion, "user API calls invalid for API v1" if ! version.eql?('v2')
|
146
|
+
@base_uri = "https://api.hipchat.com/v2/user"
|
147
|
+
@headers = {'Accept' => 'application/json',
|
148
|
+
'Content-Type' => 'application/json'}
|
98
149
|
end
|
99
150
|
|
151
|
+
attr_reader :version, :base_uri, :user_id, :headers
|
152
|
+
|
153
|
+
def send_config
|
154
|
+
{
|
155
|
+
:url => URI::escape("/#{user_id}/message"),
|
156
|
+
:body_format => :to_json
|
157
|
+
}
|
158
|
+
end
|
159
|
+
|
160
|
+
def view_config
|
161
|
+
{
|
162
|
+
:url => URI::escape("/#{user_id}"),
|
163
|
+
:body_format => :to_json
|
164
|
+
}
|
165
|
+
end
|
100
166
|
end
|
101
167
|
end
|
102
168
|
end
|
data/lib/hipchat/capistrano2.rb
CHANGED
@@ -39,6 +39,12 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
39
39
|
environment_string = "#{stage} (#{env})"
|
40
40
|
end
|
41
41
|
|
42
|
+
if fetch(:hipchat_commit_log, false)
|
43
|
+
logs = commit_logs
|
44
|
+
unless logs.empty?
|
45
|
+
send(logs.join("\n"), send_options)
|
46
|
+
end
|
47
|
+
end
|
42
48
|
send("#{human} finished deploying #{deployment_name} to #{environment_string}#{fetch(:hipchat_with_migrations, '')}.", send_options)
|
43
49
|
end
|
44
50
|
end
|
@@ -123,9 +129,43 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
123
129
|
end
|
124
130
|
end
|
125
131
|
|
132
|
+
def commit_logs
|
133
|
+
from = (previous_revision rescue nil)
|
134
|
+
to = (latest_revision rescue nil)
|
135
|
+
|
136
|
+
log_hashes = []
|
137
|
+
case scm.to_s
|
138
|
+
when 'git'
|
139
|
+
logs = run_locally(source.local.scm(:log, "--no-merges --pretty=format:'%H$$%at$$%an$$%s' #{from}..#{to}"))
|
140
|
+
logs.split(/\n/).each do |log|
|
141
|
+
ll = log.split(/\$\$/)
|
142
|
+
log_hashes << {revision: ll[0], time: Time.at(ll[1].to_i), user: ll[2], message: ll[3]}
|
143
|
+
end
|
144
|
+
when 'svn'
|
145
|
+
logs = run_locally(source.local.scm(:log, "--non-interactive -r #{from}:#{to}"))
|
146
|
+
logs.scan(/^[-]+$\n\s*(?<revision>[^\|]+)\s+\|\s+(?<user>[^\|]+)\s+\|\s+(?<time>[^\|]+)\s+.*\n+^\s*(?<message>.*)\s*$\n/) do |m|
|
147
|
+
h = Regexp.last_match
|
148
|
+
log_hashes << {revision: h[:revision], time: Time.parse(h[:time]), user: h[:user], message: h[:message]}
|
149
|
+
end
|
150
|
+
else
|
151
|
+
puts "We haven't supported this scm yet."
|
152
|
+
return []
|
153
|
+
end
|
154
|
+
|
155
|
+
format = fetch(:hipchat_commit_log_format, ":time :user\n:message\n")
|
156
|
+
time_format = fetch(:hipchat_commit_log_time_format, "%Y/%m/%d %H:%M:%S")
|
157
|
+
|
158
|
+
log_hashes.map do |log_hash|
|
159
|
+
log_hash[:time] &&= log_hash[:time].localtime.strftime(time_format)
|
160
|
+
log_hash.inject(format) do |l, (k, v)|
|
161
|
+
l.gsub(/:#{k}/, v.to_s)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
126
166
|
before "deploy", "hipchat:trigger_notification"
|
127
167
|
before "deploy:migrations", "hipchat:trigger_notification", "hipchat:configure_for_migrations"
|
128
168
|
before "deploy:update_code", "hipchat:notify_deploy_started"
|
129
169
|
after "deploy", "hipchat:notify_deploy_finished"
|
130
170
|
after "deploy:migrations", "hipchat:notify_deploy_finished"
|
131
|
-
end
|
171
|
+
end
|