rpr 1.8.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 733f4164bf9ff2410c5cdf227dca97bbc72fc8fecb32d4fbb66077f9115a462d
4
- data.tar.gz: ef779720bbb0e94e58bed6b81ff3f2974bc7f822d10d30561920a33d222072c7
3
+ metadata.gz: d923de497b9fdd3e34eddd7abee262a84812bd7236e25bb7a5b304e2fdd78a08
4
+ data.tar.gz: 3dba086559d87976fc1ebf508efafcb676d997042e964890250cec3ef6990a62
5
5
  SHA512:
6
- metadata.gz: a025a546328696653b114051ecbc05e776d79fff2524f92a27e9c58c28f2aa1a44fd4429af676b7fb80b93de605df6aaf38dcb314ee96105b738f08ab2d25523
7
- data.tar.gz: f0ed9dfa384f9f9f1a94ab660f3115485a6014fd7505b2db96c2026db78a793bca40a53ab5f44219aac1373be81eda65359d1b0084d35e015f23e848b152a7fe
6
+ metadata.gz: 855dc01da970373f90a5f04345c9a721431c21ae1fbe063be8e5de4e4a0daae43144548208aa349a0b7e200069db88917d60c2871772156688af40a8a25fb94e
7
+ data.tar.gz: bd4b639388586ec71556215eaa81a4eda67b4719446983f0610fbf228d6fc7b5fd6ceaca220ff606dd4ec2b26d9906a15576a7d122c486eabbab7e36de60f65e
@@ -1,10 +1,10 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 2.2.9
5
- - 2.3.6
6
- - 2.4.3
7
- - 2.5.0
4
+ - 2.3.8
5
+ - 2.4.5
6
+ - 2.5.3
7
+ - 2.6.0
8
8
  - ruby-head
9
9
  matrix:
10
10
  allow_failures:
data/README.md CHANGED
@@ -9,8 +9,14 @@ RPR displays Ruby's AST on command line.
9
9
  ## Support parsers
10
10
 
11
11
  - [Ripper](http://ruby-doc.org/stdlib-2.3.0/libdoc/ripper/rdoc/Ripper.html)
12
- - [RuboCop](https://github.com/bbatsov/rubocop)
12
+ - `sexp`
13
+ - `lex`
14
+ - `tokenize`
13
15
  - [Parser](https://github.com/whitequark/parser)
16
+ - [RuboCop](https://github.com/bbatsov/rubocop)
17
+ - [RubyParser](https://github.com/seattlerb/ruby_parser)
18
+ - RubyVM::AbstractSyntaxTree (Since Ruby 2.6)
19
+ - [MinRuby](https://github.com/mame/minruby)
14
20
 
15
21
  ## Installation
16
22
 
@@ -46,7 +52,10 @@ $ rpr hello.rb
46
52
 
47
53
  ### Specify Parser
48
54
 
49
- Default: `sexp`
55
+ The default parser is `sexp`.
56
+ You can find all supported parsers with `--help` option.
57
+
58
+ For example:
50
59
 
51
60
  ```sh
52
61
  $ rpr hello.rb --parser rubocop
@@ -61,7 +70,10 @@ $ rpr hello.rb --method tokenize
61
70
 
62
71
  ### Specify output formatter
63
72
 
64
- Default: `pp`
73
+ The default formatter is `pp`.
74
+ You can find all supported formatters with `--help` option.
75
+
76
+ For example:
65
77
 
66
78
  ```sh
67
79
  $ rpr hello.rb --formatter json
@@ -123,6 +135,15 @@ locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_
123
135
  [3] pry(#<Array>)> exit
124
136
  ```
125
137
 
138
+ Print an AST as a PNG image with Graphviz.
139
+
140
+ ```sh
141
+ $ rpr hello.rb -f dot | dot -Tpng -oast.png
142
+ $ open ast.png
143
+ ```
144
+
145
+ ![ast](https://user-images.githubusercontent.com/4361134/50540867-63b51300-0bdd-11e9-9b0c-63aa70e980be.png)
146
+
126
147
  ### Configuration
127
148
 
128
149
  Rpr searches config file from `./.rpr` or `~/.config/rpr`. `./.rpr` is priority.
data/lib/rpr.rb CHANGED
@@ -19,8 +19,8 @@ module Rpr
19
19
  puts VERSION
20
20
  end
21
21
 
22
- formatter = find_formatter(options[:formatter])
23
22
  parser = find_parser(options[:parser])
23
+ formatter = find_formatter(options[:formatter])
24
24
 
25
25
  if options[:expression]
26
26
  res = parser.parse(options[:expression])
@@ -0,0 +1,92 @@
1
+ module Rpr
2
+ module Formatter
3
+ module UnifiedInterface
4
+ refine Object do
5
+ def node_value() inspect end
6
+ def traversable?() false end
7
+ end
8
+
9
+ if defined?(Rpr::Parser::Sexp)
10
+ refine Array do
11
+ def node_value() traversable? ? self[0].to_s : super end
12
+ def children
13
+ res = []
14
+ self[1..-1].each do |child|
15
+ if child.is_a?(Array) &&
16
+ !child.traversable? &&
17
+ !(child.size == 2 && child[0].is_a?(Integer) && child[1].is_a?(Integer))
18
+ res.concat(child)
19
+ else
20
+ res << child
21
+ end
22
+ end
23
+ res
24
+ end
25
+ def traversable?() self.first.is_a?(Symbol) end
26
+ end
27
+ end
28
+
29
+ if defined?(Rpr::Parser::Parser) || defined?(Rpr::Parser::Rubocop)
30
+ refine ::Parser::AST::Node do
31
+ def node_value() self.type.to_s end
32
+ def traversable?() true end
33
+ end
34
+ end
35
+
36
+ if defined?(Rpr::Parser::Rubyparser)
37
+ refine Sexp do
38
+ def node_value() self.sexp_type.to_s end
39
+ def children() self.each.to_a end
40
+ def traversable?() true end
41
+ end
42
+ end
43
+
44
+ if defined?(Rpr::Parser::Rubyvm_ast)
45
+ refine RubyVM::AbstractSyntaxTree::Node do
46
+ def node_value() self.type.to_s end
47
+ def traversable?() true end
48
+ end
49
+ end
50
+ end
51
+
52
+ # Formatter for Graphviz
53
+ class Dot
54
+ using UnifiedInterface
55
+
56
+ def self.print(object)
57
+ self.new.print(object)
58
+ end
59
+
60
+ def initialize
61
+ @id = :a
62
+ end
63
+
64
+ def print(object)
65
+ puts 'digraph{graph [dpi=288;];'
66
+ traverse_and_print(object)
67
+ puts "}"
68
+ end
69
+
70
+ private
71
+
72
+ def traverse_and_print(object, parent = 'ROOT')
73
+ label = object.node_value
74
+ shape = object.traversable? ? 'oval' : 'box'
75
+ id = gen_id()
76
+
77
+ puts "#{id} -> #{parent}"
78
+ puts "#{id}[ label=#{label.inspect} shape=#{shape} ]"
79
+
80
+ if object.traversable?
81
+ object.children.each do |child|
82
+ traverse_and_print(child, id)
83
+ end
84
+ end
85
+ end
86
+
87
+ def gen_id
88
+ @id = @id.succ
89
+ end
90
+ end
91
+ end
92
+ end
@@ -1,3 +1,3 @@
1
1
  module Rpr
2
- VERSION = "1.8.0"
2
+ VERSION = "1.9.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rpr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masataka Kuwabara
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-12-27 00:00:00.000000000 Z
11
+ date: 2018-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -228,6 +228,7 @@ files:
228
228
  - exe/rpr
229
229
  - lib/rpr.rb
230
230
  - lib/rpr/config.rb
231
+ - lib/rpr/formatter/dot.rb
231
232
  - lib/rpr/formatter/json.rb
232
233
  - lib/rpr/formatter/pp.rb
233
234
  - lib/rpr/formatter/pry.rb