gloo 0.3.0 → 0.5.3

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.rubocop.yml +73 -0
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +86 -83
  6. data/Rakefile +7 -6
  7. data/bin/console +4 -4
  8. data/gloo.gemspec +22 -18
  9. data/lib/gloo.rb +6 -6
  10. data/lib/gloo/app/args.rb +30 -31
  11. data/lib/gloo/app/engine.rb +80 -30
  12. data/lib/gloo/app/help.rb +17 -11
  13. data/lib/gloo/app/info.rb +3 -3
  14. data/lib/gloo/app/log.rb +17 -17
  15. data/lib/gloo/app/mode.rb +4 -4
  16. data/lib/gloo/app/settings.rb +51 -41
  17. data/lib/gloo/convert/string_to_datetime.rb +21 -0
  18. data/lib/gloo/convert/string_to_decimal.rb +20 -0
  19. data/lib/gloo/convert/string_to_integer.rb +20 -0
  20. data/lib/gloo/core/baseo.rb +7 -7
  21. data/lib/gloo/core/dictionary.rb +30 -27
  22. data/lib/gloo/core/error.rb +50 -0
  23. data/lib/gloo/core/event_manager.rb +17 -23
  24. data/lib/gloo/core/factory.rb +149 -39
  25. data/lib/gloo/core/gloo_system.rb +121 -54
  26. data/lib/gloo/core/heap.rb +15 -13
  27. data/lib/gloo/core/it.rb +5 -5
  28. data/lib/gloo/core/literal.rb +7 -7
  29. data/lib/gloo/core/obj.rb +138 -79
  30. data/lib/gloo/core/obj_finder.rb +9 -14
  31. data/lib/gloo/core/op.rb +8 -8
  32. data/lib/gloo/core/parser.rb +27 -26
  33. data/lib/gloo/core/pn.rb +68 -52
  34. data/lib/gloo/core/script.rb +7 -7
  35. data/lib/gloo/core/tokens.rb +39 -41
  36. data/lib/gloo/core/verb.rb +30 -19
  37. data/lib/gloo/exec/dispatch.rb +30 -0
  38. data/lib/gloo/exec/runner.rb +43 -0
  39. data/lib/gloo/expr/expression.rb +36 -43
  40. data/lib/gloo/expr/l_boolean.rb +7 -6
  41. data/lib/gloo/expr/l_decimal.rb +34 -0
  42. data/lib/gloo/expr/l_integer.rb +5 -4
  43. data/lib/gloo/expr/l_string.rb +13 -15
  44. data/lib/gloo/expr/op_div.rb +5 -5
  45. data/lib/gloo/expr/op_minus.rb +5 -5
  46. data/lib/gloo/expr/op_mult.rb +5 -5
  47. data/lib/gloo/expr/op_plus.rb +7 -7
  48. data/lib/gloo/objs/basic/alias.rb +111 -0
  49. data/lib/gloo/objs/basic/boolean.rb +63 -38
  50. data/lib/gloo/objs/basic/container.rb +71 -12
  51. data/lib/gloo/objs/basic/decimal.rb +96 -0
  52. data/lib/gloo/objs/basic/integer.rb +45 -16
  53. data/lib/gloo/objs/basic/script.rb +62 -38
  54. data/lib/gloo/objs/basic/string.rb +47 -15
  55. data/lib/gloo/objs/basic/text.rb +69 -21
  56. data/lib/gloo/objs/basic/untyped.rb +35 -10
  57. data/lib/gloo/objs/cli/banner.rb +137 -0
  58. data/lib/gloo/objs/cli/bar.rb +141 -0
  59. data/lib/gloo/objs/cli/colorize.rb +54 -24
  60. data/lib/gloo/objs/cli/confirm.rb +63 -29
  61. data/lib/gloo/objs/cli/menu.rb +236 -0
  62. data/lib/gloo/objs/cli/menu_item.rb +128 -0
  63. data/lib/gloo/objs/cli/pastel.rb +120 -0
  64. data/lib/gloo/objs/cli/prompt.rb +73 -31
  65. data/lib/gloo/objs/cli/select.rb +153 -0
  66. data/lib/gloo/objs/ctrl/each.rb +128 -61
  67. data/lib/gloo/objs/ctrl/repeat.rb +129 -0
  68. data/lib/gloo/objs/data/markdown.rb +109 -0
  69. data/lib/gloo/objs/data/table.rb +168 -0
  70. data/lib/gloo/objs/dev/git.rb +98 -64
  71. data/lib/gloo/objs/dt/date.rb +72 -0
  72. data/lib/gloo/objs/dt/datetime.rb +84 -0
  73. data/lib/gloo/objs/dt/time.rb +72 -0
  74. data/lib/gloo/objs/ror/erb.rb +82 -41
  75. data/lib/gloo/objs/ror/eval.rb +73 -31
  76. data/lib/gloo/objs/snd/play.rb +71 -0
  77. data/lib/gloo/objs/snd/say.rb +120 -0
  78. data/lib/gloo/objs/system/file_handle.rb +129 -48
  79. data/lib/gloo/objs/system/system.rb +84 -38
  80. data/lib/gloo/objs/web/http_get.rb +103 -46
  81. data/lib/gloo/objs/web/http_post.rb +70 -44
  82. data/lib/gloo/objs/web/json.rb +155 -0
  83. data/lib/gloo/objs/web/slack.rb +89 -58
  84. data/lib/gloo/objs/web/teams.rb +88 -53
  85. data/lib/gloo/objs/web/uri.rb +160 -0
  86. data/lib/gloo/persist/file_loader.rb +95 -85
  87. data/lib/gloo/persist/file_saver.rb +12 -12
  88. data/lib/gloo/persist/file_storage.rb +15 -15
  89. data/lib/gloo/persist/line_splitter.rb +79 -0
  90. data/lib/gloo/persist/persist_man.rb +63 -39
  91. data/lib/gloo/utils/words.rb +2 -2
  92. data/lib/gloo/verbs/alert.rb +67 -16
  93. data/lib/gloo/verbs/beep.rb +70 -0
  94. data/lib/gloo/verbs/cls.rb +67 -0
  95. data/lib/gloo/verbs/context.rb +61 -21
  96. data/lib/gloo/verbs/create.rb +52 -21
  97. data/lib/gloo/verbs/help.rb +186 -27
  98. data/lib/gloo/verbs/if.rb +55 -21
  99. data/lib/gloo/verbs/list.rb +55 -24
  100. data/lib/gloo/verbs/load.rb +47 -12
  101. data/lib/gloo/verbs/move.rb +128 -0
  102. data/lib/gloo/verbs/put.rb +90 -34
  103. data/lib/gloo/verbs/quit.rb +43 -12
  104. data/lib/gloo/verbs/run.rb +63 -18
  105. data/lib/gloo/verbs/save.rb +45 -10
  106. data/lib/gloo/verbs/show.rb +56 -22
  107. data/lib/gloo/verbs/tell.rb +45 -13
  108. data/lib/gloo/verbs/unless.rb +56 -21
  109. data/lib/gloo/verbs/version.rb +42 -12
  110. data/lib/gloo/verbs/wait.rb +73 -0
  111. data/lib/run.rb +5 -5
  112. metadata +90 -12
