Commit 35880a5676e417deab3087841ad218ed49603b09
1 parent
f707fd46
Exists in
master
and in
1 other branch
Lighthouseapp tracker model.
Showing
7 changed files
with
93 additions
and
4 deletions
Show diff stats
Gemfile
@@ -6,6 +6,7 @@ gem 'mongoid', '~> 2.0.0.rc.7' | @@ -6,6 +6,7 @@ gem 'mongoid', '~> 2.0.0.rc.7' | ||
6 | gem 'haml' | 6 | gem 'haml' |
7 | gem 'will_paginate' | 7 | gem 'will_paginate' |
8 | gem 'devise', '~> 1.1.8' | 8 | gem 'devise', '~> 1.1.8' |
9 | +gem 'lighthouse-api' | ||
9 | 10 | ||
10 | platform :ruby do | 11 | platform :ruby do |
11 | gem 'bson_ext', '~> 1.2' | 12 | gem 'bson_ext', '~> 1.2' |
Gemfile.lock
@@ -46,6 +46,9 @@ GEM | @@ -46,6 +46,9 @@ GEM | ||
46 | railties (>= 3.0.0) | 46 | railties (>= 3.0.0) |
47 | haml (3.0.25) | 47 | haml (3.0.25) |
48 | i18n (0.5.0) | 48 | i18n (0.5.0) |
49 | + lighthouse-api (2.0) | ||
50 | + activeresource (>= 3.0.0) | ||
51 | + activesupport (>= 3.0.0) | ||
49 | mail (2.2.15) | 52 | mail (2.2.15) |
50 | activesupport (>= 2.3.6) | 53 | activesupport (>= 2.3.6) |
51 | i18n (>= 0.4.0) | 54 | i18n (>= 0.4.0) |
@@ -110,6 +113,7 @@ DEPENDENCIES | @@ -110,6 +113,7 @@ DEPENDENCIES | ||
110 | devise (~> 1.1.8) | 113 | devise (~> 1.1.8) |
111 | factory_girl_rails | 114 | factory_girl_rails |
112 | haml | 115 | haml |
116 | + lighthouse-api | ||
113 | mongoid (~> 2.0.0.rc.7) | 117 | mongoid (~> 2.0.0.rc.7) |
114 | nokogiri | 118 | nokogiri |
115 | rails (= 3.0.5) | 119 | rails (= 3.0.5) |
README.md
@@ -89,6 +89,11 @@ for you. Checkout [Hoptoad](http://hoptoadapp.com) from the guys over at | @@ -89,6 +89,11 @@ for you. Checkout [Hoptoad](http://hoptoadapp.com) from the guys over at | ||
89 | 89 | ||
90 | 4. Enjoy! | 90 | 4. Enjoy! |
91 | 91 | ||
92 | +Lighthouseapp integration | ||
93 | +------------------------- | ||
94 | + | ||
95 | +* Get an API token with full access to the project (visit http://help.lighthouseapp.com/kb/api/how-do-i-get-an-api-token to learn how to get it) | ||
96 | + | ||
92 | TODO | 97 | TODO |
93 | ---- | 98 | ---- |
94 | 99 |
app/controllers/apps_controller.rb
@@ -26,6 +26,7 @@ class AppsController < ApplicationController | @@ -26,6 +26,7 @@ class AppsController < ApplicationController | ||
26 | 26 | ||
27 | def edit | 27 | def edit |
28 | @app.watchers.build if @app.watchers.none? | 28 | @app.watchers.build if @app.watchers.none? |
29 | + @app.issue_trackers.build if @app.issue_trackers.none? | ||
29 | end | 30 | end |
30 | 31 | ||
31 | def create | 32 | def create |
app/models/app.rb
@@ -16,6 +16,7 @@ class App | @@ -16,6 +16,7 @@ class App | ||
16 | 16 | ||
17 | embeds_many :watchers | 17 | embeds_many :watchers |
18 | embeds_many :deploys | 18 | embeds_many :deploys |
19 | + embeds_many :issue_trackers | ||
19 | references_many :errs, :dependent => :destroy | 20 | references_many :errs, :dependent => :destroy |
20 | 21 | ||
21 | before_validation :generate_api_key, :on => :create | 22 | before_validation :generate_api_key, :on => :create |
@@ -24,9 +25,12 @@ class App | @@ -24,9 +25,12 @@ class App | ||
24 | validates_uniqueness_of :name, :allow_blank => true | 25 | validates_uniqueness_of :name, :allow_blank => true |
25 | validates_uniqueness_of :api_key, :allow_blank => true | 26 | validates_uniqueness_of :api_key, :allow_blank => true |
26 | validates_associated :watchers | 27 | validates_associated :watchers |
28 | + validate :check_issue_trackers | ||
27 | 29 | ||
28 | accepts_nested_attributes_for :watchers, :allow_destroy => true, | 30 | accepts_nested_attributes_for :watchers, :allow_destroy => true, |
29 | :reject_if => proc { |attrs| attrs[:user_id].blank? && attrs[:email].blank? } | 31 | :reject_if => proc { |attrs| attrs[:user_id].blank? && attrs[:email].blank? } |
32 | + accepts_nested_attributes_for :issue_trackers, :allow_destroy => true, | ||
33 | + :reject_if => proc { |attrs| !%w( lighthouseapp ).include?(attrs[:issue_tracker_type]) } | ||
30 | 34 | ||
31 | # Mongoid Bug: find(id) on association proxies returns an Enumerator | 35 | # Mongoid Bug: find(id) on association proxies returns an Enumerator |
32 | def self.find_by_id!(app_id) | 36 | def self.find_by_id!(app_id) |
@@ -46,5 +50,13 @@ class App | @@ -46,5 +50,13 @@ class App | ||
46 | def generate_api_key | 50 | def generate_api_key |
47 | self.api_key ||= ActiveSupport::SecureRandom.hex | 51 | self.api_key ||= ActiveSupport::SecureRandom.hex |
48 | end | 52 | end |
49 | - | 53 | + |
54 | + def check_issue_trackers | ||
55 | + issue_trackers.map(&:valid?) | ||
56 | + issue_trackers.each do |tracker| | ||
57 | + tracker.errors.full_messages.each do |error| | ||
58 | + errors[:base] << error | ||
59 | + end if tracker.errors | ||
60 | + end | ||
61 | + end | ||
50 | end | 62 | end |
@@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
1 | +class IssueTracker | ||
2 | + include Mongoid::Document | ||
3 | + include Mongoid::Timestamps | ||
4 | + | ||
5 | + validate :check_lighthouseapp_params | ||
6 | + | ||
7 | + embedded_in :app, :inverse_of => :issue_trackers | ||
8 | + | ||
9 | + field :account, :type => String | ||
10 | + field :api_token, :type => String | ||
11 | + field :project_id, :type => String | ||
12 | + field :issue_tracker_type, :type => String, :default => 'lighthouseapp' | ||
13 | + | ||
14 | + protected | ||
15 | + def check_lighthouseapp_params | ||
16 | + errors.add(:base, "You must specify your Lighthouseapp account, token and project id") if %w( api_token project_id account ).map {|m| self[m].blank? }.any? | ||
17 | + end | ||
18 | +end |
spec/controllers/apps_controller_spec.rb
@@ -147,7 +147,6 @@ describe AppsController do | @@ -147,7 +147,6 @@ describe AppsController do | ||
147 | describe "PUT /apps/:id" do | 147 | describe "PUT /apps/:id" do |
148 | before do | 148 | before do |
149 | @app = Factory(:app) | 149 | @app = Factory(:app) |
150 | - App.stub(:find).with(@app.id).and_return(@app) | ||
151 | end | 150 | end |
152 | 151 | ||
153 | context "when the update is successful" do | 152 | context "when the update is successful" do |
@@ -172,11 +171,60 @@ describe AppsController do | @@ -172,11 +171,60 @@ describe AppsController do | ||
172 | 171 | ||
173 | context "when the update is unsuccessful" do | 172 | context "when the update is unsuccessful" do |
174 | it "should render the edit page" do | 173 | it "should render the edit page" do |
175 | - @app.should_receive(:update_attributes).and_return(false) | ||
176 | - put :update, :id => @app.id, :app => {} | 174 | + put :update, :id => @app.id, :app => { :name => '' } |
177 | response.should render_template(:edit) | 175 | response.should render_template(:edit) |
178 | end | 176 | end |
179 | end | 177 | end |
178 | + | ||
179 | + context "setting up issue tracker", :cur => true do | ||
180 | + context "unknown tracker type" do | ||
181 | + before(:each) do | ||
182 | + put :update, :id => @app.id, :app => { :issue_trackers_attributes => { '0' => { | ||
183 | + :issue_tracker_type => 'unknown', :project_id => '1234', :api_token => '123123', :account => 'myapp' | ||
184 | + } } } | ||
185 | + @app.reload | ||
186 | + end | ||
187 | + | ||
188 | + it "should not create issue tracker" do | ||
189 | + @app.issue_trackers.should be_empty | ||
190 | + end | ||
191 | + end | ||
192 | + | ||
193 | + context "lighthouseapp" do | ||
194 | + it "should save tracker params" do | ||
195 | + put :update, :id => @app.id, :app => { :issue_trackers_attributes => { '0' => { | ||
196 | + :issue_tracker_type => 'lighthouseapp', :project_id => '1234', :api_token => '123123', :account => 'myapp' | ||
197 | + } } } | ||
198 | + @app.reload | ||
199 | + | ||
200 | + tracker = @app.issue_trackers.first | ||
201 | + tracker.issue_tracker_type.should == 'lighthouseapp' | ||
202 | + tracker.project_id.should == '1234' | ||
203 | + tracker.api_token.should == '123123' | ||
204 | + tracker.account.should == 'myapp' | ||
205 | + end | ||
206 | + | ||
207 | + it "should show validation notice when sufficient params are not present" do | ||
208 | + put :update, :id => @app.id, :app => { :issue_trackers_attributes => { '0' => { | ||
209 | + :issue_tracker_type => 'lighthouseapp', :project_id => '1234', :api_token => '123123' | ||
210 | + } } } | ||
211 | + @app.reload | ||
212 | + | ||
213 | + @app.issue_trackers.should be_empty | ||
214 | + response.body.should match(/You must specify your Lighthouseapp account, token and project id/) | ||
215 | + end | ||
216 | + | ||
217 | + it "should show validation notice when sufficient params are not present" do | ||
218 | + put :update, :id => @app.id, :app => { :issue_trackers_attributes => { '0' => { | ||
219 | + :issue_tracker_type => 'lighthouseapp', :project_id => '1234', :api_token => '123123' | ||
220 | + } } } | ||
221 | + @app.reload | ||
222 | + | ||
223 | + @app.issue_trackers.should be_empty | ||
224 | + response.body.should match(/You must specify your Lighthouseapp account, token and project id/) | ||
225 | + end | ||
226 | + end | ||
227 | + end | ||
180 | end | 228 | end |
181 | 229 | ||
182 | describe "DELETE /apps/:id" do | 230 | describe "DELETE /apps/:id" do |