ssh-hull 1.0.0

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.
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: []