startling 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/bin/wip +9 -0
- data/lib/generators/startling/configuration_generator.rb +4 -4
- data/lib/startling/command.rb +27 -27
- data/lib/startling/commands/check_wip.rb +30 -0
- data/lib/startling/commands/create_branch.rb +1 -1
- data/lib/startling/configuration.rb +4 -2
- data/lib/startling/github/pull_request.rb +4 -1
- data/lib/startling/time_format_helpers.rb +48 -0
- data/lib/startling/version.rb +1 -1
- data/lib/startling/work.rb +47 -0
- data/lib/startling/work_printer.rb +53 -0
- data/spec/startling/command_spec.rb +85 -0
- data/spec/startling/commands/create_branch_spec.rb +2 -2
- data/spec/startling/configuration_spec.rb +65 -3
- data/spec/startling/github/pull_request_spec.rb +30 -18
- data/spec/startling/time_format_helpers_spec.rb +42 -0
- data/spec/startling_spec.rb +4 -4
- data/spec/support/vcr.rb +0 -3
- data/startling.gemspec +1 -1
- metadata +14 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b26b3cd09c416dd020682a1731d63bcf931d8c56
|
4
|
+
data.tar.gz: bd084e7429476ee0fee565fc0f74701875727f04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccda655ad497e3ab4b4ef1fb944cdc30e3dc1ccd8ab7a145002280e2040b42633e4ad17266c9b28c49e4c029d9f5d058258aa8b20bf993382c62d65c11784d40
|
7
|
+
data.tar.gz: 70f5f05b33ea24147babfc561eabfc5e5d2e1ca05db3c4ef630ba4095be2318782fb8824c4ef81cbac6a76ce3fa7a417a1c6457f386d4339921dd431685f9934
|
data/README.md
CHANGED
@@ -28,11 +28,11 @@ Startling.configure do |config|
|
|
28
28
|
# WIP Limit
|
29
29
|
# config.wip_limit = 4
|
30
30
|
|
31
|
-
#
|
32
|
-
# config.
|
31
|
+
# Labels for WIP pull requests
|
32
|
+
# config.wip_labels = ["WIP", "REVIEW"]
|
33
33
|
|
34
|
-
#
|
35
|
-
# config.
|
34
|
+
# Repos to check against for WIP limit
|
35
|
+
# config.repos << "substantial/startling"
|
36
36
|
|
37
37
|
# Commands to be run before a story is stared
|
38
38
|
# config.hook_commands.before_story_start = [:check_wip]
|
data/bin/wip
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/startling'
|
4
|
+
require_relative '../lib/startling/work'
|
5
|
+
require_relative '../lib/startling/work_printer'
|
6
|
+
|
7
|
+
Startling::Configuration.load_configuration
|
8
|
+
wip = Startling::Work.in_progress
|
9
|
+
Startling::WorkPrinter.new.print wip
|
@@ -25,11 +25,11 @@ Startling.configure do |config|
|
|
25
25
|
# WIP Limit
|
26
26
|
# config.wip_limit = 4
|
27
27
|
|
28
|
-
#
|
29
|
-
# config.
|
28
|
+
# Labels for WIP pull requests
|
29
|
+
# config.wip_labels = ["WIP", "REVIEW"]
|
30
30
|
|
31
|
-
#
|
32
|
-
# config.
|
31
|
+
# Repos to check against for WIP limit
|
32
|
+
# config.repos << "substantial/startling"
|
33
33
|
|
34
34
|
# Commands to be run before a story is stared
|
35
35
|
# config.hook_commands.before_story_start = [:check_wip]
|
data/lib/startling/command.rb
CHANGED
@@ -23,45 +23,45 @@ module Startling
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def execute
|
26
|
-
Commands::CheckForLocalMods.run(git: git)
|
27
26
|
command_args = cli_options.merge(git: git)
|
28
27
|
|
29
|
-
|
30
|
-
|
28
|
+
check_for_local_mods
|
29
|
+
|
30
|
+
run_hook_commands(hook: :before_story_start, command_args: command_args)
|
31
|
+
start_story(command_args)
|
32
|
+
run_hook_commands(hook: :after_story_start, command_args: command_args)
|
33
|
+
|
34
|
+
run_hook_commands(hook: :before_pull_request, command_args: command_args)
|
35
|
+
create_pull_request(command_args)
|
36
|
+
run_hook_commands(hook: :after_pull_request, command_args: command_args)
|
37
|
+
end
|
38
|
+
|
39
|
+
def git
|
40
|
+
@git ||= GitLocal.new
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def check_for_local_mods
|
46
|
+
Commands::CheckForLocalMods.run(git: git)
|
47
|
+
end
|
48
|
+
|
49
|
+
def run_hook_commands(hook:, command_args:)
|
50
|
+
Startling.hook_commands.send(hook).map do |command|
|
31
51
|
command_class(command).send(RUN, command_args)
|
32
52
|
end
|
53
|
+
end
|
33
54
|
|
34
|
-
|
55
|
+
def start_story(command_args)
|
35
56
|
story = command_class(Startling.story_handler)
|
36
57
|
.send(RUN, command_args) if Startling.story_handler
|
37
58
|
command_args.merge!(story: story)
|
59
|
+
end
|
38
60
|
|
39
|
-
|
40
|
-
Startling.hook_commands.after_story_start.map do |command|
|
41
|
-
command_class(command)
|
42
|
-
.send(RUN, command_args)
|
43
|
-
end
|
44
|
-
|
45
|
-
#Before Pull Request Creation
|
46
|
-
Startling.hook_commands.before_pull_request.map do |command|
|
47
|
-
command_class(command)
|
48
|
-
.send(RUN, command_args)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Create pull request
|
61
|
+
def create_pull_request(command_args)
|
52
62
|
pull_request = command_class(:create_pull_request)
|
53
63
|
.send(RUN, command_args)
|
54
64
|
command_args.merge!(pull_request: pull_request)
|
55
|
-
|
56
|
-
# After Pull Request Creation
|
57
|
-
Startling.hook_commands.after_pull_request.map do |command|
|
58
|
-
command_class(command)
|
59
|
-
.send(RUN, command_args)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def git
|
64
|
-
@git ||= GitLocal.new
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
require_relative 'base'
|
3
|
+
require_relative '../colorize_string'
|
4
|
+
require_relative '../work'
|
5
|
+
require_relative '../work_printer'
|
6
|
+
|
7
|
+
module Startling
|
8
|
+
module Commands
|
9
|
+
class CheckWip < Base
|
10
|
+
using ColorizeString
|
11
|
+
|
12
|
+
def execute
|
13
|
+
puts "Checking WIP..."
|
14
|
+
wip = Work.in_progress
|
15
|
+
if wip.count >= Startling.wip_limit
|
16
|
+
WorkPrinter.new.print wip
|
17
|
+
puts
|
18
|
+
question = [
|
19
|
+
"Would you like to start anyway (",
|
20
|
+
'anything but "yes" will abort'.underline,
|
21
|
+
")? "
|
22
|
+
].map { |string| string.yellow }.join
|
23
|
+
confirm = ask(question)
|
24
|
+
|
25
|
+
exit unless confirm == "yes"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'startling/git_local'
|
2
2
|
require 'startling/github'
|
3
3
|
require 'startling/colorize_string'
|
4
|
+
require 'startling/commands/check_wip'
|
4
5
|
require 'startling/commands/label_pull_request'
|
5
6
|
require 'startling/handlers/default_pull_request_handler'
|
6
7
|
|
@@ -17,7 +18,7 @@ module Startling
|
|
17
18
|
'Startlingfile.rb'
|
18
19
|
].freeze
|
19
20
|
|
20
|
-
attr_accessor :cache_dir, :root_dir, :wip_limit, :repos, :story_handler,
|
21
|
+
attr_accessor :cache_dir, :root_dir, :wip_limit, :wip_labels, :repos, :story_handler,
|
21
22
|
:validate_branch_name, :pull_request_body, :pull_request_handler,
|
22
23
|
:pull_request_labels, :pull_request_commit_message, :cli_options
|
23
24
|
|
@@ -25,7 +26,8 @@ module Startling
|
|
25
26
|
@cache_dir = Dir.pwd
|
26
27
|
@root_dir = Dir.pwd
|
27
28
|
@wip_limit = DEFAULT_WIP_LIMIT
|
28
|
-
@
|
29
|
+
@wip_labels = []
|
30
|
+
@repos = [GitLocal.new.repo_name]
|
29
31
|
@story_handler = nil
|
30
32
|
@validate_branch_name = nil
|
31
33
|
@pull_request_handler = nil
|
@@ -22,7 +22,9 @@ module Startling
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def in_progress?
|
25
|
-
|
25
|
+
return true if Startling.wip_labels.empty?
|
26
|
+
|
27
|
+
(label_names & Startling.wip_labels).size > 0
|
26
28
|
end
|
27
29
|
|
28
30
|
def label_names
|
@@ -46,6 +48,7 @@ module Startling
|
|
46
48
|
end
|
47
49
|
|
48
50
|
private
|
51
|
+
|
49
52
|
def prefetch_data
|
50
53
|
author
|
51
54
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'tzinfo'
|
2
|
+
require 'business_time'
|
3
|
+
|
4
|
+
module Startling
|
5
|
+
module TimeFormatHelpers
|
6
|
+
def business_time_ago(time)
|
7
|
+
days = pdt(time).to_date.business_days_until(pdt(Time.now).to_date)
|
8
|
+
|
9
|
+
case days
|
10
|
+
when 0
|
11
|
+
hours_ago(time)
|
12
|
+
else
|
13
|
+
"#{pluralize(days, "day")} ago"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def hours_ago(time)
|
18
|
+
total_seconds = Time.now - time
|
19
|
+
time_suffix = total_seconds >= 0 ? 'ago' : 'from now'
|
20
|
+
total_seconds = total_seconds.abs
|
21
|
+
|
22
|
+
hours = (total_seconds / (60 * 60)).floor
|
23
|
+
|
24
|
+
if hours < 1
|
25
|
+
pretty_time = "less than an hour"
|
26
|
+
else
|
27
|
+
pretty_time = pluralize(hours, 'hour')
|
28
|
+
end
|
29
|
+
|
30
|
+
"#{pretty_time} #{time_suffix}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def pluralize(n, singular, plural=nil)
|
34
|
+
if n == 1
|
35
|
+
"1 #{singular}"
|
36
|
+
elsif plural
|
37
|
+
"#{n} #{plural}"
|
38
|
+
else
|
39
|
+
"#{n} #{singular}s"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def pdt(time)
|
44
|
+
tz = TZInfo::Timezone.get('America/Los_Angeles')
|
45
|
+
tz.utc_to_local(time)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/startling/version.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'parallel'
|
2
|
+
require_relative 'github'
|
3
|
+
|
4
|
+
module Startling
|
5
|
+
class Work
|
6
|
+
using ColorizeString
|
7
|
+
|
8
|
+
attr_reader :pull_requests, :branch
|
9
|
+
|
10
|
+
def initialize(branch, pull_requests)
|
11
|
+
@branch = branch
|
12
|
+
@pull_requests = pull_requests
|
13
|
+
end
|
14
|
+
|
15
|
+
def in_progress?
|
16
|
+
pull_requests.any?(&:in_progress?)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"#{authors.join(", ").blue} - #{branch.to_s.yellow}\n" +
|
21
|
+
pull_requests.map { |p| " #{p}"}.join("\n")
|
22
|
+
end
|
23
|
+
|
24
|
+
def authors
|
25
|
+
pull_requests.map(&:author).uniq.sort
|
26
|
+
end
|
27
|
+
|
28
|
+
def started_at
|
29
|
+
pull_requests.map(&:created_at).min
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.all
|
33
|
+
repos = Startling.repos.map { |name| Github.repo(name) }
|
34
|
+
pull_requests = Parallel.map(repos, in_threads: repos.count, &:pull_requests).flatten
|
35
|
+
from_pull_requests(pull_requests)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.from_pull_requests(pull_requests)
|
39
|
+
work = pull_requests.group_by(&:branch)
|
40
|
+
work.map { |branch, pulls| new(branch, pulls) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.in_progress
|
44
|
+
all.select(&:in_progress?)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'paint'
|
2
|
+
require_relative 'colorize_string'
|
3
|
+
require_relative 'time_format_helpers'
|
4
|
+
|
5
|
+
module Startling
|
6
|
+
class WorkPrinter
|
7
|
+
using ColorizeString
|
8
|
+
include TimeFormatHelpers
|
9
|
+
|
10
|
+
def print(works)
|
11
|
+
puts works.sort_by(&:started_at).map { |work| format_work(work) }.join("\n\n")
|
12
|
+
puts "\nThere is currently #{count(works)} out of #{Startling.wip_limit.to_s.yellow} WIP."
|
13
|
+
end
|
14
|
+
|
15
|
+
def format_pull_request(pull_request)
|
16
|
+
"#{format_pull_request_labels(pull_request)}: #{pull_request.title}\n" +
|
17
|
+
" Started #{ago pull_request.created_at}, last updated #{ago pull_request.updated_at}\n" +
|
18
|
+
" #{pull_request.url.cyan.underline}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def format_work(work)
|
22
|
+
"#{work.authors.join(", ").green} - #{work.branch.to_s.yellow}\n".yellow +
|
23
|
+
indent(work.pull_requests.sort_by(&:created_at).map { |p| format_pull_request(p) }.join("\n"))
|
24
|
+
end
|
25
|
+
|
26
|
+
def indent(string)
|
27
|
+
string.split("\n").map {|s| " #{s}"}.join("\n")
|
28
|
+
end
|
29
|
+
|
30
|
+
def ago(time)
|
31
|
+
business_time_ago(time).yellow
|
32
|
+
end
|
33
|
+
|
34
|
+
def count(works)
|
35
|
+
count = works.count
|
36
|
+
|
37
|
+
if count > Startling.wip_limit
|
38
|
+
count.to_s.red
|
39
|
+
elsif count == Startling.wip_limit
|
40
|
+
count.to_s.yellow
|
41
|
+
else
|
42
|
+
count.to_s.blue
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
def format_pull_request_labels(pull_request)
|
48
|
+
pull_request.labels.map do |label|
|
49
|
+
Paint[label[:name], :black, label[:color]]
|
50
|
+
end.join(", ")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'startling/command'
|
4
|
+
|
5
|
+
describe Startling::Command do
|
6
|
+
let(:command) { Startling::Command.new }
|
7
|
+
|
8
|
+
describe '#execute' do
|
9
|
+
before do
|
10
|
+
allow(Startling::Commands::CheckForLocalMods).to receive(Startling::Command::RUN)
|
11
|
+
|
12
|
+
allow(Startling)
|
13
|
+
.to receive_message_chain(:hook_commands, :before_story_start) { [] }
|
14
|
+
|
15
|
+
allow(Startling)
|
16
|
+
.to receive_message_chain(:hook_commands, :after_story_start) { [] }
|
17
|
+
|
18
|
+
allow(Startling)
|
19
|
+
.to receive_message_chain(:hook_commands, :before_pull_request) { [] }
|
20
|
+
|
21
|
+
allow(Startling)
|
22
|
+
.to receive_message_chain(:hook_commands, :after_pull_request) { [] }
|
23
|
+
|
24
|
+
allow(Startling).to receive(:story_handler) { nil }
|
25
|
+
|
26
|
+
allow(Startling::Commands::CreatePullRequest).to receive(Startling::Command::RUN)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should check for local modifications' do
|
30
|
+
expect(Startling::Commands::CheckForLocalMods).to receive(Startling::Command::RUN)
|
31
|
+
|
32
|
+
command.execute
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should run before story start commands' do
|
36
|
+
allow(Startling)
|
37
|
+
.to receive_message_chain(:hook_commands, :before_story_start) { [:create_branch] }
|
38
|
+
|
39
|
+
expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
|
40
|
+
|
41
|
+
command.execute
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should start the story if a story handler is defined' do
|
45
|
+
allow(Startling).to receive(:story_handler) { Startling::Commands::CreateBranch }
|
46
|
+
|
47
|
+
expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
|
48
|
+
|
49
|
+
command.execute
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should run after story start commands' do
|
53
|
+
allow(Startling)
|
54
|
+
.to receive_message_chain(:hook_commands, :after_story_start) { [:create_branch] }
|
55
|
+
|
56
|
+
expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
|
57
|
+
|
58
|
+
command.execute
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should run before pull request commands' do
|
62
|
+
allow(Startling)
|
63
|
+
.to receive_message_chain(:hook_commands, :before_pull_request) { [:create_branch] }
|
64
|
+
|
65
|
+
expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
|
66
|
+
|
67
|
+
command.execute
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should create the pull request' do
|
71
|
+
expect(Startling::Commands::CreatePullRequest).to receive(Startling::Command::RUN)
|
72
|
+
|
73
|
+
command.execute
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should run after pull request commands' do
|
77
|
+
allow(Startling)
|
78
|
+
.to receive_message_chain(:hook_commands, :after_pull_request) { [:create_branch] }
|
79
|
+
|
80
|
+
expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
|
81
|
+
|
82
|
+
command.execute
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -61,13 +61,13 @@ describe Startling::Commands::CreateBranch do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it 'returns the branch entered through the prompt' do
|
64
|
-
|
64
|
+
allow_any_instance_of(Startling::Commands::CreateBranch).to receive(:ask) { 'entered branch' }
|
65
65
|
|
66
66
|
expect(subject).to eq('entered-branch')
|
67
67
|
end
|
68
68
|
|
69
69
|
it 'returns the current branch when no branch is entered through the prompt' do
|
70
|
-
|
70
|
+
allow_any_instance_of(Startling::Commands::CreateBranch).to receive(:ask) { '' }
|
71
71
|
allow(git).to receive(:current_branch) { 'current-branch' }
|
72
72
|
|
73
73
|
expect(subject).to eq('current-branch')
|
@@ -4,6 +4,11 @@ require 'startling'
|
|
4
4
|
module Startling
|
5
5
|
describe Configuration do
|
6
6
|
let(:configuration) { Configuration.new }
|
7
|
+
let(:current_repo) { 'current' }
|
8
|
+
|
9
|
+
before do
|
10
|
+
allow_any_instance_of(GitLocal).to receive(:repo_name) { current_repo }
|
11
|
+
end
|
7
12
|
|
8
13
|
describe "Default settings" do
|
9
14
|
it "sets the default cache_dir to pwd" do
|
@@ -19,8 +24,29 @@ module Startling
|
|
19
24
|
.to eql(Configuration::DEFAULT_WIP_LIMIT)
|
20
25
|
end
|
21
26
|
|
22
|
-
it "sets the
|
23
|
-
expect(configuration.
|
27
|
+
it "sets the WIP labels to empty" do
|
28
|
+
expect(configuration.wip_labels).to eql([])
|
29
|
+
end
|
30
|
+
|
31
|
+
it "sets the default repos to the current repo" do
|
32
|
+
expect(configuration.repos).to eql([current_repo])
|
33
|
+
end
|
34
|
+
|
35
|
+
it "sets the default story handler to nil" do
|
36
|
+
expect(configuration.story_handler).to eql(nil)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "sets the default branch name validator to nil" do
|
40
|
+
expect(configuration.validate_branch_name).to eql(nil)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "sets the default pull request handler to nil" do
|
44
|
+
expect(configuration.pull_request_handler).to eql(nil)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "sets the default pull request body" do
|
48
|
+
expect(configuration.pull_request_body)
|
49
|
+
.to eql(Configuration::DEFAULT_BODY)
|
24
50
|
end
|
25
51
|
|
26
52
|
it "sets the default pull request commit message" do
|
@@ -54,10 +80,46 @@ module Startling
|
|
54
80
|
end
|
55
81
|
end
|
56
82
|
|
83
|
+
describe "#wip_labels" do
|
84
|
+
it "can set the value" do
|
85
|
+
configuration.wip_labels = ['WIP']
|
86
|
+
expect(configuration.wip_labels).to eql(['WIP'])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
57
90
|
describe "#repos" do
|
58
91
|
it "can set the value" do
|
59
92
|
configuration.repos << "repo path"
|
60
|
-
expect(configuration.repos).to eql(["repo path"])
|
93
|
+
expect(configuration.repos).to eql([current_repo, "repo path"])
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#story_handler" do
|
98
|
+
it "can set the value" do
|
99
|
+
configuration.story_handler = :pivotal_start
|
100
|
+
expect(configuration.story_handler).to eql(:pivotal_start)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "#validate_branch_name" do
|
105
|
+
it "can set the value" do
|
106
|
+
validate_branch_name = -> (branch_name) { /feature\/.*/ =~ branch_name }
|
107
|
+
configuration.validate_branch_name = validate_branch_name
|
108
|
+
expect(configuration.validate_branch_name).to eql(validate_branch_name)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#pull_request_handler" do
|
113
|
+
it "can set the value" do
|
114
|
+
configuration.pull_request_handler = :custom
|
115
|
+
expect(configuration.pull_request_handler).to eql(:custom)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "#pull_request_body" do
|
120
|
+
it "can set the value" do
|
121
|
+
configuration.pull_request_body = "Startling Body"
|
122
|
+
expect(configuration.pull_request_body).to eql("Startling Body")
|
61
123
|
end
|
62
124
|
end
|
63
125
|
|
@@ -4,34 +4,46 @@ require 'startling/github/pull_request'
|
|
4
4
|
module Startling
|
5
5
|
module Github
|
6
6
|
describe PullRequest, "#in_progress?" do
|
7
|
-
|
8
|
-
it "should be true for WIP label" do
|
7
|
+
it "should be true if no WIP labels configured" do
|
9
8
|
pull_request = PullRequest.new(double(:attributes))
|
10
|
-
allow(
|
9
|
+
allow(Startling).to receive(:wip_labels) { [] }
|
11
10
|
|
12
11
|
expect(pull_request.in_progress?).to be_truthy
|
13
12
|
end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
context 'WIP labels configured' do
|
15
|
+
before do
|
16
|
+
allow(Startling).to receive(:wip_labels) { ['WIP', 'REVIEW'] }
|
17
|
+
end
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
it "should be true for WIP label" do
|
20
|
+
pull_request = PullRequest.new(double(:attributes))
|
21
|
+
allow(pull_request).to receive(:label_names) { ["WIP"] }
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
allow(pull_request).to receive(:label_names) { ["some other thing", "bug"] }
|
23
|
+
expect(pull_request.in_progress?).to be_truthy
|
24
|
+
end
|
25
25
|
|
26
|
-
|
27
|
-
|
26
|
+
it "should be true for REVIEW label" do
|
27
|
+
pull_request = PullRequest.new(double(:attributes))
|
28
|
+
allow(pull_request).to receive(:label_names) { ["REVIEW"] }
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
expect(pull_request.in_progress?).to be_truthy
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should be false if for other labels" do
|
34
|
+
pull_request = PullRequest.new(double(:attributes))
|
35
|
+
allow(pull_request).to receive(:label_names) { ["some other thing", "bug"] }
|
36
|
+
|
37
|
+
expect(pull_request.in_progress?).to be_falsey
|
38
|
+
end
|
32
39
|
|
33
|
-
|
34
|
-
|
40
|
+
it "should be false if no labels" do
|
41
|
+
pull_request = PullRequest.new(double(:attributes))
|
42
|
+
allow(pull_request).to receive(:label_names) { [] }
|
43
|
+
|
44
|
+
expect(pull_request.in_progress?).to be_falsey
|
45
|
+
end
|
46
|
+
end
|
35
47
|
end
|
36
48
|
end
|
37
49
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'startling/time_format_helpers'
|
3
|
+
|
4
|
+
module Startling
|
5
|
+
describe TimeFormatHelpers, "#business_time_ago" do
|
6
|
+
include TimeFormatHelpers
|
7
|
+
|
8
|
+
let(:minute) { 60 }
|
9
|
+
let(:hour) { 60 * minute }
|
10
|
+
let(:day) { 24 * hour }
|
11
|
+
|
12
|
+
before do
|
13
|
+
now = Time.parse("February 7th, 2014, 1:00 pm")
|
14
|
+
allow(Time).to receive(:now) { now }
|
15
|
+
end
|
16
|
+
|
17
|
+
it "says 1 day ago if it was yesterday" do
|
18
|
+
time = Time.now - 1 * day
|
19
|
+
expect(business_time_ago(time)).to eq("1 day ago")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "says number of days if it was more than a day ago" do
|
23
|
+
time = Time.now - 3 * day
|
24
|
+
expect(business_time_ago(time)).to eq("3 days ago")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "says number of hours if it is more than 1 hour" do
|
28
|
+
time = Time.now - 2 * hour - 20 * minute
|
29
|
+
expect(business_time_ago(time)).to eq("2 hours ago")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "says number of hours if it is 1 hour" do
|
33
|
+
time = Time.now - 1 * hour - 20 * minute
|
34
|
+
expect(business_time_ago(time)).to eq("1 hour ago")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "says less than an hour if it was" do
|
38
|
+
time = Time.now - 40 * minute
|
39
|
+
expect(business_time_ago(time)).to eq("less than an hour ago")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/spec/startling_spec.rb
CHANGED
@@ -18,11 +18,11 @@ Startling.configure do |config|
|
|
18
18
|
# WIP Limit
|
19
19
|
# config.wip_limit = 4
|
20
20
|
|
21
|
-
#
|
22
|
-
# config.
|
21
|
+
# Labels for WIP pull requests
|
22
|
+
# config.wip_labels = ["WIP", "REVIEW"]
|
23
23
|
|
24
|
-
#
|
25
|
-
# config.
|
24
|
+
# Repos to check against for WIP limit
|
25
|
+
# config.repos << "substantial/startling"
|
26
26
|
|
27
27
|
# Commands to be run before a story is stared
|
28
28
|
# config.hook_commands.before_story_start = [:check_wip]
|
data/spec/support/vcr.rb
CHANGED
@@ -9,8 +9,5 @@ VCR.configure do |config|
|
|
9
9
|
config.filter_sensitive_data '<GITHUB_ACCESS_TOKEN>' do
|
10
10
|
ENV.fetch "TEST_GITHUB_ACCESS_TOKEN"
|
11
11
|
end
|
12
|
-
config.filter_sensitive_data '<PIVOTAL_API_TOKEN>' do
|
13
|
-
ENV.fetch "TEST_PIVOTAL_TRACKER_API_TOKEN"
|
14
|
-
end
|
15
12
|
config.configure_rspec_metadata!
|
16
13
|
end
|
data/startling.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency "excon"
|
28
28
|
spec.add_development_dependency "dotenv"
|
29
29
|
|
30
|
-
spec.add_dependency "octokit", "~>
|
30
|
+
spec.add_dependency "octokit", "~> 4.2"
|
31
31
|
spec.add_dependency "highline", "~> 1.6"
|
32
32
|
spec.add_dependency "paint", "~> 0.9"
|
33
33
|
spec.add_dependency "parallel", "~> 1.4"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: startling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Jensen
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-02-
|
13
|
+
date: 2016-02-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -130,14 +130,14 @@ dependencies:
|
|
130
130
|
requirements:
|
131
131
|
- - "~>"
|
132
132
|
- !ruby/object:Gem::Version
|
133
|
-
version: '
|
133
|
+
version: '4.2'
|
134
134
|
type: :runtime
|
135
135
|
prerelease: false
|
136
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
137
|
requirements:
|
138
138
|
- - "~>"
|
139
139
|
- !ruby/object:Gem::Version
|
140
|
-
version: '
|
140
|
+
version: '4.2'
|
141
141
|
- !ruby/object:Gem::Dependency
|
142
142
|
name: highline
|
143
143
|
requirement: !ruby/object:Gem::Requirement
|
@@ -213,6 +213,7 @@ email:
|
|
213
213
|
- tchdevs@substantial.com
|
214
214
|
executables:
|
215
215
|
- start
|
216
|
+
- wip
|
216
217
|
extensions: []
|
217
218
|
extra_rdoc_files: []
|
218
219
|
files:
|
@@ -223,6 +224,7 @@ files:
|
|
223
224
|
- README.md
|
224
225
|
- Rakefile
|
225
226
|
- bin/start
|
227
|
+
- bin/wip
|
226
228
|
- lib/generators/startling/configuration_generator.rb
|
227
229
|
- lib/startling.rb
|
228
230
|
- lib/startling/cache.rb
|
@@ -231,6 +233,7 @@ files:
|
|
231
233
|
- lib/startling/command.rb
|
232
234
|
- lib/startling/commands/base.rb
|
233
235
|
- lib/startling/commands/check_for_local_mods.rb
|
236
|
+
- lib/startling/commands/check_wip.rb
|
234
237
|
- lib/startling/commands/create_branch.rb
|
235
238
|
- lib/startling/commands/create_pull_request.rb
|
236
239
|
- lib/startling/commands/label_pull_request.rb
|
@@ -244,14 +247,19 @@ files:
|
|
244
247
|
- lib/startling/handlers/pull_request_handler_base.rb
|
245
248
|
- lib/startling/markdown.rb
|
246
249
|
- lib/startling/shell.rb
|
250
|
+
- lib/startling/time_format_helpers.rb
|
247
251
|
- lib/startling/version.rb
|
252
|
+
- lib/startling/work.rb
|
253
|
+
- lib/startling/work_printer.rb
|
248
254
|
- spec/spec_helper.rb
|
255
|
+
- spec/startling/command_spec.rb
|
249
256
|
- spec/startling/commands/base_spec.rb
|
250
257
|
- spec/startling/commands/create_branch_spec.rb
|
251
258
|
- spec/startling/commands/create_pull_request_spec.rb
|
252
259
|
- spec/startling/configuration_spec.rb
|
253
260
|
- spec/startling/git_local_spec.rb
|
254
261
|
- spec/startling/github/pull_request_spec.rb
|
262
|
+
- spec/startling/time_format_helpers_spec.rb
|
255
263
|
- spec/startling_configuration_spec.rb
|
256
264
|
- spec/startling_spec.rb
|
257
265
|
- spec/support/dotenv.rb
|
@@ -286,12 +294,14 @@ specification_version: 4
|
|
286
294
|
summary: script for startling a story
|
287
295
|
test_files:
|
288
296
|
- spec/spec_helper.rb
|
297
|
+
- spec/startling/command_spec.rb
|
289
298
|
- spec/startling/commands/base_spec.rb
|
290
299
|
- spec/startling/commands/create_branch_spec.rb
|
291
300
|
- spec/startling/commands/create_pull_request_spec.rb
|
292
301
|
- spec/startling/configuration_spec.rb
|
293
302
|
- spec/startling/git_local_spec.rb
|
294
303
|
- spec/startling/github/pull_request_spec.rb
|
304
|
+
- spec/startling/time_format_helpers_spec.rb
|
295
305
|
- spec/startling_configuration_spec.rb
|
296
306
|
- spec/startling_spec.rb
|
297
307
|
- spec/support/dotenv.rb
|