gloo 0.6.1 → 0.7.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 (170) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/lib/gloo/app/args.rb +48 -6
  4. data/lib/gloo/app/engine.rb +58 -39
  5. data/lib/gloo/app/help.rb +126 -25
  6. data/lib/gloo/app/info.rb +3 -1
  7. data/lib/gloo/app/log.rb +23 -0
  8. data/lib/gloo/app/mode.rb +2 -0
  9. data/lib/gloo/app/settings.rb +75 -68
  10. data/lib/gloo/convert/converter.rb +35 -0
  11. data/lib/gloo/convert/string_to_datetime.rb +1 -1
  12. data/lib/gloo/convert/string_to_decimal.rb +1 -1
  13. data/lib/gloo/convert/string_to_integer.rb +1 -1
  14. data/lib/gloo/core/dictionary.rb +99 -22
  15. data/lib/gloo/core/error.rb +19 -8
  16. data/lib/gloo/core/event_manager.rb +4 -0
  17. data/lib/gloo/core/factory.rb +11 -0
  18. data/lib/gloo/core/gloo_system.rb +1 -1
  19. data/lib/gloo/core/heap.rb +11 -3
  20. data/lib/gloo/core/it.rb +6 -0
  21. data/lib/gloo/core/literal.rb +5 -0
  22. data/lib/gloo/core/obj.rb +14 -0
  23. data/lib/gloo/core/op.rb +7 -0
  24. data/lib/gloo/core/parser.rb +6 -0
  25. data/lib/gloo/core/pn.rb +36 -0
  26. data/lib/gloo/core/tokens.rb +66 -22
  27. data/lib/gloo/core/verb.rb +4 -0
  28. data/lib/gloo/exec/exec_env.rb +13 -1
  29. data/lib/gloo/expr/expression.rb +26 -4
  30. data/lib/gloo/expr/l_boolean.rb +6 -0
  31. data/lib/gloo/expr/l_decimal.rb +5 -0
  32. data/lib/gloo/expr/l_integer.rb +7 -0
  33. data/lib/gloo/expr/l_string.rb +7 -0
  34. data/lib/gloo/expr/op_div.rb +2 -0
  35. data/lib/gloo/expr/op_minus.rb +2 -0
  36. data/lib/gloo/expr/op_mult.rb +2 -0
  37. data/lib/gloo/expr/op_plus.rb +2 -0
  38. data/lib/gloo/help/app/application.txt +22 -0
  39. data/lib/gloo/help/app/configuration.txt +7 -0
  40. data/lib/gloo/help/app/default_help.txt +14 -0
  41. data/lib/gloo/help/app/logging.txt +16 -0
  42. data/lib/gloo/help/core/color.txt +31 -0
  43. data/lib/gloo/help/core/error.txt +33 -0
  44. data/lib/gloo/help/core/events.txt +21 -0
  45. data/lib/gloo/help/core/gloo_system.txt +54 -0
  46. data/lib/gloo/help/core/here.txt +30 -0
  47. data/lib/gloo/help/core/it.txt +23 -0
  48. data/lib/gloo/help/core/ops.txt +16 -0
  49. data/lib/gloo/help/core/pathname.txt +29 -0
  50. data/lib/gloo/help/objs/basic/alias.txt +36 -0
  51. data/lib/gloo/help/objs/basic/boolean.txt +28 -0
  52. data/lib/gloo/help/objs/basic/container.txt +33 -0
  53. data/lib/gloo/help/objs/basic/decimal.txt +28 -0
  54. data/lib/gloo/help/objs/basic/integer.txt +27 -0
  55. data/lib/gloo/help/objs/basic/script.txt +29 -0
  56. data/lib/gloo/help/objs/basic/string.txt +28 -0
  57. data/lib/gloo/help/objs/basic/text.txt +27 -0
  58. data/lib/gloo/help/objs/basic/untyped.txt +22 -0
  59. data/lib/gloo/help/objs/cli/banner.txt +49 -0
  60. data/lib/gloo/help/objs/cli/bar.txt +34 -0
  61. data/lib/gloo/help/objs/cli/colorize.txt +33 -0
  62. data/lib/gloo/help/objs/cli/confirm.txt +26 -0
  63. data/lib/gloo/help/objs/cli/menu.txt +44 -0
  64. data/lib/gloo/help/objs/cli/menu_item.txt +26 -0
  65. data/lib/gloo/help/objs/cli/pastel.txt +43 -0
  66. data/lib/gloo/help/objs/cli/prompt.txt +27 -0
  67. data/lib/gloo/help/objs/cli/select.txt +34 -0
  68. data/lib/gloo/help/objs/ctrl/each.txt +48 -0
  69. data/lib/gloo/help/objs/ctrl/repeat.txt +38 -0
  70. data/lib/gloo/help/objs/data/markdown.txt +25 -0
  71. data/lib/gloo/help/objs/data/table.txt +46 -0
  72. data/lib/gloo/help/objs/dev/git_repo.txt +35 -0
  73. data/lib/gloo/help/objs/dt/date.txt +23 -0
  74. data/lib/gloo/help/objs/dt/datetime.txt +24 -0
  75. data/lib/gloo/help/objs/dt/time.txt +23 -0
  76. data/lib/gloo/help/objs/ror/erb.txt +37 -0
  77. data/lib/gloo/help/objs/ror/eval.txt +24 -0
  78. data/lib/gloo/help/objs/snd/play.txt +23 -0
  79. data/lib/gloo/help/objs/snd/say.txt +28 -0
  80. data/lib/gloo/help/objs/system/file.txt +41 -0
  81. data/lib/gloo/help/objs/system/system.txt +32 -0
  82. data/lib/gloo/help/objs/web/http_get.txt +35 -0
  83. data/lib/gloo/help/objs/web/http_post.txt +32 -0
  84. data/lib/gloo/help/objs/web/json.txt +34 -0
  85. data/lib/gloo/help/objs/web/slack.txt +33 -0
  86. data/lib/gloo/help/objs/web/teams.txt +30 -0
  87. data/lib/gloo/help/objs/web/uri.txt +37 -0
  88. data/lib/gloo/help/verbs/alert.txt +33 -0
  89. data/lib/gloo/help/verbs/beep.txt +25 -0
  90. data/lib/gloo/help/verbs/cls.txt +24 -0
  91. data/lib/gloo/help/verbs/context.txt +43 -0
  92. data/lib/gloo/help/verbs/create.txt +33 -0
  93. data/lib/gloo/help/verbs/help.txt +34 -0
  94. data/lib/gloo/help/verbs/if.txt +37 -0
  95. data/lib/gloo/help/verbs/list.txt +34 -0
  96. data/lib/gloo/help/verbs/load.txt +38 -0
  97. data/lib/gloo/help/verbs/move.txt +42 -0
  98. data/lib/gloo/help/verbs/put.txt +38 -0
  99. data/lib/gloo/help/verbs/quit.txt +25 -0
  100. data/lib/gloo/help/verbs/run.txt +41 -0
  101. data/lib/gloo/help/verbs/save.txt +26 -0
  102. data/lib/gloo/help/verbs/show.txt +30 -0
  103. data/lib/gloo/help/verbs/tell.txt +34 -0
  104. data/lib/gloo/help/verbs/unless.txt +38 -0
  105. data/lib/gloo/help/verbs/version.txt +32 -0
  106. data/lib/gloo/help/verbs/wait.txt +29 -0
  107. data/lib/gloo/objs/basic/alias.rb +0 -33
  108. data/lib/gloo/objs/basic/boolean.rb +6 -27
  109. data/lib/gloo/objs/basic/container.rb +0 -33
  110. data/lib/gloo/objs/basic/decimal.rb +8 -28
  111. data/lib/gloo/objs/basic/integer.rb +5 -26
  112. data/lib/gloo/objs/basic/script.rb +0 -26
  113. data/lib/gloo/objs/basic/string.rb +6 -26
  114. data/lib/gloo/objs/basic/text.rb +0 -25
  115. data/lib/gloo/objs/basic/untyped.rb +0 -26
  116. data/lib/gloo/objs/cli/banner.rb +0 -29
  117. data/lib/gloo/objs/cli/bar.rb +0 -29
  118. data/lib/gloo/objs/cli/colorize.rb +4 -34
  119. data/lib/gloo/objs/cli/confirm.rb +6 -36
  120. data/lib/gloo/objs/cli/menu.rb +4 -34
  121. data/lib/gloo/objs/cli/menu_item.rb +0 -33
  122. data/lib/gloo/objs/cli/pastel.rb +4 -27
  123. data/lib/gloo/objs/cli/prompt.rb +4 -28
  124. data/lib/gloo/objs/cli/select.rb +4 -31
  125. data/lib/gloo/objs/ctrl/each.rb +33 -33
  126. data/lib/gloo/objs/ctrl/repeat.rb +8 -29
  127. data/lib/gloo/objs/data/markdown.rb +0 -25
  128. data/lib/gloo/objs/data/table.rb +4 -32
  129. data/lib/gloo/objs/dev/git.rb +12 -30
  130. data/lib/gloo/objs/dt/date.rb +3 -25
  131. data/lib/gloo/objs/dt/datetime.rb +4 -26
  132. data/lib/gloo/objs/dt/time.rb +3 -25
  133. data/lib/gloo/objs/ror/erb.rb +11 -45
  134. data/lib/gloo/objs/ror/eval.rb +11 -38
  135. data/lib/gloo/objs/snd/play.rb +2 -25
  136. data/lib/gloo/objs/snd/say.rb +9 -31
  137. data/lib/gloo/objs/system/file_handle.rb +0 -38
  138. data/lib/gloo/objs/system/system.rb +16 -46
  139. data/lib/gloo/objs/web/http_get.rb +57 -83
  140. data/lib/gloo/objs/web/http_post.rb +8 -31
  141. data/lib/gloo/objs/web/json.rb +11 -31
  142. data/lib/gloo/objs/web/slack.rb +7 -34
  143. data/lib/gloo/objs/web/teams.rb +13 -48
  144. data/lib/gloo/objs/web/uri.rb +0 -29
  145. data/lib/gloo/persist/file_loader.rb +8 -0
  146. data/lib/gloo/persist/file_saver.rb +6 -0
  147. data/lib/gloo/persist/file_storage.rb +2 -0
  148. data/lib/gloo/persist/line_splitter.rb +2 -0
  149. data/lib/gloo/persist/persist_man.rb +6 -0
  150. data/lib/gloo/verbs/alert.rb +30 -44
  151. data/lib/gloo/verbs/beep.rb +0 -30
  152. data/lib/gloo/verbs/cls.rb +0 -30
  153. data/lib/gloo/verbs/context.rb +9 -39
  154. data/lib/gloo/verbs/create.rb +17 -32
  155. data/lib/gloo/verbs/help.rb +151 -115
  156. data/lib/gloo/verbs/if.rb +46 -44
  157. data/lib/gloo/verbs/list.rb +36 -54
  158. data/lib/gloo/verbs/load.rb +8 -37
  159. data/lib/gloo/verbs/move.rb +12 -51
  160. data/lib/gloo/verbs/put.rb +28 -52
  161. data/lib/gloo/verbs/quit.rb +0 -31
  162. data/lib/gloo/verbs/run.rb +23 -39
  163. data/lib/gloo/verbs/save.rb +0 -33
  164. data/lib/gloo/verbs/show.rb +6 -31
  165. data/lib/gloo/verbs/tell.rb +31 -31
  166. data/lib/gloo/verbs/unless.rb +47 -46
  167. data/lib/gloo/verbs/version.rb +0 -30
  168. data/lib/gloo/verbs/wait.rb +0 -31
  169. metadata +72 -3
  170. data/lib/gloo/help/help.md +0 -16
