code-ruby 0.14.1 → 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: 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