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
@@ -57,6 +57,7 @@ module Gloo
57
57
 
58
58
  body = find_child PARAMS
59
59
  body.children.each do |child|
60
+ child = Gloo::Objs::Alias.resolve_alias( child )
60
61
  h[ child.name ] = child.value
61
62
  end
62
63
 
@@ -3,6 +3,7 @@
3
3
  #
4
4
  # An object that points to a file in the system.
5
5
  #
6
+ require 'tty-pager'
6
7
 
7
8
  module Gloo
8
9
  module Objs
@@ -33,9 +34,45 @@ module Gloo
33
34
  # Get a list of message names that this object receives.
34
35
  #
35
36
  def self.messages
36
- return super + %w[read write check_exists check_is_file check_is_dir]
37
+ basic = %w[read write]
38
+ checks = %w[check_exists check_is_file check_is_dir]
39
+ show = %w[show page open]
40
+ return super + basic + show + checks
37
41
  end
38
42
 
43
+ #
44
+ # Open the file in the default application for the file type.
45
+ #
46
+ def msg_open
47
+ return unless value && File.exist?( value )
48
+
49
+ cmd = Gloo::Core::GlooSystem.open_for_platform
50
+ cmd_with_param = "#{cmd} \"#{value}\""
51
+ `#{cmd_with_param}`
52
+ end
53
+
54
+ #
55
+ # Show the contents of the file, paginated.
56
+ #
57
+ def msg_page
58
+ return unless value && File.file?( value )
59
+
60
+ pager = TTY::Pager.new
61
+ pager.page( path: value )
62
+ end
63
+
64
+ #
65
+ # Show the contents of the file.
66
+ #
67
+ def msg_show
68
+ return unless value && File.file?( value )
69
+
70
+ puts File.read( value )
71
+ end
72
+
73
+ #
74
+ # Read the contents of the file into the object.
75
+ #
39
76
  def msg_read
40
77
  return unless value && File.file?( value )
41
78
 
@@ -49,6 +86,9 @@ module Gloo
49
86
  end
50
87
  end
51
88
 
89
+ #
90
+ # Write the given data out to the file.
91
+ #
52
92
  def msg_write
53
93
  data = ''
54
94
  return unless value
@@ -60,19 +100,25 @@ module Gloo
60
100
  File.write( value, data )
61
101
  end
62
102
 
103
+ #
63
104
  # Check to see if the file exists.
105
+ #
64
106
  def msg_check_exists
65
107
  result = File.exist? value
66
108
  $engine.heap.it.set_to result
67
109
  end
68
110
 
111
+ #
69
112
  # Check to see if the file is a file.
113
+ #
70
114
  def msg_check_is_file
71
115
  result = File.file? value
72
116
  $engine.heap.it.set_to result
73
117
  end
74
118
 
119
+ #
75
120
  # Check to see if the file is a directory.
121
+ #
76
122
  def msg_check_is_dir
77
123
  result = File.directory? value
78
124
  $engine.heap.it.set_to result
@@ -104,6 +150,9 @@ module Gloo
104
150
  If the <into.obj> is not specified, the data will be in <it>.
105
151
  write <from.obj> - Write the data in the <from.object> into
106
152
  the file.
153
+ show - Show the contents of the file.
154
+ page - Show the contents of the file, paginated
155
+ open - Open the file with the default application for the type.
107
156
  check_exists - Check to see if the file exists.
108
157
  <It> will be true or false.
109
158
  check_is_file - Check to see if the file specified is a
@@ -6,6 +6,7 @@
6
6
  require 'net/http'
7
7
  require 'uri'
8
8
  require 'json'
9
+ require 'openssl'
9
10
 
10
11
  module Gloo
11
12
  module Objs
@@ -16,6 +17,7 @@ module Gloo
16
17
  URL = 'uri'.freeze
17
18
  PARAMS = 'params'.freeze
18
19
  RESULT = 'result'.freeze
20
+ SKIP_SSL_VERIFY = 'skip_ssl_verify'.freeze
19
21
 
20
22
  #
21
23
  # The name of the object type.
@@ -42,6 +44,16 @@ module Gloo
42
44
  return uri.value
43
45
  end
44
46
 
47
+ #
48
+ # Should we skip SSL verification during the request?
49
+ #
50
+ def skip_ssl_verify?
51
+ skip = find_child SKIP_SSL_VERIFY
52
+ return false unless skip
53
+
54
+ return skip.value
55
+ end
56
+
45
57
  #
46
58
  # Set the result of the API call.
47
59
  #
@@ -61,6 +73,8 @@ module Gloo
61
73
  params.children.each do |child|
62
74
  p << ( p.empty? ? '?' : '&' )
63
75
 
76
+ child = Gloo::Objs::Alias.resolve_alias( child )
77
+
64
78
  # TODO: Quote URL params for safety
65
79
  p << "#{child.name}=#{child.value}"
66
80
  end
@@ -112,7 +126,8 @@ module Gloo
112
126
  def msg_run
113
127
  url = full_url_value
114
128
  $log.debug url
