i2c2 1.0.0.beta4 → 1.0.0.beta5

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 (12) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -1
  3. data/Gemfile +1 -4
  4. data/Gemfile.lock +33 -38
  5. data/README.md +7 -18
  6. data/Rakefile +4 -3
  7. data/VERSION +1 -1
  8. data/bin/i2c2 +196 -232
  9. data/i2c2.gemspec +7 -17
  10. data/lib/i2c2.rb +144 -144
  11. metadata +8 -50
  12. data/.document +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7038fe5ca1884acbd69308cc5d4b80bdca193a50e3dac700ed97f13349212fcb
4
- data.tar.gz: 912bde1276d5de58bd61321133df61c36b6bc1e5a89fe0f69826adaf9e3e1f32
3
+ metadata.gz: 0e5df5c0abdd9207ac837daa324f76e909c75d68d910e38a41cd74b8a5b9f831
4
+ data.tar.gz: 44ccc3cc3b3352b202803afe055af829e9a377b7f96781910463f06e76ccffe5
5
5
  SHA512:
6
- metadata.gz: a73164c3d05331b5e3ce4500ae226388a5dc113b12b541619ff7d8637584b8b4ffc99223b3d6c161d63d706c984af769b3a4e5b6bbfb9de719f582407bbb57d6
7
- data.tar.gz: 6583acdc831c67a407fa237d6b7c2900f1653b7a9dc8b43713f9633d0011ed4b93e5685a7a146bb06bba27343b6b8367a7c16662ab64fe85d58d77dbd347b437
6
+ metadata.gz: 26e238fc897f8319bcafceda6ea485720c798c1e8a504e216abe2900375a8420f64918d4a366e9aac38ff6626497116b971e27cd6d2be5bd00e9b6177921432d
7
+ data.tar.gz: afefcd2de29436d6d180e406ed06ddf952f7fdcbc3ba2f76ca6357ae89258b83fc2b48c70454785123559e3e91346f95bcec673d583b34e5376eb2ecb7f6282d
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [1.0.0.beta5] 2020-09-10
6
+ ### Changed
7
+ - Remove support for connecting to cluster/hosts without using the explicit option
8
+ - Change default direction from column to row
9
+
5
10
  ## [1.0.0.beta4] 2019-05-15
6
11
  ### Changed
7
12
  - Fix problem after config file convertion to version 2
@@ -22,4 +27,4 @@
22
27
  - 100% compatible with i2cssh *branch master* at the time of fork (commit: ac0bf90), including auto complete config file name i2cssh-autocomplete.bash
23
28
 
24
29
  ## [0.99.0] - 2019-05-11
25
- - 100% compatible with i2cssh *2.2.0 (latest version)*, including the config file ~/.i2csshrc
30
+ - 100% compatible with i2cssh *2.2.0 (latest release)*, including the config file ~/.i2csshrc
data/Gemfile CHANGED
@@ -8,8 +8,5 @@ gem "rb-scpt", "~> 1.0.1"
8
8
  # Add dependencies to develop your gem here.
9
9
  # Include everything needed to run rake, tests, features, etc.
10
10
  group :development do
11
- gem "bundler", ">= 1.0.0"
12
- gem "jeweler", "2.1.2"
13
- gem "shoulda"
14
- gem "builder"
11
+ gem "jeweler"
15
12
  end
@@ -1,65 +1,60 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- addressable (2.6.0)
5
- public_suffix (>= 2.0.2, < 4.0)
6
- builder (3.2.2)
4
+ addressable (2.4.0)
5
+ builder (3.2.4)
7
6
  descendants_tracker (0.0.4)
8
7
  thread_safe (~> 0.3, >= 0.3.1)
9
8
  faraday (0.9.2)
10
9
  multipart-post (>= 1.2, < 3)
11
- git (1.5.0)
12
- github_api (0.11.3)
13
- addressable (~> 2.3)
14
- descendants_tracker (~> 0.0.1)
10
+ git (1.7.0)
11
+ rchardet (~> 1.8)
12
+ github_api (0.16.0)
13
+ addressable (~> 2.4.0)
14
+ descendants_tracker (~> 0.0.4)
15
15
  faraday (~> 0.8, < 0.10)
16
- hashie (>= 1.2)
17
- multi_json (>= 1.7.5, < 2.0)
18
- nokogiri (~> 1.6.0)
19
- oauth2
20
- hashie (3.6.0)
21
- highline (2.0.2)
22
- jeweler (2.1.2)
16
+ hashie (>= 3.4)
17
+ mime-types (>= 1.16, < 3.0)
18
+ oauth2 (~> 1.0)
19
+ hashie (4.1.0)
20
+ highline (2.0.3)
21
+ jeweler (2.3.9)
23
22
  builder
24
- bundler (>= 1.0)
23
+ bundler
25
24
  git (>= 1.2.5)
26
- github_api (~> 0.11.0)
25
+ github_api (~> 0.16.0)
27
26
  highline (>= 1.6.15)
28
27
  nokogiri (>= 1.5.10)
28
+ psych
29
29
  rake
30
30
  rdoc
31
- semver
32
- jwt (1.5.6)
33
- mini_portile2 (2.1.0)
34
- multi_json (1.13.1)
31
+ semver2
32
+ jwt (2.2.2)
33
+ mime-types (2.99.3)
34
+ mini_portile2 (2.4.0)
35
+ multi_json (1.15.0)
35
36
  multi_xml (0.6.0)
36
- multipart-post (2.1.0)
37
- nokogiri (1.6.8.1)
38
- mini_portile2 (~> 2.1.0)
39
- oauth2 (1.4.1)
40
- faraday (>= 0.8, < 0.16.0)
37
+ multipart-post (2.1.1)
38
+ nokogiri (1.10.10)
39
+ mini_portile2 (~> 2.4.0)
40
+ oauth2 (1.4.4)
41
+ faraday (>= 0.8, < 2.0)
41
42
  jwt (>= 1.0, < 3.0)
42
43
  multi_json (~> 1.3)
43
44
  multi_xml (~> 0.5)
44
45
  rack (>= 1.2, < 3)
45
- public_suffix (2.0.5)
46
- rack (1.6.11)
47
- rake (12.3.2)
46
+ psych (3.2.0)
47
+ rack (2.2.3)
48
+ rake (13.0.1)
48
49
  rb-scpt (1.0.3)
