terminitor 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile.lock +6 -6
- data/README.md +57 -13
- data/lib/terminitor/abstract_core.rb +13 -7
- data/lib/terminitor/cores/mac_core.rb +7 -4
- data/lib/terminitor/dsl.rb +39 -37
- data/lib/terminitor/version.rb +1 -1
- data/terminitor.gemspec +2 -2
- data/test/abstract_core_test.rb +119 -60
- data/test/cli_test.rb +116 -83
- data/test/cores/mac_core_test.rb +110 -116
- data/test/dsl_test.rb +17 -3
- data/test/fixtures/bar.term +13 -1
- data/test/runner_test.rb +140 -152
- data/test/teststrap.rb +20 -2
- metadata +7 -17
data/test/dsl_test.rb
CHANGED
@@ -11,9 +11,23 @@ context "Dsl" do
|
|
11
11
|
setup { @yaml.to_hash }
|
12
12
|
asserts_topic.equivalent_to :setup=>["echo \"setup\""],
|
13
13
|
:windows=>{
|
14
|
-
"window1"=>{:tabs=>{"
|
15
|
-
|
16
|
-
|
14
|
+
"window1"=>{:tabs=>{"tab2"=>{:commands=>["echo 'named tab'", "ls"],
|
15
|
+
:options => {:name => "named tab", :settings=>"Grass"}},
|
16
|
+
"tab1"=>{:commands=>["echo 'first tab'", "echo 'of window'", "echo 'than now'"]},
|
17
|
+
"tab3"=>{:commands=>["top"],
|
18
|
+
:options =>{:name => "a tab", :settings => "Pro"}},
|
19
|
+
"default"=>{:commands=>['whoami']}
|
20
|
+
},
|
21
|
+
:before => ['cd /path'],
|
22
|
+
:options => {:size=>[70,30]}},
|
23
|
+
"window2"=>{:tabs=>{"tab1"=>{:commands=>["uptime"]},
|
24
|
+
"default"=>{:commands=>[]}
|
25
|
+
},
|
26
|
+
:before => ['whoami'],
|
27
|
+
:options => {:name => 'server'}},
|
28
|
+
"default"=>{:tabs=>{"tab1"=>{:commands=>["echo 'default'", "echo 'default tab'", "ok", "for real"]},
|
29
|
+
"default"=>{:commands=>[]}
|
30
|
+
}}}
|
17
31
|
end
|
18
32
|
|
19
33
|
end
|
data/test/fixtures/bar.term
CHANGED
@@ -6,12 +6,24 @@ setup 'echo "setup"'
|
|
6
6
|
tab "echo 'default'", "echo 'default tab'", "ok", "for real"
|
7
7
|
|
8
8
|
window :size => [70,30] do
|
9
|
+
|
10
|
+
before 'cd /path'
|
11
|
+
|
12
|
+
run "whoami"
|
9
13
|
tab "echo 'first tab'", "echo 'of window'", "echo 'than now'"
|
10
14
|
|
11
|
-
tab "named tab", :settings => "Grass" do
|
15
|
+
tab :name => "named tab", :settings => "Grass" do
|
12
16
|
run "echo 'named tab'"
|
13
17
|
run "ls"
|
14
18
|
end
|
19
|
+
|
20
|
+
tab :name => "a tab", :settings => "Pro" do
|
21
|
+
run "top"
|
22
|
+
end
|
15
23
|
end
|
16
24
|
|
25
|
+
window :name => 'server' do
|
26
|
+
before { run 'whoami' }
|
27
|
+
tab "uptime"
|
28
|
+
end
|
17
29
|
|
data/test/runner_test.rb
CHANGED
@@ -18,221 +18,209 @@ class TestItem
|
|
18
18
|
end
|
19
19
|
|
20
20
|
context "Runner" do
|
21
|
-
setup
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
setup do
|
22
|
+
@yaml = File.read(File.expand_path('../fixtures/foo.yml', __FILE__))
|
23
|
+
@template = File.read(File.expand_path('../../lib/templates/example.yml.tt', __FILE__))
|
24
|
+
@test_runner = TestRunner.new
|
25
|
+
FakeFS.activate!
|
26
|
+
end
|
25
27
|
teardown { FakeFS.deactivate! }
|
26
28
|
|
27
29
|
|
28
|
-
context "find_core" do
|
29
|
-
|
30
|
-
setup { @test_runner.find_core('darwin') }
|
31
|
-
asserts_topic.equals Terminitor::MacCore
|
32
|
-
end
|
30
|
+
context "#find_core" do
|
31
|
+
should("have Darwin") { @test_runner.find_core('darwin') }.equals Terminitor::MacCore
|
33
32
|
|
34
33
|
if platform?('linux') # TODO Gotta be a better way.
|
35
|
-
|
36
|
-
setup { @test_runner.find_core('linux') }
|
37
|
-
asserts_topic.equals Terminitor::KonsoleCore
|
38
|
-
end
|
34
|
+
should("have KDE") { @test_runner.find_core('linux') }.equals Terminitor::KonsoleCore
|
39
35
|
end
|
40
36
|
end
|
41
37
|
|
42
|
-
context "capture_core" do
|
43
|
-
|
44
|
-
setup { @test_runner.capture_core('darwin') }
|
45
|
-
asserts_topic.equals Terminitor::MacCapture
|
46
|
-
end
|
38
|
+
context "#capture_core" do
|
39
|
+
should("have Darwin") { @test_runner.capture_core('darwin') }.equals Terminitor::MacCapture
|
47
40
|
end
|
48
41
|
|
49
|
-
context "open_in_editor" do
|
50
|
-
context "using $EDITOR" do
|
51
|
-
setup { ENV['EDITOR'] = 'mate' }
|
52
|
-
setup { mock(@test_runner).system("mate /tmp/sample_project/foo.yml").returns {true}.once }
|
53
|
-
asserts("calls") { capture(:stdout) { @test_runner.open_in_editor("/tmp/sample_project/foo.yml") } }
|
54
|
-
end
|
42
|
+
context "#open_in_editor" do
|
55
43
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
asserts("calls") { capture(:stdout) { @test_runner.open_in_editor("/tmp/sample_project/foo.yml")} }
|
44
|
+
should "use $EDITOR" do
|
45
|
+
ENV['EDITOR'] = 'mate'
|
46
|
+
mock(@test_runner).system("mate /tmp/sample_project/foo.yml").returns {true}.once
|
47
|
+
capture(:stdout) { @test_runner.open_in_editor("/tmp/sample_project/foo.yml") }
|
61
48
|
end
|
62
49
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
asserts_topic.matches %r{please set}
|
50
|
+
should "use $TERM_EDITOR" do
|
51
|
+
ENV['TERM_EDITOR'] = 'vim'
|
52
|
+
ENV['EDITOR'] = 'jack'
|
53
|
+
mock(@test_runner).system("vim /tmp/sample_project/foo.yml").returns {true}.once
|
54
|
+
capture(:stdout) { @test_runner.open_in_editor("/tmp/sample_project/foo.yml") }
|
69
55
|
end
|
70
56
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
57
|
+
should "return a message without any editor that" do
|
58
|
+
ENV['TERM_EDITOR'] = nil
|
59
|
+
ENV['EDITOR'] = nil
|
60
|
+
mock(@test_runner).system("open /tmp/sample_project/foo.yml").returns {true}.once
|
61
|
+
capture(:stdout) { @test_runner.open_in_editor("/tmp/sample_project/foo.yml")}
|
62
|
+
end.matches %r{please set}
|
63
|
+
|
64
|
+
should "accept an editor" do
|
65
|
+
ENV['TERM_EDITOR'] = 'vim'
|
66
|
+
ENV['EDITOR'] = 'jack'
|
67
|
+
mock(@test_runner).system("nano /tmp/sample_project/foo.yml").returns {true}.once
|
68
|
+
capture(:stdout) { @test_runner.open_in_editor("/tmp/sample_project/foo.yml","nano") }
|
76
69
|
end
|
77
70
|
|
78
71
|
end
|
79
72
|
|
80
|
-
context "resolve_path" do
|
73
|
+
context "#resolve_path" do
|
81
74
|
setup { FileUtils.mkdir_p(File.join(ENV['HOME'],'.terminitor')) }
|
82
75
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
end
|
76
|
+
should "return yaml" do
|
77
|
+
FileUtils.touch(File.join(ENV['HOME'],'.terminitor','test.yml'))
|
78
|
+
@test_runner.resolve_path('test')
|
79
|
+
end.equals File.join(ENV['HOME'],'.terminitor','test.yml')
|
88
80
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
81
|
+
should "return term" do
|
82
|
+
FileUtils.touch(File.join(ENV['HOME'],'.terminitor','test.term'))
|
83
|
+
FileUtils.rm(File.join(ENV['HOME'],'.terminitor','test.yml'))
|
84
|
+
@test_runner.resolve_path('test')
|
85
|
+
end.equals File.join(ENV['HOME'],'.terminitor','test.term')
|
95
86
|
|
96
|
-
context "with Termfile" do
|
97
|
-
setup { FileUtils.rm(File.join(ENV['HOME'],'.terminitor','test.yml')) }
|
98
|
-
setup { FileUtils.rm(File.join(ENV['HOME'],'.terminitor','test.term')) }
|
99
|
-
setup { FileUtils.touch("Termfile") }
|
100
|
-
setup { mock(@test_runner).options { {:root => '.'} } }
|
101
|
-
setup { @test_runner.resolve_path("") }
|
102
|
-
asserts_topic.equals "./Termfile"
|
103
|
-
end
|
104
87
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
88
|
+
should "return Termfile" do
|
89
|
+
FileUtils.rm(File.join(ENV['HOME'],'.terminitor','test.yml'))
|
90
|
+
FileUtils.rm(File.join(ENV['HOME'],'.terminitor','test.term'))
|
91
|
+
FileUtils.touch("Termfile")
|
92
|
+
mock(@test_runner).options { {:root => '.'} }
|
93
|
+
@test_runner.resolve_path("")
|
94
|
+
end.equals "./Termfile"
|
109
95
|
|
110
|
-
context "with a project" do
|
111
|
-
setup { @test_runner.resolve_path('hey') }
|
112
|
-
asserts_topic.nil
|
113
|
-
end
|
114
96
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
97
|
+
context "with nothing" do
|
98
|
+
setup do
|
99
|
+
FileUtils.rm(File.join(ENV['HOME'],'.terminitor','test.yml'))
|
100
|
+
FileUtils.rm(File.join(ENV['HOME'],'.terminitor','test.term'))
|
101
|
+
FileUtils.rm("Termfile")
|
119
102
|
end
|
120
|
-
|
103
|
+
|
104
|
+
should("have path with a project") { @test_runner.resolve_path('hey') }.nil
|
121
105
|
|
122
|
-
|
106
|
+
should("have path without a project") do
|
107
|
+
mock(@test_runner).options.returns(:root => '.')
|
108
|
+
@test_runner.resolve_path ""
|
109
|
+
end.nil
|
123
110
|
|
124
|
-
context "config_path" do
|
125
|
-
context "for yaml" do
|
126
|
-
setup { @test_runner.config_path('test',:yml) }
|
127
|
-
asserts_topic.equals File.join(ENV['HOME'],'.terminitor','test.yml')
|
128
111
|
end
|
129
112
|
|
130
|
-
|
131
|
-
setup { @test_runner.config_path('test', :term) }
|
132
|
-
asserts_topic.equals File.join(ENV['HOME'],'.terminitor', 'test.term')
|
133
|
-
end
|
113
|
+
end
|
134
114
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
115
|
+
context "config_path" do
|
116
|
+
should("have yaml") { @test_runner.config_path('test',:yml) }.equals File.join(ENV['HOME'],'.terminitor','test.yml')
|
117
|
+
should("have term") { @test_runner.config_path('test', :term) }.equals File.join(ENV['HOME'],'.terminitor', 'test.term')
|
118
|
+
|
119
|
+
should "have Termfile" do
|
120
|
+
mock(@test_runner).options { {:root => '/tmp'} }
|
121
|
+
@test_runner.config_path ""
|
122
|
+
end.equals '/tmp/Termfile'
|
140
123
|
|
141
124
|
end
|
142
125
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
end
|
126
|
+
asserts "#grab_comment_for_file executes" do
|
127
|
+
File.open('foo.yml','w') { |f| f.puts @yaml }
|
128
|
+
@test_runner.grab_comment_for_file('foo.yml')
|
129
|
+
end.matches %r{- Foo.yml}
|
148
130
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
131
|
+
|
132
|
+
context "#return_error_message" do
|
133
|
+
|
134
|
+
should "return message with project" do
|
135
|
+
mock(@test_runner).say(%r{'hi' doesn't exist}) { true }
|
136
|
+
@test_runner.return_error_message('hi')
|
153
137
|
end
|
154
|
-
|
155
|
-
|
156
|
-
|
138
|
+
|
139
|
+
should "return message without project" do
|
140
|
+
mock(@test_runner).say(%r{Termfile}) { true }
|
141
|
+
@test_runner.return_error_message('')
|
157
142
|
end
|
143
|
+
|
158
144
|
end
|
159
145
|
|
160
|
-
context "execute_core" do
|
146
|
+
context "#execute_core" do
|
161
147
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
148
|
+
should "have error message with no path" do
|
149
|
+
mock(@test_runner).resolve_path('project') { nil }
|
150
|
+
mock(@test_runner).return_error_message('project') { true }
|
151
|
+
@test_runner.execute_core(:process!,'project')
|
166
152
|
end
|
167
153
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
154
|
+
should "have error message with no core" do
|
155
|
+
mock(@test_runner).resolve_path('project') { true }
|
156
|
+
mock(@test_runner).find_core(anything) { nil }
|
157
|
+
mock(@test_runner).say(/No suitable/) { true }
|
158
|
+
@test_runner.execute_core(:process!,'project')
|
173
159
|
end
|
174
160
|
|
175
161
|
context "with found core" do
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
end
|
183
|
-
mock(@test_runner).find_core(anything) { Terminitor::AbstractCore }
|
162
|
+
|
163
|
+
should "call #process!" do
|
164
|
+
mock(@test_runner).resolve_path('project') { '/path/to' }
|
165
|
+
any_instance_of(Terminitor::AbstractCore) do |core|
|
166
|
+
stub(core).load_termfile('/path/to') { true }
|
167
|
+
stub(core).process! { true }
|
184
168
|
end
|
185
|
-
|
169
|
+
mock(@test_runner).find_core(anything) { Terminitor::AbstractCore }
|
170
|
+
@test_runner.execute_core(:process!, 'project')
|
186
171
|
end
|
187
172
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
stub(core).setup! { true }
|
194
|
-
end
|
195
|
-
mock(@test_runner).find_core(anything) { Terminitor::AbstractCore }
|
173
|
+
should "call #setup!" do
|
174
|
+
mock(@test_runner).resolve_path('project') { '/path/to' }
|
175
|
+
any_instance_of(Terminitor::AbstractCore) do |core|
|
176
|
+
stub(core).load_termfile('/path/to') { true }
|
177
|
+
stub(core).setup! { true }
|
196
178
|
end
|
197
|
-
|
179
|
+
mock(@test_runner).find_core(anything) { Terminitor::AbstractCore }
|
180
|
+
@test_runner.execute_core(:setup!, 'project')
|
198
181
|
end
|
182
|
+
|
199
183
|
end
|
200
184
|
end
|
201
185
|
|
202
|
-
context "github_clone" do
|
186
|
+
context "#github_clone" do
|
187
|
+
|
203
188
|
context "with github" do
|
204
189
|
setup { stub(@test_runner).__double_definition_create__.call(:`,'which github') { "github" } }
|
205
|
-
|
206
|
-
|
207
|
-
|
190
|
+
|
191
|
+
should "invoke ssh with read/write priv" do
|
192
|
+
mock(@test_runner).system("github clone achiu terminitor --ssh") { true }
|
193
|
+
@test_runner.github_clone('achiu','terminitor')
|
208
194
|
end
|
209
195
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
196
|
+
should "invoke git:// with read only" do
|
197
|
+
mock(@test_runner).system("github clone achiu terminitor --ssh") { false }
|
198
|
+
mock(@test_runner).system("github clone achiu terminitor") { true }
|
199
|
+
@test_runner.github_clone('achiu', 'terminitor')
|
214
200
|
end
|
201
|
+
|
215
202
|
end
|
203
|
+
|
216
204
|
end
|
217
205
|
|
218
206
|
context "github_repo" do
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
end
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
end
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
207
|
+
should "invoke setup" do
|
208
|
+
mock(@test_runner).github_clone('achiu','terminitor') { true }
|
209
|
+
mock(FileUtils).cd(File.join(Dir.pwd,'terminitor')) { true }
|
210
|
+
mock(@test_runner).invoke(:setup, []) { true }
|
211
|
+
@test_runner.github_repo('achiu','terminitor', :setup => true)
|
212
|
+
end
|
213
|
+
|
214
|
+
should "invoke without setup" do
|
215
|
+
mock(@test_runner).github_clone('achiu','terminitor') { true }
|
216
|
+
mock(FileUtils).cd(File.join(Dir.pwd,'terminitor')) { true }
|
217
|
+
@test_runner.github_repo('achiu','terminitor')
|
218
|
+
end.nil
|
219
|
+
|
220
|
+
should "return a message on a failed repo" do
|
221
|
+
mock(@test_runner).github_clone('achiu','terminitor') { false }
|
222
|
+
mock(@test_runner).say("could not fetch repo!") { true }
|
223
|
+
@test_runner.github_repo('achiu', 'terminitor')
|
236
224
|
end
|
237
225
|
|
238
226
|
end
|
data/test/teststrap.rb
CHANGED
@@ -16,7 +16,7 @@ def platform?(platform)
|
|
16
16
|
RUBY_PLATFORM.downcase.include?(platform)
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
module Kernel
|
20
20
|
def capture(stream)
|
21
21
|
begin
|
22
22
|
stream = stream.to_s
|
@@ -28,4 +28,22 @@ class Object
|
|
28
28
|
end
|
29
29
|
result
|
30
30
|
end
|
31
|
-
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# This is to silence the 'task' warning for the mocks.
|
34
|
+
class Thor
|
35
|
+
class << self
|
36
|
+
def create_task(meth) #:nodoc:
|
37
|
+
if @usage && @desc
|
38
|
+
base_class = @hide ? Thor::HiddenTask : Thor::Task
|
39
|
+
tasks[meth] = base_class.new(meth, @desc, @long_desc, @usage, method_options)
|
40
|
+
@usage, @desc, @long_desc, @method_options, @hide = nil
|
41
|
+
true
|
42
|
+
elsif self.all_tasks[meth] || meth == "method_missing"
|
43
|
+
true
|
44
|
+
else
|
45
|
+
false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terminitor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 19
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Arthur Chiu
|
@@ -16,7 +15,7 @@ autorequire:
|
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
17
|
|
19
|
-
date: 2010-
|
18
|
+
date: 2010-12-01 00:00:00 -08:00
|
20
19
|
default_executable:
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
@@ -27,7 +26,6 @@ dependencies:
|
|
27
26
|
requirements:
|
28
27
|
- - ">="
|
29
28
|
- !ruby/object:Gem::Version
|
30
|
-
hash: 3
|
31
29
|
segments:
|
32
30
|
- 0
|
33
31
|
version: "0"
|
@@ -41,7 +39,6 @@ dependencies:
|
|
41
39
|
requirements:
|
42
40
|
- - ~>
|
43
41
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 39
|
45
42
|
segments:
|
46
43
|
- 0
|
47
44
|
- 14
|
@@ -57,7 +54,6 @@ dependencies:
|
|
57
54
|
requirements:
|
58
55
|
- - ~>
|
59
56
|
- !ruby/object:Gem::Version
|
60
|
-
hash: 5
|
61
57
|
segments:
|
62
58
|
- 0
|
63
59
|
- 4
|
@@ -73,7 +69,6 @@ dependencies:
|
|
73
69
|
requirements:
|
74
70
|
- - ~>
|
75
71
|
- !ruby/object:Gem::Version
|
76
|
-
hash: 23
|
77
72
|
segments:
|
78
73
|
- 1
|
79
74
|
- 0
|
@@ -89,12 +84,11 @@ dependencies:
|
|
89
84
|
requirements:
|
90
85
|
- - ~>
|
91
86
|
- !ruby/object:Gem::Version
|
92
|
-
hash: 51
|
93
87
|
segments:
|
94
88
|
- 0
|
95
|
-
-
|
89
|
+
- 12
|
96
90
|
- 0
|
97
|
-
version: 0.
|
91
|
+
version: 0.12.0
|
98
92
|
type: :development
|
99
93
|
version_requirements: *id005
|
100
94
|
- !ruby/object:Gem::Dependency
|
@@ -103,9 +97,8 @@ dependencies:
|
|
103
97
|
requirement: &id006 !ruby/object:Gem::Requirement
|
104
98
|
none: false
|
105
99
|
requirements:
|
106
|
-
- -
|
100
|
+
- - ~>
|
107
101
|
- !ruby/object:Gem::Version
|
108
|
-
hash: 23
|
109
102
|
segments:
|
110
103
|
- 1
|
111
104
|
- 0
|
@@ -121,7 +114,6 @@ dependencies:
|
|
121
114
|
requirements:
|
122
115
|
- - ">="
|
123
116
|
- !ruby/object:Gem::Version
|
124
|
-
hash: 3
|
125
117
|
segments:
|
126
118
|
- 0
|
127
119
|
version: "0"
|
@@ -190,7 +182,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
190
182
|
requirements:
|
191
183
|
- - ">="
|
192
184
|
- !ruby/object:Gem::Version
|
193
|
-
hash: 3
|
194
185
|
segments:
|
195
186
|
- 0
|
196
187
|
version: "0"
|
@@ -199,7 +190,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
190
|
requirements:
|
200
191
|
- - ">="
|
201
192
|
- !ruby/object:Gem::Version
|
202
|
-
hash: 23
|
203
193
|
segments:
|
204
194
|
- 1
|
205
195
|
- 3
|