@@ -15,24 +15,24 @@ module Gloo
15
15
  attr_reader :args, :mode, :running
16
16
  attr_reader :dictionary, :parser, :heap, :factory
17
17
  attr_accessor :last_cmd, :persist_man, :event_manager
18
-
18
+
19
19
  # Set up the engine with basic elements.
20
20
  def initialize( params = [] )
21
21
  $engine = self
22
22
  @args = Args.new( params )
23
23
  $settings = Settings.new( ENV[ 'GLOO_ENV' ] )
24
24
  $log = Log.new( @args.quiet? )
25
- $prompt = TTY::Prompt.new
26
- $log.debug "engine intialized..."
25
+ $prompt = TTY::Prompt.new
26
+ $log.debug 'engine intialized...'
27
27
  end
28
-
28
+
29
29
  # Start the engine.
30
30
  def start
31
- $log.debug "starting the engine..."
31
+ $log.debug 'starting the engine...'
32
32
  $log.debug Info.display_title
33
33
  @mode = @args.detect_mode
34
34
  @running = true
35
-
35
+
36
36
  @dictionary = Gloo::Core::Dictionary.instance
37
37
  @dictionary.init
38
38
  @parser = Gloo::Core::Parser.new
@@ -40,10 +40,14 @@ module Gloo
40
40
  @factory = Gloo::Core::Factory.new
