new Gemfile + fixing broken tests + improve the way we fetch the sicurrent te when serving fonts

This commit is contained in:
dinedine 2011-01-26 14:07:33 +01:00
parent fa8e509732
commit 69c9dbbbcf
13 changed files with 240 additions and 171 deletions

12
Gemfile
View File

@ -7,20 +7,20 @@ gem 'rails', '>= 3.0.0'
gem 'warden'
gem 'devise', '= 1.1.3'
gem 'mongoid', '2.0.0.beta.19'
gem 'mongoid', '2.0.0.rc.6'
gem 'bson_ext', '1.2.0'
gem 'locomotive_mongoid_acts_as_tree', '0.1.5.1', :require => 'mongoid_acts_as_tree'
gem 'locomotive_mongoid_acts_as_tree', :path => '../gems/acts_as_tree', :require => 'mongoid_acts_as_tree' # '0.1.5.1', :require => 'mongoid_acts_as_tree'
gem 'will_paginate'
gem 'haml', '= 3.0.18'
gem 'locomotive_liquid', '2.2.2', :require => 'liquid'
gem 'formtastic', '>= 1.1.0'
gem 'inherited_resources', '>= 1.1.2'
gem 'formtastic', '~> 1.1.0'
gem 'inherited_resources', '1.1.2'
gem 'rmagick', '= 2.12.2'
gem 'locomotive_carrierwave', '0.5.0.1.beta2', :require => 'carrierwave'
gem 'custom_fields', '1.0.0.beta2'
gem 'custom_fields', :path => '../gems/custom_fields' #'1.0.0.beta2'
gem 'fog', '0.3.7'
gem 'mimetype-fu'
gem 'actionmailer-with-request'
@ -28,7 +28,7 @@ gem 'heroku'
gem 'httparty', '>= 0.6.1'
gem 'RedCloth'
gem 'delayed_job', '2.1.2'
gem 'delayed_job_mongoid', '1.0.1'
gem 'delayed_job_mongoid', '1.0.2'
gem 'rubyzip'
gem 'locomotive_jammit-s3', :require => 'jammit-s3'

View File

@ -5,6 +5,21 @@ GIT
mocha (0.9.10.20101125155727)
rake
PATH
remote: ../gems/acts_as_tree
specs:
locomotive_mongoid_acts_as_tree (0.1.5.2)
bson (>= 0.20.1)
mongoid (>= 2.0.0.rc.6)
PATH
remote: ../gems/custom_fields
specs:
custom_fields (1.0.0.beta.3)
activesupport (>= 3.0.0)
locomotive_carrierwave
mongoid (>= 2.0.0.beta.18)
GEM
remote: http://rubygems.org/
specs:
@ -46,7 +61,7 @@ GEM
bson (1.2.0)
bson_ext (1.2.0)
builder (2.1.2)
capybara (0.4.0)
capybara (0.4.1.1)
celerity (>= 0.7.9)
culerity (>= 0.2.4)
mime-types (>= 1.16)
@ -54,7 +69,7 @@ GEM
rack (>= 1.0.0)
rack-test (>= 0.5.4)
selenium-webdriver (>= 0.0.27)
xpath (~> 0.1.2)
xpath (~> 0.1.3)
celerity (0.8.7)
childprocess (0.1.6)
ffi (~> 0.6.3)
@ -70,19 +85,15 @@ GEM
term-ansicolor (~> 1.0.4)
cucumber-rails (0.3.2)
cucumber (>= 0.8.0)
culerity (0.2.14)
custom_fields (1.0.0.beta2)
activesupport (>= 3.0.0)
locomotive_carrierwave
mongoid (>= 2.0.0.beta.18)
culerity (0.2.15)
daemons (1.1.0)
database_cleaner (0.6.0)
delayed_job (2.1.2)
activesupport (~> 3.0)
daemons
delayed_job_mongoid (1.0.1)
delayed_job_mongoid (1.0.2)
delayed_job (~> 2.1.1)
mongoid (~> 2.0)
mongoid (~> 2.0.0.rc)
devise (1.1.3)
bcrypt-ruby (~> 2.1.2)
warden (~> 0.10.7)
@ -106,17 +117,17 @@ GEM
nokogiri (~> 1.4.3.1)
ruby-hmac
formatador (0.0.16)
formtastic (1.2.3)
actionpack (>= 2.3.7)
activesupport (>= 2.3.7)
i18n (~> 0.4)
formtastic (1.1.0)
actionpack (>= 2.3.0)
activesupport (>= 2.3.0)
i18n (>= 0.4.0)
gherkin (2.1.5)
trollop (~> 1.16.2)
growl-glue (1.0.7)
haml (3.0.18)
has_scope (0.5.0)
heroku (1.17.8)
json (~> 1.4.6)
heroku (1.16.2)
json_pure (>= 1.2.0, < 1.5.0)
launchy (~> 0.3.2)
rest-client (>= 1.4.0, < 1.7.0)
httparty (0.7.3)
@ -128,7 +139,7 @@ GEM
jammit (0.6.0)
closure-compiler (>= 0.1.0)
yui-compressor (>= 0.9.1)
json (1.4.6)
json (1.5.1)
json_pure (1.4.6)
kgio (2.1.1)
launchy (0.3.7)
@ -144,22 +155,19 @@ GEM
mimemagic (>= 0.1.7)
s3 (>= 0.3.7)
locomotive_liquid (2.2.2)
locomotive_mongoid_acts_as_tree (0.1.5.1)
bson (>= 0.20.1)
mongoid (<= 2.0.0.beta.19)
mail (2.2.14)
mail (2.2.15)
activesupport (>= 2.3.6)
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.16)
mimemagic (0.1.7)
mimemagic (0.1.8)
mimetype-fu (0.1.2)
mongo (1.0.9)
bson (>= 1.0.5)
mongoid (2.0.0.beta.19)
mongo (1.2.0)
bson (>= 1.2.0)
mongoid (2.0.0.rc.6)
activemodel (~> 3.0)
mongo (= 1.0.9)
mongo (~> 1.2)
tzinfo (~> 0.3.22)
will_paginate (~> 3.0.pre)
net-ssh (2.0.24)
@ -261,27 +269,27 @@ DEPENDENCIES
capybara
cucumber (= 0.8.5)
cucumber-rails
custom_fields (= 1.0.0.beta2)
custom_fields!
database_cleaner
delayed_job (= 2.1.2)
delayed_job_mongoid (= 1.0.1)
delayed_job_mongoid (= 1.0.2)
devise (= 1.1.3)
factory_girl_rails
fog (= 0.3.7)
formtastic (>= 1.1.0)
formtastic (~> 1.1.0)
growl-glue
haml (= 3.0.18)
heroku
httparty (>= 0.6.1)
inherited_resources (>= 1.1.2)
inherited_resources (= 1.1.2)
launchy
locomotive_carrierwave (= 0.5.0.1.beta2)
locomotive_jammit-s3
locomotive_liquid (= 2.2.2)
locomotive_mongoid_acts_as_tree (= 0.1.5.1)
locomotive_mongoid_acts_as_tree!
mimetype-fu
mocha!
mongoid (= 2.0.0.beta.19)
mongoid (= 2.0.0.rc.6)
pickle
rails (>= 3.0.0)
rmagick (= 2.12.2)

View File

@ -28,7 +28,7 @@ class Asset
%w{image stylesheet javascript pdf video audio}.each do |type|
define_method("#{type}?") do
self.content_type == type
self.content_type.to_s == type
end
end

View File

@ -24,7 +24,7 @@ class ContentInstance
after_create :send_notifications
## named scopes ##
scope :latest_updated, :order_by => [[:updated_at, :desc]], :limit => Locomotive.config.lastest_items_nb
scope :latest_updated, :order_by => :updated_at.desc, :limit => Locomotive.config.lastest_items_nb
## methods ##

