code-ruby 0.14.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4457f2b10410f6514df4f0eebb52d52931724e2b448bd8e179650942f78aba9f
4
- data.tar.gz: c9a3214b391d5a39aa185dd48ad6bde35bbd537616b93d626ff6686fc341ed9a
3
+ metadata.gz: 233f0dfedc9a65226d48e1ed04141b5f8a0ddfc59dde5fc3d25aea8dc724ac70
4
+ data.tar.gz: 89f47760f80263b9e8628feb171daf966f419db4d913a712ec798f010c39b99e
5
5
  SHA512:
6
- metadata.gz: 6ba9119d592685a669c174ead2554725ec5586f25bcf41b3c9c418fb95965327cf0e84f1797e3dd83abc7c4cfe4bb9be4ed2f2fbd7fb9e98de94571b83c53647
7
- data.tar.gz: e1c928ad8bbeab9b0101af715cea94ebefa8540465ae4482e7a8afa8d5e88436a800b8097e51a44b624bb8171c0940397f1eb4b871269d130eb2453e74fa3da3
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.0)
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,
@@ -7,9 +7,10 @@ class Code
7
7
 
8
8
  def initialize(*args, **_kargs, &_block)
9
9
  ::Time.zone ||= DEFAULT_ZONE
10
- raw = args.first.presence || ::Time.zone.now
10
+ raw = args.first
11
11
  raw = raw.raw if raw.is_an?(Object)
12
- @raw = ::Time.zone.parse(raw.to_s)
12
+ raw = raw.presence || ::Time.zone.now
13
+ @raw = ::Time.zone.parse(raw.to_s).presence || ::Time.zone.now
13
14
  end
14
15
 
15
16
  def self.call(**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.1")
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
@@ -62,6 +62,7 @@ RSpec.describe Code do
62
62
  Parameter.new
63
63
  IdentifierList.new
64
64
  IdentifierList.new([])
65
+ Time.new(nothing).before?
65
66
  ].each { |input| it(input) { Code.evaluate(input) } }
66
67
 
67
68
  [
@@ -272,14 +273,27 @@ RSpec.describe Code do
272
273
  %w[1.1.to_json '"1.1"'],
273
274
  ["a = {} a.merge!(a: 1) a", "{a: 1}"],
274
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"],
275
287
  ["", ""]
276
288
  ].each do |input, expected|
277
289
  it "#{input} == #{expected}" do
278
- expect(Code.evaluate(input)).to eq(Code.evaluate(expected))
279
- next if Code.evaluate(input).is_a?(Code::Object::Decimal)
280
- expect(Code.evaluate(input).to_json).to eq(
281
- Code.evaluate(expected).to_json
282
- )
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)
283
297
  end
284
298
  end
285
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.1
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