DRYな画面一覧管理。プログラムから画面名を抽出し、esa APIで共有する

キーワード:esa , TechBlog

laziness

週1参戦要員tbpgr(てぃーびー)です。
画面の話題を出す際などに、画面名を一意にして会話をしたい。
Issueの登録をする際に画面名を統一したい。

そういえば画面一覧がなかった。
目視で画面名を確認し、手動で画面一覧を作成しても良いのですが

・漏れる可能性
・タイポする可能性
・めんどくさい

などにより、好ましくありません。
幸い画面名はプログラム内で規則正しく設定されていたため、
プログラムで抽出し、その内容をesa APIでesaに登録・更新することにしました。

目次

1. 前提
2. タイトル抽出プログラム
3. 画面タイトルの抽出を実行
4. esa API 利用準備
5. esa API を利用した画面名登録プログラム
6. 動作確認

1. 前提

システム上での画面タイトルの設定方法を統一しておくこと。
今回は、プログラム内で title = ‘画面タイトル’ の形式で統一されているものとします。

目次へ

2. タイトル抽出プログラム

Rubyでタイトルを抽出するプログラムを作成します。
下記のプログラムでタイトルの一覧が出力されます。
※仮にカレントディレクトリ内にタイトルを含むプログラムが配置されているものとします

extract_titles.rb

# プログラム上は title = 'タイトル' の形式になっている
titles = Dir.glob('*.*').each_with_object([]) do |file, memo|
  src = File.read(file)
  src.each_line do |line|
    line =~ %r{title\s*=\s*'(.*)'}
    memo << $1 if $1
  end
end

puts titles

esa APIへの登録処理を一気に行わず、中間ファイルに出力しているのは、
他の用途のためにリストを加工する可能性があるためです。

目次へ

3. 画面タイトルの抽出を実行

extract_titles.rb

$ ruby extract_titles.rb > titles.txt
$ cat titles.txt
test1
test2
test3

目次へ

4. esa API 利用準備

・esaのTEAMメニューを選択
・自ユーザーを選択
・Personal access tokensタブを選択
・Generate new tokenをクリック
・Read / Write 双方にチェックをして Token description にAPIの用途を説明する内容を入力
・Saveをクリック
・tokenが表示されるので、内容を保存しておきます

目次へ

5. esa API を利用した画面名登録プログラム

前提

・ esa-ruby gem を利用
・ 環境変数の管理に dotenv gem を利用

※dotenvについては下記を参照
Ruby | dotenv gem で 環境変数をスマートに管理

仕様

・ 該当エントリがなければ新規登録
・ すでに登録済みなら更新

プログラム

.envにトークン・チーム名を設定します

# 利用準備で取得したtokenを設定
ESA_API_TOKEN=your token
TEAM=your team

create_or_update_titles.rb

require 'dotenv'
require 'esa'
Dotenv.load

def titles
  File.read('titles.txt').each_line.map(&:chomp)
end

body =< ## 画面一覧
#{titles.map{ |e|"* #{e}" }.join("\n")}
EOS

name = '画面一覧'
category = 'サンプル/プロジェクト/仕様書'
# 検証用のためtrueにしてます。実際はfalseが良いです
wip = true

client = Esa::Client.new(access_token: ENV['ESA_API_TOKEN'], current_team: ENV['TEAM'])
response = client.posts(q: "name:#{name} category:#{category}")
if response.body['total_count'] == 0
  client.create_post(
    category: category,
    name: name,
    wip: wip,
    body_md: body
  )
else
  post_number = response.body['posts'].first['number']
  client.update_post(post_number, body_md: body)
end

6. 動作確認

新規登録

初回実行時は、新規登録になります。
以下の内容でesaに登録されます。

new

更新

2回目の実行時はすでに登録済みのため、更新処理になります。
差分を確認するために、画面名test4を追加しておきます。

update
update_history

まとめ

ちょっとしたスクリプトで手動作業によるミスをなくし、
繰り返し保守をする際のコストも削減できました。

esa APIを利用したこの仕組み自体は画面一覧以外にも
応用できそうです。

怠惰、大事。

外部資料

esa api Document
esa API client library, written in Ruby

上へ戻る