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