Skip to content
Open

RoF #325

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
1435031
feat: rof
3v0k4 Jul 29, 2025
edc8efd
feat: lost batch
3v0k4 Aug 12, 2025
ae8b279
chore: simplify test_queue_id
3v0k4 Aug 13, 2025
e87e7b7
feat(rof): retry command
3v0k4 Aug 26, 2025
3a7ca58
feat: add missing frozen_string_literal
3v0k4 Aug 27, 2025
adef916
bk
3v0k4 Nov 24, 2025
4e065b9
feat(rof): rake task to initialize queue
3v0k4 Jan 8, 2026
e921fb8
feat(rof): fall back to triplet when no id
3v0k4 Jan 9, 2026
004dcb4
test(rails-app): update gems with c extensions to fix build issues
3v0k4 Jan 12, 2026
7af98ea
chore: remove confusing logs
3v0k4 Jan 14, 2026
302ce30
refactor: better naming
3v0k4 Jan 12, 2026
9e9f618
perf: avoid double init
3v0k4 Jan 20, 2026
2837c7e
chore: update bin scripts
3v0k4 Jan 14, 2026
4ee1ffc
chore: paths -> test_paths
3v0k4 Jan 14, 2026
bd4969b
feat: tweak retry command
3v0k4 Jan 20, 2026
774d635
chore: remove unused code
3v0k4 Jan 20, 2026
280963a
chore: remove code comment
3v0k4 Jan 20, 2026
111a97f
test: remove noise from logs
3v0k4 Jan 20, 2026
79d74d4
fix: do not oblige users to pass a string as args
3v0k4 Jan 20, 2026
e3c6794
feat: support encrypted branch in retry command
3v0k4 Jan 20, 2026
cbf2e42
fix: avoid name collisions
3v0k4 Jan 20, 2026
d6488bc
fix: rspec queue command
3v0k4 Jan 20, 2026
4cffbf9
feat: send fixed queue split in v2
3v0k4 Jan 21, 2026
29c6937
refactor: simplify params
3v0k4 Jan 21, 2026
6890ca9
chore: retry only rspec for now
3v0k4 Jan 21, 2026
9ab2846
fix: commands expect string (keep compat)
3v0k4 Jan 21, 2026
07a0acf
test: remove unneeded ENV
3v0k4 Jan 23, 2026
e02621f
feat: log a message when no tests were executed in queue mode
3v0k4 Jan 23, 2026
d63d782
initv2
3v0k4 Feb 9, 2026
fd637e6
empty
3v0k4 Feb 10, 2026
aa9f740
chore: remove unneeded code
3v0k4 Feb 10, 2026
e2a22a5
refactor: simplify
3v0k4 Feb 10, 2026
1f818e8
perf: compact id paths into file paths if all examples failed
3v0k4 Feb 11, 2026
8de7982
test: clean up output
3v0k4 Feb 12, 2026
ed615f0
chore: update changelog
3v0k4 Feb 13, 2026
2fcf023
v2
3v0k4 Apr 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 42 additions & 43 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,20 @@ commands:
type: string
ruby:
type: string
rspec:
rspec-rails:
type: string
default: "latest"
steps:
- run:
working_directory: << parameters.path >>
command: |
if [[ "<< parameters.rspec >>" != "latest" ]]; then
sed -i 's/.*gem.*rspec-core.*/gem "rspec-core", "<< parameters.rspec >>"/g' ./Gemfile
echo "Updated RSpec version in Gemfile"
if [[ "<< parameters.rspec-rails >>" != "latest" ]]; then
sed -i 's/.*gem.*rspec-rails.$/gem "rspec-rails", "<< parameters.rspec-rails >>"/g' ./Gemfile
echo "Updated rspec-rails version in Gemfile"
fi
- restore_cache:
keys:
- v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>
- v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-rspec-rails-<< parameters.rspec-rails >>
- v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-
- v1-bundler-rails-{{ checksum "Gemfile.lock" }}-
- v1-bundler-rails-
Expand All @@ -48,7 +48,7 @@ commands:
- save_cache:
paths:
- << parameters.path >>/vendor/bundle
key: v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>
key: v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-rspec-rails-<< parameters.rspec-rails >>

