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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +2 -2
  3. data/bin/code +6 -0
  4. data/bin/console +5 -0
  5. data/lib/code/node/base_10.rb +10 -10
  6. data/lib/code/node/base_16.rb +3 -2
  7. data/lib/code/node/base_2.rb +3 -2
  8. data/lib/code/node/base_8.rb +3 -2
  9. data/lib/code/node/boolean.rb +5 -4
  10. data/lib/code/node/call.rb +13 -19
  11. data/lib/code/node/call_argument.rb +8 -4
  12. data/lib/code/node/code.rb +4 -2
  13. data/lib/code/node/decimal.rb +8 -10
  14. data/lib/code/node/dictionary.rb +15 -8
  15. data/lib/code/node/function.rb +5 -9
  16. data/lib/code/node/function_parameter.rb +8 -4
  17. data/lib/code/node/if.rb +14 -12
  18. data/lib/code/node/left_operation.rb +10 -10
  19. data/lib/code/node/list.rb +4 -3
  20. data/lib/code/node/negation.rb +8 -4
  21. data/lib/code/node/not.rb +8 -4
  22. data/lib/code/node/nothing.rb +4 -3
  23. data/lib/code/node/number.rb +3 -3
  24. data/lib/code/node/right_operation.rb +19 -16
  25. data/lib/code/node/splat.rb +8 -4
  26. data/lib/code/node/square_bracket.rb +8 -11
  27. data/lib/code/node/statement.rb +27 -27
  28. data/lib/code/node/string.rb +14 -11
  29. data/lib/code/node/ternary.rb +8 -8
  30. data/lib/code/node/unary_minus.rb +8 -4
  31. data/lib/code/node/while.rb +15 -13
  32. data/lib/code/node.rb +1 -7
  33. data/lib/code/object/argument.rb +4 -3
  34. data/lib/code/object/boolean.rb +5 -4
  35. data/lib/code/object/class.rb +4 -3
  36. data/lib/code/object/code.rb +33 -0
  37. data/lib/code/object/context.rb +7 -5
  38. data/lib/code/object/date.rb +31 -6
  39. data/lib/code/object/decimal.rb +36 -31
  40. data/lib/code/object/dictionary.rb +4 -4
  41. data/lib/code/object/duration.rb +8 -5
  42. data/lib/code/object/function.rb +42 -28
  43. data/lib/code/object/global.rb +58 -38
  44. data/lib/code/object/integer.rb +23 -26
  45. data/lib/code/object/list.rb +5 -5
  46. data/lib/code/object/nothing.rb +2 -4
  47. data/lib/code/object/parameter.rb +43 -0
  48. data/lib/code/object/range.rb +13 -11
  49. data/lib/code/object/string.rb +7 -7
  50. data/lib/code/object/time.rb +15 -8
  51. data/lib/code/object.rb +104 -11
  52. data/lib/code/parser/code.rb +1 -1
  53. data/lib/code/parser/left_operation.rb +2 -2
  54. data/lib/code/parser/list.rb +2 -2
  55. data/lib/code/parser/right_operation.rb +2 -2
  56. data/lib/code/parser/whitespace.rb +2 -2
  57. data/lib/code/parser.rb +1 -1
  58. data/lib/code/type/sig.rb +2 -2
  59. data/lib/code/type.rb +12 -4
  60. data/lib/code/version.rb +1 -1
  61. data/lib/code-ruby.rb +7 -0
  62. data/lib/code.rb +8 -5
  63. data/spec/code/object/dictionary_spec.rb +0 -2
  64. data/spec/code_spec.rb +122 -16
  65. metadata +5 -3
  66. 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
- @left = Statement.new(parsed.delete(:left))
10
- @operator = parsed.delete(:operator)
11
- @right = Statement.new(parsed.delete(:right))
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.evaluate(**args).truthy?
20
- @left.evaluate(**args)
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.evaluate(**args).truthy?
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
- left = @left.evaluate(**args) while @right.evaluate(**args).truthy?
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
- left = @left.evaluate(**args) while @right.evaluate(**args).falsy?
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.evaluate(**args)
47
+ @left&.evaluate(**args) || Object::Nothing.new
45
48
  rescue Error
46
- @right.evaluate(**args)
49
+ @right&.evaluate(**args) || Object::Nothing.new
47
50
  end
48
51
  when /=$/
49
- right = @right.evaluate(**args)
50
- left = @left.resolve(**args)
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.evaluate(**args)
59
- left = @left.evaluate(**args)
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,
@@ -4,13 +4,17 @@ class Code
4
4
  class Node
