gloo 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -10,6 +10,7 @@ module Gloo
10
10
 
11
11
  BEGIN_BLOCK = 'BEGIN'.freeze
12
12
  END_BLOCK = 'END'.freeze
13
+ SPACE_CNT = 2
13
14
 
14
15
  attr_reader :obj
15
16
 
@@ -85,10 +86,9 @@ module Gloo
85
86
  @tabs = tabs
86
87
  @indent = 1
87
88
  elsif tabs < @tabs # outdent
88
- while tabs < @tabs
89
- @tabs -= 1
90
- @indent -= 1
91
- end
89
+ diff = @tabs - tabs
90
+ @tabs -= diff
91
+ @indent -= diff
92
92
  end
93
93
  puts "tabs: #{@tabs}, indent: #{@indent}, line: #{line}" if @debug
94
94
  end
@@ -116,7 +116,10 @@ module Gloo
116
116
  def setup_process_obj_line
117
117
  if @exiting_multiline
118
118
  @exiting_multiline = false
119
- elsif @indent.positive?
119
+ @indent += 1
120
+ end
121
+
122
+ if @indent.positive?
120
123
  @parent = @last
121
124
  @parent_stack.push @parent
122
125
  elsif @indent.negative?
@@ -139,7 +142,7 @@ module Gloo
139
142
  params = { name: name, type: type, value: value, parent: @parent }
140
143
  @last = $engine.factory.create( params )
141
144
 
142
- if @last&.multiline_value?
145
+ if value.empty? && @last&.multiline_value?
143
146
  @multi_indent = 0
144
147
  @in_multiline = true
145
148
  puts "*** Start multiline. multi_indent: #{@multi_indent}" if @debug
@@ -153,6 +156,14 @@ module Gloo
153
156
  #
154
157
  def tab_count( line )
155
158
  i = 0
159
+
160
+ if line[ i ] == ' '
161
+ i += 1 while line[ i ] == ' '
162
+ tab_equiv = ( i / SPACE_CNT ).to_i
163
+ puts "Found #{i} spaces => #{tab_equiv}" if @debug
164
+ return tab_equiv
165
+ end
166
+
156
167
  i += 1 while line[ i ] == "\t"
157
168
  return i
158
169
  end
@@ -35,8 +35,7 @@ module Gloo
35
35
  # Detect the object name.
36
36
  #
37
37
  def detect_name
38
- @line = @line[ @tabs..-1 ]
39
- @line = @line[ 0..-2 ] if @line[ -1 ] == "\n"
38
+ @line = @line.strip
40
39
  @idx = @line.index( ' ' )
41
40
  @name = @line[ 0..@idx - 1 ]
42
41
  end
@@ -47,6 +46,12 @@ module Gloo
47
46
  def detect_type
48
47
  @line = @line[ @idx + 1..-1 ]
49
48
  @idx = @line.index( ' ' )
49
+
50
+ if @line[ 0 ] == ':'
51
+ @type = 'untyped'
52
+ return
53
+ end
54
+
50
55
  @type = @line[ 0..( @idx ? @idx - 1 : -1 ) ]
51
56
  @type = @type[ 1..-1 ] if @type[ 0 ] == '['
52
57
  @type = @type[ 0..-2 ] if @type[ -1 ] == ']'
@@ -50,26 +50,50 @@ module Gloo
50
50
  # Load the object from the file.
51
51
  #
52
52
  def load( name )
53
- pn = get_full_path_name name
54
- return unless pn
55
-
56
- $log.debug "Load file at: #{pn}"
57
- fs = Gloo::Persist::FileStorage.new( pn )
58
- fs.load
59
- @maps << fs
60
- $engine.event_manager.on_load fs.obj
61
- # show_maps
53
+ pns = get_full_path_names name
54
+ return unless pns
55
+
56
+ pns.each do |pn|
57
+ $log.debug "Load file(s) at: #{pn}"
58
+ fs = Gloo::Persist::FileStorage.new( pn )
59
+ fs.load
60
+ @maps << fs
61
+ $engine.event_manager.on_load fs.obj
62
+ end
62
63
  end
63
64
 
64
65
  #
65
66
  # Get the full path and name of the file.
66
67
  #
67
- def get_full_path_name( name )
68
+ def get_full_path_names( name )
68
69
  return nil if name.strip.empty?
69
70
 