41
41
  @persist_man = Gloo::Persist::PersistMan.new
42
42
  @event_manager = Gloo::Core::EventManager.new
43
-
43
+
44
44
  run_mode
45
45
  end
46
-
46
+
47
+ # ---------------------------------------------------------------------
48
+ # Run
49
+ # ---------------------------------------------------------------------
50
+
47
51
  # Run the selected mode.
48
52
  def run_mode
49
53
  if @mode == Mode::VERSION
@@ -56,14 +60,14 @@ module Gloo
56
60
  run
57
61
  end
58
62
  end
59
-
63
+
60
64
  # Run files specified on the CLI.
61
65
  # Then quit.
62
66
  def run_files
63
67
  @args.files.each do |f|
64
68
  @persist_man.load( f )
65
69
  end
66
-
70
+
67
71
  quit
68
72
  end
69
73
 
@@ -71,17 +75,17 @@ module Gloo
71
75
  def run
72
76
  # Open default files
73
77
  self.open_start_file
74
-
78
+
75
79
  # TODO: open any files specifed in args
76
-
80
+
77
81
  unless @mode == Mode::SCRIPT || @args.quiet?
78
82
  @cursor = TTY::Cursor
79
- self.loop
83
+ self.loop
80
84
  end
81
85
 
82
86
  quit
83
87
  end
84
-
88
+
85
89
  # Get the setting for the start_with file and open it.
86
90
  def open_start_file
87
91
  name = $settings.start_with
@@ -94,9 +98,9 @@ module Gloo
94
98
  d = dt.strftime( '%Y.%m.%d' )
95
99
  t = dt.strftime( '%I:%M:%S' )
96
100
 
97
- @last_cmd = $prompt.ask( "#{d.yellow} #{t.white} >" )
101
+ @last_cmd = $prompt.ask( "#{'gloo'.blue} #{d.yellow} #{t.white} >" )
98
102
  end
99
-
103
+
100
104
  # Is the last command entered blank?
101
105
  def last_cmd_blank?
102
106
  return true if @last_cmd.nil?
@@ -110,28 +114,31 @@ module Gloo
110
114
  process_cmd
111
115
  end
112
116
  end
113
-
117
+
114
118
  # Process the command.
115
119
  def process_cmd
116
120
  if last_cmd_blank?
117
121
  clear_screen
118
122
  return
119
123
  end
120
-
121
- @immediate = @parser.parse_immediate @last_cmd
122
- @immediate.run if @immediate
124
+
125
+ @parser.run @last_cmd
123
126
  end
124
127
 
125
128
  # Request the engine to stop running.
126
129
  def stop_running
127
130
  @running = false
128
131
  end
129
-
132
+
130
133
  # Do any clean up and quit.
131
134
  def quit
132
- $log.debug "quitting..."
135
+ $log.debug 'quitting...'
133
136
  end
134
-
137
+
138
+ # ---------------------------------------------------------------------
139
+ # Helpers
140
+ # ---------------------------------------------------------------------
141
+
135
142
  # Show the version information and then quit.
136
143
  def run_version
137
144
  puts Info.display_title unless @args.quiet?
@@ -139,20 +146,63 @@ module Gloo
139
146
  end
140
147
 
141
148
  # Show the help information and then quit.
142
- def run_help keep_running=false
143
- unless @args.quiet?
144
- puts Info.display_title
145
- puts Help.get_help_text
146
- end
149
+ def run_help( keep_running = false )
150
+ out = "#{Info.display_title}\n"
151
+ out << Help.get_help_text
152
+ $engine.heap.it.set_to out
153
+ puts out unless @args.quiet?
147
154
  quit unless keep_running
