dissociated_introspection 0.9.1 → 0.11.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
- SHA1:
3
- metadata.gz: 943e04bc256389529fa5d43a1e0cba4fbb8a1451
4
- data.tar.gz: 6651fde5dde7b492b0adc926d96f5b1be689d0db
2
+ SHA256:
3
+ metadata.gz: 882e7dbe56d7d2cf361e7d572a72c955c74d58e0918140255ce15606a6f3cb3d
4
+ data.tar.gz: df0f04acc33076c45a5c2eb0a7c1d1d2ac40f901b931fbacfbd75210c5241068
5
5
  SHA512:
6
- metadata.gz: b4ab2267f0cccdcd2e8b6512f5ca6f33b85a4bf4cc0842b2b380b9dc2ce23741de14276cf2b205aaac312b1388ffc3e4a450f97d0a9d3852738223370195770d
7
- data.tar.gz: 1e22d5ec0bb0b2a23eb690c61bfdde2a4b0299b441e947a8929a3d72183db59a68f2dc03aa0c9832e0e260bfa9a6024c59f4cb7aa4066b7a3da15aaf5ea6b0f1
6
+ metadata.gz: 91404ea1dddef2e77f98c9c81d0e73c4280a9313426c7ecd745a18e72aca525f78ac68d41c5f9ab393bd9284ac4133a293d70898e1416dbaabd6f22467d216b6
7
+ data.tar.gz: ced0ed7383e7a6ebf0b4c51a4ce5afffbeabaf5523131bdf5245578be4c7d48268653293be12712a26852928f5b3f85f318820749364308970d5069ebb9b036f
data/.travis.yml CHANGED
@@ -1,8 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.9
4
- - 2.2.7
5
- - 2.3.4
6
- - 2.4.1
3
+ - 2.2.9
4
+ - 2.3.7
5
+ - 2.4.4
6
+ - 2.5.1
7
7
  sudo: false
8
8
  cache: bundler
data/CHANGELOG.md CHANGED
@@ -1,6 +1,19 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## 0.11.0 - 2018-08-01
5
+ ### Enhancement
6
+ - Ability to Inline local methods with the exception of ones with arguments passed.
7
+
8
+ ## 0.10.0 - 2018-07-28
9
+ ### Fix
10
+ - Require Ruby core lib resources. (Forwardable, Pathname)
11
+ - Deal with change in how Ruby order's it's constants.
12
+ ### Enhancement
13
+ - RubyClass::Def methods return RubyCode object so that AST could be inspected
14
+ ### Deprecation
15
+ - Dropping support for Ruby version 2.1
16
+
4
17
  ## 0.9.1 - 2018-01-16
5
18
  ### Fix
6
19
  - `DissociatedIntrospection::RubyClass#class_begin` added back to public API
@@ -19,10 +19,10 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.required_ruby_version = '>= 2.1'
22
+ spec.required_ruby_version = '>= 2.2'
23
23
 
24
- spec.add_runtime_dependency "parser", "~> 2.1", ">= 2.1.9"
25
- spec.add_runtime_dependency "unparser", "~> 0.2", ">= 0.2.6"
24
+ spec.add_runtime_dependency "parser", "~> 2.2", ">= 2.2.1"
25
+ spec.add_runtime_dependency "unparser", "~> 0.2", ">= 0.2.8"
26
26
 
27
27
  spec.add_development_dependency "bundler", "~> 1.9"
28
28
  spec.add_development_dependency "rake", "~> 10.0"
@@ -1,12 +1,15 @@
1
1
  require 'parser/current'
2
2
  require 'unparser'
3
+ require 'forwardable'
3
4
  require 'dissociated_introspection/version'
4
5
  require 'dissociated_introspection/try'
5
6
  require 'dissociated_introspection/eval_sandbox'
6
7
  require 'dissociated_introspection/wrap_in_modules'
7
8
  require 'dissociated_introspection/ruby_code'
8
9
  require 'dissociated_introspection/ruby_class'
10
+ require 'dissociated_introspection/ruby_class/create_def'
9
11
  require 'dissociated_introspection/ruby_class/def'
12
+ require 'dissociated_introspection/method_in_liner'
10
13
  require 'dissociated_introspection/inspection'
11
14
  require 'dissociated_introspection/method_call'
12
15
 
@@ -11,7 +11,7 @@ module DissociatedIntrospection
11
11
  def call
12
12
  module_namespace.module_eval(recording_parent.read, recording_parent.path)
13
13
  module_namespace.module_eval(file.read, file.path)
14
- module_namespace.const_get(module_namespace.constants.last)
14
+ module_namespace.const_get(module_namespace.constants.select{|c| c != :RecordingParent}.last)
15
15
  end
