big_sitemap 0.8.2 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,9 +1,15 @@
1
- === 0.8.2 / 2010-01-25
1
+ === 0.8.3 / 2011-03-08
2
+
3
+ * Separate URL and file paths are now supported via the :document_path
4
+ and :url_path options
5
+ * Fixes an issue when initializing in Rails 3
6
+
7
+ === 0.8.2 / 2011-01-25
2
8
 
3
9
  * Fixes an issue where sitemap files were not being generated if the same model
4
10
  was added more than once (fixes issue #5: https://github.com/alexrabarts/big_sitemap/issues/#issue/5)
5
11
 
6
- === 0.8.1 / 2010-01-25
12
+ === 0.8.1 / 2011-01-25
7
13
 
8
14
  * API change: Rails/Merb are no longer automatically detected - use BigSitemapRails and BigSitemapMerb instead
9
15
  * API change: Rails' polymorphic_url helper is no longer used to generate URLs (use a lambda with the new :location option instead)
data/README.rdoc CHANGED
@@ -61,8 +61,11 @@ Via gem:
61
61
 
62
62
  * <code>:url_options</code> -- hash with <code>:host</code>, optionally <code>:port</code> and <code>:protocol</code>
63
63
  * <code>:base_url</code> -- string alternative to <code>:url_options</code>, e.g. <code>'https://example.com:8080/'</code>
64
+ * <code>:url_path</code> -- string path_name to sitemaps folder, defaults to <code>:document_path</code>
64
65
  * <code>:document_root</code> -- string
65
- * <code>:path</code> -- string defaults to <code>'sitemaps'</code>, which places sitemap files under the <code>/sitemaps</code> directory
66
+ * <code>:document_path</code> -- string document path to generation folder, relative to :document_root, defaults to <code>'sitemaps/'</code>
67
+ * <code>:path</code> -- string, alias for ":document_path" for legacy reasons
68
+ * <code>:document_full</code> -- string absolute document path to generation folder - defaults to <code>:document_root/:document_path</code>
66
69
  * <code>:max_per_sitemap</code> -- <code>50000</code>, which is the limit dictated by Google but can be less
67
70
  * <code>:batch_size</code> -- <code>1001</code> (not <code>1000</code> due to a bug in DataMapper)
68
71
  * <code>:gzip</code> -- <code>true</code>
data/Rakefile CHANGED
@@ -31,22 +31,4 @@ Rake::TestTask.new(:test) do |t|
31
31
  t.verbose = false
32
32
  end
33
33
 
34
- begin
35
- require 'rcov/rcovtask'
36
- Rcov::RcovTask.new do |t|
37
- t.libs << 'test'
38
- t.test_files = FileList['test/**/*_test.rb']
39
- t.verbose = true
40
- end
41
- rescue LoadError
42
- puts "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
43
- end
44
-
45
- begin
46
- require 'cucumber/rake/task'
47
- Cucumber::Rake::Task.new(:features)
48
- rescue LoadError
49
- puts "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
50
- end
51
-
52
34
  task :default => :test
data/VERSION.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  ---
2
- :patch: 2
3
2
  :major: 0
4
3
  :minor: 8
4
+ :patch: 3
5
+ :build:
data/big_sitemap.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{big_sitemap}
8
- s.version = "0.8.2"
8
+ s.version = "0.8.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alex Rabarts", "Tobias Bielohlawek"]
12
- s.date = %q{2011-01-25}
12
+ s.date = %q{2011-03-14}
13
13
  s.description = %q{A Sitemap generator specifically designed for large sites (although it works equally well with small sites)}
14
14
  s.email = ["alexrabarts@gmail.com", "tobi@soundcloud.com"]