148
155
  end
149
-
156
+
150
157
  # Clear the screen.
151
158
  def clear_screen
159
+ @cursor ||= TTY::Cursor
152
160
  print @cursor.clear_screen
153
161
  print @cursor.move_to( 0, 0 )
154
162
  end
155
-
163
+
164
+ # ---------------------------------------------------------------------
165
+ # Error Handling
166
+ # ---------------------------------------------------------------------
167
+
168
+ #
169
+ # Did the last command result in an error?
170
+ #
171
+ def error?
172
+ return !@heap.error.value.nil?
173
+ end
174
+
175
+ #
176
+ # Report an error.
177
+ # Write it to the log and set the heap error value.
178
+ #
179
+ def err( msg )
180
+ $log.error msg
181
+ self.heap.error.set_to msg
182
+ end
183
+
184
+ # ---------------------------------------------------------------------
185
+ # Convert
186
+ # ---------------------------------------------------------------------
187
+
188
+ #
189
+ # Convert the given value to the specified type,
190
+ # or if no conversion is available, revert to default.
191
+ #
192
+ def convert( value, to_type, default = nil )
193
+ begin
194
+ name = "Gloo::Convert::#{value.class}To#{to_type}"
195
+ clazz = name.split( '::' ).inject( Object ) { |o, c| o.const_get c }
196
+ o = clazz.new
197
+ return o.convert( value )
198
+ rescue => e
199
+ $log.error e.message
200
+ $engine.heap.error.set_to e.message
201
+ end
202
+
203
+ return default
204
+ end
205
+
156
206
  end
157
207
  end
158
208
  end
@@ -11,19 +11,25 @@ module Gloo
11
11
  # Get text to display when the application is run
12
12
  # in HELP mode.
13
13
  def self.get_help_text
14
- str = "\nNAME\n\tgloo\n\n"
15
- str << "\nDESCRIPTION\n\tGloo scripting language. A scripting language built on ruby.\n"
16
- str << "\tMore information coming soon.\n\n"
17
- str << "\nSYNOPSIS\n\tgloo [global option] [file]\n\n"
18
- str << "\nGLOBAL OPTIONS\n"
19
- str << "\t--cli \t\t - Run in CLI mode\n"
20
- str << "\t--version \t - Show application version\n"
21
- str << "\t--help \t\t - Show this help page\n"
22
- str << "\n"
23
- return str
14
+ return <<~TEXT
15
+ NAME
16
+ \tgloo
17
+
18
+ DESCRIPTION
19
+ \tGloo scripting language. A scripting language built on ruby.
20
+ \tMore information coming soon.
21
+
22
+ SYNOPSIS
23
+ \tgloo [global option] [file]
24
+
25
+ GLOBAL OPTIONS
26
+ \t--cli \t\t - Run in CLI mode
27
+ \t--version \t - Show application version
28
+ \t--help \t\t - Show this help page
29
+
30
+ TEXT
24
31
  end
25
32
 
26
33
  end
27
34
  end
28
35
  end
29
-
@@ -8,9 +8,10 @@ module Gloo
8
8
  module App
9
9
  class Info
10
10
 
11
- VERSION = "0.3.0"
12
- APP_NAME = "Gloo"
11
+ VERSION = '0.5.3'.freeze
12
+ APP_NAME = 'Gloo'.freeze
13
13
 
14
+ # Get the application display title.
14
15
  def self.display_title
15
16
  return "#{APP_NAME}, version #{VERSION}"
16
17
  end
@@ -18,4 +19,3 @@ module Gloo
18
19
  end
19
20
  end
20
21
  end
21
-
@@ -12,46 +12,46 @@ module Gloo
12
12
  class Log
13
13
 
14
14
  attr_reader :logger, :quiet
15
-
15
+
16
16
  def initialize( quiet )
17
- f = File.join( $settings.log_path, "gloo.log" )
17
+ f = File.join( $settings.log_path, 'gloo.log' )
18
18
  @logger = Logger.new( f )