@@ -11,78 +11,85 @@ module Gloo
11
11
 
12
12
  attr_reader :cmd, :tokens
13
13
 
14
+ # ---------------------------------------------------------------------
15
+ # Constructor
16
+ # ---------------------------------------------------------------------
17
+
18
+ #
14
19
  # Set up the tokens.
20
+ # The command string is parsed into tokens during creation.
21
+ #
15
22
  def initialize( cmd_string )
16
23
  @cmd = cmd_string
17
24
  @tokens = []
18
25
  tokenize @cmd
19
26
  end
20
27
 
21
- # Create a list of token from the given string.
22
- def tokenize( str )
23
- if str.index( '"' )
24
- i = str.index( '"' )
25
- j = str.index( '"', i + 1 )
26
- j ||= str.length
27
-
28
- tokenize( str[ 0..i - 1 ] ) if i > 1
29
- @tokens << str[ i..j ]
30
- tokenize( str[ j + 1..-1 ] ) if j + 1 < str.length
31
- elsif str.index( "'" )
32
- i = str.index( "'" )
33
- j = str.index( "'", i + 1 )
34
- j ||= str.length
35
-
36
- tokenize( str[ 0..i - 1 ] ) if i > 1
37
- @tokens << str[ i..j ]
38
- tokenize( str[ j + 1..-1 ] ) if j + 1 < str.length
39
- else
40
- str.strip.split( ' ' ).each { |t| @tokens << t }
41
- end
42
- end
28
+ # ---------------------------------------------------------------------
29
+ # Public functions
30
+ # ---------------------------------------------------------------------
43
31
 
