lowkey 0.6.0 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a54c7a7c2d38827bf0eec31f56a83ca054e46b44312ee2ead8a39d0630f00c8
4
- data.tar.gz: 4e77aca4128ce3cec24cd077c75922aa8a2ef22e6cccb76fefbab0cbfe41f5c0
3
+ metadata.gz: df07c14efcf3addf6d3df7c5a1a84b7ca60cb6334953b0f2d2446c10f479b5ac
4
+ data.tar.gz: 7b36824688cb4b2b1c7edbe8aef25d2f5dbd14a339749d91e37ca61733fca4e5
5
5
  SHA512:
6
- metadata.gz: 5a76a77c867d1051d553f8af3309dc389b3d8b37e168cd7152e954625306f2666dd4ab8b3ac78c2a5c2063a4adfa7b738a5f3cadb220c3bd6804fedeaf42dd8d
7
- data.tar.gz: ee32de9dd6b3fe80c96422744ba8077605babe0ed3d5ffaa9a28a8609fd20873bd404dd04b3e453628b6567e909575c33f9159fa65120a891e319df15372327e
6
+ metadata.gz: 87b8cd86f86037131b3ae4dea4c5b1e963adbae2eadd47b2c256843301c001608d5cdd4e8c76a2508c0ab84f372b40413c3c2a025143c3e3efe9bd73c8d5e74c
7
+ data.tar.gz: 5ea4f138dbe0d41a2f8643d13bba10f94b5ac61b31da0c964eeeb8858ba15f7c35a744bee48b73aca27dfe3bb982b7352b3ababd1bbd0411c17dfdb1072b1432
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/
@@ -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.0'
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.0
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: 2026-10-20 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