code-ruby 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +3 -3
  3. data/.prettierignore +2 -0
  4. data/.rubocop.yml +121 -5
  5. data/Gemfile +9 -1
  6. data/Gemfile.lock +24 -17
  7. data/VERSION +1 -1
  8. data/bin/bundle +123 -0
  9. data/bin/code +9 -11
  10. data/code-ruby.gemspec +3 -1
  11. data/lib/code/node/dictionary.rb +1 -3
  12. data/lib/code/node/if.rb +20 -15
  13. data/lib/code/node/left_operation.rb +1 -3
  14. data/lib/code/node/right_operation.rb +6 -6
  15. data/lib/code/node/while.rb +6 -6
  16. data/lib/code/object/boolean.rb +1 -1
  17. data/lib/code/object/class.rb +1 -1
  18. data/lib/code/object/code.rb +1 -1
  19. data/lib/code/object/context.rb +1 -1
  20. data/lib/code/object/date.rb +1 -1
  21. data/lib/code/object/decimal.rb +2 -2
  22. data/lib/code/object/dictionary.rb +12 -34
  23. data/lib/code/object/duration.rb +1 -1
  24. data/lib/code/object/function.rb +1 -1
  25. data/lib/code/object/global.rb +1 -1
  26. data/lib/code/object/html.rb +1 -1
  27. data/lib/code/object/integer.rb +2 -2
  28. data/lib/code/object/json.rb +2 -4
  29. data/lib/code/object/list.rb +3 -5
  30. data/lib/code/object/nothing.rb +1 -1
  31. data/lib/code/object/parameter.rb +1 -5
  32. data/lib/code/object/range.rb +1 -1
  33. data/lib/code/object/string.rb +1 -1
  34. data/lib/code/object/time.rb +1 -1
  35. data/lib/code/object.rb +7 -13
  36. data/lib/code/parser/string.rb +7 -7
  37. data/lib/code/type/repeat.rb +1 -1
  38. data/lib/code/version.rb +1 -1
  39. data/lib/code-ruby.rb +1 -1
  40. data/package-lock.json +14 -0
  41. data/package.json +0 -1
  42. data/spec/code/node/call_spec.rb +0 -34
  43. data/spec/code/parser_spec.rb +2 -2
  44. data/spec/code/type_spec.rb +1 -1
  45. data/spec/code_spec.rb +78 -79
  46. metadata +14 -12
  47. data/bin/console +0 -6
  48. data/yarn.lock +0 -4
  49. /data/spec/code/parser/{chained_call.rb → chained_call_spec.rb} +0 -0
@@ -3,7 +3,7 @@
3
3
  class Code
4
4
  class Object
5
5
  class Dictionary < ::Code::Object
6
- def initialize(*args, **kargs, &_block)
6
+ def initialize(*args, **kargs, &)
7
7
  @raw = args.map(&:to_h).reduce({}, &:merge).merge(kargs)
8
8
  end
9
9
 
@@ -298,9 +298,7 @@ class Code
298
298
  self
299
299
  end
300
300
 
301
- def code_eight?
302
- code_size.code_eight?
303
- end
301
+ delegate :code_eight?, to: :code_size
304
302
 
305
303
  def code_empty?
306
304
  Boolean.new(raw.empty?)
@@ -355,18 +353,14 @@ class Code
355
353
  List.new(raw.fetch_values(*))
356
354
  end
357
355
 
358
- def code_five?
359
- code_size.code_five?
360
- end
356
+ delegate :code_five?, to: :code_size
361
357
 
362
358
  def code_flatten(level = nil)
363
359
  level = Integer.new(-1) if level.nil? || level.falsy?
364
360
  code_to_list.code_flatten(level)
365
361
  end
366
362
 
367
- def code_four?
368
- code_size.code_four?
369
- end
363
+ delegate :code_four?, to: :code_size
370
364
 
371
365
  def code_get(key)
372
366
  raw[key] || Nothing.new
@@ -507,13 +501,9 @@ class Code
507
501
  self
508
502
  end
509
503
 
510
- def code_nine?
511
- code_size.code_nine?
512
- end
504
+ delegate :code_nine?, to: :code_size
513
505
 
514
- def code_one?
515
- code_size.code_one?
516
- end
506
+ delegate :code_one?, to: :code_size
517
507
 
518
508
  def code_select!(argument, **globals)
