polyamory 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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