From b3c90dd51418d0c41df4ccd57d9480ea44b35eec Mon Sep 17 00:00:00 2001
From: Valery Sizov <valery@gitlab.com>
Date: Thu, 5 Feb 2015 16:57:27 -0800
Subject: [PATCH] GitHub importer refactoring

---
 app/controllers/import/github_controller.rb   | 22 ++++---------
 lib/gitlab/github_import/client.rb            | 32 +++++++++++++++++--
 lib/gitlab/github_import/importer.rb          | 10 ++----
 .../import/github_controller_spec.rb          | 12 +++----
 4 files changed, 45 insertions(+), 31 deletions(-)

diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb
index 108fc4396a6..c869c7c86f3 100644
--- a/app/controllers/import/github_controller.rb
+++ b/app/controllers/import/github_controller.rb
@@ -4,16 +4,16 @@ class Import::GithubController < Import::BaseController
   rescue_from Octokit::Unauthorized, with: :github_unauthorized
 
   def callback
-    token = client.auth_code.get_token(params[:code]).token
+    token = client.get_token(params[:code])
     current_user.github_access_token = token
     current_user.save
     redirect_to status_import_github_url
   end
 
   def status
-    @repos = octo_client.repos
-    octo_client.orgs.each do |org|
-      @repos += octo_client.repos(org.login)
+    @repos = client.repos
+    client.orgs.each do |org|
+      @repos += client.repos(org.login)
     end
 
     @already_added_projects = current_user.created_projects.where(import_type: "github")
@@ -29,7 +29,7 @@ class Import::GithubController < Import::BaseController
 
   def create
     @repo_id = params[:repo_id].to_i
-    repo = octo_client.repo(@repo_id)
+    repo = client.repo(@repo_id)
     @target_namespace = params[:new_namespace].presence || repo.owner.login
     @project_name = repo.name
     
@@ -41,12 +41,7 @@ class Import::GithubController < Import::BaseController
   private
 
   def client
-    @client ||= Gitlab::GithubImport::Client.new.client
-  end
-
-  def octo_client
-    Octokit.auto_paginate = true
-    @octo_client ||= Octokit::Client.new(access_token: current_user.github_access_token)
+    @client ||= Gitlab::GithubImport::Client.new(current_user.github_access_token)
   end
 
   def github_auth
@@ -56,10 +51,7 @@ class Import::GithubController < Import::BaseController
   end
 
   def go_to_github_for_permissions
-    redirect_to client.auth_code.authorize_url({
-      redirect_uri: callback_import_github_url,
-      scope: "repo, user, user:email"
-    })
+    redirect_to client.authorize_url(callback_import_github_url)
   end
 
   def github_unauthorized
diff --git a/lib/gitlab/github_import/client.rb b/lib/gitlab/github_import/client.rb
index cf43d36c6c3..c9904fe8779 100644
--- a/lib/gitlab/github_import/client.rb
+++ b/lib/gitlab/github_import/client.rb
@@ -1,14 +1,42 @@
 module Gitlab
   module GithubImport
     class Client
-      attr_reader :client
+      attr_reader :client, :api
 
-      def initialize
+      def initialize(access_token)
         @client = ::OAuth2::Client.new(
           config.app_id,
           config.app_secret,
           github_options
         )
+
+        if access_token
+          ::Octokit.auto_paginate = true
+          @api = ::Octokit::Client.new(access_token: access_token)
+        end
+      end
+
+      def authorize_url(redirect_uri)
+        client.auth_code.authorize_url({
+          redirect_uri: redirect_uri,
+          scope: "repo, user, user:email"
+        })
+      end
+
+      def get_token(code)
+        client.auth_code.get_token(code).token
+      end
+
+      def method_missing(method, *args, &block)
+        if api.respond_to?(method)
+          api.send(method, *args, &block)
+        else
+          super(method, *args, &block)
+        end
+      end
+
+      def respond_to?(method)
+        api.respond_to?(method) || super
       end
 
       private
diff --git a/lib/gitlab/github_import/importer.rb b/lib/gitlab/github_import/importer.rb
index 1f02ee49b6a..bc2b645b2d9 100644
--- a/lib/gitlab/github_import/importer.rb
+++ b/lib/gitlab/github_import/importer.rb
@@ -1,16 +1,15 @@
 module Gitlab
   module GithubImport
     class Importer
-      attr_reader :project
+      attr_reader :project, :client
 
       def initialize(project)
         @project = project
+        @client = Client.new(project.creator.github_access_token)
         @formatter = Gitlab::ImportFormatter.new
       end
 
       def execute
-        client = octo_client(project.creator.github_access_token)
-
         #Issues && Comments
         client.list_issues(project.import_source, state: :all).each do |issue|
           if issue.pull_request.nil?
@@ -37,11 +36,6 @@ module Gitlab
 
       private
 
-      def octo_client(access_token)
-        ::Octokit.auto_paginate = true
-        ::Octokit::Client.new(access_token: access_token)
-      end
-
       def gl_user_id(project, github_id)
         user = User.joins(:identities).
           find_by("identities.extern_uid = ? AND identities.provider = 'github'", github_id.to_s)
diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb
index 01063567733..f80b3884d88 100644
--- a/spec/controllers/import/github_controller_spec.rb
+++ b/spec/controllers/import/github_controller_spec.rb
@@ -10,7 +10,7 @@ describe Import::GithubController do
   describe "GET callback" do
     it "updates access token" do
       token = "asdasd12345"
-      Gitlab::GithubImport::Client.any_instance.stub_chain(:client, :auth_code, :get_token, :token).and_return(token)
+      Gitlab::GithubImport::Client.any_instance.stub(:get_token).and_return(token)
       Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "github")
 
       get :callback
@@ -27,8 +27,8 @@ describe Import::GithubController do
 
     it "assigns variables" do
       @project = create(:project, import_type: 'github', creator_id: user.id)
-      controller.stub_chain(:octo_client, :repos).and_return([@repo])
-      controller.stub_chain(:octo_client, :orgs).and_return([])
+      controller.stub_chain(:client, :repos).and_return([@repo])
+      controller.stub_chain(:client, :orgs).and_return([])
 
       get :status
 
@@ -38,8 +38,8 @@ describe Import::GithubController do
 
     it "does not show already added project" do
       @project = create(:project, import_type: 'github', creator_id: user.id, import_source: 'asd/vim')
-      controller.stub_chain(:octo_client, :repos).and_return([@repo])
-      controller.stub_chain(:octo_client, :orgs).and_return([])
+      controller.stub_chain(:client, :repos).and_return([@repo])
+      controller.stub_chain(:client, :orgs).and_return([])
 
       get :status
 
@@ -57,7 +57,7 @@ describe Import::GithubController do
       namespace = create(:namespace, name: "john", owner: user)
       Gitlab::GithubImport::ProjectCreator.should_receive(:new).with(@repo, namespace, user).
         and_return(double(execute: true))
-      controller.stub_chain(:octo_client, :repo).and_return(@repo)
+      controller.stub_chain(:client, :repo).and_return(@repo)
 
       post :create, format: :js
     end
-- 
GitLab