2010/12/13

A Ruby Book "Hajimete no Ruby"

This entry is for Ruby Advent Calendar jp-en: 2010. The previous post was from
drogus and the next post will be from Samuel Kadolph.

Have you ever heard of a Ruby book Hajimete no Ruby? Most of you have not, I guess. Because it is unfortunately available only in Japanese language. Today I am going to introduce this title to you.

Hajimete no Ruby(O'Reilly Japan 2008), literally Ruby for the first time, is a book of Ruby for readers who are experienced in other programming languages. The author is @yugui.

O'Reilly Japan seems to have a convention that when they are to translate Learning Foobar into Japanese, they name it as Hajimete no Foobar. But Yugui's book is not a Japanese translation of Learning Ruby but a newly written book.

As I mentioned previously, this book is not a introductory book to newbies. Inwardly, readers are expected to have knowledge of fundamental computer sciences, especially object-oriend programming. Outwardly, in this book the installation instructions are just a section of the appendices while such guide tends to be placed in early chapters in typical programming language books.

Now let's having a glance of its first chapter:

  1. Welcome to the Life with Ruby
    1. Characteristics of Ruby

      Object Oriented Language / A Better Perl / Pseudo Code that Runs / Lisp in ALGOL's Clothing
    2. Implementations and Runtime Environment

      The Versioning Scheme / Language Structures
    3. Execution Model

      Dynamic Language / Library Loading at Runtime / Garbage Collection
    4. Invoking the Interpreter

      Hello, World! / The Interactive Ruby / The Command Line Debugger
    5. Syntax and Features

      Expressions and Delimiters / Whitespaces / Input and Output / Control Structure / Methods with Block / Object-Orientedness
    6. Summary of this Chapter

      Topics not covered in this Chapter

Aren't you excited to see words like Lisp and ALGOL? If you are, this book is for you.

Following chapters are dedicated to primary language components, namely Arrays and Hashes(Ch. 2), Numbers(Ch. 3), Strings(Ch. 4), IOs(Ch. 5), Variables and Expressions(Ch. 6), Methods(Ch. 7) and Objects and Classes(Ch. 8).

The final chapter is for topics beyond the book.

  1. Beyond this Book
    1. Rubygems

      Main Commands / Recommended Gems
    2. Network
    3. Databases
    4. Images
    5. GUI
    6. Black Magic

      eval and its families / method_missing / set_trace_func / continuation
    7. Ruby Resources
    8. The Community

You can't help bursting out laughing when you know that yugui recommends these gems: rake for example of DSL, ruby-debug for better debugging, active-support for example of standard library extension, and evil-ruby for studying ruby internals!

And of course, black magic is indispensable in the world of Ruby:-)

If you feel disappointed that this book is not translated to your language, please request O'Reilly Japan to translate in your language and publish it.

2010/10/25

RSpecの進捗カウントを表示

progressスタイルの出力時、ドットの個数を数える暮らしに疲れたので、100ごとにカウント表示するようにしてみた。

本当は 現在の進捗/全件数 としたいのだが、実行前に全件数を得る方法が見つけられない。

spec -c --format Spec::Runner::Formatter::ProgressBarWithCountFormatter spec

require 'spec/runner/formatter/progress_bar_formatter'

module Spec
  module Runner
    module Formatter
      class ProgressBarWithCountFormatter < ProgressBarFormatter
        def show_count
          @count ||= 0
          @count += 1
          @output.print "\n[%04d]" % @count if @count % 100 == 0
          @output.flush
        end
        def example_passed(example)
          super
          show_count
        end
        def example_pending(example, message, deprecated_pending_location=nil)
          super
          show_count
        end
        def example_failed(example, counter, failure)
          super
          show_count
        end
      end
    end
  end
end

2010/09/18

Gemfileにおけるgemspec指定

BundlerのGemfileにはgemspecという指定ができるらしいので動作を調べてみた。


ソースでの定義を読んでみると、どうやらGemfileと一緒においてあるgemspecファイルから依存関係を読み込んで、あたかもGemfileのその場にgemメソッドによる宣言がかかれているかのように振る舞ってくれるらしい。


つまりは、Gemfileに

gemspec name: 'foo'

とあり、同じディレクトリに foo.gemspec があって

Gem::Specification.new do |s|
:
  s.add_dependency 'nokogiri'
  s.add_development_dependency 'rspec', '~> 2.0.0.beta20'
:
end

などと書いてあれば、Gemfileに

gem 'foo'
gem 'nokogiri'
group :development do
  gem 'rspec', '~> 2.0.0.beta20'
end

と書かれたのと同じ意味になるということだ。DRY万歳!


指定できるオプションは

name:
gemspecの拡張子を除いたもの。省略すると * を指定したことになる。複数のファイルが該当するとエラーになってしまうので、1つだけ置いてある場合は省略してもよいが、何らかの理由で複数のgemspecが置いてあるときは明示的に指定するべき。
path:
gemspecが置かれているディレクトリ。省略すると . を指定したことになる。相対パスで指定した場合はGemfileを基点として解決される。
development_group:
開発環境とみなすべきグループ名。省略すると :development を指定したことになる。add_dependencyで指定されているものはグループ指定なし、add_development_dependencyで指定されているものはここで指定したグループに属する。


このうちdevelopment_groupオプションには、RSpecを使う場合に1つ問題がある。(Bundler 1.0.0の時点で)

Rails3では、config/application.rbの冒頭で

Bundler.require(:default, Rails.env)

という処理を行っており、Rails環境(production, development, test, etc.)をBundlerのグループ名として指定しているのだが、RSpecはdevelopment環境で使うジェネレータと、test環境の両方で必要になるため、何らかの方法でgroupを2つ指定する必要があるのだ。

ところが、development_groupオプションはBundlerのgroupメソッドにそのまま渡されるため、配列を指定することができない。

Archives