Improve Gitlab::ImportSources

Signed-off-by: Rémy Coutable <remy@rymai.me>
This commit is contained in:
Rémy Coutable 2016-12-16 09:15:30 +01:00
parent 99ddd1dcbe
commit 8fc63d1f64
4 changed files with 126 additions and 44 deletions

View file

@ -82,7 +82,7 @@ class Import::GithubController < Import::BaseController
def provider_unauthorized
session[:access_token] = nil
redirect_to new_import_url,
alert: "Access denied to your #{Gitlab::ImportSources.options.key(provider.to_s)} account."
alert: "Access denied to your #{Gitlab::ImportSources.title(provider.to_s)} account."
end
def access_params

View file

@ -4,16 +4,6 @@ module Projects
class Error < StandardError; end
ALLOWED_TYPES = [
'github',
'bitbucket',
'gitlab',
'google_code',
'fogbugz',
'gitlab_project',
'gitea'
]
def execute
add_repository_to_project unless project.gitlab_project_import?
@ -65,29 +55,11 @@ module Projects
end
def has_importer?
ALLOWED_TYPES.include?(project.import_type)
Gitlab::ImportSources.importer_names.include?(project.import_type)
end
def importer
return Gitlab::ImportExport::Importer.new(project) if @project.gitlab_project_import?
class_name =
case project.import_type
when 'github', 'gitea'
Gitlab::GithubImport::Importer
when 'bitbucket'
Gitlab::BitbucketImport::Importer
when 'gitlab'
Gitlab::GitlabImport::Importer
when 'google_code'
Gitlab::GoogleCodeImport::Importer
when 'fogbugz'
Gitlab::FogbugzImport::Importer
else
raise 'Unknown importer type!'
end
class_name.new(project)
Gitlab::ImportSources.importer(project.import_type).new(project)
end
def unknown_url?

View file

@ -7,22 +7,38 @@ module Gitlab
module ImportSources
extend CurrentSettings
ImportSource = Struct.new(:name, :title, :importer)
ImportTable = [
ImportSource.new('github', 'GitHub', Gitlab::GithubImport::Importer),
ImportSource.new('bitbucket', 'Bitbucket', Gitlab::BitbucketImport::Importer),
ImportSource.new('gitlab', 'GitLab.com', Gitlab::GitlabImport::Importer),
ImportSource.new('google_code', 'Google Code', Gitlab::GoogleCodeImport::Importer),
ImportSource.new('fogbugz', 'FogBugz', Gitlab::FogbugzImport::Importer),
ImportSource.new('git', 'Repo by URL', nil),
ImportSource.new('gitlab_project', 'GitLab export', Gitlab::ImportExport::Importer),
ImportSource.new('gitea', 'Gitea', Gitlab::GithubImport::Importer)
].freeze
class << self
def values
options.values
def options
@options ||= Hash[ImportTable.map { |importer| [importer.title, importer.name] }]
end
def options
{
'GitHub' => 'github',
'Bitbucket' => 'bitbucket',
'GitLab.com' => 'gitlab',
'Google Code' => 'google_code',
'FogBugz' => 'fogbugz',
'Repo by URL' => 'git',
'GitLab export' => 'gitlab_project',
'Gitea' => 'gitea'
}
def values
@values ||= ImportTable.map(&:name)
end
def importer_names
@importer_names ||= ImportTable.select(&:importer).map(&:name)
end
def importer(name)
ImportTable.find { |import_source| import_source.name == name }.importer
end
def title(name)
options.key(name)
end
end
end

View file

@ -0,0 +1,94 @@
require 'spec_helper'
describe Gitlab::ImportSources do
describe '.options' do
it 'returns a hash' do
expected =
{
'GitHub' => 'github',
'Bitbucket' => 'bitbucket',
'GitLab.com' => 'gitlab',
'Google Code' => 'google_code',
'FogBugz' => 'fogbugz',
'Repo by URL' => 'git',
'GitLab export' => 'gitlab_project',
'Gitea' => 'gitea'
}
expect(described_class.options).to eq(expected)
end
end
describe '.values' do
it 'returns an array' do
expected =
[
'github',
'bitbucket',
'gitlab',
'google_code',
'fogbugz',
'git',
'gitlab_project',
'gitea'
]
expect(described_class.values).to eq(expected)
end
end
describe '.importer_names' do
it 'returns an array of importer names' do
expected =
[
'github',
'bitbucket',
'gitlab',
'google_code',
'fogbugz',
'gitlab_project',
'gitea'
]
expect(described_class.importer_names).to eq(expected)
end
end
describe '.importer' do
import_sources = {
'github' => Gitlab::GithubImport::Importer,
'bitbucket' => Gitlab::BitbucketImport::Importer,
'gitlab' => Gitlab::GitlabImport::Importer,
'google_code' => Gitlab::GoogleCodeImport::Importer,
'fogbugz' => Gitlab::FogbugzImport::Importer,
'git' => nil,
'gitlab_project' => Gitlab::ImportExport::Importer,
'gitea' => Gitlab::GithubImport::Importer
}
import_sources.each do |name, klass|
it "returns #{klass} when given #{name}" do
expect(described_class.importer(name)).to eq(klass)
end
end
end
describe '.title' do
import_sources = {
'github' => 'GitHub',
'bitbucket' => 'Bitbucket',
'gitlab' => 'GitLab.com',
'google_code' => 'Google Code',
'fogbugz' => 'FogBugz',
'git' => 'Repo by URL',
'gitlab_project' => 'GitLab export',
'gitea' => 'Gitea'
}
import_sources.each do |name, title|
it "returns #{title} when given #{name}" do
expect(described_class.title(name)).to eq(title)
end
end
end
end