519
509
  if argument.is_a?(Class)
@@ -554,13 +544,9 @@ class Code
554
544
  value
555
545
  end
556
546
 
557
- def code_seven?
558
- code_size.code_seven?
559
- end
547
+ delegate :code_seven?, to: :code_size
560
548
 
561
- def code_six?
562
- code_size.code_six?
563
- end
549
+ delegate :code_six?, to: :code_size
564
550
 
565
551
  def code_size
566
552
  Integer.new(raw.size)
@@ -574,13 +560,9 @@ class Code
574
560
  Boolean.new(raw >= other.raw)
575
561
  end
576
562
 
577
- def code_ten?
578
- code_size.code_ten?
579
- end
563
+ delegate :code_ten?, to: :code_size
580
564
 
581
- def code_three?
582
- code_size.code_three?
583
- end
565
+ delegate :code_three?, to: :code_size
584
566
 
585
567
  def code_to_context
586
568
  Context.new(raw)
@@ -607,17 +589,13 @@ class Code
607
589
  )
608
590
  end
609
591
 
610
- def code_two?
611
- code_size.code_two?
612
- end
592
+ delegate :code_two?, to: :code_size
613
593
 
614
594
  def code_values
615
595
  List.new(raw.values)
616
596
  end
617
597
 
618
- def code_zero?
619
- code_size.code_zero?
620
- end
598
+ delegate :code_zero?, to: :code_size
621
599
  end
622
600
  end
623
601
  end
@@ -3,7 +3,7 @@
3
3
  class Code
4
4
  class Object
5
5
  class Duration < Object
6
- def initialize(*args, **_kargs, &_block)
6
+ def initialize(*args, **_kargs, &)
7
7
  raw = args.first || 0.seconds
8
8
  raw = raw.raw if raw.is_an?(Object)
9
9
  raw = raw.iso8601 if raw.is_an?(::ActiveSupport::Duration)
@@ -5,7 +5,7 @@ class Code
5
5
  class Function < Object
6
6
  attr_reader :parameters, :body
7
7
 
8
- def initialize(*args, **_kargs, &_block)
8
+ def initialize(*args, **_kargs, &)
9
9
  @parameters = List.new(args.first.presence || [])
10
10
  @parameters.raw.map! { |parameter| Parameter.new(parameter) }
11
11
  @body = Code.new(args.second.presence || Nothing.new)
@@ -70,7 +70,7 @@ class Code
70
70
  arguments.any? ? String.new(*arguments.raw) : Class.new(String)
71
71
  when "Time"
72
72
  sig(args) { Object.repeat }
73
- arguments.any? ? Time.new(*arguments.raw) : Class.new(Time)
73
+ arguments.any? ? Time.zone.local(*arguments.raw) : Class.new(Time)
74
74
  when "Context"
75
75
  sig(args) { Object.repeat }
76
76
  arguments.any? ? Context.new(*arguments.raw) : Class.new(Context)
@@ -3,7 +3,7 @@
3
3
  class Code
4
4
  class Object
5
5
  class Html < Object
6
- def initialize(*args, **_kargs, &_block)
6
+ def initialize(*_args, **_kargs, &)
7
7
  @raw = nil
8
8
  end
9
9
 
@@ -3,12 +3,12 @@
3
3
  class Code
4
4
  class Object
5
5
  class Integer < Object
6
- def initialize(*args, **_kargs, &_block)
6
+ def initialize(*args, **_kargs, &)
7
7
  whole = args.first || 0
8
8
  exponent = args.second || 0
9
9
  whole = whole.raw if whole.is_an?(Object)
10
10
  exponent = exponent.raw if exponent.is_an?(Object)
11
- @raw = whole.to_i * 10**exponent
11
+ @raw = whole.to_i * (10**exponent)
12
12
  rescue FloatDomainError
13
13
  raise Error, "#{decimal.inspect} * 10**#{exponent.inspect} is invalid"
14
14
  end
@@ -20,14 +20,12 @@ class Code
20
20
  Decimal.new(json)
21
21
  elsif json.is_an?(::Integer)
22
22
  Integer.new(json)
23
- elsif json.is_a?(::TrueClass)
24
- Boolean.new(json)
25
- elsif json.is_a?(::FalseClass)
23
+ elsif json.is_a?(::TrueClass) || json.is_a?(::FalseClass)
26
24
  Boolean.new(json)
27
25
  elsif json.is_a?(::NilClass)
28
26
  Nothing.new(json)
29
27
  else
30
- Nothing.new
28
+ raise Error, "#{json.inspect} not supported"
31
29
  end
32
30
  end
33
31
  end
@@ -3,7 +3,7 @@
3
3
  class Code
4
4
  class Object
5
5
  class List < Object
6
- def initialize(*args, **_kargs, &_block)
6
+ def initialize(*args, **_kargs, &)
7
7
  raw = args.first
8
8
  raw = raw.raw if raw.is_an?(Object)
9
9
  @raw = raw.to_a
@@ -305,7 +305,7 @@ class Code
305
305
  end
306
306
 
307
307
  def code_join(separator = nil)
308
- separator ||= String.new("")
308
+ separator ||= +""
309
309
 
310
310
  String.new(raw.join(separator.raw))
311
311
  end
@@ -326,9 +326,7 @@ class Code
326
326
  raw.inject(&:code_plus) || Nothing.new
327
327
  end
328
328
 
329
- def any?
330
- raw.any?
331
- end
329
+ delegate :any?, to: :raw
332
330
  end
333
331
  end
334
332
  end
@@ -3,7 +3,7 @@
3
3
  class Code
4
4
  class Object
5
5
  class Nothing < Object
6
- def initialize(*_args, **_kargs, &_block)
6
+ def initialize(*_args, **_kargs, &)
7
7
  @raw = nil
8
8
  end
9
9
 
@@ -3,7 +3,7 @@
3
3
  class Code
4
4
  class Object
5
5
  class Parameter < Object
6
- def initialize(*args, **_kargs, &_block)
6
+ def initialize(*args, **_kargs, &)
7
7
  @raw = Dictionary.new(args.first.presence || {})
8
8
  end
9
9
 
@@ -19,10 +19,6 @@ class Code
19
19
  Boolean.new(raw.code_get(String.new(:keyword?)))
20
20
  end
21
21
 
22
- def code_keyword?
23
- Boolean.new(raw.code_get(String.new(:keyword?)))
24
- end
25
-
26
22
  def code_regular_splat?
27
23
  Boolean.new(raw.code_get(String.new(:regular_splat?)))
28
24
  end
@@ -5,7 +5,7 @@ class Code
5
5
  class Range < Object
6
6
  attr_reader :left, :right, :options, :exclude_end
7
7
 
8
- def initialize(*args, **_kargs, &_block)
8
+ def initialize(*args, **_kargs, &)
9
9
  @left = args.first.presence || Integer.new(0)
10
10
  @right = args.second.presence || Integer.new(0)
11
11
  @options = Dictionary.new(args.third.presence || {})
@@ -3,7 +3,7 @@
3
3
  class Code
4
4
  class Object
5
5
  class String < Object
6
- def initialize(*args, **_kargs, &_block)
6
+ def initialize(*args, **_kargs, &)
7
7
  raw = args.first || Nothing.new
8
8
  raw = raw.raw if raw.is_a?(Object)
9
9
  @raw = raw.to_s
@@ -5,7 +5,7 @@ class Code
5
5
  class Time < Object
6
6
  DEFAULT_ZONE = "Etc/UTC"
7
7
 
8
- def initialize(*args, **_kargs, &_block)
8
+ def initialize(*args, **_kargs, &)
9
9
  ::Time.zone ||= DEFAULT_ZONE
10
10
  raw = args.first
11
11
  raw = raw.raw if raw.is_an?(Object)
data/lib/code/object.rb CHANGED
@@ -104,7 +104,7 @@ class Code
104
104
  String.new(self)
105
105
  when "to_time"
106
106
  sig(args)
107
- Time.new(self)
107
+ Time.zone.local(self)
108
108
  when "as_json"
109
109
  sig(args)
110
110
  code_as_json
@@ -187,7 +187,7 @@ class Code
187
187
  end
188
188
 
189
189
  def self.multi_fetch(hash, *keys)
190
- keys.map { |key| [key, hash.fetch(key)] }.to_h
190
+ keys.to_h { |key| [key, hash.fetch(key)] }
191
191
  end
192
192
 
193
193
  def self.sig(args, &)
@@ -200,7 +200,7 @@ class Code
200
200
  end
201
201
 
202
202
  def self.inspect
203
- to_s
203
+ name
204
204
  end
205
205
 
