Commit 18c3dc28ea5b0eb3f645266a336e035a77ab5aff

Authored by Shuky Dvir
2 parents 537c7e70 86b6e4df
Exists in master and in 1 other branch production

Merge branch 'master' of https://github.com/errbit/errbit into issue_148

Gemfile
1 1 source 'http://rubygems.org'
2 2  
3 3 gem 'rails', '3.2.8'
4   -
5   -gem 'nokogiri'
6 4 gem 'mongoid', '~> 2.4.10'
7   -
8   -# force SSL
9   -gem 'rack-ssl', :require => 'rack/ssl'
10   -
  5 +gem 'mongoid_rails_migrations'
  6 +gem 'devise', '~> 1.5.3'
  7 +gem 'nokogiri'
11 8 gem 'haml'
12 9 gem 'htmlentities', "~> 4.3.0"
  10 +gem 'rack-ssl', :require => 'rack/ssl' # force SSL
13 11  
14   -gem 'devise', '~> 1.5.3'
  12 +gem 'useragent', '~> 0.3.1'
  13 +gem 'inherited_resources'
  14 +gem 'SystemTimer', :platform => :ruby_18
  15 +gem 'actionmailer_inline_css', "~> 1.3.0"
  16 +gem 'kaminari'
  17 +gem 'rack-ssl-enforcer'
  18 +gem 'fabrication', "~> 1.3.0" # Used for both tests and demo data
  19 +gem 'rails_autolink', '~> 1.0.9'
  20 +# Please don't update hoptoad_notifier to airbrake.
  21 +# It's for internal use only, and we monkeypatch certain methods
  22 +gem 'hoptoad_notifier', "~> 2.4"
15 23  
16   -gem 'omniauth-github'
17   -gem 'oa-core'
18 24  
  25 +# Remove / comment out any of the gems below if you want to disable
  26 +# a given issue tracker, notification service, or authentication.
  27 +
  28 +# Issue Trackers
  29 +# ---------------------------------------
  30 +# Lighthouse
19 31 gem 'lighthouse-api'
  32 +# Redmine
20 33 gem 'oruen_redmine_client', :require => 'redmine_client'
21   -gem 'mongoid_rails_migrations'
22   -gem 'useragent', '~> 0.3.1'
  34 +# Pivotal Tracker
23 35 gem 'pivotal-tracker'
  36 +# Fogbugz
24 37 gem 'ruby-fogbugz', :require => 'fogbugz'
25   -
  38 +# Github Issues
26 39 gem 'octokit', '~> 1.0.0'
27 40  
28   -gem 'inherited_resources'
29   -gem 'SystemTimer', :platform => :ruby_18
30   -gem 'actionmailer_inline_css', "~> 1.3.0"
31   -gem 'kaminari'
32   -gem 'rack-ssl-enforcer'
33   -gem 'fabrication', "~> 1.3.0" # Both for tests, and loading demo data
34   -gem 'rails_autolink', '~> 1.0.9'
  41 +# Notification services
  42 +# ---------------------------------------
  43 +# Campfire
35 44 gem 'campy'
  45 +# Hipchat
36 46 gem 'hipchat'
37 47 gem 'hoi'
38 48  
39   -# Please don't update this to airbrake - We override the send_notice method
40   -# to handle internal errors.
41   -gem 'hoptoad_notifier', "~> 2.4"
  49 +# Authentication
  50 +# ---------------------------------------
  51 +# GitHub OAuth
  52 +gem 'omniauth-github'
  53 +
42 54  
43 55 platform :ruby do
44 56 gem 'mongo', '= 1.6.2'
... ... @@ -46,6 +58,8 @@ platform :ruby do
46 58 gem 'bson_ext', '= 1.6.2'
47 59 end
48 60  
  61 +gem 'omniauth'
  62 +gem 'oa-core'
49 63 gem 'ri_cal'
50 64 gem 'yajl-ruby', :require => "yajl"
51 65  
... ...
Gemfile.lock
... ... @@ -85,7 +85,7 @@ GEM
85 85 execjs (1.4.0)
86 86 multi_json (~> 1.0)
87 87 fabrication (1.3.2)
88   - faraday (0.8.1)
  88 + faraday (0.8.4)