70
- path = $settings.project_path
71
- full_name = "#{name}#{file_ext}"
72
- return File.join( path, full_name )
71
+ if name.strip[ -1 ] == '*'
72
+ pns = []
73
+ dir = File.join( $settings.project_path, name[ 0..-2 ] )
74
+ Dir.glob( "#{dir}*.gloo" ).each do |f|
75
+ pns << f
76
+ end
77
+ return pns
78
+ else
79
+ ext_path = File.expand_path( name )
80
+ return [ ext_path ] if self.gloo_file?( ext_path )
81
+
82
+ full_name = "#{name}#{file_ext}"
83
+ return [ File.join( $settings.project_path, full_name ) ]
84
+ end
85
+ end
86
+
87
+ #
88
+ # Check to see if a given path name refers to a gloo object file.
89
+ #
90
+ def gloo_file?( name )
91
+ return false unless name
92
+ return false unless File.exist?( name )
93
+ return false unless File.file?( name )
94
+ return false unless name.end_with?( self.file_ext )
95
+
96
+ return true
73
97
  end
74
98
 
75
99
  # Get the default file extention.
@@ -0,0 +1,67 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
+ #
4
+ # Clear the screen.
5
+ #
6
+
7
+ module Gloo
8
+ module Verbs
9
+ class Cls < Gloo::Core::Verb
10
+
11
+ KEYWORD = 'cls'.freeze
12
+ KEYWORD_SHORT = 'cls'.freeze
13
+
14
+ #
15
+ # Run the verb.
16
+ #
17
+ def run
18
+ $engine&.clear_screen
19
+ end
20
+
21
+ #
22
+ # Get the Verb's keyword.
23
+ #
24
+ def self.keyword
25
+ return KEYWORD
26
+ end
27
+
28
+ #
29
+ # Get the Verb's keyword shortcut.
30
+ #
31
+ def self.keyword_shortcut
32
+ return KEYWORD_SHORT
33
+ end
34
+
35
+ # ---------------------------------------------------------------------
36
+ # Help
37
+ # ---------------------------------------------------------------------
38
+
39
+ #
40
+ # Get help for this verb.
41
+ #
42
+ def self.help
43
+ return <<~TEXT
44
+ CLS VERB
45
+ NAME: cls
46
+ SHORTCUT: cls
47
+
48
+ DESCRIPTION
49
+ Clear the console screen.
50
+
51
+ SYNTAX
52
+ cls
53
+
54
+ PARAMETERS
55
+ None
56
+
57
+ RESULT
58
+ The screen is cleared and cursor set to the top.
59
+
60
+ ERRORS
61
+ None
62
+ TEXT
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -12,6 +12,7 @@ module Gloo
12
12
  KEYWORD_SHORT = '?'.freeze
13
13
 
