Почему после использования gsub в файле в Ruby с Thor появляется лишняя пустая строка?

У меня есть код Ruby, который обрабатывает Gemfile. Он добавляет некоторые рекомендуемые драгоценные камни и удаляет другие драгоценные камни. Там есть раздел Gemfile, который выглядит следующим образом:

group :development, :test do
  # The gem version is a recommended starting place; upgrade if needed.
  gem 'pry-rails', '~> 0.3.4'
  # Enhance pry with byebug (which gives more debugger commands and other goodies).
  # The gem version is a recommended starting place; upgrade if needed.
  gem 'pry-byebug', '~> 3.4.0'
  # Use rspec for testing
  gem 'rspec-rails', '~> 3.5.1'
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platform: mri
end

Я использую следующие две строки, чтобы удалить последние две строки блока (строка gem 'byebug ... и комментарий над ней).

gsub_file(full_app_gemfile_path, /^\s*gem\s*("|')byebug.*$/, "", verbose: false)
gsub_file(full_app_gemfile_path, /^\s*#.*Call.*("|')byebug("|').*$/, "", verbose: false)

gsub_file — это метод, предоставляемый драгоценным камнем Thor. Удаление работает, но я получаю следующий код в Gemfile

group :development, :test do

  # The gem version is a recommended starting place; upgrade if needed.
  gem 'pry-rails', '~> 0.3.4'
  # Enhance pry with byebug (which gives more debugger commands and other goodies).
  # The gem version is a recommended starting place; upgrade if needed.
  gem 'pry-byebug', '~> 3.4.0'
  # Use rspec for testing
  gem 'rspec-rails', '~> 3.5.1'
end

Почему эта дополнительная пустая строка вставляется после group :development, :test do? Это далеко не то место, где линии были удалены. Возможно, это ошибка в драгоценном камне Thor, но мне интересно, проблема ли это в регулярном выражении.

Обновить

Я только что попытался использовать необработанный ruby ​​gsub (чтобы устранить потенциальные проблемы с Thor). Я создал вспомогательный метод

def my_gsub(path, regex, str)
  text = File.read(path)
  rep = text.gsub(regex, str)
  File.open(path, "w") {|file| file.puts rep}
end

Когда я заменяю две строки, которые вызывают gsub_file, на вызов my_gsub, теперь я получаю две пустые строки после group :development, :test do.


person CodeSmith    schedule 10.04.2017    source источник
comment
Похоже на жука Тора. Не могли бы вы проверить, какой из двух gsub добавляет строку?   -  person ndnenkov    schedule 10.04.2017
comment
Я просто обновил текст. Я создал вспомогательный метод для прямого вызова команды Ruby gsub, чтобы Thor можно было исключить из устранения неполадок. Теперь я получаю две пустые строки.   -  person CodeSmith    schedule 10.04.2017


Ответы (1)


Для вашего метода my_gsub вы заменяете содержимое строки без замены разрыва строки. Чтобы он также удалил новую строку, вы можете изменить свое регулярное выражение на это:

gsub_file(full_app_gemfile_path, /^\s*gem\s*("|')byebug.*$\n/, "")
gsub_file(full_app_gemfile_path, /^\s*#.*Call.*("|')byebug("|').*$\n/, "")
person Lasse Sviland    schedule 10.04.2017
comment
Это не объясняет, почему строки появляются после group :development, :test do, а определение byebug стоит в конце. - person ndnenkov; 10.04.2017
comment
Когда я запустил код, он появился в конце блока, поэтому я предположил, что это проблема, с кодом в вопросе не будет новой строки в начале блока с рубином 2.3.3 - person Lasse Sviland; 10.04.2017
comment
Спасибо. Это решило проблему (хотя мне все еще любопытно, почему строка появилась на несколько строк выше). - person CodeSmith; 10.04.2017