gloo 0.3.0 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -6,66 +6,81 @@
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
12
13
  class HttpGet < Gloo::Core::Obj
13
-
14
- KEYWORD = 'http_get'
15
- KEYWORD_SHORT = 'get'
16
- URL = 'uri'
17
- PARAMS = 'params'
18
- RESULT = 'result'
19
-
20
- #
14
+
15
+ KEYWORD = 'http_get'.freeze
16
+ KEYWORD_SHORT = 'get'.freeze
17
+ URL = 'uri'.freeze
18
+ PARAMS = 'params'.freeze
19
+ RESULT = 'result'.freeze
20
+ SKIP_SSL_VERIFY = 'skip_ssl_verify'.freeze
21
+
22
+ #
21
23
  # The name of the object type.
22
- #
24
+ #
23
25
  def self.typename
24
26
  return KEYWORD
25
27
  end
26
28
 
27
- #
29
+ #
28
30
  # The short name of the object type.
29
- #
31
+ #
30
32
  def self.short_typename
31
33
  return KEYWORD_SHORT
32
34
  end
33
-
34
- #
35
+
36
+ #
35
37
  # Get the URI from the child object.
36
38
  # Returns nil if there is none.
37
- #
38
- def get_uri
39
+ #
40
+ def uri_value
39
41
  uri = find_child URL
40
42
  return nil unless uri
43
+
41
44
  return uri.value
42
45
  end
43
-
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
+
57
+ #
45
58
  # Set the result of the API call.
46
- #
47
- def set_result data
59
+ #
60
+ def update_result( data )
48
61
  r = find_child RESULT
49
62
  return nil unless r
63
+
50
64
  r.set_value data
51
65
  end
52
-
53
- #
66
+
67
+ #
54
68
  # Get the URL for the service including all URL params.
55
- #
56
- def get_full_url
57
- p = ""
69
+ #
70
+ def full_url_value
71
+ p = ''
58
72
  params = find_child PARAMS
59
73
  params.children.each do |child|
60
- p << ( p.empty? ? "?" : "&" )
61
-
74
+ p << ( p.empty? ? '?' : '&' )
75
+
76
+ child = Gloo::Objs::Alias.resolve_alias( child )
77
+
62
78
  # TODO: Quote URL params for safety
63
79
  p << "#{child.name}=#{child.value}"
64
80
  end
65
- return "#{get_uri}#{p}"
81
+ return "#{uri_value}#{p}"
66
82
  end
67
83
 
68
-
69
84
  # ---------------------------------------------------------------------
70
85
  # Children
71
86
  # ---------------------------------------------------------------------
@@ -76,53 +91,95 @@ module Gloo
76
91
  def add_children_on_create?
77
92
  return true
78
93
  end
79
-
94
+
80
95
  # Add children to this object.
81
- # This is used by containers to add children needed
96
+ # This is used by containers to add children needed
82
97
  # for default configurations.
83
98
  def add_default_children
84
99
  fac = $engine.factory
85
- fac.create "uri", "string", "https://web.site/", self
86
- fac.create "params", "container", nil, self
87
- fac.create "result", "string", nil, self
100
+ fac.create( { :name => 'uri',
101
+ :type => 'string',
102
+ :value => 'https://web.site/',
103
+ :parent => self } )
104
+ fac.create( { :name => 'params',
105
+ :type => 'container',
106
+ :value => nil,
107
+ :parent => self } )
108
+ fac.create( { :name => 'result',
109
+ :type => 'string',
110
+ :value => nil,
111
+ :parent => self } )
88
112
  end
89
113
 
90
-
91
114
  # ---------------------------------------------------------------------
92
115
  # Messages
93
116
  # ---------------------------------------------------------------------
94
117
 
95
- #
118
+ #
96
119
  # Get a list of message names that this object receives.
97
- #
120
+ #
98
121
  def self.messages
99
- return super + [ "run" ]
122
+ return super + [ 'run' ]
100
123
  end
101
-
124
+
102
125
  # Post the content to the endpoint.
103
126
  def msg_run
104
- url = get_full_url
127
+ url = full_url_value
105
128
  $log.debug url
106
- result = Gloo::Objs::HttpGet.get_response url
107
- set_result result
129
+ r = Gloo::Objs::HttpGet.invoke_request( url, self.skip_ssl_verify? )
130
+ update_result r
108
131
  end
109
-
110
-
132
+
111
133
  # ---------------------------------------------------------------------
112
134
  # Static functions
113
135
  # ---------------------------------------------------------------------
114
136
 
115
137
  # Post the content to the endpoint.
116
- def self.get_response url
138
+ def self.invoke_request( url, skip_ssl_verify = false )
117
139
  uri = URI( url )
118
- Net::HTTP.start( uri.host, uri.port,
119
- :use_ssl => uri.scheme == 'https') 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|
120
145
  request = Net::HTTP::Get.new uri
121
146
  response = http.request request # Net::HTTPResponse object
122
147
  return response.body
123
148
  end
124
149
  end
125
150
 
151
+ # ---------------------------------------------------------------------
152
+ # Help
153
+ # ---------------------------------------------------------------------
154
+
155
+ #
156
+ # Get help for this object type.
157
+ #
158
+ def self.help
159
+ return <<~TEXT
160
+ HTTP_GET OBJECT TYPE
161
+ NAME: http_get
162
+ SHORTCUT: get
163
+
164
+ DESCRIPTION
165
+ Perform an HTTP Get.
166
+
167
+ CHILDREN
168
+ uri - string - 'https://web.site/'
169
+ The URI for the HTTP Get request.
170
+ params - container
171
+ Collection of parameters for the HTTP Get.
172
+ result - string
173
+ The result of the request. Whatever was returned from
174
+ the HTTP Get call.
175
+ skip_ssl_verify - boolean (optional)
176
+ Skip the SSL verification as part of the request.
177
+
178
+ MESSAGES
179
+ run - Run the HTTP Get and update the result.
180
+ TEXT
181
+ end
182
+
126
183
  end
