storexplore 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.gitignore +26 -0
  4. data/.rspec +1 -0
  5. data/Gemfile +4 -0
  6. data/Guardfile +9 -0
  7. data/LICENSE +165 -0
  8. data/README.md +29 -0
  9. data/Rakefile +1 -0
  10. data/lib/storexplore/api.rb +63 -0
  11. data/lib/storexplore/api_builder.rb +68 -0
  12. data/lib/storexplore/array_utils.rb +36 -0
  13. data/lib/storexplore/browsing_error.rb +26 -0
  14. data/lib/storexplore/digger.rb +35 -0
  15. data/lib/storexplore/hash_utils.rb +56 -0
  16. data/lib/storexplore/null_digger.rb +30 -0
  17. data/lib/storexplore/testing/api_shared_examples.rb +140 -0
  18. data/lib/storexplore/testing/configuration.rb +56 -0
  19. data/lib/storexplore/testing/dummy_data.rb +67 -0
  20. data/lib/storexplore/testing/dummy_store.rb +195 -0
  21. data/lib/storexplore/testing/dummy_store_api.rb +54 -0
  22. data/lib/storexplore/testing/dummy_store_constants.rb +31 -0
  23. data/lib/storexplore/testing/dummy_store_generator.rb +65 -0
  24. data/lib/storexplore/testing/matchers/have_unique_matcher.rb +74 -0
  25. data/lib/storexplore/testing/matchers/mostly_matcher.rb +45 -0
  26. data/lib/storexplore/testing.rb +30 -0
  27. data/lib/storexplore/uri_utils.rb +38 -0
  28. data/lib/storexplore/version.rb +24 -0
  29. data/lib/storexplore/walker.rb +84 -0
  30. data/lib/storexplore/walker_page.rb +142 -0
  31. data/lib/storexplore/walker_page_error.rb +25 -0
  32. data/lib/storexplore.rb +34 -0
  33. data/spec/lib/storexplore/api_builder_spec.rb +99 -0
  34. data/spec/lib/storexplore/api_spec.rb +44 -0
  35. data/spec/lib/storexplore/digger_spec.rb +53 -0
  36. data/spec/lib/storexplore/store_walker_page_spec_fixture.html +21 -0
  37. data/spec/lib/storexplore/testing/dummy_store_api_spec.rb +120 -0
  38. data/spec/lib/storexplore/uri_utils_spec.rb +51 -0
  39. data/spec/lib/storexplore/walker_page_spec.rb +120 -0
  40. data/spec/lib/storexplore/walker_spec.rb +97 -0
  41. data/spec/spec_helper.rb +28 -0
  42. data/storexplore.gemspec +27 -0
  43. data.tar.gz.sig +0 -0
  44. metadata +187 -0
  45. 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
@@ -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
@@ -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