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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.node-version +1 -1
  3. data/.npm-version +1 -1
  4. data/.rubocop.yml +8 -7
  5. data/.ruby-version +1 -1
  6. data/.tool-versions +2 -2
  7. data/Gemfile +1 -1
  8. data/Gemfile.lock +34 -34
  9. data/VERSION +1 -1
  10. data/bin/code +12 -8
  11. data/code-ruby.gemspec +2 -2
  12. data/lib/code/concerns/shared.rb +10 -59
  13. data/lib/code/node/code.rb +10 -0
  14. data/lib/code/node/dictionary.rb +34 -15
  15. data/lib/code/node/function_parameter.rb +1 -1
  16. data/lib/code/object/boolean.rb +3 -2
  17. data/lib/code/object/class.rb +2 -2
  18. data/lib/code/object/code.rb +2 -2
  19. data/lib/code/object/context.rb +1 -1
  20. data/lib/code/object/date.rb +3 -3
  21. data/lib/code/object/decimal.rb +3 -3
  22. data/lib/code/object/dictionary.rb +23 -7
  23. data/lib/code/object/duration.rb +3 -3
  24. data/lib/code/object/function.rb +2 -2
  25. data/lib/code/object/global.rb +1 -5
  26. data/lib/code/object/html.rb +4 -5
  27. data/lib/code/object/http.rb +0 -2
  28. data/lib/code/object/integer.rb +3 -3
  29. data/lib/code/object/list.rb +9 -2
  30. data/lib/code/object/nothing.rb +2 -2
  31. data/lib/code/object/parameter.rb +2 -2
  32. data/lib/code/object/range.rb +2 -2
  33. data/lib/code/object/string.rb +2 -2
  34. data/lib/code/object/time.rb +100 -6
  35. data/lib/code/object.rb +5 -5
  36. data/lib/code/parser/call.rb +7 -6
  37. data/lib/code/parser/dictionary.rb +7 -5
  38. data/lib/code/parser/equal.rb +0 -4
  39. data/lib/code/parser/function.rb +8 -2
  40. data/lib/code/parser/group.rb +20 -4
  41. data/lib/code/parser/if.rb +8 -2
  42. data/lib/code/parser/name.rb +4 -8
  43. data/lib/code/parser/while.rb +8 -2
  44. data/lib/code/type/sig.rb +2 -2
  45. data/lib/code/type.rb +1 -1
  46. data/lib/code.rb +7 -7
  47. data/package-lock.json +2 -2
  48. data/package.json +2 -2
  49. data/spec/code/object/http_spec.rb +70 -66
  50. data/spec/code_spec.rb +18 -2
  51. metadata +4 -6
  52. data/TODO +0 -219
  53. data/bin/console +0 -6
@@ -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
- @raw = List.new([code_parameters, code_body])
18
+ self.raw = List.new([code_parameters, code_body])
19
19
  end
20
20
 
21
21
  def call(**args)
@@ -107,11 +107,7 @@ class Code
107
107
  end
108
108
  when "Time"
109
109
  sig(args) { Object.repeat }
110
- if code_arguments.any?
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?
@@ -3,13 +3,12 @@
3
3
  class Code
4
4
  class Object
5
5
  class Html < Object
6
- def initialize(*args, **_kargs, &)
7
- @raw =
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
- args.first
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)
@@ -175,8 +175,6 @@ class Code
175
175
 
176
176
  request_class =
177
177
  case verb
178
- when "get"
179
- ::Net::HTTP::Get
180
178
  when "head"
181
179
  ::Net::HTTP::Head
182
180
  when "post"
@@ -3,8 +3,8 @@
3
3
  class Code
4
4
  class Object
5
5
  class Integer < Object
6
- def initialize(*args, **_kargs, &)
7
- @raw =
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
- @raw = 0
18
+ self.raw = 0
19
19
  end
20
20
 
21
21
  def call(**args)
@@ -3,8 +3,8 @@
3
3
  class Code
4
4
  class Object
5
5
  class List < Object
6
- def initialize(*args, **_kargs, &)
7
- @raw =
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?
@@ -3,8 +3,8 @@
3
3
  class Code
