diff --git a/Gemfile b/Gemfile index 568e9ef..7c89769 100644 --- a/Gemfile +++ b/Gemfile @@ -42,6 +42,10 @@ gem 'gitlab', :git => 'git://github.com/NARKOZ/gitlab' # Bitbucket Issues gem 'bitbucket_rest_api' +# Unfuddle +gem "taskmapper", "~> 0.8.0" +gem "taskmapper-unfuddle", "~> 0.7.0" + # Notification services # --------------------------------------- # Campfire diff --git a/Gemfile.lock b/Gemfile.lock index c0f46c1..172f295 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -303,6 +303,13 @@ GEM multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) + taskmapper (0.8.0) + activeresource (~> 3.0) + activesupport (~> 3.0) + hashie (~> 1.2) + taskmapper-unfuddle (0.7.0) + addressable (~> 2.2) + taskmapper (~> 0.8) therubyracer (0.11.4) libv8 (~> 3.11.8.12) ref @@ -389,6 +396,8 @@ DEPENDENCIES ruby-debug ruby-fogbugz rushover + taskmapper (~> 0.8.0) + taskmapper-unfuddle (~> 0.7.0) therubyracer thin timecop diff --git a/app/models/issue_tracker.rb b/app/models/issue_tracker.rb index f37f02d..ee25648 100644 --- a/app/models/issue_tracker.rb +++ b/app/models/issue_tracker.rb @@ -15,6 +15,7 @@ class IssueTracker field :password, :type => String field :ticket_properties, :type => String field :subdomain, :type => String + field :milestone_id, :type => String validate :check_params @@ -40,4 +41,3 @@ class IssueTracker project_id.present? end end - diff --git a/app/models/issue_trackers/unfuddle_tracker.rb b/app/models/issue_trackers/unfuddle_tracker.rb new file mode 100644 index 0000000..0cbb4f5 --- /dev/null +++ b/app/models/issue_trackers/unfuddle_tracker.rb @@ -0,0 +1,69 @@ +class IssueTrackers::UnfuddleTracker < IssueTracker + Label = "unfuddle" + Fields = [ + + [:account, { + :placeholder => "Your domain" + }], + + + [:username, { + :placeholder => "Your username" + }], + + [:password, { + :placeholder => "Your password" + }], + + [:project_id, { + :label => "Ticket Project", + :placeholder => "Project where tickets will be created" + }], + + [:milestone_id, { + :optional => true, + :label => "Ticket Milestone", + :placeholder => "Milestone where tickets will be created" + }] + + + ] + + def check_params + if Fields.detect {|f| self[f[0]].blank? && !f[1][:optional]} + errors.add :base, 'You must specify your Account, Username, Password and Project ID' + end + end + + def create_issue(problem, reported_by = nil) + unfuddle = TaskMapper.new(:unfuddle, :username => username, :password => password, :account => account) + + begin + issue_options = {:project_id => project_id, + :summary => issue_title(problem), + :priority => '5', + :status => "new", + :description => body_template.result(binding), + 'description-format' => 'textile' } + + issue_options[:milestone_id] = milestone_id if milestone_id.present? + + issue = unfuddle.project(project_id.to_i).ticket!(issue_options) + problem.update_attributes( + :issue_link => "https://#{account}.unfuddle.com/projects/#{project_id}/tickets/#{issue['id']}", + :issue_type => Label + ) + rescue ActiveResource::UnauthorizedAccess + raise ActiveResource::UnauthorizedAccess, "Could not authenticate with Unfuddle. Please check your username and password." + end + + end + + def body_template + @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/textile_body.txt.erb")) + end + + def url + "https://devmen.unfuddle.com/projects/#{project_id}" + end +end diff --git a/spec/fabricators/issue_tracker_fabricator.rb b/spec/fabricators/issue_tracker_fabricator.rb index b51fceb..425087b 100644 --- a/spec/fabricators/issue_tracker_fabricator.rb +++ b/spec/fabricators/issue_tracker_fabricator.rb @@ -33,3 +33,8 @@ Fabricator :bitbucket_issues_tracker, :from => :issue_tracker, :class_name => "I project_id 'password' api_token 'test_username' end + +Fabricator :unfuddle_issues_tracker, :from => :issue_tracker, :class_name => "IssueTrackers::UnfuddleTracker" do + account 'test' + project_id 15 +end diff --git a/spec/models/issue_trackers/unfuddle_issues_tracker_spec.rb b/spec/models/issue_trackers/unfuddle_issues_tracker_spec.rb new file mode 100644 index 0000000..41edb84 --- /dev/null +++ b/spec/models/issue_trackers/unfuddle_issues_tracker_spec.rb @@ -0,0 +1,93 @@ +require 'spec_helper' + +describe IssueTrackers::UnfuddleTracker do + it "should create an issue on Unfuddle Issues with problem params, and set issue link for problem" do + repo = "test_user/test_repo" + notice = Fabricate :notice + tracker = Fabricate :unfuddle_issues_tracker, :app => notice.app + problem = notice.problem + + number = 123 + @issue_link = "https://test.unfuddle.com/projects/15/tickets/2436" + +project_xml = < + + 1 + false + reporter + 0 + false + + + 27932 + true + #{tracker.project_id} + + false + + test-project + blue + false + text + Field 1 + false + text + Field 2 + false + text + Field 3 + test-project + 2011-04-25T09:21:43Z + 2013-03-08T08:03:02Z + +EOF + + ticket_xml =< + + 40 + + + markdown + + + + + 1268.7 + 0.0 + 2436 + 78 + 119 + 3 + 15 + 40 + + + markdown + + reopened + TEST-ticket. + + 2012-06-27T17:49:06Z + 2013-03-07T16:04:05Z + +EOF + stub_request(:get, "https://#{tracker.username}:#{tracker.password}@test.unfuddle.com/api/v1/projects/#{tracker.project_id}.xml"). + with(:headers => {'Accept'=>'application/xml', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}). + to_return(:status => 200, :body => project_xml, :headers => {}) + + + stub_request(:post, "https://#{tracker.username}:#{tracker.password}@test.unfuddle.com/api/v1/projects/#{tracker.project_id}/tickets.xml"). + to_return(:status => 200, :body => ticket_xml, :headers => {}) + + problem.app.issue_tracker.create_issue(problem) + problem.reload + + requested = have_requested(:post,"https://#{tracker.username}:#{tracker.password}@test.unfuddle.com/api/v1/projects/#{tracker.project_id}/tickets.xml" ) + WebMock.should requested.with(:title => /[production][foo#bar] FooError: Too Much Bar/) + WebMock.should requested.with(:content => /See this exception on Errbit/) + + problem.issue_link.should == @issue_link + end +end -- libgit2 0.21.2