pendaxes 0.0.1

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.
@@ -0,0 +1,45 @@
1
+ !!! 5
2
+ %html
3
+ %head
4
+ %meta{charset: 'UTF-8'}
5
+ %title Pendaxes report - #{pendings.size} pendings are waiting to be fixed
6
+ %body
7
+ .container{style: 'font-family: sans-serif; color: #3C3C3C;'}
8
+ %h1 #{pendings.size} pendings are waiting to be fixed
9
+ - if config.report_url
10
+ %p
11
+ %strong Full Report:
12
+ %a{href: config.report_url}&= config.report_url
13
+ = config.message || ""
14
+ %h2 Pendings
15
+ - pendings.sort_by {|x| (Time.now - x[:commit][:at]) * (config.older_first ? -1 : 1) }.each do |pending|
16
+ %section
17
+ - if config.gravatar
18
+ .avatar{style: "float: left; width: 60px; margin-right: 12px;"}
19
+ %img{src: "http://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(pending[:commit][:email])}.png?s=120", width: 60, height: 60}
20
+ .right{style: "float: left; width: 80%;"}
21
+ %header{style: "width: 100%; background-color: #e9e7e6; border-radius: 5px; margin-top: 0px; margin-bottom: 10px; padding-top: 5px; padding-bottom: 5px; padding-left: 10px;"}
22
+ %h3{style: "font-size: 1.8em; margin-top: 0px; margin-bottom: 15px;"}&= pending[:example][:message]
23
+ .at
24
+ by #{pending[:commit][:name]},
25
+ %span.relative{style: pending[:allowed] ? '' : 'font-weight: bold;'}&= relative_time(pending[:commit][:at])
26
+ = " - "
27
+ %time&= pending[:commit][:at]
28
+ .parent
29
+ %strong In:
30
+ %span.monospace{style: "font-family: 'Inconsolata', 'Monaco', monospace;", style: "font-family: 'Inconsolata', 'Monaco', monospace;"}&= pending[:example][:parent]
31
+ .file
32
+ %strong File:
33
+ - if config.file_url
34
+ %a.monospace{href: config.file_url.gsub(/%file%/, pending[:example][:file]).gsub(/%line%/, pending[:example][:line].to_s), style: "font-family: 'Inconsolata', 'Monaco', monospace;"}&= "#{pending[:example][:file]}:#{pending[:example][:line]}"
35
+ - else
36
+ %span.monospace{style: "font-family: 'Inconsolata', 'Monaco', monospace;"}&= "#{pending[:example][:file]}:#{pending[:example][:line]}"
37
+ .commit
38
+ %strong Commit:
39
+ - if config.commit_url
40
+ %a.monospace{href: config.commit_url.gsub(/%commit%/, pending[:commit][:sha])}&= pending[:commit][:sha]
41
+ - else
42
+ %span.monospace{style: "font-family: 'Inconsolata', 'Monaco', monospace;"}&= pending[:commit][:sha]
43
+ &= " by #{pending[:commit][:name]}"
44
+ .clear{style: "clear: both; height: 28px;"}
45
+
@@ -0,0 +1,13 @@
1
+ require_relative '../reporter'
2
+
3
+ module Pendaxes
4
+ class Reporter
5
+ class Text < Reporter
6
+ def report
7
+ pendings.sort_by{|x| x[:commit][:at] - Time.now }.map {|pending|
8
+ "* #{pending[:example][:file]}:#{pending[:example][:line]} - #{pending[:example][:message]} (@ #{pending[:commit][:sha]} #{pending[:commit][:at]})"
9
+ }.join("\n")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module Pendaxes
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'defaults'
2
+ require 'hashr'
3
+
4
+ module Pendaxes
5
+ class Workspace
6
+ extend Defaults
7
+
8
+ def initialize(config={})
9
+ @config = Hashr.new(self.class.defaults.merge(config))
10
+ end
11
+
12
+ def clone
13
+ FileUtils.remove_entry_secure(path) if File.exist?(path)
14
+ git "clone", @config.repository, path
15
+ end
16
+
17
+ def update
18
+ clone unless File.exist?(path)
19
+
20
+ dive do
21
+ git "fetch", "origin"
22
+ git "reset", "--hard", @config.branch || "FETCH_HEAD"
23
+ end
24
+ end
25
+
26
+ def path; @config.path; end
27
+
28
+ def dive
29
+ Dir.chdir(path) do
30
+ yield
31
+ end
32
+ end
33
+
34
+ def git(*args)
35
+ str = IO.popen([@config.git || "git", *args], 'r', &:read)
36
+ $?.success? ? str : nil
37
+ end
38
+ end
39
+ end
data/lib/pendaxes.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "pendaxes/version"
2
+ require "pendaxes/command_line"
3
+
4
+ module Pendaxes
5
+ class << self
6
+ def run(*args)
7
+ CommandLine.new(*args).run
8
+ end
9
+ end
10
+ end
data/pendaxes.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'pendaxes/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "pendaxes"
8
+ gem.version = Pendaxes::VERSION
9
+ gem.authors = ["Shota Fukumori (sora_h)"]
10
+ gem.email = ["sorah@cookpad.com"]
11
+ gem.description = %q{Throw axes to pending makers!}
12
+ gem.summary = <<-EOS
13
+ Throw axes to pending makers! Leaving a pending long time is really bad,
14
+ shouldn't be happened.
15
+ So, this gem sends notification to committer that added pending after a while from the commit.
16
+
17
+ Avoid the trouble due to pending examples :D
18
+ EOS
19
+ gem.homepage = ""
20
+
21
+ gem.files = `git ls-files`.split($/)
22
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
23
+ gem.test_files = gem.files.grep(%r{^(test|spec|features|fixtures)/})
24
+ gem.require_paths = ["lib"]
25
+
26
+ gem.add_dependency 'hashr'
27
+ gem.add_dependency 'haml'
28
+ gem.add_dependency 'mail'
29
+ gem.add_development_dependency 'rspec'
30
+ gem.add_development_dependency 'rake'
31
+ gem.add_development_dependency 'simplecov'
32
+ end
@@ -0,0 +1,41 @@
1
+ require_relative './spec_helper'
2
+ require 'pendaxes/defaults'
3
+
4
+ describe Pendaxes::Defaults do
5
+ subject { Class.new { extend Pendaxes::Defaults } }
6
+
7
+ describe "#defaults" do
8
+ context "with no argument" do
9
+ it "returns current defaults" do
10
+ subject.defaults.should == {}
11
+ end
12
+ end
13
+
14
+ context "with argument" do
15
+ it "sets defaults" do
16
+ subject.defaults :a => :b
17
+ subject.defaults.should == {:a => :b}
18
+ end
19
+ end
20
+
21
+ context "with superclass" do
22
+ let(:superclass) { Class.new { extend Pendaxes::Defaults }.tap{|klass| klass.defaults :a => :b } }
23
+ subject { Class.new(superclass) { extend Pendaxes::Defaults } }
24
+
25
+ context "without argument (first time)" do
26
+ it "returns superclass' default" do
27
+ subject.defaults.should == {:a => :b}
28
+ end
29
+ end
30
+
31
+ context "with argument" do
32
+ it "merges into superclass' defaults" do
33
+ subject.defaults :b => :c
34
+ subject.defaults.should == {:a => :b, :b => :c}
35
+ subject.defaults :b => :d
36
+ subject.defaults.should == {:a => :b, :b => :d}
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,12 @@
1
+ require_relative './spec_helper'
2
+ require 'pendaxes/detector'
3
+
4
+ describe Pendaxes::Detector do
5
+ it "has included Defaults" do
6
+ described_class.singleton_class.included_modules.include?(Pendaxes::Defaults).should be_true
7
+ end
8
+
9
+ it "responds to #detect" do
10
+ described_class.new(Pendaxes::Workspace.new).should be_respond_to(:detect)
11
+ end
12
+ end
@@ -0,0 +1,75 @@
1
+ require_relative '../spec_helper'
2
+ require 'pendaxes/detectors/rspec'
3
+ require 'pendaxes/workspace'
4
+ require 'time'
5
+
6
+ describe Pendaxes::Detector::RSpec do
7
+ it "has Pendaxes::Detector as superclass" do
8
+ described_class.superclass.should == Pendaxes::Detector
9
+ end
10
+
11
+ describe "#detect" do
12
+ before do
13
+ Time.stub(now: Time.at(1348214400))
14
+ end
15
+
16
+ let(:repository) { File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'repo')) }
17
+ let(:workspace) { Pendaxes::Workspace.new(repository: repository, path: repository) }
18
+ let(:config) { {} }
19
+ subject { described_class.new(workspace, config) }
20
+
21
+ it "detects pendings in all files" do
22
+ pendings = subject.detect
23
+ pendings.size.should == 3
24
+
25
+ xit = pendings.find {|pend| /xit/ === pend[:example][:message] }
26
+ it_a = pendings.find {|pend| /pending$/ === pend[:example][:message] && pend[:example][:file] == "spec/a_spec.rb" }
27
+ it_c = pendings.find {|pend| pend[:example][:file] == "spec/b/c_spec.rb" }
28
+ # require 'pp'; pp pendings
29
+
30
+ xit.should == {
31
+ example: {file: "spec/a_spec.rb", line: 9,
32
+ message: 'xit "d" do', parent: 'context "c" do'},
33
+ commit: {sha: '371955e233bf1ff42d0c7cca3510ec0f8d71ec8d',
34
+ name: 'Shota Fukumori', email: 'sorah@cookpad.com',
35
+ at: Time.parse('2012-09-21 16:44:13 +0900')},
36
+ allowed: true
37
+ }
38
+ it_a.should == {
39
+ example: {file: "spec/a_spec.rb", line: 4,
40
+ message: 'pending', parent: 'it "a" do'},
41
+ commit: {sha: '642caa033642700cd9d4c6f026fe73282985ed50',
42
+ name: 'Shota Fukumori', email: 'sorah@cookpad.com',
43
+ at: Time.parse('Thu, 7 Apr 2005 22:13:13 +0900')},
44
+ allowed: false
45
+ }
46
+ it_c.should == {
47
+ example: {file: "spec/b/c_spec.rb", line: 3,
48
+ message: 'pending', parent: 'it "d" do'},
49
+ commit: {sha: '49499865388dcbce14be3a8b7eca841538b29496',
50
+ name: 'Shota Fukumori', email: 'sorah@cookpad.com',
51
+ at: Time.parse('Fri, 21 Sep 2012 16:43:43 +0900')},
52
+ allowed: true
53
+ }
54
+ end
55
+
56
+ context "with config.allowed_for" do
57
+ let(:config) { {allowed_for: 0} }
58
+
59
+ it "marks pending as not allowed if committed after than :allowed_for" do
60
+ subject.detect.all? {|pending| !pending[:allowed] }.should be_true
61
+ end
62
+ end
63
+
64
+ context "with :pattern" do
65
+ let(:config) { {pattern: '*_test.rb'} }
66
+
67
+ it "uses that as file pattern for git-grep" do
68
+ pendings = subject.detect
69
+
70
+ pendings.size.should == 1
71
+ pendings.first[:example][:file].should match(/d_test\.rb$/)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,62 @@
1
+ require_relative './spec_helper'
2
+ require 'pendaxes/finder'
3
+
4
+ describe Pendaxes::Finder do
5
+ subject { Class.new { extend Pendaxes::Finder } }
6
+
7
+ describe ".find" do
8
+ let(:klass) { Class.new(subject) }
9
+
10
+ context "with String" do
11
+ it 'requires that' do
12
+ subject.should_receive(:require).with("foo/bar/baz")
13
+
14
+ subject.find('foo/bar/baz')
15
+ end
16
+ end
17
+
18
+ context "with Symbol" do
19
+ it 'requires that' do
20
+ subject.should_receive(:require).with("foo")
21
+ subject.find(:foo)
22
+ end
23
+ end
24
+
25
+ it "requires file and return included ancestor" do
26
+ subject.should_receive(:require).with("foo") do
27
+ klass; true
28
+ end
29
+ subject.find(:foo).should == klass
30
+ end
31
+
32
+ context "on second time" do
33
+ it "requires once" do
34
+ subject.should_receive(:require).with("foo").once do
35
+ klass; true
36
+ end
37
+ subject.find(:foo).should == klass
38
+ subject.find(:foo).should == klass
39
+ end
40
+ end
41
+
42
+ context "with not Symbol or String" do
43
+ it "raises ArgumentError" do
44
+ expect { subject.find(Object.new) }.to raise_error(ArgumentError)
45
+ end
46
+ end
47
+ end
48
+
49
+ describe ".find_in" do
50
+ subject do
51
+ Class.new do
52
+ extend Pendaxes::Finder
53
+ find_in "hoge"
54
+ end
55
+ end
56
+
57
+ it 'makes Finder.find(Symbol) to use as prefix for require' do
58
+ subject.should_receive(:require).with("hoge/foo")
59
+ subject.find(:foo)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,41 @@
1
+ require_relative './spec_helper'
2
+ require 'pendaxes/notificator'
3
+ require 'pendaxes/reporter'
4
+
5
+ describe Pendaxes::Notificator do
6
+ it "has included Defaults" do
7
+ described_class.singleton_class.included_modules.include?(Pendaxes::Defaults).should be_true
8
+ end
9
+
10
+ it "has included PendingManager" do
11
+ described_class.included_modules.include?(Pendaxes::PendingManager).should be_true
12
+ end
13
+
14
+ it "responds to #notify" do
15
+ described_class.new.should be_respond_to(:notify)
16
+ end
17
+
18
+ describe "#report_for" do
19
+ let(:reporter) do
20
+ Class.new(Pendaxes::Reporter) do
21
+ def report
22
+ [@config, @pendings]
23
+ end
24
+ end
25
+ end
26
+
27
+ let(:fixture) do
28
+ [{commit: {:sha => 'a'}, example: {:file => 'a'}, allowed: true}, {commit: {:sha => 'b'}, example: {:file => 'b'}, allowed: false}]
29
+ end
30
+
31
+ before do
32
+ Pendaxes::Reporter.announce(:report_for, reporter)
33
+ end
34
+
35
+ subject { described_class.new(reporter: {use: :report_for, foo: :bar}) }
36
+
37
+ it "returns report using reporter specified by config" do
38
+ subject.report_for(fixture).should == [{use: :report_for, foo: :bar, include_allowed: true}, fixture]
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,184 @@
1
+ require_relative '../spec_helper'
2
+ require 'pendaxes/notificators/mail'
3
+ require 'pendaxes/reporter'
4
+ require 'mail'
5
+
6
+ Mail.defaults do
7
+ delivery_method :test
8
+ end
9
+
10
+ class TestReporter < Pendaxes::Reporter
11
+ def report
12
+ "Test reporting: #{pendings.inspect}"
13
+ end
14
+ end
15
+
16
+ class TestHtmlReporter < TestReporter
17
+ def self.html?; true; end
18
+ end
19
+
20
+
21
+ describe Pendaxes::Notificator::Mail do
22
+ before(:all) do
23
+ Pendaxes::Reporter.announce :test_reporter, TestReporter
24
+ Pendaxes::Reporter.announce :test_html_reporter, TestHtmlReporter
25
+ end
26
+
27
+ let(:pendings) do
28
+ [{
29
+ example: {file: "spec/a_spec.rb", line: 9,
30
+ message: 'xit "d" do', parent: 'context "c" do'},
31
+ commit: {sha: '371955e233bf1ff42d0c7cca3510ec0f8d71ec8d',
32
+ name: 'Shota Fukumori', email: 'sorah@cookpad.com',
33
+ at: Time.parse('2012-09-21 16:44:13 +0900')},
34
+ allowed: true
35
+ },
36
+ {
37
+ example: {file: "spec/a_spec.rb", line: 4,
38
+ message: 'pending', parent: 'it "a" do'},
39
+ commit: {sha: '642caa033642700cd9d4c6f026fe73282985ed50',
40
+ name: 'Shota Fukumori', email: 'sorah@cookpad.com',
41
+ at: Time.parse('Thu, 7 Apr 2005 22:13:13 +0900')},
42
+ allowed: false
43
+ },
44
+ {
45
+ example: {file: "spec/b/c_spec.rb", line: 3,
46
+ message: 'pending', parent: 'it "d" do'},
47
+ commit: {sha: '49499865388dcbce14be3a8b7eca841538b29496',
48
+ name: 'Shohta Fukumori', email: 'sorah+b@cookpad.com',
49
+ at: Time.parse('Fri, 21 Sep 2012 16:43:43 +0900')},
50
+ allowed: true
51
+ }]
52
+ end
53
+
54
+ it "has Pendaxes::Notificator as superclass" do
55
+ described_class.superclass.should == Pendaxes::Notificator
56
+ end
57
+
58
+ describe "#notify" do
59
+ include Mail::Matchers
60
+ let(:config_root) { {reporter: {use: :test_reporter}, from: "sorah+from@cookpad.com", include_allowed: true} }
61
+ let(:config) { config_root }
62
+ let(:deliveries) { Mail::TestMailer.deliveries }
63
+ subject { described_class.new(config) }
64
+ before { subject.add(pendings) }
65
+ after { Mail::TestMailer.deliveries.clear }
66
+
67
+ it "sends mails for each committers" do
68
+ subject.notify
69
+
70
+ deliveries.size.should == 2
71
+ should have_sent_email.from('sorah+from@cookpad.com')
72
+ should have_sent_email.to('sorah@cookpad.com')
73
+ should have_sent_email.to('sorah+b@cookpad.com')
74
+ end
75
+
76
+ it "uses report as body of mail" do
77
+ subject.notify
78
+
79
+ %w(sorah@cookpad.com sorah+b@cookpad.com).each do |email|
80
+ delivery = deliveries.find {|deliver| deliver.to.include? email }
81
+ delivery.body.should == "Test reporting: #{pendings.select {|pending| pending[:commit][:email] == email}.inspect}"
82
+ end
83
+ end
84
+
85
+ context "with :delivery_method" do
86
+ let(:config) { config_root.merge(delivery_method: :test, delivery_options: {foo: :bar}) }
87
+
88
+ it "uses that as delivery_method" do
89
+ method = Mail.new.delivery_method
90
+ Mail::Message.any_instance.should_receive(:delivery_method).with(:test, foo: :bar).at_least(:once)
91
+ exception = Exception.new
92
+ Mail::Message.any_instance.stub(:deliver) { raise exception }
93
+
94
+ expect { subject.notify }.to raise_error(exception)
95
+ end
96
+ end
97
+
98
+ context "with :to" do
99
+ let(:config) { config_root.merge(to: 'sorah+c@cookpad.com') }
100
+
101
+ it "sends all mails to that" do
102
+ subject.notify
103
+
104
+ deliveries.size.should == 1
105
+ should have_sent_email.to('sorah+c@cookpad.com')
106
+ deliveries.first.body.should == "Test reporting: #{pendings.inspect}"
107
+ end
108
+ end
109
+
110
+ context "with :whitelist" do
111
+ let(:config) { config_root.merge(whitelist: ['sorah@cookpad.com']) }
112
+
113
+ it "won't send mail to addresses don't match" do
114
+ subject.notify
115
+
116
+ deliveries.size.should == 1
117
+ should_not have_sent_email.to('sorah+b@cookpad.com')
118
+ should have_sent_email.to('sorah@cookpad.com')
119
+ end
120
+
121
+ context "regex" do
122
+ let(:config) { config_root.merge(whitelist: ['/^sorah@/']) }
123
+
124
+ it "parses as Regexp" do
125
+ subject.notify
126
+
127
+ deliveries.size.should == 1
128
+ should_not have_sent_email.to('sorah+b@cookpad.com')
129
+ should have_sent_email.to('sorah@cookpad.com')
130
+ end
131
+ end
132
+ end
133
+
134
+ context "with :blacklist" do
135
+ let(:config) { config_root.merge(blacklist: ['sorah+b@cookpad.com']) }
136
+
137
+ it "won't send mail to addresses that match" do
138
+ subject.notify
139
+
140
+ deliveries.size.should == 1
141
+ should_not have_sent_email.to('sorah+b@cookpad.com')
142
+ should have_sent_email.to('sorah@cookpad.com')
143
+ end
144
+
145
+ context "regex" do
146
+ let(:config) { config_root.merge(blacklist: ['/^sorah\+/']) }
147
+
148
+ it "parses as Regexp" do
149
+ subject.notify
150
+
151
+ deliveries.size.should == 1
152
+ should_not have_sent_email.to('sorah+b@cookpad.com')
153
+ should have_sent_email.to('sorah@cookpad.com')
154
+ end
155
+ end
156
+ end
157
+
158
+ context "with :whitelist & :blacklist" do
159
+ let(:config) { config_root.merge(whitelist: [/@cookpad\.com$/], blacklist: ['sorah+b@cookpad.com']) }
160
+
161
+ it "prefers blacklist first" do
162
+ subject.notify
163
+
164
+ deliveries.size.should == 1
165
+ should_not have_sent_email.to('sorah+b@cookpad.com')
166
+ should have_sent_email.to('sorah@cookpad.com')
167
+ end
168
+ end
169
+
170
+ context "when reporter's html is false" do
171
+ it "sends mail as plain text" do
172
+ deliveries.all? {|delivery| delivery.content_type == nil }.should be_true
173
+ end
174
+ end
175
+
176
+ context "when reporter's html is true" do
177
+ let(:config) { {reporter: {use: :test_html_reporter} } }
178
+
179
+ it "sends mail as text/html" do
180
+ deliveries.all? {|delivery| delivery.content_type == 'text/html; charset=utf-8' }.should be_true
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,67 @@
1
+ require_relative '../spec_helper'
2
+ require 'pendaxes/notificators/terminal'
3
+ require 'stringio'
4
+
5
+ describe Pendaxes::Notificator::Terminal do
6
+ it "has Pendaxes::Notificator as superclass" do
7
+ described_class.superclass.should == Pendaxes::Notificator
8
+ end
9
+
10
+ describe "#notify" do
11
+ let(:io) { StringIO.new }
12
+ let(:config) { {to: io} }
13
+ let(:now) { Time.now }
14
+ let(:fixture) do
15
+ [
16
+ {commit: {sha: 'a', name: 'foo', email: 'foo@example.com', at: (now-86400)},
17
+ example: {file: 'a_spec.rb', line: 10, message: "pending 'because it fails'"}, allowed: true},
18
+ {commit: {sha: 'b', name: 'foo', email: 'foo@example.com', at: (now-864000)},
19
+ example: {file: 'a_spec.rb', line: 15, message: "pending 'because it fails.'"}, allowed: false},
20
+ {commit: {sha: 'c', name: 'bar', email: 'bar@example.com', at: (now-86400)},
21
+ example: {file: 'a_spec.rb', line: 20, message: "pending 'because it fails..'"}, allowed: true},
22
+ {commit: {sha: 'd', name: 'bar', email: 'bar@example.com', at: (now-864000)},
23
+ example: {file: 'a_spec.rb', line: 25, message: "pending 'because it fails...'"}, allowed: false},
24
+ ]
25
+ end
26
+
27
+ subject { described_class.new(config) }
28
+
29
+ before do
30
+ subject.add(fixture)
31
+ subject.notify
32
+ end
33
+
34
+ it "notifies into terminal" do
35
+ out = io.string
36
+ out.should == <<-EOF
37
+ foo <foo@example.com>:
38
+
39
+ * a_spec.rb:15 - pending 'because it fails.' (@ b #{now-864000})
40
+
41
+ bar <bar@example.com>:
42
+
43
+ * a_spec.rb:25 - pending 'because it fails...' (@ d #{now-864000})
44
+
45
+ EOF
46
+ end
47
+
48
+ context "with :include_allowed" do
49
+ let(:config) { {to: io, include_allowed: true} }
50
+ it "notifies all into terminal" do
51
+ out = io.string
52
+ out.should == <<-EOF
53
+ foo <foo@example.com>:
54
+
55
+ * a_spec.rb:15 - pending 'because it fails.' (@ b #{now-864000})
56
+ * a_spec.rb:10 - pending 'because it fails' (@ a #{now-86400})
57
+
58
+ bar <bar@example.com>:
59
+
60
+ * a_spec.rb:25 - pending 'because it fails...' (@ d #{now-864000})
61
+ * a_spec.rb:20 - pending 'because it fails..' (@ c #{now-86400})
62
+
63
+ EOF
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,7 @@
1
+ require_relative './spec_helper'
2
+ require 'pendaxes'
3
+
4
+ describe Pendaxes do
5
+ describe ".run" do
6
+ end
7
+ end