lowkey 0.4.0 → 0.4.1
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/lib/factories/proxy_factory.rb +10 -3
- data/lib/factories/source_factory.rb +8 -2
- data/lib/interfaces/proxy.rb +1 -1
- data/lib/lowkey.rb +2 -2
- data/lib/proxies/class_proxy.rb +4 -34
- data/lib/proxies/file_proxy.rb +7 -3
- data/lib/proxies/module_proxy.rb +44 -0
- data/lib/version.rb +1 -1
- data/lib/visitors/{method_class_visitor.rb → class_visitor.rb} +2 -11
- data/lib/visitors/method_call_visitor.rb +16 -6
- data/lib/visitors/method_def_visitor.rb +7 -6
- data/lib/visitors/module_visitor.rb +40 -0
- data/lib/visitors/visitor.rb +15 -8
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a2bcc0b4b60c158051ab7da59abb915078011d30cf4a231db29ddc03f87a9af4
|
|
4
|
+
data.tar.gz: 50ed70e6d38d529f0b9d8c39cd31e3af9df2fd0f04100bf4739235d81daadb59
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2585284e511997be690bffcee538d8e8e97150ce9338b803867aafc4680f1e8caa70b4d34d8d8c4952cf8ba2cd141462ae74d7b0fad0194b5e22d3cb90ed7fb5
|
|
7
|
+
data.tar.gz: eb4a250a62dfd1cf13110095f8a4b831b9b47c282944c38f2edd642bb3f4817ddfd9fe838acd5241d0088ab93ec3d2e56c3ae6cec45dfbda2de0b84b389c019b
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative '../factories/source_factory'
|
|
4
|
+
|
|
4
5
|
require_relative '../proxies/body_proxy'
|
|
5
6
|
require_relative '../proxies/class_proxy'
|
|
6
7
|
require_relative '../proxies/file_proxy'
|
|
7
8
|
require_relative '../proxies/method_proxy'
|
|
9
|
+
require_relative '../proxies/module_proxy'
|
|
8
10
|
require_relative '../proxies/param_proxy'
|
|
9
11
|
require_relative '../proxies/return_proxy'
|
|
10
12
|
|
|
@@ -16,10 +18,15 @@ module Lowkey
|
|
|
16
18
|
FileProxy.new(root_node:, source:)
|
|
17
19
|
end
|
|
18
20
|
|
|
19
|
-
def
|
|
20
|
-
source = SourceFactory.
|
|
21
|
+
def module_proxy(node:, namespace:, file_path:, lines:)
|
|
22
|
+
source = SourceFactory.module_source(node:, namespace:, file_path:, lines:)
|
|
21
23
|
name = node.respond_to?(:name) ? node.name : 'Object'
|
|
22
|
-
|
|
24
|
+
ModuleProxy.new(node:, name:, namespace:, source:)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def class_proxy(node:, namespace:, file_path:, lines:)
|
|
28
|
+
source = SourceFactory.class_source(node:, file_path:, lines:)
|
|
29
|
+
ClassProxy.new(node:, name: node.name, namespace:, source:)
|
|
23
30
|
end
|
|
24
31
|
|
|
25
32
|
def method_proxy(method_node:, file_proxy:)
|
|
@@ -11,8 +11,7 @@ module Lowkey
|
|
|
11
11
|
Source.new(file_path:, scope: 'file', lines: root_node.script_lines, start_line: 0, end_line:)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
def class_source(node:, namespace:, file_path:, lines:)
|
|
14
|
+
def module_source(node:, namespace:, file_path:, lines:)
|
|
16
15
|
start_line = node.respond_to?(:class_keyword_loc) ? node.class_keyword_loc.start_line : 0
|
|
17
16
|
end_line = node.respond_to?(:end_keyword_loc) ? node.end_keyword_loc.end_line : start_line
|
|
18
17
|
end_line = node.end_line if namespace == 'Object'
|
|
@@ -21,6 +20,13 @@ module Lowkey
|
|
|
21
20
|
Source.new(file_path:, scope:, lines:, start_line:, end_line:)
|
|
22
21
|
end
|
|
23
22
|
|
|
23
|
+
def class_source(node:, file_path:, lines:)
|
|
24
|
+
start_line = node.respond_to?(:class_keyword_loc) ? node.class_keyword_loc.start_line : 0
|
|
25
|
+
end_line = node.respond_to?(:end_keyword_loc) ? node.end_keyword_loc.end_line : start_line
|
|
26
|
+
|
|
27
|
+
Source.new(file_path:, scope: node.name, lines:, start_line:, end_line:)
|
|
28
|
+
end
|
|
29
|
+
|
|
24
30
|
def method_source(method_node:, file_path:, lines:)
|
|
25
31
|
scope = method_node.name
|
|
26
32
|
start_line = method_node.start_line
|
data/lib/interfaces/proxy.rb
CHANGED
|
@@ -10,7 +10,7 @@ module Lowkey
|
|
|
10
10
|
|
|
11
11
|
attr_reader :name
|
|
12
12
|
|
|
13
|
-
def_delegators :@source, :file_path, :lines, :start_line, :scope
|
|
13
|
+
def_delegators :@source, :file_path, :lines, :start_line, :end_line, :scope
|
|
14
14
|
def_delegators :@source, :wrap, :export
|
|
15
15
|
|
|
16
16
|
def initialize(name:, source:)
|
data/lib/lowkey.rb
CHANGED
|
@@ -18,7 +18,7 @@ module Lowkey
|
|
|
18
18
|
keys[key]
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def load(file_path)
|
|
21
|
+
def load(file_path, cache: true)
|
|
22
22
|
root_node = Prism.parse_file(file_path).value
|
|
23
23
|
file_proxy = ProxyFactory.file_proxy(root_node:, file_path:)
|
|
24
24
|
|
|
@@ -28,7 +28,7 @@ module Lowkey
|
|
|
28
28
|
|
|
29
29
|
AdapterLoader.load(file_proxy:)
|
|
30
30
|
|
|
31
|
-
if Lowkey.config.cache
|
|
31
|
+
if Lowkey.config.cache && cache
|
|
32
32
|
map_file_path(file_proxy:)
|
|
33
33
|
map_definitions(file_proxy:)
|
|
34
34
|
end
|
data/lib/proxies/class_proxy.rb
CHANGED
|
@@ -1,45 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative '
|
|
4
|
-
require_relative '../queries/query'
|
|
3
|
+
require_relative 'module_proxy'
|
|
5
4
|
|
|
6
5
|
module Lowkey
|
|
7
|
-
class ClassProxy <
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
attr_reader :namespace
|
|
11
|
-
attr_accessor :private_start_line, :keyed_methods, :class_methods, :instance_methods, :method_calls
|
|
6
|
+
class ClassProxy < ModuleProxy
|
|
7
|
+
attr_accessor :instance_methods
|
|
12
8
|
|
|
13
9
|
def initialize(node:, name:, namespace:, source:)
|
|
14
|
-
super(name:, source:)
|
|
15
|
-
|
|
16
|
-
@node = node
|
|
17
|
-
@namespace = namespace
|
|
18
|
-
|
|
19
|
-
@private_start_line = nil
|
|
10
|
+
super(node:, name:, namespace:, source:)
|
|
20
11
|
|
|
21
|
-
@keyed_methods = {}
|
|
22
|
-
@class_methods = {}
|
|
23
12
|
@instance_methods = {}
|
|
24
|
-
|
|
25
|
-
@method_calls = []
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def [](key)
|
|
29
|
-
key.start_with?('.') ? query(node: @node, namespace: nil, name: key.delete_prefix('.')) : @keyed_methods[key]
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
class << self
|
|
33
|
-
def class_method?(method_node:, parent_map:)
|
|
34
|
-
return true if method_node.is_a?(::Prism::DefNode) && method_node.receiver.instance_of?(Prism::SelfNode) # self.method_name
|
|
35
|
-
return true if method_node.is_a?(::Prism::SingletonClassNode) # class << self
|
|
36
|
-
|
|
37
|
-
if (parent_node = parent_map[method_node])
|
|
38
|
-
return class_method?(method_node: parent_node, parent_map:)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
false
|
|
42
|
-
end
|
|
43
13
|
end
|
|
44
14
|
end
|
|
45
15
|
end
|
data/lib/proxies/file_proxy.rb
CHANGED
|
@@ -17,7 +17,7 @@ module Lowkey
|
|
|
17
17
|
@root_node = root_node
|
|
18
18
|
|
|
19
19
|
@definitions = {}
|
|
20
|
-
@dependencies =
|
|
20
|
+
@dependencies = Set.new
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def [](keypath)
|
|
@@ -29,9 +29,13 @@ module Lowkey
|
|
|
29
29
|
# TODO: Slice the lines in a file and replace with the output of the class proxy.
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
def
|
|
32
|
+
def upsert_definition(module_proxy:)
|
|
33
33
|
# TODO: Merge duplicate class with existing class.
|
|
34
|
-
@definitions[
|
|
34
|
+
@definitions[module_proxy.namespace] ||= module_proxy
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def upsert_dependency(namespace:)
|
|
38
|
+
@dependencies.add(namespace)
|
|
35
39
|
end
|
|
36
40
|
end
|
|
37
41
|
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../interfaces/proxy'
|
|
4
|
+
require_relative '../queries/query'
|
|
5
|
+
|
|
6
|
+
module Lowkey
|
|
7
|
+
class ModuleProxy < Proxy
|
|
8
|
+
include Query
|
|
9
|
+
|
|
10
|
+
attr_reader :namespace
|
|
11
|
+
attr_accessor :private_start_line, :keyed_methods, :class_methods, :method_calls
|
|
12
|
+
|
|
13
|
+
def initialize(node:, name:, namespace:, source:)
|
|
14
|
+
super(name:, source:)
|
|
15
|
+
|
|
16
|
+
@node = node
|
|
17
|
+
@namespace = namespace
|
|
18
|
+
|
|
19
|
+
@private_start_line = nil
|
|
20
|
+
|
|
21
|
+
@keyed_methods = {}
|
|
22
|
+
@class_methods = {}
|
|
23
|
+
|
|
24
|
+
@method_calls = []
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def [](key)
|
|
28
|
+
key.start_with?('.') ? query(node: @node, namespace: nil, name: key.delete_prefix('.')) : @keyed_methods[key]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class << self
|
|
32
|
+
def class_method?(method_node:, parent_map:)
|
|
33
|
+
return true if method_node.is_a?(::Prism::DefNode) && method_node.receiver.instance_of?(Prism::SelfNode) # self.method_name
|
|
34
|
+
return true if method_node.is_a?(::Prism::SingletonClassNode) # class << self
|
|
35
|
+
|
|
36
|
+
if (parent_node = parent_map[method_node])
|
|
37
|
+
return class_method?(method_node: parent_node, parent_map:)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
false
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
data/lib/version.rb
CHANGED
|
@@ -4,27 +4,18 @@ require_relative '../factories/proxy_factory'
|
|
|
4
4
|
require_relative '../queries/query'
|
|
5
5
|
|
|
6
6
|
module Lowkey
|
|
7
|
-
class
|
|
7
|
+
class ClassVisitor
|
|
8
8
|
include Query
|
|
9
9
|
|
|
10
10
|
def initialize(file_proxy:, parent_map:)
|
|
11
11
|
@file_proxy = file_proxy
|
|
12
12
|
@parent_map = parent_map
|
|
13
|
-
|
|
14
|
-
create_root_class
|
|
15
13
|
end
|
|
16
14
|
|
|
17
15
|
def visit(node)
|
|
18
16
|
namespace = namespace(node:, parent_map:)
|
|
19
17
|
class_proxy = ProxyFactory.class_proxy(node:, namespace:, file_path:, lines:)
|
|
20
|
-
@file_proxy.
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
private
|
|
24
|
-
|
|
25
|
-
def create_root_class
|
|
26
|
-
class_proxy = ProxyFactory.class_proxy(node: @file_proxy.root_node, namespace: 'Object', file_path:, lines:)
|
|
27
|
-
@file_proxy.upsert_class_proxy(class_proxy:)
|
|
18
|
+
@file_proxy.upsert_definition(module_proxy: class_proxy)
|
|
28
19
|
end
|
|
29
20
|
|
|
30
21
|
attr_reader :parent_map
|
|
@@ -13,17 +13,27 @@ module Lowkey
|
|
|
13
13
|
|
|
14
14
|
def visit(node)
|
|
15
15
|
namespace = namespace(node:, parent_map:)
|
|
16
|
-
|
|
17
|
-
class_proxy.method_calls << node
|
|
16
|
+
module_proxy = file_proxy[namespace]
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
module_proxy.method_calls << node
|
|
19
|
+
upsert_dependency(node:, namespace:)
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
return unless node.name == :private && node.respond_to?(:start_line) && module_proxy.start_line && module_proxy.end_line
|
|
22
|
+
return unless node.start_line > module_proxy.start_line && node.start_line < module_proxy.end_line
|
|
23
|
+
|
|
24
|
+
module_proxy.private_start_line = node.start_line
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
private
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
def upsert_dependency(node:, namespace:)
|
|
30
|
+
return unless %i[include extend].include?(node.name)
|
|
31
|
+
|
|
32
|
+
dependency_name = node.arguments.arguments.first.name.to_s
|
|
33
|
+
dependency_name = "#{namespace}::#{dependency_name}" unless dependency_name.start_with?('::')
|
|
34
|
+
file_proxy.upsert_dependency(namespace: dependency_name)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
attr_reader :file_proxy, :parent_map
|
|
28
38
|
end
|
|
29
39
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative '../factories/source_factory'
|
|
4
4
|
require_relative '../factories/proxy_factory'
|
|
5
|
+
require_relative '../proxies/method_proxy'
|
|
5
6
|
require_relative '../queries/query'
|
|
6
7
|
|
|
7
8
|
module Lowkey
|
|
@@ -15,16 +16,16 @@ module Lowkey
|
|
|
15
16
|
|
|
16
17
|
def visit(method_node)
|
|
17
18
|
namespace = namespace(node: method_node, parent_map:)
|
|
18
|
-
|
|
19
|
+
module_proxy = file_proxy[namespace]
|
|
19
20
|
method_proxy = ProxyFactory.method_proxy(method_node:, file_proxy:)
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
module_proxy.keyed_methods[method_node.name] = method_proxy
|
|
22
23
|
|
|
23
24
|
# TODO: Implemented as tagged methods similar to tagged params.
|
|
24
|
-
if
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
if ModuleProxy.class_method?(method_node:, parent_map:)
|
|
26
|
+
module_proxy.class_methods[method_node.name] = method_proxy
|
|
27
|
+
elsif module_proxy.class <= ClassProxy
|
|
28
|
+
module_proxy.instance_methods[method_node.name] = method_proxy
|
|
28
29
|
end
|
|
29
30
|
end
|
|
30
31
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../factories/proxy_factory'
|
|
4
|
+
require_relative '../queries/query'
|
|
5
|
+
|
|
6
|
+
module Lowkey
|
|
7
|
+
class ModuleVisitor
|
|
8
|
+
include Query
|
|
9
|
+
|
|
10
|
+
def initialize(file_proxy:, parent_map:)
|
|
11
|
+
@file_proxy = file_proxy
|
|
12
|
+
@parent_map = parent_map
|
|
13
|
+
|
|
14
|
+
create_root_module
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def visit(node)
|
|
18
|
+
namespace = namespace(node:, parent_map:)
|
|
19
|
+
module_proxy = ProxyFactory.module_proxy(node:, namespace:, file_path:, lines:)
|
|
20
|
+
@file_proxy.upsert_definition(module_proxy:)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def create_root_module
|
|
26
|
+
module_proxy = ProxyFactory.module_proxy(node: @file_proxy.root_node, namespace: 'Object', file_path:, lines:)
|
|
27
|
+
@file_proxy.upsert_definition(module_proxy:)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
attr_reader :parent_map
|
|
31
|
+
|
|
32
|
+
def file_path
|
|
33
|
+
@file_proxy.file_path
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def lines
|
|
37
|
+
@file_proxy.lines
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/visitors/visitor.rb
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative '
|
|
4
|
-
require_relative '
|
|
3
|
+
require_relative 'class_visitor'
|
|
4
|
+
require_relative 'module_visitor'
|
|
5
5
|
require_relative 'method_def_visitor'
|
|
6
|
+
require_relative 'method_call_visitor'
|
|
6
7
|
|
|
7
8
|
module Lowkey
|
|
8
9
|
class Visitor < Prism::Visitor
|
|
9
10
|
def initialize(file_proxy:, parent_map:)
|
|
10
|
-
@
|
|
11
|
-
@
|
|
11
|
+
@class_visitor = ClassVisitor.new(file_proxy:, parent_map:)
|
|
12
|
+
@module_visitor = ModuleVisitor.new(file_proxy:, parent_map:)
|
|
12
13
|
@method_def_visitor = MethodDefVisitor.new(file_proxy:, parent_map:)
|
|
14
|
+
@method_call_visitor = MethodCallVisitor.new(file_proxy:, parent_map:)
|
|
13
15
|
end
|
|
14
16
|
|
|
15
|
-
def
|
|
16
|
-
@
|
|
17
|
+
def visit_class_node(node)
|
|
18
|
+
@class_visitor.visit(node)
|
|
17
19
|
super
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
def
|
|
21
|
-
@
|
|
22
|
+
def visit_module_node(node)
|
|
23
|
+
@module_visitor.visit(node)
|
|
22
24
|
super
|
|
23
25
|
end
|
|
24
26
|
|
|
@@ -26,5 +28,10 @@ module Lowkey
|
|
|
26
28
|
@method_def_visitor.visit(node)
|
|
27
29
|
super
|
|
28
30
|
end
|
|
31
|
+
|
|
32
|
+
def visit_call_node(node)
|
|
33
|
+
@method_call_visitor.visit(node)
|
|
34
|
+
super
|
|
35
|
+
end
|
|
29
36
|
end
|
|
30
37
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lowkey
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.4.
|
|
4
|
+
version: 0.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- maedi
|
|
@@ -44,13 +44,15 @@ files:
|
|
|
44
44
|
- lib/proxies/class_proxy.rb
|
|
45
45
|
- lib/proxies/file_proxy.rb
|
|
46
46
|
- lib/proxies/method_proxy.rb
|
|
47
|
+
- lib/proxies/module_proxy.rb
|
|
47
48
|
- lib/proxies/param_proxy.rb
|
|
48
49
|
- lib/proxies/return_proxy.rb
|
|
49
50
|
- lib/queries/query.rb
|
|
50
51
|
- lib/version.rb
|
|
52
|
+
- lib/visitors/class_visitor.rb
|
|
51
53
|
- lib/visitors/method_call_visitor.rb
|
|
52
|
-
- lib/visitors/method_class_visitor.rb
|
|
53
54
|
- lib/visitors/method_def_visitor.rb
|
|
55
|
+
- lib/visitors/module_visitor.rb
|
|
54
56
|
- lib/visitors/visitor.rb
|
|
55
57
|
homepage: https://github.com/low-rb/lowkey
|
|
56
58
|
licenses: []
|