scrappy 0.1.18 → 0.1.19

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.1.19 2011-02-24
2
+
3
+ * Using Sinatra (in production mode) instead of Camping
4
+
1
5
  === 0.1.18 2011-02-18
2
6
 
3
7
  * Retry support when opening URLs
data/Manifest CHANGED
@@ -27,6 +27,7 @@ lib/scrappy/selectors/xpath.rb
27
27
  lib/scrappy/server.rb
28
28
  lib/scrappy/shell.rb
29
29
  lib/scrappy/support.rb
30
+ lib/scrappy/views/home.haml
30
31
  lib/scrappy/webkit/webkit.rb
31
32
  test/test_helper.rb
32
33
  test/test_scrappy.rb
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ Echoe.new('scrappy', Scrappy::VERSION) do |p|
11
11
  p.email = "joseignacio.fernandez@gmail.com"
12
12
  p.install_message = '**(Optional) Remember to install rbwebkitgtk for visual parsing features**'
13
13
  p.ignore_pattern = ["pkg/*"]
14
- p.dependencies = [['activesupport','>= 2.3.5'], ['markaby', '>= 0.7.1'], ['camping', '= 2.0'], ['nokogiri', '>= 1.4.1'], ['mechanize','>= 1.0.0'], ['lightrdf','>= 0.1.9'], ['mongrel', '>= 1.1.5'], ['i18n', '>= 0.4.2']]
14
+ p.dependencies = [['activesupport','>= 2.3.5'], ['sinatra', '>= 1.1.2'], ['thin', '>= 1.2.7'], ['nokogiri', '>= 1.4.1'], ['mechanize','>= 1.0.0'], ['lightrdf','>= 0.1.9'], ['i18n', '>= 0.4.2']]
15
15
  end
16
16
 
17
17
  Rake::RDocTask.new(:rdoc) do |rdoc|
data/bin/scrappy CHANGED
@@ -11,14 +11,8 @@ module Scrappy
11
11
 
12
12
  require 'rubygems'
13
13
  require 'optparse'
14
- require 'logger'
15
- require 'readline'
16
- gem 'camping', '=2.0'
17
- require 'camping'
18
- require 'camping/server'
19
14
  require "#{Root}/lib/scrappy"
20
- require 'scrappy/shell'
21
-
15
+
22
16
  SESSION_TOKEN = rand(100000000)
23
17
  Options = OpenStruct.new
24
18
 
@@ -64,14 +58,20 @@ module Scrappy
64
58
  puts Agent.create.proxy(:http_method=>:get, :uri=>Options.url).output
65
59
  elsif Options.proxy
66
60
  puts "Launching Scrappy Web Proxy..."
67
- Camping::Server.new(OpenStruct.new(:host => 'localhost', :port => Options.port, :server=>'mongrel'), ["#{Scrappy::Root}/lib/scrappy/proxy.rb"]).start
61
+ require 'scrappy/proxy'
62
+ Thin::Logging.silent = true
63
+ Scrappy::Proxy.run! :host => 'localhost', :port => Options.port, :environment=>:production
68
64
  elsif Options.server
69
65
  puts "Launching Scrappy Web Server..."
70
- Camping::Server.new(OpenStruct.new(:host => 'localhost', :port => Options.port, :server=>'mongrel'), ["#{Scrappy::Root}/lib/scrappy/server.rb"]).start
66
+ require 'scrappy/server'
67
+ Thin::Logging.silent = true
68
+ Scrappy::Server.run! :host => 'localhost', :port => Options.port, :environment=>:production
71
69
  elsif Options.shell
72
70
  puts "Launching Scrappy Shell..."
71
+ require 'scrappy/shell'
73
72
  Shell.new.run
74
73
  else
74
+ require 'scrappy/shell'
75
75
  Options.quiet = true
76
76
  Shell.new(@file).run
77
77
  end
data/lib/scrappy.rb CHANGED
@@ -21,7 +21,7 @@ require 'scrappy/agent/agent'
21
21
  Namespace :sc, 'http://lab.gsi.dit.upm.es/scraping.rdf#'
