htty 1.1.3 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/htty/cli/commands/query_set.rb +23 -8
- data/lib/htty/request.rb +34 -13
- data/spec/system/scenarios/exit/actual_stderr +0 -0
- data/spec/system/scenarios/exit/actual_stdout +2 -0
- data/spec/system/scenarios/exit/expected_stdout +2 -0
- data/spec/system/scenarios/exit/stdin +1 -0
- data/spec/system/scenarios/quit/actual_stderr +0 -0
- data/spec/system/scenarios/quit/actual_stdout +2 -0
- data/spec/system/scenarios/quit/expected_stdout +2 -0
- data/spec/system/scenarios/quit/stdin +1 -0
- data/spec/system/scenarios_spec.rb +46 -0
- data/spec/unit/htty/cli/commands/query_set_spec.rb +70 -0
- metadata +13 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.4
|
@@ -21,24 +21,23 @@ class HTTY::CLI::Commands::QuerySet < HTTY::CLI::Command
|
|
21
21
|
'Navigation'
|
22
22
|
end
|
23
23
|
|
24
|
-
# Returns the arguments for the command-line usage of the _query-set_
|
25
|
-
# command.
|
24
|
+
# Returns the arguments for the command-line usage of the _query-set_ command.
|
26
25
|
def self.command_line_arguments
|
27
|
-
'name value'
|
26
|
+
'name [value [name [value]] ...]'
|
28
27
|
end
|
29
28
|
|
30
29
|
# Returns the help text for the _query-set_ command.
|
31
30
|
def self.help
|
32
|
-
"Sets
|
31
|
+
"Sets query-string parameters in the request's address"
|
33
32
|
end
|
34
33
|
|
35
34
|
# Returns the extended help text for the _query-set_ command.
|
36
35
|
def self.help_extended
|
37
|
-
'Sets
|
36
|
+
'Sets one or more query-string parameters used for the request. Does not ' +
|
38
37
|
"communicate with the host.\n" +
|
39
38
|
"\n" +
|
40
|
-
'The name and value of the query-string parameter will be URL-
|
41
|
-
"necessary.\n"
|
39
|
+
'The name(s) and value(s) of the query-string parameter will be URL-' +
|
40
|
+
"encoded if necessary.\n" +
|
42
41
|
"\n" +
|
43
42
|
'The console prompt shows the address for the current request.'
|
44
43
|
end
|
@@ -54,9 +53,25 @@ class HTTY::CLI::Commands::QuerySet < HTTY::CLI::Command
|
|
54
53
|
def perform
|
55
54
|
add_request_if_has_response do |request|
|
56
55
|
self.class.notify_if_cookies_cleared request do
|
57
|
-
|
56
|
+
escaped_arguments = escape_or_warn_of_escape_sequences(arguments)
|
57
|
+
in_groups_of(2, escaped_arguments).each do |key_value|
|
58
|
+
request.query_set(*key_value)
|
59
|
+
end
|
60
|
+
request
|
58
61
|
end
|
59
62
|
end
|
60
63
|
end
|
61
64
|
|
65
|
+
private
|
66
|
+
|
67
|
+
def in_groups_of(how_many, source)
|
68
|
+
groups = []
|
69
|
+
source = source.dup
|
70
|
+
(source.length / how_many).times do
|
71
|
+
groups << source.slice!(0, how_many)
|
72
|
+
end
|
73
|
+
groups << source unless source.empty?
|
74
|
+
groups
|
75
|
+
end
|
76
|
+
|
62
77
|
end
|
data/lib/htty/request.rb
CHANGED
@@ -376,25 +376,22 @@ public
|
|
376
376
|
|
377
377
|
# Establishes a new #uri, with the specified _value_ for the query-string
|
378
378
|
# parameter specified by _name_.
|
379
|
-
def query_set(name, value)
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
new_query = value.nil? ?
|
384
|
-
query.gsub(parameter, '&') :
|
385
|
-
query.gsub(parameter, "&#{name}=#{value}&")
|
386
|
-
else
|
387
|
-
new_query = value.nil? ? query : "#{query}#{name}=#{value}"
|
388
|
-
end
|
389
|
-
new_query = new_query.gsub(/^&/, '').gsub(/&$/, '')
|
390
|
-
new_query = nil if (new_query == '')
|
379
|
+
def query_set(name, value=nil)
|
380
|
+
entries = current_query_entries
|
381
|
+
add_or_replace_field(entries, name, value)
|
382
|
+
new_query = entries.empty? ? nil : entries.join('&')
|
391
383
|
rebuild_uri :query => new_query
|
392
384
|
end
|
393
385
|
|
394
386
|
# Establishes a new #uri, without the query-string parameter specified by
|
395
387
|
# _name_.
|
396
388
|
def query_unset(name)
|
397
|
-
|
389
|
+
return unless uri.query
|
390
|
+
entries = current_query_entries
|
391
|
+
entries.delete_if do |entry|
|
392
|
+
entry =~ field_matcher(name)
|
393
|
+
end
|
394
|
+
rebuild_uri :query => entries.join('&')
|
398
395
|
end
|
399
396
|
|
400
397
|
# Establishes a new #uri without a query string.
|
@@ -462,16 +459,40 @@ protected
|
|
462
459
|
|
463
460
|
private
|
464
461
|
|
462
|
+
def add_or_replace_field(chunks, name, value)
|
463
|
+
new_entry = name + (value.nil? ? '' : "=#{value}")
|
464
|
+
has_matched = false
|
465
|
+
chunks.each do |chunk|
|
466
|
+
if chunk =~ field_matcher(name)
|
467
|
+
if has_matched
|
468
|
+
chunks.delete chunk
|
469
|
+
else
|
470
|
+
chunks[chunks.index(chunk)] = new_entry
|
471
|
+
has_matched = true
|
472
|
+
end
|
473
|
+
end
|
474
|
+
end
|
475
|
+
chunks << new_entry unless has_matched
|
476
|
+
end
|
477
|
+
|
465
478
|
def authority
|
466
479
|
self.class.build_authority :userinfo => uri.userinfo,
|
467
480
|
:host => uri.host,
|
468
481
|
:port => uri.port
|
469
482
|
end
|
470
483
|
|
484
|
+
def current_query_entries
|
485
|
+
uri.query ? uri.query.split('&') : []
|
486
|
+
end
|
487
|
+
|
471
488
|
def establish_content_length
|
472
489
|
header_set 'Content-Length', body.to_s.length
|
473
490
|
end
|
474
491
|
|
492
|
+
def field_matcher(name)
|
493
|
+
Regexp.new "^#{Regexp.escape name}=?.*"
|
494
|
+
end
|
495
|
+
|
475
496
|
def request!(method)
|
476
497
|
request = response ? dup_without_response : self
|
477
498
|
request.instance_variable_set '@request_method', method
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
exit
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
quit
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
all_dir = Pathname.new("#{File.dirname __FILE__}/scenarios")
|
5
|
+
Dir.glob "#{all_dir}/**/*/" do |this_dir|
|
6
|
+
relative_path = Pathname.new(this_dir).relative_path_from(all_dir).to_s
|
7
|
+
context_name = relative_path.split('/').join(' ').gsub('_', ' ')
|
8
|
+
describe context_name do
|
9
|
+
define_method :content do |filename|
|
10
|
+
path = "#{this_dir}/#{filename}"
|
11
|
+
return nil unless File.file?(path)
|
12
|
+
content = File.read(path)
|
13
|
+
return nil if content.empty?
|
14
|
+
content
|
15
|
+
end
|
16
|
+
|
17
|
+
define_method :run_and_capture do |options={}|
|
18
|
+
stdin_filename = "#{this_dir}/stdin"
|
19
|
+
htty_filename = "#{File.dirname __FILE__}/../../bin/htty"
|
20
|
+
stderr_target = options[:combine_stdout_and_stderr] ?
|
21
|
+
'&1' :
|
22
|
+
"#{this_dir}/actual_stderr"
|
23
|
+
arguments = "#{content 'arguments'} 2>#{stderr_target}"
|
24
|
+
stdout_filename = "#{this_dir}/actual_stdout"
|
25
|
+
system "cat #{stdin_filename} | " +
|
26
|
+
"#{htty_filename} #{arguments} > " +
|
27
|
+
"#{this_dir}/actual_stdout"
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should produce the expected stdout' do
|
31
|
+
run_and_capture
|
32
|
+
content('actual_stdout').should == content('expected_stdout')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should produce the expected stderr' do
|
36
|
+
run_and_capture
|
37
|
+
content('actual_stderr').should == content('expected_stderr')
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should produce the expected combined stdout and stderr' do
|
41
|
+
run_and_capture :combine_stdout_and_stderr => true
|
42
|
+
content('actual_stdout_and_stderr').should ==
|
43
|
+
content('expected_stdout_and_stderr')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec'
|
2
|
+
require File.expand_path("#{File.dirname __FILE__}/../../../../../lib/htty/cli")
|
3
|
+
|
4
|
+
describe HTTY::CLI::Commands::QuerySet do
|
5
|
+
before :all do
|
6
|
+
@session = HTTY::Session.new('')
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'with one argument' do
|
10
|
+
it 'should assign a single key' do
|
11
|
+
query_set = create_query_set_and_perform('test')
|
12
|
+
query_set.session.requests.last.uri.query.should == 'test'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'with two arguments' do
|
17
|
+
it 'should assign a key-value pair' do
|
18
|
+
query_set = create_query_set_and_perform('test', 'true')
|
19
|
+
query_set.session.requests.last.uri.query.should == 'test=true'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'with three arguments' do
|
24
|
+
it 'should assign a key-value pair and a valueless key' do
|
25
|
+
query_set = create_query_set_and_perform('test', 'true', 'more')
|
26
|
+
query_set.session.requests.last.uri.query.should == 'test=true&more'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'with four arguments' do
|
31
|
+
it 'should assign two key-value pairs' do
|
32
|
+
query_set = create_query_set_and_perform('test', 'true', 'more', 'false')
|
33
|
+
query_set.session.requests.last.uri.query.should == 'test=true&more=false'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'with duplicate keys' do
|
38
|
+
it 'should replace existing key' do
|
39
|
+
@session.requests.last.uri.query = 'test=true'
|
40
|
+
query_set = create_query_set_and_perform('test', 'false')
|
41
|
+
query_set.session.requests.last.uri.query.should == 'test=false'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should maintain field location' do
|
45
|
+
@session.requests.last.uri.query = 'test=true&more=true'
|
46
|
+
query_set = create_query_set_and_perform('test', 'false')
|
47
|
+
query_set.session.requests.last.uri.query.should == 'test=false&more=true'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should replace multiple instances with one' do
|
51
|
+
@session.requests.last.uri.query = 'test=true&more=true&test=true'
|
52
|
+
query_set = create_query_set_and_perform('test', 'false')
|
53
|
+
query_set.session.requests.last.uri.query.should == 'test=false&more=true'
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should play nice with nested fields' do
|
57
|
+
@session.requests.last.uri.query = 'test[my][]=true'
|
58
|
+
query_set = create_query_set_and_perform('test[my][]', 'false')
|
59
|
+
query_set.session.requests.last.uri.query.should == 'test[my][]=false'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_query_set_and_perform(*arguments)
|
64
|
+
query_set = HTTY::CLI::Commands::QuerySet.new(:session => @session,
|
65
|
+
:arguments => arguments)
|
66
|
+
query_set.perform
|
67
|
+
query_set
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 1.1.
|
8
|
+
- 4
|
9
|
+
version: 1.1.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Nils Jonsson
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-16 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -169,6 +169,16 @@ files:
|
|
169
169
|
- lib/htty/response.rb
|
170
170
|
- lib/htty/session.rb
|
171
171
|
- lib/htty.rb
|
172
|
+
- spec/system/scenarios/exit/actual_stderr
|
173
|
+
- spec/system/scenarios/exit/actual_stdout
|
174
|
+
- spec/system/scenarios/exit/expected_stdout
|
175
|
+
- spec/system/scenarios/exit/stdin
|
176
|
+
- spec/system/scenarios/quit/actual_stderr
|
177
|
+
- spec/system/scenarios/quit/actual_stdout
|
178
|
+
- spec/system/scenarios/quit/expected_stdout
|
179
|
+
- spec/system/scenarios/quit/stdin
|
180
|
+
- spec/system/scenarios_spec.rb
|
181
|
+
- spec/unit/htty/cli/commands/query_set_spec.rb
|
172
182
|
- spec/unit/htty/cli_spec.rb
|
173
183
|
- spec/unit/htty/ordered_hash_spec.rb
|
174
184
|
- spec/unit/htty/request_spec.rb
|