lib/learn_open/opener.rb in learn-open-1.0.5 vs lib/learn_open/opener.rb in learn-open-1.1.0
- old
+ new
@@ -1,22 +1,23 @@
module LearnOpen
class Opener
- attr_reader :editor, :client, :lessons_dir, :file_path
+ attr_reader :editor, :client, :lessons_dir, :file_path, :get_next_lesson
attr_accessor :lesson, :repo_dir, :lesson_is_lab, :lesson_id
- def self.run(lesson:, editor_specified:)
- new(lesson, editor_specified).run
+ def self.run(lesson:, editor_specified:, get_next_lesson:)
+ new(lesson, editor_specified, get_next_lesson).run
end
- def initialize(lesson, editor)
+ def initialize(lesson, editor, get_next_lesson)
_login, token = Netrc.read['learn-config']
@client = LearnWeb::Client.new(token: token)
- @lesson = lesson
- @editor = editor
- @lessons_dir = YAML.load(File.read(File.expand_path('~/.learn-config')))[:learn_directory]
- @file_path = File.expand_path('~/.learn-open-tmp')
+ @lesson = lesson
+ @editor = editor
+ @get_next_lesson = get_next_lesson
+ @lessons_dir = YAML.load(File.read(File.expand_path('~/.learn-config')))[:learn_directory]
+ @file_path = File.expand_path('~/.learn-open-tmp')
end
def run
setup_tmp_file
@@ -45,15 +46,20 @@
end
def set_lesson
File.write(file_path, 'Getting lesson...')
- if !lesson
+ if !lesson && !get_next_lesson
puts "Getting current lesson..."
self.lesson = get_current_lesson_forked_repo
self.lesson_is_lab = current_lesson.lab
self.lesson_id = current_lesson.id
+ elsif !lesson && get_next_lesson
+ puts "Getting next lesson..."
+ self.lesson = get_next_lesson_forked_repo
+ self.lesson_is_lab = next_lesson.lab
+ self.lesson_id = next_lesson.id
else
puts "Looking for lesson..."
self.lesson = ensure_correct_lesson.repo_slug
self.lesson_is_lab = correct_lesson.lab
self.lesson_id = correct_lesson.lesson_id
@@ -64,10 +70,14 @@
def current_lesson
@current_lesson ||= client.current_lesson
end
+ def next_lesson
+ @next_lesson ||= client.next_lesson
+ end
+
def get_current_lesson_forked_repo(retries=3)
begin
Timeout::timeout(15) do
current_lesson.forked_repo
end
@@ -80,10 +90,26 @@
exit
end
end
end
+ def get_next_lesson_forked_repo(retries=3)
+ begin
+ Timeout::timeout(15) do
+ next_lesson.forked_repo
+ end
+ rescue Timeout::Error
+ if retries > 0
+ puts "There was a problem getting your next lesson from Learn. Retrying..."
+ get_next_lesson_forked_repo(retries-1)
+ else
+ puts "There seems to be a problem connecting to Learn. Please try again."
+ exit
+ end
+ end
+ end
+
def ensure_correct_lesson
correct_lesson
end
def correct_lesson(retries=3)
@@ -153,13 +179,22 @@
system("cd #{lessons_dir}/#{repo_dir} && #{editor} .")
end
end
def ios_lesson?
- languages = YAML.load(File.read("#{lessons_dir}/#{repo_dir}/.learn"))['languages']
- ios_lang = languages.any? {|l| ['objc', 'swift'].include?(l)}
+ begin
+ languages = YAML.load(File.read("#{lessons_dir}/#{repo_dir}/.learn"))['languages']
+ ios_lang = languages.any? {|l| ['objc', 'swift'].include?(l)}
- ios_lang || xcodeproj_file? || xcworkspace_file?
+ ios_lang || xcodeproj_file? || xcworkspace_file?
+ rescue Psych::SyntaxError
+ if xcodeproj_file? || xcworkspace_file?
+ true
+ else
+ puts "There seems to be a problem with this lesson. Please submit a bug report to bugs@learn.co. If you'd like to work on your next lesson, type: learn next"
+ exit
+ end
+ end
end
def open_ios_lesson
if can_open_ios_lesson?
open_xcode