polyamory 0.6.0 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -10,8 +10,20 @@ Frameworks supported:
10
10
  * Cucumber in `features/**/*.feature`
11
11
  * RSpec + Shoulda in `spec/**/*_spec.rb`
12
12
  * test/unit, Shoulda, or anything else in `test/**/*_test.rb` or `test/**/test*.rb`
13
+ * Bats in `test/*.bats`
13
14
 
14
- Features:
15
+ ## Installation
16
+
17
+ # Mac OS X
18
+ brew install https://github.com/mislav/polyamory/raw/master/brew/polyamory.rb
19
+
20
+ # other
21
+ gem i polyamory
22
+
23
+ # alias for brevity
24
+ alias pam=polyamory
25
+
26
+ ## Features
15
27
 
16
28
  * `polyamory` - Runs the full test suite for any project. For example, it will
17
29
  run all of the following:
@@ -2,7 +2,7 @@ require 'optparse'
2
2
  require 'polyamory/runner'
3
3
 
4
4
  module Polyamory
5
- VERSION = '0.6.0'
5
+ VERSION = '0.6.2'
6
6
 
7
7
  def self.run(args, dir)
8
8
  options = parse_options! args
@@ -0,0 +1,107 @@
1
+ require 'polyamory/rooted_pathname'
2
+ require 'polyamory/command'
3
+
4
+ module Polyamory
5
+ # Internal: Deals with finding Bats files to test
6
+ # https://github.com/sstephenson/bats#readme
7
+ class Bats
8
+ attr_reader :context
9
+
10
+ def initialize context
11
+ @context = context
12
+ end
13
+
14
+ def test_dir
15
+ @test_dir ||= context.root + 'test'
16
+ end
17
+
18
+ def file_pattern dir
19
+ "#{dir}/*.bats"
20
+ end
21
+
22
+ def handle? path
23
+ path.extname == '.bats' || !find_files(path).empty?
24
+ end
25
+
26
+ def find_files dir = test_dir
27
+ glob file_pattern(dir)
28
+ end
29
+
30
+ # Internal: Memoized find_files in primary dir
31
+ def all_matching_files
32
+ @all_matching_files ||= find_files
33
+ end
34
+
35
+ # Public: Resolve a set of files, directories, and patterns to a list of
36
+ # paths to test.
37
+ def resolve_paths names
38
+ if context.tag_filters.any?
39
+ # Bats doesn't support tags
40
+ []
41
+ elsif names.any?
42
+ paths = []
43
+ for name in names
44
+ paths.concat Array(resolve_name name)
45
+ end
46
+ paths
47
+ else
48
+ [test_dir]
49
+ end
50
+ end
51
+
52
+ def resolve_name name
53
+ resolve_as_directory(name) or
54
+ resolve_as_filename(name) or
55
+ resolve_as_file_pattern(name) or
56
+ raise "nothing resolved from #{name}"
57
+ end
58
+
59
+ # "functional" => "test/functional/**"
60
+ # "test/functional" => "test/functional/**"
61
+ def resolve_as_directory name
62
+ [test_dir + name, context.root + name].detect { |dir| handle?(dir) }
63
+ end
64
+
65
+ # "test/unit/hello.bats"
66
+ def resolve_as_filename name
67
+ file = context.root + name
68
+ file if file.file? and handle?(file)
69
+ end
70
+
71
+ # "word" => "test/**" that match "word"
72
+ def resolve_as_file_pattern name
73
+ pattern = /(?:\b|_)#{Regexp.escape name}(?:\b|_)/
74
+ all_matching_files.select {|p| p =~ pattern }
75
+ end
76
+
77
+ # Public: From a list of paths, yank the ones that this knows how to handle,
78
+ # and build test jobs from it.
79
+ def pick_jobs paths
80
+ to_test = []
81
+ paths.reject! do |path|
82
+ if handle? path
83
+ to_test << path
84
+ true
85
+ end
86
+ end
87
+
88
+ unless to_test.empty?
89
+ excess = to_test.slice!(1..-1)
90
+ warn "warning: bats can only accept one filename; skipping #{excess.map {|p| p.relative }.join(' ')}" unless excess.empty?
91
+ [test_command(to_test)]
92
+ else
93
+ []
94
+ end
95
+ end
96
+
97
+ def test_command paths
98
+ Command.new ['bats'] do |test_job|
99
+ test_job.concat paths.map {|p| p.relative }
100
+ end
101
+ end
102
+
103
+ def glob pattern
104
+ RootedPathname.glob pattern, context.root
105
+ end
106
+ end
107
+ end
@@ -27,7 +27,7 @@ module Polyamory
27
27
  opts << "-I#{path}"