22
22
 
23
23
  module Scrappy
24
- VERSION = '0.1.18'
24
+ VERSION = '0.1.19'
25
25
  end
26
26
 
27
27
  # Require selectors
data/lib/scrappy/proxy.rb CHANGED
@@ -1,41 +1,34 @@
1
- require 'camping'
2
- require 'camping/session'
3
- require 'open3'
4
-
5
- Camping.goes :Scrappy
1
+ require 'sinatra'
2
+ require 'thin'
6
3
 
7
4
  module Scrappy
8
- module Controllers
9
- class Index < R '.*'
10
- include InputEscaping
11
-
12
- def get
13
- process_request :get
14
- end
5
+ class Proxy < Sinatra::Base
6
+ get '*' do
7
+ process_request :get
8
+ end
15
9
 
16
- def post
17
- process_request :post
18
- end
10
+ post '*' do
11
+ process_request :post
12
+ end
19
13
 
20
- protected
21
- def process_request method
22
- response = agent.proxy :method=>method, :uri=>request.env["REQUEST_URI"], :inputs=>@input
14
+ protected
15
+ def process_request method
16
+ response = agent.proxy :method=>method, :uri=>request.env['REQUEST_URI'], :inputs=>params
23
17
 
24
- case response.status
25
- when :redirect
26
- redirect response.uri
27
- when :ok
28
- @headers['Content-Type'] = response.content_type
29
- response.output
30
- else
31
- @status = 500
32
- 'Error'
33
- end
18
+ case response.status
19
+ when :redirect
20
+ redirect response.uri
21
+ when :ok
22
+ headers 'Content-Type' => response.content_type
23
+ response.output
24
+ else
25
+ status 500
26
+ "Internal error"
34
27
  end
28
+ end
35
29
 
36
- def agent
37
- Scrappy::Agent[@request.env["REMOTE_ADDR"]]
38
- end
30
+ def agent
31
+ Scrappy::Agent[request.ip]
39
32
  end
40
33
  end
41
34
  end
@@ -1,76 +1,55 @@
1
- require 'camping'
2
- require 'camping/session'
3
- require 'open3'
4
-
5
- Camping.goes :Scrappy
1
+ require 'sinatra'
2
+ require 'thin'
3
+ require 'haml'
6
4
 
7
5
  module Scrappy
8
- include Camping::Session
9
- secret '1a36591bceec49c832079e270d7e8b73'
6
+ class Server < Sinatra::Base
7
+ enable :sessions
8
+ set :views, File.dirname(__FILE__) + '/views'
10
9
 
11
- module Controllers
12
- class Index
13
- def get
14
- mab do
15
- html do
16
- head {}
17
- body do
18
- h1 "Scrappy Web Server"
19
- p "Use following URL format: http://[host]/[format]/[url]"
20
- p do
21
- "For example: " + a("http://localhost:3434/rdfxml/http://www.google.com",
22
- :href=>"http://localhost:3434/rdfxml/http://www.google.com")
23
- end
24
- p do
25
- "Remember to escape parameters: " +
26
- "http://www.example.com/~user/%3Ftest%3D1%26test1%3D2<br/> or<br/> " +
27
- "http%3A%2F%2Fwww.example.com%2F~user%2F%3Ftest%3D1%26test1%3D2<br/>" +
28
- "instead of<br/> http://www.example.com/~user/?test=1&test1=2"
29
- end
30
- p do
31
- "Available formats are png, yarf, rdfxml, ntriples, turtle, json, jsonrdf, ejson"
32
- end
33
- end
34
- end
35
- end
36
- end
10
+ get '/' do
11
+ haml :home
37
12
  end
38
13
 
39
- class Extract < R '/(\w+)/(.+)'
40
- include InputEscaping
14
+ get '/:format/*' do
15
+ process_request :get, params[:format], params[:splat] * "/", params[:callback]
16
+ end
41
17
 
