knapsack 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ed337f85241e8de0a55b8f40474e07c491ffa954
4
+ data.tar.gz: 594c3f97f5076272f0883de5f093e6c6930e68f9
5
+ SHA512:
6
+ metadata.gz: 18e3ba7b288ce4b91d174b121b7f731564bf39e720ef7fa37191bfd68387696e5bbc45c1bc06a28fb0bc503c875078748d673a1f851af321eb657c92bcea78e4
7
+ data.tar.gz: 6eed013b760611599ce3bb8028cfc7bea32e6e853b5fc7a1366bdf26d8d2b41f443aed166777fd1d7dc7b6d2c467572f0a0cc7ab36dd4d94f26610030a2ef9f0
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,5 @@
1
+ --color
2
+ --warnings
3
+ --require spec_helper
4
+ --format documentation
5
+ #--profile
@@ -0,0 +1,21 @@
1
+ ---
2
+ language: ruby
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
7
+ - 2.1.1
8
+ - 2.1.2
9
+ addons:
10
+ code_climate:
11
+ repo_token: 38686058eed480dd0fcf8bce9015733e0bae88e44e30f4a1ac63df8aec2f86d8
12
+ before_install:
13
+ - "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
14
+ script:
15
+ - bundle exec rspec spec
16
+ # generate knapsack report
17
+ - KNAPSACK_GENERATE_REPORT=true bundle exec rspec --default-path spec_examples
18
+ # run specs with enabled time offset warning
19
+ - bundle exec rspec --default-path spec_examples
20
+ notifications:
21
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in knapsack.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 ArturT
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,71 @@
1
+ # Knapsack
2
+
3
+ [![Build Status](https://travis-ci.org/ArturT/knapsack.svg?branch=master)](travis)
4
+ [![Code Climate](https://codeclimate.com/github/ArturT/knapsack.png)](codeclimate)
5
+ [![Coverage Status](https://codeclimate.com/github/ArturT/knapsack/coverage.png)][coverage]
6
+
7
+ [travis]: http://travis-ci.org/ArturT/knapsack
8
+ [codeclimate]: https://codeclimate.com/github/ArturT/knapsack
9
+ [coverage]: https://codeclimate.com/github/ArturT/knapsack
10
+
11
+ Parallel specs across CI server nodes based on each spec file's time execution.
12
+
13
+ ## Installation
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ gem 'knapsack'
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install knapsack
26
+
27
+ ## Usage
28
+
29
+ Add at the beginning of your `spec_helper.rb`:
30
+
31
+ require 'knapsack'
32
+ # default configuration, you can change it or omit
33
+ Knapsack.tracker.config({
34
+ enable_time_offset_warning: true,
35
+ time_offset_warning: 30,
36
+ })
37
+ Knapsack::Adapters::Rspec.bind
38
+
39
+ Generate time execution report for your spec files.
40
+
41
+ $ KNAPSACK_GENERATE_REPORT=true rspec spec
42
+
43
+ Commit generated report `knapsack_report.json` into your repository.
44
+
45
+ ## Contributing
46
+
47
+ 1. Fork it ( https://github.com/[my-github-username]/knapsack/fork )
48
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
49
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
50
+ 4. Push to the branch (`git push origin my-new-feature`)
51
+ 5. Create a new Pull Request
52
+
53
+ ## Tests
54
+
55
+ ### Spec
56
+
57
+ To run specs for Knapsack gem type:
58
+
59
+ $ rspec spec
60
+
61
+ ### Spec examples
62
+
63
+ Directory `spec_examples` contains examples of fast and slow specs. There is a `spec_helper.rb` with binded Knapsack.
64
+
65
+ Change one spec to make it sure it will take more than 5 seconds then run below to see Knapsack time offset warning.
66
+
67
+ $ rspec --default-path spec_examples
68
+
69
+ To generate a new knapsack report file please type:
70
+
71
+ $ KNAPSACK_GENERATE_REPORT=true rspec --default-path spec_examples
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'knapsack/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "knapsack"
8
+ spec.version = Knapsack::VERSION
9
+ spec.authors = ["ArturT"]
10
+ spec.email = ["arturtrzop@gmail.com"]
11
+ spec.summary = %q{Parallel specs across CI server nodes based on each spec file's time execution.}
12
+ spec.description = %q{Parallel specs across CI server nodes based on each spec file's time execution. It generates spec time execution report and uses it for further test runs.}
13
+ spec.homepage = "https://github.com/ArturT/knapsack"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.6'
22
+ spec.add_development_dependency 'rake', '~> 0'
23
+ spec.add_development_dependency 'rspec', '~> 3.0', '>= 3.0.0'
24
+ spec.add_development_dependency 'timecop', '~> 0'
25
+ spec.add_development_dependency 'codeclimate-test-reporter', '~> 0'
26
+ end
@@ -0,0 +1,14 @@
1
+ {
2
+ "./spec_examples/fast/1_spec.rb": 9.584426879882812e-05,
3
+ "./spec_examples/fast/2_spec.rb": 0.00014638900756835938,
4
+ "./spec_examples/fast/3_spec.rb": 0.0002243518829345703,
5
+ "./spec_examples/fast/4_spec.rb": 0.0002560615539550781,
6
+ "./spec_examples/fast/5_spec.rb": 0.00023126602172851562,
7
+ "./spec_examples/fast/6_spec.rb": 0.00020503997802734375,
8
+ "./spec_examples/slow/a_spec.rb": 1.6018133163452148,
9
+ "./spec_examples/slow/b_spec.rb": 3.202699661254883,
10
+ "./spec_examples/slow/c_spec.rb": 1.0021936893463135,
11
+ "./spec_examples/slow/d_spec.rb": 4.001989841461182,
12
+ "./spec_examples/slow/e_spec.rb": 2.4013099670410156,
13
+ "./spec_examples/slow/f_spec.rb": 0.60198974609375
14
+ }
@@ -0,0 +1,14 @@
1
+ require 'knapsack/version'
2
+ require 'knapsack/tracker'
3
+ require 'knapsack/presenter'
4
+ require 'knapsack/report'
5
+ require 'knapsack/adapters/base'
6
+ require 'knapsack/adapters/rspec'
7
+
8
+ module Knapsack
9
+ class << self
10
+ def tracker
11
+ Knapsack::Tracker.instance
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,33 @@
1
+ module Knapsack
2
+ module Adapters
3
+ class Base
4
+ def self.bind
5
+ new
6
+ end
7
+
8
+ protected
9
+
10
+ def initialize
11
+ if Knapsack.tracker.generate_report?
12
+ puts 'Knapsack report generator started!'
13
+ bind_time_tracker
14
+ bind_report_generator
15
+ elsif Knapsack.tracker.config[:enable_time_offset_warning]
16
+ puts 'Knapsack time offset warning enabled!'
17
+ bind_time_tracker
18
+ # TODO
19
+ else
20
+ puts 'Knapsack is off!'
21
+ end
22
+ end
23
+
24
+ def bind_time_tracker
25
+ raise NotImplementedError
26
+ end
27
+
28
+ def bind_report_generator
29
+ raise NotImplementedError
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,38 @@
1
+ module Knapsack
2
+ module Adapters
3
+ class Rspec < Base
4
+ protected
5
+
6
+ def bind_time_tracker
7
+ ::RSpec.configure do |config|
8
+ config.before(:each) do
9
+ Knapsack.tracker.spec_path = Rspec.spec_path
10
+ Knapsack.tracker.start_timer
11
+ end
12
+
13
+ config.after(:each) do
14
+ Knapsack.tracker.stop_timer
15
+ end
16
+
17
+ config.after(:suite) do
18
+ puts
19
+ puts Presenter.global_time
20
+ end
21
+ end
22
+ end
23
+
24
+ def bind_report_generator
25
+ ::RSpec.configure do |config|
26
+ config.after(:suite) do
27
+ Report.save
28
+ puts Presenter.report_details
29
+ end
30
+ end
31
+ end
32
+
33
+ def self.spec_path
34
+ ::RSpec.current_example.metadata[:example_group][:file_path]
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ require 'yaml'
2
+ require 'json'
3
+
4
+ module Knapsack
5
+ class Presenter
6
+ class << self
7
+ def report_yml
8
+ Knapsack.tracker.files.to_yaml
9
+ end
10
+
11
+ def report_json
12
+ JSON.pretty_generate(Knapsack.tracker.files)
13
+ end
14
+
15
+ def global_time
16
+ "Knapsack global time execution for specs: #{Knapsack.tracker.global_time}s"
17
+ end
18
+
19
+ def report_details
20
+ "Knapsack report was generated. Preview:\n" + Presenter.report_json
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ module Knapsack
2
+ class Report
3
+ REPORT_PATH = 'knapsack_report.json'
4
+
5
+ class << self
6
+ def save
7
+ File.open(REPORT_PATH, 'w+') do |f|
8
+ f.write(Presenter.report_json)
9
+ end
10
+ end
11
+
12
+ def open
13
+ report = File.read(REPORT_PATH)
14
+ JSON.parse(report)
15
+ rescue Errno::ENOENT
16
+ raise "Knapsack report file doesn't exist. Please generate report first!"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,65 @@
1
+ require 'singleton'
2
+
3
+ module Knapsack
4
+ class Tracker
5
+ include Singleton
6
+
7
+ attr_reader :global_time, :files
8
+ attr_writer :spec_path
9
+
10
+ def initialize
11
+ set_defaults
12
+ end
13
+
14
+ def generate_report?
15
+ ENV['KNAPSACK_GENERATE_REPORT'] || false
16
+ end
17
+
18
+ def config(opts={})
19
+ @config ||= default_config
20
+ @config.merge!(opts)
21
+ end
22
+
23
+ def reset!
24
+ set_defaults
25
+ end
26
+
27
+ def start_timer
28
+ @start_time = Time.now.to_f
29
+ end
30
+
31
+ def stop_timer
32
+ @execution_time = Time.now.to_f - @start_time
33
+ update_global_time
34
+ update_spec_file_time
35
+ @execution_time
36
+ end
37
+
38
+ private
39
+
40
+ def default_config
41
+ {
42
+ enable_time_offset_warning: true,
43
+ time_offset_warning: 30,
44
+ }
45
+ end
46
+
47
+ def set_defaults
48
+ @global_time = 0
49
+ @files = {}
50
+ end
51
+
52
+ def update_global_time
53
+ @global_time += @execution_time
54
+ end
55
+
56
+ def update_spec_file_time
57
+ @files[spec_path] ||= 0
58
+ @files[spec_path] += @execution_time
59
+ end
60
+
61
+ def spec_path
62
+ @spec_path || raise("spec_path needs to be set by Knapsack Adapter's bind method")
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,3 @@
1
+ module Knapsack
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples 'default trakcer attributes' do
4
+ it { expect(tracker.global_time).to eql 0 }
5
+ it { expect(tracker.files).to eql({}) }
6
+ end
7
+
8
+ describe Knapsack::Tracker do
9
+ let(:tracker) { described_class.send(:new) }
10
+
11
+ it_behaves_like 'default trakcer attributes'
12
+
13
+ describe '#generate_report?' do
14
+ subject { tracker.generate_report? }
15
+
16
+ context 'when ENV variable is defined' do
17
+ before do
18
+ stub_const("ENV", { 'KNAPSACK_GENERATE_REPORT' => true })
19
+ end
20
+ it { should be true }
21
+ end
22
+
23
+ context 'when ENV variable is not defined' do
24
+ it { should be false }
25
+ end
26
+ end
27
+
28
+ describe '#config' do
29
+ context 'when passed options' do
30
+ let(:opts) do
31
+ {
32
+ enable_time_offset_warning: false,
33
+ fake: true
34
+ }
35
+ end
36
+
37
+ it do
38
+ expect(tracker.config(opts)).to eql({
39
+ enable_time_offset_warning: false,
40
+ time_offset_warning: 30,
41
+ fake: true
42
+ })
43
+ end
44
+ end
45
+
46
+ context "when didn't pass options" do
47
+ it do
48
+ expect(tracker.config).to eql({
49
+ enable_time_offset_warning: true,
50
+ time_offset_warning: 30,
51
+ })
52
+ end
53
+ end
54
+ end
55
+
56
+ describe 'track time execution' do
57
+ let(:now) { Time.now }
58
+ let(:spec_paths) { ['a_spec.rb', 'b_spec.rb'] }
59
+
60
+ before do
61
+ spec_paths.each_with_index do |spec_path, index|
62
+ Timecop.freeze(now) do
63
+ tracker.spec_path = spec_path
64
+ tracker.start_timer
65
+ end
66
+
67
+ seconds = index + 1
68
+ Timecop.freeze(now+seconds) do
69
+ tracker.stop_timer
70
+ end
71
+ end
72
+ end
73
+
74
+ it { expect(tracker.global_time).to eql 3.0 }
75
+ it do
76
+ expect(tracker.files).to eql({
77
+ 'a_spec.rb' => 1.0,
78
+ 'b_spec.rb' => 2.0,
79
+ })
80
+ end
81
+
82
+ context '#reset!' do
83
+ before { tracker.reset! }
84
+ it_behaves_like 'default trakcer attributes'
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Knapsack do
4
+ describe '.tracker' do
5
+ subject { described_class.tracker }
6
+
7
+ it { should be_a Knapsack::Tracker }
8
+ it { expect(subject.object_id).to eql described_class.tracker.object_id }
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ require 'timecop'
2
+ Timecop.safe_mode = true
3
+
4
+ require 'codeclimate-test-reporter'
5
+ CodeClimate::TestReporter.start
6
+
7
+ require 'knapsack'
8
+
9
+ RSpec.configure do |config|
10
+ config.order = :random
11
+ config.mock_with :rspec do |mocks|
12
+ mocks.syntax = :expect
13
+ mocks.verify_partial_doubles = true
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Fast 1' do
4
+ it {}
5
+ end
6
+
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Fast 2' do
4
+ it {}
5
+ it {}
6
+ end
7
+
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Fast 3' do
4
+ it {}
5
+ it {}
6
+ it {}
7
+ end
8
+
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Fast 4' do
4
+ it {}
5
+ it {}
6
+ it {}
7
+ it {}
8
+ end
9
+
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Fast 5' do
4
+ it {}
5
+ it {}
6
+ it {}
7
+ it {}
8
+ it {}
9
+ end
10
+
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Fast 6' do
4
+ it {}
5
+ it {}
6
+ it {}
7
+ it {}
8
+ it {}
9
+ it {}
10
+ end
11
+
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Slow A' do
4
+ it { sleep 1 }
5
+ it { sleep 0.1 }
6
+ it { sleep 0.5 }
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Slow B' do
4
+ it { sleep 2 }
5
+ it { sleep 0.2 }
6
+ it { sleep 1 }
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Slow C' do
4
+ it { sleep 0.8 }
5
+ it { sleep 0.1 }
6
+ it { sleep 0.1 }
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Slow D' do
4
+ it { sleep 1 }
5
+ it { sleep 1 }
6
+ it { sleep 2 }
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Slow E' do
4
+ it { sleep 1 }
5
+ it { sleep 0.9 }
6
+ it { sleep 0.5 }
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Slow F' do
4
+ it { sleep 0.1 }
5
+ it { sleep 0.2 }
6
+ it { sleep 0.3 }
7
+ end
@@ -0,0 +1,14 @@
1
+ require 'knapsack'
2
+ Knapsack.tracker.config({
3
+ enable_time_offset_warning: true,
4
+ time_offset_warning: 5
5
+ })
6
+ Knapsack::Adapters::Rspec.bind
7
+
8
+ RSpec.configure do |config|
9
+ config.order = :random
10
+ config.mock_with :rspec do |mocks|
11
+ mocks.syntax = :expect
12
+ mocks.verify_partial_doubles = true
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: knapsack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - ArturT
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 3.0.0
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '3.0'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 3.0.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: timecop
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: codeclimate-test-reporter
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ description: Parallel specs across CI server nodes based on each spec file's time
90
+ execution. It generates spec time execution report and uses it for further test
91
+ runs.
92
+ email:
93
+ - arturtrzop@gmail.com
94
+ executables: []
95
+ extensions: []
96
+ extra_rdoc_files: []
97
+ files:
98
+ - ".gitignore"
99
+ - ".rspec"
100
+ - ".travis.yml"
101
+ - Gemfile
102
+ - LICENSE.txt
103
+ - README.md
104
+ - Rakefile
105
+ - knapsack.gemspec
106
+ - knapsack_report.json
107
+ - lib/knapsack.rb
108
+ - lib/knapsack/adapters/base.rb
109
+ - lib/knapsack/adapters/rspec.rb
110
+ - lib/knapsack/presenter.rb
111
+ - lib/knapsack/report.rb
112
+ - lib/knapsack/tracker.rb
113
+ - lib/knapsack/version.rb
114
+ - spec/knapsack/tracker_spec.rb
115
+ - spec/knapsack_spec.rb
116
+ - spec/spec_helper.rb
117
+ - spec_examples/fast/1_spec.rb
118
+ - spec_examples/fast/2_spec.rb
119
+ - spec_examples/fast/3_spec.rb
120
+ - spec_examples/fast/4_spec.rb
121
+ - spec_examples/fast/5_spec.rb
122
+ - spec_examples/fast/6_spec.rb
123
+ - spec_examples/slow/a_spec.rb
124
+ - spec_examples/slow/b_spec.rb
125
+ - spec_examples/slow/c_spec.rb
126
+ - spec_examples/slow/d_spec.rb
127
+ - spec_examples/slow/e_spec.rb
128
+ - spec_examples/slow/f_spec.rb
129
+ - spec_examples/spec_helper.rb
130
+ homepage: https://github.com/ArturT/knapsack
131
+ licenses:
132
+ - MIT
133
+ metadata: {}
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubyforge_project:
150
+ rubygems_version: 2.2.2
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: Parallel specs across CI server nodes based on each spec file's time execution.
154
+ test_files:
155
+ - spec/knapsack/tracker_spec.rb
156
+ - spec/knapsack_spec.rb
157
+ - spec/spec_helper.rb