28
28
  end
29
29
  opts << '%'
30
- cmd.env['RUBYOPT'] = opts.join(' ')
30
+ cmd.env['RUBYOPT'] = opts.join(' ') if opts.size > 1
31
31
  end
32
32
 
33
33
  def cucumber_options
@@ -115,7 +115,7 @@ module Polyamory
115
115
  opts = []
116
116
  opts << '-w' if context.warnings?
117
117
  opts << '%'
118
- cmd.env['RUBYOPT'] = opts.join(' ')
118
+ cmd.env['RUBYOPT'] = opts.join(' ') if opts.size > 1
119
119
  end
120
120
 
121
121
  def rspec_options
@@ -2,6 +2,7 @@ require 'polyamory/rooted_pathname'
2
2
  require 'polyamory/test_unit'
3
3
  require 'polyamory/rspec'
4
4
  require 'polyamory/cucumber'
5
+ require 'polyamory/bats'
5
6
 
6
7
  module Polyamory
7
8
  # Public: Collects test jobs in the root directory and runs them.
@@ -45,8 +46,8 @@ module Polyamory
45
46
  def bundle_exec?
46
47
  return @bundle_exec if defined? @bundle_exec
47
48
  if (setting = options.fetch(:bundler)).nil?
48
- setting = !ENV['BUNDLE_GEMFILE'].to_s.empty? ||
49
- (root + 'Gemfile').exist?
49
+ setting = ENV['RUBYOPT'] !~ /\br?bundler\/setup\b/ &&
50
+ ( !ENV['BUNDLE_GEMFILE'].to_s.empty? || (root + 'Gemfile').exist? )
50
51
  end
51
52
  @bundle_exec = setting
52
53
  end
@@ -71,7 +72,7 @@ module Polyamory
71
72
  end
72
73
 
73
74
  def collect_jobs
74
- [TestUnit, RSpec, Cucumber].inject([]) do |jobs, klass|
75
+ [TestUnit, RSpec, Cucumber, Bats].inject([]) do |jobs, klass|
75
76
  framework = klass.new self
76
77
  paths = framework.resolve_paths @names
77
78
  jobs.concat framework.pick_jobs(paths)
@@ -126,15 +126,19 @@ module Polyamory
126
126
  RootedPathname.glob pattern, context.root
127
127
  end
128
128
 
129
+ def rails?
130
+ (context.root + 'config/environment.rb').exist?
131
+ end
132
+
129
133
  def add_ruby_options cmd
130
134
  opts = []
131
135
  opts << '-w' if context.warnings?
132
- opts << '-Ilib:test'
136
+ opts << "-Ilib:#{test_dir.basename}" unless rails?
133
137
  for path in context.load_paths
134
138
  opts << "-I#{path}"
135
139
  end
136
140
  opts << '%'
137
- cmd.env['RUBYOPT'] = opts.join(' ')
141
+ cmd.env['RUBYOPT'] = opts.join(' ') if opts.size > 1
138
142
  end
139
143
 
140
144
  def testunit_options
@@ -192,7 +192,7 @@ describe Polyamory::Runner do
192
192
  end
193
193
 
194
194
  it "sets no ruby options" do
195
- job.env['RUBYOPT'].must_equal "%"
195
+ job.env['RUBYOPT'].must_be_nil
196
196
  end
197
197
 
198
198
  describe "example filters" do
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: polyamory
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.6.0
5
+ version: 0.6.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Mislav Marohnić
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-08 00:00:00.000000000 Z
12
+ date: 2013-03-09 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A cli runner for all tests regardless of framework
15
15
  email: mislav.marohnic@gmail.com
@@ -19,6 +19,7 @@ extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - bin/polyamory
22
+ - lib/polyamory/bats.rb
22
23
  - lib/polyamory/command.rb
23
24
  - lib/polyamory/cucumber.rb
24
25
  - lib/polyamory/rooted_pathname.rb