Commit 483f9854e43d2a3fc6cf48ec7228ddef62b93375

Authored by Ronald van Eede
1 parent 63c6f30a

Hipchat service implementation

Gemfile
... ... @@ -104,6 +104,9 @@ gem "redis-rails"
104 104 # Campfire integration
105 105 gem 'tinder', '~> 1.9.2'
106 106  
  107 +# HipChat integration
  108 +gem "hipchat", "~> 0.9.0"
  109 +
107 110 group :assets do
108 111 gem "sass-rails"
109 112 gem "coffee-rails"
... ...
Gemfile.lock
... ... @@ -208,6 +208,8 @@ GEM
208 208 railties (>= 3.1, < 4.1)
209 209 hashie (1.2.0)
210 210 hike (1.2.2)
  211 + hipchat (0.9.0)
  212 + httparty
211 213 http_parser.rb (0.5.3)
212 214 httparty (0.11.0)
213 215 multi_json (~> 1.0)
... ... @@ -532,6 +534,7 @@ DEPENDENCIES
532 534 guard-rspec
533 535 guard-spinach
534 536 haml-rails
  537 + hipchat (~> 0.9.0)
535 538 httparty
536 539 jquery-atwho-rails (= 0.3.0)
537 540 jquery-rails (= 2.1.3)
... ...
app/models/hipchat_service.rb 0 → 100644
... ... @@ -0,0 +1,73 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: services
  4 +#
  5 +# id :integer not null, primary key
  6 +# type :string(255)
  7 +# title :string(255)
  8 +# token :string(255)
  9 +# project_id :integer not null
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# active :boolean default(FALSE), not null
  13 +# project_url :string(255)
  14 +#
  15 +
  16 +class HipchatService < Service
  17 + attr_accessible :room
  18 +
  19 + validates :token, presence: true, if: :activated?
  20 +
  21 + def title
  22 + 'Hipchat'
  23 + end
  24 +
  25 + def description
  26 + 'Simple web-based real-time group chat'
  27 + end
  28 +
  29 + def to_param
  30 + 'hipchat'
  31 + end
  32 +
  33 + def fields
  34 + [
  35 + { type: 'text', name: 'token', placeholder: '' },
  36 + { type: 'text', name: 'room', placeholder: '' }
  37 + ]
  38 + end
  39 +
  40 + def execute(push_data)
  41 + gate[room].send('Gitlab', create_message(push_data))
  42 + end
  43 +
  44 + private
  45 +
  46 + def gate
  47 + @gate ||= HipChat::Client.new(token)
  48 + end
  49 +
  50 + def create_message(push)
  51 + ref = push[:ref].gsub("refs/heads/", "")
  52 + before = push[:before]
  53 + after = push[:after]
  54 +
  55 + message = ""
  56 + message << "#{push[:user_name]} "
  57 + if before =~ /000000/
  58 + message << "pushed new branch <a href=\"#{project.web_url}/commits/#{ref}\">#{ref}</a> to <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a>\n"
  59 + elsif after =~ /000000/
  60 + message << "removed branch #{ref} from <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a> \n"
  61 + else
  62 + message << "#pushed to branch <a href=\"#{project.web_url}/commits/#{ref}\">#{ref}</a> "
  63 + message << "of <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a> "
  64 + message << "(<a href=\"#{project.web_url}/compare/#{before}...#{after}\">Compare changes</a>)"
  65 + for commit in push[:commits] do
  66 + message << "<br /> - #{commit[:message]} (<a href=\"#{commit[:url]}\">#{commit[:id][0..5]}</a>)"
  67 + end
  68 + end
  69 +
  70 + message
  71 + end
  72 +
  73 +end
0 74 \ No newline at end of file
... ...
app/models/project.rb
... ... @@ -46,6 +46,7 @@ class Project &lt; ActiveRecord::Base
46 46 has_one :last_event, class_name: 'Event', order: 'events.created_at DESC', foreign_key: 'project_id'
47 47 has_one :gitlab_ci_service, dependent: :destroy
48 48 has_one :campfire_service, dependent: :destroy
  49 + has_one :hipchat_service, dependent: :destroy
49 50 has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id"
50 51 has_one :forked_from_project, through: :forked_project_link
51 52  
... ... @@ -236,7 +237,7 @@ class Project &lt; ActiveRecord::Base
236 237 end
237 238  
238 239 def available_services_names
239   - %w(gitlab_ci campfire)
  240 + %w(gitlab_ci campfire hipchat)
240 241 end
241 242  
242 243 def gitlab_ci?
... ...
features/project/service.feature
... ... @@ -12,3 +12,9 @@ Feature: Project Services
12 12 And I click gitlab-ci service link
13 13 And I fill gitlab-ci settings
14 14 Then I should see service settings saved
  15 +
  16 + Scenario: Activate hipchat service
  17 + When I visit project "Shop" services page
  18 + And I click hipchat service link
  19 + And I fill hipchat settings
  20 + Then I should see hipchat service settings saved
... ...
features/steps/project/project_services.rb
... ... @@ -10,6 +10,7 @@ class ProjectServices &lt; Spinach::FeatureSteps
10 10 Then 'I should see list of available services' do
11 11 page.should have_content 'Services'
12 12 page.should have_content 'Campfire'
  13 + page.should have_content 'Hipchat'
13 14 page.should have_content 'GitLab CI'
14 15 end
15 16  
... ... @@ -27,4 +28,20 @@ class ProjectServices &lt; Spinach::FeatureSteps
27 28 Then 'I should see service settings saved' do
28 29 find_field('Project url').value.should == 'http://ci.gitlab.org/projects/3'
29 30 end
  31 +
  32 + And 'I click hipchat service link' do
  33 + click_link 'Hipchat'
  34 + end
  35 +
  36 + And 'I fill hipchat settings' do
  37 + check 'Active'
  38 + fill_in 'Room', with: 'gitlab'
  39 + fill_in 'Token', with: 'verySecret'
  40 + click_button 'Save'
  41 + end
  42 +
  43 + Then 'I should see hipchat service settings saved' do
  44 + find_field('Room').value.should == 'gitlab'
  45 + end
  46 +
30 47 end
... ...