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,158 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# The Gloo Script Engine.
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'tty-prompt'
|
8
|
+
require 'tty-cursor'
|
9
|
+
require 'colorize'
|
10
|
+
|
11
|
+
module Gloo
|
12
|
+
module App
|
13
|
+
class Engine
|
14
|
+
|
15
|
+
attr_reader :args, :mode, :running
|
16
|
+
attr_reader :dictionary, :parser, :heap, :factory
|
17
|
+
attr_accessor :last_cmd, :persist_man, :event_manager
|
18
|
+
|
19
|
+
# Set up the engine with basic elements.
|
20
|
+
def initialize( params = [] )
|
21
|
+
$engine = self
|
22
|
+
@args = Args.new( params )
|
23
|
+
$settings = Settings.new( ENV[ 'GLOO_ENV' ] )
|
24
|
+
$log = Log.new( @args.quiet? )
|
25
|
+
$prompt = TTY::Prompt.new
|
26
|
+
$log.debug "engine intialized..."
|
27
|
+
end
|
28
|
+
|
29
|
+
# Start the engine.
|
30
|
+
def start
|
31
|
+
$log.debug "starting the engine..."
|
32
|
+
$log.debug Info.display_title
|
33
|
+
@mode = @args.detect_mode
|
34
|
+
@running = true
|
35
|
+
|
36
|
+
@dictionary = Gloo::Core::Dictionary.instance
|
37
|
+
@dictionary.init
|
38
|
+
@parser = Gloo::Core::Parser.new
|
39
|
+
@heap = Gloo::Core::Heap.new
|
40
|
+
@factory = Gloo::Core::Factory.new
|
41
|
+
@persist_man = Gloo::Persist::PersistMan.new
|
42
|
+
@event_manager = Gloo::Core::EventManager.new
|
43
|
+
|
44
|
+
run_mode
|
45
|
+
end
|
46
|
+
|
47
|
+
# Run the selected mode.
|
48
|
+
def run_mode
|
49
|
+
if @mode == Mode::VERSION
|
50
|
+
run_version
|
51
|
+
elsif @mode == Mode::HELP
|
52
|
+
run_help
|
53
|
+
elsif @mode == Mode::SCRIPT
|
54
|
+
run_files
|
55
|
+
else
|
56
|
+
run
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Run files specified on the CLI.
|
61
|
+
# Then quit.
|
62
|
+
def run_files
|
63
|
+
@args.files.each do |f|
|
64
|
+
@persist_man.load( f )
|
65
|
+
end
|
66
|
+
|
67
|
+
quit
|
68
|
+
end
|
69
|
+
|
70
|
+
# Run
|
71
|
+
def run
|
72
|
+
# Open default files
|
73
|
+
self.open_start_file
|
74
|
+
|
75
|
+
# TODO: open any files specifed in args
|
76
|
+
|
77
|
+
unless @mode == Mode::SCRIPT || @args.quiet?
|
78
|
+
@cursor = TTY::Cursor
|
79
|
+
self.loop
|
80
|
+
end
|
81
|
+
|
82
|
+
quit
|
83
|
+
end
|
84
|
+
|
85
|
+
# Get the setting for the start_with file and open it.
|
86
|
+
def open_start_file
|
87
|
+
name = $settings.start_with
|
88
|
+
@persist_man.load( name ) if name
|
89
|
+
end
|
90
|
+
|
91
|
+
# Prompt for the next command.
|
92
|
+
def prompt_cmd
|
93
|
+
dt = DateTime.now
|
94
|
+
d = dt.strftime( '%Y.%m.%d' )
|
95
|
+
t = dt.strftime( '%I:%M:%S' )
|
96
|
+
|
97
|
+
@last_cmd = $prompt.ask( "#{d.yellow} #{t.white} >" )
|
98
|
+
end
|
99
|
+
|
100
|
+
# Is the last command entered blank?
|
101
|
+
def last_cmd_blank?
|
102
|
+
return true if @last_cmd.nil?
|
103
|
+
return true if @last_cmd.strip.empty?
|
104
|
+
end
|
105
|
+
|
106
|
+
# Prompt, Get input, process.
|
107
|
+
def loop
|
108
|
+
while @running
|
109
|
+
prompt_cmd
|
110
|
+
process_cmd
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Process the command.
|
115
|
+
def process_cmd
|
116
|
+
if last_cmd_blank?
|
117
|
+
clear_screen
|
118
|
+
return
|
119
|
+
end
|
120
|
+
|
121
|
+
@immediate = @parser.parse_immediate @last_cmd
|
122
|
+
@immediate.run if @immediate
|
123
|
+
end
|
124
|
+
|
125
|
+
# Request the engine to stop running.
|
126
|
+
def stop_running
|
127
|
+
@running = false
|
128
|
+
end
|
129
|
+
|
130
|
+
# Do any clean up and quit.
|
131
|
+
def quit
|
132
|
+
$log.debug "quitting..."
|
133
|
+
end
|
134
|
+
|
135
|
+
# Show the version information and then quit.
|
136
|
+
def run_version
|
137
|
+
puts Info.display_title unless @args.quiet?
|
138
|
+
quit
|
139
|
+
end
|
140
|
+
|
141
|
+
# Show the help information and then quit.
|
142
|
+
def run_help keep_running=false
|
143
|
+
unless @args.quiet?
|
144
|
+
puts Info.display_title
|
145
|
+
puts Help.get_help_text
|
146
|
+
end
|
147
|
+
quit unless keep_running
|
148
|
+
end
|
149
|
+
|
150
|
+
# Clear the screen.
|
151
|
+
def clear_screen
|
152
|
+
print @cursor.clear_screen
|
153
|
+
print @cursor.move_to( 0, 0 )
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
end
|
158
|
+
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
|
+
# Help system.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Gloo
|
8
|
+
module App
|
9
|
+
class Help
|
10
|
+
|
11
|
+
# Get text to display when the application is run
|
12
|
+
# in HELP mode.
|
13
|
+
def self.get_help_text
|
14
|
+
str = "\nNAME\n\tgloo\n\n"
|
15
|
+
str << "\nDESCRIPTION\n\tGloo scripting language. A scripting language built on ruby.\n"
|
16
|
+
str << "\tMore information coming soon.\n\n"
|
17
|
+
str << "\nSYNOPSIS\n\tgloo [global option] [file]\n\n"
|
18
|
+
str << "\nGLOBAL OPTIONS\n"
|
19
|
+
str << "\t--cli \t\t - Run in CLI mode\n"
|
20
|
+
str << "\t--version \t - Show application version\n"
|
21
|
+
str << "\t--help \t\t - Show this help page\n"
|
22
|
+
str << "\n"
|
23
|
+
return str
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# Application information such as Version and public name.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Gloo
|
8
|
+
module App
|
9
|
+
class Info
|
10
|
+
|
11
|
+
VERSION = "0.3.0"
|
12
|
+
APP_NAME = "Gloo"
|
13
|
+
|
14
|
+
def self.display_title
|
15
|
+
return "#{APP_NAME}, version #{VERSION}"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
data/lib/gloo/app/log.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# Application Logging wrapper.
|
5
|
+
#
|
6
|
+
require 'active_support'
|
7
|
+
require 'colorize'
|
8
|
+
require 'colorized_string'
|
9
|
+
|
10
|
+
module Gloo
|
11
|
+
module App
|
12
|
+
class Log
|
13
|
+
|
14
|
+
attr_reader :logger, :quiet
|
15
|
+
|
16
|
+
def initialize( quiet )
|
17
|
+
f = File.join( $settings.log_path, "gloo.log" )
|
18
|
+
@logger = Logger.new( f )
|
19
|
+
@logger.level = Logger::DEBUG
|
20
|
+
@quiet = quiet
|
21
|
+
end
|
22
|
+
|
23
|
+
# Show a message unless we're in quite mode.
|
24
|
+
def show msg
|
25
|
+
puts msg unless @quiet
|
26
|
+
end
|
27
|
+
|
28
|
+
def debug msg
|
29
|
+
@logger.debug msg
|
30
|
+
end
|
31
|
+
|
32
|
+
def info msg
|
33
|
+
@logger.info msg
|
34
|
+
puts msg.blue unless @quiet
|
35
|
+
end
|
36
|
+
|
37
|
+
def warn msg
|
38
|
+
@logger.warn msg
|
39
|
+
puts msg.yellow unless @quiet
|
40
|
+
end
|
41
|
+
|
42
|
+
def error msg, e = nil
|
43
|
+
if e
|
44
|
+
@logger.error msg
|
45
|
+
@logger.error e.message
|
46
|
+
@logger.error e.backtrace
|
47
|
+
puts msg.red unless @quiet
|
48
|
+
puts e.message.red unless @quiet
|
49
|
+
puts e.backtrace unless @quiet
|
50
|
+
else
|
51
|
+
@logger.error msg
|
52
|
+
puts msg.red unless @quiet
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# Mode the Application is running in.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Gloo
|
8
|
+
module App
|
9
|
+
class Mode
|
10
|
+
|
11
|
+
EMBED = :embed # Run as embedded script processor
|
12
|
+
CLI = :cli # Run in interactive (CLI) mode
|
13
|
+
SCRIPT = :script # Run a script
|
14
|
+
VERSION = :version # Show version information
|
15
|
+
HELP = :help # Show the help screen
|
16
|
+
TEST = :test # Running in Unit Test mode.
|
17
|
+
|
18
|
+
# Get the default mode.
|
19
|
+
def self.default_mode
|
20
|
+
return EMBED
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# Application and user settings.
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'yaml'
|
8
|
+
require 'tty-screen'
|
9
|
+
require 'colorize'
|
10
|
+
|
11
|
+
module Gloo
|
12
|
+
module App
|
13
|
+
class Settings
|
14
|
+
|
15
|
+
attr_reader :user_root, :log_path, :config_path, :project_path
|
16
|
+
attr_reader :start_with, :list_indent
|
17
|
+
|
18
|
+
|
19
|
+
# Load setting from the yml file.
|
20
|
+
def initialize mode
|
21
|
+
@mode = mode
|
22
|
+
init_root
|
23
|
+
init_path_settings
|
24
|
+
init_user_settings
|
25
|
+
end
|
26
|
+
|
27
|
+
def init_root
|
28
|
+
if in_test_mode?
|
29
|
+
path = File.dirname( File.dirname( File.absolute_path( __FILE__ ) ) )
|
30
|
+
path = File.dirname( File.dirname( path ) )
|
31
|
+
path = File.join( path, "test", "gloo" )
|
32
|
+
@user_root = path
|
33
|
+
else
|
34
|
+
@user_root = File.join( Dir.home, "gloo" )
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Are we in test mode?
|
39
|
+
def in_test_mode?
|
40
|
+
return @mode == 'TEST'
|
41
|
+
end
|
42
|
+
|
43
|
+
# Get the app's required directories.
|
44
|
+
def init_path_settings
|
45
|
+
Dir.mkdir( @user_root ) unless File.exists?( @user_root )
|
46
|
+
|
47
|
+
@log_path = File.join( @user_root, "logs" )
|
48
|
+
Dir.mkdir( @log_path ) unless File.exists?( @log_path )
|
49
|
+
|
50
|
+
@config_path = File.join( @user_root, "config" )
|
51
|
+
Dir.mkdir( @config_path ) unless File.exists?( @config_path )
|
52
|
+
end
|
53
|
+
|
54
|
+
def init_user_settings
|
55
|
+
settings = get_settings
|
56
|
+
|
57
|
+
if in_test_mode?
|
58
|
+
@project_path = File.join( @user_root, "projects" )
|
59
|
+
else
|
60
|
+
@project_path = settings[ 'gloo' ][ 'project_path' ]
|
61
|
+
end
|
62
|
+
@start_with = settings[ 'gloo' ][ 'start_with' ]
|
63
|
+
@list_indent = settings[ 'gloo' ][ 'list_indent' ]
|
64
|
+
end
|
65
|
+
|
66
|
+
# Get the app's required directories.
|
67
|
+
def get_settings
|
68
|
+
f = File.join( @config_path, "gloo.yml" )
|
69
|
+
create_settings( f ) unless File.exists?( f )
|
70
|
+
return YAML::load_file f
|
71
|
+
end
|
72
|
+
|
73
|
+
# Create settings file.
|
74
|
+
def create_settings f
|
75
|
+
IO.write( f, get_default_settings )
|
76
|
+
end
|
77
|
+
|
78
|
+
# Get the value for default settings.
|
79
|
+
def get_default_settings
|
80
|
+
home_dir = Dir.home
|
81
|
+
projects = File.join( @user_root, "projects" )
|
82
|
+
str = <<TEXT
|
83
|
+
gloo:
|
84
|
+
project_path: #{projects}
|
85
|
+
start_with:
|
86
|
+
list_indent: 1
|
87
|
+
TEXT
|
88
|
+
return str
|
89
|
+
end
|
90
|
+
|
91
|
+
# Show the current application settings.
|
92
|
+
def show
|
93
|
+
puts "\nApplication Settings:".blue
|
94
|
+
puts " User Root Path is here: ".yellow + @user_root.white
|
95
|
+
puts " Projects directory: ".yellow + @projects.white
|
96
|
+
puts " Startup with: ".yellow + @start_with.white
|
97
|
+
puts " Indent in Listing: ".yellow + @list_indent.white
|
98
|
+
puts ""
|
99
|
+
puts " Screen Lines: ".yellow + "#{Settings.lines}".white
|
100
|
+
puts " Page Size: ".yellow + "#{Settings.page_size}".white
|
101
|
+
puts ""
|
102
|
+
end
|
103
|
+
|
104
|
+
# Get the number of lines on screen.
|
105
|
+
def self.lines
|
106
|
+
TTY::Screen.rows
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.cols
|
110
|
+
TTY::Screen.cols
|
111
|
+
end
|
112
|
+
|
113
|
+
# Get the default page size.
|
114
|
+
def self.page_size
|
115
|
+
Settings.lines - 3
|
116
|
+
end
|
117
|
+
|
118
|
+
# How many lines should we use for a preview?
|
119
|
+
def self.preview_lines
|
120
|
+
return 7
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Author:: Eric Crane (mailto:eric.crane@mac.com)
|
2
|
+
# Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
|
3
|
+
#
|
4
|
+
# An abstract base object.
|
5
|
+
# All objects and verbs derive from this.
|
6
|
+
#
|
7
|
+
|
8
|
+
module Gloo
|
9
|
+
module Core
|
10
|
+
class Baseo
|
11
|
+
|
12
|
+
attr_accessor :name
|
13
|
+
|
14
|
+
# Set up the object.
|
15
|
+
def initialize()
|
16
|
+
@name = ""
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# The object type, suitable for display.
|
21
|
+
#
|
22
|
+
def type_display
|
23
|
+
raise 'this method should be overriden'
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|