rubyyot-ruminate 0.0.0
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/.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
|