scrapify 0.0.6 → 0.0.7

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/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