pendaxes 0.1.0 → 0.2.0
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/bin/pendaxes-oneshot +17 -0
- data/lib/pendaxes.rb +4 -0
- data/lib/pendaxes/command_line.rb +74 -1
- data/lib/pendaxes/notificators/growth_forecast.rb +29 -0
- data/lib/pendaxes/notificators/terminal.rb +1 -6
- data/lib/pendaxes/reporters/json.rb +12 -0
- data/lib/pendaxes/reporters/text.rb +7 -3
- data/lib/pendaxes/version.rb +1 -1
- data/spec/notificators/terminal_spec.rb +0 -2
- data/spec/reporters/json_spec.rb +32 -0
- data/spec/reporters/text_spec.rb +2 -0
- metadata +11 -5
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# coding: utf-8
|
3
|
+
|
4
|
+
retried = false
|
5
|
+
begin
|
6
|
+
require 'pendaxes'
|
7
|
+
rescue LoadError
|
8
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
9
|
+
if retried
|
10
|
+
raise
|
11
|
+
else
|
12
|
+
retried = true
|
13
|
+
retry
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
exit Pendaxes.oneshot_run(*ARGV)
|
data/lib/pendaxes.rb
CHANGED
@@ -4,13 +4,14 @@ require_relative "./detector"
|
|
4
4
|
require_relative "./reporter"
|
5
5
|
require_relative "./notificator"
|
6
6
|
require 'yaml'
|
7
|
+
require 'optparse'
|
7
8
|
|
8
9
|
module Pendaxes
|
9
10
|
class CommandLine
|
10
11
|
DEFAULT_CONFIG_FILE = ".pendaxes.yml"
|
11
12
|
|
12
13
|
def initialize(*args)
|
13
|
-
@args = args
|
14
|
+
@args = args.dup
|
14
15
|
@config = nil
|
15
16
|
end
|
16
17
|
|
@@ -187,5 +188,77 @@ Usage:
|
|
187
188
|
|
188
189
|
0
|
189
190
|
end
|
191
|
+
|
192
|
+
class Oneshot
|
193
|
+
def initialize(*args)
|
194
|
+
@args = args
|
195
|
+
end
|
196
|
+
|
197
|
+
def run
|
198
|
+
quiet = false
|
199
|
+
path = Dir.pwd
|
200
|
+
reporter = :text
|
201
|
+
|
202
|
+
OptionParser.new do |opts|
|
203
|
+
opts.on('-q', '--quiet', 'Turn off progress output.') do
|
204
|
+
quiet = true
|
205
|
+
end
|
206
|
+
|
207
|
+
opts.on('-d DIR', '--repo DIR', 'Specify path to working copy of git.') do |dir|
|
208
|
+
path = dir
|
209
|
+
end
|
210
|
+
|
211
|
+
opts.on('-r REPORTER', '--reporter REPORTER', 'Specify reporter') do |name|
|
212
|
+
reporter = name.to_sym
|
213
|
+
end
|
214
|
+
|
215
|
+
opts.on_tail('--help', 'Show this help') do
|
216
|
+
return usage
|
217
|
+
end
|
218
|
+
end.parse!(@args)
|
219
|
+
|
220
|
+
files = @args.map { |pattern|
|
221
|
+
Dir[pattern].map do |file_or_directory|
|
222
|
+
if FileTest.file?(file_or_directory)
|
223
|
+
file_or_directory
|
224
|
+
elsif FileTest.directory?(file_or_directory)
|
225
|
+
Dir[File.join(file_or_directory, '**', '*_spec.rb')]
|
226
|
+
else
|
227
|
+
abort "#{$0}: #{file_or_directory}: No such file or directory"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
}.flatten
|
231
|
+
|
232
|
+
workspace = Workspace.new(path: path)
|
233
|
+
$stderr.puts '=> Detecting...' unless quiet
|
234
|
+
pendings = Detector.find(:rspec).new(workspace, out: quiet ? nil : $stderr).detect
|
235
|
+
$stderr.puts '=> Total Result:' unless quiet
|
236
|
+
|
237
|
+
notificator = Notificator.find(:terminal).new(
|
238
|
+
out: $stdout,
|
239
|
+
reporter: {use: reporter}
|
240
|
+
)
|
241
|
+
notificator.add pendings
|
242
|
+
notificator.notify
|
243
|
+
|
244
|
+
0
|
245
|
+
end
|
246
|
+
|
247
|
+
def usage
|
248
|
+
$stderr.puts "Usage: pendaxes-oneshot [--help] [-q|--quiet] [-d DIR|--repo=DIR] [-r REPORTER|--reporter REPORTER] file_or_directory [file_or_directory ...]"
|
249
|
+
$stderr.puts ""
|
250
|
+
$stderr.puts "file_or_directory:"
|
251
|
+
$stderr.puts " File name, pattern or directory name to detect pendings."
|
252
|
+
$stderr.puts " if directory name given, will use *_spec.rb files in that directory (recursive)."
|
253
|
+
$stderr.puts ""
|
254
|
+
$stderr.puts " NOTE: Files should be managed by git."
|
255
|
+
$stderr.puts ""
|
256
|
+
$stderr.puts "--help: Show this help and quit."
|
257
|
+
$stderr.puts "--quiet, -q: Turn off progress output."
|
258
|
+
$stderr.puts "--repo, -d: Specify path to working copy of git repository. (default: current directory)"
|
259
|
+
$stderr.puts "--reporter, -r: Specify reporter. (Default: text)"
|
260
|
+
0
|
261
|
+
end
|
262
|
+
end
|
190
263
|
end
|
191
264
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative '../notificator'
|
2
|
+
require 'uri'
|
3
|
+
require 'net/http'
|
4
|
+
|
5
|
+
module Pendaxes
|
6
|
+
class Notificator
|
7
|
+
class GrowthForecast < Notificator
|
8
|
+
defaults service_name: 'pendaxes',
|
9
|
+
section_name: 'pendaxes',
|
10
|
+
graph_name: 'pendaxes'
|
11
|
+
|
12
|
+
def notify
|
13
|
+
post_growth_forecast @config.service_name,
|
14
|
+
@config.section_name,
|
15
|
+
@config.graph_name,
|
16
|
+
@pendings.size
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def post_growth_forecast(service_name, section_name, graph_name, number, options = {})
|
22
|
+
if @config.host
|
23
|
+
uri = URI.parse("http://#{@config.host}/api/#{service_name}/#{section_name}/#{graph_name}")
|
24
|
+
Net::HTTP.post_form(uri, options.merge(:number => number))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -7,12 +7,7 @@ module Pendaxes
|
|
7
7
|
|
8
8
|
def notify
|
9
9
|
io = @config.to
|
10
|
-
|
11
|
-
io.puts "#{name}:"
|
12
|
-
io.puts
|
13
|
-
io.puts report_for(pends)
|
14
|
-
io.puts
|
15
|
-
end
|
10
|
+
io.puts report_for(pendings)
|
16
11
|
end
|
17
12
|
end
|
18
13
|
end
|
@@ -4,9 +4,13 @@ module Pendaxes
|
|
4
4
|
class Reporter
|
5
5
|
class Text < Reporter
|
6
6
|
def report
|
7
|
-
pendings.
|
8
|
-
|
9
|
-
|
7
|
+
pendings.group_by{|x| "#{x[:commit][:name]} <#{x[:commit][:email]}>" }.map do |name, pends|
|
8
|
+
lines = pends.sort_by { |pending| pending[:commit][:at] }.map do |pending|
|
9
|
+
"* #{pending[:example][:file]}:#{pending[:example][:line]} - #{pending[:example][:message]} (@ #{pending[:commit][:sha]} #{pending[:commit][:at]})"
|
10
|
+
end.join("\n")
|
11
|
+
|
12
|
+
"#{name}:\n\n#{lines}"
|
13
|
+
end.join("\n\n")
|
10
14
|
end
|
11
15
|
end
|
12
16
|
end
|
data/lib/pendaxes/version.rb
CHANGED
@@ -41,7 +41,6 @@ foo <foo@example.com>:
|
|
41
41
|
bar <bar@example.com>:
|
42
42
|
|
43
43
|
* a_spec.rb:25 - pending 'because it fails...' (@ d #{now-864000})
|
44
|
-
|
45
44
|
EOF
|
46
45
|
end
|
47
46
|
|
@@ -59,7 +58,6 @@ bar <bar@example.com>:
|
|
59
58
|
|
60
59
|
* a_spec.rb:25 - pending 'because it fails...' (@ d #{now-864000})
|
61
60
|
* a_spec.rb:20 - pending 'because it fails..' (@ c #{now-86400})
|
62
|
-
|
63
61
|
EOF
|
64
62
|
end
|
65
63
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
require 'json'
|
3
|
+
require 'pendaxes/reporters/json'
|
4
|
+
|
5
|
+
describe Pendaxes::Reporter::JSON do
|
6
|
+
it "has Pendaxes::Reporter as superclass" do
|
7
|
+
described_class.superclass.should == Pendaxes::Reporter
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#report" do
|
11
|
+
subject { described_class.new }
|
12
|
+
let!(:now) { Time.now }
|
13
|
+
|
14
|
+
let(:pends) 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
|
+
]
|
21
|
+
end
|
22
|
+
|
23
|
+
before do
|
24
|
+
subject.add(pends)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "reports in JSON" do
|
28
|
+
subject.report.should == \
|
29
|
+
{pendings: pends.sort_by { |_| _[:commit][:at] }}.to_json
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/spec/reporters/text_spec.rb
CHANGED
@@ -26,6 +26,8 @@ describe Pendaxes::Reporter::Text do
|
|
26
26
|
|
27
27
|
it "reports older pending first" do
|
28
28
|
subject.report.should == (<<-EOR).chomp
|
29
|
+
foo <foo@example.com>:
|
30
|
+
|
29
31
|
* a_spec.rb:15 - pending 'because it fails.' (@ b #{now-864000})
|
30
32
|
* a_spec.rb:10 - pending 'because it fails' (@ a #{now-86400})
|
31
33
|
EOR
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pendaxes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
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:
|
12
|
+
date: 2013-01-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: hashr
|
@@ -112,6 +112,7 @@ email:
|
|
112
112
|
- sorah@cookpad.com
|
113
113
|
executables:
|
114
114
|
- pendaxes
|
115
|
+
- pendaxes-oneshot
|
115
116
|
extensions: []
|
116
117
|
extra_rdoc_files: []
|
117
118
|
files:
|
@@ -122,6 +123,7 @@ files:
|
|
122
123
|
- README.md
|
123
124
|
- Rakefile
|
124
125
|
- bin/pendaxes
|
126
|
+
- bin/pendaxes-oneshot
|
125
127
|
- fixtures/repo.tar.gz
|
126
128
|
- lib/pendaxes.rb
|
127
129
|
- lib/pendaxes/command_line.rb
|
@@ -132,11 +134,13 @@ files:
|
|
132
134
|
- lib/pendaxes/finder.rb
|
133
135
|
- lib/pendaxes/notificator.rb
|
134
136
|
- lib/pendaxes/notificators/file.rb
|
137
|
+
- lib/pendaxes/notificators/growth_forecast.rb
|
135
138
|
- lib/pendaxes/notificators/mail.rb
|
136
139
|
- lib/pendaxes/notificators/terminal.rb
|
137
140
|
- lib/pendaxes/pending_manager.rb
|
138
141
|
- lib/pendaxes/reporter.rb
|
139
142
|
- lib/pendaxes/reporters/haml.rb
|
143
|
+
- lib/pendaxes/reporters/json.rb
|
140
144
|
- lib/pendaxes/reporters/template.haml
|
141
145
|
- lib/pendaxes/reporters/text.rb
|
142
146
|
- lib/pendaxes/version.rb
|
@@ -152,6 +156,7 @@ files:
|
|
152
156
|
- spec/pendaxes_spec.rb
|
153
157
|
- spec/pending_manager_spec.rb
|
154
158
|
- spec/reporter_spec.rb
|
159
|
+
- spec/reporters/json_spec.rb
|
155
160
|
- spec/reporters/text_spec.rb
|
156
161
|
- spec/spec_helper.rb
|
157
162
|
- spec/workspace_spec.rb
|
@@ -169,7 +174,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
169
174
|
version: '0'
|
170
175
|
segments:
|
171
176
|
- 0
|
172
|
-
hash: -
|
177
|
+
hash: -175182318362856480
|
173
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
179
|
none: false
|
175
180
|
requirements:
|
@@ -178,10 +183,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
183
|
version: '0'
|
179
184
|
segments:
|
180
185
|
- 0
|
181
|
-
hash: -
|
186
|
+
hash: -175182318362856480
|
182
187
|
requirements: []
|
183
188
|
rubyforge_project:
|
184
|
-
rubygems_version: 1.8.
|
189
|
+
rubygems_version: 1.8.24
|
185
190
|
signing_key:
|
186
191
|
specification_version: 3
|
187
192
|
summary: Throw axes to pending makers! Leaving a pending long time is really bad,
|
@@ -199,6 +204,7 @@ test_files:
|
|
199
204
|
- spec/pendaxes_spec.rb
|
200
205
|
- spec/pending_manager_spec.rb
|
201
206
|
- spec/reporter_spec.rb
|
207
|
+
- spec/reporters/json_spec.rb
|
202
208
|
- spec/reporters/text_spec.rb
|
203
209
|
- spec/spec_helper.rb
|
204
210
|
- spec/workspace_spec.rb
|