code-ruby 0.14.2 → 0.14.4

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: 7a52b2959095228434649a676508dbbf549a6a466363ca25b3ce95c1d5a13de9
4
+ data.tar.gz: ad2e7947f6d959923e36cecc48816586575f1caee9bfdbbc2da44ca1de9c284a
5
5
  SHA512:
6
- metadata.gz: 5ecea3358e470e50cb5571c0c5094837a1eb7fd68043e803d18dc3b691686e246cc0cb93a1a89fd4fbe1448b0dc45841883e4938b8510f9df6d45d7091d57447
7
- data.tar.gz: 3c0d475b0420dd3a937dd0f2dcff648bc2d1924b0639415c3096e79429dda1e787579a684aa3ce8b236739b590f72ebfb2049c901224288fadfca4ce25c5c183
6
+ metadata.gz: 6516b0072e0958d93bec52c9c43e138298d03a594f606598ca5572ecf2c02f8343f90b8834287c9a1d6651c8cea350791acbb29df9e57c0c0cdad0bb1e71e06d
7
+ data.tar.gz: d9ae4f2cca4194d68215c547d632bc21ac64a99d968d511e502a8efce7a6b435dfb2e7d877e3e431ed0320ccca256729121aee6805352588414d29544cc9f094
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  version: 2
3
3
  updates:
4
- - directory: "/"
5
- package-ecosystem: github-actions
6
- schedule:
7
- interval: daily
8
- - directory: "/"
9
- package-ecosystem: npm
10
- schedule:
11
- interval: daily
12
- - directory: "/"
13
- package-ecosystem: bundler
14
- schedule:
15
- interval: daily
4
+ - directory: "/"
5
+ package-ecosystem: github-actions
6
+ schedule:
7
+ interval: daily
8
+ - directory: "/"
9
+ package-ecosystem: npm
10
+ schedule:
11
+ interval: daily
12
+ - directory: "/"
13
+ package-ecosystem: bundler
14
+ schedule:
15
+ interval: daily
@@ -11,7 +11,7 @@ jobs:
11
11
  bundler-cache: true
12
12
  - run: bin/bundler-audit check --update
13
13
  rspec:
14
- name: RSpec
14
+ name: Test
15
15
  runs-on: ubuntu-latest
16
16
  steps:
17
17
  - uses: actions/checkout@v4
@@ -19,7 +19,7 @@ jobs:
19
19
  with:
20
20
  ruby-version: 3.3.0
21
21
  bundler-cache: true
22
- - run: bin/rspec
22
+ - run: bin/test
23
23
  rubocop:
24
24
  name: Rubocop
25
25
  runs-on: ubuntu-latest
@@ -29,3 +29,10 @@ jobs:
29
29
  with:
30
30
  bundler-cache: true
31
31
  - run: bin/rubocop
32
+ yarn-audit:
33
+ name: Yarn Audit
34
+ runs-on: ubuntu-latest
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ - uses: actions/setup-node@v4
38
+ - run: yarn audit
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.4)
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)
@@ -78,10 +82,10 @@ GEM
78
82
  rubocop-minitest (0.35.0)
79
83
  rubocop (>= 1.61, < 2.0)
80
84
  rubocop-ast (>= 1.31.1, < 2.0)
81
- rubocop-performance (1.20.2)
85
+ rubocop-performance (1.21.0)
82
86
  rubocop (>= 1.48.1, < 2.0)
83
- rubocop-ast (>= 1.30.0, < 2.0)
84
- rubocop-rails (2.24.0)
87
+ rubocop-ast (>= 1.31.1, < 2.0)
88
+ rubocop-rails (2.24.1)
85
89
  activesupport (>= 4.2.0)
86
90
  rack (>= 1.1)
87
91
  rubocop (>= 1.33.0, < 2.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/README.md CHANGED
@@ -1,3 +1,3 @@
1
1
  # code-ruby
2
2
 
3
- A programming language, like `Code.evaluate("1 + 1") # => 2`
3
+ A programming language
data/bin/test ADDED
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ bin/rspec
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,
@@ -8,11 +8,9 @@ class Code
8
8
  json
9
9
  elsif json.is_a?(::Hash)
10
10
  Dictionary.new(
11
- json.transform_keys do |key|
12
- Json.to_code(key)
13
- end.transform_values do |value|
14
- Json.to_code(value)
15
- end
11
+ json
12
+ .transform_keys { |key| Json.to_code(key) }
13
+ .transform_values { |value| Json.to_code(value) }
16
14
  )
17
15
  elsif json.is_a?(::Array)
18
16
  List.new(json.map { |element| Json.to_code(element) })
@@ -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.4")
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
+ %w[1&.even? false],
277
+ ["nothing&.even? || 1", "1"],
278
+ ["nothing&.even? && 1", "nothing"],
279
+ %w[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.4
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-04-03 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
@@ -104,6 +118,7 @@ files:
104
118
  - bin/console
105
119
  - bin/rspec
106
120
  - bin/rubocop
121
+ - bin/test
107
122
  - code-ruby.gemspec
108
123
  - lib/code-ruby.rb
109
124
  - lib/code.rb