16
16
 
17
17
  def constants
@@ -27,4 +27,4 @@ module DissociatedIntrospection
27
27
  end
28
28
 
29
29
  end
30
- end
30
+ end
@@ -1,8 +1,8 @@
1
1
  require 'ostruct'
2
+ require "pathname"
2
3
 
3
4
  module DissociatedIntrospection
4
5
  class Inspection
5
-
6
6
  # @param file [File]
7
7
  # @optional parent_class_replacement [Symbol]
8
8
  def initialize(file:, parent_class_replacement: :RecordingParent)
@@ -0,0 +1,40 @@
1
+ module DissociatedIntrospection
2
+ class MethodInLiner
3
+ attr_reader :defs, :ruby_code
4
+ # @param [Array<DissociatedIntrospection::RubyClass::Def>] defs
5
+ # @param [DissociatedIntrospection::RubyCode] ruby_code
6
+ def initialize(ruby_code, defs:)
7
+ @defs = defs
8
+ @ruby_code = ruby_code
9
+ end
10
+
11
+ # @return [DissociatedIntrospection::RubyCode]
12
+ def in_line
13
+ rewriter = InLiner.new
14
+ rewriter.defs = defs
15
+ result = rewriter.process(ruby_code.ast)
16
+ RubyCode.build_from_ast(result)
17
+ end
18
+
19
+ class InLiner < Parser::TreeRewriter
20
+ attr_accessor :defs
21
+
22
+ def on_send(node)
23
+ called_on, method_name, *args = *node
24
+ # TODO: Deal with args by replacing lvar with passed objects
25
+ return super unless args.empty? && called_on_self?(called_on)
26
+ called_method = called_method(method_name)
27
+ return super unless called_method
28
+ node.updated(called_method.body.ast.type, called_method.body.ast.children)
29
+ end
30
+
31
+ def called_on_self?(called_on)
32
+ called_on.nil? || called_on.type == :self
33
+ end
34
+
35
+ def called_method(method_name)
36
+ defs.detect { |_def| _def.name == method_name }
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,7 +1,5 @@
1
1
  class RecordingParent < BasicObject
2
-
3
2
  class << self
4
-
5
3
  def method_missing(m, *args, &block)
6
4
  __missing_class_macros__.push({ m => [args, block].compact })
7
5
  end
@@ -4,6 +4,7 @@ module DissociatedIntrospection
4
4
  extend Forwardable
5
5
  using Try
6
6
 
7
+ # @param [DissociatedIntrospection::RubyCode, String, Parse::AST, Hash{source: String, parse_with_comments: [Boolean]}] ruby_code
7
8
  def initialize(ruby_code)
8
9
  @ruby_code = if ruby_code.is_a?(Hash) && ruby_code.key?(:source)
