Commit f4f7de6dbc0e3045d2e49d43264eb95268075d1f
1 parent
fa4c7f79
Exists in
master
and in
1 other branch
got the issue tracker fogbugz integration mostly working
Showing
11 changed files
with
109 additions
and
28 deletions
Show diff stats
Gemfile
Gemfile.lock
... | ... | @@ -45,7 +45,7 @@ GEM |
45 | 45 | addressable (2.2.5) |
46 | 46 | arel (2.0.9) |
47 | 47 | bcrypt-ruby (2.1.4) |
48 | - bson (1.3.0) | |
48 | + bson (1.3.1) | |
49 | 49 | bson_ext (1.3.0) |
50 | 50 | builder (2.1.2) |
51 | 51 | crack (0.1.8) |
... | ... | @@ -78,13 +78,12 @@ GEM |
78 | 78 | mime-types (~> 1.16) |
79 | 79 | treetop (~> 1.4.8) |
80 | 80 | mime-types (1.16) |
81 | - mongo (1.3.0) | |
82 | - bson (>= 1.3.0) | |
83 | - mongoid (2.0.0.rc.8) | |
81 | + mongo (1.3.1) | |
82 | + bson (>= 1.3.1) | |
83 | + mongoid (2.0.2) | |
84 | 84 | activemodel (~> 3.0) |
85 | - mongo (~> 1.2) | |
85 | + mongo (~> 1.3) | |
86 | 86 | tzinfo (~> 0.3.22) |
87 | - will_paginate (~> 3.0.pre) | |
88 | 87 | mongoid_rails_migrations (0.0.10) |
89 | 88 | activesupport (~> 3.0.0) |
90 | 89 | bundler (>= 0.9.19) |
... | ... | @@ -161,7 +160,7 @@ DEPENDENCIES |
161 | 160 | factory_girl_rails |
162 | 161 | haml |
163 | 162 | lighthouse-api |
164 | - mongoid (= 2.0.0.rc.8) | |
163 | + mongoid (= 2.0.2) | |
165 | 164 | mongoid_rails_migrations |
166 | 165 | nokogiri |
167 | 166 | pivotal-tracker | ... | ... |
app/helpers/application_helper.rb
app/models/app.rb
... | ... | @@ -21,7 +21,7 @@ class App |
21 | 21 | embeds_many :watchers |
22 | 22 | embeds_many :deploys |
23 | 23 | embeds_one :issue_tracker |
24 | - references_many :errs, :dependent => :destroy | |
24 | + has_many :errs, :dependent => :destroy | |
25 | 25 | |
26 | 26 | before_validation :generate_api_key, :on => :create |
27 | 27 | before_save :normalize_github_url |
... | ... | @@ -35,7 +35,7 @@ class App |
35 | 35 | accepts_nested_attributes_for :watchers, :allow_destroy => true, |
36 | 36 | :reject_if => proc { |attrs| attrs[:user_id].blank? && attrs[:email].blank? } |
37 | 37 | accepts_nested_attributes_for :issue_tracker, :allow_destroy => true, |
38 | - :reject_if => proc { |attrs| !%w(lighthouseapp redmine pivotal).include?(attrs[:issue_tracker_type]) } | |
38 | + :reject_if => proc { |attrs| !%w(lighthouseapp redmine pivotal fogbugz).include?(attrs[:issue_tracker_type]) } | |
39 | 39 | |
40 | 40 | # Mongoid Bug: find(id) on association proxies returns an Enumerator |
41 | 41 | def self.find_by_id!(app_id) | ... | ... |
app/models/err.rb
app/models/issue_tracker.rb
... | ... | @@ -12,6 +12,8 @@ class IssueTracker |
12 | 12 | field :account, :type => String |
13 | 13 | field :api_token, :type => String |
14 | 14 | field :project_id, :type => String |
15 | + field :username, :type => String | |
16 | + field :password, :type => String | |
15 | 17 | field :issue_tracker_type, :type => String, :default => 'lighthouseapp' |
16 | 18 | |
17 | 19 | def create_issue err |
... | ... | @@ -68,18 +70,20 @@ class IssueTracker |
68 | 70 | end |
69 | 71 | |
70 | 72 | def create_fogbugz_issue err |
71 | - fogbugz = Fogbugz::Interface.new(:email => email, :password => password, :uri => uri) | |
72 | - fogbugz.account = account | |
73 | - fogbugz.token = api_token | |
73 | + fogbugz = Fogbugz::Interface.new(:email => username, :password => password, :uri => "https://#{account}.fogbugz.com") | |
74 | + fogbugz.authenticate | |
74 | 75 | |
75 | 76 | issue = {} |
76 | 77 | issue['sTitle'] = issue_title err |
77 | - issue['sProject'] = project_id | |
78 | + issue['sArea'] = project_id | |
79 | + puts err.app.inspect | |
80 | + puts app_err_url(err.app, err) | |
78 | 81 | issue['sEvent'] = self.class.fogbugz_body_template.result(binding) |
79 | - issue['sTags'] << 'errbit' | |
82 | + issue['sTags'] = ['errbit'].join(',') | |
83 | + issue['cols'] = ['ixBug'].join(',') | |
80 | 84 | |
81 | - fogbugz.command( | |
82 | - # err.update_attribute :issue_link, "#{FogBugz::Issue.site.to_s.sub(/#{FogBugz::Issue.site.path}$/, '')}#{FogBugz::Issue.element_path(issue.id, :project => project_id}".sub(/\.xml$/, '') | |
85 | + # fb_resp = fogbugz.command(:new, issue) | |
86 | + # err.update_attribute :issue_link, "https://#{account}.fogbugz.com/default.asp?#{fb_resp['case']['ixBug']}" | |
83 | 87 | end |
84 | 88 | |
85 | 89 | def issue_title err |
... | ... | @@ -87,19 +91,24 @@ class IssueTracker |
87 | 91 | end |
88 | 92 | |
89 | 93 | def check_params |
90 | - blank_flag_fields = %w(api_token project_id) | |
91 | - blank_flag_fields << 'account' if %w(lighthouseapp redmine).include? issue_tracker_type | |
94 | + blank_flag_fields = %w(project_id) | |
95 | + if(%w(fogbugz).include?(issue_tracker_type)) | |
96 | + blank_flag_fields += %w(username password) | |
97 | + else | |
98 | + blank_flag_fields << 'api_token' | |
99 | + end | |
100 | + blank_flag_fields << 'account' if(%w(fogbugz lighthouseapp redmine).include?(issue_tracker_type)) | |
92 | 101 | blank_flags = blank_flag_fields.map {|m| self[m].blank? } |
93 | 102 | if blank_flags.any? && !blank_flags.all? |
94 | 103 | message = case issue_tracker_type |
95 | 104 | when 'lighthouseapp' |
96 | - "You must specify your Lighthouseapp account, api token and project id" | |
105 | + 'You must specify your Lighthouseapp account, api token and project id' | |
97 | 106 | when 'redmine' |
98 | - "You must specify your Redmine url, api token and project id" | |
107 | + 'You must specify your Redmine url, api token and project id' | |
99 | 108 | when 'pivotal' |
100 | - "You must specify your Pivotal Tracker api token and project id" | |
109 | + 'You must specify your Pivotal Tracker api token and project id' | |
101 | 110 | when 'fogbugz' |
102 | - "You must specify your FogBugz account, project id, username, and password" | |
111 | + 'You must specify your FogBugz Area Name, Username, and Password' | |
103 | 112 | end |
104 | 113 | errors.add(:base, message) |
105 | 114 | end | ... | ... |
app/models/notice.rb
app/views/apps/_fields.html.haml
... | ... | @@ -45,13 +45,15 @@ |
45 | 45 | = label_tag :issue_tracker_type_redmine, 'Redmine', :for => label_for_attr(w, 'issue_tracker_type_redmine') |
46 | 46 | = w.radio_button :issue_tracker_type, :pivotal |
47 | 47 | = label_tag :issue_tracker_type_pivotal, 'Pivotal Tracker', :for => label_for_attr(w, 'issue_tracker_type_pivotal') |
48 | + = w.radio_button :issue_tracker_type, :fogbugz | |
49 | + = label_tag :issue_tracker_type_fogbugz, 'FogBugz', :for => label_for_attr(w, 'issue_tracker_type_fogbugz') | |
48 | 50 | %div.tracker_params.lighthouseapp{:class => lighthouse_tracker?(w.object) ? 'chosen' : nil} |
49 | 51 | = w.label :account, "Account" |
50 | 52 | = w.text_field :account, :placeholder => "abc from abc.lighthouseapp.com" |
51 | 53 | = w.label :api_token, "API token" |
52 | 54 | = w.text_field :api_token, :placeholder => "API Token for your account" |
53 | 55 | = w.label :project_id, "Project ID" |
54 | - = w.text_field :project_id, :placeholder => "123 from abc from abc.lighthouseapp.com/projects/123" | |
56 | + = w.text_field :project_id, :placeholder => "123 from abc.lighthouseapp.com/projects/123" | |
55 | 57 | %div.tracker_params.redmine{:class => redmine_tracker?(w.object) ? 'chosen' : nil} |
56 | 58 | = w.label :account, "Redmine URL" |
57 | 59 | = w.text_field :account, :placeholder => "like http://www.redmine.org/" |
... | ... | @@ -64,3 +66,12 @@ |
64 | 66 | = w.text_field :project_id |
65 | 67 | = w.label :api_token, "API token" |
66 | 68 | = w.text_field :api_token, :placeholder => "API Token for your account" |
69 | + %div.tracker_params.fogbugz{:class => fogbugz_tracker?(w.object) ? 'chosen' : nil} | |
70 | + = w.label :project_id, "Area Name" | |
71 | + = w.text_field :project_id | |
72 | + = w.label :account, "FogBugz URL" | |
73 | + = w.text_field :account, :placeholder => "abc from http://abc.fogbugz.com/" | |
74 | + = w.label :username, 'account username' | |
75 | + = w.text_field :username, :placeholder => 'Username/Email for your account' | |
76 | + = w.label :password, 'account password' | |
77 | + = w.password_field :password, :placeholder => 'Password for your account' | ... | ... |
... | ... | @@ -0,0 +1,31 @@ |
1 | +"See this exception on Errbit": <%= app_err_url(err.app, err) %> | |
2 | +<% if notice = err.notices.first %> | |
3 | + <%= notice.message %> | |
4 | + | |
5 | + Summary | |
6 | + - Where | |
7 | + <%= notice.err.where %> | |
8 | + | |
9 | + - Occured | |
10 | + <%= notice.created_at.to_s(:micro) %> | |
11 | + | |
12 | + - Similar | |
13 | + <%= (notice.err.notices_count - 1).to_s %> | |
14 | + | |
15 | + Params | |
16 | + <%= pretty_hash(notice.params) %> | |
17 | + | |
18 | + Session | |
19 | + <%= pretty_hash(notice.session) %> | |
20 | + | |
21 | + Backtrace | |
22 | + <% for line in notice.backtrace %> | |
23 | + <%= line['number'] %>: <%= line['file'].sub(/^\[PROJECT_ROOT\]/, '') %> | |
24 | + <% end %> | |
25 | + | |
26 | + Environment | |
27 | + <% for key, val in notice.env_vars %> | |
28 | + <%= key %>: <%= val %> | |
29 | + <% end %> | |
30 | +<% end %> | |
31 | + | ... | ... |
public/stylesheets/application.css
... | ... | @@ -507,7 +507,7 @@ a.button.active { |
507 | 507 | } |
508 | 508 | |
509 | 509 | /* Watchers and Issue Tracker Forms */ |
510 | -div.nested.watcher .user, div.nested.watcher .email, div.issue_tracker.nested .lighthouseapp, div.issue_tracker.nested .redmine, div.issue_tracker.nested .pivotal { | |
510 | +div.nested.watcher .user, div.nested.watcher .email, div.issue_tracker.nested .lighthouseapp, div.issue_tracker.nested .redmine, div.issue_tracker.nested .pivotal, div.issue_tracker.nested .fogbugz { | |
511 | 511 | display: none; |
512 | 512 | } |
513 | 513 | div.nested.watcher .choosen, div.nested.issue_tracker .chosen { | ... | ... |
spec/controllers/apps_controller_spec.rb
... | ... | @@ -261,6 +261,33 @@ describe AppsController do |
261 | 261 | response.body.should match(/You must specify your Pivotal Tracker api token and project id/) |
262 | 262 | end |
263 | 263 | end |
264 | + | |
265 | + context "fogbugz" do | |
266 | + context 'with correct params' do | |
267 | + before do | |
268 | + put :update, :id => @app.id, :app => { :issue_tracker_attributes => { | |
269 | + :issue_tracker_type => 'fogbugz', :project_id => 'Service - Peon', :username => '1234', :password => '123123' } } | |
270 | + @app.reload | |
271 | + end | |
272 | + | |
273 | + subject {@app.issue_tracker} | |
274 | + its(:issue_tracker_type) {should == 'fogbugz'} | |
275 | + its(:project_id) {should == 'Service - Peon'} | |
276 | + its(:username) {should == '1234'} | |
277 | + its(:password) {should == '123123'} | |
278 | + end | |
279 | + | |
280 | + context 'insufficient params' do | |
281 | + it 'shows validation notice' do | |
282 | + put :update, :id => @app.id, :app => { :issue_tracker_attributes => { | |
283 | + :issue_tracker_type => 'fogbugz', :project_id => '1234' } } | |
284 | + @app.reload | |
285 | + | |
286 | + @app.issue_tracker.should be_nil | |
287 | + response.body.should match(/You must specify your FogBugz Area Name, Username, and Password/) | |
288 | + end | |
289 | + end | |
290 | + end | |
264 | 291 | end |
265 | 292 | end |
266 | 293 | ... | ... |