gloo 0.8.0 → 1.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.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/Gemfile.lock +32 -28
  4. data/LICENSE.txt +1 -1
  5. data/gloo.gemspec +11 -6
  6. data/lib/VERSION +1 -1
  7. data/lib/dependencies.rb +4 -4
  8. data/lib/gloo/app/info.rb +3 -1
  9. data/lib/gloo/app/log.rb +1 -29
  10. data/lib/gloo/app/platform.rb +142 -0
  11. data/lib/gloo/objs/cli/banner.rb +2 -2
  12. data/lib/gloo/objs/cli/bar.rb +4 -4
  13. data/lib/gloo/objs/cli/colorize.rb +3 -3
  14. data/lib/gloo/objs/cli/confirm.rb +3 -3
  15. data/lib/gloo/objs/cli/menu.rb +9 -9
  16. data/lib/gloo/objs/cli/menu_item.rb +2 -2
  17. data/lib/gloo/objs/cli/pastel.rb +2 -2
  18. data/lib/gloo/objs/cli/prompt.rb +4 -4
  19. data/lib/gloo/objs/cli/select.rb +4 -4
  20. data/lib/gloo/objs/dev/git.rb +7 -7
  21. data/lib/gloo/objs/dev/stats.rb +8 -5
  22. data/lib/gloo/objs/snd/play.rb +1 -1
  23. data/lib/gloo/objs/snd/say.rb +2 -2
  24. data/lib/gloo/objs/system/file_handle.rb +9 -9
  25. data/lib/gloo/objs/system/ssh_exec.rb +3 -3
  26. data/lib/gloo/objs/system/system.rb +2 -2
  27. data/lib/gloo/verbs/alert.rb +7 -7
  28. data/lib/gloo/verbs/beep.rb +1 -1
  29. data/lib/gloo/verbs/cls.rb +2 -2
  30. data/lib/gloo.rb +5 -1
  31. data/lib/run.rb +5 -1
  32. metadata +39 -145
  33. data/lib/gloo/app/args.rb +0 -112
  34. data/lib/gloo/app/engine.rb +0 -230
  35. data/lib/gloo/app/help.rb +0 -156
  36. data/lib/gloo/app/mode.rb +0 -27
  37. data/lib/gloo/app/settings.rb +0 -186
  38. data/lib/gloo/convert/converter.rb +0 -35
  39. data/lib/gloo/convert/string_to_datetime.rb +0 -21
  40. data/lib/gloo/convert/string_to_decimal.rb +0 -20
  41. data/lib/gloo/convert/string_to_integer.rb +0 -20
  42. data/lib/gloo/core/baseo.rb +0 -30
  43. data/lib/gloo/core/dictionary.rb +0 -181
  44. data/lib/gloo/core/error.rb +0 -61
  45. data/lib/gloo/core/event_manager.rb +0 -44
  46. data/lib/gloo/core/factory.rb +0 -210
  47. data/lib/gloo/core/gloo_system.rb +0 -266
  48. data/lib/gloo/core/heap.rb +0 -52
  49. data/lib/gloo/core/here.rb +0 -36
  50. data/lib/gloo/core/it.rb +0 -36
  51. data/lib/gloo/core/literal.rb +0 -30
  52. data/lib/gloo/core/obj.rb +0 -303
  53. data/lib/gloo/core/obj_finder.rb +0 -30
  54. data/lib/gloo/core/op.rb +0 -40
  55. data/lib/gloo/core/parser.rb +0 -59
  56. data/lib/gloo/core/pn.rb +0 -188
  57. data/lib/gloo/core/tokens.rb +0 -165
  58. data/lib/gloo/core/verb.rb +0 -86
  59. data/lib/gloo/exec/action.rb +0 -48
  60. data/lib/gloo/exec/dispatch.rb +0 -40
  61. data/lib/gloo/exec/exec_env.rb +0 -74
  62. data/lib/gloo/exec/runner.rb +0 -45
  63. data/lib/gloo/exec/script.rb +0 -49
  64. data/lib/gloo/exec/stack.rb +0 -78
  65. data/lib/gloo/expr/expression.rb +0 -118
  66. data/lib/gloo/expr/l_boolean.rb +0 -36
  67. data/lib/gloo/expr/l_decimal.rb +0 -39
  68. data/lib/gloo/expr/l_integer.rb +0 -37
  69. data/lib/gloo/expr/l_string.rb +0 -58
  70. data/lib/gloo/expr/op_div.rb +0 -22
  71. data/lib/gloo/expr/op_minus.rb +0 -22
  72. data/lib/gloo/expr/op_mult.rb +0 -22
  73. data/lib/gloo/expr/op_plus.rb +0 -24
  74. data/lib/gloo/objs/basic/alias.rb +0 -78
  75. data/lib/gloo/objs/basic/boolean.rb +0 -120
  76. data/lib/gloo/objs/basic/container.rb +0 -76
  77. data/lib/gloo/objs/basic/decimal.rb +0 -76
  78. data/lib/gloo/objs/basic/integer.rb +0 -73
  79. data/lib/gloo/objs/basic/script.rb +0 -99
  80. data/lib/gloo/objs/basic/string.rb +0 -77
  81. data/lib/gloo/objs/basic/text.rb +0 -87
  82. data/lib/gloo/objs/basic/untyped.rb +0 -41
  83. data/lib/gloo/objs/ctrl/each.rb +0 -279
  84. data/lib/gloo/objs/ctrl/repeat.rb +0 -108
  85. data/lib/gloo/objs/data/markdown.rb +0 -84
  86. data/lib/gloo/objs/data/mysql.rb +0 -192
  87. data/lib/gloo/objs/data/query.rb +0 -176
  88. data/lib/gloo/objs/data/sqlite.rb +0 -159
  89. data/lib/gloo/objs/data/table.rb +0 -140
  90. data/lib/gloo/objs/dt/date.rb +0 -50
  91. data/lib/gloo/objs/dt/datetime.rb +0 -62
  92. data/lib/gloo/objs/dt/time.rb +0 -50
  93. data/lib/gloo/objs/ror/erb.rb +0 -116
  94. data/lib/gloo/objs/ror/eval.rb +0 -107
  95. data/lib/gloo/objs/web/http_get.rb +0 -159
  96. data/lib/gloo/objs/web/http_post.rb +0 -183
  97. data/lib/gloo/objs/web/json.rb +0 -135
  98. data/lib/gloo/objs/web/slack.rb +0 -130
  99. data/lib/gloo/objs/web/teams.rb +0 -117
  100. data/lib/gloo/objs/web/uri.rb +0 -148
  101. data/lib/gloo/persist/file_loader.rb +0 -191
  102. data/lib/gloo/persist/file_saver.rb +0 -49
  103. data/lib/gloo/persist/file_storage.rb +0 -45
  104. data/lib/gloo/persist/line_splitter.rb +0 -81
  105. data/lib/gloo/persist/persist_man.rb +0 -120
  106. data/lib/gloo/utils/format.rb +0 -21
  107. data/lib/gloo/utils/stats.rb +0 -205
  108. data/lib/gloo/utils/words.rb +0 -19
  109. data/lib/gloo/verbs/context.rb +0 -62
  110. data/lib/gloo/verbs/create.rb +0 -68
  111. data/lib/gloo/verbs/execute.rb +0 -56
  112. data/lib/gloo/verbs/help.rb +0 -264
  113. data/lib/gloo/verbs/if.rb +0 -92
  114. data/lib/gloo/verbs/list.rb +0 -98
  115. data/lib/gloo/verbs/load.rb +0 -45
  116. data/lib/gloo/verbs/move.rb +0 -89
  117. data/lib/gloo/verbs/put.rb +0 -94
  118. data/lib/gloo/verbs/quit.rb +0 -40
  119. data/lib/gloo/verbs/run.rb +0 -75
  120. data/lib/gloo/verbs/save.rb +0 -39
  121. data/lib/gloo/verbs/show.rb +0 -64
  122. data/lib/gloo/verbs/tell.rb +0 -79
  123. data/lib/gloo/verbs/unless.rb +0 -92
  124. data/lib/gloo/verbs/version.rb +0 -37
  125. data/lib/gloo/verbs/wait.rb +0 -42
@@ -1,81 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # Helper class used as part of file loading.
5
- # It is responsible for splitting a line into components.
6
- #
7
-
8
- module Gloo
9
- module Persist
10
- class LineSplitter
11
-
12
- BEGIN_BLOCK = 'BEGIN'.freeze
13
- END_BLOCK = 'END'.freeze
14
-
15
- attr_reader :obj
16
-
17
- #
18
- # Set up a line splitter
19
- #
20
- def initialize( line, tabs )
21
- @line = line
22
- @tabs = tabs
23
- end
24
-
25
- #
26
- # Split the line into 3 parts.
27
- #
28
- def split
29
- detect_name
30
- detect_type
31
- detect_value
32
-
33
- return @name, @type, @value
34
- end
35
-
36
- #
37
- # Detect the object name.
38
- #
39
- def detect_name
40
- @line = @line.strip
41
- @idx = @line.index( ' ' )
42
- @name = @line[ 0..@idx - 1 ]
43
- end
44
-
45
- #
46
- # Detect the object type.
47
- #
48
- def detect_type
49
- @line = @line[ @idx + 1..-1 ]
50
- @idx = @line.index( ' ' )
51
-
52
- if @line[ 0 ] == ':'
53
- @type = 'untyped'
54
- return
55
- end
56
-
57
- @type = @line[ 0..( @idx ? @idx - 1 : -1 ) ]
58
- @type = @type[ 1..-1 ] if @type[ 0 ] == '['
59
- @type = @type[ 0..-2 ] if @type[ -1 ] == ']'
60
- end
61
-
62
- #
63
- # Detect the object value.
64
- # Use nil if there is no value specified.
65
- #
66
- def detect_value
67
- if @idx
68
- @value = @line[ @idx + 1..-1 ]
69
- if @value[ 0..1 ] == ': '
70
- @value = @value[ 2..-1 ]
71
- elsif @value[ 0 ] == ':'
72
- @value = @value[ 1..-1 ]
73
- end
74
- else
75
- @value = nil
76
- end
77
- end
78
-
79
- end
80
- end
81
- end
@@ -1,120 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
- #
4
- # The persistance manager.
5
- # Keeps a collection of object-file mappings, and then
6
- # uses mappings to know how/where to save updated objects.
7
- #
8
-
9
- module Gloo
10
- module Persist
11
- class PersistMan
12
-
13
- attr_reader :maps
14
-
15
- #
16
- # Contructor for the persistence manager.
17
- #
18
- def initialize
19
- @maps = []
20
- end
21
-
22
- #
23
- # Save one object to the file.
24
- #
25
- def save( name = '' )
26
- if name.nil? || name.strip.empty?
27
- save_all
28
- else
29
- save_one name
30
- end
31
- end
32
-
33
- #
34
- # Save one object to the file.
35
- #
36
- def save_all
37
- @maps.each( &:save )
38
- end
39
-
40
- #
41
- # Save one object to the file.
42
- #
43
- def save_one( name )
44
- ref = Gloo::Core::Pn.new name
45
- obj = ref.resolve
46
- pn = get_full_path_name name
47
- fs = Gloo::Persist::FileStorage.new( pn, obj )
48
- fs.save
49
- end
50
-
51
- #
52
- # Load the object from the file.
53
- #
54
- def load( name )
55
- pns = get_full_path_names name
56
- return unless pns
57
-
58
- pns.each do |pn|
59
- $log.debug "Load file(s) at: #{pn}"
60
- fs = Gloo::Persist::FileStorage.new( pn )
61
- fs.load
62
- @maps << fs
63
- $engine.event_manager.on_load fs.obj
64
- end
65
- end
66
-
67
- #
68
- # Get the full path and name of the file.
69
- #
70
- def get_full_path_names( name )
71
- return nil if name.strip.empty?
72
-
73
- if name.strip[ -1 ] == '*'
74
- pns = []
75
- dir = File.join( $settings.project_path, name[ 0..-2 ] )
76
- Dir.glob( "#{dir}*.gloo" ).each do |f|
77
- pns << f
78
- end
79
- return pns
80
- else
81
- ext_path = File.expand_path( name )
82
- return [ ext_path ] if self.gloo_file?( ext_path )
83
-
84
- full_name = "#{name}#{file_ext}"
85
- return [ File.join( $settings.project_path, full_name ) ]
86
- end
87
- end
88
-
89
- #
90
- # Check to see if a given path name refers to a gloo object file.
91
- #
92
- def gloo_file?( name )
93
- return false unless name
94
- return false unless File.exist?( name )
95
- return false unless File.file?( name )
96
- return false unless name.end_with?( self.file_ext )
97
-
98
- return true
99
- end
100
-
101
- #
102
- # Get the default file extention.
103
- #
104
- def file_ext
105
- return '.gloo'
106
- end
107
-
108
- #
109
- # Print out all object - persistance mappings.
110
- # This is a debugging tool.
111
- #
112
- def show_maps
113
- @maps.each do |o|
114
- puts " \t #{o.pn} \t #{o.obj.name}"
115
- end
116
- end
117
-
118
- end
119
- end
120
- end
@@ -1,21 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # Formatting utilities
5
- #
6
-
7
- module Gloo
8
- module Utils
9
- class Format
10
-
11
- #
12
- # Format number, adding comma separators.
13
- # Ex: 1000 -> 1,000
14
- #
15
- def self.number( num )
16
- return num.to_s.reverse.scan( /.{1,3}/ ).join( ',' ).reverse
17
- end
18
-
19
- end
20
- end
21
- end
@@ -1,205 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # Utilities related to words (strings).
5
- #
6
-
7
- module Gloo
8
- module Utils
9
- class Stats
10
-
11
- DIR_NOT_FOUND_ERR = 'The folder was not found!'.freeze
12
-
13
- # ---------------------------------------------------------------------
14
- # Setup
15
- # ---------------------------------------------------------------------
16
-
17
- #
18
- # Create a stats utility class for the given directory.
19
- #
20
- def initialize( dir, types, skip = [] )
21
- @dir = dir
22
- setup_loc types
23
- @skip = skip
24
- end
25
-
26
- # ---------------------------------------------------------------------
27
- # Public Functions
28
- # ---------------------------------------------------------------------
29
-
30
- #
31
- # Is the stats utility valid?
32
- # Does it have a valid root directory.
33
- #
34
- def valid?
35
- return true if @dir && File.directory?( @dir )
36
-
37
- $engine.err DIR_NOT_FOUND_ERR
38
- $engine.heap.it.set_to false
39
-
40
- return false
41
- end
42
-
43
- #
44
- # Show all stat data for the project.
45
- #
46
- def show_all
47
- return unless valid?
48
-
49
- generate
50
- puts "Showing All stats for #{@dir}".white
51
- puts "\n ** #{@dir_cnt} Total Folders ** "
52
- puts " ** #{@file_cnt} Total Files ** "
53
-
54
- busy_folders( 7 )
55
- file_types
56
- loc
57
- end
58
-
59
- #
60
- # Get a list of the busiest folders.
61
- # Count is how many results we want.
62
- #
63
- def busy_folders( count = 17 )
64
- return unless valid?
65
-
66
- generate
67
- puts "\nBusy Folders:".yellow
68
-
69
- @folders.sort! { |a, b| a[ :cnt ] <=> b[ :cnt ] }
70
- @folders.reverse!
71
- @folders[ 0..count ].each do |f|
72
- puts " #{f[ :cnt ]} - #{f[ :name ]}"
73
- end
74
- end
75
-
76
- #
77
- # Show file types and how many of each there are.
78
- #
79
- def file_types
80
- return unless valid?
81
-
82
- generate
83
- puts "\nFiles by Type:".yellow
84
-
85
- @types = @types.sort_by( &:last )
86
- @types.reverse!
87
- @types.each do |o|
88
- puts " #{o[ 1 ]} - #{o[ 0 ]}" unless o[ 0 ].empty?
89
- end
90
- end
91
-
92
- #
93
- # Show Lines of Code
94
- #
95
- def loc
96
- return unless valid?
97
-
98
- generate
99
- total = 0
100
-
101
- @loc.each do |k, v|
102
- puts "\n #{k} Lines of Code".yellow
103
- total += v[ :lines ]
104
- formatted = Gloo::Utils::Format.number( v[ :lines ] )
105
- puts " ** #{formatted} in #{v[ :files ].count} #{k} files ** "
106
-
107
- puts "\n Busy #{k} files:".yellow
108
- files = v[ :files ].sort! { |a, b| a[ :lines ] <=> b[ :lines ] }
109
- files.reverse!
110
- files[ 0..12 ].each do |f|
111
- puts " #{f[ :lines ]} - #{f[ :file ]}"
112
- end
113
- end
114
-
115
- formatted = Gloo::Utils::Format.number( total )
116
- puts "\n #{formatted} Total Lines of Code".white
117
- end
118
-
119
- # ---------------------------------------------------------------------
120
- # Private Functions
121
- # ---------------------------------------------------------------------
122
-
123
- #
124
- # Setup counters for lines of code by file type.
125
- def setup_loc( types )
126
- @loc = {}
127
-
128
- types.split( ' ' ).each do |t|
129
- @loc[ t ] = { lines: 0, files: [] }
130
- end
131
- end
132
-
133
- #
134
- # Generate stat data unless we've already done so.
135
- #
136
- def generate
137
- return if @folders
138
-
139
- $log.debug 'Generating...'
140
- @folders = []
141
- @types = {}
142
- @file_cnt = 0
143
- @dir_cnt = 0
144
-
145
- generate_for Pathname.new( @dir )
146
- end
147
-
148
- #
149
- # Generate data for the given path.
150
- # NOTE: this is a recursive function.
151
- # It traverses all sub-direcctories.
152
- #
153
- def generate_for( path )
154
- return if @skip.include?( File.basename( path ) )
155
-
156
- cnt = 0
157
- path.children.each do |f|
158
- if f.directory?
159
- @dir_cnt += 1
160
- generate_for( f )
161
- else
162
- @file_cnt += 1
163
- cnt += 1
164
- handle_file( f )
165
- inc_type( File.extname( f ) )
166
- end
167
- end
168
- @folders << { name: path, cnt: cnt }
169
- end
170
-
171
- #
172
- # Increment the file count.
173
- #
174
- def inc_type( type )
175
- if @types[ type ]
176
- @types[ type ] += 1
177
- else
178
- @types[ type ] = 1
179
- end
180
- end
181
-
182
- #
183
- # Consider code file types.
184
- #
185
- def handle_file( file )
186
- ext = File.extname( file )
187
- return unless ext
188
-
189
- ext = ext[ 1..-1 ]
190
- return unless @loc.key?( ext )
191
-
192
- lines = count_lines( file )
193
- @loc[ ext ][ :lines ] += lines
194
- @loc[ ext ][ :files ] << { lines: lines, file: file }
195
- end
196
-
197
- #
198
- # Count lines of code in file.
199
- def count_lines( file )
200
- return `wc -l #{file}`.split.first.to_i
201
- end
202
-
203
- end
204
- end
205
- end
@@ -1,19 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
- #
4
- # Utilities related to words (strings).
5
- #
6
-
7
- require 'active_support/inflector'
8
-
9
- module Gloo
10
- module Utils
11
- class Words
12
-
13
- def self.pluralize( word )
14
- return word.pluralize
15
- end
16
-
17
- end
18
- end
19
- end
@@ -1,62 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
- #
4
- # Set the current context pointer.
5
- # Alternatively if no value is provided, just show the context.
6
- #
7
-
8
- module Gloo
9
- module Verbs
10
- class Context < Gloo::Core::Verb
11
-
12
- KEYWORD = 'context'.freeze
13
- KEYWORD_SHORT = '@'.freeze
14
-
15
- #
16
- # Run the verb.
17
- #
18
- def run
19
- set_context if @tokens.token_count > 1
20
- show_context
21
- end
22
-
23
- #
24
- # Show the current context.
25
- #
26
- def show_context
27
- $log.show "Context: #{$engine.heap.context}"
28
- end
29
-
30
- #
31
- # Get the Verb's keyword.
32
- #
33
- def self.keyword
34
- return KEYWORD
35
- end
36
-
37
- #
38
- # Get the Verb's keyword shortcut.
39
- #
40
- def self.keyword_shortcut
41
- return KEYWORD_SHORT
42
- end
43
-
44
- # ---------------------------------------------------------------------
45
- # Private functions
46
- # ---------------------------------------------------------------------
47
-
48
- private
49
-
50
- #
51
- # Set the context to the given path.
52
- #
53
- def set_context
54
- path = @tokens.second
55
- $engine.heap.context.set_to path
56
- $engine.heap.it.set_to path
57
- $log.debug "Context set to #{$engine.heap.context}"
58
- end
59
-
60
- end
61
- end
62
- end
@@ -1,68 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2019 Eric Crane. All rights reserved.
3
- #
4
- # Create an object, optionally of a type.
5
- #
6
-
7
- module Gloo
8
- module Verbs
9
- class Create < Gloo::Core::Verb
10
-
11
- KEYWORD = 'create'.freeze
12
- KEYWORD_SHORT = '`'.freeze
13
- AS = 'as'.freeze
14
- VAL = ':'.freeze
15
- NO_NAME_ERR = 'Object name is missing!'.freeze
16
-
17
- #
18
- # Run the verb.
19
- #
20
- def run
21
- name = @tokens.second
22
- type = @tokens.after_token( AS )
23
- value = @tokens.after_token( VAL )
24
-
25
- unless name
26
- $engine.err NO_NAME_ERR
27
- return
28
- end
29
- create name, type, value
30
- end
31
-
32
- #
33
- # Get the Verb's keyword.
34
- #
35
- def self.keyword
36
- return KEYWORD
37
- end
38
-
39
- #
40
- # Get the Verb's keyword shortcut.
41
- #
42
- def self.keyword_shortcut
43
- return KEYWORD_SHORT
44
- end
45
-
46
- # ---------------------------------------------------------------------
47
- # Private functions
48
- # ---------------------------------------------------------------------
49
-
50
- private
51
-
52
- #
53
- # Create an object with given name of given type with
54
- # the given initial value.
55
- #
56
- def create( name, type, value )
57
- if Gloo::Expr::LString.string?( value )
58
- value = Gloo::Expr::LString.strip_quotes( value )
59
- end
60
- obj = $engine.factory.create( { name: name, type: type, value: value } )
61
-
62
- obj.add_default_children if obj&.add_children_on_create?
63
- $engine.heap.it.set_to value
64
- end
65
-
66
- end
67
- end
68
- end
@@ -1,56 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # Execute a shell command.
5
- #
6
-
7
- module Gloo
8
- module Verbs
9
- class Execute < Gloo::Core::Verb
10
-
11
- KEYWORD = 'execute'.freeze
12
- KEYWORD_SHORT = 'exec'.freeze
13
- MISSING_EXPR_ERR = 'Missing Expression!'.freeze
14
-
15
- #
16
- # Run the verb.
17
- #
18
- def run
19
- if @tokens.token_count < 2
20
- $engine.err MISSING_EXPR_ERR
21
- return
22
- end
23
-
24
- expr = Gloo::Expr::Expression.new( @tokens.params )
25
- cmd = expr.evaluate
26
- $log.debug "starting cmd: #{cmd}"
27
-
28
- pid = fork { exec( cmd ) }
29
- Process.wait pid
30
-
31
- # pid = spawn cmd
32
- # Process.wait pid
33
- $log.debug "done executing cmd: #{cmd}"
34
-
35
- # system expr.evaluate #, chdir: Dir.pwd
36
- # `#{expr.evaluate}`
37
- # exec expr.evaluate
38
- end
39
-
40
- #
41
- # Get the Verb's keyword.
42
- #
43
- def self.keyword
44
- return KEYWORD
45
- end
46
-
47
- #
48
- # Get the Verb's keyword shortcut.
49
- #
50
- def self.keyword_shortcut
51
- return KEYWORD_SHORT
52
- end
53
-
54
- end
55
- end
56
- end