storexplore 0.0.1
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.
- 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
|