15
15
  s.extra_rdoc_files = [
data/lib/big_sitemap.rb CHANGED
@@ -7,7 +7,7 @@ class BigSitemap
7
7
  DEFAULTS = {
8
8
  :max_per_sitemap => Builder::MAX_URLS,
9
9
  :batch_size => 1001,
10
- :path => 'sitemaps',
10
+ :document_path => 'sitemaps/',
11
11
  :gzip => true,
12
12
 
13
13
  # opinionated
@@ -24,36 +24,31 @@ class BigSitemap
24
24
 
25
25
  def initialize(options={})
26
26
  @options = DEFAULTS.merge options
27
-
28
- @default_url_options = options.delete(:default_url_options) || {}
27
+ @options[:document_path] ||= @options[:path] #for legacy reasons
29
28
 
30
29
  if @options[:max_per_sitemap] <= 1
31
30
  raise ArgumentError, '":max_per_sitemap" must be greater than 1'
32
31
  end
33
32
 
34
33
  if @options[:url_options]
35
- @default_url_options.update @options[:url_options]
36
- elsif @options[:base_url]
37
- uri = URI.parse(@options[:base_url])
38
- @default_url_options[:host] = uri.host
39
- @default_url_options[:port] = uri.port
40
- @default_url_options[:protocol] = uri.scheme
41
- else
34
+ @options[:base_url] = URI::Generic.build( {:scheme => "http"}.merge(@options.delete(:url_options)) ).to_s
35
+ end
36
+
37
+ unless @options[:base_url]
42
38
  raise ArgumentError, 'you must specify either ":url_options" hash or ":base_url" string'
43
39
  end
40
+ @options[:url_path] ||= @options[:document_path]
44
41
 
45
42
  if @options[:batch_size] > @options[:max_per_sitemap]
46
43
  raise ArgumentError, '":batch_size" must be less than ":max_per_sitemap"'
47
44
  end
48
45
 
49
- @options[:document_root] ||= document_root
50
-
51
- unless @options[:document_root]
52
- raise ArgumentError, 'Document root must be specified with the ":document_root" option'
46
+ @options[:document_full] ||= File.join(@options[:document_root], @options[:document_path])
47
+ unless @options[:document_full]
48
+ raise ArgumentError, 'Document root must be specified with the ":document_root" option, the full path with ":document_full"'
53
49
  end
54
50
 
55
- @file_path = "#{@options[:document_root]}/#{strip_leading_slash(@options[:path])}"
56
- Dir.mkdir(@file_path) unless File.exists? @file_path
51
+ Dir.mkdir(@options[:document_full]) unless File.exists?(@options[:document_full])
57
52
 
58
53
  @sources = []
59
54
  @models = []
@@ -100,14 +95,15 @@ class BigSitemap
100
95
 
101
96
  def file_name(name)
102
97
  name = table_name(name) unless name.is_a? String
103
- "#{@file_path}/sitemap_#{name}"
98
+ File.join(@options[:document_full], "sitemap_#{name}")
104
99
  end
105
100
 
106
- def document_root
101
+ def dir_files
102
+ File.join(@options[:document_full], "sitemap_*.{xml,xml.gz}")
107
103
  end
108
104
 
109
105
  def clean
110
- Dir["#{@file_path}/sitemap_*.{xml,xml.gz}"].each do |file|
106
+ Dir[dir_files].each do |file|
111
107
  FileUtils.rm file
112
108
  end
113
109
  self
@@ -161,8 +157,8 @@ class BigSitemap
161
157
 
162
158
  if last_id && primary_column
163
159
  find_options.update(:limit => limit, :offset => nil)
164
- primary_column_value = last_id.to_s.gsub("'", %q(\\\')) #escape '
165
- find_options.update(:conditions => [find_options[:conditions], "(#{primary_column} > '#{primary_column_value}')"].compact.join(' AND '))
160
+ primary_column_value = escape_if_string last_id #escape '
161
+ find_options.update(:conditions => [find_options[:conditions], "(#{primary_column} > #{primary_column_value})"].compact.join(' AND '))
166
162
  end
167
163
 
168
164
  model.send(find_method, find_options).each do |record|
@@ -176,12 +172,12 @@ class BigSitemap
176
172
 
177
173
  param_method = pick_method(record, PARAM_METHODS)
178
174
 
179
- location = options[:location]
180
- if location.is_a?(Proc)
181
- location = location.call(record)
182
- else
183
- location = "#{root_url}/#{strip_leading_slash(options[:path])}/#{record.send(param_method)}"
184
- end
175
+ location =
176
+ if options[:location].is_a?(Proc)
177
+ options[:location].call(record)
178
+ else
179
+ File.join @options[:base_url], options[:path], record.send(param_method).to_s
180
+ end
185
181
 
186
182
  change_frequency = options[:change_frequency] || 'weekly'
187
183
  freq = change_frequency.is_a?(Proc) ? change_frequency.call(record) : change_frequency
@@ -211,7 +207,7 @@ class BigSitemap
211
207
 
212
208
  # Create a sitemap index document
213
209
  def generate_sitemap_index(files = nil)
214
- files ||= Dir["#{@file_path}/sitemap_*.{xml,xml.gz}"]
210
+ files ||= Dir[dir_files]
215
211
  with_sitemap 'index', :type => 'index' do |sitemap|
216
212
  for path in files
217
213
  next if path =~ /index/
@@ -238,7 +234,7 @@ class BigSitemap
238
234
  "appid=#{@options[:yahoo_app_id]}&url=#{sitemap_uri}"
239
235
  )
240
236
  else
241
- $stderr.puts 'unable to ping Yahoo: no ":yahoo_app_id" provided'
237
+ STDERR.puts 'unable to ping Yahoo: no ":yahoo_app_id" provided'
242
238
  end
243
239
  end
244
240
 
@@ -251,36 +247,27 @@ class BigSitemap
251
247
  end
252
248
  end
253
249
 
254
- def root_url
255
- @root_url ||= begin
256
- url = ''
257
- url << (@default_url_options[:protocol] || 'http')
258
- url << '://' unless url.match('://')
259
- url << @default_url_options[:host]
260
- url << ":#{port}" if port = @default_url_options[:port] and port != 80
261
- url
262
- end
263
- end
264
-
265
250
  private
266
251
 
267
252
  def prepare_update
268
253
  @files_to_move = []
269
254
  @sources.each do |model, options|
270
- if options[:partial_update] && primary_column = options[:primary_column] && last_id = get_last_id(options[:filename])
271
- primary_column_value = last_id.to_s.gsub("'", %q(\\\')) #escape '
272
- options[:conditions] = [options[:conditions], "(#{primary_column} >= '#{primary_column_value}')"].compact.join(' AND ')
255
+ if options[:partial_update] && (primary_column = options[:primary_column]) && (last_id = get_last_id(options[:filename]))
256
+ primary_column_value = escape_if_string last_id #escape '
257
+ options[:conditions] = [options[:conditions], "(#{primary_column} >= #{primary_column_value})"].compact.join(' AND ')
273
258
  options[:start_part_id] = last_id
274
259
  end
275
260
  end
276
261
  end
277
262
 
278
263
  def lock!(lock_file = 'generator.lock')
279
- File.open("#{@file_path}/#{lock_file}", 'w', File::EXCL)
264
+ lock_file = File.join(@options[:document_full], lock_file)
265
+ File.open(lock_file, 'w', File::EXCL)
280
266
  end
281
267
 
282
268
  def unlock!(lock_file = 'generator.lock')
283
- FileUtils.rm "#{@file_path}/#{lock_file}"
269
+ lock_file = File.join(@options[:document_full], lock_file)
270
+ FileUtils.rm lock_file
284
271
  end
285
272
 
286
273
  def with_sitemap(name, options={})
@@ -307,10 +294,6 @@ class BigSitemap
307
294
  end
308
295
  end
309
296
 
310
- def strip_leading_slash(str)
311
- str.sub(/^\//, '')
312
- end
313
-
314
297
  def get_last_id(filename)
315
298
  Dir["#{filename}*.{xml,xml.gz}"].map do |file|
316
299
  file.to_s.scan(/#{filename}_(.+).xml/).flatten.last.to_i
@@ -328,44 +311,50 @@ class BigSitemap
328
311
  method
329
312
  end
330
313
 
314
+ def escape_if_string(value)
315
+ (value.to_i.to_s == value.to_s) ? value.to_i : "'#{value.gsub("'", %q(\\\'))}'"
316
+ end
317
+
331
318
  def url_for_sitemap(path)
332
- [root_url, @options[:path], File.basename(path)].compact.join('/')
319
+ File.join @options[:base_url], @options[:url_path], File.basename(path)
333
320
  end
334
321
 
335
322
  end
336
323
 
337
324
 
338
-
339
325
  class BigSitemapRails < BigSitemap
340
326
 
341
- include ActionController::UrlWriter if defined? Rails
327
+ if defined?(Rails) && Rails.version < "3"
328
+ include ActionController::UrlWriter
329
+ end
342
330
 
343
331
  def initialize(options={})
332
+ raise "No Rails Environment loaded" unless defined? Rails
344
333
  require 'action_controller'
345
334
 
346
- super options.merge(:default_url_options => default_url_options)
347
- end
335
+ if Rails.version >= "3"
336
+ self.class.send(:include, Rails.application.routes.url_helpers)
337
+ end
348
338
 
349
- def document_root
350
- "#{Rails.root}/public"
339
+ DEFAULTS.merge!(:document_root => "#{Rails.root}/public", :url_options => default_url_options)
340
+ super(options)
351
341
  end
352
- end
353
342
 
343
+ end
354
344
 
355
345
 
356
346
  class BigSitemapMerb < BigSitemap
357
347
 
358
348
  def initialize(options={})
349
+ raise "No Merb Environment loaded" unless defined? Merb
359
350
  require 'extlib'
360
- super
361
- end
362
351
 
363
- def document_root
364
- "#{Merb.root}/public"
352
+ DEFAULTS.merge!(:document_root => "#{Merb.root}/public")
353
+ super(options)
365
354
  end
366
355
 
367
356
  def table_name(model)
368
357
  Extlib::Inflection.tableize(model.to_s)
369
358
  end
370
359
 
371
- end
360
+ end
@@ -15,12 +15,20 @@ class BigSitemapTest < Test::Unit::TestCase
15
15
  assert_raise(ArgumentError) { BigSitemap.new(:document_root => tmp_dir) }
16
16
  end
17
17
 
18
- should 'generate the same base URL' do
18
+ should 'generate the same base URL with :base_url option' do
19
19
  options = {:document_root => tmp_dir}
20
- assert_equal(
21
- BigSitemap.new(options.merge(:base_url => 'http://example.com')).root_url,
22
- BigSitemap.new(options.merge(:url_options => {:host => 'example.com'})).root_url
23
- )
20
+ url = 'http://example.com'
21
+ sitemap = BigSitemap.new(options.merge(:base_url => url))
22
+
23
+ assert_equal url, sitemap.instance_variable_get(:@options)[:base_url]
24
+ end
25
+
26
+ should 'generate the same base URL with :url_options option' do
27
+ options = {:document_root => tmp_dir}
28
+ url = 'http://example.com'
29
+ sitemap = BigSitemap.new(options.merge(:url_options => {:host => 'example.com'}))
30
+
31
+ assert_equal url, sitemap.instance_variable_get(:@options)[:base_url]
24
32
  end
25
33
 
26
34
  should 'generate a sitemap index file' do
@@ -287,6 +295,32 @@ class BigSitemapTest < Test::Unit::TestCase
287
295
  end
288
296
 
289
297
  context 'partial update' do
298
+
299
+ context 'prepare_update' do
300
+ should 'generate correct condition for partial update' do
301
+ filename = "#{sitemaps_dir}/sitemap_test_models"
302
+
303
+ create_sitemap(:partial_update => true).clean
304
+ add_model(:num_items => 50) #TestModel
305
+
306
+ File.open("#{filename}_23.xml", 'w')
307
+ assert_equal "(id >= 23)", @sitemap.send(:prepare_update).first.last[:conditions]
308
+
309
+ File.open("#{filename}_42.xml", 'w')
310
+ assert_equal "(id >= 23) AND (id >= 42)", @sitemap.send(:prepare_update).first.last[:conditions]
311
+ end
312
+
313
+ should 'generate correct condition for partial update with custom column' do
314
+ filename = "#{sitemaps_dir}/sitemap_test_models"
315
+
316
+ create_sitemap(:partial_update => true).clean
317
+ add_model(:num_items => 50, :primary_column => 'name') #TestModel
318
+
319
+ File.open("#{filename}_666.xml", 'w')
320
+ assert_equal "(name >= 666)", @sitemap.send(:prepare_update).first.last[:conditions]
321
+ end
322
+ end
323
+
290
324
  should 'generate for all xml files in directory and delete last file' do
291
325
  TestModel.current_id = last_id = 27
292
326
  filename = "#{sitemaps_dir}/sitemap_test_models"
@@ -354,6 +388,24 @@ class BigSitemapTest < Test::Unit::TestCase
354
388
  assert_equal 3, elements("#{filename}_46.xml", 'loc').size
355
389
  end
356
390
 
391
+ context 'escape' do
392
+ should 'add if not number' do
393
+ create_sitemap
394
+ data = {
395
+ 42 => 42,
396
+ '23' => 23,
397
+ "test" => "'test'",
398
+ "test10" => "'test10'",
399
+ "10test" => "'10test'",
400
+ "10t' est" => "'10t\\' est'",
401
+ }
402
+ data.each do |key, value|
403
+ assert_equal value, @sitemap.send(:escape_if_string, key)
404
+ end
405
+
406
+ end
407
+ end
408
+
357
409
  context 'lockfile' do
358
410
  should 'create and delete lock file' do
359
411
  sitemap = BigSitemap.new(:base_url => 'http://example.com', :document_root => tmp_dir)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: big_sitemap
3
3
  version: !ruby/object:Gem::Version
4
- hash: 59
4
+ hash: 57
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
- - 2
10
- version: 0.8.2
9
+ - 3
10
+ version: 0.8.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alex Rabarts
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-01-25 00:00:00 +00:00
19
+ date: 2011-03-14 00:00:00 +00:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency