gloo 0.3.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 (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,64 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # A [multiline] block of text.
5
+ #
6
+
7
+ module Gloo
8
+ module Objs
9
+ class Text < Gloo::Core::Obj
10
+
11
+ KEYWORD = 'text'
12
+ KEYWORD_SHORT = 'txt'
13
+
14
+ #
15
+ # The name of the object type.
16
+ #
17
+ def self.typename
18
+ return KEYWORD
19
+ end
20
+
21
+ #
22
+ # The short name of the object type.
23
+ #
24
+ def self.short_typename
25
+ return KEYWORD_SHORT
26
+ end
27
+
28
+ #
29
+ # Set the value with any necessary type conversions.
30
+ #
31
+ def set_value new_value
32
+ self.value = new_value.to_s
33
+ end
34
+
35
+ #
36
+ # Does this object support multi-line values?
37
+ # Initially only true for scripts.
38
+ #
39
+ def has_multiline_value?
40
+ return false
41
+ end
42
+
43
+ #
44
+ # Get the number of lines of text.
45
+ #
46
+ def line_count
47
+ return value.split( "\n" ).count
48
+ end
49
+
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
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,42 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # An Untyped Object.
5
+ #
6
+
7
+ module Gloo
8
+ module Objs
9
+ class Untyped < Gloo::Core::Obj
10
+
11
+ KEYWORD = 'untyped'
12
+ KEYWORD_SHORT = 'un'
13
+
14
+ #
15
+ # The name of the object type.
16
+ #
17
+ def self.typename
18
+ return KEYWORD
19
+ end
20
+
21
+ #
22
+ # The short name of the object type.
23
+ #
24
+ def self.short_typename
25
+ return KEYWORD_SHORT
26
+ end
27
+
28
+
29
+ # ---------------------------------------------------------------------
30
+ # Messages
31
+ # ---------------------------------------------------------------------
32
+
33
+ #
34
+ # Get a list of message names that this object receives.
35
+ #
36
+ def self.messages
37
+ return super # + [ "run" ]
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,73 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # Show colorized output.
5
+ #
6
+ require 'colorized_string'
7
+
8
+ module Gloo
9
+ module Objs
10
+ class Colorize < Gloo::Core::Obj
11
+
12
+ KEYWORD = 'colorize'
13
+ KEYWORD_SHORT = 'color'
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
+ # ---------------------------------------------------------------------
31
+ # Children
32
+ # ---------------------------------------------------------------------
33
+
34
+ # Does this object have children to add when an object
35
+ # is created in interactive mode?
36
+ # This does not apply during obj load, etc.
37
+ def add_children_on_create?
38
+ return true
39
+ end
40
+
41
+ # Add children to this object.
42
+ # This is used by containers to add children needed
43
+ # for default configurations.
44
+ def add_default_children
45
+ fac = $engine.factory
46
+ fac.create "white", "string", "", self
47
+ end
48
+
49
+
50
+ # ---------------------------------------------------------------------
51
+ # Messages
52
+ # ---------------------------------------------------------------------
53
+
54
+ #
55
+ # Get a list of message names that this object receives.
56
+ #
57
+ def self.messages
58
+ return super + [ "run" ]
59
+ end
60
+
61
+ # Run the system command.
62
+ def msg_run
63
+ msg = ""
64
+ children.each do |o|
65
+ msg += ColorizedString[ o.value_display ].colorize( o.name.to_sym )
66
+ end
67
+ $log.show msg
68
+ $engine.heap.it.set_to msg.to_s
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,92 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # Show a CLI confirmation prompt.
5
+ #
6
+
7
+ module Gloo
8
+ module Objs
9
+ class Confirm < Gloo::Core::Obj
10
+
11
+ KEYWORD = 'confirm'
12
+ KEYWORD_SHORT = 'confirm'
13
+ PROMPT = 'prompt'
14
+ RESULT = 'result'
15
+
16
+ #
17
+ # The name of the object type.
18
+ #
19
+ def self.typename
20
+ return KEYWORD
21
+ end
22
+
23
+ #
24
+ # The short name of the object type.
25
+ #
26
+ def self.short_typename
27
+ return KEYWORD_SHORT
28
+ end
29
+
30
+ #
31
+ # Get the URI from the child object.
32
+ # Returns nil if there is none.
33
+ #
34
+ def get_prompt
35
+ o = find_child PROMPT
36
+ return nil unless o
37
+ return o.value
38
+ end
39
+
40
+ #
41
+ # Set the result of the system call.
42
+ #
43
+ def set_result data
44
+ r = find_child RESULT
45
+ return nil unless r
46
+ r.set_value data
47
+ end
48
+
49
+
50
+ # ---------------------------------------------------------------------
51
+ # Children
52
+ # ---------------------------------------------------------------------
53
+
54
+ # Does this object have children to add when an object
55
+ # is created in interactive mode?
56
+ # This does not apply during obj load, etc.
57
+ def add_children_on_create?
58
+ return true
59
+ end
60
+
61
+ # Add children to this object.
62
+ # This is used by containers to add children needed
63
+ # for default configurations.
64
+ def add_default_children
65
+ fac = $engine.factory
66
+ fac.create "prompt", "string", "> ", self
67
+ fac.create "result", "boolean", nil, self
68
+ end
69
+
70
+
71
+ # ---------------------------------------------------------------------
72
+ # Messages
73
+ # ---------------------------------------------------------------------
74
+
75
+ #
76
+ # Get a list of message names that this object receives.
77
+ #
78
+ def self.messages
79
+ return super + [ "run" ]
80
+ end
81
+
82
+ # Run the system command.
83
+ def msg_run
84
+ prompt = get_prompt
85
+ return unless prompt
86
+ result = $prompt.yes?( prompt )
87
+ set_result result
88
+ end
89
+
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,92 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # Show a CLI prompt and collect user input.
5
+ #
6
+
7
+ module Gloo
8
+ module Objs
9
+ class Prompt < Gloo::Core::Obj
10
+
11
+ KEYWORD = 'prompt'
12
+ KEYWORD_SHORT = 'ask'
13
+ PROMPT = 'prompt'
14
+ RESULT = 'result'
15
+
16
+ #
17
+ # The name of the object type.
18
+ #
19
+ def self.typename
20
+ return KEYWORD
21
+ end
22
+
23
+ #
24
+ # The short name of the object type.
25
+ #
26
+ def self.short_typename
27
+ return KEYWORD_SHORT
28
+ end
29
+
30
+ #
31
+ # Get the URI from the child object.
32
+ # Returns nil if there is none.
33
+ #
34
+ def get_prompt
35
+ o = find_child PROMPT
36
+ return nil unless o
37
+ return o.value
38
+ end
39
+
40
+ #
41
+ # Set the result of the system call.
42
+ #
43
+ def set_result data
44
+ r = find_child RESULT
45
+ return nil unless r
46
+ r.set_value data
47
+ end
48
+
49
+
50
+ # ---------------------------------------------------------------------
51
+ # Children
52
+ # ---------------------------------------------------------------------
53
+
54
+ # Does this object have children to add when an object
55
+ # is created in interactive mode?
56
+ # This does not apply during obj load, etc.
57
+ def add_children_on_create?
58
+ return true
59
+ end
60
+
61
+ # Add children to this object.
62
+ # This is used by containers to add children needed
63
+ # for default configurations.
64
+ def add_default_children
65
+ fac = $engine.factory
66
+ fac.create "prompt", "string", "> ", self
67
+ fac.create "result", "string", nil, self
68
+ end
69
+
70
+
71
+ # ---------------------------------------------------------------------
72
+ # Messages
73
+ # ---------------------------------------------------------------------
74
+
75
+ #
76
+ # Get a list of message names that this object receives.
77
+ #
78
+ def self.messages
79
+ return super + [ "run" ]
80
+ end
81
+
82
+ # Run the system command.
83
+ def msg_run
84
+ prompt = get_prompt
85
+ return unless prompt
86
+ result = $prompt.ask( prompt )
87
+ set_result result
88
+ end
89
+
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,212 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
+ #
4
+ # A looping construct...do something for each whatever in something.
5
+ # This object has several possible uses:
6
+ # - each word in a string
7
+ # - each line in a string
8
+ # - each file in a directory
9
+ # - each git repo in a directory
10
+ #
11
+
12
+ module Gloo
13
+ module Objs
14
+ class Each < Gloo::Core::Obj
15
+
16
+ KEYWORD = 'each'
17
+ KEYWORD_SHORT = 'each'
18
+ WORD = 'word'
19
+ LINE = 'line'
20
+ FILE = 'file'
21
+ REPO = 'repo'
22
+ IN = 'IN'
23
+ DO = 'do'
24
+
25
+ #
26
+ # The name of the object type.
27
+ #
28
+ def self.typename
29
+ return KEYWORD
30
+ end
31
+
32
+ #
33
+ # The short name of the object type.
34
+ #
35
+ def self.short_typename
36
+ return KEYWORD_SHORT
37
+ end
38
+
39
+ #
40
+ # Get the URI from the child object.
41
+ # Returns nil if there is none.
42
+ #
43
+ def get_in
44
+ o = find_child IN
45
+ return nil unless o
46
+ return o.value
47
+ end
48
+
49
+ # Run the do script once.
50
+ def run_do
51
+ o = find_child DO
52
+ if o.can_receive_message? "run"
53
+ o.send_message "run"
54
+ end
55
+ end
56
+
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 "word", "string", "", self
76
+ fac.create "in", "string", "", self
77
+ fac.create "do", "script", "", self
78
+ end
79
+
80
+
81
+ # ---------------------------------------------------------------------
82
+ # Messages
83
+ # ---------------------------------------------------------------------
84
+
85
+ #
86
+ # Get a list of message names that this object receives.
87
+ #
88
+ def self.messages
89
+ return super + [ "run" ]
90
+ end
91
+
92
+ # Run the system command.
93
+ def msg_run
94
+ if each_word?
95
+ run_each_word
96
+ elsif each_line?
97
+ run_each_line
98
+ elsif each_repo?
99
+ run_each_repo
100
+ end
101
+ end
102
+
103
+
104
+ # ---------------------------------------------------------------------
105
+ # Word
106
+ # ---------------------------------------------------------------------
107
+
108
+ # Is it set up to run for each word?
109
+ # If there is a child object by the name "word"
110
+ # then we will loop for each word in the string.
111
+ def each_word?
112
+ o = find_child WORD
113
+ return true if o
114
+ return false
115
+ end
116
+
117
+ # Run for each word.
118
+ def run_each_word
119
+ str = get_in
120
+ return unless str
121
+ str.split( " " ).each do |word|
122
+ set_word word
123
+ run_do
124
+ end
125
+ end
126
+
127
+ # Set the value of the word.
128
+ def set_word word
129
+ o = find_child WORD
130
+ return unless o
131
+ o.set_value word
132
+ end
133
+
134
+
135
+ # ---------------------------------------------------------------------
136
+ # Line
137
+ # ---------------------------------------------------------------------
138
+
139
+ # Is it set up to run for each line?
140
+ # If there is a child object by the name "line"
141
+ # then we will loop for each line in the string.
142
+ def each_line?
143
+ o = find_child LINE
144
+ return true if o
145
+ return false
146
+ end
147
+
148
+ # Run for each line.
149
+ def run_each_line
150
+ str = get_in
151
+ return unless str
152
+ str.split( "\n" ).each do |line|
153
+ set_line line
154
+ run_do
155
+ end
156
+ end
157
+
158
+ # Set the value of the word.
159
+ def set_line line
160
+ o = find_child LINE
161
+ return unless o
162
+ o.set_value line
163
+ end
164
+
165
+
166
+
167
+ # ---------------------------------------------------------------------
168
+ # Git Repo
169
+ # ---------------------------------------------------------------------
170
+
171
+ # Is it set up to run for each git repo?
172
+ # If there is a child object by the name "repo"
173
+ # then we will loop for each repo in the directory.
174
+ def each_repo?
175
+ o = find_child REPO
176
+ return true if o
177
+ return false
178
+ end
179
+
180
+ def find_all_git_projects( path )
181
+ path.children.collect do |f|
182
+ if f.directory? && ( File.basename( f ) == '.git' )
183
+ File.dirname( f )
184
+ elsif f.directory?
185
+ find_all_git_projects( f )
186
+ end
187
+ end.flatten.compact
188
+ end
189
+
190
+ # Run for each line.
191
+ def run_each_repo
192
+ path = get_in
193
+ return unless path
194
+ path = Pathname.new( path )
195
+ repos = find_all_git_projects( path )
196
+ repos.each do |o|
197
+ set_repo o
198
+ run_do
199
+ end
200
+ end
201
+
202
+ # Set the value of the repo.
203
+ # This is a path to the repo.
204
+ def set_repo path
205
+ o = find_child REPO
206
+ return unless o
207
+ o.set_value path
208
+ end
209
+
210
+ end
211
+ end
212
+ end