115
- update_result Gloo::Objs::HttpGet.invoke_request url
129
+ r = Gloo::Objs::HttpGet.invoke_request( url, self.skip_ssl_verify? )
130
+ update_result r
116
131
  end
117
132
 
118
133
  # ---------------------------------------------------------------------
@@ -120,10 +135,13 @@ module Gloo
120
135
  # ---------------------------------------------------------------------
121
136
 
122
137
  # Post the content to the endpoint.
123
- def self.invoke_request( url )
138
+ def self.invoke_request( url, skip_ssl_verify = false )
124
139
  uri = URI( url )
125
- use_ssl = uri.scheme.downcase.equal?( 'https' )
126
- Net::HTTP.start( uri.host, uri.port, :use_ssl => use_ssl ) do |http|
140
+ params = { use_ssl: uri.scheme == 'https' }
141
+
142
+ params[ :verify_mode ] = ::OpenSSL::SSL::VERIFY_NONE if skip_ssl_verify
143
+
144
+ Net::HTTP.start( uri.host, uri.port, params ) do |http|
127
145
  request = Net::HTTP::Get.new uri
128
146
  response = http.request request # Net::HTTPResponse object
129
147
  return response.body
@@ -154,6 +172,8 @@ module Gloo
154
172
  result - string
155
173
  The result of the request. Whatever was returned from
156
174
  the HTTP Get call.
175
+ skip_ssl_verify - boolean (optional)
176
+ Skip the SSL verification as part of the request.
157
177
 
158
178
  MESSAGES
159
179
  run - Run the HTTP Get and update the result.
@@ -50,6 +50,7 @@ module Gloo
50
50
 
51
51
  body = find_child BODY
52
52
  body.children.each do |child|
53
+ child = Gloo::Objs::Alias.resolve_alias( child )
53
54
  h[ child.name ] = child.value
54
55
  end
55
56
 
