2015-11-15 14 views
1

Я разработал свой кукольный модуль с рубином версии 1.8.7 побежал bundle install на следующий файл гем и RSpec тесты успешно работали (так же кукольный бег):Почему rspec puppet с ошибкой неопределенного метода при переключении рубиновых версий?

source 'https://rubygems.org' 

if puppetversion = ENV['PUPPET_GEM_VERSION'] 
    gem 'puppet', puppetversion, :require => false 
else 
    gem 'puppet', '3.7.5' 
end 

gem 'metadata-json-lint' 
gem 'puppetlabs_spec_helper', '>= 0.1.0' 
gem 'puppet-lint', '>= 1.0.0' 
gem 'facter', '>= 1.7.0' 
gem 'rspec-puppet-facts' 

# rspec must be v2 for ruby 1.8.7 
if RUBY_VERSION >= '1.8.7' and RUBY_VERSION < '1.9' 
    gem 'rspec', '~> 2.0' 
end 

Однако, когда я сделал bundle install на том же Gemfile на моем ДИ-сервер, который имеет рубин 1.9.3 я столкнулся следующей Rspec неудачи:

See verbose errors here

общий Erorr является:

Puppet::Error: 
     Failed to parse template silex/var/config/settings.json.erb: 
     Filepath: /var/tmp/silex/spec/fixtures/modules/silex/templates/var/config/settings.json.erb 
     Line: 4 
     Detail: undefined method `each_with_index' for "default":String 

шаблона, который использует метод each_with_index:

{ 
    "elasticsearch.settings": { 
     "connections": [ 
     <% @elastic_hosts.each_with_index do |host,i| -%> 
     {"host":"<%= host['ip'] %>", "port": <%= host['port'] %> }<%= ',' if i < (@elastic_hosts.size - 1) -%> 
     <% end -%> 
     ], 
     "index": "<%= @elastic_index %>" 
    } 
    }, 
    "cache.lifetime": <%= @elastic_cache_lifetime %>, 
    "environment": "dev", 
    "trusted": [ 
     <% @trusted_hosts.each_with_index do |host,i| -%> 
     {"host":"<%= host['host'] %>"}<%= ',' if i < (@trusted_hosts.size - 1) -%> 
     <% end -%> 
    ], 
    "homepage.settings": { 
     "hero.count": 20, 
     "list.count": 20 
    } 
} 

Я не в состоянии понять, почему это потерпит неудачу с другой версией рубин? Я также попробовал ruby ​​2.1.1 с тем же результатом. Результаты успешны только на сервере CI с ruby ​​1.8.7 (тот же вариант, который я использовал для разработки модуля).

UPDATE 1

Оказывается, что из elastic_hosts является хэш-картой, и я была строка была неисправной. Я исправил это вместе с trusted_hosts (еще одна карта хэша), которая привела к большей части прохождения тестов, но ошибка сохраняется.

See errors here

Примечание: Ошибка не отличается от отмеченных выше общей ошибки.

Я также обновил файл шаблона выше с полным содержимым.

My config spec file

Если вы посмотрите на мой конфигурационный файл спецификации я не уточняя default в виде строки еще где-нибудь он говорит мне, что это ошибка ..

FIX

Как и предполагалось у моего класса спецификаций init были установлены значения по умолчанию и добавлен поиск hiera для elastic_hosts и trusted_hosts.

UPDATE 2

Такое поведение является воспроизводимым между версией 1.8.7 и версией>1.9.3. Кажется, что есть что-то с тем, как обрабатываются хеши.

ответ

3

Ответ довольно прост: поскольку метод each был удален из более новых версий Ruby.Одна из причин заключалась в том, что этот метод запутывался в контексте строк UTF-8: each перебирает каждый символ или каждый байт?

Но есть each_char и вы можете комбинировать, что с with_index:

string.each_char.with_index do |char, i| 
    # ... 
end 

Далее вы вызываете этот метод на @elastic_hosts, что во фрагменте явно должен быть массивом hosts. Но сообщение об ошибке сообщает нам, что @elastic_hosts является строкой default. Поэтому имеет смысл, что вызов метода с each_with_index терпит неудачу, но похоже, что сама итерация не имеет смысла. Советуем проверить, правильно ли установлен @elastic_hosts.

+0

'elastic_hosts' на самом деле хэш-карта. Вы правы в том, что он настроен на строку. Я работаю над поиском работы hiera. Скоро обновит ответ. – kaizenCoder

 Смежные вопросы

  • Нет связанных вопросов^_^