jobs:
unit:
Expand Down Expand Up @@ -81,7 +81,7 @@ jobs:
- run:
command: |
if [[ "<< parameters.rspec >>" != "latest" ]]; then
sed -i 's/.*gem.*rspec-core.*/gem "rspec-core", "<< parameters.rspec >>"/g' ./Gemfile
sed -i 's/.*gem.*rspec.$/gem "rspec", "<< parameters.rspec >>"/g' ./Gemfile
echo "Updated RSpec version in Gemfile"
fi
- restore_cache:
Expand All @@ -102,8 +102,8 @@ jobs:
command: |
ruby --version
bundle exec rspec --version
RSPEC=$(bundle exec rspec --version | grep rspec-core | head -n1 | cut -d " " -f5)
[ "<< parameters.rspec >>" != "latest" ] && [ $RSPEC != << parameters.rspec >> ] && exit 1 || echo "Correct version of RSpec installed: << parameters.rspec >>"
RSPEC=$(bundle exec rspec --version | grep -i rspec | head -n1 | cut -d " " -f2)
[ "<< parameters.rspec >>" != "latest" ] && [ "$RSPEC" != "<< parameters.rspec >>" ] && exit 1 || echo "Correct version of RSpec installed: << parameters.rspec >>"
- run: bundle exec rspec spec/integration/runners/queue/rspec_runner_spec.rb

e2e-regular-rspec:
Expand All @@ -113,7 +113,7 @@ jobs:
parameters:
ruby:
type: string
rspec:
rspec-rails:
type: string
docker:
- image: cimg/ruby:<< parameters.ruby >>-browsers
Expand All @@ -135,15 +135,15 @@ jobs:
- setup_rails_app_with_knapsack_pro:
path: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
ruby: << parameters.ruby >>
rspec: << parameters.rspec >>
rspec-rails: << parameters.rspec-rails >>
- run: dockerize -wait tcp://localhost:5432 -timeout 1m
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
ruby --version
bundle exec rspec --version
RSPEC=$(bundle exec rspec --version | grep rspec-core | head -n1 | cut -d " " -f5)
[ "<< parameters.rspec >>" != "latest" ] && [ $RSPEC != << parameters.rspec >> ] && exit 1 || echo "Correct version of RSpec installed: << parameters.rspec >>"
VERSION=$(bundle exec rspec --version | grep -i rspec-rails | head -n1 | cut -d " " -f5)
[ "<< parameters.rspec-rails >>" != "latest" ] && [ "$VERSION" != "<< parameters.rspec-rails >>" ] && exit 1 || echo "Correct version of rspec-rails installed: << parameters.rspec-rails >>"
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: bin/rails db:setup
Expand Down Expand Up @@ -199,7 +199,7 @@ jobs:
parameters:
ruby:
type: string
rspec:
rspec-rails:
type: string
parallelism: 2
working_directory: ~/knapsack_pro-ruby
Expand All @@ -213,6 +213,7 @@ jobs:
RACK_ENV: test
KNAPSACK_PRO_ENDPOINT: https://api-staging.knapsackpro.com
KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: $KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC
KNAPSACK_PRO_LOG_LEVEL: debug
EXTRA_TEST_FILES_DELAY: 10
- image: cimg/postgres:14.7
environment:
Expand All @@ -224,59 +225,55 @@ jobs:
- setup_rails_app_with_knapsack_pro:
path: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
ruby: << parameters.ruby >>
rspec: << parameters.rspec >>
rspec-rails: << parameters.rspec-rails >>
- run: dockerize -wait tcp://localhost:5432 -timeout 1m
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
ruby --version
bundle exec rspec --version
RSPEC=$(bundle exec rspec --version | grep rspec-core | head -n1 | cut -d " " -f5)
[ "<< parameters.rspec >>" != "latest" ] && [ $RSPEC != << parameters.rspec >> ] && exit 1 || echo "Correct version of RSpec installed: << parameters.rspec >>"
VERSION=$(bundle exec rspec --version | grep -i rspec-rails | head -n1 | cut -d " " -f5)
[ "<< parameters.rspec-rails >>" != "latest" ] && [ "$VERSION" != "<< parameters.rspec-rails >>" ] && exit 1 || echo "Correct version of rspec-rails installed: << parameters.rspec-rails >>"
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: bin/rails db:setup
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue"
export KNAPSACK_PRO_TEST_QUEUE_ID="<< pipeline.number >>:$CIRCLE_JOB--queue"
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--<< pipeline.number >>:$CIRCLE_JOB--queue"
bundle exec rake knapsack_pro:queue:rspec
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
# run 0 tests as queue is consumed ||
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue"
export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=false
bundle exec rake knapsack_pro:queue:rspec
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
# retry the same split ||
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue"
export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
# run 0 tests because nothing failed in the previous step ||
export KNAPSACK_PRO_TEST_QUEUE_ID="<< pipeline.number >>:$CIRCLE_JOB--queue"
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--<< pipeline.number >>:$CIRCLE_JOB--queue"
bundle exec rake knapsack_pro:queue:rspec
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
# fallback ||
export KNAPSACK_PRO_TEST_QUEUE_ID="<< pipeline.number >>:$CIRCLE_JOB--queue--fallback"
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--<< pipeline.number >>:$CIRCLE_JOB--queue--fallback"
export KNAPSACK_PRO_ENDPOINT=https://api-fake.knapsackpro.com
export KNAPSACK_PRO_MAX_REQUEST_RETRIES=1
bundle exec rake knapsack_pro:queue:rspec
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
# split by test examples above the slow test file threshold ||
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--split-above-slow-test-file-threshold"
export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
export KNAPSACK_PRO_TEST_QUEUE_ID="<< pipeline.number >>:$CIRCLE_JOB--queue--split-above-slow-test-file-threshold"
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--<< pipeline.number >>:$CIRCLE_JOB--queue--split-above-slow-test-file-threshold"
export KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
export KNAPSACK_PRO_SLOW_TEST_FILE_THRESHOLD=1
bundle exec rake knapsack_pro:queue:rspec
- run:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
# split by test examples AND a single CI node ||
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--split--single-node--$CIRCLE_NODE_INDEX"
export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
export KNAPSACK_PRO_TEST_QUEUE_ID="<< pipeline.number >>:$CIRCLE_JOB--queue--split--single-node"
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--<< pipeline.number >>:$CIRCLE_JOB--queue--split--single-node"
export KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
export KNAPSACK_PRO_CI_NODE_TOTAL=1
export KNAPSACK_PRO_CI_NODE_INDEX=0
Expand All @@ -285,7 +282,8 @@ jobs:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
# split custom files by test examples AND the --tag option passed ||
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--split-custom-files--tag-option"
export KNAPSACK_PRO_TEST_QUEUE_ID="<< pipeline.number >>:$CIRCLE_JOB--queue--split-custom-files--tag-option"
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--<< pipeline.number >>:$CIRCLE_JOB--queue--split-custom-files--tag-option"
export KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
export KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN="spec/bar_spec.rb"
export SKIP_ME_OR_I_WILL_FAIL=true
Expand All @@ -296,8 +294,8 @@ jobs:
# turnip ||
mv .rspec .rspec.off
cp .rspec.turnip .rspec
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--turnip"
export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
export KNAPSACK_PRO_TEST_QUEUE_ID="<< pipeline.number >>:$CIRCLE_JOB--queue--turnip"
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--<< pipeline.number >>:$CIRCLE_JOB--queue--turnip"
export KNAPSACK_PRO_TEST_DIR=turnip
export KNAPSACK_PRO_TEST_FILE_PATTERN="turnip/**/*.feature"
export KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN="turnip/acceptance/foo.feature"
Expand All @@ -312,8 +310,8 @@ jobs:
# turnip retry ||
mv .rspec .rspec.off
cp .rspec.turnip .rspec
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--turnip"
export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
export KNAPSACK_PRO_TEST_QUEUE_ID="<< pipeline.number >>:$CIRCLE_JOB--queue--turnip"
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--<< pipeline.number >>:$CIRCLE_JOB--queue--turnip"
export KNAPSACK_PRO_TEST_DIR=turnip
export KNAPSACK_PRO_TEST_FILE_PATTERN="turnip/**/*.feature"
export KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN="turnip/acceptance/foo.feature"
Expand All @@ -326,7 +324,8 @@ jobs:
working_directory: ~/knapsack_pro-ruby/rails-app-with-knapsack_pro
command: |
# separate queue initialization
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue-init"
export KNAPSACK_PRO_TEST_QUEUE_ID="<< pipeline.number >>:$CIRCLE_JOB--queue--init"
export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--<< pipeline.number >>:$CIRCLE_JOB--queue--init"
bundle exec rake knapsack_pro:queue:rspec:initialize
bundle exec rake knapsack_pro:queue:rspec

