class LearnOpen::LessonDownloader

Attributes

client[R]
environment[R]
git_adapter[R]
git_ssh_connector[R]
io[R]
lesson[R]
location[R]
logger[R]

Public Class Methods

call(lesson, location, environment, options = {}) click to toggle source
# File lib/learn_open/services/lesson_downloader.rb, line 5
def self.call(lesson, location, environment, options = {})
  self.new(lesson, location, environment, options).call
end
new(lesson, location, environment, options = {}) click to toggle source
# File lib/learn_open/services/lesson_downloader.rb, line 9
def initialize(lesson, location, environment, options = {})
  @lesson = lesson
  @location = location
  @environment = environment
  @client = options.fetch(:learn_web_client) { LearnOpen.learn_web_client }
  @logger = options.fetch(:logger) { LearnOpen.logger }
  @io = options.fetch(:io) { LearnOpen.default_io }
  @git_adapter = options.fetch(:git_adapter) { LearnOpen.git_adapter }
  @git_ssh_connector = options.fetch(:git_ssh_connector) { LearnOpen.git_ssh_connector }
end

Public Instance Methods

call() click to toggle source
# File lib/learn_open/services/lesson_downloader.rb, line 20
def call
  if !repo_exists?
    if ensure_git_ssh!
      fork_repo if lesson.use_student_fork
      clone_repo
      :ok
    else
      :ssh_unauthenticated
    end
  else
    :noop
  end
end
clone_repo(retries = 3) click to toggle source
# File lib/learn_open/services/lesson_downloader.rb, line 59
def clone_repo(retries = 3)
  logger.log('Cloning to your machine...')
  io.puts "Cloning lesson..."
  begin
    Timeout::timeout(15) do
      git_adapter.clone("git@#{lesson.git_server}:#{lesson.repo_path}.git", lesson.name, path: location)
    end
  rescue Git::GitExecuteError
    if retries > 0
      io.puts "There was a problem cloning this lesson. Retrying..." if retries > 1
      sleep(1)
      clone_repo(retries - 1)
    else
      io.puts "Cannot clone this lesson right now. Please try again."
      logger.log('ERROR: Error cloning. Try again.')
      exit
    end
  rescue Timeout::Error
    if retries > 0
      io.puts "There was a problem cloning this lesson. Retrying..."
      clone_repo(retries - 1)
    else
      io.puts "Cannot clone this lesson right now. Please try again."
      logger.log('ERROR: Error cloning. Try again.')
      exit
    end
  end

end
ensure_git_ssh!() click to toggle source
# File lib/learn_open/services/lesson_downloader.rb, line 34
def ensure_git_ssh!
  git_ssh_connector.call(git_server: lesson.git_server, environment: environment)
end
fork_repo(retries = 3) click to toggle source
# File lib/learn_open/services/lesson_downloader.rb, line 38
def fork_repo(retries = 3)
  logger.log('Forking repository...')
  io.puts "Forking lesson..."

  begin
    Timeout::timeout(15) do
      client.fork_repo(repo_name: lesson.name)
    end
  rescue Timeout::Error
    if retries > 0
      io.puts "There was a problem forking this lesson. Retrying..."
      fork_repo(retries - 1)
    else
      io.puts "There is an issue connecting to Learn. Please try again."
      logger.log('ERROR: Error connecting to Learn')
      exit
    end
  end

end
repo_exists?() click to toggle source
# File lib/learn_open/services/lesson_downloader.rb, line 89
def repo_exists?
  File.exists?("#{lesson.to_path}/.git")
end