code_breaker 0.1.2 → 0.2.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 +4 -4
- data/README.md +1 -2
- data/Rakefile +3 -3
- data/bin/console +3 -3
- data/code_breaker.gemspec +16 -16
- data/lib/code_breaker.rb +0 -1
- data/lib/code_breaker/parsable/assignments.rb +32 -17
- data/lib/code_breaker/parsable/data_types.rb +15 -3
- data/lib/code_breaker/parsable/keywords.rb +20 -22
- data/lib/code_breaker/parsable/language_elements.rb +20 -13
- data/lib/code_breaker/parsable/node.rb +11 -10
- data/lib/code_breaker/parsable/ranges.rb +5 -3
- data/lib/code_breaker/parsable/variable_types.rb +13 -6
- data/lib/code_breaker/parsable/wrappers.rb +1 -2
- data/lib/code_breaker/parser.rb +1 -1
- data/lib/code_breaker/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4468ff2521266bb40fef341f1bccccae616ec424
|
4
|
+
data.tar.gz: 42237cf2a40ab1a6070deb8518d251cf843c16e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8eb015b2710c9ec7ac78aa24a6220231131486a9010c4526731e4ce4077249cdda0b347369f27dca219439f5eb0ff7184fd4894df3b07b817017c41bc22868b4
|
7
|
+
data.tar.gz: c7bb344918f3b9c04c46ca7b0a86d4a04526b98e251c4087161dc1d71af3e932445f89931bcdf514f287f4851d16ec094db41e330d293a33ebd778040e5ab6c5
|
data/README.md
CHANGED
@@ -79,8 +79,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
79
79
|
|
80
80
|
## Contributing
|
81
81
|
|
82
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/daigaku-ruby/code_breaker. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org)
|
83
|
-
|
82
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/daigaku-ruby/code_breaker. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant code of conduct](http://contributor-covenant.org/version/1/2/0).
|
84
83
|
|
85
84
|
## License
|
86
85
|
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'code_breaker'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "code_breaker"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/code_breaker.gemspec
CHANGED
@@ -4,33 +4,33 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'code_breaker/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'code_breaker'
|
8
8
|
spec.version = CodeBreaker::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Paul Götze']
|
10
|
+
spec.email = ['paul.christoph.goetze@gmail.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
12
|
+
spec.summary = 'Breaking a Ruby code snippet into a sequence of classes and their connecting methods.'
|
13
|
+
spec.description = 'Breaking a Ruby code snippet into a sequence of classes and their connecting methods.'
|
14
|
+
spec.homepage = 'https://github.com/daigaku-ruby/code_breaker'
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
17
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
18
18
|
# delete this section to allow pushing this gem to any host.
|
19
19
|
if spec.respond_to?(:metadata)
|
20
|
-
spec.metadata['allowed_push_host'] =
|
20
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
21
21
|
else
|
22
|
-
raise
|
22
|
+
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
23
23
|
end
|
24
24
|
|
25
25
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
-
spec.bindir =
|
26
|
+
spec.bindir = 'exe'
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
-
spec.require_paths = [
|
28
|
+
spec.require_paths = ['lib']
|
29
29
|
|
30
|
-
spec.add_dependency
|
31
|
-
spec.add_dependency
|
30
|
+
spec.add_dependency 'parser', '~> 2.2'
|
31
|
+
spec.add_dependency 'activesupport', '~> 4'
|
32
32
|
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
33
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
34
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
35
|
+
spec.add_development_dependency 'rspec', '~> 3.2'
|
36
36
|
end
|
data/lib/code_breaker.rb
CHANGED
@@ -3,28 +3,35 @@ require 'active_support/concern'
|
|
3
3
|
module CodeBreaker
|
4
4
|
module Parsable
|
5
5
|
module Assignments
|
6
|
-
|
7
6
|
extend ActiveSupport::Concern
|
8
7
|
include Parsable::Node
|
9
8
|
|
10
9
|
included do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
# local variable assignment
|
11
|
+
alias_method :parse_lvasgn_node, :parse_as_hash
|
12
|
+
|
13
|
+
# instance variable assignment
|
14
|
+
alias_method :parse_ivasgn_node, :parse_as_hash
|
15
|
+
|
16
|
+
# class variable assignment
|
17
|
+
alias_method :parse_cvasgn_node, :parse_as_hash
|
18
|
+
|
19
|
+
# global variable assignment
|
20
|
+
alias_method :parse_gvasgn_node, :parse_as_hash
|
21
|
+
|
22
|
+
# operation assignment
|
23
|
+
alias_method :parse_op_asgn_node, :parse_as_hash
|
24
|
+
|
25
|
+
# or assignment
|
26
|
+
alias_method :parse_or_asgn_node, :parse_as_hash
|
27
|
+
|
28
|
+
# and assignment
|
29
|
+
alias_method :parse_and_asgn_node, :parse_as_hash
|
18
30
|
|
19
31
|
# multiple assignment
|
20
32
|
def parse_masgn_node(node)
|
21
33
|
lhs, rhs = parse_children(node)
|
22
|
-
|
23
|
-
values = if rhs.kind_of?(Hash) && rhs.has_key?(:array)
|
24
|
-
rhs[:array]
|
25
|
-
else
|
26
|
-
[rhs] + (1...lhs.count).map { NilClass }
|
27
|
-
end
|
34
|
+
values = multiple_assignment_values(lhs, rhs)
|
28
35
|
|
29
36
|
{ node.type => { lhs => values } }
|
30
37
|
end
|
@@ -36,15 +43,23 @@ module CodeBreaker
|
|
36
43
|
|
37
44
|
# constant assignment
|
38
45
|
def parse_casgn_node(node)
|
39
|
-
name
|
46
|
+
name = node.children[1]
|
40
47
|
children = node.children[2]
|
41
|
-
value
|
48
|
+
value = children.nil? ? name : [name, parse(node.children[2])]
|
42
49
|
|
43
50
|
{ node.type => value }
|
44
51
|
end
|
45
52
|
|
46
|
-
|
53
|
+
private
|
47
54
|
|
55
|
+
def multiple_assignment_values(lhs, rhs)
|
56
|
+
if rhs.is_a?(Hash) && rhs.key?(:array)
|
57
|
+
rhs[:array]
|
58
|
+
else
|
59
|
+
[rhs] + (1...lhs.count).map { NilClass }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
48
63
|
end
|
49
64
|
end
|
50
65
|
end
|
@@ -3,7 +3,6 @@ require 'active_support/concern'
|
|
3
3
|
module CodeBreaker
|
4
4
|
module Parsable
|
5
5
|
module DataTypes
|
6
|
-
|
7
6
|
extend ActiveSupport::Concern
|
8
7
|
include Parsable::Node
|
9
8
|
|
@@ -29,6 +28,19 @@ module CodeBreaker
|
|
29
28
|
{ node.type => parse_children(node).first }
|
30
29
|
end
|
31
30
|
|
31
|
+
# interpolated string
|
32
|
+
def parse_dstr_node(node)
|
33
|
+
values = parse_as_hash(node)[node.type].map do |value|
|
34
|
+
if value.is_a?(Array)
|
35
|
+
value.flatten(1)
|
36
|
+
else
|
37
|
+
value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
{ node.type => values }
|
42
|
+
end
|
43
|
+
|
32
44
|
def parse_sym_node(node)
|
33
45
|
Symbol
|
34
46
|
end
|
@@ -49,8 +61,8 @@ module CodeBreaker
|
|
49
61
|
{ parse(node.children[0]) => parse(node.children[1]) }
|
50
62
|
end
|
51
63
|
|
52
|
-
|
53
|
-
|
64
|
+
alias_method :parse_hash_node, :parse_as_hash
|
65
|
+
alias_method :parse_array_node, :parse_as_hash
|
54
66
|
end
|
55
67
|
end
|
56
68
|
end
|
@@ -3,32 +3,31 @@ require 'active_support/concern'
|
|
3
3
|
module CodeBreaker
|
4
4
|
module Parsable
|
5
5
|
module Keywords
|
6
|
-
|
7
6
|
extend ActiveSupport::Concern
|
8
7
|
include Parsable::Node
|
9
8
|
|
10
9
|
included do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
10
|
+
alias_method :parse_or_node, :parse_as_hash
|
11
|
+
alias_method :parse_and_node, :parse_as_hash
|
12
|
+
alias_method :parse_def_node, :parse_as_hash
|
13
|
+
alias_method :parse_yield_node, :parse_as_hash
|
14
|
+
alias_method :parse_rescue_node, :parse_as_hash
|
15
|
+
alias_method :parse_resbody_node, :parse_as_hash
|
16
|
+
|
17
|
+
alias_method :parse_break_node, :parse_as_node_type
|
18
|
+
alias_method :parse_next_node, :parse_as_node_type
|
19
|
+
alias_method :parse_retry_node, :parse_as_node_type
|
20
|
+
alias_method :parse_self_node, :parse_as_node_type
|
22
21
|
|
23
22
|
def parse_loop_node(node)
|
24
23
|
condition = node.children[0]
|
25
|
-
body
|
24
|
+
body = node.children[1]
|
26
25
|
|
27
26
|
{ node.type => parse(condition), do: parse(body) }
|
28
27
|
end
|
29
28
|
|
30
|
-
|
31
|
-
|
29
|
+
alias_method :parse_while_node, :parse_loop_node
|
30
|
+
alias_method :parse_until_node, :parse_loop_node
|
32
31
|
|
33
32
|
def parse_for_node(node)
|
34
33
|
variable = node.children[0]
|
@@ -40,7 +39,7 @@ module CodeBreaker
|
|
40
39
|
|
41
40
|
def parse_if_node(node)
|
42
41
|
condition = node.children[0]
|
43
|
-
if_body
|
42
|
+
if_body = node.children[1]
|
44
43
|
else_body = node.children[2]
|
45
44
|
|
46
45
|
clause = { node.type => parse(condition), then: parse(if_body) }
|
@@ -50,8 +49,8 @@ module CodeBreaker
|
|
50
49
|
end
|
51
50
|
|
52
51
|
def parse_module_node(node)
|
53
|
-
name
|
54
|
-
body
|
52
|
+
name = parse(node.children[0])
|
53
|
+
body = node.children[1].nil? ? nil : parse(node.children[1])
|
55
54
|
value = body ? [name, body] : [name]
|
56
55
|
|
57
56
|
{ node.type => value }
|
@@ -59,7 +58,7 @@ module CodeBreaker
|
|
59
58
|
|
60
59
|
def parse_return_node(node)
|
61
60
|
children = parse_children(node)
|
62
|
-
values
|
61
|
+
values = children.length == 1 ? children[0] : children
|
63
62
|
|
64
63
|
{ node.type => values }
|
65
64
|
end
|
@@ -80,9 +79,9 @@ module CodeBreaker
|
|
80
79
|
end
|
81
80
|
|
82
81
|
def parse_case_node(node)
|
83
|
-
case_part
|
82
|
+
case_part = parse(node.children.first)
|
84
83
|
when_parts = node.children[1...-1].map { |child| parse(child) }
|
85
|
-
else_part
|
84
|
+
else_part = parse(node.children.last)
|
86
85
|
|
87
86
|
statement = { case: when_parts.unshift(case_part) }
|
88
87
|
statement[:case] << { else: else_part } if else_part
|
@@ -96,7 +95,6 @@ module CodeBreaker
|
|
96
95
|
{ when: when_part, then: then_part }
|
97
96
|
end
|
98
97
|
end
|
99
|
-
|
100
98
|
end
|
101
99
|
end
|
102
100
|
end
|
@@ -3,20 +3,27 @@ require 'active_support/concern'
|
|
3
3
|
module CodeBreaker
|
4
4
|
module Parsable
|
5
5
|
module LanguageElements
|
6
|
-
|
7
6
|
extend ActiveSupport::Concern
|
8
7
|
include Parsable::Node
|
9
8
|
|
10
9
|
included do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
10
|
+
alias_method :parse_block_node, :parse_as_hash
|
11
|
+
alias_method :parse_args_node, :parse_as_hash
|
12
|
+
alias_method :parse_arg_node, :parse_as_last_child_hash
|
13
|
+
alias_method :parse_blockarg_node, :parse_as_last_child_hash
|
14
|
+
alias_method :parse_restarg_node, :parse_as_last_child_hash
|
15
|
+
|
16
|
+
# optional argument
|
17
|
+
alias_method :parse_optarg_node, :parse_as_hash
|
18
|
+
|
19
|
+
# keyword argument
|
20
|
+
alias_method :parse_kwarg_node, :parse_as_last_child_hash
|
21
|
+
|
22
|
+
# optional keyword argument
|
23
|
+
alias_method :parse_kwoptarg_node, :parse_as_hash
|
24
|
+
|
25
|
+
# keyword rest argument
|
26
|
+
alias_method :parse_kwrestarg_node, :parse_as_last_child_hash
|
20
27
|
|
21
28
|
def parse_block_pass_node(node)
|
22
29
|
{ node.type => node.children.first.children.last }
|
@@ -24,11 +31,11 @@ module CodeBreaker
|
|
24
31
|
|
25
32
|
def parse_splat_node(node)
|
26
33
|
children = parse_children(node).flatten(1)
|
27
|
-
values
|
34
|
+
values = children.length == 1 ? children[0] : children
|
28
35
|
|
29
|
-
{ node.type =>
|
36
|
+
{ node.type => values }
|
30
37
|
end
|
31
38
|
end
|
32
39
|
end
|
33
40
|
end
|
34
|
-
end
|
41
|
+
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module CodeBreaker
|
2
2
|
module Parsable
|
3
3
|
module Node
|
4
|
-
|
5
4
|
def parse(node)
|
6
5
|
return if node.nil?
|
7
6
|
|
8
|
-
if node.
|
7
|
+
if node.is_a?(Symbol)
|
9
8
|
node
|
10
9
|
else
|
11
10
|
send("parse_#{node.type}_node", node)
|
@@ -13,7 +12,7 @@ module CodeBreaker
|
|
13
12
|
end
|
14
13
|
|
15
14
|
def parse_children(node)
|
16
|
-
node.children.
|
15
|
+
node.children.each_with_object([]) do |child, nodes|
|
17
16
|
nodes << parse(child) unless child.nil?
|
18
17
|
nodes
|
19
18
|
end
|
@@ -37,16 +36,18 @@ module CodeBreaker
|
|
37
36
|
if node_type.empty?
|
38
37
|
super
|
39
38
|
else
|
40
|
-
|
41
|
-
"Breaking the node type \"#{node_type}\" is not yet implemented.",
|
42
|
-
"You can open an issue on this in the project's Github repo under:",
|
43
|
-
"https://github.com/daigaku-ruby/code_breaker/issues/new\n"
|
44
|
-
].join("\n")
|
45
|
-
|
46
|
-
raise NotImplementedError, message
|
39
|
+
raise NotImplementedError, not_implemented_message(node_type)
|
47
40
|
end
|
48
41
|
end
|
49
42
|
|
43
|
+
def not_implemented_message(node_type)
|
44
|
+
[
|
45
|
+
%(Breaking the node type "#{node_type}" is not yet implemented.),
|
46
|
+
'You can open an issue on this in the project’s Github repo under:',
|
47
|
+
'https://github.com/daigaku-ruby/code_breaker/issues/new',
|
48
|
+
''
|
49
|
+
].join("\n")
|
50
|
+
end
|
50
51
|
end
|
51
52
|
end
|
52
53
|
end
|
@@ -3,13 +3,15 @@ require 'active_support/concern'
|
|
3
3
|
module CodeBreaker
|
4
4
|
module Parsable
|
5
5
|
module Ranges
|
6
|
-
|
7
6
|
extend ActiveSupport::Concern
|
8
7
|
include Parsable::Node
|
9
8
|
|
10
9
|
included do
|
11
|
-
|
12
|
-
|
10
|
+
# inclusive range a..b
|
11
|
+
alias_method :parse_irange_node, :parse_as_hash
|
12
|
+
|
13
|
+
# exclusive range a...b
|
14
|
+
alias_method :parse_erange_node, :parse_as_hash
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
@@ -3,16 +3,23 @@ require 'active_support/concern'
|
|
3
3
|
module CodeBreaker
|
4
4
|
module Parsable
|
5
5
|
module VariableTypes
|
6
|
-
|
7
6
|
extend ActiveSupport::Concern
|
8
7
|
include Parsable::Node
|
9
8
|
|
10
9
|
included do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
alias_method :parse_const_node, :parse_as_last_child_hash
|
11
|
+
|
12
|
+
# local variable
|
13
|
+
alias_method :parse_lvar_node, :parse_as_last_child_hash
|
14
|
+
|
15
|
+
# instance variable
|
16
|
+
alias_method :parse_ivar_node, :parse_as_last_child_hash
|
17
|
+
|
18
|
+
# class variable
|
19
|
+
alias_method :parse_cvar_node, :parse_as_last_child_hash
|
20
|
+
|
21
|
+
# global variable
|
22
|
+
alias_method :parse_gvar_node, :parse_as_last_child_hash
|
16
23
|
end
|
17
24
|
end
|
18
25
|
end
|
@@ -3,7 +3,6 @@ require 'active_support/concern'
|
|
3
3
|
module CodeBreaker
|
4
4
|
module Parsable
|
5
5
|
module Wrappers
|
6
|
-
|
7
6
|
extend ActiveSupport::Concern
|
8
7
|
include Parsable::Node
|
9
8
|
|
@@ -16,7 +15,7 @@ module CodeBreaker
|
|
16
15
|
parse_children(node).flatten(1)
|
17
16
|
end
|
18
17
|
|
19
|
-
|
18
|
+
alias_method :parse_begin_node, :parse_children
|
20
19
|
end
|
21
20
|
end
|
22
21
|
end
|
data/lib/code_breaker/parser.rb
CHANGED
data/lib/code_breaker/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: code_breaker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Götze
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -132,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
132
|
version: '0'
|
133
133
|
requirements: []
|
134
134
|
rubyforge_project:
|
135
|
-
rubygems_version: 2.4
|
135
|
+
rubygems_version: 2.6.4
|
136
136
|
signing_key:
|
137
137
|
specification_version: 4
|
138
138
|
summary: Breaking a Ruby code snippet into a sequence of classes and their connecting
|