『 Introducing Crystal Programming Language 』の原稿を管理するリポジトリです。
bundle install
して bundle exec rake
すればビルドできます。
$ bundle install --path=vendor/bundle
$ bundle exec rake -j
生成されたファイルは build
ディレクトリ以下にあります。
$ ls build
docs/ introducing-crystal-print.pdf introducing-crystal-web.pdf
introducing-crystal-print.pdf
は印刷用の PDF で、 introducing-crystal-web.pdf
は Web 公開用の PDF です。
docs/
以下には Jekyll で生成されたドキュメントがあります。
Redpen による文章のチェック等や crystal tool format
によるフォーマットのチェックは bundle exec rake lint
で実行できます。
$ bundle exec rake lint
Example テストやプロジェクトのテストは bundle exec rake test
で実行できます。
$ bundle exec rake test
この2つが通るようにがんばってください。
それぞれのディレクトリにある content.adoc
に Asciidoc 形式で執筆してください。
Asciidoc 形式については次に挙げるリンクでも参考にしてください。
原稿にコードを挿入する場合は、Asciidoc の include
機能を利用してください。
これはコードと記事を分離して、コードに対してコンパイルができる状態を保つためです。
[source,crystal]
----
include::./examples/code.cr[]
----
コードはディレクトリの examples
以下に置いてください。
examples
ディレクトリ以下に置いた Crystal のコードは bundle exec rake test
の際にいくつか変換を施したのち実行されます。
変換のルールは以下の通りです。
# =>
のようなコメントが続く場合1 + 2 # => 3
このように変換されます。
require "spec"
it "code.cr" do
(1 + 2).inspect.should eq("3")
end
期待する文字列に16進数の数値が含まれる場合、その部分は適当な16進数の文字列にマッチするものとして扱われます。
これは、インスタンスを inspect
した際にオブジェクトのアドレスが表示されるので、それに対応するためです。
# =>
から始まる行の場合begin
1 + 2
end
# => 3
このように変換されます。
require "spec"
it "code.cr" do
begin
1 + 2
end
.inspect.should eq("3")
end
# raises
が続く場合[1, 2][3] # raises IndexError (Index out of bounds)
このように変換されます。
require "spec"
it "code.cr" do
expect_raises(IndexError, "Index out of bounds") { [1, 2][3] }
end
括弧に囲まれた部分は省略できて、その場合はエラーメッセージに対して検査が行われません。
# tag::main[]
と # end::main[]
# =>
を含む場合コード全体が it
で囲まれることになるのですが、 def
等の定義はブロックの中に書けないのでブロックの位置を指定したい場合があります。
その場合は # tag::main[]
というコメントと # end::main[]
というコメントで囲ってください。
このコメントは Asciidoc でタグ領域の指定に使うものなので、 include
した結果にも現れないので安心してください。
def foo
42
end
# tag::main[]
foo # => 42
# end::main[]
このように変換されます。
def foo
42
end
require "spec"
it "code.cr" do
(foo).inspect.should eq("42")
end
# output:
# output:
で出力のテストができます。
puts "Hello, World!"
puts "Crystal"
# output:
# Hello, World!
# Crystal
# output:
と # =>
や # raises
は併用できません。
# tag::compileonly[]
ソースコード中に # tag::compileonly[]
がある場合、そのコードは上記のテストは実行されず、コンパイルが通るか確認するだけになります。
# tag::compileonly[]
# end::compileonly[]
require "http/server"
server = HTTP::Server.new do |context|
context.response.content_type = "text/plain"
context.response.print "Hello world, got #{context.request.path}!"
end
puts "Listening on http://127.0.0.1:8080"
server.listen(8080)
いくつかの章では説明のためにプロジェクトを作るかと思います。
その場合は projects
ディレクトリ以下にプロジェクトを配置すると、 bundle exec rake test
の際にプロジェクトのビルドとテストが実行されます。
ビルドとテストは、
Makefile
が無い場合は、 shards
と crystal spec
を実行します。Makefile
がある場合は、 make
と make test
を実行します。という風にして実行します。
rake lint
ではチェックされないけど注意してほしい部分crystal
という表記はコマンド名として、先頭が大文字の Crystal はプログラミング言語の名前として使い分けてください。RedPen 1.10.4の .tar.gz
を落としてきて vendor/
以下に展開したあと、次のコマンドを実行します。
$ docker build -t makenowjust/techbookfest-build -f .circleci/images/build/Dockerfile .