telepath 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/README.markdown +77 -0
- data/lib/telepath/command.rb +62 -8
- data/lib/telepath/handler.rb +15 -1
- data/lib/telepath/version.rb +1 -1
- data/spec/exe_spec.rb +8 -4
- data/spec/handler_spec.rb +47 -12
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b38bc8a0619f00d35224b7e2586a0d193074f7a3
|
4
|
+
data.tar.gz: 81772bf8131f737c3071e2566158559f576edaa7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a32bab376cf4b20156be53dceb4c5e567a103f4dc4174664dc16a99d746eabd8582cbb34329266d7eb79444c231205629071b501b1556ebff4a98258b340f07a
|
7
|
+
data.tar.gz: 16b7370de869fc20fb802bdea9ca45516c1ddb0b70dd8d947b9a2ef2fd522c68bca4eb252771afe5096bab41fb08a2d0811ee65ba4e3fb5edc2dab06d28e4ea6
|
data/README.markdown
CHANGED
@@ -3,6 +3,7 @@ Telepath
|
|
3
3
|
|
4
4
|
Spooky action at a distance.
|
5
5
|
|
6
|
+
[](http://badge.fury.io/rb/telepath)
|
6
7
|
[](https://travis-ci.org/acook/telepath)
|
7
8
|
[](https://codeclimate.com/github/acook/telepath)
|
8
9
|
[](https://gemnasium.com/acook/telepath)
|
@@ -33,6 +34,80 @@ What about shared, persistant, distributed, fully decorated multi-client multi-h
|
|
33
34
|
Yeah thats pretty much what I thought. Now go change your pants, I'll still be here when you get back.
|
34
35
|
|
35
36
|
|
37
|
+
Installation & Setup
|
38
|
+
--------------------
|
39
|
+
|
40
|
+
### Install it!
|
41
|
+
|
42
|
+
```sh
|
43
|
+
gem install telepath
|
44
|
+
```
|
45
|
+
|
46
|
+
### Set it up!
|
47
|
+
|
48
|
+
Actually, thats pretty much it. Telepath just works.
|
49
|
+
|
50
|
+
|
51
|
+
Usage
|
52
|
+
-----
|
53
|
+
|
54
|
+
Here's the output of `tel --help`:
|
55
|
+
|
56
|
+
```sh
|
57
|
+
Usage:
|
58
|
+
tel [OPTIONS] SUBCOMMAND [ARG] ...
|
59
|
+
|
60
|
+
Parameters:
|
61
|
+
SUBCOMMAND subcommand
|
62
|
+
[ARG] ... subcommand arguments
|
63
|
+
|
64
|
+
Subcommands:
|
65
|
+
+, add Add item
|
66
|
+
?, lookup Look up item by pattern
|
67
|
+
$, last Get most recent item
|
68
|
+
@, index Get item from (reverse) index
|
69
|
+
|
70
|
+
Options:
|
71
|
+
-q, --quiet Only output when absolutely necessary. (default: $TELEPORT_QUIET, or false)
|
72
|
+
-f, --file FILE Filename of the Teleport store file. (default: $TELEPORT_FILE, or ".telepath.db")
|
73
|
+
-p, --path PATH Path where the the Teleport store file is located. (default: $TELEPORT_PATH, or "~")
|
74
|
+
-h, --help print help
|
75
|
+
```
|
76
|
+
|
77
|
+
Example
|
78
|
+
-------
|
79
|
+
|
80
|
+
Dump data into Telepath from Bash...
|
81
|
+
|
82
|
+
```bash
|
83
|
+
$ tel + "All the things!"
|
84
|
+
```
|
85
|
+
|
86
|
+
Use it in Vim...
|
87
|
+
|
88
|
+
```viml
|
89
|
+
:r ! tel $
|
90
|
+
```
|
91
|
+
|
92
|
+
Use it again in Zsh...
|
93
|
+
|
94
|
+
```zsh
|
95
|
+
∴ export which_things=$(tel $)
|
96
|
+
```
|
97
|
+
|
98
|
+
Manipulate it with `tr` in zsh and add the result back into Telepath...
|
99
|
+
|
100
|
+
```zsh
|
101
|
+
∴ tel $ | tr '[:lower:]' '[:upper:]' | tel +
|
102
|
+
```
|
103
|
+
|
104
|
+
And bring it back into Bash to combine it with the previous version...
|
105
|
+
|
106
|
+
```bash
|
107
|
+
$ echo $(tel $) $(tel @ 1) | tee result.txt | tel +
|
108
|
+
```
|
109
|
+
|
110
|
+
|
36
111
|
Contributing
|
37
112
|
------------
|
38
113
|
|
@@ -50,4 +125,6 @@ I'm glad you asked!
|
|
50
125
|
|
51
126
|
Anthony M. Cook 2013
|
52
127
|
|
128
|
+
Inspired by this perl script: [oknowton/shstack](https://github.com/oknowton/shstack)
|
129
|
+
|
53
130
|
|
data/lib/telepath/command.rb
CHANGED
@@ -3,29 +3,51 @@ require 'clamp'
|
|
3
3
|
module Telepath
|
4
4
|
class Command < ::Clamp::Command
|
5
5
|
|
6
|
-
option ['-q', '--quiet'], :flag,
|
6
|
+
option ['-q', '--quiet'], :flag, 'Only output when absolutely necessary.',
|
7
|
+
environment_variable: 'TELEPORT_QUIET', default: false
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
option ['-f', '--file'], 'FILE', 'Filename of the Teleport store file.',
|
10
|
+
environment_variable: 'TELEPORT_FILE', default: Telepath::Storage::DEFAULT_FILE
|
11
|
+
|
12
|
+
option ['-p', '--path'], 'PATH', 'Path where the the Teleport store file is located.',
|
13
|
+
environment_variable: 'TELEPORT_PATH', default: Telepath::Storage::DEFAULT_PATH
|
14
|
+
|
15
|
+
subcommand ['+', 'add'], 'Add item' do
|
16
|
+
parameter '[VALUE] ...', 'value to add', attribute_name: 'values'
|
10
17
|
|
11
18
|
def execute
|
12
19
|
handler = Telepath::Handler.new self
|
13
|
-
|
20
|
+
values = self.values || Array.new
|
21
|
+
|
22
|
+
unless $stdin.tty? then
|
23
|
+
buffered = IO.select([$stdin], [], [], 1)
|
24
|
+
values << $stdin.read.strip if buffered && buffered.first && buffered.first.first
|
25
|
+
end
|
26
|
+
|
27
|
+
Out.error self, "No values supplied!" if values.empty?
|
28
|
+
|
29
|
+
results = values.map do |value|
|
30
|
+
handler.add value
|
31
|
+
end
|
32
|
+
|
33
|
+
success = results.all?{|r|r.first}
|
34
|
+
name = results.first.last
|
14
35
|
|
15
36
|
if success then
|
16
|
-
Out.info "Added
|
37
|
+
Out.info "Added [#{values.map(&:inspect).join ', '}] to `#{name}'!"
|
17
38
|
else
|
18
|
-
|
39
|
+
failures = values.reject.with_index{|_, i| results[i].first}
|
40
|
+
Out.error self, "Could not add [#{failures.map().join ', '}] to `#{name}'!"
|
19
41
|
end
|
20
42
|
end
|
21
43
|
end
|
22
44
|
|
23
|
-
subcommand ['
|
45
|
+
subcommand ['?', 'lookup'], 'Look up item by pattern' do
|
24
46
|
parameter '[PATTERN]', 'pattern to find'
|
25
47
|
|
26
48
|
def execute
|
27
49
|
handler = Telepath::Handler.new self
|
28
|
-
value = handler.
|
50
|
+
value = handler.lookup pattern
|
29
51
|
|
30
52
|
if value && !value.empty? then
|
31
53
|
Out.data value
|
@@ -35,6 +57,38 @@ module Telepath
|
|
35
57
|
end
|
36
58
|
end
|
37
59
|
|
60
|
+
subcommand ['$', 'last'], 'Get most recent item' do
|
61
|
+
def execute
|
62
|
+
handler = Telepath::Handler.new self
|
63
|
+
value = handler.last
|
64
|
+
|
65
|
+
if value && !value.empty? then
|
66
|
+
Out.data value
|
67
|
+
else
|
68
|
+
Out.error self, "Telepath is empty, is your storage location configured properly?"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
subcommand ['@', 'index'], 'Get item from (reverse) index' do
|
74
|
+
parameter 'INDEX ...', 'index of item, starting from most recent (0)',
|
75
|
+
attribute_name: :indicies do |i|
|
76
|
+
Integer(i)
|
77
|
+
end
|
78
|
+
|
79
|
+
def execute
|
80
|
+
handler = Telepath::Handler.new self
|
81
|
+
index = indicies.first
|
82
|
+
value = handler.index index
|
83
|
+
|
84
|
+
if value && !value.to_s.empty? then
|
85
|
+
Out.data value
|
86
|
+
else
|
87
|
+
Out.error self, "Hmm, couldn't find anything at that index."
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
38
92
|
def execute
|
39
93
|
exit 1
|
40
94
|
end
|
data/lib/telepath/handler.rb
CHANGED
@@ -14,7 +14,13 @@ module Telepath
|
|
14
14
|
[true, name]
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def last
|
18
|
+
with_store 'stack' do |container|
|
19
|
+
container.last
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def lookup pattern
|
18
24
|
with_store 'stack' do |container|
|
19
25
|
|
20
26
|
if pattern && !pattern.empty? then
|
@@ -32,6 +38,14 @@ module Telepath
|
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|
41
|
+
def index *indicies
|
42
|
+
index = indicies.first
|
43
|
+
|
44
|
+
with_store 'stack' do |container|
|
45
|
+
container[-(index.to_i + 1)]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
35
49
|
def storage
|
36
50
|
if @storage && @storage.ready? then
|
37
51
|
@storage
|
data/lib/telepath/version.rb
CHANGED
data/spec/exe_spec.rb
CHANGED
@@ -26,7 +26,7 @@ describe 'Telepath Executable' do
|
|
26
26
|
specify { expect(status).to_not be_success }
|
27
27
|
end
|
28
28
|
|
29
|
-
describe '+' do
|
29
|
+
describe '+ add' do
|
30
30
|
let(:command){ :+ }
|
31
31
|
|
32
32
|
context 'without value' do
|
@@ -39,13 +39,17 @@ describe 'Telepath Executable' do
|
|
39
39
|
specify { expect(status).to be_success }
|
40
40
|
|
41
41
|
it 'adds the value to the stack' do
|
42
|
-
expect(stdout).to eq("Added
|
42
|
+
expect(stdout).to eq("Added [\"12\"] to `stack'!")
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should have no error output' do
|
46
|
+
expect(exe.stderr).to eq ''
|
43
47
|
end
|
44
48
|
end
|
45
49
|
end
|
46
50
|
|
47
|
-
describe '
|
48
|
-
let(:command){ '
|
51
|
+
describe '? lookup' do
|
52
|
+
let(:command){ '?' }
|
49
53
|
let(:handler){ Telepath::Handler.new double(Clamp::Command) }
|
50
54
|
let(:value){ '12' }
|
51
55
|
|
data/spec/handler_spec.rb
CHANGED
@@ -7,6 +7,11 @@ describe Telepath::Handler do
|
|
7
7
|
subject(:handler){ described_class.new double(Clamp::Command) }
|
8
8
|
|
9
9
|
let(:storage){ Telepath::Storage.new }
|
10
|
+
let(:value){ 'whatever' }
|
11
|
+
|
12
|
+
before do
|
13
|
+
handler.add value
|
14
|
+
end
|
10
15
|
|
11
16
|
it 'exists' do
|
12
17
|
expect(described_class).to be
|
@@ -18,30 +23,60 @@ describe Telepath::Handler do
|
|
18
23
|
|
19
24
|
describe '#add' do
|
20
25
|
it 'adds 1 item' do
|
21
|
-
expect{ handler.add '
|
26
|
+
expect{ handler.add 'something' }.to change{
|
22
27
|
storage.store.adapter.backend.sunrise
|
23
28
|
storage.stack.length
|
24
|
-
}.from(
|
29
|
+
}.from(1).to(2)
|
25
30
|
end
|
26
31
|
|
27
32
|
it 'adds the right item' do
|
28
|
-
handler.add '
|
29
|
-
expect(storage.stack).to include('
|
33
|
+
handler.add 'something'
|
34
|
+
expect(storage.stack).to include('something')
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'redirected input' do
|
38
|
+
xit 'reads and stores stdin' do
|
39
|
+
end
|
30
40
|
end
|
31
41
|
end
|
32
42
|
|
33
|
-
describe '#
|
34
|
-
|
43
|
+
describe '#last' do
|
44
|
+
it 'returns the last value' do
|
45
|
+
expect(handler.last).to eq(value)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'does not delete the item' do
|
49
|
+
expect{ handler.last }.to change{
|
50
|
+
storage.store.adapter.backend.sunrise
|
51
|
+
storage.stack.length
|
52
|
+
}.by(0)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#index' do
|
35
57
|
before do
|
36
|
-
handler.add
|
58
|
+
handler.add 'blah'
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'returns the item at the specified reverse index (1)' do
|
62
|
+
expect(handler.index 1).to eq(value)
|
37
63
|
end
|
38
64
|
|
39
|
-
it '
|
40
|
-
expect(handler.
|
65
|
+
it 'returns the item at the specified reverse index (0)' do
|
66
|
+
expect(handler.index 0).to eq('blah')
|
41
67
|
end
|
42
68
|
|
43
69
|
it 'does not delete the item' do
|
44
|
-
expect{ handler.
|
70
|
+
expect{ handler.index value }.to change{
|
71
|
+
storage.store.adapter.backend.sunrise
|
72
|
+
storage.stack.length
|
73
|
+
}.by(0)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe '#lookup' do
|
78
|
+
it 'does not delete the item' do
|
79
|
+
expect{ handler.lookup value }.to change{
|
45
80
|
storage.store.adapter.backend.sunrise
|
46
81
|
storage.stack.length
|
47
82
|
}.by(0)
|
@@ -49,14 +84,14 @@ describe Telepath::Handler do
|
|
49
84
|
|
50
85
|
context 'pattern matching' do
|
51
86
|
it 'matches substrings of words' do
|
52
|
-
expect(handler.
|
87
|
+
expect(handler.lookup('what')).to eq(value)
|
53
88
|
end
|
54
89
|
|
55
90
|
context 'numbers' do
|
56
91
|
let(:value){ '12' }
|
57
92
|
|
58
93
|
it 'matches parts of numbers' do
|
59
|
-
expect(handler.
|
94
|
+
expect(handler.lookup('1')).to eq(value)
|
60
95
|
end
|
61
96
|
end
|
62
97
|
end
|