電柱商事

CHANGELOG v0.27.1

2019/01/30

[原文]

言語仕様

タプル型の表記内で、要素の末尾にカンマが置けるように(#7182

{String, Int32, } のように、要素の型リストがカンマで終わってもよくなり、マクロでタプルを生成する場合などに最後の要素かどうかを判定してカンマの有無を決める必要がなくなった。

標準ライブラリ

(性能改善) String から UUID の生成を最適化(#7030

内部処理で Array のかわりに Tuple を使ったほか、入力バリデーションなどが最適化された。

(性能改善) SemanticVersion 処理を改善(#7234

SemanticVersionclass から struct に変更したほか、分岐条件などが最適化された。

Markdownのインラインコードがパースされてしまわないよう修正(#7090

これまで、インラインコードの内部までMarkdownとしてパースされてしまい、 `#[](...)` といったインスタンスメソッドに関する記述がリンク扱いになっていたのが修正された。

不適切な Time.now の利用を修正(#7155

経過時間を図る場合、タイムゾーンは不要なので、 Time.now ではなく Time.utc_now を使うよう修正された。

Nil#not_nil!NilAssertionError を発生させるようになった(#7330

これまで Exception(全ての例外の基底クラス)が発生していたが、独自の型となったことで rescue で拾いやすくなった。

SemanticVersion のAPIドキュメントを追加(#7003

Bool#to_unsafe が C バインディングのためのものである旨をドキュメントに明記(#7320

Class#to_sClass#name を使用しないよう変更(#7295

これまではある型 A に対して、 A.name をオーバーライドすると、 puts A の結果が変化してしまっていた。

マクロ

ArrayLiteral#unshift のドキュメントを修正(#7127

Annotation#[] がキーとして StringSymbol を受け取れるよう修正(#7153

NamedTupleLiteral#[] に不正な型のキーが与えられた場合コンパイルエラーとなるよう修正(#7158

getter / property マクロが Bool 型でも正しく動作するよう修正(#7313

read_file マクロメソッドを追加(#6967#7094

StringLiteral#count メソッドを追加(#7239

数値

BigDecimal 型の除算におけるスケール問題を修正(#7218

String 型を Big〜 型のコンストラクタに渡す際にアンダースコアを使えるよう修正(#7107

Complex 型に他の型への変換メソッドとそのドキュメントを追加(#5440

Int128UInt128 型のSpecを追加(#7173

安全でない数値の操作 value.to_X! / T.new! / Int#&** を追加(#7226

数値のオーバーフローチェックをオプトイン方式でプレビュー追加(#7206

テキスト

ECR内のエラーで表示される箇所を修正(#7137

ECRのドキュメントを追加(#7121

String#to_i が将来発生しうるオーバーフローを回避するよう変更(#7172

コレクション

Hash#from のドキュメントに登場する例を修正(#7210

APIドキュメントの Enumerable#chunks および Iterator#chunk へのリンクを修正(#6941

JSON から Hash への変換時に、暗黙のnullスキップを廃止(#7053

これまでは、Hash.from_json でJSONからハッシュを生成する際、JSON内で値が null のアイテムは暗黙的に無視されていたが、値の型としてNilを許容しないHashの場合は例外となるようになった。

Iterator#slice_after の追加(#7146

Iterator#slice_before の追加(#7152

Iteratory#slice_when および Iterator#chunk_while の追加(#7159

Enumerable#to_h(&block) の追加(#7170

Enumerable#one? の追加(#7166

Add several Enumerable, Iterator and Array overloads that accept a pattern(#7174

ハッシュを生成するコンストラクタにドキュメントを追加(#6923

シリアライズ

JSONYAML を相互に変換するメソッドを追加(#7232

JSON::AnyYAML::Any の間で #as_T / #as_T? メソッドの挙動を標準化(#6556

Set#from_yaml を追加(#6310

時刻/時間

Time::Span のコンストラクタや、sleep に大きな秒数を指定した際の挙動修正(#7221

以前は、内部的に Int32 が使用されるタイミングがあり、Int32 に収まりきらない秒数が指定されるとオーバーフローを起こす可能性があった。

時刻のパースについてドキュメントを適正な形へ修正(#7035

Float#weeks が無かったので Int#weeks と同様のメソッドとして追加(#7165

ファイル

aarch64 環境で mkstemps 関数が使えるよう修正(#7300

LibC の Error を spec 上で識別できるように(#7087

標準ライブラリの多くは LibC の関数がエラーを返した際に Errno 型の例外を発生させるが、specによるテストでそうしたエラーを補足するには expect_raises(Errno, /***/) {...} のような形でエラーメッセージから判別するしか無かった。今回、 expect_raises_errno が追加されたことで、 expect_raises_errno(Errno::ENOENT) {...} として個々のエラーを個別に捕捉できるようになった。

System::File.utime がマイクロ秒精度を返すように変更(Unix)(#7156

テンポラリファイルの spec に欠けていた後処理を追加(#7250

ファイルを開く際のモードについてドキュメントを追加(#6664

ネットワーク

HTTP::Client の TLS 初期化中に例外が起きた際の処理を修正(#7123

これまで、HTTPS通信を開始しようとしてTLSの初期化中にタイムアウトなどが発生すると、内部のソケットが OpenSSL::SSL::Socket::Client ではなくコネクションが貼られた素の TCPSocket となってしまい、その次のデータ送信に失敗する可能性があった。今回、そうした場合には次回の利用時に再度コネクションを貼り直すように修正された。

OpenSSL::SSL::Error.newErrno を発生させないよう修正(#7068

OpenSSL::SSL::Error.new は内部で ssl_get_error 関数を使用しており、この関数内でsyscallエラーが起きた場合、これまでは Errno 型の例外が発生していた。今回、そうした場合も OpenSSL::SSL::Error型の例外が返され、そこから ssl_get_error 内で起きたエラーも捕捉できるようになった。

StaticFileHandler::DirectoryListing のURIエンコーディングを修正(#7072

MIME モジュールを追加(#5765#7079#7080

ファイル名や拡張子からMIMEタイプをできるようになった。MIME::DEFAULT_TYPES として標準で定義されているMIMEタイプはWeb関係でよく使われる10数種類だけだが、/etc/mime.types/etc/apache2/mime.types などいくつかのファイルからMIMEタイプ定義の読み込みを試みるほか、自身で追加も可能。

MIMEタイプをパースするための MIME::MediaType 型を追加(#7077

トップレベルタイプやサブタイプ、パラメータなどにアクセスできる。

HTTP::Server::Response をステータスコード「100-continue」に対応(#6912

ファイルディスクリプタからのソケット生成に対応(#6894

OpenSSL をSNIに対応(#7291

HTTP::Server のドキュメントを充実(#7251

OpenSSL のspecが想定外に失敗しないよう修正(#7202

暗号化

OpenSSLが認証付き暗号に対応しているかを確認するための OpenSSL::Cipher#authenticated? を追加(#7223

システム

ARM環境でコンパイルする際のインラインアセンブラを修正(#7041

Win32環境での Crystal::System を充実(#6972

Errno#errno_message メソッドを追加(#6702

これまで、Errno 型の例外を捕捉した際に strerror 関数が返すLibC側のエラーメッセージを単体で取得できなかったのができるようになった。

Spec

ネストしたitpending ブロックを実行時に検出(#7297

以前は it の中に penging を置けたりして色々面倒なことになっていたので、itpenging をネストできないようにした。

コンパイラ

LLVM::Type.const_intInt128 リテラルの処理方法を修正(#7135

内部コンイパイラエラーに関連した名前付きタプルの修正(#7163

トップレベルのプライベートメソッドの自動キャストが働いていなかったので修正(#7310

v0.25.0で導入されたメソッドのリテラル引数を自動キャストしてくれる機能が、トップレベルのプライベートメソッドで働いていなかった。

列挙型(enum)の定義内で initialize を定義しようとした際に適切なエラーを返すようにして、代わりに Enum.new の再定義を許可(#7266

なお、実際には Enum.new を再定義するのではなく、列挙型の定義内で self.new を再定義する。再定義された A.newA 型を返す必要はない模様。

ユニオン型に対してインスタンス変数を取得しようとした際に適切なエラーを返すよう変更(#7194

Crystal言語では、明示的なゲッタメソッドが定義されていないくても value.@var という形でインスタンス変数を取得できる。

将来的には、ユニオン型を構成する全ての型が同じ名前のインスタンス変数を持っているのであれば、ユニオン型に対してもこの機能が利用できるようにする検討もされるようだが、現状ではユニオン型に対するこうしたインスタンス変数の取得はコンパイルエラーとなる。

モジュールをインスタンス化しようとした際に適切なエラーを返すよう変更(#6735

名前付き引数に関連して適切なエラーを返すよう変更(#7288

ブロック引数に必要なカンマを正しくパースされるよう変更(#7343

再帰処理中にブロックを実行する際の型推論の改善(#7161

全ての展開されたマクロ引数にロケーションを追加(#7008

コンパイラ固有のエラーでないものをICEへ変更(#7208

ポインタ型に対する古い nil? エラーを除去(#7180

長大なタプル型や名前付きタプル型に対するエラーメッセージを改善(#7131

バグの多いデバッグ情報に対する回避策(#7335

Float32型およびFloat64型の値を生成するヘルパメソッドのリファクタリング(#7134

interpret_runにおけるファイル名解決ロジックのリファクタリング(#7051

オーバーフローに関する内部処理のリファクタリング(#7262

Crystal::Codegen::Target のリファクタリングと三重処理の統合(#7282#7317

ツール

README のテンプレートを更新(#7118

CPI出力中の Crystal をキャピタライズ(#7224

フォーマッタ

複数行にまたがるリテラルのフォーマット処理を修正(#7048

式展開を含むヒアドキュメントのフォーマット処理を修正(#7184

ネストしたタプル型の表記とマクロ構文との衝突を防止(#7097

ジェネリック型の型引数に typeof を使用した際のフォーマット処理を修正(#7176

ブロック引数 &.foo の後に改行が来た際のフォーマット処理を修正(#7240

対象が単独ファイルでも複数ファイルでも同じ挙動となるよう修正(#7144

フォーマッタのspecから不要なクォートを削除(#6968

crystal tool format コマンドの大幅な改修(#7257

ドキュメントジェネレータ

(セキュリティ) 外部引数名による XSS を防止(#7056

トップレベルの生成法を修正(#7063

ダブルスプラット引数とブロック引数の表示を修正(#7029#7031

マクロの末尾の空白を維持するよう修正(#7099

エイリアスとして定義された型のサブタイプを表示しないよう修正(#7124

メソッドのマウスホバー時のスタイルを修正(#7022

欠けていたキーワードを Doc::Highlighter に追加(#7054

docs コマンドに --format オプションを追加(#6982

その他

CIの強化と掃除(#7018#7043#7133#7139#7230#7227#7263

CI内でフォーマットチェックを独立させた(#7228

ビルド日の定義を標準準拠の変数で行うよう変更(#7186

公式リポジトリREADMEのコミュニティセクションにフォーラムを追加(#7235

ドキュメントの文法やタイポ修正(#7034#7242#7331

サンプルの充実(#6454

v0.27.0のCHANGELOGを修正(#7024

ISSUE_TEMPLATEに公式フォーラムを追加(#7301

LICENSEのコピーライト年を修正(#7246