flux 0.0.5 → 0.0.6

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/Gemfile CHANGED
@@ -5,7 +5,6 @@ source "http://rubygems.org"
5
5
  gem "thor", "~> 0.14.0"
6
6
  gem "pivotal-tracker", "~> 0.4.0"
7
7
  gem "grit", "~> 2.4.0"
8
- gem 'hirb'
9
8
  gem 'github_api'
10
9
 
11
10
  # Add dependencies to develop your gem here.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "flux"
8
- s.version = "0.0.5"
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-17"
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"])
@@ -5,7 +5,7 @@ module Flux
5
5
  class Feature < Thor
6
6
  namespace :feature
7
7
 
8
- desc "start STORY_ID BRANCH_ID", "start working on a story"
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
- puts Hirb::Helpers::ObjectTable.render(
48
- current_project.stories.scheduled,
49
- :fields => [:id, :state, :owned_by, :est, :name]
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'
@@ -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 = pull_requests(:state => 'all', :branch_name => branch_name)
19
+ reqs = Github::PullRequest.all(:branch_name => branch_name)
16
20
 
17
21
  if options[:from] && options[:to]
18
- to = reqs.find { |r| r[:number].to_i == options[:to].to_i }
19
- from = reqs.find { |r| r[:number].to_i == options[:from].to_i }
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(open(to[:diff_url],
29
- :http_basic_authentication => auth).read)
30
+ to_diff.write(to.diff)
31
+ to_diff.flush
30
32
 
31
33
  from_diff = Tempfile.new("from_diff")
32
- from_diff.write(open(from[:diff_url],
33
- :http_basic_authentication => auth).read)
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
- body = {:branch_name => branch.name,
47
- :story_url => story.url,
48
- :iterations => iterations(branch.name)}
49
- data = {:base => 'master',
50
- :head => branch.commit.sha,
51
- :title => story.name,
52
- :body => PullRequestBody.to_markdown(body)}
53
-
54
- gh.pull_requests.create_request gh_config['repo_user'],
55
- gh_config['repo_name'],
56
- data
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 pull_requests
66
+ list_pull_requests Github::PullRequest.open
62
67
  end
63
68
 
64
- desc "history BRANCH_ID", "show review history for branch"
69
+ desc "history [BRANCH]", "show review history for branch"
65
70
  def history(branch_id = Git::Branch.current.name)
66
- reqs = pull_requests(:branch_name => branch_id, :state => 'all')
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 iterations(branch_name)
95
- last = pull_requests(:branch_name => branch_name).first
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
- if last
98
- [last[:url]].concat(last[:body][:iterations])
99
- else
100
- []
101
+ module Github
102
+ def self.config
103
+ Flux.environment['github']
101
104
  end
102
- end
103
105
 
104
- def pull_requests(opts = {})
105
- if opts[:state] == 'all'
106
- return pull_requests(opts.merge(:state => 'open')) +
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
- branch_name = opts.delete(:branch_name)
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
- reqs = gh.pull_requests.pull_requests(gh_config['repo_user'],
113
- gh_config['repo_name'],
114
- opts).each { |r|
115
- r[:author] = r[:user][:login]
116
- r[:body] = PullRequestBody.from_markdown(r[:body])
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
- if branch_name
121
- reqs.select { |r| r[:body][:branch_name] == branch_name }
122
- else
123
- reqs
124
- end
125
- end
124
+ def open(opts = {})
125
+ pull_requests({:state => 'open'}.merge(opts))
126
+ end
126
127
 
127
- def list_pull_requests(pull_requests)
128
- puts Hirb::Helpers::Table.render(
129
- pull_requests,
130
- :fields => [:number, :title, :story_id, :author, :created_at]
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 PullRequestBody
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.5
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-17 00:00:00.000000000 Z
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: &76495720 !ruby/object:Gem::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: *76495720
24
+ version_requirements: *82116730
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: pivotal-tracker
27
- requirement: &76494370 !ruby/object:Gem::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: *76494370
35
+ version_requirements: *82116220
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: grit
38
- requirement: &76510480 !ruby/object:Gem::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: *76510480
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: &76504870 !ruby/object:Gem::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: *76504870
57
+ version_requirements: *82114430
69
58
  - !ruby/object:Gem::Dependency
70
59
  name: rspec
71
- requirement: &76516560 !ruby/object:Gem::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: *76516560
68
+ version_requirements: *82111670
80
69
  - !ruby/object:Gem::Dependency
81
70
  name: bundler
82
- requirement: &76529460 !ruby/object:Gem::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: *76529460
79
+ version_requirements: *82109050
91
80
  - !ruby/object:Gem::Dependency
92
81
  name: jeweler
93
- requirement: &76525990 !ruby/object:Gem::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: *76525990
90
+ version_requirements: *82123730
102
91
  - !ruby/object:Gem::Dependency
103
92
  name: rcov
104
- requirement: &76524520 !ruby/object:Gem::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: *76524520
101
+ version_requirements: *82122310
113
102
  - !ruby/object:Gem::Dependency
114
103
  name: rr
115
- requirement: &76523420 !ruby/object:Gem::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: *76523420
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: 863655699
166
+ hash: -114953261
176
167
  required_rubygems_version: !ruby/object:Gem::Requirement
177
168
  none: false
178
169
  requirements: