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 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: