Hiroto's diary

プログラミング関連を書くかも

Travis CIでApiGenを使ってAPIドキュメントを自動生成してGitHub Pagesで公開する

Travis CI上でApiGenを使ってドキュメントを自動生成してGitHub Pagesでホストして公開する方法。メモ書き程度に書いておきます。

実際に作ったのはこれ

https://hiroto-k.github.io/StringBuilder/

参考

github.com

gh-pagesブランチを切る

先にgh-pagesブランチを切って適当なコミットをしてpushしておく。

git symbolic-ref HEAD refs/heads/gh-pages
rm .git/index
git clean -fdx
echo "GitHub Page" > index.html
git add .
git commit -m "Initial commit"
git push origin gh-pages

Travis CIをセットする

.travis.ymlは既に有るものとします。

APIトークンをcurlで取得する。コマンドを実行するとパスワードの入力を求められるのでGitHubのアカウントのパスワードを入力する。

curl -X POST -u <ユーザー名> -H "Content-Type: application/json" -d "{\"scopes\":[\"public_repo\"],\"note\":\"token for pushing from travis\"}" https://api.github.com/authorizations

実行するとJSONが返ってくるのでJSONの中のtokenをメモしておく

次にGitHub公式のTravisクライアントを使ってTravis CIの環境変数を暗号化する。クライアントが無い場合はgem install travisを実行してインストール。

以下のコマンドを実行して暗号化キーを取得する。ユーザー名、リポジトリ、トークンは置き換えてください。トークンはさっきメモしたトークンを使います。

travis encrypt -r <ユーザー名>/<リポジトリ> GH_TOKEN=<トークン>

取得できたら.travis.ymlに書き込む。

env :
  global :
    secure : 暗号化キー

ドキュメントを自動生成するシェルスクリプトを書く

CIに成功した場合のみドキュメントを生成する。

.travis.yml

after_success:
  - bash .ci/generate-api.sh

2016-09-28 生成スクリプトを書き換え。


.ci/generate-api.sh

