rubyyot-ruminate 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +6 -0
- data/LICENSE +20 -0
- data/README.rdoc +7 -0
- data/Rakefile +68 -0
- data/VERSION +1 -0
- data/features/ruminate.feature +9 -0
- data/features/step_definitions/ruminate_steps.rb +16 -0
- data/features/support/env.rb +13 -0
- data/lib/engine.rb +19 -0
- data/lib/http_service.rb +9 -0
- data/lib/query.rb +9 -0
- data/lib/query_parser.rb +19 -0
- data/lib/ruminate.rb +30 -0
- data/test/engine_test.rb +32 -0
- data/test/fixture_injector.rb +9 -0
- data/test/fixtures/delicious.com +961 -0
- data/test/fixtures/google.com +10 -0
- data/test/http_service_test.rb +10 -0
- data/test/query_parser_test.rb +28 -0
- data/test/ruminate_test.rb +40 -0
- data/test/test_helper.rb +13 -0
- metadata +119 -0
@@ -0,0 +1,10 @@
|
|
1
|
+
<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><script>window.google={kEI:"SDBESrmzCKS88ASQq4SkAQ",kEXPI:"0",kCSIE:"0",kHL:"en"};
|
2
|
+
window.google.sn="webhp";window.google.timers={load:{t:{start:(new Date).getTime()}}};try{window.google.pt=window.gtbExternal&&window.gtbExternal.pageT()||window.external&&window.external.pageT}catch(b){}
|
3
|
+
window.google.jsrt_kill=1;
|
4
|
+
var _gjwl=location;function _gjuc(){var e=_gjwl.href.indexOf("#");if(e>=0){var a=_gjwl.href.substring(e);if(a.indexOf("&q=")>0||a.indexOf("#q=")>=0){a=a.substring(1);if(a.indexOf("#")==-1){for(var c=0;c<a.length;){var d=c;if(a.charAt(d)=="&")++d;var b=a.indexOf("&",d);if(b==-1)b=a.length;var f=a.substring(d,b);if(f.indexOf("fp=")==0){a=a.substring(0,c)+a.substring(b,a.length);b=c}else if(f=="cad=h")return 0;c=b}_gjwl.href="/search?"+a+"&cad=h";return 1}}}return 0}function _gjp(){!(window._gjwl.hash&&
|
5
|
+
window._gjuc())&&setTimeout(_gjp,500)};
|
6
|
+
window._gjp && _gjp();</script><style>td{line-height:.8em;}.gac_c{line-height:normal;}form{margin-bottom:20px;}body,td,a,p,.h{font-family:arial,sans-serif}.h{color:#36c;font-size:20px}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}#gbar{height:22px;padding-left:0px}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}#gbi,#gbs{background:#fff;left:0;position:absolute;top:24px;visibility:hidden;z-index:1000}#gbi{border:1px solid;border-color:#c9d7f1 #36c #36c #a2bae7;z-index:1001}#guser{padding-bottom:7px !important;text-align:right}#gbar,#guser{font-size:13px;padding-top:1px !important}@media all{.gb1,.gb3{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}.gb2{display:block;padding:.2em .5em}a.gb1,a.gb2,a.gb3{color:#00c !important}.gb2,.gb3{text-decoration:none}a.gb2:hover{background:#36c;color:#fff !important}</style><script>google.y={};google.x=function(e,g){google.y[e.id]=[e,g];return false};window.gbar={qs:function(){},tg:function(e){var o={id:'gbar'};for(i in e)o[i]=e[i];google.x(o,function(){gbar.tg(o)})}};</script></head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onload="document.f.q.focus();if(document.images)new Image().src='/images/nav_logo4.png'" topmargin=3 marginheight=3><textarea id=csi style=display:none></textarea><iframe name=wgjf style="display:none"></iframe><div id=gbar><nobr><b class=gb1>Web</b> <a href="http://images.google.com/imghp?hl=en&tab=wi" onclick=gbar.qs(this) class=gb1>Images</a> <a href="http://video.google.com/?hl=en&tab=wv" onclick=gbar.qs(this) class=gb1>Video</a> <a href="http://maps.google.com/maps?hl=en&tab=wl" onclick=gbar.qs(this) class=gb1>Maps</a> <a href="http://news.google.com/nwshp?hl=en&tab=wn" onclick=gbar.qs(this) class=gb1>News</a> <a href="http://www.google.com/prdhp?hl=en&tab=wf" onclick=gbar.qs(this) class=gb1>Shopping</a> <a href="http://mail.google.com/mail/?hl=en&tab=wm" class=gb1>Gmail</a> <a href="http://www.google.com/intl/en/options/" onclick="this.blur();gbar.tg(event);return !1" aria-haspopup=true class=gb3><u>more</u> <small>▼</small></a><div id=gbi><a href="http://groups.google.com/grphp?hl=en&tab=wg" onclick=gbar.qs(this) class=gb2>Groups</a> <a href="http://books.google.com/bkshp?hl=en&tab=wp" onclick=gbar.qs(this) class=gb2>Books</a> <a href="http://scholar.google.com/schhp?hl=en&tab=ws" onclick=gbar.qs(this) class=gb2>Scholar</a> <a href="http://www.google.com/finance?hl=en&tab=we" onclick=gbar.qs(this) class=gb2>Finance</a> <a href="http://blogsearch.google.com/?hl=en&tab=wb" onclick=gbar.qs(this) class=gb2>Blogs</a> <div class=gb2><div class=gbd></div></div><a href="http://www.youtube.com/?hl=en&tab=w1" onclick=gbar.qs(this) class=gb2>YouTube</a> <a href="http://www.google.com/calendar/render?hl=en&tab=wc" class=gb2>Calendar</a> <a href="http://picasaweb.google.com/home?hl=en&tab=wq" onclick=gbar.qs(this) class=gb2>Photos</a> <a href="http://docs.google.com/?hl=en&tab=wo" class=gb2>Documents</a> <a href="http://www.google.com/reader/view/?hl=en&tab=wy" class=gb2>Reader</a> <a href="http://sites.google.com/?hl=en&tab=w3" class=gb2>Sites</a> <div class=gb2><div class=gbd></div></div><a href="http://www.google.com/intl/en/options/" class=gb2>even more »</a> </div></nobr></div><div id=guser width=100%><nobr><a href="/url?sa=p&pref=ig&pval=3&q=http://www.google.com/ig%3Fhl%3Den%26source%3Diglk&usg=AFQjCNFA18XPfgb7dKnXfKz7x7g1GDH1tg">iGoogle</a> | <a href="https://www.google.com/accounts/Login?hl=en&continue=http://www.google.com/">Sign in</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div><center><br clear=all id=lgpd><img alt="Google" height=110 src="/intl/en_ALL/images/logo.gif" width=276 id=logo onload="window.lol&&lol()"><br><br><form action="/search" name=f><table cellpadding=0 cellspacing=0><tr valign=top><td width=25%> </td><td align=center nowrap><input name=hl type=hidden value=en><input type=hidden name=ie value="ISO-8859-1"><input autocomplete="off" maxlength=2048 name=q size=55 title="Google Search" value=""><br><input name=btnG type=submit value="Google Search"><input name=btnI type=submit value="I'm Feeling Lucky"></td><td nowrap width=25% align=left><font size=-2> <a href=/advanced_search?hl=en>Advanced Search</a><br> <a href=/preferences?hl=en>Preferences</a><br> <a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><br><font size=-1><a href="/intl/en/ads/">Advertising Programs</a> - <a href="/services/">Business Solutions</a> - <a href="/intl/en/about.html">About Google</a></font><p><font size=-2>©2009 - <a href="/intl/en/privacy.html">Privacy</a></font></p></center><div id=xjsd></div><div id=xjsi><script>if(google.y)google.y.first=[];if(google.y)google.y.first=[];google.dstr=[];google.rein=[];window.setTimeout(function(){var a=document.createElement("script");a.src="/extern_js/f/CgJlbhICdXMgACswCjggQAgsKzAOOAUsKzAWOAwsKzAXOAMsKzAYOAQsKzAZOAMsKzAlOMmIASwrMCY4BCwrMCc4ACw/EFp4NGWSLgI.js";(document.getElementById("xjsd")||document.body).appendChild(a)},0);
|
7
|
+
;google.y.first.push(function(){google.ac.i(document.f,document.f.q,'','')});google.xjs&&google.j&&google.j.xi&&google.j.xi()</script></div><script>(function(){
|
8
|
+
function a(){google.timers.load.t.ol=(new Date).getTime();google.report&&google.report(google.timers.load,{ei:google.kEI,e:google.kCSIE})}if(window.addEventListener)window.addEventListener("load",a,false);else if(window.attachEvent)window.attachEvent("onload",a);google.timers.load.t.prt=(new Date).getTime();
|
9
|
+
})();
|
10
|
+
</script>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'query'
|
3
|
+
|
4
|
+
class QueryParserTest < Test::Unit::TestCase
|
5
|
+
context 'query parsing' do
|
6
|
+
setup do
|
7
|
+
@parser = Ruminate::QueryParser.new
|
8
|
+
@sample = "Select title from www.example.com"
|
9
|
+
end
|
10
|
+
|
11
|
+
should 'return a query object' do
|
12
|
+
assert_equal Ruminate::Query, @parser.parse(@sample).class
|
13
|
+
end
|
14
|
+
|
15
|
+
should 'populate from clause' do
|
16
|
+
assert_equal "www.example.com", @parser.parse(@sample).from
|
17
|
+
end
|
18
|
+
|
19
|
+
should 'populate different from clause' do
|
20
|
+
assert_equal "www.rubyyot.com", @parser.parse("Select title from www.rubyyot.com").from
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'populate select clause' do
|
24
|
+
assert_equal "title", @parser.parse(@sample).fields[0]
|
25
|
+
assert @parser.parse(@sample).fields.length == 1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RuminateTest < Test::Unit::TestCase
|
4
|
+
context "chewing" do
|
5
|
+
include Ruminate
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@sample_query = "Select foo from www.example.com"
|
9
|
+
end
|
10
|
+
|
11
|
+
should "parse the query with QueryParser" do
|
12
|
+
query_parser = Ruminate::QueryParser.new
|
13
|
+
engine = Ruminate::Engine.new
|
14
|
+
|
15
|
+
engine.expects(:execute).once.returns(nil)
|
16
|
+
query_parser.expects(:parse).once.returns(nil)
|
17
|
+
chew @sample_query, :query_parser => query_parser, :engine => engine
|
18
|
+
end
|
19
|
+
|
20
|
+
should "execute the query with Engine" do
|
21
|
+
engine = Ruminate::Engine.new
|
22
|
+
engine.expects(:execute).once.returns(nil)
|
23
|
+
chew @sample_query, :engine => engine
|
24
|
+
end
|
25
|
+
|
26
|
+
should "return the output from the engine" do
|
27
|
+
engine = Ruminate::Engine.new
|
28
|
+
engine.expects(:execute).once.returns("Willaby")
|
29
|
+
assert_equal "Willaby", chew(@sample_query, :engine => engine)
|
30
|
+
end
|
31
|
+
|
32
|
+
should "be able to inject http_service" do
|
33
|
+
query = "Select title from google.com"
|
34
|
+
http_service = HttpService.new
|
35
|
+
http_service.expects(:get).with("google.com").once.returns(fixture("google.com"))
|
36
|
+
|
37
|
+
result = chew query, :http_service => http_service
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
|
+
require 'ruminate'
|
7
|
+
require 'shoulda'
|
8
|
+
require 'mocha'
|
9
|
+
require 'fixture_injector'
|
10
|
+
|
11
|
+
class Test::Unit::TestCase
|
12
|
+
include FixtureInjector
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rubyyot-ruminate
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jamal Hansen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-06-26 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: hpricot
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: oniguruma
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: mocha
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.9.5
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: thoughtbot-shoulda
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.10.0
|
54
|
+
version:
|
55
|
+
description:
|
56
|
+
email: jamal.hansen@gmail.com
|
57
|
+
executables: []
|
58
|
+
|
59
|
+
extensions: []
|
60
|
+
|
61
|
+
extra_rdoc_files:
|
62
|
+
- LICENSE
|
63
|
+
- README.rdoc
|
64
|
+
files:
|
65
|
+
- .document
|
66
|
+
- .gitignore
|
67
|
+
- LICENSE
|
68
|
+
- README.rdoc
|
69
|
+
- Rakefile
|
70
|
+
- VERSION
|
71
|
+
- features/ruminate.feature
|
72
|
+
- features/step_definitions/ruminate_steps.rb
|
73
|
+
- features/support/env.rb
|
74
|
+
- lib/engine.rb
|
75
|
+
- lib/http_service.rb
|
76
|
+
- lib/query.rb
|
77
|
+
- lib/query_parser.rb
|
78
|
+
- lib/ruminate.rb
|
79
|
+
- test/engine_test.rb
|
80
|
+
- test/fixture_injector.rb
|
81
|
+
- test/fixtures/delicious.com
|
82
|
+
- test/fixtures/google.com
|
83
|
+
- test/http_service_test.rb
|
84
|
+
- test/query_parser_test.rb
|
85
|
+
- test/ruminate_test.rb
|
86
|
+
- test/test_helper.rb
|
87
|
+
has_rdoc: true
|
88
|
+
homepage: http://github.com/rubyyot/ruminate
|
89
|
+
post_install_message:
|
90
|
+
rdoc_options:
|
91
|
+
- --charset=UTF-8
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: "0"
|
99
|
+
version:
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: "0"
|
105
|
+
version:
|
106
|
+
requirements: []
|
107
|
+
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 1.2.0
|
110
|
+
signing_key:
|
111
|
+
specification_version: 2
|
112
|
+
summary: Extracts statistics from html documents
|
113
|
+
test_files:
|
114
|
+
- test/engine_test.rb
|
115
|
+
- test/test_helper.rb
|
116
|
+
- test/http_service_test.rb
|
117
|
+
- test/fixture_injector.rb
|
118
|
+
- test/ruminate_test.rb
|
119
|
+
- test/query_parser_test.rb
|