Class: Gloo::WebSvr::Asset

Inherits:
Object
  • Object
show all
Defined in:
lib/gloo/web_svr/asset.rb

Constant Summary collapse

LIB_FOLDER =
'lib'.freeze
ASSET_FOLDER =
'asset'.freeze
IMAGE_FOLDER =
'image'.freeze
STYLESHEET_FOLDER =
'stylesheet'.freeze
JAVASCRIPT_FOLDER =
'javascript'.freeze
CSS_TYPE =
'text/css'.freeze
JS_TYPE =
'text/javascript'.freeze
IMAGE_TYPE =
'image/'.freeze
FAVICON_TYPE =
'image/x-icon'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(engine, web_svr_obj) ⇒ Asset

Set up the web server.



31
32
33
34
35
36
# File 'lib/gloo/web_svr/asset.rb', line 31

def initialize( engine, web_svr_obj )
  @engine = engine
  @log = @engine.log

  @web_svr_obj = web_svr_obj
end

Instance Method Details

#add_asset_routesObject

Add all asssets to the web server pages (routes).



215
216
217
218
219
220
221
222
223
224
225
# File 'lib/gloo/web_svr/asset.rb', line 215

def add_asset_routes
  return unless File.exist? asset_folder

  @log.debug 'Adding asset routes to web server…'
  @factory = @engine.factory

  add_containers
  add_images
  add_stylesheets
  add_javascript
end

#add_containersObject

Create the containers for the assets if they do not exist.



230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
# File 'lib/gloo/web_svr/asset.rb', line 230

def add_containers
  pages = @web_svr_obj.pages_container

  @assets = pages.find_child( ASSET_FOLDER ) || 
    @factory.create_can( ASSET_FOLDER, pages )

  @images = @assets.find_child( IMAGE_FOLDER ) || 
    @factory.create_can( IMAGE_FOLDER, @assets )

  @stylesheets = @assets.find_child( STYLESHEET_FOLDER ) || 
    @factory.create_can( STYLESHEET_FOLDER, @assets )

  @javascript = @assets.find_child( JAVASCRIPT_FOLDER ) || 
    @factory.create_can( JAVASCRIPT_FOLDER, @assets )
end

#add_file_obj(can, name, pn, info) ⇒ Object

Add a file object (page route) to the given container.



334
335
336
337
338
339
340
341
342
343
344
# File 'lib/gloo/web_svr/asset.rb', line 334

def add_file_obj( can, name, pn, info )
  name = name.gsub( '.', '_' )
  @log.debug "Adding route for file: #{name}"

  # First make sure the child doesn't already exist.
  child = can.find_child( name )
  return if child

  @factory.create_file( name, pn, can )
  # @factory.create_file( info.published_name, pn, can )
end

#add_files_in_folder(folder, container, path) ⇒ Object

Traverse the given folder and add all files to the container. This is a recursive method and look look for files in subfolders.



250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/gloo/web_svr/asset.rb', line 250

def add_files_in_folder( folder, container, path )
  Dir.each_child( folder ) do |name|
    pn = File.join( path, name )
    full_path = File.join( folder, name )

    if File.directory? full_path
      child = container.find_child( name )
      child = @factory.create_can( name, container ) if child.nil?

      add_files_in_folder( full_path, child, pn )
    else
      info = register_asset( name, pn, full_path )
      add_file_obj( container, name, pn, info )
    end
  end
end

#add_imagesObject

Add the images to the web server pages.



270
271
272
273
274
275
276
277
278
279
280
281
282
283
# File 'lib/gloo/web_svr/asset.rb', line 270

def add_images
  @log.debug 'Adding image asset routes to web server…'
  
  lib = lib_image_folder
  if lib
    add_files_in_folder( lib, @images, IMAGE_FOLDER )
  end

  return unless File.exist? image_folder

  # for each file in the images folder
  # create a file object and add it to the images container
  add_files_in_folder( image_folder, @images, IMAGE_FOLDER )
end

#add_javascriptObject

Add the Javascript files to the web server pages.



