Ruby: выражение пустого значения при использовании if else с break - PullRequest
0 голосов
/ 24 декабря 2018

Я новичок в языке Ruby.Я работаю над интеграцией Danger , чтобы добавить проверки на GitHub PR.Один из вариантов использования - проверить, содержат ли измененные файлы в моем PR определенные изменения.Я добавил следующий код в DangerFile

filesArray = ["Resources/Config.plist", "Resources/Deployment.plist"]

def modified_files_contains_change(files, change)
    does_contain_required_changes = false
    for file in files do
        message "diff in #{file}"
        diff = git.diff_for_file(file)
        patch_contains_change = diff.patch =~ #{change}
        if diff && patch_contains_change
            does_contain_required_changes = true
        else
            does_contain_required_changes = false
            break
        end
    end
    message "Does contain changes in all files => #{does_contain_required_changes}"
    does_contain_required_changes
end

if modified_files_contains_change(files, change)
   warn "Some useful warning message goes here"
end

При выполнении этого на моем CI я получаю ошибку ниже

[!] Invalid `Dangerfile` file: void value expression. 

 #  from Dangerfile:33
 #  -------------------------------------------
 #              does_contain_required_changes = false
 >              break
 #          end
 #      end
 #  -------------------------------------------

Я попытался выполнить поиск, но не понял, что происходит не так.Может кто-нибудь, пожалуйста, помогите мне понять, в чем именно проблема?Заранее спасибо.

1 Ответ

0 голосов
/ 24 декабря 2018

=~ #{change} читается как =~, потому что # запускает встроенный комментарий.=~ ожидает регулярное выражение на одной из сторон.Чтобы устранить проблему, измените строку ниже:

patch_contains_change = diff.patch =~ #{change}

на:

patch_contains_change = diff.patch =~ Regexp.new(change)

Предполагается, что вы передаете строку как change.


Кроме того, это будет более или менее рубиновый способ выполнить задачу:

def modified_files_contains_change(files, change)
  does_contain_required_changes =
    files.all? do |file|
      message "diff in #{file}"
      # break will immediately exit the `all?` unless diff is present
      break false unless diff = git.diff_for_file(file) 
      diff.patch =~ Regexp.new(change)
    end

  message "Does contain changes in all files => #{does_contain_required_changes}"
  does_contain_required_changes
end

Чтобы вернуть файл, в котором мы обнаружили проблему:

def modified_files_contains_change(files, change)
  problematic_file =
    files.detect do |file|
      message "diff in #{file}"
      (diff = git.diff_for_file(file)).nil? || diff.patch !~ Regexp.new(change)
    end

  does_contain_required_changes = problematic_file.nil?
  if does_contain_required_changes
    message "All good!"
  else
    message "We have issues with file #{problematic_file}"
  end
  does_contain_required_changes
end
...