5
5
  class Splat < Node
6
6
  def initialize(parsed)
7
- @operator = parsed.delete(:operator)
8
- @right = Node::Statement.new(parsed.delete(:right))
9
- super(parsed)
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.evaluate(**args).call(operator: @operator, arguments: [], **args)
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
- @left = Node::Statement.new(parsed.delete(:left))
8
- @statements =
9
- parsed
10
- .delete(:statements)
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.evaluate(**args)
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.resolve(**args)
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
 
@@ -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 = Node::Nothing.new(parsed.delete(:nothing))
10
+ @statement = Nothing.new(parsed.delete(:nothing))
9
11
  elsif parsed.key?(:boolean)
10
- @statement = Node::Boolean.new(parsed.delete(:boolean))
12
+ @statement = Boolean.new(parsed.delete(:boolean))
11
13
  elsif parsed.key?(:group)
12
- @statement = Node::Code.new(parsed.delete(:group))
14
+ @statement = Code.new(parsed.delete(:group))
13
15
  elsif parsed.key?(:call)
14
- @statement = Node::Call.new(parsed.delete(:call))
16
+ @statement = Call.new(parsed.delete(:call))
15
17
  elsif parsed.key?(:number)
16
- @statement = Node::Number.new(parsed.delete(:number))
18
+ @statement = Number.new(parsed.delete(:number))
17
19
  elsif parsed.key?(:string)
18
- @statement = Node::String.new(parsed.delete(:string))
20
+ @statement = String.new(parsed.delete(:string))
19
21
  elsif parsed.key?(:list)
20
- @statement = Node::List.new(parsed.delete(:list))
22
+ @statement = List.new(parsed.delete(:list))
21
23
  elsif parsed.key?(:dictionnary)
22
- @statement = Node::Dictionary.new(parsed.delete(:dictionnary))
24
+ @statement = Dictionary.new(parsed.delete(:dictionnary))
23
25
  elsif parsed.key?(:chained_call)
24
- @statement = Node::ChainedCall.new(parsed.delete(:chained_call))
26
+ @statement = ChainedCall.new(parsed.delete(:chained_call))
25
27
  elsif parsed.key?(:left_operation)
26
- @statement = Node::LeftOperation.new(parsed.delete(:left_operation))
28
+ @statement = LeftOperation.new(parsed.delete(:left_operation))
27
29
  elsif parsed.key?(:right_operation)
28
- @statement = Node::RightOperation.new(parsed.delete(:right_operation))
30
+ @statement = RightOperation.new(parsed.delete(:right_operation))
29
31
  elsif parsed.key?(:function)
30
- @statement = Node::Function.new(parsed.delete(:function))
32
+ @statement = Function.new(parsed.delete(:function))
31
33
  elsif parsed.key?(:negation)
32
- @statement = Node::Negation.new(parsed.delete(:negation))
34
+ @statement = Negation.new(parsed.delete(:negation))
33
35
  elsif parsed.key?(:power)
34
- @statement = Node::Power.new(parsed.delete(:power))
36
+ @statement = Power.new(parsed.delete(:power))
35
37
  elsif parsed.key?(:unary_minus)
36
- @statement = Node::UnaryMinus.new(parsed.delete(:unary_minus))
38
+ @statement = UnaryMinus.new(parsed.delete(:unary_minus))
37
39
  elsif parsed.key?(:ternary)
38
- @statement = Node::Ternary.new(parsed.delete(:ternary))
40
+ @statement = Ternary.new(parsed.delete(:ternary))
39
41
  elsif parsed.key?(:rescue)
40
- @statement = Node::Rescue.new(parsed.delete(:rescue))
42
+ @statement = Rescue.new(parsed.delete(:rescue))
41
43
  elsif parsed.key?(:not)
42
- @statement = Node::Not.new(parsed.delete(:not))
44
+ @statement = Not.new(parsed.delete(:not))
43
45
  elsif parsed.key?(:if_modifier)
44
- @statement = Node::IfModifier.new(parsed.delete(:if_modifier))
46
+ @statement = IfModifier.new(parsed.delete(:if_modifier))
45
47
  elsif parsed.key?(:if)
46
- @statement = Node::If.new(parsed.delete(:if))
48
+ @statement = If.new(parsed.delete(:if))
47
49
  elsif parsed.key?(:while)
48
- @statement = Node::While.new(parsed.delete(:while))
50
+ @statement = While.new(parsed.delete(:while))
49
51
  elsif parsed.key?(:splat)
