gloo 0.4.0 → 0.5.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.rubocop.yml +1 -1
  4. data/Gemfile.lock +80 -81
  5. data/Rakefile +1 -0
  6. data/gloo.gemspec +2 -1
  7. data/lib/gloo/app/engine.rb +48 -3
  8. data/lib/gloo/app/info.rb +1 -1
  9. data/lib/gloo/app/settings.rb +12 -5
  10. data/lib/gloo/convert/string_to_datetime.rb +21 -0
  11. data/lib/gloo/convert/string_to_decimal.rb +20 -0
  12. data/lib/gloo/convert/string_to_integer.rb +20 -0
  13. data/lib/gloo/core/event_manager.rb +2 -6
  14. data/lib/gloo/core/factory.rb +58 -1
  15. data/lib/gloo/core/gloo_system.rb +72 -0
  16. data/lib/gloo/core/obj.rb +50 -1
  17. data/lib/gloo/core/parser.rb +3 -1
  18. data/lib/gloo/core/pn.rb +3 -2
  19. data/lib/gloo/exec/dispatch.rb +30 -0
  20. data/lib/gloo/exec/runner.rb +43 -0
  21. data/lib/gloo/expr/expression.rb +1 -0
  22. data/lib/gloo/expr/l_decimal.rb +34 -0
  23. data/lib/gloo/expr/op_div.rb +2 -0
  24. data/lib/gloo/expr/op_minus.rb +2 -0
  25. data/lib/gloo/expr/op_mult.rb +2 -0
  26. data/lib/gloo/expr/op_plus.rb +2 -0
  27. data/lib/gloo/objs/basic/alias.rb +111 -0
  28. data/lib/gloo/objs/basic/container.rb +11 -1
  29. data/lib/gloo/objs/basic/decimal.rb +96 -0
  30. data/lib/gloo/objs/basic/integer.rb +5 -0
  31. data/lib/gloo/objs/basic/string.rb +9 -1
  32. data/lib/gloo/objs/basic/text.rb +27 -2
  33. data/lib/gloo/objs/cli/banner.rb +137 -0
  34. data/lib/gloo/objs/cli/bar.rb +141 -0
  35. data/lib/gloo/objs/cli/colorize.rb +1 -1
  36. data/lib/gloo/objs/cli/menu.rb +236 -0
  37. data/lib/gloo/objs/cli/menu_item.rb +128 -0
  38. data/lib/gloo/objs/cli/pastel.rb +120 -0
  39. data/lib/gloo/objs/cli/prompt.rb +19 -11
  40. data/lib/gloo/objs/cli/select.rb +153 -0
  41. data/lib/gloo/objs/ctrl/each.rb +45 -16
  42. data/lib/gloo/objs/ctrl/repeat.rb +129 -0
  43. data/lib/gloo/objs/data/markdown.rb +109 -0
  44. data/lib/gloo/objs/data/table.rb +168 -0
  45. data/lib/gloo/objs/dt/date.rb +72 -0
  46. data/lib/gloo/objs/dt/datetime.rb +84 -0
  47. data/lib/gloo/objs/dt/time.rb +72 -0
  48. data/lib/gloo/objs/ror/erb.rb +1 -0
  49. data/lib/gloo/objs/system/file_handle.rb +50 -1
  50. data/lib/gloo/objs/web/http_get.rb +24 -4
  51. data/lib/gloo/objs/web/http_post.rb +1 -0
  52. data/lib/gloo/objs/web/json.rb +155 -0
  53. data/lib/gloo/objs/web/uri.rb +160 -0
  54. data/lib/gloo/persist/file_loader.rb +17 -6
  55. data/lib/gloo/persist/line_splitter.rb +7 -2
  56. data/lib/gloo/persist/persist_man.rb +37 -13
  57. data/lib/gloo/verbs/cls.rb +67 -0
  58. data/lib/gloo/verbs/help.rb +9 -0
  59. data/lib/gloo/verbs/if.rb +1 -0
  60. data/lib/gloo/verbs/load.rb +3 -2
  61. data/lib/gloo/verbs/move.rb +128 -0
  62. data/lib/gloo/verbs/run.rb +21 -7
  63. data/lib/gloo/verbs/tell.rb +1 -1
  64. data/lib/gloo/verbs/unless.rb +1 -0
  65. data/lib/gloo/verbs/wait.rb +73 -0
  66. metadata +36 -5
  67. data/lib/gloo/core/runner.rb +0 -26