9
10
  RubyCode.build_from_source(
@@ -64,12 +65,12 @@ module DissociatedIntrospection
64
65
  self.class.new(RubyCode.build_from_ast(new_ast, comments: comments))
65
66
  end
66
67
 
67
- # @return [DissociatedIntrospection::RubyClass::Def]
68
+ # @return [Array<DissociatedIntrospection::RubyClass::Def>]
68
69
  def defs
69
70
  class_begin.children.select { |n| n.try(:type) == :def }.map(&method(:create_def))
70
71
  end
71
72
 
72
- # @return [DissociatedIntrospection::RubyClass::Def]
73
+ # @return [Array<DissociatedIntrospection::RubyClass::Def>]
73
74
  def class_defs
74
75
  ns = class_begin.children.select { |n| :defs == n.try(:type) }.map do |n|
75
76
  create_def(n.updated(:def, n.children[1..-1]))
@@ -81,6 +82,7 @@ module DissociatedIntrospection
81
82
  [*ns, *ns2]
82
83
  end
83
84
 
85
+ # @private
84
86
  def inspect_methods(type=:instance_methods)
85
87
  public_send(if type == :instance_methods
86
88
  :defs
@@ -143,10 +145,7 @@ module DissociatedIntrospection
143
145
  private
144
146
 
145
147
  def create_def(n)
146
- def_comments = comments.select do |comment|
147
- comment.location.last_line+1 == n.location.first_line
148
- end
149
- Def.new(RubyCode.build_from_ast(n, comments: def_comments))
148
+ CreateDef.new(n, comments).create
150
149
  end
151
150
 
152
151
  def scrub_inner_classes_ast
@@ -156,7 +155,7 @@ module DissociatedIntrospection
156
155
  end
157
156
 
158
157
  def find_class
159
- depth_first_search(ast, :class)
158
+ depth_first_search(ast, :class) || ast
160
159
  end
161
160
 
162
161
  def depth_first_search(node, target, stop=nil)
@@ -0,0 +1,19 @@
1
+ module DissociatedIntrospection
2
+ class RubyClass
3
+ class CreateDef
4
+ attr_reader :ast, :comments
5
+
6
+ def initialize(ast, comments)
7
+ @ast = ast
8
+ @comments = comments
9
+ end
10
+
11
+ def create
12
+ def_comments = comments.select do |comment|
13
+ comment.location.last_line + 1 == ast.location.first_line
14
+ end
15
+ Def.new(RubyCode.build_from_ast(ast, comments: def_comments))
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,28 +1,41 @@
1
1
  module DissociatedIntrospection
2
2
  class RubyClass
3
3
  class Def
4
-
4
+ # @param [DissociatedIntrospection::RubyClass] ruby_code
5
5
  def initialize(ruby_code)
6
6
  @ruby_code = ruby_code
7
7
  end
8
8
 
9
+ # @return [Symbol, NilClass]
9
10
  def name
10
11
  ruby_code.ast.children[0]
11
12
  end
12
13
 
14
+ # @return [DissociatedIntrospection::RubyClass]
13
15
  def arguments
14
- Unparser.unparse(ruby_code.ast.children[1])
16
+ RubyCode.build_from_ast(ruby_code.ast.children[1])
15
17
  end
16
18
 
19
+ # @return [DissociatedIntrospection::RubyClass]
17
20
  def body
18
- Unparser.unparse(ruby_code.ast.children[2])
21
+ RubyCode.build_from_ast(ruby_code.ast.children[2])
19
22
  end
20
23
 
24
+ # @return [String]
21
25
  def source
22
26
  ruby_code.source
23
27
  end
24
28
 
25
- private
29
+ def to_s
30
+ ruby_code.source
31
+ end
32
+
33
+ # @return [Parser::AST]
34
+ def ast
35
+ ruby_code.ast
36
+ end
37
+
38
+ # @return [DissociatedIntrospection::RubyClass]
26
39
  attr_reader :ruby_code
27
40
  end
28
41
  end
@@ -52,6 +52,7 @@ module DissociatedIntrospection
52
52
  def source
53
53
  @source = @source.nil? ? source_from_ast : @source
54
54
  end
55
+ alias_method :to_s, :source
55
56
 
56
57
  # @return [String]
57
58
  def source_from_ast
@@ -1,3 +1,3 @@
1
1
  module DissociatedIntrospection
2
- VERSION = "0.9.1"
2
+ VERSION = "0.11.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dissociated_introspection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dustin Zeisler
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-16 00:00:00.000000000 Z
11
+ date: 2018-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.1'
19
+ version: '2.2'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 2.1.9
22
+ version: 2.2.1
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '2.1'
29
+ version: '2.2'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 2.1.9
32
+ version: 2.2.1
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: unparser
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: '0.2'
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 0.2.6
42
+ version: 0.2.8
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,7 +49,7 @@ dependencies:
49
49
  version: '0.2'
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: 0.2.6
52
+ version: 0.2.8
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: bundler
55
55
  requirement: !ruby/object:Gem::Requirement
@@ -116,8 +116,10 @@ files:
116
116
  - lib/dissociated_introspection/eval_sandbox.rb
117
117
  - lib/dissociated_introspection/inspection.rb
118
118
  - lib/dissociated_introspection/method_call.rb
119
+ - lib/dissociated_introspection/method_in_liner.rb
119
120
  - lib/dissociated_introspection/recording_parent.rb
120
121
  - lib/dissociated_introspection/ruby_class.rb
122
+ - lib/dissociated_introspection/ruby_class/create_def.rb
121
123
  - lib/dissociated_introspection/ruby_class/def.rb
122
124
  - lib/dissociated_introspection/ruby_code.rb
123
125
  - lib/dissociated_introspection/try.rb
@@ -135,7 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
135
137
  requirements:
136
138
  - - ">="
137
139
  - !ruby/object:Gem::Version
138
- version: '2.1'
140
+ version: '2.2'
139
141
  required_rubygems_version: !ruby/object:Gem::Requirement
140
142
  requirements:
141
143
  - - ">="
@@ -143,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
145
  version: '0'
144
146
  requirements: []
145
147
  rubyforge_project:
146
- rubygems_version: 2.6.11
148
+ rubygems_version: 2.7.7
147
149
  signing_key:
148
150
  specification_version: 4
149
151
  summary: Introspect methods, parameters, class macros, and constants without loading