It is never too late to install Generator - Corporate Electric Ltd.
Having generators means that you will be constantly backed up in any critical situation.
Get it installed today-
Call on: +1 (345) 946-2277
Visit at Generators for your residential, commercial & industrial needs
0 notes
Создание #Rails генератора миграций по #TDD
С ужасом обнаружил, что не писал больших постов в блог с мая!! Запилил пост небольшой #howto, как реализовать по TDD генератор миграций в вашем геме для Rails приложения.
Ссылка на оригинальный пост: http://crftr.com/tdd-your-ruby-gem-migration-generator/
Я позволил себе убрать часть поста про описание, что такое миграции в #Rails приложениях, ибо, если вы открыли по такому названию пост в блоге, значит, понимаете, о чём идёт речь.
Последнюю неделю занимаюсь разработкой tramway (ссылка появится когда-нибудь позже, о чём это), гем tramway-news является частью этой платформы. Для разработки этого гема мне и понадобилось создать генератор миграций.
TDD подход
Что такое TDD можно почитать в серии статей. Даже, если вы знаете об этом и подходе, приглашаю к прочтению.
Чтобы удобно писать тесты для генераторов миграций в вашем геме, есть предложение использовать гем generator_spec. Добавляем его в наш .gemspec файл.
# tramway-news.gemspec Gem::Specification.new do |gem| # ... gem.add_development_dependency 'generator_spec' end
Теперь пишем тест
Скелет нашего RSpec теста выглядит так:
# spec/lib/generators/tramway/news/install/install_generator_spec.rb require ‘spec_helper’ module Tramway::News::Generators describe InstallGenerator, type: :generator do root_dir = File.expand_path(’/tmp’, __FILE__) destination root_dir before :all do prepare_destination run_generator end end
Генерировать миграции для наших тестов мы будем директории /tmp, что логично.
Давай добавим проверки к нашему тесту:
# spec/lib/generators/tramway/news/install/install_generator_spec.rb require ‘spec_helper’ module Tramway::News::Generators describe InstallGenerator, type: :generator do root_dir = File.expand_path("/tmp", __FILE__) destination root_dir before :all do prepare_destination run_generator end it "creates the installation db migration" do migration_file = Dir.glob("#{root_dir}/db/migrate/*create_news.rb") assert_file migration_file[0], /class CreateNews < ActiveRecord::Migration[5.1]/ end end end end
Наш тест теперь проверяет, что файл миграции появился и, что в нём есть класс с определённым, нужным нам, названием.
Сам генератор
Пишем шаблон миграции
# lib/generators/tramway/news/install/templates/create_double_double.rb class CreateNews < ActiveRecord::Migration[5.1] def change # ... end end
Теперь пишем Rails generator
# lib/generators/tramway/news/install/install_generator.rb require 'rails/generators' require 'rails/generators/migration' module Tramway::News::Generators class InstallGenerator < ::Rails::Generators::Base include Rails::Generators::Migration source_root File.expand_path('../templates', __FILE__) desc "Add the migrations for Tramway::News" def self.next_migration_number(path) next_migration_number = current_migration_number(path) + 1 ActiveRecord::Migration.next_migration_number next_migration_number end def copy_migrations migration_template "create_news.rb", "db/migrate/create_news.rb" end end end
Проблемы:
В Rails 5.1 появилась версионность миграций. И если вы будете генерировать файлы миграций без версий Rails, то получите ошибку. tramway-news в данный момент генерирует только для версии 5.1.
В следующих версиях гема, найду решение этой проблемы. Предложения принимаются в комменты.
0 notes