starting_blocks 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ module StartingBlocks
2
+
3
+ module Displayable
4
+ module ClassMethods
5
+ def display message
6
+ puts message if @verbose
7
+ end
8
+ end
9
+
10
+ module InstanceMethods
11
+ end
12
+
13
+ def self.included(receiver)
14
+ receiver.extend ClassMethods
15
+ receiver.send :include, InstanceMethods
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,30 @@
1
+ module StartingBlocks
2
+ module Publisher
3
+ class << self
4
+ attr_accessor :subscribers, :result_parser
5
+
6
+ def publish_results results
7
+ return unless @subscribers
8
+ @subscribers.each do |s|
9
+ parsed_results = StartingBlocks::Publisher.result_parser.parse(results)
10
+ begin
11
+ s.receive_results parsed_results
12
+ rescue
13
+ end
14
+ end
15
+ end
16
+
17
+ def publish_specs_to_run specs
18
+ return unless @subscribers
19
+ @subscribers.each do |s|
20
+ begin
21
+ s.receive_specs_to_run specs
22
+ rescue
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ StartingBlocks::Publisher.subscribers = []
30
+ StartingBlocks::Publisher.result_parser = StartingBlocks::ResultParser.new
@@ -0,0 +1,20 @@
1
+ module StartingBlocks
2
+ class ResultParser
3
+ def parse(text)
4
+ {
5
+ tests: get_count_of('tests', text),
6
+ assertions: get_count_of('assertions', text),
7
+ failures: get_count_of('failures', text),
8
+ errors: get_count_of('errors', text),
9
+ skips: get_count_of('skips', text)
10
+ }
11
+ end
12
+
13
+ def get_count_of name, text
14
+ text.scan(/(\d+ #{name})/)[-1][0].split(' ')[0].to_i
15
+ rescue
16
+ 0
17
+ end
18
+ end
19
+ end
20
+
@@ -1,19 +1,24 @@
1
1
  module StartingBlocks
2
2
  class Runner
3
+
4
+ include Displayable
5
+
3
6
  def initialize options
4
7
  @verbose = options[:verbose]
5
8
  end
6
9
 
7
10
  def run_files specs
8
- requires = specs.map { |x| "require '#{x}'" }.join("\n")
9
11
  display "Specs to run: #{specs.inspect}"
10
- puts `ruby -e "#{requires}"`
12
+ results = execute_these_specs specs
13
+ StartingBlocks::Publisher.publish_results results
14
+ puts results
11
15
  end
12
16
 
13
17
  private
14
18
 
15
- def display message
16
- puts message if @verbose
19
+ def execute_these_specs specs
20
+ requires = specs.map { |x| "require '#{x}'" }.join("\n")
21
+ `ruby -e "#{requires}"`
17
22
  end
18
23
  end
19
24
  end
@@ -1,3 +1,3 @@
1
1
  module StartingBlocks
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -2,44 +2,45 @@ require 'fssm'
2
2
 
3
3
  module StartingBlocks
4
4
  module Watcher
5
+
6
+ include Displayable
7
+
5
8
  class << self
6
9
  def start_watching(dir, options)
7
10
  location = dir.getwd
8
- files = Dir['**/*']
11
+ all_files = Dir['**/*']
9
12
  FSSM.monitor(location, '**/*') do
10
- update {|base, relative| StartingBlocks::Watcher.run_it relative, files, options }
11
- delete {|base, relative| StartingBlocks::Watcher.delete_it relative, files, options }
12
- create {|base, relative| StartingBlocks::Watcher.add_it relative, files, options }
13
+ update {|base, file_that_changed| StartingBlocks::Watcher.run_it file_that_changed, all_files, options }
14
+ delete {|base, file_that_changed| StartingBlocks::Watcher.delete_it file_that_changed, all_files, options }
15
+ create {|base, file_that_changed| StartingBlocks::Watcher.add_it file_that_changed, all_files, options }
13
16
  end
14
17
  end
15
18
 
16
- def add_it(file, files, options)
17
- return if file.index('.git') == 0
18
- display "Adding: #{file}"
19
- files << file
19
+ def add_it(file_that_changed, all_files, options)
20
+ return if file_that_changed.index('.git') == 0
21
+ display "Adding: #{file_that_changed}"
22
+ all_files << file_that_changed
20
23
  end
21
24
 
22
- def run_it(file, files, options)
23
- filename = file.downcase.split('/')[-1].gsub('_spec', '')
24
- display "File to run is: #{file}"
25
- display "Filename: #{filename}"
26
- matches = files.select { |x| x.gsub('_spec.rb', '.rb').include?(filename) && x != file }
27
- matches << file
28
- specs = matches.select { |x| x.include?('_spec') && File.file?(x) }.map { |x| File.expand_path x }
25
+ def run_it(file_that_changed, all_files, options)
26
+ specs = get_the_specs_to_run file_that_changed, all_files
29
27
  display "Matches: #{specs.inspect}"
30
28
  StartingBlocks::Runner.new(options).run_files specs
31
29
  end
32
30
 
33
- def delete_it(file, files, options)
34
- return if file.index('.git') == 0
35
- display "Deleting: #{file}"
36
- files.delete(file)
31
+ def delete_it(file_that_changed, all_files, options)
32
+ return if file_that_changed.index('.git') == 0
33
+ display "Deleting: #{file_that_changed}"
34
+ all_files.delete(file_that_changed)
37
35
  end
38
36
 
39
37
  private
40
38
 
41
- def display message
42
- puts message if @verbose
39
+ def get_the_specs_to_run(file_that_changed, all_files)
40
+ filename = file_that_changed.downcase.split('/')[-1].gsub('_spec', '')
41
+ matches = all_files.select { |x| x.gsub('_spec.rb', '.rb').include?(filename) && x != file_that_changed }
42
+ matches << file_that_changed
43
+ specs = matches.select { |x| x.include?('_spec') && File.file?(x) }.map { |x| File.expand_path x }
43
44
  end
44
45
  end
45
46
  end
@@ -1,6 +1,9 @@
1
1
  require "starting_blocks/version"
2
+ require_relative 'starting_blocks/displayable'
2
3
  require_relative 'starting_blocks/runner'
3
4
  require_relative 'starting_blocks/watcher'
5
+ require_relative 'starting_blocks/result_parser'
6
+ require_relative 'starting_blocks/publisher'
4
7
 
5
8
  module StartingBlocks
6
9
  # Your code goes here...
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/starting_blocks')
2
+ require 'minitest/autorun'
3
+ require 'minitest/spec'
4
+ require 'minitest/pride'
5
+ require 'contrast'
6
+ require 'subtle'
7
+ require 'mocha/setup'
@@ -0,0 +1,114 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe StartingBlocks::Publisher do
4
+
5
+ let(:results) { Object.new }
6
+ let(:parsed_results) { Object.new }
7
+ let(:result_parser) { mock() }
8
+ let(:specs) { Object.new }
9
+
10
+ before do
11
+ result_parser.stubs(:parse).with(results).returns parsed_results
12
+ StartingBlocks::Publisher.result_parser = result_parser
13
+ end
14
+
15
+ it "subscribers should be empty" do
16
+ StartingBlocks::Publisher.subscribers.count.must_equal 0
17
+ end
18
+
19
+ describe "#publish_results" do
20
+ describe "one subscriber" do
21
+ it "should pass the results to the subscriber" do
22
+ subscriber = mock()
23
+ subscriber.expects(:receive_results).with(parsed_results)
24
+ StartingBlocks::Publisher.subscribers = [subscriber]
25
+ StartingBlocks::Publisher.publish_results results
26
+ end
27
+ end
28
+
29
+ describe "two subscribers" do
30
+ it "should pass the results to the subscriber" do
31
+ first_subscriber = mock()
32
+ first_subscriber.expects(:receive_results).with(parsed_results)
33
+ second_subscriber = mock()
34
+ second_subscriber.expects(:receive_results).with(parsed_results)
35
+ StartingBlocks::Publisher.subscribers = [first_subscriber, second_subscriber]
36
+ StartingBlocks::Publisher.publish_results results
37
+ end
38
+ end
39
+
40
+ describe "nil subscribers" do
41
+ it "should not error" do
42
+ StartingBlocks::Publisher.subscribers = nil
43
+ StartingBlocks::Publisher.publish_results results
44
+ end
45
+ end
46
+
47
+ describe "no subscribers" do
48
+ it "should not error" do
49
+ StartingBlocks::Publisher.subscribers = []
50
+ StartingBlocks::Publisher.publish_results results
51
+ end
52
+ end
53
+
54
+ describe "subscriber with no method to receive" do
55
+ it "should pass the results to the subscriber" do
56
+ first_subscriber = mock()
57
+ first_subscriber.expects(:receive_results).with(parsed_results)
58
+ second_subscriber = Object.new
59
+ third_subscriber = mock()
60
+ third_subscriber.expects(:receive_results).with(parsed_results)
61
+ StartingBlocks::Publisher.subscribers = [first_subscriber, second_subscriber, third_subscriber]
62
+ StartingBlocks::Publisher.publish_results results
63
+ end
64
+ end
65
+ end
66
+
67
+ describe "#publish_specs_to_run" do
68
+ describe "one subscriber" do
69
+ it "should pass the specs to the subscriber" do
70
+ subscriber = mock()
71
+ subscriber.expects(:receive_specs_to_run).with(specs)
72
+ StartingBlocks::Publisher.subscribers = [subscriber]
73
+ StartingBlocks::Publisher.publish_specs_to_run specs
74
+ end
75
+ end
76
+
77
+ describe "two subscribers" do
78
+ it "should pass the specs to the subscriber" do
79
+ first_subscriber = mock()
80
+ first_subscriber.expects(:receive_specs_to_run).with(specs)
81
+ second_subscriber = mock()
82
+ second_subscriber.expects(:receive_specs_to_run).with(specs)
83
+ StartingBlocks::Publisher.subscribers = [first_subscriber, second_subscriber]
84
+ StartingBlocks::Publisher.publish_specs_to_run specs
85
+ end
86
+ end
87
+
88
+ describe "nil subscribers" do
89
+ it "should not error" do
90
+ StartingBlocks::Publisher.subscribers = nil
91
+ StartingBlocks::Publisher.publish_specs_to_run specs
92
+ end
93
+ end
94
+
95
+ describe "no subscribers" do
96
+ it "should not error" do
97
+ StartingBlocks::Publisher.subscribers = []
98
+ StartingBlocks::Publisher.publish_specs_to_run specs
99
+ end
100
+ end
101
+
102
+ describe "subscriber with no method to receive" do
103
+ it "should not error" do
104
+ first_subscriber = mock()
105
+ first_subscriber.expects(:receive_specs_to_run).with(specs)
106
+ second_subscriber = Object.new
107
+ third_subscriber = mock()
108
+ third_subscriber.expects(:receive_specs_to_run).with(specs)
109
+ StartingBlocks::Publisher.subscribers = [first_subscriber, second_subscriber, third_subscriber]
110
+ StartingBlocks::Publisher.publish_specs_to_run specs
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,86 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe StartingBlocks::ResultParser do
4
+ describe "simple case" do
5
+ let(:text) do <<EOF
6
+ Fabulous tests in 0.000372s, 2688.1720 tests/s, 2688.1720 assertions/s.
7
+
8
+ 2 tests, 3 assertions, 4 failures, 5 errors, 6 skips
9
+
10
+ asldkjflaskjflsakj
11
+ EOF
12
+ end
13
+
14
+ let(:expected_results) do
15
+ {
16
+ tests: 2,
17
+ assertions: 3,
18
+ failures: 4,
19
+ errors: 5,
20
+ skips: 6
21
+ }
22
+ end
23
+
24
+ def subject
25
+ StartingBlocks::ResultParser.new
26
+ end
27
+
28
+ it "should return the counts" do
29
+ subject.parse(text).contrast_with! expected_results
30
+ end
31
+ end
32
+
33
+ describe "another case" do
34
+ let(:text) do <<EOF
35
+ aaaaa
36
+ 801 tests, 30014 assertions, 432 failures, 234 errors, 2141 skips
37
+ bbbbbb
38
+ EOF
39
+ end
40
+
41
+ let(:expected_results) do
42
+ {
43
+ tests: 801,
44
+ assertions: 30014,
45
+ failures: 432,
46
+ errors: 234,
47
+ skips: 2141
48
+ }
49
+ end
50
+
51
+ def subject
52
+ StartingBlocks::ResultParser.new
53
+ end
54
+
55
+ it "should return the counts" do
56
+ subject.parse(text).contrast_with! expected_results
57
+ end
58
+ end
59
+
60
+ describe "unparsable text" do
61
+ let(:text) do <<EOF
62
+ aaaaa
63
+ lkjsdlfkjslkjslkjalskjfsalkjfd
64
+ bbbbbb
65
+ EOF
66
+ end
67
+
68
+ let(:expected_results) do
69
+ {
70
+ tests: 0,
71
+ assertions: 0,
72
+ failures: 0,
73
+ errors: 0,
74
+ skips: 0
75
+ }
76
+ end
77
+
78
+ def subject
79
+ StartingBlocks::ResultParser.new
80
+ end
81
+
82
+ it "should return the counts" do
83
+ subject.parse(text).contrast_with! expected_results
84
+ end
85
+ end
86
+ end
@@ -20,5 +20,8 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "contrast"
24
+ spec.add_development_dependency "subtle"
25
+ spec.add_development_dependency "mocha"
23
26
  spec.add_runtime_dependency 'fssm'
24
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: starting_blocks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-27 00:00:00.000000000 Z
12
+ date: 2013-04-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -43,6 +43,54 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: contrast
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: subtle
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: mocha
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
46
94
  - !ruby/object:Gem::Dependency
47
95
  name: fssm
48
96
  requirement: !ruby/object:Gem::Requirement
@@ -74,9 +122,15 @@ files:
74
122
  - Rakefile
75
123
  - bin/sb
76
124
  - lib/starting_blocks.rb
125
+ - lib/starting_blocks/displayable.rb
126
+ - lib/starting_blocks/publisher.rb
127
+ - lib/starting_blocks/result_parser.rb
77
128
  - lib/starting_blocks/runner.rb
78
129
  - lib/starting_blocks/version.rb
79
130
  - lib/starting_blocks/watcher.rb
131
+ - spec/spec_helper.rb
132
+ - spec/starting_blocks/publisher_spec.rb
133
+ - spec/starting_blocks/result_parser_spec.rb
80
134
  - starting_blocks.gemspec
81
135
  homepage: ''
82
136
  licenses:
@@ -93,7 +147,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
93
147
  version: '0'
94
148
  segments:
95
149
  - 0
96
- hash: -3323215234002932118
150
+ hash: 2423351663168125208
97
151
  required_rubygems_version: !ruby/object:Gem::Requirement
98
152
  none: false
99
153
  requirements:
@@ -102,11 +156,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
156
  version: '0'
103
157
  segments:
104
158
  - 0
105
- hash: -3323215234002932118
159
+ hash: 2423351663168125208
106
160
  requirements: []
107
161
  rubyforge_project:
108
162
  rubygems_version: 1.8.25
109
163
  signing_key:
110
164
  specification_version: 3
111
165
  summary: One command to run all tests, test watcher, etc.
112
- test_files: []
166
+ test_files:
167
+ - spec/spec_helper.rb
168
+ - spec/starting_blocks/publisher_spec.rb
169
+ - spec/starting_blocks/result_parser_spec.rb