SpontaneousCMS/spontaneous

View on GitHub
lib/spontaneous/site.rb

Summary

Maintainability
A
3 hrs
Test Coverage
# encoding: UTF-8


module Spontaneous

  class Site < Spontaneous::Facet
    require "spontaneous/site/assets"
    require "spontaneous/site/features"
    require "spontaneous/site/helpers"
    require "spontaneous/site/hooks"
    require "spontaneous/site/instance"
    require "spontaneous/site/level"
    require "spontaneous/site/map"
    require "spontaneous/site/paths"
    require "spontaneous/site/publishing"
    require "spontaneous/site/schema"
    require "spontaneous/site/search"
    require "spontaneous/site/selectors"
    require "spontaneous/site/state"
    require "spontaneous/site/storage"
    require "spontaneous/site/url"

    include Assets
    include Features
    include Helpers
    include Hooks
    include Instance
    include Level
    include Map
    include Paths
    include Publishing
    include Schema
    include Search
    include Selectors
    include State
    include Storage
    include URL
    include Spontaneous::Model::Page::Singleton::SiteMethods

    attr_accessor :database
    attr_reader :environment, :mode, :model

    def initialize(root, env, mode)
      super(root)
      @environment, @mode = env, mode
    end

    def model=(content_model)
      @model = content_model
    end

    def initialize!
      load_config!
      connect_to_database!
      find_plugins!
      load_facets!
      init_facets!
      run_initializers!
    end


    def init_facets!
      facets.each do |facet|
        facet.init!
      end
    end

    def run_initializers!
      facets.each do |facet|
        facet.run_initializers
      end
    end

    def load_facets!
      load_order.each do |category|
        facets.each { |facet| facet.load_files(category) }
      end
    end


    def reload!
      schema.reload!
      facets.each { |facet| facet.reload_all! }
      schema.validate!
    end


    def connect_to_database!
      self.database = database_instance(db_settings).tap do |db|
        db.logger = logger if config.log_queries
        # Improve performance for postgres
        db.optimize_model_load = true if db.respond_to?(:optimize_model_load)
      end
    end

    def database_instance(opts)
      Sequel.connect(opts)
    end

    def db_settings
      self.config.db ||= db_connection_options(environment)
    end

    def db_connection_options(env)
      (db_config_env || db_config_file[env])
    end

    def db_config_env
      ENV['DATABASE_URL']
    end

    def db_config_file
      YAML.load_file(File.join(paths.expanded(:config).first, "database.yml"))
    end

    def transaction(&block)
      model.db.transaction(&block)
    end

    def config
      @config ||= Spontaneous::Config.new(environment, mode)
    end

    def find_plugins!
      paths.expanded(:plugins).each do |glob|
        Dir[glob].each do |path|
          load_plugin(path)
        end
      end
    end

    def plugins
      @plugins ||= []
    end

    def facets
      [self] + plugins
    end

    def load_plugin(plugin_root)
      plugin = Spontaneous::Application::Plugin.new(plugin_root)
      self.plugins <<  plugin
      plugin
    end

    # used by publishing mechanism to place files into the appropriate subdirectories
    # in the public folder.
    # Site#file_namespace returns nil so that it's files are placed at the root
    def file_namespace
      nil
    end

    def revision_root
      @revision_dir ||= begin
        path = Pathname.new(@root / 'cache/revisions')
        path.mkpath unless path.exist?
        path.realpath.to_s
      end
    end

    def revision_dir(revision=nil, root = revision_root)
      root ||= revision_root
      return root / 'current' if revision.nil?
      root / Spontaneous::Paths.pad_revision_number(revision)
    end

    def media_dir(*path)
      media_root = root / "cache/media"
      return media_root if path.empty?
      File.join(media_root, *path)
    end

    def cache_dir(*path)
      cache_root = root / "cache"
      return cache_root if path.empty?
      File.join(cache_root, *path)
    end

    def development?
      Spontaneous.development?
    end

    def inspect
      %[#<Site @root="#@root" @schema=#{@schema.inspect} @paths=#{@paths.inspect} @environment=#{@environment.inspect} @mode=#{@mode.inspect}>]
    end
  end
end