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 +4 -4
- data/Gemfile.lock +7 -3
- data/code-ruby.gemspec +1 -0
- data/lib/code/node/left_operation.rb +27 -0
- data/lib/code/object/time.rb +3 -2
- data/lib/code/parser/chained_call.rb +1 -1
- data/lib/code/version.rb +1 -1
- data/lib/code-ruby.rb +1 -0
- data/spec/code_spec.rb +19 -5
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 233f0dfedc9a65226d48e1ed04141b5f8a0ddfc59dde5fc3d25aea8dc724ac70
|
4
|
+
data.tar.gz: 89f47760f80263b9e8628feb171daf966f419db4d913a712ec798f010c39b99e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
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.
|
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,
|
data/lib/code/object/time.rb
CHANGED
@@ -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
|
10
|
+
raw = args.first
|
11
11
|
raw = raw.raw if raw.is_an?(Object)
|
12
|
-
|
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)
|
data/lib/code/version.rb
CHANGED
data/lib/code-ruby.rb
CHANGED
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
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
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.
|
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-
|
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
|