gloo 4.7.0 → 5.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/gloo.gemspec +22 -11
  4. data/lib/VERSION +1 -1
  5. data/lib/VERSION_NOTES +7 -0
  6. data/lib/gloo/app/engine.rb +3 -2
  7. data/lib/gloo/app/running_app.rb +13 -0
  8. data/lib/gloo/core/dictionary.rb +13 -2
  9. data/lib/gloo/objs/ctrl/each.rb +2 -2
  10. data/lib/gloo/{ext → plugin}/base.rb +1 -1
  11. data/lib/gloo/{ext → plugin}/callback.rb +2 -3
  12. data/lib/gloo/{ext/manager.rb → plugin/ext_manager.rb} +2 -2
  13. data/lib/gloo/plugin/lib_manager.rb +97 -0
  14. data/lib/gloo/verbs/exists.rb +75 -0
  15. data/lib/gloo/verbs/help.rb +28 -0
  16. data/lib/gloo/verbs/load.rb +8 -2
  17. data/lib/gloo/verbs/redirect.rb +2 -1
  18. metadata +38 -164
  19. data/lib/gloo/objs/cli/colorize.rb +0 -73
  20. data/lib/gloo/objs/cli/confirm.rb +0 -96
  21. data/lib/gloo/objs/cli/menu.rb +0 -370
  22. data/lib/gloo/objs/cli/menu_item.rb +0 -95
  23. data/lib/gloo/objs/cli/prompt.rb +0 -110
  24. data/lib/gloo/objs/cli/select.rb +0 -127
  25. data/lib/gloo/objs/ctrl/each_repo.rb +0 -84
  26. data/lib/gloo/objs/data/markdown.rb +0 -133
  27. data/lib/gloo/objs/data/markdown_ext.rb +0 -260
  28. data/lib/gloo/objs/data/mysql.rb +0 -254
  29. data/lib/gloo/objs/data/query.rb +0 -269
  30. data/lib/gloo/objs/data/query_result.rb +0 -158
  31. data/lib/gloo/objs/data/sqlite.rb +0 -174
  32. data/lib/gloo/objs/data/table.rb +0 -267
  33. data/lib/gloo/objs/dev/git.rb +0 -140
  34. data/lib/gloo/objs/dev/stats.rb +0 -123
  35. data/lib/gloo/objs/system/ssh_exec.rb +0 -126
  36. data/lib/gloo/objs/web_svr/element.rb +0 -254
  37. data/lib/gloo/objs/web_svr/field.rb +0 -429
  38. data/lib/gloo/objs/web_svr/form.rb +0 -271
  39. data/lib/gloo/objs/web_svr/page.rb +0 -562
  40. data/lib/gloo/objs/web_svr/partial.rb +0 -210
  41. data/lib/gloo/objs/web_svr/svr.rb +0 -713
  42. data/lib/gloo/utils/stats.rb +0 -206
  43. data/lib/gloo/web_svr/asset.rb +0 -407
  44. data/lib/gloo/web_svr/asset_info.rb +0 -116
  45. data/lib/gloo/web_svr/config.rb +0 -56
  46. data/lib/gloo/web_svr/embedded_renderer.rb +0 -154
  47. data/lib/gloo/web_svr/handler.rb +0 -154
  48. data/lib/gloo/web_svr/request.rb +0 -143
  49. data/lib/gloo/web_svr/request_params.rb +0 -181
  50. data/lib/gloo/web_svr/response.rb +0 -177
  51. data/lib/gloo/web_svr/response_code.rb +0 -69
  52. data/lib/gloo/web_svr/routing/resource_router.rb +0 -47
  53. data/lib/gloo/web_svr/routing/router.rb +0 -232
  54. data/lib/gloo/web_svr/routing/show_routes.rb +0 -94
  55. data/lib/gloo/web_svr/server.rb +0 -105
  56. data/lib/gloo/web_svr/session.rb +0 -215
  57. data/lib/gloo/web_svr/table_renderer.rb +0 -151
  58. data/lib/gloo/web_svr/web_method.rb +0 -54
  59. /data/lib/gloo/objs/{security → str_utils}/cipher.rb +0 -0
  60. /data/lib/gloo/objs/{security → str_utils}/csrf_token.rb +0 -0
  61. /data/lib/gloo/objs/{security → str_utils}/password.rb +0 -0
  62. /data/lib/gloo/objs/{ror → system}/erb.rb +0 -0
  63. /data/lib/gloo/objs/{ror → system}/eval.rb +0 -0
@@ -1,206 +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( engine, dir, types, skip = [] )
21
- @engine = engine
22
- @dir = dir
23
- setup_loc types
24
- @skip = skip
25
- end
26
-
27
- # ---------------------------------------------------------------------
28
- # Public Functions
29
- # ---------------------------------------------------------------------
30
-
31
- #
32
- # Is the stats utility valid?
33
- # Does it have a valid root directory.
34
- #
35
- def valid?
36
- return true if @dir && File.directory?( @dir )
37
-
38
- @engine.err DIR_NOT_FOUND_ERR
39
- @engine.heap.it.set_to false
40
-
41
- return false
42
- end
43
-
44
- #
45
- # Show all stat data for the project.
46
- #
47
- def show_all
48
- return unless valid?
49
-
50
- generate
51
- puts "Showing All stats for #{@dir}".white
52
- puts "\n ** #{@dir_cnt} Total Folders ** "
53
- puts " ** #{@file_cnt} Total Files ** "
54
-
55
- busy_folders( 7 )
56
- file_types
57
- loc
58
- end
59
-
60
- #
61
- # Get a list of the busiest folders.
62
- # Count is how many results we want.
63
- #
64
- def busy_folders( count = 17 )
65
- return unless valid?
66
-
67
- generate
68
- puts "\nBusy Folders:".yellow
69
-
70
- @folders.sort! { |a, b| a[ :cnt ] <=> b[ :cnt ] }
71
- @folders.reverse!
72
- @folders[ 0..count ].each do |f|
73
- puts " #{f[ :cnt ]} - #{f[ :name ]}"
74
- end
75
- end
76
-
77
- #
78
- # Show file types and how many of each there are.
79
- #
80
- def file_types
81
- return unless valid?
82
-
83
- generate
84
- puts "\nFiles by Type:".yellow
85
-
86
- @types = @types.sort_by( &:last )
87
- @types.reverse!
88
- @types.each do |o|
89
- puts " #{o[ 1 ]} - #{o[ 0 ]}" unless o[ 0 ].empty?
90
- end
91
- end
92
-
93
- #
94
- # Show Lines of Code
95
- #
96
- def loc
97
- return unless valid?
98
-
99
- generate
100
- total = 0
101
-
102
- @loc.each do |k, v|
103
- puts "\n #{k} Lines of Code".yellow
104
- total += v[ :lines ]
105
- formatted = Gloo::Utils::Format.number( v[ :lines ] )
106
- puts " ** #{formatted} in #{v[ :files ].count} #{k} files ** "
107
-
108
- puts "\n Busy #{k} files:".yellow
109
- files = v[ :files ].sort! { |a, b| a[ :lines ] <=> b[ :lines ] }
110
- files.reverse!
111
- files[ 0..12 ].each do |f|
112
- puts " #{f[ :lines ]} - #{f[ :file ]}"
113
- end
114
- end
115
-
116
- formatted = Gloo::Utils::Format.number( total )
117
- puts "\n #{formatted} Total Lines of Code".white
118
- end
119
-
120
- # ---------------------------------------------------------------------
121
- # Private Functions
122
- # ---------------------------------------------------------------------
123
-
124
- #
125
- # Setup counters for lines of code by file type.
126
- def setup_loc( types )
127
- @loc = {}
128
-
129
- types.split( ' ' ).each do |t|
130
- @loc[ t ] = { lines: 0, files: [] }
131
- end
132
- end
133
-
134
- #
135
- # Generate stat data unless we've already done so.
136
- #
137
- def generate
138
- return if @folders
139
-
140
- @engine.log.debug 'Generating...'
141
- @folders = []
142
- @types = {}
143
- @file_cnt = 0
144
- @dir_cnt = 0
145
-
146
- generate_for Pathname.new( @dir )
147
- end
148
-
149
- #
150
- # Generate data for the given path.
151
- # NOTE: this is a recursive function.
152
- # It traverses all sub-direcctories.
153
- #
154
- def generate_for( path )
155
- return if @skip.include?( File.basename( path ) )
156
-
157
- cnt = 0
158
- path.children.each do |f|
159
- if f.directory?
160
- @dir_cnt += 1
161
- generate_for( f )
162
- else
163
- @file_cnt += 1
164
- cnt += 1
165
- handle_file( f )
166
- inc_type( File.extname( f ) )
167
- end
168
- end
169
- @folders << { name: path, cnt: cnt }
170
- end
171
-
172
- #
173
- # Increment the file count.
174
- #
175
- def inc_type( type )
176
- if @types[ type ]
177
- @types[ type ] += 1
178
- else
179
- @types[ type ] = 1
180
- end
181
- end
182
-
183
- #
184
- # Consider code file types.
185
- #
186
- def handle_file( file )
187
- ext = File.extname( file )
188
- return unless ext
189
-
190
- ext = ext[ 1..-1 ]
191
- return unless @loc.key?( ext )
192
-
193
- lines = count_lines( file )
194
- @loc[ ext ][ :lines ] += lines
195
- @loc[ ext ][ :files ] << { lines: lines, file: file }
196
- end
197
-
198
- #
199
- # Count lines of code in file.
200
- def count_lines( file )
201
- return `wc -l #{file}`.split.first.to_i
202
- end
203
-
204
- end
205
- end
206
- end
@@ -1,407 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2024 Eric Crane. All rights reserved.
3
- #
4
- # A helper class for static assets.
5
- #
6
-
7
- module Gloo
8
- module WebSvr
9
- class Asset
10
-
11
- LIB_FOLDER = 'lib'.freeze
12
- ASSET_FOLDER = 'asset'.freeze
13
- IMAGE_FOLDER = 'image'.freeze
14
- STYLESHEET_FOLDER = 'stylesheet'.freeze
15
- JAVASCRIPT_FOLDER = 'javascript'.freeze
16
-
17
- CSS_TYPE = 'text/css'.freeze
18
- JS_TYPE = 'text/javascript'.freeze
19
-
20
- IMAGE_TYPE = 'image/'.freeze
21
- FAVICON_TYPE = 'image/x-icon'.freeze
22
-
23
-
24
- # ---------------------------------------------------------------------
25
- # Initialization
26
- # ---------------------------------------------------------------------
27
-
28
- #
29
- # Set up the web server.
30
- #
31
- def initialize( engine, web_svr_obj )
32
- @engine = engine
33
- @log = @engine.log
34
-
35
- @web_svr_obj = web_svr_obj
36
- end
37
-
38
-
39
- # ---------------------------------------------------------------------
40
- # lib asset Helpers
41
- # ---------------------------------------------------------------------
42
-
43
- #
44
- # Get the asset folder in the User's lib.
45
- # Returns nil if it does not exist.
46
- #
47
- def lib_asset_folder
48
- dir = File.join( @engine.settings.user_root, LIB_FOLDER, ASSET_FOLDER )
49
- return dir if Dir.exist?( dir )
50
-
51
- return nil
52
- end
53
-
54
- #
55
- # Get the stylesheets folder in the User's lib.
56
- # Returns nil if it does not exist.
57
- #
58
- def lib_stylesheet_folder
59
- dir = File.join( lib_asset_folder, STYLESHEET_FOLDER )
60
- return dir if Dir.exist?( dir )
61
-
62
- return nil
63
- end
64
-
65
- #
66
- # Get the javascript folder in the User's lib.
67
- # Returns nil if it does not exist.
68
- #
69
- def lib_javascript_folder
70
- dir = File.join( lib_asset_folder, JAVASCRIPT_FOLDER )
71
- return dir if Dir.exist?( dir )
72
-
73
- return nil
74
- end
75
-
76
- #
77
- # Get the images folder in the User's lib.
78
- # Returns nil if it does not exist.
79
- #
80
- def lib_image_folder
81
- dir = File.join( lib_asset_folder, IMAGE_FOLDER )
82
- return dir if Dir.exist?( dir )
83
-
84
- return nil
85
- end
86
-
87
-
88
- # ---------------------------------------------------------------------
89
- # Asset Helpers
90
- # ---------------------------------------------------------------------
91
-
92
- #
93
- # Get the asset folder in the project.
94
- #
95
- def asset_folder
96
- return File.join( @engine.settings.project_path, ASSET_FOLDER )
97
- end
98
-
99
- #
100
- # Get the images folder in the project.
101
- #
102
- def image_folder
103
- return File.join( asset_folder, IMAGE_FOLDER )
104
- end
105
-
106
- #
107
- # Get the stylesheets folder in the project.
108
- #
109
- def stylesheet_folder
110
- return File.join( asset_folder, STYLESHEET_FOLDER )
111
- end
112
-
113
- #
114
- # Get the stylesheets folder in the project.
115
- #
116
- def javascript_folder
117
- return File.join( asset_folder, JAVASCRIPT_FOLDER )
118
- end
119
-
120
- #
121
- # Find and return the page for the given route.
122
- #
123
- def path_for_file file
124
- pn = file.value
125
-
126
- # Is the file's value a recognizable file?
127
- return pn if File.exist? pn
128
-
129
- # Look in the web server's asset folder.
130
- pn = File.join( asset_folder, pn )
131
-
132
- # Try the lib assets if not found
133
- unless File.exist? pn
134
- lib = lib_asset_folder
135
- pn = File.join( lib, file.value ) if lib
136
- end
137
-
138
- return pn
139
- end
140
-
141
- #
142
- # Get the return type for the given file.
143
- #
144
- def type_for_file file
145
- ext = File.extname( file ).downcase
146
- ext = ext[1..-1] if ext[0] == '.'
147
-
148
- if ext == 'css'
149
- return CSS_TYPE
150
- elsif ext == 'js'
151
- return JS_TYPE
152
- elsif ext == 'ico'
153
- return FAVICON_TYPE
154
- else
155
- return "#{IMAGE_TYPE}#{ext}"
156
- end
157
- end
158
-
159
-
160
- # ---------------------------------------------------------------------
161
- # Render Asset
162
- # ---------------------------------------------------------------------
163
-
164
- #
165
- # Helper to create a successful image response with the given data.
166
- #
167
- def render_file( file )
168
- type = type_for_file file
169
- data = File.binread file
170
- code = Gloo::WebSvr::ResponseCode::SUCCESS
171
-
172
- return Gloo::WebSvr::Response.new( @engine, code, type, data, true )
173
- end
174
-
175
- #
176
- # Check if the given name is an asset.
177
- #
178
- def is_asset? name
179
- return name == ASSET_FOLDER
180
- end
181
-
182
-
183
- # ---------------------------------------------------------------------
184
- # Asset with Fingerprints
185
- # ---------------------------------------------------------------------
186
-
187
- #
188
- # Register an asset with the web server.
189
- # Adds fingerprint to the file names for later access.
190
- #
191
- # full_path is the FILE from which we build the SHA256 hash
192
- # pn is the path and name within the assets directory
193
- # name is the simple file name (icon.png)
194
- #
195
- def register_asset name, pn, full_path
196
- asset_pn = "/asset/#{pn}"
197
- return AssetInfo.new( @engine, full_path, name, asset_pn ).register
198
- end
199
-
200
- #
201
- # Get the published name for the given asset name.
202
- #
203
- def published_name asset_name
204
- return AssetInfo.find_published_name_for( asset_name )
205
- end
206
-
207
-
208
- # ---------------------------------------------------------------------
209
- # Dynamic Add Assets
210
- # ---------------------------------------------------------------------
211
-
212
- #
213
- # Add all asssets to the web server pages (routes).
214
- #
215
- def add_asset_routes
216
- return unless File.exist? asset_folder
217
-
218
- @log.debug 'Adding asset routes to web server…'
219
- @factory = @engine.factory
220
-
221
- add_containers
222
- add_images
223
- add_stylesheets
224
- add_javascript
225
- end
226
-
227
- #
228
- # Create the containers for the assets if they do not exist.
229
- #
230
- def add_containers
231
- pages = @web_svr_obj.pages_container
232
-
233
- @assets = pages.find_child( ASSET_FOLDER ) ||
234
- @factory.create_can( ASSET_FOLDER, pages )
235
-
236
- @images = @assets.find_child( IMAGE_FOLDER ) ||
237
- @factory.create_can( IMAGE_FOLDER, @assets )
238
-
239
- @stylesheets = @assets.find_child( STYLESHEET_FOLDER ) ||
240
- @factory.create_can( STYLESHEET_FOLDER, @assets )
241
-
242
- @javascript = @assets.find_child( JAVASCRIPT_FOLDER ) ||
243
- @factory.create_can( JAVASCRIPT_FOLDER, @assets )
244
- end
245
-
246
- #
247
- # Traverse the given folder and add all files to the container.
248
- # This is a recursive method and look look for files in subfolders.
249
- #
250
- def add_files_in_folder( folder, container, path )
251
- Dir.each_child( folder ) do |name|
252
- pn = File.join( path, name )
253
- full_path = File.join( folder, name )
254
-
255
- if File.directory? full_path
256
- child = container.find_child( name )
257
- child = @factory.create_can( name, container ) if child.nil?
258
-
259
- add_files_in_folder( full_path, child, pn )
260
- else
261
- info = register_asset( name, pn, full_path )
262
- add_file_obj( container, name, pn, info )
263
- end
264
- end
265
- end
266
-
267
- #
268
- # Add the images to the web server pages.
269
- #
270
- def add_images
271
- @log.debug 'Adding image asset routes to web server…'
272
-
273
- lib = lib_image_folder
274
- if lib
275
- add_files_in_folder( lib, @images, IMAGE_FOLDER )
276
- end
277
-
278
- return unless File.exist? image_folder
279
-
280
- # for each file in the images folder
281
- # create a file object and add it to the images container
282
- add_files_in_folder( image_folder, @images, IMAGE_FOLDER )
283
- end
284
-
285
- #
286
- # Add the stylesheets to the web server pages.
287
- #
288
- def add_stylesheets
289
- @log.debug 'Adding stylesheet asset routes to web server…'
290
-
291
- lib = lib_stylesheet_folder
292
- if lib
293
- add_files_in_folder( lib, @stylesheets, STYLESHEET_FOLDER )
294
- end
295
-
296
- return unless File.exist? stylesheet_folder
297
-
298
- # for each file in the stylesheets folder
299
- # create a file object and add it to the stylesheets container
300
- add_files_in_folder( stylesheet_folder, @stylesheets, STYLESHEET_FOLDER )
301
-
302
- # Dir.each_child( stylesheet_folder ) do |name|
303
- # pn = File.join( STYLESHEET_FOLDER, name )
304
- # add_file_obj( @stylesheets, name, pn )
305
- # end
306
- end
307
-
308
- #
309
- # Add the Javascript files to the web server pages.
310
- #
311
- def add_javascript
312
- @log.debug 'Adding javascript asset routes to web server…'
313
-
314
- lib = lib_javascript_folder
315
- if lib
316
- add_files_in_folder( lib, @javascript, JAVASCRIPT_FOLDER )
317
- end
318
-
319
- return unless File.exist? javascript_folder
320
-
321
- # for each file in the javascript folder
322
- # create a file object and add it to the javascript container
323
- add_files_in_folder( javascript_folder, @javascript, JAVASCRIPT_FOLDER )
324
-
325
- # Dir.each_child( javascript_folder ) do |name|
326
- # pn = File.join( JAVASCRIPT_FOLDER, name )
327
- # add_file_obj( @javascript, name, pn )
328
- # end
329
- end
330
-
331
- #
332
- # Add a file object (page route) to the given container.
333
- #
334
- def add_file_obj( can, name, pn, info )
335
- name = name.gsub( '.', '_' )
336
- @log.debug "Adding route for file: #{name}"
337
-
338
- # First make sure the child doesn't already exist.
339
- child = can.find_child( name )
340
- return if child
341
-
342
- @factory.create_file( name, pn, can )
343
- # @factory.create_file( info.published_name, pn, can )
344
- end
345
-
346
-
347
- # ---------------------------------------------------------------------
348
- # List Asset Helpers
349
- # ---------------------------------------------------------------------
350
-
351
- #
352
- # List all image assets.
353
- # This looks in the image container and lists the images found earlier.
354
- # A Debugging tool.
355
- #
356
- def list_image_assets
357
- data = []
358
- @images.children.each do |o|
359
- data << [ o.name, o.pn, o.value ]
360
- end
361
- headers = [ "Name", "PN", "Value" ]
362
-
363
- puts Gloo::App::Platform::RETURN
364
- title = "Image Assets with Routes"
365
- @engine.platform.table.show headers, data, title
366
- puts Gloo::App::Platform::RETURN
367
- end
368
-
369
- #
370
- # List all js assets.
371
- # This looks in the js container and lists the js files found earlier.
372
- # A Debugging tool.
373
- #
374
- def list_js_assets
375
- data = []
376
- @javascript.children.each do |o|
377
- data << [ o.name, o.pn, o.value ]
378
- end
379
- headers = [ "Name", "PN", "Value" ]
380
-
381
- puts Gloo::App::Platform::RETURN
382
- title = "JavaScript Assets with Routes"
383
- @engine.platform.table.show headers, data, title
384
- puts Gloo::App::Platform::RETURN
385
- end
386
-
387
- #
388
- # List all css assets.
389
- # This looks in the css container and lists the css files found earlier.
390
- # A Debugging tool.
391
- #
392
- def list_css_assets
393
- data = []
394
- @stylesheets.children.each do |o|
395
- data << [ o.name, o.pn, o.value ]
396
- end
397
- headers = [ "Name", "PN", "Value" ]
398
-
399
- puts Gloo::App::Platform::RETURN
400
- title = "Stylesheet Assets with Routes"
401
- @engine.platform.table.show headers, data, title
402
- puts Gloo::App::Platform::RETURN
403
- end
404
-
405
- end
406
- end
407
- end