42
- def get format, url
43
- process_request :get, format, url
44
- end
18
+ post '/:format/*' do
19
+ process_request :post, params[:format], params[:splat] * "/", params[:callback]
20
+ end
45
21
 
46
- def post format, url
47
- process_request :post, format, url
22
+ protected
23
+ def process_request method, format, url, callback
24
+ response = agent.proxy :method=>method, :uri=>url, :inputs=>inputs, :format=>format.to_sym
25
+ case response.status
26
+ when :redirect
27
+ redirect "/#{format}/#{CGI::escape(response.uri).gsub('%2F','/').gsub('%3A',':')}#{textual_inputs}"
28
+ when :ok
29
+ headers 'Content-Type' => response.content_type
30
+ callback ? "#{callback}(#{response.output})" : response.output
31
+ else
32
+ status 500
33
+ "Internal error"
48
34
  end
35
+ end
49
36
 
50
- protected
51
- def process_request method, format, url
52
- callback = @input['callback']
53
- response = agent.proxy :method=>method, :uri=>url, :inputs=>@input.reject{|k,v| k=='callback'}, :format=>format.to_sym
54
- case response.status
55
- when :redirect
56
- redirect "/#{format}/#{CGI::escape(response.uri).gsub('%2F','/').gsub('%3A',':')}#{inputs}"
57
- when :ok
58
- @headers['Content-Type'] = response.content_type
59
- callback ? "#{callback}(#{response.output})" : response.output
60
- else
61
- @status = 500
62
- 'Error'
63
- end
37
+ def agent
38
+ return @agent if @agent
39
+ if session[:agent].nil? || session[:token] != SESSION_TOKEN
40
+ session[:token] = SESSION_TOKEN
41
+ session[:agent] = Scrappy::Agent.create.id
64
42
  end
43
+ @agent = Scrappy::Agent[session[:agent]]
44
+ end
65
45
 
66
- def agent
67
- return @agent if @agent
68
- if @state[:agent].nil? || @state[:token] != SESSION_TOKEN
69
- @state[:token] = SESSION_TOKEN
70
- @state[:agent] = Scrappy::Agent.create.id
71
- end
72
- @agent = Scrappy::Agent[@state[:agent]]
73
- end
46
+ def inputs
47
+ params.reject{|k,v| ['callback', 'splat', 'format']}
48
+ end
49
+
50
+ def textual_inputs
51
+ return '' if inputs.empty?
52
+ "?" + (inputs.map{|k,v| "#{CGI.escape(k)}=#{CGI.escape(v)}"}*'')
74
53
  end
75
54
  end
76
- end
55
+ end
data/lib/scrappy/shell.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'readline'
2
+
1
3
  module Scrappy
2
4
  class Shell
3
5
  def initialize file=nil
@@ -8,15 +8,6 @@ module URI
8
8
  end
9
9
  end
10
10
 
11
- module Scrappy
12
- module InputEscaping
13
- def inputs
14
- return '' if @input.empty?
15
- "?" + (@input.map{|k,v| "#{CGI.escape(k)}=#{CGI.escape(v)}"}*'')
16
- end
17
- end
18
- end
19
-
20
11
  module Nokogiri
21
12
  module XML
22
13
  class NodeSet
@@ -31,4 +22,4 @@ class String
31
22
  def wikify
32
23
  gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase }.gsub(/\s/, '')
33
24
  end
34
- end
25
+ end
@@ -0,0 +1,23 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title Scrappy Web Server
5
+ %body
6
+ %h1 Scrappy Web Server
7
+ %p Use following URL format: http://[host]/[format]/[url]
8
+ %p
9
+ For example:
10
+ %a{:href=>"http://localhost:3434/rdfxml/http://www.google.com"}
11
+ http://localhost:3434/rdfxml/http://www.google.com
12
+
13
+ Remember to escape parameters: http://www.example.com/~user/%3Ftest%3D1%26test1%3D2
14
+ %br
15
+ or
16
+ %br
17
+ http%3A%2F%2Fwww.example.com%2F~user%2F%3Ftest%3D1%26test1%3D2
18
+ %br
19
+ instead of
20
+ %br
21
+ http://www.example.com/~user/?test=1&test1=2"
22
+
23
+ %p Available formats are png, yarf, rdfxml, ntriples, turtle, json, jsonrdf, ejson
data/scrappy.gemspec CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{scrappy}
5
- s.version = "0.1.18"
5
+ s.version = "0.1.19"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Jose Ignacio"]
9
- s.date = %q{2011-02-18}
9
+ s.date = %q{2011-02-24}
10
10
  s.default_executable = %q{scrappy}
