blufin-lib 1.8.2 → 2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c350615237fa3cabca9a833d125de66452839e90
4
- data.tar.gz: d70bb123eb4a18d56bfea947fb364f168cd2c546
3
+ metadata.gz: c18b8e80ef480a5dad4b4ce1d23d8c357ef41144
4
+ data.tar.gz: 3ac8da0829f69021888397ad1c8879d3ae7f48e2
5
5
  SHA512:
6
- metadata.gz: 9d1e4e53208fc09a65f92be9c70c57230fa787044f3fd9bbb373ac2a66cfcb18615de185acf198fc23b2b27a05c9b93d290d926bfb075dcefcbff2f0a71a28c6
7
- data.tar.gz: d0526fbe1e4076ce2f228cb05c92048360fda5f600027f1dec0e7a3439b83756d5c6897a1a767e800abd4ca45b70267596f28ba79c0a8c77d644261f6912c884
6
+ metadata.gz: f3527a65e1fba07c5915007e4b2925e01bf183eecbbde9e8087e99bf8ac43bf731b1a50577d589828c21220942e9dd6f9c8b13aeab95af1a06b5777ff4eec357
7
+ data.tar.gz: 743bba3db7bcc1cd51c4cd43b14fe94e55394e60b7586b6959c2766804043800c5f76ced3cc5fb987198cf57dfb0565cb2c90f3e3a4a9a87750fe994a6e5f9f8
data/lib/blufin-lib.rb CHANGED
@@ -7,18 +7,16 @@ module Blufin
7
7
  autoload :Constants, 'core/constants'
8
8
  autoload :DateTimeUtils, 'core/datetime_utils'
9
9
  autoload :Files, 'core/files'
10
- autoload :GenerateBase, 'generate/generate_base'
11
- autoload :GenerateUiRoutes, 'generate/generate_ui_routes'
12
10
  autoload :Git, 'core/git'
13
11
  autoload :Image, 'core/image'
14
12
  autoload :Network, 'core/network'
15
13
  autoload :Numbers, 'core/numbers'
16
14
  autoload :Projects, 'core/projects'
17
15
  autoload :Routes, 'core/routes'
18
- autoload :Scanner, 'scan/scanner'
19
16
  autoload :ScannerError, 'scan/scanner_error'
20
17
  autoload :ScannerJava, 'scan/scanner_java'
21
18
  autoload :ScannerJs, 'scan/scanner_js'
19
+ autoload :ScannerJsTests, 'scan/scanner_js_tests'
22
20
  autoload :ScannerVue, 'scan/scanner_vue'
23
21
  autoload :Strings, 'core/strings'
24
22
  autoload :Terminal, 'core/terminal'
data/lib/core/aws.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  module Blufin
2
2
 
3
- module AWS
3
+ class AWS
4
+
5
+ FILE_AWS_CONFIG = File.expand_path('~/.aws/config')
6
+ FILE_AWS_CREDENTIALS = File.expand_path('~/.aws/credentials')
4
7
 
5
8
  S3_EXCLUDE = "--exclude '.DS_Store' --exclude '*/.DS_Store' --exclude '*.icloud' --exclude '*/*.icloud'"
6
9
 
@@ -62,14 +65,18 @@ module Blufin
62
65
  else
63
66
  return tmp_location if Blufin::Files::file_exists(tmp_location) && use_cache
64
67
  end
68
+ # Get profile name.
69
+ profile_name = profile.nil? ? App::AWSProfile::get_profile_name : " --profile #{profile}"
65
70
  begin
66
71
  # Clear out all (possibly stale) files.
67
- raise RuntimeError unless Blufin::Terminal::execute_proc("Wiping temp-folder: #{Blufin::Terminal::format_directory(tmp_location)}", Proc.new {
68
- system("rm -rf #{tmp_location}") if file.nil?
69
- system("rm #{tmp_location}") unless file.nil?
70
- Blufin::Files::create_directory(tmp_location)
72
+ puts
73
+ raise RuntimeError unless Blufin::Terminal::execute_proc("Wiping temp-data: #{Blufin::Terminal::format_directory(tmp_location)}", Proc.new {
74
+ system("rm -rf #{tmp_location}") if file.nil? && Blufin::Files::path_exists(tmp_location)
75
+ system("rm #{tmp_location}") if !file.nil? && Blufin::Files::file_exists(tmp_location)
76
+ Blufin::Files::create_directory(tmp_location) if file.nil?
77
+ true
71
78
  }, verbose: true)
72
- raise RuntimeError unless Blufin::Terminal::execute("aws s3 cp s3://#{bucket_name}#{bucket_path_s3} #{tmp_location} --recursive --region #{region}#{App::AWS::get_profile_for_cli}", verbose: true)[0]
79
+ raise RuntimeError unless Blufin::Terminal::execute("aws s3 cp s3://#{bucket_name}#{bucket_path_s3} #{tmp_location}#{file.nil? ? ' --recursive' : ''} --region #{region}#{profile_name}", verbose: true)[0]
73
80
  tmp_location
74
81
  rescue
75
82
  system("rm -rf #{tmp_location}") if file.nil?
@@ -79,6 +86,42 @@ module Blufin
79
86
 
80
87
  end
81
88
 
89
+ # Checks if AWS credentials exist. Does nothing if on EC2.
90
+ # @return Array (of errors).
91
+ def self.get_aws_credentials(profile)
92
+ credentials = nil
93
+ errors = []
94
+ if Blufin::Files::file_exists(FILE_AWS_CREDENTIALS)
95
+ credentials = Blufin::AWSCredentials.new
96
+ config = Blufin::Files::file_exists(FILE_AWS_CONFIG) ? ParseConfig.new(FILE_AWS_CONFIG) : nil
97
+ credentials_parsed = ParseConfig.new(FILE_AWS_CREDENTIALS)
98
+ unless credentials_parsed.params[profile].nil?
99
+ # Currently not used/required (but here just in case).
100
+ unless config.nil? || config.params[profile].nil?
101
+ credentials.region = config.params[profile]['region'] unless config.params[profile]['region'].nil?
102
+ credentials.output = config.params[profile]['output'] unless config.params[profile]['output'].nil?
103
+
104
+ end
105
+ credentials.aws_key = credentials_parsed.params[profile]['aws_access_key_id'] unless credentials_parsed.params[profile]['aws_access_key_id'].nil?
106
+ credentials.aws_secret = credentials_parsed.params[profile]['aws_secret_access_key'] unless credentials_parsed.params[profile]['aws_secret_access_key'].nil?
107
+ end
108
+ errors << "aws-cli error. Cannot find #{profile}: #{Blufin::Terminal::format_invalid('aws_access_key_id')} in: #{Blufin::Terminal::format_directory(FILE_AWS_CREDENTIALS)}" if credentials.aws_key.nil?
109
+ errors << "aws-cli error. Cannot find #{profile}: #{Blufin::Terminal::format_invalid('aws_secret_access_key')} in: #{Blufin::Terminal::format_directory(FILE_AWS_CREDENTIALS)}" if credentials.aws_secret.nil?
110
+ else
111
+ # Returns 'yes' if running on EC2 instance, 'no' if not.
112
+ unless `#{App::Opt::get_base_path}/#{App::Opt::OPT_PATH}/shell/ec2-check`.to_s.gsub("\n", '') =~ /yes/i
113
+ errors << "aws-cli error. Cannot find file: #{Blufin::Terminal::format_invalid(FILE_AWS_CREDENTIALS)}"
114
+ end
115
+ end
116
+ return credentials, errors
117
+ end
118
+
119
+ end
120
+
121
+ class AWSCredentials
122
+
123
+ attr_accessor :region, :output, :aws_key, :aws_secret
124
+
82
125
  end
83
126
 
84
127
  end
data/lib/core/config.rb CHANGED
@@ -56,7 +56,7 @@ module Blufin
56
56
  begin
57
57
  schema_file_parsed = YAML.load_file(schema_file)
58
58
  rescue => e
59
- Blufin::Terminal::error("Failed to schema config file: #{Blufin::Terminal::format_directory(schema_file)}", e.message)
59
+ Blufin::Terminal::error("Failed to parse schema file: #{Blufin::Terminal::format_directory(schema_file)}", e.message)
60
60
  end
61
61
  validator = Kwalify::Validator.new(schema_file_parsed)
62
62
  begin
data/lib/core/files.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'fileutils'
2
2
  require 'parseconfig'
3
+ require 'fileutils'
4
+ require 'digest/sha1'
3
5
 
4
6
  module Blufin
5
7
 
@@ -11,11 +13,12 @@ module Blufin
11
13
  # Same as write_file() but for Java files. If arrange_imports = TRUE (default) it
12
14
  # will sort the import statements in the same order as IntelliJ would.
13
15
  # @return String
14
- def self.write_file_java(path_and_file, array_of_lines, auto_generated = JAVA_AUTO_GENERATED_EVERY_RUN)
16
+ def self.write_file_java(path_and_file, array_of_lines, auto_generated = JAVA_AUTO_GENERATED_EVERY_RUN, test_annotations = true)
15
17
  raise RuntimeError, "Expected String, instead got: #{path_and_file.class}" unless path_and_file.is_a?(String)
16
- auto_generated_valid = [JAVA_AUTO_GENERATED_EVERY_RUN, JAVA_AUTO_GENERATED_ONCE]
18
+ auto_generated_valid = [nil, JAVA_AUTO_GENERATED_EVERY_RUN, JAVA_AUTO_GENERATED_ONCE]
17
19
  raise RuntimeError, "Expected .java file, instead got: #{path_and_file}" unless path_and_file =~ /\.java\z/
18
- raise RuntimeError, "auto_generated must be one of the following: #{auto_generated_valid.join(', ')}" unless auto_generated_valid.include?(auto_generated)
20
+ raise RuntimeError, "auto_generated must be one of the following: #{auto_generated_valid.join(', ')}" unless auto_generated.nil? || auto_generated_valid.include?(auto_generated)
21
+ raise RuntimeError, "Expected Boolean, instead got: #{test_annotations.class}" unless !!test_annotations == test_annotations
19
22
  package = nil
20
23
  import_statements_one = []
21
24
  import_statements_two = []
@@ -31,9 +34,9 @@ module Blufin
31
34
  previous_was_blank = true if line.strip == ''
32
35
  next
33
36
  end
34
- if package.nil? && line.strip =~ /^package\s+[A-Za-z0-9\._-]+;$/
37
+ if package.nil? && line.strip =~ /^package\s+[A-Za-z0-9\._-]+;(\s*#.*)?$/
35
38
  # Get package.
36
- raise RuntimeError, "Package has a hyphen in it \xe2\x86\x92 \x1B[38;5;184m#{line.strip}\x1B[0m. When this file's contents were generated you forgot a .gsub() statement to replace it." if line.strip =~ /-/
39
+ raise RuntimeError, "Package has a hyphen in it \xe2\x86\x92 \x1B[38;5;184m#{line.strip}\x1B[0m. When this file's contents were generated you forgot a .gsub() statement to replace it." if line.gsub(/(\s*#.*)?$/, '').strip =~ /-/
37
40
  package = line.strip
38
41
  next
39
42
  elsif line.strip =~ /^import\s+[A-Za-z0-9\.*_-]+;$/ || line.strip =~ /^import\s+static\s+[A-Za-z0-9\.*_-]+;$/
@@ -43,22 +46,22 @@ module Blufin
43
46
  next
44
47
  elsif !contents.any? && line.strip =~ /^@(.)+$/
45
48
  annotations_one << line.strip
46
- elsif !contents.any? && line.strip =~ /^(public|private|protected)\s+.*(class|enum)\s+.*\{$/
49
+ elsif !contents.any? && line.strip =~ /^(public|private|protected)\s+.*(class|enum)\s+.*\{(\s*\})?$/
47
50
  contents << line.strip
48
51
  next
49
52
  end
50
53
  end
51
54
  raise RuntimeError, "Couldn't parse content for: #{path_and_file}" unless contents.any?
52
55
  # Add @AutoGenerated + @TestNotRequired stuff.
53
- import_statements_one << 'import org.blufin.base.annotations.AutoGenerated;'
54
- import_statements_one << 'import org.blufin.base.annotations.TestNotRequired;'
55
- import_statements_one << 'import org.blufin.base.annotations.helper.ON;'
56
+ import_statements_one << 'import org.blufin.base.annotations.AutoGenerated;' unless auto_generated.nil?
57
+ import_statements_one << 'import org.blufin.base.annotations.TestNotRequired;' if test_annotations
58
+ import_statements_one << 'import org.blufin.base.annotations.helper.ON;' unless auto_generated.nil?
56
59
  annotations_one.each do |annotation|
57
60
  next if %w(@TestNotRequired @AutoGenerated @AutoGenerated(ON.EVERY_RUN) @AutoGenerated(ON.CREATION_ONLY)).include?(annotation)
58
61
  annotations_two << annotation
59
62
  end
60
- annotations_two << '@TestNotRequired'
61
- annotations_two << ((auto_generated == JAVA_AUTO_GENERATED_EVERY_RUN) ? '@AutoGenerated(ON.EVERY_RUN)' : '@AutoGenerated(ON.CREATION_ONLY)')
63
+ annotations_two << '@TestNotRequired' if test_annotations
64
+ annotations_two << ((auto_generated == JAVA_AUTO_GENERATED_EVERY_RUN) ? '@AutoGenerated(ON.EVERY_RUN)' : '@AutoGenerated(ON.CREATION_ONLY)') unless auto_generated.nil?
62
65
  annotations_two.uniq!
63
66
  import_statements_one.uniq!
64
67
  import_statements_one.sort!
@@ -157,9 +160,31 @@ module Blufin
157
160
  return self.write_file(path_and_file, final_contents)
158
161
  end
159
162
 
163
+ # Writes a file (but only if content has changed).
164
+ # Returns true if file was overwritten, false if not.
165
+ # @return boolean
166
+ def self.write_file_if_changed(path_and_file, array_of_lines, write_empty_trailing_line: false)
167
+ raise RuntimeError, "Expected String, instead got: #{path_and_file.class}" unless path_and_file.is_a?(String)
168
+ raise RuntimeError, "Expected Array, instead got: #{array_of_lines.class}" unless array_of_lines.is_a?(Array)
169
+ # If file does not exist, writes it regardless and returns TRUE.
170
+ unless Blufin::Files::file_exists(path_and_file)
171
+ Blufin::Files::write_file(path_and_file, array_of_lines, write_empty_trailing_line: write_empty_trailing_line)
172
+ return true
173
+ end
174
+ tmp_file = "/tmp/#{Blufin::Strings::random_string(2)}.txt"
175
+ Blufin::Files::write_file(tmp_file, array_of_lines, write_empty_trailing_line: write_empty_trailing_line)
176
+ target_file_hash = Digest::SHA1.hexdigest Blufin::Arrays::convert_line_array_to_string(Blufin::Files::read_file(path_and_file)).gsub(/\s/, '')
177
+ tmp_file_hash = Digest::SHA1.hexdigest Blufin::Arrays::convert_line_array_to_string(Blufin::Files::read_file(tmp_file)).gsub(/\s/, '')
178
+ if target_file_hash != tmp_file_hash
179
+ FileUtils.mv(tmp_file, path_and_file)
180
+ return true
181
+ end
182
+ false
183
+ end
184
+
160
185
  # Write an "Array of Lines" to a file -- overwrites file if exists!
161
186
  # @return String
162
- def self.write_file(path_and_file, array_of_lines)
187
+ def self.write_file(path_and_file, array_of_lines, write_empty_trailing_line: false)
163
188
  raise RuntimeError, "Expected String, instead got: #{path_and_file.class}" unless path_and_file.is_a?(String)
164
189
  path_and_file = File.expand_path(path_and_file)
165
190
  # If this comes in as a string, convert it to an Array of lines.
@@ -174,7 +199,7 @@ module Blufin
174
199
  File.open(path_and_file, 'w') { |file|
175
200
  array_of_lines.each_with_index do |line, index|
176
201
  if index == array_of_lines.size - 1
177
- file.write("#{line}") unless line.to_s.strip == ''
202
+ file.write("#{line}") if line.to_s.strip != '' || write_empty_trailing_line
178
203
  else
179
204
  file.write("#{line}\n")
180
205
  end
@@ -373,6 +398,7 @@ module Blufin
373
398
  # Proxy function for the above.
374
399
  # @return void
375
400
  def self.create_path(path)
401
+ raise RuntimeError, "Expected String, instead got: #{path.class}" unless path.is_a?(String)
376
402
  create_directory(path)
377
403
  end
378
404
 
@@ -394,6 +420,7 @@ module Blufin
394
420
  # Returns TRUE if file is empty. Ignores spaces and new-line characters.
395
421
  # @return bool
396
422
  def self.is_empty(path_and_file)
423
+ raise RuntimeError, "Expected String, instead got: #{path_and_file.class}" unless path_and_file.is_a?(String)
397
424
  Blufin::Files::read_file(path_and_file).each do |line|
398
425
  line.strip!
399
426
  return false if line != ''
@@ -401,6 +428,14 @@ module Blufin
401
428
  true
402
429
  end
403
430
 
431
+ # Returns TRUE if path_and_file is a file, FALSE if it's a directory.
432
+ # File does not need to exist.
433
+ # @return bool
434
+ def self.is_file(path_and_file)
435
+ raise RuntimeError, "Expected String, instead got: #{path_and_file.class}" unless path_and_file.is_a?(String)
436
+ path_and_file =~ /\.[a-z0-9]{1,10}$/i ? true : false
437
+ end
438
+
404
439
  private
405
440
 
406
441
  # Creates path (if not exists) and deletes file (if exists).
data/lib/core/git.rb CHANGED
@@ -218,13 +218,23 @@ module Blufin
218
218
  exists = false
219
219
  Blufin::Terminal::execute_proc("Checking #{type} exists: #{Blufin::Terminal::format_highlight(btc)} \x1B[38;5;246m\xe2\x86\x92 \x1B[38;5;240m#{File.expand_path(path)}\x1B[0m", Proc.new {
220
220
  run('git fetch -p', path, verbose: false) if run_git_fetch
221
- cmd = %w(branch tag).include?(type) ? "git #{type} | grep #{btc}" : "git log | grep \"commit #{btc}\""
221
+ case type
222
+ when 'branch'
223
+ cmd = "git branch -r | grep #{btc}"
224
+ when 'tag'
225
+ cmd = "git tag | grep #{btc}"
226
+ when 'commit'
227
+ cmd = "git log | grep \"commit #{btc}\""
228
+ else
229
+ raise RuntimeError, "Unhandled type: #{type}"
230
+ end
222
231
  res = Blufin::Terminal::execute(cmd, path, capture: true, verbose: false)
223
232
  res.each do |line|
224
233
  next if line.nil? || line.strip == ''
225
234
  case type
226
235
  when 'branch'
227
236
  line = line.gsub(/^\*\s?/, '')
237
+ line = line.gsub(/^\s*origin\//, '')
228
238
  when 'commit'
229
239
  line = line.gsub(/^commit\s?/, '')
230
240
  when 'tag'
data/lib/core/projects.rb CHANGED
@@ -3,7 +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
+ SCHEMA_FILE_CODEGEN = "#{Blufin::Base::get_base_path}#{Blufin::Base::OPT_PATH}/schema/codegen.yml"
7
7
  SCRIPT_RUN = 'run'
8
8
  SCRIPT_TEST = 'test'
9
9
  SCRIPT_BUILD = 'build'
@@ -35,11 +35,16 @@ module Blufin
35
35
  LAMBDA = 'Lambda'
36
36
  UI = 'UI' # TODO - Probably need to extend this to every type of UI.
37
37
  TRANSIENT_DATA = 'TransientData'
38
- QUASARRC = '.quasarrc'
39
- QUASAR_JS = 'JsPath'
40
- QUASAR_JS_TESTS = 'JsPathTests'
41
- QUASAR_ROUTES_FILE = 'RoutesFile'
42
- ROUTES_FILE = 'RoutesFile'
38
+ CODEGEN = 'codegen'
39
+ CG_API_SIMPLE = 'ApiSimple'
40
+ CG_QUASAR = 'Quasar'
41
+ CG_QUASAR_ROOT = 'Root'
42
+ CG_QUASAR_PAGES = 'PathPages'
43
+ CG_QUASAR_PAGES_IGNORE = 'PathPagesIgnore'
44
+ CG_QUASAR_API_DOCS_FILE = 'ApiDocsFile'
45
+ CG_QUASAR_JS = 'JsPath'
46
+ CG_QUASAR_TESTS = 'JsPathTests'
47
+ CG_QUASAR_ROUTES_FILE = 'RoutesFile'
43
48
  TITLE = 'Title'
44
49
  ALIAS = 'Alias'
45
50
  DOMAIN = 'Domain'
@@ -86,7 +91,7 @@ module Blufin
86
91
  # Takes a Hash that needs to have a 'Projects' key.
87
92
  # This can come from both .awx.yml['Profiles'] or .blufin.yml (root).
88
93
  # @return void
89
- def initialize(projects)
94
+ def initialize(projects, profile = nil)
90
95
  raise RuntimeError, 'Cannot run Blufin::Projects.new() more than once.' if !@@projects.nil? || !@@scripts.nil?
91
96
  raise RuntimeError, "Need either a Local or S3Bucket key, found neither: #{projects.keys}" unless projects.has_key?(LOCAL) || projects.has_key?('S3Bucket')
92
97
  @@projects = {}
@@ -98,15 +103,12 @@ module Blufin
98
103
  # Validate the source file against the expected schema.
99
104
  process_source_file(source_file)
100
105
  elsif projects.has_key?('S3Bucket')
101
-
102
- # TODO - Finish this once we start running this on an EC2 instance (build/deploy server).
103
- # TODO - Whatever file we validate should be available on disk locally.
104
- # TODO - If the source is an S3 bucket, pull it down into a /tmp folder (on EC2 instance) and validate from there.
105
-
106
- raise RuntimeError, 'Reading projects.yml from S3 is not yet implemented!'
107
-
106
+ # Throw an error if we don't have an AWS Profile.
107
+ Blufin::Terminal::error("Your configuration is getting #{Blufin::Terminal::format_highlight('projects.yml')} from S3, but you have no AWS Profile set.") if profile.nil?
108
+ s3 = projects['S3Bucket']
109
+ tmp_path = Blufin::AWS::download_s3_data(s3['Name'], s3['Path'], file: s3['File'], profile: profile, region: s3['Region'], use_cache: true)
110
+ process_source_file(tmp_path)
108
111
  end
109
-
110
112
  end
111
113
 
112
114
  # Gets Project(s) -- as a nested hash with -> [PROJECT][PROJECT_ID] as the keys.
@@ -117,14 +119,16 @@ module Blufin
117
119
 
118
120
  # Gets Project(s) -- but in a single array.
119
121
  # @return Array
120
- def self.get_projects_as_array(types: nil)
122
+ def self.get_projects_as_array(group: nil, types: nil)
121
123
  projects_arr = []
122
- if types.nil?
123
- projects_arr = @@projects_arr
124
- else
124
+ unless types.nil?
125
125
  types = [types] unless types.is_a?(Array)
126
126
  types.each { |type| raise RuntimeError, "Invalid type: #{type}" unless VALID_TYPES.include?(type) }
127
- @@projects_arr.each { |project| projects_arr << project if types.include?(project[TYPE]) }
127
+ end
128
+ @@projects_arr.each do |project|
129
+ next if !group.nil? && group != project[PROJECT]
130
+ next if !types.nil? && !types.include?(project[TYPE])
131
+ projects_arr << project
128
132
  end
129
133
  projects_arr
130
134
  end
@@ -291,7 +295,7 @@ module Blufin
291
295
  Blufin::Terminal::error('No projects found.') unless array_of_projects.any?
292
296
  return array_of_projects[0] if array_of_projects.length == 1
293
297
  projects = []
294
- array_of_projects.each { |project| projects << {:text => project[PROJECT_ID], :value => project} }
298
+ array_of_projects.each { |project| projects << { :text => project[PROJECT_ID], :value => project } }
295
299
  Blufin::Terminal::prompt_select('Select project:', projects)
296
300
  end
297
301
 
@@ -379,6 +383,18 @@ module Blufin
379
383
  project_name = project[PROJECT]
380
384
  project_type = project[TYPE]
381
385
  validate_type(project_type, project_id)
386
+
387
+ @codegen_file = "#{Blufin::Projects::get_project_path(project_id, project: project)}/.#{CODEGEN}/#{CODEGEN}.yml"
388
+
389
+ if [TYPE_API_SIMPLE, TYPE_QUASAR].include?(project_type)
390
+ # Validate (and parse) .codegen/codegen.yml.
391
+ Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Missing file: #{Blufin::Terminal::format_directory(@codegen_file)}", 'This file needs to exist.', true) unless Blufin::Files::file_exists(@codegen_file)
392
+ # Parse .codegen/codegen.yml
393
+ document, errors = Blufin::Config::validate_file(@codegen_file, SCHEMA_FILE_CODEGEN)
394
+ display_parse_errors_if_any(errors, @codegen_file)
395
+ @codegen_yml = parse_yml(@codegen_file)
396
+ end
397
+
382
398
  # Validate Script(s).
383
399
  [RUN, TEST, BUILD].each do |script_type|
384
400
  if project.has_key?(script_type)
@@ -448,6 +464,12 @@ module Blufin
448
464
  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
465
  end
450
466
 
467
+ # Validate ApiSimple property.
468
+ if project_type == TYPE_API_SIMPLE
469
+ Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Missing property #{Blufin::Terminal::format_highlight(CG_API_SIMPLE)} in: #{Blufin::Terminal::format_directory(@codegen_file)}", "This property is required for project(s) with type: #{TYPE_API_SIMPLE}", true) unless @codegen_yml.has_key?(CG_API_SIMPLE)
470
+ project[TRANSIENT_DATA] = @codegen_yml[CG_API_SIMPLE]
471
+ end
472
+
451
473
  # Validate Lambda property.
452
474
  if project_type == TYPE_LAMBDA
453
475
  # Make sure we have the Lambda property.
@@ -473,15 +495,8 @@ module Blufin
473
495
 
474
496
  # Validate Quasar property.
475
497
  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
498
+ Blufin::Terminal::error("#{Blufin::Terminal::format_highlight(project_id)} \xe2\x80\x94 Missing property #{Blufin::Terminal::format_highlight(CG_QUASAR)} in: #{Blufin::Terminal::format_directory(@codegen_file)}", "This property is required for project(s) with type: #{TYPE_QUASAR}", true) unless @codegen_yml.has_key?(CG_QUASAR)
499
+ project[TRANSIENT_DATA] = @codegen_yml[CG_QUASAR]
485
500
  end
486
501
 
487
502
  # Validate upstream/downstream Libs(s).
@@ -14,12 +14,12 @@ module Blufin
14
14
  # Initialize a ScannerError object.
15
15
  # @return void
16
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+$/
17
+ raise RuntimeError, "File does not exist: #{file}" unless Blufin::Files::file_exists(file) unless file.nil?
18
+ raise RuntimeError, "Line number must be positive integer, got: #{line_number}" if !line_number.nil? && line_number.to_s !~ /^\d+$/
19
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
20
+ self.file = file.nil? ? "\xe2\x80\x94" : file
21
+ self.line = line.nil? ? "\xe2\x80\x94" : line
22
+ self.line_number = line_number.nil? ? "\xe2\x80\x94" : line_number.to_s
23
23
  self.message = message
24
24
  end
25
25
 
@@ -27,6 +27,7 @@ module Blufin
27
27
  # @return void
28
28
  def self.output_cli(errors, clear_screen = true)
29
29
  raise RuntimeError, "Expected Array, instead got: #{errors.class}" unless errors.is_a?(Array)
30
+ return unless errors.any?
30
31
  system('clear') if clear_screen
31
32
  puts if clear_screen
32
33
  @files = {}
@@ -39,6 +40,7 @@ module Blufin
39
40
  puts " #{highlight_filename(file)}"
40
41
  table(:border => false) do
41
42
  wildcard_width = Blufin::Terminal::get_terminal_width - 120
43
+ wildcard_width = 1 if wildcard_width < 0
42
44
  message_width = 100
43
45
  row do
44
46
  column('', :width => 2, :color => HEADER_COLOR)
@@ -59,6 +61,7 @@ module Blufin
59
61
  end
60
62
  puts
61
63
  end
64
+ exit 1
62
65
  end
63
66
 
64
67
  # Takes a file like '/Users/Albert/Repos/eworldes/fmm/client/src/js/app/overlays.js' and highlights 'overlays.js'
@@ -70,6 +73,12 @@ module Blufin
70
73
  "\x1B[48;5;233m \x1B[38;5;240m#{fs.join('/')}/\x1B[38;5;202m#{fl} \x1B[0m"
71
74
  end
72
75
 
76
+ # Add an error.
77
+ # @return Object
78
+ def self.add_error(file, message, line = nil, line_number = nil)
79
+ Blufin::ScannerError.new(file, line, line_number, message)
80
+ end
81
+
73
82
  end
74
83
 
75
84
  end
@@ -2,6 +2,12 @@ module Blufin
2
2
 
3
3
  class ScannerJava
4
4
 
5
+ # TODO NOW - RENAME THESE
6
+ TYPE_CLASS = 'type_class'
7
+ TYPE_CLASS_ABSTRACT = 'type_class_abstract'
8
+ TYPE_ENUM = 'type_enum'
9
+ TYPE_INTERFACE = 'type_interface'
10
+
5
11
  # Scan Java code.
6
12
  # @return void
7
13
  def self.scan(path)
@@ -9,9 +15,93 @@ module Blufin
9
15
  # Check path exists.
10
16
  Blufin::Terminal::error("Path does not exist: #{Blufin::Terminal::format_invalid(path)}") unless Blufin::Files::path_exists(path)
11
17
 
12
- # TODO - REMOVE
13
- raise 'Not yet implemented!'
18
+ @data = {}
19
+ @errors = []
20
+
21
+ # Get all file(s) in path.
22
+ Blufin::Files::get_files_in_dir(path, 'java').each do |file|
23
+ data, errors = scan_file(file)
24
+ @data[file] = data
25
+ @errors.concat(errors)
26
+ end
27
+
28
+ return @data, @errors
29
+
30
+ end
31
+
32
+ # Scans a file.
33
+ # @return void
34
+ def self.scan_file(file)
35
+ raise RuntimeError, "File not found: #{file}" unless Blufin::Files::file_exists(file)
36
+ data = {}
37
+ errors = []
38
+ fs = file.split('/')
39
+ data[:class] = fs[fs.length - 1].gsub(/\.java\s*$/i, '')
40
+ @line_number = 0
41
+
42
+ Blufin::Files::read_file(file).each do |line|
43
+
44
+ begin
45
+
46
+ @line = line.gsub("\n", '')
47
+ @line_number += 1
48
+
49
+ # Get the type of class this is.
50
+ class_type = get_java_class_type
51
+ unless class_type.nil?
52
+ data[:class_type] = class_type
53
+ next
54
+ end
55
+
56
+
57
+ if @line =~ /^\s*@RestController\s*$/
58
+ data[:controller] = true
59
+ next
60
+ elsif @line =~ /^\s*@RequestMapping\(".+"\)$/
61
+ rm = @line.gsub(/^\s*@RequestMapping\("/, '').gsub(/"\)$/, '')
62
+ # Skip the custom 404 error handler mapping.
63
+ next if rm == '${server.error.path:${error.path:/error}}'
64
+ raise RuntimeError, 'Cannot have annotation @RequestMapping before (or without) @RestController.' unless data[:controller]
14
65
 
66
+ # TODO NOW - Continue here.
67
+ # TODO NOW - Need an example of every possible end-point in TestController.
68
+
69
+ data[:request_mapping] = rm
70
+
71
+ elsif !data[:class_type].nil? && @line =~ /^\s*.*\s+(public|protected|private)\s+[A-Za-z]+\s+[A-Za-z0-9]+\s*\(.*\)\s*\{?\}?\s*$/
72
+
73
+ # TODO - REMOVE
74
+ # puts "\x1B[38;5;154m#{@line}\x1B[0m"
75
+
76
+ end
77
+
78
+ rescue RuntimeError => e
79
+ errors << Blufin::ScannerError.new(file, @line, @line_number, e.message)
80
+ next
81
+ end
82
+
83
+ end
84
+
85
+ return data, errors
86
+
87
+ end
88
+
89
+ private
90
+
91
+ # Gets the Java class TYPE.
92
+ # @return void
93
+ def self.get_java_class_type
94
+ if @line =~ /\Apublic class\s/ || @line =~ /\Apublic final class\s/
95
+ return TYPE_CLASS
96
+ elsif @line =~ /\Aclass\s/ || @line =~ /\Afinal class\s/
97
+ raise RuntimeError, "Class in file is not public: #{@line}"
98
+ elsif @line =~ /\Apublic abstract class/
99
+ return TYPE_CLASS_ABSTRACT
100
+ elsif @line =~ /\Apublic enum/
101
+ return TYPE_ENUM
102
+ elsif @line =~ /\Apublic interface/
103
+ return TYPE_INTERFACE
104
+ end
15
105
  end
16
106
 
17
107
  end
@@ -31,7 +31,7 @@ module Blufin
31
31
  @data[@file] = {}
32
32
  @data[@file][:methods] = {}
33
33
 
34
- @liner = nil
34
+ @line = nil
35
35
  @line_number = 0
36
36
  @params = nil
37
37
  @docs = nil
@@ -64,13 +64,7 @@ module Blufin
64
64
  @params = {}
65
65
  # Extract method data.
66
66
  parse_method_definition(@line)
67
-
68
67
  @docs = nil
69
- else
70
-
71
- # TODO - REMOVE
72
- # puts line unless @docs_active || @method_active
73
-
74
68
  end
75
69
 
76
70
  # If we're inside a comment.
@@ -0,0 +1,34 @@
1
+ module Blufin
2
+
3
+ class ScannerJsTests
4
+
5
+ # Scan Javascript (test) code.
6
+ # @return void
7
+ def self.scan(path)
8
+
9
+ # Check path exists.
10
+ Blufin::Terminal::error("Path does not exist: #{Blufin::Terminal::format_invalid(path)}") unless Blufin::Files::path_exists(path)
11
+
12
+ @data = {}
13
+ @errors = []
14
+
15
+ # Get all file(s) in path.
16
+ Blufin::Files::get_files_in_dir(path, 'js').each { |file| scan_file(file) }
17
+
18
+ return @data, @errors
19
+
20
+ end
21
+
22
+ private
23
+
24
+ # Scans a file.
25
+ # @return void
26
+ def self.scan_file(file)
27
+
28
+ # TODO NOW - FINISH THIS!
29
+
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -9,11 +9,25 @@ module Blufin
9
9
  # Check path exists.
10
10
  Blufin::Terminal::error("Path does not exist: #{Blufin::Terminal::format_invalid(path)}") unless Blufin::Files::path_exists(path)
11
11
 
12
- # TODO - REMOVE
13
- raise 'Not yet implemented!'
12
+ @data = {}
13
+ @errors = []
14
+
15
+ # Get all file(s) in path.
16
+ Blufin::Files::get_files_in_dir(path, 'vue').each { |file| scan_file(file) }
17
+
18
+ return @data, @errors
14
19
 
15
20
  end
16
21
 
22
+ private
23
+
24
+ # Scans a file.
25
+ # @return void
26
+ def self.scan_file(file)
27
+
28
+ # TODO NOW - FINISH THIS!
29
+
30
+ end
17
31
 
18
32
  end
19
33
 
data/lib/version.rb CHANGED
@@ -1 +1 @@
1
- BLUFIN_LIB_VERSION = '1.8.2'
1
+ BLUFIN_LIB_VERSION = '2.0.0'
@@ -0,0 +1,47 @@
1
+ type: map
2
+ mapping:
3
+ ApiSimple:
4
+ type: map
5
+ mapping:
6
+ Package:
7
+ required: true
8
+ pattern: /^[a-z0-9\.\-]+$/
9
+ ControllerPath:
10
+ required: true
11
+ pattern: /^[a-z0-9\-\/]+$/
12
+ ServicePath:
13
+ required: true
14
+ pattern: /^[a-z0-9\-\/]+$/
15
+ Lambda:
16
+ type: map
17
+ mapping:
18
+ ChangeMe:
19
+ type: bool
20
+ Quasar:
21
+ type: map
22
+ mapping:
23
+ Root:
24
+ required: true
25
+ pattern: /^[a-z0-9\-\/]+$/
26
+ PathPages:
27
+ required: true
28
+ pattern: /^[a-z0-9\-\/]+$/
29
+ PathPagesIgnore:
30
+ type: seq
31
+ sequence:
32
+ - type: str
33
+ ApiDocsFile:
34
+ required: true
35
+ pattern: /^[a-z0-9\-\.\/]+$/
36
+ JsDocsFile:
37
+ required: true
38
+ pattern: /^[a-z0-9\-\.\/]+$/
39
+ JsPath:
40
+ required: true
41
+ pattern: /^[a-z0-9\-\/]+$/
42
+ JsPathTests:
43
+ required: true
44
+ pattern: /^[a-z0-9\-\/]+$/
45
+ RoutesFile:
46
+ required: true
47
+ pattern: /^[a-z0-9\-\.\/]+$/
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.2
4
+ version: 2.0.0
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-19 00:00:00.000000000 Z
11
+ date: 2019-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -149,17 +149,14 @@ files:
149
149
  - lib/core/validate.rb
150
150
  - lib/core/versioning.rb
151
151
  - lib/core/yml.rb
152
- - lib/generate/generate_base.rb
153
- - lib/generate/generate_ui_routes.rb
154
- - lib/scan/scanner.rb
155
152
  - lib/scan/scanner_error.rb
156
153
  - lib/scan/scanner_java.rb
157
154
  - lib/scan/scanner_js.rb
155
+ - lib/scan/scanner_js_tests.rb
158
156
  - lib/scan/scanner_vue.rb
159
157
  - lib/version.rb
160
- - opt/schema/projects-quasarrc.yml
158
+ - opt/schema/codegen.yml
161
159
  - opt/schema/projects.yml
162
- - opt/schema/routes.yml
163
160
  - opt/shell/ec2-check
164
161
  homepage: https://github.com/alb3rtuk
165
162
  licenses:
@@ -181,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
178
  version: '0'
182
179
  requirements: []
183
180
  rubyforge_project:
184
- rubygems_version: 2.5.1
181
+ rubygems_version: 2.5.2.3
185
182
  signing_key:
186
183
  specification_version: 4
187
184
  summary: Blufin Lib
@@ -1,47 +0,0 @@
1
- module Blufin
2
-
3
- class GenerateBase
4
-
5
- OUTPUT_GENERATE = 'generated'
6
- OUTPUT_SKIP = 'exists'
7
-
8
- # Standardized output for code-generation.
9
- # @return void
10
- def self.output(message, type)
11
-
12
- case type
13
- when OUTPUT_GENERATE
14
- puts "\x1B[38;5;231m\x1B[48;5;55m Generated \x1B[0m \xe2\x86\x92 \x1B[38;5;182m#{message}\x1B[0m"
15
- when OUTPUT_SKIP
16
- puts " \x1B[38;5;246m\x1B[48;5;234m Skipping \x1B[0m \xe2\x86\x92 \x1B[38;5;240m#{message}\x1B[0m"
17
- else
18
- raise "Unrecognized output type: #{type}"
19
- end
20
-
21
- end
22
-
23
- # Display errors/warnings after code generation, if any.
24
- # This method currently terminates with a 1 exit code if errors/warnings occurred, 0 if not.
25
- # @return void
26
- def self.exit_code_generation(errors, warnings)
27
-
28
- if warnings.any?
29
- Blufin::Terminal::warning('Please fix the following warnings(s):', nil, false)
30
- warnings.each { |warning| puts " #{warning}" }
31
- puts
32
- end
33
-
34
- if errors.any?
35
- Blufin::Terminal::error('Please fix the following error(s):', nil, false)
36
- errors.each { |error| puts " #{error}" }
37
- puts
38
- exit 1
39
- end
40
-
41
- return errors.any? || warnings.any? ? 1 : 0
42
-
43
- end
44
-
45
- end
46
-
47
- end
@@ -1,230 +0,0 @@
1
- module Blufin
2
-
3
- class GenerateUiRoutes
4
-
5
- SCHEMA_FILE = "#{Blufin::Base::get_base_path}#{Blufin::Base::OPT_PATH}/schema/routes.yml"
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
-
21
-
22
- # Generates routes in the UI.
23
- # @return void
24
- def self.run(project)
25
- raise RuntimeError, "Expected project type to be: #{Blufin::Projects::TYPE_QUASAR}, instead got: #{project[Blufin::Projects::TYPE]}" unless project[Blufin::Projects::TYPE] == Blufin::Projects::TYPE_QUASAR
26
- @errors = []
27
- @warnings = []
28
- @files = []
29
- @files_to_create = []
30
- root_path_seen = nil
31
- begin
32
- @output = <<TEMPLATE
33
- const routes = [
34
- {
35
- TEMPLATE
36
- project_path = Blufin::Projects::get_project_path(project[Blufin::Projects::PROJECT_ID], true)
37
- routes_file = "#{project_path}/#{project[Blufin::Projects::TRANSIENT_DATA][Blufin::Projects::QUASAR_ROUTES_FILE]}"
38
- routes_yml = Blufin::Yml::read_file(routes_file, SCHEMA_FILE)
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]
42
- path_pages_ignore = []
43
- path_to_pages = "#{project_path}/src/#{pages_root}"
44
-
45
- # Add ignore path(s) -- if exists.
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]
50
- routes.each_with_index do |route, idx|
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}
105
- component: () => import('./../#{layout}')#{comma}
106
- TEMPLATE
107
- file = "#{pages_root}/#{parent_path}/index.vue"
108
- prefix = parent_path == HOME_TERM ? 'dashboard/' : nil
109
- process_file(file, project_path)
110
- if route.has_key?(CHILDREN)
111
- @output += <<TEMPLATE
112
- children: [
113
- {
114
- path: '',
115
- component: () => import('./../#{file}')
116
- },
117
- TEMPLATE
118
- # Loop Children.
119
- children = route[CHILDREN]
120
- children.each_with_index do |child, idx|
121
- comma = idx == children.length - 1 ? nil : ','
122
- file = "#{pages_root}/#{parent_path}/#{child[PATH]}.vue"
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]
125
- process_file(file, project_path)
126
- @output += <<TEMPLATE
127
- {
128
- path: '#{prefix}#{child[PATH]}',
129
- name: '#{child[NAME]}',#{disabled}
130
- component: () => import('./../#{file}')
131
- }#{comma}
132
- TEMPLATE
133
- end
134
- @output += " ]\n"
135
- end
136
-
137
- if idx == routes.length - 1
138
- @output += <<TEMPLATE
139
- }
140
- TEMPLATE
141
- else
142
- @output += <<TEMPLATE
143
- },
144
- {
145
- TEMPLATE
146
- end
147
- end
148
-
149
- @output += <<TEMPLATE
150
- ];
151
-
152
- if (process.env.MODE !== 'ssr') {
153
- routes.push({
154
- path: '*',
155
- component: () => import('./../#{pages_not_found}')
156
- });
157
- }
158
-
159
- export default routes;
160
- TEMPLATE
161
- rescue => e
162
- Blufin::Terminal::print_exception(e)
163
- end
164
-
165
- # Write the output to the file.
166
- Blufin::Files::write_file(target_file, Blufin::Arrays::convert_string_to_line_array(@output))
167
-
168
- # Output message.
169
- Blufin::Terminal::info('Generating route file(s):') if @files_to_create.any?
170
-
171
- # Write all the blank route files.
172
- @files_to_create.each do |ftc|
173
- if Blufin::Files::file_exists(ftc)
174
- Blufin::GenerateBase::output(ftc, Blufin::GenerateBase::OUTPUT_SKIP)
175
- else
176
- Blufin::Files::write_file(ftc, Blufin::Arrays::convert_string_to_line_array(get_blank_file_content))
177
- Blufin::GenerateBase::output(ftc, Blufin::GenerateBase::OUTPUT_GENERATE)
178
- end
179
- end
180
-
181
- puts if @files_to_create.any?
182
-
183
- # Check for rogue files.
184
- Blufin::Files::get_files_in_dir(path_to_pages).each do |file|
185
- next if file =~ /#{path_to_pages}\/(#{path_pages_ignore.join('|')})\/[a-z0-9]/
186
- unless @files_to_create.include?(file)
187
- @warnings << "Found rogue file: #{Blufin::Terminal::format_invalid(file)}"
188
- end
189
- end
190
-
191
- return @errors, @warnings
192
-
193
- end
194
-
195
- private
196
-
197
- # Ensures that we're not defining a path twice.
198
- # Creates file if not exists
199
- # @return void
200
- def self.process_file(file, project_path)
201
- @errors << "Duplicate file: #{Blufin::Terminal::format_invalid(file)}" if @files.include?(file)
202
- @files << file
203
- @files_to_create << "#{project_path}/src/#{file}"
204
- end
205
-
206
- # Returns the contents of a blank file.
207
- # @return string
208
- def self.get_blank_file_content
209
- <<TEMPLATE
210
- <template>
211
- <div>
212
- <base-title h="5" :nudge-right="30" :nudge-up="10">{{ $route.name }}</base-title>
213
- </div>
214
- </template>
215
-
216
- <script>
217
- export default {
218
- data() {
219
- return {};
220
- }
221
- };
222
- </script>
223
-
224
- <style scoped type="text/scss" lang="scss"></style>
225
- TEMPLATE
226
- end
227
-
228
- end
229
-
230
- end
data/lib/scan/scanner.rb DELETED
@@ -1,41 +0,0 @@
1
- module Blufin
2
-
3
- class Scanner
4
-
5
- # Initialize the class.
6
- # @return void
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
- }
36
-
37
- end
38
-
39
- end
40
-
41
- end
@@ -1,8 +0,0 @@
1
- type: map
2
- mapping:
3
- JsPath:
4
- required: true
5
- JsPathTests:
6
- required: true
7
- RoutesFile:
8
- required: true
@@ -1,44 +0,0 @@
1
- type: map
2
- mapping:
3
- PagesRoot:
4
- required: true
5
- Pages404:
6
- required: true
7
- RoutesFile:
8
- required: true
9
- Ignore:
10
- type: seq
11
- sequence:
12
- - type: str
13
- Routes:
14
- type: seq
15
- required: true
16
- sequence:
17
- - type: map
18
- mapping:
19
- Parent:
20
- type: map
21
- required: true
22
- mapping:
23
- Layout:
24
- required: true
25
- Path:
26
- required: true
27
- Name:
28
- Icon:
29
- RootPath:
30
- type: bool
31
- Invisible:
32
- type: bool
33
- Children:
34
- type: seq
35
- sequence:
36
- - type: map
37
- required: true
38
- mapping:
39
- Path:
40
- required: true
41
- Name:
42
- required: true
43
- Disabled:
44
- type: bool