Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
c0bb3f5a
Commit
c0bb3f5a
authored
Oct 03, 2014
by
Dmitriy Zaporozhets
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #7931 from Soullivaneuh/pushover
Add Pushover service integration
parents
43217dd5
d1fa3b33
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
223 additions
and
2 deletions
+223
-2
CHANGELOG
CHANGELOG
+2
-0
app/controllers/projects/services_controller.rb
app/controllers/projects/services_controller.rb
+2
-1
app/models/project.rb
app/models/project.rb
+2
-1
app/models/project_services/pushover_service.rb
app/models/project_services/pushover_service.rb
+113
-0
app/views/projects/services/_form.html.haml
app/views/projects/services/_form.html.haml
+5
-0
features/project/service.feature
features/project/service.feature
+6
-0
features/steps/project/services.rb
features/steps/project/services.rb
+23
-0
spec/models/project_spec.rb
spec/models/project_spec.rb
+1
-0
spec/models/pushover_service_spec.rb
spec/models/pushover_service_spec.rb
+69
-0
No files found.
CHANGELOG
View file @
c0bb3f5a
...
@@ -15,6 +15,8 @@ v 7.4.0
...
@@ -15,6 +15,8 @@ v 7.4.0
- Zen mode for wiki and milestones (Robert Schilling)
- Zen mode for wiki and milestones (Robert Schilling)
- Move Emoji parsing to html-pipeline-gitlab (Robert Schilling)
- Move Emoji parsing to html-pipeline-gitlab (Robert Schilling)
- Font Awesome 4.2 integration (Sullivan Senechal)
- Font Awesome 4.2 integration (Sullivan Senechal)
- Add Pushover service integration (Sullivan Senechal)
- Add select field type for services options (Sullivan Senechal)
v 7.3.2
v 7.3.2
- Fix creating new file via web editor
- Fix creating new file via web editor
...
...
app/controllers/projects/services_controller.rb
View file @
c0bb3f5a
...
@@ -40,7 +40,8 @@ class Projects::ServicesController < Projects::ApplicationController
...
@@ -40,7 +40,8 @@ class Projects::ServicesController < Projects::ApplicationController
def
service_params
def
service_params
params
.
require
(
:service
).
permit
(
params
.
require
(
:service
).
permit
(
:title
,
:token
,
:type
,
:active
,
:api_key
,
:subdomain
,
:title
,
:token
,
:type
,
:active
,
:api_key
,
:subdomain
,
:room
,
:recipients
,
:project_url
:room
,
:recipients
,
:project_url
,
:user_key
,
:device
,
:priority
,
:sound
)
)
end
end
end
end
app/models/project.rb
View file @
c0bb3f5a
...
@@ -64,6 +64,7 @@ class Project < ActiveRecord::Base
...
@@ -64,6 +64,7 @@ class Project < ActiveRecord::Base
has_one
:assembla_service
,
dependent: :destroy
has_one
:assembla_service
,
dependent: :destroy
has_one
:gemnasium_service
,
dependent: :destroy
has_one
:gemnasium_service
,
dependent: :destroy
has_one
:slack_service
,
dependent: :destroy
has_one
:slack_service
,
dependent: :destroy
has_one
:pushover_service
,
dependent: :destroy
has_one
:forked_project_link
,
dependent: :destroy
,
foreign_key:
"forked_to_project_id"
has_one
:forked_project_link
,
dependent: :destroy
,
foreign_key:
"forked_to_project_id"
has_one
:forked_from_project
,
through: :forked_project_link
has_one
:forked_from_project
,
through: :forked_project_link
# Merge Requests for target project should be removed with it
# Merge Requests for target project should be removed with it
...
@@ -311,7 +312,7 @@ class Project < ActiveRecord::Base
...
@@ -311,7 +312,7 @@ class Project < ActiveRecord::Base
end
end
def
available_services_names
def
available_services_names
%w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla emails_on_push gemnasium slack)
%w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla emails_on_push gemnasium slack
pushover
)
end
end
def
gitlab_ci?
def
gitlab_ci?
...
...
app/models/project_services/pushover_service.rb
0 → 100644
View file @
c0bb3f5a
# == Schema Information
#
# Table name: services
#
# id :integer not null, primary key
# type :string(255)
# title :string(255)
# project_id :integer not null
# created_at :datetime
# updated_at :datetime
# active :boolean default(FALSE), not null
# properties :text
#
class
PushoverService
<
Service
include
HTTParty
base_uri
'https://api.pushover.net/1'
prop_accessor
:api_key
,
:user_key
,
:device
,
:priority
,
:sound
validates
:api_key
,
:user_key
,
:priority
,
presence:
true
,
if: :activated?
def
title
'Pushover'
end
def
description
'Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop.'
end
def
to_param
'pushover'
end
def
fields
[
{
type:
'text'
,
name:
'api_key'
,
placeholder:
'Your application key'
},
{
type:
'text'
,
name:
'user_key'
,
placeholder:
'Your user key'
},
{
type:
'text'
,
name:
'device'
,
placeholder:
'Leave blank for all active devices'
},
{
type:
'select'
,
name:
'priority'
,
choices:
[
[
'Lowest Priority'
,
-
2
],
[
'Low Priority'
,
-
1
],
[
'Normal Priority'
,
0
],
[
'High Priority'
,
1
]
],
default_choice:
0
},
{
type:
'select'
,
name:
'sound'
,
choices:
[
[
'Device default sound'
,
nil
],
[
'Pushover (default)'
,
'pushover'
],
[
'Bike'
,
'bike'
],
[
'Bugle'
,
'bugle'
],
[
'Cash Register'
,
'cashregister'
],
[
'Classical'
,
'classical'
],
[
'Cosmic'
,
'cosmic'
],
[
'Falling'
,
'falling'
],
[
'Gamelan'
,
'gamelan'
],
[
'Incoming'
,
'incoming'
],
[
'Intermission'
,
'intermission'
],
[
'Magic'
,
'magic'
],
[
'Mechanical'
,
'mechanical'
],
[
'Piano Bar'
,
'pianobar'
],
[
'Siren'
,
'siren'
],
[
'Space Alarm'
,
'spacealarm'
],
[
'Tug Boat'
,
'tugboat'
],
[
'Alien Alarm (long)'
,
'alien'
],
[
'Climb (long)'
,
'climb'
],
[
'Persistent (long)'
,
'persistent'
],
[
'Pushover Echo (long)'
,
'echo'
],
[
'Up Down (long)'
,
'updown'
],
[
'None (silent)'
,
'none'
]
]
},
]
end
def
execute
(
push_data
)
ref
=
push_data
[
:ref
].
gsub
(
'refs/heads/'
,
''
)
before
=
push_data
[
:before
]
after
=
push_data
[
:after
]
if
before
=~
/000000/
message
=
"
#{
push_data
[
:user_name
]
}
pushed new branch
\"
#{
ref
}
\"
."
elsif
after
=~
/000000/
message
=
"
#{
push_data
[
:user_name
]
}
deleted branch
\"
#{
ref
}
\"
."
else
message
=
"
#{
push_data
[
:user_name
]
}
push to branch
\"
#{
ref
}
\"
."
end
if
push_data
[
:total_commits_count
]
>
0
message
<<
"
\n
Total commits count:
#{
push_data
[
:total_commits_count
]
}
"
end
pushover_data
=
{
token:
api_key
,
user:
user_key
,
device:
device
,
priority:
priority
,
title:
"
#{
project
.
name_with_namespace
}
"
,
message:
message
,
url:
push_data
[
:repository
][
:homepage
],
url_title:
"See project
#{
project
.
name_with_namespace
}
"
}
# Sound parameter MUST NOT be sent to API if not selected
if
sound
pushover_data
.
merge!
(
sound:
sound
)
end
PushoverService
.
post
(
'/messages.json'
,
body:
pushover_data
)
end
end
app/views/projects/services/_form.html.haml
View file @
c0bb3f5a
...
@@ -28,8 +28,11 @@
...
@@ -28,8 +28,11 @@
-
@service
.
fields
.
each
do
|
field
|
-
@service
.
fields
.
each
do
|
field
|
-
name
=
field
[
:name
]
-
name
=
field
[
:name
]
-
value
=
@service
.
send
(
name
)
-
type
=
field
[
:type
]
-
type
=
field
[
:type
]
-
placeholder
=
field
[
:placeholder
]
-
placeholder
=
field
[
:placeholder
]
-
choices
=
field
[
:choices
]
-
default_choice
=
field
[
:default_choice
]
.form-group
.form-group
=
f
.
label
name
,
class:
"control-label"
=
f
.
label
name
,
class:
"control-label"
...
@@ -40,6 +43,8 @@
...
@@ -40,6 +43,8 @@
=
f
.
text_area
name
,
rows:
5
,
class:
"form-control"
,
placeholder:
placeholder
=
f
.
text_area
name
,
rows:
5
,
class:
"form-control"
,
placeholder:
placeholder
-
elsif
type
==
'checkbox'
-
elsif
type
==
'checkbox'
=
f
.
check_box
name
=
f
.
check_box
name
-
elsif
type
==
'select'
=
f
.
select
name
,
options_for_select
(
choices
,
value
?
value
:
default_choice
),
{},
{
class:
"form-control"
}
.form-actions
.form-actions
=
f
.
submit
'Save'
,
class:
'btn btn-save'
=
f
.
submit
'Save'
,
class:
'btn btn-save'
...
...
features/project/service.feature
View file @
c0bb3f5a
...
@@ -43,6 +43,12 @@ Feature: Project Services
...
@@ -43,6 +43,12 @@ Feature: Project Services
And
I fill Slack settings
And
I fill Slack settings
Then
I should see Slack service settings saved
Then
I should see Slack service settings saved
Scenario
:
Activate Pushover service
When
I visit project
"Shop"
services page
And
I click Pushover service link
And
I fill Pushover settings
Then
I should see Pushover service settings saved
Scenario
:
Activate email on push service
Scenario
:
Activate email on push service
When
I visit project
"Shop"
services page
When
I visit project
"Shop"
services page
And
I click email on push service link
And
I click email on push service link
...
...
features/steps/project/services.rb
View file @
c0bb3f5a
...
@@ -13,6 +13,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
...
@@ -13,6 +13,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
page
.
should
have_content
'Hipchat'
page
.
should
have_content
'Hipchat'
page
.
should
have_content
'GitLab CI'
page
.
should
have_content
'GitLab CI'
page
.
should
have_content
'Assembla'
page
.
should
have_content
'Assembla'
page
.
should
have_content
'Pushover'
end
end
step
'I click gitlab-ci service link'
do
step
'I click gitlab-ci service link'
do
...
@@ -118,4 +119,26 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
...
@@ -118,4 +119,26 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
find_field
(
'Room'
).
value
.
should
==
'#gitlab'
find_field
(
'Room'
).
value
.
should
==
'#gitlab'
find_field
(
'Token'
).
value
.
should
==
'verySecret'
find_field
(
'Token'
).
value
.
should
==
'verySecret'
end
end
step
'I click Pushover service link'
do
click_link
'Pushover'
end
step
'I fill Pushover settings'
do
check
'Active'
fill_in
'Api key'
,
with:
'verySecret'
fill_in
'User key'
,
with:
'verySecret'
fill_in
'Device'
,
with:
'myDevice'
select
'High Priority'
,
from:
'Priority'
select
'Bike'
,
from:
'Sound'
click_button
'Save'
end
step
'I should see Pushover service settings saved'
do
find_field
(
'Api key'
).
value
.
should
==
'verySecret'
find_field
(
'User key'
).
value
.
should
==
'verySecret'
find_field
(
'Device'
).
value
.
should
==
'myDevice'
find_field
(
'Priority'
).
find
(
'option[selected]'
).
value
.
should
==
'1'
find_field
(
'Sound'
).
find
(
'option[selected]'
).
value
.
should
==
'bike'
end
end
end
spec/models/project_spec.rb
View file @
c0bb3f5a
...
@@ -47,6 +47,7 @@ describe Project do
...
@@ -47,6 +47,7 @@ describe Project do
it
{
should
have_many
(
:protected_branches
).
dependent
(
:destroy
)
}
it
{
should
have_many
(
:protected_branches
).
dependent
(
:destroy
)
}
it
{
should
have_one
(
:forked_project_link
).
dependent
(
:destroy
)
}
it
{
should
have_one
(
:forked_project_link
).
dependent
(
:destroy
)
}
it
{
should
have_one
(
:slack_service
).
dependent
(
:destroy
)
}
it
{
should
have_one
(
:slack_service
).
dependent
(
:destroy
)
}
it
{
should
have_one
(
:pushover_service
).
dependent
(
:destroy
)
}
end
end
describe
"Mass assignment"
do
describe
"Mass assignment"
do
...
...
spec/models/pushover_service_spec.rb
0 → 100644
View file @
c0bb3f5a
# == Schema Information
#
# Table name: services
#
# id :integer not null, primary key
# type :string(255)
# title :string(255)
# project_id :integer not null
# created_at :datetime
# updated_at :datetime
# active :boolean default(FALSE), not null
# properties :text
#
require
'spec_helper'
describe
PushoverService
do
describe
'Associations'
do
it
{
should
belong_to
:project
}
it
{
should
have_one
:service_hook
}
end
describe
'Validations'
do
context
'active'
do
before
do
subject
.
active
=
true
end
it
{
should
validate_presence_of
:api_key
}
it
{
should
validate_presence_of
:user_key
}
it
{
should
validate_presence_of
:priority
}
end
end
describe
'Execute'
do
let
(
:pushover
)
{
PushoverService
.
new
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:project
)
{
create
(
:project
)
}
let
(
:sample_data
)
{
GitPushService
.
new
.
sample_data
(
project
,
user
)
}
let
(
:api_key
)
{
'verySecret'
}
let
(
:user_key
)
{
'verySecret'
}
let
(
:device
)
{
'myDevice'
}
let
(
:priority
)
{
0
}
let
(
:sound
)
{
'bike'
}
let
(
:api_url
)
{
'https://api.pushover.net/1/messages.json'
}
before
do
pushover
.
stub
(
project:
project
,
project_id:
project
.
id
,
service_hook:
true
,
api_key:
api_key
,
user_key:
user_key
,
device:
device
,
priority:
priority
,
sound:
sound
)
WebMock
.
stub_request
(
:post
,
api_url
)
end
it
'should call Pushover API'
do
pushover
.
execute
(
sample_data
)
WebMock
.
should
have_requested
(
:post
,
api_url
).
once
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment