netid-tools 0.5.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,6 +4,7 @@ gem "nokogiri"
4
4
  gem "colored"
5
5
  gem "net-ssh"
6
6
  gem 'terminal-table'
7
+ gem 'rspec'
7
8
  group :development do
8
9
  gem "shoulda", ">= 0"
9
10
  gem "rdoc", "~> 3.12"
data/README.md CHANGED
@@ -143,6 +143,15 @@ The NetID you want to check
143
143
  Version History
144
144
  ===============
145
145
 
146
+ ## 0.6.0
147
+
148
+ * Add tests; refactor various methods
149
+ * Switch more commands to use Response objects rather than bare responses. Documentation pending.
150
+
151
+ ## 0.5.5
152
+
153
+ * Switch process listing to individual class
154
+
146
155
  ## 0.5.4
147
156
 
148
157
  * Switch table formatting on ua_check binary
data/Rakefile CHANGED
@@ -44,3 +44,6 @@ Rake::RDocTask.new do |rdoc|
44
44
  rdoc.rdoc_files.include('README*')
45
45
  rdoc.rdoc_files.include('lib/**/*.rb')
46
46
  end
47
+
48
+ require 'rspec/core/rake_task'
49
+ RSpec::Core::RakeTask.new('spec')
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.4
1
+ 0.6.0
data/bin/ua_check CHANGED
@@ -69,11 +69,19 @@ user.each do |netid|
69
69
  hosts.each do |host|
70
70
  processes = checkr.get_processes(host)
71
71
  if processes
72
- puts "\nProcesses for #{host}:\n".cyan
73
- processes.each do |l|
74
- puts l
72
+ table = Terminal::Table.new do |t|
73
+ t.title = host
74
+ t.headings = processes.headers
75
+ processes.processes.each do |p|
76
+ if p[9].length > 80
77
+ p[9].slice!(80,p[9].length-80)
78
+ end
79
+ t << p
80
+ end
75
81
  end
82
+
76
83
  end
84
+ puts table
77
85
  end
78
86
  end
79
87
 
@@ -1,4 +1,7 @@
1
1
  class GenericResponse
2
2
  attr_accessor :response, :error
3
+ # def inspect
4
+ # response
5
+ # end
3
6
  end
4
7
 
data/lib/netid-tools.rb CHANGED
@@ -3,13 +3,15 @@ require 'colored'
3
3
  require 'netid-validator'
4
4
  require 'system-connect'
5
5
  require 'generic-response'
6
+ require 'unix-processes'
7
+ require 'quota-response'
6
8
 
7
9
  class Netid
8
10
  include SystemConnect
9
11
 
10
- attr_accessor :netid, :system_user, :systems, :single_host, :user_clusters
12
+ attr_accessor :netid, :system_user, :systems, :primary_host, :secondary_host
11
13
 
12
- def initialize(netid,system_user=nil,systems=nil,single_host=nil)
14
+ def initialize(netid,system_user=nil,systems=nil,primary_host=nil,secondary_host=nil)
13
15
  @netid = netid
14
16
  @system_user = system_user || `whoami`.chomp
15
17
  @systems = systems || ["ovid01.u.washington.edu",
@@ -17,7 +19,8 @@ class Netid
17
19
  "ovid03.u.washington.edu",
18
20
  "vergil.u.washington.edu"
19
21
  ]
20
- @single_host = single_host || "ovid02.u.washington.edu"
22
+ @primary_host = primary_host || "ovid02.u.washington.edu"
23
+ @secondary_host = secondary_host || "vergil.u.washington.edu"
21
24
  end
22
25
 
23
26
  def validate_netid
@@ -37,7 +40,7 @@ class Netid
37
40
  result = run_remote_command(command,host)
38
41
  if result =~ /mysql/
39
42
  /port=(?<port>\d+)/ =~ result
40
- [host,port]
43
+ [host,port.to_i]
41
44
  else
42
45
  false
43
46
  end
@@ -45,20 +48,44 @@ class Netid
45
48
 
46
49
  def get_processes(host)
47
50
  if /no such user/i =~ run_remote_command("id #{netid}",host)
48
- result = nil
51
+ result = false
49
52
  else
50
- result = run_remote_command("ps -F --user=#{netid}",host).lines.map{|l| l.chomp}
51
- result = remove_extra_processes(result)
52
- end
53
- if result.nil? || result.count == 1
54
- false
55
- else
56
- result
53
+
54
+ command = "ps -o pid,user,cputime,nice,wchan,pcpu,pmem,rss,start_time,cmd --user #{netid}"
55
+ raw_processes = run_remote_command(command,host).lines.map{|l| l.chomp}
56
+ refined_processes = UnixProcesses.new(host)
57
+
58
+ refined_processes.headers = raw_processes[0].split
59
+ raw_processes.delete_at(0)
60
+
61
+ refined_processes.processes = raw_processes.map do |line|
62
+ line = line.split
63
+
64
+ if line.size > 9
65
+ process = line.slice!(9,line.size-9)
66
+ line[9] = process.join(" ")
67
+ end
68
+ line
69
+ end
70
+ refined_processes
57
71
  end
72
+
73
+
74
+ # if /no such user/i =~ run_remote_command("id #{netid}",host)
75
+ # result = nil
76
+ # else
77
+ # result = run_remote_command("ps -F --user=#{netid}",host).lines.map{|l| l.chomp}
78
+ # result = remove_extra_processes(result)
79
+ # end
80
+ # if result.nil? || result.count == 1
81
+ # false
82
+ # else
83
+ # result
84
+ # end
58
85
  end
59
86
 
60
87
  def check_for_localhome
61
- result = run_remote_command("cpw -poh #{netid}",single_host)
88
+ result = run_remote_command("cpw -poh #{netid}",primary_host)
62
89
  if result =~ /Unknown/
63
90
  false
64
91
  else
@@ -69,9 +96,9 @@ class Netid
69
96
  def check_webtype
70
97
  result = []
71
98
  command = "webtype -user #{netid}"
72
- result = run_remote_command(command,single_host).chomp.split
99
+ result = run_remote_command(command,primary_host).chomp.split
73
100
  if result[0] == "user"
74
- result = run_remote_command(command,host).chomp.split(" ")
101
+ result = run_remote_command(command,secondary_host).chomp.split
75
102
  else
76
103
  result
77
104
  end
@@ -79,25 +106,29 @@ class Netid
79
106
 
80
107
 
81
108
  def check_quota
82
- result = run_remote_command("quota #{netid}",single_host)
83
- result = result.chomp.split("\n")
84
- result.delete_at(0) if result.first == ''
85
- uid = /uid\s(\d+)/.match(result.first)[1].to_i
86
- result.delete_at(0)
87
-
88
- headings = process_quota_headers(result)
89
109
 
90
- results = []
91
- results << headings
92
- result.each do |line|
93
- line = line.split
94
- line.insert(4, 'n/a') if line.size == 6
110
+ command_result = run_remote_command("quota #{netid}",primary_host)
95
111
 
96
- expand_cluster_path(line)
97
-
98
- results << line
112
+ if command_result =~ /unknown user/
113
+ result = GenericResponse.new
114
+ result.error = "Unknown User #{netid} on #{primary_host}"
115
+ result.response = false
116
+ else
117
+ result = QuotaResponse.new
118
+
119
+ command_result = command_result.chomp.split("\n")
120
+ command_result.delete_at(0) if command_result.first == ""
121
+ command_result.delete_at(0) # remove uid line
122
+
123
+ result.headers = process_quota_headers(command_result)
124
+ result.response = command_result.map do |line|
125
+ line = line.split
126
+ line.insert(4, 'n/a') if line.size == 6
127
+ expand_cluster_path(line)
128
+ line
129
+ end
99
130
  end
100
- results
131
+ result
101
132
  end
102
133
 
103
134
  private
@@ -128,13 +159,14 @@ class Netid
128
159
  end
129
160
 
130
161
  def get_user_clusters
131
- if user_clusters
132
- user_clusters
162
+ if @user_clusters
163
+ @user_clusters
133
164
  else
134
165
  command = "gpw -D #{netid} | sed '1d' | sed 'N;$!P;$!D;$d' | sort | uniq"
135
- run_remote_command(command,single_host).split("\n").map do |line|
166
+ @user_clusters = run_remote_command(command,primary_host).map do |line|
136
167
  line.chomp
137
168
  end
138
169
  end
139
170
  end
171
+
140
172
  end
@@ -0,0 +1,6 @@
1
+ class QuotaResponse < GenericResponse
2
+ attr_accessor :headers
3
+ def initialize
4
+ super
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ class UnixProcesses
2
+ attr_accessor :headers, :hostname, :processes
3
+ def initialize(hostname)
4
+ @hostname = hostname
5
+ @processes = []
6
+ @headers = nil
7
+ end
8
+ end
data/netid-tools.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "netid-tools"
8
- s.version = "0.5.4"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nikky Southerland"]
12
- s.date = "2013-06-26"
12
+ s.date = "2013-06-27"
13
13
  s.description = "Gem with various methods to support UW NetIDs"
14
14
  s.email = "nikky@uw.edu"
15
15
  s.executables = ["ua_check"]
@@ -28,8 +28,13 @@ Gem::Specification.new do |s|
28
28
  "lib/generic-response.rb",
29
29
  "lib/netid-tools.rb",
30
30
  "lib/netid-validator.rb",
31
+ "lib/quota-response.rb",
31
32
  "lib/system-connect.rb",
32
- "netid-tools.gemspec"
33
+ "lib/unix-processes.rb",
34
+ "netid-tools.gemspec",
35
+ "spec/netid_tools_spec.rb",
36
+ "spec/spec_helper.rb",
37
+ "spec/unix_processes_spec.rb"
33
38
  ]
34
39
  s.homepage = "http://github.com/allynfolksjr/netid-tools"
35
40
  s.licenses = ["Apache License, Version 2.0"]
@@ -45,6 +50,7 @@ Gem::Specification.new do |s|
45
50
  s.add_runtime_dependency(%q<colored>, [">= 0"])
46
51
  s.add_runtime_dependency(%q<net-ssh>, [">= 0"])
47
52
  s.add_runtime_dependency(%q<terminal-table>, [">= 0"])
53
+ s.add_runtime_dependency(%q<rspec>, [">= 0"])
48
54
  s.add_development_dependency(%q<shoulda>, [">= 0"])
49
55
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
50
56
  s.add_development_dependency(%q<bundler>, [">= 0"])
@@ -57,6 +63,7 @@ Gem::Specification.new do |s|
57
63
  s.add_dependency(%q<colored>, [">= 0"])
58
64
  s.add_dependency(%q<net-ssh>, [">= 0"])
59
65
  s.add_dependency(%q<terminal-table>, [">= 0"])
66
+ s.add_dependency(%q<rspec>, [">= 0"])
60
67
  s.add_dependency(%q<shoulda>, [">= 0"])
61
68
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
62
69
  s.add_dependency(%q<bundler>, [">= 0"])
@@ -70,6 +77,7 @@ Gem::Specification.new do |s|
70
77
  s.add_dependency(%q<colored>, [">= 0"])
71
78
  s.add_dependency(%q<net-ssh>, [">= 0"])
72
79
  s.add_dependency(%q<terminal-table>, [">= 0"])
80
+ s.add_dependency(%q<rspec>, [">= 0"])
73
81
  s.add_dependency(%q<shoulda>, [">= 0"])
74
82
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
75
83
  s.add_dependency(%q<bundler>, [">= 0"])
