code-ruby 0.10.4 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
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