Update dependencies

json gemが1.xだとruby2.4で動かなくて、2.xだとruby1.9で動かない。
みたいなので結構おっくうになってたのだけど、ちょっとずつバージョンを上げ始めた。

http://rubies.travis-ci.org/ みながらここにあげる

- 2.0.0
- 2.1.10
- 2.2.6
- 2.3.3
- 2.4.0

今上げてるのが、nodejsにかぶれたあとのライブラリ群なので、まだそんなに苦労はしていない。まだ。

いまのところで引っかかるのは、
– rubocopがどこかのバージョンから1.9サポートをdropしている
– public_suffixがどこかのバージョンから1.9サポートをdropしている

このへん。
rubocopはgemspecではなくGemfileで入れてることが多いので、gem 'rubocop' if RUBY_VERSION >= 2.0.0みたいにした。
octokit -> sawyer -> addressable -> public_suffix
を使っているライブラリはもうどうしようもないので、1.9サポートをdropした。

1.9なんてもういいだろって思うけど、travis-ciって便利サイトがデフォルトruby1.9で、他の言語で使って欲しいツール・ライブラリでは1.9もサポートしたいのよね。出来る限り。
で、出来ない限りになってしまったので、1.9サポートdropはしかたない。
あとはmac os xっていう便利プラットフォームもsystem rubyが2.0とかいう化石使ってるので、2.0サポートも出来る限りしたい。
こういう小さいツール・ライブラリを作るのにrubyを使うのは向かない、ってことになってしまうのがなんともはや。
golangでやろう、って方向へいきますね。golangまだ全然思うように書けないけど。

広告

1個のライブラリにまとめたくなる呪縛

rubyのgemは1個のgemがやろうとすることが多すぎる。npm moduleは1メソッドが1packageぐらいの粒度。だから自分はnpmが好き。

って普段から言ってるのに、似たようなことやるからこのgemにメソッド生えてたほうがいいかな、とメソッド増やそうとしてしまった。気づいたから良かった。packageわけよう。rubyだから、nodejsだから、というわけでもないと思うんだが何なんだこの呪縛は。

正の整数の文字列か判定するNaturalNumberString gem書いた

正の整数の文字列か判定するNaturalNumberString gem書いた。

APIはこんな感じです。

NaturalNumberString.positive_integer_string?(value) -> boolean
NaturalNumberString.zero_or_positive_integer_string?(value) -> boolean

詳細: yard docs

環境変数を取得してあれこれするライブラリを書いている。

if ENV['FOO']
  # do something
end

これでいいかと思ったら、あるCIサービスでは、falsyなときにENV['FOO']がないのだが、別のCIサービスでは、falsyなときはENV['FOO'] == ''なことがある。

if ENV['FOO'] && !ENV['FOO'].empty?
  # do something
end

これでいいかと思ったら、

TRAVIS_PULL_REQUEST the pull request number if the current job is a pull request, or “false” if it’s not a pull request.
http://docs.travis-ci.com/user/environment-variables/#Convenience-Variables

文字列’false’… いや文字列しか使えないから仕方ないのは知ってるけど。なのでカッとなって書いた。

NaturalNumberString.positive_integer_string?('1') #=> true
NaturalNumberString.positive_integer_string?('100000000000') #=> true

NaturalNumberString.positive_integer_string?(nil) #=> false
NaturalNumberString.positive_integer_string?('') #=> false
NaturalNumberString.positive_integer_string?(1) #=> false
NaturalNumberString.positive_integer_string?('1.1') #=> false
NaturalNumberString.positive_integer_string?('-1') #=> false
NaturalNumberString.positive_integer_string?('0') #=> false

NaturalNumberString.zero_or_positive_integer_string?('0') #=> true

文字列’0’の扱いだけ変えるmethodもある。

なおnodejsでも似たような発想のことやってるの前に作った。sanemat/node-boolify-string

*.gemspec ファイルをいい感じにparseするgem書いた

うっとなったので *.gemspec ファイルをいい感じにRuby Hash objectにするgem parse_gemspec と、
*.gemspec ファイルをいい感じにJSON にする CLIツールのgem parse_gemspec-cli かいた。

それぞれこう使う。

Ruby

require 'parse_gemspec'
require 'pp'

pp ParseGemspec::Specification.load('parse_gemspec.gemspec').to_hash_object
{:name=>"parse_gemspec",
 :version=>"0.5.0",
 :authors=>["sanemat"],
 :description=>"Parse *.gemspec file. Convert to Ruby Hash object.",
 :email=>["o.gata.ken@gmail.com"],
 :homepage=>"https://github.com/packsaddle/ruby-parse_gemspec",
 :licenses=>["MIT"],
 :metadata=>{},
 :summary=>"Parse *.gemspec file. Convert to Ruby Hash object."}

CLI

$ parse-gemspec-cli parse_gemspec.gemspec | jq .
{
  "name": "parse_gemspec",
  "version": "0.5.0",
  "authors": [
    "sanemat"
  ],
  "description": "Parse *.gemspec file. Convert to Ruby Hash object.",
  "email": [
    "o.gata.ken@gmail.com"
  ],
  "homepage": "https://github.com/packsaddle/ruby-parse_gemspec",
  "licenses": [
    "MIT"
  ],
  "metadata": {},
  "summary": "Parse *.gemspec file. Convert to Ruby Hash object."
}

filesとdependenciesが未対応。

filesは最近のだとgit ls-files使ってる場合が多いので、どうしようかな。いい方法が思いつかない。
specification: files, many gems use git ls-files -z

dependenciesはPlain Old Ruby Objectでどう表現しようかな、json表現どうしようかな、というところで止めてる。
specification: dependencies’ PORO format and json format

具体的な利用方法はこんな感じ。
conventional-changelog(npm)をRuby pruductから使う | 實松アウトプット

bundle updateしたあとBUNDLED WITHを元に戻すrestore_bundled_with書いた

Bundler v1.10.0からbundle updateしたversionがGemfile.lockのBUNDLED WITH sectionに記録されるようになった。

Ruby – BUNDLED WITH で Gemfile.lock が更新されてしまう件 – Qiita

なのだけど、それはそれでめんどうなので、bundle updateしたあとに使う、BUNDLED WITHだけを元に戻すrestore_bundled_withを書いた。

packsaddle/ruby-restore_bundled_with

使い方はこちらに書いた。
restore_bundled_withを使ってBundlerのBUNDLED WITHをうまく取り扱う – Saddler – checkstyle to anywhere

tl;drに書いたとおり、やることのスジはあまり良くない。

  • Bundler v1.10.0からBUNDLED WITHのsectionが導入された。
  • restore_bundled_withを使うことで、Bundler開発チームの精神を逸脱して(!)、異なるversionのBundlerとBUNDLED WITHをうまく取り扱う。

BundlerのversionはGemfileの管轄外だとは思うんだよなあ。そしてruby directiveにも同じことを思ってる。