Add sitemap functionality and better documentation

This commit is contained in:
2014-11-05 20:21:57 +01:00
parent 6afc9bdae9
commit b6fec4f880
9 changed files with 323 additions and 228 deletions
+3 -2
View File
@@ -5,9 +5,9 @@ source "http://rubygems.org"
# development dependencies will be added by default to the :development group.
gemspec
gem "rails", ">= 4.1.4"
gem "rails", "4.2.0.beta4"
group :assets do
gem 'sass-rails', '4.0.2'
gem 'sass-rails', '5.0.0.beta1'
gem 'bourbon'
gem 'coffee-script'
#gem 'therubyracer', :platforms => :ruby
@@ -25,6 +25,7 @@ gem 'haml-rails'
gem 'slim-rails'
gem 'paperclip'
gem 'email_validator'
gem 'actionpack-page_caching'
# Declare any dependencies that are still in development here instead of in
# your gemspec. These might include edge Rails or gems from your path or
# Git. Remember to move these dependencies to your gemspec before releasing
+118 -95
View File
@@ -1,6 +1,6 @@
GIT
remote: git://github.com/bterkuile/couch_potato.git
revision: 6fbcb3edcaf3edec63230308f123c1e03417967d
revision: 8929326ee855e964a441a8ede941b52c0ee88a16
specs:
couch_potato (0.7.1)
activemodel
@@ -43,41 +43,52 @@ PATH
GEM
remote: http://rubygems.org/
specs:
actionmailer (4.1.4)
actionpack (= 4.1.4)
actionview (= 4.1.4)
mail (~> 2.5.4)
actionpack (4.1.4)
actionview (= 4.1.4)
activesupport (= 4.1.4)
rack (~> 1.5.2)
actionmailer (4.2.0.beta4)
actionpack (= 4.2.0.beta4)
actionview (= 4.2.0.beta4)
activejob (= 4.2.0.beta4)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.4)
actionpack (4.2.0.beta4)
actionview (= 4.2.0.beta4)
activesupport (= 4.2.0.beta4)
rack (~> 1.6.0.beta)
rack-test (~> 0.6.2)
actionview (4.1.4)
activesupport (= 4.1.4)
rails-dom-testing (~> 1.0, >= 1.0.4)
rails-html-sanitizer (~> 1.0, >= 1.0.1)
actionpack-page_caching (1.0.2)
actionpack (>= 4.0.0, < 5)
actionview (4.2.0.beta4)
activesupport (= 4.2.0.beta4)
builder (~> 3.1)
erubis (~> 2.7.0)
activemodel (4.1.4)
activesupport (= 4.1.4)
rails-dom-testing (~> 1.0, >= 1.0.4)
rails-html-sanitizer (~> 1.0, >= 1.0.1)
activejob (4.2.0.beta4)
activesupport (= 4.2.0.beta4)
globalid (>= 0.3.0)
activemodel (4.2.0.beta4)
activesupport (= 4.2.0.beta4)
builder (~> 3.1)
activerecord (4.1.4)
activemodel (= 4.1.4)
activesupport (= 4.1.4)
arel (~> 5.0.0)
activesupport (4.1.4)
i18n (~> 0.6, >= 0.6.9)
activerecord (4.2.0.beta4)
activemodel (= 4.2.0.beta4)
activesupport (= 4.2.0.beta4)
arel (>= 6.0.0.beta2, < 6.1)
activesupport (4.2.0.beta4)
i18n (>= 0.7.0.beta1, < 0.8)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.1)
tzinfo (~> 1.1)
arel (5.0.1.20140414130214)
bcrypt (3.1.7)
arel (6.0.0.beta2)
bcrypt (3.1.9)
bootstrap-sass (2.3.2.2)
sass (~> 3.2)
bourbon (3.2.3)
sass (~> 3.2)
bourbon (4.0.2)
sass (~> 3.3)
thor
builder (3.2.2)
capybara (2.4.1)
capybara (2.4.4)
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
@@ -91,16 +102,17 @@ GEM
coffee-script (2.3.0)
coffee-script-source
execjs
coffee-script-source (1.7.1)
coffee-script-source (1.8.0)
couchrest (1.2.0)
mime-types (~> 1.15)
multi_json (~> 1.0)
rest-client (~> 1.6.1)
daemons (1.1.9)
devise (3.2.4)
devise (3.4.1)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5)
responders
thread_safe (~> 0.1)
warden (~> 1.2.3)
diff-lcs (1.2.5)
@@ -108,12 +120,14 @@ GEM
activemodel
erubis (2.7.0)
eventmachine (1.0.3)
execjs (2.2.1)
factory_girl (4.4.0)
execjs (2.2.2)
factory_girl (4.5.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.4.1)
factory_girl (~> 4.4.0)
factory_girl_rails (4.5.0)
factory_girl (~> 4.5.0)
railties (>= 3.0.0)
globalid (0.3.0)
activesupport (>= 4.1.0)
haml (4.0.5)
tilt
haml-rails (0.5.3)
@@ -122,119 +136,127 @@ GEM
haml (>= 3.1, < 5.0)
railties (>= 4.0.1)
hike (1.2.3)
i18n (0.6.11)
jquery-rails (3.1.1)
i18n (0.7.0.beta1)
jquery-rails (3.1.2)
railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.0)
jquery-ui-rails (5.0.2)
railties (>= 3.2.16)
json (1.8.1)
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
loofah (2.0.1)
nokogiri (>= 1.5.9)
mail (2.6.3)
mime-types (>= 1.16, < 3)
method_source (0.8.2)
mime-types (1.25.1)
mini_portile (0.6.0)
minitest (5.4.0)
mini_portile (0.6.1)
minitest (5.4.2)
multi_json (1.10.1)
nokogiri (1.6.2.1)
mini_portile (= 0.6.0)
nokogiri (1.6.4)
mini_portile (~> 0.6.0)
paperclip (4.2.0)
activemodel (>= 3.0.0)
activesupport (>= 3.0.0)
cocaine (~> 0.5.3)
mime-types
polyglot (0.3.5)
pry (0.10.0)
pry (0.10.1)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
pry-rails (0.3.2)
pry (>= 0.9.10)
rack (1.5.2)
rack (1.6.0.beta)
rack-test (0.6.2)
rack (>= 1.0)
rails (4.1.4)
actionmailer (= 4.1.4)
actionpack (= 4.1.4)
actionview (= 4.1.4)
activemodel (= 4.1.4)
activerecord (= 4.1.4)
activesupport (= 4.1.4)
rails (4.2.0.beta4)
actionmailer (= 4.2.0.beta4)
actionpack (= 4.2.0.beta4)
actionview (= 4.2.0.beta4)
activejob (= 4.2.0.beta4)
activemodel (= 4.2.0.beta4)
activerecord (= 4.2.0.beta4)
activesupport (= 4.2.0.beta4)
bundler (>= 1.3.0, < 2.0)
railties (= 4.1.4)
sprockets-rails (~> 2.0)
railties (4.1.4)
actionpack (= 4.1.4)
activesupport (= 4.1.4)
railties (= 4.2.0.beta4)
sprockets-rails (~> 3.0.0.beta1)
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.4)
activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6.0)
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.1)
loofah (~> 2.0)
railties (4.2.0.beta4)
actionpack (= 4.2.0.beta4)
activesupport (= 4.2.0.beta4)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (10.3.2)
rdoc (4.1.1)
rdoc (4.1.2)
json (~> 1.4)
responders (2.0.1)
railties (>= 4.2.0.alpha, < 5)
rest-client (1.6.8)
mime-types (~> 1.16)
rdoc (>= 2.4.2)
rspec-core (3.0.2)
rspec-support (~> 3.0.0)
rspec-expectations (3.0.2)
rspec-core (3.1.7)
rspec-support (~> 3.1.0)
rspec-expectations (3.1.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.0.0)
rspec-its (1.0.1)
rspec-core (>= 2.99.0.beta1)
rspec-expectations (>= 2.99.0.beta1)
rspec-mocks (3.0.2)
rspec-support (~> 3.0.0)
rspec-rails (3.0.1)
rspec-support (~> 3.1.0)
rspec-its (1.1.0)
rspec-core (>= 3.0.0)
rspec-expectations (>= 3.0.0)
rspec-mocks (3.1.3)
rspec-support (~> 3.1.0)
rspec-rails (3.1.0)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 3.0.0)
rspec-expectations (~> 3.0.0)
rspec-mocks (~> 3.0.0)
rspec-support (~> 3.0.0)
rspec-support (3.0.2)
sass (3.2.19)
sass-rails (4.0.2)
rspec-core (~> 3.1.0)
rspec-expectations (~> 3.1.0)
rspec-mocks (~> 3.1.0)
rspec-support (~> 3.1.0)
rspec-support (3.1.2)
sass (3.4.7)
sass-rails (5.0.0.beta1)
railties (>= 4.0.0, < 5.0)
sass (~> 3.2.0)
sprockets (~> 2.8, <= 2.11.0)
sprockets-rails (~> 2.0.0)
slim (2.0.3)
temple (~> 0.6.6)
sass (~> 3.2)
sprockets (~> 2.12)
sprockets-rails (>= 2.0, < 4.0)
slim (2.1.0)
temple (~> 0.6.9)
tilt (>= 1.3.3, < 2.1)
slim-rails (2.1.5)
actionpack (>= 3.0, < 4.2)
activesupport (>= 3.0, < 4.2)
railties (>= 3.0, < 4.2)
slim (~> 2.0)
slop (3.5.0)
sprockets (2.11.0)
slop (3.6.0)
sprockets (2.12.3)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sprockets-rails (2.0.1)
actionpack (>= 3.0)
activesupport (>= 3.0)
sprockets-rails (3.0.0.beta1)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (~> 2.8)
steak (2.0.0)
capybara (>= 1.0.0)
rspec-rails (>= 2.5.0)
temple (0.6.8)
thin (1.6.2)
daemons (>= 1.0.9)
eventmachine (>= 1.0.0)
rack (>= 1.0.0)
temple (0.6.10)
thin (1.6.3)
daemons (~> 1.0, >= 1.0.9)
eventmachine (~> 1.0)
rack (~> 1.0)
thor (0.19.1)
thread_safe (0.3.4)
tilt (1.4.1)
tinymce-rails (4.1.0)
tinymce-rails (4.1.6)
railties (>= 3.1.1)
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)
tzinfo (1.2.1)
tzinfo (1.2.2)
thread_safe (~> 0.1)
warden (1.2.3)
rack (>= 1.0)
@@ -245,6 +267,7 @@ PLATFORMS
ruby
DEPENDENCIES
actionpack-page_caching
bootstrap-sass (~> 2.3)
bourbon
cmtool!
@@ -260,9 +283,9 @@ DEPENDENCIES
orm_adapter!
paperclip
pry-rails
rails (>= 4.1.4)
rails (= 4.2.0.beta4)
rspec-its
sass-rails (= 4.0.2)
sass-rails (= 5.0.0.beta1)
simply_stored!
slim-rails
steak
+163
View File
@@ -0,0 +1,163 @@
# Cmtool
[<img src="https://secure.travis-ci.org/bterkuile/cmtool.png?branch=master"
alt="Build Status" />](http://travis-ci.org/bterkuile/cmtool)
## About
Cmtool is a CMS to give you a quickstart for a website using CouchDB as
database backend. It is in developing stage, but already used in production.
It is designed as an engine. The thought behind is that you will have to
create your own rails website, but get a lot of stuff for free. These things
are:
* User management
* Page management
* Faq
* News
* Newsletter subscriptions
* Directory manager
* Image manager
## Setup
To start using Cmtool as website CMS add it to your Gemfile. Since it depends
on github gems and gem dependencies do not support those you have to
explicitly add two dependencies to your Gemfile:
gem 'couch_potato' , :git => 'git://github.com/bterkuile/couch_potato.git'
gem 'simply_stored' , :git => 'git://github.com/bterkuile/simply_stored.git'
gem 'cmtool'
This will add some gems you might like anyway, here a list:
* bourbon
* jquery-rails
* tinymce-rails
* sass-rails
* haml-rails
* paperclip
* email_validator (validates :email, email: true)
### Controllers
in `app/controllers/pages_controller.rb`:
```ruby
class PagesController
include Cmtool::Includes::PagesController
end
```
in `app/models/page.rb`:
```ruby
class Page
include Cmtool::Includes::Page
def self.layouts
%w[home application contact]
end
end
```
### Securing
Cmtool is looking for an authorize_cmtool method present in the application
controller. Something like:
```ruby
class ApplicationController
...
private
def authorize_cmtool
redirect_to main_app.root_path, alert: t('general.unauthorized') unless current_user.present? && current_user.is_admin?
end
end
```
### Routing
Add the following routes:
```ruby
devise_for :users, :controllers => {:sessions => 'cmtool/sessions', :passwords => 'cmtool/passwords'}
mount Cmtool::Engine => '/cmtool'
get '/sitemap(.:format)' => 'pages#sitemap'
scope '(/:locale)', constraints: {locale: /nl|be|de|fr|en/}, defaults: { locale: :nl } do
get "/:name" => "pages#show", constraints: {name: /.*/}, as: :page
end
match "/*url" => "pages#not_found"
root :to => 'pages#home'
```
### User model
The user model is important. We recommend you to create your own user model:
```ruby
class User
include Cmtool::User
end
```
This is enough to start using Cmtool. But probably you want to add some
goodies of your own. Remember that this is a SimplyStored model with almost
all the ActiveModel features.
### Page model
The page model allows you to control some interesting things. To create it
(app/models/page.rb):
```ruby
class Page
include Cmtool::Page
# Define the locales you want to use in your website
def self.locales
[:en]
end
# Define the layouts you want to use in your website. Be sure to create them in
# app/views/layouts/...
# The first specified layout will become the default
def self.layouts
[:application, :home, :contact]
end
end
```
### Controlling the language of the system
If you add a method `cmtool_locale` to your application controller Cmtool will
take this value:
```ruby
class ApplicationController
before_filter :set_locale
private
def set_locale
# Do some magic
I18n.locale = :en
end
def cmtool_locale
I18n.locale
end
end
```
### Customize a page
All pages by default are rendered using the view: app/pages/show. So adding
and changing this file will change all displayed pages without their own
specific page. To create a specific page, create a page with the name of the
page you created in the Admin section. If for example you have created a page
with the name: about Then you can give this page a custom look using the view:
`app/views/about.html.haml` You can also use erb, slim or your choice of
templating engine
### Customize your 404
You can customize what is shown when a page cannot be found. There is a
standard view app/pages/404.html.erb with the following content:
<%= render template: 'pages/show' %>
Overwrite this to get another page as show. To controll the content of the 404
page, create a page in the Admin area having the name: 404. You can make a
404 page for every language in this manner. Here you can also give a custom
layout if you do not want to use the default layout.
-131
View File
@@ -1,131 +0,0 @@
= Cmtool
{<img src="https://secure.travis-ci.org/bterkuile/cmtool.png?branch=master" alt="Build Status" />}[http://travis-ci.org/bterkuile/cmtool]
== About
Cmtool is a CMS to give you a quickstart for a website using CouchDB as database
backend. It is in developing stage, but already used in production.
It is designed as an engine. The thought behind is that you will have to
create your own rails website, but get a lot of stuff for free. These things are:
* User management
* Page management
* Faq
* News
* Newsletter subscriptions
* Directory manager
* Image manager
== Setup
To start using Cmtool as website CMS add it to your Gemfile. Since it
depends on github gems and gem dependencies do not support those you
have to explicitly add two dependencies to your Gemfile:
gem 'couch_potato' , :git => 'git://github.com/bterkuile/couch_potato.git'
gem 'simply_stored' , :git => 'git://github.com/bterkuile/simply_stored.git'
gem 'cmtool'
This will add some gems you might like anyway, here a list:
* bourbon
* jquery-rails
* tinymce-rails
* sass-rails
* haml-rails
* paperclip
* email_validator (validates :email, email: true)
=== Controllers
in <tt>app/controllers/pages_controller.rb</tt>:
class PagesController
include Cmtool::Includes::PagesController
end
in <tt>app/models/page.rb</tt>:
class Page
include Cmtool::Includes::Page
def self.layouts
%w[home application contact]
end
end
=== Securing
Cmtool is looking for an authorize_cmtool method present in the application controller. Something like:
class ApplicationController
...
private
def authorize_cmtool
redirect_to main_app.root_path, alert: t('general.unauthorized') unless current_user.present? && current_user.is_admin?
end
end
=== Routing
Add the following routes:
devise_for :users, :controllers => {:sessions => 'cmtool/sessions', :passwords => 'cmtool/passwords'}
mount Cmtool::Engine => '/cmtool'
scope '(/:locale)', constraints: {locale: /nl|be|de|fr|en/}, defaults: { locale: :nl } do
get "/:name" => "pages#show", constraints: {name: /.*/}, as: :page
end
match "/*url" => "pages#not_found"
root :to => 'pages#home'
=== User model
The user model is important. We recommend you to create your own user model:
class User
include Cmtool::User
end
This is enough to start using Cmtool. But probably you want to add some goodies of your own.
Remember that this is a SimplyStored model with almost all the ActiveModel features.
=== Page model
The page model allows you to control some interesting things. To create it (app/models/page.rb):
class Page
include Cmtool::Page
# Define the locales you want to use in your website
def self.locales
[:en]
end
# Define the layouts you want to use in your website. Be sure to create them in
# app/views/layouts/...
# The first specified layout will become the default
def self.layouts
[:application, :home, :contact]
end
end
=== Controlling the language of the system
If you add a method <tt>cmtool_locale</tt> to your application controller
Cmtool will take this value:
class ApplicationController
before_filter :set_locale
private
def set_locale
# Do some magic
I18n.locale = :en
end
def cmtool_locale
I18n.locale
end
end
=== Customize a page
All pages by default are rendered using the view: app/pages/show. So adding and changing this file will
change all displayed pages without their own specific page. To create a specific page, create a page
with the name of the page you created in the Admin section. If for example you have created a page
with the name: about
Then you can give this page a custom look using the view:
<tt>app/views/about.html.haml</tt>
You can also use erb, slim or your choice of templating engine
=== Customize your 404
You can customize what is shown when a page cannot be found. There is a standard view app/pages/404.html.erb with the following content:
<%= render template: 'pages/show' %>
Overwrite this to get another page as show. To controll the content of the 404 page, create a page in the Admin area having the name: 404.
You can make a 404 page for every language in this manner. Here you can also give a custom layout if you do not want to use the default layout.
+1
View File
@@ -10,6 +10,7 @@ Cmtool::Engine.routes.draw do
end
collection do
get :generate_name
get :sitemap
end
end
resources :news do
+17
View File
@@ -1,6 +1,7 @@
module Cmtool
module Includes
module PagesController
extend ActiveSupport::Concern
def home
page_name = "home"
@page = ::Page.find_by_name_and_locale(page_name, I18n.locale.to_s) || ::Page.new(:name => page_name, locale: I18n.locale.to_s)
@@ -28,6 +29,22 @@ module Cmtool
@sub_pages = []
render template: 'pages/404', layout: @page.layout.presence || ::Page.layouts.first.to_s, status: 404
end
def sitemap
respond_to do |format|
format.xml do
page_uris = ::Page.all.map{|p| page_path(p.name, locale: p.locale)}
pages_xml = page_uris.map{|uri| "<url><loc>#{uri}</loc></url>"}.join("\n")
result = <<-XML
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
#{pages_xml}
</urlset>
XML
render xml: result
end
end
end
end
end
end
@@ -2,10 +2,12 @@ require 'spec_helper'
describe Cmtool::PagesController, type: :controller do
routes { Cmtool::Engine.routes }
describe 'GET index' do
it "should render standard view when tree is available" do
create_pages_tree
expect{ get :index }.not_to raise_error
end
end
end
+4
View File
@@ -2,7 +2,11 @@ Rails.application.routes.draw do
devise_for :users, :controllers => {:sessions => 'cmtool/sessions', :passwords => 'cmtool/passwords'}
mount Cmtool::Engine => "/cmtool"
get '/sitemap(.:format)' => 'test_pages#sitemap'
get "/:name" => "pages#show"
scope '(/:locale)', constraints: {locale: /nl|be|de|fr|en/}, defaults: { locale: :nl } do
get "/:name" => "pages#show", constraints: {name: /.*/}, as: :page
end
get "/*url" => "pages#not_found"
root :to => 'pages#home'
end
@@ -0,0 +1,15 @@
require 'spec_helper'
class TestPagesController < ApplicationController
include Cmtool::Includes::PagesController
end
describe TestPagesController, type: :controller do
describe 'sitemap' do
it 'returns a proper sitemap' do
create_pages_tree
get :sitemap, format: 'xml'
expect( response.body ).to include "<url><loc>/en/child2.2</loc></url>"
end
end
end