fix a couple of annoying engine bugs + implement the first version of the find tag

This commit is contained in:
Didier Lafforgue 2012-04-10 17:44:13 +02:00
parent 4d1b986f1b
commit 14596a5443
19 changed files with 180 additions and 442 deletions

View File

@ -111,7 +111,7 @@ GEM
rack-test (>= 0.5.4)
selenium-webdriver (~> 2.0)
xpath (~> 0.1.4)
carrierwave (0.6.0)
carrierwave (0.6.1)
activemodel (>= 3.2.0)
activesupport (>= 3.2.0)
carrierwave-mongoid (0.1.3)
@ -148,7 +148,7 @@ GEM
orm_adapter (~> 0.0.3)
warden (~> 1.1)
diff-lcs (1.1.3)
dragonfly (0.9.11)
dragonfly (0.9.12)
rack
ejs (1.0.0)
erubis (2.7.0)
@ -176,7 +176,7 @@ GEM
formatador (0.2.1)
formtastic (2.0.2)
rails (~> 3.0)
fssm (0.2.8.1)
fssm (0.2.9)
gherkin (2.9.3)
json (>= 1.4.6)
haml (3.1.4)
@ -214,7 +214,7 @@ GEM
mocha (0.9.12)
mongo (1.5.2)
bson (= 1.5.2)
mongoid (2.4.7)
mongoid (2.4.8)
activemodel (~> 3.1)
mongo (~> 1.3)
tzinfo (~> 0.3.22)
@ -279,7 +279,7 @@ GEM
railties (>= 3.0)
rspec (~> 2.8.0)
ruby-hmac (0.4.0)
rubyzip (0.9.6.1)
rubyzip (0.9.7)
sanitize (2.0.3)
nokogiri (>= 1.4.4, < 1.6)
sass (3.1.15)
@ -303,7 +303,7 @@ GEM
treetop (1.4.10)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.32)
tzinfo (0.3.33)
uglifier (1.2.4)
execjs (>= 0.3.0)
multi_json (>= 1.0.2)

View File

@ -16,7 +16,7 @@ class Locomotive.Models.Page extends Backbone.Model
toJSON: ->
_.tap super, (hash) =>
_.each ['edit_url', 'parent_id_text', 'response_type_text'], (key) => delete hash[key]
_.each ['fullpath', 'localized_fullpaths', 'edit_url', 'parent_id_text', 'response_type_text'], (key) => delete hash[key]
delete hash['editable_elements']
hash.editable_elements = @get('editable_elements').toJSONForSave() if @get('editable_elements')? && @get('editable_elements').length > 0

View File

@ -72,7 +72,7 @@ class Locomotive.Views.Pages.FormView extends Locomotive.Views.Shared.FormView
@editor = CodeMirror.fromTextArea input.get()[0],
mode: 'liquid'
autoMatchParens: false
lineNumbers: false
lineNumbers: true
passDelay: 50
tabMode: 'shift'
theme: 'default'

View File

@ -16,6 +16,8 @@ module Locomotive
before_validation :get_wildcards_from_parent
before_validation :add_slug_to_wildcards
before_save :build_fullpath
after_update :propagate_fullpath_changes
# before_save :set_children_autosave
# before_rearrange :foo #propagate_fullpath_changes
# after_save :propagate_fullpath_changes
@ -137,6 +139,12 @@ module Locomotive
end
end
def propagate_fullpath_changes
if self.fullpath_changed? || self.wildcards_changed?
self.rearrange_children!
end
end
# def must_propagate_fullpath_changes?
# self.wildcard_changed? || self.slug_changed?
# end

View File

@ -49,7 +49,7 @@ module Locomotive
scope :not_found, :where => { :slug => '404', :depth => 0 }
scope :published, :where => { :published => true }
scope :handle, lambda { |handle| { :where => { :handle => handle } } }
scope :minimal_attributes, lambda { |attrs = []| { :only => (attrs || []) + %w(title slug fullpath position depth published with_wildcards redirect listed response_type parent_id site_id created_at updated_at) } }
scope :minimal_attributes, lambda { |attrs = []| { :only => (attrs || []) + %w(title slug fullpath position depth published with_wildcards redirect listed wildcard response_type parent_id parent_ids site_id created_at updated_at) } }
## methods ##

View File

@ -38,9 +38,9 @@
= f.input :published, :as => :'Locomotive::Toggle'
= f.input :listed, :as => :'Locomotive::Toggle'
= f.input :listed, :as => :'Locomotive::Toggle', :wrapper_html => { :style => "#{'display: none' if @page.has_wildcards?}" }
= f.input :redirect, :as => :'Locomotive::Toggle', :wrapper_html => { :style => "#{'display: none' if !@page.default_response_type?}" }
= f.input :redirect, :as => :'Locomotive::Toggle', :wrapper_html => { :style => "#{'display: none' if !@page.default_response_type? || @page.has_wildcards?}" }
= f.input :cache_strategy, :as => :select, :collection => options_for_page_cache_strategy, :include_blank => false, :wrapper_html => { :style => "#{'display: none' if @page.redirect?}" }

View File

@ -1 +1,2 @@
# Haml::Template.options[:ugly] = true # improve performance in dev
Haml::Template.options[:ugly] = true
Haml::Template.options[:format] = :html5

431
doc/TODO
View File

@ -1,424 +1,11 @@
BOARD:
x namespace assets
x bugs:
x toggler
x advanced options (redirect url missing)
x locomotive_media (not animating on open)
x undefined method `_selector' for #<Locomotive::Page:0x00000107434768>
x editable_elements => view + handlebar template
x editable_short_text => tinymce
x editable_file =>
x backbone / handlebar
x new formtastic inputs
x menu / submenu in full css3 (no images)
x fix css in firefox
x update page in ajax
x edit my site
x css
x robots.txt
x domains
x roles
x save
x fix other sections
x edit my account
x create a new site
x create a new accounts
x theme assets
x polish the page
x snippets
x delete in ajax
x upload many files at once
x import/export
x export
x site picker
x content types
x move content instances into their own collection
x manage custom_fields
x automatic name
x required
x editable plugin: add class depending on the type => surrounding span instead
x position
x open the nested form
x remove an entry
x look n feel
x display errors
x slugify
x refactor highlighted_field (field id instead of name)
x other content type options
x show / hide options of a field based on its type
x select: add/edit/remove options
x text: formatting
x change in main menu
x manage contents
x list (highlighted field)
x slugify
x crud
x new
x date
x checkbox
x html
x file
x edit
x destroy
x public_form (previously api something)
x bug text formatting
x custom_fields: use the appropriate icon to drag select options
x bug ui with contents popup
x use list_or_group_entries instead of ordered_entries
x i18n
x add locales a site responds to
x locale switcher
x constraint: one locale at least
x front
x pages
x inline-editor
x back to default locale (if changed in settings) and when creating new pages / entries
- inline editor
x rack
x iframe
(- remove inline-editor tag)
x save editable elements
x notification (growl)
x change page
x i18n
- style the "ADMIN" button
- aloha:
x remove sidebar
- i18n
- insert image
x deployment
x fix integration problems
x pre-compile assets
x API
x authentication from a token + controller to deliver a token
x api routes
x change api location
(- add a way to custom the as_json method within the presenters (by default as_json ?) + custom responder ?)
x REST actions:
x CRUD theme assets
x CRUD snippets
x CRUD content assets
x CRUD pages
x CRUD content types
x data ?
x script to migrate existing site
x i18n
x upgrade to rails 3.2 (https://github.com/locomotivecms/engine/pull/281/files)
x missing custom_fields
x belongs_to
x has_many
x many_to_many
x simplify cells integration when modifying a menu from the main app
x heroku module for locomotive
x refactoring
x remove the import / export scripts
x remove the cross domain authentication (use auth_token instead)
x where to put Locomotive::InlineEditorMiddleware ?
x global regions: keyword in editable element (http://www.mongodb.org/display/DOCS/Updating)
x override sort for contents
- bugs / ui tweaks
x unable to toggle the "required" check_boxes for content types
x unable to sign out
x unable to remove a field
x "back to admin" link does not work if inline editor disabled
x unable to delete memberships
- editable_elements does not display the first time they get created (and if there are no existing ones)
- display by categories does not work when localized
- disallow to click twice on the submit form button (spinner ?)
- message to notify people if their browser is too old
- weird behaviour when changing the default locale of a site
? install a site by default at the first installation (without asking)
BACKLOG:
- custom_fields:
- validation: regexp (pre-defined regexps ?)
x new type: belongs_to => association
- inline editing (http://www.aloha-editor.com/wiki/index.php/Aloha_PHP_Example)
- html view in the aloha popup
- editable elements should wrap a tag: div, h1, ...etc (default span)
- edit images (upload new ones, ...etc) => wait for aloha or send them an email ?
- cucumber features for admin pages (in progress)
(- duostack/doutcloud version)
- write my first tutorial about locomotive
- upgrade warning if new version of locomotive (maybe based on the commit id)
- deploying workflow:
- roll back a bad update
- conflicts with content types
- dev -> staging -> production
- sync data
- import only theme assets
- endless pagination
- tooltip to explain the difference between 1.) Admin 2.) Author 3.) Designer?
- [bushido] guiders / welcome page / devise cas authentication (SSO)
REFACTORING:
- move content_type and content_instances in the CustomFields plugin (much more appropriate)
BUGS:
x mode author: settings KO + editable elements non visibles
x locales pour le locomotive editor => KO
! impossible de sauvegarder une page
NICE TO HAVE:
- export site
- super_finder
- traffic statistics
- asset picker (content instance)
- page with regexp url ?
- automatic update !
- page not found (front) => if logged in, link to create the page
- switch to list (theme assets / assets ?). delete all in once (with checkbox) or see details (updated_at, size, ...etc)
- code completion ? http://blog.quplo.com/2010/06/common-sense-code-completion/
DONE:
x tiny mce or similar for custom field text type.
x refactor custom field types
x new custom field types
x boolean
x enable/disable text formatting
x custom fields for asset collections
x [BUG] impossible to remove many assets in an asset collection
x new custom field type: date
x missing key: en, admin, theme_assets, images, no_items
x new custom field type: file
x update custom_fields plugin
x locomotive ui
x liquid templates
x rss parser
x localize application in French
x default
x devise
x carrierwave
x localize devise emails
x admin
x change credits in the admin footer
x license
x textile filter
x [bug] varnish can not be refreshed in heroku so "max-age" has to be disabled => modify cache strategy
x "remember me" should always be enabled
x sitemap
x refactoring admin crud (pages + layouts + snippets)
x flash messages in French
x save layout / snippet / page / stylesheet / javascript with CMD + S (ajax)
x change action icons according to the right action [Sacha]
x publish event when saving form in ajax (for instance, in order to update account name or site name)
x page templatized (bound to a model)
x theme asset picker when editing layout / snippet
x templatized: do not display content with visible / active set to false
x theme assets: disable version if not image (handled by the new version of Carrierwave)
x rack app to map pretty asset url to S3 => shortcut urls instead
x site selector (cross domain authentication)
x nice error page
x nice 404 page (admin section)
x liquid inheritance
x bug editable_xxx disabled for nil block
! duplicated block name
x display liquid errors
x theme assets selector in page editor
x saving page in ajax
x editable_long_text tag
x blocking issue when modifying the parent of 2 templates => one of the 2 children has reference of the first child
x editable_file tag
x stylish file field
x remove not used editable element all in once
x default content from parent editable element
x unable to upload/remove editable file
x customize tinyMCE: no html popup => div popup, nice icons
x add images / files inside long text element (back-office side at first ?)
x create a repo for a tool "a la" vision
x asset collections => liquid
x images tag to write
! apply http://github.com/flori/json/commit/2c0f8d2c9b15a33b8d10ffcb1959aef54d320b57
x snippet dependencies => do not work correctly
? google analytics tag
x mask internal asset_collections
x refactor ui for the theme assets page
x fix assets liquid tags / filters
x upload and insert new images in a css or js from the ui is broken
x proxy for fonts (http://markevans.github.com/dragonfly/file.Rails3.html)
x order yaml file (http://www.ruby-forum.com/topic/120295)
x fix tests
x inline editing (http://www.aloha-editor.com/wiki/index.php/Aloha_PHP_Example)
x spinner
x save automatically (callback) => store modifications
x admin buttons
x edit page
x save / cancel
x back to back-office => admin settings of the page
(- duplicate page ?)
(- super bonus statistics)
x locale
x store page toolbar status in cookie
x trim short text content
x namespace js functions
x import tool:
x select field (see custom fields and nocoffee theme) ?
x disable sub tasks by passing options
x exceptions
x page to import theme
x contents: group_by, oder_by, api_enabled
x folders for theme assets
x theme assets whitelist
x fonts
x asset collections
x rewrite the unzip process (for the import)
x bug with asset collections (assets disappear if we save the collection ?!)
x import tool:
x asset whitelist
x do not override existing site name
x add samples option
x content types
x asset collections
x page templatized (tied to content type)
x remove existing pages / contents option => reset
x give choice to reset site / add samples
x french translatations
x cosmetic / ui bugs / bugs:
x segmentation fault with with_scope
x paginate is not working
x redirection in dev does not work correctly for cross domain
x drag&drop for assets ('last' class issue)
x increase the input field width for domain names
x assets within custom contents are not deleted when the whole content type gets destroyed (after_destroy callback ?)
x api
x handle html request (for now, it's just json)
x installation guide
x detect if new installation
x no-site error redirects to the first step
x steps:
x welcome: domains, ...etc
x Create account
x Create new site (name, subdomain) / Import theme (worker or list of sites from fs)
x import:
x ordered pages ?
x order_by for content_types ? created_at, updated_at
x liquid:
x nav
x no_wrapper option
x regexp to get rid of some pages
x filters
x default_pagination: labels
x [content types] the "display column" selector should not include file types
x Worker => Heroku / S3 (not so sure finally)
x jammit-s3: assets
x copy assets.yml config file when using it as gem (http://asciicasts.com/episodes/218-making-generators-in-rails-3)
x import theme without delayed_job
x rspec 2.3
x ruby 1.9.2:
x DelayedJob not working
x new version of Aloha-Editor
x locomotive gem: test with staging
x nav tag:
x site | page | parent
x retrieve only important page information from mongodb
x published by default when importing pages
x page redirection
x notify accounts when new instance of models (opt): none, one or many accounts. Used for contact form.
x implementation
x emails
x tests
x fix bug issue about (custom fields)
x moving to mongoid 2.0.0 rc.6
x accepts_nested_attributes (javascript part)
x check the theme uploader
x release new version of CustomFields, ActsAsTree gems
x add metadata to sites
x pull requests #31 et #32
x password / new_password
x bugs
x custom_fields not deleted (doesn't use index anymore)
? editable_elements slug becomes nil
x editable_elements not updated (doesn't use index anymore)
x uploading videos http://groups.google.com/group/carrierwave/browse_thread/thread/6e211d98f1ff4bc0/51717c2167695ca2?lnk=gst&q=version#51717c2167695ca2
x custom fields: accepts_nested_attributes weird behaviour when creating new content type + adding random fields
x better icons for mime type (css3)
x validation for custom fields: required done
x pull request #44
x bug on dates (https://github.com/locomotivecms/engine/issues#issue/48)
x generated sitemaps are invalid (url + date)
x integrate new locomotivecms home
x seo section for the page form: seo title, seo keywords, seo description
x bugs: #50, #51
x 2 different sites on the same main domain (one in www, the other one in something else) (Raphael Costa)
! asset collections: custom resizing if image
x bushido version
x default template
~ editable_elements: inheritable: false (Mattias) => seems to be fixed by Dirk's last pull request (#44) => content tag
x resizing images on the fly
x locomedia tinyMCE plugin (Bernd)
x remove asset_collections
x site templates
x tinyMCE plugin
x vignette.rb
x code
x helpers
x ui
x rake task
x internal collection
x assign same _id
x pick up a theme_asset
x pull request locomedia
x refactor slugify method (use parameterize + create a module)
x contents permalink (UI)
x BUG: has_one / has_many. Delete an author
x bushido changes in the master
? edit sidebar (inline editor). Unable to reset it
x SEO: support and support/ should be 2 different pages. Remove trailing slash
x issue #91: httparty
x issue #90: seo metadata
x issue #57: seo page title
x issue #56
x tweak ui: form, quick link to edit a model in the popup menu
x Has_one => group by in the select
x better hints:
x notify the user that after changing the page title, they still have to click "update" for the change to be saved
x created_by ASC => "Creation date ascending"
x cancan: (authors / designers / admin)
x model
x ui
x controllers / views:
x page
x content / content type
x asset
x site
x account
x snippet
x theme asset
x features / specs
x enable rack-cache only for a specific url
x more cucumber tests for the content types
x check hosting:
x heroku
x bushi.do
x unable to reach the console
x deploy => okay
x unable to set a new subdomain
x liquid tag: Date.today (now), add a test to compare 2 dates
? better ui: increase text field length (auto sizable ?) + refactor error message
- trigger refresh at startup
x bugs
x heroku: unable to upload a new file => okay
x import => okay
x delete an item => okay
x bug: duplicate fields (new entry) when errors in the content type form
x tinyMCE => fullscreen
x export site
x rake task to import a remote template
x MERGE
x remove withelist for assets since we've got now roles
x admin role is not correctly set when creating a new website
x the required star for file field is not shown
x Rights to set roles (ticket #104)
x export: problems with templatized pages (source => multi levels pages)
x do not rename files for fonts
x icon for redirection page in the pages section (back-office)
x installed on heroku with source
x test and/or convert existing templates (the 2 of the themes section)
x page with regexp url => wildcards
- with_scope allowed for the find tag
- nested relationships (find tag)
- script to migrate from templatized to wildcard
- seo title (content_entry should be available)
- write more tests
- find_spec
- features
- clean code

View File

@ -2,6 +2,7 @@ require 'locomotive/version'
require 'locomotive/core_ext'
require 'locomotive/configuration'
require 'locomotive/logger'
require 'locomotive/haml'
require 'locomotive/formtastic'
require 'locomotive/dragonfly'
require 'locomotive/kaminari'

30
lib/locomotive/haml.rb Normal file
View File

@ -0,0 +1,30 @@
require 'haml/helpers/action_view_mods'
# Only preserve whitespace in the tag's content: https://github.com/nex3/haml/pull/503
module ActionView
module Helpers #:nodoc:
module TagHelper
def content_tag_with_haml_and_preserve(name, content_or_options_with_block = nil, *args, &block)
return content_tag_without_haml(name, content_or_options_with_block, *args, &block) unless is_haml?
preserve = haml_buffer.options[:preserve].include?(name.to_s)
if block_given?
if block_is_haml?(block) && preserve
content_tag_without_haml(name, content_or_options_with_block, *args) {preserve(&block)}
else
content_tag_without_haml(name, content_or_options_with_block, *args, &block)
end
else
if preserve && content_or_options_with_block
content_or_options_with_block = Haml::Helpers.preserve(content_or_options_with_block)
end
content = content_tag_without_haml(name, content_or_options_with_block, *args, &block)
end
end
alias_method :content_tag_with_haml, :content_tag_with_haml_and_preserve
end
end
end

View File

@ -0,0 +1,46 @@
module Locomotive
module Liquid
module Tags
class Find < ::Liquid::Tag
Syntax = /(#{::Liquid::Expression}+)?/
def initialize(tag_name, markup, tokens, context)
if markup =~ Syntax
@options = markup.scan(::Liquid::QuotedFragment)
syntax_error! if @options.size != 2
else
syntax_error!
end
super
end
def render(context)
Rails.logger.debug "\n\n =>>>>>>> #{@options.inspect} / #{context['params'].inspect}"
permalink = context[@options.last]
site = context.registers[:site]
type = site.content_types.where(:slug => @options.first).first
entry = type.klass_with_custom_fields(:entries).find_by_permalink(permalink)
entry_name = @options.first.singularize
context.scopes.last['content_entry'] = entry
context.scopes.last[entry_name] = entry
''
end
protected
def syntax_error!
raise ::Liquid::SyntaxError.new("Syntax Error in 'find' - Valid syntax: find <content_type>, <permalink>")
end
end
::Liquid::Template.register_tag('find', Find)
end
end
end

View File

@ -1,5 +1,5 @@
module Liquid
module Locomotive
module Locomotive
module Liquid
module Tags
class GoogleAnalytics < ::Liquid::Tag

View File

@ -1,5 +1,5 @@
module Liquid
module Locomotive
module Locomotive
module Liquid
module Tags
class InlineEditor < ::Liquid::Tag

View File

@ -34,7 +34,7 @@ module Locomotive
end
else
raise ::Liquid::SyntaxError.new("Syntax Error in 'nav' - Valid syntax: nav <page|site> <options>")
raise ::Liquid::SyntaxError.new("Syntax Error in 'nav' - Valid syntax: nav <page|site>, <options>")
end
super

View File

@ -62,7 +62,7 @@ module Locomotive
assigns.merge!(flash.to_hash.stringify_keys) # data from public submissions
assigns.merge!(@page.wildcards_hash.stringify_keys) if @page.has_wildcards?
assigns['params'].merge!(@page.wildcards_hash.stringify_keys) if @page.has_wildcards?
registers = {
:controller => self,

View File

@ -1 +1,2 @@
Haml::Template.options[:ugly] = true # improve performance in dev
Haml::Template.options[:ugly] = true
Haml::Template.options[:format] = :html5

View File

@ -0,0 +1,52 @@
require 'spec_helper'
describe Locomotive::Liquid::Tags::Find do
it 'is valid if the 2 arguments are present' do
lambda do
Locomotive::Liquid::Tags::Find.new('find', 'projects, params.permalink', [], {})
end.should_not raise_error
end
it 'is not valid if one of the 2 arguments is missing' do
lambda do
Locomotive::Liquid::Tags::Find.new('find', 'projects', [], {})
end.should raise_error
end
# it 'tests' do
# tag = Locomotive::Liquid::Tags::Find.new('find', 'projects, params.permalink', [], {})
# puts tag.inspect
# # attributes = scope.send(:decode, scope.instance_variable_get(:@attributes), ::Liquid::Context.new)
# # attributes['active'].should == true
# # attributes['price'].should == 42
# # attributes['title'].should == 'foo'
# # attributes['hidden'].should == false
# end
# it 'decodes more complex options' do
# scope = Locomotive::Liquid::Tags::WithScope.new('with_scope', 'price.gt:42.0 price.lt:50', ["{% endwith_scope %}"], {})
# attributes = scope.send(:decode, scope.instance_variable_get(:@attributes), ::Liquid::Context.new)
# attributes['price.gt'].should == 42.0
# attributes['price.lt'].should == 50
# end
#
# it 'decodes context variable' do
# scope = Locomotive::Liquid::Tags::WithScope.new('with_scope', 'category: params.type', ["{% endwith_scope %}"], {})
# attributes = scope.send(:decode, scope.instance_variable_get(:@attributes), ::Liquid::Context.new({ 'params' => { 'type' => 'posts' } }))
# attributes['category'].should == 'posts'
# end
#
# it 'allows order_by option' do
# scope = Locomotive::Liquid::Tags::WithScope.new('with_scope', 'order_by:\'name DESC\'', ["{% endwith_scope %}"], {})
# attributes = scope.send(:decode, scope.instance_variable_get(:@attributes), ::Liquid::Context.new)
# attributes['order_by'].should == 'name DESC'
# end
#
# it 'stores attributes in the context' do
# template = ::Liquid::Template.parse("{% with_scope active:true title:'foo' %}{{ with_scope.active }}-{{ with_scope.title }}{% endwith_scope %}")
# text = template.render
# text.should == "true-foo"
# end
end

View File

@ -95,6 +95,8 @@ describe Locomotive::Page do
@projects_page = FactoryGirl.create(:page, :site => @home_page.site, :parent => @month_page, :slug => 'projects')
@project_page = FactoryGirl.create(:page, :site => @home_page.site, :parent => @projects_page, :slug => 'project', :wildcard => true)
@posts_page = FactoryGirl.create(:page, :site => @home_page.site, :parent => @month_page, :slug => 'posts')
[@home_page, @archives_page, @month_page, @projects_page, @project_page, @posts_page].map(&:reload)
end
it 'keeps the wildcards as they were if we modify a slug of an ancestor' do
@ -103,6 +105,15 @@ describe Locomotive::Page do
@project_page.fullpath.should == 'my_archives/month/projects/*'
end
it 'modifies a wildcard' do
@month_page.update_attributes :wildcard => true
@month_page.reload
@month_page.update_attributes :slug => 'a_month'
@project_page.reload
@project_page.fullpath.should == 'archives/*/projects/*'
@project_page.wildcards.should == %w(a_month project)
end
it 'turns a page into a wildcards one' do
@month_page.update_attributes :wildcard => true
@project_page.reload
@ -113,6 +124,7 @@ describe Locomotive::Page do
it 'turns off the wildcard property of page' do
@month_page.update_attributes :wildcard => true
@month_page.reload
@month_page.update_attributes :wildcard => false
@project_page.reload
@project_page.fullpath.should == 'archives/month/projects/*'