@@ -0,0 +1,155 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
+ #
4
+ # JSON data.
5
+ #
6
+ require 'json'
7
+
8
+ module Gloo
9
+ module Objs
10
+ class Json < Gloo::Core::Obj
11
+
12
+ KEYWORD = 'json'.freeze
13
+ KEYWORD_SHORT = 'json'.freeze
14
+
15
+ #
16
+ # The name of the object type.
17
+ #
18
+ def self.typename
19
+ return KEYWORD
20
+ end
21
+
22
+ #
23
+ # The short name of the object type.
24
+ #
25
+ def self.short_typename
26
+ return KEYWORD_SHORT
27
+ end
28
+
29
+ #
30
+ # Set the value with any necessary type conversions.
31
+ #
32
+ def set_value( new_value )
33
+ self.value = new_value.to_s
34
+ end
35
+
36
+ #
37
+ # Does this object support multi-line values?
38
+ # Initially only true for scripts.
39
+ #
40
+ def multiline_value?
41
+ return false
42
+ end
43
+
44
+ #
45
+ # Get the number of lines of text.
46
+ #
47
+ def line_count
48
+ return value.split( "\n" ).count
49
+ end
50
+
51
+ # ---------------------------------------------------------------------
52
+ # Messages
53
+ # ---------------------------------------------------------------------
54
+
55
+ #
56
+ # Get a list of message names that this object receives.
57
+ #
58
+ def self.messages
59
+ return super + %w[get parse]
60
+ end
61
+
62
+ #
63
+ # Get a value from the JSON data.
64
+ # The additional parameter is the path to the value.
65
+ #
66
+ def msg_get
67
+ if @params&.token_count&.positive?
68
+ expr = Gloo::Expr::Expression.new( @params.tokens )
69
+ data = expr.evaluate
70
+ end
71
+ return unless data
72
+
73
+ h = JSON.parse( self.value )
74
+ field = h[ data ]
75
+ $engine.heap.it.set_to field
76
+ return field
77
+ end
78
+
79
+ #
80
+ # Parse the JSON data and put it in objects.
81
+ # The additional parameter is the path to the destination
82
+ # for the parsed objects.
83
+ #
84
+ def msg_parse
85
+ if @params&.token_count&.positive?
86
+ pn = Gloo::Core::Pn.new @params.tokens.first
87
+ unless pn&.exists?
88
+ $engine.err 'Destination path for parsed objects does not exist'
89
+ return
90
+ end
91
+ else
92
+ $engine.err 'Destination path for parsed objects is required'
93
+ return
94
+ end
95
+ parent = pn.resolve
96
+
97
+ json = JSON.parse( self.value )
98
+ self.handle_json( json, parent )
99
+ end
100
+
101
+ #
102
+ # Handle JSON, creating objects and setting values.
103
+ # Note that this is a recursive function.
104
+ #
105
+ def handle_json( json, parent )
106
+ if json.class == Hash
107
+ json.each do |k, v|
108
+ if v.class == Array
109
+ o = parent.find_add_child( k, 'can' )
110
+ handle_json( v, o )
111
+ else
112
+ o = parent.find_add_child( k, 'untyped' )
113
+ o.set_value v
114
+ end
115
+ end
116
+ elsif json.class == Array
117
+ json.each_with_index do |o, index|
118
+ child = parent.find_add_child( index.to_s, 'can' )
119
+ handle_json( o, child )
120
+ end
121
+ end
122
+ end
123
+
124
+ # ---------------------------------------------------------------------
125
+ # Help
126
+ # ---------------------------------------------------------------------
127
+
128
+ #
129
+ # Get help for this object type.
130
+ #
131
+ def self.help
132
+ return <<~TEXT
133
+ JSON OBJECT TYPE
134
+ NAME: json
135
+ SHORTCUT: json
136
+
137
+ DESCRIPTION
138
+ JSON data in a text string.
139
+
140
+ CHILDREN
141
+ None
142
+
143
+ MESSAGES
144
+ get - get a value from the JSON data
145
+ Example: tell myjson to get ("title")
146
+ The additional parameter is the path to the value.
147
+ parse - parse the JSON data and put values in the
148
+ object specified by the additional parameter
149
+ Example: tell myjson to parse ("path.to.objects")
150
+ TEXT
151
+ end
152
+
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,160 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
+ #
4
+ # A URI (URL).
5
+ #
6
+ require 'uri'
7
+
8
+ module Gloo
9
+ module Objs
10
+ class Uri < Gloo::Core::Obj
11
+
12
+ KEYWORD = 'uri'.freeze
13
+ KEYWORD_SHORT = 'url'.freeze
14
+
15
+ #
16
+ # The name of the object type.
17
+ #
18
+ def self.typename
19
+ return KEYWORD
20
+ end
21
+
22
+ #
23
+ # The short name of the object type.
24
+ #
25
+ def self.short_typename
26
+ return KEYWORD_SHORT
27
+ end
28
+
29
+ #
30
+ # Set the value with any necessary type conversions.
31
+ #
32
+ def set_value( new_value )
33
+ self.value = new_value.to_s
34
+ end
35
+
36
+ #
37
+ # Does this object support multi-line values?
38
+ # Initially only true for scripts.
39
+ #
40
+ def multiline_value?
41
+ return false
42
+ end
43
+
44
+ # ---------------------------------------------------------------------
45
+ # Messages
46
+ # ---------------------------------------------------------------------
47
+
48
+ #
49
+ # Get a list of message names that this object receives.
50
+ #
51
+ def self.messages
52
+ basic = %w[open]
53
+ gets = %w[get_scheme get_host get_path]
54
+ more = %w[get_query get_fragment]
55
+ return super + basic + gets + more
56
+ end
57
+
58
+ #
59
+ # Get the URI fragment that comes after the '#'
60
+ # in the URL. Might be used to scroll down in the page.
61
+ #
62
+ def msg_get_fragment
63
+ return unless value
64
+
65
+ o = URI( value ).fragment
66
+ $engine.heap.it.set_to o
67
+ return o
68
+ end
69
+
70
+ #
71
+ # Get the URI query parameters.
72
+ # Example: id=121
73
+ #
74
+ def msg_get_query
75
+ return unless value
76
+
77
+ o = URI( value ).query
78
+ $engine.heap.it.set_to o
79
+ return o
80
+ end
81
+
82
+ #
83
+ # Get the URI path.
84
+ # Example: /posts
85
+ #
86
+ def msg_get_path
87
+ return unless value
88
+
89
+ o = URI( value ).path
90
+ $engine.heap.it.set_to o
91
+ return o
92
+ end
93
+
94
+ #
95
+ # Get the URI host.
96
+ # Example: google.com
97
+ #
98
+ def msg_get_host
99
+ return unless value
100
+
101
+ o = URI( value ).host
102
+ $engine.heap.it.set_to o
103
+ return o
104
+ end
105
+
106
+ #
107
+ # Get the URI Scheme.
108
+ # Example: http
109
+ #
110
+ def msg_get_scheme
111
+ return unless value
112
+
113
+ o = URI( value ).scheme
114
+ $engine.heap.it.set_to o
115
+ return o
116
+ end
117
+
118
+ #
119
+ # Open the URI in the default browser.
120
+ #
121
+ def msg_open
122
+ return unless value
123
+
124
+ cmd = Gloo::Core::GlooSystem.open_for_platform
125
+ cmd_with_param = "#{cmd} \"#{value}\""
126
+ `#{cmd_with_param}`
127
+ end
128
+
129
+ # ---------------------------------------------------------------------
130
+ # Help
131
+ # ---------------------------------------------------------------------
132
+
133
+ #
134
+ # Get help for this object type.
135
+ #
136
+ def self.help
137
+ return <<~TEXT
138
+ URI OBJECT TYPE
139
+ NAME: uri
140
+ SHORTCUT: url
141
+
142
+ DESCRIPTION
143
+ A URI or URL.
144
+
145
+ CHILDREN
146
+ None
147
+
148
+ MESSAGES
149
+ open - open the URL in the default browser
150
+ get_scheme - get the URI scheme; example: http
151
+ get_host - get the URI host; example: google.com
152
+ get_path - get the URI resource path; example: /post
153
+ get_query - get the URI query parameterse; example: id=121
154
+ get_fragment - get the URI fragment
155
+ TEXT
156
+ end
157
+
158
+ end
159
+ end
160
+ end