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 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,2 @@
1
+ module SitemapHelper
2
+ 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 %>
@@ -0,0 +1,4 @@
1
+ <%= @public_dir %>
2
+ <% @nav.sort.each do |k,v| -%>
3
+ <%= @public_dir %><%= v['link'] %>
4
+ <% end -%>
File without changes
data/config/routes.rb ADDED
@@ -0,0 +1,5 @@
1
+ Rails.application.routes.draw do
2
+
3
+ resources :sitemap
4
+
5
+ end
@@ -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
+