311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
# File 'lib/gloo/web_svr/asset.rb', line 311

def add_javascript
  @log.debug 'Adding javascript asset routes to web server…'

  lib = lib_javascript_folder
  if lib
    add_files_in_folder( lib, @javascript, JAVASCRIPT_FOLDER )
  end

  return unless File.exist? javascript_folder

  # for each file in the javascript folder
  # create a file object and add it to the javascript container
  add_files_in_folder( javascript_folder, @javascript, JAVASCRIPT_FOLDER )

  # Dir.each_child( javascript_folder ) do |name|
  #   pn = File.join( JAVASCRIPT_FOLDER, name )
  #   add_file_obj( @javascript, name, pn )
  # end
end

#add_stylesheetsObject

Add the stylesheets to the web server pages.



288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
# File 'lib/gloo/web_svr/asset.rb', line 288

def add_stylesheets
  @log.debug 'Adding stylesheet asset routes to web server…'

  lib = lib_stylesheet_folder
  if lib
    add_files_in_folder( lib, @stylesheets, STYLESHEET_FOLDER )
  end

  return unless File.exist? stylesheet_folder

  # for each file in the stylesheets folder
  # create a file object and add it to the stylesheets container
  add_files_in_folder( stylesheet_folder, @stylesheets, STYLESHEET_FOLDER )

  # Dir.each_child( stylesheet_folder ) do |name|
  #   pn = File.join( STYLESHEET_FOLDER, name )
  #   add_file_obj( @stylesheets, name, pn )
  # end
end

#asset_folderObject

Get the asset folder in the project.



95
96
97
# File 'lib/gloo/web_svr/asset.rb', line 95

def asset_folder
  return File.join( @engine.settings.project_path, ASSET_FOLDER )
end

#image_folderObject

Get the images folder in the project.



102
103
104
# File 'lib/gloo/web_svr/asset.rb', line 102

def image_folder
  return File.join( asset_folder, IMAGE_FOLDER )
end

#is_asset?(name) ⇒ Boolean

Check if the given name is an asset.

Returns:

  • (Boolean)


178
179
180
# File 'lib/gloo/web_svr/asset.rb', line 178

def is_asset? name
  return name == ASSET_FOLDER
end

#javascript_folderObject

Get the stylesheets folder in the project.



116
117
118
# File 'lib/gloo/web_svr/asset.rb', line 116

def javascript_folder
  return File.join( asset_folder, JAVASCRIPT_FOLDER )
end

#lib_asset_folderObject

Get the asset folder in the User’s lib. Returns nil if it does not exist.



47
48
49
50
51
52
# File 'lib/gloo/web_svr/asset.rb', line 47

def lib_asset_folder
  dir = File.join( @engine.settings.user_root, LIB_FOLDER, ASSET_FOLDER )
  return dir if Dir.exist?( dir )

  return nil
end

#lib_image_folderObject

Get the images folder in the User’s lib. Returns nil if it does not exist.



80
81
82
83
84
85
# File 'lib/gloo/web_svr/asset.rb', line 80

def lib_image_folder
  dir = File.join( lib_asset_folder, IMAGE_FOLDER )
  return dir if Dir.exist?( dir )

  return nil
end

#lib_javascript_folderObject

Get the javascript folder in the User’s lib. Returns nil if it does not exist.



69
70
71
72
73
74
# File 'lib/gloo/web_svr/asset.rb', line 69

def lib_javascript_folder
  dir = File.join( lib_asset_folder, JAVASCRIPT_FOLDER )
  return dir if Dir.exist?( dir )

  return nil
end

#lib_stylesheet_folderObject

Get the stylesheets folder in the User’s lib. Returns nil if it does not exist.



58
59
60
61
62
63
# File 'lib/gloo/web_svr/asset.rb', line 58

def lib_stylesheet_folder
  dir = File.join( lib_asset_folder, STYLESHEET_FOLDER )
  return dir if Dir.exist?( dir )

  return nil
end

#list_css_assetsObject

List all css assets. This looks in the css container and lists the css files found earlier. A Debugging tool.