50
- @statement = Node::Splat.new(parsed.delete(:splat))
52
+ @statement = Splat.new(parsed.delete(:splat))
51
53
  elsif parsed.key?(:square_bracket)
52
- @statement = Node::SquareBracket.new(parsed.delete(:square_bracket))
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.evaluate(**args)
59
+ @statement&.evaluate(**args) || Object::Nothing.new
60
60
  end
61
61
 
62
62
  def resolve(**args)
63
- @statement.resolve(**args)
63
+ @statement&.resolve(**args) || Object::Nothing.new
64
64
  end
65
65
  end
66
66
  end
@@ -6,22 +6,25 @@ class Code
6
6
  class Part < Node
7
7
  class Code < Node
8
8
  def initialize(parsed)
9
- @code = Node::Code.new(parsed)
9
+ return if parsed.blank?
10
+ @code = Node::Code.new(parsed.presence)
10
11
  end
11
12
 
12
13
  def evaluate(**args)
13
- @code.evaluate(**args)
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.evaluate(**args)
50
+ @part&.evaluate(**args) || Object::Nothing.new
48
51
  end
49
52
  end
50
53
 
51
54
  def initialize(parsed)
52
- parsed = [] if parsed == ""
53
-
54
- @parts = parsed.map { |part| Node::String::Part.new(part) }
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
@@ -4,17 +4,17 @@ class Code
4
4
  class Node
5
5
  class Ternary < Node
6
6
  def initialize(parsed)
7
- @left = Node::Statement.new(parsed.delete(:left))
8
- @middle = Node::Statement.new(parsed.delete(:middle))
9
- @right = Node::Statement.new(parsed.delete(:right)) if parsed.key?(
10
- :right
11
- )
12
- super(parsed)
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.evaluate(**args).truthy?
17
- @middle.evaluate(**args)
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
- @operator = parsed.delete(:operator)
8
- @right = Node::Statement.new(parsed.delete(:right))
9
- super(parsed)
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.evaluate(**args).call(operator: @operator, arguments: [], **args)
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
@@ -8,12 +8,12 @@ class Code
8
8
  LOOP_KEYWORD = "loop"
9
9
 
10
10
  def initialize(parsed)
11
- @operator = parsed.delete(:operator)
12
- @statement = Statement.new(parsed.delete(:statement)) if parsed[
13
- :statement
14
- ]
15
- @body = Code.new(parsed.delete(:body))
16
- super(parsed)
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
- last = @body.evaluate(**args) while @statement.evaluate(
25
- **args
26
- ).truthy?
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
- last = @body.evaluate(**args) while @statement.evaluate(**args).falsy?
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.evaluate(**args) }
37
- raise NotImplementedError
38
+ loop { @body&.evaluate(**args) || Object::Nothing.new }
39
+ Object::Nothing.new
38
40
  else
39
- raise NotImplementedError, @operator
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
- raise NotImplementedError, "#{self.class.name}#evaluate"
6
+ Object::Nothing.new
13
7
  end
14
8
 
15
9
  def resolve(...)
@@ -5,9 +5,10 @@ class Code
5
5
  class Argument < Object
6
6
  attr_reader :value, :name
7
7
 
8
- def initialize(value, name: nil)
9
- @value = value
10
- @name = 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?
@@ -3,10 +3,11 @@
3
3
  class Code
4
4
  class Object
5
5
  class Boolean < ::Code::Object
6
- attr_reader :raw
7
-
8
- def initialize(raw)
9
- @raw = (raw.is_a?(Object) ? raw.truthy? : !!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
@@ -3,11 +3,12 @@
3
3
  class Code
4
4
  class Object
5
5
  class Class < Object
6
- attr_reader :raw
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
@@ -5,10 +5,12 @@ class Code
5
5
  class Context < Dictionary
6
6
  attr_reader :parent
7
7
 
8
- def initialize(raw = {}, parent: nil)
9
- raw = raw.raw if raw.is_a?(Dictionary)
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 = 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 Code::Error::Undefined, "#{identifier} is not defined"
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: parent || other.parent)
31
+ Context.new(raw.merge(other.raw), parent || other.parent)
30
32
  end
31
33
 
32
34
  def parent?
@@ -3,11 +3,12 @@
3
3
  class Code
4
4
  class Object
5
5
  class Date < Object
6
- attr_reader :raw
7
-
8
- def initialize(date)
9
- date = date.raw if date.is_a?(Date)
10
- @raw = date.to_date
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