scrapify 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/examples/pizza.rb ADDED
@@ -0,0 +1,10 @@
1
+ class Pizza
2
+ include Scrapify::Base
3
+ html "http://www.dominos.co.in/menuDetails_ajx.php?catgId=1"
4
+
5
+ attribute :name, css: ".menu_lft li a"
6
+ attribute :image_url, xpath: "//li//input//@value"
7
+ attribute :price, css: ".price", regex: /([\d\.]+)/
8
+
9
+ key :name
10
+ end
data/lib/scrapify.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  require 'scrapify/version'
2
2
  require 'active_support/core_ext/class/attribute_accessors'
3
+ require 'active_support/core_ext/hash/keys'
3
4
  require 'nokogiri'
4
5
  require 'uri'
5
6
  require 'net/http'
6
- require 'meta_define'
7
7
  require 'scrapify/base'
8
+ require 'scrapify/scraper'
8
9
  require 'json'
9
10
  require 'jsonify'
data/lib/scrapify/base.rb CHANGED
@@ -27,11 +27,12 @@ module Scrapify
27
27
 
28
28
  def attribute(name, options={}, &block)
29
29
  add_attribute(name)
30
+ options = options.symbolize_keys
30
31
  parser = options[:xpath] ? :xpath : :css
31
32
  selector = options[parser]
32
33
  matcher = /#{options[:regex]}/ if options[:regex]
33
34
  to_array = options[:array]
34
- meta_define "#{name}_values" do
35
+ define_singleton_method "#{name}_values" do
35
36
  self.doc ||= parse_html
36
37
  self.doc.send(parser, selector).map do |element|
37
38
  if block
@@ -86,21 +87,21 @@ module Scrapify
86
87
  end
87
88
 
88
89
  def define_finders
89
- meta_define :all do
90
+ define_singleton_method :all do
90
91
  count.times.map do |index|
91
92
  find_by_index index
92
93
  end
93
94
  end
94
95
 
95
- meta_define :first do
96
+ define_singleton_method :first do
96
97
  find_by_index 0
97
98
  end
98
99
 
99
- meta_define :last do
100
+ define_singleton_method :last do
100
101
  find_by_index count - 1
101
102
  end
102
103
 
103
- meta_define :find_by_index do |index|
104
+ define_singleton_method :find_by_index do |index|
104
105
  return if index.nil? or index < 0
105
106
  attributes = Hash[attribute_names.map {|attribute| [attribute, send("#{attribute}_values")[index]]}]
106
107
  self.new(attributes)
@@ -108,13 +109,13 @@ module Scrapify
108
109
  end
109
110
 
110
111
  def define_count(key_attribute)
111
- meta_define :count do
112
+ define_singleton_method :count do
112
113
  send("#{key_attribute}_values").size
113
114
  end
114
115
  end
115
116
 
116
117
  def define_find_by_id(key_attribute)
117
- meta_define :find do |key_value|
118
+ define_singleton_method :find do |key_value|
118
119
  index = send("#{key_attribute}_values").index(key_value)
119
120
  find_by_index index
120
121
  end
@@ -0,0 +1,24 @@
1
+ module Scrapify
2
+ class Scraper
3
+ def initialize(url, key_attr, attributes)
4
+ @scraper = Class.new
5
+ @scraper.send(:include, Scrapify::Base)
6
+ @scraper.html url
7
+ @scraper.key key_attr.to_sym
8
+ attributes.symbolize_keys.each do |attr, options|
9
+ options = options.symbolize_keys
10
+ custom_block = options.delete(:block)
11
+ @scraper.attribute attr, options, &custom_block
12
+ end
13
+ end
14
+
15
+ def method_missing(method, *args, &block)
16
+ return @scraper.send(method, *args, &block) if @scraper.respond_to?(method)
17
+ super
18
+ end
19
+
20
+ def respond_to?(method, include_private=false)
21
+ @scraper.respond_to?(method, include_private) || super
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module Scrapify
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
data/spec/pizza.rb CHANGED
@@ -8,7 +8,7 @@ class Pizza
8
8
  attribute :ingredients, css: ".ingredients", regex: /contains (\w+)/, array: true
9
9
  attribute :ingredient_urls, css: '.references ol li' do |element|
10
10
  element.children.map do |child|
11
- child.attributes['href'].value if child.attributes['href']
11
+ child.attributes['href'].value if child.attributes['href']
12
12
  end.compact
13
13
  end