@@ -22,9 +22,7 @@ module Gloo
22
22
  return unless obj || in_heap
23
23
 
24
24
  arr = Gloo::Core::ObjFinder.by_name 'on_load', obj
25
- arr.each do |o|
26
- o.send_message 'run' if o.can_receive_message? 'run'
27
- end
25
+ arr.each { |o| Gloo::Exec::Dispatch.message 'run', o }
28
26
  end
29
27
 
30
28
  #
@@ -34,9 +32,7 @@ module Gloo
34
32
  return unless obj
35
33
 
36
34
  arr = Gloo::Core::ObjFinder.by_name 'on_unload', obj
37
- arr.each do |o|
38
- o.send_message 'run' if o.can_receive_message? 'run'
39
- end
35
+ arr.each { |o| Gloo::Exec::Dispatch.message 'run', o }
40
36
  end
41
37
 
42
38
  end
@@ -23,7 +23,20 @@ module Gloo
23
23
  # Factory Helpers
24
24
  # ---------------------------------------------------------------------
25
25
 
26
- # Helper shortcut to create a string.
26
+ #
27
+ # Helper shortcut to create a string child object.
28
+ #
29
+ def create_untyped( name, value, parent )
30
+ params = { :name => name,
31
+ :type => 'untyped',
32
+ :value => value,
33
+ :parent => parent }
34
+ create params
35
+ end
36
+
37
+ #
38
+ # Helper shortcut to create a string child object.
39
+ #
27
40
  def create_string( name, value, parent )
