Tumgik
#installgenerator
Text
Tumblr media
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
pavelkalashnikov · 7 years
Text
Создание #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