gloo 1.4.2 → 2.0.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/.DS_Store +0 -0
- data/.gitignore +1 -0
- data/gloo.gemspec +0 -2
- data/lib/VERSION +1 -1
- data/lib/dependencies.rb +4 -4
- data/lib/gloo/app/args.rb +112 -0
- data/lib/gloo/app/engine.rb +247 -0
- data/lib/gloo/app/engine_context.rb +25 -0
- data/lib/gloo/app/info.rb +20 -3
- data/lib/gloo/app/log.rb +73 -1
- data/lib/gloo/app/mode.rb +27 -0
- data/lib/gloo/app/platform.rb +8 -1
- data/lib/gloo/app/settings.rb +202 -0
- data/lib/gloo/convert/converter.rb +42 -0
- data/lib/gloo/convert/string_to_date.rb +21 -0
- 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/convert/string_to_time.rb +21 -0
- data/lib/gloo/core/baseo.rb +31 -0
- data/lib/gloo/core/dictionary.rb +245 -0
- data/lib/gloo/core/error.rb +61 -0
- data/lib/gloo/core/event_manager.rb +45 -0
- data/lib/gloo/core/factory.rb +211 -0
- data/lib/gloo/core/gloo_system.rb +267 -0
- data/lib/gloo/core/heap.rb +53 -0
- data/lib/gloo/core/here.rb +36 -0
- data/lib/gloo/core/it.rb +36 -0
- data/lib/gloo/core/literal.rb +30 -0
- data/lib/gloo/core/obj.rb +318 -0
- data/lib/gloo/core/obj_finder.rb +30 -0
- data/lib/gloo/core/op.rb +40 -0
- data/lib/gloo/core/parser.rb +60 -0
- data/lib/gloo/core/pn.rb +212 -0
- data/lib/gloo/core/tokens.rb +165 -0
- data/lib/gloo/core/verb.rb +87 -0
- data/lib/gloo/exec/action.rb +48 -0
- data/lib/gloo/exec/dispatch.rb +40 -0
- data/lib/gloo/exec/exec_env.rb +75 -0
- data/lib/gloo/exec/runner.rb +45 -0
- data/lib/gloo/exec/script.rb +50 -0
- data/lib/gloo/exec/stack.rb +79 -0
- data/lib/gloo/expr/expression.rb +119 -0
- data/lib/gloo/expr/l_boolean.rb +36 -0
- data/lib/gloo/expr/l_decimal.rb +39 -0
- data/lib/gloo/expr/l_integer.rb +37 -0
- data/lib/gloo/expr/l_string.rb +58 -0
- data/lib/gloo/expr/op_div.rb +22 -0
- data/lib/gloo/expr/op_minus.rb +22 -0
- data/lib/gloo/expr/op_mult.rb +22 -0
- data/lib/gloo/expr/op_plus.rb +24 -0
- data/lib/gloo/objs/basic/alias.rb +78 -0
- data/lib/gloo/objs/basic/boolean.rb +120 -0
- data/lib/gloo/objs/basic/container.rb +65 -0
- data/lib/gloo/objs/basic/decimal.rb +76 -0
- data/lib/gloo/objs/basic/integer.rb +73 -0
- data/lib/gloo/objs/basic/script.rb +99 -0
- data/lib/gloo/objs/basic/string.rb +77 -0
- data/lib/gloo/objs/basic/text.rb +79 -0
- data/lib/gloo/objs/basic/untyped.rb +41 -0
- data/lib/gloo/objs/cli/banner.rb +1 -1
- data/lib/gloo/objs/cli/bar.rb +3 -3
- data/lib/gloo/objs/cli/colorize.rb +1 -1
- data/lib/gloo/objs/cli/confirm.rb +1 -1
- data/lib/gloo/objs/cli/menu.rb +6 -6
- data/lib/gloo/objs/cli/menu_item.rb +1 -1
- data/lib/gloo/objs/cli/pastel.rb +1 -1
- data/lib/gloo/objs/cli/prompt.rb +1 -1
- data/lib/gloo/objs/cli/select.rb +2 -2
- data/lib/gloo/objs/ctrl/each.rb +279 -0
- data/lib/gloo/objs/ctrl/repeat.rb +108 -0
- data/lib/gloo/objs/data/markdown.rb +79 -0
- data/lib/gloo/objs/data/mysql.rb +5 -5
- data/lib/gloo/objs/data/query.rb +4 -4
- data/lib/gloo/objs/data/sqlite.rb +1 -1
- data/lib/gloo/objs/data/table.rb +112 -0
- data/lib/gloo/objs/dev/git.rb +2 -2
- data/lib/gloo/objs/dev/stats.rb +4 -4
- data/lib/gloo/objs/dt/date.rb +65 -0
- data/lib/gloo/objs/dt/datetime.rb +120 -0
- data/lib/gloo/objs/dt/dt_tools.rb +100 -0
- data/lib/gloo/objs/dt/time.rb +65 -0
- data/lib/gloo/objs/ror/erb.rb +116 -0
- data/lib/gloo/objs/ror/eval.rb +107 -0
- data/lib/gloo/objs/snd/play.rb +1 -1
- data/lib/gloo/objs/snd/say.rb +1 -1
- data/lib/gloo/objs/system/file_handle.rb +4 -4
- data/lib/gloo/objs/system/ssh_exec.rb +1 -1
- data/lib/gloo/objs/system/system.rb +1 -1
- data/lib/gloo/objs/web/http_get.rb +159 -0
- data/lib/gloo/objs/web/http_post.rb +183 -0
- data/lib/gloo/objs/web/json.rb +135 -0
- data/lib/gloo/objs/web/slack.rb +130 -0
- data/lib/gloo/objs/web/teams.rb +117 -0
- data/lib/gloo/objs/web/uri.rb +148 -0
- data/lib/gloo/persist/disc_mech.rb +87 -0
- data/lib/gloo/persist/file_loader.rb +193 -0
- data/lib/gloo/persist/file_saver.rb +51 -0
- data/lib/gloo/persist/file_storage.rb +46 -0
- data/lib/gloo/persist/line_splitter.rb +81 -0
- data/lib/gloo/persist/persist_man.rb +153 -0
- data/lib/gloo/utils/format.rb +21 -0
- data/lib/gloo/utils/stats.rb +206 -0
- data/lib/gloo/utils/words.rb +19 -0
- data/lib/gloo/verbs/alert.rb +2 -2
- data/lib/gloo/verbs/beep.rb +1 -1
- data/lib/gloo/verbs/cls.rb +1 -1
- data/lib/gloo/verbs/context.rb +62 -0
- data/lib/gloo/verbs/create.rb +68 -0
- data/lib/gloo/verbs/execute.rb +56 -0
- data/lib/gloo/verbs/files.rb +49 -0
- data/lib/gloo/verbs/help.rb +1 -1
- data/lib/gloo/verbs/if.rb +92 -0
- data/lib/gloo/verbs/list.rb +98 -0
- data/lib/gloo/verbs/load.rb +45 -0
- data/lib/gloo/verbs/move.rb +89 -0
- data/lib/gloo/verbs/put.rb +94 -0
- data/lib/gloo/verbs/quit.rb +40 -0
- data/lib/gloo/verbs/reload.rb +43 -0
- data/lib/gloo/verbs/run.rb +75 -0
- data/lib/gloo/verbs/save.rb +39 -0
- data/lib/gloo/verbs/show.rb +63 -0
- data/lib/gloo/verbs/tell.rb +80 -0
- data/lib/gloo/verbs/unless.rb +92 -0
- data/lib/gloo/verbs/unload.rb +46 -0
- data/lib/gloo/verbs/version.rb +3 -3
- data/lib/gloo/verbs/wait.rb +42 -0
- data/lib/gloo.rb +2 -2
- data/lib/run.rb +2 -2
- metadata +97 -22
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# The Event Manager.
|
|
5
|
+
# Run scripts in response to pre-defined events.
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
module Gloo
|
|
9
|
+
module Core
|
|
10
|
+
class EventManager
|
|
11
|
+
|
|
12
|
+
#
|
|
13
|
+
# Set up the event manager.
|
|
14
|
+
#
|
|
15
|
+
def initialize( engine )
|
|
16
|
+
@engine = engine
|
|
17
|
+
@engine.log.debug 'event manager intialized...'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Run on_load scripts in the recently loaded object
|
|
22
|
+
# If no obj is given the script will be run in root.
|
|
23
|
+
#
|
|
24
|
+
def on_load( obj = nil, in_heap = false )
|
|
25
|
+
return unless obj || in_heap
|
|
26
|
+
|
|
27
|
+
@engine.log.debug 'on_load event'
|
|
28
|
+
arr = Gloo::Core::ObjFinder.by_name( @engine, 'on_load', obj )
|
|
29
|
+
arr.each { |o| Gloo::Exec::Dispatch.message( @engine, 'run', o ) }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
# Run on_unload scripts in the object that will be unloaded.
|
|
34
|
+
#
|
|
35
|
+
def on_unload( obj )
|
|
36
|
+
return unless obj
|
|
37
|
+
|
|
38
|
+
@engine.log.debug 'on_unload event'
|
|
39
|
+
arr = Gloo::Core::ObjFinder.by_name( @engine, 'on_unload', obj )
|
|
40
|
+
arr.each { |o| Gloo::Exec::Dispatch.message( @engine, 'run', o ) }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# An object factory.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
module Gloo
|
|
8
|
+
module Core
|
|
9
|
+
class Factory < Baseo
|
|
10
|
+
|
|
11
|
+
# ---------------------------------------------------------------------
|
|
12
|
+
# Initializer
|
|
13
|
+
# ---------------------------------------------------------------------
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# Set up the object factory.
|
|
17
|
+
#
|
|
18
|
+
def initialize( engine )
|
|
19
|
+
@engine = engine
|
|
20
|
+
@engine.log.debug 'object factory intialized...'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# ---------------------------------------------------------------------
|
|
24
|
+
# Factory Helpers
|
|
25
|
+
# ---------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Helper shortcut to create an alias child object.
|
|
29
|
+
#
|
|
30
|
+
def create_alias( name, value, parent )
|
|
31
|
+
params = { :name => name,
|
|
32
|
+
:type => 'alias',
|
|
33
|
+
:value => value,
|
|
34
|
+
:parent => parent }
|
|
35
|
+
create params
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Helper shortcut to create a string child object.
|
|
40
|
+
#
|
|
41
|
+
def create_untyped( name, value, parent )
|
|
42
|
+
params = { :name => name,
|
|
43
|
+
:type => 'untyped',
|
|
44
|
+
:value => value,
|
|
45
|
+
:parent => parent }
|
|
46
|
+
create params
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# Helper shortcut to create a string child object.
|
|
51
|
+
#
|
|
52
|
+
def create_string( name, value, parent )
|
|
53
|
+
params = { :name => name,
|
|
54
|
+
:type => 'string',
|
|
55
|
+
:value => value,
|
|
56
|
+
:parent => parent }
|
|
57
|
+
create params
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
#
|
|
61
|
+
# Helper shortcut to create a text child object.
|
|
62
|
+
#
|
|
63
|
+
def create_text( name, value, parent )
|
|
64
|
+
params = { :name => name,
|
|
65
|
+
:type => 'text',
|
|
66
|
+
:value => value,
|
|
67
|
+
:parent => parent }
|
|
68
|
+
create params
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
#
|
|
72
|
+
# Helper shortcut to create an integer child object.
|
|
73
|
+
#
|
|
74
|
+
def create_int( name, value, parent )
|
|
75
|
+
params = { :name => name,
|
|
76
|
+
:type => 'integer',
|
|
77
|
+
:value => value,
|
|
78
|
+
:parent => parent }
|
|
79
|
+
create params
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
#
|
|
83
|
+
# Helper shortcut to create a boolean child object.
|
|
84
|
+
#
|
|
85
|
+
def create_bool( name, value, parent )
|
|
86
|
+
params = { :name => name,
|
|
87
|
+
:type => 'boolean',
|
|
88
|
+
:value => value,
|
|
89
|
+
:parent => parent }
|
|
90
|
+
create params
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
#
|
|
94
|
+
# Helper shortcut to create a container child object.
|
|
95
|
+
#
|
|
96
|
+
def create_can( name, parent )
|
|
97
|
+
params = { :name => name,
|
|
98
|
+
:type => 'container',
|
|
99
|
+
:value => nil,
|
|
100
|
+
:parent => parent }
|
|
101
|
+
create params
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
#
|
|
105
|
+
# Helper shortcut to create a script child object.
|
|
106
|
+
#
|
|
107
|
+
def create_script( name, value, parent )
|
|
108
|
+
params = { :name => name,
|
|
109
|
+
:type => 'script',
|
|
110
|
+
:value => value,
|
|
111
|
+
:parent => parent }
|
|
112
|
+
create params
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
#
|
|
116
|
+
# Helper shortcut to create a file child object.
|
|
117
|
+
#
|
|
118
|
+
def create_file( name, value, parent )
|
|
119
|
+
params = { :name => name,
|
|
120
|
+
:type => 'file',
|
|
121
|
+
:value => value,
|
|
122
|
+
:parent => parent }
|
|
123
|
+
create params
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# ---------------------------------------------------------------------
|
|
127
|
+
# Object Factory
|
|
128
|
+
# ---------------------------------------------------------------------
|
|
129
|
+
|
|
130
|
+
# Create object with given name, type and value.
|
|
131
|
+
# One of either name or type is required.
|
|
132
|
+
# All values are optional when considered on their own.
|
|
133
|
+
# Parameter hash keys:
|
|
134
|
+
# :name - the name of the object
|
|
135
|
+
# :type - the name of the type
|
|
136
|
+
# :value - the initial object value
|
|
137
|
+
# :parent - the parent object
|
|
138
|
+
# :squash_duplicates - if the object exists, use it rather
|
|
139
|
+
# than creating a new one? Default = true
|
|
140
|
+
def create( params )
|
|
141
|
+
objtype = find_type params[ :type ]
|
|
142
|
+
return nil unless objtype
|
|
143
|
+
|
|
144
|
+
pn = Gloo::Core::Pn.new( @engine, params[ :name ] )
|
|
145
|
+
parent = params[ :parent ]
|
|
146
|
+
if parent.nil?
|
|
147
|
+
parent = pn.get_parent
|
|
148
|
+
obj_name = pn.name
|
|
149
|
+
else
|
|
150
|
+
obj_name = params[ :name ]
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
if pn.exists? && params[ :squash_duplicates ]
|
|
154
|
+
@engine.log.debug "Updating existing object: #{obj_name}"
|
|
155
|
+
return self.update_existing pn, params[ :value ]
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
@engine.log.debug "Creating new object: #{obj_name}"
|
|
159
|
+
return create_new obj_name, params[ :value ], objtype, parent
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
#
|
|
163
|
+
# Create a new object.
|
|
164
|
+
#
|
|
165
|
+
def create_new( name, value, type, parent )
|
|
166
|
+
unless parent
|
|
167
|
+
@engine.log.error "Could not create object. Bad path: #{name}"
|
|
168
|
+
return nil
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
o = type.new( @engine )
|
|
172
|
+
o.name = name
|
|
173
|
+
o.set_value value
|
|
174
|
+
parent.add_child( o )
|
|
175
|
+
return o
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
#
|
|
179
|
+
# Find and Update an existing object.
|
|
180
|
+
#
|
|
181
|
+
def update_existing( pn, value )
|
|
182
|
+
o = pn.resolve
|
|
183
|
+
o.set_value value
|
|
184
|
+
return o
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
#
|
|
188
|
+
# Find the object type by name.
|
|
189
|
+
# Return nil if the object type cannot be found or
|
|
190
|
+
# cannot be created.
|
|
191
|
+
#
|
|
192
|
+
def find_type( type_name )
|
|
193
|
+
type_name = 'untyped' if type_name.nil? || type_name.strip.empty?
|
|
194
|
+
t = @engine.dictionary.find_obj( type_name )
|
|
195
|
+
|
|
196
|
+
if t.nil?
|
|
197
|
+
@engine.log.warn "Could not find type, '#{type_name}'"
|
|
198
|
+
return nil
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
unless t.can_create?
|
|
202
|
+
@engine.log.error "'#{type_name}' cannot be created."
|
|
203
|
+
return nil
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
return t
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# The System Object.
|
|
5
|
+
# A virtual Object: the system object can be used to access
|
|
6
|
+
# system level variables and functions. But it is not
|
|
7
|
+
# actually an object in the normal sense of the word.
|
|
8
|
+
#
|
|
9
|
+
require 'tty-platform'
|
|
10
|
+
|
|
11
|
+
module Gloo
|
|
12
|
+
module Core
|
|
13
|
+
class GlooSystem < Obj
|
|
14
|
+
|
|
15
|
+
KEYWORD = 'gloo'.freeze
|
|
16
|
+
KEYWORD_SHORT = '$'.freeze
|
|
17
|
+
|
|
18
|
+
attr_reader :pn
|
|
19
|
+
|
|
20
|
+
# Set up the object.
|
|
21
|
+
def initialize( engine, pn )
|
|
22
|
+
@engine = engine
|
|
23
|
+
@pn = pn
|
|
24
|
+
end
|
|
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
|
+
# The object type, suitable for display.
|
|
42
|
+
#
|
|
43
|
+
def type_display
|
|
44
|
+
return self.class.typename
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Is this the root object?
|
|
48
|
+
def root?
|
|
49
|
+
return false
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Can this object be created?
|
|
53
|
+
# This is true by default and only false for some special cases
|
|
54
|
+
# such as the System object.
|
|
55
|
+
def self.can_create?
|
|
56
|
+
false
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# ---------------------------------------------------------------------
|
|
60
|
+
# Value
|
|
61
|
+
# ---------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Get the parameter.
|
|
65
|
+
#
|
|
66
|
+
def param
|
|
67
|
+
return nil unless @pn && @pn.segments.count > 1
|
|
68
|
+
|
|
69
|
+
return @pn.segments[ 1..-1 ].join( '_' )
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
#
|
|
73
|
+
# Get the system value.
|
|
74
|
+
#
|
|
75
|
+
def value
|
|
76
|
+
return dispatch param
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#
|
|
80
|
+
# There is no value object in the system.
|
|
81
|
+
#
|
|
82
|
+
def set_value( new_value )
|
|
83
|
+
# overriding base functionality with dummy function
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
#
|
|
87
|
+
# Get the value for display purposes.
|
|
88
|
+
#
|
|
89
|
+
def value_display
|
|
90
|
+
return value
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
#
|
|
94
|
+
# Is the value a String?
|
|
95
|
+
#
|
|
96
|
+
def value_string?
|
|
97
|
+
return true
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
#
|
|
101
|
+
# Is the value an Array?
|
|
102
|
+
#
|
|
103
|
+
def value_is_array?
|
|
104
|
+
return false
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
#
|
|
108
|
+
# Is the value a blank string?
|
|
109
|
+
#
|
|
110
|
+
def value_is_blank?
|
|
111
|
+
return true
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# ---------------------------------------------------------------------
|
|
115
|
+
# Children
|
|
116
|
+
# ---------------------------------------------------------------------
|
|
117
|
+
|
|
118
|
+
# Does this object have children to add when an object
|
|
119
|
+
# is created in interactive mode?
|
|
120
|
+
# This does not apply during obj load, etc.
|
|
121
|
+
def add_children_on_create?
|
|
122
|
+
return false
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# ---------------------------------------------------------------------
|
|
126
|
+
# Messages
|
|
127
|
+
# ---------------------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
#
|
|
130
|
+
# Get a list of message names that this object receives.
|
|
131
|
+
#
|
|
132
|
+
def self.messages
|
|
133
|
+
return []
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Dispatch the message and get the value.
|
|
137
|
+
def dispatch( msg )
|
|
138
|
+
o = "msg_#{msg}"
|
|
139
|
+
return self.public_send( o ) if self.respond_to? o
|
|
140
|
+
|
|
141
|
+
@engine.log.error "Message #{msg} not implemented"
|
|
142
|
+
return false
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Get the system hostname.
|
|
146
|
+
def msg_hostname
|
|
147
|
+
return Socket.gethostname
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Get the logged in User.
|
|
151
|
+
def msg_user
|
|
152
|
+
return ENV[ 'USER' ]
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Get the user's home directory.
|
|
156
|
+
def msg_user_home
|
|
157
|
+
return File.expand_path( '~' )
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Get the working directory.
|
|
161
|
+
def msg_working_dir
|
|
162
|
+
return Dir.pwd
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Get the Gloo home directory
|
|
166
|
+
def msg_gloo_home
|
|
167
|
+
return @engine.settings.user_root
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Get the Gloo configuration directory
|
|
171
|
+
def msg_gloo_config
|
|
172
|
+
return @engine.settings.config_path
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Get the Gloo projects directory
|
|
176
|
+
def msg_gloo_projects
|
|
177
|
+
return @engine.settings.project_path
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Get the Gloo log directory
|
|
181
|
+
def msg_gloo_log
|
|
182
|
+
return @engine.settings.log_path
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# ---------------------------------------------------------------------
|
|
186
|
+
# Special chars
|
|
187
|
+
# ---------------------------------------------------------------------
|
|
188
|
+
|
|
189
|
+
# Carriage return (line feed)
|
|
190
|
+
def msg_line
|
|
191
|
+
return "\n"
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# ---------------------------------------------------------------------
|
|
195
|
+
# Screen Messages
|
|
196
|
+
# ---------------------------------------------------------------------
|
|
197
|
+
|
|
198
|
+
# Get the number of lines on screen.
|
|
199
|
+
def msg_screen_lines
|
|
200
|
+
return Gloo::App::Settings.lines( @engine )
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Get the number of columns on screen.
|
|
204
|
+
def msg_screen_cols
|
|
205
|
+
return Gloo::App::Settings.cols( @engine )
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# ---------------------------------------------------------------------
|
|
209
|
+
# Platform Messages
|
|
210
|
+
# ---------------------------------------------------------------------
|
|
211
|
+
|
|
212
|
+
# Get the platform CPU
|
|
213
|
+
def msg_platform_cpu
|
|
214
|
+
platform = TTY::Platform.new
|
|
215
|
+
return platform.cpu
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Get the platform Operating System
|
|
219
|
+
def msg_platform_os
|
|
220
|
+
platform = TTY::Platform.new
|
|
221
|
+
return platform.os
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Get the platform version
|
|
225
|
+
def msg_platform_version
|
|
226
|
+
platform = TTY::Platform.new
|
|
227
|
+
return platform.version
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Is the platform Windows?
|
|
231
|
+
def msg_platform_windows?
|
|
232
|
+
platform = TTY::Platform.new
|
|
233
|
+
return platform.windows?
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# Is the platform Unix?
|
|
237
|
+
def msg_platform_unix?
|
|
238
|
+
platform = TTY::Platform.new
|
|
239
|
+
return platform.unix?
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# Is the platform Linux?
|
|
243
|
+
def msg_platform_linux?
|
|
244
|
+
platform = TTY::Platform.new
|
|
245
|
+
return platform.linux?
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
# Is the platform Mac?
|
|
249
|
+
def msg_platform_mac?
|
|
250
|
+
platform = TTY::Platform.new
|
|
251
|
+
return platform.mac?
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
#
|
|
255
|
+
# Get the command to open a file on this platform.
|
|
256
|
+
#
|
|
257
|
+
def self.open_for_platform
|
|
258
|
+
platform = TTY::Platform.new
|
|
259
|
+
return 'open' if platform.mac?
|
|
260
|
+
return 'xdg-open' if platform.linux?
|
|
261
|
+
|
|
262
|
+
return nil
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# The Object Heap.
|
|
5
|
+
# The collection of objects that are currently in play in
|
|
6
|
+
# the running engine.
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
module Gloo
|
|
10
|
+
module Core
|
|
11
|
+
class Heap
|
|
12
|
+
|
|
13
|
+
# The context is a reference to an object, usually a container.
|
|
14
|
+
# The context will be the root by default.
|
|
15
|
+
attr_reader :context
|
|
16
|
+
|
|
17
|
+
attr_reader :it, :root, :error
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Set up the object heap.
|
|
21
|
+
#
|
|
22
|
+
def initialize( engine )
|
|
23
|
+
@engine = engine
|
|
24
|
+
@engine.log.debug 'object heap intialized...'
|
|
25
|
+
|
|
26
|
+
@root = Gloo::Objs::Container.new( @engine )
|
|
27
|
+
@root.name = 'root'
|
|
28
|
+
|
|
29
|
+
@context = Pn.root @engine
|
|
30
|
+
@it = It.new
|
|
31
|
+
@error = Error.new
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# Unload the given obj--remove it from the heap.
|
|
36
|
+
#
|
|
37
|
+
def unload( obj )
|
|
38
|
+
can = obj.parent.nil? ? @root : obj.parent
|
|
39
|
+
return unless can
|
|
40
|
+
|
|
41
|
+
can.remove_child obj
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
#
|
|
45
|
+
# Is there one or more errors?
|
|
46
|
+
#
|
|
47
|
+
def error?
|
|
48
|
+
return @error.error_count.positive?
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
|
2
|
+
# Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# Here helper class,
|
|
5
|
+
# used to resolve relative referencing.
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
module Gloo
|
|
9
|
+
module Core
|
|
10
|
+
class Here
|
|
11
|
+
|
|
12
|
+
HERE = '^'.freeze
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Does the pathname start with here reference?
|
|
16
|
+
#
|
|
17
|
+
def self.includes_here_ref?( elements )
|
|
18
|
+
return elements.first.start_with?( HERE )
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# Expand here reference if present.
|
|
23
|
+
#
|
|
24
|
+
def self.expand_here( engine, pn )
|
|
25
|
+
target = engine.exec_env.here_obj
|
|
26
|
+
|
|
27
|
+
here = pn.elements.first
|
|
28
|
+
remainder = pn.elements[ 1..-1 ].join( '.' )
|
|
29
|
+
|
|
30
|
+
here.length.times { target = target.parent }
|
|
31
|
+
pn.set_to "#{target.pn}.#{remainder}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/gloo/core/it.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# It is the value of the last command that was run.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
module Gloo
|
|
8
|
+
module Core
|
|
9
|
+
class It
|
|
10
|
+
|
|
11
|
+
attr_accessor :value
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Set up the object.
|
|
15
|
+
#
|
|
16
|
+
def initialize
|
|
17
|
+
@value = nil
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Set the value of it.
|
|
22
|
+
#
|
|
23
|
+
def set_to( new_value )
|
|
24
|
+
@value = new_value
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Get the string representation of it.
|
|
29
|
+
#
|
|
30
|
+
def to_s
|
|
31
|
+
return @value.to_s
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# A Literal value.
|
|
5
|
+
# Base class for all literal values.
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
module Gloo
|
|
9
|
+
module Core
|
|
10
|
+
class Literal
|
|
11
|
+
|
|
12
|
+
attr_reader :value
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Create the expression from a list of tokens.
|
|
16
|
+
#
|
|
17
|
+
def initialize( value )
|
|
18
|
+
set_value( value )
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# Set the literal value.
|
|
23
|
+
#
|
|
24
|
+
def set_value( value )
|
|
25
|
+
@value = value
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|