89 89 multipart-post (~> 1.1)
90 90 faraday_middleware (0.8.8)
91 91 faraday (>= 0.7.4, < 0.9)
... ... @@ -175,13 +175,13 @@ GEM
175 175 faraday_middleware (~> 0.8)
176 176 hashie (~> 1.2)
177 177 multi_json (~> 1.3)
178   - omniauth (1.1.0)
  178 + omniauth (1.1.1)
179 179 hashie (~> 1.2)
180 180 rack
181 181 omniauth-github (1.0.2)
182 182 omniauth (~> 1.0)
183 183 omniauth-oauth2 (~> 1.1)
184   - omniauth-oauth2 (1.1.0)
  184 + omniauth-oauth2 (1.1.1)
185 185 oauth2 (~> 0.8.0)
186 186 omniauth (~> 1.0)
187 187 orm_adapter (0.0.7)
... ... @@ -334,6 +334,7 @@ DEPENDENCIES
334 334 nokogiri
335 335 oa-core
336 336 octokit (~> 1.0.0)
  337 + omniauth
337 338 omniauth-github
338 339 oruen_redmine_client
339 340 pivotal-tracker
... ...
app/models/issue_trackers/fogbugz_tracker.rb
1   -class IssueTrackers::FogbugzTracker < IssueTracker
2   - Label = "fogbugz"
3   - Fields = [
4   - [:project_id, {
5   - :label => "Area Name"
6   - }],
7   - [:account, {
8   - :label => "FogBugz URL",
9   - :placeholder => "abc from http://abc.fogbugz.com/"
10   - }],
11   - [:username, {
12   - :placeholder => "Username/Email for your account"
13   - }],
14   - [:password, {
15   - :placeholder => "Password for your account"
16   - }]
17   - ]
18   -
19   - def check_params
20   - if Fields.detect {|f| self[f[0]].blank? }
21   - errors.add :base, 'You must specify your FogBugz Area Name, FogBugz URL, Username, and Password'
  1 +if defined? Fogbugz
  2 + class IssueTrackers::FogbugzTracker < IssueTracker
  3 + Label = "fogbugz"
  4 + Fields = [
  5 + [:project_id, {
  6 + :label => "Area Name"
  7 + }],
  8 + [:account, {
  9 + :label => "FogBugz URL",
  10 + :placeholder => "abc from http://abc.fogbugz.com/"
  11 + }],
  12 + [:username, {
  13 + :placeholder => "Username/Email for your account"
  14 + }],
  15 + [:password, {
  16 + :placeholder => "Password for your account"
  17 + }]
  18 + ]
  19 +
  20 + def check_params
  21 + if Fields.detect {|f| self[f[0]].blank? }
  22 + errors.add :base, 'You must specify your FogBugz Area Name, FogBugz URL, Username, and Password'
  23 + end
22 24 end
23   - end
24 25  
25   - def create_issue(problem, reported_by = nil)
26   - fogbugz = Fogbugz::Interface.new(:email => username, :password => password, :uri => "https://#{account}.fogbugz.com")
27   - fogbugz.authenticate
  26 + def create_issue(problem, reported_by = nil)
  27 + fogbugz = Fogbugz::Interface.new(:email => username, :password => password, :uri => "https://#{account}.fogbugz.com")
  28 + fogbugz.authenticate
28 29  
29   - issue = {}
30   - issue['sTitle'] = issue_title problem
31   - issue['sArea'] = project_id
32   - issue['sEvent'] = body_template.result(binding)
33   - issue['sTags'] = ['errbit'].join(',')
34   - issue['cols'] = ['ixBug'].join(',')
  30 + issue = {}
  31 + issue['sTitle'] = issue_title problem
  32 + issue['sArea'] = project_id
  33 + issue['sEvent'] = body_template.result(binding)
  34 + issue['sTags'] = ['errbit'].join(',')
  35 + issue['cols'] = ['ixBug'].join(',')
35 36  
36   - fb_resp = fogbugz.command(:new, issue)
37   - problem.update_attributes(
38   - :issue_link => "https://#{account}.fogbugz.com/default.asp?#{fb_resp['case']['ixBug']}",
39   - :issue_type => Label
40   - )
  37 + fb_resp = fogbugz.command(:new, issue)
  38 + problem.update_attributes(
  39 + :issue_link => "https://#{account}.fogbugz.com/default.asp?#{fb_resp['case']['ixBug']}",
  40 + :issue_type => Label
  41 + )
41 42  
42   - end
  43 + end
43 44  
44   - def body_template
45   - @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/fogbugz_body.txt.erb"))
46   - end
  45 + def body_template
  46 + @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/fogbugz_body.txt.erb"))
  47 + end
47 48  
48   - def url
49   - "http://#{account}.fogbugz.com/"
  49 + def url
  50 + "http://#{account}.fogbugz.com/"
  51 + end
50 52 end
51 53 end
52   -
... ...
app/models/issue_trackers/github_issues_tracker.rb
1   -class IssueTrackers::GithubIssuesTracker < IssueTracker
2   - Label = "github"
3   - Note = 'Please configure your github repository in the <strong>GITHUB REPO</strong> field above.<br/>' <<
4   - 'Instead of providing your username & password, you can link your Github account ' <<
5   - 'to your user profile, and allow Errbit to create issues using your OAuth token.'
6   -
7   - Fields = [
8   - [:username, {
9   - :placeholder => "Your username on GitHub"
10   - }],
11   - [:password, {
12   - :placeholder => "Password for your account"
13   - }]
14   - ]
15   -
16   - attr_accessor :oauth_token
17   -
18   - def project_id
19   - app.github_repo
20   - end
21   -
22   - def check_params
23   - if Fields.detect {|f| self[f[0]].blank? }
24   - errors.add :base, 'You must specify your GitHub username and password'
  1 +if defined? Octokit
  2 + class IssueTrackers::GithubIssuesTracker < IssueTracker
  3 + Label = "github"
  4 + Note = 'Please configure your github repository in the <strong>GITHUB REPO</strong> field above.<br/>' <<
  5 + 'Instead of providing your username & password, you can link your Github account ' <<
  6 + 'to your user profile, and allow Errbit to create issues using your OAuth token.'
  7 +
  8 + Fields = [
  9 + [:username, {
  10 + :placeholder => "Your username on GitHub"
  11 + }],
  12 + [:password, {
  13 + :placeholder => "Password for your account"
  14 + }]
  15 + ]
  16 +
  17 + attr_accessor :oauth_token
  18 +
  19 + def project_id
  20 + app.github_repo
25 21 end
26   - end
27 22  
28   - def create_issue(problem, reported_by = nil)
29   - # Login using OAuth token, if given.
30   - if oauth_token
31   - client = Octokit::Client.new(:login => username, :oauth_token => oauth_token)
32   - else
33   - client = Octokit::Client.new(:login => username, :password => password)
  23 + def check_params
  24 + if Fields.detect {|f| self[f[0]].blank? }
  25 + errors.add :base, 'You must specify your GitHub username and password'
  26 + end
34 27 end
35 28  
36   - begin
37   - issue = client.create_issue(project_id, issue_title(problem), body_template.result(binding).unpack('C*').pack('U*'), options = {})
38   - problem.update_attributes(
39   - :issue_link => issue.html_url,
40   - :issue_type => Label
41   - )
42   -
43   - rescue Octokit::Unauthorized
44   - raise IssueTrackers::AuthenticationError, "Could not authenticate with GitHub. Please check your username and password."
  29 + def create_issue(problem, reported_by = nil)
  30 + # Login using OAuth token, if given.
  31 + if oauth_token
  32 + client = Octokit::Client.new(:login => username, :oauth_token => oauth_token)
  33 + else
  34 + client = Octokit::Client.new(:login => username, :password => password)
  35 + end
  36 +
  37 + begin
  38 + issue = client.create_issue(project_id, issue_title(problem), body_template.result(binding).unpack('C*').pack('U*'), options = {})
  39 + problem.update_attributes(
  40 + :issue_link => issue.html_url,
  41 + :issue_type => Label
  42 + )
  43 +
  44 + rescue Octokit::Unauthorized
  45 + raise IssueTrackers::AuthenticationError, "Could not authenticate with GitHub. Please check your username and password."
  46 + end
45 47 end
46   - end
47 48  
48   - def body_template
49   - @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/github_issues_body.txt.erb").gsub(/^\s*/, ''))
50   - end
  49 + def body_template
  50 + @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/github_issues_body.txt.erb").gsub(/^\s*/, ''))
  51 + end
51 52  
52   - def url
53   - "https://github.com/#{project_id}/issues"
  53 + def url
  54 + "https://github.com/#{project_id}/issues"
  55 + end
54 56 end
55 57 -end
  58 +end
56 59 \ No newline at end of file
... ...
app/models/issue_trackers/lighthouse_tracker.rb
1   -class IssueTrackers::LighthouseTracker < IssueTracker
2   - Label = "lighthouseapp"
3   - Fields = [
4   - [:account, {
5   - :placeholder => "abc from http://abc.lighthouseapp.com"
6   - }],
7   - [:api_token, {
8   - :placeholder => "API Token for your account"
9   - }],
10   - [:project_id, {
11   - :placeholder => "Lighthouse project"
12   - }]
13   - ]
14   -
15   - def check_params
16   - if Fields.detect {|f| self[f[0]].blank? }
17   - errors.add :base, 'You must specify your Lighthouseapp account, API token and Project ID'
  1 +if defined? Lighthouse
  2 + class IssueTrackers::LighthouseTracker < IssueTracker
  3 + Label = "lighthouseapp"
  4 + Fields = [
  5 + [:account, {
  6 + :placeholder => "abc from http://abc.lighthouseapp.com"
  7 + }],
  8 + [:api_token, {
  9 + :placeholder => "API Token for your account"
  10 + }],
  11 + [:project_id, {
  12 + :placeholder => "Lighthouse project"
  13 + }]
  14 + ]
  15 +
  16 + def check_params
  17 + if Fields.detect {|f| self[f[0]].blank? }
  18 + errors.add :base, 'You must specify your Lighthouseapp account, API token and Project ID'
  19 + end
18 20 end
19   - end
20 21  
21   - def create_issue(problem, reported_by = nil)
22   - Lighthouse.account = account
23   - Lighthouse.token = api_token
24   - # updating lighthouse account
25   - Lighthouse::Ticket.site
26   - Lighthouse::Ticket.format = :xml
27   - ticket = Lighthouse::Ticket.new(:project_id => project_id)
28   - ticket.title = issue_title problem
  22 + def create_issue(problem, reported_by = nil)
  23 + Lighthouse.account = account
  24 + Lighthouse.token = api_token
  25 + # updating lighthouse account
  26 + Lighthouse::Ticket.site
  27 + Lighthouse::Ticket.format = :xml
  28 + ticket = Lighthouse::Ticket.new(:project_id => project_id)
  29 + ticket.title = issue_title problem
29 30  
30   - ticket.body = body_template.result(binding)
  31 + ticket.body = body_template.result(binding)
31 32  
32   - ticket.tags << "errbit"
33   - ticket.save!
34   - problem.update_attributes(
35   - :issue_link => "#{Lighthouse::Ticket.site.to_s.sub(/#{Lighthouse::Ticket.site.path}$/, '')}#{Lighthouse::Ticket.element_path(ticket.id, :project_id => project_id)}".sub(/\.xml$/, ''),
36   - :issue_type => Label
37   - )
  33 + ticket.tags << "errbit"
  34 + ticket.save!
  35 + problem.update_attributes(
  36 + :issue_link => "#{Lighthouse::Ticket.site.to_s.sub(/#{Lighthouse::Ticket.site.path}$/, '')}#{Lighthouse::Ticket.element_path(ticket.id, :project_id => project_id)}".sub(/\.xml$/, ''),
  37 + :issue_type => Label
  38 + )
38 39  
39   - end
  40 + end
40 41  
41   - def body_template
42   - @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/lighthouseapp_body.txt.erb").gsub(/^\s*/, ''))
43   - end
  42 + def body_template
  43 + @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/lighthouseapp_body.txt.erb").gsub(/^\s*/, ''))
  44 + end
44 45  
45   - def url
46   - "http://#{account}.lighthouseapp.com"
  46 + def url
  47 + "http://#{account}.lighthouseapp.com"
  48 + end
47 49 end
48   -end
49   -
  50 +end
50 51 \ No newline at end of file
... ...
app/models/issue_trackers/pivotal_labs_tracker.rb
1   -class IssueTrackers::PivotalLabsTracker < IssueTracker
2   - Label = "pivotal"
3   - Fields = [
4   - [:api_token, {
5   - :placeholder => "API Token for your account"
6   - }],
7   - [:project_id, {}]
8   - ]
  1 +if defined? PivotalTracker
  2 + class IssueTrackers::PivotalLabsTracker < IssueTracker
  3 + Label = "pivotal"
  4 + Fields = [
  5 + [:api_token, {
  6 + :placeholder => "API Token for your account"
  7 + }],
  8 + [:project_id, {}]
  9 + ]
