From 6e563732a3a42a1222148e3dd9e63122d5aa6c54 Mon Sep 17 00:00:00 2001 From: 3v0k4 Date: Fri, 11 Oct 2024 16:33:07 +0200 Subject: [PATCH] chore: move free gem readme to repo --- _includes/knapsack_gem_utm_cookies.html | 17 - _plugins/docusaurus.rb | 3 + _sass/_base.scss | 43 - docs/ruby/knapsack/readme.md | 1125 ----------------- docusaurus/docusaurus.config.ts | 4 + .../docs/ruby/knapsack/knapsack-logo-@2.png | Bin 31976 -> 0 bytes images/docs/ruby/knapsack/with_knapsack.png | Bin 24989 -> 0 bytes .../docs/ruby/knapsack/without_knapsack.png | Bin 25010 -> 0 bytes 8 files changed, 7 insertions(+), 1185 deletions(-) delete mode 100644 _includes/knapsack_gem_utm_cookies.html delete mode 100644 docs/ruby/knapsack/readme.md delete mode 100644 images/docs/ruby/knapsack/knapsack-logo-@2.png delete mode 100644 images/docs/ruby/knapsack/with_knapsack.png delete mode 100644 images/docs/ruby/knapsack/without_knapsack.png diff --git a/_includes/knapsack_gem_utm_cookies.html b/_includes/knapsack_gem_utm_cookies.html deleted file mode 100644 index 2880ec32..00000000 --- a/_includes/knapsack_gem_utm_cookies.html +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/_plugins/docusaurus.rb b/_plugins/docusaurus.rb index 03339638..8d17a0c8 100644 --- a/_plugins/docusaurus.rb +++ b/_plugins/docusaurus.rb @@ -74,6 +74,9 @@ def system!(*args) system!("cp -R docusaurus/build/ruby/#{directory} _site/ruby") end + system!("mkdir -p _site/ruby/knapsack") + system!("cp docusaurus/build/ruby/knapsack/index.html _site/ruby/knapsack") # redirect to https://github.com/KnapsackPro/knapsack + system!("mv _site/sitemap.xml _site/jekyll-sitemap.xml") system!("cp docusaurus/build/sitemap.xml _site/docusaurus-sitemap.xml") diff --git a/_sass/_base.scss b/_sass/_base.scss index 3f8f7be7..5c9c065c 100644 --- a/_sass/_base.scss +++ b/_sass/_base.scss @@ -189,24 +189,6 @@ pre { -/** - * Icons - */ -.icon { - - > svg { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - - path { - fill: $grey-color; - } - } -} - - /* * Others */ @@ -219,35 +201,10 @@ pre { margin-top: 1em; } -.extra-margin-top-2x { - margin-top: 2em; -} - .extra-margin-top-3x { margin-top: 3em; } -/* - * Tables - */ -table.pure-table { - border-collapse: collapse; - border-spacing: 0; - - th, td { - padding: 10px; - } - - th { - border: 1px solid $grey-color-light; - border-bottom: 5px solid $brand-color; - } - - td { - border: 1px solid $grey-color-light; - } -} - /* * Video */ diff --git a/docs/ruby/knapsack/readme.md b/docs/ruby/knapsack/readme.md deleted file mode 100644 index 6d3db139..00000000 --- a/docs/ruby/knapsack/readme.md +++ /dev/null @@ -1,1125 +0,0 @@ ---- -layout: docs -title: Knapsack gem README -permalink: /ruby/knapsack ---- -{% include knapsack_gem_utm_cookies.html %} - - - - - - - - knapsack gem on GitHub - / this readme source code on GitHub - -![Knapsack logo](/images/docs/ruby/knapsack/knapsack-logo-@2.png) - -[Knapsack, The K is silent](http://www.youtube.com/watch?v=-Ae590hensE) - -[![Gem Version](https://badge.fury.io/rb/knapsack.svg)][gem_version] -[![Ruby](https://github.com/KnapsackPro/knapsack/actions/workflows/ruby.yml/badge.svg)][actions] -[![Code Climate](https://codeclimate.com/github/KnapsackPro/knapsack.svg)][codeclimate] -[![Coverage Status](https://codeclimate.com/github/KnapsackPro/knapsack/coverage.svg)][coverage] - -[gem_version]: https://rubygems.org/gems/knapsack -[actions]: https://github.com/KnapsackPro/knapsack/actions/workflows/ruby.yml -[codeclimate]: https://codeclimate.com/github/KnapsackPro/knapsack -[coverage]: https://codeclimate.com/github/KnapsackPro/knapsack - -Follow us on [Twitter @KnapsackPro](https://twitter.com/KnapsackPro) and give Like on [Facebook KnapsackPro](https://www.facebook.com/KnapsackPro) - -**Knapsack splits tests across CI nodes and makes sure that tests will run comparable time on each node.** - -Parallel tests across CI server nodes based on each test file's time execution. Knapsack generates a test time execution report and uses it for future test runs. - -The knapsack gem supports: - -* [RSpec](http://rspec.info) -* [Cucumber](https://cucumber.io) -* [Minitest](http://docs.seattlerb.org/minitest/) -* [Spinach](https://github.com/codegram/spinach) -* [Turnip](https://github.com/jnicklas/turnip) - -### Without Knapsack - bad test suite split - -![Without Knapsack gem](/images/docs/ruby/knapsack/without_knapsack.png) - -### With Knapsack - better test suite split - -![With Knapsack gem](/images/docs/ruby/knapsack/with_knapsack.png) - -### With Knapsack Pro - optimal test suite split - -[Watch 1 minute video how Queue Mode works](https://knapsackpro.com/?utm_source=github&utm_medium=readme&utm_campaign=knapsack_gem&utm_content=video#x-play-how-it-works-video) - -[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/pkdLzKlnlQg/0.jpg)](https://knapsackpro.com/?utm_source=github&utm_medium=readme&utm_campaign=knapsack_gem&utm_content=video#x-play-how-it-works-video) - -To better understand it you can check examples for one of popular CI providers like: - -* __CircleCI__ - [Improve CircleCI parallelisation for RSpec, Minitest, Cypress](/2018/improve-circleci-parallelisation-for-rspec-minitest-cypress) -* __Heroku CI__ - [How to run parallel dynos on Heroku CI to complete tests faster](/2018/how-to-run-parallel-dynos-on-heroku-ci-to-complete-tests-faster) -* __Buildkite__ - [Auto balancing 7 hours tests between 100 parallel agents](/2017/auto-balancing-7-hours-tests-between-100-parallel-jobs-on-ci-buildkite-example) -* __Jenkins__ - [Jenkins Pipeline how to run parallel tests in your workflow stages](/2018/jenkins-pipeline-how-to-run-parallel-tests-in-your-workflow-stages) -* __CodeShip__ - [How to run CodeShip Parallel Test Pipelines efficiently - optimal CI parallelization](/2018/how-to-run-codeship-parallel-test-pipelines-efficiently-optimal-ci-parallelization) -* __Semaphore CI__ - [Run parallel jobs on Semaphore CI 2.0 to get faster CI build time](/2019/run-parallel-jobs-on-semaphore-ci-2-0-to-get-faster-ci-build-time) -* __Travis CI__ - [How to run Travis CI parallel jobs with build matrix feature fast](/2018/how-to-run-travis-ci-parallel-jobs-with-build-matrix-feature-fast) - -JavaScript examples for test runners: - -* __Cypress, Jest__ - [Run javascript E2E tests faster with Cypress on parallel CI nodes](/2018/run-javascript-e2e-tests-faster-with-cypress-on-parallel-ci-nodes) - -### Features in knapsack vs knapsack_pro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Featureknapsack gemknapsack_pro gem
Queue mode designed for optimal dynamic test suite split
Test suite split based on tests time execution
Automated tests time execution recording
Test suite split based on most up to date tests time execution data
Show all features
- -
- -How knapsack_pro makes my life easier as opposed to regular knapsack gem? - -* The knapsack_pro version has queue mode designed for optimal test suite split thanks to dynamic tests allocation. -* With the knapsack_pro version the setup and the ongoing work is easier because you don’t have to manually generate knapsack json report with test files time execution for each test suite like rspec, cucumber etc. -* The knapsack_pro version tracks all you branches so when your test code changes the knapsack_pro tries to provide you as optimal test suite split as possible. -* When your test codebase changes over time you need to manually generate a new knapsack report in free gem version which is extra overhead and waste of time of the developer. - -**Only [knapsack_pro gem](https://github.com/KnapsackPro/knapsack_pro-ruby) has Queue Mode feature that saves optimal amount of time? Please [visit Knapsack Pro](https://knapsackpro.com?utm_source=github&utm_medium=readme&utm_campaign=knapsack_gem&utm_content=try_knapsack_pro).** - -### Presentations about knapsack gem - -* [X 2014 Kraków Ruby User Group](http://slides.com/arturt/parallel-tests-in-comparable-time) -* [VII 2014 Lunar Logic Dev Meeting](http://slides.com/arturt/knapsack) - -### Requirements - -`>= Ruby 2.1.0` - - - - -- [Update gem](#update-gem) -- [Installation](#installation) -- [Usage](#usage) - - [Step for RSpec](#step-for-rspec) - - [Step for Cucumber](#step-for-cucumber) - - [Step for Minitest](#step-for-minitest) - - [Step for Spinach](#step-for-spinach) - - [Custom configuration](#custom-configuration) - - [Common step](#common-step) - - [Adding or removing tests](#adding-or-removing-tests) -- [Setup your CI server](#setup-your-ci-server) - - [Info about ENV variables](#info-about-env-variables) - - [Passing arguments to rake task](#passing-arguments-to-rake-task) - - [Passing arguments to rspec](#passing-arguments-to-rspec) - - [Passing arguments to cucumber](#passing-arguments-to-cucumber) - - [Passing arguments to minitest](#passing-arguments-to-minitest) - - [Passing arguments to spinach](#passing-arguments-to-spinach) - - [Knapsack binary](#knapsack-binary) - - [Info for CircleCI users](#info-for-circleci-users) - - [Step 1](#step-1) - - [Step 2](#step-2) - - [Info for Travis users](#info-for-travis-users) - - [Step 1](#step-1-1) - - [Step 2](#step-2-1) - - [Info for semaphoreapp.com users](#info-for-semaphoreappcom-users) - - [Step 1](#step-1-2) - - [Step 2](#step-2-2) - - [Semaphore 2.0](#semaphore-20) - - [Semaphore 1.0](#semaphore-10) - - [Info for buildkite.com users](#info-for-buildkitecom-users) - - [Step 1](#step-1-3) - - [Step 2](#step-2-3) - - [Info for GitLab CI users](#info-for-gitlab-ci-users) - - [Step 1](#step-1) - - [Step 2](#step-2) - - [Info for snap-ci.com users](#info-for-snap-cicom-users) - - [Step 1](#step-1-4) - - [Step 2](#step-2-4) - - [Info for Jenkins](#info-for-jenkins) - - [Info for BitBucket Pipelines](#info-for-bitbucket-pipelines) -- [FAQ](#faq) - - [How Knapsack Pro makes my life easier as opposed to knapsack free gem?](#how-knapsack-pro-makes-my-life-easier-as-opposed-to-knapsack-free-gem) - - [What time offset warning means?](#what-time-offset-warning-means) - - [How to generate knapsack report?](#how-to-generate-knapsack-report) - - [What does "leftover specs" mean?](#what-does-leftover-specs-mean) - - [Why some of test files are still in "leftover specs" after I generate a new report?](#why-some-of-test-files-are-still-in-leftover-specs-after-i-generate-a-new-report) - - [How can I run tests from multiple directories?](#how-can-i-run-tests-from-multiple-directories) - - [How to update existing knapsack report for a few test files?](#how-to-update-existing-knapsack-report-for-a-few-test-files) - - [How to run tests for particular CI node in your development environment](#how-to-run-tests-for-particular-ci-node-in-your-development-environment) - - [How can I change log level?](#how-can-i-change-log-level) -- [Gem tests](#gem-tests) - - [Spec](#spec) - - [Spec examples](#spec-examples) -- [Contributing](#contributing) -- [Acknowledgements](#acknowledgements) -- [Mentions](#mentions) - - - - -## Update gem - -Please check [changelog](https://github.com/KnapsackPro/knapsack/blob/master/CHANGELOG.md) before update gem. Knapsack follows [semantic versioning](http://semver.org). - -## Installation - -Add those lines to your application's Gemfile: - -{% highlight ruby %} -group :test, :development do - gem 'knapsack' -end -{% endhighlight %} - -And then execute: - -{% highlight shell %} -$ bundle -{% endhighlight %} - -Add this line at the bottom of `Rakefile`: - -{% highlight ruby %} -Knapsack.load_tasks if defined?(Knapsack) -{% endhighlight %} - -## Usage - -You can find here example of rails app with already configured knapsack. - -[https://github.com/KnapsackPro/rails-app-with-knapsack](https://github.com/KnapsackPro/rails-app-with-knapsack) - -### Step for RSpec - -Add at the beginning of your `spec_helper.rb`: - -{% highlight ruby %} -require 'knapsack' - -# CUSTOM_CONFIG_GOES_HERE - -Knapsack::Adapters::RSpecAdapter.bind -{% endhighlight %} - -### Step for Cucumber - -Create file `features/support/knapsack.rb` and add there: - -{% highlight ruby %} -require 'knapsack' - -# CUSTOM_CONFIG_GOES_HERE - -Knapsack::Adapters::CucumberAdapter.bind -{% endhighlight %} - -### Step for Minitest - -Add the Knapsack code after you load the app environment in the `test/test_helper.rb` file: - -{% highlight ruby %} -ENV['RAILS_ENV'] ||= 'test' -require File.expand_path('../../config/environment', __FILE__) -require 'rails/test_help' - -require 'knapsack' - -# CUSTOM_CONFIG_GOES_HERE - -knapsack_adapter = Knapsack::Adapters::MinitestAdapter.bind -knapsack_adapter.set_test_helper_path(__FILE__) -{% endhighlight %} - -### Step for Spinach - -Create file `features/support/env.rb` and add there: - -{% highlight ruby %} -require 'knapsack' - -# CUSTOM_CONFIG_GOES_HERE - -Knapsack::Adapters::SpinachAdapter.bind -{% endhighlight %} - -### Custom configuration - -You can change default Knapsack configuration for RSpec, Cucumber, Minitest or Spinach tests. Here are examples what you can do. Put below configuration instead of `CUSTOM_CONFIG_GOES_HERE`. - -{% highlight ruby %} -Knapsack.tracker.config({ - enable_time_offset_warning: true, - time_offset_in_seconds: 30 -}) - -Knapsack.report.config({ - test_file_pattern: 'spec/**{,/*/**}/*_spec.rb', # default value based on adapter - report_path: 'knapsack_custom_report.json' -}) - -# you can use your own logger -require 'logger' -Knapsack.logger = Logger.new(STDOUT) -Knapsack.logger.level = Logger::INFO -{% endhighlight %} - -### Common step - -Generate time execution report for your test files. Run below command on one of your CI nodes. - -{% highlight shell %} -# Step for RSpec -$ KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec - -# Step for Cucumber -$ KNAPSACK_GENERATE_REPORT=true bundle exec cucumber features - -# Step for Minitest -$ KNAPSACK_GENERATE_REPORT=true bundle exec rake test - -# If you use Rails 5.0.x then run this instead: -$ KNAPSACK_GENERATE_REPORT=true bundle exec rake test - -# If you use Rails >= 5.1's SystemTest, run both unit and system tests -$ KNAPSACK_GENERATE_REPORT=true bundle exec rake test test:system - -# Step for Spinach -$ KNAPSACK_GENERATE_REPORT=true bundle exec spinach -{% endhighlight %} - -Commit generated report `knapsack_rspec_report.json`, `knapsack_cucumber_report.json`, `knapsack_minitest_report.json` or `knapsack_spinach_report.json` into your repository. - -This report should be updated only after you add a lot of new slow tests or you change existing ones which causes a big time execution difference between CI nodes. Either way, you will get time offset warning at the end of the rspec/cucumber/minitest results which reminds you when it’s a good time to regenerate the knapsack report. - -`KNAPSACK_GENERATE_REPORT` is truthy when `"true"` or `0`. All other values are falsy, though -[`"false"`, and `1` are semantically -preferrable](https://en.wikipedia.org/wiki/True_and_false_(commands)). - -#### Adding or removing tests - -There is no need to regenerate the report every time when you add/remove test file. If you remove a test file then Knapsack will ignore its entry in report. In case when you add a new file and it doesn't already exist in report, the test file will be assigned to one of the CI node. - -You'll want to regenerate your execution report whenever you remove or add a test file with a long time execution time that would affect one of the CI nodes. You will get Knapsack notification whenever is good time to regenerate report. - -## Setup your CI server - -On your CI server run this command for the first CI node. Update `CI_NODE_INDEX` for the next one. - -{% highlight shell %} -# Step for RSpec -$ CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:rspec - -# Step for Cucumber -$ CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:cucumber - -# Step for Minitest -$ CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:minitest - -# Step for Spinach -$ CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:spinach -{% endhighlight %} - -You can add `KNAPSACK_TEST_FILE_PATTERN` if your tests are not in default directory. For instance: - -{% highlight shell %} -# Step for RSpec -$ KNAPSACK_TEST_FILE_PATTERN="directory_with_specs/**{,/*/**}/*_spec.rb" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:rspec - -# Step for Cucumber -$ KNAPSACK_TEST_FILE_PATTERN="directory_with_features/**/*.feature" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:cucumber - -# Step for Minitest -$ KNAPSACK_TEST_FILE_PATTERN="directory_with_tests/**{,/*/**}/*_spec.rb" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:minitest - -# Step for Spinach -$ KNAPSACK_TEST_FILE_PATTERN="directory_with_features/**/*.feature" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:spinach -{% endhighlight %} - -You can set `KNAPSACK_REPORT_PATH` if your knapsack report was saved in non default location. Example: - -{% highlight shell %} -# Step for RSpec -$ KNAPSACK_REPORT_PATH="knapsack_custom_report.json" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:rspec - -# Step for Cucumber -$ KNAPSACK_REPORT_PATH="knapsack_custom_report.json" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:cucumber - -# Step for Minitest -$ KNAPSACK_REPORT_PATH="knapsack_custom_report.json" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:minitest - -# Step for Spinach -$ KNAPSACK_REPORT_PATH="knapsack_custom_report.json" CI_NODE_TOTAL=2 CI_NODE_INDEX=0 bundle exec rake knapsack:spinach -{% endhighlight %} - -### Info about ENV variables - -`CI_NODE_TOTAL` - total number CI nodes you have. - -`CI_NODE_INDEX` - index of current CI node starts from 0. Second CI node should have `CI_NODE_INDEX=1`. - -Note some CI providers like GitLab CI have the same name of environment variable like `CI_NODE_INDEX` which starts from 1 instead of 0. -Knapsack gem will automatically pick it up and change from 1 to 0 to make knapsack work. - -### Passing arguments to rake task - -#### Passing arguments to rspec - -Knapsack allows you to pass arguments through to rspec. For example if you want to run only specs that have the tag `focus`. If you do this with rspec directly it would look like: - -{% highlight shell %} -$ bundle exec rake rspec --tag focus -{% endhighlight %} - -To do this with Knapsack you simply add your rspec arguments as parameters to the knapsack rake task. - -{% highlight shell %} -$ bundle exec rake "knapsack:rspec[--tag focus]" -{% endhighlight %} - -Remember that using tags to limit which specs get run will affect the time each file takes to run. One solution to this is to generate a new `knapsack_rspec_report.json` for the commonly run scenarios. - -#### Passing arguments to cucumber - -Add arguments to knapsack cucumber task like this: - -{% highlight shell %} -$ bundle exec rake "knapsack:cucumber[--name feature]" -{% endhighlight %} - -#### Passing arguments to minitest - -Add arguments to knapsack minitest task like this: - -{% highlight shell %} -$ bundle exec rake "knapsack:minitest[--arg_name value]" -{% endhighlight %} - -For instance to run verbose tests: - -{% highlight shell %} -$ bundle exec rake "knapsack:minitest[--verbose]" -{% endhighlight %} - -#### Passing arguments to spinach - -Add arguments to knapsack spinach task like this: - -{% highlight shell %} -$ bundle exec rake "knapsack:spinach[--name feature]" -{% endhighlight %} - -### Knapsack binary - -You can install knapsack globally and use binary. For instance: - -{% highlight shell %} -$ knapsack rspec "--tag custom_tag_name --profile" -$ knapsack cucumber -$ knapsack minitest "--verbose --pride" -$ knapsack spinach "-f spinach_examples" -{% endhighlight %} - -[Here](https://github.com/KnapsackPro/knapsack/pull/21) you will find example when it might be useful. - -### Info for CircleCI users - -If you are using circleci.com you can omit `CI_NODE_TOTAL` and `CI_NODE_INDEX`. Knapsack will use `CIRCLE_NODE_TOTAL` and `CIRCLE_NODE_INDEX` provided by CircleCI. - -Here is an example for test configuration in your `.circleci/config.yml` file. - -#### Step 1 - -For the first time run all tests on a single CI node with enabled report generator. - -{% highlight yaml %} -# CircleCI 2.0 -- run: - name: Step for RSpec - command: | - # export word is important here! - export KNAPSACK_GENERATE_REPORT=true - bundle exec rspec spec - -- run: - name: Step for Cucumber - command: | - # export word is important here! - export KNAPSACK_GENERATE_REPORT=true - bundle exec cucumber features - -- run: - name: Step for Minitest - command: | - # export word is important here! - export KNAPSACK_GENERATE_REPORT=true - bundle exec rake test - # For Rails 5.1 runs unit and system tests - bundle exec rake test test:system - -- run: - name: Step for Spinach - command: | - # export word is important here! - export KNAPSACK_GENERATE_REPORT=true - bundle exec rspec spinach -{% endhighlight %} - -After tests pass on your CircleCI machine you should copy knapsack json report which is rendered at the end of rspec/cucumber/minitest results. Save it into your repository as `knapsack_rspec_report.json`, `knapsack_cucumber_report.json`, `knapsack_minitest_report.json` or `knapsack_spinach_report.json` file and commit. - -#### Step 2 - -Now you should update test command and enable parallel. Please remember to add additional containers for your project in CircleCI settings. - -{% highlight yaml %} -# CircleCI 2.0 -- run: - name: Step for RSpec - command: bundle exec rake knapsack:rspec - -- run: - name: Step for Cucumber - command: bundle exec rake knapsack:cucumber - -- run: - name: Step for Minitest - command: bundle exec rake knapsack:minitest - -- run: - name: Step for Spinach - command: bundle exec rake knapsack:spinach -{% endhighlight %} - -Now everything should work. You will get a warning at the end of rspec/cucumber/minitest results if time execution takes too long. - -### Info for Travis users - -#### Step 1 - -For the first time run all tests at once with enabled report generator. Edit `.travis.yml` - -{% highlight yaml %} -script: - # Step for RSpec - - "KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec" - - # Step for Cucumber - - "KNAPSACK_GENERATE_REPORT=true bundle exec cucumber features" - - # Step for Minitest - - "KNAPSACK_GENERATE_REPORT=true bundle exec rake test" - - "KNAPSACK_GENERATE_REPORT=true bundle exec rake test test:system" # For Rails 5.1 runs unit and system tests - - # Step for Spinach - - "KNAPSACK_GENERATE_REPORT=true bundle exec spinach" -{% endhighlight %} - -After tests pass you should copy knapsack json report which is rendered at the end of rspec/cucumber/minitest results. Save it into your repository as `knapsack_rspec_report.json`, `knapsack_cucumber_report.json`, `knapsack_minitest_report.json` or `knapsack_spinach_report.json` file and commit. - -#### Step 2 - -You can parallel your builds across virtual machines with [travis matrix feature](http://docs.travis-ci.com/user/speeding-up-the-build/#Parallelizing-your-builds-across-virtual-machines). Edit `.travis.yml` - -{% highlight yaml %} -script: - # Step for RSpec - - "bundle exec rake knapsack:rspec" - - # Step for Cucumber - - "bundle exec rake knapsack:cucumber" - - # Step for Minitest - - "bundle exec rake knapsack:minitest" - - # Step for Spinach - - "bundle exec rake knapsack:spinach" - -env: - - CI_NODE_TOTAL=2 CI_NODE_INDEX=0 - - CI_NODE_TOTAL=2 CI_NODE_INDEX=1 -{% endhighlight %} - -If you want to have some global ENVs and matrix of ENVs then do it like this: - -{% highlight yaml %} -script: - # Step for RSpec - - "bundle exec rake knapsack:rspec" - - # Step for Cucumber - - "bundle exec rake knapsack:cucumber" - - # Step for Minitest - - "bundle exec rake knapsack:minitest" - - # Step for Spinach - - "bundle exec rake knapsack:spinach" - -env: - global: - - RAILS_ENV=test - - MY_GLOBAL_VAR=123 - - CI_NODE_TOTAL=2 - jobs: - - CI_NODE_INDEX=0 - - CI_NODE_INDEX=1 -{% endhighlight %} - -Such configuration will generate matrix with 2 following ENV rows: - -{% highlight shell %} -CI_NODE_TOTAL=2 CI_NODE_INDEX=0 RAILS_ENV=test MY_GLOBAL_VAR=123 -CI_NODE_TOTAL=2 CI_NODE_INDEX=1 RAILS_ENV=test MY_GLOBAL_VAR=123 -{% endhighlight %} - -More info about global and matrix ENV configuration in [travis docs](http://docs.travis-ci.com/user/build-configuration/#Environment-variables). - -### Info for semaphoreapp.com users - -#### Step 1 - -For the first time run all tests at once with enabled report generator. Set up your build command: - -{% highlight shell %} -# Step for RSpec -KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec - -# Step for Cucumber -KNAPSACK_GENERATE_REPORT=true bundle exec cucumber features - -# Step for Minitest -KNAPSACK_GENERATE_REPORT=true bundle exec rake test -KNAPSACK_GENERATE_REPORT=true bundle exec rake test test:system # For Rails 5.1 runs unit and system tests - -# Step for Spinach -KNAPSACK_GENERATE_REPORT=true bundle exec spinach -{% endhighlight %} - -After tests pass you should copy knapsack json report which is rendered at the end of rspec/cucumber/test results. Save it into your repository as `knapsack_rspec_report.json`, `knapsack_cucumber_report.json`, `knapsack_minitest_report.json` or `knapsack_spinach_report.json` file and commit. - -#### Step 2 - -##### Semaphore 2.0 - -knapsack gem supports environment variables provided by Semaphore CI 2.0 to run your tests. You will have to define a few things in `.semaphore/semaphore.yml` config file. - -{% highlight yaml %} -# .semaphore/semaphore.yml -# Use the latest stable version of Semaphore 2.0 YML syntax: -version: v1.0 - -# Name your pipeline. In case you connect multiple pipelines with promotions, -# the name will help you differentiate between, for example, a CI build phase -# and delivery phases. -name: Demo Rails 5 app - -# An agent defines the environment in which your code runs. -# It is a combination of one of available machine types and operating -# system images. -# See https://docs.semaphoreci.com/article/20-machine-types -# and https://docs.semaphoreci.com/article/32-ubuntu-1804-image -agent: - machine: - type: e1-standard-2 - os_image: ubuntu1804 - -# Blocks are the heart of a pipeline and are executed sequentially. -# Each block has a task that defines one or more jobs. Jobs define the -# commands to execute. -# See https://docs.semaphoreci.com/article/62-concepts -blocks: - - name: Setup - task: - env_vars: - - name: RAILS_ENV - value: test - jobs: - - name: bundle - commands: - # Checkout code from Git repository. This step is mandatory if the - # job is to work with your code. - # Optionally you may use --use-cache flag to avoid roundtrip to - # remote repository. - # See https://docs.semaphoreci.com/article/54-toolbox-reference#libcheckout - - checkout - # Restore dependencies from cache. - # Read about caching: https://docs.semaphoreci.com/article/54-toolbox-reference#cache - - cache restore gems-$SEMAPHORE_GIT_BRANCH-$(checksum Gemfile.lock),gems-$SEMAPHORE_GIT_BRANCH-,gems-master- - # Set Ruby version: - - sem-version ruby 2.6.1 - - bundle install --jobs=4 --retry=3 --path vendor/bundle - # Store the latest version of dependencies in cache, - # to be used in next blocks and future workflows: - - cache store gems-$SEMAPHORE_GIT_BRANCH-$(checksum Gemfile.lock) vendor/bundle - - - name: RSpec tests - task: - env_vars: - - name: RAILS_ENV - value: test - - name: PGHOST - value: 127.0.0.1 - - name: PGUSER - value: postgres - # This block runs two jobs in parallel and they both share common - # setup steps. We can group them in a prologue. - # See https://docs.semaphoreci.com/article/50-pipeline-yaml#prologue - prologue: - commands: - - checkout - - cache restore gems-$SEMAPHORE_GIT_BRANCH-$(checksum Gemfile.lock),gems-$SEMAPHORE_GIT_BRANCH-,gems-master- - # Start Postgres database service. - # See https://docs.semaphoreci.com/article/54-toolbox-reference#sem-service - - sem-service start postgres - - sem-version ruby 2.6.1 - - bundle install --jobs=4 --retry=3 --path vendor/bundle - - bundle exec rake db:setup - - jobs: - - name: Run tests with Knapsack - parallelism: 2 - commands: - # Step for RSpec - - bundle exec rake knapsack:rspec - # Step for Cucumber - - bundle exec rake knapsack:cucumber - # Step for Minitest - - bundle exec rake knapsack:minitest - # Step for Spinach - - bundle exec rake knapsack:spinach -{% endhighlight %} - -You may also find useful article about spliting tests in a dynamic way with knapsack_pro Queue Mode: [run parallel jobs on Semaphore CI 2.0 to get faster CI build time](/2019/run-parallel-jobs-on-semaphore-ci-2-0-to-get-faster-ci-build-time). - -##### Semaphore 1.0 - -Knapsack supports semaphoreapp ENVs `SEMAPHORE_THREAD_COUNT` and `SEMAPHORE_CURRENT_THREAD`. The only thing you need to do is set up knapsack rspec/cucumber/minitest command for as many threads as you need. Here is an example: - -{% highlight shell %} -# Thread 1 -## Step for RSpec -bundle exec rake knapsack:rspec -## Step for Cucumber -bundle exec rake knapsack:cucumber -## Step for Minitest -bundle exec rake knapsack:minitest -## Step for Spinach -bundle exec rake knapsack:spinach - -# Thread 2 -## Step for RSpec -bundle exec rake knapsack:rspec -## Step for Cucumber -bundle exec rake knapsack:cucumber -## Step for Minitest -bundle exec rake knapsack:minitest -## Step for Spinach -bundle exec rake knapsack:spinach -{% endhighlight %} - -Tests will be split across threads. - -### Info for buildkite.com users - -#### Step 1 - -For the first time run all tests at once with enabled report generator. Run the following commands locally: - -{% highlight shell %} -# Step for RSpec -KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec - -# Step for Cucumber -KNAPSACK_GENERATE_REPORT=true bundle exec cucumber features - -# Step for Minitest -KNAPSACK_GENERATE_REPORT=true bundle exec rake test -KNAPSACK_GENERATE_REPORT=true bundle exec rake test test:system # For Rails 5.1 runs unit and system tests - -# Step for Spinach -KNAPSACK_GENERATE_REPORT=true bundle exec spinach -{% endhighlight %} - -After tests pass you should copy knapsack json report which is rendered at the end of rspec/cucumber/minitest results. Save it into your repository as `knapsack_rspec_report.json`, `knapsack_cucumber_report.json`, `knapsack_minitest_report.json` or `knapsack_spinach_report.json` file and commit. - -#### Step 2 - -Knapsack supports buildkite ENVs `BUILDKITE_PARALLEL_JOB_COUNT` and `BUILDKITE_PARALLEL_JOB`. The only thing you need to do is to configure the parallelism parameter in your build step and run the appropiate command in your build - -{% highlight shell %} -# Step for RSpec -bundle exec rake knapsack:rspec - -# Step for Cucumber -bundle exec rake knapsack:cucumber - -# Step for Minitest -bundle exec rake knapsack:minitest - -# Step for Spinach -bundle exec rake knapsack:spinach -{% endhighlight %} - -

-When using the docker-compose plugin on Buildkite, you have to tell it which environment variables to pass to the docker container: -

- -{% highlight yaml %} -steps: - - label: "Test" - parallelism: 2 - plugins: - - docker-compose#3.0.3: - run: app - # use here proper knapsack command for your test runner - command: bundle exec rake knapsack:rspec - config: docker-compose.test.yml - env: - - BUILDKITE_PARALLEL_JOB_COUNT - - BUILDKITE_PARALLEL_JOB -{% endhighlight %} - -### Info for GitLab CI users - -If you are using GitLab 11.5 or later you can omit `CI_NODE_TOTAL` and `CI_NODE_INDEX`. Knapsack will use `CI_NODE_TOTAL` and `CI_NODE_INDEX` provided by GitLab if you use the [`parallel`](https://docs.gitlab.com/ee/ci/yaml/#parallel) option in GitLab CI. - -#### Step 1 - -For the first time run all tests on a single CI node with enabled report generator. - -{% highlight yaml %} -test: - script: KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec -{% endhighlight %} - -Here are other commands you could use instead of RSpec. - -{% highlight shell %} -# Step for Cucumber -KNAPSACK_GENERATE_REPORT=true bundle exec cucumber features - -# Step for Minitest -KNAPSACK_GENERATE_REPORT=true bundle exec rake test -KNAPSACK_GENERATE_REPORT=true bundle exec rake test test:system # For Rails 5.1 runs unit and system tests - -# Step for Spinach -KNAPSACK_GENERATE_REPORT=true bundle exec spinach -{% endhighlight %} - -After tests pass on your GitLab CI you should copy knapsack json report which is rendered at the end of rspec/cucumber/minitest results. Save it into your repository as `knapsack_rspec_report.json`, `knapsack_cucumber_report.json`, `knapsack_minitest_report.json` or `knapsack_spinach_report.json` file and commit. - -#### Step 2 - -Now you should update test command and enable parallel. Please remember to set proper parallel value for your project. - -Here you can find info [how to configure the parallel CI nodes](https://docs.gitlab.com/ee/ci/yaml/#parallel). - -{% highlight yaml %} -test: - script: bundle exec rake knapsack:rspec - parallel: 2 -{% endhighlight %} - -Here are other commands you could use instead of knapsack for RSpec. - -{% highlight shell %} -# Step for Cucumber -bundle exec rake knapsack:cucumber - -# Step for Minitest -bundle exec rake knapsack:minitest - -# Step for Spinach -bundle exec rake knapsack:spinach -{% endhighlight %} - -### Info for snap-ci.com users - -#### Step 1 - -For the first time run all tests at once with enabled report generator. Run the following commands locally: - -{% highlight shell %} -# Step for RSpec -KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec - -# Step for Cucumber -KNAPSACK_GENERATE_REPORT=true bundle exec cucumber features - -# Step for Minitest -KNAPSACK_GENERATE_REPORT=true bundle exec rake test -KNAPSACK_GENERATE_REPORT=true bundle exec rake test test:system # For Rails 5.1 runs unit and system tests - -# Step for Spinach -KNAPSACK_GENERATE_REPORT=true bundle exec spinach -{% endhighlight %} - -After tests pass you should copy knapsack json report which is rendered at the end of rspec/cucumber/minitest results. Save it into your repository as `knapsack_rspec_report.json`, `knapsack_cucumber_report.json`, `knapsack_minitest_report.json` or `knapsack_spinach_report.json` file and commit. - -#### Step 2 - -Knapsack supports snap-ci.com ENVs `SNAP_WORKER_TOTAL` and `SNAP_WORKER_INDEX`. The only thing you need to do is to configure number of workers for your project in configuration settings in order to enable parallelism. Next thing is to set below commands to be executed in your stage: - -{% highlight shell %} -# Step for RSpec -bundle exec rake knapsack:rspec - -# Step for Cucumber -bundle exec rake knapsack:cucumber - -# Step for Minitest -bundle exec rake knapsack:minitest - -# Step for Spinach -bundle exec rake knapsack:spinach -{% endhighlight %} - -### Info for Jenkins - -In order to run parallel jobs with Jenkins you should use Jenkins Pipeline. -You can learn basics about it in the article [Parallelism and Distributed Builds with Jenkins](https://www.cloudbees.com/blog/parallelism-and-distributed-builds-jenkins). - -Here is an example [`Jenkinsfile`](https://github.com/mknapik/jenkins-pipeline-knapsack/blob/master/Jenkinsfile) working with Jenkins Pipeline and knapsack gem. - -You may want to read article [Knapsack with Jenkins Pipeline](http://blog.knapik.me/knapsack-with-jenkins-pipeline/) from Michał Knapik. - -More tips can be found in the [issue](https://github.com/KnapsackPro/knapsack/issues/42). - -### Info for BitBucket Pipelines - -#### Step 1 - -For the first time run all tests at once with enabled report generator. Run the following commands locally: - -{% highlight shell %} -# Step for RSpec -KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec - -# Step for Cucumber -KNAPSACK_GENERATE_REPORT=true bundle exec cucumber features - -# Step for Minitest -KNAPSACK_GENERATE_REPORT=true bundle exec rake test -KNAPSACK_GENERATE_REPORT=true bundle exec rake test test:system # For Rails 5.1 runs unit and system tests - -# Step for Spinach -KNAPSACK_GENERATE_REPORT=true bundle exec spinach -{% endhighlight %} - -After tests pass you should copy knapsack json report which is rendered at the end of rspec/cucumber/minitest results. Save it into your repository as `knapsack_rspec_report.json`, `knapsack_cucumber_report.json`, `knapsack_minitest_report.json` or `knapsack_spinach_report.json` file and commit. - -#### Step 2 - -Knapsack supports BitBucket Pipelines ENVs `BITBUCKET_PARALLEL_STEP_COUNT` and `BITBUCKET_PARALLEL_STEP`. The only thing you need to do is to configure the parallelism parameter in your build step and run the appropiate command in your build - -{% highlight shell %} -# Step for RSpec -bundle exec rake knapsack:rspec - -# Step for Cucumber -bundle exec rake knapsack:cucumber - -# Step for Minitest -bundle exec rake knapsack:minitest - -# Step for Spinach -bundle exec rake knapsack:spinach -{% endhighlight %} - -## FAQ - -### How Knapsack Pro makes my life easier as opposed to knapsack free gem? - -* [Knapsack Pro](https://knapsackpro.com?utm_source=github&utm_medium=readme&utm_campaign=knapsack_gem&utm_content=knapsack_pro_opposed_to_knapsack) version has Queue Mode designed for optimal test suite split thanks to dynamic tests allocation. [Learn more](https://www.youtube.com/watch?v=hUEB1XDKEFY) -* Knapsack Pro version tracks all you branches so when your test code changes the Knapsack Pro tries to provide you optimal test suite split. -* With Knapsack Pro version the setup and the ongoing work is easier because you don't have to manually generate knapsack json report with test files time execution for each test suite like RSpec, Cucumber etc. -* When your test codebase changes over time you need to manually generate a new knapsack json report in free gem version which is extra overhead and waste of developer time. - -### What time offset warning means? - -At the end of tests execution results you can see warning like this: - -{% highlight plain %} -========= Knapsack Time Offset Warning ========== -Time offset: 30s -Max allowed node time execution: 02m 30s -Exceeded time: 37s -{% endhighlight %} - -`Time offset: 30s` - this is the current time offset value, by default it’s 30s. Let’s assume whole test suite takes 4 minutes and you do split across 2 CI nodes so the optimal split is 2 minutes per node. Time offset 30s means when tests on single CI node will take longer than 2 minutes and 30s then you see warning about regenerating report because probably test suite files changed and the knapsack report contains old time execution data about each test file so regenerating knapsack report should help you provide a more optimal test suite split. - -`Max allowed node time execution: 02m 30s` - it’s average time execution of tests per CI node + time offset. In this case average tests time execution per CI node is 2 minutes. - -`Exceeded time: 37s` - it means tests on particular CI node took 37s longer than `max allowed node time execution`. Sometimes this value is negative when tests executed faster than `max allowed node time execution`. - -### How to generate knapsack report? - -If you want to regenerate report take a look [here](#common-step). - -{% highlight shell %} -KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec -{% endhighlight %} - -If you run command like this on your development machine then test suite time execution might be different than if you generate a report on CI machine (for instance tests might be faster on your machine then on CI node) so that might be a reason why you see warning about regenerating report. You can generate the report on single CI node which should give you result specific for your CI node instead of your development machine. In case you don't want to bother about manually regenerating knapsack report please take a look on [knapsack_pro gem](https://knapsackpro.com?utm_source=github&utm_medium=readme&utm_campaign=knapsack_gem&utm_content=no_manual_report). - -### What does "leftover specs" mean? - -When you run your specs with knapsack rake task then you will see in the output something like: - -{% highlight plain %} -Report specs: -spec/models/user_spec.rb -spec/controllers/users_controller_spec.rb - -Leftover specs: -spec/models/book_spec.rb -spec/models/author_spec.rb -{% endhighlight %} - -The leftover specs mean we don't have recorded time execution for those test files. -The reason might be: - -* that someone added a new test file after knapsack report was generated -* another reason might be an empty spec file with no test cases -* or you run in RSpec only subset of tests using tags like `--tag type:my-custom-tag` then if you recorded json report for such a tag then only tagged specs will be in json report and all other specs will be named as "leftover specs" - -If leftover specs will be distributed across CI nodes then it will happen based on file name instead of the test file execution time which is missing for them. - -If you have a lot of leftover specs then you can [generate knapsack report again](#how-to-generate-knapsack-report) to improve you test distribution across CI nodes. - -### Why some of test files are still in "leftover specs" after I generate a new report? - -If test file is empty or has only pending tests then it cannot be recorded so it will end up in leftovers specs list. - -### How can I run tests from multiple directories? - -The test file pattern config option supports any glob pattern handled by [`Dir.glob`](http://ruby-doc.org/core-2.2.0/Dir.html#method-c-glob) and can be configured to pull test files from multiple directories. An example of this when using RSpec would be `"{spec,engines/**/spec}/**{,/*/**}/*_spec.rb"`. For complex cases like this, the test directory can't be extracted and must be specified manually using the `KNAPSACK_TEST_DIR` environment variable: - -{% highlight shell %} -$ KNAPSACK_TEST_DIR=spec KNAPSACK_TEST_FILE_PATTERN="{spec,engines/**/spec}/**{,/*/**}/*_spec.rb" bundle exec rake knapsack:rspec -{% endhighlight %} - -`KNAPSACK_TEST_DIR` will be your default path for rspec so you should put there your `spec_helper.rb`. Please ensure you will require it in your test files this way: - -{% highlight ruby %} -# good -require_relative 'spec_helper' - -# bad - won't work -require 'spec_helper' -{% endhighlight %} - -### How to update existing knapsack report for a few test files? - -You may want to look at monkey patch in [this issue](https://github.com/KnapsackPro/knapsack/issues/34). Take into account that there are some cons of this approach. - -### How to run tests for particular CI node in your development environment - -In your development environment you can debug tests that were run on the particular CI node. -For instance to run subset of tests for the first CI node with specified seed you can do. - -{% highlight shell %} -CI_NODE_TOTAL=2 \ -CI_NODE_INDEX=0 \ -bundle exec rake "knapsack:rspec[--seed 123]" -{% endhighlight %} - -Above example is for RSpec. You can use respectively rake task name and token environment variable when you want to run tests for minitest, cucumber or spinach. - -### How can I change log level? - -You can change log level by specifying the `KNAPSACK_LOG_LEVEL` environment variable. - -{% highlight shell %} -KNAPSACK_LOG_LEVEL=warn bundle exec rake knapsack:rspec -{% endhighlight %} - -Available values are `debug`, `info`, and `warn`. The default log level is `info`. - -## Gem tests - -### Spec - -To run specs for Knapsack gem type: - -{% highlight shell %} -$ bundle exec rspec spec -{% endhighlight %} - -### Spec examples - -Directory `spec_examples` contains examples of fast and slow specs. There is a `spec_example/spec_helper.rb` with binded Knapsack. - -To generate a new knapsack report for specs with `focus` tag (only specs in `spec_examples/leftover` directory have no `focus` tag), please type: - -{% highlight shell %} -$ KNAPSACK_GENERATE_REPORT=true bundle exec rspec --default-path spec_examples --tag focus -{% endhighlight %} - -**Warning:** Current `knapsack_rspec_report.json` file was generated for `spec_examples` except `spec_examples/leftover` directory. Just for testing reason to see how leftover specs will be distribute in a dumb way across CI nodes. - -To see specs distributed for the first CI node type: - -{% highlight shell %} -$ CI_NODE_TOTAL=2 CI_NODE_INDEX=0 KNAPSACK_SPEC_PATTERN="spec_examples/**{,/*/**}/*_spec.rb" bundle exec rake knapsack:rspec -{% endhighlight %} - -Specs in `spec_examples/leftover` take more than 3 seconds. This should cause a Knapsack time offset warning because we set `time_offset_in_seconds` to 3 in `spec_examples/spec_helper.rb`. Type below to see warning: - -{% highlight shell %} -$ bundle exec rspec --default-path spec_examples -{% endhighlight %} - -## Contributing - -1. Fork it ( [https://github.com/KnapsackPro/knapsack/fork](https://github.com/KnapsackPro/knapsack/fork) ) -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Commit your changes (`git commit -am 'Add some feature'`) -4. Push to the branch (`git push origin my-new-feature`) -5. You can create example tests in related repository with example of [rails application and knapsack gem usage](https://github.com/KnapsackPro/rails-app-with-knapsack). -6. Create a new Pull Request - -## Acknowledgements - -Many thanks to [Małgorzata Nowak](https://github.com/informatykgosia) for beautiful logo. - -## Mentions - -* Lunar Logic Blog | [Parallel your specs and don’t waste time](http://blog.lunarlogic.io/2014/parallel-your-specs-and-dont-waste-time/) -* Travis CI | [Parallelizing RSpec and Cucumber on multiple VMs](http://docs.travis-ci.com/user/speeding-up-the-build/#Parallelizing-RSpec-and-Cucumber-on-multiple-VMs) -* Semaphore | [Running RSpec specs in parallel](https://semaphoreapp.com/docs/running-rspec-specs-in-threads.html) -* Semaphore | [Running Cucumber scenarios in parallel](https://semaphoreapp.com/docs/running-cucumber-scenarios-in-threads.html) -* Buildkite | [Libraries](https://buildkite.com/docs/guides/parallelizing-builds#libraries) -* Snap CI | [Knapsack: optimal test suite split based on time execution](https://docs.snap-ci.com/speeding-up-builds/test-parallelism/#parallelism-using-third-party-tools%23knapsack-optimal-test-suite-split-based-on-time-execution) -* CircleCI | [Test splitting documentation](https://circleci.com/docs/2.0/parallelism-faster-jobs/#other-ways-to-split-tests) -* Michał Knapik Blog | [Knapsack with Jenkins Pipeline](http://blog.knapik.me/knapsack-with-jenkins-pipeline/) diff --git a/docusaurus/docusaurus.config.ts b/docusaurus/docusaurus.config.ts index a0f0259c..3dc423ca 100644 --- a/docusaurus/docusaurus.config.ts +++ b/docusaurus/docusaurus.config.ts @@ -82,6 +82,10 @@ const config: Config = { to: "/", from: "/integration", }, + { + to: "https://github.com/KnapsackPro/knapsack", + from: "/ruby/knapsack", + }, ], }, ], diff --git a/images/docs/ruby/knapsack/knapsack-logo-@2.png b/images/docs/ruby/knapsack/knapsack-logo-@2.png deleted file mode 100644 index 70ee1e329b340528a52f2460b31b8b37810086ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31976 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

j8hn&SZeKX}e$L_V|b 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 LC`ngI8VCI^;v9sb diff --git a/images/docs/ruby/knapsack/with_knapsack.png b/images/docs/ruby/knapsack/with_knapsack.png deleted file mode 100644 index 93fc233853a3fe429f03252f88f178b2f9d9a718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24989 zcmce;V|boj-{u`PXzT`!ZCj1)#zte?wrw=F8z*fVyRmKCnxog%>%Q-q=b71NKD=)~ zWINY+9!vj)W9`4SZw-@|6@!0|{T>7a1YSa1SP=vSj1BnQ4-E$V4GN0B0|EIUYbGQl zFCipEAa8H;#mv$e1Vjy{Qr$!uO{V@dE$RmyrwK{GHe9^Jn1XV0W)~?j0TGdZxUj+x zkoNbG3=yHe5a2`-??gVKp~)-58O1I|Y`l!|-aWbOWgd7HwYKh-9%g5kYJl8}C+_dt zCSv)94yctSw8Yhf6sIugqpgErf(T$CQF=2@1S24@ogaS3y$S&N>cktDzwk&e`6e^6 ziI21e1+oc(?)hT)OhnKL36eZPpNE zzZU)@Cb=QVc{&J^1loI6Xb@3U3e4y`SbygaFZ%cv1wP^=xXIA9*}4qxhFo!S$96+Q zDX_DB)rRi)k0D;5isU`t77OJ4UpI9-f5e^lkr6UZY$O&$MZArZ5%D1OS!^Ns(NdvDU9suNnj_rrVX<~0d0@cBbfg?y+dj?9Q;HQ#S}nQyrqfiv{kFhH9o7dN_h{vIkdRS@nh;sQF<@nsYW75Afs zaJ|r!Tr|R(+FC4m5dpz+CfOQr^4sY>)OV_3t6}vmW>P^dzcI;Vn8MF? zRceP>1+xiGc_jw*j&D+6%YtxFYSNkXSWS`Afv6w!Mdw$PnT9ZV5<)_h~cQLBAWN*ToKAI0r~6+q zbag4^1q}rMz*CM2d~bJx}Mg_>cZpfyDw2W>D^RFoCp`8F0$IfC4u zHq@#TXLh^|QEY&iQh^KDTvyY)KLvN{wN=M|QY8b;5yPVesp5F(RoL=b=$`bp^~Gc8 zA`gIq22&t-=cNdFC;;^VL`m=6u^;R?#FGAWz$XZ!ED*&Xc(L#7yO8DKq5~3g-%tBS ztiNxDN&lg3i^v1!wT|TqGuOv`jy&S;R^v|q4N6FC35`e;7)o3h%9IzjPgoQRzZvLC z#3zn~64paVIiN#=NhuIbTpXvd&14VT62T+<7>7B4V}$(>Oq2g1F|aNltOTOW*E}z{ zg!RzhS}5RGmMK$u7@nxqgyc1tJ9tL~pJ2{c!+kMF1aJnp53-Taq6qn6jD7Ql?F@b& zsL0?G0w}wb4GtNiY^!qg`WTo~NonwggVFnjx^B$;oO&PiT@0pbplbVTS?6))5sp!h zagJ$j$)h8;`Uf`~?237&9y}&+Sxb6wrblE`M zq&~m7SMlWc#^o0yKyrnygV6Tp^%D#wHA0R?rbE(z1`l)z6d?jv2rZFjA$CV54#Vm} z+2k}}w)5qX(E4gvgjzgRR9}2mER{E$UtVNUa8&3a)+9JCNH0+>btZ@}`8}jFu`{|e z;T8SG1rjn?22KMm8jcX|0Im=&0qABl}3?g7IAO=;4#|8c<3*1i~rjBBLUdqH^gDY332f z5tNa>5wu;FU8Y^l5up(W8cP~Unp+xV8YuO#S{|b`1JWAFn)JHI`Y&}VwT<=B_4@O| z3y}-Y^S5=M>z(R44EyV)>NM*@>h|h%jn4FQcJy}ScWk%Bw<)%oyBYh!HWJqxw&C_h zw%UJk4z!Gr{xBXu|Ka3Y9&O=k;g=D!cNe30exe3la*72+|7T2XY3&2XzNY1#t(Oh}?_N2yY6@MqGzhSjI1Jw^AA^ zy%ZrUxGTs^2uu)7uuZ5l5;AJmqSam*bZ2M?$W+}iY6%`W1$ zwAf$8;!2Fk)9IYHFXOn$y5T&)J!D+wp!cA)qg|q(Qa>vzE5WH&sCbt4lo=H!ew{A4 zmQfd7kZX~CD1EQqD{b5)88D>!S$zg%2DNN_W`5do=C=G>X=SNJiPFr`bTMlWizmwv zYcR_K>qizubG~0c&9KZ)X3ZxxCROI5XFBsC4{em(iIKm$W90b(#v=OWI(XcQh|F7PKanEES5CTon?t zW3&C0Yl{Q(@>bYZ3YyeQf=jB-o6d30>?eL5gr-9CVKM79-myR%tNC%S*!-&9%cgZ?UbZxXR znCdmZP;+B@cm4=%5GdDEDLy+;GZ0PDRnk-PYPzsrv0t0D$Q|J_rdU~OVi22Z#Ry+} ze7@DfElXvsyPViRb$Ha2dOwmsh=KSL<*-TOVq9je{r?JB%$?s+Hi1NnomH{E_A9+%TsvbbINVLVK! z)j7IKKNMrN7<5cEUGv48DT?>SE}}O>NXtmcV*!_Dv2^(43^k`Mv!Wbagb#ChaE?Ffe`j?y=IxO!@eHJ(7C#K9+9@euLI&PnW?=8W6iav-@>q>pE!dJp?yXxDPxzpTh zqVIp{0l=IeQqGVC$F65bEv0_`f(?1Gv!O!Qf8Zq)Rcu;;-KfL-z52@Q~ z!uw^-tI%8f&H0>r{H~r~*{5NYb0lg^Y^0iIo92>cmd1>3Mb}w3TT4QXv?94mqMG%! z;q}3s*T9Q6U9iy76IM?z0umDJ{DcO?NDgHFah?6$R&}O@5V$uHu{@LkyD;8EsI%U! zL6#k)s{|N*T!w6@PD)oanke5-*9fyutX&1SsnzMj>1sS10-J>zmx6C$8H~yO5?a(h`B8!Qx>d^#!Cxqve9n-#QnRTNx z-&hBJ|4Yf$bLScEB@4_M0un;OKTD`F@O=oOzTpNfaxu}J=sPj);!10kN!HE%T-{za0$+|hz0^gX%ImA~Oh*sKKJwf@{@UJ< zb6blZ*%`+iK_5e>P0@?7PqgOy;=NpL>EdQ4vJ#e@5F^XW%d5qy!m9nU1-DBh7A0Ld z!FhHCgBebzQ+ibW=AO0_KJ>2NoMYBntiTO`J2izt@W^( z+yV57V`s5<&eQ8;Ky65e_8s0gmo=~DX{9yIMa(H19sxYp%YtLGb>?rMme+sDk6ztl zLU!M8JlT4ccBJDD;?H1x^zky4HaXtPNU+K3W8AtytwNPL3tzSIUSm37;bi<~qoMD< zDKy$YfR&WiB6pMX(plr#!gs{*^lCB0US)IFx%U#9nLh&c(}|^axrOX|XD8!Z-T)~J zT7G2OPo2KPEnetWVNNaycZpyb5|KK#eBuOr2kc>q*)NS|2w!An=-#`qjkB&Qcte7s zcU1}={45sHVCz83LN$p+idRmkOT3Mfh^JllRIk$XmP9Tm$!izsm10$)RqfE&O5QcB zY+B@RTz7i7PQ12){|SE;Nr!cp=E+2y4y#6?nXb{I@w6bkNVZtGaOO0>m%5X9lDTF7 zi?yG2ig%EBeyVrasJydjfvx%khCAGgPGQlr?V0PP8Y&U$^u0Zz3LIh3NZ@S{Yw(mD1H6UCcp@#A8cF^u?gR1q}%N)rwS z&)e6fF2%a4oh66W-sf^xX+`zgtT|(0nQP8ppEo1iZ>5}5>NifmIcmQKzm3)f`-v`F z%@lofxn<2UGc&j9^r$)!_b?X|GgQP<=pgO%;$P)cxUk;y2#}cEo+>Rn zSiu+MdmM-G3BSjEA$4baq`uL7zAM0oaUi_fg_VX?#gxIsr*)(C(m2&5t%SE3`A)Mh zP!YFh3IZ83*ga(6VK?ad?wMr+-+&;l6;zNnD|5y&jd}at6g|tX+h0)o^sQ*MA`@Sh*2W@ zlI4cy*q`9NqJ<7ag;WP+eC8U5t~WYS1~Q1Wc$Juo=v=RwiB1=-`R?r3S8)FDGLa;a zX)?ZpE>jZqpRSfLNRvTTHdPE~3)yZPA(oumI&PB@mJ#rAGqT=i1!y~J4OZn_W3DLi zRPb=}=z7dpM){w;6pr zco0Pr*T!WjJmtaXW4dG)yZ>}?wyN+tj%l8}r@hFBIS2y_bBXti=S&E3$&y>hIE*7p zV*B34+hHpwA3Ug&CVlD!r%rIx|9WxU4|V8(u&anrhDU^p&F4u;zbCHN=>}@i)$y}3 zh*@N?H<(mZtUd-gW-n1j`8-peuhdEMs6nGpFiH8_06&k3+SugWuNkJUqymqwz0KFw zh#NV&N}agYL#N7h_cxha$Z^e`C?T0|>pyxYLzImj<8fu*)f-aXv&&{_m_bmvyef8?0Lyfnm#~1#-@7yD7M4S8wIFq8{Yy zGoTcKZbeIkuCm~Gxb)aHvynNR1p?`o8jc{`MA;m(L zF-$dp>M%ISLO|(>x`DC;fT}^Mi>M)+^?>Y#Fb)u=B03XoQTT`Fik9%V;(u`i-)9m< zGmMbvo7M}i5w2ik1Jexh@-ysJ?~bha7_$z4esIqQ7Of}3A?PZLMi`80Gl9Ind|tV##jr?DI^|uHsz`%A8DuEYXVrOf1Q7X;9X#Z$TNFs_@;<%xHkHD0(444 za(oh*)c6ojLPy6#pjLW&lYcT%+h)b2;f@0plybmK#q3)>uG4J6uw3h~)vHloHdXXo2E1d(VN*)y$ysxs^B(^9-*9`1Is z4y;B>YnP?CO(mIw3+-!6SX+c;%xScCTytD!8c)hedUL&EtZ$SmtW|uU=q~IpleN7{ z71|!ApqRs%tZqlo=(%b*i?8&4=tsBDJ;cC@h0jR^#aJXQWzO4Cm0l{}oU6AiDq*4> z_0i>YHolN`SGE>e(bicBW_>}VYLn zde(Us0%Pt z+|jIa`mw0HSwvw@fnJz@*4O-l<+i@1b)IpVd6Aj5b!|7(=wZW+SB5$_pNCQi!@VrE zJ>Q|?vBtLZP)F}pdCKCf<5~aGJC~lv>&NiNcaNA*T8PIm>CiebJ8()cE@7cDJa{wM zFMdPlh8Q^bE^OW$ah!u}oHlb;%3%%DD_b7^w@fC^#=T#*5Rb=u@kaPYQs%OA6!sM? zJ(c%TWz%GXW+e`$=7&6HE==ynR!eVq$L;hBs;(5zl3I==*_Et$%?-@i%nBQ`4pKX9 zuFoZ#6oKQ;z>k<>T`2OL7(}^_#|vyXA^x#fS<6X-RwL0Zsj)j|*bOOO>a_9`3x01p zs}cV9Io=p*R`KBOKagknl|I2VL$r251tQD_TOv~_hBpx5%gatfM2U>&c7MQ#Bqc+g z3Re$EN;9$~c1AY|9qxkPD7^4ECx+k^B#je~B;qTa$}7(m)2H3W3V`XhipMyhTkw0% zW(<%BEKOR-aLe9-F2_AGY!r89@_-LP?x!9jq5D*YciPR<*)HnI^nCnG4Myw_FZk{! zG7(z_nn+9Uxq;NCE@`K@cZx=Wej@skCBYtXPL=%E`P^&ahc>F}^g{Pw(KZZ;CC$Bf zI#BO&HXLgvDwYkFO6I#dquRqJPHW7a^}~W=p5w!v*%SSZ2P2EzyUp7UK4{X#yR`43 z0&Ym!=h^a)HD%CC6i8kP*yz+B=CYAew!a@aXgIk~W_Lx-NIT*)M!0>KbRO|5ZmEJQ zMl`{X8~0I2)vi#w{MK-Le{263UQf;{yHYw`ZT`}~Ev*_QbTV~ChxvFoa%iKS+-iS~ zec^r>H4_XTh0^qNYSd8DB-@naGQZZn`u&ArH_q}-csz_R2K1I3eEc%FBD)$<*VUMx z>4wYN^2DkSVpqG5gzMWK`0dtd+IY@rC&{RaC+{`wY1`mk5dPlo@vhDo)c81k54|+K zJN+#k7JZg38NC=iVns=1VwI=%H?2x7ZFL9rwtLj8sja;rC!-ao7hJ1XL$J?!9VmFv zgV4$NVsmrfr9cEIK=f#Ryu1qSy}T;lli^f@n8Lr^_#nun-SR6uSYRKa~axL(dir67#P#JTG;|O4e@UZTIA-~vAX{+gbM;IBsM}Z6A%#a*c*M}QWO^b zlO0I$5}7(W+H%p;ySTW}xiHh&*qhKZa&mIgGceIJG0_4~&^owTJL z2pc;X+MC%rn%P(r{4Q7Dz{bgumx$ra;pD3C(xn)%=sU`{K?5f z|GNYK(V@Si_1CvRxcJ`l(Els+eD4|1{O&+|9h6f=x0`r)fQa<2dZ5;O#upMc&z0mJ4mEH+X2->KhU zwh9tZlu-w6djI{z4|zeo?aAi1EB?2uQTDY&sx79!a}pqZn1qgGomE4XX82^6h+Jl( z@G^Fwn)qSbNB)9o=TO6sH2O|kAb{_{M+FD!_%w;f7~GUkDPia(XChyqPs ziWLd?)2lH8B(xc!c0e7u>{U7FN%{8Jr+BeE&DNXPA>1%3PZPyW}77`MGFm$QyL z3~|D;O{I@c(+UYPYzwzbHvDUzS0`;}ohI3CyNLYH@@S?~59QUJ?z?FwtDaY*n7W=9 z#W~((w_&Z>?uVsKYu;_{H>DTizS=y z9hXDYhj>@p};$DtV=e$8g3+tpfF>T!d5&Mc`f=Pzg?ZV7@ zu~|{tm#rvvS$LRbr#bBi`p)K@sxs%9Eo_gcX(hQ{Id|8`gW|K6J-in=AX_iO_m|rx z!x-LVS~Wetci}f3G@9%wI__rQy}qrE-v!?C&Esbn7G$Vc#bdvTeShTnX6JgTnl zd^ER+0i};FoCzb(9`G>`Z`lQhLO{dW*Z-CKNrk4IdypgnZKqAM&tWT?+uHi`>&%L0 z{tcMy>GfU?JNEtEj7B3K0xKjGWe7`IIjx=O0!q=e?#cPR-5ZM$A{;uxMw zreT_ZOcixw^e4~j39+*}ePDVE!Gd!4sb~SiO=)|(U;o93GDv z0pl=Dy)^ep10C`RFbg;rP4g+Q(#AOVaFIn`qu`#6S}q4xZn~tU=sQ^a9NmU#o0fs; zO35L?+VQpo8J@QT%)0M;*&dTcJ&M_!{c`s(Z-!=ScRFVVh>D&*uMgzXr_M`O{a*4myRrCgFCML= zDO&L(+-L0pXf15aqby1vSG?a|?mUscHvCWsc35$m`@O;<%&FNETW)4Gb6hvWfK4#K znyKX3baYO`qB8g=m;M0W#;GFGs0m%++j7g3c#wFbKPgwej zJzy%$F9>#EknvO&-9 zZ?8{{E#H6d-C>PzJnuC1F;P8$Rf@$j8+_1YO5eN=1{y9xAtxkVMV}_$*CqPprDyrR z4^LvZNlG9yz%~GZ?|z+R(2}m&sIFZ{RCc zKaNfNh#Vc(jP#e51Rab;TMQ9!b2m9q9nT*Hv1;$lK0lbHXgePi_RZ`n$*`gqe1NsF zY920<;!){UjB@*?Rg`Hj3DJ$DNh+vOimqUVQiGd>f~L5BjLRa7G?`;RHy~Nlx`icX6%#cb znh$~JT;O)&dJ5RbvX6j`#^ri|J}xL7*jlXclh{~ae+X#WbbOl+lD6+mLkqS(`8L4s{vWv>?f7JE_1u%(kWs8IpUs*I-4 zUi?Z)uon{x)UjVJh%sW2s^(Qy31sr7 zI-YcgJ0+y0=@))RPCb)bMmLkx{4?s-c@l?I6N>gBK{8al%B{wJh4+**6_Js38+;gT)!Di*mm_=;i_ zRt-XF2y~m`XFRn+#3#-j3g+_Z0=e6v5MR}e%-sTk!Z6P!>u(8pa9ReXW9JD99LNSm zfz6?6Y->Htog#ZI8$Xo`{gq?D#8|bzQ0wg~%B-wSlkB133>D9Gi%@+Dk&4I-i^N6q z#x{&(tWe&gQw(zYIT?R_t!V6?U)Ow$eP|Q1PJUqH#)Fr}?htP9BTirMSI12KDBIFB zyoP1`P+{&OB$d^Zl*o4|Gh=(6`hSv}!}B>32Tf|HGeXrFH?qT-3uSS&dV zT0eiTM#!NfC;do8vgdm>+`+I_5$v9pnd9@S?o3Ln%_)&j{!k$Ld_oPa)?^lhhW>>; zJc-HUULt#x4ReT`Kb|L8+(hs=btFoY>cpQUf6o9x!0U)G(K~S05}BXxA{^U9FI0)p zE0!9z=AbBpO!eli4Cn1=K5{|su7rH0pFq_xpf5_Z#EMx2i?KG*CcWn9KG*X`Z#vg-gXU%rWI!# z{e(EhzCtnthF*wBN^a^lW5OZg6v0d`EV@Qz-`zS;iXOYfuxivIetMl&Md}x7SE-PY z&y(c3WNp%^Yl*yfo^uqJ;bS?rVPWMsEW>+(rC%E#RBC^DI;P2yckljGGA)#QnpI#< zzcbAget__ubDBg7Pqd{k?dRv+3?&{hl$^m}1){oW^Z6#w0N$kKD_O6E#4V}FIb5=E z)XY9BRml5S7c{SXB#Cm8gh?+E-h7^8V!hc9sCN89B!v1m8X-kGsbilSB0q+63oQaK ze_mMGA(n0zJJIYs3c3_aF^wzr;K4e1S`^-Lv^K}1k1S;ALT5%jE%a4&w;Vw{9_I79 z$6>1ExVQ}5gAwt1ayn?(Qt3wL9nM|1?oom@1KHwmmsN`ca**cyA_r&?P`I`r%zF<< z6`#EaRx#U?ch46d^d+V3YH8omC$Szc^l-x<<;zdPvc~Ia!usojnKmJtjl7)ck_XbxpU%<$vl+OwB-hlQE^tZ z%dr?rY>`XnW=CXdyCsZ~OS!EZ1ST4{n{V9kKd?Nla94TmNZZi<+|2NuAL&Nm9(mue z4Ga)Fo1|u>D{#c5$OI19E!5<*xWaDyA(W&ZbX@^5Q!bAjqjh2^GdqnP^pOI+2K01K zSyR<&%q4HRn>#gHyL&&8bzn}($~Hj;QTr%{8Prf{Oo``M=xgk_4w&AkbtW8!;AfrY z!=|jTEyt?ohFG|R%P2Aotx#shy|w9%;|XSycrPTq~S61LsNX<0Ml_AOj6j_gdSK^ zY;Iu8poyH#iPpDkAk0L$z8@#4WFLu7#+8XRt};^;2$Z1-MjFzNR!zXuXx}k~zxlF3 zh$6DH%B_V|dM+SU{`D)u=P`zb%BuuEw@2+u)LO^9RrwIDg>dPVpDTw2=%ZJm?^h1n z=WFy^9`=kgzit9E)C7R2!A6t=+4p}$)B=67Fm_-QnSTaQ= zd`N9w1(`&8hbZo7A+Xc)$zbz`iyhLPULW>6{C=8Ce2R&bN~y$tuVznsnXoH!Ke#eE zX~m&6P8C8OZqS&lVP2XIid-2?1P0x`^f05fFRxt6aUCl!*Q&N#EZNa(M;fFSJ8+54 z7*?l*f2Pm5gK{+dLFx{k)BOX+FT5%guWqp1uR?!hcnmTH>Eq(n2@3Bl88+lU3fc+K z;xmM(H-DtR5SCwV$yXjwM$bRFK7xHxa2gQy`aAhU9zX-;6mkM^_5b1vuJDf2f^@A@Vdd~mU_y1PCfEe=m%xmGr5ZdQE zSgyh^c36M60tvbS8T6UO^?ZG@`X%Z6!7{zpLv1r#G`9A;fBIQT;F}}KKd4evqT&vd z_7ASf1&2;V_4@dMDfpj)AT&M!@B=+jknC?dp+^D04^}jR7((#BoBUsYXRtRLam}xW z5ZC$>RYyp_+CFRxe;6`~=$ZAXPOS0lS_;PBtH(I;Pbpx2jl}2u_&%P1?$3{8l8h@H z3hVs-`dEGfE*A19HhuyQ5TdwtJz-?&;$+nnK+`unDE@^$vOfKA!O<_BRNFb4JZXme z2RCsA2;AV@|K=&4|G`uI^IGB6S^o5K9}XDPtS(Mbn7=davjORqU>fW{WdP03Eg4(K z&HpEj1Ej5mFyQ~h5~xC6*~B(l;ZM3X3P?8*MnL{)ch>I+GIRU~PRg}HyZI%A_|fZn zg1+NgG3!0x6S!mS$Grk1`ZUZxlS_a=UO1N*&1vSdD(}N~0(E7>bPz=jPt6Zn@WuWFvcPmAaUPlJ4DF;R4;_-cX=jqBai{)Jqg0p;nAl@F-)a4{%5LV2Pk!X z;AkVcl1Jw*3y=!t5eA_H6&pH!Km!6Gs7Cj@w;>?SWB30Mp7rbhnegO;cP=h~zXCFQ zod4|^fHBrkF96=L0Z2)v!`MOwR7_(x78w8YIryG;yaZXA_v68fmdH)paqCk%@C=T{ zK|lSMbh9FWbhOVu1CiK0)l2}6PZ`J&O^PkDzKotPH*;^#SL48GB|3X1n70J$0Ejm& zE6)AM4}($PcaUiG<;L76SL6J;mbJah*k%QB80toG8P=@_0MGe>Y99Wa2yqIWk$W+9 zm*rGHw;kGzzTB<(9F`UfY9Y!2{p7t{&i7$J=Y9q_SPbv&Jiw}q{oY|v%-+?}bh{lC zrjUhWqrBWHc3@=OeaOUPw^XRr35TygeCP!o!xgI8&x>Hfc)P%VvwJ#e`YnZr>DrE2 z0fYeP|4|?&TanDN^!WVgi1^S9FDkG^pOgU}QT5X(L1s2XY--%D|08*QFW#!_Rur^N zAJ*HQ3D^XRMUiOg1)vCZy>4bOzJd_P%m}YHE?GZ~zdesDh<&^PpvL!y-3)$UE&)W3 zo!zqIe8pugiu<%#y%Sym?GMknj@Y=HH$?Q6e1xg7f8I{U&*uUthKibgkOX-ai^Z>} zpX_U%4!!8Akvx|J0B3=-*Dy}{j0b2^1hX@bXgn}K!a(1ThSYT5pD#Dtr{wroWCy_) z2z~=g=2`$C?G8~qQxpG4t^zbCEL}4JQqMwRZZXt=mfKDe&6SF#RpH5cSHL@z`VppK zK(8Gs&N~7qFPd%9bcjiDFVi79H18e<3;vz_oX^Xg&k4{$119*1C15U{?e77|C}Vil zb5TIyLn<2}Q^|QHX?D_-yvJ#u1K)UIDm?P-zEz^-{6Z;0mE);x`c!aL6%EG#~7GGbI)VkXP!XyKrP&-0q)Ep&jUwmQ?xDH@kXm|dmjr1zA@rE zISwbS2ebqDk!TnQuMIGQJGzO9HWUs=l}&sXJ*XBHwU8@D2%OXD)!$|{;Dek7CNJ86 zLHayw`kR!R=0}A~OkX>KIh+6HV&IT)=QP<0C9?Pt-U0Azw&f+M(D%pn_$UcQ%sdtoLt7i?4Pcqz-wBhAh&PfPL+Z$<0juvTZ?%;Czy(VC zeXs=j5Md=1|4H329q;V7stsiT+5iiI5o2|cpc|kzvoIN|!^T6D#lj45wV#O!&=c}r zrh61^%~TY5eP+`M-WE)9?0BcSsXlPn=AuO@K~Q4bP^t7AnD@q2M2e6ZUi|<^tO+Bn z<-#h(vk2W`+5~_d5y_s#98B>e@P@)ACDvZ@JUJ-aru83Y5Tm~C`mKE3wE|l zh;-E^AN@*EW-=?S3sx2=*NuEMeRNT9j!2_wlE;RS`5^lGg#l^_<6`oJt=7**Tay+? z=x-zm?_yD#@G`h|K0#zY!Lu*dY;dZShS1S3A&C?+qDY||QU+#P@7$Y-pC=Ih0IoLM z$W7MNXtEG}IaX%&_7+jugffkHW4h~r1)|z(FO$p<>}?gae$Y?;g@GI|Pj}@1E3{GO z!ja4R@2Jh*VYAAZYR}f!0fzn3w@qE07N;D~On?&2VNu46j9tV>;MI|6Mm9P%FMP?c zyE}xW6Yby_)HN`MtZZ~ z2%z?YRPKYE3uJ+E%BWO8iul!*JUu1g#u9F;q$ z9bE%}|B%T>ysO!-<2pNkM3uHcSce=c&UX~yNt7^&boHKfrg&n9$RZVMYlgs4(YQNW-rtX+Y z`>)7GQdaaU9p;Hj9l>CWtjwlOj*x(4fM&uyB{ltqLWPlB^H5p;>vdT9Udd$iVYsgD}O!czetUsWD6Q0R-#fgQ@vy%pA;AqDia+-PJxN| z?~6Y=w;zSpQdtf53$o!%I$?!e-EyKE!l7v>n?#$y-OD%tZQ27+-b;Tji#t?U?=Bj) zL>SR3D}BmH-_|k^dT4NO7VkZ_HET>C82Ge7o*kMrL>)&}fts9LP@F<6% zQ@$D|tZ*CS|Hy36vI1CyUoE<+$!oQ+f;xkIoibF!6|9`|)hO#ja(eI^Tjcp3;ejdGPkw+Iu zaFxAf8syMs4lEWA>2J|Td~a1mflZQpDT8`U6QU{|5blwyek8Mf{I0Mo42kVJk|8fu>I0WC`PWi&Q1ZlV#^x1sDQP1rDy zdS^<9<12_Ork>*T^LnpWO4Yp3=bg>Ld5z@b_OMY3jHcWd^0{Jvg>Cc}{^p*Z8F&rz zow{lHrLxHM-TYzCA>#~Kxwyv$n~$vdZZUlli9%4o4hjEN9Of?G{dtNwn&T%=k+PM- zOfYc~^tZBX`HBr1_UQr+%E3;Su=T0R#)8WTIm{hdBE84|J(Dr(O*cv3XyYK3Q$S0R zY9y|Fpy@VJFTs`JEx%rKZM{LjMjid?!nC=J8CMgSDVWX6dQ5-YQ;v#&keanEB2lvh zcFc*bWKBWPTU>cAizYJvr7QpOjCcK{n1ai1-4`4|Z>)T<+VGERv5T~cJcPfgK zmZemel(BlQ8pFlqs{xv%dza{BpEd&QkloOpCDI!#akz}6afBssA+>EByN85D{c#Jk zw`T=ml>r{MJe#n*Z`g@RCviPE|GgA$TaNt@C8oAx+$y#+#aux)$l;BIO*9%SWs(S? z&hDpj3?=uFZxpe!MDg6u=iOF#+l#ip3=)*-SeJprUpbRGu%wIntQlGD-8VU>3QXDy zD_8b+gnrX7i12uK?&BJ8axyUyk*WA|Df1 zE}Qn}lOZTP$?@OLeiU?_UI<%S4MlJ0F(7H)mcoH!4N%)8LZ)0M3RMZe>RDq z#rYxuW1CJetTk2O3$0oEL4_Vg|KgBMHGy!Fmb06v2|kXZOo}u()>pi@+_Z4!mu&@= zN$TwUdtJe9f}w_2KlnK*Yh*v`K=j z#zf;_`TIv34g>6_|3opi;^k7Zvh`#9Z=Uq>wu_3t zh&>PLJ_~{J=|(&kxKTd?J29jghkHa)H@XO;rWEZrAPhs^#=j5@o;qFV zMkvi11JhG?I<^k-HD0n3U2SJ%ts{OF_H3eMK416eyy~cCVby=cu~=^6zQuTxl;bO- zLC+r!v4ICD><#bmEzrO4zU#ts@{ApG!nJk8e@K07vCcd)A7G*vgULjUr%n8JeH zmtIFG8Hbw>GfYVQflCCxJRkt>v3mD`_aA-%X7!sM&@zbrBj-=Vfb>hMXw07g{@362 zwiQz@M0H_e|7i{YI1Hm$XCY9f<#EfqaJ-nac?}f|L{4Njw4}O>buldXp#UbGO;CkH8*L6QAm+u4)0=suF#Q08f&cFzOaaD!hhPATarOtoB&OW~UL4;afVS;hkNHg)awT%q zi`s(X5C9vKVus&19L+48nx4Q#okrsnAAo9lF*HXi<3zE|;zTf70Bi&F5|-y{(SV%9 zI&kRK@Vw}Kas2$P9B*zJXmfG4J5|rkIdCz(29U2uIZfWXhm)o?AXv2kbr=SNrHQ5X z(2d<_zn+vr6@d?X^{CdT=Dq%l!-$lx4#WM;VKTj}6LJ7b@H@Hy3L0;#%j5oPjB z!A$`EWB^`|ek_yB)h#66Ycq)ZuD?KxO2pq7hJ5mWhhZQQy#RQST)0F2W5Cc0u(kcR z)4-WBnf}VPsA>sLlVMSrGqGMW*Z^=H^`s6?9!2K$+S~KMmI7G!8K6!;zV$<>aeCVi z$0z_7C~njhH9rAU$zon>W$339z`^ywZ96VS{R`H1!w^+D&;5Epehi;GwUrPV(g!N& zdB(;~U=iEgbiO_w0bZOlo~w~=+MU&l+Vf;9``?@q0~n7j`3VNdkIqPXQgZ<8dxxnN zD>*Alxqsl7t*YZjI@~^^qG`tMdamc!LsLIO>)q{=e#cd=lAH`Q(s6oB?Oi^e3UcCc|({kFrmcyuVA{E~Zaz@Eq zy+kdht3pv&i{JT12>x%E9{FcVH(>r`lmZIh-w-w`UP;|Ej{@-tT708!3xEvS#KE6c zwOQ32B(#^7b+0-X&CAsx@d7JrBEooqqaGZ#MF31i2*B0^+6|DoBnkSyN{}Vm)x@du zkHL4=ip4*ipddLEGbjw8st&gyMQWiO=S8zy^yoyIlS|4=wZdSA3PDwNcSRKRK|Aul8BFcm z9|Cg)*!Hjh3&O5E+6=Qr5k2VVpT!%YPKP(HiuX{-<;)We9nAa(NKfv4i5eRqlu{x_ zvH8E6{>Csgt9_rKJ~jYLps>`jfP@7(0vB){9(NxU=UB&h(52}B5XQ~;KOjs+2;gyC zGy_Z9_GG4nTUoTIjxt;B0Cp{_LyWFZ9-H9?6n%kE%jQh?eb|wzwI&^ zb`|*es@=0s715LJMeqvB*aWr8jLCun2P)Ay!4UjdV4lE+;$eRq)jRoM*}M^)d3xCG zZ~~J-IL361QlJ{ZoH!B2oH zE2?-bW5D+6V`W&Uak$H(8F@sEllA;pR3|NJ8IsKld7}^4(>@pUKEG`sCt>_ZhGN6l_J^mpG+Y6=Df_nu`gZt{)z<=ssj94%N{_R9FBW*2Tb84jq z72y+lc!7ijZ`SYk8s)C+qlqWPFLOy^GC+0c9WNC8Qpza|Fnx9eZV9h))H2aNk%8_K zPy*f$46q7_{%J|6Fbs@tu|gWzs>CFTjl`2(qk%p-dI$A~uyGO_*YVRLuPh^ZY;Qpi zGjh7t{k(P)iBOD-jj9D<5&irUnpq0&MH7;{RSz3u47iV9Km&U?=CxeuE>t4CcJVam z8=~?i4MPjV|F+J!D_=DoRkdBJH31y`OUiN%aB=Y5~^`JB&t{v6C7_ibkG`Ci}ax=Z*HxP(d)t+$K% z&XUf>I7E|N6p)F%(~N2 z>f^NcUE72*!tZ&iVYA}xJzPnG#U7DrTKKZ}_;%efd*mB8OPYIAq(MU-8?Dnvhjez) z*OTvg3Ss(Um+3d`vx#4!zWZ7`qZ6FEI$U=n4D)v!6V0QOI8K|?U}U%{E8X4D z5%Sq-9TkHee>=$Q$je6_oY5?MIj?8;EYs*AID8Q21ix&=oOn)sZ<%(Ne@{H>3EwF| z*u(ybLeoxAXgHt#TZP7MuGI=oo@G5b0#-X2QS<`*)M-IDnw7dEJQrT&Ga-kQUkRJ^ zEWH)-m6@;-&e%QsnT0p)P^B$Y*1f3uaBO&bnEZkDvfKJQbZPftyIUG3oKpjN^n%w; zmy5OL-*r#18u?oC$MvrYLU4&Vmz}elm96JC%olRkdu0sc0vX`j`G>B`EGrnjY*bT< zW<>AHGiPb;%$D{b6cTCZ{jXdAmneh8W(PP4Ym!3+-i&r~$F2O9Z%wRw)3QwatYBU^ zT$kel_7IEVRg9C;ccz6GGxd`GX!e=cE?cX3BhJZXqLty7 zyacrgz>RmW7hPcVh0P)AgBnWNtA~5+fj(o*Dvj4n-1daJN+`k>h8}nghtDdp2^nCB z-T>t=h*#hxd|?FZ~9cr|h|^A*Ruj zHsX`IE_B_#PoDlGbB4y@ADA8glr`cg7yC6A-kbzCfw0rr_24GBB05v3H$<0!{Q?Sn{CNNKqxLs}Q?L!Ra-tW&R`2DH&&9Osk94L727qWK0o{6#P;g z+v(m4Y~?c%8G5|83OTqqTfS+9wrAYo0J!G8)puNTr0Z8)^MLM$Hv{zHCe?sT#;%+V?Js@#cL#*KuwO3bsS(m5C z%Q8S^6r&0U%KE~n*%R(YS*NjaIUe`V*l``y5`DpZ-nbAlj_TkyF-G{my5qH;f|3{T z^C<=2j={=5RO;l9XOEl{;S&GGRj!kgXoo)7@N4RLNQ_zu-^UM}gf`~UjVGx6$7Q^r zg@GV>j((Rb25bl|3zZMmkH-+;R+RBFq5prL&O-G1!}&&o{KCfb10vF4y*~&22#Pla zZMVo11C}dxb>{-!_C$5ocnrUXe3xFhX&p(4c8zwlYN4>2L3r0sIK!!$nfiXQHTt;5 zPl7{9IKWIs=>7q!6A=WW0~o4(HD}=W-^ajhAG7-ls7~$EAox<~^a>0cOR5Q9al)Mgf2# zJL!|7$Gz~APw^5jXBC!!z5s|JR!({G<$$=byVqyQsX~rj-(Bf)0@?zgHHQg9f3d2i z^Q8agxr2M4fpMD`SJ=0ISQ;tfu1gk^zi8espnwfNwHQB}WE;t#C)eg(Tv0cPX(%Dg zm%u<72V>93Q?QK%q191dRsbOGt6EYL3=FXHUIjJ);22?qf``R6++cy(>)93H+@#us zuxi&~u55!Lfe$OT`1y86gpO?wTKB~f8Zdp$_#`$Ta53q$+Qv97x%burS$dCD{ULeFIpMVGXQfwf%Uu@`A z`&n?_9gFa-m&ll1$i$>FeayutoPbxn4GN3d(X)IJ)m^+{FFl8JLF+}Du5UO~z>j)< z&RZNDc0gnC3*#u44`4J0W&zXG-(*o6AoDWc52Jcf)&R$aW`}??VN}sM`~6H9l_p+% zREi1kxN+iAhNXPM2SDkz0M+lsseJC@s{ptSNC!TISHJfwFTioW%1wt4!D+L7&uiW| z=32u|ui^EfVGg1rGj7-7E4;_y{n7(!xs+9N`;$ZJ%Ju7lwBnTx&YuPd!48<;Edz+d z6-R;Nasu^6we5!BEi&pxkXj{;YuJJdS*=`a$3=Ahip~6Oq1_ z3K1B@UVgSU0=?WMrD&*PB-;a?=k=Y~(8X4T56jP`@@02Dj0sFm z0Nt7NhaE7jiW4jz?3t9c)`!XS=$;6K1OJ z#4NtwAoNwgDl>%W2_7||KMNEE|EW-+Q8QcW#%>ODp7ePDY}hClqt8wEHt#HyBs?R4 z&}V1ZnQ(>k^CU~dTi`sBQL(%+SIjX>S7zQLV|RUHVsM=96YxBii&!=PRq_P9ww+(2 zCv&%ds?AUbk-qkI`?R3Q=~gD1OGqDjHuwiQoUIDKBid(=k>MBrZ;$> zo_DJm5j%LK-DIq@g9~t4vWS{C66R%q-?*(SDL4ga8SI1@dgR8sN?!wNckA*}j9oxe z#|-$Ch;>!~oDau;zhOY_uzB>;nsfb~{YsglWJ8(}g)U*@wcNOEt-Sc;u@bF}hPrg7 z7psjV;+&FgVV9HEXyHG78N+I=lA`<+=jN5iwqngSr^9s!$11)5zSTunn26F!~{s@~n4kW=mq95kemke_ADS3!3Y@#+Z@ydu0| zf(7di5WVhKpmOb;5)m;^AkslLOpT4taIuAFBTt=QnOB_Hmh?>53v1L^hIEZE~& zGOji9IXqF9G~jXY+xj@Fp|vsFsL(BQ73K1t{~KVFpc?eIz=l$5CY``*(hzt4C$9ma z;VRZgk&%^5=}64sU5`a&7#w_nRh&R_C8tdb996PAUd!UPhyvh#`UBX+`(cM`hodhQ zJfKX&O$z2*@}Z0kYyDdknImy$ zbfCuTtz-AKvI>;L$e*p{KGY64m=o;)IV44{6}UA~M|(j)F5kpLyZRoBGQ{2komZ+u zS>P%wq%ISHN$v%Wlc4XTYvBHYi~P3+KQX+3pYnJHJNixuu2y~Lh&NskLdg!ZuRLSk zo*eTMV7_>BDbFNQTKee=&!!qWEX6mHuQ|31$Y8ajcoHD{&WyodIWwex<;+l-oQ&1!^Oq(*9f>Okv2bhAKsDY5J8@L`^mCkaO;b zw5vi6*x{AX+EqVJpOmplmWwhbK~_4yf0!a271HPLqX?}>UID{$pxWxx6@!X3lS_}u zUyRVfqi`eeid~~i4WWWXqVlZ47bQ|wV#C+F6b(5ojD+RKV`eTEgb>&RcV1hW)^6NL z!Y5&qDxsJ9Lv9K9fY03&aG_il3v=ctXY{+ER;b+gx~x?4{>N;6IVUB#nRG?IyJs?WU@~0V>$)K>749mWVRGbXQ4*(w z_)S45T7Rqi+Nw!0?obg3Rh_gjm?CJ4fw|RH>h(JHPq?)@MXso&4hDo6mPj)s@bsoh zzs!WIp{!%279^3)gcPZ}`s_q3(r@Oi*f7IqO1?q}m6ud63a)(8FDTbdUATC`oLxW@ z>NJMx@GL2|=2SkXr>$UgwlB~<&jvQ36CULgx#{eIK_1dl7kZnkzPqgcy?OE?G*6Rn zI}o2;Ya5CX0sOvHF?~T}$CKIXj9!pxo$2r7xUn;;F1&ZAZ=5&4FPl}mua&kyZHL>G z`NEK{tZwO0GOoRg7CW9 ztcfXdt&9v(`Aels3BkfqR+JtKcJ*UOqLf~;Oxh;~qo>oP_T*m;##_vvZ?jZTER9v( zhK}2}?+V_>EgH7{Sv~zrY_lrfa^O>=9-CSW{Re^dtpZIBk04*2q8Hi4)S5bU&c;ev zW{=F>3$;9uvHn_giYmi`-jOZ|cz90}w$L%21iRguU2MShm`=(gJhVQ8CpP*XrcB*X zQfH3a;xSEU8joAkaxE8$kp17-HPu1?U9K^${8g?I>zaY(eGTbM&pCdb)$*h69U4~J zWK~}$_Kt$`err9$FCthqZaLuBB+2)mzf^`P@~&)nKFFbbN<}ABM4~qDOKIb zAtEXwftCw=PSeb{N#98^yx9Q76K}8SVdilVxOVq)_wzuRBgH~Pn>d?o*qBGfLrU2s zpLhEh++>f0hMnVM3`g}Ce>|L;u&(;%F%=Y5TIxikru+1roM*l4= zE~1T$j7G3!k&dvKA`s2+DC?fovXy`RxFbCh_Nh_cp(;o}vnhdcXgcE1I}KCVri^sd zLw{nTOD*8qQ?)PJ=v)3K+D!fwZA`_R{}5_%czEr8NJZ*=8O+X)f%dNNn9XhTz|mcR z3LV}$h0%SipQZ^0cZ-nse%F!m&9#A@A@`>|crS5P=q|4Z``bq4D=JE&gzO2PNVow< zDJ$Uy9B4C%i5V2h`I}9l#d4~D1Rd{zQjLPI-r+K6-Bkc@7*0I53Sa*gK55nR;wDB9 zmCSWjCo!TAzz1o%U&%-gQ@?07e)VeMy_~8$v%Nd8`u`XB=B*c-MX|XWRFX;Vp8E$( ze_o+w99RbE`3vte9K@4f8O~yaU>EfHNfGY$>`q#>h8d^$6wi`=xu$e(5{)%meK zE#CFq$Q6i%lk~}99`>7l&+Y2^5Ed(IO*29l=QWg~2Ja1kfXhtC$~1$W`EZ$|b=*gj zxy}&kUc6?79`%vxqz4FpnfY8Mx3CI`Q9S4e=}U?W9=LZjVsz_M>6H~nbqv5l_^(k; z8W^aoGv8F_Wokao>ouV!-SQ*!Pp|;A)7s?b_`Tc6cPN;_(@`W`+!)hd&#^(L$})Mh za8~U$9sYI@X0Q{gV!VKl665Re(@2m!NFN+@L!J9a|5Q*nA7YCNDbaY1Qbepce&Z6m zqTKr0Yc+Ed0)H^w2)ndT4BkrtcEL%e7;^YK;BaID?7}35vSA;S&=Br(V$*6{zyH_- zcsR~XMbZ0z{vUq&V~VY-Uk4+gu#vr+dPU|xVj~h_H;v!jn~0n9 zBE|96Ke{Gv+V=;D-)WpD4+-b_(MScFfE&3uljeaD?c0x7D1nDWO*&xP_2UHm_WRwh Yd{h}|QD^*p!o82QV0s$mY8P()7s=IPrT_o{ diff --git a/images/docs/ruby/knapsack/without_knapsack.png b/images/docs/ruby/knapsack/without_knapsack.png deleted file mode 100644 index 5ad80adc75a5bde3e8a2a1969674c5b9381e505e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25010 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