big_sitemap 0.8.2 → 0.8.3

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