fantassh 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/fantassh +1 -1
- data/fantassh.gemspec +2 -0
- data/lib/fantassh/application.rb +50 -8
- data/lib/fantassh/bash_history.rb +1 -1
- data/lib/fantassh/entries.rb +13 -22
- data/lib/fantassh/entries_file.rb +33 -0
- data/lib/fantassh/excluded_entries_file.rb +10 -0
- data/lib/fantassh/version.rb +1 -1
- data/spec/lib/application_spec.rb +21 -0
- data/spec/lib/bash_history_spec.rb +8 -1
- data/spec/lib/entries_file_spec.rb +53 -0
- data/spec/lib/entries_spec.rb +18 -49
- data/spec/lib/excluded_entries_file_spec.rb +17 -0
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3313e2ac142946ca069a6aa41411ffba516b69db
|
4
|
+
data.tar.gz: 6b7ca5d40c94b48c95c0d3c4a588a99397fb41af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1a8a47857b20d771656245ddc4db65a7aa1a1b66ce626c1d5359494892b99b3fc6537695db9579efdddac156a5c7ddf8076dc575c5309335caf6b08aeaa0fbe
|
7
|
+
data.tar.gz: a404aacc74a19a34c2ca713e515353543f03af7cc503716f2cbb985fd3f82d2a8bcf1c0fcc9427e0e710c8e3977d98280fbeb0f513cb6a7a1b2bc01cb894cdbf
|
data/bin/fantassh
CHANGED
data/fantassh.gemspec
CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
+
spec.add_dependency 'slop'
|
22
|
+
|
21
23
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
24
|
spec.add_development_dependency 'rake'
|
23
25
|
spec.add_development_dependency 'rspec'
|
data/lib/fantassh/application.rb
CHANGED
@@ -1,17 +1,59 @@
|
|
1
|
+
require 'slop'
|
1
2
|
require_relative 'bash_history'
|
2
3
|
require_relative 'entries'
|
3
4
|
|
4
5
|
module Fantassh
|
5
6
|
class Application
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
class << self
|
8
|
+
def run(argv = ARGV)
|
9
|
+
Slop.parse(argv, help: true) do
|
10
|
+
on '-v', '--version', 'Print the program version.' do
|
11
|
+
puts "#{File.basename($0)} v#{Fantassh::VERSION}"
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
15
|
+
# default, runs when called without arguments
|
16
|
+
run do
|
17
|
+
Fantassh::Application.list
|
18
|
+
end
|
19
|
+
|
20
|
+
command :exclude do
|
21
|
+
banner "Usage: #{File.basename($0)} exclude <ssh command>"
|
22
|
+
|
23
|
+
run do |opts, args|
|
24
|
+
if args.empty?
|
25
|
+
puts help
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
|
29
|
+
Fantassh::Application.exclude(args.join(' '))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def list
|
36
|
+
entries.add(bash_history.entries)
|
37
|
+
|
38
|
+
selected_entry = `echo '#{entries.all.join("\n")}' | selecta`
|
39
|
+
# in case selecta receives ctrl+c we don't proceed
|
40
|
+
unless selected_entry.empty?
|
41
|
+
# indent by whitespace so it doesn't show up in the history
|
42
|
+
exec " ssh #{selected_entry}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def exclude(entry)
|
47
|
+
entries.exclude([entry])
|
48
|
+
end
|
49
|
+
|
50
|
+
def entries
|
51
|
+
Entries.new
|
52
|
+
end
|
10
53
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
exec " ssh $(cat #{@entries.entries_file} | selecta)"
|
54
|
+
def bash_history
|
55
|
+
BashHistory.new
|
56
|
+
end
|
15
57
|
end
|
16
58
|
end
|
17
59
|
end
|
data/lib/fantassh/entries.rb
CHANGED
@@ -1,39 +1,30 @@
|
|
1
|
-
|
1
|
+
require_relative 'entries_file'
|
2
|
+
require_relative 'excluded_entries_file'
|
2
3
|
|
3
4
|
module Fantassh
|
4
5
|
class Entries
|
5
|
-
|
6
|
+
def initialize(entries_file: EntriesFile.new, excluded_entries_file: ExcludedEntriesFile.new)
|
7
|
+
@entries_file = entries_file
|
8
|
+
@excluded_entries_file = excluded_entries_file
|
6
9
|
|
7
|
-
def initialize(config_dir: nil)
|
8
|
-
@config_dir = config_dir || File.join(Dir.home, '.fantassh')
|
9
|
-
@entries_file = File.join(@config_dir, 'entries')
|
10
|
-
@excluded_entries_file = File.join(@config_dir, 'excluded_entries')
|
11
10
|
init_file_structure
|
12
11
|
end
|
13
12
|
|
14
|
-
def
|
15
|
-
|
13
|
+
def add(entries)
|
14
|
+
@entries_file.add(entries)
|
16
15
|
end
|
17
16
|
|
18
|
-
def
|
19
|
-
|
17
|
+
def all
|
18
|
+
@entries_file.all - @excluded_entries_file.all
|
20
19
|
end
|
21
20
|
|
22
|
-
def
|
23
|
-
|
24
|
-
entries = (all + new_entries).uniq - excluded
|
25
|
-
|
26
|
-
File.open(@entries_file, 'w') do |f|
|
27
|
-
f.puts(entries)
|
28
|
-
end
|
21
|
+
def exclude(entries)
|
22
|
+
@excluded_entries_file.add(entries)
|
29
23
|
end
|
30
24
|
|
31
25
|
def init_file_structure
|
32
|
-
|
33
|
-
|
34
|
-
end
|
35
|
-
FileUtils.touch(@entries_file)
|
36
|
-
FileUtils.touch(@excluded_entries_file)
|
26
|
+
@entries_file.init_file_structure
|
27
|
+
@excluded_entries_file.init_file_structure
|
37
28
|
end
|
38
29
|
end
|
39
30
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Fantassh
|
4
|
+
class EntriesFile
|
5
|
+
def initialize(config_dir: nil)
|
6
|
+
@config_dir = config_dir || File.join(Dir.home, '.fantassh')
|
7
|
+
end
|
8
|
+
|
9
|
+
def all
|
10
|
+
File.readlines(file).map(&:strip)
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(new_entries)
|
14
|
+
new_entries = new_entries.map(&:strip).delete_if { |x| x.empty? }
|
15
|
+
entries = (all + new_entries).uniq
|
16
|
+
|
17
|
+
File.open(file, 'w') do |f|
|
18
|
+
f.puts(entries)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def file
|
23
|
+
File.join(@config_dir, 'entries')
|
24
|
+
end
|
25
|
+
|
26
|
+
def init_file_structure
|
27
|
+
unless Dir.exist?(@config_dir)
|
28
|
+
FileUtils.mkdir(@config_dir)
|
29
|
+
end
|
30
|
+
FileUtils.touch(file)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/fantassh/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
module Fantassh
|
5
|
+
describe Application do
|
6
|
+
context 'exclude' do
|
7
|
+
it 'adds an entry to the excluded entries' do
|
8
|
+
Dir.mktmpdir do |dir|
|
9
|
+
entries_file = Entries.new(
|
10
|
+
entries_file: EntriesFile.new(config_dir: dir),
|
11
|
+
excluded_entries_file: ExcludedEntriesFile.new(config_dir: dir))
|
12
|
+
Application.stub(entries: entries_file)
|
13
|
+
|
14
|
+
Application.run(['exclude', 'ssh bogus'])
|
15
|
+
|
16
|
+
File.readlines(File.join(dir, 'excluded_entries')).should == ["ssh bogus\n"]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -6,12 +6,19 @@ module Fantassh
|
|
6
6
|
subject { BashHistory.new }
|
7
7
|
|
8
8
|
context "#entries" do
|
9
|
-
it "returns entries that start with 'ssh'" do
|
9
|
+
it "returns entries that start with 'ssh '" do
|
10
10
|
File.stub(readlines: ["ssh host1.com\n", "host2.com\n", "\n"])
|
11
11
|
|
12
12
|
subject.entries.should == ['host1.com']
|
13
13
|
end
|
14
14
|
|
15
|
+
it "doesn't return entries that start with 'ssh*'" do
|
16
|
+
File.stub(readlines: ["ssh host1.com\n",
|
17
|
+
"ssh-keygen -t rsa -C 'a@a.com'\n", "\n"])
|
18
|
+
|
19
|
+
subject.entries.should == ['host1.com']
|
20
|
+
end
|
21
|
+
|
15
22
|
it "ignores duplicates" do
|
16
23
|
File.stub(readlines: ["ssh host1.com\n", "ssh host1.com\n"])
|
17
24
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fantassh/entries_file'
|
3
|
+
|
4
|
+
module Fantassh
|
5
|
+
describe EntriesFile do
|
6
|
+
subject { EntriesFile.new(config_dir: '/dir') }
|
7
|
+
|
8
|
+
context "#all" do
|
9
|
+
it "returns all entries" do
|
10
|
+
File.should_receive(:readlines).with('/dir/entries').
|
11
|
+
and_return(["host1.com\n", "user@host2.com\n"])
|
12
|
+
|
13
|
+
subject.all.should == ['host1.com', 'user@host2.com']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "#add" do
|
18
|
+
before do
|
19
|
+
file = double('file')
|
20
|
+
File.should_receive(:open).with('/dir/entries', 'w').and_yield(file)
|
21
|
+
file.should_receive(:puts).with(["host1.com"])
|
22
|
+
end
|
23
|
+
|
24
|
+
it "adds a new entry" do
|
25
|
+
subject.stub(all: [])
|
26
|
+
subject.stub(excluded: [])
|
27
|
+
|
28
|
+
subject.add(["host1.com"])
|
29
|
+
end
|
30
|
+
|
31
|
+
it "doesn't add a duplicate" do
|
32
|
+
subject.stub(all: ["host1.com"])
|
33
|
+
subject.stub(excluded: [])
|
34
|
+
|
35
|
+
subject.add(["host1.com"])
|
36
|
+
end
|
37
|
+
|
38
|
+
it "doesn't add an empty entry" do
|
39
|
+
subject.stub(all: ["host1.com"])
|
40
|
+
subject.stub(excluded: [])
|
41
|
+
|
42
|
+
subject.add([''])
|
43
|
+
end
|
44
|
+
|
45
|
+
it "removes leading and trailing whitespace" do
|
46
|
+
subject.stub(all: [])
|
47
|
+
subject.stub(excluded: [])
|
48
|
+
|
49
|
+
subject.add([" host1.com\n\n"])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/spec/lib/entries_spec.rb
CHANGED
@@ -3,66 +3,35 @@ require 'fantassh/entries'
|
|
3
3
|
|
4
4
|
module Fantassh
|
5
5
|
describe Entries do
|
6
|
-
|
7
|
-
subject { Entries.new(config_dir: '/dir') }
|
6
|
+
let(:entries_file) { double(:entries_file) }
|
8
7
|
|
9
|
-
|
10
|
-
it "returns the hidden entries" do
|
11
|
-
File.should_receive(:readlines).and_return(["host1.com\n"])
|
8
|
+
let(:excluded_entries_file) { double(:excluded_entries_file) }
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
context "#all" do
|
18
|
-
it "returns all entries" do
|
19
|
-
File.should_receive(:readlines).with('/dir/entries').
|
20
|
-
and_return(["host1.com\n", "user@host2.com\n"])
|
10
|
+
context "#initialize" do
|
11
|
+
it "calls init_file_structure on both entry files" do
|
12
|
+
entries_file.should_receive(:init_file_structure)
|
13
|
+
excluded_entries_file.should_receive(:init_file_structure)
|
21
14
|
|
22
|
-
|
15
|
+
Entries.new(entries_file: entries_file, excluded_entries_file: excluded_entries_file)
|
23
16
|
end
|
24
17
|
end
|
25
18
|
|
26
|
-
context "#
|
27
|
-
before
|
28
|
-
file = double('file')
|
29
|
-
File.should_receive(:open).with('/dir/entries', 'w').and_yield(file)
|
30
|
-
file.should_receive(:puts).with(["host1.com"])
|
31
|
-
end
|
32
|
-
|
33
|
-
it "adds a new entry" do
|
34
|
-
subject.stub(all: [])
|
35
|
-
subject.stub(excluded: [])
|
36
|
-
|
37
|
-
subject.add(["host1.com"])
|
38
|
-
end
|
39
|
-
|
40
|
-
it "doesn't add a duplicate" do
|
41
|
-
subject.stub(all: ["host1.com"])
|
42
|
-
subject.stub(excluded: [])
|
43
|
-
|
44
|
-
subject.add(["host1.com"])
|
45
|
-
end
|
46
|
-
|
47
|
-
it "doesn't add a hidden entry" do
|
48
|
-
subject.stub(all: ["host1.com"])
|
49
|
-
subject.stub(excluded: ["user@host2.com"])
|
50
|
-
|
51
|
-
subject.add(["user@host2.com"])
|
52
|
-
end
|
19
|
+
context "#all" do
|
20
|
+
before { Entries.any_instance.stub(:init_file_structure) }
|
53
21
|
|
54
|
-
it "
|
55
|
-
|
56
|
-
subject.stub(excluded: [])
|
22
|
+
it "returns an entry" do
|
23
|
+
entries_file.should_receive(:all).and_return(["host1.com"])
|
57
24
|
|
58
|
-
|
25
|
+
Entries.new(entries_file: entries_file).all.should ==
|
26
|
+
["host1.com"]
|
59
27
|
end
|
60
28
|
|
61
|
-
it "
|
62
|
-
|
63
|
-
|
29
|
+
it "doesn't return a hidden entry" do
|
30
|
+
entries_file.should_receive(:all).and_return(["host1.com"])
|
31
|
+
excluded_entries_file.should_receive(:all).and_return(["user@host2.com"])
|
64
32
|
|
65
|
-
|
33
|
+
Entries.new(entries_file: entries_file, excluded_entries_file: excluded_entries_file).
|
34
|
+
all.should == ["host1.com"]
|
66
35
|
end
|
67
36
|
end
|
68
37
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fantassh/excluded_entries_file'
|
3
|
+
|
4
|
+
module Fantassh
|
5
|
+
describe ExcludedEntriesFile do
|
6
|
+
subject { ExcludedEntriesFile.new(config_dir: '/dir') }
|
7
|
+
|
8
|
+
context "#all" do
|
9
|
+
it "returns all entries" do
|
10
|
+
File.should_receive(:readlines).with('/dir/excluded_entries').
|
11
|
+
and_return(["user@host2.com\n"])
|
12
|
+
|
13
|
+
subject.all.should == ['user@host2.com']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fantassh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexis Reigel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: slop
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,9 +86,14 @@ files:
|
|
72
86
|
- lib/fantassh/application.rb
|
73
87
|
- lib/fantassh/bash_history.rb
|
74
88
|
- lib/fantassh/entries.rb
|
89
|
+
- lib/fantassh/entries_file.rb
|
90
|
+
- lib/fantassh/excluded_entries_file.rb
|
75
91
|
- lib/fantassh/version.rb
|
92
|
+
- spec/lib/application_spec.rb
|
76
93
|
- spec/lib/bash_history_spec.rb
|
94
|
+
- spec/lib/entries_file_spec.rb
|
77
95
|
- spec/lib/entries_spec.rb
|
96
|
+
- spec/lib/excluded_entries_file_spec.rb
|
78
97
|
- spec/spec_helper.rb
|
79
98
|
homepage: https://github.com/koffeinfrei/fantassh
|
80
99
|
licenses:
|
@@ -101,6 +120,9 @@ signing_key:
|
|
101
120
|
specification_version: 4
|
102
121
|
summary: Provides a selectable history list for quickly accessing your past ssh connections.
|
103
122
|
test_files:
|
123
|
+
- spec/lib/application_spec.rb
|
104
124
|
- spec/lib/bash_history_spec.rb
|
125
|
+
- spec/lib/entries_file_spec.rb
|
105
126
|
- spec/lib/entries_spec.rb
|
127
|
+
- spec/lib/excluded_entries_file_spec.rb
|
106
128
|
- spec/spec_helper.rb
|