28
41
  params = { :name => name,
29
42
  :type => 'string',
@@ -32,6 +45,50 @@ module Gloo
32
45
  create params
33
46
  end
34
47
 
48
+ #
49
+ # Helper shortcut to create an integer child object.
50
+ #
51
+ def create_int( name, value, parent )
52
+ params = { :name => name,
53
+ :type => 'integer',
54
+ :value => value,
55
+ :parent => parent }
56
+ create params
57
+ end
58
+
59
+ #
60
+ # Helper shortcut to create a boolean child object.
61
+ #
62
+ def create_bool( name, value, parent )
63
+ params = { :name => name,
64
+ :type => 'boolean',
65
+ :value => value,
66
+ :parent => parent }
67
+ create params
68
+ end
69
+
70
+ #
71
+ # Helper shortcut to create a container child object.
72
+ #
73
+ def create_can( name, parent )
74
+ params = { :name => name,
75
+ :type => 'container',
76
+ :value => nil,
77
+ :parent => parent }
78
+ create params
79
+ end
80
+
81
+ #
82
+ # Helper shortcut to create a script child object.
83
+ #
84
+ def create_script( name, value, parent )
85
+ params = { :name => name,
86
+ :type => 'script',
87
+ :value => value,
88
+ :parent => parent }
89
+ create params
90
+ end
91
+
35
92
  # ---------------------------------------------------------------------
36
93
  # Object Factory
37
94
  # ---------------------------------------------------------------------
@@ -6,6 +6,7 @@
6
6
  # system level variables and functions. But it is not
7
7
  # actually an object in the normal sense of the word.
8
8
  #
9
+ require 'tty-platform'
9
10
 
10
11
  module Gloo
11
12
  module Core
@@ -180,6 +181,77 @@ module Gloo
180
181
  return $settings.log_path
181
182
  end
182
183
 
184
+ # ---------------------------------------------------------------------
185
+ # Screen Messages
186
+ # ---------------------------------------------------------------------
187
+
188
+ # Get the number of lines on screen.
189
+ def msg_screen_lines
190
+ return Gloo::App::Settings.lines
191
+ end
192
+
193
+ # Get the number of columns on screen.
194
+ def msg_screen_cols
195
+ return Gloo::App::Settings.cols
196
+ end
197
+
198
+ # ---------------------------------------------------------------------
199
+ # Platform Messages
200
+ # ---------------------------------------------------------------------
201
+
202
+ # Get the platform CPU
203
+ def msg_platform_cpu
204
+ platform = TTY::Platform.new
205
+ return platform.cpu
206
+ end
207
+
208
+ # Get the platform Operating System
209
+ def msg_platform_os
210
+ platform = TTY::Platform.new
211
+ return platform.os
212
+ end
213
+
214
+ # Get the platform version
215
+ def msg_platform_version
216
+ platform = TTY::Platform.new
217
+ return platform.version
218
+ end
219
+
220
+ # Is the platform Windows?
221
+ def msg_platform_windows?
222
+ platform = TTY::Platform.new
223
+ return platform.windows?
224
+ end
225
+
226
+ # Is the platform Unix?
227
+ def msg_platform_unix?
228
+ platform = TTY::Platform.new
229
+ return platform.unix?
230
+ end
231
+
232
+ # Is the platform Linux?
233
+ def msg_platform_linux?
234
+ platform = TTY::Platform.new
235
+ return platform.linux?
236
+ end
237
+
238
+ # Is the platform Mac?
239
+ def msg_platform_mac?
240
+ platform = TTY::Platform.new
241
+ return platform.mac?
242
+ end
243
+
244
+ #
245
+ # Get the command to open a file on this platform.
246
+ #
247
+ def self.open_for_platform
248
+ platform = TTY::Platform.new
249
+ return 'open' if platform.mac?
250
+ return 'xdg-open' if platform.linux?
251
+
252
+ return nil
253
+ end
254
+
183
255
  end
184
256
  end
185
257
  end
@@ -60,6 +60,19 @@ module Gloo
60
60
  true
61
61
  end
62
62
 
63
+ #
64
+ # Get the path and name to this object.
65
+ #
66
+ def pn
67
+ str = self.name
68
+ p = self.parent
69
+ while p && !p.root?
70
+ str = "#{p.name}.#{str}"
71
+ p = p.parent
72
+ end
73
+ return str
74
+ end
75
+
63
76
  # ---------------------------------------------------------------------
64
77
  # Value
65
78
  # ---------------------------------------------------------------------
@@ -113,6 +126,21 @@ module Gloo
113
126
  # Children
114
127
  # ---------------------------------------------------------------------
115
128
 
129
+ #
130
+ # Find a child of the given name.
131
+ # If found, return it. If not found create it.
132
+ #
133
+ def find_add_child( name, type )
134
+ child = self.find_child( name )
135
+ return child if child
136
+
137
+ params = { :name => name,
138
+ :type => type,
139
+ :value => nil,
140
+ :parent => self }
141
+ return $engine.factory.create params
142
+ end
143
+
116
144
  # Add a child object to the container.
117
145
  def add_child( obj )
118
146
  @children << obj
@@ -134,13 +162,34 @@ module Gloo
134
162
 
135
163
  # Find a child object with the given name.
136
164
  def find_child( name )
165
+ if name.end_with?( Gloo::Objs::Alias::ALIAS_REFERENCE )
166
+ name = name[ 0..-2 ]
167
+ end
168
+
137
169
  @children.each do |o|
138
170
  return o if name.downcase == o.name.downcase
139
171
  end
172
+
173
+ if self.type_display == Gloo::Objs::Alias.typename
174
+ ln = Gloo::Core::Pn.new( self.value )
175
+ redirect = ln.resolve
176
+ return redirect.find_child( name )
177
+ end
140
178
  return nil
141
179
  end
142
180
 
181
+ #
182
+ # Delete all children from the container.
183
+ #
184
+ def delete_children
185
+ @children.reverse.each do |o|
186
+ self.remove_child o
187
+ end
188
+ end
189
+
190
+ #
143
191
  # Remove the object from the children collection.
192
+ #
144
193
  def remove_child( obj )
145
194
  @children.delete obj
146
195
  end
@@ -167,7 +216,7 @@ module Gloo
167
216
  # Get a list of message names that this object receives.
168
217
  #
169
218
  def self.messages
170
- return [ 'unload' ]
219
+ return %w[unload]
171
220
  end
172
221
 
173
222
  #
@@ -40,10 +40,12 @@ module Gloo
40
40
  return cmd, params
41
41
  end
42
42
 
43
+ #
43
44
  # Parse a command and then run it if it parsed correctly.
45
+ #
44
46
  def run( cmd )
45
47
  v = parse_immediate( cmd )
46
- Runner.go( v ) if v
48
+ Gloo::Exec::Runner.go( v ) if v
47
49
  end
48
50
 
49
51
  end
@@ -69,7 +69,7 @@ module Gloo
69
69
 
70
70
  # Set the object pathname to the given value.
71
71
  def set_to( value )
72
- @src = value.strip unless value.nil?
72
+ @src = value.nil? ? nil : value.strip
73
73
  @elements = @src.nil? ? [] : @src.split( '.' )
74
74
  end
75
75
 
@@ -141,7 +141,8 @@ module Gloo
141
141
  parent = self.get_parent
142
142
  return nil unless parent
143
143
 
144
- return parent.find_child( self.name )
144
+ obj = parent.find_child( self.name )
145
+ return Gloo::Objs::Alias.resolve_alias( obj, self.src )
145
146
  end
146
147
 
147
148
  end
@@ -0,0 +1,30 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
+ #
4
+ # Central Message Dispatch.
5
+ # Responsible for sending message to objects.
6
+ # All object messaging goes through here so we can uniformly
7
+ # manage things like checking to make sure object can
8
+ # receive the messages sent, handling errors, etc.
9
+ #
10
+
11
+ module Gloo
12
+ module Exec
13
+ class Dispatch
14
+
15
+ #
16
+ # Dispatch the given message to the given object.
17
+ #
18
+ def self.message( msg, to_obj, params = nil )
19
+ $log.debug "----- Sending message #{msg} to #{to_obj.name}"
20
+
21
+ if to_obj.can_receive_message? msg
22
+ to_obj.send_message msg, params
23
+ else
24
+ $log.warn "Object #{to_obj.name} does not respond to #{msg}"
25
+ end
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,43 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
+ #
4
+ # The Runner is a static helper function.
5
+ # It is used to send the run command to verbs.
6
+ #
7
+
8
+ module Gloo
9
+ module Exec
10
+ class Runner
11
+
12
+ #
13
+ # Dispatch run command to a verb.
14
+ # We abstract this out in case there are things
15
+ # that need to be done before or after a verb
16
+ # is done running.
17
+ #
18
+ def self.go( verb )
19
+ $log.debug "**** Running verb #{verb.type_display}"
20
+ $engine.heap.error.start_tracking
21
+ verb&.run
22
+ $engine.heap.error.clear_if_no_errors
23
+ end
24
+
25
+ #
26
+ # Send 'run' message to the object.
27
+ # Resolve the path_name and then send the run message.
28
+ #
29
+ def self.run( path_name )
30
+ $log.debug "**** Running script at #{path_name}"
31
+ pn = Gloo::Core::Pn.new path_name
32
+ o = pn.resolve
33
+
34
+ if o
35
+ o.send_message 'run'
36
+ else
37
+ $log.error "Could not send message to object. Bad path: #{path_name}"
38
+ end
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -85,6 +85,7 @@ module Gloo
85
85
  return LBoolean.new( token ) if LBoolean.boolean?( token )
86
86
  return LInteger.new( token ) if LInteger.integer?( token )
87
87
  return LString.new( token ) if LString.string?( token )
88
+ return LDecimal.new( token ) if LDecimal.decimal?( token )
88
89
 
89
90
  # last chance: an Object reference
90
91
  return Gloo::Core::Pn.new( token )
@@ -0,0 +1,34 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
+ #
4
+ # A literal decimal value.
5
+ #
6
+
7
+ module Gloo
8
+ module Expr
9
+ class LDecimal < Gloo::Core::Literal
10
+
11
+ #
12
+ # Is the given token a decimal?
13
+ #
14
+ def self.decimal?( token )
15
+ return true if token.is_a? Numeric
16
+
17
+ s = token.strip
18
+ return s.to_f.to_s == s
19
+ end
20
+
21
+ # Set the value, converting to an integer.
22
+ def set_value( value )
23
+ value = value.to_s if value.is_a? Numeric
24
+
25
+ @value = value.to_f
26
+ end
27
+
28
+ def to_s
29
+ return self.value.to_s
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -11,6 +11,8 @@ module Gloo
11
11
  # Perform the operation and return the result.
12
12
  def perform( left, right )
13
13
  return left / right.to_i if left.is_a? Integer
14
+
15
+ return left / right.to_f if left.is_a? Numeric
14
16
  end
15
17
 
16
18
  end
@@ -11,6 +11,8 @@ module Gloo
11
11
  # Perform the operation and return the result.
12
12
  def perform( left, right )
13
13
  return left - right.to_i if left.is_a? Integer
14
+
15
+ return left - right.to_f if left.is_a? Numeric
14
16
  end
15
17
 
16
18
  end
@@ -11,6 +11,8 @@ module Gloo
11
11
  # Perform the operation and return the result.
12
12
  def perform( left, right )
13
13
  return left * right.to_i if left.is_a? Integer
14
+
15
+ return left * right.to_f if left.is_a? Numeric
14
16
  end
15
17
 
16
18
  end