eworld 1.2.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: 75950a16fbe8126fcd439351997bf68c4d912f67
4
- data.tar.gz: fe5d72a612293037e4667379eea1a4be21f750ef
3
+ metadata.gz: '078008fd3dd291e33389b27aa315baf2e685e058'
4
+ data.tar.gz: c60c14e788eead8fce813927566c3d3fbb6e698d
5
5
  SHA512:
6
- metadata.gz: 5176d9ea6e1f28b299b26f380f00d412282eb617e6e9ca998b0c8d1a8f7eccd09bb482aad5e4d4725ecb7dbb50adcfbb92127c25ce8e8e35b29f46c77a9011fa
7
- data.tar.gz: 4fd6382b37596917e580333ceaec8f52d45a8733d70df92b44b87de6545bff708a7a92b03328009fa999d9cb2bf4c6a65d3f130bf2e487442028046683c68bad
6
+ metadata.gz: e94582312d862b1604f9b34ec7cc6a82691ff22bf610ddb008d5f323adad8ff750fdf304cbdbba9b6b542986195db1fe3dfd9fc4a87ff052582287ee5505b652
7
+ data.tar.gz: 6923c41a9ab7945198a4b93eab25b9db09e6269df1c5f776427fef85ea5b521134e3eba4ae968c95b9fd1b97a931b3ed039ef5c0d69b604f754e9030937e7d3d
@@ -0,0 +1,41 @@
1
+ module App
2
+
3
+ class AWSProfile
4
+
5
+ @@profile = nil
6
+ @@credentials = nil
7
+
8
+ # Reads the config data and attempts to extract the profile.
9
+ # @return void
10
+ def self.init(config_data)
11
+
12
+ errors = []
13
+
14
+ # Get the profile out of the config YML.
15
+ @@profile = config_data['AWS']['Profile'] if config_data.has_key?('AWS')
16
+
17
+ # Check the credentials exist.
18
+ @@credentials, more_errors = Blufin::AWS::get_aws_credentials(@@profile)
19
+ errors.concat(more_errors)
20
+
21
+ # If anything is wrong, output error(s).
22
+ Blufin::Config::invalid_configuration(App::GEM_NAME, errors) if errors.any?
23
+
24
+ end
25
+
26
+ # Get the AWS profile. Returns either the profile (or nil).
27
+ # @return string
28
+ def self.get
29
+ @@profile
30
+ end
31
+
32
+ # Convenience method to just get the profile name.
33
+ # @return string
34
+ def self.get_profile_name
35
+ return nil if @@credentials.nil?
36
+ @@profile[PROFILE]
37
+ end
38
+
39
+ end
40
+
41
+ end
data/lib/eworld.rb CHANGED
@@ -2,11 +2,16 @@ require 'blufin-lib'
2
2
  require 'columnist'
3
3
  require 'convoy'
4
4
  require 'yaml'
5
+ require 'json'
6
+
5
7
  require_relative 'version'
8
+ require 'writers/base_writer'
6
9
 
7
10
  Dir["#{File.dirname(__FILE__)}/core/**/*.rb"].each { |file| load(file) }
8
11
  Dir["#{File.dirname(__FILE__)}/routes/**/*.rb"].each { |file| load(file) }
9
12
  Dir["#{File.dirname(__FILE__)}/rules/**/*.rb"].each { |file| load(file) }
13
+ Dir["#{File.dirname(__FILE__)}/scanners/**/*.rb"].each { |file| load(file) }
14
+ Dir["#{File.dirname(__FILE__)}/writers/**/*.rb"].each { |file| load(file) unless file =~ /\/(base_writer)\.rb\z/ }
10
15
 
11
16
  module App
12
17
 
@@ -22,7 +27,8 @@ module App
22
27
 
23
28
  unless ARGV[0] == 'config' || ARGV[0] == 'x'
24
29
  Blufin::Config::init(SCHEMA_FILE, TEMPLATE_FILE, CONFIG_FILE, GEM_NAME)
25
- Blufin::Projects.new(Blufin::Config::get['Projects'])
30
+ App::AWSProfile::init(Blufin::Config::get)
31
+ Blufin::Projects.new(Blufin::Config::get['Projects'], App::AWSProfile::get)
26
32
  end
27
33
 
28
34
  Convoy::App.create do |app|
@@ -43,39 +49,11 @@ TEMPLATE
43
49
  if is_albert_mac
44
50
  app.command :generate, :aliases => [:g] do |generate|
45
51
  generate.summary 'Generate boiler-plate code'
46
- # a - GENERATE API
47
- generate.command :api, :aliases => [:a] do |generate_api|
48
- generate_api.summary 'Generate API code'
49
- # e - GENERATE API ENTITIES
50
- generate_api.command :api_entities, :aliases => [:e] do |generate_api_entities|
51
- generate_api_entities.summary 'Generate boiler-plate entity code'
52
- generate_api_entities.action do |opts, args|
53
- AppCommand::GenerateApiEntities.new(opts, args).execute
54
- end
55
- end
56
- # GENERATE API (Default)
57
- generate_api.action do
58
- system("#{App::GEM_NAME} g a -h")
59
- end
60
- end
61
- # generate - GENERATE UI
62
- generate.command :ui, :aliases => [:u] do |generate_ui|
63
- generate_ui.summary 'Generate UI code'
64
- # r - GENERATE UI ROUTES
65
- generate_ui.command :ui_routes, :aliases => [:r] do |generate_ui_routes|
66
- generate_ui_routes.summary 'Generate routes.js (and blank routes if not exists)'
67
- generate_ui_routes.action do |opts, args|
68
- AppCommand::GenerateUiRoutes.new(opts, args).execute
69
- end
70
- end
71
- # GENERATE UI (Default)
72
- generate_ui.action do
73
- system("#{App::GEM_NAME} g u -h")
74
- end
52
+ generate.options do |opts|
53
+ opts.opt :silent, 'Run in silent mode', :short => '-s', :long => '--silent', :type => :boolean
75
54
  end
76
- # GENERATE (Default)
77
- generate.action do
78
- system("#{App::GEM_NAME} g -h")
55
+ generate.action do |opts, args|
56
+ AppCommand::Generate.new(opts, args).execute
79
57
  end
80
58
  end
81
59
  end