19
19
  @logger.level = Logger::DEBUG
20
20
  @quiet = quiet
21
21
  end
22
-
22
+
23
23
  # Show a message unless we're in quite mode.
24
- def show msg
24
+ def show( msg )
25
25
  puts msg unless @quiet
26
26
  end
27
-
28
- def debug msg
27
+
28
+ def debug( msg )
29
29
  @logger.debug msg
30
30
  end
31
31
 
32
- def info msg
32
+ def info( msg )
33
33
  @logger.info msg
34
34
  puts msg.blue unless @quiet
35
35
  end
36
36
 
37
- def warn msg
37
+ def warn( msg )
38
38
  @logger.warn msg
39
39
  puts msg.yellow unless @quiet
40
40
  end
41
41
 
42
- def error msg, e = nil
43
- if e
44
- @logger.error msg
45
- @logger.error e.message
46
- @logger.error e.backtrace
42
+ def error( msg, ex = nil, engine = nil )
43
+ engine&.heap&.error&.set_to msg
44
+ @logger.error msg
45
+ if ex
46
+ @logger.error ex.message
47
+ @logger.error ex.backtrace
47
48
  puts msg.red unless @quiet
48
- puts e.message.red unless @quiet
49
- puts e.backtrace unless @quiet
49
+ puts ex.message.red unless @quiet
50
+ puts ex.backtrace unless @quiet
50
51
  else
51
- @logger.error msg
52
52
  puts msg.red unless @quiet
53
53
  end
54
- end
54
+ end
55
55
 
56
56
  end
57
57
  end
@@ -7,19 +7,19 @@
7
7
  module Gloo
8
8
  module App
9
9
  class Mode
10
-
10
+
11
11
  EMBED = :embed # Run as embedded script processor
12
12
  CLI = :cli # Run in interactive (CLI) mode
13
13
  SCRIPT = :script # Run a script
14
14
  VERSION = :version # Show version information
15
15
  HELP = :help # Show the help screen
16
16
  TEST = :test # Running in Unit Test mode.
17
-
17
+
18
18
  # Get the default mode.
19
19
  def self.default_mode
20
20
  return EMBED
21
21
  end
22
-
22
+
23
23
  end
24
24
  end
25
- end
25
+ end
@@ -13,92 +13,102 @@ module Gloo
13
13
  class Settings
14
14
 
15
15
  attr_reader :user_root, :log_path, :config_path, :project_path
16
- attr_reader :start_with, :list_indent
17
-
16
+ attr_reader :start_with, :list_indent, :tmp_path
18
17
 
19
18
  # Load setting from the yml file.
20
- def initialize mode
19
+ def initialize( mode )
21
20
  @mode = mode
22
21
  init_root
23
22
  init_path_settings
24
23
  init_user_settings
25
24
  end
26
-
25
+
27
26
  def init_root
28
27
  if in_test_mode?
29
28
  path = File.dirname( File.dirname( File.absolute_path( __FILE__ ) ) )
30
29
  path = File.dirname( File.dirname( path ) )
31
- path = File.join( path, "test", "gloo" )
30
+ path = File.join( path, 'test', 'gloo' )
32
31
  @user_root = path
33
32
  else
34
- @user_root = File.join( Dir.home, "gloo" )
33
+ @user_root = File.join( Dir.home, 'gloo' )
35
34
  end
36
35
  end
37
-
36
+
38
37
  # Are we in test mode?
39
38
  def in_test_mode?
40
39
  return @mode == 'TEST'
41
40
  end
42
41
 
42
+ # Get the project path for the current mode.
43
+ def project_path_for_mode( settings )
44
+ return File.join( @user_root, 'projects' ) if in_test_mode?
45
+
46
+ return settings[ 'gloo' ][ 'project_path' ]
47
+ end
48
+
43
49
  # Get the app's required directories.
44
50
  def init_path_settings
45
- Dir.mkdir( @user_root ) unless File.exists?( @user_root )
51
+ Dir.mkdir( @user_root ) unless File.exist?( @user_root )
46
52
 
