diff --git a/i18n/omegat/project_save.tmx b/i18n/omegat/project_save.tmx index 55b74363..304532be 100644 --- a/i18n/omegat/project_save.tmx +++ b/i18n/omegat/project_save.tmx @@ -849,6 +849,18 @@ end # ここでの 'self' は Hello クラス + + + # (actual - expected).abs <= delta +actual.should contain(expected) # passes if actual.includes?(expected) +actual.should match(expected) # passes if actual =~ expected + + + # (actual - expected).abs <= delta +actual.should contain(expected) # actual.includes?(expected) が真であれば合格 +actual.should match(expected) # actual =~ expectedが真であれば合格 + + # .. @@ -2547,6 +2559,22 @@ foo 1, y: 10 # OK # 概要 + + + # Passes if this block raises an exception of type MyError + + + # ブロック内でMyError型の例外が発生し、 + + + + + # Passes if this block raises an exception of type MyError. + + + # ブロック内でMyError型の例外が発生すれば合格 + + # Performance @@ -2661,6 +2689,52 @@ loop do # Returns the number of horns this unicorn has. + + + # Run all specs in files matching spec/**/*_spec.cr +crystal spec + +# Run all specs in files matching spec/**/*_spec.cr without colors +crystal spec --no-color + +# Run all specs in files matching spec/my/test/**/*_spec.cr +crystal spec spec/my/test/ + +# Run all specs in spec/my/test/file_spec.cr +crystal spec spec/my/test/file_spec.cr + +# Run the spec or group defined in line 14 of spec/my/test/file_spec.cr +crystal spec spec/my/test/file_spec.cr:14 + +# Run all specs tagged with "fast" +crystal spec --tag 'fast' + +# Run all specs not tagged with "slow" +crystal spec --tag '~slow' + + + # ファイル名が spec/**/*_spec.cr にマッチするファイル内の全specを実行 +crystal spec + +# ファイル名が spec/**/*_spec.cr にマッチするファイル内の全specを実行(出力を色分けしない) +crystal spec --no-color + +# ファイル名が spec/my/test/**/*_spec.cr にマッチするファイル内の全specを実行 +crystal spec spec/my/test/ + +# 特定のファイル spec/my/test/file_spec.cr 内の全specを実行 +crystal spec spec/my/test/file_spec.cr + +# 特定のファイル spec/my/test/file_spec.cr の14行目で定義されたspecや、グループ内のspecを実行 +crystal spec spec/my/test/file_spec.cr:14 + +# "fast" タグが付けられたspecを全て実行 +crystal spec --tag 'fast' + +# "slow" タグが付いていないspecを全て実行 +crystal spec --tag '~slow' + + # Same as " Hello\n world" @@ -3780,6 +3854,22 @@ def some_method # そして、それを含んでいるかのチェックをランタイムに行う必要がある + + + # and the error message contains "error message". + + + # かつそのエラ〜メッセージが"error message"を含んでいれば合格 + + + + + # and the error message matches the regular expression. + + + # かつそのエラーメッセージが正規表現にマッチすれば合格 + + # and the type of value2 is known to be an Int32 @@ -13685,6 +13775,30 @@ second operand with pattern matching. <g1>変数の宣言</g1>のとき + + + <g1>describe</g1> and <g2>context</g2> take a description as argument (which should usually be a string) and a block containing the individual specs or nested groupings. + + + <g1>describe</g1>や<g2>context</g2>は引数に概要(通常は文字列)をとり、個々のspecやネストしたグループを含むブロックを与えます。 + + + + + <g1>describe</g1>, <g2>context</g2> and <g3>it</g3> blocks can be marked with <g4>focus: true</g4>, like this: + + + <g1>describe</g1>や<g2>context</g2>、<g3>it</g3>ブロックには、以下のように<g4>focus: true</g4>を指定できます。 + + + + + <g1>describe</g1>, <g2>context</g2> and <g3>it</g3> blocks can be tagged, like this: + + + <g1>describe</g1>や<g2>context</g2>、<g3>it</g3>ブロックには以下のようにしてタグを付けることが可能です + + <g1>ensure</g1> clauses are usually used for clean up, freeing resources, etc. @@ -16022,6 +16136,14 @@ an application not intended to be used as a dependency. バックスラッシュに続く最大3つの0から7までの数値は、8進数によるコードポイントの記述となります。 + + + A basic spec looks something like this: + + + 基本的な spec はこのようになります。 + + A block argument can specify sub-arguments enclosed in parentheses: @@ -17104,6 +17226,14 @@ extra syntax to manipulate the AST nodes. コマンドに続くすべてのオプションは <g1>crystal build</g1> に渡されます。 + + + All specs of a project are compiled and executed through the command <g2>crystal spec</g2>. + + + <g2>crystal spec</g2>コマンドによって、プロジェクト内の全てのspecがコンパイル後に実行されます。 + + All time @@ -17457,6 +17587,14 @@ in undefined behavior and most likely crashing your program. <g1>include</g1> はモジュールで定義されたメソッドをインスタンスメソッドとして利用できるようにします。 + + + An <g1>it</g1> block contains an example that should invoke the code to be tested and define what is expected of it. + + + <g1>it</g1>ブロックには、テスト対象となるコードの実行例と、その結果がどうなるべきかの定義を記述します。 + + An <g1>offsetof</g1> expression returns the byte offset of an instance variable in a struct or class type. @@ -17811,6 +17949,14 @@ a sequence of digits and underscores, optionally followed by a suffix. そして、オブジェクトに内部状態が存在する場合は、メソッドを実行することでその状態について問い合わせることができます。 + + + An optional (but strongly recommended) descriptive string states it's purpose and a block contains the main logic performing the test. + + + ここには、そのテストの意図を説明する文字列(オプションですが、強く推奨)とともに、テストが実行するロジックを納めたブロックが与えられます。 + + An optional trailing colon is preferred for readability. @@ -17827,6 +17973,14 @@ a sequence of digits and underscores, optionally followed by a suffix. 型制約でアンダースコアを使うことが可能です。 + + + Anatomy of a spec file + + + specファイルの構造 + + And <g7>Array(Bar)</g7> is <g8>not</g8> assignable to an <g9>Array(Foo)</g9> instance var. @@ -19446,6 +19600,14 @@ end しかし、それ以外にもこの仕様には意味があります。それは、同一階層下のクラスは同じように振る舞うべき、というものです。 + + + By convention, specs live in the <g1>spec/</g1> directory of a project. + + + 慣例的に、specはプロジェクト内の<g1>spec/</g1>ディレクトリに置かれます。 + + By default (i.e. no options given) the application will display the names of the Fab Four. @@ -20177,6 +20339,14 @@ Color::Blue.red? #=> false 比較 + + + Comparisons + + + 比較 + + Compile and <g1>run the application</g1>, all in one command. @@ -20241,6 +20411,14 @@ Color::Blue.red? #=> false メソッド定義のコンポーネント + + + Concrete test cases are defined in <g1>it</g1> blocks. + + + 具体的なテストケースは<g1>it</g1>ブロック内に記述します。 + + Concurrency @@ -20557,6 +20735,14 @@ Counter.instances #=> 3 Crystal のドキュメンテーションコメントは <g1>Markdown</g1>https://daringfireball.net/projects/markdown/<e2/> のサブセットになっています。 + + + Crystal comes with a fully-featured spec library in the <g1><g2>Spec</g2> module</g1>https://crystal-lang.org/api/latest/Spec.html<e3/>. + + + Crystalには、<g1><g2>Spec</g2>モジュール</g1>https://crystal-lang.org/api/latest/Spec.html<e3/>内に、フル機能の spec ライブラリが用意されています。 + + Crystal documentation comments use a subset of [Markdown](https://daringfireball.net/projects/markdown/). @@ -21124,6 +21310,14 @@ Returns the name of `self`. 列挙型のそれぞれの定数はその列挙型を型として持ちます。 + + + Each example can contain multiple expectations, but it should test only one specific behaviour. + + + 個々の実行例に複数の式を含めることも可能ですが、そこでは特定の挙動1つに対するテストのみを行うべきです。 + + Each of the above kinds of variables will be explained later on. @@ -21247,6 +21441,14 @@ Employee.new "Peter" # 'Employee:Class#new' (1 for 2) を実行すると 等価性 + + + Equivalence, Identity and Type + + + 等価性、同一性、型 + + Error in foo.cr:6: instantiating 'add(Bool, Bool)' @@ -21434,6 +21636,14 @@ new <g2>shard.lock</g2> file. 例: <g1>overview/hello_world.md</g1>。 + + + Examples + + + + + Examples for this are the inversion operator <g1>!</g1>, the assignment @@ -21535,6 +21745,24 @@ or <g3><g4>OpenSSL::Digest#finalize</g4></g3>https://cry 終了コード: + + + Expectations + + + Expectations(想定される挙動) + + + + + Expectations define if the value being tested (<g1>actual</g1>) matches a certain value or specific criteria. + + + Expactationは、テスト対象の(<g1>actual</g1>)値がとるべき特定の値や、満たすべき一定の基準を定義します。 + + + + Expected: true @@ -21543,6 +21771,14 @@ or <g3><g4>OpenSSL::Digest#finalize</g4></g3>https://cry Expected: true + + + Expecting errors + + + エラーを想定する + + Explicit array literals in loops is one way to create temporary objects, but these can also be created via method calls. @@ -21913,6 +22149,14 @@ or <g3><g4>OpenSSL::Digest#finalize</g4></g3>https://cry 浮動小数点数 (Float) + + + Focusing on a group of specs + + + 特定のグループにフォーカスしたspec + + Follow these conventions so your code will be more accessible to other developers. @@ -22688,6 +22932,14 @@ the following arguments can be used: ただ、名前が衝突する可能性も高くなってしまうため、モジュールに関連したメソッド名にしておくことがこのパターンを有効に活用するコツになるでしょう。 + + + For unit tests, it is recommended to follow the conventions for method names: Outer <g1>describe</g1> is the name of the class, inner <g2>describe</g2> targets methods. + + + 単体テストでは、外側の<g1>describe</g1>にクラス名を、内側の<g2>describe</g2>にテスト対象のメソッドを指定するという組み合わせが推奨されます。 + + Forwarding non-captured blocks @@ -22824,6 +23076,14 @@ the following arguments can be used: production-readyに向けて支援をお願いします: + + + Further <g4>describe</g4> sections can be nested within the outer unit to specify smaller units under test (such as individual methods). + + + <g4>describe</g4>セクションはより小さなテスト単位 (個々のメソッドなど)にネストさせることができます。 + + Garbage Collector: to clean up "no longer used" memory. @@ -24166,6 +24426,14 @@ inside the <g3>initialize</g3> method, <g4>finalize</g4> ここで、オプションがマッチしたときに、<g2>parser#on</g2>に渡されたブロックが実行される、というわけです。 + + + If any such thing is marked with <g1>focus: true</g1> then only those examples will run. + + + もし<g1>focus: true</g1>が指定されたブロックがあった場合、指定されたブロックのみが実行されます。 + + If for any reason you can't or don't want to use one of the previous installation methods, you can still download Crystal in a standalone .tar.gz file with everything you need to get started. @@ -24494,6 +24762,14 @@ the value of each named variable is printed on its own line. もし定数が型を示していれば、そのとき得られるのは `TypeNode` となります。 + + + If the expectation is met, code execution continues. + + + もし結果が想定通りであれば、コードの実行を継続します。 + + If the left-hand side contains just one variable, the right-hand side is considered an array: @@ -24550,6 +24826,14 @@ the value of each named variable is printed on its own line. 代入式の右辺に1つしか式が無かった場合、次の例のように各変数に順にインデックスして代入していきます。 + + + If the specified line is the beginning of a <g1>describe</g1> or <g2>context</g2> section, all specs inside that group are run. + + + 指定された行が<g1>describe</g1>や<g2>context</g2>セクションの先頭だった場合は、そのセクション内の全てのspecが実行されます。 + + If there are conditional breaks, the call's return value type will be a union of the type of the block's value and the type of the many <g1>break</g1>s: @@ -25552,6 +25836,14 @@ entrypoints for the docs generator. 簡単に言うと、以下のようにするのが好ましいということです。 + + + In test files, specs are structured by example groups which are defined by <g1>describe</g1> and <g2>context</g2> sections. + + + テストファイル内では、specは<g1>describe</g1>や<g2>context</g2>といったセクションで実行例をグルーピングします。 + + In that block we define all the options. @@ -26145,6 +26437,14 @@ item or map entry. リポジトリの中を見ると、`bin/crystal` というラッパースクリプトが存在することに気づくと思います。 + + + Inspired by <g1>Rspec</g1>http://rspec.info/<e2/>, it includes a domain specific language (DSL) that allows you to write examples in a way similar to plain english. + + + また、<g1>Rspec</g1>http://rspec.info/<e2/>これは、あなたのコードが取るべき挙動示す実行例を記述するための構造を提供するものです。 + + Install @@ -26185,6 +26485,14 @@ item or map entry. インスタンスメソッドとクラスメソッド + + + Instance methods are prefixed with <g3>#</g3>, class methods with <g4>.</g4>. + + + インスタンスメソッドの場合はメソッド名の前に<g3>#</g3>を、クラスメソッドの場合は<g4>.</g4>を付けてください。 + + Instance variables @@ -26525,6 +26833,14 @@ Array(String) インスタンス変数、クラス変数、クロージャに束縛された変数に関してはこの機能は機能しません。 + + + It has a different name, but behaves exactly like <g4>describe</g4>. + + + これは名前が違うだけで、挙動は<g4>describe</g4>と全く変わりません。 + + It has a type @@ -26830,6 +27146,14 @@ installs across computers and systems. ただ1つの値を持ちます。 + + + It provides a structure for writing executable examples of how your code should behave. + + + これは、あなたのコードが取るべき挙動示す実行例を記述するための構造を提供するものです。 + + It returns a union type of the type of the passed expressions: @@ -27696,6 +28020,22 @@ code that is pasted into a program. Manjaro + + + Many projects use a custom <g2>spec helper</g2> which organizes these includes. + + + 多くのプロジェクトでは、 これらのインクルードを取りまとめるカスタムの<g2>spec helper</g2>を使用しています。 + + + + + Many projects use a custom spec helper file, usually named <g1>spec/spec_helper.cr</g1>. + + + 多くのプロジェクトでは、(通常<g1>spec/spec_helper.cr</g1>という名前の)カスタムされたspecヘルパファイルを使用しています。 + + Marking a Crystal struct with this attribute makes it possible to use it in lib declarations: @@ -28180,6 +28520,14 @@ with the `yield` keyword. 複数の引数に対して、複数の自由変数を指定することができます。 + + + Multiple tags can be specified by giving an <g1><g2>Enumerable</g2></g1>https://crystal-lang.org/api/Enumerable.html<e7/>, such as <g3><g4>Array</g4></g3>https://crystal-lang.org/api/Array.html<e8/> or <g5><g6>Set</g6></g5>https://crystal-lang.org/api/Set.html<e9/>. + + + <g3><g4>Array</g4></g3>https://crystal-lang.org/api/Array.html<e8/>や<g5><g6>Set</g6></g5>https://crystal-lang.org/api/Set.html<e9/>といった<g1><g2>Enumerable</g2></g1>https://crystal-lang.org/api/Enumerable.html<e7/>型を使用して、複数のタグを指定することもできます。 + + Multiplicative @@ -28603,6 +28951,14 @@ end up in the resulting string. 最初の2回のsendが実行された際に、他のファイバに処理が切り替わらなかったことに注目してください。 + + + Note that the identity expectation uses <g5>.same?</g5> which tests if <g6><g7>#object_id</g7></g6>https://crystal-lang.org/api/latest/Reference.html#object_id%3AUInt64-instance-method<e10/> are identical. + + + 同一性をテストするExpectationは<g6><g7>#object_id</g7></g6>https://crystal-lang.org/api/latest/Reference.html#object_id%3AUInt64-instance-method<e10/>が同一かどうかをテストする<g5>.same?</g5>メソッドを使用することに注意してください。 + + Note that the name of the method argument is not important; this works as well: @@ -29591,6 +29947,14 @@ offers many implementations, for example for math expressions. その他の形式 + + + Other matchers + + + その他の条件 + + Other rules @@ -29656,6 +30020,14 @@ type of <g3>a</g3>. 指定されていなければ、コンパイラはデフォルト値を利用します。 + + + Otherwise the example has <g4>failed</g4> and other code in this block will not be executed. + + + そうでない場合、その実行例はその時点で<g4>failed</g4>となり、同じブロックに記述されたそれ以降のコードは実行されません。 + + Otherwise, it @@ -30216,6 +30588,14 @@ Earth::RADIUS # => 6_371_000 Rakefile + + + Randomizing order of specs + + + ランダムな順序でのspec実行 + + Range @@ -30777,6 +31157,14 @@ only consist of special characters. <g1><g2>shards install</g2></g1> を実行すると、指定された依存関係の解決とインストールが行なわれます。 + + + Running specs + + + specの実行 + + Running the above code will produce no output and exit immediately. @@ -31584,6 +31972,22 @@ some_method # OK, 1 ファイバを生成してその終了を待つ + + + Spec files must end with <g2>_spec.cr</g2> to be recognizable as such by the compiler command. + + + コンパイラコマンドがそう認識できるように、spec ファイルのファイル名は末尾が<g2>_spec.cr</g2>でなければなりません。 + + + + + Spec helper + + + Specヘルパ + + Special macros exist that are invoked in some situations as hooks, at compile time: @@ -31601,6 +32005,22 @@ some_method # OK, 1 ある状況において実行される特別なマクロがフックとして存在します。それらは、`inherited`、`included` そして `method_missing` です。 + + + Specs run in random order will display a seed value upon completion. + + + ランダムな順番でspecが実行された場合、終了時にseed値が表示されます。 + + + + + Specs, by default, run in the order defined, but can be run in a random order by passing <g1>--order random</g1> to <g2>crystal spec</g2>. + + + <g2>crystal spec</g2>に<g1>--order random</g1>を指定すると、通常は定義された順に実行されるspecを、ランダムな順序で実行可能です。 + + Splat operators can only be used for destructing tuples in method arguments. @@ -31893,6 +32313,30 @@ foo([1, "a"]) # => (Int32 | String) TODO + + + Tagging an example group (<g1>describe</g1> or <g2>context</g2>) extends to all of the contained examples. + + + 実行例のグループ(<g1>describe</g1>や<g2>context</g2>)に対して指定されたタグは、その内側の実行例全てに適用されます。 + + + + + Tagging specs + + + specのタグ付け + + + + + Tags can be used to group specs, allowing to only run a subset of specs when providing a <g1>--tag</g1> argument to the spec runner (see <g2>Using the compiler</g2>). + + + タグはspecをグループ付けするのに使用され、specを実行する際(<g2>Using the compiler</g2>を参照)に<g1>--tag</g1>引数を指定することで、一部のspecのみを実行することができます。 + + Tells the compiler how to link a C library. @@ -31941,6 +32385,14 @@ foo([1, "a"]) # => (Int32 | String) 3項演算子 + + + Test cases that have been defined or outlined but are not yet expected to work can be defined using <g1>pending</g1> instead of <g2>it</g2>. + + + <g2>it</g2>の代わりに<g1>pending</g1>を使用することで、概要だけを記載して実行はしないテストケースを定義することもできます。 + + Testing @@ -31949,6 +32401,14 @@ foo([1, "a"]) # => (Int32 | String) テスト + + + Testing Crystal Code + + + Crystalコードのテスト + + Text blocks, for example to show program output, must be surrounded with triple backticks followed by the "text" keyword. @@ -32592,6 +33052,14 @@ and immediately executes it. Crystal のコンパイラは<g1>まだ</g1>Windowsでは動作しません。 + + + The Crystal compiler has a <g1>spec</g1> command with tools to constrain which examples get run and tailor the output. + + + Crystalコンパイラには<g1>spec</g1>コマンドがあり、どの実行例が実行されるかを指定したり出力を調整したりできるツールが用意されています。 + + The Crystal compiler will by default use <g1>pkg-config</g1> to find the locations of libraries to link with. @@ -33619,6 +34087,14 @@ in a folder structure mirroring the Crystal namespaces. ブロックの中身は「そのまま」文字列のようにコンパイラに渡され、再度検査されます。 + + + The default formatter outputs the file and line style command for failing specs which makes it easy to rerun just this individual spec. + + + デフォルトのフォーマッタは、失敗したspecについて、後でそのsepcだけを再テストしやすいように、ファイル名と行数を含んだ形式のコマンド例を出力します。 + + The default receiver within a captured block can't be changed by using <g1>with ... yield</g1>. @@ -35364,6 +35840,14 @@ server.listen しかし、演算子の構文に関してはいくつか特別な規則があります。 + + + There are methods to create expectations which test for equivalence (<g1>eq</g1>), identity (<g2>be</g2>), type (<g3>be_a</g3>), and nil (<g4>be_nil</g4>). + + + 等価性(<g1>eq</g1>)、同一性(<g2>be</g2>)、型(<g3>be_a</g3>とnil(<g4>be_nil</g4>)をテストするExpectationを生成するためのメソッドが用意されています。 + + There are several ways to avoid heap memory allocations. @@ -35688,6 +36172,14 @@ changed to the nilable variant (<g3>[]?</g3> on the right hand side: これらのフラグは、一般的に C 言語のバインディングにおいて、型や関数を条件に応じて定義するときに利用します。 + + + These matchers run a block and pass if it raises a certain exception. + + + 以下の例は、ブロックの実行時に特定の例外が発生した場合に合格になります。 + + These methods are documented in a ficticious [Macros](http://crystal-lang.org/api/Macros.html) module. @@ -35848,6 +36340,14 @@ changed to the nilable variant (<g3>[]?</g3> on the right hand side: 2つの型は少なくとも比較可能である方が好ましいです。 + + + They return the rescued exception so it can be used for further expectations, for example to verify specific properties of the exception. + + + これらは発生した例外を返すので、その例外の特定のプロパティをチェックするといった別のテストに使用することができます。 + + They should be separated from @@ -35857,6 +36357,14 @@ the other arguments by a double dash (<g2>--</g2>). これらは他の引数とは <g2>--</g2> で区切る必要があります。 + + + They will not be run but show up in the spec report as pending. + + + それらは実行されませんが、spec レポートに pending ととして記載されます。 + + ThirtyTwo = 1 << 5 @@ -36139,6 +36647,14 @@ proven faster than equality). このファイルはプロジェクトの説明と、ビルドに必要な依存関係のリストを含んでいます。 + + + This file is used to require <g1>spec</g1> and other includes like code from the project needed for every spec file. + + + このファイルは<g1>spec</g1>をrequireしたり、プロジェクト内から個々のspecファイルが使用するコードを取り込むのに使用します。 + + This form allows you to specify the return type and to check it against the proc's body. @@ -36227,6 +36743,14 @@ proven faster than equality). それは、以下が許されてしまうということです。 + + + This is also a good place to define global helper methods that make writing specs easier and avoid code duplication. + + + ここは、コードの重複を排除してspecの記述を容易にするために、テスト全体で利用するヘルパメソッドを置くのにも良い場所です。 + + This is because a Reference's memory is allocated on the heap and a pointer to it is passed around. @@ -36445,6 +36969,22 @@ will automatically format all <g2>.cr</g2> files in current director この方法は、繰り返し処理の中でローカル変数の値が変化するような場合には便利な方法です。。 + + + This is only possible for reference types and won't work for value types like structs or numbers. + + + これは参照型でのみ利用可能で、structや数値といった値型に対しては使えません。 + + + + + This is only true if the expected value points to <g8>the same object</g8> instead of <g9>an equivalent one</g9>. + + + このメソッドは、実際の実行結果が想定した値と<g9>等価な値</g9>であるだけでなく、<g8>同じオブジェクト</g8>を指す場合のみ true を返します。 + + This is the documentation for the Crystal programming language. @@ -36831,6 +37371,14 @@ conditions. このスクリプトは、グローバルにインストールされたコンパイラ、もしくは自分でビルドしたコンパイラがあればそれを実行します。 + + + This seed value can be used to rerun the specs in that same order by passing the seed value to <g1>--order</g1>. + + + このシード値を<g1>--order</g1>で指定することで、もう一度同じ順番でspecを実行することができます。 + + This sometimes leads to code that is more natural to read. @@ -37488,6 +38036,14 @@ by joining multiple literals with a backslash: Mac に Crystal をインストールする場合、[Homebrew](http://brew.sh/) の [tap](https://github.com/Homebrew/homebrew/wiki/brew-tap) を用意しているので、それを利用すると簡単です。 + + + To establish certain contexts - think <g1>empty array</g1> versus <g2>array with elements</g2> - the <g3>context</g3> method may be used to communicate this to the reader. + + + <g1>空の配列</g1>と<g2>要素を含む配列</g2>といったコンテキストの違いを読み手に対して明確に伝えるために、<g3>context</g3>メソッドを使用することもできます。 + + To format a single file: @@ -37978,6 +38534,14 @@ by joining multiple literals with a backslash: 値は以下のように利用します。 + + + To use the spec module and DSL, you need to add <g1>require "spec"</g1> to your spec files. + + + spec モジュールやDLSを使用するには、specファイルに<g1>require "spec"</g1>を追加する必要があります。 + + To work with these, first assign them to a variable: @@ -38010,6 +38574,14 @@ by joining multiple literals with a backslash: トラブルシューティング + + + Truthiness + + + 真偽状態 + + Truthy and falsey values @@ -38266,6 +38838,14 @@ by joining multiple literals with a backslash: <g1>return</g1> や <g2>exit</g2>、<g3>raise</g3>、<g4>next</g4>、そして <g5>break</g5> といったキーワードがこの型になります。 + + + Typically a top level <g3>describe</g3> defines the outer unit (such as a class) to be tested by the spec. + + + 通常、トップレベルの<g3>describe</g3>は、そのspecのテスト対象となる外側の単位(クラスなど)を定義します。 + + U I @@ -39504,6 +40084,14 @@ and [Reddit](http://www.reddit.com/r/crystal_programming). どのようにするのが正しい方法でしょうか? + + + When <g1>spec</g1> is included, every object has the instance methods <g2>#should</g2> and <g3>#should_not</g3>. + + + <g1>spec</g1>がインクルードされると、すべてのオブジェクトにインスタンスメソッドとして<g2>#should</g2>と<g3>#should_not</g3>が追加されます。 + + When <g2>__LINE__</g2> is declared as the default value to a method parameter, it represents the line number at the location of the method call. @@ -40457,6 +41045,14 @@ end フラグが定義されているかどうかは <g1>flag?</g1> マクロメソッドを使うことで確認できます。 + + + You can compile and run specs from folder trees, individual files, or specific lines in a file. + + + specはフォルダ全体や、単独のファイル、ファイル内の特定の行といった単位でコンパイルして実行可能です。 + + You can declare/assign multiple variables at the same time by separating expressions with a comma (<g1>,</g1>): @@ -40840,6 +41436,14 @@ https://github.com/crystal-lang/crystal-book キッチンで料理をしているところを考えてみましょう。あなたは玉ねぎをきざんでフライパンに放り込み、それが炒め上がるまでの間にトマトを切ったりできます。しかし、すべての動作を同時に行うのではなく、それぞれのタスクにあなたの時間を割り振って処理することでしょう。 + + + You can turn off colors with the switch <g1>--no-color</g1>. + + + <g1>--no-color</g1>スイッチを指定すると、出力の色分けを停止できます。 + + You can use <g1>break</g1> to break out of a <g2>while</g2> loop: @@ -50921,6 +51525,56 @@ end ``` + + + actual.should be < expected # passes if actual < expected +actual.should be <= expected # passes if actual <= expected +actual.should be > expected # passes if actual > expected +actual.should be >= expected # passes if actual >= expected + + + actual.should be < expected # actual < expected であれば合格 +actual.should be <= expected # actual <= expected であれば合格 +actual.should be > expected # actual > expected であれば合格 +actual.should be >= expected # actual >= expected であれば合格 + + + + + actual.should be_close(expected, delta) # passes if actual is within delta of expected: + + + actual.should be_close(expected, delta) # actualがexpectedからdelta以内であれば合格 + + + + + actual.should be_true # passes if actual == true +actual.should be_false # passes if actual == false +actual.should be_truthy # passes if actual is truthy (neither nil nor false nor Pointer.null) +actual.should be_falsey # passes if actual is falsey (nil, false or Pointer.null) + + + actual.should be_true # actual == true であれば合格 +actual.should be_false # actual == false であれば合格 +actual.should be_truthy # actualがtruthy(nilでもfalseでもPointer.nullでもない)であれば合格 +actual.should be_falsey # actualがfalsey (nilかfalse、もしくはPointer.null)であれば合格 + + + + + actual.should eq(expected) # passes if actual == expected +actual.should be(expected) # passes if actual.same?(expected) +actual.should be_a(expected) # passes if actual.is_a?(expected) +actual.should be_nil # passes if actual.nil? + + + actual.should eq(expected) # actual == expected であれば合格 +actual.should be(expected) # actual.same?(expected) であれば合格 +actual.should be_a(expected) # actual.is_a?(expected) であれば合格 +actual.should be_nil # actual.nil? であれば合格 + + add 1, 2 # same as add(1, 2) diff --git a/locale/en/crystal-website b/locale/en/crystal-website index df33c50b..fd4148e1 160000 --- a/locale/en/crystal-website +++ b/locale/en/crystal-website @@ -1 +1 @@ -Subproject commit df33c50b16d1a10fd0a73cd1b6a3f85bd04e3d91 +Subproject commit fd4148e17a081ec15ed351ae53d8ab8a4a34c315 diff --git a/locale/ja/crystal-book/guides/testing.md b/locale/ja/crystal-book/guides/testing.md index 8864046d..73c3b620 100644 --- a/locale/ja/crystal-book/guides/testing.md +++ b/locale/ja/crystal-book/guides/testing.md @@ -1,10 +1,10 @@ -# Testing Crystal Code +# Crystalコードのテスト -Crystal comes with a fully-featured spec library in the [`Spec` module](https://crystal-lang.org/api/latest/Spec.html). It provides a structure for writing executable examples of how your code should behave. +Crystalには、[`Spec`モジュール](https://crystal-lang.org/api/latest/Spec.html)内に、フル機能の spec ライブラリが用意されています。これは、あなたのコードが取るべき挙動示す実行例を記述するための構造を提供するものです。 -Inspired by [Rspec](http://rspec.info/), it includes a domain specific language (DSL) that allows you to write examples in a way similar to plain english. +また、[Rspec](http://rspec.info/)これは、あなたのコードが取るべき挙動示す実行例を記述するための構造を提供するものです。 -A basic spec looks something like this: +基本的な spec はこのようになります。 ```crystal require "spec" @@ -28,94 +28,96 @@ describe Array do end ``` -## Anatomy of a spec file +## specファイルの構造 -To use the spec module and DSL, you need to add `require "spec"` to your spec files. Many projects use a custom [spec helper](#spec-helper) which organizes these includes. +spec モジュールやDLSを使用するには、specファイルに`require "spec"`を追加する必要があります。多くのプロジェクトでは、 これらのインクルードを取りまとめるカスタムの[spec helper](#spec-helper)を使用しています。 -Concrete test cases are defined in `it` blocks. An optional (but strongly recommended) descriptive string states it's purpose and a block contains the main logic performing the test. +具体的なテストケースは`it`ブロック内に記述します。ここには、そのテストの意図を説明する文字列(オプションですが、強く推奨)とともに、テストが実行するロジックを納めたブロックが与えられます。 -Test cases that have been defined or outlined but are not yet expected to work can be defined using `pending` instead of `it`. They will not be run but show up in the spec report as pending. +`it`の代わりに`pending`を使用することで、概要だけを記載して実行はしないテストケースを定義することもできます。それらは実行されませんが、spec レポートに pending ととして記載されます。 -An `it` block contains an example that should invoke the code to be tested and define what is expected of it. Each example can contain multiple expectations, but it should test only one specific behaviour. +`it`ブロックには、テスト対象となるコードの実行例と、その結果がどうなるべきかの定義を記述します。個々の実行例に複数の式を含めることも可能ですが、そこでは特定の挙動1つに対するテストのみを行うべきです。 -When `spec` is included, every object has the instance methods `#should` and `#should_not`. These methods are invoked on the value being tested with an expectation as argument. If the expectation is met, code execution continues. Otherwise the example has *failed* and other code in this block will not be executed. +`spec`がインクルードされると、すべてのオブジェクトにインスタンスメソッドとして`#should`と`#should_not`が追加されます。These methods are invoked on the value being tested with an expectation as argument. もし結果が想定通りであれば、コードの実行を継続します。そうでない場合、その実行例はその時点で*failed*となり、同じブロックに記述されたそれ以降のコードは実行されません。 -In test files, specs are structured by example groups which are defined by `describe` and `context` sections. Typically a top level `describe` defines the outer unit (such as a class) to be tested by the spec. Further `describe` sections can be nested within the outer unit to specify smaller units under test (such as individual methods). +テストファイル内では、specは`describe`や`context`といったセクションで実行例をグルーピングします。通常、トップレベルの`describe`は、そのspecのテスト対象となる外側の単位(クラスなど)を定義します。`describe`セクションはより小さなテスト単位 (個々のメソッドなど)にネストさせることができます。 -For unit tests, it is recommended to follow the conventions for method names: Outer `describe` is the name of the class, inner `describe` targets methods. Instance methods are prefixed with `#`, class methods with `.`. +単体テストでは、外側の`describe`にクラス名を、内側の`describe`にテスト対象のメソッドを指定するという組み合わせが推奨されます。インスタンスメソッドの場合はメソッド名の前に`#`を、クラスメソッドの場合は`.`を付けてください。 -To establish certain contexts - think *empty array* versus *array with elements* - the `context` method may be used to communicate this to the reader. It has a different name, but behaves exactly like `describe`. +*空の配列*と*要素を含む配列*といったコンテキストの違いを読み手に対して明確に伝えるために、`context`メソッドを使用することもできます。これは名前が違うだけで、挙動は`describe`と全く変わりません。 -`describe` and `context` take a description as argument (which should usually be a string) and a block containing the individual specs or nested groupings. +`describe`や`context`は引数に概要(通常は文字列)をとり、個々のspecやネストしたグループを含むブロックを与えます。 -## Expectations +## Expectations(想定される挙動) -Expectations define if the value being tested (*actual*) matches a certain value or specific criteria. +Expactationは、テスト対象の(*actual*)値がとるべき特定の値や、満たすべき一定の基準を定義します。 -### Equivalence, Identity and Type -There are methods to create expectations which test for equivalence (`eq`), identity (`be`), type (`be_a`), and nil (`be_nil`). -Note that the identity expectation uses `.same?` which tests if [`#object_id`](https://crystal-lang.org/api/latest/Reference.html#object_id%3AUInt64-instance-method) are identical. This is only true if the expected value points to *the same object* instead of *an equivalent one*. This is only possible for reference types and won't work for value types like structs or numbers. + +### 等価性、同一性、型 + +等価性(`eq`)、同一性(`be`)、型(`be_a`とnil(`be_nil`)をテストするExpectationを生成するためのメソッドが用意されています。 +同一性をテストするExpectationは[`#object_id`](https://crystal-lang.org/api/latest/Reference.html#object_id%3AUInt64-instance-method)が同一かどうかをテストする`.same?`メソッドを使用することに注意してください。このメソッドは、実際の実行結果が想定した値と*等価な値*であるだけでなく、*同じオブジェクト*を指す場合のみ true を返します。これは参照型でのみ利用可能で、structや数値といった値型に対しては使えません。 ```crystal -actual.should eq(expected) # passes if actual == expected -actual.should be(expected) # passes if actual.same?(expected) -actual.should be_a(expected) # passes if actual.is_a?(expected) -actual.should be_nil # passes if actual.nil? +actual.should eq(expected) # actual == expected であれば合格 +actual.should be(expected) # actual.same?(expected) であれば合格 +actual.should be_a(expected) # actual.is_a?(expected) であれば合格 +actual.should be_nil # actual.nil? であれば合格 ``` -### Truthiness +### 真偽状態 ```crystal -actual.should be_true # passes if actual == true -actual.should be_false # passes if actual == false -actual.should be_truthy # passes if actual is truthy (neither nil nor false nor Pointer.null) -actual.should be_falsey # passes if actual is falsey (nil, false or Pointer.null) +actual.should be_true # actual == true であれば合格 +actual.should be_false # actual == false であれば合格 +actual.should be_truthy # actualがtruthy(nilでもfalseでもPointer.nullでもない)であれば合格 +actual.should be_falsey # actualがfalsey (nilかfalse、もしくはPointer.null)であれば合格 ``` -### Comparisons +### 比較 ```crystal -actual.should be < expected # passes if actual < expected -actual.should be <= expected # passes if actual <= expected -actual.should be > expected # passes if actual > expected -actual.should be >= expected # passes if actual >= expected +actual.should be < expected # actual < expected であれば合格 +actual.should be <= expected # actual <= expected であれば合格 +actual.should be > expected # actual > expected であれば合格 +actual.should be >= expected # actual >= expected であれば合格 ``` -### Other matchers +### その他の条件 ```crystal -actual.should be_close(expected, delta) # passes if actual is within delta of expected: +actual.should be_close(expected, delta) # actualがexpectedからdelta以内であれば合格 # (actual - expected).abs <= delta -actual.should contain(expected) # passes if actual.includes?(expected) -actual.should match(expected) # passes if actual =~ expected +actual.should contain(expected) # actual.includes?(expected) が真であれば合格 +actual.should match(expected) # actual =~ expectedが真であれば合格 ``` -### Expecting errors +### エラーを想定する -These matchers run a block and pass if it raises a certain exception. +以下の例は、ブロックの実行時に特定の例外が発生した場合に合格になります。 ```crystal expect_raises(MyError) do - # Passes if this block raises an exception of type MyError. + # ブロック内でMyError型の例外が発生すれば合格 end expect_raises(MyError, "error message") do - # Passes if this block raises an exception of type MyError - # and the error message contains "error message". + # ブロック内でMyError型の例外が発生し、 + # かつそのエラ〜メッセージが"error message"を含んでいれば合格 end expect_raises(MyError, /error \w{7}/) do - # Passes if this block raises an exception of type MyError - # and the error message matches the regular expression. + # ブロック内でMyError型の例外が発生し、 + # かつそのエラーメッセージが正規表現にマッチすれば合格 end ``` -They return the rescued exception so it can be used for further expectations, for example to verify specific properties of the exception. +これらは発生した例外を返すので、その例外の特定のプロパティをチェックするといった別のテストに使用することができます。 -## Focusing on a group of specs +## 特定のグループにフォーカスしたspec -`describe`, `context` and `it` blocks can be marked with `focus: true`, like this: +`describe`や`context`、`it`ブロックには、以下のように`focus: true`を指定できます。 ```crystal it "adds", focus: true do @@ -123,13 +125,13 @@ it "adds", focus: true do end ``` -If any such thing is marked with `focus: true` then only those examples will run. +もし`focus: true`が指定されたブロックがあった場合、指定されたブロックのみが実行されます。 -## Tagging specs +## specのタグ付け -Tags can be used to group specs, allowing to only run a subset of specs when providing a `--tag` argument to the spec runner (see [Using the compiler](../using_the_compiler/README.md)). +タグはspecをグループ付けするのに使用され、specを実行する際([Using the compiler](../using_the_compiler/README.md)を参照)に`--tag`引数を指定することで、一部のspecのみを実行することができます。 -`describe`, `context` and `it` blocks can be tagged, like this: +`describe`や`context`、`it`ブロックには以下のようにしてタグを付けることが可能です ```crystal it "is slow", tags: "slow" do @@ -142,58 +144,58 @@ it "is fast", tags: "fast" do end ``` -Tagging an example group (`describe` or `context`) extends to all of the contained examples. +実行例のグループ(`describe`や`context`)に対して指定されたタグは、その内側の実行例全てに適用されます。 -Multiple tags can be specified by giving an [`Enumerable`](https://crystal-lang.org/api/Enumerable.html), such as [`Array`](https://crystal-lang.org/api/Array.html) or [`Set`](https://crystal-lang.org/api/Set.html). +[`Array`](https://crystal-lang.org/api/Array.html)や[`Set`](https://crystal-lang.org/api/Set.html)といった[`Enumerable`](https://crystal-lang.org/api/Enumerable.html)型を使用して、複数のタグを指定することもできます。 -## Running specs +## specの実行 -The Crystal compiler has a `spec` command with tools to constrain which examples get run and tailor the output. All specs of a project are compiled and executed through the command `crystal spec`. +Crystalコンパイラには`spec`コマンドがあり、どの実行例が実行されるかを指定したり出力を調整したりできるツールが用意されています。`crystal spec`コマンドによって、プロジェクト内の全てのspecがコンパイル後に実行されます。 -By convention, specs live in the `spec/` directory of a project. Spec files must end with `_spec.cr` to be recognizable as such by the compiler command. +慣例的に、specはプロジェクト内の`spec/`ディレクトリに置かれます。コンパイラコマンドがそう認識できるように、spec ファイルのファイル名は末尾が`_spec.cr`でなければなりません。 -You can compile and run specs from folder trees, individual files, or specific lines in a file. If the specified line is the beginning of a `describe` or `context` section, all specs inside that group are run. +specはフォルダ全体や、単独のファイル、ファイル内の特定の行といった単位でコンパイルして実行可能です。指定された行が`describe`や`context`セクションの先頭だった場合は、そのセクション内の全てのspecが実行されます。 -The default formatter outputs the file and line style command for failing specs which makes it easy to rerun just this individual spec. +デフォルトのフォーマッタは、失敗したspecについて、後でそのsepcだけを再テストしやすいように、ファイル名と行数を含んだ形式のコマンド例を出力します。 -You can turn off colors with the switch `--no-color`. +`--no-color`スイッチを指定すると、出力の色分けを停止できます。 -### Randomizing order of specs +### ランダムな順序でのspec実行 -Specs, by default, run in the order defined, but can be run in a random order by passing `--order random` to `crystal spec`. +`crystal spec`に`--order random`を指定すると、通常は定義された順に実行されるspecを、ランダムな順序で実行可能です。 -Specs run in random order will display a seed value upon completion. This seed value can be used to rerun the specs in that same order by passing the seed value to `--order`. +ランダムな順番でspecが実行された場合、終了時にseed値が表示されます。このシード値を`--order`で指定することで、もう一度同じ順番でspecを実行することができます。 -### Examples +### 例 ```bash -# Run all specs in files matching spec/**/*_spec.cr +# ファイル名が spec/**/*_spec.cr にマッチするファイル内の全specを実行 crystal spec -# Run all specs in files matching spec/**/*_spec.cr without colors +# ファイル名が spec/**/*_spec.cr にマッチするファイル内の全specを実行(出力を色分けしない) crystal spec --no-color -# Run all specs in files matching spec/my/test/**/*_spec.cr +# ファイル名が spec/my/test/**/*_spec.cr にマッチするファイル内の全specを実行 crystal spec spec/my/test/ -# Run all specs in spec/my/test/file_spec.cr +# 特定のファイル spec/my/test/file_spec.cr 内の全specを実行 crystal spec spec/my/test/file_spec.cr -# Run the spec or group defined in line 14 of spec/my/test/file_spec.cr +# 特定のファイル spec/my/test/file_spec.cr の14行目で定義されたspecや、グループ内のspecを実行 crystal spec spec/my/test/file_spec.cr:14 -# Run all specs tagged with "fast" +# "fast" タグが付けられたspecを全て実行 crystal spec --tag 'fast' -# Run all specs not tagged with "slow" +# "slow" タグが付いていないspecを全て実行 crystal spec --tag '~slow' ``` -## Spec helper +## Specヘルパ -Many projects use a custom spec helper file, usually named `spec/spec_helper.cr`. +多くのプロジェクトでは、(通常`spec/spec_helper.cr`という名前の)カスタムされたspecヘルパファイルを使用しています。 -This file is used to require `spec` and other includes like code from the project needed for every spec file. This is also a good place to define global helper methods that make writing specs easier and avoid code duplication. +このファイルは`spec`をrequireしたり、プロジェクト内から個々のspecファイルが使用するコードを取り込むのに使用します。ここは、コードの重複を排除してspecの記述を容易にするために、テスト全体で利用するヘルパメソッドを置くのにも良い場所です。 ```crystal # spec/spec_helper.cr diff --git a/locale/ja/crystal-book/overview/cli.md b/locale/ja/crystal-book/overview/cli.md new file mode 100644 index 00000000..6b649008 --- /dev/null +++ b/locale/ja/crystal-book/overview/cli.md @@ -0,0 +1,390 @@ +# CLI アプリケーション + +コマンドラインインターフェースアプリケーション (CLI アプリケーション) の開発は、プログラマのタスクの中で最も愉快なものの1つです。それでは、Crystal での最初の CLI の開発を楽しみましょう。 + +CLI アプリケーションの開発には、主なトピックが2つあります。 + +* [入力](#input) +* [出力](#output) + +## 入力 + +このトピックでは、次の話題に関連することを扱っていきます。 + +* [アプリケーションに渡されたオプションの処理](#options) +* [ユーザーの入力の要求](#request-for-user-input) + +### オプション + +アプリケーションにオプションを渡すことはとても一般的です。例えば`crystal -v`を実行すると、Crystal は次のように表示します。 + +```shell-session +$ crystal -v +Crystal 0.31.1 (2019-10-02) + +LLVM: 8.0.1 +Default target: x86_64-apple-macosx +``` + +そして`crystal -h`と実行すると、Crystal は自身のオプションとそれらの利用方法を表示します。 + +ここで「**オプションの解析部分を実装する必要がある?**」と疑問を持つことでしょう。その必要はありません。Crystal では`OptionParser`がその機能を提供しています。それではこのパーサーを使ったアプリケーションを作ってみましょう。 + +CLI アプリケーションの開発を始めるにあたって、まず次のオプションを持っていることにします。 + +* `-v` / `--version`: アプリケーションのバージョンを表示する。 +* `-h` / `--help`: アプリケーションの利用方法を表示する。 + +```crystal +# file: help.cr +require "option_parser" + +OptionParser.parse do |parser| + parser.banner = "Welcome to The Beatles App!" + + parser.on "-v", "--version", "Show version" do + puts "version 1.0" + exit + end + parser.on "-h", "--help", "Show help" do + puts parser + exit + end +end +``` + +さて、これがどうやって動作するというのでしょうか? それは……魔法のように! いえいえ、実のところ魔法ではないのです。実装が簡単になったのは Crystal のおかげです。 +プログラムが開始すると、まず`OptionParser#parse`に渡されたブロックが実行されます。このブロックですべてのオプションを定義しています。ブロックが実行されたのち、オプションパーサーがアプリケーションに渡された引数を処理して、定義したオプションにマッチするかを確認します。ここで、オプションがマッチしたときに、`parser#on`に渡されたブロックが実行される、というわけです。 + +`OptionParser` のすべてを[公式の API ドキュメント](https://crystal-lang.org/api/latest/OptionParser.html)によって確認できます。そして、そこから1クリックでソースコードを見ることができます。……これが魔法ではないということの証明です。 + +さて、それではアプリケーションを実際に実行してみましょう。We have two ways [using the compiler](https://crystal-lang.org/reference/using_the_compiler): + +1. [Build the application](https://crystal-lang.org/reference/using_the_compiler/#crystal-build) and then run it. +2. Compile and [run the application](https://crystal-lang.org/reference/using_the_compiler/#crystal-run), all in one command. + +今回は2番目の方法でいきたいと思います。 + +```shell-session +$ crystal ./help.cr -- -h + +Welcome to The Beatles App! + -v, --version Show version + -h, --help Show help +``` + +続けて、デフォルトでは (オプションが与えられなかったときに) The Fab Four のメンバーの名前を表示する、という機能を持った、_ファビュラスな_アプリケーションを作ります。しかし、`-t`もしくは`--twist`というオプションが与えられたときは、名前を大文字にすることにします。 + +```crystal +# file: twist_and_shout.cr +require "option_parser" + +the_beatles = [ + "John Lennon", + "Paul McCartney", + "George Harrison", + "Ringo Starr" +] +shout = false + +option_parser = OptionParser.parse do |parser| + parser.banner = "Welcome to The Beatles App!" + + parser.on "-v", "--version", "Show version" do + puts "version 1.0" + exit + end + parser.on "-h", "--help", "Show help" do + puts parser + exit + end + parser.on "-t", "--twist", "Twist and SHOUT" do + shout = true + end +end + +members = the_beatles +members = the_beatles.map &.upcase if shout + +puts "" +puts "Group members:" +puts "==============" +members.each do |member| + puts member +end +``` + +`-t`をつけてこのアプリケーションを実行すると、次のように表示されるでしょう。 + +```shell-session +$ crystal run ./twist_and_shout.cr -- -t + +Group members: +============== +JOHN LENNON +PAUL MCCARTNEY +GEORGE HARRISON +RINGO STARR +``` + +#### オプションのパラメーター + +次はこんなアプリケーションを作ってみましょう。_`-g` / `--goodbye_hello`オプションが与えられたときに、**オプションのパラメーター**として渡された名前に挨拶をする_。 + +```crystal +# file: hello_goodbye.cr +require "option_parser" + +the_beatles = [ + "John Lennon", + "Paul McCartney", + "George Harrison", + "Ringo Starr" +] +say_hi_to = "" + +option_parser = OptionParser.parse do |parser| + parser.banner = "Welcome to The Beatles App!" + + parser.on "-v", "--version", "Show version" do + puts "version 1.0" + exit + end + parser.on "-h", "--help", "Show help" do + puts parser + exit + end + parser.on "-g NAME", "--goodbye_hello=NAME", "Say hello to whoever you want" do |name| + say_hi_to = name + end +end + +unless say_hi_to.empty? + puts "" + puts "You say goodbye, and #{the_beatles.sample} says hello to #{say_hi_to}!" +end +``` + +この場合、ブロックにはオプションに与えられたパラメーターの値が渡されます。 + +試してみましょう。 + +```shell-session +$ crystal ./hello_goodbye.cr -- -g "Penny Lane" + +You say goodbye, and Ringo Starr say hello to Penny Lane! +``` + +いい感じですね。アプリケーションが段々といい感じになってきました。ですが、**渡されたオプションを宣言していなかった場合、どうなるのでしょうか?** 例えば -n を渡してみましょう。 + +```shell-session +$ crystal ./hello_goodbye.cr -- -n +Unhandled exception: Invalid option: -n (OptionParser::InvalidOption) + from ... +``` + +なんてことでしょう。これは壊れていますね。**無効なオプション**と**無効なパラメーター**が渡されたときの処理をする必要するがあります。2つの状況に応じて、`OptionParser`クラスは`#invalid_option`と`#missing_option`という2つメソッドを持っています。 + +それでは、これらのオプションハンドラーを追加して、さらにこれまでに作った2つのCLI アプリケーションをまとめて、1つのファビュラスな CLI アプリケーションにしましょう。 + +#### All My CLI: 完成した CLI アプリケーション + +これが、無効なオプション/パラメーターの処理を追加して、新しいオプションを追加した、最終的なソースコードです。 + +```crystal +# file: all_my_cli.cr +require "option_parser" + +the_beatles = [ + "John Lennon", + "Paul McCartney", + "George Harrison", + "Ringo Starr" +] +shout = false +say_hi_to = "" +strawberry = false + +option_parser = OptionParser.parse do |parser| + parser.banner = "Welcome to The Beatles App!" + + parser.on "-v", "--version", "Show version" do + puts "version 1.0" + exit + end + parser.on "-h", "--help", "Show help" do + puts parser + exit + end + parser.on "-t", "--twist", "Twist and SHOUT" do + shout = true + end + parser.on "-g NAME", "--goodbye_hello=NAME", "Say hello to whoever you want" do |name| + say_hi_to = name + end + parser.on "-r", "--random_goodbye_hello", "Say hello to one random member" do + say_hi_to = the_beatles.sample + end + parser.on "-s", "--strawberry", "Strawberry fields forever mode ON" do + strawberry = true + end + parser.missing_option do |option_flag| + STDERR.puts "ERROR: #{option_flag} is missing something." + STDERR.puts "" + STDERR.puts parser + exit(1) + end + parser.invalid_option do |option_flag| + STDERR.puts "ERROR: #{option_flag} is not a valid option." + STDERR.puts parser + exit(1) + end +end + +members = the_beatles +members = the_beatles.map &.upcase if shout + +puts "Strawberry fields forever mode ON" if strawberry + +puts "" +puts "Group members:" +puts "==============" +members.each do |member| + puts "#{strawberry ?"🍓" : "-"} #{member}" +end + +unless say_hi_to.empty? + puts "" + puts "You say goodbye, and I say hello to #{say_hi_to}!" +end +``` + +### ユーザーへの入力の要求 + +しばしばユーザーに値を入力してもらいたい場合があります。どのようにして値を_読む_のでしょうか?  +簡単です!The Fab Four が望むフレーズを唄ってくれる、というアプリケーションを作ってみましょう。このアプリケーションを実行すると、ユーザーにフレーズを要求して、そして魔法が起こります! + +```crystal +# file: let_it_cli.cr +puts "Welcome to The Beatles Sing Along version 1.0!" +puts "Enter a phrase you want The Beatles to sing" +print "> " +user_input = gets +puts "The Beatles are singing: 🎵#{user_input}🎶🎸🥁" +``` + +The method [`gets`](https://crystal-lang.org/api/latest/toplevel.html#gets%28*args,**options%29-class-method) will **pause** the execution of the application, until the user finishes entering the input (pressing the `Enter` key). +ユーザーが`Enter`を押すと、実行が再開して`user_input`にユーザーの入力した値が入ります。 + +しかし、ここでユーザーが何も入力しなかったらどうなるのでしょう? この場合は、空文字列 (ユーザーが `Enter`を押した場合) もしくは `Nil` 値 (`Ctrl+D`によって入力ストリームを閉じた場合) が返ります。 +これがどういう問題なのか説明するために、入力された値を叫ばせて (大文字にして表示して) みましょう。 + +```crystal +# file: let_it_cli.cr +puts "Welcome to The Beatles Sing Along version 1.0!" +puts "Enter a phrase you want The Beatles to sing" +print "> " +user_input = gets +puts "The Beatles are singing: 🎵#{user_input.upcase}🎶🎸🥁" +``` + +これを実行しようとしてみると、 Crystal はこんな風にしてコンパイルに失敗するでしょう。 + +```shell-session +$ crystal ./let_it_cli.cr +Showing last frame. Use --error-trace for full trace. + +In let_it_cli.cr:5:46 + + 5 | puts "The Beatles are singing: 🎵#{user_input.upper_case} + ^--------- +Error: undefined method 'upper_case' for Nil (compile-time type is (String | Nil)) +``` + +つまり、こういうことです。We should have known better: the type of the user input is the [union type](https://crystal-lang.org/reference/syntax_and_semantics/type_grammar.html) `String | Nil`. +というわけで、`Nil`もしくは`""` (空文字列) かをチェックして、自然に動作するようにしましょう。 + +```crystal + # file: let_it_cli.cr +puts "Welcome to The Beatles Sing Along version 1.0!" +puts "Enter a phrase you want The Beatles to sing" +print "> " +user_input = gets + +exit if user_input.nil?# Ctrl+D + +default_lyrics = "Na, na, na, na-na-na na" \ + " / " \ + "Na-na-na na, hey Jude" + +lyrics = user_input.presence || default_lyrics + +puts "The Beatles are singing: 🎵#{lyrics.upcase}🎶🎸🥁" +``` + +## 出力 + +ここからは、アプリケーションの出力という、2つ目のトピックに取りかかっていきます。 +はじめに、アプリケーションは現時点でも情報を表示してはいるけど、そこまで良い表示だとは言えません。. せっかくなので出力を_色付け_してみましょう。 + +これを達成するために [`Colorize`](https://crystal-lang.org/api/latest/Colorize.html) モジュールを使いたいと思います。 + +色付いた文字列を表示する、単純なアプリケーションを作ってみましょう。黒い背景に黄色の文字で表示します。 + +```crystal +# file: yellow_cli.cr +require "colorize" + +puts "#{"The Beatles".colorize(:yellow).on(:black)} App" +``` + +いい感じですね。簡単でしょう。イマジン (想像) してみてください、All My CLI アプリケーションのバナーにこの文字列を使うことを。ほら、簡単でしょう? (it's easy if you try?) + +```crystal + parser.banner = "#{"The Beatles".colorize(:yellow).on(:black)} App" +``` + +ユーザーの入力を受け取る方のアプリケーションに、今回は`blink` (点滅)という*テキストの装飾*を追加してみましょう。 + +```crystal +# file: let_it_cli.cr +require "colorize" + +puts "Welcome to The Beatles Sing Along version 1.0!" +puts "Enter a phrase you want The Beatles to sing" +print "> " +user_input = gets + +exit if user_input.nil?# Ctrl+D + +default_lyrics = "Na, na, na, na-na-na na" \ + " / " \ + "Na-na-na na, hey Jude" + +lyrics = user_input.presence || default_lyrics + +puts "The Beatles are singing: #{"🎵#{user_input}🎶🎸🥁".colorize.mode(:blink)}" +``` + +生まれ変わったアプリケーションを試してみてください……そして、違いを_聴き取って_ください。 +**今**、私たちは2つのファビュラスなアプリケーションを実装したのです。 + +**利用できる色**や**テキストの装飾**の一覧は [API ドキュメント](https://crystal-lang.org/api/latest/Colorize.html)で確認できます。 + +## テスト + +As with any other application, at some point we would like to [write tests](https://crystal-lang.org/reference/guides/testing.html) for the different features. + +現時点ではアプリケーションの各ロジックは`OptionParser`の内で実行されています。つまり、アプリケーション全体を実行することなしに、部分的にファイルを取り込むことができないのです。よって、まずはじめにオプションの解析部分と実際のロジックを分離するリファクタリングを行う必要があります。このリファクタリングが済めば、あるロジックのテストに必要なコードを含むファイルだけをテストのコードに取り込んで、ロジックのテストをはじめることができるでしょう。これを読者の課題とします。. + +## `Readline`と`NCurses`の利用 + +よりリッチなCLI アプリケーションを構築しようと思ったとき、これらのライブラリが助けになります。`Readline`と`NCurses`という、2つのよく知られたライブラリです。 + +[GNU Readline Library](http://www.gnu.org/software/readline/) で述べられているように、`Readline` はユーザーに対してコマンドライン編集機能を提供します。 +`Readline`は、ファイル名補完などの自動補完、キーバインディングのカスタマイズなど、様々な機能を持っています。それらの機能を使いたいのであれば [crystal-lang/crystal-readline](https://github.com/crystal-lang/crystal-readline) shard が `Readline` を簡単に扱うための API を提供しています。 + +続いて、`NCurses`(New Curses) の紹介です。このライブラリは端末で_グラフィカルな_ユーザーインターフェースを開発することを可能にします。その名前が暗に示すように、これは`Curses`というライブラリの改良版です。`Curses` は Rouge というテキストベースのダンジョン探索アドベンチャーゲームのために開発されました。 +`NCurses` を Crystal から扱える [shaeds は2つ](https://crystalshards.org/?filter=ncurses)ほど存在しています。 + +これでこの文章はおしまいです 😎🎶 diff --git a/locale/ja/crystal-book/overview/hello_world.md b/locale/ja/crystal-book/overview/hello_world.md new file mode 100644 index 00000000..f1e53f59 --- /dev/null +++ b/locale/ja/crystal-book/overview/hello_world.md @@ -0,0 +1,9 @@ +# Hello World! + +伝統的な「hello world」プログラムを Crystal で書くと次のようになります。 + +```crystal +puts "Hello world!" +``` + +このプログラムを見ればわかる通り、Crystal ではプログラム自体がメインルーチンとなります。つまり、「main」関数やそれに値するものを定義する必要はありません。 diff --git a/locale/ja/crystal-book/overview/http_server.md b/locale/ja/crystal-book/overview/http_server.md new file mode 100644 index 00000000..f05b51ff --- /dev/null +++ b/locale/ja/crystal-book/overview/http_server.md @@ -0,0 +1,64 @@ +# HTTP Server + +もう少し興味深いプログラムを見てみましょう。こちらは HTTP サーバーの例になります。 + +```crystal +require "http/server" + +server = HTTP::Server.new do |context| + context.response.content_type = "text/plain" + context.response.print "Hello world!The time is #{Time.local}" +end + +address = server.bind_tcp 8080 +puts "Listening on http://#{address}" +server.listen +``` + +上記のコードをすべて理解するためにはこの言語リファレンス全体を読む必要がありますが、ここでいくつかの点について説明しておきます。 + +* [require](../syntax_and_semantics/requiring_files.html)で、他のファイルで定義されたコードを読み込むことができます + +```crystal +require "http/server" +``` + +* 型を指定することなく[ローカル変数](../syntax_and_semantics/local_variables.html)を定義することができます + +```crystal +server = HTTP::Server.new ... +``` + +* HTTP サーバーのポート番号は HTTP::Server オブジェクトの bind_tcp メソッドによってセットされます (ポート番号を 8080 にセット) + +```crystal +address = server.bind_tcp 8080 +``` + +* オブジェクトに対して[メソッド](../syntax_and_semantics/classes_and_methods.html)を実行 (またはメッセージを送信) することでプログラムを構築します + +```crystal +HTTP::Server.new ... +... +Time.local +... +address = server.bind_tcp 8080 +... +puts "Listening on http://#{address}" +... +server.listen +``` + +* [ブロック](../syntax_and_semantics/blocks_and_procs.html)を使うと簡単にコードを再利用することができ、また、関数型の世界にあるいくつかの機能を利用することが可能になります + +```crystal +HTTP::Server.new do |context| + ... +end +``` + +* 文字列埋め込み (string interpolation) を使うと、簡単に文字列に式を埋め込むことができます。Crystalはその他にも多くの[シンタックス](../syntax_and_semantics/literals.html)があります。例えば配列やハッシュ、そして範囲やタプルなどです + +```crystal +"Hello world!The time is #{Time.local}" +``` diff --git a/locale/ja/crystal-website/_assets/css/_generic.scss b/locale/ja/crystal-website/_assets/css/_generic.scss index c1f762a9..ac3a8167 100644 --- a/locale/ja/crystal-website/_assets/css/_generic.scss +++ b/locale/ja/crystal-website/_assets/css/_generic.scss @@ -71,17 +71,6 @@ p > a, td > a, ul:not(#nav-mobile) li > a, dd > a { border-bottom: 1px solid $primary-text; } -p:not(.read-more) { - & > a:not(.gray-link):not(.btn):not(.with-icon) { - color: #03A9F4; - border-bottom: 0; - &:hover { - color: #03A9F4; - border-bottom: 1px solid #03A9F4; - } - } -} - p.no-underline > a, table.no-underline a { border-bottom: 0; @@ -190,7 +179,7 @@ table.no-underline a { width: 85%; } } - + @media only screen and (min-width: 993px) { #content { width: 70%; diff --git a/locale/ja/crystal-website/_assets/css/_home.scss b/locale/ja/crystal-website/_assets/css/_home.scss index 3642b9f2..9c7330db 100644 --- a/locale/ja/crystal-website/_assets/css/_home.scss +++ b/locale/ja/crystal-website/_assets/css/_home.scss @@ -220,13 +220,8 @@ } } -.contributing-link { - color: #03A9F4; - border-bottom: 0; - &:hover { - color: #03A9F4; - border-bottom: 1px solid #03A9F4; - } +.bountysource-link:hover { + text-decoration: underline; } @media only screen and (max-width: 992px) { diff --git a/locale/ja/crystal-website/_assets/css/_install.scss b/locale/ja/crystal-website/_assets/css/_install.scss index e8c027c3..4f90fbd2 100644 --- a/locale/ja/crystal-website/_assets/css/_install.scss +++ b/locale/ja/crystal-website/_assets/css/_install.scss @@ -3,8 +3,6 @@ .distro-title { @extend .black-text; text-align: center; - } - .center { margin-bottom: 5rem; } h2 { @@ -14,7 +12,7 @@ padding: 5rem 0; h1 { font-size: 3.4rem; - &.center { + &.distro-title { margin-bottom: 2rem; } } @@ -31,7 +29,6 @@ > div { text-align: center; .distro-icon { - display: block; height: 40px; } img { diff --git a/locale/ja/crystal-website/_assets/css/_pygment_overrides.scss b/locale/ja/crystal-website/_assets/css/_pygment_overrides.scss index 3e820988..3ad19975 100644 --- a/locale/ja/crystal-website/_assets/css/_pygment_overrides.scss +++ b/locale/ja/crystal-website/_assets/css/_pygment_overrides.scss @@ -97,8 +97,3 @@ } } } - -code.highlighter-rouge { - background-color: #E5E5E5; - padding: 0 5px; -} diff --git a/locale/ja/crystal-website/_includes/header.html b/locale/ja/crystal-website/_includes/header.html index 673c08d8..cfaacf72 100644 --- a/locale/ja/crystal-website/_includes/header.html +++ b/locale/ja/crystal-website/_includes/header.html @@ -12,7 +12,7 @@
{{ page.description }}

Install - Learn + Learn Try Online

{% else %} diff --git a/locale/ja/crystal-website/_includes/sponsors_sidebar.html b/locale/ja/crystal-website/_includes/sponsors_sidebar.html index cf0d3b9d..7c268539 100644 --- a/locale/ja/crystal-website/_includes/sponsors_sidebar.html +++ b/locale/ja/crystal-website/_includes/sponsors_sidebar.html @@ -2,7 +2,7 @@

スポンサーになりたいですか?

このプロジェクトを気に入っていただき、その可能性を感じていただけたならば、力になれるはずです。どんな金額でも構いません。

-

寄付

@@ -11,9 +11,10 @@

スポンサーになりたいですか?

FAQ

-

このリストは何ですか?

これらの企業や個人は、Crystal の発展を維持するために、毎月一定の金額を寄付してくれています。詳細は Open Collective のキャンペーンページを確認してください。

+

このリストは何ですか?

これらの企業や個人は、Crystal の発展を維持するために、毎月一定の金額を寄付してくれています。See the Bountysource campaign for more details.

-

月5ドルのスポンサーをしているけれど、自分のURLがリストにありません。

Web サイトとアバター画像を Open Collective のプロフィールもしくは Bountysource のプロフィールから取得しています。それができなかった場合は、GitHub もしくは Twitter のアカウントのものを使います。

