storexplore 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/.gitignore +26 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/Guardfile +9 -0
- data/LICENSE +165 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/storexplore/api.rb +63 -0
- data/lib/storexplore/api_builder.rb +68 -0
- data/lib/storexplore/array_utils.rb +36 -0
- data/lib/storexplore/browsing_error.rb +26 -0
- data/lib/storexplore/digger.rb +35 -0
- data/lib/storexplore/hash_utils.rb +56 -0
- data/lib/storexplore/null_digger.rb +30 -0
- data/lib/storexplore/testing/api_shared_examples.rb +140 -0
- data/lib/storexplore/testing/configuration.rb +56 -0
- data/lib/storexplore/testing/dummy_data.rb +67 -0
- data/lib/storexplore/testing/dummy_store.rb +195 -0
- data/lib/storexplore/testing/dummy_store_api.rb +54 -0
- data/lib/storexplore/testing/dummy_store_constants.rb +31 -0
- data/lib/storexplore/testing/dummy_store_generator.rb +65 -0
- data/lib/storexplore/testing/matchers/have_unique_matcher.rb +74 -0
- data/lib/storexplore/testing/matchers/mostly_matcher.rb +45 -0
- data/lib/storexplore/testing.rb +30 -0
- data/lib/storexplore/uri_utils.rb +38 -0
- data/lib/storexplore/version.rb +24 -0
- data/lib/storexplore/walker.rb +84 -0
- data/lib/storexplore/walker_page.rb +142 -0
- data/lib/storexplore/walker_page_error.rb +25 -0
- data/lib/storexplore.rb +34 -0
- data/spec/lib/storexplore/api_builder_spec.rb +99 -0
- data/spec/lib/storexplore/api_spec.rb +44 -0
- data/spec/lib/storexplore/digger_spec.rb +53 -0
- data/spec/lib/storexplore/store_walker_page_spec_fixture.html +21 -0
- data/spec/lib/storexplore/testing/dummy_store_api_spec.rb +120 -0
- data/spec/lib/storexplore/uri_utils_spec.rb +51 -0
- data/spec/lib/storexplore/walker_page_spec.rb +120 -0
- data/spec/lib/storexplore/walker_spec.rb +97 -0
- data/spec/spec_helper.rb +28 -0
- data/storexplore.gemspec +27 -0
- data.tar.gz.sig +0 -0
- metadata +187 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# dummy_store_api_spec.rb
|
4
|
+
#
|
5
|
+
# Copyright (c) 2011, 2012, 2013 by Philippe Bourgau. All rights reserved.
|
6
|
+
#
|
7
|
+
# This library is free software; you can redistribute it and/or
|
8
|
+
# modify it under the terms of the GNU Lesser General Public
|
9
|
+
# License as published by the Free Software Foundation; either
|
10
|
+
# version 3.0 of the License, or (at your option) any later version.
|
11
|
+
#
|
12
|
+
# This library is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
# Lesser General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Lesser General Public
|
18
|
+
# License along with this library; if not, write to the Free Software
|
19
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
20
|
+
# MA 02110-1301 USA
|
21
|
+
|
22
|
+
require 'spec_helper'
|
23
|
+
|
24
|
+
module Storexplore
|
25
|
+
module Testing
|
26
|
+
|
27
|
+
describe "DummyStoreApi", slow: true do
|
28
|
+
include ApiSpecMacros
|
29
|
+
|
30
|
+
it_should_behave_like_any_store_items_api
|
31
|
+
|
32
|
+
DEFAULT_STORE_NAME = "www.spec-store.com"
|
33
|
+
|
34
|
+
def generate_store(store_name = DEFAULT_STORE_NAME, item_count = 3)
|
35
|
+
DummyStore.wipe_out_store(store_name)
|
36
|
+
@store_generator = DummyStore.open(store_name)
|
37
|
+
@store_generator.generate(3).categories.and(3).categories.and(item_count).items
|
38
|
+
@store = new_store(store_name)
|
39
|
+
end
|
40
|
+
|
41
|
+
def new_store(store_name = DEFAULT_STORE_NAME)
|
42
|
+
Api.browse(DummyStore.uri(store_name))
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should not truncate long item names" do
|
46
|
+
@store_generator.
|
47
|
+
category(cat_name = "extra long category name").
|
48
|
+
category(sub_cat_name = "extra long sub category name").
|
49
|
+
item(item_name = "super extra long item name").generate().attributes
|
50
|
+
|
51
|
+
category = new_store.categories.find {|cat| cat_name.start_with?(cat.title)}
|
52
|
+
expect(category.attributes[:name]).to eq cat_name
|
53
|
+
|
54
|
+
sub_category = category.categories.find {|sub_cat| sub_cat_name.start_with?(sub_cat.title)}
|
55
|
+
expect(sub_category.attributes[:name]).to eq sub_cat_name
|
56
|
+
|
57
|
+
item = sub_category.items.find {|it| item_name.start_with?(it.title)}
|
58
|
+
expect(item.attributes[:name]).to eq item_name
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should use constant memory" do
|
62
|
+
warm_up_measure = memory_usage_for_items(1)
|
63
|
+
|
64
|
+
small_inputs_memory = memory_usage_for_items(1)
|
65
|
+
large_inputs_memory = memory_usage_for_items(200)
|
66
|
+
|
67
|
+
expect(large_inputs_memory).to be <= small_inputs_memory * 1.25
|
68
|
+
end
|
69
|
+
|
70
|
+
def memory_usage_for_items(item_count)
|
71
|
+
generate_store(store_name = "www.spec-perf-store.com", item_count)
|
72
|
+
memory_peak_of do
|
73
|
+
walk_store(store_name)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def memory_peak_of
|
78
|
+
peak_usage = 0
|
79
|
+
finished = false
|
80
|
+
|
81
|
+
initial_usage = current_living_objects
|
82
|
+
profiler = Thread.new do
|
83
|
+
while not finished
|
84
|
+
peak_usage = [peak_usage, current_living_objects].max
|
85
|
+
sleep(0.01)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
yield
|
90
|
+
|
91
|
+
finished = true
|
92
|
+
profiler.join
|
93
|
+
|
94
|
+
peak_usage - initial_usage
|
95
|
+
end
|
96
|
+
|
97
|
+
def current_living_objects
|
98
|
+
GC.start
|
99
|
+
object_counts = ObjectSpace.count_objects
|
100
|
+
object_counts[:TOTAL] - object_counts[:FREE]
|
101
|
+
end
|
102
|
+
|
103
|
+
def walk_store(store_name)
|
104
|
+
new_store(store_name).categories.each do |category|
|
105
|
+
@title = category.title
|
106
|
+
@attributes = category.attributes
|
107
|
+
category.categories.each do |sub_category|
|
108
|
+
@title = sub_category.title
|
109
|
+
@attributes = sub_category.attributes
|
110
|
+
category.items.each do |item|
|
111
|
+
@title = item.title
|
112
|
+
@attributes = item.attributes
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# uri_utils.rb
|
4
|
+
#
|
5
|
+
# Copyright (c) 2011, 2012, 2013 by Philippe Bourgau. All rights reserved.
|
6
|
+
#
|
7
|
+
# This library is free software; you can redistribute it and/or
|
8
|
+
# modify it under the terms of the GNU Lesser General Public
|
9
|
+
# License as published by the Free Software Foundation; either
|
10
|
+
# version 3.0 of the License, or (at your option) any later version.
|
11
|
+
#
|
12
|
+
# This library is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
# Lesser General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Lesser General Public
|
18
|
+
# License along with this library; if not, write to the Free Software
|
19
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
20
|
+
# MA 02110-1301 USA
|
21
|
+
|
22
|
+
require 'spec_helper'
|
23
|
+
|
24
|
+
module Storexplore
|
25
|
+
|
26
|
+
describe "UriUtils" do
|
27
|
+
|
28
|
+
it "should extract the domain of a domain only url" do
|
29
|
+
expect(UriUtils.domain(URI.parse("http://mes-courses.fr"))).to eq "mes-courses.fr"
|
30
|
+
end
|
31
|
+
it "should extract the domain of an url with a subdomain" do
|
32
|
+
expect(UriUtils.domain(URI.parse("http://www.yahoo.fr"))).to eq "yahoo.fr"
|
33
|
+
end
|
34
|
+
it "should extract the domain of an url with a directories" do
|
35
|
+
expect(UriUtils.domain(URI.parse("http://www.amazon.com/books/science-fiction"))).to eq "amazon.com"
|
36
|
+
end
|
37
|
+
it "should get localhost domain for a file uri" do
|
38
|
+
expect(UriUtils.domain(URI.parse("file:///home/user/documents/secret.txt"))).to eq "localhost"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should get a nil domain for a local path" do
|
42
|
+
expect(UriUtils.domain(URI.parse("root/folder/and/file.txt"))).to be_nil
|
43
|
+
end
|
44
|
+
it "should get a nil domain for a mailto uri" do
|
45
|
+
expect(UriUtils.domain(URI.parse("mailto:philou@mailinator.org"))).to be_nil
|
46
|
+
end
|
47
|
+
it "should get a nil domain for an url with an ip address" do
|
48
|
+
expect(UriUtils.domain(URI.parse("http://192.168.0.101/index.html"))).to be_nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# walker_page_spec.rb
|
4
|
+
#
|
5
|
+
# Copyright (c) 2011, 2012, 2013 by Philippe Bourgau. All rights reserved.
|
6
|
+
#
|
7
|
+
# This library is free software; you can redistribute it and/or
|
8
|
+
# modify it under the terms of the GNU Lesser General Public
|
9
|
+
# License as published by the Free Software Foundation; either
|
10
|
+
# version 3.0 of the License, or (at your option) any later version.
|
11
|
+
#
|
12
|
+
# This library is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
# Lesser General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Lesser General Public
|
18
|
+
# License along with this library; if not, write to the Free Software
|
19
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
20
|
+
# MA 02110-1301 USA
|
21
|
+
|
22
|
+
require 'spec_helper'
|
23
|
+
|
24
|
+
module Storexplore
|
25
|
+
|
26
|
+
# @integration
|
27
|
+
describe WalkerPage, slow: true do
|
28
|
+
|
29
|
+
before :each do
|
30
|
+
@uri = URI.parse("file://" + File.expand_path(File.join(File.dirname(__FILE__), 'store_walker_page_spec_fixture.html')))
|
31
|
+
@page_getter = WalkerPage.open(@uri)
|
32
|
+
end
|
33
|
+
|
34
|
+
context "before actually getting the page" do
|
35
|
+
it "nothing should throw if the uri is invalid" do
|
36
|
+
expect(lambda { WalkerPage.open("http://impossible.file.name") }).not_to raise_error
|
37
|
+
end
|
38
|
+
|
39
|
+
it "knows the uri of the page" do
|
40
|
+
expect(@page_getter.uri).to eq @uri
|
41
|
+
end
|
42
|
+
|
43
|
+
it "has text of the uri" do
|
44
|
+
expect(@page_getter.text).to eq @uri.to_s
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "after actually getting the page" do
|
49
|
+
before :each do
|
50
|
+
@page = @page_getter.get
|
51
|
+
end
|
52
|
+
|
53
|
+
it "delegates uri to the mechanize page" do
|
54
|
+
expect(@page.uri).to eq @uri
|
55
|
+
end
|
56
|
+
|
57
|
+
it "finds an element by css" do
|
58
|
+
element = @page.get_one("#unique")
|
59
|
+
|
60
|
+
expect(element).not_to be_nil
|
61
|
+
expect(element.attribute("id").value).to eq "unique"
|
62
|
+
end
|
63
|
+
|
64
|
+
it "finds only the first element by css" do
|
65
|
+
expect(@page.get_one(".number").text).to eq "0"
|
66
|
+
end
|
67
|
+
|
68
|
+
it "throws if it cannot find the element by css" do
|
69
|
+
expect(lambda { @page.get_one("#invalid_id") }).to raise_error(WalkerPageError)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "finds the first element from a list of css" do
|
73
|
+
expect(@page.get_one(".absent, #unique")).to be @page.get_one("#unique")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "finds all elements by css" do
|
77
|
+
expect(@page.get_all(".number", ', ')).to eq "0, 1"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "throws if it cannot find at least one element by css" do
|
81
|
+
expect(lambda{ @page.get_all('#invalid_id', ', ') }).to raise_error(WalkerPageError)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "finds relative links sorted by uri" do
|
85
|
+
links = @page.search_links("a.letter")
|
86
|
+
|
87
|
+
uris = links.map { |link| link.uri.to_s }
|
88
|
+
expect(uris).to eq ["a.html", "b.html"]
|
89
|
+
end
|
90
|
+
|
91
|
+
it "ignores links to other domains" do
|
92
|
+
expect(@page.search_links("#outbound")).to be_empty
|
93
|
+
end
|
94
|
+
|
95
|
+
it "ignores duplicate links" do
|
96
|
+
expect(@page.search_links("a.twin")).to have(1).link
|
97
|
+
end
|
98
|
+
|
99
|
+
it "links to other instances of WalkerPage" do
|
100
|
+
expect(@page.search_links("#myself").map { |link| link.get }).to all_ {be_instance_of(WalkerPage)}
|
101
|
+
end
|
102
|
+
|
103
|
+
it "knows the text of the links" do
|
104
|
+
@page.search_links("#myself").each do |link|
|
105
|
+
expect(link.text).to eq "myself"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it "finds an image by selector" do
|
110
|
+
image = @page.get_image(".image")
|
111
|
+
expect(image).to be_instance_of(Mechanize::Page::Image)
|
112
|
+
expect(image.dom_class).to eq "image"
|
113
|
+
end
|
114
|
+
|
115
|
+
it "throws if it cannot find the image by selector" do
|
116
|
+
expect(lambda { @page.get_image("#invalid_id") }).to raise_error(WalkerPageError)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# walker_spec.rb
|
4
|
+
#
|
5
|
+
# Copyright (C) 2012, 2013 by Philippe Bourgau. All rights reserved.
|
6
|
+
#
|
7
|
+
# This library is free software; you can redistribute it and/or
|
8
|
+
# modify it under the terms of the GNU Lesser General Public
|
9
|
+
# License as published by the Free Software Foundation; either
|
10
|
+
# version 3.0 of the License, or (at your option) any later version.
|
11
|
+
#
|
12
|
+
# This library is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
# Lesser General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Lesser General Public
|
18
|
+
# License along with this library; if not, write to the Free Software
|
19
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
20
|
+
# MA 02110-1301 USA
|
21
|
+
|
22
|
+
require "spec_helper"
|
23
|
+
|
24
|
+
module Storexplore
|
25
|
+
|
26
|
+
describe Walker do
|
27
|
+
|
28
|
+
before :each do
|
29
|
+
@page = double("Page", :uri => "http://www.maxi-discount.com")
|
30
|
+
@page_getter = double("Getter", :get => @page, :text => "Conserves")
|
31
|
+
@walker = Walker.new(@page_getter)
|
32
|
+
|
33
|
+
@sub_walkers = [double("Sub walker")]
|
34
|
+
@digger = double(Digger)
|
35
|
+
@digger.stub(:sub_walkers).with(@page, @walker).and_return(@sub_walkers)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "has the uri of its page" do
|
39
|
+
expect(@walker.uri).to eq @page.uri
|
40
|
+
end
|
41
|
+
|
42
|
+
it "it uses the text of its origin (ex: link) as title" do
|
43
|
+
expect(@walker.title).to eq @page_getter.text
|
44
|
+
end
|
45
|
+
|
46
|
+
context "by default" do
|
47
|
+
it "has no items" do
|
48
|
+
expect(@walker.items).to be_empty
|
49
|
+
end
|
50
|
+
it "has no sub categories" do
|
51
|
+
expect(@walker.categories).to be_empty
|
52
|
+
end
|
53
|
+
it "has no attributes" do
|
54
|
+
expect(@walker.attributes).to be_empty
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it "uses its items digger to collect its items" do
|
59
|
+
@walker.items_digger = @digger
|
60
|
+
|
61
|
+
expect(@walker.items).to eq @sub_walkers
|
62
|
+
end
|
63
|
+
it "uses its categories digger to collect its sub categories" do
|
64
|
+
@walker.categories_digger = @digger
|
65
|
+
|
66
|
+
expect(@walker.categories).to eq @sub_walkers
|
67
|
+
end
|
68
|
+
it "uses its scrap attributes block to collect its attributes" do
|
69
|
+
attributes = { :name => "Candy" }
|
70
|
+
@walker.scrap_attributes_block = lambda { |page| attributes }
|
71
|
+
|
72
|
+
expect(@walker.attributes).to eq attributes
|
73
|
+
end
|
74
|
+
|
75
|
+
context "when troubleshooting" do
|
76
|
+
|
77
|
+
it "has a meaningfull string representation" do
|
78
|
+
walker = Walker.new(@page_getter)
|
79
|
+
walker.index= 23
|
80
|
+
expect(walker.to_s).to include(Walker.to_s)
|
81
|
+
expect(walker.to_s).to include("##{walker.index}")
|
82
|
+
expect(walker.to_s).to include("@#{walker.uri}")
|
83
|
+
end
|
84
|
+
it "has a full genealogy" do
|
85
|
+
link = double("Link")
|
86
|
+
link.stub_chain(:get, :uri).and_return(@page.uri + "/viandes")
|
87
|
+
child_walker = Walker.new(link)
|
88
|
+
child_walker.index = 12
|
89
|
+
child_walker.father = @walker
|
90
|
+
|
91
|
+
genealogy = child_walker.genealogy.split("\n")
|
92
|
+
|
93
|
+
expect(genealogy).to eq [@walker.to_s, child_walker.to_s]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# spec_helper.rb
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 by Philippe Bourgau. All rights reserved.
|
6
|
+
#
|
7
|
+
# This library is free software; you can redistribute it and/or
|
8
|
+
# modify it under the terms of the GNU Lesser General Public
|
9
|
+
# License as published by the Free Software Foundation; either
|
10
|
+
# version 3.0 of the License, or (at your option) any later version.
|
11
|
+
#
|
12
|
+
# This library is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
# Lesser General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Lesser General Public
|
18
|
+
# License along with this library; if not, write to the Free Software
|
19
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
20
|
+
# MA 02110-1301 USA
|
21
|
+
|
22
|
+
require 'spec_combos'
|
23
|
+
require 'storexplore'
|
24
|
+
require 'storexplore/testing'
|
25
|
+
|
26
|
+
Storexplore::Testing.config do |config|
|
27
|
+
config.dummy_store_generation_dir= File.join(File.dirname(__FILE__), '../tmp')
|
28
|
+
end
|
data/storexplore.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'storexplore/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "storexplore"
|
8
|
+
spec.version = Storexplore::VERSION
|
9
|
+
spec.authors = ["Philou"]
|
10
|
+
spec.email = ["philippe.bourgau@gmail.com"]
|
11
|
+
spec.description = %q{A declarative scrapping DSL that lets one define directory like apis to an online store}
|
12
|
+
spec.summary = %q{Online store scraping library}
|
13
|
+
spec.homepage = "https://github.com/philou/storexplore"
|
14
|
+
spec.license = "LGPL v3"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "mechanize", "~> 2.0"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.1"
|
25
|
+
spec.add_development_dependency "guard-rspec", "~> 4.0"
|
26
|
+
spec.add_development_dependency "spec_combos", "~> 0.2"
|
27
|
+
end
|
data.tar.gz.sig
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: storexplore
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Philou
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDkjCCAnqgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMRkwFwYDVQQDDBBwaGls
|
14
|
+
aXBwZS5ib3VyZ2F1MRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/Is
|
15
|
+
ZAEZFgNjb20wHhcNMTMwOTIzMTEwOTA3WhcNMTQwOTIzMTEwOTA3WjBHMRkwFwYD
|
16
|
+
VQQDDBBwaGlsaXBwZS5ib3VyZ2F1MRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzAR
|
17
|
+
BgoJkiaJk/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
18
|
+
AQC8CpoqZwEbzXr55EUxdSplgn0MYZ9xPGO/XmRa8bD63n+JYWF0AS+mj452ZY18
|
19
|
+
rwM+yKrKhtsA+aJJdlOafgIUnY5SrZOr7v7kgc6T2YNoUj+M00Um2jv+shQbOtV6
|
20
|
+
qGp0Jw1HfPNUMVa+3pXZyAGCecN6rTnsZJIuW6KNaJUq6lEMVXanoTHgAKrH5aHd
|
21
|
+
Y6ofwQL86d6LDkC1S4p86iMUWvF34w8h5ItVo+JKlPRR22rzsK/ZKgNH3lfjbS6i
|
22
|
+
JWqPva70rL2xz5kCVn6DL7XhNZtqnAO4kvCQyQeWezvcoGXEnbHacKky7B+/WKec
|
23
|
+
OIWEwedl6j+X0OD5OYki3QaTAgMBAAGjgYgwgYUwCQYDVR0TBAIwADALBgNVHQ8E
|
24
|
+
BAMCBLAwHQYDVR0OBBYEFJnLz40Onu/dfpLSipU5FgTy6WLmMCUGA1UdEQQeMByB
|
25
|
+
GnBoaWxpcHBlLmJvdXJnYXVAZ21haWwuY29tMCUGA1UdEgQeMByBGnBoaWxpcHBl
|
26
|
+
LmJvdXJnYXVAZ21haWwuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQBGoH72KWYACGZl
|
27
|
+
cMHMJ9d/DRU7rynJ8c4xuuM4c3Ri8bGPqI/a1BAp4QPJApS4+ANXXJ220hslrekP
|
28
|
+
9/ExEKFiqiywh1clih9ttuN4cHqJzCP6QHqJznQrvaYToZLxGARDf3Mwz4mFSh4W
|
29
|
+
snSep53DZ1vrY2Gzmig/4PuBF4q3nhwPgxV6H3SH4/Py7QF5COZPQlCdBwPYczqW
|
30
|
+
XxIbXhRVXcgjBHT0w2HsXkOwmmYvBzbrfqtTx5NswwHcIeQZB/NID7berIf9awx3
|
31
|
+
yLcl1cmm5ALtJ/+Bkkmp0i4amXeTDMvq9r8PBsVsQwxYOYJBP+Umxz3PX6HjFHrQ
|
32
|
+
XdkXx3oZ
|
33
|
+
-----END CERTIFICATE-----
|
34
|
+
date: 2013-12-29 00:00:00.000000000 Z
|
35
|
+
dependencies:
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: mechanize
|
38
|
+
requirement: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ~>
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '2.0'
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ~>
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '2.0'
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: bundler
|
52
|
+
requirement: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ~>
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '1.3'
|
57
|
+
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '1.3'
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: rake
|
66
|
+
requirement: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ~>
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '10.1'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '10.1'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: guard-rspec
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ~>
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '4.0'
|
85
|
+
type: :development
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ~>
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '4.0'
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: spec_combos
|
94
|
+
requirement: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ~>
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0.2'
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ~>
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0.2'
|
106
|
+
description: A declarative scrapping DSL that lets one define directory like apis
|
107
|
+
to an online store
|
108
|
+
email:
|
109
|
+
- philippe.bourgau@gmail.com
|
110
|
+
executables: []
|
111
|
+
extensions: []
|
112
|
+
extra_rdoc_files: []
|
113
|
+
files:
|
114
|
+
- .gitignore
|
115
|
+
- .rspec
|
116
|
+
- Gemfile
|
117
|
+
- Guardfile
|
118
|
+
- LICENSE
|
119
|
+
- README.md
|
120
|
+
- Rakefile
|
121
|
+
- lib/storexplore.rb
|
122
|
+
- lib/storexplore/api.rb
|
123
|
+
- lib/storexplore/api_builder.rb
|
124
|
+
- lib/storexplore/array_utils.rb
|
125
|
+
- lib/storexplore/browsing_error.rb
|
126
|
+
- lib/storexplore/digger.rb
|
127
|
+
- lib/storexplore/hash_utils.rb
|
128
|
+
- lib/storexplore/null_digger.rb
|
129
|
+
- lib/storexplore/testing.rb
|
130
|
+
- lib/storexplore/testing/api_shared_examples.rb
|
131
|
+
- lib/storexplore/testing/configuration.rb
|
132
|
+
- lib/storexplore/testing/dummy_data.rb
|
133
|
+
- lib/storexplore/testing/dummy_store.rb
|
134
|
+
- lib/storexplore/testing/dummy_store_api.rb
|
135
|
+
- lib/storexplore/testing/dummy_store_constants.rb
|
136
|
+
- lib/storexplore/testing/dummy_store_generator.rb
|
137
|
+
- lib/storexplore/testing/matchers/have_unique_matcher.rb
|
138
|
+
- lib/storexplore/testing/matchers/mostly_matcher.rb
|
139
|
+
- lib/storexplore/uri_utils.rb
|
140
|
+
- lib/storexplore/version.rb
|
141
|
+
- lib/storexplore/walker.rb
|
142
|
+
- lib/storexplore/walker_page.rb
|
143
|
+
- lib/storexplore/walker_page_error.rb
|
144
|
+
- spec/lib/storexplore/api_builder_spec.rb
|
145
|
+
- spec/lib/storexplore/api_spec.rb
|
146
|
+
- spec/lib/storexplore/digger_spec.rb
|
147
|
+
- spec/lib/storexplore/store_walker_page_spec_fixture.html
|
148
|
+
- spec/lib/storexplore/testing/dummy_store_api_spec.rb
|
149
|
+
- spec/lib/storexplore/uri_utils_spec.rb
|
150
|
+
- spec/lib/storexplore/walker_page_spec.rb
|
151
|
+
- spec/lib/storexplore/walker_spec.rb
|
152
|
+
- spec/spec_helper.rb
|
153
|
+
- storexplore.gemspec
|
154
|
+
homepage: https://github.com/philou/storexplore
|
155
|
+
licenses:
|
156
|
+
- LGPL v3
|
157
|
+
metadata: {}
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options: []
|
160
|
+
require_paths:
|
161
|
+
- lib
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - '>='
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
requirements: []
|
173
|
+
rubyforge_project:
|
174
|
+
rubygems_version: 2.0.3
|
175
|
+
signing_key:
|
176
|
+
specification_version: 4
|
177
|
+
summary: Online store scraping library
|
178
|
+
test_files:
|
179
|
+
- spec/lib/storexplore/api_builder_spec.rb
|
180
|
+
- spec/lib/storexplore/api_spec.rb
|
181
|
+
- spec/lib/storexplore/digger_spec.rb
|
182
|
+
- spec/lib/storexplore/store_walker_page_spec_fixture.html
|
183
|
+
- spec/lib/storexplore/testing/dummy_store_api_spec.rb
|
184
|
+
- spec/lib/storexplore/uri_utils_spec.rb
|
185
|
+
- spec/lib/storexplore/walker_page_spec.rb
|
186
|
+
- spec/lib/storexplore/walker_spec.rb
|
187
|
+
- spec/spec_helper.rb
|
metadata.gz.sig
ADDED
Binary file
|