flux 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -1
- data/VERSION +1 -1
- data/flux.gemspec +4 -5
- data/lib/flux/cli/feature.rb +1 -1
- data/lib/flux/cli/pivotal_tracker.rb +10 -4
- data/lib/flux/cli/review.rb +126 -65
- data/lib/flux/util/table.rb +99 -0
- data/spec/flux/util/table_spec.rb +47 -0
- metadata +23 -32
data/Gemfile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
data/flux.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "flux"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["David Leal"]
|
12
|
-
s.date = "2012-02-
|
12
|
+
s.date = "2012-02-18"
|
13
13
|
s.email = "david@mojotech.com"
|
14
14
|
s.executables = ["flux"]
|
15
15
|
s.extra_rdoc_files = [
|
@@ -40,7 +40,9 @@ Gem::Specification.new do |s|
|
|
40
40
|
"lib/flux/rcs/git.rb",
|
41
41
|
"lib/flux/util.rb",
|
42
42
|
"lib/flux/util/output.rb",
|
43
|
+
"lib/flux/util/table.rb",
|
43
44
|
"lib/flux/workflows/mojotech.rb",
|
45
|
+
"spec/flux/util/table_spec.rb",
|
44
46
|
"spec/flux_spec.rb",
|
45
47
|
"spec/spec_helper.rb",
|
46
48
|
"spec/support/rr.rb"
|
@@ -58,7 +60,6 @@ Gem::Specification.new do |s|
|
|
58
60
|
s.add_runtime_dependency(%q<thor>, ["~> 0.14.0"])
|
59
61
|
s.add_runtime_dependency(%q<pivotal-tracker>, ["~> 0.4.0"])
|
60
62
|
s.add_runtime_dependency(%q<grit>, ["~> 2.4.0"])
|
61
|
-
s.add_runtime_dependency(%q<hirb>, [">= 0"])
|
62
63
|
s.add_runtime_dependency(%q<github_api>, [">= 0"])
|
63
64
|
s.add_development_dependency(%q<rspec>, ["~> 2.0"])
|
64
65
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -69,7 +70,6 @@ Gem::Specification.new do |s|
|
|
69
70
|
s.add_dependency(%q<thor>, ["~> 0.14.0"])
|
70
71
|
s.add_dependency(%q<pivotal-tracker>, ["~> 0.4.0"])
|
71
72
|
s.add_dependency(%q<grit>, ["~> 2.4.0"])
|
72
|
-
s.add_dependency(%q<hirb>, [">= 0"])
|
73
73
|
s.add_dependency(%q<github_api>, [">= 0"])
|
74
74
|
s.add_dependency(%q<rspec>, ["~> 2.0"])
|
75
75
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -81,7 +81,6 @@ Gem::Specification.new do |s|
|
|
81
81
|
s.add_dependency(%q<thor>, ["~> 0.14.0"])
|
82
82
|
s.add_dependency(%q<pivotal-tracker>, ["~> 0.4.0"])
|
83
83
|
s.add_dependency(%q<grit>, ["~> 2.4.0"])
|
84
|
-
s.add_dependency(%q<hirb>, [">= 0"])
|
85
84
|
s.add_dependency(%q<github_api>, [">= 0"])
|
86
85
|
s.add_dependency(%q<rspec>, ["~> 2.0"])
|
87
86
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
data/lib/flux/cli/feature.rb
CHANGED
@@ -5,7 +5,7 @@ module Flux
|
|
5
5
|
class Feature < Thor
|
6
6
|
namespace :feature
|
7
7
|
|
8
|
-
desc "start STORY_ID
|
8
|
+
desc "start STORY_ID BRANCH", "start working on a story"
|
9
9
|
method_option :estimate, :type => :numeric
|
10
10
|
method_option :parent_branch, :type => :string,
|
11
11
|
:default => 'master',
|
@@ -2,11 +2,14 @@ require 'pivotal-tracker'
|
|
2
2
|
require 'hirb'
|
3
3
|
require 'flux/pivotal_tracker'
|
4
4
|
require 'flux/ext/pivotal-tracker'
|
5
|
+
require 'flux/util/table'
|
5
6
|
require 'forwardable'
|
6
7
|
|
7
8
|
module Flux
|
8
9
|
module CLI
|
9
10
|
class PT < Thor
|
11
|
+
STORY_LIST_HEADERS = %w(>ID STATE ASSIGNEE >EST STORY)
|
12
|
+
|
10
13
|
extend Forwardable
|
11
14
|
include Flux::Util
|
12
15
|
|
@@ -44,10 +47,13 @@ module Flux
|
|
44
47
|
|
45
48
|
desc "list", "list stories, excluding icebox by default"
|
46
49
|
def list
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
50
|
+
table =
|
51
|
+
[STORY_LIST_HEADERS] +
|
52
|
+
current_project.stories.scheduled.map { |s|
|
53
|
+
[s.id, s.state, s.owned_by, s.est, s.name]
|
54
|
+
}
|
55
|
+
|
56
|
+
puts_table table
|
51
57
|
end
|
52
58
|
|
53
59
|
story_update :finish, :current_state => 'finished'
|
data/lib/flux/cli/review.rb
CHANGED
@@ -5,35 +5,37 @@ require 'github_api'
|
|
5
5
|
module Flux
|
6
6
|
module CLI
|
7
7
|
class Review < Thor
|
8
|
+
PULL_REQUEST_HEADERS = %w(>NUM >STORY AUTHOR DATE TITLE)
|
9
|
+
|
10
|
+
include Flux::Util
|
11
|
+
|
8
12
|
namespace 'review'
|
9
13
|
|
10
|
-
desc "diff", "show interdiff between last 2 reviews"
|
14
|
+
desc "diff [BRANCH]", "show interdiff between last 2 reviews"
|
11
15
|
method_option :from, :type => :numeric, :aliases => '-f'
|
12
16
|
method_option :to, :type => :numeric, :aliases => '-t'
|
13
17
|
method_option :color, :type => :boolean, :aliases => '-c'
|
14
18
|
def diff(branch_name = Git::Branch.current.name)
|
15
|
-
reqs =
|
19
|
+
reqs = Github::PullRequest.all(:branch_name => branch_name)
|
16
20
|
|
17
21
|
if options[:from] && options[:to]
|
18
|
-
to = reqs.find { |r| r
|
19
|
-
from = reqs.find { |r| r
|
22
|
+
to = reqs.find { |r| r.number.to_i == options[:to].to_i }
|
23
|
+
from = reqs.find { |r| r.number.to_i == options[:from].to_i }
|
20
24
|
else
|
21
25
|
to, from = reqs.first(2)
|
22
26
|
end
|
23
27
|
|
24
28
|
if from
|
25
|
-
auth = [gh_config['username'], gh_config['password']]
|
26
|
-
|
27
29
|
to_diff = Tempfile.new("to_diff")
|
28
|
-
to_diff.write(
|
29
|
-
|
30
|
+
to_diff.write(to.diff)
|
31
|
+
to_diff.flush
|
30
32
|
|
31
33
|
from_diff = Tempfile.new("from_diff")
|
32
|
-
from_diff.write(
|
33
|
-
|
34
|
+
from_diff.write(from.diff)
|
35
|
+
from_diff.flush
|
34
36
|
|
35
37
|
cmd = "interdiff #{from_diff.path} #{to_diff.path}"
|
36
|
-
cmd << "| colordiff"
|
38
|
+
cmd << "| colordiff" if options[:color]
|
37
39
|
|
38
40
|
system cmd
|
39
41
|
end
|
@@ -43,27 +45,30 @@ module Flux
|
|
43
45
|
def request
|
44
46
|
branch = Git::Branch.current
|
45
47
|
story = current_project.stories.find(branch.config('story_id'))
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
48
|
+
old = Github::PullRequest.all(:branch_name => branch.name)
|
49
|
+
last = old.first
|
50
|
+
|
51
|
+
last.close if last && last.open?
|
52
|
+
|
53
|
+
body = {:branch_name => branch.name,
|
54
|
+
:story_url => story.url,
|
55
|
+
:iterations => old.map(&:html_url)}
|
56
|
+
data = {:base => 'master',
|
57
|
+
:head => branch.commit.sha,
|
58
|
+
:title => story.name,
|
59
|
+
:body => body}
|
60
|
+
|
61
|
+
Github::PullRequest.create data
|
57
62
|
end
|
58
63
|
|
59
64
|
desc "list", "list pull requests for the current project"
|
60
65
|
def list
|
61
|
-
list_pull_requests
|
66
|
+
list_pull_requests Github::PullRequest.open
|
62
67
|
end
|
63
68
|
|
64
|
-
desc "history
|
69
|
+
desc "history [BRANCH]", "show review history for branch"
|
65
70
|
def history(branch_id = Git::Branch.current.name)
|
66
|
-
reqs =
|
71
|
+
reqs = Github::PullRequest.all(:branch_name => branch_id)
|
67
72
|
|
68
73
|
list_pull_requests reqs
|
69
74
|
end
|
@@ -78,60 +83,116 @@ module Flux
|
|
78
83
|
Flux::PT::Project.new(pt_config['project_id'])
|
79
84
|
end
|
80
85
|
|
81
|
-
def gh
|
82
|
-
Github.new :login => gh_config['username'],
|
83
|
-
:password => gh_config['password']
|
84
|
-
end
|
85
|
-
|
86
|
-
def gh_config
|
87
|
-
config['github']
|
88
|
-
end
|
89
|
-
|
90
86
|
def pt_config
|
91
87
|
config['pivotal_tracker']
|
92
88
|
end
|
93
89
|
|
94
|
-
def
|
95
|
-
|
90
|
+
def list_pull_requests(pull_requests)
|
91
|
+
table =
|
92
|
+
[PULL_REQUEST_HEADERS] +
|
93
|
+
pull_requests.map { |p|
|
94
|
+
[p.number, Flux::PT::Story.id_from_url(p.body[:story_url]), p.author,
|
95
|
+
Time.parse(p.created_at).strftime("%F %R"), p.title]
|
96
|
+
}
|
97
|
+
|
98
|
+
puts_table table
|
99
|
+
end
|
96
100
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
[]
|
101
|
+
module Github
|
102
|
+
def self.config
|
103
|
+
Flux.environment['github']
|
101
104
|
end
|
102
|
-
end
|
103
105
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
pull_requests(opts.merge(:state => 'closed'))
|
106
|
+
def self.gh
|
107
|
+
::Github.new(:login => Github.config['username'],
|
108
|
+
:password => Github.config['password'])
|
108
109
|
end
|
109
110
|
|
110
|
-
|
111
|
+
class PullRequest
|
112
|
+
class << self
|
113
|
+
def all(opts = {})
|
114
|
+
pull_requests(opts.merge(:state => 'open')) +
|
115
|
+
pull_requests(opts.merge(:state => 'closed'))
|
116
|
+
end
|
111
117
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
r[:story_id] = Flux::PT::Story.id_from_url(r[:body][:story_url])
|
118
|
-
}
|
118
|
+
def create(data)
|
119
|
+
pr.create_request Github.config['repo_user'],
|
120
|
+
Github.config['repo_name'],
|
121
|
+
PullRequest.new(data).to_hash
|
122
|
+
end
|
119
123
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
reqs
|
124
|
-
end
|
125
|
-
end
|
124
|
+
def open(opts = {})
|
125
|
+
pull_requests({:state => 'open'}.merge(opts))
|
126
|
+
end
|
126
127
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
128
|
+
def pr
|
129
|
+
Github.gh.pull_requests
|
130
|
+
end
|
131
|
+
|
132
|
+
def update(id, data)
|
133
|
+
pr.update_request Github.config['repo_user'],
|
134
|
+
Github.config['repo_name'],
|
135
|
+
id,
|
136
|
+
data.dup
|
137
|
+
end
|
138
|
+
|
139
|
+
private
|
140
|
+
|
141
|
+
def pull_requests(opts = {})
|
142
|
+
branch_name = opts.delete(:branch_name)
|
143
|
+
|
144
|
+
reqs = pr.pull_requests(Github.config['repo_user'],
|
145
|
+
Github.config['repo_name'],
|
146
|
+
opts).map { |r|
|
147
|
+
r[:author] = r[:user][:login]
|
148
|
+
r[:body] = ReviewBody.from_markdown(r[:body])
|
149
|
+
|
150
|
+
PullRequest.new(r)
|
151
|
+
}
|
152
|
+
|
153
|
+
if branch_name
|
154
|
+
reqs.select { |r| r.body[:branch_name] == branch_name }
|
155
|
+
else
|
156
|
+
reqs
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def initialize(data)
|
162
|
+
@data = data
|
163
|
+
end
|
164
|
+
|
165
|
+
def close
|
166
|
+
@data[:state] = 'closed'
|
167
|
+
|
168
|
+
self.class.update number, {:state => @data[:state]}
|
169
|
+
end
|
170
|
+
|
171
|
+
def diff
|
172
|
+
auth = [Github.config['username'], Github.config['password']]
|
173
|
+
|
174
|
+
open(@data[:diff_url], :http_basic_authentication => auth).read
|
175
|
+
end
|
176
|
+
|
177
|
+
def method_missing(name, *args)
|
178
|
+
if @data.has_key?(name.to_sym)
|
179
|
+
@data[name.to_sym]
|
180
|
+
else
|
181
|
+
super
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def open?
|
186
|
+
state == 'open'
|
187
|
+
end
|
188
|
+
|
189
|
+
def to_hash
|
190
|
+
@data.merge(:body => ReviewBody.to_markdown(@data[:body]))
|
191
|
+
end
|
192
|
+
end
|
132
193
|
end
|
133
194
|
|
134
|
-
module
|
195
|
+
module ReviewBody
|
135
196
|
def self.from_markdown(md)
|
136
197
|
if (md || '').include?(signoff)
|
137
198
|
_, branch_name, story_url, iter = md.
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Flux
|
2
|
+
module Util
|
3
|
+
# Initialize a new Table.
|
4
|
+
#
|
5
|
+
# @param [Array<Array>] raw_data the table's annotated data
|
6
|
+
# @param field_sep the string used to separate columns
|
7
|
+
# @param [Integer] max_width the maximum width for this table.
|
8
|
+
# Lines exceeding this width will be truncated.
|
9
|
+
# @param shell the shell object used by the current task
|
10
|
+
def puts_table(raw_data, field_sep = ' ', max_width = nil)
|
11
|
+
$stdout.puts Table.new(shell, raw_data, field_sep, max_width)
|
12
|
+
end
|
13
|
+
|
14
|
+
# A table pretty printer that allows us to take a peek at the data after
|
15
|
+
# it's been stripped of formatting information. It exists to make testing
|
16
|
+
# easier.
|
17
|
+
#
|
18
|
+
# If any cell in the first row is prefixed with '>', then that column's
|
19
|
+
# contents will be right-aligned. This is useful when showing numbers.
|
20
|
+
class Table
|
21
|
+
ALIGN_RIGHT = '>'
|
22
|
+
|
23
|
+
attr_reader :field_sep, :raw_data, :shell, :max_width
|
24
|
+
|
25
|
+
# @see Flux::Util#puts_table
|
26
|
+
def initialize(shell, raw_data, field_sep, max_width)
|
27
|
+
@shell = shell
|
28
|
+
@raw_data = raw_data
|
29
|
+
@field_sep = field_sep
|
30
|
+
@max_width = max_width || terminal_width
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return whether a given column's contents will be aligned to the right
|
34
|
+
def align_right?(index)
|
35
|
+
meta[index].include?(ALIGN_RIGHT)
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return all rows but the first
|
39
|
+
def body
|
40
|
+
@body ||= raw_data[1..-1]
|
41
|
+
end
|
42
|
+
|
43
|
+
# @return the table data, stripped of format information
|
44
|
+
def data
|
45
|
+
@data ||= body.unshift(headers)
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return the table's first row
|
49
|
+
def headers
|
50
|
+
@headers = raw_data.first.each_with_index.map { |e, i|
|
51
|
+
align_right?(i) ? e[1..-1] : e
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return the table's format information
|
56
|
+
def meta
|
57
|
+
@meta ||= @raw_data.first.inject([]) { |a, e|
|
58
|
+
a << (e =~ /^>/ ? ALIGN_RIGHT : '')
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_s
|
63
|
+
@s ||=
|
64
|
+
begin
|
65
|
+
widths = data.transpose.inject([]) { |a, col|
|
66
|
+
a << col.max { |a, b| a.to_s.size <=> b.to_s.size }.to_s.size
|
67
|
+
}
|
68
|
+
|
69
|
+
# we don't need the last column's width if it is to be left-aligned
|
70
|
+
widths[-1] = nil unless align_right?(-1)
|
71
|
+
|
72
|
+
format = meta.each_with_index.inject('') { |a, (e, i)|
|
73
|
+
w = widths[i] ? widths[i].to_s : ''
|
74
|
+
align = align_right?(i) ? '' : '-'
|
75
|
+
|
76
|
+
a << "#{field_sep}%" << align << w << 's'
|
77
|
+
}.strip
|
78
|
+
|
79
|
+
max_width
|
80
|
+
|
81
|
+
data.inject('') { |a, r|
|
82
|
+
l =
|
83
|
+
a << truncate(format % r, max_width) << "\n"
|
84
|
+
}
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def truncate(string, width)
|
91
|
+
shell.send(:truncate, string, width)
|
92
|
+
end
|
93
|
+
|
94
|
+
def terminal_width
|
95
|
+
shell.send(:terminal_width)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe Flux::Util::Table do
|
4
|
+
let(:body) {
|
5
|
+
[[123, 'unstarted', 'David Leal', 'First story'],
|
6
|
+
[456, 'unscheduled', '', 'Second story']]
|
7
|
+
}
|
8
|
+
|
9
|
+
it "is converted to a string" do
|
10
|
+
t = Flux::Util::Table.new(Thor::Shell::Basic.new,
|
11
|
+
[%w(ID STATE ASSIGNEE STORY)] + body,
|
12
|
+
' ',
|
13
|
+
nil)
|
14
|
+
|
15
|
+
t.to_s.should == <<EOT
|
16
|
+
ID STATE ASSIGNEE STORY
|
17
|
+
123 unstarted David Leal First story
|
18
|
+
456 unscheduled Second story
|
19
|
+
EOT
|
20
|
+
end
|
21
|
+
|
22
|
+
it "aligns its columns to the right" do
|
23
|
+
t = Flux::Util::Table.new(Thor::Shell::Basic.new,
|
24
|
+
[%w(>ID >STATE >ASSIGNEE >STORY)] + body,
|
25
|
+
' ',
|
26
|
+
nil)
|
27
|
+
|
28
|
+
t.to_s.should == <<EOT
|
29
|
+
ID STATE ASSIGNEE STORY
|
30
|
+
123 unstarted David Leal First story
|
31
|
+
456 unscheduled Second story
|
32
|
+
EOT
|
33
|
+
end
|
34
|
+
|
35
|
+
it "truncates lines to a given width" do
|
36
|
+
t = Flux::Util::Table.new(Thor::Shell::Basic.new,
|
37
|
+
[%w(ID STATE ASSIGNEE STORY)] + body,
|
38
|
+
' ',
|
39
|
+
7)
|
40
|
+
|
41
|
+
t.to_s.should == <<EOT
|
42
|
+
ID ...
|
43
|
+
123 ...
|
44
|
+
456 ...
|
45
|
+
EOT
|
46
|
+
end
|
47
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flux
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement: &
|
16
|
+
requirement: &82116730 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.14.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *82116730
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: pivotal-tracker
|
27
|
-
requirement: &
|
27
|
+
requirement: &82116220 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.4.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *82116220
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: grit
|
38
|
-
requirement: &
|
38
|
+
requirement: &82115540 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,21 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.4.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: hirb
|
49
|
-
requirement: &76509210 !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
|
-
requirements:
|
52
|
-
- - ! '>='
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
type: :runtime
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: *76509210
|
46
|
+
version_requirements: *82115540
|
58
47
|
- !ruby/object:Gem::Dependency
|
59
48
|
name: github_api
|
60
|
-
requirement: &
|
49
|
+
requirement: &82114430 !ruby/object:Gem::Requirement
|
61
50
|
none: false
|
62
51
|
requirements:
|
63
52
|
- - ! '>='
|
@@ -65,10 +54,10 @@ dependencies:
|
|
65
54
|
version: '0'
|
66
55
|
type: :runtime
|
67
56
|
prerelease: false
|
68
|
-
version_requirements: *
|
57
|
+
version_requirements: *82114430
|
69
58
|
- !ruby/object:Gem::Dependency
|
70
59
|
name: rspec
|
71
|
-
requirement: &
|
60
|
+
requirement: &82111670 !ruby/object:Gem::Requirement
|
72
61
|
none: false
|
73
62
|
requirements:
|
74
63
|
- - ~>
|
@@ -76,10 +65,10 @@ dependencies:
|
|
76
65
|
version: '2.0'
|
77
66
|
type: :development
|
78
67
|
prerelease: false
|
79
|
-
version_requirements: *
|
68
|
+
version_requirements: *82111670
|
80
69
|
- !ruby/object:Gem::Dependency
|
81
70
|
name: bundler
|
82
|
-
requirement: &
|
71
|
+
requirement: &82109050 !ruby/object:Gem::Requirement
|
83
72
|
none: false
|
84
73
|
requirements:
|
85
74
|
- - ~>
|
@@ -87,10 +76,10 @@ dependencies:
|
|
87
76
|
version: 1.0.0
|
88
77
|
type: :development
|
89
78
|
prerelease: false
|
90
|
-
version_requirements: *
|
79
|
+
version_requirements: *82109050
|
91
80
|
- !ruby/object:Gem::Dependency
|
92
81
|
name: jeweler
|
93
|
-
requirement: &
|
82
|
+
requirement: &82123730 !ruby/object:Gem::Requirement
|
94
83
|
none: false
|
95
84
|
requirements:
|
96
85
|
- - ~>
|
@@ -98,10 +87,10 @@ dependencies:
|
|
98
87
|
version: 1.6.2
|
99
88
|
type: :development
|
100
89
|
prerelease: false
|
101
|
-
version_requirements: *
|
90
|
+
version_requirements: *82123730
|
102
91
|
- !ruby/object:Gem::Dependency
|
103
92
|
name: rcov
|
104
|
-
requirement: &
|
93
|
+
requirement: &82122310 !ruby/object:Gem::Requirement
|
105
94
|
none: false
|
106
95
|
requirements:
|
107
96
|
- - ! '>='
|
@@ -109,10 +98,10 @@ dependencies:
|
|
109
98
|
version: '0'
|
110
99
|
type: :development
|
111
100
|
prerelease: false
|
112
|
-
version_requirements: *
|
101
|
+
version_requirements: *82122310
|
113
102
|
- !ruby/object:Gem::Dependency
|
114
103
|
name: rr
|
115
|
-
requirement: &
|
104
|
+
requirement: &82120780 !ruby/object:Gem::Requirement
|
116
105
|
none: false
|
117
106
|
requirements:
|
118
107
|
- - ~>
|
@@ -120,7 +109,7 @@ dependencies:
|
|
120
109
|
version: 1.0.0
|
121
110
|
type: :development
|
122
111
|
prerelease: false
|
123
|
-
version_requirements: *
|
112
|
+
version_requirements: *82120780
|
124
113
|
description:
|
125
114
|
email: david@mojotech.com
|
126
115
|
executables:
|
@@ -153,7 +142,9 @@ files:
|
|
153
142
|
- lib/flux/rcs/git.rb
|
154
143
|
- lib/flux/util.rb
|
155
144
|
- lib/flux/util/output.rb
|
145
|
+
- lib/flux/util/table.rb
|
156
146
|
- lib/flux/workflows/mojotech.rb
|
147
|
+
- spec/flux/util/table_spec.rb
|
157
148
|
- spec/flux_spec.rb
|
158
149
|
- spec/spec_helper.rb
|
159
150
|
- spec/support/rr.rb
|
@@ -172,7 +163,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
172
163
|
version: '0'
|
173
164
|
segments:
|
174
165
|
- 0
|
175
|
-
hash:
|
166
|
+
hash: -114953261
|
176
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
177
168
|
none: false
|
178
169
|
requirements:
|