picky 2.1.1 → 2.1.2
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.
- data/lib/picky/auxiliary/terminal.rb +89 -17
- data/lib/tasks/routes.rake +1 -1
- data/lib/tasks/search.rake +4 -1
- data/spec/lib/auxiliary/terminal_spec.rb +96 -2
- metadata +1 -1
@@ -2,21 +2,31 @@ class Terminal
|
|
2
2
|
|
3
3
|
attr_reader :client
|
4
4
|
|
5
|
-
def initialize given_uri
|
5
|
+
def initialize given_uri, id_amount = nil
|
6
6
|
check_highline_gem
|
7
7
|
check_picky_client_gem
|
8
8
|
|
9
9
|
require 'uri'
|
10
10
|
uri = URI.parse given_uri
|
11
|
+
|
12
|
+
# If the user gave a whole url without http, add that and reparse.
|
13
|
+
#
|
11
14
|
unless uri.path
|
12
15
|
uri = URI.parse "http://#{given_uri}"
|
13
16
|
end
|
17
|
+
|
18
|
+
# If the user gave a path without / in front, add one.
|
19
|
+
#
|
14
20
|
unless uri.path =~ /^\//
|
15
21
|
uri.path = "/#{uri.path}"
|
16
22
|
end
|
17
23
|
|
18
24
|
@searches = 0
|
19
25
|
@durations = 0
|
26
|
+
@current_text = ''
|
27
|
+
@cursor_offset = 0
|
28
|
+
@last_ids = ''
|
29
|
+
@id_amount = id_amount && Integer(id_amount) || 20
|
20
30
|
@client = Picky::Client.new :host => (uri.host || 'localhost'), :port => (uri.port || 8080), :path => uri.path
|
21
31
|
|
22
32
|
install_trap
|
@@ -35,6 +45,8 @@ class Terminal
|
|
35
45
|
exit 1
|
36
46
|
end
|
37
47
|
|
48
|
+
# Install the Ctrl-C handler.
|
49
|
+
#
|
38
50
|
def install_trap
|
39
51
|
Signal.trap('INT') do
|
40
52
|
print "\e[100D"
|
@@ -47,17 +59,28 @@ class Terminal
|
|
47
59
|
end
|
48
60
|
end
|
49
61
|
|
62
|
+
# Flush to STDOUT.
|
63
|
+
#
|
50
64
|
def flush
|
51
65
|
STDOUT.flush
|
52
66
|
end
|
67
|
+
|
68
|
+
# Position cursor amount to the left.
|
69
|
+
#
|
53
70
|
def left amount = 1
|
54
71
|
print "\e[#{amount}D"
|
55
72
|
flush
|
56
73
|
end
|
74
|
+
|
75
|
+
# Position cursor amount to the right.
|
76
|
+
#
|
57
77
|
def right amount = 1
|
58
78
|
print "\e[#{amount}C"
|
59
79
|
flush
|
60
80
|
end
|
81
|
+
|
82
|
+
# Move cursor to position.
|
83
|
+
#
|
61
84
|
def move_to position
|
62
85
|
relative = position - @cursor_offset
|
63
86
|
if relative > 0
|
@@ -68,45 +91,90 @@ class Terminal
|
|
68
91
|
@cursor_offset = position
|
69
92
|
flush
|
70
93
|
end
|
94
|
+
|
95
|
+
# Delete one character.
|
96
|
+
#
|
71
97
|
def backspace
|
72
|
-
|
73
|
-
print "\e[1D"
|
74
|
-
print " "
|
75
|
-
print "\e[1D"
|
98
|
+
chop_text
|
99
|
+
print "\e[1D \e[1D"
|
76
100
|
flush
|
77
101
|
end
|
102
|
+
|
103
|
+
# Write the text to the input area.
|
104
|
+
#
|
78
105
|
def write text
|
79
|
-
print text
|
80
106
|
@cursor_offset += text.size
|
107
|
+
print text
|
81
108
|
flush
|
82
109
|
end
|
110
|
+
|
111
|
+
# Chop off one character.
|
112
|
+
#
|
113
|
+
def chop_text
|
114
|
+
@current_text.chop!
|
115
|
+
end
|
116
|
+
|
117
|
+
# Add the given text to the current text.
|
118
|
+
#
|
119
|
+
def add_text text
|
120
|
+
@current_text << text
|
121
|
+
end
|
122
|
+
|
123
|
+
# Type the given text into the input area.
|
124
|
+
#
|
83
125
|
def type_search character
|
84
|
-
|
126
|
+
add_text character
|
85
127
|
write character
|
86
128
|
end
|
129
|
+
|
130
|
+
# Write the amount of result ids.
|
131
|
+
#
|
87
132
|
def write_results results
|
88
133
|
move_to 0
|
89
134
|
write "%9d" % (results && results.total || 0)
|
90
135
|
move_to 10 + @current_text.size
|
91
136
|
end
|
137
|
+
|
138
|
+
# Move to the id area.
|
139
|
+
#
|
92
140
|
def move_to_ids
|
93
|
-
move_to
|
141
|
+
move_to 12 + @current_text.size
|
94
142
|
end
|
143
|
+
|
144
|
+
# Write the result ids.
|
145
|
+
#
|
95
146
|
def write_ids results
|
96
147
|
move_to_ids
|
97
|
-
write "=> #{results.total ? results.ids : []}"
|
148
|
+
write "=> #{results.total ? results.ids(@id_amount) : []}"
|
149
|
+
rescue StandardError => e
|
150
|
+
p e.message
|
151
|
+
p e.backtrace
|
98
152
|
end
|
153
|
+
|
154
|
+
# Clear the result ids.
|
155
|
+
#
|
99
156
|
def clear_ids
|
100
157
|
move_to_ids
|
101
|
-
write " "*200
|
158
|
+
write @ids_clearing_string ||= " "*200
|
102
159
|
end
|
160
|
+
|
161
|
+
# Log a search.
|
162
|
+
#
|
103
163
|
def log results
|
104
164
|
@searches += 1
|
105
165
|
@durations += (results[:duration] || 0)
|
106
166
|
end
|
167
|
+
|
168
|
+
# Perform a search.
|
169
|
+
#
|
107
170
|
def search full = false
|
108
|
-
client.search @current_text, :ids => (full ?
|
171
|
+
client.search @current_text, :ids => (full ? @id_amount : 0)
|
109
172
|
end
|
173
|
+
|
174
|
+
# Perform a search and write the results.
|
175
|
+
#
|
176
|
+
# Handles 404s and connection problems.
|
177
|
+
#
|
110
178
|
def search_and_write full = false
|
111
179
|
results = search full
|
112
180
|
results.extend Picky::Convenience
|
@@ -116,16 +184,20 @@ class Terminal
|
|
116
184
|
full ? write_ids(results) : clear_ids
|
117
185
|
|
118
186
|
write_results results
|
187
|
+
rescue Errno::ECONNREFUSED => e
|
188
|
+
write "Please start a Picky server listening to #{@client.path}."
|
189
|
+
rescue Yajl::ParseError => e
|
190
|
+
write "Got a 404. Maybe the path #{@client.path} isn't a correct one?"
|
119
191
|
end
|
120
192
|
|
193
|
+
# Run the terminal.
|
194
|
+
#
|
195
|
+
# Note: Uses a simple loop to handle input.
|
196
|
+
#
|
121
197
|
def run
|
122
|
-
puts "Type and see the result count update. Press enter for the first
|
198
|
+
puts "Type and see the result count update. Press enter for the first #{@id_amount} result ids."
|
123
199
|
puts "Break with Ctrl-C."
|
124
200
|
|
125
|
-
@current_text = ''
|
126
|
-
@cursor_offset = 0
|
127
|
-
@last_ids = ''
|
128
|
-
move_to 10
|
129
201
|
search_and_write
|
130
202
|
|
131
203
|
loop do
|
@@ -137,7 +209,7 @@ class Terminal
|
|
137
209
|
search_and_write
|
138
210
|
when 13
|
139
211
|
search_and_write true
|
140
|
-
else
|
212
|
+
else # All other.
|
141
213
|
type_search input.chr
|
142
214
|
search_and_write
|
143
215
|
end
|
data/lib/tasks/routes.rake
CHANGED
data/lib/tasks/search.rake
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
# Tasks for testing your engine configuration in the terminal.
|
2
2
|
#
|
3
|
+
desc 'Simple terminal search - pass it an URL to search on, e.g. /books.'
|
3
4
|
task :search do
|
4
5
|
load File.expand_path '../../picky/auxiliary/terminal.rb', __FILE__
|
5
|
-
|
6
|
+
url_or_path = ARGV[1] || raise("Usage:\n rake search <URL> [<result ids>]\n E.g. rake search /books\n rake search localhost:8080/books 10")
|
7
|
+
ids = ARGV[2]
|
8
|
+
terminal = Terminal.new url_or_path, ids
|
6
9
|
terminal.run
|
7
10
|
end
|
@@ -11,8 +11,102 @@ describe Terminal do
|
|
11
11
|
|
12
12
|
let(:terminal) { described_class.new('/some/url') }
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
describe 'backspace' do
|
15
|
+
it 'works correctly' do
|
16
|
+
terminal.should_receive(:chop_text).once.ordered.with()
|
17
|
+
terminal.should_receive(:print).once.ordered.with "\e[1D \e[1D"
|
18
|
+
terminal.should_receive(:flush).once.ordered.with()
|
19
|
+
|
20
|
+
terminal.backspace
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'write_results' do
|
25
|
+
it 'works correctly' do
|
26
|
+
terminal.should_receive(:move_to).once.ordered.with 0
|
27
|
+
terminal.should_receive(:write).once.ordered.with " 0"
|
28
|
+
terminal.should_receive(:move_to).once.ordered.with 10
|
29
|
+
|
30
|
+
terminal.write_results nil
|
31
|
+
end
|
32
|
+
it 'works correctly' do
|
33
|
+
terminal.should_receive(:move_to).once.ordered.with 0
|
34
|
+
terminal.should_receive(:write).once.ordered.with "123456789"
|
35
|
+
terminal.should_receive(:move_to).once.ordered.with 10
|
36
|
+
|
37
|
+
terminal.write_results stub(:results, :total => 123456789)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'search' do
|
42
|
+
before(:each) do
|
43
|
+
@client = stub :client
|
44
|
+
terminal.stub! :client => @client
|
45
|
+
|
46
|
+
terminal.add_text 'hello'
|
47
|
+
end
|
48
|
+
it 'searches full correctly' do
|
49
|
+
@client.should_receive(:search).once.with 'hello', :ids => 20
|
50
|
+
|
51
|
+
terminal.search true
|
52
|
+
end
|
53
|
+
it 'searches full correctly' do
|
54
|
+
terminal = described_class.new('/some/url', 33)
|
55
|
+
terminal.stub! :client => @client
|
56
|
+
|
57
|
+
@client.should_receive(:search).once.with '', :ids => 33
|
58
|
+
|
59
|
+
terminal.search true
|
60
|
+
end
|
61
|
+
it 'searches live correctly' do
|
62
|
+
@client.should_receive(:search).once.with 'hello', :ids => 0
|
63
|
+
|
64
|
+
terminal.search
|
65
|
+
end
|
66
|
+
it 'searches live correctly' do
|
67
|
+
@client.should_receive(:search).once.with 'hello', :ids => 0
|
68
|
+
|
69
|
+
terminal.search false
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'clear_ids' do
|
74
|
+
it 'moves to the ids, then clears all' do
|
75
|
+
terminal.should_receive(:move_to_ids).once.with()
|
76
|
+
terminal.should_receive(:write).once.with " "*200
|
77
|
+
|
78
|
+
terminal.clear_ids
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe 'write_ids' do
|
83
|
+
it 'writes the result\'s ids' do
|
84
|
+
terminal.should_receive(:move_to_ids).once.with()
|
85
|
+
terminal.should_receive(:write).once.with "=> []"
|
86
|
+
|
87
|
+
terminal.write_ids stub(:results, :total => nil)
|
88
|
+
end
|
89
|
+
it 'writes the result\'s ids' do
|
90
|
+
terminal.should_receive(:move_to_ids).once.with()
|
91
|
+
terminal.should_receive(:write).once.with "=> [1, 2, 3]"
|
92
|
+
|
93
|
+
terminal.write_ids stub(:results, :total => 3, :ids => [1, 2, 3])
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe 'move_to_ids' do
|
98
|
+
it 'moves to a specific place' do
|
99
|
+
terminal.should_receive(:move_to).once.with 12
|
100
|
+
|
101
|
+
terminal.move_to_ids
|
102
|
+
end
|
103
|
+
it 'moves to a specific place' do
|
104
|
+
terminal.add_text 'test'
|
105
|
+
|
106
|
+
terminal.should_receive(:move_to).once.with 16
|
107
|
+
|
108
|
+
terminal.move_to_ids
|
109
|
+
end
|
16
110
|
end
|
17
111
|
|
18
112
|
describe 'left' do
|