206
206
  def self.truthy?
@@ -242,7 +242,7 @@ class Code
242
242
  other == self
243
243
  end
244
244
  end
245
- alias_method :eql?, :==
245
+ alias eql? ==
246
246
 
247
247
  def call(**args)
248
248
  operator = args.fetch(:operator, nil)
@@ -318,7 +318,7 @@ class Code
318
318
  String.new(self)
319
319
  when "to_time"
320
320
  sig(args)
321
- Time.new(self)
321
+ Time.zone.local(self)
322
322
  when "as_json"
323
323
  sig(args)
324
324
  code_as_json
@@ -409,7 +409,7 @@ class Code
409
409
  end
410
410
 
411
411
  def multi_fetch(hash, *keys)
412
- keys.map { |key| [key, hash.fetch(key)] }.to_h
412
+ keys.to_h { |key| [key, hash.fetch(key)] }
413
413
  end
414
414
 
415
415
  def sig(args, &)
@@ -417,13 +417,7 @@ class Code
417
417
  nil
418
418
  end
419
419
 
420
- def to_s
421
- raw.to_s
422
- end
423
-
424
- def inspect
425
- to_s
426
- end
420
+ delegate :to_s, :inspect, to: :raw
427
421
 
428
422
  def truthy?
429
423
  true
@@ -20,7 +20,7 @@ class Code
20
20
  end
21
21
 
22
22
  def backslash
23
- str("\\")
23
+ str('\\')
24
24
  end
25
25
 
26
26
  def opening_curly_bracket
@@ -41,17 +41,17 @@ class Code
41
41
 
42
42
  def single_quoted_text_part
43
43
  (
44
- backslash.ignore << opening_curly_bracket |
45
- backslash.ignore << single_quote |
46
- single_quote.absent << opening_curly_bracket.absent << any
44
+ (backslash.ignore << opening_curly_bracket) |
45
+ (backslash.ignore << single_quote) |
46
+ (single_quote.absent << opening_curly_bracket.absent << any)
47
47
  ).repeat(1)
48
48
  end
49
49
 
50
50
  def double_quoted_text_part
51
51
  (
52
- backslash.ignore << opening_curly_bracket |
53
- backslash.ignore << double_quote |
54
- double_quote.absent << opening_curly_bracket.absent << any
52
+ (backslash.ignore << opening_curly_bracket) |
53
+ (backslash.ignore << double_quote) |
54
+ (double_quote.absent << opening_curly_bracket.absent << any)
55
55
  ).repeat(1)
56
56
  end
57
57
 
@@ -21,7 +21,7 @@ class Code
21
21
 
22
22
  def max_arguments
23
23
  max_arguments = max_arguments_of(clazz)
24
- (max_arguments.nil? || maximum.nil?) ? nil : maximum * max_arguments
24
+ max_arguments.nil? || maximum.nil? ? nil : maximum * max_arguments
25
25
  end
26
26
 
27
27
  def name
data/lib/code/version.rb CHANGED
@@ -3,4 +3,4 @@
3
3
  require_relative "../code"
4
4
 
5
5
  Code::Version =
6
- Gem::Version.new(File.read(File.expand_path("../../../VERSION", __FILE__)))
6
+ Gem::Version.new(File.read(File.expand_path("../../VERSION", __dir__)))
data/lib/code-ruby.rb CHANGED
@@ -15,5 +15,5 @@ loader.ignore("#{__dir__}/code-ruby.rb")
15
15
  loader.setup
16
16
 
17
17
  class Object
18
- alias_method :is_an?, :is_a?
18
+ alias is_an? is_a?
19
19
  end
data/package-lock.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "code-ruby",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "license": "MIT",
8
+ "engines": {
9
+ "node": "22.5.1",
10
+ "npm": "10.8.2"
11
+ }
12
+ }
13
+ }
14
+ }
data/package.json CHANGED
@@ -2,7 +2,6 @@
2
2
  "license": "MIT",
3
3
  "engines": {
4
4
  "node": "22.5.1",
5
- "yarn": "1.22.22",
6
5
  "npm": "10.8.2"
7
6
  }
8
7
  }
