[ruby-dev:38695] [feature:trunk] let irb use pretty_inspect if possible

View: New views
8 Messages — Rating Filter:   Alert me  

[ruby-dev:38695] [feature:trunk] let irb use pretty_inspect if possible

by Yusuke ENDOH :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

遠藤です。

irb メンテナの石塚さん:

pretty_inspect が使用可能なときは、irb の結果出力にそれを使うのは
どうでしょうか。


irb(main):001:0> ["foo bar baz"] * 6
=> ["foo bar baz", "foo bar baz", "foo bar baz", "foo bar baz", "foo
bar baz", "foo bar baz"]
irb(main):002:0> require "pp"
=> true
irb(main):003:0> ["foo bar baz"] * 6
=> ["foo bar baz",
 "foo bar baz",
 "foo bar baz",
 "foo bar baz",
 "foo bar baz",
 "foo bar baz"]


本当の目的は「Object#p と同様に pp にも引数を返してほしい」という
一年前の話 ([ruby-dev:34830] 、[ruby-dev:34833]) の続きで、田中さん
からは「irb が変われば pp も変えてよい」という条件付採録を (さっき)
貰いました。

よろしくお願いします。


Index: lib/irb.rb
===================================================================
--- lib/irb.rb (revision 23808)
+++ lib/irb.rb (working copy)
@@ -299,7 +299,13 @@

     def output_value
       if @context.inspect?
-        printf @context.return_format, @context.last_value.inspect
+        value = @context.last_value
+        if value.respond_to?(:pretty_inspect)
+          str = value.pretty_inspect.chomp
+        else
+          str = value.inspect
+        end
+        printf @context.return_format, str
       else
         printf @context.return_format, @context.last_value
       end

--
Yusuke ENDOH <mame@...>


[ruby-dev:38696] Re: [feature:trunk] let irb use pretty_inspect if possible

by Keiju ISHITSUKA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

けいじゅ@いしつかです.

In [ruby-dev:38695] the message: "[ruby-dev:38695] [feature:trunk] let
irb use pretty_inspect if possible", on Jun/21 23:06(JST) Yusuke ENDOH
writes:

>遠藤です。

>irb メンテナの石塚さん:

>pretty_inspect が使用可能なときは、irb の結果出力にそれを使うのは
>どうでしょうか。

うーん. require してあると, irbの振る舞いが変わるのはどうかと思います
が, irb で pp な出力をするモードがあっても良いよなーとは思っていました.

コマンドラインオプションもしくは, .irbrc での IRB.CONFの指定で pp な出
力になるというのでも良いですよね?

irb --inspect pp

で pp な出力をするかんじです.

>本当の目的は「Object#p と同様に pp にも引数を返してほしい」という
>一年前の話 ([ruby-dev:34830] 、[ruby-dev:34833]) の続きで、田中さん
>からは「irb が変われば pp も変えてよい」という条件付採録を (さっき)
>貰いました。

あー. なるほど,

irb(main):006:0> pp 1
1
=> nil

で 引数を返すようになると, 2重に表示してしまうからですね.

__
---------------------------------------------------->> 石塚 圭樹 <<---
---------------------------------->> e-mail: keiju@... <<---


[ruby-dev:38703] Re: [feature:trunk] let irb use pretty_inspect if possible

by Yusuke ENDOH :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

遠藤です。

2009/06/22 0:43 に 石塚圭樹<keiju@...> さんは書きました:
> うーん. require してあると, irbの振る舞いが変わるのはどうかと思います
> が, irb で pp な出力をするモードがあっても良いよなーとは思っていました.

はい。


> コマンドラインオプションもしくは, .irbrc での IRB.CONFの指定で pp な出
> 力になるというのでも良いですよね?
>
> irb --inspect pp
>
> で pp な出力をするかんじです.


たぶんいいと思います。ただ、どうせ pp に特化するのなら、--pp などに
したら短くてうれしいかもしれないです。こんなオプションはどうでしょうか。

  --inspect-method foo: 結果出力の際、inspect の代わりに foo を用いる
  --pp:  -rpp --inspect-method=pretty_inspect と同じ効果

この方針のパッチを作ってみました。
irb の好みや作法にあわなかったらすみません。


Index: lib/irb/context.rb
===================================================================
--- lib/irb/context.rb (revision 23826)
+++ lib/irb/context.rb (working copy)
@@ -35,6 +35,7 @@

       @use_readline = IRB.conf[:USE_READLINE]
       @inspect_mode = IRB.conf[:INSPECT_MODE]
+      @inspect_method = IRB.conf[:INSPECT_METHOD]

       self.math_mode = IRB.conf[:MATH_MODE] if IRB.conf[:MATH_MODE]
       self.use_tracer = IRB.conf[:USE_TRACER] if IRB.conf[:USE_TRACER]
@@ -116,6 +117,7 @@

     attr_reader :use_readline
     attr_reader :inspect_mode
+    attr_reader :inspect_method

     attr_reader :prompt_mode
     attr_accessor :prompt_i
Index: lib/irb/lc/ja/help-message
===================================================================
--- lib/irb/lc/ja/help-message (revision 23826)
+++ lib/irb/lc/ja/help-message (working copy)
@@ -18,6 +18,9 @@
   -E enc            ruby -E と同じ.
   --inspect    結果出力にinspectを用いる(bcモード以外はデフォルト).
   --noinspect    結果出力にinspectを用いない.
+  --inspect-method method-name
+    結果出力の際, inspectの代わりにmethod-nameを用いる.
+  --pp    -rpp --inspect-method=pretty_inspect と同じ.
   --readline    readlineライブラリを利用する.
   --noreadline    readlineライブラリを利用しない.
   --prompt prompt-mode/--prompt-mode prompt-mode
Index: lib/irb/lc/help-message
===================================================================
--- lib/irb/lc/help-message (revision 23826)
+++ lib/irb/lc/help-message (working copy)
@@ -19,6 +19,9 @@
   -E enc            Same as `ruby -E`
   --inspect    Use `inspect' for output (default except for bc mode)
   --noinspect    Don't use inspect for output
+  --inspect-method method-name
+    Use method-name instead of `inspect' for output
+  --pp    Identical to -rpp --inspect-method=pretty_inspect
   --readline    Use Readline extension module
   --noreadline    Don't use Readline extension module
   --prompt prompt-mode
Index: lib/irb/init.rb
===================================================================
--- lib/irb/init.rb (revision 23826)
+++ lib/irb/init.rb (working copy)
@@ -45,6 +45,7 @@
     @CONF[:MATH_MODE] = false
     @CONF[:USE_READLINE] = false unless defined?(ReadlineInputMethod)
     @CONF[:INSPECT_MODE] = nil
+    @CONF[:INSPECT_METHOD] = "inspect"
     @CONF[:USE_TRACER] = false
     @CONF[:USE_LOADER] = false
     @CONF[:IGNORE_SIGINT] = true
@@ -148,6 +149,11 @@
  @CONF[:INSPECT_MODE] = true
       when "--noinspect"
  @CONF[:INSPECT_MODE] = false
+      when /^--inspect-method(?:=(.+))?/
+ @CONF[:INSPECT_METHOD] = $1 || ARGV.shift
+      when "--pp"
+ @CONF[:LOAD_MODULES].push "pp"
+ @CONF[:INSPECT_METHOD] = "pretty_inspect"
       when "--readline"
  @CONF[:USE_READLINE] = true
       when "--noreadline"
Index: lib/irb.rb
===================================================================
--- lib/irb.rb (revision 23826)
+++ lib/irb.rb (working copy)
@@ -299,7 +299,8 @@

     def output_value
       if @context.inspect?
-        printf @context.return_format, @context.last_value.inspect
+        str = @context.last_value.send(@context.inspect_method)
+        printf @context.return_format, str
       else
         printf @context.return_format, @context.last_value
       end

--
Yusuke ENDOH <mame@...>


[ruby-dev:38706] Re: [feature:trunk] let irb use pretty_inspect if possible

by Keiju ISHITSUKA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

けいじゅ@いしつかです.

In [ruby-dev:38703] the message: "[ruby-dev:38703] Re: [feature:trunk]
let irb use pretty_inspect if possible", on Jun/23 05:47(JST) Yusuke
ENDOH writes:

>遠藤です。

>> irb --inspect pp
>> で pp な出力をするかんじです.

>たぶんいいと思います。ただ、どうせ pp に特化するのなら、--pp などに
>したら短くてうれしいかもしれないです。こんなオプションはどうでしょうか。
>
>  --inspect-method foo: 結果出力の際、inspect の代わりに foo を用いる
>  --pp:  -rpp --inspect-method=pretty_inspect と同じ効果
>
>この方針のパッチを作ってみました。
>irb の好みや作法にあわなかったらすみません。

わざわざパッチを作ってくださりありがとうございます.

実はすでにこちらでも作っていて, --inspect pp 以外にもブロックが指定で
きて:

  irb -r yaml --inspect "{|v| YAML.dump(v)}"

なんて指定もできるようにしました.

# まあ, 使う人はいないと思いますが(^^;;

pp(pretty_print)はともかく, オブジェクトに対する直接のメソッドは将来的
にもあまり出てきそうもない気がします.

あと, コマンド引数に関してですが, ppを非常に良く使うんだったら, .irbrc


  IRB.conf[:INSPECT_MODE] = :pp

としていただければコマンド引数で渡す必要はなくなりますので, 短いのにあ
まりこだわらなくても良いのではないかと思いますが?

いかがでしょう?

__
---------------------------------------------------->> 石塚 圭樹 <<---
---------------------------------->> e-mail: keiju@... <<---


[ruby-dev:38707] Re: [feature:trunk] let irb use pretty_inspect if possible

by Yusuke ENDOH :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

遠藤です。

2009/06/24 0:25 に 石塚圭樹<keiju@...> さんは書きました:
> 実はすでにこちらでも作っていて, --inspect pp 以外にもブロックが指定で
> きて:
>
>  irb -r yaml --inspect "{|v| YAML.dump(v)}"
>
> なんて指定もできるようにしました.

おおすばらしい。


> pp(pretty_print)はともかく, オブジェクトに対する直接のメソッドは将来的
> にもあまり出てきそうもない気がします.

確かにそうですね。


> あと, コマンド引数に関してですが, ppを非常に良く使うんだったら, .irbrc
> に
>
>  IRB.conf[:INSPECT_MODE] = :pp
>
> としていただければコマンド引数で渡す必要はなくなりますので, 短いのにあ
> まりこだわらなくても良いのではないかと思いますが?

個人的には設定は極力しない派なので、短い方が嬉しいなーとは思います。が、
irb がカスタマイズを推奨している雰囲気は感じ取っていますのでそれでいいと
思います。

「設定はしたくないけど pp は使いたい、余計な表示はしてほしくない」という
私のようにわがままな人は

  irb(main):001:0> pp obj; nil

としてくれ、ということで。今でも ary.each {|x| ...; p x } とかするときは
最後に ; nil などをつけることが多いですしね。

--
Yusuke ENDOH <mame@...>


[ruby-dev:38744] Re: [feature:trunk] let irb use pretty_inspect if possible

by Keiju ISHITSUKA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

けいじゅ@いしつかです.

trunkにリリースしました.

irb --inspect pp

で pp を使うようになります. あと, おまけで,  yaml と marshal もつけて
あります(^^;;;

使い方.

* コマンドライン

% irb --inspect [raw|p|pp|yaml|marshal|...]

または, ブロック指定で

% irb -r yaml --inspect "{|v| YAML.dump(v)}"

* 実行中での変更

irb(main):001:0> conf.inspect_mode = :yaml

* .irbrc でデフォルトの振る舞いを変える

IRB.conf[:INSPECT_MODE] = [:raw|:p|:pp|:yaml|:marshal|...]


* ユーザー定義モード

IRB::INSPECTORS.def_inspector(mode_names, init_proc, &inspect_block)

例)

.irbrcで

IRB::INSPECTORS.def_inspector([:test]){|v| v.to_s*2}

とし,

% irb --inspect test

で実行する.

こんな感じになりました.



In [ruby-dev:38707] the message: "[ruby-dev:38707] Re: [feature:trunk] let irb use pretty_inspect if possible", on Jun/24 01:08(JST)
Yusuke ENDOH writes:

>遠藤です。
>
>2009/06/24 0:25 に 石塚圭樹<keiju@...> さんは書きました:
>> 実はすでにこちらでも作っていて, --inspect pp 以外にもブロックが指定で
>> きて:
>>
>>  irb -r yaml --inspect "{|v| YAML.dump(v)}"
>>
>> なんて指定もできるようにしました.
>
>おおすばらしい。
>
>
>> pp(pretty_print)はともかく, オブジェクトに対する直接のメソッドは将来的
>> にもあまり出てきそうもない気がします.
>
>確かにそうですね。
>
>
>> あと, コマンド引数に関してですが, ppを非常に良く使うんだったら, .irbrc
>> に
>>
>>  IRB.conf[:INSPECT_MODE] = :pp
>>
>> としていただければコマンド引数で渡す必要はなくなりますので, 短いのにあ
>> まりこだわらなくても良いのではないかと思いますが?
>
>個人的には設定は極力しない派なので、短い方が嬉しいなーとは思います。が、
>irb がカスタマイズを推奨している雰囲気は感じ取っていますのでそれでいいと
>思います。
>
>「設定はしたくないけど pp は使いたい、余計な表示はしてほしくない」という
>私のようにわがままな人は
>
>  irb(main):001:0> pp obj; nil
>
>としてくれ、ということで。今でも ary.each {|x| ...; p x } とかするときは
>最後に ; nil などをつけることが多いですしね。
>
>--
>Yusuke ENDOH <mame@...>
>
>

__
---------------------------------------------------->> 石塚 圭樹 <<---
---------------------------------->> e-mail: keiju@... <<---


[ruby-dev:38746] Re: [feature:trunk] let irb use pretty_inspect if possible

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:38744] Re: [feature:trunk] let irb use pretty_inspect if possible"
    on Tue, 7 Jul 2009 22:42:04 +0900, keiju@... (石塚圭樹) writes:

|trunkにリリースしました.
|
|irb --inspect pp
|
|で pp を使うようになります. あと, おまけで,  yaml と marshal もつけて
|あります(^^;;;

irb/inspector.rbがチェックインされていないような。


[ruby-dev:38751] Re: [feature:trunk] let irb use pretty_inspect if possible

by Keiju ISHITSUKA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

けいじゅ@いしつかです.

In [ruby-dev:38746] the message: "[ruby-dev:38746] Re: [feature:trunk] let irb use pretty_inspect if possible", on Jul/08 13:18(JST)
Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>|trunkにリリースしました.
>|
>|irb --inspect pp
>|
>|で pp を使うようになります. あと, おまけで,  yaml と marshal もつけて
>|あります(^^;;;
>
>irb/inspector.rbがチェックインされていないような。

申し訳ない. チェックインしました.

__
---------------------------------------------------->> 石塚 圭樹 <<---
---------------------------------->> e-mail: keiju@... <<---