14
14
  DISPATCH = {
15
+ settings: 'show_settings',
15
16
  verb: 'show_verbs',
16
17
  verbs: 'show_verbs',
17
18
  v: 'show_verbs',
@@ -113,6 +114,13 @@ module Gloo
113
114
  $engine.run_help( true )
114
115
  end
115
116
 
117
+ #
118
+ # Show application settings.
119
+ #
120
+ def show_settings
121
+ $settings.show
122
+ end
123
+
116
124
  #
117
125
  # List the verbs
118
126
  #
@@ -199,6 +207,7 @@ module Gloo
199
207
  PARAMETERS
200
208
  about - Optional parameter.
201
209
  If no parameter is given, shows the default help screen
210
+ settings - Show application settings
202
211
  verbs - List available verbs
203
212
  objects - List available objects
204
213
  <verb> - Look up detail about a verb
@@ -27,6 +27,7 @@ module Gloo
27
27
  expr = Gloo::Expr::Expression.new( value )
28
28
  result = expr.evaluate
29
29
  evals_true = true if result == true
30
+ evals_true = true if result.is_a?( Numeric ) && result != 0
30
31
  end
31
32
  return unless evals_true
32
33
 
@@ -49,8 +49,9 @@ module Gloo
49
49
 
50
50
  DESCRIPTION
51
51
  Load an object file.
52
- The file's path should be provided from the gloo project folder
53
- as the root directory.
52
+ There are two ways to specify the file. Give either the full path and file name or use a relative path from the gloo project folder. For the latter, the extension is not needed. For the former, the
53
+ file extension is necessary.
54
+ Using * instead of a file name will load all gloo files in the folder.
54
55
 
55
56
  SYNTAX
56
57
  load <file_name>
@@ -0,0 +1,128 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
+ #
4
+ # Move an object to a new parent.
5
+ #
6
+
7
+ module Gloo
8
+ module Verbs
9
+ class Move < Gloo::Core::Verb
10
+
11
+ KEYWORD = 'move'.freeze
12
+ KEYWORD_SHORT = 'mv'.freeze
13
+ TO = 'to'.freeze
14
+
15
+ #
16
+ # Run the verb.
17
+ #
18
+ def run
19
+ dst = lookup_dst
20
+ return if dst.nil?
21
+
22
+ o = lookup_obj
23
+ return unless o
24
+
25
+ o.parent.remove_child o
26
+ dst.add_child o
27
+ end
28
+
29
+ #
30
+ # Get the Verb's keyword.
31
+ #
32
+ def self.keyword
33
+ return KEYWORD
34
+ end
35
+
36
+ #
37
+ # Get the Verb's keyword shortcut.
38
+ #
39
+ def self.keyword_shortcut
40
+ return KEYWORD_SHORT
41
+ end
42
+
43
+ # ---------------------------------------------------------------------
44
+ # Helper functions
45
+ # ---------------------------------------------------------------------
46
+
47
+ #
48
+ # Lookup the object that we're moving.
49
+ #
50
+ def lookup_obj
51
+ arr = @tokens.before_token( TO )
52
+ if arr.count == 1
53
+ msg = 'object to move was not specified'
54
+ $log.error msg, nil, $engine
55
+ end
56
+
57
+ name = arr[ 1 ]
58
+ pn = Gloo::Core::Pn.new name
59
+ o = pn.resolve
60
+
61
+ unless o
62
+ msg = "could not find object to move: #{name}"
63
+ $log.error msg, nil, $engine
64
+ end
65
+
66
+ return o
67
+ end
68
+
69
+ #
70
+ # Lookup destination, the new parent object.
71
+ #
72
+ def lookup_dst
73
+ dst = @tokens.after_token( TO )
74
+ unless dst
75
+ msg = "'move' must include 'to' parent object"
76
+ $log.error msg, nil, $engine
77
+ return nil
78
+ end
79
+
80
+ pn = Gloo::Core::Pn.new dst
81
+ o = pn.resolve
82
+ unless o
83
+ msg = "could not resolve '#{dst}'"
84
+ $log.error msg, nil, $engine
85
+ return nil
86
+ end
87
+
88
+ return o
89
+ end
90
+
91
+ # ---------------------------------------------------------------------
92
+ # Help
93
+ # ---------------------------------------------------------------------
94
+
95
+ #
96
+ # Get help for this verb.
97
+ #
98
+ def self.help
99
+ return <<~TEXT
100
+ MOVE VERB
101
+ NAME: move
102
+ SHORTCUT: mv
103
+
104
+ DESCRIPTION
105
+ Move an object to a new parent.
106
+
107
+ SYNTAX
108
+ move <path.to.object> to <new.parent>
109
+
110
+ PARAMETERS
111
+ path.to.object - The object that we want to move.
112
+ new.parent - The new location for the object.
113
+
114
+ RESULT
115
+ The object will now be in the new location.
116
+
117
+ ERRORS
118
+ The <path.to.object> is not specified.
119
+ The <path.to.object> cannot be resolved.
120
+ The <new.parent> is not specified.
121
+ The <new.parent> cannot be resolved.
122
+ The 'to' keyword is missing.
123
+ TEXT
124
+ end
125
+
126
+ end
127
+ end
128
+ end
@@ -11,22 +11,36 @@ module Gloo
11
11
 
12
12
  KEYWORD = 'run'.freeze
13
13
  KEYWORD_SHORT = 'r'.freeze
14
+ EVALUATE_RUN = '~>'.freeze
14
15
 
15
16
  #
16
17
  # Run the verb.
17
18
  #
18
19
  def run
19
- name = @tokens.second
20
- pn = Gloo::Core::Pn.new name
21
- o = pn.resolve
22
-
23
- if o
24
- o.send_message 'run'
20
+ if @tokens.second == EVALUATE_RUN
21
+ run_expression
25
22
  else
26
- $log.error "Could not send message to object. Bad path: #{name}"
23
+ run_script
27
24
  end
28
25
  end
29
26
 
27
+ #
28
+ # Run a script specified by pathname
29
+ #
30
+ def run_script
31
+ Gloo::Exec::Runner.run @tokens.second
32
+ end
33
+
34
+ #
35
+ # Evaluate an expression and run that.
36
+ #
37
+ def run_expression
38
+ return unless @tokens.token_count > 2
39
+
40
+ expr = Gloo::Expr::Expression.new( @tokens.params[ 1..-1 ] )
41
+ $engine.parser.run expr.evaluate
42
+ end
43
+
30
44
  #
31
45
  # Get the Verb's keyword.
32
46
  #
@@ -22,7 +22,7 @@ module Gloo
22
22
  o = pn.resolve
23
23
 
24
24
  if o
25
- o.send_message( msg, @params )
25
+ Gloo::Exec::Dispatch.message msg, o, @params
26
26
  else
27
27
  $log.error "Could not send message to object. Bad path: #{name}"
28
28
  end
@@ -27,6 +27,7 @@ module Gloo
27
27
  expr = Gloo::Expr::Expression.new( value )
28
28
  result = expr.evaluate
29
29
  evals_false = true if result == false
30
+ evals_false = true if result.is_a?( Numeric ) && result.zero?
30
31
  end
31
32
  return unless evals_false
32
33