9 10  
10   - def check_params
11   - if Fields.detect {|f| self[f[0]].blank? }
12   - errors.add :base, 'You must specify your Pivotal Tracker API token and Project ID'
  11 + def check_params
  12 + if Fields.detect {|f| self[f[0]].blank? }
  13 + errors.add :base, 'You must specify your Pivotal Tracker API token and Project ID'
  14 + end
13 15 end
14   - end
15 16  
16   - def create_issue(problem, reported_by = nil)
17   - PivotalTracker::Client.token = api_token
18   - PivotalTracker::Client.use_ssl = true
19   - project = PivotalTracker::Project.find project_id.to_i
20   - story = project.stories.create :name => issue_title(problem),
21   - :story_type => 'bug', :description => body_template.result(binding),
22   - :requested_by => reported_by.name
  17 + def create_issue(problem, reported_by = nil)
  18 + PivotalTracker::Client.token = api_token
  19 + PivotalTracker::Client.use_ssl = true
  20 + project = PivotalTracker::Project.find project_id.to_i
  21 + story = project.stories.create :name => issue_title(problem),
  22 + :story_type => 'bug', :description => body_template.result(binding),
  23 + :requested_by => reported_by.name
23 24  
24   - if story.errors.present?
25   - raise IssueTrackers::IssueTrackerError, story.errors.first
26   - else
27   - problem.update_attributes(
28   - :issue_link => "https://www.pivotaltracker.com/story/show/#{story.id}",
29   - :issue_type => Label
30   - )
  25 + if story.errors.present?
  26 + raise IssueTrackers::IssueTrackerError, story.errors.first
  27 + else
  28 + problem.update_attributes(
  29 + :issue_link => "https://www.pivotaltracker.com/story/show/#{story.id}",
  30 + :issue_type => Label
  31 + )
  32 + end
31 33 end
32   - end
33 34  
34   - def body_template
35   - @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/pivotal_body.txt.erb"))
36   - end
  35 + def body_template
  36 + @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/pivotal_body.txt.erb"))
  37 + end
37 38  
38   - def url
39   - "https://www.pivotaltracker.com/"
  39 + def url
  40 + "https://www.pivotaltracker.com/"
  41 + end
40 42 end
41   -end
42   -
  43 +end
43 44 \ No newline at end of file
... ...
app/models/issue_trackers/redmine_tracker.rb
1   -class IssueTrackers::RedmineTracker < IssueTracker
2   - Label = "redmine"
3   - Fields = [
4   - [:account, {
5   - :label => "Redmine URL",
6   - :placeholder => "e.g. http://www.redmine.org/"
7   - }],
8   - [:api_token, {
9   - :placeholder => "API Token for your account"
10   - }],
11   - [:project_id, {
12   - :label => "Ticket Project",
13   - :placeholder => "Redmine Project where tickets will be created"
14   - }],
15   - [:alt_project_id, {
16   - :optional => true,
17   - :label => "App Project",
18   - :placeholder => "Where app's files & revisions can be viewed. (Leave blank to use the above project by default)"
19   - }]
20   - ]
  1 +if defined? RedmineClient
  2 + class IssueTrackers::RedmineTracker < IssueTracker
  3 + Label = "redmine"
  4 + Fields = [
  5 + [:account, {
  6 + :label => "Redmine URL",
  7 + :placeholder => "e.g. http://www.redmine.org/"
  8 + }],
  9 + [:api_token, {
  10 + :placeholder => "API Token for your account"
  11 + }],
  12 + [:project_id, {
  13 + :label => "Ticket Project",
  14 + :placeholder => "Redmine Project where tickets will be created"
  15 + }],
  16 + [:alt_project_id, {
  17 + :optional => true,
  18 + :label => "App Project",
  19 + :placeholder => "Where app's files & revisions can be viewed. (Leave blank to use the above project by default)"
  20 + }]
  21 + ]
21 22  
22   - def check_params
23   - if Fields.detect {|f| self[f[0]].blank? && !f[1][:optional]}
24   - errors.add :base, 'You must specify your Redmine URL, API token and Project ID'
  23 + def check_params
  24 + if Fields.detect {|f| self[f[0]].blank? && !f[1][:optional]}
  25 + errors.add :base, 'You must specify your Redmine URL, API token and Project ID'
  26 + end