@@ -0,0 +1,127 @@
1
+ module AppCommand
2
+
3
+ class Generate < ::Convoy::ActionCommand::Base
4
+
5
+ def execute
6
+
7
+ begin
8
+
9
+ @opts = command_options
10
+ @args = arguments
11
+
12
+ @verbose = !@opts[:silent]
13
+
14
+ @errors = []
15
+ @generated = []
16
+ @overwritten = []
17
+
18
+ opts_validate
19
+ opts_routing
20
+
21
+ rescue => e
22
+
23
+ Blufin::Terminal::print_exception(e)
24
+
25
+ end
26
+
27
+ end
28
+
29
+ def opts_validate
30
+
31
+ # TODO - This cannot be hard-coded forever!
32
+ group = 'fmm'
33
+
34
+ # Get API Project.
35
+ api_projects = Blufin::Projects.get_projects_as_array(group: group, types: [Blufin::Projects::TYPE_API_SIMPLE])
36
+ @api_project = Blufin::Projects.show_project_prompt(api_projects)
37
+
38
+ # Get Quasar Project.
39
+ ui_projects = Blufin::Projects.get_projects_as_array(group: group, types: [Blufin::Projects::TYPE_QUASAR])
40
+ @ui_project = Blufin::Projects.show_project_prompt(ui_projects)
41
+
42
+ # Get project path(s).
43
+ @project_path = Blufin::Projects::get_project_path(@api_project[Blufin::Projects::PROJECT_ID])
44
+ @project_path_ui = Blufin::Projects::get_project_path(@ui_project[Blufin::Projects::PROJECT_ID], true)
45
+
46
+ puts if @verbose
47
+
48
+ td = @ui_project[Blufin::Projects::TRANSIENT_DATA]
49
+ root = Blufin::Strings::remove_surrounding_slashes(td[Blufin::Projects::CG_QUASAR_ROOT])
50
+ js = Blufin::Strings::remove_surrounding_slashes(td[Blufin::Projects::CG_QUASAR_JS])
51
+
52
+ Blufin::Terminal::execute_proc("Scanning: #{Blufin::Terminal::format_highlight('Javascript')}", Proc.new {
53
+ eb = @errors.length
54
+ @js, je = Blufin::ScannerJs::scan("#{@project_path}/#{root}/#{js}")
55
+ @errors.concat(je)
56
+ eb == @errors.length
57
+ }, verbose: @verbose)
58
+
59
+ Blufin::Terminal::execute_proc("Scanning: #{Blufin::Terminal::format_highlight('Routes')}", Proc.new {
60
+ eb = @errors.length
61
+ @routes_to_write, re = EWorld::RouteScanner::scan(@ui_project)
62
+ @errors.concat(re)
63
+ eb == @errors.length
64
+ }, verbose: @verbose)
65
+
66
+ Blufin::Terminal::execute_proc("Scanning: #{Blufin::Terminal::format_highlight('Controllers')}", Proc.new {
67
+ eb = @errors.length
68
+ @controllers, ce = EWorld::ControllerScanner::scan(@api_project)
69
+ @errors.concat(ce)
70
+ eb == @errors.length
71
+ }, verbose: @verbose)
72
+
73
+ puts if @errors.any? && @verbose
74
+
75
+ Blufin::ScannerError::output_cli(@errors, false) if @errors.any?
76
+
77
+ end
78
+
79
+ def opts_routing
80
+
81
+ Blufin::Terminal::execute_proc("Processing: #{Blufin::Terminal::format_highlight('Routes')}", Proc.new {
82
+ rg, ro = EWorld::RouteWriter::write(@ui_project, @routes_to_write)
83
+ @generated.concat(rg)
84
+ @overwritten.concat(ro)
85
+ }, verbose: @verbose)
86
+
87
+ Blufin::Terminal::execute_proc("Processing: #{Blufin::Terminal::format_highlight('Controllers')}", Proc.new {
88
+ cg, co = EWorld::ControllerWriter::write(@api_project, @ui_project, @controllers)
89
+ @generated.concat(cg)
90
+ @overwritten.concat(co)
91
+
92
+ }, verbose: @verbose)
93
+
94
+ Blufin::Terminal::execute_proc("Processing: #{Blufin::Terminal::format_highlight('Services')}", Proc.new {
95
+ sg, so = EWorld::ServiceWriter::write(@api_project, @ui_project, @controllers)
96
+ @generated.concat(sg)
97
+ @overwritten.concat(so)
98
+ }, verbose: @verbose)
99
+
100
+ Blufin::Terminal::execute_proc("Processing: #{Blufin::Terminal::format_highlight('API Docs (JSON)')}", Proc.new {
101
+ ag, ao = EWorld::ApiDocsWriter::write(@api_project, @ui_project, @controllers)
102
+ @generated.concat(ag)
103
+ @overwritten.concat(ao)
104
+ }, verbose: @verbose)
105
+
106
+ Blufin::Terminal::execute_proc("Processing: #{Blufin::Terminal::format_highlight('JS Docs (JSON)')}", Proc.new {
107
+ jg, jo = EWorld::JsDocsWriter::write(@api_project, @ui_project, @js)
108
+ @generated.concat(jg)
109
+ @overwritten.concat(jo)
110
+ }, verbose: @verbose)
111
+
112
+ # Reformat front-end.
113
+ Blufin::Terminal::execute_proc('Re-formatting UI codebase', Proc.new {
114
+ Blufin::Terminal::execute('git add .', @project_path_ui, verbose: false)
115
+ Blufin::Terminal::execute('yarn format', @project_path_ui, verbose: false)
116
+ }, verbose: @verbose)
117
+
118
+ puts if @verbose && !@generated.any? && !@overwritten.any?
119
+
120
+ Blufin::Terminal::custom('Generated', 22, 'The following files were generated:', @generated) if @generated.any?
121
+ Blufin::Terminal::custom('Overwritten', 55, 'The following files were overwritten:', @overwritten) if @overwritten.any?
122
+
123
+ end
124
+
125
+ end
126
+
127
+ end
data/lib/routes/scan.rb CHANGED
@@ -27,15 +27,51 @@ module AppCommand
27
27
  def opts_routing
