Class: BigSitemap

Inherits:
Object
  • Object
show all
Defined in:
lib/big_sitemap.rb,
lib/big_sitemap/builder.rb

Direct Known Subclasses

BigSitemapMerb, BigSitemapRails

Defined Under Namespace

Classes: Builder, IndexBuilder

Constant Summary collapse

DEFAULTS =
{
  :max_per_sitemap => Builder::MAX_URLS,
  :document_path   => '/',
  :gzip            => true,

  # Opinionated
  :ping_google => true,
  :ping_yahoo  => false, # needs :yahoo_app_id
  :ping_bing   => false,
  :ping_ask    => false, 
  :ping_yandex => false
}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ BigSitemap

Returns a new instance of BigSitemap.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/big_sitemap.rb', line 46

def initialize(options={})
  @options = DEFAULTS.merge options

  if @options[:max_per_sitemap] <= 1
    raise ArgumentError, '":max_per_sitemap" must be greater than 1'
  end

  if @options[:url_options] && !@options[:base_url]
    @options[:base_url] = URI::Generic.build( {:scheme => "http"}.merge(@options.delete(:url_options)) ).to_s
  end

  unless @options[:base_url]
    raise ArgumentError, 'you must specify either ":url_options" hash or ":base_url" string'
  end
  @options[:url_path] ||= @options[:document_path]

  unless @options[:document_root]
    raise ArgumentError, 'Document root must be specified with the ":document_root" option"'
  end

  @options[:document_full] ||= File.join(@options[:document_root], @options[:document_path])
  unless @options[:document_full]
    raise ArgumentError, 'Document root must be specified with the ":document_root" option, the full path with ":document_full"'
  end

  Dir.mkdir(@options[:document_full]) unless File.exists?(@options[:document_full])

  @sources       = []
  @models        = []
  @sitemap_files = []
end

Class Method Details

.generate(options = {}, &block) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
# File 'lib/big_sitemap.rb', line 21

def generate(options={}, &block)
  @sitemap = self.new(options)

  @sitemap.first_id_of_last_sitemap = first_id_of_last_sitemap

  instance_eval(&block)

  @sitemap.with_lock do
    @sitemap.generate(options)
  end
end

Instance Method Details

#add(model, options = {}) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/big_sitemap.rb', line 90

def add(model, options={})
  warn 'BigSitemap#add is deprecated.  Please use BigSitemap.generate and call add inside the block (in BigSitemap 1.0.0+).  You will have to perform the find and generate the path for each record yourself.'
  @models << model

  filename_suffix = @models.count(model) - 1

  options[:path]           ||= table_name(model)
  options[:filename]       ||= file_name(model)
  options[:primary_column] ||= 'id' if model.new.respond_to?('id')
  options[:partial_update]   = @options[:partial_update] && options[:partial_update] != false

  options[:filename] << "_#{filename_suffix}" unless filename_suffix == 0

  @sources << [model, options.dup]

  self
end

#add_path(path, options) ⇒ Object



108
109
110
111
112
# File 'lib/big_sitemap.rb', line 108

def add_path(path, options)
  @paths ||= []
  @paths << [path, options]
  self
end

#add_static(url, time = nil, frequency = nil, priority = nil) ⇒ Object



114
115
116
117
118
119
# File 'lib/big_sitemap.rb', line 114

def add_static(url, time = nil, frequency = nil, priority = nil)
  warn 'BigSitemap#add_static is deprecated.  Please use BigSitemap#add_path instead'
  @static_pages ||= []
  @static_pages << [url, time, frequency, priority]
  self
end

#add_urlsObject



164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/big_sitemap.rb', line 164

def add_urls
  return self if Array(@paths).empty?

  with_sitemap do |builder|
    @paths.uniq!
    @paths.each do |path, options|
      url = URI.join(@options[:base_url], path)
      builder.add_url! url, options
    end
  end

  self
end

#cleanObject



143
144
145
146
147
148
149
# File 'lib/big_sitemap.rb', line 143

def clean
  Dir[dir_files].each do |file|
    FileUtils.rm file
  end

  self
end

#dir_filesObject



139
140
141
# File 'lib/big_sitemap.rb', line 139

def dir_files
  File.join(@options[:document_full], "sitemap*.{xml,xml.gz}")
end

#document_fullObject



86
87
88
# File 'lib/big_sitemap.rb', line 86

def document_full
  @options[:document_full]
end

#file_name(name = nil) ⇒ Object



132
133
134
135
136
137
# File 'lib/big_sitemap.rb', line 132

def file_name(name=nil)
  name   = table_name(name) unless (name.nil? || name.is_a?(String))
  prefix = 'sitemap'
  prefix << '_' unless name.nil?
  File.join(@options[:document_full], "#{prefix}#{name}")
end

#first_id_of_last_sitemapObject



78
79
80
# File 'lib/big_sitemap.rb', line 78

def first_id_of_last_sitemap
  @first_id_of_last_sitemap
end

#first_id_of_last_sitemap=(first_id) ⇒ Object



82
83
84
# File 'lib/big_sitemap.rb', line 82

def first_id_of_last_sitemap=(first_id)
  @first_id_of_last_sitemap = first_id
end

#generate(options = {}) ⇒ Object

TODO: Deprecate (move to private)



152
153
154
155
156
157
158
159
160
161
162
# File 'lib/big_sitemap.rb', line 152

def generate(options={})
  clean unless options[:partial_update]

  add_urls

  generate_sitemap_index

  ping_search_engines

  self
end

#generate_sitemap_index(files = nil) ⇒ Object

Create a sitemap index document



179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/big_sitemap.rb', line 179

def generate_sitemap_index(files=nil)
  files ||= Dir[dir_files]

  with_sitemap({:name => 'index', :type => 'index'}) do |sitemap|
    for path in files
      next if path =~ /index/
      sitemap.add_url! url_for_sitemap(path), :last_modified => File.stat(path).mtime
    end
  end

  self
end

#ping_search_enginesObject



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'lib/big_sitemap.rb', line 192

def ping_search_engines
  require 'net/http'
  require 'cgi'

  sitemap_uri = CGI::escape(url_for_sitemap(@sitemap_files.last))

  if @options[:ping_google]
    Net::HTTP.get('www.google.com', "/webmasters/tools/ping?sitemap=#{sitemap_uri}")
  end

  if @options[:ping_yahoo]
    if @options[:yahoo_app_id]
      Net::HTTP.get(
        'search.yahooapis.com', "/SiteExplorerService/V1/updateNotification?" +
          "appid=#{@options[:yahoo_app_id]}&url=#{sitemap_uri}"
      )
    else
      STDERR.puts 'unable to ping Yahoo: no ":yahoo_app_id" provided'
    end
  end

  if @options[:ping_bing]
    Net::HTTP.get('www.bing.com', "/webmaster/ping.aspx?siteMap=#{sitemap_uri}")
  end

  if @options[:ping_ask]
    Net::HTTP.get('submissions.ask.com', "/ping?sitemap=#{sitemap_uri}")
  end

  if @options[:ping_yandex]
    Net::HTTP.get('webmaster.yandex.ru', "/wmconsole/sitemap_list.xml?host=#{sitemap_uri}")
  end
end

#with_lockObject



121
122
123
124
125
126
127
128
129
130
# File 'lib/big_sitemap.rb', line 121

def with_lock
  lock!
  begin
    yield
  ensure
    unlock!
  end
rescue Errno::EACCES => e
  STDERR.puts 'Lockfile exists' if $VERBOSE
end