code-ruby 0.10.4 → 0.12.0
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 +2 -2
- data/bin/code +6 -0
- data/bin/console +5 -0
- data/lib/code/node/base_10.rb +10 -10
- data/lib/code/node/base_16.rb +3 -2
- data/lib/code/node/base_2.rb +3 -2
- data/lib/code/node/base_8.rb +3 -2
- data/lib/code/node/boolean.rb +5 -4
- data/lib/code/node/call.rb +13 -19
- data/lib/code/node/call_argument.rb +8 -4
- data/lib/code/node/code.rb +4 -2
- data/lib/code/node/decimal.rb +8 -10
- data/lib/code/node/dictionary.rb +15 -8
- data/lib/code/node/function.rb +5 -9
- data/lib/code/node/function_parameter.rb +8 -4
- data/lib/code/node/if.rb +14 -12
- data/lib/code/node/left_operation.rb +10 -10
- data/lib/code/node/list.rb +4 -3
- data/lib/code/node/negation.rb +8 -4
- data/lib/code/node/not.rb +8 -4
- data/lib/code/node/nothing.rb +4 -3
- data/lib/code/node/number.rb +3 -3
- data/lib/code/node/right_operation.rb +19 -16
- data/lib/code/node/splat.rb +8 -4
- data/lib/code/node/square_bracket.rb +8 -11
- data/lib/code/node/statement.rb +27 -27
- data/lib/code/node/string.rb +14 -11
- data/lib/code/node/ternary.rb +8 -8
- data/lib/code/node/unary_minus.rb +8 -4
- data/lib/code/node/while.rb +15 -13
- data/lib/code/node.rb +1 -7
- data/lib/code/object/argument.rb +4 -3
- data/lib/code/object/boolean.rb +5 -4
- data/lib/code/object/class.rb +4 -3
- data/lib/code/object/code.rb +33 -0
- data/lib/code/object/context.rb +7 -5
- data/lib/code/object/date.rb +31 -6
- data/lib/code/object/decimal.rb +36 -31
- data/lib/code/object/dictionary.rb +4 -4
- data/lib/code/object/duration.rb +8 -5
- data/lib/code/object/function.rb +42 -28
- data/lib/code/object/global.rb +58 -38
- data/lib/code/object/integer.rb +23 -26
- data/lib/code/object/list.rb +5 -5
- data/lib/code/object/nothing.rb +2 -4
- data/lib/code/object/parameter.rb +43 -0
- data/lib/code/object/range.rb +13 -11
- data/lib/code/object/string.rb +7 -7
- data/lib/code/object/time.rb +15 -8
- data/lib/code/object.rb +104 -11
- data/lib/code/parser/code.rb +1 -1
- data/lib/code/parser/left_operation.rb +2 -2
- data/lib/code/parser/list.rb +2 -2
- data/lib/code/parser/right_operation.rb +2 -2
- data/lib/code/parser/whitespace.rb +2 -2
- data/lib/code/parser.rb +1 -1
- data/lib/code/type/sig.rb +2 -2
- data/lib/code/type.rb +12 -4
- data/lib/code/version.rb +1 -1
- data/lib/code-ruby.rb +7 -0
- data/lib/code.rb +8 -5
- data/spec/code/object/dictionary_spec.rb +0 -2
- data/spec/code_spec.rb +122 -16
- metadata +5 -3
- data/lib/code/object/number.rb +0 -11
@@ -6,23 +6,22 @@ class Code
|
|
6
6
|
EQUAL = "="
|
7
7
|
|
8
8
|
def initialize(parsed)
|
9
|
-
|
10
|
-
@
|
11
|
-
@
|
12
|
-
|
13
|
-
super(parsed)
|
9
|
+
return if parsed.blank?
|
10
|
+
@left = Statement.new(parsed.delete(:left).presence)
|
11
|
+
@operator = parsed.delete(:operator).presence
|
12
|
+
@right = Statement.new(parsed.delete(:right).presence)
|
14
13
|
end
|
15
14
|
|
16
15
|
def evaluate(**args)
|
17
16
|
case @operator
|
18
17
|
when "if"
|
19
|
-
if @right
|
20
|
-
@left
|
18
|
+
if (@right&.evaluate(**args) || Object::Nothing.new).truthy?
|
19
|
+
@left&.evaluate(**args) || Object::Nothing.new
|
21
20
|
else
|
22
21
|
Object::Nothing.new
|
23
22
|
end
|
24
23
|
when "unless"
|
25
|
-
if @right
|
24
|
+
if (@right&.evaluate(**args) || Object::Nothing.new).truthy?
|
26
25
|
Object::Nothing.new
|
27
26
|
else
|
28
27
|
@left.evaluate(**args)
|
@@ -30,24 +29,28 @@ class Code
|
|
30
29
|
when "while"
|
31
30
|
left = Object::Nothing.new
|
32
31
|
|
33
|
-
|
32
|
+
while (@right&.evaluate(**args) || Object::Nothing.new).truthy?
|
33
|
+
left = @left&.evaluate(**args) || Object::Nothing.new
|
34
|
+
end
|
34
35
|
|
35
36
|
left
|
36
37
|
when "until"
|
37
38
|
left = Object::Nothing.new
|
38
39
|
|
39
|
-
|
40
|
+
while (@right&.evaluate(**args) || Object::Nothing.new).falsy?
|
41
|
+
left = @left&.evaluate(**args) || Object::Nothing.new
|
42
|
+
end
|
40
43
|
|
41
44
|
left
|
42
45
|
when "rescue"
|
43
46
|
begin
|
44
|
-
@left
|
47
|
+
@left&.evaluate(**args) || Object::Nothing.new
|
45
48
|
rescue Error
|
46
|
-
@right
|
49
|
+
@right&.evaluate(**args) || Object::Nothing.new
|
47
50
|
end
|
48
51
|
when /=$/
|
49
|
-
right = @right
|
50
|
-
left = @left
|
52
|
+
right = @right&.evaluate(**args) || Object::Nothing.new
|
53
|
+
left = @left&.resolve(**args) || Object::Nothing.new
|
51
54
|
|
52
55
|
left.call(
|
53
56
|
operator: @operator,
|
@@ -55,8 +58,8 @@ class Code
|
|
55
58
|
**args
|
56
59
|
)
|
57
60
|
else
|
58
|
-
right = @right
|
59
|
-
left = @left
|
61
|
+
right = @right&.evaluate(**args) || Object::Nothing.new
|
62
|
+
left = @left&.evaluate(**args) || Object::Nothing.new
|
60
63
|
|
61
64
|
left.call(
|
62
65
|
operator: @operator,
|
data/lib/code/node/splat.rb
CHANGED
@@ -4,13 +4,17 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Splat < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@
|
9
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@operator = parsed.delete(:operator).presence
|
9
|
+
@right = Node::Statement.new(parsed.delete(:right).presence)
|
10
10
|
end
|
11
11
|
|
12
12
|
def evaluate(**args)
|
13
|
-
@right
|
13
|
+
if @right
|
14
|
+
@right.evaluate(**args).call(operator: @operator, **args)
|
15
|
+
else
|
16
|
+
Object::Nothing.new
|
17
|
+
end
|
14
18
|
end
|
15
19
|
end
|
16
20
|
end
|
@@ -4,29 +4,26 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class SquareBracket < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@
|
9
|
-
|
10
|
-
|
11
|
-
.map { |statement| Node::Statement.new(statement) }
|
12
|
-
|
13
|
-
super(parsed)
|
7
|
+
return if parsed.blank?
|
8
|
+
@left = Node::Statement.new(parsed.delete(:left).presence)
|
9
|
+
@statements = parsed.delete(:statements).presence || []
|
10
|
+
@statements.map! { |statement| Node::Statement.new(statement) }
|
14
11
|
end
|
15
12
|
|
16
13
|
def evaluate(**args)
|
17
|
-
left = @left
|
14
|
+
left = @left&.evaluate(**args) || Object::Nothing.new
|
18
15
|
|
19
|
-
@statements.reduce(left) do |object, statement|
|
16
|
+
(@statements || []).reduce(left) do |object, statement|
|
20
17
|
object.code_fetch(statement.evaluate(**args))
|
21
18
|
end
|
22
19
|
end
|
23
20
|
|
24
21
|
def resolve(**args)
|
25
|
-
left = @left
|
22
|
+
left = @left&.resolve(**args) || Object::Nothing.new
|
26
23
|
|
27
24
|
list = Object::IdentifierList.new([left])
|
28
25
|
|
29
|
-
@statements.each do |statement|
|
26
|
+
(@statements || []).each do |statement|
|
30
27
|
list.code_append(statement.evaluate(**args))
|
31
28
|
end
|
32
29
|
|
data/lib/code/node/statement.rb
CHANGED
@@ -4,63 +4,63 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Statement < Node
|
6
6
|
def initialize(parsed)
|
7
|
+
return if parsed.blank?
|
8
|
+
|
7
9
|
if parsed.key?(:nothing)
|
8
|
-
@statement =
|
10
|
+
@statement = Nothing.new(parsed.delete(:nothing))
|
9
11
|
elsif parsed.key?(:boolean)
|
10
|
-
@statement =
|
12
|
+
@statement = Boolean.new(parsed.delete(:boolean))
|
11
13
|
elsif parsed.key?(:group)
|
12
|
-
@statement =
|
14
|
+
@statement = Code.new(parsed.delete(:group))
|
13
15
|
elsif parsed.key?(:call)
|
14
|
-
@statement =
|
16
|
+
@statement = Call.new(parsed.delete(:call))
|
15
17
|
elsif parsed.key?(:number)
|
16
|
-
@statement =
|
18
|
+
@statement = Number.new(parsed.delete(:number))
|
17
19
|
elsif parsed.key?(:string)
|
18
|
-
@statement =
|
20
|
+
@statement = String.new(parsed.delete(:string))
|
19
21
|
elsif parsed.key?(:list)
|
20
|
-
@statement =
|
22
|
+
@statement = List.new(parsed.delete(:list))
|
21
23
|
elsif parsed.key?(:dictionnary)
|
22
|
-
@statement =
|
24
|
+
@statement = Dictionary.new(parsed.delete(:dictionnary))
|
23
25
|
elsif parsed.key?(:chained_call)
|
24
|
-
@statement =
|
26
|
+
@statement = ChainedCall.new(parsed.delete(:chained_call))
|
25
27
|
elsif parsed.key?(:left_operation)
|
26
|
-
@statement =
|
28
|
+
@statement = LeftOperation.new(parsed.delete(:left_operation))
|
27
29
|
elsif parsed.key?(:right_operation)
|
28
|
-
@statement =
|
30
|
+
@statement = RightOperation.new(parsed.delete(:right_operation))
|
29
31
|
elsif parsed.key?(:function)
|
30
|
-
@statement =
|
32
|
+
@statement = Function.new(parsed.delete(:function))
|
31
33
|
elsif parsed.key?(:negation)
|
32
|
-
@statement =
|
34
|
+
@statement = Negation.new(parsed.delete(:negation))
|
33
35
|
elsif parsed.key?(:power)
|
34
|
-
@statement =
|
36
|
+
@statement = Power.new(parsed.delete(:power))
|
35
37
|
elsif parsed.key?(:unary_minus)
|
36
|
-
@statement =
|
38
|
+
@statement = UnaryMinus.new(parsed.delete(:unary_minus))
|
37
39
|
elsif parsed.key?(:ternary)
|
38
|
-
@statement =
|
40
|
+
@statement = Ternary.new(parsed.delete(:ternary))
|
39
41
|
elsif parsed.key?(:rescue)
|
40
|
-
@statement =
|
42
|
+
@statement = Rescue.new(parsed.delete(:rescue))
|
41
43
|
elsif parsed.key?(:not)
|
42
|
-
@statement =
|
44
|
+
@statement = Not.new(parsed.delete(:not))
|
43
45
|
elsif parsed.key?(:if_modifier)
|
44
|
-
@statement =
|
46
|
+
@statement = IfModifier.new(parsed.delete(:if_modifier))
|
45
47
|
elsif parsed.key?(:if)
|
46
|
-
@statement =
|
48
|
+
@statement = If.new(parsed.delete(:if))
|
47
49
|
elsif parsed.key?(:while)
|
48
|
-
@statement =
|
50
|
+
@statement = While.new(parsed.delete(:while))
|
49
51
|
elsif parsed.key?(:splat)
|
50
|
-
@statement =
|
52
|
+
@statement = Splat.new(parsed.delete(:splat))
|
51
53
|
elsif parsed.key?(:square_bracket)
|
52
|
-
@statement =
|
54
|
+
@statement = SquareBracket.new(parsed.delete(:square_bracket))
|
53
55
|
end
|
54
|
-
|
55
|
-
super(parsed)
|
56
56
|
end
|
57
57
|
|
58
58
|
def evaluate(**args)
|
59
|
-
@statement
|
59
|
+
@statement&.evaluate(**args) || Object::Nothing.new
|
60
60
|
end
|
61
61
|
|
62
62
|
def resolve(**args)
|
63
|
-
@statement
|
63
|
+
@statement&.resolve(**args) || Object::Nothing.new
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
data/lib/code/node/string.rb
CHANGED
@@ -6,22 +6,25 @@ class Code
|
|
6
6
|
class Part < Node
|
7
7
|
class Code < Node
|
8
8
|
def initialize(parsed)
|
9
|
-
|
9
|
+
return if parsed.blank?
|
10
|
+
@code = Node::Code.new(parsed.presence)
|
10
11
|
end
|
11
12
|
|
12
13
|
def evaluate(**args)
|
13
|
-
@code
|
14
|
+
@code&.evaluate(**args) || Object::Nothing.new
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
18
|
class Text < Node
|
18
19
|
def initialize(parsed)
|
20
|
+
return if parsed.blank?
|
19
21
|
@text = parsed
|
20
22
|
end
|
21
23
|
|
22
24
|
def evaluate(**_args)
|
23
25
|
::Code::Object::String.new(
|
24
26
|
@text
|
27
|
+
.to_s
|
25
28
|
.gsub('\n', "\n")
|
26
29
|
.gsub('\r', "\r")
|
27
30
|
.gsub('\t', "\t")
|
@@ -34,29 +37,29 @@ class Code
|
|
34
37
|
end
|
35
38
|
|
36
39
|
def initialize(parsed)
|
40
|
+
return if parsed.blank?
|
41
|
+
|
37
42
|
if parsed.key?(:text)
|
38
|
-
@part = Node::String::Part::Text.new(parsed.delete(:text))
|
43
|
+
@part = Node::String::Part::Text.new(parsed.delete(:text).presence)
|
39
44
|
elsif parsed.key?(:code)
|
40
|
-
@part = Node::String::Part::Code.new(parsed.delete(:code))
|
45
|
+
@part = Node::String::Part::Code.new(parsed.delete(:code).presence)
|
41
46
|
end
|
42
|
-
|
43
|
-
super(parsed)
|
44
47
|
end
|
45
48
|
|
46
49
|
def evaluate(**args)
|
47
|
-
@part
|
50
|
+
@part&.evaluate(**args) || Object::Nothing.new
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
51
54
|
def initialize(parsed)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
+
return if parsed.blank?
|
56
|
+
@parts =
|
57
|
+
(parsed.presence || []).map { |part| Node::String::Part.new(part) }
|
55
58
|
end
|
56
59
|
|
57
60
|
def evaluate(**args)
|
58
61
|
::Code::Object::String.new(
|
59
|
-
@parts.map { |part| part.evaluate(**args) }.map(&:to_s).join
|
62
|
+
(@parts || []).map { |part| part.evaluate(**args) }.map(&:to_s).join
|
60
63
|
)
|
61
64
|
end
|
62
65
|
end
|
data/lib/code/node/ternary.rb
CHANGED
@@ -4,17 +4,17 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class Ternary < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@
|
9
|
-
@
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@left = Node::Statement.new(parsed.delete(:left).presence)
|
9
|
+
@middle = Node::Statement.new(parsed.delete(:middle).presence)
|
10
|
+
if parsed.key?(:right)
|
11
|
+
@right = Node::Statement.new(parsed.delete(:right).presence)
|
12
|
+
end
|
13
13
|
end
|
14
14
|
|
15
15
|
def evaluate(**args)
|
16
|
-
if @left
|
17
|
-
@middle
|
16
|
+
if (@left&.evaluate(**args) || Object::Nothing.new).truthy?
|
17
|
+
@middle&.evaluate(**args) || Object::Nothing.new
|
18
18
|
elsif @right
|
19
19
|
@right.evaluate(**args)
|
20
20
|
else
|
@@ -4,13 +4,17 @@ class Code
|
|
4
4
|
class Node
|
5
5
|
class UnaryMinus < Node
|
6
6
|
def initialize(parsed)
|
7
|
-
|
8
|
-
@
|
9
|
-
|
7
|
+
return if parsed.blank?
|
8
|
+
@operator = parsed.delete(:operator).presence
|
9
|
+
@right = Node::Statement.new(parsed.delete(:right).presence)
|
10
10
|
end
|
11
11
|
|
12
12
|
def evaluate(**args)
|
13
|
-
@right
|
13
|
+
if @right
|
14
|
+
@right.evaluate(**args).call(operator: @operator, **args)
|
15
|
+
else
|
16
|
+
Object::Nothing.new
|
17
|
+
end
|
14
18
|
end
|
15
19
|
end
|
16
20
|
end
|
data/lib/code/node/while.rb
CHANGED
@@ -8,12 +8,12 @@ class Code
|
|
8
8
|
LOOP_KEYWORD = "loop"
|
9
9
|
|
10
10
|
def initialize(parsed)
|
11
|
-
|
12
|
-
@
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
return if parsed.blank?
|
12
|
+
@operator = parsed.delete(:operator).presence
|
13
|
+
if parsed.key?(:statement)
|
14
|
+
@statement = Statement.new(parsed.delete(:statement))
|
15
|
+
end
|
16
|
+
@body = Code.new(parsed.delete(:body).presence)
|
17
17
|
end
|
18
18
|
|
19
19
|
def evaluate(**args)
|
@@ -21,22 +21,24 @@ class Code
|
|
21
21
|
when WHILE_KEYWORD
|
22
22
|
last = Object::Nothing.new
|
23
23
|
|
24
|
-
|
25
|
-
**args
|
26
|
-
|
24
|
+
while (@statement&.evaluate(**args) || Object::Nothing.new).truthy?
|
25
|
+
last = @body&.evaluate(**args) || Object::Nothing.new
|
26
|
+
end
|
27
27
|
|
28
28
|
last
|
29
29
|
when UNTIL_KEYWORD
|
30
30
|
last = Object::Nothing.new
|
31
31
|
|
32
|
-
|
32
|
+
while (@statement&.evaluate(**args) || Object::Nothing.new).falsy?
|
33
|
+
last = @body&.evaluate(**args) || Object::Nothing.new
|
34
|
+
end
|
33
35
|
|
34
36
|
last
|
35
37
|
when LOOP_KEYWORD
|
36
|
-
loop { @body
|
37
|
-
|
38
|
+
loop { @body&.evaluate(**args) || Object::Nothing.new }
|
39
|
+
Object::Nothing.new
|
38
40
|
else
|
39
|
-
|
41
|
+
Object::Nothing.new
|
40
42
|
end
|
41
43
|
rescue Error::Break => e
|
42
44
|
e.value || Object::Nothing.new
|
data/lib/code/node.rb
CHANGED
@@ -2,14 +2,8 @@
|
|
2
2
|
|
3
3
|
class Code
|
4
4
|
class Node
|
5
|
-
def initialize(parsed)
|
6
|
-
return if parsed.nil? || parsed.empty?
|
7
|
-
|
8
|
-
raise NotImplementedError, "#{self.class.name}: #{parsed.inspect}"
|
9
|
-
end
|
10
|
-
|
11
5
|
def evaluate(**_args)
|
12
|
-
|
6
|
+
Object::Nothing.new
|
13
7
|
end
|
14
8
|
|
15
9
|
def resolve(...)
|
data/lib/code/object/argument.rb
CHANGED
@@ -5,9 +5,10 @@ class Code
|
|
5
5
|
class Argument < Object
|
6
6
|
attr_reader :value, :name
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
@value =
|
10
|
-
@name =
|
8
|
+
def initialize(*args, **_kargs, &_block)
|
9
|
+
@value = args.first.presence || Nothing.new
|
10
|
+
@name = args.second.present? ? String.new(args.second) : nil
|
11
|
+
super
|
11
12
|
end
|
12
13
|
|
13
14
|
def keyword?
|
data/lib/code/object/boolean.rb
CHANGED
@@ -3,10 +3,11 @@
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
5
|
class Boolean < ::Code::Object
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
@raw =
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
raw = args.first || Nothing.new
|
8
|
+
raw = raw.raw if raw.is_a?(Object)
|
9
|
+
@raw = !!raw
|
10
|
+
super
|
10
11
|
end
|
11
12
|
|
12
13
|
def self.name
|
data/lib/code/object/class.rb
CHANGED
@@ -3,11 +3,12 @@
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
5
|
class Class < Object
|
6
|
-
|
7
|
-
|
8
|
-
def initialize(raw)
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
raw = args.first || Nothing.new
|
9
8
|
raw = raw.raw if raw.is_a?(Class)
|
9
|
+
raw = raw.class if raw.is_an?(Object)
|
10
10
|
@raw = raw
|
11
|
+
super
|
11
12
|
end
|
12
13
|
|
13
14
|
def call(...)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Code
|
4
|
+
class Object
|
5
|
+
class Code < Object
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
raw = args.first.presence || Nothing.new
|
8
|
+
@raw = raw.is_a?(Node) ? raw : Node::Code.new(::Code.parse(raw.to_s))
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.name
|
13
|
+
"Code"
|
14
|
+
end
|
15
|
+
|
16
|
+
def evaluate(...)
|
17
|
+
raw.evaluate(...)
|
18
|
+
end
|
19
|
+
|
20
|
+
def inspect
|
21
|
+
"code"
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
"code"
|
26
|
+
end
|
27
|
+
|
28
|
+
def as_json(...)
|
29
|
+
"code".as_json(...)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/code/object/context.rb
CHANGED
@@ -5,10 +5,12 @@ class Code
|
|
5
5
|
class Context < Dictionary
|
6
6
|
attr_reader :parent
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
raw =
|
8
|
+
def initialize(*args, **_kargs, &_block)
|
9
|
+
raw = args.first || Dictionary.new
|
10
|
+
raw = raw.raw if raw.is_a?(Object)
|
10
11
|
@raw = raw.to_h
|
11
|
-
@parent =
|
12
|
+
@parent = Context.new(args.second) if args.second
|
13
|
+
super
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.name
|
@@ -21,12 +23,12 @@ class Code
|
|
21
23
|
elsif parent?
|
22
24
|
parent.lookup!(identifier)
|
23
25
|
else
|
24
|
-
raise
|
26
|
+
raise Error::Undefined, "#{identifier} is not defined"
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
28
30
|
def merge(other)
|
29
|
-
Context.new(raw.merge(other.raw), parent
|
31
|
+
Context.new(raw.merge(other.raw), parent || other.parent)
|
30
32
|
end
|
31
33
|
|
32
34
|
def parent?
|
data/lib/code/object/date.rb
CHANGED
@@ -3,11 +3,12 @@
|
|
3
3
|
class Code
|
4
4
|
class Object
|
5
5
|
class Date < Object
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
def initialize(*args, **_kargs, &_block)
|
7
|
+
raw = args.map(&:to_s).join("-").presence || ::Date.current.to_s
|
8
|
+
@raw = ::Date.parse(raw)
|
9
|
+
super
|
10
|
+
rescue ::Date::Error
|
11
|
+
raise Error, "#{raw.inspect} is an invalid date"
|
11
12
|
end
|
12
13
|
|
13
14
|
def self.name
|
@@ -21,14 +22,38 @@ class Code
|
|
21
22
|
when "tomorrow"
|
22
23
|
sig(args)
|
23
24
|
code_tomorrow
|
25
|
+
when "yesterday"
|
26
|
+
sig(args)
|
27
|
+
code_yesterday
|
28
|
+
when "today"
|
29
|
+
sig(args)
|
30
|
+
code_today
|
31
|
+
when "now"
|
32
|
+
sig(args)
|
33
|
+
code_now
|
24
34
|
else
|
25
35
|
super
|
26
36
|
end
|
27
37
|
end
|
28
38
|
|
39
|
+
def self.code_now
|
40
|
+
::Time.zone ||= Time::DEFAULT_ZONE
|
41
|
+
new(::Time.zone.now.beginning_of_day)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.code_today
|
45
|
+
::Time.zone ||= Time::DEFAULT_ZONE
|
46
|
+
new(::Time.zone.now.beginning_of_day)
|
47
|
+
end
|
48
|
+
|
29
49
|
def self.code_tomorrow
|
30
50
|
::Time.zone ||= Time::DEFAULT_ZONE
|
31
|
-
new(::Time.zone.tomorrow)
|
51
|
+
new(::Time.zone.tomorrow.beginning_of_day)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.code_yesterday
|
55
|
+
::Time.zone ||= Time::DEFAULT_ZONE
|
56
|
+
new(::Time.zone.yesterday.beginning_of_day)
|
32
57
|
end
|
33
58
|
|
34
59
|
def inspect
|