49
- rdoc (5.1.0)
50
- semver (1.0.1)
51
- shoulda (2.11.3)
50
+ rchardet (1.8.0)
51
+ rdoc (6.2.1)
52
+ semver2 (3.4.2)
52
53
  thread_safe (0.3.6)
53
54
 
54
55
  PLATFORMS
55
56
  ruby
56
57
 
57
58
  DEPENDENCIES
58
- builder
59
- bundler (>= 1.0.0)
60
- jeweler (= 2.1.2)
59
+ jeweler
61
60
  rb-scpt (~> 1.0.1)
62
- shoulda
63
-
64
- BUNDLED WITH
65
- 1.17.3
data/README.md CHANGED
@@ -18,7 +18,7 @@ When using iTerm2 < 2.9, install old i2cssh version 1.16.0:
18
18
 
19
19
  ## Migrate from i2cssh
20
20
 
21
- If you have used i2cssh and want to migrate, you can do it painless using i2c2 version 0.99.0 which is 100% compatible with i2cssh 2.2.0 (latest version),
21
+ If you have used i2cssh and want to migrate, you can do it painless using i2c2 version 0.99.0 which is 100% compatible with i2cssh 2.2.0 (latest release),
22
22
  including the config file ~/.i2csshrc.
23
23
 
24
24
  Version 0.99.1 is compatible with i2cssh branch master at the time of fork (commit: ac0bf90), including auto complete config file name i2cssh-autocomplete.bash.
@@ -46,19 +46,8 @@ Version 0.99.1 is compatible with i2cssh branch master at the time of fork (comm
46
46
  -d, --direction DIRECTION Direction that new sessions are created (default: column)
47
47
  -X, --extra EXTRA_PARAM Additional ssh parameters (e.g. -Xi=myidentity.pem)
48
48
 
49
- i2c2 will assume you want to connect to a cluster when only one host is given.
50
-
51
49
  For `-c` and `-m` options, the format `username@cluster` or `username@host` can be used.
52
50
 
53
- The following commands are exactly the same, however, they might serve different purposes:
54
-
55
- $ i2c2 -m user1@host1,user2@host2
56
- $ i2c2 user1@host1 user2@host2
57
-
58
- You can combine these options and use them multiple times:
59
-
60
- $ i2c2 -m user1@host1,user2@host2 -m user3@host3 user4@host4 user5@host5
61
-
62
51
  Using the `-l` option will override all usernames:
63
52
 
64
53
  $ i2c2 -l foo user1@host1 user2@host2
@@ -79,12 +68,6 @@ The `i2csshrc` file is a YAML formatted file that contains the following structu
79
68
  - host1
80
69
  - host2
81
70
 
82
- ## Autocomplete
83
-
84
- To allow autocomplete, add the following to your .bash_profile, .bashrc or .profile
85
-
86
- $ source [path to ./extras/i2cssh-autocomplete.bash]
87
-
88
71
  ## Optional Parameters
89
72
 
90
73
  They can be used globally or per cluster and include:
@@ -113,6 +96,12 @@ The following precedence is used:
113
96
 
114
97
  Make sure the config file is valid YAML (e.g. use spaces instead of tabs)
115
98
 
99
+ ## Autocomplete
100
+
101
+ To allow autocomplete, add the following to your .bash_profile, .bashrc or .profile
102
+
103
+ $ source [path to ./extras/i2cssh-autocomplete.bash]
104
+
116
105
  ## Options
117
106
 
118
107
  ### -A, --forward-agent
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
-
3
2
  require 'rubygems'
4
3
  require 'bundler'
4
+
5
5
  begin
6
6
  Bundler.setup(:default, :development)
7
7
  rescue Bundler::BundlerError => e
@@ -9,13 +9,14 @@ rescue Bundler::BundlerError => e
9
9
  $stderr.puts "Run `bundle install` to install missing gems"
10
10
  exit e.status_code
11
11
  end
12
- require 'rake'
13
12
 
13
+ require 'rake'
14
14
  require 'jeweler'
15
+
15
16
  Jeweler::Tasks.new do |gem|
16
17
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
18
  gem.name = "i2c2"
18
- gem.homepage = "http://github.com/dx7/i2c2"
19
+ gem.homepage = "https://github.com/dx7/i2c2"
19
20
  gem.license = "MIT"
20
21
  gem.summary = %Q{csshX like - cluster ssh using iTerm2 panes - based on i2cssh}
21
22
  gem.description = %Q{csshX like - cluster ssh using iTerm2 panes - based on i2cssh}
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.beta4
1
+ 1.0.0.beta5
data/bin/i2c2 CHANGED
@@ -4,81 +4,66 @@ require 'optparse'
4
4
  require_relative '../lib/i2c2'
5
5
  require 'yaml'
6
6
 
7
- @config_file = File.expand_path "~/.i2csshrc"
8
-
7
+ @config_file = File.expand_path '~/.i2csshrc'
9
8
  @i2_options, ssh_options, @servers, @clusters, @ssh_environment, opts_from_cmdline = [], [], [], {}, [], {}
10
9
 
11
- def debug_vars
12
- p '-----------------------------'
13
- p '@i2_options'
14
- p @i2_options
15
- p '@servers'
16
- p @servers
17
- p '@clusters'
18
- p @clusters
19
- p '@ssh_environment'
20
- p @ssh_environment
21
- p '-----------------------------'
22
- end
23
-
24
10
  def get_hosts(c)
25
- c.each do |clus|
26
-
27
- if clus =~ /(.+)@(.+)/
28
- login_from_cli = $1
29
- clus = $2
30
- end
31
-
32
- cluster = @clusters[clus]
33
- if cluster
34
- set_options(cluster, login_from_cli)
35
-
36
- if @i2_options.last[:login]
37
- @servers << cluster["hosts"].map{|h| "#{@i2_options.last[:login]}@#{h}"}
38
- else
39
- @servers << cluster["hosts"]
40
- end
41
- else
42
- puts "ERROR: unknown cluster #{c}. Check your #{@config_file}"
43
- exit 1
44
- end
11
+ c.each do |clus|
12
+
13
+ if clus =~ /(.+)@(.+)/
14
+ login_from_cli = $1
15
+ clus = $2
45
16
  end
46
17
 
18
+ cluster = @clusters[clus]
19
+ if cluster
20
+ set_options(cluster, login_from_cli)
21
+
22
+ if @i2_options.last[:login]
23
+ @servers << cluster['hosts'].map{|h| "#{@i2_options.last[:login]}@#{h}"}
24
+ else
25
+ @servers << cluster['hosts']
26
+ end
27
+ else
28
+ puts "ERROR: unknown cluster #{c}. Check your #{@config_file}"
29
+ exit 1
30
+ end
31
+ end
47
32
  end
48
33
 
49
34
  def set_options(config_hash, login_override=nil)
50
- if config_hash["columns"] and config_hash["rows"]
51
- puts "CONFIG ERROR: rows and columns can't be used at the same time"
52
- exit 1
53
- end
35
+ if config_hash['columns'] and config_hash['rows']
36
+ puts 'CONFIG ERROR: rows and columns can\'t be used at the same time'
37
+ exit 1
38
+ end
54
39
 
55
- if @i2_options.size == 0
56
- @i2_options << {}
57
- else
58
- # The first member includes the default options from the conf file
59
- @i2_options << @i2_options.first.clone
60
- end
40
+ if @i2_options.size == 0
41
+ @i2_options << {}
42
+ else
43
+ # The first member includes the default options from the conf file
44
+ @i2_options << @i2_options.first.clone
45
+ end
61
46
 
62
- [:broadcast, :profile, :rank, :iterm2, :login, :columns, :rows, :sleep, :shell, :direction, :itermname].each do |p|
63
- @i2_options.last[p] = config_hash[p.to_s].nil? ? @i2_options.last[p] : config_hash[p.to_s]
64
- end
47
+ [:broadcast, :profile, :rank, :iterm2, :login, :columns, :rows, :sleep, :shell, :direction, :itermname].each do |p|
48
+ @i2_options.last[p] = config_hash[p.to_s].nil? ? @i2_options.last[p] : config_hash[p.to_s]
49
+ end
65
50
 
66
- @i2_options.last[:login] = login_override if login_override
67
- @i2_options.last[:direction] ||= :column
68
- @i2_options.last[:direction] = @i2_options.last[:direction].to_sym
69
- if config_hash["environment"]
70
- if @ssh_environment.empty?
71
- @ssh_environment << {}
72
- else
73
- # We have some global env so copy it
74
- @ssh_environment << @ssh_environment.first.clone
75
- end
76
-
77
- @ssh_environment.last.merge!(config_hash["environment"].inject({}){|m, v| m.merge(v)})
51
+ @i2_options.last[:login] = login_override if login_override
52
+ @i2_options.last[:direction] ||= :row
53
+ @i2_options.last[:direction] = @i2_options.last[:direction].to_sym
54
+ if config_hash['environment']
55
+ if @ssh_environment.empty?
56
+ @ssh_environment << {}
78
57
  else
79
- @ssh_environment << {}
58
+ # We have some global env so copy it
59
+ @ssh_environment << @ssh_environment.first.clone
80
60
  end
81
61
 
62
+ @ssh_environment.last.merge!(config_hash['environment'].inject({}){|m, v| m.merge(v)})
63
+ else
64
+ @ssh_environment << {}
65
+ end
66
+
82
67
  end
83
68
 
84
69
  if File.exists?(@config_file)
@@ -91,224 +76,203 @@ if File.exists?(@config_file)
91
76
 
92
77
  # Read config and set defaults from config
93
78
  set_options(config_hash)
94
- @clusters = config_hash["clusters"]
79
+ @clusters = config_hash['clusters']
95
80
  else
96
81
  set_options({})
97
82
  end
98
83
 
99
-
100
84
  optparse = OptionParser.new do |opts|
101
- opts.banner = "Usage: #{File.basename(__FILE__)} [options] [(username@host [username@host] | username@cluster)]"
102
-
103
- # Check if we have a cluster.
104
- opts.on '-c', '--clusters clus1,clus2', Array,
105
- 'Comma-separated list of clusters specified in ~/.i2csshrc' do |c|
106
- get_hosts(c)
107
- end
85
+ opts.banner = "Usage: #{File.basename(__FILE__)} [options] [(username@host [username@host] | username@cluster)]"
108
86
 
87
+ # Check if we have a cluster.
88
+ opts.on '-c', '--clusters clus1,clus2', Array,
89
+ 'Comma-separated list of clusters specified in ~/.i2csshrc' do |c|
90
+ get_hosts(c)
91
+ end
109
92
 
110
- opts.on '-m', '--machines a,b,c', Array,
111
- 'Comma-separated list of hosts' do |h|
93
+ opts.on '-m', '--machines a,b,c', Array,
94
+ 'Comma-separated list of hosts' do |h|
112
95
 
113
- # Add to servers array and get a clone of default options
114
- @servers << h
115
- @i2_options << @i2_options.first.clone
116
- if @ssh_environment.empty?
117
- @ssh_environment << {}
118
- else
119
- @ssh_environment << @ssh_environment.first.clone
120
- end
96
+ # Add to servers array and get a clone of default options
97
+ @servers << h
98
+ @i2_options << @i2_options.first.clone
99
+ if @ssh_environment.empty?
100
+ @ssh_environment << {}
101
+ else
102
+ @ssh_environment << @ssh_environment.first.clone
121
103
  end
104
+ end
122
105
 
123
- # Hosts
124
- opts.on '-f', '--file FILE',
125
- 'Cluster file (one hostname per line)' do |f|
126
- @servers << File.read(f).split("\n")
127
- @i2_options << @i2_options.first.clone
128
- if @ssh_environment.empty?
129
- @ssh_environment << {}
130
- else
131
- @ssh_environment << @ssh_environment.first.clone
132
- end
106
+ opts.on '-f', '--file FILE',
107
+ 'Cluster file (one hostname per line)' do |f|
108
+ @servers << File.read(f).split("\n")
109
+ @i2_options << @i2_options.first.clone
110
+ if @ssh_environment.empty?
111
+ @ssh_environment << {}
112
+ else
113
+ @ssh_environment << @ssh_environment.first.clone
133
114
  end
115
+ end
134
116
 
135
- opts.on '-t', '--tab-split',
136
- 'Split servers/clusters into tabs (group arguments)' do
137
- opts_from_cmdline[:tabs] = true
138
- end
117
+ opts.on '-t', '--tab-split',
118
+ 'Split servers/clusters into tabs (group arguments)' do
119
+ opts_from_cmdline[:tabs] = true
139
120
 
140
- opts.on '-T', '--tab-split-nogroup',
141
- 'Split servers/clusters into tabs (don\'t group arguments)' do
142
- opts_from_cmdline[:tabs] = true
143
- opts_from_cmdline[:tabs_nogroup] = true
144
- end
121
+ puts 'Disabling broadcast for tab split mode...'
122
+ opts_from_cmdline[:broadcast] = false
123
+ end
145
124
 
146
- # Command line options override config file
125
+ opts.on '-T', '--tab-split-nogroup',
126
+ 'Split servers/clusters into tabs (don\'t group arguments)' do
127
+ opts_from_cmdline[:tabs] = true
128
+ opts_from_cmdline[:tabs_nogroup] = true
147
129
 
148
- # SSH options
149
- opts.on '-A', '--forward-agent',
150
- 'Enable SSH agent forwarding' do
151
- ssh_options << '-A'
152
- end
130
+ puts 'Disabling broadcast for tab split mode...'
131
+ opts_from_cmdline[:broadcast] = false
132
+ end
153
133
 
154
- opts.on '-l', '--login LOGIN',
155
- 'SSH login name' do |u|
156
- opts_from_cmdline[:login] = u
134
+ # Command line options override config file
157
135
 
158
- end
136
+ # SSH options
137
+ opts.on '-A', '--forward-agent',
138
+ 'Enable SSH agent forwarding' do
139
+ ssh_options << '-A'
140
+ end
159
141
 
160
- opts.on '-e', '--environment KEY=VAL',
161
- 'Send environment vars (comma-separated list, need to start with LC_)' do |e|
162
- #Overwrite global ssh environment from config file
163
- @ssh_environment[0] = e.split(",").inject({}) {|m, x| key, val = x.split("="); m[key] = val; m}
164
- end
142
+ opts.on '-l', '--login LOGIN',
143
+ 'SSH login name' do |u|
144
+ opts_from_cmdline[:login] = u
145
+ end
165
146
 
166
- opts.on '-r', '--rank',
167
- 'Send LC_RANK with the host number as environment variable' do
168
- opts_from_cmdline[:rank] = true
169
- end
147
+ opts.on '-e', '--environment KEY=VAL',
148
+ 'Send environment vars (comma-separated list, need to start with LC_)' do |e|
149
+ #Overwrite global ssh environment from config file
150
+ @ssh_environment[0] = e.split(',').inject({}) {|m, x| key, val = x.split('='); m[key] = val; m}
151
+ end
170
152
 
171
- # iTerm2 options
172
- opts.on '-F', '--fullscreen',
173
- 'Make the window fullscreen' do
174
- opts_from_cmdline[:fullscreen] = true
175
- end
153
+ opts.on '-r', '--rank',
154
+ 'Send LC_RANK with the host number as environment variable' do
155
+ opts_from_cmdline[:rank] = true
156
+ end
176
157
 
177
- opts.on '-C', '--columns COLUMNS', Integer,
178
- 'Number of columns (rows will be calculated)' do |c|
179
- if opts_from_cmdline[:rows]
180
- puts "ERROR: -C and -R can't be used at the same time"
181
- puts optparse.help
182
- exit 1
183
- else
184
- opts_from_cmdline[:columns] = c
185
- end
186
- end
187
- opts.on '-R', '--rows ROWS', Integer,
188
- 'Number of rows (columns will be calculated)' do |r|
189
- if opts_from_cmdline[:columns]
190
- puts "ERROR: -C and -R can't be used at the same time"
191
- puts optparse.help
192
- exit 1
193
- else
194
- opts_from_cmdline[:rows] = r
195
- end
196
- end
197
- opts.on '-b', '--broadcast',
198
- 'Start with broadcast input (DANGEROUS!)' do
199
- opts_from_cmdline[:broadcast] = true
200
- end
201
- opts.on '-nb', '--nobroadcast',
202
- 'Disable broadcast' do
203
- opts_from_cmdline[:broadcast] = false
204
- end
205
- opts.on '-p', '--profile PROFILE',
206
- 'Name of the iTerm2 profile (default: Default)' do |p|
207
- opts_from_cmdline[:profile] = p
208
- end
209
- opts.on "-2", '--iterm2',
210
- 'Use iTerm2 instead of iTerm' do
211
- opts_from_cmdline[:iterm2] = true
212
- end
213
- opts.on "-i", '--itermname NAME', String,
214
- 'Name of the application to use (default: iTerm)' do |i|
215
- opts_from_cmdline[:itermname] = i
216
- end
217
- opts.on '-s', '--sleep SLEEP', Float,
218
- 'Number of seconds to sleep between creating SSH sessions' do |s|
219
- opts_from_cmdline[:sleep] = s
220
- end
221
- opts.on '-S', '--shell SHELL', String,
222
- 'Shell to use when spawning the SSH sessions' do |s|
223
- opts_from_cmdline[:shell] = s
224
- end
225
- opts.on "-d", '--direction DIRECTION', String,
226
- 'Direction that new sessions are created (default: column)' do |d|
227
- unless ["row", "column"].include?(d)
228
- puts "ERROR: -d requires 'row' or 'column'"
229
- puts optparse.help
230
- exit 1
231
- end
232
- opts_from_cmdline[:direction] = d.to_sym
233
- end
234
- opts.on '-X', '--extra EXTRA_PARAM', String,
235
- 'Additional ssh parameters (e.g. -Xi=myidentity.pem)' do |x|
158
+ # iTerm2 options
159
+ opts.on '-F', '--fullscreen',
160
+ 'Make the window fullscreen' do
161
+ opts_from_cmdline[:fullscreen] = true
162
+ end
236
163
 
237
- ssh_options << "-" + x.split("=").join(" ")
164
+ opts.on '-C', '--columns COLUMNS', Integer,
165
+ 'Number of columns (rows will be calculated)' do |c|
166
+ if opts_from_cmdline[:rows]
167
+ puts 'ERROR: -C and -R can\'t be used at the same time'
168
+ puts optparse.help
169
+ exit 1
170
+ else
171
+ opts_from_cmdline[:columns] = c
238
172
  end
239
- opts.on '-g', '--gateway HOST', String,
240
- 'Multihop SSH connection gateway string (e.g. username@gateway) - usually used with -A' do |g|
241
- # ssh_gateway = g
242
- opts_from_cmdline[:gateway] = g
173
+ end
174
+
175
+ opts.on '-R', '--rows ROWS', Integer,
176
+ 'Number of rows (columns will be calculated)' do |r|
177
+ if opts_from_cmdline[:columns]
178
+ puts 'ERROR: -C and -R can\'t be used at the same time'
179
+ puts optparse.help
180
+ exit 1
181
+ else
182
+ opts_from_cmdline[:rows] = r
243
183
  end
244
- end
245
- optparse.parse!
184
+ end
246
185
 
247
- if opts_from_cmdline[:tabs]
248
- puts 'Disabling broadcast for tab split mode...'
186
+ opts.on '-b', '--broadcast',
187
+ 'Start with broadcast input (DANGEROUS!)' do
188
+ opts_from_cmdline[:broadcast] = true
189
+ end
190
+
191
+ opts.on '-nb', '--nobroadcast',
192
+ 'Disable broadcast' do
249
193
  opts_from_cmdline[:broadcast] = false
250
- end
194
+ end
251
195
 
252
- # One argument = one cluster
253
- if ARGV.length == 1
254
- c = [ARGV[0]]
255
- get_hosts(c)
196
+ opts.on '-p', '--profile PROFILE',
197
+ 'Name of the iTerm2 profile (default: Default)' do |p|
198
+ opts_from_cmdline[:profile] = p
199
+ end
256
200
 
257
- # Otherwise we have a list of hosts
258
- elsif ARGV.length > 1
259
- if opts_from_cmdline[:tabs_nogroup]
260
- ARGV.each do |serv|
261
- @servers << [serv]
262
- @i2_options << @i2_options.first.clone
263
- if @ssh_environment.empty?
264
- @ssh_environment << {}
265
- else
266
- @ssh_environment << @ssh_environment.first.clone
267
- end
268
- end
269
- else
270
- @servers << ARGV
271
- if @i2_options.size > 1 # We added stuff in with cmdline options
272
- @i2_options << @i2_options.first.clone
273
- if @ssh_environment.empty?
274
- @ssh_environment << {}
275
- else
276
- @ssh_environment << @ssh_environment.first.clone
277
- end
278
- end
201
+ opts.on '-2', '--iterm2',
202
+ 'Use iTerm2 instead of iTerm' do
203
+ opts_from_cmdline[:iterm2] = true
204
+ end
205
+
206
+ opts.on '-i', '--itermname NAME', String,
207
+ 'Name of the application to use (default: iTerm)' do |i|
208
+ opts_from_cmdline[:itermname] = i
209
+ end
210
+
211
+ opts.on '-s', '--sleep SLEEP', Float,
212
+ 'Number of seconds to sleep between creating SSH sessions' do |s|
213
+ opts_from_cmdline[:sleep] = s
214
+ end
215
+
216
+ opts.on '-S', '--shell SHELL', String,
217
+ 'Shell to use when spawning the SSH sessions' do |s|
218
+ opts_from_cmdline[:shell] = s
219
+ end
220
+
221
+ opts.on '-d', '--direction DIRECTION', String,
222
+ 'Direction that new sessions are created (default: row)' do |d|
223
+ unless ['row', 'column'].include?(d)
224
+ puts 'ERROR: -d requires \'row\' or \'column\''
225
+ puts optparse.help
226
+ exit 1
279
227
  end
228
+ opts_from_cmdline[:direction] = d.to_sym
229
+ end
230
+
231
+ opts.on '-X', '--extra EXTRA_PARAM', String,
232
+ 'Additional ssh parameters (e.g. -Xi=myidentity.pem)' do |x|
233
+
234
+ ssh_options << '-' + x.split('=').join(' ')
235
+ end
236
+
237
+ opts.on '-g', '--gateway HOST', String,
238
+ 'Multihop SSH connection gateway string (e.g. username@gateway) - usually used with -A' do |g|
239
+ # ssh_gateway = g
240
+ opts_from_cmdline[:gateway] = g
241
+ end
280
242
  end
281
243
 
244
+ optparse.parse!
245
+
282
246
  # Drop default options
283
247
  if @i2_options.size > @servers.size
284
- @i2_options.shift
248
+ @i2_options.shift
285
249
  end
286
250
 
287
251
  if @ssh_environment.size > @servers.size
288
- @ssh_environment.shift
252
+ @ssh_environment.shift
289
253
  end
290
254
 
291
255
 
292
256
  @i2_options.each do |opt|
293
- opt.merge!(opts_from_cmdline)
257
+ opt.merge!(opts_from_cmdline)
294
258
  end
295
259
 
296
260
  @i2_options.each_with_index do |opt, i|
297
- if opt[:login]
298
- @servers[i] = @servers[i].map{|h| "#{opt[:login]}@#{h.gsub(/.+@/,'')}"}
299
- end
300
- if opt[:gateway]
301
- puts opt[:gateway]
302
- @servers[i] = @servers[i].map{|h| "#{opt[:gateway]} -t ssh #{h}"}
303
- end
261
+ if opt[:login]
262
+ @servers[i] = @servers[i].map{|h| "#{opt[:login]}@#{h.gsub(/.+@/,'')}"}
263
+ end
264
+
265
+ if opt[:gateway]
266
+ puts opt[:gateway]
267
+ @servers[i] = @servers[i].map{|h| "#{opt[:gateway]} -t ssh #{h}"}
268
+ end
304
269
  end
305
270
 
306
271
 
307
272
  if @servers.empty?
308
- puts "ERROR: no servers given"
309
- puts optparse.help
310
- exit
273
+ puts 'ERROR: no servers given'
274
+ puts optparse.help
275
+ exit
311
276
  end
312
277
 
313
-
314
278
  I2c2.new @servers, ssh_options, @i2_options, @ssh_environment
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: i2c2 1.0.0.beta4 ruby lib
5
+ # stub: i2c2 1.0.0.beta5 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "i2c2"
9
- s.version = "1.0.0.beta4"
9
+ s.version = "1.0.0.beta5"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["dx7", "Wouter de Bie"]
14
- s.date = "2019-05-16"
14
+ s.date = "2019-06-05"
15
15
  s.description = "csshX like - cluster ssh using iTerm2 panes - based on i2cssh"
16
16
  s.email = "dx7@pm.me"
17
17
  s.executables = ["i2c2"]
@@ -20,7 +20,6 @@ Gem::Specification.new do |s|
20
20
  "README.md"
21
21
  ]
22
22
  s.files = [
23
- ".document",
24
23
  "CHANGELOG.md",
25
24
  "Gemfile",
26
25
  "Gemfile.lock",
@@ -35,7 +34,7 @@ Gem::Specification.new do |s|
35
34
  "test/helper.rb",
36
35
  "test/test_i2c2.rb"
37
36
  ]
38
- s.homepage = "http://github.com/dx7/i2c2"
37
+ s.homepage = "https://github.com/dx7/i2c2"
39
38
  s.licenses = ["MIT"]
40
39
  s.rubygems_version = "3.0.3"
41
40
  s.summary = "csshX like - cluster ssh using iTerm2 panes - based on i2cssh"
@@ -45,23 +44,14 @@ Gem::Specification.new do |s|
45
44
 
46
45
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
46
  s.add_runtime_dependency(%q<rb-scpt>, ["~> 1.0.1"])
48
- s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
49
- s.add_development_dependency(%q<jeweler>, ["= 2.1.2"])
50
- s.add_development_dependency(%q<shoulda>, [">= 0"])
51
- s.add_development_dependency(%q<builder>, [">= 0"])
47
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
52
48
  else
53
49
  s.add_dependency(%q<rb-scpt>, ["~> 1.0.1"])
54
- s.add_dependency(%q<bundler>, [">= 1.0.0"])
55
- s.add_dependency(%q<jeweler>, ["= 2.1.2"])
56
- s.add_dependency(%q<shoulda>, [">= 0"])
57
- s.add_dependency(%q<builder>, [">= 0"])
50
+ s.add_dependency(%q<jeweler>, [">= 0"])
58
51
  end
59
52
  else
60
53
  s.add_dependency(%q<rb-scpt>, ["~> 1.0.1"])
61
- s.add_dependency(%q<bundler>, [">= 1.0.0"])
62
- s.add_dependency(%q<jeweler>, ["= 2.1.2"])
63
- s.add_dependency(%q<shoulda>, [">= 0"])
64
- s.add_dependency(%q<builder>, [">= 0"])
54
+ s.add_dependency(%q<jeweler>, [">= 0"])
65
55
  end
66
56
  end
67
57
 
@@ -1,167 +1,167 @@
1
1
  require 'rb-scpt'
2
+
2
3
  class I2c2
3
- def initialize servers, ssh_options, i2_options, ssh_environment
4
- @ssh_prefix = "ssh " + ssh_options.join(' ')
5
- @ssh_options = ssh_options
6
- @i2_options = i2_options.clone
7
- @servers = servers
8
- @ssh_environment = ssh_environment
9
-
10
- raise Exception.new 'No servers given' if servers.empty?
11
-
12
- @sys_events = Appscript.app.by_name('System Events')
13
- @iterm = Appscript.app.by_name("iTerm")
14
-
15
- @pane_menu = @sys_events.processes["iTerm2"].menu_bars[1].menu_bar_items["Window"].menus["Window"].menu_items["Select Split Pane"].menus["Select Split Pane"]
16
- @shell_menu = @sys_events.processes["iTerm2"].menu_bars[1].menu_bar_items["Shell"].menus["Shell"]
17
-
18
- @profile = i2_options.first[:profile] || "Default"
19
- @shell = "/usr/bin/env #{@i2_options.first[:shell] || 'bash'}"
20
-
21
- @iterm.create_window_with_profile(@profile, :command => "#{@shell} -l")
22
- @window = @iterm.current_window
23
-
24
- while !@servers.empty? do
25
- compute_geometry
26
- split_session
27
- start_ssh
28
- enable_broadcast if i2_options.first[:broadcast]
29
- @servers.shift
30
- @i2_options.shift
31
- @ssh_environment.shift
32
-
33
- if !@servers.empty? && i2_options.first[:tabs] then
34
- # @iterm.create_tab(@profile)
35
- @window.create_tab_with_default_profile()
36
- @session_index = 0
37
- end
38
- end
39
- @window.select(@window.tabs[1])
4
+ def initialize servers, ssh_options, i2_options, ssh_environment
5
+ @ssh_prefix = 'ssh ' + ssh_options.join(' ')
6
+ @ssh_options = ssh_options
7
+ @i2_options = i2_options.clone
8
+ @servers = servers
9
+ @ssh_environment = ssh_environment
10
+
11
+ raise Exception.new 'No servers given' if servers.empty?
12
+
13
+ @sys_events = Appscript.app.by_name('System Events')
14
+ @iterm = Appscript.app.by_name('iTerm')
15
+ @pane_menu = @sys_events.processes['iTerm2'].menu_bars[1].menu_bar_items['Window'].menus['Window'].menu_items['Select Split Pane'].menus['Select Split Pane']
16
+ @shell_menu = @sys_events.processes['iTerm2'].menu_bars[1].menu_bar_items['Shell'].menus['Shell']
17
+ @profile = i2_options.first[:profile] || 'Default'
18
+ @shell = "/usr/bin/env #{@i2_options.first[:shell] || 'bash'}"
19
+ @iterm.create_window_with_profile(@profile, :command => "#{@shell} -l")
20
+ @window = @iterm.current_window
21
+
22
+ while !@servers.empty? do
23
+ compute_geometry
24
+ split_session
25
+ start_ssh
26
+ enable_broadcast if i2_options.first[:broadcast]
27
+ @servers.shift
28
+ @i2_options.shift
29
+ @ssh_environment.shift
30
+
31
+ if !@servers.empty? && i2_options.first[:tabs]
32
+ @window.create_tab_with_default_profile
33
+ @session_index = 0
34
+ end
40
35
  end