14
14
 
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'test_models'
3
+ require 'active_support/core_ext/hash/keys'
4
+
5
+ describe Scrapify::Scraper do
6
+ def self.attributes
7
+ {:name => {:css => ".menu_lft li a"},
8
+ :image_url => {:xpath => "//li//input//@value"},
9
+ :price => {:css => ".price", :regex => /([\d\.]+)/},
10
+ :ingredients => {:css => ".ingredients", :regex => /contains (\w+)/, :array => true},
11
+ :ingredient_urls => {:css => ".references ol li",
12
+ :block => lambda{|element| element.children.map{|child| child.attributes['href'].value if child.attributes['href']}.compact}
13
+ }}
14
+ end
15
+
16
+ def self.attributes_with_string_keys
17
+ attributes.each_with_object({}){|(k,v),h| h[k.to_s] = v.stringify_keys}
18
+ end
19
+
20
+ it_should_behave_like "Scrapify", Scrapify::Scraper.new(::Pizza.url, :name, attributes)
21
+ it_should_behave_like "Scrapify", Scrapify::Scraper.new(::Pizza.url, 'name', attributes_with_string_keys)
22
+ end
@@ -2,181 +2,5 @@ require 'spec_helper'
2
2
  require 'test_models'
3
3
 
4
4
  describe Scrapify do
5
-
6
- before do
7
- @pizza_url = "http://www.dominos.co.in/menuDetails_ajx.php?catgId=1"
8
- FakeWeb.register_uri :get, @pizza_url,
9
- :cache_control => "private, s-maxage=0, max-age=0, must-revalidate",
10
- :age => 51592,
11
- :length => 12312,
12
- :body => <<-HTML
13
- <ul class="menu_lft">
14
- <li>
15
- <a> chicken supreme </a><input value="chicken.jpg">
16
- <span class='price'>(1.23)</span>
17
- <span class='ingredients'>
18
- <ol>
19
- <li>contains corn</li>
20
- <li>contains tomato</li>
21
- <ol>
22
- </span>
23
- <span class='references'><ol><li></li></ol></span
24
- </li>
25
- <li>
26
- <a>veg supreme</a><input value="veg.jpg">
27
- <span class='price'>(2.34)</span>
28
- <span class='ingredients'>
29
- <ol>
30
- <li>contains mushroom</li>
31
- <li>contains jalapeno</li>
32
- <ol>
33
- </span>
34
- <span class='references'><ol><li></li></ol></span
35
- </li>
36
- <li>
37
- <a>pepperoni</a><input value="pepperoni.jpg">
38
- <span class='price'>(3.45)</span>
39
- <span class='ingredients'></span>
40
- <span class='references'><ol><li></li></ol></span
41
- </li>
42
- <li>
43
- <a>chicken golden delight</a><input value="golden.jpg">
44
- <span class='price'>(4.56)</span>
45
- <span class='ingredients'/>
46
- <span class='references'>
47
- <ol>
48
- <li>
49
- <div href='chicken.html'>chicken</div>
50
- <div href='delight.html'>delight</div>
51
- </li>
52
- </ol>
53
- </span>
54
- </li>
55
- </ul>
56
- HTML
57
- end
58
-
59
- it "should return attribute names" do
60
- ::Pizza.attribute_names.should == [:name, :image_url, :price, :ingredients, :ingredient_urls]
61
- end
62
-
63
- describe "html" do
64
- it "should store url" do
65
- ::Pizza.url.should == @pizza_url
66
- end
67
-
68
- it "should parse html and fetch attributes using css" do
69
- ::Pizza.name_values.should == ['chicken supreme', 'veg supreme', 'pepperoni', 'chicken golden delight']
70
- end
71
-
72
- it "should parse html and fetch attributes using xpath" do
73
- ::Pizza.image_url_values.should == ['chicken.jpg', 'veg.jpg', 'pepperoni.jpg', 'golden.jpg']
74
- end
75
-
76
- it "should parse html and extract attributes using regex" do
77
- ::Pizza.price_values.should == ['1.23', '2.34', '3.45', '4.56']
78
- end
79
-
80
- it "should parse html and extract multiple attributes using regex" do
81
- ::Pizza.ingredients_values.should == [['corn','tomato'], ['mushroom','jalapeno'], [], []]
82
- end
83
-
84
- it 'should accept block to yield attribute values' do
85
- ::Pizza.ingredient_urls_values.should == [[], [], [], ['chicken.html', 'delight.html']]
86
- end
87
-
88
- it "should strip content" do
89
- ::Pizza.first.name.should == 'chicken supreme'
90
- end
91
-
92
- describe "cache headers" do
93
- it "should return the http headers" do
94
- ::Pizza.http_cache_header.should == {
95
- "cache-control" => "private, s-maxage=0, max-age=0, must-revalidate",
96
- "age" => 51592,
97
- }
98
- end
99
- end
100
- end
101
-
102
- describe "find" do
103
- it "should find element by key" do
104
- pizza = ::Pizza.find('pepperoni')
105
- pizza.should_not be_nil
106
- pizza.name.should == 'pepperoni'
107
- pizza.image_url.should == 'pepperoni.jpg'
108
- end
109
-
110
- it "should be nil if element does not exist" do
111
- pizza = ::Pizza.find('mushroom')
112
- pizza.should be_nil
113
- end
114
- end
115
-
116
- describe "first" do
117
- it "should fetch first matching element" do
118
- first_pizza = ::Pizza.first
119
- first_pizza.name.should == 'chicken supreme'
120
- first_pizza.image_url.should == 'chicken.jpg'
121
- end
122
- end
123
-
124
- describe "last" do
125
- it "should fetch last matching element" do
126
- last_pizza = ::Pizza.last
127
- last_pizza.name.should == 'chicken golden delight'
128
- last_pizza.image_url.should == 'golden.jpg'
129
- end
130
- end
131
-
132
- describe "all" do
133
- it "should fetch all objects" do
134
- pizzas = ::Pizza.all
135
- pizzas.size.should == 4
136
- pizzas.map(&:name).should == ['chicken supreme', 'veg supreme', 'pepperoni', 'chicken golden delight']
137
- pizzas.map(&:image_url).should == ['chicken.jpg', 'veg.jpg', 'pepperoni.jpg', 'golden.jpg']
138
- end
139
- end
140
-
141
- describe "count" do
142
- it "should return number of matching elements" do
143
- ::Pizza.count.should == 4
144
- end
145
- end
146
-
147
- describe "attributes" do
148
- it "should return attributes hash" do
149
- first_pizza = ::Pizza.first
150
- first_pizza.attributes.should == {
151
- name: "chicken supreme",
152
- image_url: "chicken.jpg",
153
- price: '1.23',
154
- ingredients: ['corn', 'tomato'],
155
- ingredient_urls: []
156
- }
157
- end
158
- end
159
-
160
- describe "to_json" do
161
- it "should convert attributes to json" do
162
- first_pizza = ::Pizza.first
163
- first_pizza.to_json.should == {
164
- name: "chicken supreme",
165
- image_url: "chicken.jpg",
166
- price: '1.23',
167
- ingredients: ['corn', 'tomato'],
168
- ingredient_urls: []
169
- }.to_json
170
- end
171
-
172
- it "should convert array to json" do
173
- pizzas = ::Pizza.all
174
- pizzas.to_json.should == [
175
- {name: "chicken supreme", image_url: "chicken.jpg", price: '1.23', ingredients: ['corn', 'tomato'], :ingredient_urls => []},
176
- {name: "veg supreme", image_url: "veg.jpg", price: '2.34', ingredients: ['mushroom', 'jalapeno'], :ingredient_urls => []},
177
- {name: "pepperoni", image_url: "pepperoni.jpg", price: '3.45', ingredients: [], :ingredient_urls => []},
178
- {name: "chicken golden delight", image_url: "golden.jpg", price: '4.56', ingredients: [], :ingredient_urls => ['chicken.html', 'delight.html']},
179
- ].to_json
180
- end
181
- end
5
+ it_should_behave_like "Scrapify", ::Pizza
182
6
  end
@@ -0,0 +1,178 @@
1
+ shared_examples_for "Scrapify" do |klass_or_object|
2
+ before do
3
+ @pizza_url = "http://www.dominos.co.in/menuDetails_ajx.php?catgId=1"
4
+ FakeWeb.register_uri :get, @pizza_url,
5
+ :cache_control => "private, s-maxage=0, max-age=0, must-revalidate",
6
+ :age => 51592,
7
+ :length => 12312,
8
+ :body => <<-HTML
9
+ <ul class="menu_lft">
10
+ <li>
11
+ <a> chicken supreme </a><input value="chicken.jpg">
12
+ <span class='price'>(1.23)</span>
13
+ <span class='ingredients'>
14
+ <ol>
15
+ <li>contains corn</li>
16
+ <li>contains tomato</li>
17
+ <ol>
18
+ </span>
19
+ <span class='references'><ol><li></li></ol></span
20
+ </li>
21
+ <li>
22
+ <a>veg supreme</a><input value="veg.jpg">
23
+ <span class='price'>(2.34)</span>
24
+ <span class='ingredients'>
25
+ <ol>
26
+ <li>contains mushroom</li>
27
+ <li>contains jalapeno</li>
28
+ <ol>
29
+ </span>
30
+ <span class='references'><ol><li></li></ol></span
31
+ </li>
32
+ <li>
33
+ <a>pepperoni</a><input value="pepperoni.jpg">
34
+ <span class='price'>(3.45)</span>
35
+ <span class='ingredients'></span>
36
+ <span class='references'><ol><li></li></ol></span
37
+ </li>
38
+ <li>
39
+ <a>chicken golden delight</a><input value="golden.jpg">
40
+ <span class='price'>(4.56)</span>
41
+ <span class='ingredients'/>
42
+ <span class='references'>
43
+ <ol>
44
+ <li>
45
+ <div href='chicken.html'>chicken</div>
46
+ <div href='delight.html'>delight</div>
47
+ </li>
48
+ </ol>
49
+ </span>
50
+ </li>
51
+ </ul>
52
+ HTML
53
+ end
54
+
55
+ it "should return attribute names" do
56
+ klass_or_object.attribute_names.should == [:name, :image_url, :price, :ingredients, :ingredient_urls]
57
+ end
58
+
59
+ describe "html" do
60
+ it "should store url" do
61
+ klass_or_object.url.should == @pizza_url
62
+ end
63
+
64
+ it "should parse html and fetch attributes using css" do
65
+ klass_or_object.name_values.should == ['chicken supreme', 'veg supreme', 'pepperoni', 'chicken golden delight']
66
+ end
67
+
68
+ it "should parse html and fetch attributes using xpath" do
69
+ klass_or_object.image_url_values.should == ['chicken.jpg', 'veg.jpg', 'pepperoni.jpg', 'golden.jpg']
70
+ end
71
+
72
+ it "should parse html and extract attributes using regex" do
73
+ klass_or_object.price_values.should == ['1.23', '2.34', '3.45', '4.56']
74
+ end
75
+
76
+ it "should parse html and extract multiple attributes using regex" do
77
+ klass_or_object.ingredients_values.should == [['corn','tomato'], ['mushroom','jalapeno'], [], []]
78
+ end
79
+
80
+ it 'should accept block to yield attribute values' do
81
+ klass_or_object.ingredient_urls_values.should == [[], [], [], ['chicken.html', 'delight.html']]
82
+ end
83
+
84
+ it "should strip content" do
85
+ klass_or_object.first.name.should == 'chicken supreme'
86
+ end
87
+
88
+ describe "cache headers" do
89
+ it "should return the http headers" do
90
+ klass_or_object.http_cache_header.should == {
91
+ "cache-control" => "private, s-maxage=0, max-age=0, must-revalidate",
92
+ "age" => 51592,
93
+ }
94
+ end
95
+ end
96
+ end
97
+
98
+ describe "find" do
99
+ it "should find element by key" do
100
+ pizza = klass_or_object.find('pepperoni')
101
+ pizza.should_not be_nil
102
+ pizza.name.should == 'pepperoni'
103
+ pizza.image_url.should == 'pepperoni.jpg'
104
+ end
105
+
106
+ it "should be nil if element does not exist" do
107
+ pizza = klass_or_object.find('mushroom')
108
+ pizza.should be_nil
109
+ end
110
+ end
111
+
112
+ describe "first" do
113
+ it "should fetch first matching element" do
114
+ first_pizza = klass_or_object.first
115
+ first_pizza.name.should == 'chicken supreme'
116
+ first_pizza.image_url.should == 'chicken.jpg'
117
+ end
118
+ end
119
+
120
+ describe "last" do
121
+ it "should fetch last matching element" do
122
+ last_pizza = klass_or_object.last
123
+ last_pizza.name.should == 'chicken golden delight'
124
+ last_pizza.image_url.should == 'golden.jpg'
125
+ end
126
+ end
127
+
128
+ describe "all" do
129
+ it "should fetch all objects" do
130
+ pizzas = klass_or_object.all
131
+ pizzas.size.should == 4
132
+ pizzas.map(&:name).should == ['chicken supreme', 'veg supreme', 'pepperoni', 'chicken golden delight']
133
+ pizzas.map(&:image_url).should == ['chicken.jpg', 'veg.jpg', 'pepperoni.jpg', 'golden.jpg']
134
+ end
135
+ end
136
+
137
+ describe "count" do
138
+ it "should return number of matching elements" do
139
+ klass_or_object.count.should == 4
140
+ end
141
+ end
142
+
143
+ describe "attributes" do
144
+ it "should return attributes hash" do
145
+ first_pizza = klass_or_object.first
146
+ first_pizza.attributes.should == {
147
+ name: "chicken supreme",
148
+ image_url: "chicken.jpg",
149
+ price: '1.23',
150
+ ingredients: ['corn', 'tomato'],
151
+ ingredient_urls: []
152
+ }
153
+ end
154
+ end
155
+
156
+ describe "to_json" do
157
+ it "should convert attributes to json" do
158
+ first_pizza = klass_or_object.first
159
+ first_pizza.to_json.should == {
160
+ name: "chicken supreme",
161
+ image_url: "chicken.jpg",
162
+ price: '1.23',
163
+ ingredients: ['corn', 'tomato'],
164
+ ingredient_urls: []
165
+ }.to_json
166
+ end
167
+
168
+ it "should convert array to json" do
169
+ pizzas = klass_or_object.all
170
+ pizzas.to_json.should == [
171
+ {name: "chicken supreme", image_url: "chicken.jpg", price: '1.23', ingredients: ['corn', 'tomato'], :ingredient_urls => []},
172
+ {name: "veg supreme", image_url: "veg.jpg", price: '2.34', ingredients: ['mushroom', 'jalapeno'], :ingredient_urls => []},
173
+ {name: "pepperoni", image_url: "pepperoni.jpg", price: '3.45', ingredients: [], :ingredient_urls => []},
174
+ {name: "chicken golden delight", image_url: "golden.jpg", price: '4.56', ingredients: [], :ingredient_urls => ['chicken.html', 'delight.html']},
175
+ ].to_json
176
+ end
177
+ end
178
+ end
data/spec/spec_helper.rb CHANGED
@@ -4,7 +4,8 @@ require 'rspec/mocks'
4
4
  require 'fakeweb'
5
5
 
6
6
  require 'scrapify'
7
+ Dir["./spec/shared/*.rb"].each {|f| require File.expand_path(f)}
7
8
 
8
9
  RSpec.configure do |config|
9
10
  config.mock_with :mocha
10
- end
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scrapify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-19 00:00:00.000000000Z
12
+ date: 2012-06-28 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70142157555980 !ruby/object:Gem::Requirement
16
+ requirement: &70233941360460 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70142157555980
24
+ version_requirements: *70233941360460
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mocha
27
- requirement: &70142157554660 !ruby/object:Gem::Requirement
27
+ requirement: &70233941359980 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70142157554660
35
+ version_requirements: *70233941359980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: fakeweb
38
- requirement: &70142157538940 !ruby/object:Gem::Requirement
38
+ requirement: &70233941359460 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70142157538940
46
+ version_requirements: *70233941359460
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: nokogiri
49
- requirement: &70142157538080 !ruby/object:Gem::Requirement
49
+ requirement: &70233941358800 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70142157538080
57
+ version_requirements: *70233941358800
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: activesupport
60
- requirement: &70142157537240 !ruby/object:Gem::Requirement
60
+ requirement: &70233941358220 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70142157537240
68
+ version_requirements: *70233941358220
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: json
71
- requirement: &70142157536340 !ruby/object:Gem::Requirement
71
+ requirement: &70233941351380 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70142157536340
79
+ version_requirements: *70233941351380
80
80
  description: ScrApify scraps static html sites to RESTlike APIs
81
81
  email:
82
82
  - sathish316@gmail.com
@@ -88,15 +88,18 @@ files:
88
88
  - Gemfile
89
89
  - README.md
90
90
  - Rakefile
91
+ - examples/pizza.rb
91
92
  - lib/jsonify.rb
92
- - lib/meta_define.rb
93
93
  - lib/scrapify.rb
94
94
  - lib/scrapify/base.rb
95
+ - lib/scrapify/scraper.rb
95
96
  - lib/scrapify/version.rb
96
97
  - scrapify.gemspec
97
98
  - spec/jsonify_spec.rb
98
99
  - spec/pizza.rb
100
+ - spec/scraper_spec.rb
99
101
  - spec/scrapify_spec.rb
102
+ - spec/shared/scrapify.rb
100
103
  - spec/spec_helper.rb
101
104
  - spec/test_models.rb
102
105
  homepage: http://www.github.com/sathish316/scrapify
@@ -126,6 +129,8 @@ summary: ScrApify scraps static html sites to scraESTlike APIs
126
129
  test_files:
127
130
  - spec/jsonify_spec.rb
128
131
  - spec/pizza.rb
132
+ - spec/scraper_spec.rb
129
133
  - spec/scrapify_spec.rb
134
+ - spec/shared/scrapify.rb
130
135
  - spec/spec_helper.rb
131
136
  - spec/test_models.rb
data/lib/meta_define.rb DELETED
@@ -1,5 +0,0 @@
1
- class Object # http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html
2
- def meta_define name, &blk
3
- (class << self; self; end).instance_eval { define_method name, &blk }
4
- end
5
- end