+

月5ドルのスポンサーをしているけれど、自分のURLがリストにありません。

We grab the website and avatar from your Bountysource profile. それができなかった場合は、GitHub もしくは Twitter のアカウントのものを使います。

このページの現在のスポンサー一覧は週に一度更新されます。

もし情報が間違っていれ、訂正を求める場合は、私たちに連絡してください。

diff --git a/locale/ja/crystal-website/_layouts/install.html b/locale/ja/crystal-website/_layouts/install.html index f3dd61bb..20e31483 100644 --- a/locale/ja/crystal-website/_layouts/install.html +++ b/locale/ja/crystal-website/_layouts/install.html @@ -2,12 +2,12 @@ layout: default ---
-

{{ page.subtitle }}

インストール

+

{{ page.subtitle }}

{{ content }}

-

インストールできましたか?

学ぶ

何か問題が発生しましたか?

フォーラムでのサポート
+

インストールできましたか?

学ぶ

何か問題が発生しましたか?

フォーラムでのサポート。 diff --git a/locale/ja/crystal-website/_posts/2018-01-08-top-5-reasons-for-ruby-ists-to-use-crystal.md b/locale/ja/crystal-website/_posts/2018-01-08-top-5-reasons-for-ruby-ists-to-use-crystal.md index 60e0d9ab..24164ce7 100644 --- a/locale/ja/crystal-website/_posts/2018-01-08-top-5-reasons-for-ruby-ists-to-use-crystal.md +++ b/locale/ja/crystal-website/_posts/2018-01-08-top-5-reasons-for-ruby-ists-to-use-crystal.md @@ -182,4 +182,4 @@ If you’re looking to try out the Crystal programming language, here are some g - [Install Crystal](/install) - [Crystal for Rubyists](http://www.crystalforrubyists.com/) - [Crystal Exercisms](http://exercism.io/languages/crystal/about) -- [Create your own HTTP Server in minutes](https://crystal-lang.org/reference/getting_started/http_server.html) +- [Create your own HTTP Server in minutes](https://crystal-lang.org/reference/overview/http_server.html) diff --git a/locale/ja/crystal-website/community/index.html b/locale/ja/crystal-website/community/index.html index 511953f8..eaaca85d 100644 --- a/locale/ja/crystal-website/community/index.html +++ b/locale/ja/crystal-website/community/index.html @@ -5,7 +5,7 @@
{% include community_row.html title='セキュリティの問題' divId='security' - content='何かセキュリティに関する問題を見つけても、issueトラッカーでオープンに公開しないでください。それらをトラックするためのメールボックスを用意しています。

メッセージを Keybase もしくは標準的な PGP (フィンガープリントは 5995 C83C D754 BE44 8164 1929 0961 7FD3 7CC0 6B54) で暗号化できます。' + content='何かセキュリティに関する問題を見つけても、issueトラッカーでオープンに公開しないでください。それらをトラックするためのメールボックスを用意しています。

メッセージを Keybase もしくは標準的な PGP (フィンガープリントは 5995 C83C D754 BE44 8164 1929 0961 7FD3 7CC0 6B54) で暗号化できます。' link_text='security@manas.tech' url='mailto:security@manas.tech' icon='security' %} @@ -30,7 +30,7 @@ {% include community_row.html title='新しいリリースやユースケースの紹介' divId='blog' - content='Crystal 公式ブログでは、新しいリリースの詳細なアナウンス、興味深いユースケース、言語デザインの決定の背景、Crystal の開発チームの普段書いているコードについてなどが見れます。

ゲストからの投稿も受け付けています。もし Crystal で何か驚くものを作った場合は、私たちに連絡してみてください。あなたのことをブログで取り上げられることを楽しみにしています。' + content='Crystal 公式ブログでは、新しいリリースの詳細なアナウンス、興味深いユースケース、言語デザインの決定の背景、Crystal の開発チームの普段書いているコードについてなどが見れます。

ゲストからの投稿も受け付けています。もし Crystal で何か驚くものを作った場合は、私たちに連絡してみてください。あなたのことをブログで取り上げられることを楽しみにしています。' link_text='Crystal ブログ' url='/blog' icon='chat_bubble_outline' @@ -126,7 +126,7 @@ {% include community_row.html title='イベント' divId='events' - content='世界中の複数の都市で継続的に開催されている Crystal ミートアップや、オンラインミートアップ、プログラミングカンファレンスでの Crystal プレゼンテーションなど、Rubyconf の近くで Crystal のトークを見つけられる可能性が高いです。あなたの住む場所でのイベントを心待ちにしていてください。
' + content='世界中の複数の都市で継続的に開催されている Crystal ミートアップや、オンラインミートアップ、プログラミングカンファレンスでの Crystal プレゼンテーションなど、Rubyconf の近くで Crystal のトークを見つけられる可能性が高いです。あなたの住む場所でのイベントを心待ちにしていてください。
' link_text='Crystal イベントカレンダー' url=events_ical_url icon='today' %}
@@ -146,7 +146,7 @@ listDayFormat: false, listDayAltFormat: false, timeFormat: 'dddd DD MMM YYYY', - noEventsMessage: "リストアップする Crystal のイベントがありません。", + noEventsMessage: "We don't have any Crystal event listed - let us know if there's one we're missing!", events: { googleCalendarId: '{{ site.google_calendar_id }}' } diff --git a/locale/ja/crystal-website/index.html b/locale/ja/crystal-website/index.html index d262ebe4..82a5d29a 100644 --- a/locale/ja/crystal-website/index.html +++ b/locale/ja/crystal-website/index.html @@ -5,7 +5,7 @@ - main --- diff --git a/locale/ja/crystal-website/install/index.html b/locale/ja/crystal-website/install/index.html index 86c393a0..c8488b92 100644 --- a/locale/ja/crystal-website/install/index.html +++ b/locale/ja/crystal-website/install/index.html @@ -7,7 +7,7 @@
-
{% for item in site.data.install %}{% endfor %}
+
{% for item in site.data.install %}{% endfor %}