gloo 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +5 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +139 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +43 -0
  9. data/Rakefile +12 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/exe/gloo +4 -0
  13. data/exe/o +4 -0
  14. data/gloo.gemspec +38 -0
  15. data/lib/gloo.rb +19 -0
  16. data/lib/gloo/app/args.rb +71 -0
  17. data/lib/gloo/app/engine.rb +158 -0
  18. data/lib/gloo/app/help.rb +29 -0
  19. data/lib/gloo/app/info.rb +21 -0
  20. data/lib/gloo/app/log.rb +58 -0
  21. data/lib/gloo/app/mode.rb +25 -0
  22. data/lib/gloo/app/settings.rb +125 -0
  23. data/lib/gloo/core/baseo.rb +28 -0
  24. data/lib/gloo/core/dictionary.rb +101 -0
  25. data/lib/gloo/core/event_manager.rb +46 -0
  26. data/lib/gloo/core/factory.rb +67 -0
  27. data/lib/gloo/core/gloo_system.rb +190 -0
  28. data/lib/gloo/core/heap.rb +42 -0
  29. data/lib/gloo/core/it.rb +30 -0
  30. data/lib/gloo/core/literal.rb +25 -0
  31. data/lib/gloo/core/obj.rb +222 -0
  32. data/lib/gloo/core/obj_finder.rb +35 -0
  33. data/lib/gloo/core/op.rb +33 -0
  34. data/lib/gloo/core/parser.rb +52 -0
  35. data/lib/gloo/core/pn.rb +134 -0
  36. data/lib/gloo/core/script.rb +37 -0
  37. data/lib/gloo/core/tokens.rb +123 -0
  38. data/lib/gloo/core/verb.rb +63 -0
  39. data/lib/gloo/expr/expression.rb +103 -0
  40. data/lib/gloo/expr/l_boolean.rb +29 -0
  41. data/lib/gloo/expr/l_integer.rb +29 -0
  42. data/lib/gloo/expr/l_string.rb +53 -0
  43. data/lib/gloo/expr/op_div.rb +20 -0
  44. data/lib/gloo/expr/op_minus.rb +20 -0
  45. data/lib/gloo/expr/op_mult.rb +20 -0
  46. data/lib/gloo/expr/op_plus.rb +22 -0
  47. data/lib/gloo/objs/basic/boolean.rb +113 -0
  48. data/lib/gloo/objs/basic/container.rb +50 -0
  49. data/lib/gloo/objs/basic/integer.rb +65 -0
  50. data/lib/gloo/objs/basic/script.rb +101 -0
  51. data/lib/gloo/objs/basic/string.rb +65 -0
  52. data/lib/gloo/objs/basic/text.rb +64 -0
  53. data/lib/gloo/objs/basic/untyped.rb +42 -0
  54. data/lib/gloo/objs/cli/colorize.rb +73 -0
  55. data/lib/gloo/objs/cli/confirm.rb +92 -0
  56. data/lib/gloo/objs/cli/prompt.rb +92 -0
  57. data/lib/gloo/objs/ctrl/each.rb +212 -0
  58. data/lib/gloo/objs/dev/git.rb +112 -0
  59. data/lib/gloo/objs/ror/erb.rb +109 -0
  60. data/lib/gloo/objs/ror/eval.rb +92 -0
  61. data/lib/gloo/objs/system/file_handle.rb +86 -0
  62. data/lib/gloo/objs/system/system.rb +120 -0
  63. data/lib/gloo/objs/web/http_get.rb +128 -0
  64. data/lib/gloo/objs/web/http_post.rb +127 -0
  65. data/lib/gloo/objs/web/slack.rb +126 -0
  66. data/lib/gloo/objs/web/teams.rb +117 -0
  67. data/lib/gloo/persist/file_loader.rb +171 -0
  68. data/lib/gloo/persist/file_saver.rb +43 -0
  69. data/lib/gloo/persist/file_storage.rb +43 -0
  70. data/lib/gloo/persist/persist_man.rb +90 -0
  71. data/lib/gloo/utils/words.rb +19 -0
  72. data/lib/gloo/verbs/alert.rb +42 -0
  73. data/lib/gloo/verbs/context.rb +52 -0
  74. data/lib/gloo/verbs/create.rb +52 -0
  75. data/lib/gloo/verbs/help.rb +69 -0
  76. data/lib/gloo/verbs/if.rb +56 -0
  77. data/lib/gloo/verbs/list.rb +85 -0
  78. data/lib/gloo/verbs/load.rb +39 -0
  79. data/lib/gloo/verbs/put.rb +62 -0
  80. data/lib/gloo/verbs/quit.rb +40 -0
  81. data/lib/gloo/verbs/run.rb +46 -0
  82. data/lib/gloo/verbs/save.rb +37 -0
  83. data/lib/gloo/verbs/show.rb +55 -0
  84. data/lib/gloo/verbs/tell.rb +47 -0
  85. data/lib/gloo/verbs/unless.rb +56 -0
  86. data/lib/gloo/verbs/version.rb +37 -0
  87. data/lib/run.rb +13 -0
  88. metadata +254 -0
@@ -0,0 +1,128 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # An object that can post JSON to a URI.
5
+ #
6
+ require 'net/http'
7
+ require 'uri'
8
+ require 'json'
9
+
10
+ module Gloo
11
+ module Objs
12
+ 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
+ #
21
+ # The name of the object type.
22
+ #
23
+ def self.typename
24
+ return KEYWORD
25
+ end
26
+
27
+ #
28
+ # The short name of the object type.
29
+ #
30
+ def self.short_typename
31
+ return KEYWORD_SHORT
32
+ end
33
+
34
+ #
35
+ # Get the URI from the child object.
36
+ # Returns nil if there is none.
37
+ #
38
+ def get_uri
39
+ uri = find_child URL
40
+ return nil unless uri
41
+ return uri.value
42
+ end
43
+
44
+ #
45
+ # Set the result of the API call.
46
+ #
47
+ def set_result data
48
+ r = find_child RESULT
49
+ return nil unless r
50
+ r.set_value data
51
+ end
52
+
53
+ #
54
+ # Get the URL for the service including all URL params.
55
+ #
56
+ def get_full_url
57
+ p = ""
58
+ params = find_child PARAMS
59
+ params.children.each do |child|
60
+ p << ( p.empty? ? "?" : "&" )
61
+
62
+ # TODO: Quote URL params for safety
63
+ p << "#{child.name}=#{child.value}"
64
+ end
65
+ return "#{get_uri}#{p}"
66
+ end
67
+
68
+
69
+ # ---------------------------------------------------------------------
70
+ # Children
71
+ # ---------------------------------------------------------------------
72
+
73
+ # Does this object have children to add when an object
74
+ # is created in interactive mode?
75
+ # This does not apply during obj load, etc.
76
+ def add_children_on_create?
77
+ return true
78
+ end
79
+
80
+ # Add children to this object.
81
+ # This is used by containers to add children needed
82
+ # for default configurations.
83
+ def add_default_children
84
+ 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
88
+ end
89
+
90
+
91
+ # ---------------------------------------------------------------------
92
+ # Messages
93
+ # ---------------------------------------------------------------------
94
+
95
+ #
96
+ # Get a list of message names that this object receives.
97
+ #
98
+ def self.messages
99
+ return super + [ "run" ]
100
+ end
101
+
102
+ # Post the content to the endpoint.
103
+ def msg_run
104
+ url = get_full_url
105
+ $log.debug url
106
+ result = Gloo::Objs::HttpGet.get_response url
107
+ set_result result
108
+ end
109
+
110
+
111
+ # ---------------------------------------------------------------------
112
+ # Static functions
113
+ # ---------------------------------------------------------------------
114
+
115
+ # Post the content to the endpoint.
116
+ def self.get_response url
117
+ uri = URI( url )
118
+ Net::HTTP.start( uri.host, uri.port,
119
+ :use_ssl => uri.scheme == 'https') do |http|
120
+ request = Net::HTTP::Get.new uri
121
+ response = http.request request # Net::HTTPResponse object
122
+ return response.body
123
+ end
124
+ end
125
+
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,127 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # An object that can post JSON to a URI.
5
+ #
6
+ require 'net/http'
7
+ require 'uri'
8
+ require 'json'
9
+
10
+ module Gloo
11
+ module Objs
12
+ class HttpPost < Gloo::Core::Obj
13
+
14
+ KEYWORD = 'http_post'
15
+ KEYWORD_SHORT = 'post'
16
+ URL = 'uri'
17
+ BODY = 'body'
18
+
19
+ #
20
+ # The name of the object type.
21
+ #
22
+ def self.typename
23
+ return KEYWORD
24
+ end
25
+
26
+ #
27
+ # The short name of the object type.
28
+ #
29
+ def self.short_typename
30
+ return KEYWORD_SHORT
31
+ end
32
+
33
+ #
34
+ # Get the URI from the child object.
35
+ # Returns nil if there is none.
36
+ #
37
+ def get_uri
38
+ uri = find_child URL
39
+ return nil unless uri
40
+ return uri.value
41
+ end
42
+
43
+ #
44
+ # Get all the children of the body container and
45
+ # convert to JSON that will be sent in the HTTP body.
46
+ #
47
+ def get_body_as_json
48
+ h = {}
49
+
50
+ body = find_child BODY
51
+ body.children.each do |child|
52
+ h[ child.name ] = child.value
53
+ end
54
+
55
+ return h.to_json
56
+ end
57
+
58
+
59
+ # ---------------------------------------------------------------------
60
+ # Children
61
+ # ---------------------------------------------------------------------
62
+
63
+ # Does this object have children to add when an object
64
+ # is created in interactive mode?
65
+ # This does not apply during obj load, etc.
66
+ def add_children_on_create?
67
+ return true
68
+ end
69
+
70
+ # Add children to this object.
71
+ # This is used by containers to add children needed
72
+ # for default configurations.
73
+ def add_default_children
74
+ fac = $engine.factory
75
+ fac.create "uri", "string", "https://web.site/", self
76
+ fac.create "body", "container", nil, self
77
+ end
78
+
79
+
80
+ # ---------------------------------------------------------------------
81
+ # Messages
82
+ # ---------------------------------------------------------------------
83
+
84
+ #
85
+ # Get a list of message names that this object receives.
86
+ #
87
+ def self.messages
88
+ return super + [ "run" ]
89
+ end
90
+
91
+ # Post the content to the endpoint.
92
+ def msg_run
93
+ uri = get_uri
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
103
+ Gloo::Objs::HttpPost.post_json uri, body, use_ssl
104
+ end
105
+
106
+
107
+ # ---------------------------------------------------------------------
108
+ # Static functions
109
+ # ---------------------------------------------------------------------
110
+
111
+ # Post the content to the endpoint.
112
+ def self.post_json url, body, use_ssl=true
113
+ # Structure the request
114
+ uri = URI.parse( url )
115
+ request = Net::HTTP::Post.new( uri.path )
116
+ request.content_type = 'application/json'
117
+ request.body = body
118
+ n = Net::HTTP.new( uri.host, uri.port )
119
+ n.use_ssl = use_ssl
120
+
121
+ # Send the payload to the endpoint.
122
+ n.start { |http| http.request( request ) }
123
+ end
124
+
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,126 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # An object that can send a message to a slack channel.
5
+ #
6
+ require 'net/http'
7
+ require 'uri'
8
+ require 'json'
9
+
10
+ module Gloo
11
+ module Objs
12
+ class Slack < Gloo::Core::Obj
13
+
14
+ KEYWORD = 'slack'
15
+ KEYWORD_SHORT = 'slack'
16
+ URL = 'uri'
17
+ MSG = 'message'
18
+ USER = 'username'
19
+ CHANNEL = 'channel'
20
+ ICON = 'icon_emoji'
21
+
22
+ ATTACHMENT = 'attachment'
23
+ TITLE = 'title'
24
+ TEXT = 'text'
25
+
26
+ #
27
+ # The name of the object type.
28
+ #
29
+ def self.typename
30
+ return KEYWORD
31
+ end
32
+
33
+ #
34
+ # The short name of the object type.
35
+ #
36
+ def self.short_typename
37
+ return KEYWORD_SHORT
38
+ end
39
+
40
+ #
41
+ # Get the URI from the child object.
42
+ # Returns nil if there is none.
43
+ #
44
+ def get_uri
45
+ uri = find_child URL
46
+ return nil unless uri
47
+ return uri.value
48
+ end
49
+
50
+ #
51
+ # Get the URI from the child object.
52
+ # Returns nil if there is none.
53
+ #
54
+ def get_attachment
55
+ o = find_child ATTACHMENT
56
+ return nil unless o
57
+
58
+ title = o.find_child TITLE
59
+ text = o.find_child TEXT
60
+ return [{ 'title' => title.value, 'text' => text.value }]
61
+ end
62
+
63
+ #
64
+ # Get all the children of the body container and
65
+ # convert to JSON that will be sent in the HTTP body.
66
+ #
67
+ def get_body_as_json
68
+ h = { 'text' => find_child( MSG ).value,
69
+ 'username' => find_child( USER ).value,
70
+ 'channel' => find_child( CHANNEL ).value,
71
+ 'icon_emoji' => find_child( ICON ).value,
72
+ }
73
+
74
+ o = get_attachment
75
+ h[ 'attachments' ] = o if o
76
+ return h.to_json
77
+ end
78
+
79
+
80
+ # ---------------------------------------------------------------------
81
+ # Children
82
+ # ---------------------------------------------------------------------
83
+
84
+ # Does this object have children to add when an object
85
+ # is created in interactive mode?
86
+ # This does not apply during obj load, etc.
87
+ def add_children_on_create?
88
+ return true
89
+ end
90
+
91
+ # Add children to this object.
92
+ # This is used by containers to add children needed
93
+ # for default configurations.
94
+ def add_default_children
95
+ fac = $engine.factory
96
+ fac.create URL, "string", "https://hooks.slack.com/services/...", self
97
+ fac.create MSG, "string", "textual message", self
98
+ fac.create USER, "string", "Slack Bot", self
99
+ fac.create CHANNEL, "string", "general", self
100
+ fac.create ICON, "string", ":ghost:", self
101
+ end
102
+
103
+
104
+ # ---------------------------------------------------------------------
105
+ # Messages
106
+ # ---------------------------------------------------------------------
107
+
108
+ #
109
+ # Get a list of message names that this object receives.
110
+ #
111
+ def self.messages
112
+ return super + [ "run" ]
113
+ end
114
+
115
+ # Post the content to the endpoint.
116
+ def msg_run
117
+ uri = get_uri
118
+ return unless uri
119
+
120
+ body = get_body_as_json
121
+ Gloo::Objs::HttpPost.post_json uri, body, true
122
+ end
123
+
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,117 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # An object that can send a message to a Teams webhook.
5
+ #
6
+ require 'net/http'
7
+ require 'uri'
8
+ require 'json'
9
+
10
+ module Gloo
11
+ module Objs
12
+ class Teams < Gloo::Core::Obj
13
+
14
+ KEYWORD = 'teams'
15
+ KEYWORD_SHORT = 'team'
16
+ URL = 'uri'
17
+ MSG = 'message'
18
+ TITLE = 'title'
19
+ COLOR = 'color'
20
+
21
+ #
22
+ # The name of the object type.
23
+ #
24
+ def self.typename
25
+ return KEYWORD
26
+ end
27
+
28
+ #
29
+ # The short name of the object type.
30
+ #
31
+ def self.short_typename
32
+ return KEYWORD_SHORT
33
+ end
34
+
35
+ #
36
+ # Get the URI from the child object.
37
+ # Returns nil if there is none.
38
+ #
39
+ def get_uri
40
+ uri = find_child URL
41
+ return nil unless uri
42
+ return uri.value
43
+ end
44
+
45
+ # Get the color value.
46
+ def get_color
47
+ c = find_child COLOR
48
+ return nil unless c
49
+ return c.value
50
+ end
51
+
52
+ #
53
+ # Get all the children of the body container and
54
+ # convert to JSON that will be sent in the HTTP body.
55
+ #
56
+ def get_body_as_json
57
+ h = { 'title' => find_child( TITLE ).value,
58
+ 'text' => find_child( MSG ).value
59
+ }
60
+
61
+ color = get_color
62
+ if color
63
+ h[ 'themeColor' ] = color
64
+ end
65
+
66
+ return h.to_json
67
+ end
68
+
69
+
70
+ # ---------------------------------------------------------------------
71
+ # Children
72
+ # ---------------------------------------------------------------------
73
+
74
+ # Does this object have children to add when an object
75
+ # is created in interactive mode?
76
+ # This does not apply during obj load, etc.
77
+ def add_children_on_create?
78
+ return true
79
+ end
80
+
81
+ # Add children to this object.
82
+ # This is used by containers to add children needed
83
+ # for default configurations.
84
+ def add_default_children
85
+ fac = $engine.factory
86
+ fac.create URL, "string", "https://outlook.office.com/webhook/...", self
87
+ fac.create TITLE, "string", "", self
88
+ fac.create COLOR, "color", "008000", self
89
+ fac.create MSG, "string", "", self
90
+ end
91
+
92
+
93
+ # ---------------------------------------------------------------------
94
+ # Messages
95
+ # ---------------------------------------------------------------------
96
+
97
+ #
98
+ # Get a list of message names that this object receives.
99
+ #
100
+ def self.messages
101
+ return super + [ "run" ]
102
+ end
103
+
104
+ # Post the content to the endpoint.
105
+ def msg_run
106
+ uri = get_uri
107
+ return unless uri
108
+
109
+ body = get_body_as_json
110
+ # puts body
111
+
112
+ Gloo::Objs::HttpPost.post_json uri, body, true
113
+ end
114
+
115
+ end
116
+ end
117
+ end