├── fastlane ├── Pluginfile └── Fastfile ├── .rspec ├── lib └── fastlane │ └── plugin │ ├── bluepillar │ ├── version.rb │ ├── helper │ │ └── bluepillar_helper.rb │ └── actions │ │ └── bluepillar_action.rb │ └── bluepillar.rb ├── Rakefile ├── .travis.yml ├── Gemfile ├── .gitignore ├── spec ├── bluepillar_action_spec.rb └── spec_helper.rb ├── fastlane-plugin-bluepillar.gemspec ├── LICENSE ├── README.md └── .rubocop.yml /fastlane/Pluginfile: -------------------------------------------------------------------------------- 1 | # Autogenerated by fastlane 2 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | --color 3 | --format d 4 | -------------------------------------------------------------------------------- /lib/fastlane/plugin/bluepillar/version.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Bluepillar 3 | VERSION = "0.2.0" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler/gem_tasks' 2 | 3 | require 'rspec/core/rake_task' 4 | RSpec::Core::RakeTask.new 5 | 6 | task default: [:spec] 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # os: osx # enable this if you need macOS support 2 | language: ruby 3 | rvm: 4 | - 2.2.4 5 | 6 | before_script: 'bundle install' 7 | script: 'rake' 8 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gemspec 4 | 5 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') 6 | eval_gemfile(plugins_path) if File.exist?(plugins_path) 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.DS_Store 3 | Gemfile.lock 4 | 5 | ## Documentation cache and generated files: 6 | /.yardoc/ 7 | /_yardoc/ 8 | /doc/ 9 | /rdoc/ 10 | fastlane/README.md 11 | fastlane/report.xml 12 | -------------------------------------------------------------------------------- /spec/bluepillar_action_spec.rb: -------------------------------------------------------------------------------- 1 | describe Fastlane::Actions::BluepillarAction do 2 | describe '#run' do 3 | it 'prints correct description' do 4 | plugin_description = Fastlane::Actions::BluepillarAction.description 5 | expect(plugin_description).to include("Run XCUITests in Parallel using Bluepill") 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /lib/fastlane/plugin/bluepillar/helper/bluepillar_helper.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Helper 3 | class BluepillarHelper 4 | # class methods that you define here become available in your action 5 | # as `Helper::BluepillarHelper.your_method` 6 | # 7 | def self.show_message 8 | UI.message("Hello from the bluepillar plugin helper!") 9 | end 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) 2 | 3 | # This module is only used to check the environment is currently a testing env 4 | module SpecHelper 5 | end 6 | 7 | require 'fastlane' # to import the Action super class 8 | require 'fastlane/plugin/bluepillar' # import the actual plugin 9 | 10 | Fastlane.load_actions # load other actions (in case your plugin calls other actions or shared values) 11 | -------------------------------------------------------------------------------- /fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | lane :test do 2 | bluepillar( 3 | app: 'bluepill/Build/Products/Debug-iphonesimulator/Bluepillar.app', 4 | runner_app_path: 'bluepill/Build/Products/Debug-iphonesimulator/BluepillarUITests-Runner.app', 5 | scheme_path: 'Bluepillar.xcodeproj/xcshareddata/xcschemes/Bluepillar.xcscheme', 6 | output_dir: 'bluepill_output/', 7 | num_sims: '3', 8 | runtime: '"iOS 10.3"', 9 | device: 'iPad Air' 10 | ) 11 | end 12 | -------------------------------------------------------------------------------- /lib/fastlane/plugin/bluepillar.rb: -------------------------------------------------------------------------------- 1 | require 'fastlane/plugin/bluepillar/version' 2 | 3 | module Fastlane 4 | module Bluepillar 5 | # Return all .rb files inside the "actions" and "helper" directory 6 | def self.all_classes 7 | Dir[File.expand_path('**/{actions,helper}/*.rb', File.dirname(__FILE__))] 8 | end 9 | end 10 | end 11 | 12 | # By default we want to import all available actions and helpers 13 | # A plugin can contain any number of actions and plugins 14 | Fastlane::Bluepillar.all_classes.each do |current| 15 | require current 16 | end 17 | -------------------------------------------------------------------------------- /fastlane-plugin-bluepillar.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path("../lib", __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require 'fastlane/plugin/bluepillar/version' 5 | 6 | Gem::Specification.new do |spec| 7 | spec.name = 'fastlane-plugin-bluepillar' 8 | spec.version = Fastlane::Bluepillar::VERSION 9 | spec.author = %q{Shashikant86} 10 | spec.email = %q{shashikant.jagtap@icloud.com} 11 | 12 | spec.summary = %q{Fastlane Plugin to Run XCUITests in Parallel using Bluepill.} 13 | # spec.homepage = "https://github.com//fastlane-plugin-bluepillar" 14 | spec.license = "MIT" 15 | 16 | spec.files = Dir["lib/**/*"] + %w(README.md LICENSE) 17 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 18 | spec.require_paths = ['lib'] 19 | 20 | spec.add_development_dependency 'pry' 21 | spec.add_development_dependency 'bundler' 22 | spec.add_development_dependency 'rspec' 23 | spec.add_development_dependency 'rake' 24 | spec.add_development_dependency 'rubocop' 25 | spec.add_development_dependency 'fastlane', '>= 2.26.1' 26 | end 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Shashikant86 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bluepillar plugin 2 | 3 | [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-bluepillar) 4 | 5 | 6 | 7 | ## Getting Started 8 | 9 | This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin to run XCUI Tests in parallel using Linkedin's Bluepill tool. To get started with `fastlane-plugin-bluepillar`, add it to your project by running: 10 | 11 | 12 | 13 | ```bash 14 | fastlane add_plugin bluepillar 15 | ``` 16 | 17 | 18 | ### Pre-requisite 19 | 20 | [Bluepill](https://github.com/linkedin/bluepill) homebrew package doesn't work well as it's lacking `bp` binary. 21 | We have to manually download `bluepill` and `bp` binaries from the Bluepill releases page on [Github](https://github.com/linkedin/bluepill/releases) and put in PATH. This plugin expect it inside `/usr/local/bin/` where all the other binaries live, so that we have `/usr/local/bin/bluepill` and `/usr/local/bin/bp` binaries in place. 22 | 23 | ### Fastlane Setup 24 | 25 | We can setup Fastlane using some BluePill optins and Derived data. 26 | 27 | ##### BluePill Options 28 | 29 | There are so many options available for the Bluepill but we just need few of them to get going and keep other options as default. This plugin provides basic 7 options as follows 30 | 31 | * `app` : PATH to your application. This is usually in the derived data `/Products/Debug-iphonesimulator/YOUR_APP.app` 32 | 33 | * `runner_app_path` : PATH to UI Test runner app. This is usually in derived data `/Products/Debug-iphonesimulator\YOUR_UITEST_SCHEME-Runner.app` If you have a space in the Scheme name then you have to amend it with backslash in your path. 34 | 35 | * `scheme_path` : This is path to your scheme. This is usually in the `YOUR_PROJECT.xcodeproj/xcshareddata/xcschemes/YOUR_SCHEME.xcscheme` 36 | 37 | * `output_dir` : This is a directory where Bluepill will generate reports. 38 | 39 | * `num_sims` : Number of simulators to be launched. 40 | 41 | * `runtime` : The iOS version we want to run test against. Note we have to pass it as nested string like this `'"iOS 10.3"'` 42 | 43 | * `device`: The simulator to be used. We have to pass it as `'iPad Air'` or `'iPhone 6'` 44 | 45 | ##### Generate Derived Data for Bluepill 46 | 47 | It's good idea to generate derived data in the project itself using `build for testing` option. 48 | You can do that using Fastlane `scan` like this 49 | 50 | ``` 51 | scan( 52 | scheme: YOUR_SCHEME, 53 | build_for_testing: true, 54 | derived_data_path: "./bluepill", 55 | buildlog_path: "./bluepill/logs/" 56 | ) 57 | ``` 58 | This will generate derived data inside `bluepill` directory. 59 | 60 | ##### Configure Fastfile 61 | Now that, all the Bluepill options are in place and we have generated derived data, we can configure lane in our `Fastfile` like this: 62 | 63 | ``` 64 | 65 | lane :test do 66 | app: 'bluepill/Build/Products/Debug-iphonesimulator/Bluepillar.app', 67 | runner_app_path: 'bluepill/Build/Products/Debug-iphonesimulator/BluepillarUITests-Runner.app', 68 | scheme_path: 'Bluepillar.xcodeproj/xcshareddata/xcschemes/Bluepillar.xcscheme', 69 | output_dir: 'bluepill_output/', 70 | num_sims: '3', 71 | runtime: '"iOS 10.3"', 72 | device: 'iPad Air' 73 | end 74 | 75 | ``` 76 | Now that we can run test using fastlane like this : 77 | 78 | $ fastlane test 79 | 80 | 81 | 82 | ## About bluepillar 83 | 84 | Run XCUITests in Parallel using Bluepill. [Bluepill](https://github.com/linkedin/bluepill) is a tool from LinkedIn to run XCUI tests in the parallel. 85 | 86 | 87 | ## Example 88 | 89 | There is sample example project available on Github [Bluepillar-Demo](https://github.com/Shashikant86/Bluepillar-Demo). Just clone it, replace the path to derived data and run 90 | 91 | 92 | $ git clone git@github.com:Shashikant86/Bluepillar-Demo.git 93 | $ bundle install 94 | $ bundle exec fastlane test 95 | 96 | You can see sample report in the `sample_bluepill_output` directory. 97 | 98 | 99 | 100 | ## Run tests for this plugin 101 | 102 | To run both the tests, and code style validation, run 103 | 104 | ``` 105 | rake 106 | ``` 107 | 108 | To automatically fix many of the styling issues, use 109 | ``` 110 | rubocop -a 111 | ``` 112 | 113 | ## Issues and Feedback 114 | 115 | For any other issues and feedback about this plugin, please submit it to this repository. 116 | 117 | ## Troubleshooting 118 | 119 | If you have trouble using plugins, check out the [Plugins Troubleshooting](https://docs.fastlane.tools/plugins/plugins-troubleshooting/) guide. 120 | 121 | ## Using _fastlane_ Plugins 122 | 123 | For more information about how the `fastlane` plugin system works, check out the [Plugins documentation](https://docs.fastlane.tools/plugins/create-plugin/). 124 | -------------------------------------------------------------------------------- /lib/fastlane/plugin/bluepillar/actions/bluepillar_action.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | class BluepillarAction < Action 4 | BLUEPILL_PATH = '/usr/local/bin/bluepill' 5 | BP_PATH = '/usr/local/bin/bp' 6 | def self.run(params) 7 | UI.message("Starting XCTests using the bluepillar fastlane plugin!") 8 | unless File.exist?(BLUEPILL_PATH) 9 | UI.user_error!("You must download bluepill binary from Github and put it in /usr/local/bin/bluepill to carry on execution") 10 | end 11 | 12 | unless File.exist?(BP_PATH) 13 | UI.user_error!("You must download bp binary from Github and put it in /usr/local/bin/bp to carry on execution") 14 | end 15 | 16 | bluepill_app_path = params[:app] 17 | bluepill_runner_app_path = params[:runner_app_path] 18 | bluepill_scheme_path = params[:scheme_path] 19 | bluepill_num_sims = params[:num_sims] 20 | bluepill_output_dir = params[:output_dir] 21 | bluepill_runtime = params[:runtime] 22 | bluepill_device = params[:device] 23 | processed_device = bluepill_device.gsub(/ /, '\ ') 24 | 25 | 26 | command = [ 27 | 'bluepill', 28 | '-a', 29 | bluepill_app_path, 30 | '-s', 31 | bluepill_scheme_path, 32 | '-o', 33 | bluepill_output_dir, 34 | '-r', 35 | bluepill_runtime, 36 | '-n', 37 | bluepill_num_sims, 38 | '-d', 39 | processed_device, 40 | ] 41 | 42 | command.concat ['-u', bluepill_runner_app_path] if bluepill_runner_app_path 43 | 44 | Actions.sh(command.join(' ')) 45 | end 46 | 47 | def self.description 48 | "Run XCUITests in Parallel using Bluepill" 49 | end 50 | 51 | def self.authors 52 | ["Shashikant86"] 53 | end 54 | 55 | def self.return_value 56 | 57 | end 58 | 59 | def self.details 60 | "This plugin will allow you to run XCUITests in Parallel using LinkedIn's Bluepil" 61 | end 62 | 63 | def self.available_options 64 | [ 65 | FastlaneCore::ConfigItem.new(key: :app, 66 | env_name: "BLUEPILLAR_APP_PATH", 67 | description: "Path to the main app to be build for the bluepill in the Derived Data", 68 | is_string: true, 69 | optional: false), 70 | 71 | FastlaneCore::ConfigItem.new(key: :runner_app_path, 72 | env_name: "BLUEPILLAR_RUNNER_APP_PATH", 73 | description: "Path to the test runner app in the Derived Data", 74 | is_string: true, 75 | optional: true), 76 | 77 | FastlaneCore::ConfigItem.new(key: :scheme_path, 78 | env_name: "BLUEPILLAR_XCTEST_SCHEME_PATH", 79 | description: "Path to the scheme to be build for the bluepill in the .xcodeproj", 80 | is_string: true, 81 | optional: false), 82 | 83 | FastlaneCore::ConfigItem.new(key: :output_dir, 84 | env_name: "BLUEPILLAR_REPORT_PATH", 85 | description: "Path to store simulator logs and test reports", 86 | is_string: true, 87 | optional: false), 88 | 89 | FastlaneCore::ConfigItem.new(key: :num_sims, 90 | env_name: "BLUEPILLAR_SUMULATORS", 91 | description: "Number of sumulators to be launched", 92 | default_value: "3", 93 | is_string: true, 94 | optional: true), 95 | 96 | FastlaneCore::ConfigItem.new(key: :runtime, 97 | env_name: "BLUEPILLAR_IOS_VERSION", 98 | description: "The iOS version to be used for testing", 99 | default_value: '"iOS 10.3"', 100 | is_string: true, 101 | optional: true), 102 | 103 | FastlaneCore::ConfigItem.new(key: :device, 104 | env_name: "BLUEPILLAR_IOS_DEVICE", 105 | description: "The iOS device to be used for testing", 106 | default_value: "'iPhone 6'", 107 | is_string: true, 108 | optional: true), 109 | ] 110 | end 111 | 112 | def self.example_code 113 | [' bluepillar( 114 | app: "bluepill/Build/Products/Debug-iphonesimulator/Bluepillar.app", 115 | runner_app_path: "bluepill/Build/Products/Debug-iphonesimulator/BluepillarUITests-Runner.app", 116 | scheme_path: "Bluepillar.xcodeproj/xcshareddata/xcschemes/Bluepillar.xcscheme", 117 | output_dir: "bluepill_output/", 118 | num_sims: "3", 119 | runtime: '"iOS 10.3"', 120 | ) 121 | '] 122 | end 123 | 124 | def self.is_supported?(platform) 125 | [:ios, :mac].include?(platform) 126 | true 127 | end 128 | end 129 | end 130 | end 131 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | Style/PercentLiteralDelimiters: 2 | Enabled: false 3 | 4 | # kind_of? is a good way to check a type 5 | Style/ClassCheck: 6 | EnforcedStyle: kind_of? 7 | 8 | Style/FrozenStringLiteralComment: 9 | Enabled: false 10 | 11 | # This doesn't work with older versions of Ruby (pre 2.4.0) 12 | Style/SafeNavigation: 13 | Enabled: false 14 | 15 | # This doesn't work with older versions of Ruby (pre 2.4.0) 16 | Performance/RegexpMatch: 17 | Enabled: false 18 | 19 | # .length == 0 is also good, we don't always want .zero? 20 | Style/NumericPredicate: 21 | Enabled: false 22 | 23 | # this would cause errors with long lanes 24 | Metrics/BlockLength: 25 | Enabled: false 26 | 27 | # this is a bit buggy 28 | Metrics/ModuleLength: 29 | Enabled: false 30 | 31 | # certificate_1 is an okay variable name 32 | Style/VariableNumber: 33 | Enabled: false 34 | 35 | # This is used a lot across the fastlane code base for config files 36 | Style/MethodMissing: 37 | Enabled: false 38 | 39 | # 40 | # File.chmod(0777, f) 41 | # 42 | # is easier to read than 43 | # 44 | # File.chmod(0o777, f) 45 | # 46 | Style/NumericLiteralPrefix: 47 | Enabled: false 48 | 49 | # 50 | # command = (!clean_expired.nil? || !clean_pattern.nil?) ? CLEANUP : LIST 51 | # 52 | # is easier to read than 53 | # 54 | # command = !clean_expired.nil? || !clean_pattern.nil? ? CLEANUP : LIST 55 | # 56 | Style/TernaryParentheses: 57 | Enabled: false 58 | 59 | # sometimes it is useful to have those empty methods 60 | Style/EmptyMethod: 61 | Enabled: false 62 | 63 | # It's better to be more explicit about the type 64 | Style/BracesAroundHashParameters: 65 | Enabled: false 66 | 67 | # specs sometimes have useless assignments, which is fine 68 | Lint/UselessAssignment: 69 | Exclude: 70 | - '**/spec/**/*' 71 | 72 | # We could potentially enable the 2 below: 73 | Style/IndentHash: 74 | Enabled: false 75 | 76 | Style/AlignHash: 77 | Enabled: false 78 | 79 | # HoundCI doesn't like this rule 80 | Style/DotPosition: 81 | Enabled: false 82 | 83 | # We allow !! as it's an easy way to convert ot boolean 84 | Style/DoubleNegation: 85 | Enabled: false 86 | 87 | # Prevent to replace [] into %i 88 | Style/SymbolArray: 89 | Enabled: false 90 | 91 | # We still support Ruby 2.0.0 92 | Style/IndentHeredoc: 93 | Enabled: false 94 | 95 | # This cop would not work fine with rspec 96 | Style/MixinGrouping: 97 | Exclude: 98 | - '**/spec/**/*' 99 | 100 | # Sometimes we allow a rescue block that doesn't contain code 101 | Lint/HandleExceptions: 102 | Enabled: false 103 | 104 | # Cop supports --auto-correct. 105 | Lint/UnusedBlockArgument: 106 | Enabled: false 107 | 108 | Lint/AmbiguousBlockAssociation: 109 | Enabled: false 110 | 111 | # Needed for $verbose 112 | Style/GlobalVars: 113 | Enabled: false 114 | 115 | # We want to allow class Fastlane::Class 116 | Style/ClassAndModuleChildren: 117 | Enabled: false 118 | 119 | # $? Exit 120 | Style/SpecialGlobalVars: 121 | Enabled: false 122 | 123 | Metrics/AbcSize: 124 | Enabled: false 125 | 126 | Metrics/MethodLength: 127 | Enabled: false 128 | 129 | Metrics/CyclomaticComplexity: 130 | Enabled: false 131 | 132 | # The %w might be confusing for new users 133 | Style/WordArray: 134 | MinSize: 19 135 | 136 | # raise and fail are both okay 137 | Style/SignalException: 138 | Enabled: false 139 | 140 | # Better too much 'return' than one missing 141 | Style/RedundantReturn: 142 | Enabled: false 143 | 144 | # Having if in the same line might not always be good 145 | Style/IfUnlessModifier: 146 | Enabled: false 147 | 148 | # and and or is okay 149 | Style/AndOr: 150 | Enabled: false 151 | 152 | # Configuration parameters: CountComments. 153 | Metrics/ClassLength: 154 | Max: 320 155 | 156 | 157 | # Configuration parameters: AllowURI, URISchemes. 158 | Metrics/LineLength: 159 | Max: 370 160 | 161 | # Configuration parameters: CountKeywordArgs. 162 | Metrics/ParameterLists: 163 | Max: 17 164 | 165 | Metrics/PerceivedComplexity: 166 | Max: 18 167 | 168 | # Sometimes it's easier to read without guards 169 | Style/GuardClause: 170 | Enabled: false 171 | 172 | # We allow both " and ' 173 | Style/StringLiterals: 174 | Enabled: false 175 | 176 | # something = if something_else 177 | # that's confusing 178 | Style/ConditionalAssignment: 179 | Enabled: false 180 | 181 | # Better to have too much self than missing a self 182 | Style/RedundantSelf: 183 | Enabled: false 184 | 185 | # e.g. 186 | # def self.is_supported?(platform) 187 | # we may never use `platform` 188 | Lint/UnusedMethodArgument: 189 | Enabled: false 190 | 191 | # the let(:key) { ... } 192 | Lint/ParenthesesAsGroupedExpression: 193 | Exclude: 194 | - '**/spec/**/*' 195 | 196 | # This would reject is_ in front of methods 197 | # We use `is_supported?` everywhere already 198 | Style/PredicateName: 199 | Enabled: false 200 | 201 | # We allow the $ 202 | Style/PerlBackrefs: 203 | Enabled: false 204 | 205 | # Disable '+ should be surrounded with a single space' for xcodebuild_spec.rb 206 | Style/SpaceAroundOperators: 207 | Exclude: 208 | - '**/spec/actions_specs/xcodebuild_spec.rb' 209 | 210 | AllCops: 211 | Include: 212 | - '**/fastlane/Fastfile' 213 | Exclude: 214 | - '**/lib/assets/custom_action_template.rb' 215 | - './vendor/**/*' 216 | 217 | # They have not to be snake_case 218 | Style/FileName: 219 | Exclude: 220 | - '**/Dangerfile' 221 | - '**/Brewfile' 222 | - '**/Gemfile' 223 | - '**/Podfile' 224 | - '**/Rakefile' 225 | - '**/Fastfile' 226 | - '**/Deliverfile' 227 | - '**/Snapfile' 228 | 229 | # We're not there yet 230 | Style/Documentation: 231 | Enabled: false 232 | 233 | # Added after upgrade to 0.38.0 234 | Style/MutableConstant: 235 | Enabled: false 236 | 237 | # length > 0 is good 238 | Style/ZeroLengthPredicate: 239 | Enabled: false 240 | 241 | # Adds complexity 242 | Style/IfInsideElse: 243 | Enabled: false 244 | 245 | # Sometimes we just want to 'collect' 246 | Style/CollectionMethods: 247 | Enabled: false 248 | --------------------------------------------------------------------------------