letsshop_mapper 0.9.0beta → 1.0.0
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.
- data/lib/letsshop_mapper.rb +1 -2
- data/lib/letsshop_mapper/connection.rb +3 -1
- data/lib/letsshop_mapper/model/base/category.rb +10 -7
- data/lib/letsshop_mapper/model/base/facet.rb +9 -12
- data/lib/letsshop_mapper/model/base/filter.rb +5 -3
- data/lib/letsshop_mapper/model/opensearch/entry.rb +15 -30
- data/lib/letsshop_mapper/model/opensearch/feed.rb +12 -25
- data/lib/letsshop_mapper/model/tree/tree.rb +7 -7
- data/lib/letsshop_mapper/version.rb +3 -3
- data/test/letsshop_mapper_test.rb +7 -0
- metadata +10 -12
data/lib/letsshop_mapper.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'tempfile'
|
3
|
-
require '
|
3
|
+
require 'nokogiri'
|
4
4
|
|
5
5
|
module LetsShopMapper
|
6
|
-
autoload :REXML, "letsshop_mapper/patch/rexml"
|
7
6
|
autoload :Version, "letsshop_mapper/version"
|
8
7
|
autoload :Connection, "letsshop_mapper/connection"
|
9
8
|
autoload :Error, "letsshop_mapper/exceptions"
|
@@ -8,7 +8,6 @@ module LetsShopMapper
|
|
8
8
|
attr_reader :server
|
9
9
|
attr_reader :key
|
10
10
|
attr_reader :response
|
11
|
-
|
12
11
|
attr_reader :feed
|
13
12
|
attr_reader :tree
|
14
13
|
|
@@ -16,6 +15,7 @@ module LetsShopMapper
|
|
16
15
|
@server = server
|
17
16
|
@key = key
|
18
17
|
end
|
18
|
+
|
19
19
|
def connect_and_get()
|
20
20
|
uri = "http://#{@server}/search/#{@key}"
|
21
21
|
begin
|
@@ -25,6 +25,7 @@ module LetsShopMapper
|
|
25
25
|
raise LetsShopMapper::RequestBaseSearchException::new
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
28
29
|
def find(conditions = {})
|
29
30
|
uri = "http://#{@server}/search/#{@key}"
|
30
31
|
query = "?"
|
@@ -50,6 +51,7 @@ module LetsShopMapper
|
|
50
51
|
raise LetsShopMapper::Error::RequestBaseSearchException::new
|
51
52
|
end
|
52
53
|
end
|
54
|
+
|
53
55
|
def get_tree(category = nil)
|
54
56
|
uri = "http://#{@server}/tree/#{@key}"
|
55
57
|
id = "#{category}" if category != nil
|
@@ -1,38 +1,41 @@
|
|
1
|
-
include REXML
|
2
1
|
module LetsShopMapper
|
3
2
|
module Model
|
4
3
|
module Base
|
5
4
|
class Category
|
6
5
|
attr_accessor :id
|
7
6
|
attr_accessor :name
|
8
|
-
attr_reader
|
9
|
-
attr_reader
|
7
|
+
attr_reader :children
|
8
|
+
attr_reader :filters
|
10
9
|
|
11
10
|
def initialize()
|
12
11
|
@id, @name = nil
|
13
12
|
@children = []
|
14
13
|
@filters = []
|
15
14
|
end
|
15
|
+
|
16
16
|
def recurse(category, par = nil)
|
17
|
-
category.
|
17
|
+
category.children.each do |child|
|
18
18
|
if child.name == "category"
|
19
19
|
chl = add_category(child)
|
20
20
|
par.children << chl
|
21
21
|
elsif child.name == "filter"
|
22
|
-
par.filters << Filter::new(child
|
22
|
+
par.filters << Filter::new(child['value'])
|
23
23
|
end
|
24
24
|
recurse(child, chl)
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
27
28
|
def add_category(category)
|
28
29
|
c = Category::new
|
29
|
-
c.name = category.
|
30
|
-
c.id = category.
|
30
|
+
c.name = category.at("name").text
|
31
|
+
c.id = category.at("name")['id']
|
31
32
|
return c
|
32
33
|
end
|
34
|
+
|
33
35
|
def to_map
|
34
36
|
{@name => @children.empty? ? nil : @children.map {|child| child.to_map}}
|
35
37
|
end
|
38
|
+
|
36
39
|
def to_s(localtime = true)
|
37
40
|
self.to_map.to_yaml
|
38
41
|
end
|
@@ -8,12 +8,9 @@ module LetsShopMapper
|
|
8
8
|
attr_reader :role
|
9
9
|
attr_reader :selected
|
10
10
|
attr_reader :nhits
|
11
|
-
|
12
|
-
attr_reader :feed
|
13
11
|
attr_reader :xml
|
14
12
|
|
15
|
-
def initialize(facet = nil
|
16
|
-
@feed = feed
|
13
|
+
def initialize(facet = nil)
|
17
14
|
@xml = facet
|
18
15
|
@title, @type, @filter, @role, @selected, @nhits = nil
|
19
16
|
@selected = false
|
@@ -21,15 +18,15 @@ module LetsShopMapper
|
|
21
18
|
end
|
22
19
|
|
23
20
|
def parse(facet)
|
24
|
-
@title = facet
|
25
|
-
@type = facet
|
26
|
-
@filter = Filter::new(facet
|
27
|
-
@role = facet
|
28
|
-
if facet
|
29
|
-
@nhits = facet
|
21
|
+
@title = facet['title'].split(":")[1]
|
22
|
+
@type = facet['title'].split(":")[0]
|
23
|
+
@filter = Filter::new(facet['title'])
|
24
|
+
@role = facet['role']
|
25
|
+
if facet['nhits']
|
26
|
+
@nhits = facet['nhits']
|
30
27
|
end
|
31
|
-
if facet
|
32
|
-
@selected = LetsShopMapper.Boolean(facet
|
28
|
+
if facet['selected']
|
29
|
+
@selected = LetsShopMapper.Boolean(facet['selected'])
|
33
30
|
end
|
34
31
|
end
|
35
32
|
|
@@ -12,11 +12,13 @@ module LetsShopMapper
|
|
12
12
|
@depend = false
|
13
13
|
parse(filtr) if filtr
|
14
14
|
end
|
15
|
+
|
15
16
|
def parse(filtr)
|
16
|
-
@str_value = filtr
|
17
|
-
@key = filtr.
|
18
|
-
@value = filtr.
|
17
|
+
@str_value = filtr
|
18
|
+
@key = filtr.split(":")[0]
|
19
|
+
@value = filtr.split(":")[1]
|
19
20
|
end
|
21
|
+
|
20
22
|
def to_s(localtime = true)
|
21
23
|
s = ''
|
22
24
|
s += "Key: #{@key}\n"
|
@@ -13,47 +13,32 @@ module LetsShopMapper
|
|
13
13
|
attr_reader :thumb
|
14
14
|
attr_reader :supplier
|
15
15
|
attr_reader :facets
|
16
|
-
|
17
|
-
attr_reader :feed
|
18
16
|
attr_reader :xml
|
19
17
|
|
20
|
-
def initialize(entry = nil
|
21
|
-
@feed = feed
|
18
|
+
def initialize(entry = nil)
|
22
19
|
@xml = entry
|
23
20
|
@id, @link, @title, @description, @price, @thumb, @supplier = nil
|
24
21
|
@facets = []
|
25
22
|
parse(entry) if entry
|
26
23
|
end
|
27
24
|
|
28
|
-
# parse entry
|
29
25
|
def parse(entry)
|
30
|
-
@id = entry.
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
@
|
42
|
-
|
43
|
-
|
44
|
-
@price = e.text
|
45
|
-
@currency = e.attributes.get_attribute("currency").value
|
46
|
-
@discount = e.attributes.get_attribute("discount").value
|
47
|
-
@older_price = e.attributes.get_attribute("older").value
|
48
|
-
end
|
49
|
-
entry.each_element('Query') do |f|
|
50
|
-
if !f.attributes.get_attribute("title").value.index("supplier:").nil?
|
51
|
-
@supplier = f.attributes.get_attribute("title").value.gsub("supplier:","")
|
26
|
+
@id = entry.at('id').text
|
27
|
+
@link = entry.at('link')['href']
|
28
|
+
@title = entry.at('title').text
|
29
|
+
@description = entry.at('description').text
|
30
|
+
@thumb =entry.at('letsshop/thumb').text
|
31
|
+
@price = entry.at('letsshop/price').text
|
32
|
+
@currency = entry.at('letsshop/price')['currency']
|
33
|
+
@discount = entry.at('letsshop/price')['discount']
|
34
|
+
@older_price = entry.at('letsshop/price')['older']
|
35
|
+
|
36
|
+
entry.children.search('Query').each do |f|
|
37
|
+
@facets << Base::Facet::new(f)
|
38
|
+
if !f['title'].index("supplier:").nil?
|
39
|
+
@supplier = f['title'].gsub("supplier:","")
|
52
40
|
end
|
53
41
|
end
|
54
|
-
entry.each_element('Query') do |e|
|
55
|
-
@facets << Base::Facet::new(e, self)
|
56
|
-
end
|
57
42
|
end
|
58
43
|
|
59
44
|
def get_facets_by(scope)
|
@@ -8,9 +8,7 @@ module LetsShopMapper
|
|
8
8
|
attr_reader :startindex
|
9
9
|
attr_reader :itemsperpage
|
10
10
|
attr_reader :totalresults
|
11
|
-
|
12
11
|
attr_reader :facets
|
13
|
-
|
14
12
|
attr_reader :xml
|
15
13
|
attr_reader :encoding
|
16
14
|
|
@@ -22,32 +20,21 @@ module LetsShopMapper
|
|
22
20
|
end
|
23
21
|
|
24
22
|
def parse(str)
|
25
|
-
|
26
|
-
@
|
27
|
-
@
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
@link = e.attribute('href').value
|
34
|
-
end
|
35
|
-
if (e = doc.root.elements['/feed/startIndex']) && e.text
|
36
|
-
@startindex = e.text
|
37
|
-
end
|
38
|
-
if (e = doc.root.elements['/feed/itemsPerPage']) && e.text
|
39
|
-
@itemsperpage = e.text
|
40
|
-
end
|
41
|
-
if (e = doc.root.elements['/feed/totalResults']) && e.text
|
42
|
-
@totalresults = e.text
|
43
|
-
end
|
23
|
+
@xml = Nokogiri::XML(str)
|
24
|
+
@encoding = @xml.encoding
|
25
|
+
if @xml.at('/xmlns:feed')
|
26
|
+
@title = @xml.at('/xmlns:feed/xmlns:title').text
|
27
|
+
@link = @xml.at('/xmlns:feed/xmlns:link')['href']
|
28
|
+
@startindex = @xml.at('/xmlns:feed/xmlns:startIndex').text
|
29
|
+
@itemsperpage = @xml.at('/xmlns:feed/xmlns:itemsPerPage').text
|
30
|
+
@totalresults = @xml.at('/xmlns:feed/xmlns:totalResults').text
|
44
31
|
# Facets
|
45
|
-
|
46
|
-
|
32
|
+
@xml.xpath('/xmlns:feed/xmlns:Query[@role="subset"]').each do |f|
|
33
|
+
@facets << Base::Facet::new(f)
|
47
34
|
end
|
48
35
|
# Entries
|
49
|
-
|
50
|
-
@entries << Entry::new(e
|
36
|
+
@xml.xpath('/xmlns:feed/xmlns:entry').each do |e|
|
37
|
+
@entries << Entry::new(e)
|
51
38
|
end
|
52
39
|
else
|
53
40
|
raise LetsShopMapper::Error::UnknownFeedTypeException::new
|
@@ -3,22 +3,21 @@ module LetsShopMapper
|
|
3
3
|
module Tree
|
4
4
|
class Tree
|
5
5
|
attr_reader :categories
|
6
|
-
|
7
6
|
attr_reader :xml
|
8
7
|
|
9
8
|
def initialize(str = nil)
|
10
9
|
parse(str) if str
|
11
10
|
end
|
11
|
+
|
12
12
|
def parse(str)
|
13
|
-
|
14
|
-
@xml
|
15
|
-
|
16
|
-
doc.root.each_element('/categories/category') do |c|
|
13
|
+
@xml = Nokogiri::XML(str)
|
14
|
+
if @xml.at('/categories')
|
15
|
+
@xml.xpath('/categories/category').each do |c|
|
17
16
|
@categories = Base::Category::new
|
18
17
|
@categories.recurse(c, @categories)
|
19
18
|
end
|
20
|
-
elsif
|
21
|
-
|
19
|
+
elsif @xml.at('/category')
|
20
|
+
@xml.xpath('/category').each do |c|
|
22
21
|
@categories = Base::Category::new
|
23
22
|
@categories.recurse(c, @categories)
|
24
23
|
end
|
@@ -26,6 +25,7 @@ module LetsShopMapper
|
|
26
25
|
raise LetsShopMapper::Error::UnknownFeedTypeException::new
|
27
26
|
end
|
28
27
|
end
|
28
|
+
|
29
29
|
def to_s(localtime = true)
|
30
30
|
s = @categories.to_s(localtime)
|
31
31
|
end
|
@@ -111,6 +111,13 @@ module LetsShopMapper
|
|
111
111
|
assert_equal "11", lshopTree.categories.children[0].children[0].children[4].id.split('-')[1]
|
112
112
|
end
|
113
113
|
end
|
114
|
+
def test_tree_perf
|
115
|
+
config = YAML.load_file('test/letsshop.yml')['development']
|
116
|
+
lshop = LetsShopMapper::Connection::Base::new(config["server"], config["key"])
|
117
|
+
tstart = Time.now.to_f
|
118
|
+
lshop.get_tree()
|
119
|
+
puts "Time elapsed: #{Time.now.to_f-tstart}"
|
120
|
+
end
|
114
121
|
def test_tree
|
115
122
|
config = YAML.load_file('test/letsshop.yml')['development']
|
116
123
|
lshop = LetsShopMapper::Connection::Base::new(config["server"], config["key"])
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: letsshop_mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
6
|
segments:
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 0.9.0beta
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- happun
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-23 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -71,14 +71,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
71
71
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
|
-
- - "
|
74
|
+
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
hash:
|
76
|
+
hash: 3
|
77
77
|
segments:
|
78
|
-
-
|
79
|
-
|
80
|
-
- 1
|
81
|
-
version: 1.3.1
|
78
|
+
- 0
|
79
|
+
version: "0"
|
82
80
|
requirements: []
|
83
81
|
|
84
82
|
rubyforge_project: letsshop_mapper
|