Expand Down Expand Up @@ -434,19 +433,19 @@ workflows:
matrix:
parameters:
ruby: ["3.3", "3.4", "4.0"]
rspec: ["3.12.3", "latest"]
rspec: ["3.12", "latest"]
- e2e-regular-rspec:
name: e2e-regular__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec >>
name: e2e-regular__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec-rails >>
matrix:
parameters:
ruby: ["3.3", "3.4", "4.0"]
rspec: ["3.12.3", "latest"]
rspec-rails: ["6.1.1", "latest"] # 6.1.1 uses rspec 3.12
- e2e-queue-rspec:
name: e2e-queue__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec >>
name: e2e-queue__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec-rails >>
matrix:
parameters:
ruby: ["3.3", "3.4", "4.0"]
rspec: ["3.12.3", "latest"]
rspec-rails: ["6.1.1", "latest"] # 6.1.1 uses rspec 3.12
- e2e-regular-minitest:
name: e2e-regular__ruby-<< matrix.ruby >>__minitest
matrix:
Expand Down
2 changes: 1 addition & 1 deletion .rspec
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
--color
#--warnings
--require spec_helper
--format documentation
--format progress
#--profile
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

### Unreleased

* (Major) RSpec & Queue Mode: When you retry one (or all the) nodes, Knapsack Pro only executes the tests that failed last time on that node. See [Retry only Failures](https://docs.knapsackpro.com/ruby/retry-only-failures/).

### 9.2.3

* (patch) Fix 5-second timeout when unshallowing git repo (https://github.com/KnapsackPro/knapsack_pro-ruby/pull/328)
Expand Down
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ group :test do
gem 'simplecov', require: false

# This line is going to be replaced on CI to test different RSpec versions.
# gem 'rspec-core', 'x.x.x'
gem 'rspec'
end
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ bundle update knapsack_pro
RSpec:

```bash
bundle exec rspec
bin/rspec
```

### Publishing
Expand Down
25 changes: 3 additions & 22 deletions bin/knapsack_pro
Original file line number Diff line number Diff line change
@@ -1,25 +1,6 @@
#!/usr/bin/env ruby

require_relative '../lib/knapsack_pro'
require "rubygems"
require "bundler/setup"

runner = ARGV[0]
arguments = ARGV[1]

MAP = {
'rspec' => KnapsackPro::Runners::RSpecRunner,
'queue:rspec' => KnapsackPro::Runners::Queue::RSpecRunner,
'cucumber' => KnapsackPro::Runners::CucumberRunner,
'queue:cucumber' => KnapsackPro::Runners::Queue::CucumberRunner,
'minitest' => KnapsackPro::Runners::MinitestRunner,
'queue:minitest' => KnapsackPro::Runners::Queue::MinitestRunner,
'test_unit' => KnapsackPro::Runners::TestUnitRunner,
'spinach' => KnapsackPro::Runners::SpinachRunner,
}

runner_class = MAP[runner]

if runner_class
runner_class.run(arguments)
else
raise 'Undefined runner. Please provide runner name and optional arguments, for instance: knapsack_pro rspec "--color --profile"'
end
load Gem.bin_path("knapsack_pro", "knapsack_pro")
27 changes: 27 additions & 0 deletions bin/rspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/usr/bin/env ruby
# frozen_string_literal: true

#
# This file was generated by Bundler.
#
# The application 'rspec' is installed as part of a gem, and
# this file is here to facilitate running it.
#

ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)

bundle_binstub = File.expand_path("bundle", __dir__)

if File.file?(bundle_binstub)
if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
load(bundle_binstub)
else
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
end
end

require "rubygems"
require "bundler/setup"

load Gem.bin_path("rspec-core", "rspec")
5 changes: 5 additions & 0 deletions exe/knapsack_pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/usr/bin/env ruby

require "knapsack_pro"
require "knapsack_pro/commands"
KnapsackPro::Commands.start(ARGV)
44 changes: 21 additions & 23 deletions knapsack_pro.gemspec
Original file line number Diff line number Diff line change
@@ -1,39 +1,37 @@
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'knapsack_pro/version'
require_relative "lib/knapsack_pro/version"

Gem::Specification.new do |spec|
spec.name = 'knapsack_pro'
spec.name = "knapsack_pro"
spec.version = KnapsackPro::VERSION
spec.required_ruby_version = '>= 3.0.0'
spec.authors = ['ArturT']
spec.email = ['support@knapsackpro.com']
spec.summary = %q{Knapsack Pro splits tests across parallel CI nodes and ensures each parallel job finish work at a similar time.}
spec.description = %q{Knapsack Pro wraps your current test runner(s) and works with your existing CI infrastructure to parallelize tests optimally. It dynamically splits your tests based on up-to-date test execution data. It's designed from the ground up for CI and supports all of them.}
spec.homepage = 'https://knapsackpro.com'
spec.license = 'MIT'
spec.metadata = {
'bug_tracker_uri' => 'https://github.com/KnapsackPro/knapsack_pro-ruby/issues',
'changelog_uri' => 'https://github.com/KnapsackPro/knapsack_pro-ruby/blob/main/CHANGELOG.md',
'documentation_uri' => 'https://docs.knapsackpro.com/knapsack_pro-ruby/guide/',
'homepage_uri' => 'https://knapsackpro.com',
'source_code_uri' => 'https://github.com/KnapsackPro/knapsack_pro-ruby'
}
spec.authors = ["ArturT"]
spec.email = ["support@knapsackpro.com"]
spec.summary = "Knapsack Pro splits tests across parallel CI nodes and ensures each parallel job finish work at a similar time."
spec.description = "Knapsack Pro wraps your current test runner(s) and works with your existing CI infrastructure to parallelize tests optimally. It dynamically splits your tests based on up-to-date test execution data. It's designed from the ground up for CI and supports all of them."
spec.homepage = "https://knapsackpro.com"
spec.license = "MIT"

spec.files = Dir.glob("lib/**/*") + Dir.glob("exe/*")
spec.executables = ['knapsack_pro']
spec.metadata["bug_tracker_uri"] = "https://github.com/KnapsackPro/knapsack_pro-ruby/issues"
spec.metadata["changelog_uri"] = "https://github.com/KnapsackPro/knapsack_pro-ruby/blob/main/CHANGELOG.md"
spec.metadata["documentation_uri"] = "https://docs.knapsackpro.com/knapsack_pro-ruby/guide/"
spec.metadata["homepage_uri"] = "https://knapsackpro.com"
spec.metadata["source_code_uri"] = "https://github.com/KnapsackPro/knapsack_pro-ruby"
spec.metadata["rubygems_mfa_required"] = "true"

spec.files = Dir.glob("lib/**/*") + Dir.glob("exe/*")
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ['lib']
spec.require_paths = ["lib"]

spec.add_dependency 'rake', '>= 0'
spec.add_dependency "rake", ">= 0"
spec.add_dependency "thor", "~> 1.4"

spec.add_development_dependency 'bundler', '>= 1.6'
spec.add_development_dependency 'cucumber', '>= 0'
spec.add_development_dependency 'minitest', '>= 5.0.0'
spec.add_development_dependency 'ostruct', '>= 0.6.0'
spec.add_development_dependency 'pry', '~> 0'
spec.add_development_dependency 'rspec', '~> 3.0'
spec.add_development_dependency 'rspec-its'
spec.add_development_dependency 'spinach', '>= 0.8'
spec.add_development_dependency 'test-unit', '>= 3.0.0'
Expand Down
Loading