47
- @log_path = File.join( @user_root, "logs" )
48
- Dir.mkdir( @log_path ) unless File.exists?( @log_path )
53
+ @log_path = File.join( @user_root, 'logs' )
54
+ Dir.mkdir( @log_path ) unless File.exist?( @log_path )
49
55
 
50
- @config_path = File.join( @user_root, "config" )
51
- Dir.mkdir( @config_path ) unless File.exists?( @config_path )
56
+ @config_path = File.join( @user_root, 'config' )
57
+ Dir.mkdir( @config_path ) unless File.exist?( @config_path )
58
+
59
+ @tmp_path = File.join( @user_root, 'tmp' )
60
+ Dir.mkdir( @tmp_path ) unless File.exist?( @tmp_path )
52
61
  end
53
62
 
63
+ # Initialize the user settings for the currently
64
+ # running environment.
54
65
  def init_user_settings
55
66
  settings = get_settings
56
-
57
- if in_test_mode?
58
- @project_path = File.join( @user_root, "projects" )
59
- else
60
- @project_path = settings[ 'gloo' ][ 'project_path' ]
61
- end
67
+
68
+ @project_path = project_path_for_mode settings
62
69
  @start_with = settings[ 'gloo' ][ 'start_with' ]
63
70
  @list_indent = settings[ 'gloo' ][ 'list_indent' ]
64
71
  end
65
-
72
+
66
73
  # Get the app's required directories.
67
74
  def get_settings
68
- f = File.join( @config_path, "gloo.yml" )
69
- create_settings( f ) unless File.exists?( f )
70
- return YAML::load_file f
75
+ f = File.join( @config_path, 'gloo.yml' )
76
+ create_settings( f ) unless File.exist?( f )
77
+ return YAML.load_file f
71
78
  end
72
79
 
73
80
  # Create settings file.
74
- def create_settings f
75
- IO.write( f, get_default_settings )
81
+ def create_settings( file )
82
+ IO.write( file, get_default_settings )
76
83
  end
77
84
 
78
85
  # Get the value for default settings.
79
86
  def get_default_settings
80
- home_dir = Dir.home
81
- projects = File.join( @user_root, "projects" )
82
- str = <<TEXT
83
- gloo:
84
- project_path: #{projects}
85
- start_with:
86
- list_indent: 1
87
- TEXT
87
+ projects = File.join( @user_root, 'projects' )
88
+ str = <<~TEXT
89
+ gloo:
90
+ project_path: #{projects}
91
+ start_with:
92
+ list_indent: 1
93
+ TEXT
88
94
  return str
89
95
  end
90
96
 
97
+ #
91
98
  # Show the current application settings.
99
+ # Can be seen in app with 'help settings'
100
+ #
92
101
  def show
93
102
  puts "\nApplication Settings:".blue
94
- puts " User Root Path is here: ".yellow + @user_root.white
95
- puts " Projects directory: ".yellow + @projects.white
96
- puts " Startup with: ".yellow + @start_with.white
97
- puts " Indent in Listing: ".yellow + @list_indent.white
98
- puts ""
99
- puts " Screen Lines: ".yellow + "#{Settings.lines}".white
100
- puts " Page Size: ".yellow + "#{Settings.page_size}".white
101
- puts ""
103
+ puts ' User Root Path is here: '.yellow + @user_root.white
104
+ puts ' Projects directory: '.yellow + @project_path.white
105
+ puts ' Tmp directory: '.yellow + @tmp_path.white
106
+ puts ' Startup with: '.yellow + @start_with.white
107
+ puts ' Indent in Listing: '.yellow + @list_indent.to_s.white
108
+ puts ''
109
+ puts ' Screen Lines: '.yellow + Gloo::App::Settings.lines.to_s.white
110
+ puts ' Page Size: '.yellow + Gloo::App::Settings.page_size.to_s.white
111
+ puts ''
102
112
  end
103
113
 
104
114
  # Get the number of lines on screen.
@@ -122,4 +132,4 @@ TEXT
122
132
 
123
133
  end
124
134
  end
125
- end
135
+ end