gloo 0.3.0 → 0.5.3
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/.DS_Store +0 -0
- data/.rubocop.yml +73 -0
- data/Gemfile +2 -2
- data/Gemfile.lock +86 -83
- data/Rakefile +7 -6
- data/bin/console +4 -4
- data/gloo.gemspec +22 -18
- data/lib/gloo.rb +6 -6
- data/lib/gloo/app/args.rb +30 -31
- data/lib/gloo/app/engine.rb +80 -30
- 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 +51 -41
- data/lib/gloo/convert/string_to_datetime.rb +21 -0
- data/lib/gloo/convert/string_to_decimal.rb +20 -0
- data/lib/gloo/convert/string_to_integer.rb +20 -0
- 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 -23
- data/lib/gloo/core/factory.rb +149 -39
- data/lib/gloo/core/gloo_system.rb +121 -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 +138 -79
- data/lib/gloo/core/obj_finder.rb +9 -14
- data/lib/gloo/core/op.rb +8 -8
- data/lib/gloo/core/parser.rb +27 -26
- data/lib/gloo/core/pn.rb +68 -52
- 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/exec/dispatch.rb +30 -0
- data/lib/gloo/exec/runner.rb +43 -0
- data/lib/gloo/expr/expression.rb +36 -43
- data/lib/gloo/expr/l_boolean.rb +7 -6
- data/lib/gloo/expr/l_decimal.rb +34 -0
- 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 +5 -5
- data/lib/gloo/expr/op_minus.rb +5 -5
- data/lib/gloo/expr/op_mult.rb +5 -5
- data/lib/gloo/expr/op_plus.rb +7 -7
- data/lib/gloo/objs/basic/alias.rb +111 -0
- data/lib/gloo/objs/basic/boolean.rb +63 -38
- data/lib/gloo/objs/basic/container.rb +71 -12
- data/lib/gloo/objs/basic/decimal.rb +96 -0
- data/lib/gloo/objs/basic/integer.rb +45 -16
- data/lib/gloo/objs/basic/script.rb +62 -38
- data/lib/gloo/objs/basic/string.rb +47 -15
- data/lib/gloo/objs/basic/text.rb +69 -21
- data/lib/gloo/objs/basic/untyped.rb +35 -10
- data/lib/gloo/objs/cli/banner.rb +137 -0
- data/lib/gloo/objs/cli/bar.rb +141 -0
- data/lib/gloo/objs/cli/colorize.rb +54 -24
- data/lib/gloo/objs/cli/confirm.rb +63 -29
- data/lib/gloo/objs/cli/menu.rb +236 -0
- data/lib/gloo/objs/cli/menu_item.rb +128 -0
- data/lib/gloo/objs/cli/pastel.rb +120 -0
- data/lib/gloo/objs/cli/prompt.rb +73 -31
- data/lib/gloo/objs/cli/select.rb +153 -0
- data/lib/gloo/objs/ctrl/each.rb +128 -61
- data/lib/gloo/objs/ctrl/repeat.rb +129 -0
- data/lib/gloo/objs/data/markdown.rb +109 -0
- data/lib/gloo/objs/data/table.rb +168 -0
- data/lib/gloo/objs/dev/git.rb +98 -64
- data/lib/gloo/objs/dt/date.rb +72 -0
- data/lib/gloo/objs/dt/datetime.rb +84 -0
- data/lib/gloo/objs/dt/time.rb +72 -0
- data/lib/gloo/objs/ror/erb.rb +82 -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 +129 -48
- data/lib/gloo/objs/system/system.rb +84 -38
- data/lib/gloo/objs/web/http_get.rb +103 -46
- data/lib/gloo/objs/web/http_post.rb +70 -44
- data/lib/gloo/objs/web/json.rb +155 -0
- data/lib/gloo/objs/web/slack.rb +89 -58
- data/lib/gloo/objs/web/teams.rb +88 -53
- data/lib/gloo/objs/web/uri.rb +160 -0
- data/lib/gloo/persist/file_loader.rb +95 -85
- 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 +79 -0
- data/lib/gloo/persist/persist_man.rb +63 -39
- 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/cls.rb +67 -0
- data/lib/gloo/verbs/context.rb +61 -21
- data/lib/gloo/verbs/create.rb +52 -21
- data/lib/gloo/verbs/help.rb +186 -27
- data/lib/gloo/verbs/if.rb +55 -21
- data/lib/gloo/verbs/list.rb +55 -24
- data/lib/gloo/verbs/load.rb +47 -12
- data/lib/gloo/verbs/move.rb +128 -0
- data/lib/gloo/verbs/put.rb +90 -34
- data/lib/gloo/verbs/quit.rb +43 -12
- data/lib/gloo/verbs/run.rb +63 -18
- data/lib/gloo/verbs/save.rb +45 -10
- data/lib/gloo/verbs/show.rb +56 -22
- data/lib/gloo/verbs/tell.rb +45 -13
- data/lib/gloo/verbs/unless.rb +56 -21
- data/lib/gloo/verbs/version.rb +42 -12
- data/lib/gloo/verbs/wait.rb +73 -0
- data/lib/run.rb +5 -5
- metadata +90 -12
data/lib/gloo/core/obj_finder.rb
CHANGED
|
@@ -7,29 +7,24 @@
|
|
|
7
7
|
module Gloo
|
|
8
8
|
module Core
|
|
9
9
|
class ObjFinder
|
|
10
|
-
|
|
11
|
-
#
|
|
10
|
+
|
|
11
|
+
#
|
|
12
12
|
# Find all objects in the given container that have
|
|
13
13
|
# the given name.
|
|
14
14
|
# If the container isn't provided, root will be used.
|
|
15
|
-
#
|
|
16
|
-
def self.by_name name, container=nil
|
|
17
|
-
if container.nil?
|
|
18
|
-
container = $engine.heap.root
|
|
19
|
-
end
|
|
15
|
+
#
|
|
16
|
+
def self.by_name( name, container = nil )
|
|
17
|
+
container = $engine.heap.root if container.nil?
|
|
20
18
|
arr = []
|
|
21
|
-
|
|
19
|
+
|
|
22
20
|
container.children.each do |o|
|
|
23
21
|
arr << o if o.name == name
|
|
24
|
-
if o.child_count
|
|
25
|
-
arr += by_name( name, o )
|
|
26
|
-
end
|
|
22
|
+
arr += by_name( name, o ) if o.child_count.positive?
|
|
27
23
|
end
|
|
28
|
-
|
|
24
|
+
|
|
29
25
|
return arr
|
|
30
26
|
end
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
|
|
33
28
|
end
|
|
34
29
|
end
|
|
35
30
|
end
|
data/lib/gloo/core/op.rb
CHANGED
|
@@ -7,27 +7,27 @@
|
|
|
7
7
|
module Gloo
|
|
8
8
|
module Core
|
|
9
9
|
class Op
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
# Is the token an operator?
|
|
12
|
-
def self.
|
|
13
|
-
return [
|
|
12
|
+
def self.op?( token )
|
|
13
|
+
return [ '+', '-', '*', '/' ].include?( token.strip )
|
|
14
14
|
end
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
# Create the operator for the given token.
|
|
17
|
-
def self.create_op token
|
|
17
|
+
def self.create_op( token )
|
|
18
18
|
return Gloo::Expr::OpMinus.new if token == '-'
|
|
19
19
|
return Gloo::Expr::OpMult.new if token == '*'
|
|
20
20
|
return Gloo::Expr::OpDiv.new if token == '/'
|
|
21
21
|
return Gloo::Expr::OpPlus.new if token == '+'
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
return default_op
|
|
24
24
|
end
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
# Get the default operator (+).
|
|
27
27
|
def self.default_op
|
|
28
28
|
return Gloo::Expr::OpPlus.new
|
|
29
29
|
end
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|
data/lib/gloo/core/parser.rb
CHANGED
|
@@ -8,45 +8,46 @@
|
|
|
8
8
|
module Gloo
|
|
9
9
|
module Core
|
|
10
10
|
class Parser
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
# Set up the parser.
|
|
13
|
-
def initialize
|
|
14
|
-
$log.debug
|
|
13
|
+
def initialize
|
|
14
|
+
$log.debug 'parser intialized...'
|
|
15
15
|
end
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
|
|
18
17
|
# Parse a command from the immediate execution context.
|
|
19
|
-
def parse_immediate cmd
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
def parse_immediate( cmd )
|
|
19
|
+
cmd, params = split_params cmd
|
|
20
|
+
params = Gloo::Core::Tokens.new( params ) if params
|
|
22
21
|
tokens = Gloo::Core::Tokens.new( cmd )
|
|
23
22
|
dic = Gloo::Core::Dictionary.instance
|
|
24
23
|
verb = dic.find_verb( tokens.verb )
|
|
25
24
|
return verb.new( tokens, params ) if verb
|
|
26
|
-
|
|
25
|
+
|
|
27
26
|
$log.error "Verb '#{tokens.verb}' was not found."
|
|
28
27
|
return nil
|
|
29
28
|
end
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
29
|
+
|
|
30
|
+
# If additional params were provided, split them out
|
|
31
|
+
# from the token list.
|
|
32
|
+
def split_params( cmd )
|
|
33
|
+
params = nil
|
|
34
|
+
i = cmd.rindex( '(' )
|
|
35
|
+
if i && cmd.strip.end_with?( ')' )
|
|
36
|
+
pstr = cmd[ i + 1..-1 ]
|
|
37
|
+
params = pstr.strip[ 0..-2 ] if pstr
|
|
38
|
+
cmd = cmd[ 0, i - 1 ]
|
|
39
|
+
end
|
|
40
|
+
return cmd, params
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
#
|
|
44
44
|
# Parse a command and then run it if it parsed correctly.
|
|
45
|
-
|
|
45
|
+
#
|
|
46
|
+
def run( cmd )
|
|
46
47
|
v = parse_immediate( cmd )
|
|
47
|
-
|
|
48
|
+
Gloo::Exec::Runner.go( v ) if v
|
|
48
49
|
end
|
|
49
|
-
|
|
50
|
+
|
|
50
51
|
end
|
|
51
52
|
end
|
|
52
53
|
end
|
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
|
|
56
|
-
@src = value.
|
|
57
|
-
|
|
58
|
-
@elements = []
|
|
59
|
-
else
|
|
60
|
-
@elements = @src.split( '.' )
|
|
61
|
-
end
|
|
71
|
+
def set_to( value )
|
|
72
|
+
@src = value.nil? ? nil : value.strip
|
|
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,38 +108,41 @@ 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
|
|
129
|
-
|
|
143
|
+
|
|
144
|
+
obj = parent.find_child( self.name )
|
|
145
|
+
return Gloo::Objs::Alias.resolve_alias( obj, self.src )
|
|
130
146
|
end
|
|
131
147
|
|
|
132
148
|
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
|