25 27 end
26   - end
27 28  
28   - def create_issue(problem, reported_by = nil)
29   - token = api_token
30   - acc = account
31   - RedmineClient::Base.configure do
32   - self.token = token
33   - self.site = acc
34   - self.format = :xml
  29 + def create_issue(problem, reported_by = nil)
  30 + token = api_token
  31 + acc = account
  32 + RedmineClient::Base.configure do
  33 + self.token = token
  34 + self.site = acc
  35 + self.format = :xml
  36 + end
  37 + issue = RedmineClient::Issue.new(:project_id => project_id)
  38 + issue.subject = issue_title problem
  39 + issue.description = body_template.result(binding)
  40 + issue.save!
  41 + problem.update_attributes(
  42 + :issue_link => "#{RedmineClient::Issue.site.to_s.sub(/#{RedmineClient::Issue.site.path}$/, '')}#{RedmineClient::Issue.element_path(issue.id, :project_id => project_id)}".sub(/\.xml\?project_id=#{project_id}$/, "\?project_id=#{project_id}"),
  43 + :issue_type => Label
  44 + )
35 45 end
36   - issue = RedmineClient::Issue.new(:project_id => project_id)
37   - issue.subject = issue_title problem
38   - issue.description = body_template.result(binding)
39   - issue.save!
40   - problem.update_attributes(
41   - :issue_link => "#{RedmineClient::Issue.site.to_s.sub(/#{RedmineClient::Issue.site.path}$/, '')}#{RedmineClient::Issue.element_path(issue.id, :project_id => project_id)}".sub(/\.xml\?project_id=#{project_id}$/, "\?project_id=#{project_id}"),
42   - :issue_type => Label
43   - )
44   - end
45 46  
46   - def url_to_file(file_path, line_number = nil)
47   - # alt_project_id let's users specify a different project for tickets / app files.
48   - project = self.alt_project_id.present? ? self.alt_project_id : self.project_id
49   - url = "#{self.account}/projects/#{project}/repository/annotate/#{file_path.sub(/^\//,'')}"
50   - line_number ? url << "#L#{line_number}" : url
51   - end
  47 + def url_to_file(file_path, line_number = nil)
  48 + # alt_project_id let's users specify a different project for tickets / app files.
  49 + project = self.alt_project_id.present? ? self.alt_project_id : self.project_id
  50 + url = "#{self.account}/projects/#{project}/repository/annotate/#{file_path.sub(/^\//,'')}"
  51 + line_number ? url << "#L#{line_number}" : url
  52 + end
52 53  
53   - def body_template
54   - @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/textile_body.txt.erb"))
55   - end
  54 + def body_template
  55 + @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/textile_body.txt.erb"))
  56 + end
56 57  
57   - def url
58   - acc_url = account.start_with?('http') ? account : "http://#{account}"
59   - URI.parse("#{acc_url}?project_id=#{project_id}").to_s
60   - rescue URI::InvalidURIError
  58 + def url
  59 + acc_url = account.start_with?('http') ? account : "http://#{account}"
  60 + URI.parse("#{acc_url}?project_id=#{project_id}").to_s
  61 + rescue URI::InvalidURIError
  62 + end
61 63 end
62 64 end
63   -
... ...
app/models/notification_services/campfire_service.rb
1   -class NotificationServices::CampfireService < NotificationService
2   - Label = "campfire"
3   - Fields = [
4   - [:subdomain, {
5   - :placeholder => "Campfire Subdomain"
6   - }],
7   - [:api_token, {
8   - :placeholder => "API Token"
9   - }],
10   - [:room_id, {
11   - :placeholder => "Room ID",
12   - :label => "Room ID"
13   - }],
14   - ]
  1 +if defined? Campy
  2 + class NotificationServices::CampfireService < NotificationService
  3 + Label = "campfire"
  4 + Fields = [
  5 + [:subdomain, {
  6 + :placeholder => "Campfire Subdomain"
  7 + }],
  8 + [:api_token, {
  9 + :placeholder => "API Token"
  10 + }],
  11 + [:room_id, {
  12 + :placeholder => "Room ID",
  13 + :label => "Room ID"
  14 + }],
  15 + ]
15 16  
16   - def check_params
17   - if Fields.detect {|f| self[f[0]].blank? }
18   - errors.add :base, 'You must specify your Campfire Subdomain, API token and Room ID'
  17 + def check_params
  18 + if Fields.detect {|f| self[f[0]].blank? }
  19 + errors.add :base, 'You must specify your Campfire Subdomain, API token and Room ID'
  20 + end
19 21 end
20   - end
21 22  
22   - def create_notification(problem)
23   - # build the campfire client
24   - campy = Campy::Room.new(:account => subdomain, :token => api_token, :room_id => room_id)
  23 + def create_notification(problem)
  24 + # build the campfire client
  25 + campy = Campy::Room.new(:account => subdomain, :token => api_token, :room_id => room_id)
25 26  
26   - # post the issue to the campfire room
27   - campy.speak "[errbit] http://#{Errbit::Config.host}/apps/#{problem.app.id.to_s} #{notification_description problem}"
  27 + # post the issue to the campfire room
  28 + campy.speak "[errbit] http://#{Errbit::Config.host}/apps/#{problem.app.id.to_s} #{notification_description problem}"
  29 + end
28 30 end
29 31 end
30 32 \ No newline at end of file
... ...
app/models/notification_services/hipchat_service.rb
1   -class NotificationServices::HipchatService < NotificationService
2   - Label = 'hipchat'
3   - Fields = [
4   - [:api_token, {
5   - :placeholder => "API Token"
6   - }],
7   - [:room_id, {
8   - :placeholder => "Room ID",
9   - :label => "Room ID"
10   - }],
11   - ]
  1 +if defined? HipChat
  2 + class NotificationServices::HipchatService < NotificationService
  3 + Label = 'hipchat'
  4 + Fields = [
  5 + [:api_token, {
  6 + :placeholder => "API Token"
  7 + }],
  8 + [:room_id, {
  9 + :placeholder => "Room ID",
  10 + :label => "Room ID"
  11 + }],
  12 + ]
12 13  
13   - def check_params
14   - if Fields.any? { |f, _| self[f].blank? }
15   - errors.add :base, 'You must specify your Hipchat API token and Room ID'
  14 + def check_params
  15 + if Fields.any? { |f, _| self[f].blank? }
  16 + errors.add :base, 'You must specify your Hipchat API token and Room ID'
  17 + end
16 18 end
17   - end
18 19  
19   - def create_notification(problem)
20   - url = app_problem_url problem.app, problem
21   - message = <<-MSG.strip_heredoc
22   - [#{ERB::Util.html_escape problem.app.name}]#{ERB::Util.html_escape notification_description(problem)}<br>
23   - <a href="#{url}">#{url}</a>
24   - MSG
  20 + def create_notification(problem)
  21 + url = app_problem_url problem.app, problem
  22 + message = <<-MSG.strip_heredoc
  23 + [#{ERB::Util.html_escape problem.app.name}]#{ERB::Util.html_escape notification_description(problem)}<br>
  24 + <a href="#{url}">#{url}</a>
  25 + MSG
25 26  
26   - client = HipChat::Client.new(api_token)
27   - client[room_id].send('Errbit', message, :color => 'red')
  27 + client = HipChat::Client.new(api_token)
  28 + client[room_id].send('Errbit', message, :color => 'red')
  29 + end
28 30 end
29 31 -end
  32 +end
30 33 \ No newline at end of file
... ...
config/initializers/_load_config.rb
... ... @@ -60,6 +60,9 @@ default_config.each do |k,v|
60 60 Errbit::Config.send("#{k}=", v) if Errbit::Config.send(k) === nil
61 61 end
62 62  
  63 +# Disable GitHub oauth if gem is missing
  64 +Errbit::Config.github_authentication = false unless defined?(OmniAuth::Strategies::GitHub)
  65 +
63 66 # Set SMTP settings if given.
64 67 if smtp = Errbit::Config.smtp_settings
65 68 ActionMailer::Base.delivery_method = :smtp
... ...
lib/issue_trackers/apis/mingle.rb
  1 +require 'active_resource'
  2 +
1 3 module Mingle
2 4 class Card < ActiveResource::Base
3 5 # site template ~> "https://username:password@mingle.example.com/api/v1/projects/:project_id/"
... ...