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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 29b11d6aea2b779089fd087a90495983424bc601eed544dd05275067a6e4f42d
4
- data.tar.gz: 0a712a5ff40e024de4b38c00899d9d63b899595e14a2a17e636241da9caf65ed
3
+ metadata.gz: a2bcc0b4b60c158051ab7da59abb915078011d30cf4a231db29ddc03f87a9af4
4
+ data.tar.gz: 50ed70e6d38d529f0b9d8c39cd31e3af9df2fd0f04100bf4739235d81daadb59
5
5
  SHA512:
6
- metadata.gz: ec78422aac7af3ec938be6e39a2bda2d2c85824d6060df0ceb655062abc8b539a2af1ed0c739043ee6820c1ef5e5395af89cc63383f4f42624692f138d105436
7
- data.tar.gz: cd35dcf2ffe61ff07568e8aeb0db5632da57c6927bb7946118f31f98ee942e3dbeff58c537a6654f2b195edc9d2ef9eda06956c4af8f67958cbf09018d257bbd
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 class_proxy(node:, namespace:, file_path:, lines:)
20
- source = SourceFactory.class_source(node:, namespace:, file_path:, lines:)
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
- ClassProxy.new(node:, name:, namespace:, source:)
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
- # @param node: Either the class node or the main object node.
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
@@ -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
@@ -1,45 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../interfaces/proxy'
4
- require_relative '../queries/query'
3
+ require_relative 'module_proxy'
5
4
 
6
5
  module Lowkey
7
- class ClassProxy < Proxy
8
- include Query
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
@@ -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 upsert_class_proxy(class_proxy:)
32
+ def upsert_definition(module_proxy:)
33
33
  # TODO: Merge duplicate class with existing class.
34
- @definitions[class_proxy.namespace] ||= class_proxy
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lowkey
4
- VERSION = '0.4.0'
4
+ VERSION = '0.4.1'
5
5
  end
@@ -4,27 +4,18 @@ require_relative '../factories/proxy_factory'
4
4
  require_relative '../queries/query'
5
5
 
6
6
  module Lowkey
7
- class MethodClassVisitor
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.upsert_class_proxy(class_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
- class_proxy = @file_proxy[namespace]
17
- class_proxy.method_calls << node
16
+ module_proxy = file_proxy[namespace]
18
17
 
19
- return unless node.name == :private && node.respond_to?(:start_line) && class_proxy.start_line && class_proxy.end_line
20
- return unless node.start_line > class_proxy.start_line && node.start_line < class_proxy.end_line
18
+ module_proxy.method_calls << node
19
+ upsert_dependency(node:, namespace:)
21
20
 
22
- class_proxy.private_start_line = node.start_line
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
- attr_reader :parent_map
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
- class_proxy = file_proxy[namespace]
19
+ module_proxy = file_proxy[namespace]
19
20
  method_proxy = ProxyFactory.method_proxy(method_node:, file_proxy:)
20
21
 
21
- class_proxy.keyed_methods[method_node.name] = method_proxy
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 ClassProxy.class_method?(method_node:, parent_map:)
25
- class_proxy.class_methods[method_node.name] = method_proxy
26
- else
27
- class_proxy.instance_methods[method_node.name] = method_proxy
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
@@ -1,24 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'method_call_visitor'
4
- require_relative 'method_class_visitor'
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
- @method_call_visitor = MethodCallVisitor.new(file_proxy:, parent_map:)
11
- @method_class_visitor = MethodClassVisitor.new(file_proxy:, parent_map:)
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 visit_call_node(node)
16
- @method_call_visitor.visit(node)
17
+ def visit_class_node(node)
18
+ @class_visitor.visit(node)
17
19
  super
18
20
  end
19
21
 
20
- def visit_class_node(node)
21
- @method_class_visitor.visit(node)
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.0
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: []