Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@sesame

Embulkプラグイン作成入門1

Embulkの導入

$ curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
$ chmod +x ~/.embulk/bin/embulk
$ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

ひな形の作成

embulk new <type> <name>
ひな形の作成
$ mkdir ~/junk
$ cd ~/junk
$ embulk new ruby-parser regexp_multi

~/junk/embulk-parser-regexp_multiディレクトリが作成され、中にひな形が作成される。

$ ls -1a
.
..
.gitignore
.ruby-version
Gemfile
LICENSE.txt
README.md
Rakefile
embulk-parser-regexp_multi.gemspec
lib
作業ディレクトリへの移動
$ cd embulk-parser-regexp_multi

開発前準備

gemspecファイルの修正

embulk-parser-regexp_multi.gemspec
Gem::Specification.new do |spec|
  spec.name          = "embulk-parser-regexp_multi"
  spec.version       = "0.1.0"
  spec.authors       = ["sesame"]
  spec.summary       = "Regexp Multi parser plugin for Embulk"
  spec.description   = "Parses Regexp Multi files read by other file input plugins."
  spec.email         = ["sesame@purplemoon.org"]
  spec.licenses      = ["MIT"]
  spec.homepage      = "https://github.com/sesame/embulk-parser-regexp_multi"
  spec.files         = `git ls-files`.split("\n")
  spec.test_files    = spec.files.grep(%r{^spec/})
  spec.require_paths = ["lib"]

  #spec.add_dependency 'YOUR_GEM_DEPENDENCY', ['~> YOUR_GEM_DEPENDENCY_VERSION']
  #spec.add_development_dependency 'embulk', ['>= 0.9.7']
  spec.add_development_dependency 'bundler', ['>= 1.10.6']
  spec.add_development_dependency 'rake', ['>= 10.0']
  spec.add_development_dependency 'rspec'
end
  • homepageを記述する。
  • filesを修正する。
  • test_filesを修正する。rspecを使うので、specのみ記述されるようにする。
  • add_development_dependencyから、embulkの行を除去(コメント)する。embulkのgem版は提供されなくなっため。
  • add_development_dependencyにrspecを指定する。

その他

  • .ruby-versionファイルを削除する。中身はjruby-9.1.15.0の記述。jrubyを指定していると、動作開始に時間がかかるので。必要に応じて戻してもよい。.ruby-versionファイルが存在しないと、今使用しているRubyを使うことが出来る。
  • Rubyのバージョンがあまり新しいと、Embulk内のjrubyのバージョンと差異がでるが、とりあえずruby 2.5.1で進める。bundlerを利用するため、gem install bundlerだけはあらかじめ実施しておくこと。

Rubyのライブラリ導入

Rubyのライブラリ導入
$ bundle install --path vendor/bundle

rspecなどが導入される。bundle exec rspecのように、bundle execを前置すると、bundlerで導入したrspecを使用できるようになる。

RSpec用ひな形の作成

RSpec用のひな形作成
$ bundle exec rspec --init
fatal: Not a git repository (or any of the parent directories): .git
  create   .rspec
  create   spec/spec_helper.rb

fatalは、プロジェクト(embulk-parser-regexp_multi)をgit管理下にすると消えるので、ここでは無視する。

.rspecファイルを修正する。

.rspec
--require spec_helper
--require helper
--format documentation
--color

helperは、rspec用に後で作成するファイル。--format documentationは、rspecの実行結果を見やすくするために指定する。

spec/helper.rbの作成

ParserPluginクラスを継承して、プラグインのクラス(今回はRegexpMultiになる)を作成することになるが、本格的にRSpecによるテストを実施するためには、いろいろとダミーのクラスやメソッドを用意することになる。
最適な方法が見つからないので、RegexpMultiクラスの下に、肝となるクラスを用意しそのクラスをRSpecでテストする方針としたいため、最低限必要なParserPluginとColumnのみをここでは作成しておく。

spec/helper.rb
# -*- coding: utf-8 -*-
# frozen_string_lietral: true

Column = Struct.new(:index, :name, :type)

module Embulk
  module Parser
    class ParserPlugin
    end
  end
end

Columnは、インスタンス変数へのセッター、ゲッターとしてindexnametypeを持つクラスとして用意しておく。基本的なメソッド以外は持っていなくて良いので、ここではStructとして用意した。Column.new(0, "field1", :string)のようにして使える。

肝となるクラスの作成方法

$ mkdir lib/embulk/parser/regexp_mulit
$ touch lib/embulk/parser/regexp_multi/dummy.rb

rspecがとりあえず動作するように、最低限の記述を行う。

lib/embulk/parser/regexp_multi/dummy.rb
# -*- coding: utf-8 -*-
# frozen_string_literal: true

module Embulk
  module Parser
    class RegexpMulti < ParserPlugin
      class Dummy
        def dummy_method
          "dummy"
        end
      end
    end
  end
end

specファイルの作成

$ mkdir -p spec/embulk/parser/regexp_multi
$ touch spec/embulk/parser/regexp_multi/dummy_spec.rb
spec/embulk/parser/regexp_multi/dummy_spec.rb
# -*- coding: utf-8 -*-
# frozen_string_literal: true

require "embulk/parser/regexp_multi/dummy"

RSpec.describe Embulk::Parser::RegexpMulti::Dummy do
  let(:dummy) { described_class.new }

  describe "#dummy_method" do
    subject { dummy.dummy_method }
    it { is_expected.to eq "dummy" }
  end
end

rspecを実行してみる。

$ bundle exec rspec
fatal: Not a git repository (or any of the parent directories): .git

Embulk::Parser::RegexpMulti::Dummy
 #dummy_method
    should eq "dummy"

Finished in 0.00196 seconds (files took 0.10142 seconds to load)
1 example, 0 failures

成功したのを確認する。

git管理下に入れてコミットする

$ git init
$ git add .
$ git commit -m 'first commit'

開発前準備まで完了。

Embulkプラグイン作成入門2に続く。

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What is going on with this article?