code-ruby 0.14.2 → 0.14.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7027d0ca2225f4adf54f980dd7d08b7fa07c10c40c7e04b8e67e651a300f77b7
4
- data.tar.gz: f652f053f3bb7710629deea3ad6cb0684c6117f1475cace386c4ea5005649eca
3
+ metadata.gz: 233f0dfedc9a65226d48e1ed04141b5f8a0ddfc59dde5fc3d25aea8dc724ac70
4
+ data.tar.gz: 89f47760f80263b9e8628feb171daf966f419db4d913a712ec798f010c39b99e
5
5
  SHA512:
6
- metadata.gz: 5ecea3358e470e50cb5571c0c5094837a1eb7fd68043e803d18dc3b691686e246cc0cb93a1a89fd4fbe1448b0dc45841883e4938b8510f9df6d45d7091d57447
7
- data.tar.gz: 3c0d475b0420dd3a937dd0f2dcff648bc2d1924b0639415c3096e79429dda1e787579a684aa3ce8b236739b590f72ebfb2049c901224288fadfca4ce25c5c183
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.1)
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.9.1)
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.6
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,
@@ -20,7 +20,7 @@ class Code
20
20
  end
21
21
 
22
22
  def right_statement
23
- Rescue
23
+ ChainedCall
24
24
  end
25
25
 
26
26
  def operator
data/lib/code/version.rb CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  require_relative "../code"
4
4
 
5
- Code::Version = Gem::Version.new("0.14.2")
5
+ Code::Version = Gem::Version.new("0.14.3")
data/lib/code-ruby.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require "active_support/all"
4
4
  require "bigdecimal"
5
5
  require "bigdecimal/util"
6
+ require "did_you_mean"
6
7
  require "json"
7
8
  require "language-ruby"
8
9
  require "stringio"
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
- expect(Code.evaluate(input)).to eq(Code.evaluate(expected))
280
- next if Code.evaluate(input).is_a?(Code::Object::Decimal)
281
- expect(Code.evaluate(input).to_json).to eq(
282
- Code.evaluate(expected).to_json
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.2
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-17 00:00:00.000000000 Z
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