code-ruby 0.14.2 → 0.14.4

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: 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