# PHP7.0で、ブランチがmasterで、プルリクエストでない時のみ実行。
if [ $TRAVIS_PHP_VERSION = '7.0' ] && [ $TRAVIS_BRANCH = 'master' ] && [ $TRAVIS_PULL_REQUEST = 'false' ];then

  # ApiGen.pharを取得
  wget http://www.apigen.org/apigen.phar

  # ドキュメントを生成。オプションは自分で
  yes | php apigen.phar generate -s src -d ../docs

  # Gitを設定
  git config --global user.email "自分のメールアドレス"
  git config --global user.name "自分のユーザー名"

  # Githubからclone
  git clone https://${GH_TOKEN}@github.com/ユーザー名/リポジトリ名 ../gh-pages --branch gh-pages > /dev/null

  # 生成したファイルをコピー
  \cp -f -r ../docs/* ../gh-pages

  # 変更がある場合のみコミットしてpush
  cd ../gh-pages
  git add .
  d=`date +"%Y/%m/%d %k:%M:%S"`
  git diff --cached --exit-code --quiet || git commit -m "Document update at ${d}"
  git push origin gh-pages -fq > /dev/null
fi

Vimのプラグイン管理ツールをNeoBundle.vimからdein.vimに乗り換えた

今までVimプラグイン管理にはNeoBundleを使っていたが、NeoBundleはオワコンと言うのを今更知った。なのでdotfilesの整理のついでにプラグイン管理をdein.vimに移行した。

github.com

移行後のコードは僕のdotfilesリポジトリに置いてある。

github.com

移行方法

dein.vimをgit cloneする

dein.vimGitHubからクローンする。どこに置いてもいいが、自分はdein.vim自体もdein.vimで管理したいので~/.vim/dein/repos/github.com/Shougo/dein.vim/にcloneした。

mkdir -p ~/.vim/dein/repos/github.com/Shougo/dein.vim/
git clone git@github.com:Shougo/dein.vim ~/.vim/dein/repos/github.com/Shougo/dein.vim

NeoBundleで書いていた処理をdein.vimに書き直す

自分はNeoBundleで特に凝った事はしていなかったので少し書き換えるだけで終わった。以下に書き換えた所を書いておく。

移行前

" Start NeoBundle
set runtimepath+=~/.vim/bundle/neobundle.vim/
call neobundle#begin(expand('~/.vim/bundle/'))

" NeoBundle
NeoBundleFetch 'Shougo/neobundle.vim'

" neocomplcache
NeoBundle 'Shougo/neocomplcache.vim'

" プラグイン色々

" 終わり
call neobundle#end()

filetype plugin indent on

" 未インストールのプラグインあったらインストール
NeoBundleCheck
" End NeoBundle

移行後 (~/.vim/dein/repos/github.com/Shougo/dein.vim以外にインストールした場合はパスを書き換える必要あり)

" Start dein.vim
if &compatible
  set nocompatible
endif
set runtimepath+=~/.vim/dein/repos/github.com/Shougo/dein.vim

call dein#begin(expand('~/.vim/dein'))

" ここにプラグインを書く
" dein.vim
" dein自体もdein.vimで管理する
call dein#add('Shougo/dein.vim')

" neocomplcache
call dein#add('Shougo/neocomplcache.vim')

" プラグイン色々

" 終わり
call dein#end()

filetype plugin indent on

" 未インストールのプラグインがあったらインストールする
if dein#check_install()
  call dein#install()
endif
" End dein.vim

PHPで楽に文字列を操作するライブラリを作った

PHPで楽に文字列を操作するライブラリ、StringBuilderを作った。ソースコードGithubで公開していてcomposerからでもダウンロード出来る。

github.com

packagist.org

ドキュメントはGitHub Pagesでホストしています。

https://hiroto-k.github.io/StringBuilder/hiroto-k.github.io

なにこれ

関数のネストで読みにくくなるのを避けるためにメソッドチェインで文字列を操作出来るようにしたライブラリ。

例を見たほうが早いので以下の事をしてみます。

$str,$arr以外の中間変数を用いずに

1, '  one two three 'の文字列の後ろに'four'を追加
2, 先頭の空白を削除
3, 全て大文字に変換
4, スペースで分割して配列に変換

めっちゃ単純で何の意味もないコードですが、普通のPHPでやるとこうなります。

<?php
$str = '  one two three ';
$arr = explode(' ', strtoupper(ltrim($str.'four')));
var_dump($arr);

…読みにくいですね。

これをStringBuilderでやってみる

<?php
use HirotoK\StringBuilder\StringBuilder as SB;

$str = '  one two three ';
$arr = SB::make($str)->append('four')->ltrim()->upcase()->explode(' ')
var_dump($arr);

Rubyみたいにメソッドチェインで書ける分見やすくなります。こんな事を簡単に出来るようにするライブラリです。

インストール

PHP 5.6以降が必要です。

  • composerからインストール。composer require hiroto-k/string-builderを実行する
  • vendor/autoload.phpファイルを読み込む。
  • ファイルの先頭にuse HirotoK\StringBuilder\StringBuilder;を書いてStringBuilderクラスを使えるようにする。
  • new StringBuilder($str)StringBuilder::make($str)インスタンスを作って処理をする。

Laravel/Lumenでレスポンスヘッダーのアサートをする

Illuminate\Foundation\Testing\Concerns\MakesHttpRequestsに実装されてるseeHeaderメソッドを使う。

framework/MakesHttpRequests.php at 5.2 · laravel/framework · GitHub

ヘッダーが存在する事を確認する

例えば/hogeにアクセスした時にX-Hogeヘッダが存在するかを確認するときには以下のようにする。

<?php

class HogeTest extends TestCase {

  public function testHoge {
    $this->visit("/hoge"); // "/hoge"へアクセス
    $this->seeHeader("X-Hoge");
  }

}

ヘッダーが存在して、値が同じな事を確認する

例えば/hogeにアクセスした時にX-Hogeヘッダが存在して、値がfoo-barであることをアサートするときには以下のようにする。

<?php

class HogeTest extends TestCase {

  public function testHoge {
    $this->visit("/hoge"); // "/hoge"へアクセス
    $this->seeHeader("X-Hoge", "foo-bar"); // アサート
  }

}

Laravelのコードを読んでいたらseeHeaderメソッドを見つけたので書き直しました。

LaravelのartisanコマンドでgetArguments()やgetOptions()を使う時はコマンド名の指定に$nameを使う必要がある

LaravelのArtisanで自作Commandクラスを使う時に躓いたのでメモ

LaravelでArtisanコマンドを作る時に以下のようにコマンド名を指定する($signatureを使う)とgetArguments()getOptions()が読まれない。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class HogeCommand extends Command {

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = "test:hoge";

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = "Test command";

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle() {
        dd($this->argument());
    }

    /**
     * Get the console command arguments.
     *
     * @return array
     */
    protected function getArguments() {
        return [
            ["files", InputArgument::IS_ARRAY, "Files"],
        ];
    }

}

これでtest:hogeコマンドを実行してもfiles引数は読まれない。

理由

HogeCommand内でコマンド名の指定に$signatureを使っているから。

$signatureでの指定は以下のリンクにあるように、$signatureで名前だけでなく引数やオプションも指定する時に使う。

http://readouble.com/laravel/5/1/ja/artisan.html

修正する

$signatureでは無く$nameでコマンド名を定義すればgetArguments()getOptions()が読まれる。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class HogeCommand extends Command {

    /**
     * The name of the console command.
     *
     * @var string
     */
    protected $name = "test:hoge";

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = "Test command";

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle() {
        dd($this->argument());
    }

    /**
     * Get the console command arguments.
     *
     * @return array
     */
    protected function getArguments() {
        return [
            ["files", InputArgument::IS_ARRAY, "Files"],
        ];
    }

}

これでfiles引数が動く

© 2015-2017 Hiroto-K