blufin-lib 1.8.1 → 1.8.2
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 +4 -4
- data/lib/blufin-lib.rb +2 -0
- data/lib/core/files.rb +4 -0
- data/lib/core/projects.rb +206 -194
- data/lib/generate/generate_ui_routes.rb +90 -25
- data/lib/scan/scanner.rb +29 -22
- data/lib/scan/scanner_error.rb +75 -0
- data/lib/scan/scanner_js.rb +184 -0
- data/lib/version.rb +1 -1
- data/opt/schema/projects-quasarrc.yml +8 -0
- data/opt/schema/projects.yml +0 -5
- data/opt/schema/routes.yml +4 -4
- metadata +6 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c350615237fa3cabca9a833d125de66452839e90
|
|
4
|
+
data.tar.gz: d70bb123eb4a18d56bfea947fb364f168cd2c546
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9d1e4e53208fc09a65f92be9c70c57230fa787044f3fd9bbb373ac2a66cfcb18615de185acf198fc23b2b27a05c9b93d290d926bfb075dcefcbff2f0a71a28c6
|
|
7
|
+
data.tar.gz: d0526fbe1e4076ce2f228cb05c92048360fda5f600027f1dec0e7a3439b83756d5c6897a1a767e800abd4ca45b70267596f28ba79c0a8c77d644261f6912c884
|
data/lib/blufin-lib.rb
CHANGED
|
@@ -16,7 +16,9 @@ module Blufin
|
|
|
16
16
|
autoload :Projects, 'core/projects'
|
|
17
17
|
autoload :Routes, 'core/routes'
|
|
18
18
|
autoload :Scanner, 'scan/scanner'
|
|
19
|
+
autoload :ScannerError, 'scan/scanner_error'
|
|
19
20
|
autoload :ScannerJava, 'scan/scanner_java'
|
|
21
|
+
autoload :ScannerJs, 'scan/scanner_js'
|
|
20
22
|
autoload :ScannerVue, 'scan/scanner_vue'
|
|
21
23
|
autoload :Strings, 'core/strings'
|
|
22
24
|
autoload :Terminal, 'core/terminal'
|
data/lib/core/files.rb
CHANGED
|
@@ -327,6 +327,10 @@ module Blufin
|
|
|
327
327
|
# @return Array
|
|
328
328
|
def self.get_files_in_dir(path, only_with_extension = nil)
|
|
329
329
|
raise RuntimeError, "Expected String, instead got: #{path.class}" unless path.is_a?(String)
|
|
330
|
+
unless only_with_extension.nil?
|
|
331
|
+
raise RuntimeError, "Expected String, instead got: #{path.class}" unless only_with_extension.is_a?(String)
|
|
332
|
+
raise RuntimeError, 'only_with_extension must be alphanumeric & lowercase (no periods)' unless only_with_extension =~ /[a-z0-9]/
|
|
333
|
+
end
|
|
330
334
|
path = "/#{Blufin::Strings.remove_surrounding_slashes(File.expand_path(path))}"
|
|
331
335
|
raise RuntimeError, "Directory doesn't exist: #{path}" unless path_exists(path)
|
|
332
336
|
files = Dir.glob("#{path}/**/*.#{only_with_extension.nil? ? '*' : only_with_extension}")
|
data/lib/core/projects.rb
CHANGED
|
@@ -3,6 +3,7 @@ module Blufin
|
|
|
3
3
|
class Projects
|
|
4
4
|
|
|
5
5
|
SCHEMA_FILE = "#{Blufin::Base::get_base_path}#{Blufin::Base::OPT_PATH}/schema/projects.yml"
|
|
6
|
+
SCHEMA_FILE_QUASARRC = "#{Blufin::Base::get_base_path}#{Blufin::Base::OPT_PATH}/schema/projects-quasarrc.yml"
|
|
6
7
|
SCRIPT_RUN = 'run'
|
|
7
8
|
SCRIPT_TEST = 'test'
|
|
8
9
|
SCRIPT_BUILD = 'build'
|
|
@@ -33,7 +34,11 @@ module Blufin
|
|
|
33
34
|
WORKER = 'Worker'
|
|
34
35
|
LAMBDA = 'Lambda'
|
|
35
36
|
UI = 'UI' # TODO - Probably need to extend this to every type of UI.
|
|
36
|
-
|
|
37
|
+
TRANSIENT_DATA = 'TransientData'
|
|
38
|
+
QUASARRC = '.quasarrc'
|
|
39
|
+
QUASAR_JS = 'JsPath'
|
|
40
|
+
QUASAR_JS_TESTS = 'JsPathTests'
|
|
41
|
+
QUASAR_ROUTES_FILE = 'RoutesFile'
|
|
37
42
|
ROUTES_FILE = 'RoutesFile'
|
|
38
43
|
TITLE = 'Title'
|
|
39
44
|
ALIAS = 'Alias'
|
|
@@ -115,10 +120,10 @@ module Blufin
|
|
|
115
120
|
def self.get_projects_as_array(types: nil)
|
|
116
121
|
projects_arr = []
|
|
117
122
|
if types.nil?
|
|
118
|
-
validate_type(project_type, project_id)
|
|
119
123
|
projects_arr = @@projects_arr
|
|
120
124
|
else
|
|
121
125
|
types = [types] unless types.is_a?(Array)
|
|
126
|
+
types.each { |type| raise RuntimeError, "Invalid type: #{type}" unless VALID_TYPES.include?(type) }
|
|
122
127
|
@@projects_arr.each { |project| projects_arr << project if types.include?(project[TYPE]) }
|
|
123
128
|
end
|
|
124
129
|
projects_arr
|
|
@@ -299,227 +304,234 @@ module Blufin
|
|
|
299
304
|
return if Blufin::Files::is_empty(source_file)
|
|
300
305
|
# Otherwise, validate file.
|
|
301
306
|
document, errors = Blufin::Config::validate_file(source_file, SCHEMA_FILE)
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
file_parsed[script_type].each do |script|
|
|
322
|
-
script_id = script[ID]
|
|
323
|
-
# Throw error if duplicate script is found for type.
|
|
324
|
-
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight("#{script_type} - #{script_id}")} \xe2\x80\x94 Duplicate script found: #{Blufin::Terminal::format_invalid(script_id)}") if @@scripts[script_key].has_key?(script_id)
|
|
325
|
-
@@scripts[script_key][script_id] = script
|
|
326
|
-
# Check that if script is AWS, it doesn't have --region or --profile flag.
|
|
327
|
-
if script.has_key?(COMMANDS)
|
|
328
|
-
script[COMMANDS].each do |command|
|
|
329
|
-
if command.strip =~ /^aws/i
|
|
330
|
-
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight("#{script_type} - #{script_id}")} \xe2\x80\x94 AWS scripts cannot have: #{Blufin::Terminal::format_invalid('--region')} flag.", command) if command =~ /\s--region\s/
|
|
331
|
-
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight("#{script_type} - #{script_id}")} \xe2\x80\x94 AWS scripts cannot have: #{Blufin::Terminal::format_invalid('--profile')} flag.", command) if command =~ /\s--profile\s/
|
|
332
|
-
end
|
|
307
|
+
display_parse_errors_if_any(errors, source_file)
|
|
308
|
+
projects_yml = parse_yml(source_file)
|
|
309
|
+
# Buffer script(s).
|
|
310
|
+
[RUN_SCRIPTS, TEST_SCRIPTS, BUILD_SCRIPTS].each do |script_type|
|
|
311
|
+
if projects_yml.has_key?(script_type)
|
|
312
|
+
if projects_yml[script_type].is_a?(Array)
|
|
313
|
+
script_key = script_key_mapper(script_type)
|
|
314
|
+
@@scripts[script_key] = {} unless @@scripts.has_key?(script_key)
|
|
315
|
+
projects_yml[script_type].each do |script|
|
|
316
|
+
script_id = script[ID]
|
|
317
|
+
# Throw error if duplicate script is found for type.
|
|
318
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight("#{script_type} - #{script_id}")} \xe2\x80\x94 Duplicate script found: #{Blufin::Terminal::format_invalid(script_id)}") if @@scripts[script_key].has_key?(script_id)
|
|
319
|
+
@@scripts[script_key][script_id] = script
|
|
320
|
+
# Check that if script is AWS, it doesn't have --region or --profile flag.
|
|
321
|
+
if script.has_key?(COMMANDS)
|
|
322
|
+
script[COMMANDS].each do |command|
|
|
323
|
+
if command.strip =~ /^aws/i
|
|
324
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight("#{script_type} - #{script_id}")} \xe2\x80\x94 AWS scripts cannot have: #{Blufin::Terminal::format_invalid('--region')} flag.", command) if command =~ /\s--region\s/
|
|
325
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight("#{script_type} - #{script_id}")} \xe2\x80\x94 AWS scripts cannot have: #{Blufin::Terminal::format_invalid('--profile')} flag.", command) if command =~ /\s--profile\s/
|
|
333
326
|
end
|
|
334
327
|
end
|
|
335
328
|
end
|
|
336
329
|
end
|
|
337
330
|
end
|
|
338
331
|
end
|
|
332
|
+
end
|
|
339
333
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
end
|
|
334
|
+
# Buffer/validate project(s) stuff.
|
|
335
|
+
projects_yml['Projects'].each do |project|
|
|
336
|
+
project_id = project[PROJECT_ID]
|
|
337
|
+
project_type = project[TYPE]
|
|
338
|
+
if project_type == TYPE_MVN_LIB || TYPE_NPM_LIB
|
|
339
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Duplicate Library Project.", "A library with this ID (#{Blufin::Terminal::format_invalid(project_id)}) has already been registered.") if @@libs.keys.include?(project_id)
|
|
340
|
+
@@libs[project_id] = project
|
|
341
|
+
elsif project_type == TYPE_API || project_type == TYPE_API_SIMPLE
|
|
342
|
+
[ALIAS, PROJECT_NAME, PROJECT_NAME_PASCAL_CASE, TITLE].each do |x|
|
|
343
|
+
@@api_data[x] = [] unless @@api_data.has_key?(x) && @@api_data[x].is_a?(Array)
|
|
344
|
+
property_value = project[API][x].strip.downcase
|
|
345
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Duplicate #{x} API Property.", "An API Property with this value (#{Blufin::Terminal::format_invalid(property_value)}) has already been registered.") if @@api_data[x].include?(property_value)
|
|
346
|
+
@@api_data[x] << property_value
|
|
354
347
|
end
|
|
355
348
|
end
|
|
349
|
+
end
|
|
356
350
|
|
|
357
|
-
|
|
351
|
+
used_ports = {}
|
|
358
352
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
353
|
+
# Run through once quickly to populate critical objects (required for validation).
|
|
354
|
+
projects_yml['Projects'].each do |project|
|
|
355
|
+
@@project_names << project[PROJECT]
|
|
356
|
+
@@project_ids << project[PROJECT_ID]
|
|
357
|
+
end
|
|
364
358
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 #{Blufin::Terminal::format_highlight(script_type)} \xe2\x80\x94 Invalid script reference: #{Blufin::Terminal::format_invalid(script_name)}. #{error}", valid_scripts)
|
|
403
|
-
end
|
|
359
|
+
# Loop (and validate) projects.
|
|
360
|
+
projects_yml['Projects'].each do |project|
|
|
361
|
+
# Validate keys are in specific order.
|
|
362
|
+
expected = {
|
|
363
|
+
PROJECT_ID => true,
|
|
364
|
+
PROJECT => true,
|
|
365
|
+
TYPE => true,
|
|
366
|
+
REPOSITORY => true,
|
|
367
|
+
UPSTREAM => false,
|
|
368
|
+
DOWNSTREAM => false,
|
|
369
|
+
RUN => false,
|
|
370
|
+
TEST => false,
|
|
371
|
+
BUILD => false,
|
|
372
|
+
API => false,
|
|
373
|
+
LAMBDA => false,
|
|
374
|
+
UI => false,
|
|
375
|
+
DEPLOYMENT => false,
|
|
376
|
+
}
|
|
377
|
+
Blufin::Validate::assert_valid_keys(expected, project.keys, source_file)
|
|
378
|
+
project_id = project[PROJECT_ID]
|
|
379
|
+
project_name = project[PROJECT]
|
|
380
|
+
project_type = project[TYPE]
|
|
381
|
+
validate_type(project_type, project_id)
|
|
382
|
+
# Validate Script(s).
|
|
383
|
+
[RUN, TEST, BUILD].each do |script_type|
|
|
384
|
+
if project.has_key?(script_type)
|
|
385
|
+
# Validate the LAMBDA functions don't need build scripts.
|
|
386
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Project type: #{Blufin::Terminal::format_highlight(TYPE_LAMBDA)} does not require #{Blufin::Terminal::format_invalid(script_type)} script(s).", 'This type of project does not support this.', true) if [BUILD].include?(script_type) && project_type == TYPE_LAMBDA
|
|
387
|
+
if project[script_type].is_a?(Hash)
|
|
388
|
+
script_key = script_key_mapper(script_type)
|
|
389
|
+
valid_scripts = []
|
|
390
|
+
valid_scripts = @@scripts[script_key].keys if @@scripts.has_key?(script_key)
|
|
391
|
+
script = project[script_type]
|
|
392
|
+
script_name = script['Script']
|
|
393
|
+
unless valid_scripts.include?(script_name)
|
|
394
|
+
error = valid_scripts.any? ? 'Valid values are:' : "There currently are no #{script_key} script(s) defined."
|
|
395
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 #{Blufin::Terminal::format_highlight(script_type)} \xe2\x80\x94 Invalid script reference: #{Blufin::Terminal::format_invalid(script_name)}. #{error}", valid_scripts)
|
|
404
396
|
end
|
|
405
397
|
end
|
|
406
398
|
end
|
|
399
|
+
end
|
|
407
400
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
401
|
+
# Validate Repository property.
|
|
402
|
+
if project.has_key?(REPOSITORY)
|
|
403
|
+
if project[REPOSITORY].has_key?(LOCAL)
|
|
404
|
+
repo_path = project[REPOSITORY][LOCAL]
|
|
405
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Repository path not found: #{Blufin::Terminal::format_invalid(repo_path)}") unless Blufin::Files::path_exists(repo_path)
|
|
413
406
|
|
|
414
|
-
end
|
|
415
407
|
end
|
|
408
|
+
end
|
|
416
409
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
410
|
+
# Validate Deployment property.
|
|
411
|
+
if project.has_key?(DEPLOYMENT)
|
|
412
|
+
expected = {
|
|
413
|
+
DEPLOYMENT_BUCKET => true,
|
|
414
|
+
DEPLOYMENT_FILES => true
|
|
415
|
+
}
|
|
416
|
+
Blufin::Validate::assert_valid_keys(expected, project[DEPLOYMENT].keys, source_file)
|
|
417
|
+
end
|
|
425
418
|
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
419
|
+
# Validate API property.
|
|
420
|
+
if project_type == TYPE_API || project_type == TYPE_API_SIMPLE
|
|
421
|
+
# Make sure we have the API property.
|
|
422
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Missing property: #{Blufin::Terminal::format_highlight(API)}", "This property is required for project(s) with type: #{API}", true) unless project.has_key?(API)
|
|
423
|
+
# Validate keys are in specific order.
|
|
424
|
+
expected = {
|
|
425
|
+
TITLE => true,
|
|
426
|
+
ALIAS => true,
|
|
427
|
+
DOMAIN => true,
|
|
428
|
+
PROJECT_NAME => true,
|
|
429
|
+
PROJECT_NAME_PASCAL_CASE => true,
|
|
430
|
+
PORTS => true
|
|
431
|
+
}
|
|
432
|
+
Blufin::Validate::assert_valid_keys(expected, project[API].keys, source_file)
|
|
433
|
+
expected_ports = {
|
|
434
|
+
API => true,
|
|
435
|
+
SCHEDULER => true,
|
|
436
|
+
WORKER => true
|
|
437
|
+
}
|
|
438
|
+
Blufin::Validate::assert_valid_keys(expected_ports, project[API][PORTS].keys, source_file)
|
|
439
|
+
validate_ports([project[API][PORTS][API], project[API][PORTS][SCHEDULER], project[API][PORTS][WORKER]], project_id, used_ports)
|
|
440
|
+
# Add ports to used_ports.
|
|
441
|
+
used_ports[project[API][PORTS][API]] = project_id
|
|
442
|
+
used_ports[project[API][PORTS][SCHEDULER]] = project_id
|
|
443
|
+
used_ports[project[API][PORTS][WORKER]] = project_id
|
|
444
|
+
@@apis = {} if @@apis.nil?
|
|
445
|
+
@@apis[project[PROJECT_ID]] = project
|
|
446
|
+
else
|
|
447
|
+
# Make sure we DON'T have the API key.
|
|
448
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Property not supported: #{Blufin::Terminal::format_invalid(API)}", "This property is only allowed for project(s) with type: #{API}", true) if project.has_key?(API)
|
|
449
|
+
end
|
|
457
450
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
451
|
+
# Validate Lambda property.
|
|
452
|
+
if project_type == TYPE_LAMBDA
|
|
453
|
+
# Make sure we have the Lambda property.
|
|
454
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Missing property: #{Blufin::Terminal::format_highlight(LAMBDA)}", "This property is required for project(s) with type: #{TYPE_LAMBDA}", true) unless project.has_key?(LAMBDA)
|
|
455
|
+
# Validate keys are in specific order.
|
|
456
|
+
expected = {
|
|
457
|
+
TITLE => true,
|
|
458
|
+
ALIAS => true,
|
|
459
|
+
PORT => true,
|
|
460
|
+
STAGES => true
|
|
461
|
+
}
|
|
462
|
+
Blufin::Validate::assert_valid_keys(expected, project[LAMBDA].keys, source_file)
|
|
463
|
+
validate_ports([project[LAMBDA][PORT]], project_id, used_ports)
|
|
464
|
+
# Add ports to used_ports.
|
|
465
|
+
used_ports[project[LAMBDA][PORT]] = project_id
|
|
466
|
+
@@lambdas = {} if @@lambdas.nil?
|
|
467
|
+
Blufin::Terminal::error("Duplicate Lambda project: #{Blufin::Terminal::format_invalid(project[PROJECT_ID])}") if @@lambdas.has_key?(project[PROJECT_ID])
|
|
468
|
+
@@lambdas[project[PROJECT_ID]] = project
|
|
469
|
+
else
|
|
470
|
+
# Make sure we DON'T have the Lambda key.
|
|
471
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Property not supported: #{Blufin::Terminal::format_invalid(LAMBDA)}", "This property is only allowed for project(s) with type: #{TYPE_LAMBDA}", true) if project.has_key?(LAMBDA)
|
|
472
|
+
end
|
|
480
473
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
else
|
|
494
|
-
# Make sure we DON'T have the UI key.
|
|
495
|
-
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Property not supported: #{Blufin::Terminal::format_invalid(QUASAR)}", "This property is only allowed for project(s) with type: #{TYPE_QUASAR}", true) if project.has_key?(QUASAR)
|
|
496
|
-
end
|
|
474
|
+
# Validate Quasar property.
|
|
475
|
+
if project_type == TYPE_QUASAR
|
|
476
|
+
# Check .quasarrc exists.
|
|
477
|
+
quasarrc_file = "#{Blufin::Projects::get_project_path(project_id, true, project: project)}/#{QUASARRC}"
|
|
478
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Missing file: #{Blufin::Terminal::format_directory(quasarrc_file)}", 'This file needs to exist.', true) unless Blufin::Files::file_exists(quasarrc_file)
|
|
479
|
+
# Parse .quasarrc
|
|
480
|
+
document, errors = Blufin::Config::validate_file(quasarrc_file, SCHEMA_FILE_QUASARRC)
|
|
481
|
+
display_parse_errors_if_any(errors, quasarrc_file)
|
|
482
|
+
quasarrc_yml = parse_yml(quasarrc_file)
|
|
483
|
+
# Add it to the project object as transient data.
|
|
484
|
+
project[TRANSIENT_DATA] = quasarrc_yml
|
|
485
|
+
end
|
|
497
486
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
end
|
|
487
|
+
# Validate upstream/downstream Libs(s).
|
|
488
|
+
[UPSTREAM, DOWNSTREAM].each do |stream|
|
|
489
|
+
if project.has_key?(stream)
|
|
490
|
+
project[stream].each do |library|
|
|
491
|
+
case stream
|
|
492
|
+
when UPSTREAM
|
|
493
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Unrecognized #{Blufin::Terminal::format_action(UPSTREAM)} library: #{Blufin::Terminal::format_invalid(library)}") unless @@libs.keys.include?(library)
|
|
494
|
+
when DOWNSTREAM
|
|
495
|
+
Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Unrecognized #{Blufin::Terminal::format_action(DOWNSTREAM)} library: #{Blufin::Terminal::format_invalid(library)}") unless @@project_ids.include?(library)
|
|
496
|
+
else
|
|
497
|
+
raise RuntimeError, "Unrecognized stream: #{stream}"
|
|
510
498
|
end
|
|
511
499
|
end
|
|
512
500
|
end
|
|
501
|
+
end
|
|
513
502
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
503
|
+
@@projects[project_name] = {} unless @@projects.has_key?(project_name)
|
|
504
|
+
Blufin::Terminal::error("Duplicate project ID: #{Blufin::Terminal::format_invalid(project_id)}") if @@projects[project_name].has_key?(project_id)
|
|
505
|
+
@@projects[project_name][project_id] = project
|
|
506
|
+
@@projects_arr << project
|
|
518
507
|
|
|
519
|
-
end
|
|
520
|
-
@@project_names.uniq!
|
|
521
|
-
@@project_names.sort!
|
|
522
508
|
end
|
|
509
|
+
@@project_names.uniq!
|
|
510
|
+
@@project_names.sort!
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
# Standardized way of displaying YML Parser (Kwalify) errors.
|
|
514
|
+
# Script will terminate in this method.
|
|
515
|
+
# @return void
|
|
516
|
+
def display_parse_errors_if_any(errors, source_file)
|
|
517
|
+
if errors && !errors.empty?
|
|
518
|
+
errors_output = []
|
|
519
|
+
errors.each { |e|
|
|
520
|
+
errors_output << "[#{e.path}] #{e.message}"
|
|
521
|
+
}
|
|
522
|
+
Blufin::Terminal::error("Your configuration file is invalid. Please fix: #{Blufin::Terminal::format_directory(source_file)}", errors)
|
|
523
|
+
end
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
# Parses a YML file, bombs-out if something fails.
|
|
527
|
+
# @return Hash
|
|
528
|
+
def parse_yml(source_file)
|
|
529
|
+
begin
|
|
530
|
+
file_parsed = YAML.load_file(source_file)
|
|
531
|
+
rescue => e
|
|
532
|
+
Blufin::Terminal::error("Failed to parse config file: #{Blufin::Terminal::format_directory(source_file)}", e.message)
|
|
533
|
+
end
|
|
534
|
+
file_parsed
|
|
523
535
|
end
|
|
524
536
|
|
|
525
537
|
# Validate project type.
|
|
@@ -4,6 +4,20 @@ module Blufin
|
|
|
4
4
|
|
|
5
5
|
SCHEMA_FILE = "#{Blufin::Base::get_base_path}#{Blufin::Base::OPT_PATH}/schema/routes.yml"
|
|
6
6
|
HOME_TERM = 'dashboard'
|
|
7
|
+
PAGES_ROOT = 'PagesRoot'
|
|
8
|
+
PAGES_404 = 'Pages404'
|
|
9
|
+
ROUTES_FILE = 'RoutesFile'
|
|
10
|
+
IGNORE = 'Ignore'
|
|
11
|
+
ROUTES = 'Routes'
|
|
12
|
+
PARENT = 'Parent'
|
|
13
|
+
PATH = 'Path'
|
|
14
|
+
NAME = 'Name'
|
|
15
|
+
ICON = 'Icon'
|
|
16
|
+
LAYOUT = 'Layout'
|
|
17
|
+
ROOT_PATH = 'RootPath'
|
|
18
|
+
INVISIBLE = 'Invisible'
|
|
19
|
+
CHILDREN = 'Children'
|
|
20
|
+
|
|
7
21
|
|
|
8
22
|
# Generates routes in the UI.
|
|
9
23
|
# @return void
|
|
@@ -13,36 +27,87 @@ module Blufin
|
|
|
13
27
|
@warnings = []
|
|
14
28
|
@files = []
|
|
15
29
|
@files_to_create = []
|
|
30
|
+
root_path_seen = nil
|
|
16
31
|
begin
|
|
17
32
|
@output = <<TEMPLATE
|
|
18
33
|
const routes = [
|
|
19
34
|
{
|
|
20
35
|
TEMPLATE
|
|
21
36
|
project_path = Blufin::Projects::get_project_path(project[Blufin::Projects::PROJECT_ID], true)
|
|
22
|
-
routes_file = "#{project_path}/#{project[Blufin::Projects::
|
|
37
|
+
routes_file = "#{project_path}/#{project[Blufin::Projects::TRANSIENT_DATA][Blufin::Projects::QUASAR_ROUTES_FILE]}"
|
|
23
38
|
routes_yml = Blufin::Yml::read_file(routes_file, SCHEMA_FILE)
|
|
24
|
-
target_file = "#{project_path}/src/#{Blufin::Strings::remove_surrounding_slashes(routes_yml[
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
pages_not_found = routes_yml['Pages404']
|
|
39
|
+
target_file = "#{project_path}/src/#{Blufin::Strings::remove_surrounding_slashes(routes_yml[ROUTES_FILE])}"
|
|
40
|
+
pages_root = routes_yml[PAGES_ROOT]
|
|
41
|
+
pages_not_found = routes_yml[PAGES_404]
|
|
28
42
|
path_pages_ignore = []
|
|
29
43
|
path_to_pages = "#{project_path}/src/#{pages_root}"
|
|
44
|
+
|
|
30
45
|
# Add ignore path(s) -- if exists.
|
|
31
|
-
routes_yml[
|
|
32
|
-
|
|
46
|
+
routes_yml[IGNORE].each { |ignore_path| path_pages_ignore << "#{Blufin::Strings::remove_surrounding_slashes(ignore_path)}" } if routes_yml.has_key?(IGNORE)
|
|
47
|
+
|
|
48
|
+
# Loop Routes.
|
|
49
|
+
routes = routes_yml[ROUTES]
|
|
33
50
|
routes.each_with_index do |route, idx|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
51
|
+
|
|
52
|
+
# Make sure we have a route.
|
|
53
|
+
@errors << "You have an empty route in: #{Blufin::Terminal::format_directory(routes_file)}" if route.nil? || !route.any?
|
|
54
|
+
|
|
55
|
+
# Validate order of keys (in route).
|
|
56
|
+
expected = {
|
|
57
|
+
PARENT => true,
|
|
58
|
+
CHILDREN => false
|
|
59
|
+
}
|
|
60
|
+
Blufin::Validate::assert_valid_keys(expected, route.keys, routes_file)
|
|
61
|
+
|
|
62
|
+
# Validate order of keys (in parent).
|
|
63
|
+
expected = {
|
|
64
|
+
LAYOUT => true,
|
|
65
|
+
PATH => true,
|
|
66
|
+
NAME => false,
|
|
67
|
+
ICON => false,
|
|
68
|
+
ROOT_PATH => false,
|
|
69
|
+
INVISIBLE => false,
|
|
70
|
+
}
|
|
71
|
+
Blufin::Validate::assert_valid_keys(expected, route[PARENT].keys, routes_file)
|
|
72
|
+
|
|
73
|
+
comma = route.has_key?(CHILDREN) ? ',' : nil
|
|
74
|
+
parent_path = route[PARENT][PATH]
|
|
75
|
+
layout = route[PARENT][LAYOUT]
|
|
76
|
+
invisible = nil
|
|
77
|
+
|
|
78
|
+
# The prefix that gets added to all (parent) error messages.
|
|
79
|
+
parent_error_prefix = "Parent path: #{Blufin::Terminal::format_highlight("/#{parent_path}")} \xe2\x80\x94 "
|
|
80
|
+
|
|
81
|
+
# Make sure path and layout are all lowercase.
|
|
82
|
+
@errors << "#{parent_error_prefix}Everything must be lowercase, found: #{Blufin::Terminal::format_invalid(parent_path)}" if route[PARENT][PATH].downcase != parent_path
|
|
83
|
+
@errors << "#{parent_error_prefix}Everything must be lowercase, found: #{Blufin::Terminal::format_invalid(layout)}" if route[PARENT][LAYOUT].downcase != layout
|
|
84
|
+
|
|
85
|
+
# Validate name/icon properties based on whether this route is visible or not.
|
|
86
|
+
if route[PARENT].has_key?(INVISIBLE) && route[PARENT][INVISIBLE]
|
|
87
|
+
invisible = "\n invisible: true,"
|
|
88
|
+
# Validate we don't have name/icon when invisible.
|
|
89
|
+
[NAME, ICON].each { |taboo_key| @errors << "#{parent_error_prefix}When #{Blufin::Terminal::format_action(INVISIBLE)} is set, cannot have property: #{Blufin::Terminal::format_invalid(taboo_key)}" if route[PARENT].has_key?(taboo_key) }
|
|
90
|
+
else
|
|
91
|
+
# Validate we have name/icon when NOT invisible.
|
|
92
|
+
[NAME, ICON].each { |required_key| @errors << "#{parent_error_prefix}Missing property: #{Blufin::Terminal::format_invalid(required_key)}" unless route[PARENT].has_key?(required_key) }
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Make sure the RootPath hasn't already been seen.
|
|
96
|
+
if route[PARENT].has_key?(ROOT_PATH)
|
|
97
|
+
@errors << "Found multiple routes with a #{Blufin::Terminal::format_highlight(ROOT_PATH)} flag: #{Blufin::Terminal::format_invalid(root_path_seen)}, #{Blufin::Terminal::format_invalid(route[PARENT][PATH])}" unless root_path_seen.nil?
|
|
98
|
+
root_path_seen = parent_path
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
@output += <<TEMPLATE
|
|
102
|
+
path: '/#{route[PARENT].has_key?(ROOT_PATH) && route[PARENT][ROOT_PATH] ? nil : parent_path}',
|
|
103
|
+
sectionName: '#{route[PARENT][NAME]}',
|
|
104
|
+
sectionIcon: '#{route[PARENT][ICON]}',#{invisible}
|
|
40
105
|
component: () => import('./../#{layout}')#{comma}
|
|
41
106
|
TEMPLATE
|
|
42
|
-
file =
|
|
107
|
+
file = "#{pages_root}/#{parent_path}/index.vue"
|
|
43
108
|
prefix = parent_path == HOME_TERM ? 'dashboard/' : nil
|
|
44
109
|
process_file(file, project_path)
|
|
45
|
-
if route.has_key?(
|
|
110
|
+
if route.has_key?(CHILDREN)
|
|
46
111
|
@output += <<TEMPLATE
|
|
47
112
|
children: [
|
|
48
113
|
{
|
|
@@ -50,16 +115,18 @@ TEMPLATE
|
|
|
50
115
|
component: () => import('./../#{file}')
|
|
51
116
|
},
|
|
52
117
|
TEMPLATE
|
|
53
|
-
|
|
118
|
+
# Loop Children.
|
|
119
|
+
children = route[CHILDREN]
|
|
54
120
|
children.each_with_index do |child, idx|
|
|
55
121
|
comma = idx == children.length - 1 ? nil : ','
|
|
56
|
-
file = "#{pages_root}/#{parent_path}/#{child[
|
|
122
|
+
file = "#{pages_root}/#{parent_path}/#{child[PATH]}.vue"
|
|
57
123
|
disabled = child.has_key?('Disabled') && child['Disabled'] ? "\n disabled: true," : nil
|
|
124
|
+
@errors << "#{parent_error_prefix}Everything must be lowercase, found: #{Blufin::Terminal::format_invalid(child[PATH])}" if child[PATH].downcase != child[PATH]
|
|
58
125
|
process_file(file, project_path)
|
|
59
126
|
@output += <<TEMPLATE
|
|
60
127
|
{
|
|
61
|
-
path: '#{prefix}#{child[
|
|
62
|
-
name: '#{child[
|
|
128
|
+
path: '#{prefix}#{child[PATH]}',
|
|
129
|
+
name: '#{child[NAME]}',#{disabled}
|
|
63
130
|
component: () => import('./../#{file}')
|
|
64
131
|
}#{comma}
|
|
65
132
|
TEMPLATE
|
|
@@ -115,7 +182,7 @@ TEMPLATE
|
|
|
115
182
|
|
|
116
183
|
# Check for rogue files.
|
|
117
184
|
Blufin::Files::get_files_in_dir(path_to_pages).each do |file|
|
|
118
|
-
next if file =~ /#{path_to_pages}\/(#{path_pages_ignore.join('|')})/
|
|
185
|
+
next if file =~ /#{path_to_pages}\/(#{path_pages_ignore.join('|')})\/[a-z0-9]/
|
|
119
186
|
unless @files_to_create.include?(file)
|
|
120
187
|
@warnings << "Found rogue file: #{Blufin::Terminal::format_invalid(file)}"
|
|
121
188
|
end
|
|
@@ -131,7 +198,7 @@ TEMPLATE
|
|
|
131
198
|
# Creates file if not exists
|
|
132
199
|
# @return void
|
|
133
200
|
def self.process_file(file, project_path)
|
|
134
|
-
|
|
201
|
+
@errors << "Duplicate file: #{Blufin::Terminal::format_invalid(file)}" if @files.include?(file)
|
|
135
202
|
@files << file
|
|
136
203
|
@files_to_create << "#{project_path}/src/#{file}"
|
|
137
204
|
end
|
|
@@ -146,12 +213,10 @@ TEMPLATE
|
|
|
146
213
|
</div>
|
|
147
214
|
</template>
|
|
148
215
|
|
|
149
|
-
<script
|
|
216
|
+
<script>
|
|
150
217
|
export default {
|
|
151
218
|
data() {
|
|
152
|
-
return {
|
|
153
|
-
test: this.$route.path
|
|
154
|
-
};
|
|
219
|
+
return {};
|
|
155
220
|
}
|
|
156
221
|
};
|
|
157
222
|
</script>
|
data/lib/scan/scanner.rb
CHANGED
|
@@ -4,28 +4,35 @@ module Blufin
|
|
|
4
4
|
|
|
5
5
|
# Initialize the class.
|
|
6
6
|
# @return void
|
|
7
|
-
def
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
7
|
+
def self.scan(project_key)
|
|
8
|
+
|
|
9
|
+
@errors = []
|
|
10
|
+
@js_data = {}
|
|
11
|
+
|
|
12
|
+
Blufin::Projects::get_projects_as_array.each do |project|
|
|
13
|
+
if project[Blufin::Projects::PROJECT] == project_key
|
|
14
|
+
project_id = project[Blufin::Projects::PROJECT_ID]
|
|
15
|
+
project_type = project[Blufin::Projects::TYPE]
|
|
16
|
+
project_path = Blufin::Projects::get_project_path(project_id, true)
|
|
17
|
+
case project_type
|
|
18
|
+
when Blufin::Projects::TYPE_API_SIMPLE
|
|
19
|
+
when Blufin::Projects::TYPE_QUASAR
|
|
20
|
+
# Extract JS data.
|
|
21
|
+
if project.has_key?(Blufin::Projects::TRANSIENT_DATA) && project[Blufin::Projects::TRANSIENT_DATA].has_key?(Blufin::Projects::QUASAR_JS)
|
|
22
|
+
js_path = project[Blufin::Projects::TRANSIENT_DATA][Blufin::Projects::QUASAR_JS]
|
|
23
|
+
@js_data, errors = Blufin::ScannerJs::scan("#{project_path}/#{js_path}")
|
|
24
|
+
@errors.concat(errors)
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
raise RuntimeError, "Unsupported project type: #{project_type}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
:js_data => @js_data,
|
|
34
|
+
:errors => @errors
|
|
35
|
+
}
|
|
29
36
|
|
|
30
37
|
end
|
|
31
38
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
module Blufin
|
|
2
|
+
|
|
3
|
+
class ScannerError
|
|
4
|
+
|
|
5
|
+
attr_accessor :file, :line, :line_number, :error_type, :message
|
|
6
|
+
|
|
7
|
+
HEADER_COLOR = 240
|
|
8
|
+
LINE_COLOR = 184
|
|
9
|
+
ERROR_COLOR = 196
|
|
10
|
+
CODE_COLOR = 102
|
|
11
|
+
|
|
12
|
+
extend Columnist
|
|
13
|
+
|
|
14
|
+
# Initialize a ScannerError object.
|
|
15
|
+
# @return void
|
|
16
|
+
def initialize(file, line, line_number, message)
|
|
17
|
+
raise RuntimeError, "File does not exist: #{file}" unless Blufin::Files::file_exists(file)
|
|
18
|
+
raise RuntimeError, "Line number must be positive integer, got: #{line_number}" unless line_number.to_s =~ /^\d+$/
|
|
19
|
+
raise RuntimeError, 'Message cannot be nil or blank.' if message.nil? || message.strip == ''
|
|
20
|
+
self.file = file
|
|
21
|
+
self.line = line
|
|
22
|
+
self.line_number = line_number.to_s
|
|
23
|
+
self.message = message
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Static method to output the errors to Terminal.
|
|
27
|
+
# @return void
|
|
28
|
+
def self.output_cli(errors, clear_screen = true)
|
|
29
|
+
raise RuntimeError, "Expected Array, instead got: #{errors.class}" unless errors.is_a?(Array)
|
|
30
|
+
system('clear') if clear_screen
|
|
31
|
+
puts if clear_screen
|
|
32
|
+
@files = {}
|
|
33
|
+
errors.each do |error|
|
|
34
|
+
file = error.file
|
|
35
|
+
@files[file] = [] unless @files.has_key?(file)
|
|
36
|
+
@files[file] << error
|
|
37
|
+
end
|
|
38
|
+
@files.each do |file, inner_errors|
|
|
39
|
+
puts " #{highlight_filename(file)}"
|
|
40
|
+
table(:border => false) do
|
|
41
|
+
wildcard_width = Blufin::Terminal::get_terminal_width - 120
|
|
42
|
+
message_width = 100
|
|
43
|
+
row do
|
|
44
|
+
column('', :width => 2, :color => HEADER_COLOR)
|
|
45
|
+
column('-' * 5, :width => 5, :color => HEADER_COLOR)
|
|
46
|
+
column('-' * message_width, :width => message_width, :color => HEADER_COLOR)
|
|
47
|
+
column('-' * wildcard_width, :width => wildcard_width, :color => HEADER_COLOR)
|
|
48
|
+
column('', :width => 2, :color => HEADER_COLOR)
|
|
49
|
+
end
|
|
50
|
+
inner_errors.each do |error|
|
|
51
|
+
row do
|
|
52
|
+
column('')
|
|
53
|
+
column(error.line_number[0..5].ljust(5, ' '), :color => LINE_COLOR)
|
|
54
|
+
column(error.message[0..message_width], :color => ERROR_COLOR)
|
|
55
|
+
column(error.line.strip[0..wildcard_width], :color => CODE_COLOR)
|
|
56
|
+
column('')
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
puts
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Takes a file like '/Users/Albert/Repos/eworldes/fmm/client/src/js/app/overlays.js' and highlights 'overlays.js'
|
|
65
|
+
# @return string
|
|
66
|
+
def self.highlight_filename(file)
|
|
67
|
+
raise RuntimeError, "Expected String, instead got: #{file.class}" unless file.is_a?(String)
|
|
68
|
+
fs = file.split('/')
|
|
69
|
+
fl = fs.pop
|
|
70
|
+
"\x1B[48;5;233m \x1B[38;5;240m#{fs.join('/')}/\x1B[38;5;202m#{fl} \x1B[0m"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
module Blufin
|
|
2
|
+
|
|
3
|
+
class ScannerJs
|
|
4
|
+
|
|
5
|
+
DATA_TYPES = %w(string number boolean array object *)
|
|
6
|
+
|
|
7
|
+
# Scan Javascript code.
|
|
8
|
+
# @return void
|
|
9
|
+
def self.scan(path)
|
|
10
|
+
|
|
11
|
+
# Check path exists.
|
|
12
|
+
Blufin::Terminal::error("Path does not exist: #{Blufin::Terminal::format_invalid(path)}") unless Blufin::Files::path_exists(path)
|
|
13
|
+
|
|
14
|
+
@data = {}
|
|
15
|
+
@errors = []
|
|
16
|
+
|
|
17
|
+
# Get all file(s) in path.
|
|
18
|
+
Blufin::Files::get_files_in_dir(path, 'js').each { |file| scan_file(file) }
|
|
19
|
+
|
|
20
|
+
return @data, @errors
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
# Scans a file.
|
|
27
|
+
# @return void
|
|
28
|
+
def self.scan_file(file)
|
|
29
|
+
|
|
30
|
+
@file = file
|
|
31
|
+
@data[@file] = {}
|
|
32
|
+
@data[@file][:methods] = {}
|
|
33
|
+
|
|
34
|
+
@liner = nil
|
|
35
|
+
@line_number = 0
|
|
36
|
+
@params = nil
|
|
37
|
+
@docs = nil
|
|
38
|
+
@docs_active = false
|
|
39
|
+
@method_active = false
|
|
40
|
+
|
|
41
|
+
Blufin::Files::read_file(file).each do |line|
|
|
42
|
+
|
|
43
|
+
begin
|
|
44
|
+
|
|
45
|
+
@line = line.gsub("\n", '')
|
|
46
|
+
@line_number += 1
|
|
47
|
+
|
|
48
|
+
if @line =~ /^\s*\/+\s*\w.*$/ # // some comment
|
|
49
|
+
parse_comment(@line)
|
|
50
|
+
elsif @line =~ /^\s*\/\*+\s*.*$/ # /** OR *
|
|
51
|
+
@docs = {}
|
|
52
|
+
@docs_active = true
|
|
53
|
+
elsif @line =~ /^\s{4}\w+\s*(:\s*function)?\(.*\)\s*\{\s*(\}|\},)?\s*$/
|
|
54
|
+
# clear() {}
|
|
55
|
+
# clear() {},
|
|
56
|
+
# clear(key) {
|
|
57
|
+
# clear(key, value) {
|
|
58
|
+
# clear(key, value = null) {
|
|
59
|
+
# set: function() {
|
|
60
|
+
# set: function(key) {
|
|
61
|
+
# set: function(key, value) {
|
|
62
|
+
# set: function(key, value = null) {
|
|
63
|
+
@method_active = true
|
|
64
|
+
@params = {}
|
|
65
|
+
# Extract method data.
|
|
66
|
+
parse_method_definition(@line)
|
|
67
|
+
|
|
68
|
+
@docs = nil
|
|
69
|
+
else
|
|
70
|
+
|
|
71
|
+
# TODO - REMOVE
|
|
72
|
+
# puts line unless @docs_active || @method_active
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# If we're inside a comment.
|
|
77
|
+
parse_comment(@line) if @docs_active
|
|
78
|
+
|
|
79
|
+
# Break out of comment ( ... */)
|
|
80
|
+
@docs_active = false if @line =~ /^.*\*+\/\s*$/
|
|
81
|
+
|
|
82
|
+
# Break out of method ( ... } OR }, )
|
|
83
|
+
@method_active = false if @line =~ /^\s{4}(\}|\},)\s*$/ || @line =~ /^\s{4}\w+\s*(:\s*function)?\(.*\)\s*\{\s*(\}|\},)\s*$/
|
|
84
|
+
|
|
85
|
+
rescue RuntimeError => e
|
|
86
|
+
@errors << Blufin::ScannerError.new(file, @line, @line_number, e.message)
|
|
87
|
+
next
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Parses comments.
|
|
95
|
+
# @return void
|
|
96
|
+
def self.parse_comment(line)
|
|
97
|
+
if line =~ /^\s*\/\*+\s*.*$/
|
|
98
|
+
# /** OR *
|
|
99
|
+
return
|
|
100
|
+
elsif line =~ /^\s*\/+\s*\w.*$/
|
|
101
|
+
# // some comment
|
|
102
|
+
return
|
|
103
|
+
elsif line =~ /^\s*\*\/\s*$/
|
|
104
|
+
# */
|
|
105
|
+
return
|
|
106
|
+
elsif line =~ /^\s*\*+\s*[A-Za-z0-9].*$/
|
|
107
|
+
# * some comment
|
|
108
|
+
@docs[:description] = [] if @docs[:description].nil?
|
|
109
|
+
@docs[:description] << line.gsub(/^\s*\*\s*/, '').strip
|
|
110
|
+
elsif line =~ /^\s*\*+\s*@param\s*\{(\w|\*)+\}*.+$/
|
|
111
|
+
# * @param {string} parent - The parent key.
|
|
112
|
+
ls = line.gsub(/^\s*\*+\s*@param\s+/, '').split(' ')
|
|
113
|
+
type = extract_type(ls[0])
|
|
114
|
+
param_name = ls[1]
|
|
115
|
+
hyphen = ls[2]
|
|
116
|
+
description = ls.drop(3).join(' ')
|
|
117
|
+
raise RuntimeError, "Duplicate parameter: #{param_name}" if @docs[:params].is_a?(Hash) && @docs[:params].has_key?(param_name)
|
|
118
|
+
raise RuntimeError, "Expected hyphen after parameter name. IE: {#{type}} #{param_name} - ..." if ls.length > 2 && hyphen != '-'
|
|
119
|
+
@docs[:params] = {} if @docs[:params].nil?
|
|
120
|
+
@docs[:params][param_name] = {}
|
|
121
|
+
@docs[:params][param_name][:type] = type
|
|
122
|
+
@docs[:params][param_name][:description] = description
|
|
123
|
+
elsif line =~ /^\s*\*+\s*@returns\s+\{(\w|\*)+\}.*$/
|
|
124
|
+
# * @returns {boolean}
|
|
125
|
+
raise RuntimeError, 'Multiple return statement(s).' if @docs.has_key?(:return)
|
|
126
|
+
ls = line.gsub(/^\s*\*+\s*@returns\s+/, '').split(' ')
|
|
127
|
+
@docs[:return] = nil
|
|
128
|
+
@docs[:return] = extract_type(ls[0], true) if ls.any?
|
|
129
|
+
else
|
|
130
|
+
raise RuntimeError, 'Something is wrong with this line, it failed to parse.'
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Parses the 1st line of a method and extracts information about the parameters.
|
|
135
|
+
# @return void
|
|
136
|
+
def self.parse_method_definition(line)
|
|
137
|
+
method_name = line.strip.gsub(/\(.*$/, '')
|
|
138
|
+
method_private = method_name =~ /^_/ ? true : false
|
|
139
|
+
raise RuntimeError, "Duplicate method: #{method_name}" if @data[@file][:methods].keys.include?(method_name)
|
|
140
|
+
matches = line.match(/\(.*\)/)
|
|
141
|
+
raise RuntimeError, 'Unable to extract method parameters.' unless matches.length == 1
|
|
142
|
+
params = matches[0].strip.gsub(/^\(/, '').gsub(/\)$/, '')
|
|
143
|
+
params = params.split(',')
|
|
144
|
+
params.each do |param|
|
|
145
|
+
param.strip!
|
|
146
|
+
if param =~ /\w+\s*=\s*\w+/
|
|
147
|
+
ps = param.split('=')
|
|
148
|
+
raise RuntimeError, "Expected exactly one equal (=) sign, got: #{ps.length - 1}" unless ps.length == 2
|
|
149
|
+
param_extracted = ps[0].strip
|
|
150
|
+
raise RuntimeError, "Duplicate parameter: #{param_extracted}" if @params.has_key?(param_extracted)
|
|
151
|
+
@params[param_extracted] = {:default => ps[1].strip}
|
|
152
|
+
elsif param =~ /\w+/
|
|
153
|
+
raise RuntimeError, "Duplicate parameter: #{param}" if @params.has_key?(param)
|
|
154
|
+
@params[param] = {}
|
|
155
|
+
else
|
|
156
|
+
raise RuntimeError, "Unrecognized parameter: #{param}"
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
@docs = {:params => {}} unless @docs.is_a?(Hash)
|
|
160
|
+
@docs[:params] = {} unless @docs[:params].is_a?(Hash)
|
|
161
|
+
@data[@file][:methods][method_name] = {
|
|
162
|
+
:line => @line,
|
|
163
|
+
:line_number => @line_number,
|
|
164
|
+
:docs => @docs,
|
|
165
|
+
:params => @params,
|
|
166
|
+
:private => method_private
|
|
167
|
+
}
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Attempts to extract 'string' from something like '{string}'.
|
|
171
|
+
# Will throw Error if anything isn't right.
|
|
172
|
+
# @return string
|
|
173
|
+
def self.extract_type(string, allow_void = false)
|
|
174
|
+
types = DATA_TYPES
|
|
175
|
+
types << 'void' if allow_void
|
|
176
|
+
type = string.gsub(/^\{/, '').gsub(/\}$/, '')
|
|
177
|
+
raise RuntimeError, "Unrecognized data type: #{type}" unless types.include?(type.downcase)
|
|
178
|
+
raise RuntimeError, "Data types must be lowercase, found: #{type}" if type.downcase != 'array' && type != type.downcase
|
|
179
|
+
type
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
end
|
data/lib/version.rb
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
BLUFIN_LIB_VERSION = '1.8.
|
|
1
|
+
BLUFIN_LIB_VERSION = '1.8.2'
|
data/opt/schema/projects.yml
CHANGED
data/opt/schema/routes.yml
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
type: map
|
|
2
2
|
mapping:
|
|
3
|
-
Layout:
|
|
4
|
-
required: true
|
|
5
3
|
PagesRoot:
|
|
6
4
|
required: true
|
|
7
5
|
Pages404:
|
|
@@ -22,14 +20,16 @@ mapping:
|
|
|
22
20
|
type: map
|
|
23
21
|
required: true
|
|
24
22
|
mapping:
|
|
23
|
+
Layout:
|
|
24
|
+
required: true
|
|
25
25
|
Path:
|
|
26
26
|
required: true
|
|
27
27
|
Name:
|
|
28
|
-
required: true
|
|
29
28
|
Icon:
|
|
30
|
-
required: true
|
|
31
29
|
RootPath:
|
|
32
30
|
type: bool
|
|
31
|
+
Invisible:
|
|
32
|
+
type: bool
|
|
33
33
|
Children:
|
|
34
34
|
type: seq
|
|
35
35
|
sequence:
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: blufin-lib
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.8.
|
|
4
|
+
version: 1.8.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Albert Rannetsperger
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-11-
|
|
11
|
+
date: 2019-11-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: highline
|
|
@@ -152,9 +152,12 @@ files:
|
|
|
152
152
|
- lib/generate/generate_base.rb
|
|
153
153
|
- lib/generate/generate_ui_routes.rb
|
|
154
154
|
- lib/scan/scanner.rb
|
|
155
|
+
- lib/scan/scanner_error.rb
|
|
155
156
|
- lib/scan/scanner_java.rb
|
|
157
|
+
- lib/scan/scanner_js.rb
|
|
156
158
|
- lib/scan/scanner_vue.rb
|
|
157
159
|
- lib/version.rb
|
|
160
|
+
- opt/schema/projects-quasarrc.yml
|
|
158
161
|
- opt/schema/projects.yml
|
|
159
162
|
- opt/schema/routes.yml
|
|
160
163
|
- opt/shell/ec2-check
|
|
@@ -178,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
178
181
|
version: '0'
|
|
179
182
|
requirements: []
|
|
180
183
|
rubyforge_project:
|
|
181
|
-
rubygems_version: 2.5.
|
|
184
|
+
rubygems_version: 2.5.1
|
|
182
185
|
signing_key:
|
|
183
186
|
specification_version: 4
|
|
184
187
|
summary: Blufin Lib
|