From e7382de1084f75bc8cfb2a5135412fdbd81f3b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Binsztock=20R=C3=A9my?= Date: Wed, 19 Feb 2014 00:09:16 +0100 Subject: [PATCH] Add Gemnasium Service for Gitlab Conflicts: db/schema.rb --- CHANGELOG | 3 ++ Gemfile | 3 ++ Gemfile.lock | 3 ++ app/models/project.rb | 3 +- .../project_services/assembla_service.rb | 1 + .../project_services/campfire_service.rb | 1 + .../emails_on_push_service.rb | 1 + .../project_services/flowdock_service.rb | 1 + .../project_services/gemnasium_service.rb | 54 +++++++++++++++++++ .../project_services/gitlab_ci_service.rb | 1 + .../project_services/hipchat_service.rb | 1 + .../pivotaltracker_service.rb | 1 + app/models/service.rb | 3 +- .../20140214102325_add_api_key_to_services.rb | 5 ++ db/schema.rb | 3 +- spec/models/assembla_service_spec.rb | 1 + spec/models/flowdock_service_spec.rb | 1 + spec/models/gemnasium_service_spec.rb | 47 ++++++++++++++++ spec/models/gitlab_ci_service_spec.rb | 1 + spec/models/service_spec.rb | 1 + 20 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 app/models/project_services/gemnasium_service.rb create mode 100644 db/migrate/20140214102325_add_api_key_to_services.rb create mode 100644 spec/models/gemnasium_service_spec.rb diff --git a/CHANGELOG b/CHANGELOG index 5f42f851b05..7d03d6a6135 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +v 6.7.0 + - Add support for Gemnasium as a Project Service + v 6.6.0 - Retrieving user ssh keys publically(github style): http://__HOST__/__USERNAME__.keys - Permissions: Developer now can manage issue tracker (modify any issue) diff --git a/Gemfile b/Gemfile index ba7f6a7f52a..a87c538102e 100644 --- a/Gemfile +++ b/Gemfile @@ -124,6 +124,9 @@ gem "hipchat", "~> 0.14.0" # Flowdock integration gem "gitlab-flowdock-git-hook", "~> 0.4.2" +# Gemnasium integration +gem "gemnasium-gitlab-service", "~> 0.2" + # d3 gem "d3_rails", "~> 3.1.4" diff --git a/Gemfile.lock b/Gemfile.lock index ba29e0ddc7d..f93b0900070 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -152,6 +152,8 @@ GEM dotenv (>= 0.7) thor (>= 0.13.6) formatador (0.2.4) + gemnasium-gitlab-service (0.2.1) + rugged (~> 0.19) gemoji (1.3.1) gherkin-ruby (0.3.1) racc @@ -578,6 +580,7 @@ DEPENDENCIES fog (~> 1.3.1) font-awesome-rails (~> 3.2) foreman + gemnasium-gitlab-service (~> 0.2) gemoji (~> 1.3.0) github-markup (~> 0.7.4)! gitlab-flowdock-git-hook (~> 0.4.2) diff --git a/app/models/project.rb b/app/models/project.rb index d9da2c377c8..2c926ff8a9a 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -53,6 +53,7 @@ class Project < ActiveRecord::Base has_one :hipchat_service, dependent: :destroy has_one :flowdock_service, dependent: :destroy has_one :assembla_service, dependent: :destroy + has_one :gemnasium_service, dependent: :destroy has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id" has_one :forked_from_project, through: :forked_project_link @@ -256,7 +257,7 @@ class Project < ActiveRecord::Base end def available_services_names - %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla emails_on_push) + %w(gitlab_ci campfire hipchat pivotaltracker flowdock assembla emails_on_push gemnasium) end def gitlab_ci? diff --git a/app/models/project_services/assembla_service.rb b/app/models/project_services/assembla_service.rb index ad7eade5c7b..2a2c5172916 100644 --- a/app/models/project_services/assembla_service.rb +++ b/app/models/project_services/assembla_service.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # class AssemblaService < Service diff --git a/app/models/project_services/campfire_service.rb b/app/models/project_services/campfire_service.rb index fb2a49fd586..f9247e054c7 100644 --- a/app/models/project_services/campfire_service.rb +++ b/app/models/project_services/campfire_service.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # class CampfireService < Service diff --git a/app/models/project_services/emails_on_push_service.rb b/app/models/project_services/emails_on_push_service.rb index 2a46eff7846..0a453166342 100644 --- a/app/models/project_services/emails_on_push_service.rb +++ b/app/models/project_services/emails_on_push_service.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # class EmailsOnPushService < Service diff --git a/app/models/project_services/flowdock_service.rb b/app/models/project_services/flowdock_service.rb index f72d9fa9015..2603a1f67a4 100644 --- a/app/models/project_services/flowdock_service.rb +++ b/app/models/project_services/flowdock_service.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # require "flowdock-git-hook" diff --git a/app/models/project_services/gemnasium_service.rb b/app/models/project_services/gemnasium_service.rb new file mode 100644 index 00000000000..0b8e7bad353 --- /dev/null +++ b/app/models/project_services/gemnasium_service.rb @@ -0,0 +1,54 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# token :string(255) +# project_id :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# active :boolean default(FALSE), not null +# project_url :string(255) +# subdomain :string(255) +# room :string(255) +# api_key :string(255) +# + +require "gemnasium/gitlab_service" + +class GemnasiumService < Service + validates :token, :api_key, presence: true, if: :activated? + + def title + 'Gemnasium' + end + + def description + 'Gemnasium monitors your project dependencies and alerts you about updates and security vulnerabilities.' + end + + def to_param + 'gemnasium' + end + + def fields + [ + { type: 'text', name: 'api_key', placeholder: 'Your personal API KEY on gemnasium.com ' }, + { type: 'text', name: 'token', placeholder: 'The project\'s slug on gemnasium.com' } + ] + end + + def execute(push_data) + repo_path = File.join(Gitlab.config.gitlab_shell.repos_path, "#{project.path_with_namespace}.git") + Gemnasium::GitlabService.execute( + ref: push_data[:ref], + before: push_data[:before], + after: push_data[:after], + token: token, + api_key: api_key, + repo: repo_path + ) + end +end diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb index 7f5380a4551..017cd9eeaab 100644 --- a/app/models/project_services/gitlab_ci_service.rb +++ b/app/models/project_services/gitlab_ci_service.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # class GitlabCiService < Service diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb index d4795867baf..3cee047a32a 100644 --- a/app/models/project_services/hipchat_service.rb +++ b/app/models/project_services/hipchat_service.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # class HipchatService < Service diff --git a/app/models/project_services/pivotaltracker_service.rb b/app/models/project_services/pivotaltracker_service.rb index c5b1b9ab8d3..877b9a77404 100644 --- a/app/models/project_services/pivotaltracker_service.rb +++ b/app/models/project_services/pivotaltracker_service.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # class PivotaltrackerService < Service diff --git a/app/models/service.rb b/app/models/service.rb index 540aaad1ce5..26060d00b02 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -13,12 +13,13 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # # To add new service you should build a class inherited from Service # and implement a set of methods class Service < ActiveRecord::Base - attr_accessible :title, :token, :type, :active + attr_accessible :title, :token, :type, :active, :api_key belongs_to :project has_one :service_hook diff --git a/db/migrate/20140214102325_add_api_key_to_services.rb b/db/migrate/20140214102325_add_api_key_to_services.rb new file mode 100644 index 00000000000..30eeca2c1f6 --- /dev/null +++ b/db/migrate/20140214102325_add_api_key_to_services.rb @@ -0,0 +1,5 @@ +class AddApiKeyToServices < ActiveRecord::Migration + def change + add_column :services, :api_key, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 65f79fb7e05..4f6d942eeb3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140209025651) do +ActiveRecord::Schema.define(version: 20140214102325) do create_table "broadcast_messages", force: true do |t| t.text "message", null: false @@ -240,6 +240,7 @@ ActiveRecord::Schema.define(version: 20140209025651) do t.string "subdomain" t.string "room" t.text "recipients" + t.string "api_key" end add_index "services", ["project_id"], name: "index_services_on_project_id", using: :btree diff --git a/spec/models/assembla_service_spec.rb b/spec/models/assembla_service_spec.rb index 395aa4a4444..1730a64283a 100644 --- a/spec/models/assembla_service_spec.rb +++ b/spec/models/assembla_service_spec.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # require 'spec_helper' diff --git a/spec/models/flowdock_service_spec.rb b/spec/models/flowdock_service_spec.rb index cd553b33ad7..97414585331 100644 --- a/spec/models/flowdock_service_spec.rb +++ b/spec/models/flowdock_service_spec.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # require 'spec_helper' diff --git a/spec/models/gemnasium_service_spec.rb b/spec/models/gemnasium_service_spec.rb new file mode 100644 index 00000000000..dfc99849d60 --- /dev/null +++ b/spec/models/gemnasium_service_spec.rb @@ -0,0 +1,47 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# token :string(255) +# project_id :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# active :boolean default(FALSE), not null +# project_url :string(255) +# subdomain :string(255) +# room :string(255) +# api_key :string(255) +# + +require 'spec_helper' + +describe GemnasiumService do + describe "Associations" do + it { should belong_to :project } + it { should have_one :service_hook } + end + + describe "Execute" do + let(:user) { create(:user) } + let(:project) { create(:project) } + + before do + @gemnasium_service = GemnasiumService.new + @gemnasium_service.stub( + project_id: project.id, + project: project, + service_hook: true, + token: 'verySecret', + api_key: 'GemnasiumUserApiKey' + ) + @sample_data = GitPushService.new.sample_data(project, user) + end + it "should call Gemnasium service" do + Gemnasium::GitlabService.should_receive(:execute).with(an_instance_of(Hash)).once + @gemnasium_service.execute(@sample_data) + end + end +end diff --git a/spec/models/gitlab_ci_service_spec.rb b/spec/models/gitlab_ci_service_spec.rb index 56efa9df457..8ec15cb3466 100644 --- a/spec/models/gitlab_ci_service_spec.rb +++ b/spec/models/gitlab_ci_service_spec.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # require 'spec_helper' diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb index 46b3bf39aeb..94542074967 100644 --- a/spec/models/service_spec.rb +++ b/spec/models/service_spec.rb @@ -13,6 +13,7 @@ # project_url :string(255) # subdomain :string(255) # room :string(255) +# api_key :string(255) # require 'spec_helper'