36
+ @window.select(@window.tabs[1])
37
+ end
41
38
 
42
- private
39
+ private
43
40
  def maximize(app_name)
44
- begin
45
- # OSX >= 10.8 has different behavior for full screen. First try out old behavior.
46
- fullscreen_bounds = Appscript.app.by_name('Finder').desktop.window.bounds
47
- window = @iterm.windows.get.sort_by{|x| x.id_.get}.last
48
- window.bounds.set fullscreen_bounds.get
49
- rescue
50
- @sys_events.processes[app_name].windows.first.attributes["AXFullScreen"].value.set(true)
51
- end
41
+ begin
42
+ # OSX >= 10.8 has different behavior for full screen. First try out old behavior.
43
+ fullscreen_bounds = Appscript.app.by_name('Finder').desktop.window.bounds
44
+ window = @iterm.windows.get.sort_by{|x| x.id_.get}.last
45
+ window.bounds.set fullscreen_bounds.get
46
+ rescue
47
+ @sys_events.processes[app_name].windows.first.attributes['AXFullScreen'].value.set(true)
48
+ end
52
49
  end
53
50
 
54
51
  def compute_geometry
55
- # Create geometry when combining and ignore rows/columns preference
56
- if @servers.size > 1 && !@i2_options.first[:tabs]
57
- count = 0
58
- @servers.each do |srv|
59
- count += srv.size
60
- end
61
- else
62
- count = @servers.first.size
63
- @rows = @i2_options.first[:rows]
64
- @columns = @i2_options.first[:columns]
65
- end
66
-
67
- if @rows then
68
- @columns = (count / @rows.to_f).ceil
69
- elsif @columns then
70
- @rows = (count / @columns.to_f).ceil
71
- else
72
- @columns = Math.sqrt(count).ceil
73
- @rows = (count / @columns.to_f).ceil
74
- end
75
- # Quick hack: iTerms default window only supports up to 11 rows and 22 columns
76
- # If we surpass either one, we resort to full screen.
77
- if @rows > 11 or @columns > 22 then
78
- @i2_options.first[:fullscreen] = true
52
+ # Create geometry when combining and ignore rows/columns preference
53
+ if @servers.size > 1 && !@i2_options.first[:tabs]
54
+ count = 0
55
+ @servers.each do |srv|
56
+ count += srv.size
79
57
  end
58
+ else
59
+ count = @servers.first.size
60
+ @rows = @i2_options.first[:rows]
61
+ @columns = @i2_options.first[:columns]
62
+ end
63
+
64
+ if @rows
65
+ @columns = (count / @rows.to_f).ceil
66
+ elsif @columns
67
+ @rows = (count / @columns.to_f).ceil
68
+ else
69
+ @columns = Math.sqrt(count).ceil
70
+ @rows = (count / @columns.to_f).ceil
71
+ end
72
+
73
+ # Quick hack: iTerms default window only supports up to 11 rows and 22 columns
74
+ # If we surpass either one, we resort to full screen.
75
+ if @rows > 11 or @columns > 22
76
+ @i2_options.first[:fullscreen] = true
77
+ end
80
78
  end
81
79
 
82
80
  def split_session
83
- left = @pane_menu.menu_items["Select Pane Left"]
84
- right = @pane_menu.menu_items["Select Pane Right"]
85
- up = @pane_menu.menu_items["Select Pane Above"]
86
- down = @pane_menu.menu_items["Select Pane Below"]
87
-
88
- split_vert = lambda { @window.current_session.split_vertically_with_same_profile }
89
- split_hori = lambda { @window.current_session.split_horizontally_with_same_profile }
90
-
91
- splitmap = {
92
- :column => {0 => split_vert, 1 => left, 2 => split_hori, 3=> right, :x => @columns, :y => @rows},
93
- :row => {0 => split_hori, 1=> up, 2 => split_vert, 3=> down, :x => @rows, :y => @columns}
94
- }
95
- splitconfig = splitmap[@i2_options.first[:direction]]
96
-
97
- first = true
98
- 2.upto splitconfig[:x] do
99
- splitconfig[0].call
81
+ left = @pane_menu.menu_items['Select Pane Left']
82
+ right = @pane_menu.menu_items['Select Pane Right']
83
+ up = @pane_menu.menu_items['Select Pane Above']
84
+ down = @pane_menu.menu_items['Select Pane Below']
85
+
86
+ split_vert = lambda { @window.current_session.split_vertically_with_same_profile }
87
+ split_hori = lambda { @window.current_session.split_horizontally_with_same_profile }
88
+
89
+ splitmap = {
90
+ :column => {0 => split_vert, 1 => left, 2 => split_hori, 3=> right, :x => @columns, :y => @rows},
91
+ :row => {0 => split_hori, 1=> up, 2 => split_vert, 3=> down, :x => @rows, :y => @columns}
92
+ }
93
+
94
+ splitconfig = splitmap[@i2_options.first[:direction]]
95
+
96
+ first = true
97
+ 2.upto splitconfig[:x] do
98
+ splitconfig[0].call
99
+ end
100
+
101
+ 2.upto splitconfig[:y] do
102
+ 1.upto splitconfig[:x] do
103
+ splitconfig[1].click
104
+ first = false
100
105
  end
101
- 2.upto splitconfig[:y] do
102
- 1.upto splitconfig[:x] do
103
- splitconfig[1].click
104
- first = false
105
- end
106
- splitconfig[:x].times do |x|
107
- splitconfig[2].call
108
- splitconfig[3].click
109
- end
106
+
107
+ splitconfig[:x].times do |x|
108
+ splitconfig[2].call
109
+ splitconfig[3].click
110
110
  end
111
+ end
111
112
  end
112
113
 
113
114
  def enable_broadcast
114
- @sys_events.keystroke "I", :using => :command_down
115
- sleep 0.5
116
- @sys_events.keystroke "\r"
115
+ @sys_events.keystroke 'I', :using => :command_down
116
+ sleep 0.5
117
+ @sys_events.keystroke "\r"
117
118
  end
118
119
 
119
120
  def start_ssh
120
- old_size = 0
121
-
122
- 1.upto(@rows*@columns) do |i|
123
- tab = @window.current_tab
124
- session = tab.sessions[i]
125
- session.write :text => "#{@shell} -l"
126
-
127
- # Without the tab flag, combine all servers and clusters into one window
128
- if !@servers.empty? && (i - old_size) > @servers.first.size && !@i2_options.first[:tabs]
129
- old_size = @servers.first.size
130
- @servers.shift
131
- @i2_options.shift
132
- @ssh_environment.shift
133
- end
134
-
135
- if @servers.empty?
136
- server = nil
137
- else
138
- server = @servers.first[i-old_size-1]
139
- end
140
-
141
-
142
- if server then
143
- send_env = ""
144
-
145
- if @i2_options.first[:rank] then
146
- @ssh_environment.first['LC_RANK'] = i-1
147
- end
148
-
149
- if !@ssh_environment.empty? && !@ssh_environment.first.empty? then
150
- send_env = "-o SendEnv=#{@ssh_environment.first.keys.join(",")}"
151
- session.write :text => "#{@ssh_environment.first.map{|k,v| "export #{k}=#{v}"}.join('; ')}"
152
- end
153
- if @i2_options.first[:sleep] then
154
- sleep @i2_options.first[:sleep] * i
155
- end
156
-
157
- session.write :text => "unset HISTFILE && echo -e \"\\033]50;SetProfile=#{@profile}\\a\" && #{@ssh_prefix} #{send_env} #{server}"
158
- else
159
-
160
- session.write :text => "unset HISTFILE && echo -e \"\\033]50;SetProfile=#{@profile}\\a\""
161
- sleep 0.3
162
- session.foreground_color.set ([65535,0,0])
163
- session.write :text => "stty -isig -icanon -echo && echo -e '#{"\n"*100}UNUSED' && cat > /dev/null"
164
- end
121
+ old_size = 0
122
+
123
+ 1.upto(@rows*@columns) do |i|
124
+ tab = @window.current_tab
125
+ session = tab.sessions[i]
126
+ session.write :text => "#{@shell} -l"
127
+
128
+ # Without the tab flag, combine all servers and clusters into one window
129
+ if !@servers.empty? && (i - old_size) > @servers.first.size && !@i2_options.first[:tabs]
130
+ old_size = @servers.first.size
131
+ @servers.shift
132
+ @i2_options.shift
133
+ @ssh_environment.shift
134
+ end
135
+
136
+ if @servers.empty?
137
+ server = nil
138
+ else
139
+ server = @servers.first[i-old_size-1]
140
+ end
141
+
142
+ if server
143
+ send_env = ''
144
+
145
+ if @i2_options.first[:rank]
146
+ @ssh_environment.first['LC_RANK'] = i-1
147
+ end
148
+
149
+ if !@ssh_environment.empty? && !@ssh_environment.first.empty?
150
+ send_env = "-o SendEnv=#{@ssh_environment.first.keys.join(',')}"
151
+ session.write :text => "#{@ssh_environment.first.map{|k,v| "export #{k}=#{v}"}.join('; ')}"
152
+ end
153
+
154
+ if @i2_options.first[:sleep]
155
+ sleep @i2_options.first[:sleep] * i
156
+ end
157
+
158
+ session.write :text => "unset HISTFILE && echo -e \"\\033]50;SetProfile=#{@profile}\\a\" && #{@ssh_prefix} #{send_env} #{server}"
159
+ else
160
+ session.write :text => "unset HISTFILE && echo -e \"\\033]50;SetProfile=#{@profile}\\a\""
161
+ sleep 0.3
162
+ session.foreground_color.set ([65535,0,0])
163
+ session.write :text => "stty -isig -icanon -echo && echo -e '#{"\n"*100}UNUSED' && cat > /dev/null"
165
164
  end
165
+ end
166
166
  end
167
167
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i2c2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta4
4
+ version: 1.0.0.beta5
5
5
  platform: ruby
6
6
  authors:
7
7
  - dx7
8
8
  - Wouter de Bie
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-05-16 00:00:00.000000000 Z
12
+ date: 2020-09-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rb-scpt
@@ -25,50 +25,8 @@ dependencies:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: 1.0.1
28
- - !ruby/object:Gem::Dependency
29
- name: bundler
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: 1.0.0
35
- type: :development
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- version: 1.0.0
42
28
  - !ruby/object:Gem::Dependency
43
29
  name: jeweler
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - '='
47
- - !ruby/object:Gem::Version
48
- version: 2.1.2
49
- type: :development
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - '='
54
- - !ruby/object:Gem::Version
55
- version: 2.1.2
56
- - !ruby/object:Gem::Dependency
57
- name: shoulda
58
- requirement: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: '0'
63
- type: :development
64
- prerelease: false
65
- version_requirements: !ruby/object:Gem::Requirement
66
- requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
- - !ruby/object:Gem::Dependency
71
- name: builder
72
30
  requirement: !ruby/object:Gem::Requirement
73
31
  requirements:
74
32
  - - ">="
@@ -87,10 +45,10 @@ executables:
87
45
  - i2c2
88
46
  extensions: []
89
47
  extra_rdoc_files:
48
+ - CHANGELOG.md
90
49
  - LICENSE.txt
91
50
  - README.md
92
51
  files:
93
- - ".document"
94
52
  - CHANGELOG.md
95
53
  - Gemfile
96
54
  - Gemfile.lock
@@ -104,11 +62,11 @@ files:
104
62
  - lib/i2c2.rb
105
63
  - test/helper.rb
106
64
  - test/test_i2c2.rb
107
- homepage: http://github.com/dx7/i2c2
65
+ homepage: https://github.com/dx7/i2c2
108
66
  licenses:
109
67
  - MIT
110
68
  metadata: {}
111
- post_install_message:
69
+ post_install_message:
112
70
  rdoc_options: []
113
71
  require_paths:
114
72
  - lib
@@ -123,8 +81,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
81
  - !ruby/object:Gem::Version
124
82
  version: 1.3.1
125
83
  requirements: []
126
- rubygems_version: 3.0.3
127
- signing_key:
84
+ rubygems_version: 3.1.2
85
+ signing_key:
128
86
  specification_version: 4
129
87
  summary: csshX like - cluster ssh using iTerm2 panes - based on i2cssh
130
88
  test_files: []
data/.document DELETED
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt