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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +139 -0
- data/LICENSE.txt +21 -0
- data/README.md +43 -0
- data/Rakefile +12 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/gloo +4 -0
- data/exe/o +4 -0
- data/gloo.gemspec +38 -0
- data/lib/gloo.rb +19 -0
- data/lib/gloo/app/args.rb +71 -0
- data/lib/gloo/app/engine.rb +158 -0
- data/lib/gloo/app/help.rb +29 -0
- data/lib/gloo/app/info.rb +21 -0
- data/lib/gloo/app/log.rb +58 -0
- data/lib/gloo/app/mode.rb +25 -0
- data/lib/gloo/app/settings.rb +125 -0
- data/lib/gloo/core/baseo.rb +28 -0
- data/lib/gloo/core/dictionary.rb +101 -0
- data/lib/gloo/core/event_manager.rb +46 -0
- data/lib/gloo/core/factory.rb +67 -0
- data/lib/gloo/core/gloo_system.rb +190 -0
- data/lib/gloo/core/heap.rb +42 -0
- data/lib/gloo/core/it.rb +30 -0
- data/lib/gloo/core/literal.rb +25 -0
- data/lib/gloo/core/obj.rb +222 -0
- data/lib/gloo/core/obj_finder.rb +35 -0
- data/lib/gloo/core/op.rb +33 -0
- data/lib/gloo/core/parser.rb +52 -0
- data/lib/gloo/core/pn.rb +134 -0
- data/lib/gloo/core/script.rb +37 -0
- data/lib/gloo/core/tokens.rb +123 -0
- data/lib/gloo/core/verb.rb +63 -0
- data/lib/gloo/expr/expression.rb +103 -0
- data/lib/gloo/expr/l_boolean.rb +29 -0
- data/lib/gloo/expr/l_integer.rb +29 -0
- data/lib/gloo/expr/l_string.rb +53 -0
- data/lib/gloo/expr/op_div.rb +20 -0
- data/lib/gloo/expr/op_minus.rb +20 -0
- data/lib/gloo/expr/op_mult.rb +20 -0
- data/lib/gloo/expr/op_plus.rb +22 -0
- data/lib/gloo/objs/basic/boolean.rb +113 -0
- data/lib/gloo/objs/basic/container.rb +50 -0
- data/lib/gloo/objs/basic/integer.rb +65 -0
- data/lib/gloo/objs/basic/script.rb +101 -0
- data/lib/gloo/objs/basic/string.rb +65 -0
- data/lib/gloo/objs/basic/text.rb +64 -0
- data/lib/gloo/objs/basic/untyped.rb +42 -0
- data/lib/gloo/objs/cli/colorize.rb +73 -0
- data/lib/gloo/objs/cli/confirm.rb +92 -0
- data/lib/gloo/objs/cli/prompt.rb +92 -0
- data/lib/gloo/objs/ctrl/each.rb +212 -0
- data/lib/gloo/objs/dev/git.rb +112 -0
- data/lib/gloo/objs/ror/erb.rb +109 -0
- data/lib/gloo/objs/ror/eval.rb +92 -0
- data/lib/gloo/objs/system/file_handle.rb +86 -0
- data/lib/gloo/objs/system/system.rb +120 -0
- data/lib/gloo/objs/web/http_get.rb +128 -0
- data/lib/gloo/objs/web/http_post.rb +127 -0
- data/lib/gloo/objs/web/slack.rb +126 -0
- data/lib/gloo/objs/web/teams.rb +117 -0
- data/lib/gloo/persist/file_loader.rb +171 -0
- data/lib/gloo/persist/file_saver.rb +43 -0
- data/lib/gloo/persist/file_storage.rb +43 -0
- data/lib/gloo/persist/persist_man.rb +90 -0
- data/lib/gloo/utils/words.rb +19 -0
- data/lib/gloo/verbs/alert.rb +42 -0
- data/lib/gloo/verbs/context.rb +52 -0
- data/lib/gloo/verbs/create.rb +52 -0
- data/lib/gloo/verbs/help.rb +69 -0
- data/lib/gloo/verbs/if.rb +56 -0
- data/lib/gloo/verbs/list.rb +85 -0
- data/lib/gloo/verbs/load.rb +39 -0
- data/lib/gloo/verbs/put.rb +62 -0
- data/lib/gloo/verbs/quit.rb +40 -0
- data/lib/gloo/verbs/run.rb +46 -0
- data/lib/gloo/verbs/save.rb +37 -0
- data/lib/gloo/verbs/show.rb +55 -0
- data/lib/gloo/verbs/tell.rb +47 -0
- data/lib/gloo/verbs/unless.rb +56 -0
- data/lib/gloo/verbs/version.rb +37 -0
- data/lib/run.rb +13 -0
- metadata +254 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# A script to be run.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Gloo
|
8
|
+
module Core
|
9
|
+
class Script
|
10
|
+
|
11
|
+
# Set up the script.
|
12
|
+
def initialize obj
|
13
|
+
@obj = obj
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
# Run the script.
|
18
|
+
def run
|
19
|
+
if @obj.value.is_a? String
|
20
|
+
run_line @obj.value
|
21
|
+
elsif @obj.value.is_a? Array
|
22
|
+
@obj.value.each do |line|
|
23
|
+
run_line line
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Run a single line of the script.
|
29
|
+
def run_line line
|
30
|
+
i = $engine.parser.parse_immediate line
|
31
|
+
return unless i
|
32
|
+
i.run
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# An ordered list of tokens.
|
5
|
+
# The list of tokens makes up a command.
|
6
|
+
#
|
7
|
+
|
8
|
+
module Gloo
|
9
|
+
module Core
|
10
|
+
class Tokens
|
11
|
+
|
12
|
+
attr_reader :cmd, :tokens
|
13
|
+
|
14
|
+
# Set up the tokens.
|
15
|
+
def initialize( cmd_string )
|
16
|
+
@cmd = cmd_string
|
17
|
+
@tokens = []
|
18
|
+
tokenize @cmd
|
19
|
+
end
|
20
|
+
|
21
|
+
# Create a list of token from the given string.
|
22
|
+
def tokenize str
|
23
|
+
if str.index( '"' )
|
24
|
+
i = str.index( '"' )
|
25
|
+
j = str.index( '"', i+1 )
|
26
|
+
j = str.length unless j
|
27
|
+
|
28
|
+
tokenize( str[ 0..i-1 ] ) if i > 1
|
29
|
+
@tokens << str[ i..j ]
|
30
|
+
tokenize( str[ j+1..-1 ] ) if j+1 < str.length
|
31
|
+
elsif str.index( "'" )
|
32
|
+
i = str.index( "'" )
|
33
|
+
j = str.index( "'", i+1 )
|
34
|
+
j = str.length unless j
|
35
|
+
|
36
|
+
tokenize( str[ 0..i-1 ] ) if i > 1
|
37
|
+
@tokens << str[ i..j ]
|
38
|
+
tokenize( str[ j+1..-1 ] ) if j+1 < str.length
|
39
|
+
else
|
40
|
+
str.strip.split( " " ).each { |t| @tokens << t }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Get the number of tokens
|
45
|
+
def token_count
|
46
|
+
return @tokens.size
|
47
|
+
end
|
48
|
+
|
49
|
+
# Get the verb (the first word)
|
50
|
+
def verb
|
51
|
+
return first
|
52
|
+
end
|
53
|
+
|
54
|
+
# Get all tokens except the first.
|
55
|
+
def params
|
56
|
+
return @tokens[ 1..-1 ]
|
57
|
+
end
|
58
|
+
|
59
|
+
# Get the first token.
|
60
|
+
def first
|
61
|
+
return @tokens.first if @tokens
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get the last token.
|
65
|
+
def last
|
66
|
+
return @tokens.last if @tokens
|
67
|
+
end
|
68
|
+
|
69
|
+
# Get the second token.
|
70
|
+
def second
|
71
|
+
return @tokens[1] if @tokens && @tokens.size > 0
|
72
|
+
end
|
73
|
+
|
74
|
+
def at index
|
75
|
+
return @tokens[index] if @tokens && @tokens.size >= index
|
76
|
+
end
|
77
|
+
|
78
|
+
# Get the index of the given token.
|
79
|
+
def index_of token
|
80
|
+
return nil unless @tokens
|
81
|
+
return @tokens.find_index { |o| o.casecmp( token ) == 0 }
|
82
|
+
end
|
83
|
+
|
84
|
+
# Get the list of tokens after the given token
|
85
|
+
def tokens_after token
|
86
|
+
i = index_of token
|
87
|
+
if i && @tokens && @tokens.size > ( i+1 )
|
88
|
+
return @tokens[ i+1..-1 ]
|
89
|
+
end
|
90
|
+
return nil
|
91
|
+
end
|
92
|
+
|
93
|
+
# Get the expression after the given token
|
94
|
+
def expr_after token
|
95
|
+
str = ""
|
96
|
+
tokens_after( token ).each do |t|
|
97
|
+
str << " " if ( str.length > 0 )
|
98
|
+
str << "#{t}"
|
99
|
+
end
|
100
|
+
return str
|
101
|
+
end
|
102
|
+
|
103
|
+
# Get the item after a given token.
|
104
|
+
def after_token token
|
105
|
+
i = index_of token
|
106
|
+
if i && @tokens && @tokens.size > ( i+1 )
|
107
|
+
return @tokens[ i+1 ]
|
108
|
+
end
|
109
|
+
return nil
|
110
|
+
end
|
111
|
+
|
112
|
+
# Get the item after a given token.
|
113
|
+
def before_token token
|
114
|
+
i = index_of token
|
115
|
+
if i && @tokens && @tokens.size >= ( i )
|
116
|
+
return @tokens[ 0..i-1 ]
|
117
|
+
end
|
118
|
+
return nil
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# An abstract base verb.
|
5
|
+
# Derives from the Baseo object.
|
6
|
+
# It is a special type of object in that it can be run
|
7
|
+
# and can perform an action.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Gloo
|
11
|
+
module Core
|
12
|
+
class Verb < Baseo
|
13
|
+
|
14
|
+
attr_reader :tokens, :params
|
15
|
+
|
16
|
+
# Set up the verb.
|
17
|
+
def initialize( tokens, params=[] )
|
18
|
+
@tokens = tokens
|
19
|
+
@params = params
|
20
|
+
end
|
21
|
+
|
22
|
+
# Register verbs when they are loaded.
|
23
|
+
def self.inherited( subclass )
|
24
|
+
Dictionary.instance.register_verb( subclass )
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Run the verb.
|
29
|
+
#
|
30
|
+
# We'll mark the application as not running and let the
|
31
|
+
# engine stop gracefully next time through the loop.
|
32
|
+
#
|
33
|
+
def run
|
34
|
+
raise 'this method should be overriden'
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Get the Verb's keyword.
|
39
|
+
#
|
40
|
+
# The keyword will be in lower case only.
|
41
|
+
# It is used by the parser.
|
42
|
+
#
|
43
|
+
def self.keyword
|
44
|
+
raise 'this method should be overriden'
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# Get the Verb's keyword shortcut.
|
49
|
+
#
|
50
|
+
def self.keyword_shortcut
|
51
|
+
raise 'this method should be overriden'
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# The object type, suitable for display.
|
56
|
+
#
|
57
|
+
def type_display
|
58
|
+
return self.class.keyword
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# An Expression that can be evaluated.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Gloo
|
8
|
+
module Expr
|
9
|
+
class Expression
|
10
|
+
|
11
|
+
# Create the expression from a list of tokens.
|
12
|
+
def initialize tokens
|
13
|
+
@tokens = tokens
|
14
|
+
@symbols = []
|
15
|
+
@left = nil
|
16
|
+
@right = nil
|
17
|
+
@op = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
# Evaluate the expression and return the value.
|
21
|
+
def evaluate
|
22
|
+
identify_tokens
|
23
|
+
|
24
|
+
@symbols.each do |sym|
|
25
|
+
if sym.is_a? Gloo::Core::Op
|
26
|
+
@op = sym
|
27
|
+
elsif @left == nil
|
28
|
+
@left = sym
|
29
|
+
else
|
30
|
+
@right = sym
|
31
|
+
end
|
32
|
+
|
33
|
+
perform_op if @left && @right
|
34
|
+
end
|
35
|
+
|
36
|
+
if @left.is_a? Gloo::Core::Literal
|
37
|
+
return @left.value
|
38
|
+
elsif @left.is_a? Gloo::Core::Pn
|
39
|
+
return resolve_ref @left
|
40
|
+
else
|
41
|
+
return @left
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Perform the operation.
|
46
|
+
def perform_op
|
47
|
+
@op = Gloo::Core::Op.default_op unless @op
|
48
|
+
l = evaluate_sym @left
|
49
|
+
r = evaluate_sym @right
|
50
|
+
@left = @op.perform l, r
|
51
|
+
@right = nil
|
52
|
+
@op = nil
|
53
|
+
end
|
54
|
+
|
55
|
+
# Evaluate the symbol and get a simple value.
|
56
|
+
def evaluate_sym sym
|
57
|
+
if sym.is_a? Gloo::Core::Literal
|
58
|
+
return sym.value
|
59
|
+
elsif sym.is_a? Gloo::Core::Pn
|
60
|
+
return resolve_ref sym
|
61
|
+
else
|
62
|
+
return sym
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# resolve an object reference and get the value.
|
67
|
+
def resolve_ref ref
|
68
|
+
return ref.src if ref.is_color?
|
69
|
+
|
70
|
+
ob = ref.resolve
|
71
|
+
return ob.value if ob
|
72
|
+
end
|
73
|
+
|
74
|
+
# Identify each token in the list.
|
75
|
+
def identify_tokens
|
76
|
+
@tokens.each do |o|
|
77
|
+
@symbols << identify_token( o )
|
78
|
+
end
|
79
|
+
|
80
|
+
# @symbols.each do |o|
|
81
|
+
# puts o.class.name
|
82
|
+
# end
|
83
|
+
end
|
84
|
+
|
85
|
+
#
|
86
|
+
# Identify the tokens and create appropriate symbols.
|
87
|
+
#
|
88
|
+
def identify_token token
|
89
|
+
if Gloo::Core::Op.is_op?( token )
|
90
|
+
return Gloo::Core::Op.create_op( token )
|
91
|
+
end
|
92
|
+
|
93
|
+
return LBoolean.new( token ) if LBoolean.is_boolean?( token )
|
94
|
+
return LInteger.new( token ) if LInteger.is_integer?( token )
|
95
|
+
return LString.new( token ) if LString.is_string?( token )
|
96
|
+
|
97
|
+
# last chance: an Object reference
|
98
|
+
return Gloo::Core::Pn.new( token )
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# An Expression that can be evaluated.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Gloo
|
8
|
+
module Expr
|
9
|
+
class LBoolean < Gloo::Core::Literal
|
10
|
+
|
11
|
+
# Is the given token a boolean?
|
12
|
+
def self.is_boolean? token
|
13
|
+
return Gloo::Objs::Boolean.is_boolean? token
|
14
|
+
end
|
15
|
+
|
16
|
+
# Set the value, converting to an boolean.
|
17
|
+
def set_value value
|
18
|
+
@value = Gloo::Objs::Boolean.coerse_to_bool value
|
19
|
+
end
|
20
|
+
|
21
|
+
# Get string representation
|
22
|
+
def to_s
|
23
|
+
return "false" unless @value
|
24
|
+
return @value.to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# An Expression that can be evaluated.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Gloo
|
8
|
+
module Expr
|
9
|
+
class LInteger < Gloo::Core::Literal
|
10
|
+
|
11
|
+
# Is the given token an integer?
|
12
|
+
def self.is_integer? token
|
13
|
+
return true if token.is_a? Integer
|
14
|
+
s = token.strip
|
15
|
+
return s.to_i.to_s == s
|
16
|
+
end
|
17
|
+
|
18
|
+
# Set the value, converting to an integer.
|
19
|
+
def set_value value
|
20
|
+
@value = value.to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
return self.value.to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
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
|
+
# An Expression that can be evaluated.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Gloo
|
8
|
+
module Expr
|
9
|
+
class LString < Gloo::Core::Literal
|
10
|
+
|
11
|
+
# Set the value, triming opening and closing
|
12
|
+
# quotations if necessary.
|
13
|
+
def set_value value
|
14
|
+
@value = value
|
15
|
+
return unless value
|
16
|
+
@value = LString.strip_quotes( @value )
|
17
|
+
end
|
18
|
+
|
19
|
+
# Is the given token a string?
|
20
|
+
def self.is_string? token
|
21
|
+
return false unless token.is_a? String
|
22
|
+
return true if token.start_with?( '"' )
|
23
|
+
return true if token.start_with?( "'" )
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Given a string with leading and trailing quotes,
|
29
|
+
# strip them out.
|
30
|
+
#
|
31
|
+
def self.strip_quotes str
|
32
|
+
if str.start_with?( '"' )
|
33
|
+
str = str[ 1..-1 ]
|
34
|
+
if str.end_with?( '"' )
|
35
|
+
str = str[ 0..-2 ]
|
36
|
+
end
|
37
|
+
return str
|
38
|
+
elsif str.start_with?( "'" )
|
39
|
+
str = str[ 1..-1 ]
|
40
|
+
if str.end_with?( "'" )
|
41
|
+
str = str[ 0..-2 ]
|
42
|
+
end
|
43
|
+
return str
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_s
|
48
|
+
return self.value
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# Division operator.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Gloo
|
8
|
+
module Expr
|
9
|
+
class OpDiv < Gloo::Core::Op
|
10
|
+
|
11
|
+
# Perform the operation and return the result.
|
12
|
+
def perform left, right
|
13
|
+
if left.is_a? Integer
|
14
|
+
return left / right.to_i
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|