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