11
11
  s.description = %q{RDF web scraper}
12
12
  s.email = %q{joseignacio.fernandez@gmail.com}
13
13
  s.executables = ["scrappy"]
14
- s.extra_rdoc_files = ["README.rdoc", "bin/scrappy", "lib/js/annotator.js", "lib/scrappy.rb", "lib/scrappy/agent/agent.rb", "lib/scrappy/agent/blind_agent.rb", "lib/scrappy/agent/cache.rb", "lib/scrappy/agent/dumper.rb", "lib/scrappy/agent/formats.rb", "lib/scrappy/agent/map_reduce.rb", "lib/scrappy/agent/extractor.rb", "lib/scrappy/agent/visual_agent.rb", "lib/scrappy/proxy.rb", "lib/scrappy/selectors/base_uri.rb", "lib/scrappy/selectors/css.rb", "lib/scrappy/selectors/new_uri.rb", "lib/scrappy/selectors/root.rb", "lib/scrappy/selectors/section.rb", "lib/scrappy/selectors/slice.rb", "lib/scrappy/selectors/uri.rb", "lib/scrappy/selectors/uri_pattern.rb", "lib/scrappy/selectors/xpath.rb", "lib/scrappy/server.rb", "lib/scrappy/shell.rb", "lib/scrappy/support.rb", "lib/scrappy/webkit/webkit.rb"]
15
- s.files = ["History.txt", "Manifest", "README.rdoc", "Rakefile", "bin/scrappy", "kb/elmundo.yarf", "lib/js/annotator.js", "lib/scrappy.rb", "lib/scrappy/agent/agent.rb", "lib/scrappy/agent/blind_agent.rb", "lib/scrappy/agent/cache.rb", "lib/scrappy/agent/dumper.rb", "lib/scrappy/agent/formats.rb", "lib/scrappy/agent/map_reduce.rb", "lib/scrappy/agent/extractor.rb", "lib/scrappy/agent/visual_agent.rb", "lib/scrappy/proxy.rb", "lib/scrappy/selectors/base_uri.rb", "lib/scrappy/selectors/css.rb", "lib/scrappy/selectors/new_uri.rb", "lib/scrappy/selectors/root.rb", "lib/scrappy/selectors/section.rb", "lib/scrappy/selectors/slice.rb", "lib/scrappy/selectors/uri.rb", "lib/scrappy/selectors/uri_pattern.rb", "lib/scrappy/selectors/xpath.rb", "lib/scrappy/server.rb", "lib/scrappy/shell.rb", "lib/scrappy/support.rb", "lib/scrappy/webkit/webkit.rb", "test/test_helper.rb", "test/test_scrappy.rb", "scrappy.gemspec"]
14
+ s.extra_rdoc_files = ["README.rdoc", "bin/scrappy", "lib/js/annotator.js", "lib/scrappy.rb", "lib/scrappy/agent/agent.rb", "lib/scrappy/agent/blind_agent.rb", "lib/scrappy/agent/cache.rb", "lib/scrappy/agent/dumper.rb", "lib/scrappy/agent/formats.rb", "lib/scrappy/agent/map_reduce.rb", "lib/scrappy/agent/extractor.rb", "lib/scrappy/agent/visual_agent.rb", "lib/scrappy/proxy.rb", "lib/scrappy/selectors/base_uri.rb", "lib/scrappy/selectors/css.rb", "lib/scrappy/selectors/new_uri.rb", "lib/scrappy/selectors/root.rb", "lib/scrappy/selectors/section.rb", "lib/scrappy/selectors/slice.rb", "lib/scrappy/selectors/uri.rb", "lib/scrappy/selectors/uri_pattern.rb", "lib/scrappy/selectors/xpath.rb", "lib/scrappy/server.rb", "lib/scrappy/shell.rb", "lib/scrappy/support.rb", "lib/scrappy/views/home.haml", "lib/scrappy/webkit/webkit.rb"]
15
+ s.files = ["History.txt", "Manifest", "README.rdoc", "Rakefile", "bin/scrappy", "kb/elmundo.yarf", "lib/js/annotator.js", "lib/scrappy.rb", "lib/scrappy/agent/agent.rb", "lib/scrappy/agent/blind_agent.rb", "lib/scrappy/agent/cache.rb", "lib/scrappy/agent/dumper.rb", "lib/scrappy/agent/formats.rb", "lib/scrappy/agent/map_reduce.rb", "lib/scrappy/agent/extractor.rb", "lib/scrappy/agent/visual_agent.rb", "lib/scrappy/proxy.rb", "lib/scrappy/selectors/base_uri.rb", "lib/scrappy/selectors/css.rb", "lib/scrappy/selectors/new_uri.rb", "lib/scrappy/selectors/root.rb", "lib/scrappy/selectors/section.rb", "lib/scrappy/selectors/slice.rb", "lib/scrappy/selectors/uri.rb", "lib/scrappy/selectors/uri_pattern.rb", "lib/scrappy/selectors/xpath.rb", "lib/scrappy/server.rb", "lib/scrappy/shell.rb", "lib/scrappy/support.rb", "lib/scrappy/views/home.haml", "lib/scrappy/webkit/webkit.rb", "test/test_helper.rb", "test/test_scrappy.rb", "scrappy.gemspec"]
16
16
  s.homepage = %q{http://github.com/josei/scrappy}
17
17
  s.post_install_message = %q{**(Optional) Remember to install rbwebkitgtk for visual parsing features**}
18
18
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Scrappy", "--main", "README.rdoc"]
@@ -28,31 +28,28 @@ Gem::Specification.new do |s|
28
28
 
29
29
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
30
30
  s.add_runtime_dependency(%q<activesupport>, [">= 2.3.5"])
31
- s.add_runtime_dependency(%q<markaby>, [">= 0.7.1"])
32
- s.add_runtime_dependency(%q<camping>, ["= 2.0"])
31
+ s.add_runtime_dependency(%q<sinatra>, [">= 1.1.2"])
32
+ s.add_runtime_dependency(%q<thin>, [">= 1.2.7"])
33
33
  s.add_runtime_dependency(%q<nokogiri>, [">= 1.4.1"])
34
34
  s.add_runtime_dependency(%q<mechanize>, [">= 1.0.0"])
35
35
  s.add_runtime_dependency(%q<lightrdf>, [">= 0.1.9"])
36
- s.add_runtime_dependency(%q<mongrel>, [">= 1.1.5"])
37
36
  s.add_runtime_dependency(%q<i18n>, [">= 0.4.2"])
38
37
  else
39
38
  s.add_dependency(%q<activesupport>, [">= 2.3.5"])
40
- s.add_dependency(%q<markaby>, [">= 0.7.1"])
41
- s.add_dependency(%q<camping>, ["= 2.0"])
39
+ s.add_dependency(%q<sinatra>, [">= 1.1.2"])
40
+ s.add_dependency(%q<thin>, [">= 1.2.7"])
42
41
  s.add_dependency(%q<nokogiri>, [">= 1.4.1"])
43
42
  s.add_dependency(%q<mechanize>, [">= 1.0.0"])
44
43
  s.add_dependency(%q<lightrdf>, [">= 0.1.9"])
45
- s.add_dependency(%q<mongrel>, [">= 1.1.5"])
46
44
  s.add_dependency(%q<i18n>, [">= 0.4.2"])
47
45
  end
48
46
  else
49
47
  s.add_dependency(%q<activesupport>, [">= 2.3.5"])
50
- s.add_dependency(%q<markaby>, [">= 0.7.1"])
51
- s.add_dependency(%q<camping>, ["= 2.0"])
48
+ s.add_dependency(%q<sinatra>, [">= 1.1.2"])
49
+ s.add_dependency(%q<thin>, [">= 1.2.7"])
52
50
  s.add_dependency(%q<nokogiri>, [">= 1.4.1"])
53
51
  s.add_dependency(%q<mechanize>, [">= 1.0.0"])
54
52
  s.add_dependency(%q<lightrdf>, [">= 0.1.9"])
55
- s.add_dependency(%q<mongrel>, [">= 1.1.5"])
56
53
  s.add_dependency(%q<i18n>, [">= 0.4.2"])
57
54
  end
58
55
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 18
9
- version: 0.1.18
8
+ - 19
9
+ version: 0.1.19
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jose Ignacio
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-02-18 00:00:00 +01:00
17
+ date: 2011-02-24 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -32,30 +32,31 @@ dependencies:
32
32
  type: :runtime
33
33
  version_requirements: *id001
34
34
  - !ruby/object:Gem::Dependency
35
- name: markaby
35
+ name: sinatra
36
36
  prerelease: false
37
37
  requirement: &id002 !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  segments:
42
- - 0
43
- - 7
44
42
  - 1
45
- version: 0.7.1
43
+ - 1
44
+ - 2
45
+ version: 1.1.2
46
46
  type: :runtime
47
47
  version_requirements: *id002
48
48
  - !ruby/object:Gem::Dependency
49
- name: camping
49
+ name: thin
50
50
  prerelease: false
51
51
  requirement: &id003 !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - "="
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  segments:
56
+ - 1
56
57
  - 2
57
- - 0
58
- version: "2.0"
58
+ - 7
59
+ version: 1.2.7
59
60
  type: :runtime
60
61
  version_requirements: *id003
61
62
  - !ruby/object:Gem::Dependency
@@ -100,24 +101,10 @@ dependencies:
100
101
  version: 0.1.9
101
102
  type: :runtime
102
103
  version_requirements: *id006
103
- - !ruby/object:Gem::Dependency
104
- name: mongrel
105
- prerelease: false
106
- requirement: &id007 !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- segments:
111
- - 1
112
- - 1
113
- - 5
114
- version: 1.1.5
115
- type: :runtime
116
- version_requirements: *id007
117
104
  - !ruby/object:Gem::Dependency
118
105
  name: i18n
119
106
  prerelease: false
120
- requirement: &id008 !ruby/object:Gem::Requirement
107
+ requirement: &id007 !ruby/object:Gem::Requirement
121
108
  requirements:
122
109
  - - ">="
123
110
  - !ruby/object:Gem::Version
@@ -127,7 +114,7 @@ dependencies:
127
114
  - 2
128
115
  version: 0.4.2
129
116
  type: :runtime
130
- version_requirements: *id008
117
+ version_requirements: *id007
131
118
  description: RDF web scraper
132
119
  email: joseignacio.fernandez@gmail.com
133
120
  executables:
@@ -160,6 +147,7 @@ extra_rdoc_files:
160
147
  - lib/scrappy/server.rb
161
148
  - lib/scrappy/shell.rb
162
149
  - lib/scrappy/support.rb
150
+ - lib/scrappy/views/home.haml
163
151
  - lib/scrappy/webkit/webkit.rb
164
152
  files:
165
153
  - History.txt
@@ -191,6 +179,7 @@ files:
191
179
  - lib/scrappy/server.rb
192
180
  - lib/scrappy/shell.rb
193
181
  - lib/scrappy/support.rb
182
+ - lib/scrappy/views/home.haml
194
183
  - lib/scrappy/webkit/webkit.rb
195
184
  - test/test_helper.rb
196
185
  - test/test_scrappy.rb