rpr 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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