allejest 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +8 -0
- data/LICENSE +20 -0
- data/README.rdoc +18 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/bin/allejest +5 -0
- data/lib/alle_jest/mail.erb +12 -0
- data/lib/allejest.rb +295 -0
- data/nbproject/project.properties +10 -0
- data/nbproject/project.xml +17 -0
- data/spec/allejest_spec.rb +53 -0
- data/spec/fixtures/allegro_canon1022_results.rss +389 -0
- data/spec/fixtures/allejest.yml +9 -0
- data/spec/matchers.rb +62 -0
- data/spec/spec_helper.rb +10 -0
- metadata +146 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Maciej Bilas
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
= allejest
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but
|
13
|
+
bump version in a commit by itself I can ignore when I pull)
|
14
|
+
* Send me a pull request. Bonus points for topic branches.
|
15
|
+
|
16
|
+
== Copyright
|
17
|
+
|
18
|
+
Copyright (c) 2010 Maciej Bilas. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "allejest"
|
8
|
+
gem.summary = %Q{Powiadamia e-mailem o dostępności przedmiotów na allegro}
|
9
|
+
gem.description = %Q{Powiadamia e-mailem o dostępności przedmiotów na allegro.}
|
10
|
+
gem.email = "maciej@inszy.org"
|
11
|
+
gem.homepage = "http://github.com/maciej/allejest"
|
12
|
+
gem.authors = ["Maciej Bilas"]
|
13
|
+
gem.add_development_dependency "rspec"
|
14
|
+
gem.rubyforge_project = %q{allejest}
|
15
|
+
|
16
|
+
gem.add_dependency 'activesupport', '>=2.3.0'
|
17
|
+
gem.add_dependency 'feed_me', '>=0.6.0'
|
18
|
+
gem.add_dependency 'simply_useful', '>=0.1.6'
|
19
|
+
gem.add_dependency 'pony', '>=0.9'
|
20
|
+
|
21
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
22
|
+
end
|
23
|
+
rescue LoadError
|
24
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'spec/rake/spectask'
|
28
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
29
|
+
spec.libs << 'lib' << 'spec'
|
30
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
31
|
+
end
|
32
|
+
|
33
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
34
|
+
spec.libs << 'lib' << 'spec'
|
35
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
36
|
+
spec.rcov = true
|
37
|
+
end
|
38
|
+
|
39
|
+
task :spec => :check_dependencies
|
40
|
+
|
41
|
+
task :default => :spec
|
42
|
+
|
43
|
+
|
44
|
+
require 'rake/rdoctask'
|
45
|
+
Rake::RDocTask.new do |rdoc|
|
46
|
+
if File.exist?('VERSION')
|
47
|
+
version = File.read('VERSION')
|
48
|
+
else
|
49
|
+
version = ""
|
50
|
+
end
|
51
|
+
|
52
|
+
rdoc.rdoc_dir = 'rdoc'
|
53
|
+
rdoc.title = "allejest #{version}"
|
54
|
+
rdoc.rdoc_files.include('README*')
|
55
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
56
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/bin/allejest
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Dear <%= firstname %>,
|
2
|
+
|
3
|
+
Your report has arrived:
|
4
|
+
|
5
|
+
<% results.each do |result| %>
|
6
|
+
New entries are available for: <%= result.title %> (id: <%= result.query[:id] %>)
|
7
|
+
<% result.items.each do |item| %>
|
8
|
+
<%= item.feed_entry.title %> at <%= item.feed_entry.url %>
|
9
|
+
<% end %>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
AlleJest!
|
data/lib/allejest.rb
ADDED
@@ -0,0 +1,295 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
require 'active_support'
|
4
|
+
require 'open-uri'
|
5
|
+
require 'feed_me'
|
6
|
+
require 'cgi'
|
7
|
+
require 'yaml'
|
8
|
+
require 'simply_useful'
|
9
|
+
require 'erb'
|
10
|
+
require 'pathname'
|
11
|
+
require 'net/smtp'
|
12
|
+
require 'time'
|
13
|
+
require 'pony'
|
14
|
+
|
15
|
+
# Text query feed: http://allegro.pl/rss.php?category=0&from_showcat=1&string=canon+10-22&feed=search
|
16
|
+
# Category query feed: http://allegro.pl/rss.php?feed=cat&id=70563
|
17
|
+
# Text and category query feed: http://allegro.pl/rss.php?category=106&sg=0&string=garfield&feed=search
|
18
|
+
|
19
|
+
# Self note:
|
20
|
+
# I always find it hard to design code that is somewhere between a single script
|
21
|
+
# and a full-fledged application (software libraries not included).
|
22
|
+
# So let's keep it as much as possible close to the MVC pattern, as I think it's the most sane one
|
23
|
+
# to go with here.
|
24
|
+
|
25
|
+
# Parameters
|
26
|
+
# string -- for T queries
|
27
|
+
# cateogry -- for T and TC queries
|
28
|
+
# feed -- for C queries
|
29
|
+
# from_showcat -- for C and TC queries
|
30
|
+
# sg -- ??
|
31
|
+
|
32
|
+
module AlleJest
|
33
|
+
class Item
|
34
|
+
include HasAttributes
|
35
|
+
|
36
|
+
attr_accessor :feed_entry, :id
|
37
|
+
|
38
|
+
alias_method :old_initialize, :initialize
|
39
|
+
|
40
|
+
def initialize(args = {})
|
41
|
+
old_initialize(args)
|
42
|
+
|
43
|
+
self.id = feed_entry.item_id
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
class SearchResult
|
49
|
+
include HasAttributes
|
50
|
+
|
51
|
+
attr_accessor :feed, :query, :title, :items
|
52
|
+
|
53
|
+
alias_method :old_initialize, :initialize
|
54
|
+
|
55
|
+
def initialize(args = {})
|
56
|
+
self.items = []
|
57
|
+
old_initialize(args)
|
58
|
+
|
59
|
+
self.title = feed.title.sub("Allegro.pl: ", "")
|
60
|
+
end
|
61
|
+
|
62
|
+
# TODO support non-text queries as well. Write a better matcher after all...
|
63
|
+
def matches_query?
|
64
|
+
self.title == query[:text]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class Reader
|
69
|
+
|
70
|
+
END_POINT = "http://allegro.pl/rss.php?"
|
71
|
+
|
72
|
+
attr_accessor :config
|
73
|
+
|
74
|
+
def initialize(config)
|
75
|
+
self.config = config
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.build_url(query = {})
|
79
|
+
return if query.blank?
|
80
|
+
|
81
|
+
q = END_POINT.dup # dup, because q is appended to
|
82
|
+
|
83
|
+
params = {}
|
84
|
+
if query.has_key?(:text)
|
85
|
+
params[:string] = query[:text]
|
86
|
+
params[:feed] = "search"
|
87
|
+
if !query.has_key?(:category)
|
88
|
+
params[:category] = 0
|
89
|
+
end
|
90
|
+
end
|
91
|
+
if query.has_key?(:category)
|
92
|
+
if query.has_key?(:text)
|
93
|
+
params[:category] = query[:category]
|
94
|
+
else # Category only queries
|
95
|
+
params[:feed] = "cat"
|
96
|
+
params[:id] = query[:category]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Using CGI instead of URI, as CGI produced + for space instead of %20 (that's what we need!)
|
101
|
+
# See http://www.listable.org/show/difference-between-cgiescape-and-uriescape-in-ruby
|
102
|
+
params.each do |k,v|
|
103
|
+
q << "#{k.to_s}=#{CGI.escape(v.to_s)}&"
|
104
|
+
end
|
105
|
+
|
106
|
+
return q[0, q.length - 1] if q[q.length - 1] == ?& # remove trailing '&' if exists
|
107
|
+
q
|
108
|
+
end # build_url
|
109
|
+
|
110
|
+
def get_feed(query)
|
111
|
+
url = AlleJest::Reader.build_url(query)
|
112
|
+
content = ""
|
113
|
+
open(url) {|s| content = s.read }
|
114
|
+
FeedMe.parse(content)
|
115
|
+
end
|
116
|
+
|
117
|
+
def map_feeds_to_queries
|
118
|
+
return nil if config.nil? || config[:queries].nil?
|
119
|
+
|
120
|
+
config[:queries].map do |query|
|
121
|
+
[query, get_feed(query)]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
class Filter
|
128
|
+
include HasAttributes
|
129
|
+
|
130
|
+
# Pruning strategy
|
131
|
+
# prune db every 2 weeks
|
132
|
+
# removing elements that are older than 2 months
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
attr_accessor :filter_db_path, :filter_db
|
137
|
+
|
138
|
+
alias_method :old_initialize, :initialize
|
139
|
+
|
140
|
+
def initialize(args = {})
|
141
|
+
old_initialize(args)
|
142
|
+
read_db
|
143
|
+
end
|
144
|
+
|
145
|
+
def filter results
|
146
|
+
now = Time.now.to_i
|
147
|
+
|
148
|
+
results.dup.each do |result|
|
149
|
+
result.items.reject! do |item|
|
150
|
+
id = item.id
|
151
|
+
unless id.blank?
|
152
|
+
r = filter_db[:reported].has_key? id
|
153
|
+
filter_db[:reported][id] = {:first_seen => now} unless r
|
154
|
+
r
|
155
|
+
else
|
156
|
+
true
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def close
|
163
|
+
prune
|
164
|
+
save_db
|
165
|
+
end
|
166
|
+
|
167
|
+
private
|
168
|
+
def read_db
|
169
|
+
self.filter_db = {}
|
170
|
+
if File.exist?(filter_db_path)
|
171
|
+
f = File.read(filter_db_path)
|
172
|
+
self.filter_db = YAML.load(f) unless f.blank?
|
173
|
+
end
|
174
|
+
self.filter_db.reverse_merge!({:reported => {}, :last_prune => Time.now.to_i})
|
175
|
+
end
|
176
|
+
|
177
|
+
def save_db
|
178
|
+
File.open( filter_db_path, 'w' ) do |out|
|
179
|
+
YAML.dump(filter_db, out)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def prune
|
184
|
+
return if filter_db[:last_prune] + 2.weeks > Time.now.to_i # Return if pruned in the last two weeks
|
185
|
+
|
186
|
+
filter_db[:reported].reject! do |item|
|
187
|
+
item[:first_seen] + 2.months < Time.now.to_i
|
188
|
+
end
|
189
|
+
|
190
|
+
filter_db[:last_prune] = Time.now.to_i
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
class Emailer
|
195
|
+
include HasAttributes
|
196
|
+
|
197
|
+
attr_accessor :firstname, :lastname, :email, :results, :from_email, :from_address, :smtp
|
198
|
+
|
199
|
+
def send_mail
|
200
|
+
raw_erb = File.read(find_erb_path)
|
201
|
+
erb = ERB.new(raw_erb)
|
202
|
+
|
203
|
+
email_body = erb.result(binding) #.gsub(/^\s*/, '')
|
204
|
+
|
205
|
+
pony_opts = {:to => "#{firstname} #{lastname} <#{email}>", :from => from_address,
|
206
|
+
:body => email_body, :subject => "AlleJest report for #{Time.new.rfc2822}" }
|
207
|
+
#puts pony_opts.inspect
|
208
|
+
|
209
|
+
Pony.mail(pony_opts)
|
210
|
+
end
|
211
|
+
|
212
|
+
private
|
213
|
+
def find_erb_path
|
214
|
+
erb_path = nil
|
215
|
+
$:.detect do |base_path|
|
216
|
+
erb_path = if Pathname.new(base_path).absolute?
|
217
|
+
base_path
|
218
|
+
else
|
219
|
+
File.expand_path File.join(Pathname.pwd, base_path)
|
220
|
+
end
|
221
|
+
erb_path = File.join(erb_path, 'alle_jest', 'mail.erb')
|
222
|
+
File.exist?(erb_path)
|
223
|
+
end
|
224
|
+
erb_path
|
225
|
+
end
|
226
|
+
|
227
|
+
end
|
228
|
+
|
229
|
+
# That's awfully, procedurally designed, but I don't care. It should just do it's job.
|
230
|
+
class Runner
|
231
|
+
include AlleJest
|
232
|
+
|
233
|
+
attr_accessor :config
|
234
|
+
|
235
|
+
def initialize(options = {})
|
236
|
+
read_config(options[:config_path]) if options.has_key? :config_path
|
237
|
+
end
|
238
|
+
|
239
|
+
def read_config(path)
|
240
|
+
return nil if path.blank?
|
241
|
+
|
242
|
+
content = File.read(path)
|
243
|
+
self.config = YAML.load(content)
|
244
|
+
config.deep_symbolize_keys! if config.is_a? Hash
|
245
|
+
end
|
246
|
+
|
247
|
+
def run
|
248
|
+
reader = Reader.new(config[:reader])
|
249
|
+
|
250
|
+
# TODO move to Reader
|
251
|
+
feeds = reader.map_feeds_to_queries
|
252
|
+
|
253
|
+
results = feeds.map do |query, feed|
|
254
|
+
result = SearchResult.new(:query => query, :feed => feed)
|
255
|
+
result.items = feed.entries.map do |entry|
|
256
|
+
Item.new(:feed_entry => entry)
|
257
|
+
end
|
258
|
+
result
|
259
|
+
end
|
260
|
+
|
261
|
+
# Filter results not matching the query
|
262
|
+
results.each { |r| r.items = [] if !r.matches_query? }
|
263
|
+
|
264
|
+
# EOT (end of TODO)
|
265
|
+
|
266
|
+
if config[:general].try(:[], :filter) == true # (expr == 0) in Ruby evaluates to true!
|
267
|
+
filter = Filter.new(:filter_db_path => File.join(File.expand_path("~"), ".allejest", 'filter_db.yml'))
|
268
|
+
results = filter.filter(results)
|
269
|
+
filter.close
|
270
|
+
end
|
271
|
+
|
272
|
+
# A singleton method :-) I always wanted to write one
|
273
|
+
def results.blank?
|
274
|
+
return true if self.length == 0
|
275
|
+
self.all? do |r|
|
276
|
+
r.items.blank?
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
# E-mail only if there are results
|
281
|
+
unless results.blank?
|
282
|
+
emailer_config = config[:emailer].slice(:from_address, :smtp)
|
283
|
+
send_to = config[:emailer][:send_to][0].slice(:email, :firstname, :lastname)
|
284
|
+
emailer = Emailer.new(emailer_config.merge!(send_to).merge!({:results => results}))
|
285
|
+
emailer.send_mail
|
286
|
+
end
|
287
|
+
|
288
|
+
end
|
289
|
+
|
290
|
+
def self.main
|
291
|
+
AlleJest::Runner.new(:config_path => File.join(File.expand_path("~"), '.allejest', 'config.yml')).run
|
292
|
+
end
|
293
|
+
|
294
|
+
end
|
295
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project xmlns="http://www.netbeans.org/ns/project/1">
|
3
|
+
<type>org.netbeans.modules.ruby.rubyproject</type>
|
4
|
+
<configuration>
|
5
|
+
<data xmlns="http://www.netbeans.org/ns/ruby-project/1">
|
6
|
+
<name>AlleJest</name>
|
7
|
+
<source-roots>
|
8
|
+
<root id="src.bin.dir" name="Bin Directory"/>
|
9
|
+
<root id="src.dir"/>
|
10
|
+
<root id="src.config.dir" name="Config Files"/>
|
11
|
+
</source-roots>
|
12
|
+
<test-roots>
|
13
|
+
<root id="test.spec.dir" name="Spec Files"/>
|
14
|
+
</test-roots>
|
15
|
+
</data>
|
16
|
+
</configuration>
|
17
|
+
</project>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Note: File.expand_path converts a pathname to an absolute pathname. (still learning)
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
3
|
+
|
4
|
+
# Note: for stubbing and mocking see:
|
5
|
+
# http://rspec.info/documentation/mocks/stubs.html
|
6
|
+
|
7
|
+
require 'uri'
|
8
|
+
|
9
|
+
describe AlleJest::Runner do
|
10
|
+
|
11
|
+
before :each do
|
12
|
+
@alle_jest = AlleJest::Runner.new
|
13
|
+
end
|
14
|
+
|
15
|
+
describe ".read_config" do
|
16
|
+
before :all do
|
17
|
+
@config_path = File.join(File.dirname(__FILE__), 'fixtures', 'allejest.yml')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should read 3 queries" do
|
21
|
+
c = @alle_jest.read_config(@config_path)
|
22
|
+
c[:queries].size.should == 3
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe AlleJest::Reader do
|
30
|
+
|
31
|
+
describe ".build_url" do
|
32
|
+
|
33
|
+
before :each do
|
34
|
+
@q = {:id => "foo"}
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should render simple Text queries like allegro" do
|
38
|
+
@q.merge!(:text => "simple")
|
39
|
+
AlleJest::Reader.build_url(@q).should match_uri("http://allegro.pl/rss.php?category=0&string=simple&feed=search")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should render Text using URL encoding like allegro" do
|
43
|
+
@q.merge!(:text => "not so simple")
|
44
|
+
AlleJest::Reader.build_url(@q).should match_uri("http://allegro.pl/rss.php?category=0&string=not+so+simple&feed=search")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should not return an URL with a trailing &" do
|
48
|
+
@q.merge!(:text => "not so simple")
|
49
|
+
u = AlleJest::Reader.build_url(@q)
|
50
|
+
u[u.length-1].chr.should_not == "&"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,389 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule">
|
3
|
+
<channel>
|
4
|
+
<title>Allegro.pl: canon 10-22</title>
|
5
|
+
<link>http://allegro.pl/search.php?string=canon+10-22</link>
|
6
|
+
<description>Oferty sprzedaży spełniające Twoje kryteria wyszukiwania</description>
|
7
|
+
<lastBuildDate>Fri, 19 Mar 2010 10:25:14 +0100</lastBuildDate>
|
8
|
+
<generator>Allegro RSS Generator ver. 1.30</generator>
|
9
|
+
<item>
|
10
|
+
<title>Osłona EW-83E EW-83 E Canon 17-40/4, 10-22, 20-35</title>
|
11
|
+
<link>http://allegro.pl/show_item.php?item=966299786</link>
|
12
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=126227">kubisek</a><br />
|
13
|
+
Cena Kup Teraz: 30,00 zł<br />
|
14
|
+
Do końca: 13 dni (czw 01 kwi 2010 23:03:28 CEST)<br />
|
15
|
+
<a href="http://allegro.pl/show_item.php?item=966299786">Kup Teraz</a><br />
|
16
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=966299786&name=Os%C5%82ona+EW-83E+EW-83+E+Canon+17-40%2F4%2C+10-22%2C+20-35">Dodaj do obserwowanych aukcji</a><br />
|
17
|
+
<img src="http://img11.allegroimg.pl/photos/128x96/966/29/97/966299786" width="128" height="96" alt="" /><br />
|
18
|
+
</description>
|
19
|
+
<pubDate>Thu, 18 Mar 2010 23:03:28 +0100</pubDate>
|
20
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=966299786</guid>
|
21
|
+
</item>
|
22
|
+
<item>
|
23
|
+
<title>Canon 10-22 mm f/3.5-4.5 EF-S USM SKLEP LESZNO</title>
|
24
|
+
<link>http://allegro.pl/show_item.php?item=964454954</link>
|
25
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=5790374">Filip871</a><br />
|
26
|
+
Cena Kup Teraz: 2 659,00 zł<br />
|
27
|
+
Do końca: 13 dni (czw 01 kwi 2010 16:11:46 CEST)<br />
|
28
|
+
<a href="http://allegro.pl/show_item.php?item=964454954">Kup Teraz</a><br />
|
29
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=964454954&name=Canon+10-22+mm+f%2F3.5-4.5+EF-S+USM++SKLEP+LESZNO">Dodaj do obserwowanych aukcji</a><br />
|
30
|
+
<img src="http://img20.allegroimg.pl/photos/128x96/964/45/49/964454954" width="128" height="96" alt="" /><br />
|
31
|
+
</description>
|
32
|
+
<pubDate>Thu, 18 Mar 2010 16:11:46 +0100</pubDate>
|
33
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=964454954</guid>
|
34
|
+
</item>
|
35
|
+
<item>
|
36
|
+
<title>INTERFOTO: Canon 10-22 USM EF-S 10-20 RATY WWA</title>
|
37
|
+
<link>http://allegro.pl/show_item.php?item=964209349</link>
|
38
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=6312476">www_interfoto_eu</a><br />
|
39
|
+
Cena Kup Teraz: 2 350,00 zł<br />
|
40
|
+
Do końca: 12 dni (śro 31 mar 2010 15:29:37 CEST)<br />
|
41
|
+
<a href="http://allegro.pl/show_item.php?item=964209349">Kup Teraz</a><br />
|
42
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=964209349&name=INTERFOTO%3A+Canon+10-22+USM+EF-S+10-20+RATY+WWA">Dodaj do obserwowanych aukcji</a><br />
|
43
|
+
<img src="http://img10.allegroimg.pl/photos/128x96/964/20/93/964209349" width="128" height="96" alt="" /><br />
|
44
|
+
</description>
|
45
|
+
<pubDate>Wed, 17 Mar 2010 15:29:37 +0100</pubDate>
|
46
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=964209349</guid>
|
47
|
+
</item>
|
48
|
+
<item>
|
49
|
+
<title>INTERFOTO: Canon 10-22 USM EF-S 10-20 RATY WWA</title>
|
50
|
+
<link>http://allegro.pl/show_item.php?item=964181434</link>
|
51
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=6312476">www_interfoto_eu</a><br />
|
52
|
+
Cena Kup Teraz: 2 699,00 zł<br />
|
53
|
+
Do końca: 12 dni (śro 31 mar 2010 15:12:20 CEST)<br />
|
54
|
+
<a href="http://allegro.pl/show_item.php?item=964181434">Kup Teraz</a><br />
|
55
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=964181434&name=INTERFOTO%3A+Canon+10-22+USM+EF-S+10-20+RATY+WWA">Dodaj do obserwowanych aukcji</a><br />
|
56
|
+
<img src="http://img10.allegroimg.pl/photos/128x96/964/18/14/964181434" width="128" height="96" alt="" /><br />
|
57
|
+
</description>
|
58
|
+
<pubDate>Wed, 17 Mar 2010 15:12:20 +0100</pubDate>
|
59
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=964181434</guid>
|
60
|
+
</item>
|
61
|
+
<item>
|
62
|
+
<title>FOTOFORMA Canon EF-S 10-22 mm f/3,5-4,5 USM nowy</title>
|
63
|
+
<link>http://allegro.pl/show_item.php?item=964010449</link>
|
64
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=10200148">FOTOFORMA_2008</a><br />
|
65
|
+
Aktualna cena: 2 649,00 zł<br />
|
66
|
+
Do końca: 12 dni (śro 31 mar 2010 13:23:25 CEST)<br />
|
67
|
+
<a href="http://allegro.pl/show_item.php?item=964010449">Licytuj</a><br />
|
68
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=964010449&name=FOTOFORMA+Canon+EF-S+10-22+mm+f%2F3%2C5-4%2C5+USM+nowy">Dodaj do obserwowanych aukcji</a><br />
|
69
|
+
<img src="http://img14.allegroimg.pl/photos/128x96/964/01/04/964010449" width="128" height="96" alt="" /><br />
|
70
|
+
</description>
|
71
|
+
<pubDate>Wed, 17 Mar 2010 13:23:25 +0100</pubDate>
|
72
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=964010449</guid>
|
73
|
+
</item>
|
74
|
+
<item>
|
75
|
+
<title>FOTOFORMA Canon EF-S 10-22 mm f/3,5-4,5 USM nowy</title>
|
76
|
+
<link>http://allegro.pl/show_item.php?item=964009835</link>
|
77
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=10200148">FOTOFORMA_2008</a><br />
|
78
|
+
Aktualna cena: 2 649,00 zł<br />
|
79
|
+
Do końca: 12 dni (śro 31 mar 2010 13:22:50 CEST)<br />
|
80
|
+
<a href="http://allegro.pl/show_item.php?item=964009835">Licytuj</a><br />
|
81
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=964009835&name=FOTOFORMA+Canon+EF-S+10-22+mm+f%2F3%2C5-4%2C5+USM+nowy">Dodaj do obserwowanych aukcji</a><br />
|
82
|
+
<img src="http://img14.allegroimg.pl/photos/128x96/964/00/98/964009835" width="128" height="96" alt="" /><br />
|
83
|
+
</description>
|
84
|
+
<pubDate>Wed, 17 Mar 2010 13:22:50 +0100</pubDate>
|
85
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=964009835</guid>
|
86
|
+
</item>
|
87
|
+
<item>
|
88
|
+
<title>BTFOTO: Canon 10-22 f/3,5-4,5 USM</title>
|
89
|
+
<link>http://allegro.pl/show_item.php?item=962785139</link>
|
90
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=6544604">foto12</a><br />
|
91
|
+
Aktualna cena: 2 649,00 zł<br />
|
92
|
+
Do końca: 11 dni (wto 30 mar 2010 16:16:52 CEST)<br />
|
93
|
+
<a href="http://allegro.pl/show_item.php?item=962785139">Licytuj</a><br />
|
94
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=962785139&name=BTFOTO%3A+Canon+10-22+f%2F3%2C5-4%2C5+USM">Dodaj do obserwowanych aukcji</a><br />
|
95
|
+
<img src="http://img14.allegroimg.pl/photos/128x96/962/78/51/962785139" width="128" height="96" alt="" /><br />
|
96
|
+
</description>
|
97
|
+
<pubDate>Tue, 16 Mar 2010 16:16:52 +0100</pubDate>
|
98
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=962785139</guid>
|
99
|
+
</item>
|
100
|
+
<item>
|
101
|
+
<title>Osłona typu Canon EW-83E do 16-35, 17-40 L, 10-22</title>
|
102
|
+
<link>http://allegro.pl/show_item.php?item=962732472</link>
|
103
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=3212982">fripers</a><br />
|
104
|
+
Cena Kup Teraz: 34,00 zł<br />
|
105
|
+
Do końca: 4 dni (wto 23 mar 2010 15:29:50 CET)<br />
|
106
|
+
<a href="http://allegro.pl/show_item.php?item=962732472">Kup Teraz</a><br />
|
107
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=962732472&name=Os%C5%82ona+typu+Canon+EW-83E+do+16-35%2C+17-40+L%2C+10-22">Dodaj do obserwowanych aukcji</a><br />
|
108
|
+
<img src="http://img13.allegroimg.pl/photos/128x96/962/73/24/962732472" width="128" height="96" alt="" /><br />
|
109
|
+
</description>
|
110
|
+
<pubDate>Tue, 16 Mar 2010 15:29:50 +0100</pubDate>
|
111
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=962732472</guid>
|
112
|
+
</item>
|
113
|
+
<item>
|
114
|
+
<title>CANON EF-S 10-22 f/3.5-4.5 USM - F-VAT</title>
|
115
|
+
<link>http://allegro.pl/show_item.php?item=962622721</link>
|
116
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=438324">gofinek</a><br />
|
117
|
+
Cena Kup Teraz: 2 730,00 zł<br />
|
118
|
+
Do końca: 11 dni (wto 30 mar 2010 14:09:48 CEST)<br />
|
119
|
+
<a href="http://allegro.pl/show_item.php?item=962622721">Kup Teraz</a><br />
|
120
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=962622721&name=CANON+EF-S+10-22+f%2F3.5-4.5+USM+-++F-VAT">Dodaj do obserwowanych aukcji</a><br />
|
121
|
+
<br />
|
122
|
+
</description>
|
123
|
+
<pubDate>Tue, 16 Mar 2010 14:09:48 +0100</pubDate>
|
124
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=962622721</guid>
|
125
|
+
</item>
|
126
|
+
<item>
|
127
|
+
<title>Osłona EW-83E EW 83 E do Canon 17-40 10-22 16-35</title>
|
128
|
+
<link>http://allegro.pl/show_item.php?item=961347419</link>
|
129
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=1278223">guni1</a><br />
|
130
|
+
Aktualna cena: 35,00 zł<br />
|
131
|
+
Cena Kup Teraz: 35,00 zł<br />
|
132
|
+
Do końca: 10 dni (pon 29 mar 2010 15:40:35 CEST)<br />
|
133
|
+
<a href="http://allegro.pl/show_item.php?item=961347419">Licytuj</a><br />
|
134
|
+
<a href="http://allegro.pl/show_item.php?item=961347419">Kup Teraz</a><br />
|
135
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=961347419&name=Os%C5%82ona+EW-83E+EW+83+E+do+Canon+17-40+10-22+16-35">Dodaj do obserwowanych aukcji</a><br />
|
136
|
+
<img src="http://img08.allegroimg.pl/photos/128x96/961/34/74/961347419" width="128" height="96" alt="" /><br />
|
137
|
+
</description>
|
138
|
+
<pubDate>Mon, 15 Mar 2010 15:40:35 +0100</pubDate>
|
139
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=961347419</guid>
|
140
|
+
</item>
|
141
|
+
<item>
|
142
|
+
<title>Canon 10-22 mm f/3.5-4.5 USM EF-S Sklep WaWa FVat~</title>
|
143
|
+
<link>http://allegro.pl/show_item.php?item=961267273</link>
|
144
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=9905319">www_fotoklik_pl</a><br />
|
145
|
+
Aktualna cena: 2 699,00 zł<br />
|
146
|
+
Do końca: 10 dni (pon 29 mar 2010 15:03:57 CEST)<br />
|
147
|
+
<a href="http://allegro.pl/show_item.php?item=961267273">Licytuj</a><br />
|
148
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=961267273&name=Canon+10-22+mm+f%2F3.5-4.5+USM+EF-S+Sklep+WaWa+FVat%7E">Dodaj do obserwowanych aukcji</a><br />
|
149
|
+
<img src="http://img18.allegroimg.pl/photos/128x96/961/26/72/961267273" width="128" height="96" alt="" /><br />
|
150
|
+
</description>
|
151
|
+
<pubDate>Mon, 15 Mar 2010 15:03:57 +0100</pubDate>
|
152
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=961267273</guid>
|
153
|
+
</item>
|
154
|
+
<item>
|
155
|
+
<title>Canon EF-S 10-22 10-22mm f/3.5-4.5 USM małopolska</title>
|
156
|
+
<link>http://allegro.pl/show_item.php?item=958916994</link>
|
157
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=2663575">londyniak</a><br />
|
158
|
+
Cena Kup Teraz: 2 099,00 zł<br />
|
159
|
+
Do końca: 5 dni (śro 24 mar 2010 21:10:36 CET)<br />
|
160
|
+
<a href="http://allegro.pl/show_item.php?item=958916994">Kup Teraz</a><br />
|
161
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=958916994&name=Canon+EF-S+10-22+10-22mm+f%2F3.5-4.5+USM+ma%C5%82opolska">Dodaj do obserwowanych aukcji</a><br />
|
162
|
+
<img src="http://img19.allegroimg.pl/photos/128x96/958/91/69/958916994" width="128" height="96" alt="" /><br />
|
163
|
+
</description>
|
164
|
+
<pubDate>Sun, 14 Mar 2010 21:10:36 +0100</pubDate>
|
165
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=958916994</guid>
|
166
|
+
</item>
|
167
|
+
<item>
|
168
|
+
<title>Osłona EW-83E EW-83 E Canon 17-40/4, 10-22, 20-35</title>
|
169
|
+
<link>http://allegro.pl/show_item.php?item=960183468</link>
|
170
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=13370926">Kunszt_66a</a><br />
|
171
|
+
Cena Kup Teraz: 30,00 zł<br />
|
172
|
+
Do końca: 25 dni (wto 13 kwi 2010 19:00:20 CEST)<br />
|
173
|
+
<a href="http://allegro.pl/show_item.php?item=960183468">Kup Teraz</a><br />
|
174
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=960183468&name=Os%C5%82ona+EW-83E+EW-83+E+Canon+17-40%2F4%2C+10-22%2C+20-35">Dodaj do obserwowanych aukcji</a><br />
|
175
|
+
<img src="http://img03.allegroimg.pl/photos/128x96/960/18/34/960183468" width="128" height="96" alt="" /><br />
|
176
|
+
</description>
|
177
|
+
<pubDate>Sun, 14 Mar 2010 19:00:20 +0100</pubDate>
|
178
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=960183468</guid>
|
179
|
+
</item>
|
180
|
+
<item>
|
181
|
+
<title>NAJTANIEJ Canon EW-83E Oryginał 10-22 16-35 17-40</title>
|
182
|
+
<link>http://allegro.pl/show_item.php?item=957619541</link>
|
183
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=85078">Rupert_K</a><br />
|
184
|
+
Cena Kup Teraz: 99,00 zł<br />
|
185
|
+
Do końca: 5 dni (śro 24 mar 2010 14:23:16 CET)<br />
|
186
|
+
<a href="http://allegro.pl/show_item.php?item=957619541">Kup Teraz</a><br />
|
187
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=957619541&name=NAJTANIEJ+Canon+EW-83E+Orygina%C5%82+10-22+16-35+17-40">Dodaj do obserwowanych aukcji</a><br />
|
188
|
+
<img src="http://img17.allegroimg.pl/photos/128x96/957/61/95/957619541" width="128" height="96" alt="" /><br />
|
189
|
+
</description>
|
190
|
+
<pubDate>Sun, 14 Mar 2010 14:23:16 +0100</pubDate>
|
191
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=957619541</guid>
|
192
|
+
</item>
|
193
|
+
<item>
|
194
|
+
<title>OSŁONA EW-83E CANON 17-40 20-35 16-35 10-22 mm</title>
|
195
|
+
<link>http://allegro.pl/show_item.php?item=957671641</link>
|
196
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=10320563">FOTO-MONOLIT</a><br />
|
197
|
+
Cena Kup Teraz: 30,00 zł<br />
|
198
|
+
Do końca: 23 dni (nie 11 kwi 2010 17:37:55 CEST)<br />
|
199
|
+
<a href="http://allegro.pl/show_item.php?item=957671641">Kup Teraz</a><br />
|
200
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=957671641&name=OS%C5%81ONA+EW-83E+CANON+17-40+20-35+16-35+10-22+mm">Dodaj do obserwowanych aukcji</a><br />
|
201
|
+
<img src="http://img06.allegroimg.pl/photos/128x96/957/67/16/957671641" width="128" height="96" alt="" /><br />
|
202
|
+
</description>
|
203
|
+
<pubDate>Fri, 12 Mar 2010 17:37:55 +0100</pubDate>
|
204
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=957671641</guid>
|
205
|
+
</item>
|
206
|
+
<item>
|
207
|
+
<title>Osłona EW-83E EW-83 E Canon 17-40/4, 10-22, 20-35</title>
|
208
|
+
<link>http://allegro.pl/show_item.php?item=957520690</link>
|
209
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=4275619">fotoabc_com</a><br />
|
210
|
+
Cena Kup Teraz: 30,00 zł<br />
|
211
|
+
Do końca: 3 dni (pon 22 mar 2010 15:30:06 CET)<br />
|
212
|
+
<a href="http://allegro.pl/show_item.php?item=957520690">Kup Teraz</a><br />
|
213
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=957520690&name=Os%C5%82ona+EW-83E+EW-83+E+Canon+17-40%2F4%2C+10-22%2C+20-35">Dodaj do obserwowanych aukcji</a><br />
|
214
|
+
<img src="http://img17.allegroimg.pl/photos/128x96/957/52/06/957520690" width="128" height="96" alt="" /><br />
|
215
|
+
</description>
|
216
|
+
<pubDate>Fri, 12 Mar 2010 15:30:06 +0100</pubDate>
|
217
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=957520690</guid>
|
218
|
+
</item>
|
219
|
+
<item>
|
220
|
+
<title>Canon EW-83E do 10-22 17-40 16-35 Oryginał! F VAT</title>
|
221
|
+
<link>http://allegro.pl/show_item.php?item=955771375</link>
|
222
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=3975973">Foto-ivy</a><br />
|
223
|
+
Cena Kup Teraz: 138,00 zł<br />
|
224
|
+
Do końca: 5 dni (czw 25 mar 2010 09:20:25 CET)<br />
|
225
|
+
<a href="http://allegro.pl/show_item.php?item=955771375">Kup Teraz</a><br />
|
226
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=955771375&name=Canon+EW-83E+do+10-22+17-40+16-35+Orygina%C5%82%21+F+VAT">Dodaj do obserwowanych aukcji</a><br />
|
227
|
+
<img src="http://img03.allegroimg.pl/photos/128x96/955/77/13/955771375" width="128" height="96" alt="" /><br />
|
228
|
+
</description>
|
229
|
+
<pubDate>Thu, 11 Mar 2010 09:20:25 +0100</pubDate>
|
230
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=955771375</guid>
|
231
|
+
</item>
|
232
|
+
<item>
|
233
|
+
<title>OSŁONA DO CANON EW-83E 17-40 20-35 16-35 10-22 MM</title>
|
234
|
+
<link>http://allegro.pl/show_item.php?item=955302294</link>
|
235
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=1158478">ibrokers</a><br />
|
236
|
+
Cena Kup Teraz: 35,00 zł<br />
|
237
|
+
Do końca: 21 dni (pią 09 kwi 2010 20:26:55 CEST)<br />
|
238
|
+
<a href="http://allegro.pl/show_item.php?item=955302294">Kup Teraz</a><br />
|
239
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=955302294&name=OS%C5%81ONA+DO+CANON+EW-83E+17-40+20-35+16-35+10-22+MM">Dodaj do obserwowanych aukcji</a><br />
|
240
|
+
<img src="http://img12.allegroimg.pl/photos/128x96/955/30/22/955302294" width="128" height="96" alt="" /><br />
|
241
|
+
</description>
|
242
|
+
<pubDate>Wed, 10 Mar 2010 20:26:55 +0100</pubDate>
|
243
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=955302294</guid>
|
244
|
+
</item>
|
245
|
+
<item>
|
246
|
+
<title>Canon 10-22 mm f/3.5-4.5 EF-S USM Fvat 10-22mm</title>
|
247
|
+
<link>http://allegro.pl/show_item.php?item=954200532</link>
|
248
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=3139398">eurocamerapl</a><br />
|
249
|
+
Cena Kup Teraz: 2 749,00 zł<br />
|
250
|
+
Do końca: 4 dni (śro 24 mar 2010 01:04:01 CET)<br />
|
251
|
+
<a href="http://allegro.pl/show_item.php?item=954200532">Kup Teraz</a><br />
|
252
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=954200532&name=Canon+10-22+mm+f%2F3.5-4.5+EF-S+USM+Fvat+10-22mm">Dodaj do obserwowanych aukcji</a><br />
|
253
|
+
<img src="http://img14.allegroimg.pl/photos/128x96/954/20/05/954200532" width="128" height="96" alt="" /><br />
|
254
|
+
</description>
|
255
|
+
<pubDate>Wed, 10 Mar 2010 01:04:01 +0100</pubDate>
|
256
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=954200532</guid>
|
257
|
+
</item>
|
258
|
+
<item>
|
259
|
+
<title>NOWY Canon EF S 10-22 mm f.3.5-4.5 USM - FVAT</title>
|
260
|
+
<link>http://allegro.pl/show_item.php?item=952503646</link>
|
261
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=1181485">koniopl</a><br />
|
262
|
+
Cena Kup Teraz: 2 490,00 zł<br />
|
263
|
+
Do końca: 4 dni (wto 23 mar 2010 16:32:46 CET)<br />
|
264
|
+
<a href="http://allegro.pl/show_item.php?item=952503646">Kup Teraz</a><br />
|
265
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=952503646&name=NOWY+Canon+EF+S+10-22+mm+f.3.5-4.5+USM+-+FVAT">Dodaj do obserwowanych aukcji</a><br />
|
266
|
+
<img src="http://img08.allegroimg.pl/photos/128x96/952/50/36/952503646" width="128" height="96" alt="" /><br />
|
267
|
+
</description>
|
268
|
+
<pubDate>Tue, 09 Mar 2010 16:32:46 +0100</pubDate>
|
269
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=952503646</guid>
|
270
|
+
</item>
|
271
|
+
<item>
|
272
|
+
<title>OSŁONA CANON EW-83E do EF 16-35 17-40 EF-S 10-22</title>
|
273
|
+
<link>http://allegro.pl/show_item.php?item=953276515</link>
|
274
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=1548914">fotoenergia</a><br />
|
275
|
+
Cena Kup Teraz: 30,00 zł<br />
|
276
|
+
Do końca: 4 dni (wto 23 mar 2010 13:16:15 CET)<br />
|
277
|
+
<a href="http://allegro.pl/show_item.php?item=953276515">Kup Teraz</a><br />
|
278
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=953276515&name=OS%C5%81ONA+CANON+EW-83E+do+EF+16-35+17-40+EF-S+10-22">Dodaj do obserwowanych aukcji</a><br />
|
279
|
+
<img src="http://img18.allegroimg.pl/photos/128x96/953/27/65/953276515" width="128" height="96" alt="" /><br />
|
280
|
+
</description>
|
281
|
+
<pubDate>Tue, 09 Mar 2010 13:16:15 +0100</pubDate>
|
282
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=953276515</guid>
|
283
|
+
</item>
|
284
|
+
<item>
|
285
|
+
<title>Canon EW-83E do 10-22 17-35 17-40 17-35</title>
|
286
|
+
<link>http://allegro.pl/show_item.php?item=952360969</link>
|
287
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=74775">Aragon</a><br />
|
288
|
+
Cena Kup Teraz: 27,00 zł<br />
|
289
|
+
Do końca: 3 dni (pon 22 mar 2010 19:49:56 CET)<br />
|
290
|
+
<a href="http://allegro.pl/show_item.php?item=952360969">Kup Teraz</a><br />
|
291
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=952360969&name=Canon+EW-83E+do+10-22+17-35+17-40+17-35">Dodaj do obserwowanych aukcji</a><br />
|
292
|
+
<img src="http://img01.allegroimg.pl/photos/128x96/952/36/09/952360969" width="128" height="96" alt="" /><br />
|
293
|
+
</description>
|
294
|
+
<pubDate>Mon, 08 Mar 2010 19:49:56 +0100</pubDate>
|
295
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=952360969</guid>
|
296
|
+
</item>
|
297
|
+
<item>
|
298
|
+
<title>e-oko Canon 10-22/3.5-4.5 USM EF-S F-VAT!OD REKI!</title>
|
299
|
+
<link>http://allegro.pl/show_item.php?item=952157635</link>
|
300
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=4230730">e-oko</a><br />
|
301
|
+
Aktualna cena: 2 899,00 zł<br />
|
302
|
+
Do końca: 3 dni (pon 22 mar 2010 17:37:44 CET)<br />
|
303
|
+
<a href="http://allegro.pl/show_item.php?item=952157635">Licytuj</a><br />
|
304
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=952157635&name=e-oko+Canon+10-22%2F3.5-4.5+USM+EF-S+F-VAT%21OD+REKI%21">Dodaj do obserwowanych aukcji</a><br />
|
305
|
+
<img src="http://img09.allegroimg.pl/photos/128x96/952/15/76/952157635" width="128" height="96" alt="" /><br />
|
306
|
+
</description>
|
307
|
+
<pubDate>Mon, 08 Mar 2010 17:37:44 +0100</pubDate>
|
308
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=952157635</guid>
|
309
|
+
</item>
|
310
|
+
<item>
|
311
|
+
<title>BEA: CANON EFS 10-22 f /3.5-4.5USM F-VAT22% RATY1%</title>
|
312
|
+
<link>http://allegro.pl/show_item.php?item=951764564</link>
|
313
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=10148626">BEA-FOTO</a><br />
|
314
|
+
Aktualna cena: 2 689,00 zł<br />
|
315
|
+
Do końca: 3 dni (pon 22 mar 2010 12:41:21 CET)<br />
|
316
|
+
<a href="http://allegro.pl/show_item.php?item=951764564">Licytuj</a><br />
|
317
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=951764564&name=BEA%3A+CANON+EFS+10-22+f+%2F3.5-4.5USM+F-VAT22%25+RATY1%25">Dodaj do obserwowanych aukcji</a><br />
|
318
|
+
<img src="http://img18.allegroimg.pl/photos/128x96/951/76/45/951764564" width="128" height="96" alt="" /><br />
|
319
|
+
</description>
|
320
|
+
<pubDate>Mon, 08 Mar 2010 12:41:21 +0100</pubDate>
|
321
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=951764564</guid>
|
322
|
+
</item>
|
323
|
+
<item>
|
324
|
+
<title>Canon 10-22 mm f/3.5-4.5 WROCŁAW SKLEP APCOM</title>
|
325
|
+
<link>http://allegro.pl/show_item.php?item=951144352</link>
|
326
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=98373">pity</a><br />
|
327
|
+
Aktualna cena: 2 699,00 zł<br />
|
328
|
+
Do końca: 2 dni (nie 21 mar 2010 21:59:36 CET)<br />
|
329
|
+
<a href="http://allegro.pl/show_item.php?item=951144352">Licytuj</a><br />
|
330
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=951144352&name=Canon+10-22+mm+f%2F3.5-4.5+WROC%C5%81AW+SKLEP+APCOM">Dodaj do obserwowanych aukcji</a><br />
|
331
|
+
<img src="http://img13.allegroimg.pl/photos/128x96/951/14/43/951144352" width="128" height="96" alt="" /><br />
|
332
|
+
</description>
|
333
|
+
<pubDate>Sun, 07 Mar 2010 21:59:36 +0100</pubDate>
|
334
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=951144352</guid>
|
335
|
+
</item>
|
336
|
+
<item>
|
337
|
+
<title>KUP TERAZ CANON 10-22 USM NOWY,GWAR, F-VAT</title>
|
338
|
+
<link>http://allegro.pl/show_item.php?item=950608159</link>
|
339
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=9783704">pasazfoto</a><br />
|
340
|
+
Cena Kup Teraz: 2 698,00 zł<br />
|
341
|
+
Do końca: 2 dni (nie 21 mar 2010 16:20:10 CET)<br />
|
342
|
+
<a href="http://allegro.pl/show_item.php?item=950608159">Kup Teraz</a><br />
|
343
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=950608159&name=KUP+TERAZ+CANON+10-22+USM+NOWY%2CGWAR%2C+F-VAT">Dodaj do obserwowanych aukcji</a><br />
|
344
|
+
<img src="http://img15.allegroimg.pl/photos/128x96/950/60/81/950608159" width="128" height="96" alt="" /><br />
|
345
|
+
</description>
|
346
|
+
<pubDate>Sun, 07 Mar 2010 16:20:10 +0100</pubDate>
|
347
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=950608159</guid>
|
348
|
+
</item>
|
349
|
+
<item>
|
350
|
+
<title>CANON 10-22 mm 3.5-4.5</title>
|
351
|
+
<link>http://allegro.pl/show_item.php?item=948761359</link>
|
352
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=2579035">gerigeri</a><br />
|
353
|
+
Aktualna cena: 1 900,00 zł<br />
|
354
|
+
Do końca: 11 godz. (pią 19 mar 2010 21:47:20 CET)<br />
|
355
|
+
<a href="http://allegro.pl/show_item.php?item=948761359">Licytuj</a><br />
|
356
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=948761359&name=CANON+10-22+mm+3.5-4.5">Dodaj do obserwowanych aukcji</a><br />
|
357
|
+
<img src="http://img09.allegroimg.pl/photos/128x96/948/76/13/948761359" width="128" height="96" alt="" /><br />
|
358
|
+
</description>
|
359
|
+
<pubDate>Fri, 05 Mar 2010 21:47:20 +0100</pubDate>
|
360
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=948761359</guid>
|
361
|
+
</item>
|
362
|
+
<item>
|
363
|
+
<title>Canon EF-S 10-22 f/3.5-4.5 USM, RATY, LEASING</title>
|
364
|
+
<link>http://allegro.pl/show_item.php?item=936029100</link>
|
365
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=3241561">winmar_pl</a><br />
|
366
|
+
Cena Kup Teraz: 3 099,00 zł<br />
|
367
|
+
Do końca: 6 dni (czw 25 mar 2010 23:08:24 CET)<br />
|
368
|
+
<a href="http://allegro.pl/show_item.php?item=936029100">Kup Teraz</a><br />
|
369
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=936029100&name=Canon+EF-S+10-22+f%2F3.5-4.5+USM%2C+RATY%2C+LEASING">Dodaj do obserwowanych aukcji</a><br />
|
370
|
+
<img src="http://img19.allegroimg.pl/photos/128x96/936/02/91/936029100" width="128" height="96" alt="" /><br />
|
371
|
+
</description>
|
372
|
+
<pubDate>Tue, 23 Feb 2010 23:08:24 +0100</pubDate>
|
373
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=936029100</guid>
|
374
|
+
</item>
|
375
|
+
<item>
|
376
|
+
<title>OSŁONA CANON EW-83E 20-35 17-40 16-35 10-22 mm</title>
|
377
|
+
<link>http://allegro.pl/show_item.php?item=928240846</link>
|
378
|
+
<description>Sprzedający: <a href="http://allegro.pl/show_user.php?uid=3832142">qwadron</a><br />
|
379
|
+
Cena Kup Teraz: 31,00 zł<br />
|
380
|
+
Do końca: 9 godz. (pią 19 mar 2010 19:41:13 CET)<br />
|
381
|
+
<a href="http://allegro.pl/show_item.php?item=928240846">Kup Teraz</a><br />
|
382
|
+
<a href="http://allegro.pl/add_to_watchlist_rss.php?item_id=928240846&name=OS%C5%81ONA+CANON+EW-83E+20-35+17-40+16-35+10-22+mm">Dodaj do obserwowanych aukcji</a><br />
|
383
|
+
<img src="http://photos02.allegroimg.pl/photos/128x96/928/24/08/928240846" width="128" height="96" alt="" /><br />
|
384
|
+
</description>
|
385
|
+
<pubDate>Wed, 17 Feb 2010 19:41:13 +0100</pubDate>
|
386
|
+
<guid isPermaLink="false">http://allegro.pl/show_item.php?item=928240846</guid>
|
387
|
+
</item>
|
388
|
+
</channel>
|
389
|
+
</rss>
|
data/spec/matchers.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# http://www.robertsosinski.com/2008/12/10/up-and-running-with-custom-rspec-matchers/
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
module Matchers
|
6
|
+
class MatchUri
|
7
|
+
def initialize(expected)
|
8
|
+
@expected_str = expected
|
9
|
+
@expected_uri = URI.parse(@expected_str) unless expected.blank?
|
10
|
+
end
|
11
|
+
|
12
|
+
def matches?(actual)
|
13
|
+
@actual_str = actual
|
14
|
+
return false if @expected_uri.nil?
|
15
|
+
|
16
|
+
# Check if no exceptions are thrown
|
17
|
+
@actual_uri = URI.parse(@actual_str) unless actual.blank?
|
18
|
+
return false if @actual_uri.blank?
|
19
|
+
|
20
|
+
# aliases
|
21
|
+
a = @actual_uri
|
22
|
+
e = @expected_uri
|
23
|
+
|
24
|
+
[:scheme, :userinfo, :host, :port, :path, :fragment].each do |c|
|
25
|
+
return false unless a.send(c) == e.send(c)
|
26
|
+
end
|
27
|
+
|
28
|
+
qs = [a.query, e.query].collect do |q|
|
29
|
+
q.split(/(&|&)/).sort.reject{|t| ["&", "&"].include? t }
|
30
|
+
end
|
31
|
+
|
32
|
+
return false unless qs[0] == qs[1]
|
33
|
+
|
34
|
+
return true
|
35
|
+
end
|
36
|
+
|
37
|
+
def failure_message
|
38
|
+
initial_fail_msg = initial_failure
|
39
|
+
return initial_fail_msg unless initial_fail_msg.blank?
|
40
|
+
|
41
|
+
"expected '#{@expected_str}' but got '#{@actual_str}'"
|
42
|
+
end
|
43
|
+
|
44
|
+
def negative_failure_message
|
45
|
+
initial_fail_msg = initial_failure
|
46
|
+
return initial_fail_msg unless initial_fail_msg.blank?
|
47
|
+
|
48
|
+
"expected something else then '#{@expected_str_}' but got '#{@actual_str}'"
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def initial_failure
|
53
|
+
return "could not parse expected URI" if @expected_uri.nil?
|
54
|
+
return "could not parse actual URI" if @actual_uri.nil?
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
def match_uri(expected)
|
60
|
+
MatchUri.new(expected)
|
61
|
+
end
|
62
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'allejest'
|
4
|
+
require 'spec'
|
5
|
+
require 'spec/autorun'
|
6
|
+
require 'matchers'
|
7
|
+
|
8
|
+
Spec::Runner.configure do |config|
|
9
|
+
config.include(Matchers)
|
10
|
+
end
|
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: allejest
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Maciej Bilas
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-03-20 00:00:00 +01:00
|
18
|
+
default_executable: allejest
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :development
|
31
|
+
version_requirements: *id001
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: activesupport
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 2
|
41
|
+
- 3
|
42
|
+
- 0
|
43
|
+
version: 2.3.0
|
44
|
+
type: :runtime
|
45
|
+
version_requirements: *id002
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: feed_me
|
48
|
+
prerelease: false
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
- 6
|
56
|
+
- 0
|
57
|
+
version: 0.6.0
|
58
|
+
type: :runtime
|
59
|
+
version_requirements: *id003
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: simply_useful
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
- 1
|
70
|
+
- 6
|
71
|
+
version: 0.1.6
|
72
|
+
type: :runtime
|
73
|
+
version_requirements: *id004
|
74
|
+
- !ruby/object:Gem::Dependency
|
75
|
+
name: pony
|
76
|
+
prerelease: false
|
77
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
- 9
|
84
|
+
version: "0.9"
|
85
|
+
type: :runtime
|
86
|
+
version_requirements: *id005
|
87
|
+
description: "Powiadamia e-mailem o dost\xC4\x99pno\xC5\x9Bci przedmiot\xC3\xB3w na allegro."
|
88
|
+
email: maciej@inszy.org
|
89
|
+
executables:
|
90
|
+
- allejest
|
91
|
+
extensions: []
|
92
|
+
|
93
|
+
extra_rdoc_files:
|
94
|
+
- LICENSE
|
95
|
+
- README.rdoc
|
96
|
+
files:
|
97
|
+
- .document
|
98
|
+
- .gitignore
|
99
|
+
- LICENSE
|
100
|
+
- README.rdoc
|
101
|
+
- Rakefile
|
102
|
+
- VERSION
|
103
|
+
- bin/allejest
|
104
|
+
- lib/alle_jest/mail.erb
|
105
|
+
- lib/allejest.rb
|
106
|
+
- nbproject/project.properties
|
107
|
+
- nbproject/project.xml
|
108
|
+
- spec/allejest_spec.rb
|
109
|
+
- spec/fixtures/allegro_canon1022_results.rss
|
110
|
+
- spec/fixtures/allejest.yml
|
111
|
+
- spec/matchers.rb
|
112
|
+
- spec/spec_helper.rb
|
113
|
+
has_rdoc: true
|
114
|
+
homepage: http://github.com/maciej/allejest
|
115
|
+
licenses: []
|
116
|
+
|
117
|
+
post_install_message:
|
118
|
+
rdoc_options:
|
119
|
+
- --charset=UTF-8
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
segments:
|
127
|
+
- 0
|
128
|
+
version: "0"
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
segments:
|
134
|
+
- 0
|
135
|
+
version: "0"
|
136
|
+
requirements: []
|
137
|
+
|
138
|
+
rubyforge_project: allejest
|
139
|
+
rubygems_version: 1.3.6
|
140
|
+
signing_key:
|
141
|
+
specification_version: 3
|
142
|
+
summary: "Powiadamia e-mailem o dost\xC4\x99pno\xC5\x9Bci przedmiot\xC3\xB3w na allegro"
|
143
|
+
test_files:
|
144
|
+
- spec/spec_helper.rb
|
145
|
+
- spec/matchers.rb
|
146
|
+
- spec/allejest_spec.rb
|