28
28
 
29
29
  # TODO - This cannot be hard-coded forever!
30
- project = 'fmm'
31
-
32
- @results = Blufin::Scanner::scan(project)
33
- @errors = @results[:errors]
30
+ group = 'fmm'
31
+
32
+ @errors = []
33
+ @js = nil
34
+ @java = nil
35
+
36
+ Blufin::Projects::get_projects_as_array.each do |project|
37
+ if project[Blufin::Projects::PROJECT] == group
38
+ project_id = project[Blufin::Projects::PROJECT_ID]
39
+ project_type = project[Blufin::Projects::TYPE]
40
+ project_path = Blufin::Projects::get_project_path(project_id)
41
+ project_path_inner = Blufin::Projects::get_project_path(project_id, true)
42
+ case project_type
43
+ when Blufin::Projects::TYPE_API_SIMPLE
44
+ raise RuntimeError, "Project with type: #{Blufin::Projects::TYPE_API_SIMPLE} already scanned." unless @java.nil?
45
+ @java, errors_java = Blufin::ScannerJava::scan("#{project_path_inner}")
46
+ @errors.concat(errors_java)
47
+ when Blufin::Projects::TYPE_QUASAR
48
+ raise RuntimeError, "Project with type: #{Blufin::Projects::TYPE_QUASAR} already scanned." unless @s.nil?
49
+ # Scan the routes.
50
+ @routes, errors_routes = EWorld::RouteScanner::scan(project)
51
+ @errors.concat(errors_routes)
52
+ # Extract JS data.
53
+ td = project[Blufin::Projects::TRANSIENT_DATA]
54
+ root = Blufin::Strings::remove_surrounding_slashes(td[Blufin::Projects::CG_QUASAR_ROOT])
55
+ js = Blufin::Strings::remove_surrounding_slashes(td[Blufin::Projects::CG_QUASAR_JS])
56
+ jst = Blufin::Strings::remove_surrounding_slashes(td[Blufin::Projects::CG_QUASAR_TESTS])
57
+ if project.has_key?(Blufin::Projects::TRANSIENT_DATA) && td.has_key?(Blufin::Projects::CG_QUASAR_JS)
58
+ @js, errors_js = Blufin::ScannerJs::scan("#{project_path}/#{root}/#{js}")
59
+ @js_tests, errors_js_tests = Blufin::ScannerJsTests::scan("#{project_path}/#{root}/#{jst}")
60
+ @vue, errors_vue = Blufin::ScannerVue::scan("#{project_path}/#{root}")
61
+ @errors.concat(errors_js)
62
+ @errors.concat(errors_js_tests)
63
+ @errors.concat(errors_vue)
64
+ end
65
+ else
66
+ raise RuntimeError, "Unsupported project type: #{project_type}"
67
+ end
68
+ end
69
+ end
34
70
 
35
- run_js_rules(@results[:js_data]) unless @results[:js_data].nil?
71
+ run_js_rules(@js) unless @js.nil?
36
72
 
37
73
  # Output Errors (if any).
38
- Blufin::ScannerError::output_cli(@errors) if @errors.any?
74
+ Blufin::ScannerError::output_cli(@errors)
39
75
 
40
76
  end
41
77
 
@@ -2,7 +2,6 @@ module EWorld
2
2
 
3
3
  class RuleJsParameters
4
4
 
5
-
6
5
  # This rule validate JS method parameters.
7
6
  # It checks that the parameters match the actual methods and that we have a description/return type.
8
7
  # @return Array (of errors)
@@ -34,7 +33,7 @@ module EWorld
34
33
  actual = method_data[:docs][:params].keys
35
34
 
36
35
  # Throw error if params don't match comments.
37
- raise RuntimeError, "Params docs (for #{method_name}) are missing or don't match." if expected.to_s != actual.to_s
36
+ raise RuntimeError, "#{method_name} \xe2\x80\x94 Param docs are missing, corrupted or incorrect." if expected.to_s != actual.to_s
38
37
 
39
38
  # Make sure we have all the comment doc stuff we need.
40
39
  if method_data[:docs].is_a?(Hash)
