ssh-hull 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +44 -0
  3. data/.gitignore +27 -0
  4. data/.rubocop.yml +62 -0
  5. data/.tool-versions +1 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +142 -0
  8. data/LICENSE +19 -0
  9. data/README.md +12 -0
  10. data/Rakefile +7 -0
  11. data/bin/bundle +114 -0
  12. data/bin/rake +29 -0
  13. data/bin/rspec +29 -0
  14. data/bin/rubocop +29 -0
  15. data/bomb +12 -0
  16. data/config/locales/en.yml +71 -0
  17. data/config/locales/fr.yml +71 -0
  18. data/exe/ssh-hull +12 -0
  19. data/exe/ssh-tunnel +1 -0
  20. data/lib/ssh-hull/cli.rb +113 -0
  21. data/lib/ssh-hull/logger.rb +6 -0
  22. data/lib/ssh-hull/ui/application.rb +47 -0
  23. data/lib/ssh-hull/ui/forms/application_form.rb +69 -0
  24. data/lib/ssh-hull/ui/forms/host_form.rb +27 -0
  25. data/lib/ssh-hull/ui/forms/tunnel_form.rb +31 -0
  26. data/lib/ssh-hull/ui/helpers/application_window_helper.rb +233 -0
  27. data/lib/ssh-hull/ui/helpers/common/form_helper.rb +169 -0
  28. data/lib/ssh-hull/ui/helpers/common/minimize_helper.rb +46 -0
  29. data/lib/ssh-hull/ui/helpers/common/modal_helper.rb +43 -0
  30. data/lib/ssh-hull/ui/helpers/common/toolbar_helper.rb +106 -0
  31. data/lib/ssh-hull/ui/helpers/common/translation_helper.rb +18 -0
  32. data/lib/ssh-hull/ui/helpers/common/tree_view_helper.rb +40 -0
  33. data/lib/ssh-hull/ui/helpers/host_window_helper.rb +230 -0
  34. data/lib/ssh-hull/ui/helpers/tunnel_window_helper.rb +96 -0
  35. data/lib/ssh-hull/ui/models/config.rb +82 -0
  36. data/lib/ssh-hull/ui/models/host.rb +90 -0
  37. data/lib/ssh-hull/ui/models/tunnel.rb +118 -0
  38. data/lib/ssh-hull/ui/status_icon.rb +45 -0
  39. data/lib/ssh-hull/ui/windows/about_window.rb +32 -0
  40. data/lib/ssh-hull/ui/windows/application_window.rb +42 -0
  41. data/lib/ssh-hull/ui/windows/hosts/delete_window.rb +56 -0
  42. data/lib/ssh-hull/ui/windows/hosts/edit_window.rb +39 -0
  43. data/lib/ssh-hull/ui/windows/hosts/new_window.rb +45 -0
  44. data/lib/ssh-hull/ui/windows/tunnels/delete_window.rb +57 -0
  45. data/lib/ssh-hull/ui/windows/tunnels/edit_window.rb +39 -0
  46. data/lib/ssh-hull/ui/windows/tunnels/new_window.rb +45 -0
  47. data/lib/ssh-hull/version.rb +17 -0
  48. data/lib/ssh-tunnel.rb +94 -0
  49. data/resources/gresources.xml +13 -0
  50. data/resources/ui/about_window.glade +48 -0
  51. data/resources/ui/application_window.glade +196 -0
  52. data/resources/ui/hosts/delete_window.glade +74 -0
  53. data/resources/ui/hosts/edit_window.glade +331 -0
  54. data/resources/ui/hosts/new_window.glade +328 -0
  55. data/resources/ui/tunnels/delete_window.glade +73 -0
  56. data/resources/ui/tunnels/edit_window.glade +305 -0
  57. data/resources/ui/tunnels/new_window.glade +305 -0
  58. data/snap/snapcraft.yaml +48 -0
  59. data/spec/factories/host.rb +22 -0
  60. data/spec/factories/tunnel.rb +16 -0
  61. data/spec/spec_helper.rb +31 -0
  62. data/spec/ssh_tunnel/ui/forms/host_form_spec.rb +103 -0
  63. data/spec/ssh_tunnel/ui/forms/tunnel_form_spec.rb +132 -0
  64. data/spec/ssh_tunnel/ui/models/host_spec.rb +116 -0
  65. data/spec/ssh_tunnel/ui/models/tunnel_spec.rb +43 -0
  66. data/spec/ssh_tunnel_spec.rb +45 -0
  67. data/ssh-hull.gemspec +38 -0
  68. metadata +320 -0
@@ -0,0 +1,116 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SSHTunnel::UI::Models::Host do
4
+
5
+ let(:host) { FactoryBot.build(:host) }
6
+
7
+ describe '#to_s' do
8
+ it 'should return host name' do
9
+ expect(host.to_s).to eq host.name
10
+ end
11
+ end
12
+
13
+ describe '#to_hash' do
14
+ it 'should return a hash of attributes' do
15
+ expect(host.to_hash).to eq({
16
+ uuid: '7be48819-97bf-49fc-98af-4f7f096e1977',
17
+ name: 'foo',
18
+ user: 'root',
19
+ host: 'host.example.net',
20
+ port: 22,
21
+ identity_file: nil,
22
+ tunnels: [],
23
+ })
24
+ end
25
+
26
+ context 'with multiple tunnels' do
27
+ let(:host) { FactoryBot.build(:host_with_two_tunnels) }
28
+
29
+ it 'sorts tunnels by name' do
30
+ expect(host.to_hash).to eq({
31
+ uuid: '7be48819-97bf-49fc-98af-4f7f096e1977',
32
+ name: 'foo',
33
+ user: 'root',
34
+ host: 'host.example.net',
35
+ port: 22,
36
+ identity_file: nil,
37
+ tunnels: [
38
+ { local_host: '127.0.0.1', local_port: 10000, name: 'aaa', remote_host: '127.0.0.1', remote_port: 3306, type: 'local', uuid: '117aacde-5adf-4a6d-a0f9-5acdddf4a5b9', auto_start: nil },
39
+ { local_host: '127.0.0.1', local_port: 10000, name: 'zzz', remote_host: '127.0.0.1', remote_port: 3306, type: 'local', uuid: '117aacde-5adf-4a6d-a0f9-5acdddf4a5b9', auto_start: nil },
40
+ ],
41
+ })
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '#started?' do
47
+ context 'when tunnels are started' do
48
+ it 'should return true' do
49
+ host.start_tunnels!
50
+ expect(host.started?).to be true
51
+ end
52
+ end
53
+
54
+ context 'when tunnels are stopped' do
55
+ it 'should return false' do
56
+ expect(host.started?).to be false
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#start_tunnels!' do
62
+ it 'should start tunnels' do
63
+ expect(host.tunnels).to receive(:each)
64
+ host.start_tunnels!
65
+ expect(host.started?).to be true
66
+ end
67
+ end
68
+
69
+ describe '#stop_tunnels!' do
70
+ it 'should stop tunnels' do
71
+ expect(host.tunnels).to receive(:each)
72
+ host.stop_tunnels!
73
+ expect(host.started?).to be false
74
+ end
75
+ end
76
+
77
+ describe '#toggle_tunnels!' do
78
+ context 'when tunnels are stopped' do
79
+ it 'should start tunnels' do
80
+ expect(host.started?).to be false
81
+
82
+ host.toggle_tunnels!
83
+ expect(host.started?).to be true
84
+ end
85
+ end
86
+
87
+ context 'when tunnels are started' do
88
+ it 'should stop tunnels' do
89
+ host.start_tunnels!
90
+ expect(host.started?).to be true
91
+
92
+ host.toggle_tunnels!
93
+ expect(host.started?).to be false
94
+ end
95
+ end
96
+ end
97
+
98
+ describe '#add_tunnel' do
99
+ it 'should add tunnel to host' do
100
+ expect(host.tunnels).to eq []
101
+ tunnel = FactoryBot.build(:tunnel, parent: host)
102
+ host.add_tunnel(tunnel)
103
+ expect(host.tunnels).to eq [tunnel]
104
+ end
105
+ end
106
+
107
+ describe '#remove_tunnel' do
108
+ it 'should remove tunnel from host' do
109
+ host = FactoryBot.build(:host_with_one_tunnel)
110
+ expect(host.tunnels.size).to eq 1
111
+ tunnel = host.tunnels.first
112
+ host.remove_tunnel(tunnel)
113
+ expect(host.tunnels).to eq []
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SSHTunnel::UI::Models::Tunnel do
4
+
5
+ let(:tunnel) { FactoryBot.build(:tunnel_wih_parent) }
6
+
7
+ describe '#to_s' do
8
+ it 'should return tunnel name' do
9
+ expect(tunnel.to_s).to eq 'foo - mysql'
10
+ end
11
+ end
12
+
13
+ describe '#to_hash' do
14
+ it 'should return a hash of attributes' do
15
+ expect(tunnel.to_hash).to eq({
16
+ uuid: '117aacde-5adf-4a6d-a0f9-5acdddf4a5b9',
17
+ name: 'mysql',
18
+ type: 'local',
19
+ local_host: '127.0.0.1',
20
+ local_port: 10000,
21
+ remote_host: '127.0.0.1',
22
+ remote_port: 3306,
23
+ auto_start: nil,
24
+ })
25
+ end
26
+ end
27
+
28
+ describe '#command' do
29
+ it 'should return a ssh command to run' do
30
+ expect(tunnel.command).to eq ['/usr/bin/ssh', '-N', '-t', '-x', '-o', 'ExitOnForwardFailure=yes', '-lroot', '-L127.0.0.1:10000:127.0.0.1:3306', '-p22', 'host.example.net']
31
+ end
32
+
33
+ context 'when identity_file is set' do
34
+ let(:host) { FactoryBot.build(:host, identity_file: '/tmp/foo.key') }
35
+ let(:tunnel) { FactoryBot.build(:tunnel, parent: host) }
36
+
37
+ it 'should return a ssh command to run' do
38
+ expect(tunnel.command).to eq ['/usr/bin/ssh', '-N', '-t', '-x', '-o', 'ExitOnForwardFailure=yes', '-lroot', '-L127.0.0.1:10000:127.0.0.1:3306', '-p22', '-i/tmp/foo.key', 'host.example.net']
39
+ end
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SSHTunnel do
4
+
5
+ BASE_PATH = Pathname.new File.expand_path('..', __dir__)
6
+
7
+ describe '.root_path' do
8
+ it 'should return root_path path' do
9
+ expect(described_class.root_path).to eq BASE_PATH
10
+ end
11
+ end
12
+
13
+ describe '.resources_path' do
14
+ it 'should return resources_path path' do
15
+ expect(described_class.resources_path).to eq BASE_PATH.join('resources')
16
+ end
17
+ end
18
+
19
+ describe '.resources_xml' do
20
+ it 'should return resources_xml path' do
21
+ expect(described_class.resources_xml).to eq BASE_PATH.join('resources').join('gresources.xml')
22
+ end
23
+ end
24
+
25
+ describe '.resources_bin' do
26
+ it 'should return resources_bin path' do
27
+ expect(described_class.resources_bin).to eq Pathname.new('/tmp/gresources.bin')
28
+ end
29
+ end
30
+
31
+ describe '.locales_path' do
32
+ it 'should return locales_path path' do
33
+ expect(described_class.locales_path).to eq BASE_PATH.join('config', 'locales', '*.yml')
34
+ end
35
+ end
36
+
37
+ describe '.current_locale' do
38
+ it 'should return Gtk current_locale' do
39
+ expect {
40
+ described_class.current_locale
41
+ }.to_not raise_error
42
+ end
43
+ end
44
+
45
+ end
data/ssh-hull.gemspec ADDED
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/ssh-hull/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'ssh-hull'
7
+ s.version = SSHTunnel::VERSION::STRING
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Anders Pippi Tednes']
10
+ s.email = ['theblckswan@protonmail.com']
11
+ s.homepage = 'https://github.com/ungtb10d/ssh-hull'
12
+ s.summary = 'A Ruby/GTK3 gem to manage ssh hulls'
13
+ s.license = 'MIT'
14
+
15
+ s.required_ruby_version = '>= 2.7.0'
16
+
17
+ s.files = %x(git ls-files).split("\n")
18
+
19
+ s.bindir = 'exe'
20
+ s.executables = ['ssh-hull']
21
+
22
+ s.add_runtime_dependency 'activemodel', '>= 5.2'
23
+ s.add_runtime_dependency 'activesupport', '>= 5.2'
24
+ s.add_runtime_dependency 'gtk3'
25
+ s.add_runtime_dependency 'i18n'
26
+ s.add_runtime_dependency 'ruby2_keywords'
27
+ s.add_runtime_dependency 'subprocess'
28
+ s.add_runtime_dependency 'zeitwerk'
29
+
30
+ s.add_development_dependency 'factory_bot'
31
+ s.add_development_dependency 'pry'
32
+ s.add_development_dependency 'rake'
33
+ s.add_development_dependency 'rspec'
34
+ s.add_development_dependency 'rubocop'
35
+ s.add_development_dependency 'rubocop-rake'
36
+ s.add_development_dependency 'rubocop-rspec'
37
+ s.add_development_dependency 'simplecov'
38
+ end
metadata ADDED
@@ -0,0 +1,320 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ssh-hull
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Anders Pippi Tednes
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-11-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '5.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '5.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '5.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: gtk3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: i18n
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: ruby2_keywords
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: subprocess
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: zeitwerk
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: factory_bot
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rake
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubocop
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rubocop-rake
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rubocop-rspec
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: simplecov
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ description:
224
+ email:
225
+ - theblckswan@protonmail.com
226
+ executables:
227
+ - ssh-hull
228
+ extensions: []
229
+ extra_rdoc_files: []
230
+ files:
231
+ - ".github/workflows/ci.yml"
232
+ - ".gitignore"
233
+ - ".rubocop.yml"
234
+ - ".tool-versions"
235
+ - Gemfile
236
+ - Gemfile.lock
237
+ - LICENSE
238
+ - README.md
239
+ - Rakefile
240
+ - bin/bundle
241
+ - bin/rake
242
+ - bin/rspec
243
+ - bin/rubocop
244
+ - bomb
245
+ - config/locales/en.yml
246
+ - config/locales/fr.yml
247
+ - exe/ssh-hull
248
+ - exe/ssh-tunnel
249
+ - lib/ssh-hull/cli.rb
250
+ - lib/ssh-hull/logger.rb
251
+ - lib/ssh-hull/ui/application.rb
252
+ - lib/ssh-hull/ui/forms/application_form.rb
253
+ - lib/ssh-hull/ui/forms/host_form.rb
254
+ - lib/ssh-hull/ui/forms/tunnel_form.rb
255
+ - lib/ssh-hull/ui/helpers/application_window_helper.rb
256
+ - lib/ssh-hull/ui/helpers/common/form_helper.rb
257
+ - lib/ssh-hull/ui/helpers/common/minimize_helper.rb
258
+ - lib/ssh-hull/ui/helpers/common/modal_helper.rb
259
+ - lib/ssh-hull/ui/helpers/common/toolbar_helper.rb
260
+ - lib/ssh-hull/ui/helpers/common/translation_helper.rb
261
+ - lib/ssh-hull/ui/helpers/common/tree_view_helper.rb
262
+ - lib/ssh-hull/ui/helpers/host_window_helper.rb
263
+ - lib/ssh-hull/ui/helpers/tunnel_window_helper.rb
264
+ - lib/ssh-hull/ui/models/config.rb
265
+ - lib/ssh-hull/ui/models/host.rb
266
+ - lib/ssh-hull/ui/models/tunnel.rb
267
+ - lib/ssh-hull/ui/status_icon.rb
268
+ - lib/ssh-hull/ui/windows/about_window.rb
269
+ - lib/ssh-hull/ui/windows/application_window.rb
270
+ - lib/ssh-hull/ui/windows/hosts/delete_window.rb
271
+ - lib/ssh-hull/ui/windows/hosts/edit_window.rb
272
+ - lib/ssh-hull/ui/windows/hosts/new_window.rb
273
+ - lib/ssh-hull/ui/windows/tunnels/delete_window.rb
274
+ - lib/ssh-hull/ui/windows/tunnels/edit_window.rb
275
+ - lib/ssh-hull/ui/windows/tunnels/new_window.rb
276
+ - lib/ssh-hull/version.rb
277
+ - lib/ssh-tunnel.rb
278
+ - resources/gresources.xml
279
+ - resources/ui/about_window.glade
280
+ - resources/ui/application_window.glade
281
+ - resources/ui/hosts/delete_window.glade
282
+ - resources/ui/hosts/edit_window.glade
283
+ - resources/ui/hosts/new_window.glade
284
+ - resources/ui/tunnels/delete_window.glade
285
+ - resources/ui/tunnels/edit_window.glade
286
+ - resources/ui/tunnels/new_window.glade
287
+ - snap/snapcraft.yaml
288
+ - spec/factories/host.rb
289
+ - spec/factories/tunnel.rb
290
+ - spec/spec_helper.rb
291
+ - spec/ssh_tunnel/ui/forms/host_form_spec.rb
292
+ - spec/ssh_tunnel/ui/forms/tunnel_form_spec.rb
293
+ - spec/ssh_tunnel/ui/models/host_spec.rb
294
+ - spec/ssh_tunnel/ui/models/tunnel_spec.rb
295
+ - spec/ssh_tunnel_spec.rb
296
+ - ssh-hull.gemspec
297
+ homepage: https://github.com/ungtb10d/ssh-hull
298
+ licenses:
299
+ - MIT
300
+ metadata: {}
301
+ post_install_message:
302
+ rdoc_options: []
303
+ require_paths:
304
+ - lib
305
+ required_ruby_version: !ruby/object:Gem::Requirement
306
+ requirements:
307
+ - - ">="
308
+ - !ruby/object:Gem::Version
309
+ version: 2.7.0
310
+ required_rubygems_version: !ruby/object:Gem::Requirement
311
+ requirements:
312
+ - - ">="
313
+ - !ruby/object:Gem::Version
314
+ version: '0'
315
+ requirements: []
316
+ rubygems_version: 3.3.15
317
+ signing_key:
318
+ specification_version: 4
319
+ summary: A Ruby/GTK3 gem to manage ssh hulls
320
+ test_files: []