lowkey 0.6.0 → 0.7.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: 1a54c7a7c2d38827bf0eec31f56a83ca054e46b44312ee2ead8a39d0630f00c8
4
- data.tar.gz: 4e77aca4128ce3cec24cd077c75922aa8a2ef22e6cccb76fefbab0cbfe41f5c0
3
+ metadata.gz: 5990301db8e248a6bc99c209512593b48d6e97c34070e8f9389b69648be06c2f
4
+ data.tar.gz: 4d7ce17a69589f2103b03f446d583bfc128089fe4224c9f4fa91aaa87ac75fb6
5
5
  SHA512:
6
- metadata.gz: 5a76a77c867d1051d553f8af3309dc389b3d8b37e168cd7152e954625306f2666dd4ab8b3ac78c2a5c2063a4adfa7b738a5f3cadb220c3bd6804fedeaf42dd8d
7
- data.tar.gz: ee32de9dd6b3fe80c96422744ba8077605babe0ed3d5ffaa9a28a8609fd20873bd404dd04b3e453628b6567e909575c33f9159fa65120a891e319df15372327e
6
+ metadata.gz: 9feb9cc6d8e19325ada9fa42d043c3bcade1d3c6004f98c7c8febd74768c1dd84a822820edbfc82308409595322fb9c1d6c2c26d864c98431a535599cd23e826
7
+ data.tar.gz: 10328e823b9ff040080a0671794887207e9458173fba13db61552755b88c3237cf9376950b961df17cf2ac3b1e774494f2cf00c8c81b025dfe73b20e4bcfc812
data/lib/lowkey.rb CHANGED
@@ -7,6 +7,7 @@ require_relative 'factories/proxy_factory'
7
7
  require_relative 'maps/parent_map'
8
8
  require_relative 'visitors/visitor'
9
9
  require_relative 'proxies/file_proxy'
10
+ require_relative 'queries/value_parser'
10
11
 
11
12
  module Lowkey
12
13
  NAMESPACE_PATTERN = /\A[A-Z]\w*(::[A-Z]\w*)*\z/
data/lib/queries/query.rb CHANGED
@@ -4,6 +4,9 @@ require 'prism'
4
4
 
5
5
  module Lowkey
6
6
  module Query
7
+ # Prism 2 renamed MissingNode to ErrorRecoveryNode.
8
+ MISSING_NODE = defined?(Prism::ErrorRecoveryNode) ? Prism::ErrorRecoveryNode : Prism::MissingNode
9
+
7
10
  # TODO: Make name a keypath.
8
11
  def query(node:, namespace:, name:) # rubocop:disable Lint/UnusedMethodArgument
9
12
  node.breadth_first_search do |n|
@@ -30,7 +33,7 @@ module Lowkey
30
33
 
31
34
  def resolve_namespace_path(node:, parent_map:)
32
35
  # When inside RBX, Prism thinks we're defining a class because of "<".
33
- return nil if node.respond_to?(:constant_path) && node.constant_path.is_a?(Prism::MissingNode)
36
+ return nil if node.respond_to?(:constant_path) && node.constant_path.is_a?(MISSING_NODE)
34
37
  return '' if (parent = parent_map[node]).nil?
35
38
 
36
39
  path = namespace_path(node: parent, parent_map:)
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'prism'
4
+
5
+ module Lowkey
6
+ # Reads Ruby values like nil, true, 'text', 3, -1.5 or :symbol from Prism nodes or text, without evaluating any code.
7
+ # Ignores potentially malicious values like variables, method calls or interpolated strings.
8
+ module ValueParser
9
+ VALUE_NODES = [
10
+ Prism::NilNode,
11
+ Prism::TrueNode,
12
+ Prism::FalseNode,
13
+ Prism::IntegerNode,
14
+ Prism::FloatNode,
15
+ Prism::StringNode,
16
+ Prism::SymbolNode
17
+ ].freeze
18
+
19
+ VALUE_KEYWORDS = %w[nil true false].freeze
20
+ VALUE_STARTS = ["'", '"', ':', '-', *'0'..'9'].freeze
21
+
22
+ module_function
23
+
24
+ # Returns the AST node's value or yields a block.
25
+ def parse(input)
26
+ return yield(input) unless possible_value?(input)
27
+
28
+ result = Prism.parse(input)
29
+ statements = result.value.statements.body
30
+ return yield(input) unless result.errors.empty? && statements.one? && value?(statements.first)
31
+
32
+ value(statements.first)
33
+ end
34
+
35
+ def possible_value?(input)
36
+ text = input.strip
37
+ VALUE_KEYWORDS.include?(text) || text.start_with?(*VALUE_STARTS)
38
+ end
39
+
40
+ def value?(node)
41
+ VALUE_NODES.include?(node.class)
42
+ end
43
+
44
+ # Returns the AST node's value or yields a block.
45
+ def value(node)
46
+ case node
47
+ when Prism::NilNode then nil
48
+ when Prism::TrueNode then true
49
+ when Prism::FalseNode then false
50
+ when Prism::StringNode then node.unescaped
51
+ when Prism::SymbolNode then node.unescaped.to_sym
52
+ when Prism::IntegerNode, Prism::FloatNode then node.value
53
+ else yield
54
+ end
55
+ end
56
+ end
57
+ 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.6.0'
4
+ VERSION = '0.7.1'
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lowkey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-10-17 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: prism
@@ -50,6 +50,7 @@ files:
50
50
  - lib/proxies/param_proxy.rb
51
51
  - lib/proxies/return_proxy.rb
52
52
  - lib/queries/query.rb
53
+ - lib/queries/value_parser.rb
53
54
  - lib/version.rb
54
55
  - lib/visitors/class_visitor.rb
55
56
  - lib/visitors/method_call_visitor.rb
@@ -75,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
76
  - !ruby/object:Gem::Version
76
77
  version: '0'
77
78
  requirements: []
78
- rubygems_version: 3.6.2
79
+ rubygems_version: 4.0.6
79
80
  specification_version: 4
80
81
  summary: An API for accessing PRISM metadata easily and efficiently
81
82
  test_files: []