View File

@ -87,7 +87,7 @@ class Page
protected
def do_not_remove_index_and_404_pages
return if (self.site rescue nil).nil?
return if self.site.nil? || self.site.destroyed?
if self.index? || self.not_found?
self.errors[:base] << I18n.t('errors.messages.protected_page')

View File

@ -41,7 +41,7 @@ class ThemeAsset
%w{movie image stylesheet javascript font}.each do |type|
define_method("#{type}?") do
self.content_type == type
self.content_type.to_s == type
end
end
@ -51,7 +51,7 @@ class ThemeAsset
def local_path(short = false)
if short
self.read_attribute(:local_path).gsub(/^#{self.content_type.pluralize}\//, '')
self.read_attribute(:local_path).gsub(/^#{self.content_type.to_s.pluralize}\//, '')
else
self.read_attribute(:local_path)
end
@ -101,14 +101,14 @@ class ThemeAsset
end
def sanitize_folder
self.folder = self.content_type.pluralize if self.folder.blank?
self.folder = self.content_type.to_s.pluralize if self.folder.blank?
# no accents, no spaces, no leading and ending trails
self.folder = ActiveSupport::Inflector.transliterate(self.folder).gsub(/(\s)+/, '_').gsub(/^\//, '').gsub(/\/$/, '').downcase
# folder should begin by a root folder
if (self.folder =~ /^(stylesheets|javascripts|images|media|fonts)/).nil?
self.folder = File.join(self.content_type.pluralize, self.folder)
self.folder = File.join(self.content_type.to_s.pluralize, self.folder)
end
end

View File

@ -1,9 +1,10 @@
BOARD:
- add metadata to sites
- moving to mongoid 2.0.0 rc.6
BACKLOG:
- add metadata to sites
- validation for custom fields
- new custom field types:
- belongs_to => association

View File

@ -15,7 +15,7 @@ module Locomotive
if site.nil?
@app.call(env)
else
body = ThemeAssetUploader.build(site, env["PATH_INFO"]).read.to_s
body = ThemeAssetUploader.build(site, env['PATH_INFO']).read.to_s
[200, { 'Cache-Control' => "public; max-age=#{@expires_in}" }, [body]]
end
@ -27,9 +27,11 @@ module Locomotive
protected
def fetch_site(domain_name)
Rails.cache.fetch(domain_name, :expires_in => @expires_in) do
Site.match_domain(domain_name).first
site_id = Rails.cache.fetch(domain_name, :expires_in => @expires_in) do
Site.match_domain(domain_name).only(:id).first._id.to_s rescue ''
end
site_id.blank? ? nil : Site.new(:id => site_id)
end
end
end

View File

@ -1,33 +1,6 @@
require 'mongoid'
# require 'mongoid/document'
## various patches
module Mongoid #:nodoc:
module Document
def update_child_with_noname(child, clear = false)
name = child.association_name
return if name.blank? # fix a weird bug with mongoid-acts-as-tree
update_child_without_noname(child, clear)
end
alias_method_chain :update_child, :noname
# module ClassMethods
#
# def instantiate(attrs = nil, allocating = false) # used by carrierwave to back up the original file
# document = super
# document.send(:run_callbacks, :initialize) do
# document
# end
# end
#
# end
end
end
module Mongoid #:nodoc:
module Validations #:nodoc:
class AssociatedValidator < ActiveModel::EachValidator
@ -40,57 +13,127 @@ module Mongoid #:nodoc:
end
end
# http://github.com/emk/mongoid/blob/503e346b1b7b250d682a12332ad9d5872f1575e6/lib/mongoid/atomicity.rb
# Mongoid causes the following warning "Collection#group no longer take a list of paramters. This usage is deprecated.Check out the new API at http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method"
# it's already corrected in the mongoid master branch so waiting for the new gem to remove this patch
module Mongoid #:nodoc:
module Atomicity #:nodoc:
extend ActiveSupport::Concern
def _updates
processed = {}
_children.inject({ "$set" => _sets, "$pushAll" => {}, :other => {} }) do |updates, child|
changes = child._sets
updates["$set"].update(changes)
unless changes.empty?
processed[child._conficting_modification_key] = true
end
# MongoDB does not allow "conflicting modifications" to be
# performed in a single operation. Conflicting modifications are
# detected by the 'haveConflictingMod' function in MongoDB.
# Examination of the code suggests that two modifications (a $set
# and a $pushAll, for example) conflict if (1) the key paths being
# modified are equal or (2) one key path is a prefix of the other.
# So a $set of 'addresses.0.street' will conflict with a $pushAll
# to 'addresses', and we will need to split our update into two
# pieces. We do not, however, attempt to match MongoDB's logic
# exactly. Instead, we assume that two updates conflict if the
# first component of the two key paths matches.
if processed.has_key?(child._conficting_modification_key)
target = :other
else
target = "$pushAll"
end
child._pushes.each do |attr, val|
if updates[target].has_key?(attr)
updates[target][attr] << val
else
updates[target].update({attr => [val]})
end
end
updates
end.delete_if do |key, value|
value.empty?
module Contexts #:nodoc:
class Mongo
def aggregate
klass.collection.group(
:key => options[:fields],
:cond => selector,
:initial => { :count => 0 },
:reduce => Javascript.aggregate
)
end
def group
klass.collection.group(
:key => options[:fields],
:cond => selector,
:initial => { :group => [] },
:reduce => Javascript.group
).collect do |docs|
docs["group"] = docs["group"].collect do |attrs|
Mongoid::Factory.build(klass, attrs)
end
docs
end
end
def grouped(start, field, reduce)
collection = klass.collection.group(
:cond => selector,
:initial => { start => "start" },
:reduce => reduce.gsub("[field]", field)
)
collection.empty? ? nil : collection.first[start.to_s]
end
end
protected
# Get the key used to check for conflicting modifications. For now, we
# just use the first component of _path, and discard the first period
# and everything that follows.
def _conficting_modification_key
_path.sub(/\..*/, '')
end
end
end
# # http://github.com/emk/mongoid/blob/503e346b1b7b250d682a12332ad9d5872f1575e6/lib/mongoid/atomicity.rb
# module Mongoid #:nodoc:
# module Atomicity #:nodoc:
# extend ActiveSupport::Concern
#
# def _updates
# processed = {}
#
# _children.inject({ "$set" => _sets, "$pushAll" => {}, :other => {} }) do |updates, child|
# changes = child._sets
# updates["$set"].update(changes)
# unless changes.empty?
# processed[child._conficting_modification_key] = true
# end
#
# # MongoDB does not allow "conflicting modifications" to be
# # performed in a single operation. Conflicting modifications are
# # detected by the 'haveConflictingMod' function in MongoDB.
# # Examination of the code suggests that two modifications (a $set
# # and a $pushAll, for example) conflict if (1) the key paths being
# # modified are equal or (2) one key path is a prefix of the other.
# # So a $set of 'addresses.0.street' will conflict with a $pushAll
# # to 'addresses', and we will need to split our update into two
# # pieces. We do not, however, attempt to match MongoDB's logic
# # exactly. Instead, we assume that two updates conflict if the
# # first component of the two key paths matches.
# if processed.has_key?(child._conficting_modification_key)
# target = :other
# else
# target = "$pushAll"
# end
#
# child._pushes.each do |attr, val|
# if updates[target].has_key?(attr)
# updates[target][attr] << val
# else
# updates[target].update({attr => [val]})
# end
# end
# updates
# end.delete_if do |key, value|
# value.empty?
# end
# end
#
# protected
# # Get the key used to check for conflicting modifications. For now, we
# # just use the first component of _path, and discard the first period
# # and everything that follows.
# def _conficting_modification_key
# _path.sub(/\..*/, '')
# end
# end
# end
# ## various patches
# module Mongoid #:nodoc:
# module Document
#
# def update_child_with_noname(child, clear = false)
# name = child.association_name
# return if name.blank? # fix a weird bug with mongoid-acts-as-tree
# update_child_without_noname(child, clear)
# end
#
# alias_method_chain :update_child, :noname
#
# # module ClassMethods
# #
# # def instantiate(attrs = nil, allocating = false) # used by carrierwave to back up the original file
# # document = super
# # document.send(:run_callbacks, :initialize) do
# # document
# # end
# # end
# #
# # end
#
# end
# end

View File

@ -20,21 +20,21 @@ Gem::Specification.new do |s|
s.add_dependency "rails", ">= 3.0.0"
s.add_dependency "warden"
s.add_dependency "devise", "= 1.1.3"
s.add_dependency "mongoid", "2.0.0.beta.19"
s.add_dependency "mongoid", "2.0.0.rc.6"
s.add_dependency "bson_ext", "= 1.2.0"
s.add_dependency "locomotive_mongoid_acts_as_tree", "0.1.5.1"
s.add_dependency "locomotive_mongoid_acts_as_tree", "0.1.5.2"
s.add_dependency "will_paginate"
s.add_dependency "haml", "= 3.0.18"
s.add_dependency "locomotive_liquid", "2.2.2"
s.add_dependency "formtastic", ">= 1.1.0"
s.add_dependency "inherited_resources", ">= 1.1.2"
s.add_dependency "inherited_resources", "1.1.2"
s.add_dependency "rmagick", "= 2.12.2"
s.add_dependency "locomotive_carrierwave", "0.5.0.1.beta2"
s.add_dependency "custom_fields", "1.0.0.beta2"
s.add_dependency "custom_fields", "1.0.0.beta3"
s.add_dependency "fog"
s.add_dependency "mimetype-fu"
s.add_dependency "actionmailer-with-request"

View File

@ -9,14 +9,14 @@ describe Locomotive::Liquid::Filters::Html do
end
it 'should return a link tag for a stylesheet file' do
result = "<link href=\"/sites/42/theme/stylesheets/main.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />"
result = "<link href=\"/sites/000000000000000000000042/theme/stylesheets/main.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />"
stylesheet_tag('main.css').should == result
stylesheet_tag('main').should == result
stylesheet_tag(nil).should == ''
end
it 'should return a link tag for a stylesheet file with folder' do
result = "<link href=\"/sites/42/theme/stylesheets/trash/main.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />"
result = "<link href=\"/sites/000000000000000000000042/theme/stylesheets/trash/main.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />"
stylesheet_tag('trash/main.css').should == result
end
@ -27,14 +27,14 @@ describe Locomotive::Liquid::Filters::Html do
end
it 'should return a script tag for a javascript file' do
result = %{<script src="/sites/42/theme/javascripts/main.js" type="text/javascript"></script>}
result = %{<script src="/sites/000000000000000000000042/theme/javascripts/main.js" type="text/javascript"></script>}
javascript_tag('main.js').should == result
javascript_tag('main').should == result
javascript_tag(nil).should == ''
end
it 'should return a script tag for a javascript file with folder' do
result = %{<script src="/sites/42/theme/javascripts/trash/main.js" type="text/javascript"></script>}
result = %{<script src="/sites/000000000000000000000042/theme/javascripts/trash/main.js" type="text/javascript"></script>}
javascript_tag('trash/main.js').should == result
javascript_tag('trash/main').should == result
end
@ -107,14 +107,19 @@ describe Locomotive::Liquid::Filters::Html do
end
def build_context
Site.any_instance.stubs(:id).returns(42)
klass = Class.new
klass.class_eval do
def registers
{ :site => Factory.build(:site) }
{ :site => Factory.build(:site, :id => fake_bson_id(42)) }
end
def fake_bson_id(id)
BSON::ObjectId(id.to_s.rjust(24, '0'))
end
end
klass.new
end
end

View File

@ -2,9 +2,9 @@ require 'spec_helper'
describe AssetCollection do
# it 'should have a valid factory' do
# Factory.build(:asset_collection).should be_valid
# end
it 'should have a valid factory' do
Factory.build(:asset_collection).should be_valid
end
describe 'custom fields (beta)' do
@ -127,14 +127,16 @@ describe AssetCollection do
@collection.upsert(:validate => false)
@collection.reload
asset = @collection.assets.first
lambda { asset.active }.should raise_error
lambda { asset.active_at }.should raise_error
end
it 'should rename field label' do
@collection.asset_custom_fields.first.label = 'Simple description'
@collection.asset_custom_fields.first._alias = nil
@collection.upsert(:validate => false)
@collection.reload
asset = @collection.assets.first
asset.simple_description.should == 'Lorem ipsum'
end
@ -145,23 +147,23 @@ describe AssetCollection do
it 'adds new field' do
@collection.asset_custom_fields.clear
@collection.asset_custom_fields.build :label => 'Title'
@collection.asset_custom_fields_attributes = { '0' => { 'label' => 'A title', 'kind' => 'String' }, '-1' => { 'label' => 'Tagline', 'kind' => 'String' } }
field = @collection.asset_custom_fields.build :label => 'Title'
@collection.asset_custom_fields_attributes = { 0 => { :id => field.id.to_s, 'label' => 'A title', 'kind' => 'String' }, 1 => { 'label' => 'Tagline', 'kind' => 'String' } }
@collection.asset_custom_fields.size.should == 2
@collection.asset_custom_fields.first.label.should == 'A title'
@collection.asset_custom_fields.last.label.should == 'Tagline'
end
it 'updates/removes fields' do
@collection.asset_custom_fields.build :label => 'Title', :kind => 'String'
@collection.save; @collection = AssetCollection.first
field = @collection.asset_custom_fields.build :label => 'Title', :kind => 'String'
@collection.save; @collection = AssetCollection.find(@collection.id)
@collection.update_attributes(:asset_custom_fields_attributes => {
'0' => { 'label' => 'My Description', 'kind' => 'Text', '_destroy' => '1' },
'1' => { 'label' => 'Active', 'kind' => 'Boolean', '_destroy' => '1' },
'2' => { 'label' => 'My Title !', 'kind' => 'String' },
'0' => { 'id' => lookup_field_id(0), 'label' => 'My Description', 'kind' => 'Text', '_destroy' => '1' },
'1' => { 'id' => lookup_field_id(1), 'label' => 'Active', 'kind' => 'Boolean', '_destroy' => '1' },
'2' => { 'id' => lookup_field_id(2), 'label' => 'My Title !', 'kind' => 'String' },
'new_record' => { 'label' => 'Published at', 'kind' => 'String' }
})
@collection = AssetCollection.first
@collection = AssetCollection.find(@collection.id)
@collection.asset_custom_fields.size.should == 2
@collection.asset_custom_fields.first.label.should == 'My Title !'
end
@ -174,4 +176,8 @@ describe AssetCollection do
collection.assets.build(:name => 'Asset on steroids', :description => 'Lorem ipsum', :active => true)
end
def lookup_field_id(index)
@collection.asset_custom_fields.all[index].id.to_s
end
end

View File

@ -63,8 +63,8 @@ describe ContentInstance do
describe '#api' do
before(:each) do
@account_1 = Factory.build('admin user', :id => '1')
@account_2 = Factory.build('frenchy user', :id => '2')
@account_1 = Factory.build('admin user', :id => fake_bson_id('1'))
@account_2 = Factory.build('frenchy user', :id => fake_bson_id('2'))
@content_type.api_enabled = true
@content_type.api_accounts = ['', @account_1.id, @account_2.id]
@ -98,4 +98,8 @@ describe ContentInstance do
@content_type.contents.build({ :title => 'Locomotive', :description => 'Lorem ipsum....' }.merge(options))
end
def fake_bson_id(id)
BSON::ObjectId(id.to_s.rjust(24, '0'))
end
end