4
4
  class Object
5
5
  class Nothing < Object
6
- def initialize(*_args, **_kargs, &)
7
- @raw = nil
6
+ def initialize(*_args, **_kargs, &_block)
7
+ self.raw = nil
8
8
  end
9
9
 
10
10
  def truthy?
@@ -3,8 +3,8 @@
3
3
  class Code
4
4
  class Object
5
5
  class Parameter < Object
6
- def initialize(*args, **_kargs, &)
7
- @raw = Dictionary.new(args.first)
6
+ def initialize(*args, **_kargs, &_block)
7
+ self.raw = Dictionary.new(args.first)
8
8
  end
9
9
 
10
10
  def code_name
@@ -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
- @raw = ::Range.new(code_left, code_right, exclude_end?)
29
+ self.raw = ::Range.new(code_left, code_right, exclude_end?)
30
30
  end
31
31
 
32
32
  def call(**args)
@@ -3,8 +3,8 @@
3
3
  class Code
4
4
  class Object
5
5
  class String < Object
6
- def initialize(*args, **_kargs, &)
7
- @raw =
6
+ def initialize(*args, **_kargs, &_block)
7
+ self.raw =
8
8
  if args.first.is_an?(Class)
9
9
  args.first.raw.name
10
10
  elsif args.first.is_an?(Object)
@@ -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
- @raw = ::Time.zone.parse(args.first.to_s) || ::Time.zone.now
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:, maximum:)
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
@@ -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 << code.aka(:body) <<
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 << code.aka(:body) <<
121
- closing_curly_bracket.maybe
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(:value).maybe) |
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(:value).maybe
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(:value).maybe
58
- ) | statement.aka(:statement)
59
+ code_present.aka(:code).maybe
60
+ ).aka(:statement_code) | code_present.aka(:code)
59
61
  end
60
62
 
61
63
  def root
@@ -51,10 +51,6 @@ class Code
51
51
  str("^")
52
52
  end
53
53
 
54
- def dot
55
- str(".")
56
- end
57
-
58
54
  def right_statement
59
55
  OrKeyword
60
56
  end
@@ -101,8 +101,14 @@ class Code
101
101
  end
102
102
 
103
103
  def body
104
- ((begin_keyword | do_keyword) << code << end_keyword.maybe) |
105
- (opening_curly_bracket << code << closing_curly_bracket.maybe) | code
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
@@ -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
- (opening_parenthesis << code << closing_parenthesis.maybe).aka(:group) |
32
- (begin_keyword << code << end_keyword.maybe).aka(:group) |
33
- (do_keyword << code << end_keyword.maybe).aka(:group) |
34
- Call
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
@@ -60,8 +60,14 @@ class Code
60
60
  end
61
61
 
62
62
  def body
63
- ((begin_keyword | do_keyword) << code << end_keyword.maybe) |
64
- (opening_curly_bracket << code << closing_curly_bracket.maybe) | code
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
@@ -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 |
@@ -52,8 +52,14 @@ class Code
52
52
  end
53
53
 
54
54
  def body
55
- ((do_keyword | begin_keyword) << code << end_keyword.maybe) |
56
- (opening_curly_bracket << code << closing_curly_bracket) | code
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:, actual:)
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:, actual:)
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
@@ -7,7 +7,7 @@ class Code
7
7
  end
8
8
 
9
9
  def repeat(minimum = 0, maximum = nil)
10
- Repeat.new(self, minimum:, maximum:)
10
+ Repeat.new(self, minimum: minimum, maximum: maximum)
11
11
  end
12
12
 
13
13
  def |(other)
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
@@ -6,8 +6,8 @@
6
6
  "": {
7
7
  "license": "MIT",
8
8
  "engines": {
9
- "node": "22.5.1",
10
- "npm": "10.8.2"
9
+ "node": "23.11.0",
10
+ "npm": "11.2.0"
11
11
  }
12
12
  }
13
13
  }
data/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "license": "MIT",
3
3
  "engines": {
4
- "node": "22.5.1",
5
- "npm": "10.8.2"
4
+ "node": "23.11.0",
5
+ "npm": "11.2.0"
6
6
  }
7
7
  }