32
+ #
44
33
  # Get the number of tokens
34
+ #
45
35
  def token_count
46
36
  return @tokens.size
47
37
  end
48
38
 
39
+ #
49
40
  # Get the verb (the first word)
41
+ #
50
42
  def verb
51
43
  return first
52
44
  end
53
45
 
46
+ #
54
47
  # Get all tokens except the first.
48
+ #
55
49
  def params
56
50
  return @tokens[ 1..-1 ]
57
51
  end
58
52
 
53
+ #
59
54
  # Get the first token.
55
+ #
60
56
  def first
61
57
  return @tokens.first if @tokens
62
58
  end
63
59
 
60
+ #
64
61
  # Get the last token.
62
+ #
65
63
  def last
66
64
  return @tokens.last if @tokens
67
65
  end
68
66
 
67
+ #
69
68
  # Get the second token.
69
+ #
70
70
  def second
71
71
  return @tokens[ 1 ] if @tokens&.size&.positive?
72
72
  end
73
73
 
74
+ #
75
+ # Get the token at the the requested index.
76
+ #
74
77
  def at( index )
75
78
  return @tokens[ index ] if @tokens && @tokens.size >= index
76
79
  end
77
80
 
81
+ #
78
82
  # Get the index of the given token.
83
+ #
79
84
  def index_of( token )