@@ -1,37 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
-
5
- RSpec.describe Code::Node::Call do
6
- # let(:context) { <<~CONTEXT }
7
- # render = (*args, **kargs, &block) => {
8
- # [args, kargs, block&.call(:dorian)]
9
- # }
10
- #
11
- # { render:, user: { name: :Dorian } }"
12
- # CONTEXT
13
- #
14
- # [
15
- # ["render", "[[], {}, nothing]"],
16
- # ["render()", "[[], {}, nothing]"],
17
- # ["render(user)", "[[user], {}, nothing]"],
18
- # [
19
- # "render(user, first_name: :Dorian)",
20
- # "[[user], { first_name: :Dorian }, nothing]"
21
- # ],
22
- # ["render { }", "[[], {}, nothing]"],
23
- # ["render do end", "[[], {}, nothing]"],
24
- # ["render { |name| name.upcase }", "[[], {}, :Dorian]"],
25
- # ["render(user) { |name| name.upcase }", "[[user], {}, :Dorian]"],
26
- # ["render(user) do |name| name.upcase end", "[[user], {}, :Dorian]"],
27
- # ["render { :Dorian }", "[[], {}, :Dorian]"],
28
- # ["render(user) { :Dorian }", "[[user], {}, :Dorian]"],
29
- # ["render(user) do :Dorian end", "[[user], {}, :Dorian]"]
30
- # ].each do |input, expected|
31
- # it "#{input} == #{expected}" do
32
- # expect(Code.evaluate(input, context)).to eq(
33
- # Code.evaluate(expected, context)
34
- # )
35
- # end
36
- # end
37
- end
@@ -17,13 +17,13 @@ RSpec.describe Code::Parser do
17
17
  "nothing nothing nothing"
18
18
  ].each do |input, _output|
19
19
  it input.inspect do
20
- Code::Parser.parse(input)
20
+ described_class.parse(input)
21
21
  end
22
22
  end
23
23
 
24
24
  Dir["spec/fixtures/code/parser/**/*.code"].each do |filename|
25
25
  it "parses #{filename}" do
26
- Code::Parser.parse(File.read(filename))
26
+ described_class.parse(File.read(filename))
27
27
  end
28
28
  end
29
29
  end
@@ -6,7 +6,7 @@ RSpec.describe Code::Type do
6
6
  describe "valid" do
7
7
  ["1 + 2", "2 * 3.4"].each do |input|
8
8
  it input do
9
- expect { Code.evaluate(input) }.to_not raise_error
9
+ expect { Code.evaluate(input) }.not_to raise_error
10
10
  end
11
11
  end
12
12
  end
data/spec/code_spec.rb CHANGED
@@ -3,81 +3,79 @@
3
3
  require "spec_helper"
4
4
 
5
5
  RSpec.describe Code do
6
- %w[
7
- 1.day.ago
8
- 1.day.from_now
9
- 1.hour.ago
10
- 1.hour.from_now
11
- 2.days.ago
12
- 2.days.from_now
13
- 2.hours.ago
14
- 2.hours.ago.hour
15
- 2.hours.from_now
16
- 2.hours.from_now.hour
17
- Time.hour
18
- Date.hour
19
- Boolean.new
20
- Boolean.new(true)
21
- Boolean.new(false)
22
- Class.new
23
- Class.new(Boolean)
24
- Class.new(Class)
25
- Context.new
26
- Context.new(a:1)
27
- Date.new
28
- Date.new.hour
29
- Date.new("2024-03-05")
30
- Date.new("2024-03-05").hour
31
- Date.today
32
- Date.yesterday
33
- Date.tomorrow
34
- Date.tomorrow.hour
35
- Decimal.new
36
- Decimal.new(0)
37
- Decimal.new(1.2)
38
- Dictionary.new
39
- Dictionary.new(a:1)
40
- Duration.new
41
- Duration.new(1.day)
42
- Duration.new("P1D")
43
- Function.new
44
- Integer.new
45
- Integer.new(0)
46
- Integer.new(1)
47
- Integer.new(1.2)
48
- List.new
49
- List.new([])
50
- List.new([1,2])
51
- Nothing.new
52
- Nothing.new(1)
53
- Object.new
54
- Object.new(1)
55
- Range.new
56
- Range.new(1,2)
57
- Range.new(-1)
58
- Range.new(1,2,exclude_end:false)
59
- Range.new(1,2,exclude_end:true)
60
- String.new
61
- String.new(:hello)
62
- Time.new
63
- Time.new("2024-03-05.06:10:59.UTC")
64
- Time.now
65
- Time.tomorrow
66
- Time.yesterday
67
- Time.tomorrow
68
- Code.new
69
- Parameter.new
70
- IdentifierList.new
71
- IdentifierList.new([])
72
- Time.new(nothing).before?
73
- Html.link_to
74
- Html.link_to('/')
75
- Html.link_to('Home','/')
76
- ].each { |input| it(input) { Code.evaluate(input) } }
77
-
78
- ["Time.hour >= 6 and Time.hour <= 23"].each do |input|
79
- it(input) { Code.evaluate(input) }
80
- end
6
+ (
7
+ %w[
8
+ 1.day.ago
9
+ 1.day.from_now
10
+ 1.hour.ago
11
+ 1.hour.from_now
12
+ 2.days.ago
13
+ 2.days.from_now
14
+ 2.hours.ago
15
+ 2.hours.ago.hour
16
+ 2.hours.from_now
17
+ 2.hours.from_now.hour
18
+ Time.hour
19
+ Date.hour
20
+ Boolean.new
21
+ Boolean.new(true)
22
+ Boolean.new(false)
23
+ Class.new
24
+ Class.new(Boolean)
25
+ Class.new(Class)
26
+ Context.new
27
+ Context.new(a:1)
28
+ Date.new
29
+ Date.new.hour
30
+ Date.new("2024-03-05")
31
+ Date.new("2024-03-05").hour
32
+ Date.today
33
+ Date.yesterday
34
+ Date.tomorrow
35
+ Date.tomorrow.hour
36
+ Decimal.new
37
+ Decimal.new(0)
38
+ Decimal.new(1.2)
39
+ Dictionary.new
40
+ Dictionary.new(a:1)
41
+ Duration.new
42
+ Duration.new(1.day)
43
+ Duration.new("P1D")
44
+ Function.new
45
+ Integer.new
46
+ Integer.new(0)
47
+ Integer.new(1)
48
+ Integer.new(1.2)
49
+ List.new
50
+ List.new([])
51
+ List.new([1,2])
52
+ Nothing.new
53
+ Nothing.new(1)
54
+ Object.new
55
+ Object.new(1)
56
+ Range.new
57
+ Range.new(1,2)
58
+ Range.new(-1)
59
+ Range.new(1,2,exclude_end:false)
60
+ Range.new(1,2,exclude_end:true)
61
+ String.new
62
+ String.new(:hello)
63
+ Time.new
64
+ Time.new("2024-03-05.06:10:59.UTC")
65
+ Time.now
66
+ Time.tomorrow
67
+ Time.yesterday
68
+ Time.tomorrow
69
+ Code.new
70
+ Parameter.new
71
+ IdentifierList.new
72
+ IdentifierList.new([])
73
+ Time.new(nothing).before?
74
+ Html.link_to
75
+ Html.link_to('/')
76
+ Html.link_to('Home','/')
77
+ ] + ["Time.hour >= 6 and Time.hour <= 23"]
78
+ ).each { |input| it(input) { described_class.evaluate(input) } }
81
79
 
82
80
  [
83
81
  [
@@ -317,11 +315,12 @@ RSpec.describe Code do
317
315
  ].each do |input, expected|
318
316
  it "#{input} == #{expected}" do
319
317
  output = StringIO.new
320
- input = Code.evaluate(input, output:)
321
- expected = Code.evaluate(expected)
318
+ input = described_class.evaluate(input, output:)
319
+ expected = described_class.evaluate(expected)
322
320
  expect(input).to eq(expected)
323
321
  expect(output.string).to eq("")
324
322
  next if input.is_a?(Code::Object::Decimal)
323
+
325
324
  expect(input.to_json).to eq(expected.to_json)
326
325
  end
327
326
  end
@@ -329,13 +328,13 @@ RSpec.describe Code do
329
328
  [["puts(true)", "true\n"], %w[print(false) false]].each do |input, expected|
330
329
  it "#{input} prints #{expected}" do
331
330
  output = StringIO.new
332
- Code.evaluate(input, output:)
331
+ described_class.evaluate(input, output:)
333
332
  expect(output.string).to eq(expected)
334
333
  end
335
334
  end
336
335
 
337
336
  it "doesn't crash with dictionnary as parameter" do
338
- Code.evaluate(<<~INPUT)
337
+ described_class.evaluate(<<~INPUT)
339
338
  [
340
339
  {
341
340
  videos: [{}]