@@ -0,0 +1,137 @@
1
+ module EWorld
2
+
3
+ class ControllerScanner
4
+
5
+ SCHEMA_FILE = "#{EWorld::Opt::get_base_path}#{EWorld::Opt::OPT_PATH}/schema/controllers.yml"
6
+
7
+ # Responsible for scanning the .codegen/controllers/[MULTIPLE].yml file(s).
8
+ # @return Array
9
+ def self.scan(api_project)
10
+
11
+ # TODO - Need to inject permissions.
12
+ # TODO - Need to inject entities.
13
+
14
+ raise RuntimeError, "Expected project type to be: #{Blufin::Projects::TYPE_API_SIMPLE}, instead got: #{api_project[Blufin::Projects::TYPE]}" unless api_project[Blufin::Projects::TYPE] == Blufin::Projects::TYPE_API_SIMPLE
15
+ @errors = []
16
+ @controllers = {}
17
+ @classes_seen = []
18
+ @paths_seen = []
19
+ begin
20
+ @project_path = Blufin::Projects::get_project_path(api_project[Blufin::Projects::PROJECT_ID])
21
+ @project_path_api = Blufin::Projects::get_project_path(api_project[Blufin::Projects::PROJECT_ID], true)
22
+ @project_transient_api = api_project[Blufin::Projects::TRANSIENT_DATA]
23
+ @controller_path = "#{EWorld::BaseWriter::get_java_path_for(@project_path, @project_transient_api['ControllerPath'])}/#{EWorld::ControllerWriter::PACKAGE_NAME}"
24
+ @service_path = "#{EWorld::BaseWriter::get_java_path_for(@project_path, @project_transient_api['ServicePath'])}/#{EWorld::ServiceWriter::PACKAGE_NAME}"
25
+ controller_yml_path = "#{@project_path}/.#{Blufin::Projects::CODEGEN}/controllers"
26
+ # If path not found, bomb-out immediately.
27
+ unless Blufin::Files::path_exists(controller_yml_path)
28
+ @errors << Blufin::ScannerError::add_error(nil, "YML Controller path not found: #{controller_yml_path}")
29
+ return @errors, {}
30
+ end
31
+ # If the parent path where controllers/services should live doesn't exists -- bomb-out!
32
+ [@controller_path, @service_path].each do |path|
33
+ unless Blufin::Files::path_exists(path)
34
+ @errors << Blufin::ScannerError::add_error(nil, "Path not found: #{path}")
35
+ return {}, @errors
36
+ end
37
+ end
38
+ # Loop all the YML files. Each file = 1 controller.
39
+ Blufin::Files::get_files_in_dir(controller_yml_path).each do |controller_file|
40
+ @file = controller_file
41
+ # Get extension + controller root path.
42
+ fs = @file.split('.')
43
+ @root_path = fs[fs.length - 2].split('/')
44
+ @root_path = @root_path[@root_path.length - 1]
45
+ @class_name = "#{Blufin::Strings::snake_case_to_camel_case(@root_path.gsub('-', '_'))}"
46
+ ext = fs[fs.length - 1]
47
+ # Make sure we don't have duplicate class names.
48
+ @errors << Blufin::ScannerError::add_error(@file, "Duplicate class: #{@class_name}") if @classes_seen.include?(@class_name.upcase)
49
+ @classes_seen << @class_name.upcase
50
+ # Make sure we have validly named YML file(s).
51
+ @errors << Blufin::ScannerError::add_error(@file, "Expected extension to be lowercase 'yml', instead got: #{ext}") if ext.downcase != 'yml'
52
+ unless ext.downcase == 'yml'
53
+ @errors << Blufin::ScannerError::add_error(@file, "Expected extension to be 'yml', instead got: #{ext}")
54
+ next
55
+ end
56
+ controller_yml = Blufin::Yml::read_file(@file, SCHEMA_FILE)
57
+ # Validate file. If errors, go to next file.
58
+ next unless validate_file(controller_yml)
59
+ controller_yml['RootPath'] = Blufin::Strings::remove_surrounding_slashes(@root_path)
60
+ @controllers[@class_name] = controller_yml
61
+ end
62
+ rescue => e
63
+ Blufin::Terminal::print_exception(e)
64
+ end
65
+ return @controllers, @errors
66
+ end
67
+
68
+ private
69
+
70
+ # Put all validation here. If any errors get added, this method returns FALSE and the loop at the top skips processing.
71
+ # @return bool
72
+ def self.validate_file(data)
73
+ error_count_before = @errors.length
74
+ if data.has_key?('EndPoints') && data['EndPoints'].is_a?(Array)
75
+ data['EndPoints'].each do |resource|
76
+ path = resource['Path']
77
+ path_full = "/#{Blufin::Strings::remove_surrounding_slashes(@root_path)}/#{Blufin::Strings::remove_surrounding_slashes(resource['Path'])}"
78
+ path_downcase = path_full.downcase
79
+ method = resource['Method']
80
+ path_method = "#{method} #{path_downcase}"
81
+ prefix = "#{path_full} \xe2\x80\x94 "
82
+ # Make sure path does not have trailing/preceding slashes.
83
+ @errors << Blufin::ScannerError::add_error(@file, "#{prefix}Path should not have trailing/preceding slash(es): #{path}") if path =~ /^\// || path =~ /\/$/
84
+ # Make sure paths are always lowercase.
85
+ @errors << Blufin::ScannerError::add_error(@file, "#{prefix}Path(s) must be lowercase, found: #{path_full}") if path_full != path_downcase
86
+ path_full.downcase!
87
+ # Make sure there are no duplicate permissions.
88
+ if resource.has_key?('Permissions')
89
+ perms = []
90
+ resource['Permissions'].each do |perm|
91
+ if perms.include?(perm)
92
+ @errors << Blufin::ScannerError::add_error(@file, "#{prefix}Duplicate permission(s): #{perm}")
93
+ next
94
+ end
95
+ perms << perm
96
+ end
97
+ end
98
+ # Make sure we don't have duplicate paths.
99
+ @errors << Blufin::ScannerError::add_error(@file, "Duplicate end-point: #{path_method}") if @paths_seen.include?(path_method)
100
+ @paths_seen << path_method
101
+
102
+ if %w(POST PUT).include?(method)
103
+
104
+ # TODO NOW - Validate POST/PUT stuff.
105
+
106
+ end
107
+
108
+ # TODO NOW - Validate Service/Method exists.
109
+ # TODO NOW - Validate Request Params match service method.
110
+ # TODO NOW - What about abstract controller calls for entities?
111
+
112
+ end
113
+ end
114
+
115
+ service_file = "#{@service_path}/#{@class_name}Service.java"
116
+ if Blufin::Files::file_exists(service_file)
117
+
118
+ # TODO - Must scan file here ...
119
+
120
+ java_data, errors = Blufin::ScannerJava::scan_file(service_file)
121
+
122
+ # TODO - REMOVE
123
+ # puts
124
+ # puts java_data.to_yaml
125
+ # puts errors.to_yaml
126
+
127
+ @errors.concat(errors)
128
+
129
+ end
130
+
131
+ # If errors have been added, return FALSE.
132
+ @errors.length == error_count_before
133
+ end
134
+
135
+ end
136
+
137
+ end
@@ -0,0 +1,15 @@
1
+ module EWorld
2
+
3
+ class EntityScanner
4
+
5
+ # Responsible for scanning the .codegen/entities/[MULTIPLE].yml file.
6
+ # @return Array
7
+ def self.scan(project)
8
+
9
+ # TODO - Need to inject permissions.
10
+
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,15 @@
1
+ module EWorld
2
+
3
+ class PermissionScanner
4
+
5
+ # Responsible for scanning the .codegen/permissions/permissions.yml file.
6
+ # @return Array
7
+ def self.scan(project)
8
+
9
+ # TODO NOW - FINISH THIS!
10
+
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,15 @@
1
+ module EWorld
2
+
3
+ class QueueScanner
4
+
5
+ # Responsible for scanning the .codegen/queue/queue.yml file.
6
+ # @return Array
7
+ def self.scan(project)
8
+
9
+ # TODO NOW - FINISH THIS!
10
+
11
+ end
12
+
13
+ end
14
+
15
+ end