80
85
  return nil unless @tokens
81
86
 
82
87
  return @tokens.find_index { |o| o.casecmp( token ).zero? }
83
88
  end
84
89
 
90
+ #
85
91
  # Get the list of tokens after the given token
92
+ #
86
93
  def tokens_after( token )
87
94
  i = index_of token
88
95
  return @tokens[ i + 1..-1 ] if i && @tokens && @tokens.size > ( i + 1 )
@@ -90,7 +97,9 @@ module Gloo
90
97
  return nil
91
98
  end
92
99
 
100
+ #
93
101
  # Get the expression after the given token
102
+ #
94
103
  def expr_after( token )
95
104
  str = ''
96
105
  tokens_after( token ).each do |t|
@@ -100,7 +109,9 @@ module Gloo
100
109
  return str
101
110
  end
102
111
 
112
+ #
103
113
  # Get the item after a given token.
114
+ #
104
115
  def after_token( token )
105
116
  i = index_of token
106
117
  return @tokens[ i + 1 ] if i && @tokens && @tokens.size > ( i + 1 )
@@ -108,7 +119,9 @@ module Gloo
108
119
  return nil
109
120
  end
110
121
 
122
+ #
111
123
  # Get the item after a given token.
124
+ #
112
125
  def before_token( token )
113
126
  i = index_of token
114
127
  return @tokens[ 0..i - 1 ] if i && @tokens && @tokens.size >= i
@@ -116,6 +129,37 @@ module Gloo
116
129
  return nil
117
130
  end
118
131
 
132
+ # ---------------------------------------------------------------------
133
+ # Private functions
134
+ # ---------------------------------------------------------------------
135
+
136
+ private
137
+
138
+ #
139
+ # Create a list of token from the given string.
140
+ #
141
+ def tokenize( str )
142
+ if str.index( '"' )
143
+ i = str.index( '"' )
144
+ j = str.index( '"', i + 1 )
145
+ j ||= str.length
146
+
147
+ tokenize( str[ 0..i - 1 ] ) if i > 1
148
+ @tokens << str[ i..j ]
149
+ tokenize( str[ j + 1..-1 ] ) if j + 1 < str.length
150
+ elsif str.index( "'" )
151
+ i = str.index( "'" )
152
+ j = str.index( "'", i + 1 )
153
+ j ||= str.length
154
+
155
+ tokenize( str[ 0..i - 1 ] ) if i > 1
156
+ @tokens << str[ i..j ]
157
+ tokenize( str[ j + 1..-1 ] ) if j + 1 < str.length
158
+ else
159
+ str.strip.split( ' ' ).each { |t| @tokens << t }
160
+ end
161
+ end
162
+
119
163
  end
