ruby-query 0.1.0 → 0.1.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/README.md +14 -25
- data/lib/ruby_query.rb +25 -9
- data/spec/rquery/rquery_spec.rb +6 -0
- metadata +3 -3
data/README.md
CHANGED
@@ -14,70 +14,59 @@
|
|
14
14
|
Extract an attribute from a webpage:
|
15
15
|
|
16
16
|
require 'open-uri'
|
17
|
-
require '
|
17
|
+
require 'ruby_query'
|
18
18
|
|
19
|
-
|
19
|
+
RubyQuery::Query.query(open("http://twitter.com"), "a#logo img", "attr", "alt")
|
20
20
|
=> "Twitter"
|
21
21
|
|
22
22
|
Extract a form input value :
|
23
23
|
|
24
|
-
require '
|
24
|
+
require 'ruby_query'
|
25
25
|
|
26
|
-
|
26
|
+
RubyQuery::Query.query('<input type="text" value="tj@vision-media.ca"/>', "input", "val")
|
27
27
|
=> "tj@vision-media.ca"
|
28
28
|
|
29
29
|
## Command Line Examples
|
30
30
|
|
31
31
|
Twitter logo alt text:
|
32
32
|
|
33
|
-
$ curl http://twitter.com |
|
33
|
+
$ curl http://twitter.com | rquery 'a#logo img' attr alt
|
34
34
|
Twitter
|
35
35
|
|
36
36
|
Alternately, since the output is simply more html, we can achieve this same result via pipes:
|
37
37
|
|
38
|
-
$ curl http://twitter.com |
|
38
|
+
$ curl http://twitter.com | rquery 'a#logo' | rquery img attr alt
|
39
39
|
Twitter
|
40
40
|
|
41
41
|
Check if a class is present:
|
42
42
|
|
43
|
-
$ curl http://twitter.com |
|
43
|
+
$ curl http://twitter.com | rquery '.article #timeline' hasClass statuses
|
44
44
|
true
|
45
|
-
|
46
|
-
$ echo $?
|
47
|
-
0
|
48
|
-
|
49
|
-
Exit status for bools:
|
50
|
-
|
51
|
-
$ echo '<div class="foo bar"></div>' | ./index.js div hasClass baz
|
52
|
-
false
|
53
|
-
|
54
|
-
$ echo $?
|
55
|
-
1
|
56
45
|
|
57
46
|
Grab width or height attributes:
|
58
47
|
|
59
|
-
$ echo '<div class="user" width="300"></div>' |
|
48
|
+
$ echo '<div class="user" width="300"></div>' | rquery div.user width
|
60
49
|
300
|
61
50
|
|
62
51
|
Output element text:
|
63
52
|
|
64
|
-
$ echo '<p>very <em>slick</em></p>' |
|
53
|
+
$ echo '<p>very <em>slick</em></p>' | rquery p text
|
65
54
|
very slick
|
66
55
|
|
67
56
|
Values:
|
68
57
|
|
69
|
-
$ echo '<input type="text" value="tj@vision-media.ca"/>' |
|
58
|
+
$ echo '<input type="text" value="tj@vision-media.ca"/>' | rquery input val
|
70
59
|
tj@vision-media.ca
|
71
60
|
|
72
61
|
Get second li's text:
|
73
62
|
|
74
|
-
$ echo
|
75
|
-
|
63
|
+
$ echo '<ul><li>Apple</li><li>Orange</li><li>Cat</li></ul>' | rquery ul li get 1 text
|
64
|
+
Orange
|
76
65
|
|
77
66
|
Get third li's text using `next`:
|
78
67
|
|
79
|
-
$ echo
|
80
|
-
|
68
|
+
$ echo '<ul><li>Apple</li><li>Orange</li><li>Cat</li></ul>' | rquery ul li get 1 next text
|
69
|
+
Cat
|
81
70
|
|
82
71
|
Get length:
|
83
72
|
|
data/lib/ruby_query.rb
CHANGED
@@ -35,7 +35,12 @@ module RubyQuery
|
|
35
35
|
:next_sibling => {:type => 'traverse'},
|
36
36
|
:previous_sibling => {:type => 'traverse'},
|
37
37
|
:at => {:type => 'traverse', :arity => 1},
|
38
|
-
|
38
|
+
|
39
|
+
:search => {:type => 'proc',
|
40
|
+
:proc => Proc.new {|context, param, query|
|
41
|
+
context.css(param)
|
42
|
+
}
|
43
|
+
},
|
39
44
|
:attr => {:type => 'proc',
|
40
45
|
:arity => 1,
|
41
46
|
:proc => Proc.new {|context, param, query|
|
@@ -58,21 +63,32 @@ module RubyQuery
|
|
58
63
|
|
59
64
|
ALIAS = {
|
60
65
|
:html => :to_html,
|
61
|
-
:len => :
|
66
|
+
:len => :size,
|
67
|
+
:length => :size,
|
62
68
|
:count => :size,
|
63
69
|
:get => :at,
|
64
70
|
:"has-class" => :hasClass,
|
65
|
-
:val => :value
|
71
|
+
:val => :value,
|
72
|
+
:next => :next_sibling,
|
73
|
+
:previous => :previous_sibling
|
66
74
|
}
|
67
75
|
|
68
76
|
def self.query(html, *query)
|
69
|
-
|
70
|
-
ctx = doc.search(query.shift)
|
77
|
+
ctx = Nokogiri::HTML(html)
|
71
78
|
|
72
79
|
while method = query.shift
|
73
|
-
|
74
|
-
|
75
|
-
|
80
|
+
if COMMANDS.keys.include?(method.to_sym) || ALIAS.keys.include?(method.to_sym)
|
81
|
+
command = COMMANDS[method.to_sym] || COMMANDS[ALIAS[method.to_sym]]
|
82
|
+
param = query.length > 0 ? (command[:arity] ? query.shift : nil) : nil
|
83
|
+
ctx = handle_command(ctx, ALIAS[method.to_sym] || method.to_sym, command[:type], param, query)
|
84
|
+
|
85
|
+
elsif
|
86
|
+
command = COMMANDS[:search]
|
87
|
+
ctx = handle_command(ctx, :search, command[:type], method, query)
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
ctx
|
76
92
|
end
|
77
93
|
|
78
94
|
if ctx.is_a?(Nokogiri::XML::Element) || ctx.is_a?(Nokogiri::XML::NodeSet)
|
@@ -116,7 +132,7 @@ module RubyQuery
|
|
116
132
|
end
|
117
133
|
context[param.to_i]
|
118
134
|
else
|
119
|
-
if context.is_a?(Nokogiri::XML::Element) || context.is_a?(Nokogiri::XML::NodeSet)
|
135
|
+
if context.is_a?(Nokogiri::XML::Element) || context.is_a?(Nokogiri::XML::NodeSet) || context.is_a?(Nokogiri::HTML::Document)
|
120
136
|
if param
|
121
137
|
context.send(name, param)
|
122
138
|
else
|
data/spec/rquery/rquery_spec.rb
CHANGED
@@ -44,11 +44,13 @@ describe RubyQuery do
|
|
44
44
|
|
45
45
|
it "get second li's text" do
|
46
46
|
RubyQuery::Query.query(HTML_LIST, "ul li", "get", "1", "text").should == "Orange"
|
47
|
+
RubyQuery::Query.query(HTML_LIST, "ul", "li", "get", "1", "text").should == "Orange"
|
47
48
|
RubyQuery::Query.query(HTML_LIST, "ul li", "get", "10", "text").should be_nil
|
48
49
|
end
|
49
50
|
|
50
51
|
it "get third li's text using next" do
|
51
52
|
RubyQuery::Query.query(HTML_LIST, "ul li", "get", "1", "next", "text").should == "Cat"
|
53
|
+
RubyQuery::Query.query(HTML_LIST, "ul", "li", "get", "1", "next", "text").should == "Cat"
|
52
54
|
end
|
53
55
|
|
54
56
|
it "get length" do
|
@@ -62,4 +64,8 @@ describe RubyQuery do
|
|
62
64
|
RubyQuery::Query.query(HTML_LIST, "li", "html").should == "<li>Apple</li>\n<li>Orange</li>\n<li>Cat</li>"
|
63
65
|
end
|
64
66
|
|
67
|
+
it "should return empty for strange query" do
|
68
|
+
RubyQuery::Query.query(HTML_LIST, "liaa").should be_empty
|
69
|
+
RubyQuery::Query.query(HTML_LIST, "lixaa", "len").should 0
|
70
|
+
end
|
65
71
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Francis Chong
|