sleeping_king_studios-tasks 0.1.0.rc.0 → 0.3.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 +5 -5
 - data/CHANGELOG.md +12 -0
 - data/DEVELOPMENT.md +9 -4
 - data/README.md +4 -2
 - data/lib/sleeping_king_studios/tasks/apps/bundle/tasks.thor +15 -0
 - data/lib/sleeping_king_studios/tasks/apps/ci/rspec_task.rb +1 -1
 - data/lib/sleeping_king_studios/tasks/apps/ci/rubocop_task.rb +1 -1
 - data/lib/sleeping_king_studios/tasks/apps/ci/tasks.thor +20 -0
 - data/lib/sleeping_king_studios/tasks/ci/cucumber_parser.rb +4 -3
 - data/lib/sleeping_king_studios/tasks/ci/cucumber_results.rb +2 -2
 - data/lib/sleeping_king_studios/tasks/ci/cucumber_task.rb +1 -1
 - data/lib/sleeping_king_studios/tasks/ci/eslint_results.rb +112 -0
 - data/lib/sleeping_king_studios/tasks/ci/eslint_runner.rb +51 -0
 - data/lib/sleeping_king_studios/tasks/ci/eslint_task.rb +32 -0
 - data/lib/sleeping_king_studios/tasks/ci/jest_results.rb +106 -0
 - data/lib/sleeping_king_studios/tasks/ci/jest_runner.rb +51 -0
 - data/lib/sleeping_king_studios/tasks/ci/jest_task.rb +43 -0
 - data/lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb +18 -2
 - data/lib/sleeping_king_studios/tasks/ci/rspec_task.rb +12 -2
 - data/lib/sleeping_king_studios/tasks/ci/rubocop_task.rb +1 -1
 - data/lib/sleeping_king_studios/tasks/ci/tasks.thor +24 -0
 - data/lib/sleeping_king_studios/tasks/configuration.rb +25 -4
 - data/lib/sleeping_king_studios/tasks/file/new_task.rb +14 -12
 - data/lib/sleeping_king_studios/tasks/file/tasks.thor +13 -0
 - data/lib/sleeping_king_studios/tasks/file/templates/rspec.erb +13 -0
 - data/lib/sleeping_king_studios/tasks/file/templates/ruby.erb +28 -0
 - data/lib/sleeping_king_studios/tasks/process_runner.rb +14 -4
 - data/lib/sleeping_king_studios/tasks/version.rb +3 -3
 - data/lib/sleeping_king_studios/tools/toolbox/configuration.rb +280 -0
 - metadata +32 -28
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: c9380cfb581917cac00ae5102325dd895fcbd1364b4d8a53844f9ead55a41173
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 69647411117043bf53bf24c4f47231de7d970de6c3adff412cc4a5228af7939e
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 563983af6ab016118a21b810e8c5b2f61ef915ddee3bdce425f8945c5bf2bfb5dfc21a14acf8a07a7c08776443fd0cf7e46e5f96ff2c708a88f0834e4d856e51
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 0b2d75151cc7513903514ed8f60041c5b7e73b2723373ceedb7f904a65059e8815f100f9cb54f745c6619274650f3ca7b2da063b50082b5548159fcf0d3918d9
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,5 +1,17 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Changelog
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            ## 0.3.0
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            - Fix deprecation warnings in Ruby 2.7.
         
     | 
| 
      
 6 
     | 
    
         
            +
            - Add support for Thor 1.0.
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            ## 0.2.0
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            ### Ci
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            - Implement tasks for Jest.js, ESLint.
         
     | 
| 
      
 13 
     | 
    
         
            +
            - Add --format option, configuration value for RSpec, RSpec (Each) tasks.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       3 
15 
     | 
    
         
             
            ## 0.1.0
         
     | 
| 
       4 
16 
     | 
    
         | 
| 
       5 
17 
     | 
    
         
             
            Initial commit.
         
     | 
    
        data/DEVELOPMENT.md
    CHANGED
    
    | 
         @@ -1,13 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ## Tasks
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            ### 0.1 
     | 
| 
      
 3 
     | 
    
         
            +
            ### Version 0.2.1
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
            -  
     | 
