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 +4 -4
 - data/lib/core/aws_profile.rb +41 -0
 - data/lib/eworld.rb +11 -33
 - data/lib/routes/generate.rb +127 -0
 - data/lib/routes/scan.rb +42 -6
 - data/lib/rules/js/rule_js_parameters.rb +1 -2
 - data/lib/scanners/controller_scanner.rb +137 -0
 - data/lib/scanners/entity_scanner.rb +15 -0
 - data/lib/scanners/permission_scanner.rb +15 -0
 - data/lib/scanners/queue_scanner.rb +15 -0
 - data/lib/scanners/route_scanner.rb +239 -0
 - data/lib/version.rb +1 -1
 - data/lib/writers/api_docs_writer.rb +32 -0
 - data/lib/writers/base_writer.rb +21 -0
 - data/lib/writers/controller_writer.rb +115 -0
 - data/lib/writers/entity_writer.rb +15 -0
 - data/lib/writers/js_docs_writer.rb +32 -0
 - data/lib/writers/permission_writer.rb +15 -0
 - data/lib/writers/queue_writer.rb +14 -0
 - data/lib/writers/route_writer.rb +56 -0
 - data/lib/writers/service_writer.rb +106 -0
 - data/opt/config/schema.yml +7 -0
 - data/opt/schema/controllers.yml +32 -0
 - data/opt/schema/database.yml +0 -0
 - data/opt/schema/routes.yml +77 -0
 - metadata +24 -7
 - data/lib/routes/generate_api_entities.rb +0 -35
 - data/lib/routes/generate_ui_routes.rb +0 -41
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: '078008fd3dd291e33389b27aa315baf2e685e058'
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: c60c14e788eead8fce813927566c3d3fbb6e698d
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 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 
     | 
    
         
            -
                             
     | 
| 
      
 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 
     | 
    
         
            -
                                     
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
                                     
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
                         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                        @ 
     | 
| 
       33 
     | 
    
         
            -
                        @ 
     | 
| 
      
 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(@ 
     | 
| 
      
 71 
     | 
    
         
            +
                        run_js_rules(@js) unless @js.nil?
         
     | 
| 
       36 
72 
     | 
    
         | 
| 
       37 
73 
     | 
    
         
             
                        # Output Errors (if any).
         
     | 
| 
       38 
     | 
    
         
            -
                        Blufin::ScannerError::output_cli(@errors) 
     | 
| 
      
 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, " 
     | 
| 
      
 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
         
     |