月別アーカイブ: 2017年7月

Capybara(Rspec)で指定したセレクタ要素が存在しないことを検証する

以前は以下を参考にして例外を発生させて検証してたが、

Capybaraで要素がないことをテストする方法 | 自転車で通勤しましょ♪ブログ http://319ring.net/blog/archives/2546/

以下で充分検証することができた。例外待ちしない分こちらのほうが高速。

def cant_find(selecter)
  expect(page.all(selecter).empty?).to eq true
end

[Laravel] Exceptionをcatchできない

LaravelのController内で以下のように例外を補足するコードを書いても例外を補足できなかった

try {
  hoge();
} catch (Exception $e) {
  var_dump($e);
  exit;
}

散々ハマってPHPの例外処理の仕様まで追ったが、結果的に以下の修正で解決した。

try {
  hoge();
} catch (\Exception $e) {
  var_dump($e);
  exit;
}

namespace内のExceptionを待ち受けるか、全体のExceptionを待ち受け取るかの違い。

[Laravel] 対話的にプログラムを実行する

概要

laravelのtinkerを用いて対話的にプログラムを実行する。tinkerはRuby on Railsで言うところのrails consoleで、Laravelを用いた環境に対するプログラムの発行を行うツールである

起動

artisanのあるディレクトリに移動し、以下のコマンドで起動できる

$ php artisan tinker
Psy Shell v0.8.6 (PHP 5.6.30-12~ubuntu16.04.1+deb.sury.org+1 — cli) by Justin Hileman

PHPプログラムの実行

tinkerを起動すると、対話的にプログラムを実行することができる

>>> 5 + 2
=> 7
>>> 2 ** 8
=> 256

当然PHPの標準ライブラリを利用することも可能

>>> strlen('hogehoge');
=> 8
>>> array_map(function($n) { return $n * 10; } , [2,4,6,8,10]);
=> [
     20,
     40,
     60,
     80,
     100,
   ]

複数行に跨ぐことも可能。書きづらいので基本的にワンライナーであるべきだとは思う。

>>> function sayHello($name) {
...   return "Hello, $name";
... }
>>> sayHello('sasaki');
=> "Hello, sasaki"

LaravelModelの操作

Userモデルが存在する時、tinkerを用いてUserの作成と取得を行う。

作成

>>> $user = new App\User();
=> App\User {#703}
>>> $user->email = 'hogehoge@fugafuga.com';
=> "hogehoge@fugafuga.com"
>>> $user->password = md5('hogehoge');
=> "329435e5e66be809a656af105f42401e"
>>> $user->save();
=> true

取得

>>> $user = new App\User();
=> App\User {#703}
>>> $user->first();
=> App\User {#714
     id: 1,
     email: "hogehoge@fugafuga.com",
     name: "",
     created_at: "2017-07-11 11:37:49",
     updated_at: "2017-07-11 11:37:49",
     deleted_at: null,
   }

所感

  • DBの内容確認したいけどSQL書くのが面倒という時にも使えそう
  • 実装したロジックの動作確認の戦力になりそう
  • Laravel関係なくPHPの簡単な動作確認なんかにも使えそう

[Ruby] 外部からWordPressの記事を取得する

前提

以下の環境で実装/動作確認済み

要素 バージョン
ruby 2.3.1
gem 2.6.12
bundle 1.15.1
rubypress 1.2.2

概要

  • Rubyを用いて外部のWordPressの記事一覧、詳細を取得する
  • 対象WordPressの有効なアカウント情報が必要
  • 記事の投稿、編集など基本的な全ての処理が可能だが、本記事では取得までに抑える

XML-RPCの有効化

本記事ではWordPressのXML-RPC機能を用いて外部から操作を行う。ただしこの機能はセキュリティの観点から無効になっている場合が多い。その場合はwp_config.phpの以下の行をコメントアウトすることで有効化出来る。サーバに入れない環境の場合は諦めるしか無い。

add_filter('xmlrpc_enabled', '__return_false');

rubypressの導入

RubyでXML-RPCを用いてWordPressを操作する時に最も手軽に利用できそうなgemライブラリであるrubypressを導入する。ここでは空のGemfileを作成するところから始める

source "https://rubygems.org"
gem "rubypress"

ディレクトリ内にインストール

$ bundle install --path vendor/bundle

WordPressクライアントオブジェクトの作成

Rubypressを用いてClientオブジェクトを作成する。ここでは対象WordPressのホスト名、ユーザ名、パスワードが必要になる。

require 'rubypress'
class WordPress

  @@hostname = 'qs.nndo.jp'
  @@username = 'sasaki'
  @@password = 'XXXXXXXXXXXXXXXX'

  def initialize
    @wp_client = Rubypress::Client.new(
      host: @@hostname,
      path: '/xmlrpc.php',
      username: @@username,
      password: @@password,
    )
  end

end

記事を取得する主なメソッドの使い方

post_idを指定して取得

@wp_client.getPost(post_id: 13)

出力。長いので一部のみ掲示

{"post_id"=>"13",
 "post_title"=>"サンプル記事3",
 "post_date"=>
 "post_status"=>"publish",
 "post_content"=>"サンプル記事3本文",
 "post_parent"=>"0",
 "post_mime_type"=>"",
 "post_format"=>"standard",
 "terms"=>[],
 "custom_fields"=>[]}

一部のフィールドのみ取得

タイトルと本文さえあれば良いという場合は以下のように

@wp_client.getPost(post_id: 13, fields: [:post_title, :post_content])
{"post_id"=>"13", "post_title"=>"サンプル記事3", "post_content"=>"サンプル記事3"}

全ての記事一覧を取得

出力が長くなってしまうので、タイトルのみ取り出すようにする

@wp_client.getPosts(fields: [:post_title])
[{"post_id"=>"18", "post_title"=>"サンプル記事1"},
 {"post_id"=>"20", "post_title"=>"サンプル記事2"},
 {"post_id"=>"22", "post_title"=>"サンプル記事3"}]

カスタム投稿タイプを指定して記事一覧を取得

例えば”news”というカスタム投稿タイプがあるとして、newsの一覧を取得する

@wp_client.getPosts(filter: {post_type: :news}, fields: [:post_title])
[{"post_id"=>"8", "post_title"=>"サンプルニュース1"},
 {"post_id"=>"10", "post_title"=>"サンプルニュース2"}]

参考