storexplore 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/storexplore.rb +1 -1
- data/lib/storexplore/api.rb +10 -14
- data/lib/storexplore/array_utils.rb +1 -1
- data/lib/storexplore/browsing_error.rb +3 -2
- data/lib/storexplore/digger.rb +1 -1
- data/lib/storexplore/dsl.rb +21 -2
- data/lib/storexplore/hash_utils.rb +1 -1
- data/lib/storexplore/null_digger.rb +1 -1
- data/lib/storexplore/testing.rb +1 -1
- data/lib/storexplore/testing/api_shared_examples.rb +1 -1
- data/lib/storexplore/testing/configuration.rb +18 -8
- data/lib/storexplore/testing/dummy_data.rb +5 -1
- data/lib/storexplore/testing/dummy_store.rb +27 -1
- data/lib/storexplore/testing/dummy_store_api.rb +4 -1
- data/lib/storexplore/testing/dummy_store_constants.rb +1 -1
- data/lib/storexplore/testing/dummy_store_generator.rb +15 -1
- data/lib/storexplore/testing/matchers/have_unique_matcher.rb +1 -1
- data/lib/storexplore/testing/matchers/mostly_matcher.rb +1 -1
- data/lib/storexplore/uri_utils.rb +1 -1
- data/lib/storexplore/version.rb +2 -2
- data/lib/storexplore/walker.rb +15 -1
- data/lib/storexplore/walker_page.rb +15 -1
- data/lib/storexplore/walker_page_error.rb +3 -1
- data/spec/lib/storexplore/api_spec.rb +1 -1
- data/spec/lib/storexplore/dsl_spec.rb +1 -1
- data/spec/lib/storexplore/testing/dummy_store_api_spec.rb +1 -1
- data/spec/lib/storexplore/uri_utils_spec.rb +1 -1
- data/spec/lib/storexplore/walker_page_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ffcb1b7ac49f590bdeafde98b7c6e3f6a4aecb8
|
4
|
+
data.tar.gz: fbb03b9a51c7eab05ffea0d1498cf5b8f15413ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94933a0836b830b49ac03fe4f604bf9f8be35cf6e1518a1ceb92b42ae03f76deb7d10e7e9a38cbff4753ea1a8eb3c4607d82445e28397ff3e45f1053bb2306ce
|
7
|
+
data.tar.gz: 94c3a3291e638198fba5b19071449eeaa40cfbaac57db6cb28cb4f7294c515d4a895524448e618aad404dd412bff240eb386e99a329046dda79ba2a0e2e2766e
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/storexplore.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# storexplore.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
data/lib/storexplore/api.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# api.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -21,35 +21,31 @@
|
|
21
21
|
|
22
22
|
module Storexplore
|
23
23
|
|
24
|
-
#
|
24
|
+
# Main entry point to the library
|
25
25
|
class Api
|
26
26
|
|
27
|
+
# Defines a new store API, with a name and a definition inside the given
|
28
|
+
# block. The block is evaluated in the context of a Storexplore::Dsl
|
29
|
+
# instance, see README
|
27
30
|
def self.define(name, &block)
|
28
31
|
builder = Dsl.walker_builder(&block)
|
29
32
|
|
30
33
|
register_builder(name, builder)
|
31
34
|
end
|
32
35
|
|
36
|
+
# Starts to browse a real store. Uses the first defined API whose name is
|
37
|
+
# included in the url of the store.
|
38
|
+
# Returns a Storexplore::Walker for the home page of the store
|
33
39
|
def self.browse(store_url)
|
34
40
|
builder(store_url).new_walker(WalkerPage.open(store_url))
|
35
41
|
end
|
36
42
|
|
43
|
+
# Forgets the previously defined store API by its name. Mainly useful while
|
44
|
+
# testing.
|
37
45
|
def self.undef(name)
|
38
46
|
builders.delete(name)
|
39
47
|
end
|
40
48
|
|
41
|
-
# Uri of the main page of the store
|
42
|
-
# def uri
|
43
|
-
|
44
|
-
# Attributes of the page
|
45
|
-
# def attributes
|
46
|
-
|
47
|
-
# Walkers of the root categories of the store
|
48
|
-
# def categories
|
49
|
-
|
50
|
-
# Walkers of the root items in the store
|
51
|
-
# def items
|
52
|
-
|
53
49
|
private
|
54
50
|
|
55
51
|
def self.register_builder(name, builder)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# array_utils.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2012
|
5
|
+
# Copyright (c) 2012-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# browsing_error.rh
|
4
4
|
#
|
5
|
-
# Copyright (c) 2011
|
5
|
+
# Copyright (c) 2011-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -20,7 +20,8 @@
|
|
20
20
|
# MA 02110-1301 USA
|
21
21
|
|
22
22
|
module Storexplore
|
23
|
-
#
|
23
|
+
# Exception thrown by Storexplore::Walker when store item browsing fails due
|
24
|
+
# to unexpected page formatting
|
24
25
|
class BrowsingError < StandardError
|
25
26
|
end
|
26
27
|
end
|
data/lib/storexplore/digger.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# digger.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
data/lib/storexplore/dsl.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# dsl.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2011
|
5
|
+
# Copyright (c) 2011-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -21,32 +21,51 @@
|
|
21
21
|
|
22
22
|
module Storexplore
|
23
23
|
|
24
|
+
# Implementation of the DSL used to define new APIs on real web stores.
|
25
|
+
# See README for examples
|
24
26
|
class Dsl
|
25
27
|
|
28
|
+
# Starts the definition of the API. Evaluates the block with the
|
29
|
+
# context of an instance of Storexplore::Dsl
|
26
30
|
def self.walker_builder(&block)
|
27
31
|
new.tap do |dsl|
|
28
32
|
dsl.instance_eval(&block)
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
32
|
-
|
36
|
+
# Initializes a new instance with no special categories, items or
|
37
|
+
# attributes definition. (Internal usage)
|
38
|
+
def initialize
|
33
39
|
@scrap_attributes_block = lambda do |_| {} end
|
34
40
|
@categories_digger = NullDigger.new
|
35
41
|
@items_digger = NullDigger.new
|
36
42
|
end
|
37
43
|
|
44
|
+
# Registers the block to be used to extract attributes from a store page.
|
45
|
+
# Block will be evaluated within the context of a Storexplore::WalkerPage
|
38
46
|
def attributes(&block)
|
39
47
|
@scrap_attributes_block = block
|
40
48
|
end
|
41
49
|
|
50
|
+
# Defines how to find child categories.
|
51
|
+
# * selector is the nokogiri selector to match links to these categories
|
52
|
+
# * the block defines how to scrap these children categories, will
|
53
|
+
# be evaluated within the context of the child Storexplore::Dsl instance
|
42
54
|
def categories(selector, &block)
|
43
55
|
@categories_digger = Digger.new(selector, Dsl.walker_builder(&block))
|
44
56
|
end
|
45
57
|
|
58
|
+
# Same as #categories, but for child items
|
46
59
|
def items(selector, &block)
|
47
60
|
@items_digger = Digger.new(selector, Dsl.walker_builder(&block))
|
48
61
|
end
|
49
62
|
|
63
|
+
# Initializes a new Storexplore::Walker instance based on specified custom
|
64
|
+
# definitions from the instance.
|
65
|
+
# * page_getter : proxy to the page that we want to explore
|
66
|
+
# * father : parent Storexplore::Walker instance (troubleshouting)
|
67
|
+
# * index : index of the page within its brothers
|
68
|
+
# (Internal usage)
|
50
69
|
def new_walker(page_getter, father = nil, index = nil)
|
51
70
|
Walker.new(page_getter).tap do |walker|
|
52
71
|
walker.categories_digger = @categories_digger
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# hash_utils.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2012
|
5
|
+
# Copyright (c) 2012-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# null_digger.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
data/lib/storexplore/testing.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# storexplore.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# api_shared_examples.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# configuration.rb
|
4
4
|
#
|
5
|
-
# Copyright (c)
|
5
|
+
# Copyright (c) 2013-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -22,8 +22,12 @@
|
|
22
22
|
require 'logger'
|
23
23
|
|
24
24
|
module Storexplore
|
25
|
+
|
26
|
+
# Extra facilities to ease testing custom store APIs.
|
25
27
|
module Testing
|
26
28
|
|
29
|
+
# Call this with a block to initialize Storexplore::Testing. The given
|
30
|
+
# block receives the Storexplore::Testing::Configuration as argument.
|
27
31
|
def self.config
|
28
32
|
@config ||= Configuration.new
|
29
33
|
yield @config if block_given?
|
@@ -37,18 +41,24 @@ module Storexplore
|
|
37
41
|
@logger.level = Logger::INFO
|
38
42
|
end
|
39
43
|
|
40
|
-
#
|
41
|
-
# A sub folder with name
|
42
|
-
#
|
44
|
+
# Sets the generation directory where the dummy stores will be generated.
|
45
|
+
# A sub folder with name Storexplore::DummyStoreConstants#NAME will be
|
46
|
+
# created there to holdvall generated dummy stores, the content of this
|
47
|
+
# directory will be deleted when the Storexplore::DummyStore#wipeout
|
48
|
+
# method is called.
|
49
|
+
# This setup is required to use Storexplore::Testing.
|
50
|
+
def dummy_store_generation_dir=(generation_dir)
|
51
|
+
@generation_dir = generation_dir
|
52
|
+
end
|
53
|
+
# See #dummy_store_generation_dir=.
|
54
|
+
# Throws if no generation dir was previously set
|
43
55
|
def dummy_store_generation_dir
|
44
56
|
raise StandardError.new('You need to configure a dummy store generation directory with Storexplore::Testing.config.dummy_store_generation_dir=') if @generation_dir.nil?
|
45
57
|
@generation_dir
|
46
58
|
end
|
47
|
-
def dummy_store_generation_dir=(generation_dir)
|
48
|
-
@generation_dir = generation_dir
|
49
|
-
end
|
50
59
|
|
51
|
-
# Logger for custom test messages
|
60
|
+
# Logger for custom test messages. By default, it logs to STDOUT with
|
61
|
+
# info level.
|
52
62
|
attr_accessor :logger
|
53
63
|
|
54
64
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# dummy_data.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2012
|
5
|
+
# Copyright (c) 2012-2013 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -22,12 +22,16 @@
|
|
22
22
|
module Storexplore
|
23
23
|
module Testing
|
24
24
|
|
25
|
+
# Dummy data generator for Storexplore::Testing::DummyStore store
|
26
|
+
# generation
|
25
27
|
class DummyData
|
26
28
|
|
29
|
+
# A new unique name.
|
27
30
|
def self.name(kind)
|
28
31
|
"#{kind.capitalize}-#{new_int}"
|
29
32
|
end
|
30
33
|
|
34
|
+
# A new unique set of standard store item attributes.
|
31
35
|
def self.attributes(name, options)
|
32
36
|
{
|
33
37
|
name: name,
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# dummy_store.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2012
|
5
|
+
# Copyright (c) 2012-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -24,76 +24,102 @@ require "fileutils"
|
|
24
24
|
module Storexplore
|
25
25
|
module Testing
|
26
26
|
|
27
|
+
# Read / Write model for a disk html store page. Every modification is
|
28
|
+
# directly saved to the disk, nothing remains in memory.
|
29
|
+
# All stores are generated in a specific subdirectory of
|
30
|
+
# Storexplore::Testing::Configuration #dummy_store_generation_dir /
|
31
|
+
# Storexplore::Testing::DummyStoreConstants #NAME
|
27
32
|
class DummyStore
|
28
33
|
|
34
|
+
# Initializes or opens a dummy store in the 'store_name' subdirectory
|
29
35
|
def self.open(store_name)
|
30
36
|
new(root_path(store_name), store_name)
|
31
37
|
end
|
32
38
|
|
39
|
+
# file:// uri for the place where the 'store_name' store would be
|
40
|
+
# created
|
33
41
|
def self.uri(store_name)
|
34
42
|
"file://#{root_path(store_name)}"
|
35
43
|
end
|
36
44
|
|
45
|
+
# Deletes from disk all generated dummy stores
|
37
46
|
def self.wipe_out
|
38
47
|
FileUtils.rm_rf(root_dir)
|
39
48
|
end
|
49
|
+
# Deletes from disk the 'store_name' dummy store
|
40
50
|
def self.wipe_out_store(store_name)
|
41
51
|
FileUtils.rm_rf(root_path(store_name))
|
42
52
|
end
|
43
53
|
|
54
|
+
# file:// uri of the page
|
44
55
|
def uri
|
45
56
|
"file://#{@path}"
|
46
57
|
end
|
47
58
|
|
59
|
+
# Name of the page
|
48
60
|
attr_reader :name
|
49
61
|
|
62
|
+
# Child Storexplore::Testing::DummyStore instances for existing sub
|
63
|
+
# categories
|
50
64
|
def categories
|
51
65
|
_name, categories, _items, _attributes = read
|
52
66
|
categories.map do |category_name|
|
53
67
|
DummyStore.new("#{absolute_category_dir(category_name)}/index.html", category_name)
|
54
68
|
end
|
55
69
|
end
|
70
|
+
# Child category Storexplore::Testing::DummyStore instance with the
|
71
|
+
# specified name. Creates it if it does not yet exist
|
56
72
|
def category(category_name)
|
57
73
|
short_category_name = short_name(category_name)
|
58
74
|
add([short_category_name], [], {})
|
59
75
|
DummyStore.new("#{absolute_category_dir(short_category_name)}/index.html", category_name)
|
60
76
|
end
|
77
|
+
# Deletes the specified child category.
|
61
78
|
def remove_category(category_name)
|
62
79
|
short_category_name = short_name(category_name)
|
63
80
|
remove([short_category_name], [], [])
|
64
81
|
FileUtils.rm_rf(absolute_category_dir(short_category_name))
|
65
82
|
end
|
66
83
|
|
84
|
+
# Child Storexplore::Testing::DummyStore instances for existing sub
|
85
|
+
# items
|
67
86
|
def items
|
68
87
|
_name, _categories, items, _attributes = read
|
69
88
|
items.map do |item_name|
|
70
89
|
DummyStore.new(absolute_item_file(item_name), item_name)
|
71
90
|
end
|
72
91
|
end
|
92
|
+
# Child item Storexplore::Testing::DummyStore instance with the
|
93
|
+
# specified name. Creates it if it does not yet exist
|
73
94
|
def item(item_name)
|
74
95
|
short_item_name = short_name(item_name)
|
75
96
|
add([], [short_item_name], {})
|
76
97
|
DummyStore.new(absolute_item_file(short_item_name), item_name)
|
77
98
|
end
|
99
|
+
# Deletes the specified child item.
|
78
100
|
def remove_item(item_name)
|
79
101
|
short_item_name = short_name(item_name)
|
80
102
|
remove([], [short_item_name], [])
|
81
103
|
FileUtils.rm_rf(absolute_item_file(short_item_name))
|
82
104
|
end
|
83
105
|
|
106
|
+
# Hash of the current attributes
|
84
107
|
def attributes(*args)
|
85
108
|
return add_attributes(args[0]) if args.size == 1
|
86
109
|
|
87
110
|
_name, _categories, _items, attributes = read
|
88
111
|
HashUtils.internalize_keys(attributes)
|
89
112
|
end
|
113
|
+
# Adds the specified attributes
|
90
114
|
def add_attributes(values)
|
91
115
|
add([], [], HashUtils.stringify_keys(values))
|
92
116
|
end
|
117
|
+
# Removes the specified attriutes
|
93
118
|
def remove_attributes(*attribute_names)
|
94
119
|
remove([], [], ArrayUtils.stringify(attribute_names))
|
95
120
|
end
|
96
121
|
|
122
|
+
# New Storexplore::Testing::DummyStoreGenerator instance for this
|
97
123
|
def generate(count = 1)
|
98
124
|
DummyStoreGenerator.new([self], count)
|
99
125
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# dummy_store_api.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2012
|
5
|
+
# Copyright (c) 2012-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -24,6 +24,9 @@ require_relative 'dummy_store_constants'
|
|
24
24
|
module Storexplore
|
25
25
|
module Testing
|
26
26
|
|
27
|
+
# API definition for stores generated Storexplore::DummyStore
|
28
|
+
# This file can be included on its own, without storexplore/testing.rb and
|
29
|
+
# without the need for all the runtime testing dependencies (rspec, etc).
|
27
30
|
Storexplore::Api.define DummyStoreConstants::NAME do
|
28
31
|
|
29
32
|
categories 'a.category' do
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# dummy_store_constants.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2013 by Philippe Bourgau. All rights reserved.
|
5
|
+
# Copyright (c) 2013-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# dummy_store_generator.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2012
|
5
|
+
# Copyright (c) 2012-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -22,27 +22,41 @@
|
|
22
22
|
module Storexplore
|
23
23
|
module Testing
|
24
24
|
|
25
|
+
# Dummy store generation one liner. Forwards chains of method calls to a
|
26
|
+
# collections of Storexplore::Testing::DummyStore instances.
|
25
27
|
class DummyStoreGenerator
|
28
|
+
|
29
|
+
# * pages : collection of Storexplore::Testing::DummyStore instances to
|
30
|
+
# which calls will be forwarded
|
31
|
+
# * count : number of children (categories or items) that will be added
|
32
|
+
# with every generation call
|
26
33
|
def initialize(pages, count = 1)
|
27
34
|
@pages = pages
|
28
35
|
@count = count
|
29
36
|
end
|
30
37
|
|
38
|
+
# Changes the number of generated children
|
31
39
|
def and(count)
|
32
40
|
@count = count
|
33
41
|
self
|
34
42
|
end
|
35
43
|
|
44
|
+
# Generates @count categories on all @pages
|
36
45
|
def categories
|
37
46
|
dispatch(:category)
|
38
47
|
end
|
48
|
+
# See #categories
|
39
49
|
alias_method :category, :categories
|
40
50
|
|
51
|
+
# Generates @count items with attributes on all @pages
|
41
52
|
def items
|
42
53
|
dispatch(:item).attributes
|
43
54
|
end
|
55
|
+
# See #items
|
44
56
|
alias_method :item, :items
|
45
57
|
|
58
|
+
# generates attributes for all @pages. Explicit attributes can be
|
59
|
+
# specified
|
46
60
|
def attributes(options = {})
|
47
61
|
@pages.map do |page|
|
48
62
|
attributes = DummyData.attributes(page.name, options)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# have_unique_matcher.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# mostly_matcher.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# uri.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2011
|
5
|
+
# Copyright (c) 2011-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
data/lib/storexplore/version.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# version.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -20,5 +20,5 @@
|
|
20
20
|
# MA 02110-1301 USA
|
21
21
|
|
22
22
|
module Storexplore
|
23
|
-
VERSION = "0.1.
|
23
|
+
VERSION = "0.1.1"
|
24
24
|
end
|
data/lib/storexplore/walker.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# walker.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -21,8 +21,10 @@
|
|
21
21
|
|
22
22
|
module Storexplore
|
23
23
|
|
24
|
+
# Objects representing categories and items of the store. These are the instances manipulated when browsing a previously defined store
|
24
25
|
class Walker
|
25
26
|
|
27
|
+
# Internal usage
|
26
28
|
attr_accessor :categories_digger, :items_digger, :scrap_attributes_block, :father, :index
|
27
29
|
|
28
30
|
def initialize(getter)
|
@@ -32,30 +34,42 @@ module Storexplore
|
|
32
34
|
@getter = getter
|
33
35
|
end
|
34
36
|
|
37
|
+
# Early title, accessible before the page is loaded.
|
38
|
+
# * for the store root, this is the store uri
|
39
|
+
# * for other pages, it's the caption of the link that brought to this
|
35
40
|
def title
|
36
41
|
@getter.text
|
37
42
|
end
|
38
43
|
|
44
|
+
# Full uri of the page being browsed
|
39
45
|
def uri
|
40
46
|
page.uri
|
41
47
|
end
|
42
48
|
|
49
|
+
# Scraped attributes of this page. Attributes are extracted with the
|
50
|
+
# corresponding attributes blocks given in Storexplore::Dsl
|
43
51
|
def attributes
|
44
52
|
@attributes ||= scrap_attributes
|
45
53
|
end
|
46
54
|
|
55
|
+
# Sub categories Storexplore::Walker, as matched by the corresponding
|
56
|
+
# categories selector in Storexplore::Dsl
|
47
57
|
def categories
|
48
58
|
categories_digger.sub_walkers(page, self)
|
49
59
|
end
|
50
60
|
|
61
|
+
# Sub items Storexplore::Walker, as matched by the corresponding
|
62
|
+
# categories selector in Storexplore::Dsl
|
51
63
|
def items
|
52
64
|
items_digger.sub_walkers(page, self)
|
53
65
|
end
|
54
66
|
|
67
|
+
# String representation with uri and index among siblings.
|
55
68
|
def to_s
|
56
69
|
"#{self.class} ##{index} @#{uri}"
|
57
70
|
end
|
58
71
|
|
72
|
+
# Extended multiline string representation with parents.
|
59
73
|
def genealogy
|
60
74
|
genealogy_prefix + to_s
|
61
75
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# walker_page.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -23,15 +23,22 @@ require 'mechanize'
|
|
23
23
|
|
24
24
|
module Storexplore
|
25
25
|
|
26
|
+
# Wrapper around Mechanize::Page providing strict one liners to select
|
27
|
+
# elements.
|
26
28
|
class WalkerPage
|
27
29
|
extend Forwardable
|
28
30
|
|
31
|
+
# A new lazy proxy on the page.
|
32
|
+
# (Internal Usage)
|
29
33
|
def self.open(uri)
|
30
34
|
Getter.new(uri)
|
31
35
|
end
|
32
36
|
|
37
|
+
# Uri of the page
|
33
38
|
def_delegator :@mechanize_page, :uri
|
34
39
|
|
40
|
+
# Collection of proxies on pages accessible through the matching links
|
41
|
+
# (Internal Usage)
|
35
42
|
def search_links(selector)
|
36
43
|
uri2links = {}
|
37
44
|
search_all_links(selector).each do |link|
|
@@ -42,10 +49,14 @@ module Storexplore
|
|
42
49
|
uri2links.values.sort_by {|link| link.uri.to_s }
|
43
50
|
end
|
44
51
|
|
52
|
+
# Unique element matching selector
|
53
|
+
# Throws Storexplore::WalkerPageError if there is not exactly one matching
|
54
|
+
# element
|
45
55
|
def get_one(selector)
|
46
56
|
first_or_throw(@mechanize_page.search(selector), "elements", selector)
|
47
57
|
end
|
48
58
|
|
59
|
+
# String with the text of all matching elements, separated by separator.
|
49
60
|
def get_all(selector, separator)
|
50
61
|
elements = @mechanize_page.search(selector)
|
51
62
|
throw_if_empty(elements, "elements", selector)
|
@@ -53,6 +64,9 @@ module Storexplore
|
|
53
64
|
(elements.map &:text).join(separator)
|
54
65
|
end
|
55
66
|
|
67
|
+
# Unique image matching selector
|
68
|
+
# Throws Storexplore::WalkerPageError if there is not exactly one matching
|
69
|
+
# image
|
56
70
|
def get_image(selector)
|
57
71
|
first_or_throw(@mechanize_page.images_with(search: selector), "images", selector)
|
58
72
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# walker_page_error.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2010
|
5
|
+
# Copyright (c) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -20,6 +20,8 @@
|
|
20
20
|
# MA 02110-1301 USA
|
21
21
|
|
22
22
|
module Storexplore
|
23
|
+
# Exception thrown by Storexplore::WalkerPage when scrapping fails because
|
24
|
+
# the page does not match the expected format.
|
23
25
|
class WalkerPageError < StandardError
|
24
26
|
end
|
25
27
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# api_spec.rb
|
4
4
|
#
|
5
|
-
# Copyright (C) 2010
|
5
|
+
# Copyright (C) 2010-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# dsl_spec.rb
|
4
4
|
#
|
5
|
-
# Copyright (C) 2012
|
5
|
+
# Copyright (C) 2012-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# dummy_store_api_spec.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2011
|
5
|
+
# Copyright (c) 2011-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# uri_utils.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2011
|
5
|
+
# Copyright (c) 2011-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# walker_page_spec.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2011
|
5
|
+
# Copyright (c) 2011-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
data/spec/spec_helper.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# spec_helper.rb
|
4
4
|
#
|
5
|
-
# Copyright (c) 2013
|
5
|
+
# Copyright (c) 2013-2014 by Philippe Bourgau. All rights reserved.
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: storexplore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Philou
|
@@ -31,7 +31,7 @@ cert_chain:
|
|
31
31
|
yLcl1cmm5ALtJ/+Bkkmp0i4amXeTDMvq9r8PBsVsQwxYOYJBP+Umxz3PX6HjFHrQ
|
32
32
|
XdkXx3oZ
|
33
33
|
-----END CERTIFICATE-----
|
34
|
-
date: 2014-01-
|
34
|
+
date: 2014-01-16 00:00:00.000000000 Z
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: mechanize
|
metadata.gz.sig
CHANGED
Binary file
|