code-ruby 1.4.0 → 1.5.2
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/.node-version +1 -1
- data/.npm-version +1 -1
- data/.rubocop.yml +8 -7
- data/.ruby-version +1 -1
- data/.tool-versions +2 -2
- data/Gemfile +1 -1
- data/Gemfile.lock +34 -34
- data/VERSION +1 -1
- data/bin/code +12 -8
- data/code-ruby.gemspec +2 -2
- data/lib/code/concerns/shared.rb +10 -59
- data/lib/code/node/code.rb +10 -0
- data/lib/code/node/dictionary.rb +34 -15
- data/lib/code/node/function_parameter.rb +1 -1
- data/lib/code/object/boolean.rb +3 -2
- data/lib/code/object/class.rb +2 -2
- data/lib/code/object/code.rb +2 -2
- data/lib/code/object/context.rb +1 -1
- data/lib/code/object/date.rb +3 -3
- data/lib/code/object/decimal.rb +3 -3
- data/lib/code/object/dictionary.rb +23 -7
- data/lib/code/object/duration.rb +3 -3
- data/lib/code/object/function.rb +2 -2
- data/lib/code/object/global.rb +1 -5
- data/lib/code/object/html.rb +4 -5
- data/lib/code/object/http.rb +0 -2
- data/lib/code/object/integer.rb +3 -3
- data/lib/code/object/list.rb +9 -2
- data/lib/code/object/nothing.rb +2 -2
- data/lib/code/object/parameter.rb +2 -2
- data/lib/code/object/range.rb +2 -2
- data/lib/code/object/string.rb +2 -2
- data/lib/code/object/time.rb +100 -6
- data/lib/code/object.rb +5 -5
- data/lib/code/parser/call.rb +7 -6
- data/lib/code/parser/dictionary.rb +7 -5
- data/lib/code/parser/equal.rb +0 -4
- data/lib/code/parser/function.rb +8 -2
- data/lib/code/parser/group.rb +20 -4
- data/lib/code/parser/if.rb +8 -2
- data/lib/code/parser/name.rb +4 -8
- data/lib/code/parser/while.rb +8 -2
- data/lib/code/type/sig.rb +2 -2
- data/lib/code/type.rb +1 -1
- data/lib/code.rb +7 -7
- data/package-lock.json +2 -2
- data/package.json +2 -2
- data/spec/code/object/http_spec.rb +70 -66
- data/spec/code_spec.rb +18 -2
- metadata +4 -6
- data/TODO +0 -219
- data/bin/console +0 -6
data/lib/code/object/function.rb
CHANGED
@@ -5,7 +5,7 @@ class Code
|
|
5
5
|
class Function < Object
|
6
6
|
attr_reader :code_parameters, :code_body
|
7
7
|
|
8
|
-
def initialize(*args, **_kargs, &)
|
8
|
+
def initialize(*args, **_kargs, &_block)
|
9
9
|
@code_parameters =
|
10
10
|
List
|
11
11
|
.new(args.first)
|
@@ -15,7 +15,7 @@ class Code
|
|
15
15
|
|
16
16
|
@code_body = Code.new(args.second.presence)
|
17
17
|
|
18
|
-
|
18
|
+
self.raw = List.new([code_parameters, code_body])
|
19
19
|
end
|
20
20
|
|
21
21
|
def call(**args)
|
data/lib/code/object/global.rb
CHANGED
@@ -107,11 +107,7 @@ class Code
|
|
107
107
|
end
|
108
108
|
when "Time"
|
109
109
|
sig(args) { Object.repeat }
|
110
|
-
|
111
|
-
Time.zone.local(*code_arguments.raw)
|
112
|
-
else
|
113
|
-
Class.new(Time)
|
114
|
-
end
|
110
|
+
code_arguments.any? ? Time.new(*code_arguments.raw) : Class.new(Time)
|
115
111
|
when "Context"
|
116
112
|
sig(args) { Object.repeat }
|
117
113
|
if code_arguments.any?
|
data/lib/code/object/html.rb
CHANGED
@@ -3,13 +3,12 @@
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
5
|
class Html < Object
|
6
|
-
def initialize(*args, **_kargs, &)
|
7
|
-
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
self.raw =
|
8
8
|
if args.first.is_an?(Html)
|
9
9
|
args.first.raw
|
10
|
-
elsif args.first.is_a?(::Nokogiri::XML::NodeSet)
|
11
|
-
|
12
|
-
elsif args.first.is_a?(Nokogiri::XML::Node)
|
10
|
+
elsif args.first.is_a?(::Nokogiri::XML::NodeSet) ||
|
11
|
+
args.first.is_a?(Nokogiri::XML::Node)
|
13
12
|
args.first
|
14
13
|
else
|
15
14
|
Nokogiri.HTML(args.first.to_s)
|
data/lib/code/object/http.rb
CHANGED
data/lib/code/object/integer.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
5
|
class Integer < Object
|
6
|
-
def initialize(*args, **_kargs, &)
|
7
|
-
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
self.raw =
|
8
8
|
if args.first.class.in?(NUMBER_CLASSES)
|
9
9
|
if args.second.class.in?(NUMBER_CLASSES)
|
10
10
|
(args.first.to_s.to_d * (10**args.second.to_s.to_d)).to_i
|
@@ -15,7 +15,7 @@ class Code
|
|
15
15
|
0
|
16
16
|
end
|
17
17
|
rescue FloatDomainError
|
18
|
-
|
18
|
+
self.raw = 0
|
19
19
|
end
|
20
20
|
|
21
21
|
def call(**args)
|
data/lib/code/object/list.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
5
|
class List < Object
|
6
|
-
def initialize(*args, **_kargs, &)
|
7
|
-
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
self.raw =
|
8
8
|
if args.first.is_a?(List)
|
9
9
|
args.first.raw.map(&:to_code)
|
10
10
|
elsif args.first.is_an?(::Array)
|
@@ -45,6 +45,9 @@ class Code
|
|
45
45
|
when "sample"
|
46
46
|
sig(args) { Integer.maybe }
|
47
47
|
code_sample(code_value)
|
48
|
+
when "shuffle"
|
49
|
+
sig(args)
|
50
|
+
code_shuffle
|
48
51
|
when "flatten"
|
49
52
|
sig(args) { Integer.maybe }
|
50
53
|
code_flatten
|
@@ -187,6 +190,10 @@ class Code
|
|
187
190
|
end
|
188
191
|
end
|
189
192
|
|
193
|
+
def code_shuffle
|
194
|
+
List.new(raw.shuffle)
|
195
|
+
end
|
196
|
+
|
190
197
|
def code_flatten(level = nil)
|
191
198
|
code_level = level.to_code
|
192
199
|
code_level = Integer.new(-1) if code_level.nothing?
|
data/lib/code/object/nothing.rb
CHANGED
data/lib/code/object/range.rb
CHANGED
@@ -5,7 +5,7 @@ class Code
|
|
5
5
|
class Range < Object
|
6
6
|
attr_reader :code_left, :code_right, :code_options, :code_exclude_end
|
7
7
|
|
8
|
-
def initialize(*args, **kargs, &)
|
8
|
+
def initialize(*args, **kargs, &_block)
|
9
9
|
if args.first.is_a?(Range)
|
10
10
|
@code_left = args.first.code_left
|
11
11
|
@code_right = args.first.code_right
|
@@ -26,7 +26,7 @@ class Code
|
|
26
26
|
@code_exclude_end = Boolean.new(code_options.code_get(:exclude_end))
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
self.raw = ::Range.new(code_left, code_right, exclude_end?)
|
30
30
|
end
|
31
31
|
|
32
32
|
def call(**args)
|
data/lib/code/object/string.rb
CHANGED
data/lib/code/object/time.rb
CHANGED
@@ -5,9 +5,9 @@ class Code
|
|
5
5
|
class Time < Object
|
6
6
|
DEFAULT_ZONE = "Etc/UTC"
|
7
7
|
|
8
|
-
def initialize(*args, **_kargs, &)
|
8
|
+
def initialize(*args, **_kargs, &_block)
|
9
9
|
::Time.zone ||= DEFAULT_ZONE
|
10
|
-
|
10
|
+
self.raw = ::Time.zone.parse(args.first.to_s) || ::Time.zone.now
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.call(**args)
|
@@ -71,6 +71,27 @@ class Code
|
|
71
71
|
when "seconds"
|
72
72
|
sig(args)
|
73
73
|
code_seconds
|
74
|
+
when "monday?"
|
75
|
+
sig(args)
|
76
|
+
code_monday?
|
77
|
+
when "tuesday?"
|
78
|
+
sig(args)
|
79
|
+
code_tuesday?
|
80
|
+
when "wednesday?"
|
81
|
+
sig(args)
|
82
|
+
code_wednesday?
|
83
|
+
when "thursday?"
|
84
|
+
sig(args)
|
85
|
+
code_thursday?
|
86
|
+
when "friday?"
|
87
|
+
sig(args)
|
88
|
+
code_friday?
|
89
|
+
when "saturday?"
|
90
|
+
sig(args)
|
91
|
+
code_saturday?
|
92
|
+
when "sunday?"
|
93
|
+
sig(args)
|
94
|
+
code_sunday?
|
74
95
|
when "format"
|
75
96
|
sig(args) { String }
|
76
97
|
code_format(code_value)
|
@@ -79,10 +100,6 @@ class Code
|
|
79
100
|
end
|
80
101
|
end
|
81
102
|
|
82
|
-
def self.code_hour
|
83
|
-
code_now.code_hour
|
84
|
-
end
|
85
|
-
|
86
103
|
def self.code_tomorrow
|
87
104
|
::Time.zone ||= DEFAULT_ZONE
|
88
105
|
new(::Time.zone.tomorrow)
|
@@ -162,6 +179,34 @@ class Code
|
|
162
179
|
code_now.code_seconds
|
163
180
|
end
|
164
181
|
|
182
|
+
def self.code_monday?
|
183
|
+
code_week_day.code_one?
|
184
|
+
end
|
185
|
+
|
186
|
+
def self.code_tuesday?
|
187
|
+
code_week_day.code_two?
|
188
|
+
end
|
189
|
+
|
190
|
+
def self.code_wednesday?
|
191
|
+
code_week_day.code_three?
|
192
|
+
end
|
193
|
+
|
194
|
+
def self.code_thursday?
|
195
|
+
code_week_day.code_four?
|
196
|
+
end
|
197
|
+
|
198
|
+
def self.code_friday?
|
199
|
+
code_week_day.code_five?
|
200
|
+
end
|
201
|
+
|
202
|
+
def self.code_saturday?
|
203
|
+
code_week_day.code_six?
|
204
|
+
end
|
205
|
+
|
206
|
+
def self.code_sunday?
|
207
|
+
code_week_day.code_zero?
|
208
|
+
end
|
209
|
+
|
165
210
|
def self.code_format(format)
|
166
211
|
code_now.code_format(format)
|
167
212
|
end
|
@@ -232,6 +277,27 @@ class Code
|
|
232
277
|
when "seconds"
|
233
278
|
sig(args)
|
234
279
|
code_seconds
|
280
|
+
when "monday?"
|
281
|
+
sig(args)
|
282
|
+
code_monday?
|
283
|
+
when "tuesday?"
|
284
|
+
sig(args)
|
285
|
+
code_tuesday?
|
286
|
+
when "wednesday?"
|
287
|
+
sig(args)
|
288
|
+
code_wednesday?
|
289
|
+
when "thursday?"
|
290
|
+
sig(args)
|
291
|
+
code_thursday?
|
292
|
+
when "friday?"
|
293
|
+
sig(args)
|
294
|
+
code_friday?
|
295
|
+
when "saturday?"
|
296
|
+
sig(args)
|
297
|
+
code_saturday?
|
298
|
+
when "sunday?"
|
299
|
+
sig(args)
|
300
|
+
code_sunday?
|
235
301
|
when "format"
|
236
302
|
sig(args) { String }
|
237
303
|
code_format(code_value)
|
@@ -326,6 +392,34 @@ class Code
|
|
326
392
|
Integer.new(raw.sec)
|
327
393
|
end
|
328
394
|
|
395
|
+
def code_monday?
|
396
|
+
code_week_day.code_one?
|
397
|
+
end
|
398
|
+
|
399
|
+
def code_tuesday?
|
400
|
+
code_week_day.code_two?
|
401
|
+
end
|
402
|
+
|
403
|
+
def code_wednesday?
|
404
|
+
code_week_day.code_three?
|
405
|
+
end
|
406
|
+
|
407
|
+
def code_thursday?
|
408
|
+
code_week_day.code_four?
|
409
|
+
end
|
410
|
+
|
411
|
+
def code_friday?
|
412
|
+
code_week_day.code_five?
|
413
|
+
end
|
414
|
+
|
415
|
+
def code_saturday?
|
416
|
+
code_week_day.code_six?
|
417
|
+
end
|
418
|
+
|
419
|
+
def code_sunday?
|
420
|
+
code_week_day.code_zero?
|
421
|
+
end
|
422
|
+
|
329
423
|
def code_format(format)
|
330
424
|
code_format = format.to_code
|
331
425
|
|
data/lib/code/object.rb
CHANGED
@@ -23,23 +23,23 @@ class Code
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def self.repeat(minimum = 0, maximum = nil)
|
26
|
-
Type::Repeat.new(self, minimum
|
26
|
+
Type::Repeat.new(self, minimum: minimum, maximum: maximum)
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.|(other)
|
30
30
|
Type::Or.new(self, other)
|
31
31
|
end
|
32
32
|
|
33
|
-
def self.code_new(*)
|
34
|
-
new(*)
|
33
|
+
def self.code_new(*args)
|
34
|
+
new(*args)
|
35
35
|
end
|
36
36
|
|
37
37
|
def name
|
38
38
|
self.class.name
|
39
39
|
end
|
40
40
|
|
41
|
-
def code_new(*)
|
42
|
-
self.class.code_new(*)
|
41
|
+
def code_new(*args)
|
42
|
+
self.class.code_new(*args)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
data/lib/code/parser/call.rb
CHANGED
@@ -111,14 +111,15 @@ class Code
|
|
111
111
|
|
112
112
|
def block
|
113
113
|
(
|
114
|
-
(do_keyword | begin_keyword) << whitespace
|
115
|
-
parameters.aka(:parameters).maybe <<
|
116
|
-
end_keyword.maybe
|
114
|
+
(do_keyword | begin_keyword).ignore << whitespace <<
|
115
|
+
parameters.aka(:parameters).maybe << whitespace? <<
|
116
|
+
code.aka(:body) << (whitespace? << end_keyword).maybe.ignore
|
117
117
|
) |
|
118
118
|
(
|
119
|
-
opening_curly_bracket << whitespace? <<
|
120
|
-
parameters.aka(:parameters).maybe <<
|
121
|
-
|
119
|
+
opening_curly_bracket.ignore << whitespace? <<
|
120
|
+
parameters.aka(:parameters).maybe << whitespace? <<
|
121
|
+
code.aka(:body) <<
|
122
|
+
(whitespace? << closing_curly_bracket).maybe.ignore
|
122
123
|
)
|
123
124
|
end
|
124
125
|
|
@@ -48,14 +48,16 @@ class Code
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def key_value
|
51
|
-
(name.aka(:name) << colon << code_present.aka(:
|
51
|
+
(name.aka(:name) << colon << code_present.aka(:code).maybe).aka(
|
52
|
+
:name_code
|
53
|
+
) |
|
52
54
|
(
|
53
|
-
statement.aka(:statement) << colon << code_present.aka(:
|
54
|
-
) |
|
55
|
+
statement.aka(:statement) << colon << code_present.aka(:code).maybe
|
56
|
+
).aka(:statement_code) |
|
55
57
|
(
|
56
58
|
statement.aka(:statement) << whitespace? << equal << greater <<
|
57
|
-
code_present.aka(:
|
58
|
-
) |
|
59
|
+
code_present.aka(:code).maybe
|
60
|
+
).aka(:statement_code) | code_present.aka(:code)
|
59
61
|
end
|
60
62
|
|
61
63
|
def root
|
data/lib/code/parser/equal.rb
CHANGED
data/lib/code/parser/function.rb
CHANGED
@@ -101,8 +101,14 @@ class Code
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def body
|
104
|
-
(
|
105
|
-
(
|
104
|
+
(
|
105
|
+
(begin_keyword | do_keyword).ignore << whitespace << code <<
|
106
|
+
(whitespace? << end_keyword).maybe.ignore
|
107
|
+
) |
|
108
|
+
(
|
109
|
+
opening_curly_bracket.ignore << whitespace? << code <<
|
110
|
+
(whitespace? << closing_curly_bracket).maybe.ignore
|
111
|
+
) | (code << (whitespace? << end_keyword).maybe.ignore)
|
106
112
|
end
|
107
113
|
|
108
114
|
def root
|
data/lib/code/parser/group.rb
CHANGED
@@ -7,6 +7,14 @@ class Code
|
|
7
7
|
Code
|
8
8
|
end
|
9
9
|
|
10
|
+
def whitespace
|
11
|
+
Whitespace
|
12
|
+
end
|
13
|
+
|
14
|
+
def whitespace?
|
15
|
+
whitespace.maybe
|
16
|
+
end
|
17
|
+
|
10
18
|
def opening_parenthesis
|
11
19
|
str("(")
|
12
20
|
end
|
@@ -28,10 +36,18 @@ class Code
|
|
28
36
|
end
|
29
37
|
|
30
38
|
def root
|
31
|
-
(
|
32
|
-
|
33
|
-
|
34
|
-
|
39
|
+
(
|
40
|
+
opening_parenthesis.ignore << whitespace? << code <<
|
41
|
+
(whitespace? << closing_parenthesis).maybe.ignore
|
42
|
+
).aka(:group) |
|
43
|
+
(
|
44
|
+
begin_keyword.ignore << whitespace << code <<
|
45
|
+
(whitespace? << end_keyword).maybe.ignore
|
46
|
+
).aka(:group) |
|
47
|
+
(
|
48
|
+
do_keyword.ignore << whitespace << code <<
|
49
|
+
(whitespace? << end_keyword).maybe.ignore
|
50
|
+
).aka(:group) | Call
|
35
51
|
end
|
36
52
|
end
|
37
53
|
end
|
data/lib/code/parser/if.rb
CHANGED
@@ -60,8 +60,14 @@ class Code
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def body
|
63
|
-
(
|
64
|
-
(
|
63
|
+
(
|
64
|
+
(begin_keyword | do_keyword).ignore << whitespace << code <<
|
65
|
+
(whitespace? << end_keyword).maybe.ignore
|
66
|
+
) |
|
67
|
+
(
|
68
|
+
opening_curly_bracket.ignore << whitespace? << code <<
|
69
|
+
(whitespace? << closing_curly_bracket).maybe.ignore
|
70
|
+
) | (code << (whitespace? << end_keyword).maybe.ignore)
|
65
71
|
end
|
66
72
|
|
67
73
|
def root
|
data/lib/code/parser/name.rb
CHANGED
@@ -83,6 +83,10 @@ class Code
|
|
83
83
|
str("do")
|
84
84
|
end
|
85
85
|
|
86
|
+
def begin_keyword
|
87
|
+
str("begin")
|
88
|
+
end
|
89
|
+
|
86
90
|
def end_keyword
|
87
91
|
str("end")
|
88
92
|
end
|
@@ -91,18 +95,10 @@ class Code
|
|
91
95
|
str("elsif")
|
92
96
|
end
|
93
97
|
|
94
|
-
def begin_keyword
|
95
|
-
str("begin")
|
96
|
-
end
|
97
|
-
|
98
98
|
def else_keyword
|
99
99
|
str("else")
|
100
100
|
end
|
101
101
|
|
102
|
-
def begin_keyword
|
103
|
-
str("begin")
|
104
|
-
end
|
105
|
-
|
106
102
|
def special_character
|
107
103
|
ampersand | equal | pipe | dot | colon | comma | space | newline |
|
108
104
|
opening_curly_bracket | closing_curly_bracket | opening_parenthesis |
|
data/lib/code/parser/while.rb
CHANGED
@@ -52,8 +52,14 @@ class Code
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def body
|
55
|
-
(
|
56
|
-
(
|
55
|
+
(
|
56
|
+
(begin_keyword | do_keyword).ignore << whitespace << code <<
|
57
|
+
(whitespace? << end_keyword).maybe.ignore
|
58
|
+
) |
|
59
|
+
(
|
60
|
+
opening_curly_bracket.ignore << whitespace? << code <<
|
61
|
+
(whitespace? << closing_curly_bracket).maybe.ignore
|
62
|
+
) | (code << (whitespace? << end_keyword).maybe.ignore)
|
57
63
|
end
|
58
64
|
|
59
65
|
def root
|
data/lib/code/type/sig.rb
CHANGED
@@ -111,7 +111,7 @@ class Code
|
|
111
111
|
actual_arguments.each do |actual|
|
112
112
|
expected = expected_arguments[expected_index]
|
113
113
|
if expected.is_a?(Repeat)
|
114
|
-
if valid_for?(expected
|
114
|
+
if valid_for?(expected: expected, actual: actual)
|
115
115
|
repeat_index += 1
|
116
116
|
elsif repeat_index >= expected.min_arguments
|
117
117
|
expected_index += 1
|
@@ -122,7 +122,7 @@ class Code
|
|
122
122
|
"#{function}: expected #{expected.name}, got #{actual.inspect}"
|
123
123
|
)
|
124
124
|
end
|
125
|
-
elsif valid_for?(expected
|
125
|
+
elsif valid_for?(expected: expected, actual: actual)
|
126
126
|
expected_index += 1
|
127
127
|
repeat_index = 0
|
128
128
|
else
|
data/lib/code/type.rb
CHANGED
data/lib/code.rb
CHANGED
@@ -33,13 +33,13 @@ class Code
|
|
33
33
|
def evaluate
|
34
34
|
Timeout.timeout(timeout) do
|
35
35
|
Node::Code.new(Code.parse(source)).evaluate(
|
36
|
-
context
|
37
|
-
error
|
38
|
-
input
|
39
|
-
object
|
40
|
-
output
|
41
|
-
source
|
42
|
-
timeout:
|
36
|
+
context: context,
|
37
|
+
error: error,
|
38
|
+
input: input,
|
39
|
+
object: object,
|
40
|
+
output: output,
|
41
|
+
source: source,
|
42
|
+
timeout: timeout
|
43
43
|
)
|
44
44
|
end
|
45
45
|
end
|
data/package-lock.json
CHANGED