code-ruby 0.13.1 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +15 -0
- data/.github/workflows/ci.yml +31 -0
- data/.rubocop.yml +8 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +51 -3
- data/bin/bundle-audit +31 -0
- data/bin/bundler-audit +31 -0
- data/bin/console +1 -0
- data/bin/rspec +31 -0
- data/bin/rubocop +31 -0
- data/lib/code/error.rb +0 -3
- data/lib/code/node/base_10.rb +4 -3
- data/lib/code/node/base_16.rb +1 -0
- data/lib/code/node/base_2.rb +1 -0
- data/lib/code/node/base_8.rb +1 -0
- data/lib/code/node/boolean.rb +1 -0
- data/lib/code/node/call.rb +14 -15
- data/lib/code/node/call_argument.rb +4 -4
- data/lib/code/node/code.rb +1 -0
- data/lib/code/node/decimal.rb +4 -3
- data/lib/code/node/dictionary.rb +5 -3
- data/lib/code/node/function.rb +1 -0
- data/lib/code/node/function_parameter.rb +14 -0
- data/lib/code/node/if.rb +6 -4
- data/lib/code/node/left_operation.rb +3 -3
- data/lib/code/node/list.rb +1 -0
- data/lib/code/node/negation.rb +1 -0
- data/lib/code/node/not.rb +1 -0
- data/lib/code/node/nothing.rb +1 -0
- data/lib/code/node/right_operation.rb +3 -2
- data/lib/code/node/splat.rb +1 -0
- data/lib/code/node/square_bracket.rb +1 -0
- data/lib/code/node/string.rb +3 -0
- data/lib/code/node/ternary.rb +4 -3
- data/lib/code/node/unary_minus.rb +1 -0
- data/lib/code/node/while.rb +4 -3
- data/lib/code/object/boolean.rb +2 -2
- data/lib/code/object/context.rb +1 -1
- data/lib/code/object/decimal.rb +9 -21
- data/lib/code/object/dictionary.rb +43 -113
- data/lib/code/object/function.rb +25 -35
- data/lib/code/object/global.rb +33 -32
- data/lib/code/object/identifier_list.rb +4 -4
- data/lib/code/object/integer.rb +14 -23
- data/lib/code/object/json.rb +10 -2
- data/lib/code/object/list.rb +50 -23
- data/lib/code/object/parameter.rb +18 -10
- data/lib/code/object/range.rb +33 -10
- data/lib/code/object/string.rb +2 -2
- data/lib/code/object/time.rb +4 -4
- data/lib/code/object.rb +31 -50
- data/lib/code/parser/string.rb +1 -1
- data/lib/code/type/repeat.rb +1 -1
- data/lib/code/type/sig.rb +1 -3
- data/lib/code/version.rb +1 -1
- data/lib/code-ruby.rb +2 -7
- data/lib/code.rb +1 -3
- data/spec/code/object/dictionary_spec.rb +6 -6
- data/spec/code_spec.rb +5 -8
- data/yarn.lock +4 -0
- metadata +10 -3
- data/lib/code/object/argument.rb +0 -27
data/lib/code/object.rb
CHANGED
@@ -4,7 +4,7 @@ class Code
|
|
4
4
|
class Object
|
5
5
|
attr_reader :raw
|
6
6
|
|
7
|
-
def initialize(
|
7
|
+
def initialize(...)
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.maybe
|
@@ -19,20 +19,15 @@ class Code
|
|
19
19
|
Type::Or.new(self, other)
|
20
20
|
end
|
21
21
|
|
22
|
-
def self.sig(args, &block)
|
23
|
-
Type::Sig.sig(args, object: self, &block)
|
24
|
-
nil
|
25
|
-
end
|
26
|
-
|
27
22
|
def self.call(**args)
|
28
23
|
operator = args.fetch(:operator, nil)
|
29
|
-
arguments = args.fetch(:arguments,
|
30
|
-
value = arguments.
|
24
|
+
arguments = args.fetch(:arguments, List.new)
|
25
|
+
value = arguments.code_first
|
31
26
|
|
32
27
|
case operator.to_s
|
33
28
|
when "new"
|
34
29
|
sig(args) { Object.repeat }
|
35
|
-
code_new(*arguments.
|
30
|
+
code_new(*arguments.raw)
|
36
31
|
when "!", "not"
|
37
32
|
sig(args)
|
38
33
|
code_exclamation_point
|
@@ -60,9 +55,6 @@ class Code
|
|
60
55
|
when "falsy?"
|
61
56
|
sig(args)
|
62
57
|
Boolean.new(falsy?)
|
63
|
-
when "to_string"
|
64
|
-
sig(args)
|
65
|
-
code_to_string
|
66
58
|
when "truthy?"
|
67
59
|
sig(args)
|
68
60
|
Boolean.new(truthy?)
|
@@ -110,7 +102,11 @@ class Code
|
|
110
102
|
code_as_json
|
111
103
|
when "to_json"
|
112
104
|
sig(args) { { pretty: Boolean.maybe } }
|
113
|
-
|
105
|
+
if arguments.any?
|
106
|
+
code_to_json(pretty: value.code_get(String.new(:pretty)))
|
107
|
+
else
|
108
|
+
code_to_json
|
109
|
+
end
|
114
110
|
when /=$/
|
115
111
|
sig(args) { Object }
|
116
112
|
|
@@ -123,8 +119,8 @@ class Code
|
|
123
119
|
self,
|
124
120
|
context.code_fetch(self).call(
|
125
121
|
**args,
|
126
|
-
operator: operator
|
127
|
-
arguments:
|
122
|
+
operator: operator.chop,
|
123
|
+
arguments: List.new([value])
|
128
124
|
)
|
129
125
|
)
|
130
126
|
end
|
@@ -133,13 +129,13 @@ class Code
|
|
133
129
|
else
|
134
130
|
raise(
|
135
131
|
Error::Undefined,
|
136
|
-
"#{operator} not defined on #{inspect}:Class"
|
132
|
+
"#{operator.inspect} not defined on #{inspect}:Class"
|
137
133
|
)
|
138
134
|
end
|
139
135
|
end
|
140
136
|
|
141
|
-
def self.code_new(*
|
142
|
-
new(*
|
137
|
+
def self.code_new(*)
|
138
|
+
new(*)
|
143
139
|
end
|
144
140
|
|
145
141
|
def self.code_and_operator(other)
|
@@ -178,10 +174,6 @@ class Code
|
|
178
174
|
Boolean.new(self === other)
|
179
175
|
end
|
180
176
|
|
181
|
-
def self.code_to_string
|
182
|
-
String.new(to_s)
|
183
|
-
end
|
184
|
-
|
185
177
|
def self.falsy?
|
186
178
|
!truthy?
|
187
179
|
end
|
@@ -190,8 +182,8 @@ class Code
|
|
190
182
|
keys.map { |key| [key, hash.fetch(key)] }.to_h
|
191
183
|
end
|
192
184
|
|
193
|
-
def self.sig(args, &
|
194
|
-
Type::Sig.sig(args, object: self, &
|
185
|
+
def self.sig(args, &)
|
186
|
+
Type::Sig.sig(args, object: self, &)
|
195
187
|
nil
|
196
188
|
end
|
197
189
|
|
@@ -242,12 +234,12 @@ class Code
|
|
242
234
|
other == self
|
243
235
|
end
|
244
236
|
end
|
245
|
-
|
237
|
+
alias_method :eql?, :==
|
246
238
|
|
247
239
|
def call(**args)
|
248
240
|
operator = args.fetch(:operator, nil)
|
249
|
-
arguments = args.fetch(:arguments,
|
250
|
-
value = arguments.
|
241
|
+
arguments = args.fetch(:arguments, List.new)
|
242
|
+
value = arguments.code_first
|
251
243
|
|
252
244
|
case operator.to_s
|
253
245
|
when "!", "not"
|
@@ -277,9 +269,6 @@ class Code
|
|
277
269
|
when "falsy?"
|
278
270
|
sig(args)
|
279
271
|
Boolean.new(falsy?)
|
280
|
-
when "to_string"
|
281
|
-
sig(args)
|
282
|
-
code_to_string
|
283
272
|
when "truthy?"
|
284
273
|
sig(args)
|
285
274
|
Boolean.new(truthy?)
|
@@ -327,7 +316,11 @@ class Code
|
|
327
316
|
code_as_json
|
328
317
|
when "to_json"
|
329
318
|
sig(args) { { pretty: Boolean.maybe } }
|
330
|
-
|
319
|
+
if arguments.any?
|
320
|
+
code_to_json(pretty: value.code_get(String.new(:pretty)))
|
321
|
+
else
|
322
|
+
code_to_json
|
323
|
+
end
|
331
324
|
when /=$/
|
332
325
|
sig(args) { Object }
|
333
326
|
|
@@ -340,8 +333,8 @@ class Code
|
|
340
333
|
self,
|
341
334
|
context.code_fetch(self).call(
|
342
335
|
**args,
|
343
|
-
operator: operator
|
344
|
-
arguments:
|
336
|
+
operator: operator.chop,
|
337
|
+
arguments: List.new([value])
|
345
338
|
)
|
346
339
|
)
|
347
340
|
end
|
@@ -375,9 +368,7 @@ class Code
|
|
375
368
|
Range.new(
|
376
369
|
self,
|
377
370
|
value,
|
378
|
-
Dictionary.new({
|
379
|
-
String.new(:exclude_end) => Boolean.new(true)
|
380
|
-
})
|
371
|
+
Dictionary.new({ String.new(:exclude_end) => Boolean.new(true) })
|
381
372
|
)
|
382
373
|
end
|
383
374
|
|
@@ -385,9 +376,7 @@ class Code
|
|
385
376
|
Range.new(
|
386
377
|
self,
|
387
378
|
value,
|
388
|
-
Dictionary.new({
|
389
|
-
String.new(:exclude_end) => Boolean.new(false)
|
390
|
-
})
|
379
|
+
Dictionary.new({ String.new(:exclude_end) => Boolean.new(false) })
|
391
380
|
)
|
392
381
|
end
|
393
382
|
|
@@ -403,10 +392,6 @@ class Code
|
|
403
392
|
Boolean.new(self === other)
|
404
393
|
end
|
405
394
|
|
406
|
-
def code_to_string
|
407
|
-
String.new(to_s)
|
408
|
-
end
|
409
|
-
|
410
395
|
def falsy?
|
411
396
|
!truthy?
|
412
397
|
end
|
@@ -419,8 +404,8 @@ class Code
|
|
419
404
|
keys.map { |key| [key, hash.fetch(key)] }.to_h
|
420
405
|
end
|
421
406
|
|
422
|
-
def sig(args, &
|
423
|
-
Type::Sig.sig(args, object: self, &
|
407
|
+
def sig(args, &)
|
408
|
+
Type::Sig.sig(args, object: self, &)
|
424
409
|
nil
|
425
410
|
end
|
426
411
|
|
@@ -457,11 +442,7 @@ class Code
|
|
457
442
|
end
|
458
443
|
|
459
444
|
def succ
|
460
|
-
|
461
|
-
self.class.new(raw.succ)
|
462
|
-
else
|
463
|
-
self.class.new(self)
|
464
|
-
end
|
445
|
+
raw.respond_to?(:succ) ? self.class.new(raw.succ) : self.class.new(self)
|
465
446
|
end
|
466
447
|
end
|
467
448
|
end
|
data/lib/code/parser/string.rb
CHANGED
data/lib/code/type/repeat.rb
CHANGED
data/lib/code/type/sig.rb
CHANGED
@@ -40,7 +40,7 @@ class Code
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def actual_arguments
|
43
|
-
args
|
43
|
+
args[:arguments]&.raw || []
|
44
44
|
end
|
45
45
|
|
46
46
|
def operator
|
@@ -94,8 +94,6 @@ class Code
|
|
94
94
|
Error::ArityError,
|
95
95
|
"#{function}: Expected #{expected_count} but got #{actual_count}"
|
96
96
|
)
|
97
|
-
|
98
|
-
nil
|
99
97
|
end
|
100
98
|
|
101
99
|
def valid_for?(expected:, actual:)
|
data/lib/code/version.rb
CHANGED
data/lib/code-ruby.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_support"
|
4
|
-
require "active_support/core_ext/date/conversions"
|
5
|
-
require "active_support/core_ext/numeric/time"
|
6
|
-
require "active_support/core_ext/object/json"
|
7
|
-
require "active_support/core_ext/object/blank"
|
8
|
-
require "active_support/core_ext/array/access"
|
3
|
+
require "active_support/all"
|
9
4
|
require "bigdecimal"
|
10
5
|
require "bigdecimal/util"
|
11
6
|
require "json"
|
@@ -19,5 +14,5 @@ loader.ignore("#{__dir__}/code-ruby.rb")
|
|
19
14
|
loader.setup
|
20
15
|
|
21
16
|
class Object
|
22
|
-
|
17
|
+
alias_method :is_an?, :is_a?
|
23
18
|
end
|
data/lib/code.rb
CHANGED
@@ -7,20 +7,20 @@ RSpec.describe Code::Object::Dictionary do
|
|
7
7
|
|
8
8
|
[
|
9
9
|
[
|
10
|
-
"dictionary.select { |key
|
10
|
+
"dictionary.select { |key| key == :first_name }",
|
11
11
|
"{ first_name: :Dorian }"
|
12
12
|
],
|
13
13
|
[
|
14
|
-
"dictionary.select { |
|
14
|
+
"dictionary.select { |_, value| value == :Dorian }",
|
15
15
|
"{ first_name: :Dorian }"
|
16
16
|
],
|
17
17
|
[
|
18
|
-
"dictionary.select { |
|
19
|
-
"
|
18
|
+
"dictionary.select { |_, _, index, _| index.zero? }",
|
19
|
+
"{ first_name: :Dorian }"
|
20
20
|
],
|
21
21
|
[
|
22
|
-
"dictionary.select { |
|
23
|
-
"
|
22
|
+
"dictionary.select { |_, _, _, dictionary| dictionary.two? }",
|
23
|
+
"dictionary"
|
24
24
|
],
|
25
25
|
[
|
26
26
|
"dictionary.fetch(:first_name, :last_name) { :Marié }",
|
data/spec/code_spec.rb
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
require "spec_helper"
|
4
4
|
|
5
5
|
RSpec.describe Code do
|
6
|
-
|
7
6
|
%w[
|
8
7
|
1.day.ago
|
9
8
|
1.day.from_now
|
@@ -61,9 +60,6 @@ RSpec.describe Code do
|
|
61
60
|
Time.tomorrow
|
62
61
|
Code.new
|
63
62
|
Parameter.new
|
64
|
-
Argument.new
|
65
|
-
Argument.new(1)
|
66
|
-
Argument.new(1,name:"index")
|
67
63
|
IdentifierList.new
|
68
64
|
IdentifierList.new([])
|
69
65
|
].each { |input| it(input) { Code.evaluate(input) } }
|
@@ -270,14 +266,15 @@ RSpec.describe Code do
|
|
270
266
|
['user = {} user[:name] = "Dorian" user[:name]', ":Dorian"],
|
271
267
|
['{ "first_name": "Dorian" }', '{"first_name" => "Dorian"}'],
|
272
268
|
['{ "first_name": "Dorian" }.as_json', '{"first_name" => "Dorian"}'],
|
273
|
-
[
|
274
|
-
[
|
275
|
-
[
|
276
|
-
[
|
269
|
+
%w[nothing.to_json :null],
|
270
|
+
%w[1.to_json "1"],
|
271
|
+
%w[1.0.to_json '"1.0"'],
|
272
|
+
%w[1.1.to_json '"1.1"'],
|
277
273
|
["", ""]
|
278
274
|
].each do |input, expected|
|
279
275
|
it "#{input} == #{expected}" do
|
280
276
|
expect(Code.evaluate(input)).to eq(Code.evaluate(expected))
|
277
|
+
next if Code.evaluate(input).is_a?(Code::Object::Decimal)
|
281
278
|
expect(Code.evaluate(input).to_json).to eq(
|
282
279
|
Code.evaluate(expected).to_json
|
283
280
|
)
|
data/yarn.lock
ADDED
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.
|
4
|
+
version: 0.14.0
|
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-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -87,16 +87,23 @@ executables:
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
+
- ".github/dependabot.yml"
|
91
|
+
- ".github/workflows/ci.yml"
|
90
92
|
- ".gitignore"
|
91
93
|
- ".rspec"
|
94
|
+
- ".rubocop.yml"
|
92
95
|
- ".ruby-version"
|
93
96
|
- ".tool-versions"
|
94
97
|
- Gemfile
|
95
98
|
- Gemfile.lock
|
96
99
|
- README.md
|
97
100
|
- Rakefile
|
101
|
+
- bin/bundle-audit
|
102
|
+
- bin/bundler-audit
|
98
103
|
- bin/code
|
99
104
|
- bin/console
|
105
|
+
- bin/rspec
|
106
|
+
- bin/rubocop
|
100
107
|
- code-ruby.gemspec
|
101
108
|
- lib/code-ruby.rb
|
102
109
|
- lib/code.rb
|
@@ -130,7 +137,6 @@ files:
|
|
130
137
|
- lib/code/node/unary_minus.rb
|
131
138
|
- lib/code/node/while.rb
|
132
139
|
- lib/code/object.rb
|
133
|
-
- lib/code/object/argument.rb
|
134
140
|
- lib/code/object/boolean.rb
|
135
141
|
- lib/code/object/class.rb
|
136
142
|
- lib/code/object/code.rb
|
@@ -221,6 +227,7 @@ files:
|
|
221
227
|
- spec/code/type_spec.rb
|
222
228
|
- spec/code_spec.rb
|
223
229
|
- spec/spec_helper.rb
|
230
|
+
- yarn.lock
|
224
231
|
homepage: https://github.com/dorianmariecom/code-ruby
|
225
232
|
licenses:
|
226
233
|
- MIT
|
data/lib/code/object/argument.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Code
|
4
|
-
class Object
|
5
|
-
class Argument < Object
|
6
|
-
attr_reader :value, :name
|
7
|
-
|
8
|
-
def initialize(*args, **_kargs, &_block)
|
9
|
-
@value = args.first.presence || Nothing.new
|
10
|
-
@name = args.second.present? ? String.new(args.second) : nil
|
11
|
-
@raw = List.new([@value, @name])
|
12
|
-
end
|
13
|
-
|
14
|
-
def keyword?
|
15
|
-
!regular?
|
16
|
-
end
|
17
|
-
|
18
|
-
def name_value
|
19
|
-
[name, value]
|
20
|
-
end
|
21
|
-
|
22
|
-
def regular?
|
23
|
-
!name
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|