@@ -0,0 +1,211 @@
1
+ require 'spec_helper'
2
+ require 'netid-tools'
3
+
4
+ describe Netid do
5
+
6
+ def mock_system_response(*responses)
7
+ responses.each do |response|
8
+ @netid.should_receive(:run_remote_command).and_return(response)
9
+ end
10
+ end
11
+
12
+ before do
13
+ @netid = Netid.new('test')
14
+ end
15
+
16
+ context "sanity checks" do
17
+ it "responds to #netid" do
18
+ @netid.should respond_to :netid
19
+ @netid.netid.should eq 'test'
20
+ end
21
+ it "responds to #system_user" do
22
+ @netid.should respond_to :system_user
23
+ @netid.system_user.should eq `whoami`.chomp
24
+ end
25
+ it "responds to #systems" do
26
+ @netid.should respond_to :systems
27
+ @netid.systems.should respond_to :size
28
+ end
29
+ it "responds to #primary_host" do
30
+ @netid.should respond_to :primary_host
31
+ @netid.primary_host.should_not be_nil
32
+ end
33
+ it "responds to #secondary_host" do
34
+ @netid.should respond_to :secondary_host
35
+ @netid.secondary_host.should_not be_nil
36
+ end
37
+ it "requires a NetID to be initialized" do
38
+ expect do
39
+ Netid.new
40
+ end.to raise_error
41
+ end
42
+
43
+ end
44
+
45
+ context "#validate_netid" do
46
+ it "returns a GenericResponse of true on valid NetID" do
47
+ @netid.validate_netid.response.should eq true
48
+ end
49
+ it "returns a GenericResponse of false on invalid netid" do
50
+ Netid.new('123test').validate_netid.response.should be_false
51
+ end
52
+ it "returns a GenericResponse with error message on invalid netid" do
53
+ Netid.new('123test').validate_netid.error.should eq "Not a valid NetID"
54
+ end
55
+ end
56
+
57
+ context "#validate_netid?" do
58
+ it "returns true on valid NetID" do
59
+ @netid.validate_netid?.should be_true
60
+ end
61
+ it "returns false on NetID that starts with number" do
62
+ Netid.new('123test').validate_netid?.should be_false
63
+ end
64
+ it "returns false on NetID that is too long" do
65
+ Netid.new('abcdefghijklmnop').validate_netid?.should be_false
66
+ end
67
+ end
68
+
69
+ context "::validate_netid?" do
70
+ it "returns true on valid NetID" do
71
+ Netid.validate_netid?('nikky').should be_true
72
+ end
73
+ it "returns false on invalid NetID" do
74
+ Netid.validate_netid?('123test').should be_false
75
+ end
76
+ end
77
+
78
+ context "#check_for_mysql_presence" do
79
+ it "returns array with host and port on valid return" do
80
+ valid_return = "nikky 10167 0.0 0.0 271528 2904 ? SNl 2012
81
+ 0:02 /da23/d38/nikky/mysql/bin/mysqld --basedir=/da23/d38/nikky/mysql
82
+ --datadir=/da23/d38/nikky/mysql/data
83
+ --plugin-dir=/da23/d38/nikky/mysql/lib/plugin
84
+ --log-error=/da23/d38/nikky/mysql/data/mysql-bin.err
85
+ --pid-file=/da23/d38/nikky/mysql/data/ovid02.u.washington.edu.pid
86
+ --socket=/da23/d38/nikky/mysql.sock --port=5280"
87
+ mock_system_response(valid_return)
88
+ @netid.check_for_mysql_presence('fake.example.com').should eq ['fake.example.com', 5280]
89
+ end
90
+ it "returns false with no valid result" do
91
+ mock_system_response("")
92
+ @netid.check_for_mysql_presence('fake.example.com').should be_false
93
+ end
94
+ end
95
+
96
+ context "#get_processes" do
97
+ it "returns false if a user is not detected" do
98
+ mock_system_response("no such user")
99
+ @netid.get_processes('example.com').should be_false
100
+ end
101
+ it "returns a UnixProcesses object on success" do
102
+ mock_system_response("exists","1\n2\n3")
103
+ @netid.get_processes('example.com').class.should eq UnixProcesses
104
+ end
105
+ it "contains proper headers with successful return" do
106
+ mock_system_response("exists","a b c\n2\n3")
107
+ @netid.get_processes('example.com').headers.should eq %w(a b c)
108
+ end
109
+ it "properly merges commnds with spaces into one array element" do
110
+ mock_system_response("exists","a b c\n1 2 3 4 5 6 7 8 9 command with space\n2")
111
+ @netid.get_processes('example.com').processes.first[9].should eq "command with space"
112
+ end
113
+ it "properly handles commnds without spaces" do
114
+ mock_system_response("exists","a b c\n1 2 3 4 5 6 7 8 9 command_without_space\n2")
115
+ @netid.get_processes('example.com').processes.first[9].should eq "command_without_space"
116
+ end
117
+ it "doesn't contain newlines" do
118
+ mock_system_response("exists","1\n2\n3")
119
+ @netid.get_processes('example.com').processes.select{|s| s =~ /\/n/}.should be_empty
120
+ end
121
+ it "doesn't contain headers in main processes object" do
122
+ mock_system_response("exists","headers pid guid\n1 2 3 4 5 6 7 8 9 command with space\n2")
123
+ return_obj = @netid.get_processes('example.com')
124
+ return_obj.headers.should eq %w(headers pid guid)
125
+ return_obj.processes.should_not include %w(headers pid guid)
126
+ end
127
+ it "has processes which responds to .each" do
128
+ mock_system_response("exists","headers pid guid\n1 2 3 4 5 6 7 8 9 command with space\n2")
129
+ return_obj = @netid.get_processes('example.com')
130
+ return_obj.processes.should respond_to(:each)
131
+ end
132
+ end
133
+
134
+ context "#check_for_localhome" do
135
+ it "returns the localhome location upon success" do
136
+ mock_system_response("/ov03/dw21/derp")
137
+ @netid.check_for_localhome.should eq ("/ov03/dw21/derp")
138
+ end
139
+ it "returns false if no result" do
140
+ mock_system_response("user Unknown")
141
+ @netid.check_for_localhome.should be_false
142
+ end
143
+ end
144
+
145
+ context "#check_webtype" do
146
+ it "returns array of webtypes upon success" do
147
+ mock_system_response("depts\ncourses")
148
+ @netid.check_webtype.should eq %w(depts courses)
149
+ end
150
+ it "returns empty array if no webtypes found" do
151
+ mock_system_response("")
152
+ @netid.check_webtype.should be_empty
153
+ end
154
+ it "tries alternate host if primary returns no user found" do
155
+ mock_system_response("user Unknown","depts\ncourses")
156
+ @netid.check_webtype.should eq %w(depts courses)
157
+ end
158
+ it "returns empty array if no webtypes found on alternate host" do
159
+ mock_system_response("user Unknown","")
160
+ @netid.check_webtype.should eq %w()
161
+ end
162
+
163
+ end
164
+
165
+ context "#check_quota" do
166
+ default_quota_return_objects = []
167
+ it "returns an object of results on success" do
168
+ mock_system_response("\nuser uid 1 2 3\nheader a b c\nfilesystem usage quota limit files limit",default_quota_return_objects)
169
+ @netid.check_quota.should be_true
170
+ end
171
+ it "returns false upon failure" do
172
+ mock_system_response("unknown user")
173
+ @netid.check_quota.response.should be_false
174
+ end
175
+ it "return object has and responds to #response" do
176
+ mock_system_response("\nuser uid 1 2 3\nheader a b c\nfilesystem usage quota limit files limit",default_quota_return_objects)
177
+ @netid.check_quota.response.should eq [%w(filesystem usage quota limit n/a files limit)]
178
+ end
179
+ it "returns object with headers" do
180
+ mock_system_response("\nuser uid 1 2 3\nheader a b c\nfilesystem usage quota limit files limit",default_quota_return_objects)
181
+ @netid.check_quota.headers.should eq %w(header a b c)
182
+ end
183
+ it "will insert 'n/a' into 5th element if blank" do
184
+ mock_system_response("\nuser uid 1 2 3\nheader a b c\nfilesystem usage quota limit files limit\nfilesystem usage quota limit files limit",default_quota_return_objects)
185
+ @netid.check_quota.response.should eq [%w(filesystem usage quota limit n/a files limit), %w(filesystem usage quota limit n/a files limit)]
186
+ end
187
+ it "will not insert 'n/a' into 5th element if length is 7" do
188
+ mock_system_response("\nuser uid 1 2 3\nheader a b c\nfilesystem usage quota limit grace files limit\nfilesystem usage quota limit grace files limit",default_quota_return_objects)
189
+ @netid.check_quota.response.should eq [%w(filesystem usage quota limit grace files limit), %w(filesystem usage quota limit grace files limit)]
190
+ end
191
+ it "will handle mixed 5th element situations" do
192
+ mock_system_response("\nuser uid 1 2 3\nheader a b c\nfilesystem usage quota limit files limit\nfilesystem usage quota limit grace files limit",default_quota_return_objects)
193
+ @netid.check_quota.response.should eq [%w(filesystem usage quota limit n/a files limit), %w(filesystem usage quota limit grace files limit)]
194
+ end
195
+ it "will translate cluster shortnames into full path, if available" do
196
+ mock_system_response("\nuser uid 1 2 3\nheader a b c\n/cg32 usage quota limit files limit\n/hw00 usage quota limit grace files limit",
197
+ ["/cg32/rw00/derp", "/hw00/w00/ferp"])
198
+ @netid.check_quota.response.should eq [%w(/cg32/rw00/derp usage quota limit n/a files limit), %w(/hw00/w00/ferp usage quota limit grace files limit)]
199
+ end
200
+ it "will fall back to cluster shortnames if full path not found" do
201
+ mock_system_response("\nuser uid 1 2 3\nheader a b c\n/cg32 usage quota limit files limit\n/hw00 usage quota limit grace files limit",
202
+ ["/cg31/rw00/derp", "/hw01/w00/ferp"])
203
+ @netid.check_quota.response.should eq [%w(/cg32 usage quota limit n/a files limit), %w(/hw00 usage quota limit grace files limit)]
204
+ end
205
+ it "will handle mixed matching and unmatching clusters" do
206
+ mock_system_response("\nuser uid 1 2 3\nheader a b c\n/cg32 usage quota limit files limit\n/hw00 usage quota limit grace files limit",
207
+ ["/cg31/rw00/derp", "/hw00/w00/ferp"])
208
+ @netid.check_quota.response.should eq [%w(/cg32 usage quota limit n/a files limit), %w(/hw00/w00/ferp usage quota limit grace files limit)]
209
+ end
210
+ end
211
+ end
File without changes
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netid-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.6.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: 2013-06-26 00:00:00.000000000 Z
12
+ date: 2013-06-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -75,6 +75,22 @@ dependencies:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
78
94
  - !ruby/object:Gem::Dependency
79
95
  name: shoulda
80
96
  requirement: !ruby/object:Gem::Requirement
@@ -206,8 +222,13 @@ files:
206
222
  - lib/generic-response.rb
207
223
  - lib/netid-tools.rb
208
224
  - lib/netid-validator.rb
225
+ - lib/quota-response.rb
209
226
  - lib/system-connect.rb
227
+ - lib/unix-processes.rb
210
228
  - netid-tools.gemspec
229
+ - spec/netid_tools_spec.rb
230
+ - spec/spec_helper.rb
231
+ - spec/unix_processes_spec.rb
211
232
  homepage: http://github.com/allynfolksjr/netid-tools
212
233
  licenses:
213
234
  - Apache License, Version 2.0
@@ -223,7 +244,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
223
244
  version: '0'
224
245
  segments:
225
246
  - 0
226
- hash: 2601252175228595680
247
+ hash: -3395110718720004722
227
248
  required_rubygems_version: !ruby/object:Gem::Requirement
228
249
  none: false
229
250
  requirements: