cudan 0.0.1

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/CHANGES ADDED
@@ -0,0 +1,3 @@
1
+ = 0.0.1
2
+ * 2011/01/12
3
+ * create
data/README ADDED
@@ -0,0 +1 @@
1
+ simple functional test tool.
data/bin/cudan ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'cudan'
5
+ rescue LoadError
6
+ require 'rubygems'
7
+ require 'cudan'
8
+ end
9
+ Cudan::Main::new::main
@@ -0,0 +1,79 @@
1
+ require 'net/http'
2
+ module Cudan
3
+ GET="GET"
4
+ POST="POST"
5
+ PUT="PUT"
6
+ DELETE="DELETE"
7
+ class BaseCudan
8
+ def initialize
9
+ @headers = {}
10
+ @showbody = false
11
+ end
12
+ attr_accessor :showbody
13
+ def set_header key, value
14
+ @headers[key] = value
15
+ end
16
+ def fetch url, method=GET, body=nil
17
+ host, port, path = Util::parse_url(url)
18
+ @post_string = body
19
+ if method == GET
20
+ req = Net::HTTP::Get::new(path, @headers)
21
+ elsif method == POST
22
+ req = Net::HTTP::Post::new(path, @headers)
23
+ end
24
+ response = nil
25
+ Net::HTTP.start(host, port) do |http|
26
+ @starttime = Time::now
27
+ response = http.request(req, @post_string)
28
+ @response_time = Time::now - @starttime
29
+ end
30
+ if response
31
+ @response = response.body.to_s
32
+ else
33
+ @response = ''
34
+ end
35
+ if @showbody
36
+ Logger.log(@response, 2)
37
+ end
38
+ end
39
+ def execute query, expect, url, method=GET, body=nil
40
+ fetch(url, method, body)
41
+ @query_result = do_query(query)
42
+ r = do_expect(expect)
43
+ unless r
44
+ do_message
45
+ exit 1
46
+ else
47
+ end
48
+ end
49
+ def do_message
50
+ Logger.log 'failure:'
51
+ Logger.log @query_result.gsub(/^(.*)$/){|r| "\t" + r}
52
+ end
53
+ def do_query query
54
+ @response.include? query ? query : ''
55
+ end
56
+ def do_expect expect
57
+ @query_result.include? expect
58
+ end
59
+ end
60
+ class Util
61
+ def self::parse_url url
62
+ hostpath = url.slice(url.index('://')+3, url.size)
63
+ if pathstart = hostpath.index('/')
64
+ host = hostpath.slice(0, pathstart)
65
+ path = hostpath.slice(pathstart, hostpath.size)
66
+ else
67
+ host = hostpath
68
+ path = '/'
69
+ end
70
+ if portstart = host.index(':')
71
+ host, port = host.split(':')
72
+ port = port.to_i
73
+ else
74
+ port = 80
75
+ end
76
+ [host, port, path]
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,11 @@
1
+ class Cudan::Logger
2
+ @@level = 7
3
+ def self::setlevel level
4
+ @@level = level
5
+ end
6
+ def self::log(message, level=7)
7
+ if level <= @@level
8
+ puts message
9
+ end
10
+ end
11
+ end
data/lib/cudan/main.rb ADDED
@@ -0,0 +1,40 @@
1
+ class Cudan::Main
2
+ require 'optparse'
3
+ def main
4
+ opts = OptionParser.new("Usage: #{File::basename($0)} [OPTIONS] URL")
5
+ opts.on("-v", "--version", "show version") do
6
+ puts "%s %s" %[File.basename($0), Cudan::VERSION]
7
+ puts "ruby %s" % RUBY_VERSION
8
+ exit
9
+ end
10
+ opts.on('-q QUERY', '--query QUERY', 'query') do |q|
11
+ @query = q
12
+ end
13
+ opts.on('-e EXPECT_STRING', '--expects EXPECT_STRING', 'expect string') do |ex|
14
+ @expects = ex
15
+ end
16
+ opts.on('-u USER_AGENT', '--user-agent USER_AGENT', 'set user agent') do |ua|
17
+ @ua = ua
18
+ end
19
+ opts.on('--show-body', 'show body') do |b|
20
+ @showbody = b
21
+ end
22
+ opts.version = Cudan::VERSION
23
+ opts.parse!(ARGV)
24
+ @url = ARGV[0]
25
+ unless @url
26
+ puts opts.to_s
27
+ exit
28
+ end
29
+ if /\/(.*)\// =~ @query
30
+ klass = Cudan::RegexpCudan
31
+ @query = $~[1]
32
+ else
33
+ klass = Cudan::XpathCudan
34
+ end
35
+ instance = klass::new
36
+ instance.set_header('UserAgent', @ua) if @ua
37
+ instance.showbody = @showbody
38
+ instance.execute(@query, @expects, @url)
39
+ end
40
+ end
@@ -0,0 +1,19 @@
1
+ module Cudan
2
+ class RegexpCudan < BaseCudan
3
+ def do_query query
4
+ regexp = Regexp::new(query)
5
+ @matched = regexp.match(@response)
6
+ if @matched
7
+ @matched[0]
8
+ else
9
+ ''
10
+ end
11
+ end
12
+ def do_expect expect
13
+ nexpect = expect.gsub(/\\\d/){|m|
14
+ @matched[m.to_i].to_s
15
+ }
16
+ @query_result.include? nexpect
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module Cudan
2
+ class XpathCudan < BaseCudan
3
+ require 'nokogiri'
4
+ def do_query query
5
+ @doc = Nokogiri::HTML(@response)
6
+ @result = @doc.search(query)
7
+ @result = @result[0]
8
+ if @result.is_a? Nokogiri::XML::Text
9
+ return @result.content.to_s
10
+ elsif @result
11
+ return @result.inner_html.to_s
12
+ else
13
+ return ''
14
+ end
15
+ end
16
+ def do_expect expect
17
+ @query_result.include? expect
18
+ end
19
+ end
20
+ end
data/lib/cudan.rb ADDED
@@ -0,0 +1,8 @@
1
+ module Cudan
2
+ require 'cudan/logger'
3
+ require 'cudan/base_cudan'
4
+ require 'cudan/regexp_cudan'
5
+ require 'cudan/xpath_cudan'
6
+ require 'cudan/main'
7
+ VERSION="0.0.1"
8
+ end
data/test/cudanspec.rb ADDED
@@ -0,0 +1,59 @@
1
+ require 'rubygems'
2
+ require 'ww'
3
+ require 'lib/cudan'
4
+ require File::dirname(__FILE__) + '/wwutil'
5
+
6
+
7
+ port = 3080 + rand(10)
8
+ baseurl = "http://localhost:#{port}"
9
+ html = <<EOS
10
+ <html>
11
+ <body>
12
+ <p class='hoge'>abcdefg</p>
13
+ </body>
14
+ </html>
15
+ EOS
16
+ ##
17
+ WW::Server[:server] ||= WW::Server::build_double(port) do
18
+ spy.get('/regexp'){
19
+ body = html
20
+ }
21
+ spy.get('/xpath'){
22
+ body = html
23
+ }
24
+ end
25
+ WW::Server.start_once
26
+ RSpec.configure {|c| c.mock_with :mocha}
27
+
28
+ describe Cudan::RegexpCudan, 'request for localhost' do
29
+ before(:each) do
30
+ Cudan::Logger::stubs(:log).returns nil
31
+ end
32
+ it 'should raise no error with regexp' do
33
+ url = baseurl + '/regexp'
34
+ o = Cudan::RegexpCudan::new
35
+ expect{
36
+ o.execute('<p class=\'hoge\'>(.*)</p>', 'abcdefg', url)
37
+ }.to_not raise_error(nil)
38
+ end
39
+ end
40
+ describe Cudan::XpathCudan, 'request for localhost' do
41
+ before(:each) do
42
+ Cudan::Logger::stubs(:log).returns nil
43
+ end
44
+ it 'should raise no error with xpath' do
45
+ url = baseurl + '/xpath'
46
+ o = Cudan::XpathCudan::new
47
+ expect{
48
+ o.execute('//p[@class="hoge"]/text()', 'abcdefg', url)
49
+ }.to_not raise_error(nil)
50
+ expect{
51
+ o.execute('//p[@class="hoge"]', 'abcdefg', url)
52
+ }.to_not raise_error(nil)
53
+ end
54
+ it 'should raise error with xpath' do
55
+ url = baseurl + '/xpath'
56
+ o = Cudan::XpathCudan::new
57
+ expect{ o.execute('//p[@class="fuga"]', 'hoge', url) }.to raise_error(SystemExit)
58
+ end
59
+ end
data/test/wwutil.rb ADDED
@@ -0,0 +1,69 @@
1
+ require 'rubygems'
2
+ require 'ww'
3
+
4
+ class Requests < Array
5
+ def self::from_a(ar)
6
+ is = self.new
7
+ ar.each do |i|
8
+ is << i
9
+ end
10
+ is
11
+ end
12
+ def filter &pred
13
+ Requests::from_a(find_all(&pred))
14
+ end
15
+ def params p
16
+ filter do |rq|
17
+ p.any?{|k,v| rq.params[k] == v}
18
+ end
19
+ end
20
+ def request_method method
21
+ filter {|rq|
22
+ rq.request_method == method
23
+ }
24
+ end
25
+ def filter_opt p
26
+ filter do |rq|
27
+ p.any?{|k,v| rq[k] == v}
28
+ end
29
+ end
30
+ end
31
+ class Ww::Server
32
+ def compile(path)
33
+ keys = []
34
+ if path.respond_to? :to_str
35
+ special_chars = %w{. + ( )}
36
+ pattern =
37
+ path.to_str.gsub(/((:\w+)|[\*#{special_chars.join}])/) do |match|
38
+ case match
39
+ when "*"
40
+ keys << 'splat'
41
+ "(.*?)"
42
+ when *special_chars
43
+ Regexp.escape(match)
44
+ else
45
+ keys << $2[1..-1]
46
+ "([^/?&#]+)"
47
+ end
48
+ end
49
+ [/^#{pattern}$/, keys]
50
+ elsif path.respond_to?(:keys) && path.respond_to?(:match)
51
+ [path, path.keys]
52
+ elsif path.respond_to? :match
53
+ [path, keys]
54
+ else
55
+ raise TypeError, path
56
+ end
57
+ end
58
+ def filter &pred
59
+ Requests::from_a(requests).reverse.filter &pred
60
+ end
61
+ def path path, opt=nil
62
+ reg,p = compile(path)
63
+ r = filter do |rq|
64
+ rq.path =~ reg
65
+ end
66
+ r = r.params(opt) if opt
67
+ r
68
+ end
69
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cudan
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - takada-at
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-01-13 00:00:00 +09:00
18
+ default_executable: cudan
19
+ dependencies: []
20
+
21
+ description: |
22
+ simple functinal test tool
23
+
24
+ email: nightly at at-akada dot org
25
+ executables:
26
+ - cudan
27
+ extensions: []
28
+
29
+ extra_rdoc_files: []
30
+
31
+ files:
32
+ - lib/cudan/xpath_cudan.rb
33
+ - lib/cudan/logger.rb
34
+ - lib/cudan/base_cudan.rb
35
+ - lib/cudan/regexp_cudan.rb
36
+ - lib/cudan/main.rb
37
+ - lib/cudan.rb
38
+ - bin/cudan
39
+ - test/cudanspec.rb
40
+ - test/wwutil.rb
41
+ - README
42
+ - CHANGES
43
+ has_rdoc: true
44
+ homepage: http://github.com/takada-at/cudan
45
+ licenses: []
46
+
47
+ post_install_message:
48
+ rdoc_options: []
49
+
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 1
58
+ - 8
59
+ - 6
60
+ version: 1.8.6
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ requirements: []
69
+
70
+ rubyforge_project: ""
71
+ rubygems_version: 1.3.6
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: functional test tool
75
+ test_files: []
76
+