code-ruby 0.14.2 → 0.14.3
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/Gemfile.lock +7 -3
- data/code-ruby.gemspec +1 -0
- data/lib/code/node/left_operation.rb +27 -0
- data/lib/code/parser/chained_call.rb +1 -1
- data/lib/code/version.rb +1 -1
- data/lib/code-ruby.rb +1 -0
- data/spec/code_spec.rb +18 -5
- metadata +16 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 233f0dfedc9a65226d48e1ed04141b5f8a0ddfc59dde5fc3d25aea8dc724ac70
|
|
4
|
+
data.tar.gz: 89f47760f80263b9e8628feb171daf966f419db4d913a712ec798f010c39b99e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7483f8c33f580dfbab367f51aee7fa8a7c881140da892e4f0b88fa24de74eab7d0f95196f7410f598641e5493b5a472f45eded18a341bb9cbac525998520ab7f
|
|
7
|
+
data.tar.gz: 422a8bd841bd6451be58a4e8127af024fd01ae1605eddcb9aa63c6737a18a8d2bd15ba9c838a90ba69456d216779e179e78811c1fe49768c3eaba8cf61e64662
|
data/Gemfile.lock
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
code-ruby (0.14.
|
|
4
|
+
code-ruby (0.14.3)
|
|
5
5
|
activesupport (~> 7)
|
|
6
6
|
bigdecimal (~> 3)
|
|
7
|
+
did-you-mean (~> 0)
|
|
7
8
|
json (~> 2)
|
|
8
9
|
language-ruby (~> 0)
|
|
9
10
|
zeitwerk (~> 2)
|
|
@@ -29,6 +30,8 @@ GEM
|
|
|
29
30
|
thor (~> 1.0)
|
|
30
31
|
concurrent-ruby (1.2.3)
|
|
31
32
|
connection_pool (2.4.1)
|
|
33
|
+
did-you-mean (0.1.1)
|
|
34
|
+
levenshtein (>= 0.2.0)
|
|
32
35
|
diff-lcs (1.5.1)
|
|
33
36
|
drb (2.2.1)
|
|
34
37
|
i18n (1.14.4)
|
|
@@ -37,6 +40,7 @@ GEM
|
|
|
37
40
|
language-ruby (0.8.1)
|
|
38
41
|
zeitwerk (~> 2)
|
|
39
42
|
language_server-protocol (3.17.0.3)
|
|
43
|
+
levenshtein (0.2.2)
|
|
40
44
|
minitest (5.22.3)
|
|
41
45
|
mutex_m (0.2.0)
|
|
42
46
|
parallel (1.24.0)
|
|
@@ -44,7 +48,7 @@ GEM
|
|
|
44
48
|
ast (~> 2.4.1)
|
|
45
49
|
racc
|
|
46
50
|
racc (1.7.3)
|
|
47
|
-
rack (3.0.
|
|
51
|
+
rack (3.0.10)
|
|
48
52
|
rainbow (3.1.1)
|
|
49
53
|
rake (13.1.0)
|
|
50
54
|
regexp_parser (2.9.0)
|
|
@@ -115,4 +119,4 @@ RUBY VERSION
|
|
|
115
119
|
ruby 3.3.0p0
|
|
116
120
|
|
|
117
121
|
BUNDLED WITH
|
|
118
|
-
2.5.
|
|
122
|
+
2.5.7
|
data/code-ruby.gemspec
CHANGED
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
|
18
18
|
|
|
19
19
|
s.add_dependency "activesupport", "~> 7"
|
|
20
20
|
s.add_dependency "bigdecimal", "~> 3"
|
|
21
|
+
s.add_dependency "did-you-mean", "~> 0"
|
|
21
22
|
s.add_dependency "json", "~> 2"
|
|
22
23
|
s.add_dependency "language-ruby", "~> 0"
|
|
23
24
|
s.add_dependency "zeitwerk", "~> 2"
|
|
@@ -6,6 +6,11 @@ class Code
|
|
|
6
6
|
class Operator < Node
|
|
7
7
|
DOT = "."
|
|
8
8
|
COLON_COLON = "::"
|
|
9
|
+
AMPERSAND_DOT = "&."
|
|
10
|
+
OR_KEYWORD = "or"
|
|
11
|
+
PIPE_PIPE = "||"
|
|
12
|
+
AND_KEYWORD = "and"
|
|
13
|
+
AMPERSAND_AMPERSAND = "&&"
|
|
9
14
|
|
|
10
15
|
attr_reader :operator, :statement
|
|
11
16
|
|
|
@@ -19,6 +24,18 @@ class Code
|
|
|
19
24
|
def call?
|
|
20
25
|
operator == DOT || operator == COLON_COLON
|
|
21
26
|
end
|
|
27
|
+
|
|
28
|
+
def safe_call?
|
|
29
|
+
operator == AMPERSAND_DOT
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def or?
|
|
33
|
+
operator == OR_KEYWORD || operator == PIPE_PIPE
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def and?
|
|
37
|
+
operator == AND_KEYWORD || operator == AMPERSAND_AMPERSAND
|
|
38
|
+
end
|
|
22
39
|
end
|
|
23
40
|
|
|
24
41
|
def initialize(parsed)
|
|
@@ -35,6 +52,16 @@ class Code
|
|
|
35
52
|
@others.reduce(first) do |left, right|
|
|
36
53
|
if right.call?
|
|
37
54
|
right.statement.evaluate(**args, object: left)
|
|
55
|
+
elsif right.safe_call?
|
|
56
|
+
if left.is_an?(Object::Nothing)
|
|
57
|
+
Object::Nothing.new
|
|
58
|
+
else
|
|
59
|
+
right.statement.evaluate(**args, object: left)
|
|
60
|
+
end
|
|
61
|
+
elsif right.or? && left.truthy?
|
|
62
|
+
left
|
|
63
|
+
elsif right.and? && left.falsy?
|
|
64
|
+
left
|
|
38
65
|
else
|
|
39
66
|
left.call(
|
|
40
67
|
**args,
|
data/lib/code/version.rb
CHANGED
data/lib/code-ruby.rb
CHANGED
data/spec/code_spec.rb
CHANGED
|
@@ -273,14 +273,27 @@ RSpec.describe Code do
|
|
|
273
273
|
%w[1.1.to_json '"1.1"'],
|
|
274
274
|
["a = {} a.merge!(a: 1) a", "{a: 1}"],
|
|
275
275
|
["a = {} a.merge(a: 1) a", "{}"],
|
|
276
|
+
["1&.even?", "false"],
|
|
277
|
+
["nothing&.even? || 1", "1"],
|
|
278
|
+
["nothing&.even? && 1", "nothing"],
|
|
279
|
+
["2&.even?", "true"],
|
|
280
|
+
["a = 1 a&.even?", "false"],
|
|
281
|
+
["a = 2 a&.even?", "true"],
|
|
282
|
+
["a = nothing a&.even?", "nothing"],
|
|
283
|
+
["false && puts(:Hello)", "false"],
|
|
284
|
+
["true || puts(:Hello)", "true"],
|
|
285
|
+
["false and puts(:Hello)", "false"],
|
|
286
|
+
["true or puts(:Hello)", "true"],
|
|
276
287
|
["", ""]
|
|
277
288
|
].each do |input, expected|
|
|
278
289
|
it "#{input} == #{expected}" do
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
)
|
|
290
|
+
output = StringIO.new
|
|
291
|
+
input = Code.evaluate(input, output:)
|
|
292
|
+
expected = Code.evaluate(expected)
|
|
293
|
+
expect(input).to eq(expected)
|
|
294
|
+
expect(output.string).to eq("")
|
|
295
|
+
next if input.is_a?(Code::Object::Decimal)
|
|
296
|
+
expect(input.to_json).to eq(expected.to_json)
|
|
284
297
|
end
|
|
285
298
|
end
|
|
286
299
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: code-ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.14.
|
|
4
|
+
version: 0.14.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dorian Marié
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-03-
|
|
11
|
+
date: 2024-03-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -38,6 +38,20 @@ dependencies:
|
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '3'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: did-you-mean
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
41
55
|
- !ruby/object:Gem::Dependency
|
|
42
56
|
name: json
|
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|