127
184
  end
128
185
  end
@@ -10,52 +10,53 @@ require 'json'
10
10
  module Gloo
11
11
  module Objs
12
12
  class HttpPost < Gloo::Core::Obj
13
-
14
- KEYWORD = 'http_post'
15
- KEYWORD_SHORT = 'post'
16
- URL = 'uri'
17
- BODY = 'body'
18
13
 
19
- #
14
+ KEYWORD = 'http_post'.freeze
15
+ KEYWORD_SHORT = 'post'.freeze
16
+ URL = 'uri'.freeze
17
+ BODY = 'body'.freeze
18
+
19
+ #
20
20
  # The name of the object type.
21
- #
21
+ #
22
22
  def self.typename
23
23
  return KEYWORD
24
24
  end
25
25
 
26
- #
26
+ #
27
27
  # The short name of the object type.
28
- #
28
+ #
29
29
  def self.short_typename
30
30
  return KEYWORD_SHORT
31
31
  end
32
-
33
- #
32
+
33
+ #
34
34
  # Get the URI from the child object.
35
35
  # Returns nil if there is none.
36
- #
37
- def get_uri
36
+ #
37
+ def uri_value
38
38
  uri = find_child URL
39
39
  return nil unless uri
40
+
40
41
  return uri.value
41
42
  end
42
-
43
- #
44
- # Get all the children of the body container and
43
+
44
+ #
45
+ # Get all the children of the body container and
45
46
  # convert to JSON that will be sent in the HTTP body.
46
- #
47
- def get_body_as_json
47
+ #
48
+ def body_as_json
48
49
  h = {}
49
-
50
+
50
51
  body = find_child BODY
51
52
  body.children.each do |child|
52
- h[ child.name ] = child.value
53
+ child_val = Gloo::Objs::Alias.resolve_alias( child )
54
+ h[ child.name ] = child_val.value
53
55
  end
54
-
56
+
55
57
  return h.to_json
56
58
  end
57
59
 
58
-
59
60
  # ---------------------------------------------------------------------
60
61
  # Children
61
62
  # ---------------------------------------------------------------------
@@ -66,50 +67,45 @@ module Gloo
66
67
  def add_children_on_create?
67
68
  return true
68
69
  end
69
-
70
+
70
71
  # Add children to this object.
71
- # This is used by containers to add children needed
72
+ # This is used by containers to add children needed
72
73
  # for default configurations.
73
74
  def add_default_children
74
75
  fac = $engine.factory
75
- fac.create "uri", "string", "https://web.site/", self
76
- fac.create "body", "container", nil, self
76
+ fac.create_string URL, 'https://web.site/', self
77
+ fac.create_can BODY, self
77
78
  end
78
79
 
79
-
80
80
  # ---------------------------------------------------------------------
81
81
  # Messages
82
82
  # ---------------------------------------------------------------------
83
83
 
84
- #
84
+ #
85
85
  # Get a list of message names that this object receives.
86
- #
86
+ #
87
87
  def self.messages
88
- return super + [ "run" ]
88
+ return super + [ 'run' ]
89
89
  end
90
-
90
+
91
91
  # Post the content to the endpoint.
92
92
  def msg_run
93
- uri = get_uri
93
+ uri = uri_value
94
94
  return unless uri
95
-
96
- body = get_body_as_json
97
-
98
- if uri.downcase.start_with?( "https" )
99
- use_ssl = true
100
- else
101
- use_ssl = false
102
- end
95
+
96
+ $log.debug "posting to: #{uri}"
97
+ body = self.body_as_json
98
+ $log.debug "posting body: #{body}"
99
+ use_ssl = uri.downcase.start_with?( 'https' )
103
100
  Gloo::Objs::HttpPost.post_json uri, body, use_ssl
104
101
  end
105
-
106
-
102
+
107
103
  # ---------------------------------------------------------------------
108
104
  # Static functions
109
105
  # ---------------------------------------------------------------------
110
106
 
111
107
  # Post the content to the endpoint.
112
- def self.post_json url, body, use_ssl=true
108
+ def self.post_json( url, body, use_ssl = true )
113
109
  # Structure the request
114
110
  uri = URI.parse( url )
115
111
  request = Net::HTTP::Post.new( uri.path )
@@ -119,7 +115,37 @@ module Gloo
119
115
  n.use_ssl = use_ssl
120
116
 
121
117
  # Send the payload to the endpoint.
122
- n.start { |http| http.request( request ) }
118
+ result = n.start { |http| http.request( request ) }
119
+ $log.debug result.code
120
+ $log.debug result.message
121
+ end
122
+
123
+ # ---------------------------------------------------------------------
124
+ # Help
125
+ # ---------------------------------------------------------------------
126
+
127
+ #
128
+ # Get help for this object type.
129
+ #
130
+ def self.help
131
+ return <<~TEXT
132
+ HTTP_POST OBJECT TYPE
133
+ NAME: http_post
134
+ SHORTCUT: post
135
+
136
+ DESCRIPTION
137
+ Perform an HTTP Post.
138
+
139
+ CHILDREN
140
+ uri - string - 'https://web.site/'
141
+ The URI for the HTTP Post.
142
+ body - container
143
+ Collection of parameters for the HTTP Post.
144
+
145
+ MESSAGES
146
+ run - Run the HTTP Post sending the body data to the
147
+ endpoint specified in the URI.
148
+ TEXT
123
149
  end
124
150
 
125
151
  end
@@ -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