392
393
394
395
396
397
398
399
400
401
402
403
# File 'lib/gloo/web_svr/asset.rb', line 392

def list_css_assets
  data = []
  @stylesheets.children.each do |o|
    data << [ o.name, o.pn, o.value ]
  end
  headers = [ "Name", "PN", "Value" ]

  puts Gloo::App::Platform::RETURN
  title = "Stylesheet Assets with Routes"
  @engine.platform.table.show headers, data, title        
  puts Gloo::App::Platform::RETURN
end

#list_image_assetsObject

List all image assets. This looks in the image container and lists the images found earlier. A Debugging tool.



356
357
358
359
360
361
362
363
364
365
366
367
# File 'lib/gloo/web_svr/asset.rb', line 356

def list_image_assets
  data = []
  @images.children.each do |o|
    data << [ o.name, o.pn, o.value ]
  end
  headers = [ "Name", "PN", "Value" ]

  puts Gloo::App::Platform::RETURN
  title = "Image Assets with Routes"
  @engine.platform.table.show headers, data, title
  puts Gloo::App::Platform::RETURN
end

#list_js_assetsObject

List all js assets. This looks in the js container and lists the js files found earlier. A Debugging tool.



374
375
376
377
378
379
380
381
382
383
384
385
# File 'lib/gloo/web_svr/asset.rb', line 374

def list_js_assets
  data = []
  @javascript.children.each do |o|
    data << [ o.name, o.pn, o.value ]
  end
  headers = [ "Name", "PN", "Value" ]

  puts Gloo::App::Platform::RETURN
  title = "JavaScript Assets with Routes"
  @engine.platform.table.show headers, data, title
  puts Gloo::App::Platform::RETURN
end

#path_for_file(file) ⇒ Object

Find and return the page for the given route.



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/gloo/web_svr/asset.rb', line 123

def path_for_file file
  pn = file.value

  # Is the file's value a recognizable file?
  return pn if File.exist? pn

  # Look in the web server's asset folder.
  pn = File.join( asset_folder, pn )

  # Try the lib assets if not found
  unless File.exist? pn
    lib = lib_asset_folder
    pn = File.join( lib, file.value ) if lib
  end

  return pn
end

#published_name(asset_name) ⇒ Object

Get the published name for the given asset name.



203
204
205
# File 'lib/gloo/web_svr/asset.rb', line 203

def published_name asset_name
  return AssetInfo.find_published_name_for( asset_name )
end

#register_asset(name, pn, full_path) ⇒ Object

Register an asset with the web server. Adds fingerprint to the file names for later access.

full_path is the FILE from which we build the SHA256 hash pn is the path and name within the assets directory name is the simple file name (icon.png)



195
196
197
198
# File 'lib/gloo/web_svr/asset.rb', line 195

def register_asset name, pn, full_path
  asset_pn = "/asset/#{pn}"
  return AssetInfo.new( @engine, full_path, name, asset_pn ).register
end

#render_file(file) ⇒ Object

Helper to create a successful image response with the given data.



167
168
169
170
171
172
173
# File 'lib/gloo/web_svr/asset.rb', line 167

def render_file( file )
  type = type_for_file file
  data = File.binread file 
  code = Gloo::WebSvr::ResponseCode::SUCCESS

  return Gloo::WebSvr::Response.new( @engine, code, type, data, true )
end

#stylesheet_folderObject

Get the stylesheets folder in the project.



109
110
111
# File 'lib/gloo/web_svr/asset.rb', line 109

def stylesheet_folder
  return File.join( asset_folder, STYLESHEET_FOLDER )
end

#type_for_file(file) ⇒ Object

Get the return type for the given file.



144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/gloo/web_svr/asset.rb', line 144

def type_for_file file
  ext = File.extname( file ).downcase
  ext = ext[1..-1] if ext[0] == '.'
  
  if ext == 'css'
    return CSS_TYPE
  elsif ext == 'js'
    return JS_TYPE
  elsif ext == 'ico'
    return FAVICON_TYPE
  else
    return "#{IMAGE_TYPE}#{ext}"
  end
end