| 
       6 
     | 
    
         
            -
            - formalize (public) task names as _Task, _task.rb ?
         
     | 
| 
       7 
     | 
    
         
            -
            - documentation pass
         
     | 
| 
      
 5 
     | 
    
         
            +
            - add --retry option to Cucumber task.
         
     | 
| 
       8 
6 
     | 
    
         | 
| 
       9 
7 
     | 
    
         
             
            ### Future Tasks
         
     | 
| 
       10 
8 
     | 
    
         | 
| 
      
 9 
     | 
    
         
            +
            - add documentation for "ci" option in applications.yml
         
     | 
| 
       11 
10 
     | 
    
         
             
            - integration testing for RSpec, RSpecEach tasks
         
     | 
| 
       12 
11 
     | 
    
         
             
              - sample spec files with known output(s)
         
     | 
| 
       13 
12 
     | 
    
         
             
            - extract common Results object superclass
         
     | 
| 
         @@ -22,6 +21,12 @@ 
     | 
|
| 
       22 
21 
     | 
    
         | 
| 
       23 
22 
     | 
    
         
             
            #### CI
         
     | 
| 
       24 
23 
     | 
    
         | 
| 
      
 24 
     | 
    
         
            +
            - configurable --format options for CI steps
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            - task ci:rspec_each: |
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
              Default to displaying --format=progress.
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
       25 
30 
     | 
    
         
             
            - task ci:steps: |
         
     | 
| 
       26 
31 
     | 
    
         | 
| 
       27 
32 
     | 
    
         
             
              Add --diff option
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -169,9 +169,11 @@ In addition, the cucumber step has the additional option: 
     | 
|
| 
       169 
169 
     | 
    
         | 
| 
       170 
170 
     | 
    
         
             
            - `default_files [Array]`: Files that are always loaded when running Cucumber, such as step definitions or support files. By default, this includes 'step_definitions.rb' and the 'step_definitions' directory inside 'features'.
         
     | 
| 
       171 
171 
     | 
    
         | 
| 
       172 
     | 
    
         
            -
            `config.ci.rspec [Hash]`: Step configuration for the RSpec step. Has the same options as `config.ci.cucumber`, above, except for the aforementioned `default_files` option.
         
     | 
| 
      
 172 
     | 
    
         
            +
            `config.ci.rspec [Hash]`: Step configuration for the RSpec step. Has the same options as `config.ci.cucumber`, above, except for the aforementioned `default_files` option. In addition, the RSpec task has the following option:
         
     | 
| 
       173 
173 
     | 
    
         | 
| 
       174 
     | 
    
         
            -
            ` 
     | 
| 
      
 174 
     | 
    
         
            +
            - `format [String]`: The RSpec formatter used to format the spec results. Defaults to 'documentation'.
         
     | 
| 
      
 175 
     | 
    
         
            +
             
     | 
| 
      
 176 
     | 
    
         
            +
            `config.ci.rspec_each [Hash]`: Step configuration for the RSpec Each step. Has the same configuration options as the RSpec step.
         
     | 
| 
       175 
177 
     | 
    
         | 
| 
       176 
178 
     | 
    
         
             
            `config.ci.rubocop [Hash]`: Step configuration for the RuboCop step.
         
     | 
| 
       177 
179 
     | 
    
         | 
| 
         @@ -0,0 +1,15 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # lib/sleeping_king_studios/tasks/apps/bundle/tasks.thor
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/apps/bundle'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/apps/bundle/install_task'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/apps/bundle/update_task'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module SleepingKingStudios::Tasks::Apps::Bundle
         
     | 
| 
      
 8 
     | 
    
         
            +
              # Thor integration for application gem dependency tasks.
         
     | 
| 
      
 9 
     | 
    
         
            +
              class Tasks < SleepingKingStudios::Tasks::TaskGroup
         
     | 
| 
      
 10 
     | 
    
         
            +
                namespace :"apps:bundle"
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                task SleepingKingStudios::Tasks::Apps::Bundle::InstallTask
         
     | 
| 
      
 13 
     | 
    
         
            +
                task SleepingKingStudios::Tasks::Apps::Bundle::UpdateTask
         
     | 
| 
      
 14 
     | 
    
         
            +
              end # class
         
     | 
| 
      
 15 
     | 
    
         
            +
            end # module
         
     | 
| 
         @@ -22,7 +22,7 @@ module SleepingKingStudios::Tasks::Apps::Ci 
     | 
|
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                def call *applications
         
     | 
| 
       24 
24 
     | 
    
         
             
                  SleepingKingStudios::Tasks::Apps::Ci::StepsTask.
         
     | 
| 
       25 
     | 
    
         
            -
                    new(options.merge('only' => %w 
     | 
| 
      
 25 
     | 
    
         
            +
                    new(options.merge('only' => %w[rspec])).
         
     | 
| 
       26 
26 
     | 
    
         
             
                    call(*applications)
         
     | 
| 
       27 
27 
     | 
    
         
             
                end # method call
         
     | 
| 
       28 
28 
     | 
    
         
             
              end # class
         
     | 
| 
         @@ -22,7 +22,7 @@ module SleepingKingStudios::Tasks::Apps::Ci 
     | 
|
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                def call *applications
         
     | 
| 
       24 
24 
     | 
    
         
             
                  SleepingKingStudios::Tasks::Apps::Ci::StepsTask.
         
     | 
| 
       25 
     | 
    
         
            -
                    new(options.merge('only' => %w 
     | 
| 
      
 25 
     | 
    
         
            +
                    new(options.merge('only' => %w[rubocop])).
         
     | 
| 
       26 
26 
     | 
    
         
             
                    call(*applications)
         
     | 
| 
       27 
27 
     | 
    
         
             
                end # method call
         
     | 
| 
       28 
28 
     | 
    
         
             
              end # class
         
     | 
| 
         @@ -0,0 +1,20 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # lib/sleeping_king_studios/tasks/apps/ci/tasks.thor
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/apps/ci'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/apps/ci/rspec_task'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/apps/ci/rubocop_task'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/apps/ci/simplecov_task'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/apps/ci/steps_task'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            module SleepingKingStudios::Tasks::Apps::Ci
         
     | 
| 
      
 10 
     | 
    
         
            +
              # Thor integration for continuous integration tasks in semi-distributed
         
     | 
| 
      
 11 
     | 
    
         
            +
              # applications.
         
     | 
| 
      
 12 
     | 
    
         
            +
              class Tasks < SleepingKingStudios::Tasks::TaskGroup
         
     | 
| 
      
 13 
     | 
    
         
            +
                namespace :"apps:ci"
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                task SleepingKingStudios::Tasks::Apps::Ci::RSpecTask
         
     | 
| 
      
 16 
     | 
    
         
            +
                task SleepingKingStudios::Tasks::Apps::Ci::RuboCopTask
         
     | 
| 
      
 17 
     | 
    
         
            +
                task SleepingKingStudios::Tasks::Apps::Ci::SimpleCovTask
         
     | 
| 
      
 18 
     | 
    
         
            +
                task SleepingKingStudios::Tasks::Apps::Ci::StepsTask
         
     | 
| 
      
 19 
     | 
    
         
            +
              end # class
         
     | 
| 
      
 20 
     | 
    
         
            +
            end # module
         
     | 
| 
         @@ -65,11 +65,12 @@ module SleepingKingStudios::Tasks::Ci 
     | 
|
| 
       65 
65 
     | 
    
         | 
| 
       66 
66 
     | 
    
         
             
                    status = step_status(step) || 'failed'
         
     | 
| 
       67 
67 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
                     
     | 
| 
      
 68 
     | 
    
         
            +
                    case status
         
     | 
| 
      
 69 
     | 
    
         
            +
                    when 'failed'
         
     | 
| 
       69 
70 
     | 
    
         
             
                      report['failing_step_count'] += 1
         
     | 
| 
       70 
     | 
    
         
            -
                     
     | 
| 
      
 71 
     | 
    
         
            +
                    when 'pending', 'skipped'
         
     | 
| 
       71 
72 
     | 
    
         
             
                      report['pending_step_count'] += 1
         
     | 
| 
       72 
     | 
    
         
            -
                    end 
     | 
| 
      
 73 
     | 
    
         
            +
                    end
         
     | 
| 
       73 
74 
     | 
    
         | 
| 
       74 
75 
     | 
    
         
             
                    status
         
     | 
| 
       75 
76 
     | 
    
         
             
                  end # method parse_step
         
     | 
| 
         @@ -167,7 +167,7 @@ module SleepingKingStudios::Tasks::Ci 
     | 
|
| 
       167 
167 
     | 
    
         
             
                end # method build_summary_details
         
     | 
| 
       168 
168 
     | 
    
         | 
| 
       169 
169 
     | 
    
         
             
                def keys
         
     | 
| 
       170 
     | 
    
         
            -
                  %w 
     | 
| 
      
 170 
     | 
    
         
            +
                  %w[
         
     | 
| 
       171 
171 
     | 
    
         
             
                    duration
         
     | 
| 
       172 
172 
     | 
    
         
             
                    step_count
         
     | 
| 
       173 
173 
     | 
    
         
             
                    pending_step_count
         
     | 
| 
         @@ -175,7 +175,7 @@ module SleepingKingStudios::Tasks::Ci 
     | 
|
| 
       175 
175 
     | 
    
         
             
                    scenario_count
         
     | 
| 
       176 
176 
     | 
    
         
             
                    pending_scenarios
         
     | 
| 
       177 
177 
     | 
    
         
             
                    failing_scenarios
         
     | 
| 
       178 
     | 
    
         
            -
                   
     | 
| 
      
 178 
     | 
    
         
            +
                  ] # end keys
         
     | 
| 
       179 
179 
     | 
    
         
             
                end # method keys
         
     | 
| 
       180 
180 
     | 
    
         | 
| 
       181 
181 
     | 
    
         
             
                def pluralize count, singular, plural = nil
         
     | 
| 
         @@ -0,0 +1,112 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/ci'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module SleepingKingStudios::Tasks::Ci
         
     | 
| 
      
 6 
     | 
    
         
            +
              # Encapsulates the results of an Eslint call.
         
     | 
| 
      
 7 
     | 
    
         
            +
              class EslintResults
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @param results [Hash] The raw results of the Eslint call.
         
     | 
| 
      
 9 
     | 
    
         
            +
                def initialize results
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @results = results
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                # @param other [EslintResults] The other results object to compare.
         
     | 
| 
      
 14 
     | 
    
         
            +
                #
         
     | 
| 
      
 15 
     | 
    
         
            +
                # @return [Boolean] True if the results are equal, otherwise false.
         
     | 
| 
      
 16 
     | 
    
         
            +
                def == other
         
     | 
| 
      
 17 
     | 
    
         
            +
                  if other.is_a?(Array)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    empty? ? other.empty? : @results == other
         
     | 
| 
      
 19 
     | 
    
         
            +
                  elsif other.is_a?(EslintResults)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    to_h == other.to_h
         
     | 
| 
      
 21 
     | 
    
         
            +
                  else
         
     | 
| 
      
 22 
     | 
    
         
            +
                    false
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                # @return [Boolean] True if there are no inspected files, otherwise false.
         
     | 
| 
      
 27 
     | 
    
         
            +
                def empty?
         
     | 
| 
      
 28 
     | 
    
         
            +
                  inspected_file_count.zero?
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                # @return [Integer] The total number of error results across all files.
         
     | 
| 
      
 32 
     | 
    
         
            +
                def error_count
         
     | 
| 
      
 33 
     | 
    
         
            +
                  @error_count ||= @results.map { |hsh| hsh['errorCount'] }.sum
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                # @return [Boolean] True if there are no errors or warnings, otherwise
         
     | 
| 
      
 37 
     | 
    
         
            +
                #   false.
         
     | 
| 
      
 38 
     | 
    
         
            +
                def failing?
         
     | 
| 
      
 39 
     | 
    
         
            +
                  !(error_count.zero? && warning_count.zero?)
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                # @return [Integer] The number of inspected files.
         
     | 
| 
      
 43 
     | 
    
         
            +
                def inspected_file_count
         
     | 
| 
      
 44 
     | 
    
         
            +
                  @results.size
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                # @return [Boolean] Always false. Both warnings and errors trigger a failure
         
     | 
| 
      
 48 
     | 
    
         
            +
                #   state.
         
     | 
| 
      
 49 
     | 
    
         
            +
                def pending?
         
     | 
| 
      
 50 
     | 
    
         
            +
                  false
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                # @return [Hash] The hash representation of the results.
         
     | 
| 
      
 54 
     | 
    
         
            +
                def to_h
         
     | 
| 
      
 55 
     | 
    
         
            +
                  {
         
     | 
| 
      
 56 
     | 
    
         
            +
                    'inspected_file_count' => inspected_file_count,
         
     | 
| 
      
 57 
     | 
    
         
            +
                    'error_count'          => error_count,
         
     | 
| 
      
 58 
     | 
    
         
            +
                    'warning_count'        => warning_count
         
     | 
| 
      
 59 
     | 
    
         
            +
                  }
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                # @return [String] The string representation of the results.
         
     | 
| 
      
 63 
     | 
    
         
            +
                def to_s # rubocop:disable Metrics/AbcSize
         
     | 
| 
      
 64 
     | 
    
         
            +
                  str = +"#{pluralize inspected_file_count, 'file'} inspected"
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                  str << ", #{pluralize error_count, 'error'}"
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                  str << ", #{pluralize warning_count, 'warning'}"
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                  str << "\n" unless non_empty_results.empty?
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                  non_empty_results.each do |hsh|
         
     | 
| 
      
 73 
     | 
    
         
            +
                    str << "\n    #{format_result_item(hsh)}"
         
     | 
| 
      
 74 
     | 
    
         
            +
                  end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                  str
         
     | 
| 
      
 77 
     | 
    
         
            +
                end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                # @return [Integer] The total number of warning results across all files.
         
     | 
| 
      
 80 
     | 
    
         
            +
                def warning_count
         
     | 
| 
      
 81 
     | 
    
         
            +
                  @warning_count ||= @results.map { |hsh| hsh['warningCount'] }.sum
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                private
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                def format_result_item hsh
         
     | 
| 
      
 87 
     | 
    
         
            +
                  str = +relative_path(hsh['filePath'])
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                  str << ": #{pluralize hsh['errorCount'], 'error'}"
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                  str << ", #{pluralize hsh['warningCount'], 'warning'}"
         
     | 
| 
      
 92 
     | 
    
         
            +
                end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                def non_empty_results
         
     | 
| 
      
 95 
     | 
    
         
            +
                  @results.reject do |hsh|
         
     | 
| 
      
 96 
     | 
    
         
            +
                    hsh['errorCount'].zero? && hsh['warningCount'].zero?
         
     | 
| 
      
 97 
     | 
    
         
            +
                  end
         
     | 
| 
      
 98 
     | 
    
         
            +
                end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                def pluralize count, singular, plural = nil
         
     | 
| 
      
 101 
     | 
    
         
            +
                  "#{count} #{tools.integer.pluralize count, singular, plural}"
         
     | 
| 
      
 102 
     | 
    
         
            +
                end
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
                def relative_path path
         
     | 
| 
      
 105 
     | 
    
         
            +
                  path.sub(/\A#{Dir.getwd}#{File::SEPARATOR}?/, '')
         
     | 
| 
      
 106 
     | 
    
         
            +
                end
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
                def tools
         
     | 
| 
      
 109 
     | 
    
         
            +
                  SleepingKingStudios::Tools::Toolbelt.instance
         
     | 
| 
      
 110 
     | 
    
         
            +
                end
         
     | 
| 
      
 111 
     | 
    
         
            +
              end
         
     | 
| 
      
 112 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/ci'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/process_runner'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module SleepingKingStudios::Tasks::Ci
         
     | 
| 
      
 7 
     | 
    
         
            +
              # Service object to run Eslint as an external process with the specified
         
     | 
| 
      
 8 
     | 
    
         
            +
              # parameters.
         
     | 
| 
      
 9 
     | 
    
         
            +
              class EslintRunner < SleepingKingStudios::Tasks::ProcessRunner
         
     | 
| 
      
 10 
     | 
    
         
            +
                def call env: {}, files: [], options: [], report: true
         
     | 
| 
      
 11 
     | 
    
         
            +
                  report  = 'tmp/ci/eslint.json' if report && !report.is_a?(String)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  command =
         
     | 
| 
      
 13 
     | 
    
         
            +
                    build_command(
         
     | 
| 
      
 14 
     | 
    
         
            +
                      :env     => env,
         
     | 
| 
      
 15 
     | 
    
         
            +
                      :files   => files,
         
     | 
| 
      
 16 
     | 
    
         
            +
                      :options => options,
         
     | 
| 
      
 17 
     | 
    
         
            +
                      :report  => report
         
     | 
| 
      
 18 
     | 
    
         
            +
                    )
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  stream_process(command)
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  report ? load_report(:report => report) : []
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                private
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def base_command
         
     | 
| 
      
 28 
     | 
    
         
            +
                  'yarn eslint'
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                def build_options files:, options:, report:, **_kwargs
         
     | 
| 
      
 32 
     | 
    
         
            +
                  files = default_files if files.empty?
         
     | 
| 
      
 33 
     | 
    
         
            +
                  options += ['--format=json', "--output-file=#{report}"] if report
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  super :files => files, :options => options
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                def default_files
         
     | 
| 
      
 39 
     | 
    
         
            +
                  SleepingKingStudios::Tasks.configuration.ci.eslint.
         
     | 
| 
      
 40 
     | 
    
         
            +
                    fetch(:default_files, '"**/*.js"')
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                def load_report report:
         
     | 
| 
      
 44 
     | 
    
         
            +
                  raw = File.read report
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                  JSON.parse raw
         
     | 
| 
      
 47 
     | 
    
         
            +
                rescue
         
     | 
| 
      
 48 
     | 
    
         
            +
                  []
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/ci'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/ci/eslint_results'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/ci/eslint_runner'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module SleepingKingStudios::Tasks::Ci
         
     | 
| 
      
 8 
     | 
    
         
            +
              # Defines a Thor task for running the Eslint linter.
         
     | 
| 
      
 9 
     | 
    
         
            +
              class EslintTask < SleepingKingStudios::Tasks::Task
         
     | 
| 
      
 10 
     | 
    
         
            +
                def self.description
         
     | 
| 
      
 11 
     | 
    
         
            +
                  'Runs the ESLint linter.'
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def self.task_name
         
     | 
| 
      
 15 
     | 
    
         
            +
                  'eslint'
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def call *files
         
     | 
| 
      
 19 
     | 
    
         
            +
                  results = eslint_runner.call(:files => files)
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  EslintResults.new(results)
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                private
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def eslint_runner
         
     | 
| 
      
 27 
     | 
    
         
            +
                  opts = %w[--color]
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  EslintRunner.new(:options => opts)
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,106 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'sleeping_king_studios/tasks/ci'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module SleepingKingStudios::Tasks::Ci
         
     | 
| 
      
 6 
     | 
    
         
            +
              # Encapsulates the results of a Jest call.
         
     | 
| 
      
 7 
     | 
    
         
            +
              class JestResults
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @param results [Hash] The raw results of the Jest call.
         
     | 
| 
      
 9 
     | 
    
         
            +
                def initialize results
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @results = results
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                # @param other [JestResults] The other results object to compare.
         
     | 
| 
      
 14 
     | 
    
         
            +
                #
         
     | 
| 
      
 15 
     | 
    
         
            +
                # @return [Boolean] True if the results are equal, otherwise false.
         
     | 
| 
      
 16 
     | 
    
         
            +
                def == other
         
     | 
| 
      
 17 
     | 
    
         
            +
                  if other.is_a?(Hash)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    empty? ? other.empty? : @results == other
         
     | 
| 
      
 19 
     | 
    
         
            +
                  elsif other.is_a?(JestResults)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    to_h == other.to_h
         
     | 
| 
      
 21 
     | 
    
         
            +
                  else
         
     | 
| 
      
 22 
     | 
    
         
            +
                    false
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                # @return [Float] The duration value, in seconds.
         
     | 
| 
      
 27 
     | 
    
         
            +
                def duration
         
     | 
| 
      
 28 
     | 
    
         
            +
                  (end_time - start_time).to_f / 1000
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                # @return [Boolean] True if there are no tests, otherwise false.
         
     | 
| 
      
 32 
     | 
    
         
            +
                def empty?
         
     | 
| 
      
 33 
     | 
    
         
            +
                  test_count.zero?
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                # @return [Boolean] True if there are any failing tests, otherwise false.
         
     | 
| 
      
 37 
     | 
    
         
            +
                def failing?
         
     | 
| 
      
 38 
     | 
    
         
            +
                  !failure_count.zero?
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                # @return [Integer] The number of failing tests.
         
     | 
| 
      
 42 
     | 
    
         
            +
                def failure_count
         
     | 
| 
      
 43 
     | 
    
         
            +
                  @results.fetch('numFailedTests', 0)
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                # @return [Boolean] True if there are any pending tests, otherwise false.
         
     | 
| 
      
 47 
     | 
    
         
            +
                def pending?
         
     | 
| 
      
 48 
     | 
    
         
            +
                  !pending_count.zero?
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                # @return [Intger] The number of pending tests.
         
     | 
| 
      
 52 
     | 
    
         
            +
                def pending_count
         
     | 
| 
      
 53 
     | 
    
         
            +
                  @results.fetch('numPendingTests', 0)
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                # @return [Integer] The total number of tests.
         
     | 
| 
      
 57 
     | 
    
         
            +
                def test_count
         
     | 
| 
      
 58 
     | 
    
         
            +
                  @results.fetch('numTotalTests', 0)
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                # @return [Hash] The hash representation of the results.
         
     | 
| 
      
 62 
     | 
    
         
            +
                def to_h
         
     | 
| 
      
 63 
     | 
    
         
            +
                  {
         
     | 
| 
      
 64 
     | 
    
         
            +
                    'duration'      => duration,
         
     | 
| 
      
 65 
     | 
    
         
            +
                    'failure_count' => failure_count,
         
     | 
| 
      
 66 
     | 
    
         
            +
                    'pending_count' => pending_count,
         
     | 
| 
      
 67 
     | 
    
         
            +
                    'test_count'    => test_count
         
     | 
| 
      
 68 
     | 
    
         
            +
                  }
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                # @return [String] The string representation of the results.
         
     | 
| 
      
 72 
     | 
    
         
            +
                def to_s # rubocop:disable Metrics/AbcSize
         
     | 
| 
      
 73 
     | 
    
         
            +
                  str = +pluralize(test_count, 'test')
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                  str << ', ' << pluralize(failure_count, 'failure')
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                  str << ', ' << pending_count.to_s << ' pending' if pending?
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                  str << " in #{duration.round(2)} seconds"
         
     | 
| 
      
 80 
     | 
    
         
            +
                end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                private
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                def end_time
         
     | 
| 
      
 85 
     | 
    
         
            +
                  return 0 unless @results['testResults']
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                  @results['testResults'].
         
     | 
| 
      
 88 
     | 
    
         
            +
                    map { |test_result| test_result['endTime'] }.
         
     | 
| 
      
 89 
     | 
    
         
            +
                    reduce do |memo, time|
         
     | 
| 
      
 90 
     | 
    
         
            +
                      [memo, time].max
         
     | 
| 
      
 91 
     | 
    
         
            +
                    end
         
     | 
| 
      
 92 
     | 
    
         
            +
                end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                def pluralize count, singular, plural = nil
         
     | 
| 
      
 95 
     | 
    
         
            +
                  "#{count} #{tools.integer.pluralize count, singular, plural}"
         
     | 
| 
      
 96 
     | 
    
         
            +
                end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                def start_time
         
     | 
| 
      
 99 
     | 
    
         
            +
                  @results['startTime'] || 0
         
     | 
| 
      
 100 
     | 
    
         
            +
                end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                def tools
         
     | 
| 
      
 103 
     | 
    
         
            +
                  SleepingKingStudios::Tools::Toolbelt.instance
         
     | 
| 
      
 104 
     | 
    
         
            +
                end
         
     | 
| 
      
 105 
     | 
    
         
            +
              end
         
     | 
| 
      
 106 
     | 
    
         
            +
            end
         
     |