diff --git a/Gemfile b/Gemfile index 0bcad503..d9b34196 100644 --- a/Gemfile +++ b/Gemfile @@ -13,8 +13,8 @@ gem 'mongo', '~> 1.5.2' gem 'bson_ext', '~> 1.5.2' gem 'mongoid', '~> 2.4.2' gem 'locomotive_mongoid_acts_as_tree', '~> 0.1.5.8' -gem 'custom_fields', :path => '../gems/custom_fields' # DEV -# gem 'custom_fields', :git => 'git://github.com/locomotivecms/custom_fields.git', :branch => 'experimental' +# gem 'custom_fields', :path => '../gems/custom_fields' # DEV +gem 'custom_fields', :git => 'git://github.com/locomotivecms/custom_fields.git', :branch => '2.0.0.rc' gem 'kaminari' gem 'haml', '~> 3.1.3' @@ -44,7 +44,6 @@ gem 'dragonfly', '~> 0.9.8' gem 'rack-cache', '~> 1.1', :require => 'rack/cache' gem 'mimetype-fu', '~> 0.1.2' gem 'rubyzip' - gem 'actionmailer-with-request', '~> 0.3.0', :require => 'actionmailer_with_request' gem 'httparty', '~> 0.8.1' gem 'delayed_job_mongoid', '~> 1.0.8' @@ -69,6 +68,7 @@ group :test do gem 'xpath', '~> 0.1.4' gem 'capybara' gem 'database_cleaner' + gem 'shoulda-matchers' gem 'launchy' gem 'mocha', '0.9.12' # :git => 'git://github.com/floehopper/mocha.git' diff --git a/Gemfile.lock b/Gemfile.lock index 15d6b302..12caf85c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,5 +1,7 @@ -PATH - remote: ../gems/custom_fields +GIT + remote: git://github.com/locomotivecms/custom_fields.git + revision: 65c451abfc849dd665a556c68c8976c405e57b10 + branch: 2.0.0.rc specs: custom_fields (2.0.0.rc2) activesupport (~> 3.1.3) @@ -135,7 +137,7 @@ GEM formtastic (2.0.2) rails (~> 3.0) fssm (0.2.8.1) - gherkin (2.7.4) + gherkin (2.7.6) json (>= 1.4.6) growl-glue (1.0.7) haml (3.1.4) @@ -253,6 +255,7 @@ GEM ffi (~> 1.0.9) multi_json (~> 1.0.4) rubyzip + shoulda-matchers (1.0.0) sprockets (2.0.3) hike (~> 1.2) rack (~> 1.0) @@ -331,6 +334,7 @@ DEPENDENCIES rubyzip sanitize (~> 2.0.3) sass-rails (~> 3.1.4) + shoulda-matchers uglifier (~> 1.0.4) unicorn xpath (~> 0.1.4) diff --git a/app/cells/locomotive/menu_cell.rb b/app/cells/locomotive/menu_cell.rb index fc4669e3..b56666ec 100644 --- a/app/cells/locomotive/menu_cell.rb +++ b/app/cells/locomotive/menu_cell.rb @@ -1,5 +1,4 @@ class Locomotive::MenuCell < Cell::Base - include ::Locomotive::Engine.routes.url_helpers delegate :sections, :to => :parent_controller @@ -97,4 +96,4 @@ class Locomotive::MenuCell < Cell::Base I18n.t("locomotive.shared.menu.#{label}") end -end \ No newline at end of file +end diff --git a/app/models/locomotive/content_entry.rb b/app/models/locomotive/content_entry.rb index 8fa6aaed..9975a8f5 100644 --- a/app/models/locomotive/content_entry.rb +++ b/app/models/locomotive/content_entry.rb @@ -27,7 +27,7 @@ module Locomotive ## named scopes ## scope :visible, :where => { :_visible => true } - scope :latest_updated, :order_by => :updated_at.desc, :limit => Locomotive.config.ui.lastest_entries_nb + scope :latest_updated, :order_by => :updated_at.desc, :limit => Locomotive.config.ui.latest_entries_nb ## methods ## diff --git a/app/models/locomotive/page.rb b/app/models/locomotive/page.rb index 85d6c82a..a129d229 100644 --- a/app/models/locomotive/page.rb +++ b/app/models/locomotive/page.rb @@ -43,7 +43,7 @@ module Locomotive validates_exclusion_of :slug, :in => Locomotive.config.reserved_slugs, :if => Proc.new { |p| p.depth == 0 } ## named scopes ## - scope :latest_updated, :order_by => [[:updated_at, :desc]], :limit => Locomotive.config.ui.lastest_entries_nb + scope :latest_updated, :order_by => [[:updated_at, :desc]], :limit => Locomotive.config.ui.latest_entries_nb scope :root, :where => { :slug => 'index', :depth => 0 } scope :not_found, :where => { :slug => '404', :depth => 0 } scope :published, :where => { :published => true } @@ -118,4 +118,4 @@ module Locomotive end end -end \ No newline at end of file +end diff --git a/app/views/locomotive/shared/menu/_contents.html.haml b/app/views/locomotive/shared/menu/_contents.html.haml index cee89362..16050760 100644 --- a/app/views/locomotive/shared/menu/_contents.html.haml +++ b/app/views/locomotive/shared/menu/_contents.html.haml @@ -4,7 +4,7 @@ .header %p= link_to t('locomotive.pages.index.new'), new_page_url .inner - %h2!= t('locomotive.pages.index.lastest_entries') + %h2!= t('locomotive.pages.index.latest_entries') %ul - current_site.pages.latest_updated.minimal_attributes.each do |page| %li @@ -32,9 +32,9 @@ %p.edit= link_to t('locomotive.content_types.index.edit'), edit_content_type_url(content_type) .inner - %h2!= t('locomotive.content_entries.index.lastest_entries') + %h2!= t('locomotive.content_entries.index.latest_entries') %ul - content_type.entries.latest_updated.each do |entry| %li = link_to truncate(entry._label(content_type), :length => 20), edit_content_entry_url(content_type.slug, entry) - %span= time_ago_in_words(entry.updated_at) \ No newline at end of file + %span= time_ago_in_words(entry.updated_at) diff --git a/config/initializers/locomotive.rb b/config/initializers/locomotive.rb deleted file mode 100644 index 1256c5b5..00000000 --- a/config/initializers/locomotive.rb +++ /dev/null @@ -1,82 +0,0 @@ -# require File.dirname(__FILE__) + '/../../lib/locomotive.rb' -# -# Locomotive.configure do |config| -# -# # A single locomotive instance can serve one single site or many. -# # If you want to run many different websites, you will have to specify -# # your own domain name (ex: locomotivehosting.com). -# # -# # Ex: -# # config.multi_sites do |multi_sites| -# # # each new website you add will have a default entry based on a subdomain -# # # and the multi_site_domain value (ex: website_1.locomotivehosting.com). -# # multi_sites.domain = 'example.com' #'myhostingplatform.com' -# # -# # # define the reserved subdomains -# # # Ex: -# # multi_sites.reserved_subdomains = %w(www admin email blog webmail mail support help site sites) -# # end -# config.multi_sites = false -# -# # configure the hosting target for the production environment. Locomotive can be installed in: -# # - your own server -# # - Heroku (you need to create an account in this case) -# # - Bushi.do (see the bushi.do website for more explanations) -# # -# # the possible options are: server, heroku, bushido or auto (default) -# # if you select 'auto', Locomotive will look after specific ENV variables to check -# # the matching platform (Heroku and Bushido set their own ENV variables). -# # -# config.hosting = :auto -# -# # In case you host Locomotive in Heroku, the engine uses the heroku api to add / remove domains. -# # there are 2 ways of passing heroku credentials to Locomotive -# # - from ENV variables: HEROKU_LOGIN & HEROKU_PASSWORD -# # - from this file, see the example below and uncomment it if needed -# # config.heroku = { -# # :login => '', -# # :password => '' -# # } -# -# # Locomotive uses the DelayedJob gem for the site import module. -# # In case you want to deploy to Heroku, you will have to pay for an extra dyno. -# # If you do not mind about importing theme without DelayedJob, disable it. -# # -# # Warning: this option is not used if you deploy on bushi.do and we set automatically the value to true. -# config.delayed_job = false -# -# # configure how many items we display in sub menu in the "Contents" section. -# # config.lastest_entries = 5 -# -# # default locale (for now, only en, de, fr, pt-BR and it are supported) -# config.default_locale = :en -# -# # tell if logs are enabled. Useful for debug purpose. -# config.enable_logs = true -# -# # Configure the e-mail address which will be shown in the DeviseMailer, NotificationMailer, ...etc -# # if you do not put the domain name in the email, Locomotive will take the default domain name depending -# # on your deployment target (server, Heroku, Bushido, ...etc) -# # -# # Ex: -# # config.mailer_sender = 'support' -# # # => 'support@heroku.com' (Heroku), 'support@bushi.do' (Bushido), 'support@example.com' (Dev) or 'support@' (Multi-sites) -# config.mailer_sender = 'support' -# -# # allow apps using the engine to add their own Liquid drops, variables and similar available -# # in Liquid templates, extending the assigns used while rendering. -# # follow the Dependency Injection pattern -# # config.context_assign_extensions = {} -# -# # Rack-cache settings, mainly used for the inline resizing image module. Default options: -# # config.rack_cache = { -# # :verbose => true, -# # :metastore => URI.encode("file:#{Rails.root}/tmp/dragonfly/cache/meta"), # URI encoded in case of spaces -# # :entitystore => URI.encode("file:#{Rails.root}/tmp/dragonfly/cache/body") -# # } -# # If you do want to disable it for good, just use the following syntax -# # config.rack_cache = false -# # -# # Note: by default, rack/cache is disabled in the Heroku platform -# -# end unless Locomotive.engine? || Rails.env.test? diff --git a/config/locales/admin_ui.de.yml b/config/locales/admin_ui.de.yml index 327b027d..be917fa2 100644 --- a/config/locales/admin_ui.de.yml +++ b/config/locales/admin_ui.de.yml @@ -93,7 +93,7 @@ de: help: "Seiten sind als Baum organisiert. Du kannst die Seiten also wie Ordner sortieren und verschachteln." no_items: "Momentan gibt es keine Seiten. Klicke einfach hier, um die erste Seite zu erstellen." new: neue Seite - lastest_entries: Neueste Seiten + latest_entries: Neueste Seiten new: title: Neue Seite help: "Fülle das folgende Formular aus, um eine neue Seite zu erstellen. Nur zur Info: Die Seite wird nicht standardmäßig publiziert!" @@ -214,7 +214,7 @@ de: help: "Der Name der Buchung kann durch darauf klicken bearbeitet werden." new: neue Buchung no_items: "Momentan gibt es keine Buchungen. Klicke einfach hier, um eine neue Buchung zu erstellen." - lastest_entries: Letzte Buchungen + latest_entries: Letzte Buchungen updated_at: bearbeitet am new: title: Neue Buchung @@ -252,7 +252,7 @@ de: download: Elemente herunterladen new: neues Element category_noname: "Kein Name" - lastest_entries: "Neueste Elemente" + latest_entries: "Neueste Elemente" updated_at: "Aktualisiert am" list: no_entries: "Momentan gibt es keine Elemente. Klicke einfach hier, um das erste Element zu erstellen." diff --git a/config/locales/admin_ui.en.yml b/config/locales/admin_ui.en.yml index 5620cd42..6d142e9d 100644 --- a/config/locales/admin_ui.en.yml +++ b/config/locales/admin_ui.en.yml @@ -112,7 +112,7 @@ en: help: "Pages are organized as a tree. You can order pages as well as folders" no_items: "There are no pages for now. Just click here to create the first one." new: new page - lastest_entries: Lastest pages + latest_entries: Latest pages new: title: New page help: "Please fill in the below form to create your page. Be careful, by default, the page is not published." @@ -251,7 +251,7 @@ en: download: download entries new: new entry category_noname: "No name" - lastest_entries: "Lastest entries" + latest_entries: "Latest entries" updated_at: "Updated at" list: no_items: "There are no entries for now. Just click here to create the first one." diff --git a/config/locales/admin_ui.es.yml b/config/locales/admin_ui.es.yml index 80d1d90a..1a3d00a9 100644 --- a/config/locales/admin_ui.es.yml +++ b/config/locales/admin_ui.es.yml @@ -91,7 +91,7 @@ es: no_items: "No se ha creado ninguna página aún. Pulse aquí to para crear la primera." new: Nueva página - lastest_entries: Últimas páginas + latest_entries: Últimas páginas new: title: Nueva página help: "Por favor rellene el formulario de más abajo para crear su página. ¡Atención! Las páginas, por defecto, están 'no publicadas'." @@ -236,7 +236,7 @@ es: download: descargar elementos new: nuevo elemento category_noname: "Sin nombre" - lastest_entries: "Últimos elementos" + latest_entries: "Últimos elementos" updated_at: "Última actualización" list: no_entries: "No hay ningún elemento. Haga click aquí para crear el primero." diff --git a/config/locales/admin_ui.fr.yml b/config/locales/admin_ui.fr.yml index 40cd6f64..b2c3bd77 100644 --- a/config/locales/admin_ui.fr.yml +++ b/config/locales/admin_ui.fr.yml @@ -104,7 +104,7 @@ fr: help: "Les pages sont organisées sous forme d'un arbre. Vous pouvez classes les pages ainsi que les dossiers." no_items: "Il n'existe pas de page. Vous pouvez commencer par créer une ici." new: nouvelle page - lastest_entries: Dernières pages + latest_entries: Dernières pages new: title: Nouvelle page help: "Remplissez le formulaire ci-dessous pour créer votre page. Attention, par défaut, la page n'est pas publiée." @@ -241,7 +241,7 @@ fr: download: télécharger éléments new: nouvel élément category_noname: "Pas de nom" - lastest_entries: "Eléments récents" + latest_entries: "Eléments récents" updated_at: "Mis à jour le" list: no_entries: "Il n'existe pas d'éléments. Vous pouvez commencer par créer un ici" diff --git a/config/locales/admin_ui.it.yml b/config/locales/admin_ui.it.yml index 000d34cb..2ba82a42 100644 --- a/config/locales/admin_ui.it.yml +++ b/config/locales/admin_ui.it.yml @@ -91,7 +91,7 @@ it: help: "Le pagine sono organizzate ad albero. Puoi ordinarle come se fossero delle cartelle" no_items: "Per ora non ci sono pagine. Clicca qui per creare la prima pagina." new: nuova pagina - lastest_entries: Ultime pagine + latest_entries: Ultime pagine new: title: Nuova pagina help: "Prego, compila il seguente modulo per creare la tua pagina. Fai attenzione, per default, la pagina non è pubblicata." @@ -235,7 +235,7 @@ it: download: scarica elementi new: nuovo elemento category_noname: "Senza nome" - lastest_entries: "Ultimi elementi" + latest_entries: "Ultimi elementi" updated_at: "modificato il" list: no_entries: "Per ora non ci sono elementi. Clicca qui per creare il primo." diff --git a/config/locales/admin_ui.nl.yml b/config/locales/admin_ui.nl.yml index 04054539..693bc3bb 100644 --- a/config/locales/admin_ui.nl.yml +++ b/config/locales/admin_ui.nl.yml @@ -84,7 +84,7 @@ nl: help: "Pagina's zijn georganiseerd als een boom. U kunt zowel pagina's als mappen ordenen" no_items: "Er zijn momenteel geen pagina's. Klik hier om de eerste pagina te maken." new: Nieuwe pagina - lastest_entries: Laatste pagina's + latest_entries: Laatste pagina's new: title: Nieuwe pagina help: "Voer onderstaande formulier in om uw pagina te maken. Opgelet, de pagina is niet gepubliseerd" @@ -220,7 +220,7 @@ nl: download: download items new: nieuw item category_noname: "Geen naam" - lastest_entries: "Laatste items" + latest_entries: "Laatste items" updated_at: "Gewijzigd op" list: no_entries: "Er zijn momenteel geen items. Klik hier here om de eerste te maken." diff --git a/config/locales/admin_ui.no.yml b/config/locales/admin_ui.no.yml index 70a7c248..a8333e60 100644 --- a/config/locales/admin_ui.no.yml +++ b/config/locales/admin_ui.no.yml @@ -93,7 +93,7 @@ help: "Sidene er organisert i en trestruktur. Du kan sortere både sider og mapper." no_items: "Det har ikke blitt opprettet noen sider ennå. Klikk her for lage den første." new: ny side - lastest_entries: Siste sider + latest_entries: Siste sider new: title: Ny side help: "Fyll ut skjemaet nedenfor for å opprette en ny side. Publisering er skrudd av som standard." @@ -237,7 +237,7 @@ download: last ned elementer new: nytt element category_noname: "Navn mangler" - lastest_entries: "Siste elementer" + latest_entries: "Siste elementer" updated_at: "Sist oppdatert" list: no_entries: "Det har ikke blitt opprettet noen elementer her ennå. Klikk her for å opprette det første." diff --git a/config/locales/admin_ui.pt-BR.yml b/config/locales/admin_ui.pt-BR.yml index ab8c2657..db05d942 100644 --- a/config/locales/admin_ui.pt-BR.yml +++ b/config/locales/admin_ui.pt-BR.yml @@ -82,7 +82,7 @@ pt-BR: help: "As páginas são organizadas como uma árvore. Você pode reordenar as páginas como se fossem pastas" no_items: "Não existe nenhuma página ainda. Clique aqui para criar a primeira." new: nova página - lastest_entries: Últmas páginas + latest_entries: Últmas páginas new: title: Nova página help: "Por favor, preencha o formulário a seguir para criar sua página. Atenção: Por padrão a página não é publicada." @@ -215,7 +215,7 @@ pt-BR: download: download dos itens new: novo item category_noname: "Sem nome" - lastest_entries: "Últimos itens" + latest_entries: "Últimos itens" updated_at: "Atualizado em" list: no_entries: "Não existem itens ainda. Clique aqui para criar o primeiro." diff --git a/config/locales/admin_ui.ru.yml b/config/locales/admin_ui.ru.yml index da684675..951d11cc 100644 --- a/config/locales/admin_ui.ru.yml +++ b/config/locales/admin_ui.ru.yml @@ -93,7 +93,7 @@ ru: help: "Страницы организованы в виде дерева. Вы можете сортировать как страницы, так и папки" no_items: "There are no pages for now. Just click here to create the first one." new: новая страница - lastest_entries: Страницы за последнее время + latest_entries: Страницы за последнее время new: title: Новая страница help: "Заполните форму, приведенную ниже, для создания страницы. Будьте осторожны, по умолчанию, страница не опубликована." @@ -236,7 +236,7 @@ ru: download: скачать элементы new: новый элемент category_noname: "Без имени" - lastest_entries: "Элементы за последнее время" + latest_entries: "Элементы за последнее время" updated_at: "Обновлено" list: no_entries: "На данный момент нет ни одного элемента. Нажмите здесь для создания первого элемента." diff --git a/lib/generators/locomotive/install/templates/locomotive.rb b/lib/generators/locomotive/install/templates/locomotive.rb index e3b4b1e3..a065ec18 100644 --- a/lib/generators/locomotive/install/templates/locomotive.rb +++ b/lib/generators/locomotive/install/templates/locomotive.rb @@ -45,7 +45,7 @@ Locomotive.configure do |config| # configure how many items we display in sub menu in the "Contents" section. # config.ui = { - # :lastest_entries_nb => 5, + # :latest_entries_nb => 5, # :max_content_types => 4 # } @@ -83,4 +83,4 @@ Locomotive.configure do |config| # # Note: by default, rack/cache is disabled in the Heroku platform -end \ No newline at end of file +end diff --git a/lib/locomotive/configuration.rb b/lib/locomotive/configuration.rb index 6a745d31..b2b271cd 100644 --- a/lib/locomotive/configuration.rb +++ b/lib/locomotive/configuration.rb @@ -18,7 +18,7 @@ module Locomotive :manage_subdomain => false, :manage_manage_domains => false, :ui => { - :lastest_entries_nb => 5, + :latest_entries_nb => 5, :max_content_types => 2 }, :rack_cache => { diff --git a/lib/tasks/locomotive.rake b/lib/tasks/locomotive.rake index 03e84648..ec4bf92c 100644 --- a/lib/tasks/locomotive.rake +++ b/lib/tasks/locomotive.rake @@ -29,22 +29,22 @@ namespace :locomotive do end end - # desc 'Import a remote template described by its URL -- 2 options: SITE=name or id, RESET=by default false' - # task :import => :environment do - # url, site_name_or_id, reset = ENV['URL'], ENV['SITE'], Boolean.set(ENV['RESET']) || false - # - # if url.blank? || (url =~ /https?:\/\//).nil? - # raise "URL is missing or it is not a valid http url." - # end - # - # site = Locomotive::Site.find(site_name_or_id) || Locomotive::Site.where(:name => site_name_or_id).first || Locomotive::Site.first - # - # if site.nil? - # raise "No site found. Please give a correct value (name or id) for the SITE env variable." - # end - # - # ::Locomotive::Import::Job.run!(url, site, { :samples => true, :reset => reset }) - # end + desc 'Import a remote template described by its URL -- 2 options: SITE=name or id, RESET=by default false' + task :import => :environment do + url, site_name_or_id, samples, reset = ENV['URL'], ENV['SITE'], (Boolean.set(ENV['SAMPLES']) || false), (Boolean.set(ENV['RESET']) || false) + + if url.blank? || (url =~ /https?:\/\//).nil? + raise "URL is missing or it is not a valid http url." + end + + site = Locomotive::Site.find(site_name_or_id) || Locomotive::Site.where(:name => site_name_or_id).first || Locomotive::Site.first + + if site.nil? + raise "No site found. Please give a correct value (name or id) for the SITE env variable." + end + + ::Locomotive::Import::Job.run!(url, site, { :samples => samples, :reset => reset }) + end desc 'Add a new admin user (NOTE: currently only supports adding user to first site)' task :add_admin => :environment do @@ -104,27 +104,17 @@ namespace :locomotive do end site.save! - puts "=======" - - # TODO https://github.com/mongodb/mongo-ruby-driver - Locomotive::Page.skip_callback(:validate, :before) Locomotive::Page.skip_callback(:save, :after) Locomotive::Page.all.each do |page| - begin - %w(title slug fullpath raw_template seo_title meta_keywords meta_description serialized_template template_dependencies snippet_dependencies).each do |attribute| - if !page.send(:"#{attribute}_translations").respond_to?(:keys) - page.changed_attributes.store attribute, page.attributes[attribute] - page.attributes.store attribute, { locale => page.attributes[attribute] } - end + %w(title slug fullpath raw_template seo_title meta_keywords meta_description serialized_template template_dependencies snippet_dependencies).each do |attribute| + if !page.send(:"#{attribute}_translations").respond_to?(:keys) + page.changed_attributes.store attribute, page.attributes[attribute] + page.attributes.store attribute, { locale => page.attributes[attribute] } end - page.save(:validate => false) - rescue Exception => e - puts "Error: #{e.message}, page = #{page.title}" - puts e.backtrace - raise "STOP a first error" end + page.save(:validate => false) end end diff --git a/locomotive_cms.gemspec b/locomotive_cms.gemspec index 99d9c77b..46c6b146 100644 --- a/locomotive_cms.gemspec +++ b/locomotive_cms.gemspec @@ -24,7 +24,7 @@ Gem::Specification.new do |s| s.add_dependency 'mongo', '~> 1.5.2' s.add_dependency 'bson_ext', '~> 1.5.2' - s.add_dependency 'mongoid', '~> 2.4.0' + s.add_dependency 'mongoid', '~> 2.4.2' s.add_dependency 'locomotive_mongoid_acts_as_tree', '0.1.5.8' s.add_dependency 'custom_fields', '~> 2.0.0.rc1' @@ -46,7 +46,7 @@ Gem::Specification.new do |s| s.add_dependency 'locomotive_liquid', '2.2.2' s.add_dependency 'formtastic', '~> 2.0.2' s.add_dependency 'responders', '~> 0.6.4' - s.add_dependency 'cells', '~> 3.7.1' + s.add_dependency 'cells', '~> 3.8.0' s.add_dependency 'RedCloth', '~> 4.2.8' s.add_dependency 'sanitize', '~> 2.0.3' s.add_dependency 'highline', '~> 1.6.2' diff --git a/spec/models/locomotive/account_spec.rb b/spec/models/locomotive/account_spec.rb index a88a8665..12a9c12d 100644 --- a/spec/models/locomotive/account_spec.rb +++ b/spec/models/locomotive/account_spec.rb @@ -1,20 +1,20 @@ require 'spec_helper' describe Locomotive::Account do + let!(:existing_account) { Factory(:account, :email => 'another@email.com') } it 'should have a valid factory' do FactoryGirl.build(:account).should be_valid end ## Validations ## - - %w{name email password}.each do |attr| - it "should validate presence of #{attr}" do - account = FactoryGirl.build(:account, attr.to_sym => nil) - account.should_not be_valid - account.errors[attr.to_sym].should include("can't be blank") - end - end + it { should validate_presence_of :name } + it { should validate_presence_of :email } + it { should validate_presence_of :password } + it { should validate_uniqueness_of(:email).with_message(/is already taken/) } + it { should allow_value('valid@email.com').for(:email) } + it { should allow_value('prefix+suffix@email.com').for(:email) } + it { should_not allow_value('not-an-email').for(:email) } it "should have a default locale" do account = Locomotive::Account.new