120
164
  end
121
165
  end
@@ -13,13 +13,17 @@ module Gloo
13
13
 
14
14
  attr_reader :tokens, :params
15
15
 
16
+ #
16
17
  # Set up the verb.
18
+ #
17
19
  def initialize( tokens, params = [] )
18
20
  @tokens = tokens
19
21
  @params = params
20
22
  end
21
23
 
24
+ #
22
25
  # Register verbs when they are loaded.
26
+ #
23
27
  def self.inherited( subclass )
24
28
  Dictionary.instance.register_verb( subclass )
25
29
  end
@@ -17,7 +17,7 @@ module Gloo
17
17
  HERE_STACK = 'here'.freeze
18
18
 
19
19
  #
20
- # Set up the stack.
20
+ # Set up the execution environment.
21
21
  #
22
22
  def initialize
23
23
  $log.debug 'exec env intialized...'
@@ -37,21 +37,33 @@ module Gloo
37
37
  return @here.stack.last
38
38
  end
39
39
 
40
+ #
41
+ # Push a script onto the stack.
42
+ #
40
43
  def push_script( script )
41
44
  @scripts.push script
42
45
  @here.push script.obj
43
46
  end
44
47
 
48
+ #
49
+ # Pop a script off the stack.
50
+ #
45
51
  def pop_script
46
52
  @scripts.pop
47
53
  @here.pop
48
54
  end
49
55
 
56
+ #
57
+ # Push an action onto the stack.
58
+ #
50
59
  def push_action( action )
51
60
  @actions.push action
52
61
  # @here.push action.to
53
62
  end
54
63
 
64
+ #
65
+ # Pop an action off the stack.
66
+ #
55
67
  def pop_action
56
68
  @actions.pop
57
69
  # @here.pop
@@ -8,7 +8,13 @@ module Gloo
8
8
  module Expr
9
9
  class Expression
10
10
 
11
+ # ---------------------------------------------------------------------
12
+ # Constructor
13
+ # ---------------------------------------------------------------------
14
+
15
+ #
11
16
  # Create the expression from a list of tokens.
17
+ #
12
18
  def initialize( tokens )
13
19
  @tokens = tokens
14
20
  @symbols = []
@@ -17,7 +23,13 @@ module Gloo
17
23
  @op = nil
18
24
  end
19
25
 
26
+ # ---------------------------------------------------------------------
27
+ # Evaluate Expression
28
+ # ---------------------------------------------------------------------
29
+
30
+ #
20
31
  # Evaluate the expression and return the value.
32
+ #
21
33
  def evaluate
22
34
  identify_tokens
23
35
 
@@ -39,7 +51,15 @@ module Gloo
39
51
  return @left
40
52
  end
41
53
 
54
+ # ---------------------------------------------------------------------
55
+ # Private functions
56
+ # ---------------------------------------------------------------------
57
+
58
+ private
59
+
60
+ #
42
61
  # Perform the operation.
62
+ #
43
63
  def perform_op
44
64
  @op ||= Gloo::Core::Op.default_op
45
65
  l = evaluate_sym @left
@@ -49,7 +69,9 @@ module Gloo
49
69
  @op = nil
50
70
  end
51
71
 
72
+ #
52
73
  # Evaluate the symbol and get a simple value.
74
+ #
53
75
  def evaluate_sym( sym )
54
76
  return sym.value if sym.is_a? Gloo::Core::Literal
55
77
  return resolve_ref sym if sym.is_a? Gloo::Core::Pn
@@ -57,7 +79,9 @@ module Gloo
57
79
  return sym
58
80
  end
59
81
 
82
+ #
60
83
  # resolve an object reference and get the value.
84
+ #
61
85
  def resolve_ref( ref )
62
86
  return ref.src if ref.named_color?
63
87
 
@@ -65,15 +89,13 @@ module Gloo
65
89
  return ob.value if ob
66
90
  end
67
91
 
92
+ #
68
93
  # Identify each token in the list.
94
+ #
69
95
  def identify_tokens
70
96
  @tokens.each do |o|
71
97
  @symbols << identify_token( o )
72
98
  end
73
-
74
- # @symbols.each do |o|
75
- # puts o.class.name
76
- # end
77
99
  end
78
100
 
79
101
  #
@@ -8,17 +8,23 @@ module Gloo
8
8
  module Expr
9
9
  class LBoolean < Gloo::Core::Literal
10
10
 
11
+ #
11
12
  # Is the given token a boolean?
13
+ #
12
14
  def self.boolean?( token )
13
15
  return Gloo::Objs::Boolean.boolean? token
14
16
  end
15
17
 
18
+ #
16
19
  # Set the value, converting to an boolean.
20
+ #
17
21
  def set_value( value )
18
22
  @value = Gloo::Objs::Boolean.coerse_to_bool value
19
23
  end
20
24
 
25
+ #
21
26
  # Get string representation
27
+ #
22
28
  def to_s
23
29
  return 'false' unless @value
24
30
 
@@ -18,13 +18,18 @@ module Gloo
18
18
  return s.to_f.to_s == s
19
19
  end
20
20
 
21
+ #
21
22
  # Set the value, converting to an integer.
23
+ #
22
24
  def set_value( value )
23
25
  value = value.to_s if value.is_a? Numeric
24
26
 
25
27
  @value = value.to_f
26
28
  end
27
29
 
30
+ #
31
+ # Get string representation
32
+ #
28
33
  def to_s
29
34
  return self.value.to_s
30
35
  end
@@ -8,7 +8,9 @@ module Gloo
8
8
  module Expr
9
9
  class LInteger < Gloo::Core::Literal
10
10
 
11
+ #
11
12
  # Is the given token an integer?
13
+ #
12
14
  def self.integer?( token )
13
15
  return true if token.is_a? Integer
14
16
 
@@ -16,11 +18,16 @@ module Gloo
16
18
  return s.to_i.to_s == s
17
19
  end
18
20
 
21
+ #
19
22
  # Set the value, converting to an integer.
23
+ #
20
24
  def set_value( value )
21
25
  @value = value.to_i
22
26
  end
23
27
 
28
+ #
29
+ # Get string representation
30
+ #
24
31
  def to_s
25
32
  return self.value.to_s
26
33
  end
@@ -8,8 +8,10 @@ module Gloo
8
8
  module Expr
9
9
  class LString < Gloo::Core::Literal
10
10
 
11
+ #
11
12
  # Set the value, triming opening and closing
12
13
  # quotations if necessary.
14
+ #
13
15
  def set_value( value )
14
16
  @value = value
15
17
  return unless value
@@ -17,7 +19,9 @@ module Gloo
17
19
  @value = LString.strip_quotes( @value )
18
20
  end
19
21
 
22
+ #
20
23
  # Is the given token a string?
24
+ #
21
25
  def self.string?( token )
22
26
  return false unless token.is_a? String
23
27
  return true if token.start_with?( '"' )
@@ -42,6 +46,9 @@ module Gloo
42
46
  end
43
47
  end
44
48
 
49
+ #
50
+ # Get string representation
51
+ #
45
52
  def to_s
46
53
  return self.value
47
54
  end
@@ -8,7 +8,9 @@ module Gloo
8
8
  module Expr
9
9
  class OpDiv < Gloo::Core::Op
10
10
 
11
+ #
11
12
  # Perform the operation and return the result.
13
+ #
12
14
  def perform( left, right )
13
15
  return left / right.to_i if left.is_a? Integer
14
16
 
@@ -8,7 +8,9 @@ module Gloo
8
8
  module Expr
9
9
  class OpMinus < Gloo::Core::Op
10
10
 
11
+ #
11
12
  # Perform the operation and return the result.
13
+ #
12
14
  def perform( left, right )
13
15
  return left - right.to_i if left.is_a? Integer
14
16
 
@@ -8,7 +8,9 @@ module Gloo
8
8
  module Expr
9
9
  class OpMult < Gloo::Core::Op
10
10
 
11
+ #
11
12
  # Perform the operation and return the result.
13
+ #
12
14
  def perform( left, right )
13
15
  return left * right.to_i if left.is_a? Integer
14
16