spree_dynamic_sitemaps 0.50.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/README.markdown +32 -0
- data/Rakefile +120 -0
- data/app/controllers/sitemap_controller.rb +99 -0
- data/app/helpers/sitemap_helper.rb +2 -0
- data/app/views/sitemap/index.html.erb +29 -0
- data/app/views/sitemap/index.text.erb +4 -0
- data/app/views/sitemap/index.xml.builder +0 -0
- data/config/routes.rb +5 -0
- data/lib/dynamic_sitemaps.rb +17 -0
- data/lib/tasks/dynamic_sitemaps.rake +10 -0
- data/lib/tasks/install.rake +26 -0
- data/spree_dynamic_sitemaps.gemspec +19 -0
- metadata +75 -0
data/README.markdown
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
SUMMARY
|
2
|
+
=======
|
3
|
+
|
4
|
+
This Spree extension generates dynamic, seo-friendly sitemaps on the fly in html, xml and txt formats.
|
5
|
+
|
6
|
+
This extension is compatible with the [static_content][1] extension and will check for content in the Page table.
|
7
|
+
|
8
|
+
In order to avoid an seo penalty for duplicate content, products are only listed once at /product/_productName_
|
9
|
+
|
10
|
+
for rails 3 and spree >= 0.30.0
|
11
|
+
|
12
|
+
INSTALLATION
|
13
|
+
------------
|
14
|
+
|
15
|
+
1. Install the extension
|
16
|
+
|
17
|
+
gem 'dynamic_sitemaps', :git => 'git://github.com/bzt/spree_dynamic_sitemaps.git'
|
18
|
+
bundle install
|
19
|
+
|
20
|
+
(rake dynamic_sitemaps:install)
|
21
|
+
|
22
|
+
2. Add link to sitemap to a view
|
23
|
+
|
24
|
+
`<%= link_to 'Sitemap', '/sitemap' %>`
|
25
|
+
|
26
|
+
The sitemaps are accessible at public_domain/sitemap.html, public_domain/sitemap.xml, and public_domain/sitemap.txt
|
27
|
+
|
28
|
+
Hat tip [stephp][2] for doing all the heavy lifting with her [spree-sitemaps][3] extension.
|
29
|
+
|
30
|
+
[1]: http://ext.spreecommerce.com/extensions/2-static-content
|
31
|
+
[2]: http://github.com/stephp
|
32
|
+
[3]: http://ext.spreecommerce.com/extensions/3-spree-sitemaps
|
data/Rakefile
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
# I think this is the one that should be moved to the extension Rakefile template
|
2
|
+
|
3
|
+
# In rails 1.2, plugins aren't available in the path until they're loaded.
|
4
|
+
# Check to see if the rspec plugin is installed first and require
|
5
|
+
# it if it is. If not, use the gem version.
|
6
|
+
|
7
|
+
# Determine where the RSpec plugin is by loading the boot
|
8
|
+
unless defined? SPREE_ROOT
|
9
|
+
ENV["RAILS_ENV"] = "test"
|
10
|
+
case
|
11
|
+
when ENV["SPREE_ENV_FILE"]
|
12
|
+
require File.dirname(ENV["SPREE_ENV_FILE"]) + "/boot"
|
13
|
+
when File.dirname(__FILE__) =~ %r{vendor/SPREE/vendor/extensions}
|
14
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
|
15
|
+
else
|
16
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'rake'
|
21
|
+
require 'rake/rdoctask'
|
22
|
+
require 'rake/testtask'
|
23
|
+
|
24
|
+
rspec_base = File.expand_path(SPREE_ROOT + '/vendor/plugins/rspec/lib')
|
25
|
+
$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
|
26
|
+
require 'spec/rake/spectask'
|
27
|
+
# require 'spec/translator'
|
28
|
+
|
29
|
+
# Cleanup the SPREE_ROOT constant so specs will load the environment
|
30
|
+
Object.send(:remove_const, :SPREE_ROOT)
|
31
|
+
|
32
|
+
extension_root = File.expand_path(File.dirname(__FILE__))
|
33
|
+
|
34
|
+
task :default => :spec
|
35
|
+
task :stats => "spec:statsetup"
|
36
|
+
|
37
|
+
desc "Run all specs in spec directory"
|
38
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
39
|
+
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
|
40
|
+
t.spec_files = FileList["#{extension_root}/spec/**/*_spec.rb"]
|
41
|
+
end
|
42
|
+
|
43
|
+
namespace :spec do
|
44
|
+
desc "Run all specs in spec directory with RCov"
|
45
|
+
Spec::Rake::SpecTask.new(:rcov) do |t|
|
46
|
+
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
|
47
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
48
|
+
t.rcov = true
|
49
|
+
t.rcov_opts = ['--exclude', 'spec', '--rails']
|
50
|
+
end
|
51
|
+
|
52
|
+
desc "Print Specdoc for all specs"
|
53
|
+
Spec::Rake::SpecTask.new(:doc) do |t|
|
54
|
+
t.spec_opts = ["--format", "specdoc", "--dry-run"]
|
55
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
56
|
+
end
|
57
|
+
|
58
|
+
[:models, :controllers, :views, :helpers].each do |sub|
|
59
|
+
desc "Run the specs under spec/#{sub}"
|
60
|
+
Spec::Rake::SpecTask.new(sub) do |t|
|
61
|
+
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
|
62
|
+
t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Hopefully no one has written their extensions in pre-0.9 style
|
67
|
+
# desc "Translate specs from pre-0.9 to 0.9 style"
|
68
|
+
# task :translate do
|
69
|
+
# translator = ::Spec::Translator.new
|
70
|
+
# dir = RAILS_ROOT + '/spec'
|
71
|
+
# translator.translate(dir, dir)
|
72
|
+
# end
|
73
|
+
|
74
|
+
# Setup specs for stats
|
75
|
+
task :statsetup do
|
76
|
+
require 'code_statistics'
|
77
|
+
::STATS_DIRECTORIES << %w(Model\ specs spec/models)
|
78
|
+
::STATS_DIRECTORIES << %w(View\ specs spec/views)
|
79
|
+
::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
|
80
|
+
::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
|
81
|
+
::CodeStatistics::TEST_TYPES << "Model specs"
|
82
|
+
::CodeStatistics::TEST_TYPES << "View specs"
|
83
|
+
::CodeStatistics::TEST_TYPES << "Controller specs"
|
84
|
+
::CodeStatistics::TEST_TYPES << "Helper specs"
|
85
|
+
::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
|
86
|
+
end
|
87
|
+
|
88
|
+
namespace :db do
|
89
|
+
namespace :fixtures do
|
90
|
+
desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
|
91
|
+
task :load => :environment do
|
92
|
+
require 'active_record/fixtures'
|
93
|
+
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
|
94
|
+
(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
|
95
|
+
Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
desc 'Generate documentation for the sitemaps extension.'
|
103
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
104
|
+
rdoc.rdoc_dir = 'rdoc'
|
105
|
+
rdoc.title = 'SpreeSitemapsExtension'
|
106
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
107
|
+
rdoc.rdoc_files.include('README')
|
108
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
109
|
+
end
|
110
|
+
|
111
|
+
# For extensions that are in transition
|
112
|
+
desc 'Test the sitemaps extension.'
|
113
|
+
Rake::TestTask.new(:test) do |t|
|
114
|
+
t.libs << 'lib'
|
115
|
+
t.pattern = 'test/**/*_test.rb'
|
116
|
+
t.verbose = true
|
117
|
+
end
|
118
|
+
|
119
|
+
# Load any custom rakefiles for extension
|
120
|
+
Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
|
@@ -0,0 +1,99 @@
|
|
1
|
+
class SitemapController < Spree::BaseController
|
2
|
+
def index
|
3
|
+
@public_dir = root_url
|
4
|
+
|
5
|
+
@products = Product.active.find(:all)
|
6
|
+
@taxonomies = Taxonomy.all
|
7
|
+
|
8
|
+
# Get Pages from static_content extension
|
9
|
+
@pages = _select_static_pages
|
10
|
+
|
11
|
+
respond_to do |format|
|
12
|
+
format.html { }
|
13
|
+
format.xml do
|
14
|
+
nav = _build_taxon_hash
|
15
|
+
nav = _build_pages_hash nav
|
16
|
+
nav = _add_products_to_tax nav, false
|
17
|
+
render :layout => false, :xml => _build_xml(nav, @public_dir)
|
18
|
+
end
|
19
|
+
format.text do
|
20
|
+
@nav = _add_products_to_tax(_build_taxon_hash, false)
|
21
|
+
render :layout => false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def _build_xml(nav, public_dir)
|
28
|
+
returning '' do |output|
|
29
|
+
xml = Builder::XmlMarkup.new(:target => output, :indent => 2)
|
30
|
+
xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
|
31
|
+
xml.urlset( :xmlns => "http://www.sitemaps.org/schemas/sitemap/0.9" ) {
|
32
|
+
xml.url {
|
33
|
+
xml.loc public_dir
|
34
|
+
xml.lastmod Date.today
|
35
|
+
xml.changefreq 'daily'
|
36
|
+
xml.priority '1.0'
|
37
|
+
}
|
38
|
+
nav.each do |k, v|
|
39
|
+
xml.url {
|
40
|
+
xml.loc public_dir + v['link']
|
41
|
+
xml.lastmod v['updated'].xmlschema #change timestamp of last modified
|
42
|
+
xml.changefreq 'weekly'
|
43
|
+
xml.priority '0.8'
|
44
|
+
}
|
45
|
+
end
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def _build_taxon_hash
|
51
|
+
nav = Hash.new
|
52
|
+
Taxon.find(:all).each do |taxon|
|
53
|
+
tinfo = Hash.new
|
54
|
+
tinfo['name'] = taxon.name
|
55
|
+
tinfo['depth'] = taxon.permalink.split('/').size
|
56
|
+
tinfo['link'] = 't/' + taxon.permalink
|
57
|
+
tinfo['updated'] = taxon.updated_at
|
58
|
+
nav[taxon.permalink] = tinfo
|
59
|
+
end
|
60
|
+
nav
|
61
|
+
end
|
62
|
+
|
63
|
+
def _add_products_to_tax(nav, multiples_allowed)
|
64
|
+
Product.active.find(:all).each do |product|
|
65
|
+
pinfo = Hash.new
|
66
|
+
pinfo['name'] = product.name
|
67
|
+
pinfo['link'] = 'products/' + product.permalink # primary
|
68
|
+
pinfo['updated'] = product.updated_at
|
69
|
+
|
70
|
+
nav[pinfo['link']] = pinfo # store primary
|
71
|
+
end
|
72
|
+
nav
|
73
|
+
end
|
74
|
+
|
75
|
+
def _build_pages_hash(nav)
|
76
|
+
return nav if @pages.empty?
|
77
|
+
|
78
|
+
@pages.each do |page|
|
79
|
+
nav[page.slug] = {'name' => page.title,
|
80
|
+
'link' => page.slug.gsub(/^\//, ''),
|
81
|
+
'updated' => page.updated_at}
|
82
|
+
end
|
83
|
+
nav
|
84
|
+
end
|
85
|
+
|
86
|
+
def _select_static_pages
|
87
|
+
pages = []
|
88
|
+
begin
|
89
|
+
slugs_to_reject = ["/on-main-page"]
|
90
|
+
Page.visible.each do |page|
|
91
|
+
pages << page unless slugs_to_reject.include?(page.slug)
|
92
|
+
end
|
93
|
+
|
94
|
+
rescue NameError
|
95
|
+
pages = []
|
96
|
+
end
|
97
|
+
pages
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<h1>Sitemap</h1>
|
2
|
+
<%= link_to Spree::Config[:site_name], @public_dir %><br />
|
3
|
+
<% unless @pages.blank? %>
|
4
|
+
<ul>
|
5
|
+
<% @pages.each do |page| %>
|
6
|
+
<li><%= link_to page.title, @public_dir + page.slug %></li>
|
7
|
+
<% end %>
|
8
|
+
</ul>
|
9
|
+
<% end %>
|
10
|
+
<% unless @taxonomies.blank? %>
|
11
|
+
<% @taxonomies.each do |taxonomy| %>
|
12
|
+
<% taxons = Taxon.find_all_by_taxonomy_id(taxonomy.id) %>
|
13
|
+
<h3><%= taxonomy.name %></h3>
|
14
|
+
<ul>
|
15
|
+
<% taxons.each do |taxon| %>
|
16
|
+
<% unless taxon.name == taxonomy.name %><li><%= link_to taxon.name, @public_dir + taxon.permalink %></li><% end %>
|
17
|
+
<% end %>
|
18
|
+
</ul>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<% end %>
|
22
|
+
<% unless @products.blank? %>
|
23
|
+
<h3>Products</h3>
|
24
|
+
<ul>
|
25
|
+
<% @products.each do |product| %>
|
26
|
+
<li><%= link_to product.name, @public_dir + "products/" + product.permalink %></li>
|
27
|
+
<% end %>
|
28
|
+
</ul>
|
29
|
+
<% end %>
|
File without changes
|
data/config/routes.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spree_core'
|
2
|
+
|
3
|
+
module DynamicSitemaps
|
4
|
+
class Engine < Rails::Engine
|
5
|
+
|
6
|
+
config.autoload_paths += %W(#{config.root}/lib)
|
7
|
+
|
8
|
+
def self.activate
|
9
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
|
10
|
+
Rails.env.production? ? require(c) : load(c)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
config.to_prepare &method(:activate).to_proc
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
namespace :db do
|
2
|
+
desc "Bootstrap your database for Spree."
|
3
|
+
task :bootstrap => :environment do
|
4
|
+
# load initial database fixtures (in db/sample/*.yml) into the current environment's database
|
5
|
+
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
|
6
|
+
Dir.glob(File.join(DynamicSitemaps.root, "db", 'sample', '*.{yml,csv}')).each do |fixture_file|
|
7
|
+
Fixtures.create_fixtures("#{DynamicSitemaps.root}/db/sample", File.basename(fixture_file, '.*'))
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
namespace :dynamic_sitemaps do
|
2
|
+
desc "Copies all migrations and assets (NOTE: This will be obsolete with Rails 3.1)"
|
3
|
+
task :install do
|
4
|
+
Rake::Task['dynamic_sitemaps:install:migrations'].invoke
|
5
|
+
Rake::Task['dynamic_sitemaps:install:assets'].invoke
|
6
|
+
end
|
7
|
+
|
8
|
+
namespace :install do
|
9
|
+
desc "Copies all migrations (NOTE: This will be obsolete with Rails 3.1)"
|
10
|
+
task :migrations do
|
11
|
+
source = File.join(File.dirname(__FILE__), '..', '..', 'db')
|
12
|
+
destination = File.join(Rails.root, 'db')
|
13
|
+
puts "INFO: Mirroring assets from #{source} to #{destination}"
|
14
|
+
Spree::FileUtilz.mirror_files(source, destination)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Copies all assets (NOTE: This will be obsolete with Rails 3.1)"
|
18
|
+
task :assets do
|
19
|
+
source = File.join(File.dirname(__FILE__), '..', '..', 'public')
|
20
|
+
destination = File.join(Rails.root, 'public')
|
21
|
+
puts "INFO: Mirroring assets from #{source} to #{destination}"
|
22
|
+
Spree::FileUtilz.mirror_files(source, destination)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.platform = Gem::Platform::RUBY
|
3
|
+
s.name = 'spree_dynamic_sitemaps'
|
4
|
+
s.version = '0.50.0'
|
5
|
+
s.summary = 'Google sitemap for Spree stores'
|
6
|
+
#s.description = 'Add (optional) gem description here'
|
7
|
+
s.required_ruby_version = '>= 1.8.7'
|
8
|
+
|
9
|
+
s.author = 'bzt'
|
10
|
+
# s.email = ''
|
11
|
+
# s.homepage = ''
|
12
|
+
# s.rubyforge_project = ''
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.require_path = 'lib'
|
17
|
+
s.requirements << 'none'
|
18
|
+
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spree_dynamic_sitemaps
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 50
|
8
|
+
- 0
|
9
|
+
version: 0.50.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- bzt
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-05-01 00:00:00 +04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description:
|
22
|
+
email:
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files: []
|
28
|
+
|
29
|
+
files:
|
30
|
+
- README.markdown
|
31
|
+
- Rakefile
|
32
|
+
- app/controllers/sitemap_controller.rb
|
33
|
+
- app/helpers/sitemap_helper.rb
|
34
|
+
- app/views/sitemap/index.html.erb
|
35
|
+
- app/views/sitemap/index.text.erb
|
36
|
+
- app/views/sitemap/index.xml.builder
|
37
|
+
- config/routes.rb
|
38
|
+
- lib/dynamic_sitemaps.rb
|
39
|
+
- lib/tasks/dynamic_sitemaps.rake
|
40
|
+
- lib/tasks/install.rake
|
41
|
+
- spree_dynamic_sitemaps.gemspec
|
42
|
+
has_rdoc: true
|
43
|
+
homepage:
|
44
|
+
licenses: []
|
45
|
+
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 1
|
57
|
+
- 8
|
58
|
+
- 7
|
59
|
+
version: 1.8.7
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
requirements:
|
68
|
+
- none
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 1.3.6
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: Google sitemap for Spree stores
|
74
|
+
test_files: []
|
75
|
+
|