first and successful attempt to render a site directly from a MongoDB database (still issues though)

did committed Mar 15, 2015
commit e76aebe96cee7944ac3f64672ec7a4ea6008911a
Showing 11 changed files with 55 additions and 28 deletions
locomotive/steam/decorators/template_decorator.rb b/lib/locomotive/steam/decorators/template_decorator.rb +1 -1
@@ @@ -7,7 +7,7 @@ module Locomotive
class TemplateDecorator < I18nDecorator
def liquid_source
- if respond_to?(:template_path)
+ if respond_to?(:template_path) && template_path
source_from_template_file
else
self.source
locomotive/steam/entities/editable_element.rb b/lib/locomotive/steam/entities/editable_element.rb +6 -0
@@ @@ -6,6 +6,12 @@ module Locomotive::Steam
attr_accessor :page
+ def initialize(attributes = {})
+ super({
+ source: nil
+ }.merge(attributes))
+ end
+
def default_content?
!!self[:default_content]
end
locomotive/steam/liquid/tags/editable/base.rb b/lib/locomotive/steam/liquid/tags/editable/base.rb +4 -5
@@ @@ -30,15 +30,14 @@ module Locomotive
end
def render(context)
- repository = context.registers[:services].repositories.page
- page = context.registers[:page]
- block = context['block'].try(:name)
+ service = context.registers[:services].editable_element
+ page = context.registers[:page]
+ block = context['block'].try(:name)
- if element = repository.editable_element_for(page, block, @slug)
+ if element = service.find(page, block, @slug)
render_element(context, element)
else
# Locomotive::Common::Logger.error "[#{page.fullpath}] missing #{@tag_name} \"#{@slug}\" (#{context['block'].try(:name) || 'default'})"
- # render_default_content
super
end
end
locomotive/steam/liquid/tags/editable/file.rb b/lib/locomotive/steam/liquid/tags/editable/file.rb +2 -2
@@ @@ -16,8 +16,8 @@ module Locomotive
def render_element(context, element)
default_timestamp = context.registers[:page].updated_at.to_i
- url, timestamp = (if element.source?
- [element.source.url, default_timestamp]
+ url, timestamp = (if element.source
+ [element.source, default_timestamp]
else
if element.default_source_url.present?
[element.default_source_url, default_timestamp]
locomotive/steam/server.rb b/lib/locomotive/steam/server.rb +1 -1
@@ @@ -28,7 +28,7 @@ module Locomotive::Steam
if configuration.serve_assets
use ::Rack::Static, {
root: configuration.assets_path,
- urls: ['/images', '/fonts', '/samples', '/media']
+ urls: ['/images', '/fonts', '/samples', '/media', '/sites']
}
use Middlewares::DynamicAssets, {
root: configuration.assets_path,
locomotive/steam/services.rb b/lib/locomotive/steam/services.rb +4 -0
@@ @@ -35,6 +35,10 @@ module Locomotive
Steam::ParentFinderService.new(repositories.page)
end
+ register :editable_element do
+ Steam::EditableElementService.new(repositories.page, locale)
+ end
+
register :snippet_finder do
Steam::SnippetFinderService.new(repositories.snippet)
end
locomotive/steam/services/editable_element_service.rb b/lib/locomotive/steam/services/editable_element_service.rb +17 -0
@@ @@ -0,0 +1,17 @@
+ module Locomotive
+ module Steam
+
+ class EditableElementService < Struct.new(:repository, :locale)
+
+ include Locomotive::Steam::Services::Concerns::Decorator
+
+ def find(page, block, slug)
+ decorate do
+ repository.editable_element_for(page, block, slug)
+ end
+ end
+
+ end
+
+ end
+ end
spec/support/helpers.rb +1 -0
@@ @@ -25,6 +25,7 @@ module Spec
Locomotive::Steam.configure do |config|
config.mode = :test
config.adapter = { name: :filesystem, path: default_fixture_site_path }
+ # config.adapter = { name: :'mongoDB', database: 'steam_test', hosts: ['127.0.0.1'] }
config.assets_path = File.expand_path(File.join(default_fixture_site_path, 'public'))
config.serve_assets = true
config.minify_assets = true
spec/unit/liquid/tags/editable/control_spec.rb +6 -6
@@ @@ -70,12 +70,12 @@ describe Locomotive::Steam::Liquid::Tags::Editable::Control do
let(:inline_editing) { false }
- let(:page) { instance_double('Page', fullpath: 'hello-world') }
- let(:element) { instance_double('EditableControl', id: 42, content: false) }
- let(:services) { Locomotive::Steam::Services.build_instance(nil) }
- let(:context) { ::Liquid::Context.new({ 'inline_editing' => inline_editing }, {}, { page: page, services: services }) }
+ let(:page) { instance_double('Page', fullpath: 'hello-world') }
+ let(:element) { instance_double('EditableControl', id: 42, content: false) }
+ let(:services) { Locomotive::Steam::Services.build_instance(nil) }
+ let(:context) { ::Liquid::Context.new({ 'inline_editing' => inline_editing }, {}, { page: page, services: services }) }
- before { allow(services.repositories.page).to receive(:editable_element_for).and_return(element) }
+ before { allow(services.editable_element).to receive(:find).and_return(element) }
subject { render_template(source, context, options) }
@@ @@ -99,7 +99,7 @@ describe Locomotive::Steam::Liquid::Tags::Editable::Control do
let(:source) { '{% block wrapper %}{% block sidebar %}{% editable_control menu %}true{% endeditable_control %}{% endblock %}{% endblock %}' }
- before { expect(services.repositories.page).to receive(:editable_element_for).with(page, 'wrapper/sidebar', 'menu').and_return(element) }
+ before { expect(services.editable_element).to receive(:find).with(page, 'wrapper/sidebar', 'menu').and_return(element) }
it { is_expected.to eq 'false' }
end
spec/unit/liquid/tags/editable/file_spec.rb +7 -7
@@ @@ -69,12 +69,12 @@ describe Locomotive::Steam::Liquid::Tags::Editable::File do
let(:inline_editing) { false }
- let(:page) { instance_double('Page', fullpath: 'hello-world', updated_at: DateTime.parse('2007-06-29 21:00:00')) }
- let(:element) { instance_double('EditableFile', id: 42, default_source_url: nil, source?: false, source: nil) }
- let(:services) { Locomotive::Steam::Services.build_instance(nil) }
- let(:context) { ::Liquid::Context.new({}, {}, { page: page, services: services }) }
+ let(:page) { instance_double('Page', fullpath: 'hello-world', updated_at: DateTime.parse('2007-06-29 21:00:00')) }
+ let(:element) { instance_double('EditableFile', id: 42, default_source_url: nil, source?: false, source: nil) }
+ let(:services) { Locomotive::Steam::Services.build_instance(nil) }
+ let(:context) { ::Liquid::Context.new({}, {}, { page: page, services: services }) }
- before { allow(services.repositories.page).to receive(:editable_element_for).and_return(element) }
+ before { allow(services.editable_element).to receive(:find).and_return(element) }
subject { render_template(source, context, options) }
@@ @@ -96,7 +96,7 @@ describe Locomotive::Steam::Liquid::Tags::Editable::File do
context 'modified value' do
- let(:file) { instance_double('Source', url: 'http://www.placehold.it/250x250') }
+ let(:file) { 'http://www.placehold.it/250x250' }
let(:element) { instance_double('EditableFile', source: file, source?: true, default_source_url: false) }
it { is_expected.to eq 'http://www.placehold.it/250x250?1183150800' }
@@ @@ -106,7 +106,7 @@ describe Locomotive::Steam::Liquid::Tags::Editable::File do
let(:source) { '{% block wrapper %}{% block sidebar %}{% editable_file banner %}http://www.placehold.it/250x250{% endeditable_file %}{% endblock %}{% endblock %}' }
- before { expect(services.repositories.page).to receive(:editable_element_for).with(page, 'wrapper/sidebar', 'banner').and_return(element) }
+ before { expect(services.editable_element).to receive(:find).with(page, 'wrapper/sidebar', 'banner').and_return(element) }
it { is_expected.to eq 'http://www.placehold.it/250x250' }
end
spec/unit/liquid/tags/editable/text_spec.rb +6 -6
@@ @@ -72,12 +72,12 @@ describe Locomotive::Steam::Liquid::Tags::Editable::Text do
let(:inline_editing) { false }
- let(:page) { instance_double('Page', fullpath: 'hello-world') }
- let(:element) { instance_double('EditableText', id: 42, default_content?: true, inline_editing?: true) }
- let(:services) { Locomotive::Steam::Services.build_instance(nil) }
- let(:context) { ::Liquid::Context.new({ 'inline_editing' => inline_editing }, {}, { page: page, services: services }) }
+ let(:page) { instance_double('Page', fullpath: 'hello-world') }
+ let(:element) { instance_double('EditableText', id: 42, default_content?: true, inline_editing?: true) }
+ let(:services) { Locomotive::Steam::Services.build_instance(nil) }
+ let(:context) { ::Liquid::Context.new({ 'inline_editing' => inline_editing }, {}, { page: page, services: services }) }
- before { allow(services.repositories.page).to receive(:editable_element_for).and_return(element) }
+ before { allow(services.editable_element).to receive(:find).and_return(element) }
subject { render_template(source, context, options) }
@@ @@ -101,7 +101,7 @@ describe Locomotive::Steam::Liquid::Tags::Editable::Text do
let(:source) { '{% block wrapper %}{% block sidebar %}{% editable_text title %}Hello world{% endeditable_text %}{% endblock %}{% endblock %}' }
- before { expect(services.repositories.page).to receive(:editable_element_for).with(page, 'wrapper/sidebar', 'title').and_return(element) }
+ before { expect(services.editable_element).to receive(:find).with(page, 'wrapper/sidebar', 'title').and_return(element) }
it { is_expected.to eq 'Hello world' }
end