gloo 0.3.0 → 0.4.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +73 -0
- data/Gemfile +2 -2
- data/Gemfile.lock +3 -3
- data/Rakefile +6 -6
- data/bin/console +4 -4
- data/gloo.gemspec +19 -18
- data/lib/gloo.rb +6 -6
- data/lib/gloo/app/args.rb +30 -31
- data/lib/gloo/app/engine.rb +33 -28
- data/lib/gloo/app/help.rb +17 -11
- data/lib/gloo/app/info.rb +3 -3
- data/lib/gloo/app/log.rb +17 -17
- data/lib/gloo/app/mode.rb +4 -4
- data/lib/gloo/app/settings.rb +43 -40
- data/lib/gloo/core/baseo.rb +7 -7
- data/lib/gloo/core/dictionary.rb +30 -27
- data/lib/gloo/core/error.rb +50 -0
- data/lib/gloo/core/event_manager.rb +17 -19
- data/lib/gloo/core/factory.rb +92 -39
- data/lib/gloo/core/gloo_system.rb +49 -54
- data/lib/gloo/core/heap.rb +15 -13
- data/lib/gloo/core/it.rb +5 -5
- data/lib/gloo/core/literal.rb +7 -7
- data/lib/gloo/core/obj.rb +89 -79
- data/lib/gloo/core/obj_finder.rb +9 -14
- data/lib/gloo/core/op.rb +8 -8
- data/lib/gloo/core/parser.rb +25 -26
- data/lib/gloo/core/pn.rb +65 -50
- data/lib/gloo/core/runner.rb +26 -0
- data/lib/gloo/core/script.rb +7 -7
- data/lib/gloo/core/tokens.rb +39 -41
- data/lib/gloo/core/verb.rb +30 -19
- data/lib/gloo/expr/expression.rb +35 -43
- data/lib/gloo/expr/l_boolean.rb +7 -6
- data/lib/gloo/expr/l_integer.rb +5 -4
- data/lib/gloo/expr/l_string.rb +13 -15
- data/lib/gloo/expr/op_div.rb +3 -5
- data/lib/gloo/expr/op_minus.rb +3 -5
- data/lib/gloo/expr/op_mult.rb +3 -5
- data/lib/gloo/expr/op_plus.rb +5 -7
- data/lib/gloo/objs/basic/boolean.rb +63 -38
- data/lib/gloo/objs/basic/container.rb +40 -12
- data/lib/gloo/objs/basic/integer.rb +40 -16
- data/lib/gloo/objs/basic/script.rb +62 -38
- data/lib/gloo/objs/basic/string.rb +39 -15
- data/lib/gloo/objs/basic/text.rb +43 -20
- data/lib/gloo/objs/basic/untyped.rb +35 -10
- data/lib/gloo/objs/cli/colorize.rb +53 -23
- data/lib/gloo/objs/cli/confirm.rb +63 -29
- data/lib/gloo/objs/cli/prompt.rb +63 -29
- data/lib/gloo/objs/ctrl/each.rb +98 -60
- data/lib/gloo/objs/dev/git.rb +98 -64
- data/lib/gloo/objs/ror/erb.rb +81 -41
- data/lib/gloo/objs/ror/eval.rb +73 -31
- data/lib/gloo/objs/snd/play.rb +71 -0
- data/lib/gloo/objs/snd/say.rb +120 -0
- data/lib/gloo/objs/system/file_handle.rb +80 -48
- data/lib/gloo/objs/system/system.rb +84 -38
- data/lib/gloo/objs/web/http_get.rb +83 -46
- data/lib/gloo/objs/web/http_post.rb +69 -43
- data/lib/gloo/objs/web/slack.rb +89 -58
- data/lib/gloo/objs/web/teams.rb +88 -53
- data/lib/gloo/persist/file_loader.rb +81 -82
- data/lib/gloo/persist/file_saver.rb +12 -12
- data/lib/gloo/persist/file_storage.rb +15 -15
- data/lib/gloo/persist/line_splitter.rb +74 -0
- data/lib/gloo/persist/persist_man.rb +29 -29
- data/lib/gloo/utils/words.rb +2 -2
- data/lib/gloo/verbs/alert.rb +67 -16
- data/lib/gloo/verbs/beep.rb +70 -0
- data/lib/gloo/verbs/context.rb +61 -21
- data/lib/gloo/verbs/create.rb +52 -21
- data/lib/gloo/verbs/help.rb +177 -27
- data/lib/gloo/verbs/if.rb +54 -21
- data/lib/gloo/verbs/list.rb +55 -24
- data/lib/gloo/verbs/load.rb +46 -12
- data/lib/gloo/verbs/put.rb +90 -34
- data/lib/gloo/verbs/quit.rb +43 -12
- data/lib/gloo/verbs/run.rb +42 -11
- data/lib/gloo/verbs/save.rb +45 -10
- data/lib/gloo/verbs/show.rb +56 -22
- data/lib/gloo/verbs/tell.rb +44 -12
- data/lib/gloo/verbs/unless.rb +55 -21
- data/lib/gloo/verbs/version.rb +42 -12
- data/lib/run.rb +5 -5
- metadata +19 -12
data/lib/gloo/core/pn.rb
CHANGED
@@ -9,40 +9,56 @@ module Gloo
|
|
9
9
|
module Core
|
10
10
|
class Pn < Baseo
|
11
11
|
|
12
|
+
ROOT = 'root'.freeze
|
13
|
+
IT = 'it'.freeze
|
14
|
+
ERROR = 'error'.freeze
|
15
|
+
|
12
16
|
attr_reader :src, :elements
|
13
|
-
|
17
|
+
|
14
18
|
# Set up the object given a source string,
|
15
19
|
# ie: the full path and name.
|
16
20
|
def initialize( src )
|
17
21
|
set_to src
|
18
22
|
end
|
19
|
-
|
23
|
+
|
20
24
|
# Reference to the root object path.
|
21
25
|
def self.root
|
22
|
-
return Pn.new(
|
26
|
+
return Pn.new( ROOT )
|
23
27
|
end
|
24
28
|
|
25
29
|
# Reference to it.
|
26
30
|
def self.it
|
27
|
-
return Pn.new(
|
31
|
+
return Pn.new( IT )
|
28
32
|
end
|
29
|
-
|
30
|
-
#
|
31
|
-
def
|
32
|
-
return
|
33
|
+
|
34
|
+
# Reference to the error message.
|
35
|
+
def self.error
|
36
|
+
return Pn.new( ERROR )
|
33
37
|
end
|
34
|
-
|
38
|
+
|
35
39
|
# Does the pathname reference refer to the root?
|
36
|
-
def
|
37
|
-
return @src.downcase ==
|
40
|
+
def root?
|
41
|
+
return @src.downcase == ROOT
|
42
|
+
end
|
43
|
+
|
44
|
+
# Does the pathname reference refer to it?
|
45
|
+
def it?
|
46
|
+
return @src.downcase == IT
|
38
47
|
end
|
39
|
-
|
48
|
+
|
49
|
+
# Does the pathname reference refer to error?
|
50
|
+
def error?
|
51
|
+
return @src.downcase == ERROR
|
52
|
+
end
|
53
|
+
|
40
54
|
# Does the pathname reference refer to the gloo system object?
|
41
|
-
def
|
42
|
-
return false unless @elements
|
55
|
+
def gloo_sys?
|
56
|
+
return false unless @elements&.count&.positive?
|
57
|
+
|
43
58
|
o = @elements.first.downcase
|
44
59
|
return true if o == Gloo::Core::GlooSystem.typename
|
45
60
|
return true if o == Gloo::Core::GlooSystem.short_typename
|
61
|
+
|
46
62
|
return false
|
47
63
|
end
|
48
64
|
|
@@ -52,42 +68,39 @@ module Gloo
|
|
52
68
|
end
|
53
69
|
|
54
70
|
# Set the object pathname to the given value.
|
55
|
-
def set_to value
|
71
|
+
def set_to( value )
|
56
72
|
@src = value.strip unless value.nil?
|
57
|
-
|
58
|
-
@elements = []
|
59
|
-
else
|
60
|
-
@elements = @src.split( '.' )
|
61
|
-
end
|
73
|
+
@elements = @src.nil? ? [] : @src.split( '.' )
|
62
74
|
end
|
63
|
-
|
75
|
+
|
64
76
|
# Convert the raw string to a list of segments.
|
65
77
|
def segments
|
66
78
|
return @elements
|
67
79
|
end
|
68
|
-
|
80
|
+
|
69
81
|
# Get the name element.
|
70
82
|
def name
|
71
|
-
return
|
83
|
+
return '' unless self.named?
|
84
|
+
|
72
85
|
return @elements.last
|
73
86
|
end
|
74
87
|
|
75
88
|
# Does the value include path elements?
|
76
|
-
def
|
77
|
-
return @elements.count
|
89
|
+
def named?
|
90
|
+
return @elements.count.positive?
|
78
91
|
end
|
79
92
|
|
80
93
|
# Does the value include a name?
|
81
|
-
def
|
94
|
+
def includes_path?
|
82
95
|
return @elements.count > 1
|
83
96
|
end
|
84
|
-
|
97
|
+
|
85
98
|
# Get the parent that contains the object referenced.
|
86
99
|
def get_parent
|
87
100
|
o = $engine.heap.root
|
88
|
-
|
89
|
-
if self.
|
90
|
-
@elements[0..-2].each do |e|
|
101
|
+
|
102
|
+
if self.includes_path?
|
103
|
+
@elements[ 0..-2 ].each do |e|
|
91
104
|
o = o.find_child( e )
|
92
105
|
if o.nil?
|
93
106
|
$log.error "Object '#{e}' was not found."
|
@@ -95,37 +108,39 @@ module Gloo
|
|
95
108
|
end
|
96
109
|
end
|
97
110
|
end
|
98
|
-
|
111
|
+
|
99
112
|
return o
|
100
113
|
end
|
101
|
-
|
114
|
+
|
102
115
|
# Does the object at the path exist?
|
103
116
|
def exists?
|
104
|
-
return true if self.
|
105
|
-
return true if self.
|
106
|
-
|
117
|
+
return true if self.root?
|
118
|
+
return true if self.it?
|
119
|
+
return true if self.error?
|
120
|
+
|
107
121
|
parent = self.get_parent
|
108
122
|
return false unless parent
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
123
|
+
|
124
|
+
return parent.contains_child? name
|
125
|
+
end
|
126
|
+
|
127
|
+
# Is the reference to a color?
|
128
|
+
def named_color?
|
129
|
+
colors = %w[red blue green white black yellow]
|
130
|
+
return true if colors.include?( @src.downcase )
|
131
|
+
end
|
132
|
+
|
118
133
|
# Resolve the pathname reference.
|
119
134
|
# Find the object referenced or return nil if it is not found.
|
120
135
|
def resolve
|
121
|
-
return $engine.heap.root if self.
|
122
|
-
return $engine.heap.it if self.
|
123
|
-
if self.
|
124
|
-
|
125
|
-
|
126
|
-
|
136
|
+
return $engine.heap.root if self.root?
|
137
|
+
return $engine.heap.it if self.it?
|
138
|
+
return $engine.heap.error if self.error?
|
139
|
+
return Gloo::Core::GlooSystem.new( self ) if self.gloo_sys?
|
140
|
+
|
127
141
|
parent = self.get_parent
|
128
142
|
return nil unless parent
|
143
|
+
|
129
144
|
return parent.find_child( self.name )
|
130
145
|
end
|
131
146
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# The Runner is a static helper function.
|
5
|
+
# It is used to send the run command to verbs.
|
6
|
+
#
|
7
|
+
|
8
|
+
module Gloo
|
9
|
+
module Core
|
10
|
+
class Runner
|
11
|
+
|
12
|
+
#
|
13
|
+
# Dispatch run command to a verb.
|
14
|
+
# We abstract this out in case there are things
|
15
|
+
# that need to be done before or after a verb
|
16
|
+
# is done running.
|
17
|
+
#
|
18
|
+
def self.go( verb )
|
19
|
+
$engine.heap.error.start_tracking
|
20
|
+
verb&.run
|
21
|
+
$engine.heap.error.clear_if_no_errors
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/gloo/core/script.rb
CHANGED
@@ -7,13 +7,12 @@
|
|
7
7
|
module Gloo
|
8
8
|
module Core
|
9
9
|
class Script
|
10
|
-
|
10
|
+
|
11
11
|
# Set up the script.
|
12
|
-
def initialize obj
|
12
|
+
def initialize( obj )
|
13
13
|
@obj = obj
|
14
14
|
end
|
15
|
-
|
16
|
-
|
15
|
+
|
17
16
|
# Run the script.
|
18
17
|
def run
|
19
18
|
if @obj.value.is_a? String
|
@@ -24,14 +23,15 @@ module Gloo
|
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
27
|
-
|
26
|
+
|
28
27
|
# Run a single line of the script.
|
29
|
-
def run_line line
|
28
|
+
def run_line( line )
|
30
29
|
i = $engine.parser.parse_immediate line
|
31
30
|
return unless i
|
31
|
+
|
32
32
|
i.run
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
data/lib/gloo/core/tokens.rb
CHANGED
@@ -8,44 +8,44 @@
|
|
8
8
|
module Gloo
|
9
9
|
module Core
|
10
10
|
class Tokens
|
11
|
-
|
11
|
+
|
12
12
|
attr_reader :cmd, :tokens
|
13
|
-
|
13
|
+
|
14
14
|
# Set up the tokens.
|
15
15
|
def initialize( cmd_string )
|
16
16
|
@cmd = cmd_string
|
17
17
|
@tokens = []
|
18
18
|
tokenize @cmd
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
# Create a list of token from the given string.
|
22
|
-
def tokenize str
|
22
|
+
def tokenize( str )
|
23
23
|
if str.index( '"' )
|
24
24
|
i = str.index( '"' )
|
25
|
-
j = str.index( '"', i+1 )
|
26
|
-
j
|
27
|
-
|
28
|
-
tokenize( str[ 0..i-1 ] ) if i > 1
|
25
|
+
j = str.index( '"', i + 1 )
|
26
|
+
j ||= str.length
|
27
|
+
|
28
|
+
tokenize( str[ 0..i - 1 ] ) if i > 1
|
29
29
|
@tokens << str[ i..j ]
|
30
|
-
tokenize( str[ j+1..-1 ] ) if j+1 < str.length
|
30
|
+
tokenize( str[ j + 1..-1 ] ) if j + 1 < str.length
|
31
31
|
elsif str.index( "'" )
|
32
32
|
i = str.index( "'" )
|
33
|
-
j = str.index( "'", i+1 )
|
34
|
-
j
|
33
|
+
j = str.index( "'", i + 1 )
|
34
|
+
j ||= str.length
|
35
35
|
|
36
|
-
tokenize( str[ 0..i-1 ] ) if i > 1
|
36
|
+
tokenize( str[ 0..i - 1 ] ) if i > 1
|
37
37
|
@tokens << str[ i..j ]
|
38
|
-
tokenize( str[ j+1..-1 ] ) if j+1 < str.length
|
38
|
+
tokenize( str[ j + 1..-1 ] ) if j + 1 < str.length
|
39
39
|
else
|
40
|
-
str.strip.split(
|
40
|
+
str.strip.split( ' ' ).each { |t| @tokens << t }
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
# Get the number of tokens
|
45
45
|
def token_count
|
46
46
|
return @tokens.size
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
# Get the verb (the first word)
|
50
50
|
def verb
|
51
51
|
return first
|
@@ -65,59 +65,57 @@ module Gloo
|
|
65
65
|
def last
|
66
66
|
return @tokens.last if @tokens
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
# Get the second token.
|
70
70
|
def second
|
71
|
-
return @tokens[1] if @tokens
|
71
|
+
return @tokens[ 1 ] if @tokens&.size&.positive?
|
72
72
|
end
|
73
73
|
|
74
|
-
def at index
|
75
|
-
return @tokens[index] if @tokens && @tokens.size >= index
|
74
|
+
def at( index )
|
75
|
+
return @tokens[ index ] if @tokens && @tokens.size >= index
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
# Get the index of the given token.
|
79
|
-
def index_of token
|
79
|
+
def index_of( token )
|
80
80
|
return nil unless @tokens
|
81
|
-
|
81
|
+
|
82
|
+
return @tokens.find_index { |o| o.casecmp( token ).zero? }
|
82
83
|
end
|
83
84
|
|
84
85
|
# Get the list of tokens after the given token
|
85
|
-
def tokens_after token
|
86
|
+
def tokens_after( token )
|
86
87
|
i = index_of token
|
87
|
-
if i && @tokens && @tokens.size > ( i+1 )
|
88
|
-
|
89
|
-
end
|
88
|
+
return @tokens[ i + 1..-1 ] if i && @tokens && @tokens.size > ( i + 1 )
|
89
|
+
|
90
90
|
return nil
|
91
91
|
end
|
92
92
|
|
93
93
|
# Get the expression after the given token
|
94
|
-
def expr_after token
|
95
|
-
str =
|
94
|
+
def expr_after( token )
|
95
|
+
str = ''
|
96
96
|
tokens_after( token ).each do |t|
|
97
|
-
str <<
|
98
|
-
str <<
|
97
|
+
str << ' ' unless str.empty?
|
98
|
+
str << t.to_s
|
99
99
|
end
|
100
100
|
return str
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
# Get the item after a given token.
|
104
|
-
def after_token token
|
104
|
+
def after_token( token )
|
105
105
|
i = index_of token
|
106
|
-
if i && @tokens && @tokens.size > ( i+1 )
|
107
|
-
|
108
|
-
end
|
106
|
+
return @tokens[ i + 1 ] if i && @tokens && @tokens.size > ( i + 1 )
|
107
|
+
|
109
108
|
return nil
|
110
109
|
end
|
111
110
|
|
112
111
|
# Get the item after a given token.
|
113
|
-
def before_token token
|
112
|
+
def before_token( token )
|
114
113
|
i = index_of token
|
115
|
-
if i && @tokens && @tokens.size >=
|
116
|
-
|
117
|
-
end
|
114
|
+
return @tokens[ 0..i - 1 ] if i && @tokens && @tokens.size >= i
|
115
|
+
|
118
116
|
return nil
|
119
117
|
end
|
120
|
-
|
118
|
+
|
121
119
|
end
|
122
120
|
end
|
123
121
|
end
|
data/lib/gloo/core/verb.rb
CHANGED
@@ -10,54 +10,65 @@
|
|
10
10
|
module Gloo
|
11
11
|
module Core
|
12
12
|
class Verb < Baseo
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
|
14
|
+
attr_reader :tokens, :params
|
15
|
+
|
16
16
|
# Set up the verb.
|
17
|
-
def initialize( tokens, params=[] )
|
17
|
+
def initialize( tokens, params = [] )
|
18
18
|
@tokens = tokens
|
19
|
-
|
19
|
+
@params = params
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
# Register verbs when they are loaded.
|
23
23
|
def self.inherited( subclass )
|
24
24
|
Dictionary.instance.register_verb( subclass )
|
25
25
|
end
|
26
|
-
|
27
|
-
#
|
26
|
+
|
27
|
+
#
|
28
28
|
# Run the verb.
|
29
|
-
#
|
29
|
+
#
|
30
30
|
# We'll mark the application as not running and let the
|
31
31
|
# engine stop gracefully next time through the loop.
|
32
|
-
#
|
32
|
+
#
|
33
33
|
def run
|
34
34
|
raise 'this method should be overriden'
|
35
35
|
end
|
36
|
-
|
37
|
-
#
|
36
|
+
|
37
|
+
#
|
38
38
|
# Get the Verb's keyword.
|
39
|
-
#
|
39
|
+
#
|
40
40
|
# The keyword will be in lower case only.
|
41
41
|
# It is used by the parser.
|
42
|
-
#
|
42
|
+
#
|
43
43
|
def self.keyword
|
44
44
|
raise 'this method should be overriden'
|
45
45
|
end
|
46
46
|
|
47
|
-
#
|
47
|
+
#
|
48
48
|
# Get the Verb's keyword shortcut.
|
49
|
-
#
|
49
|
+
#
|
50
50
|
def self.keyword_shortcut
|
51
51
|
raise 'this method should be overriden'
|
52
52
|
end
|
53
|
-
|
54
|
-
#
|
53
|
+
|
54
|
+
#
|
55
55
|
# The object type, suitable for display.
|
56
|
-
#
|
56
|
+
#
|
57
57
|
def type_display
|
58
58
|
return self.class.keyword
|
59
59
|
end
|
60
60
|
|
61
|
+
# ---------------------------------------------------------------------
|
62
|
+
# Help
|
63
|
+
# ---------------------------------------------------------------------
|
64
|
+
|
65
|
+
#
|
66
|
+
# Get help for this verb.
|
67
|
+
#
|
68
|
+
def self.help
|
69
|
+
return 'No help found.'
|
70
|
+
end
|
71
|
+
|
61
72
|
end
|
62
73
|
end
|
63
74
|
end
|