sitepress-rails 1.0.0 → 2.0.0.beta4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -0
  3. data/README.md +1 -1
  4. data/bin/rails +13 -0
  5. data/lib/sitepress/build_paths/directory_index_path.rb +12 -0
  6. data/lib/sitepress/build_paths/index_path.rb +20 -0
  7. data/lib/sitepress/build_paths/root_path.rb +40 -0
  8. data/lib/sitepress/compiler.rb +68 -0
  9. data/lib/sitepress/engine.rb +44 -12
  10. data/lib/sitepress/rails.rb +12 -10
  11. data/lib/sitepress/rails_configuration.rb +8 -6
  12. data/lib/sitepress/renderers/controller.rb +51 -0
  13. data/lib/sitepress/renderers/server.rb +25 -0
  14. data/{app → rails/app}/controllers/concerns/sitepress/site_pages.rb +49 -8
  15. data/{app → rails/app}/controllers/sitepress/site_controller.rb +1 -1
  16. data/{config → rails/config}/routes.rb +5 -0
  17. data/sitepress-rails.gemspec +32 -0
  18. data/spec/dummy/log/test.log +2440 -79076
  19. data/spec/sitepress-rails_spec.rb +1 -30
  20. data/spec/sitepress/compiler_spec.rb +19 -0
  21. data/spec/sitepress/sitepress_site_controller_spec.rb +47 -6
  22. metadata +108 -71
  23. data/app/helpers/sitepress/application_helper.rb +0 -4
  24. data/lib/sitepress/extensions/index_request_path.rb +0 -24
  25. data/lib/sitepress/extensions/partials_remover.rb +0 -19
  26. data/lib/sitepress/extensions/rails_request_paths.rb +0 -20
  27. data/spec/dummy/db/production.sqlite3 +0 -0
  28. data/spec/dummy/db/test.sqlite3 +0 -0
  29. data/spec/dummy/log/production.log +0 -1360
  30. data/spec/sitepress/extensions/index_request_path_spec.rb +0 -15
  31. data/spec/sitepress/extensions/partials_remover_spec.rb +0 -12
  32. data/spec/sitepress/extensions/rails_request_paths_spec.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b8d7a0d3d0bf5537540444e469a6a2d1240d27a198d5d7de3b12eee16987974
4
- data.tar.gz: 5994a7fe8f40b317b990b488a5b434c1b84366b85baf7daa29de02485d628e3e
3
+ metadata.gz: 135962bb8c744104c2119d592dc46d33d3bf86d1f0138f9cc8484416770f776d
4
+ data.tar.gz: f9ec3cea5fb45637deef576515ecf039f943087d29c7d6255e2bf98070f7ede5
5
5
  SHA512:
6
- metadata.gz: 43b0db4a564944e11f22c4092ebef89a48bef5ed196927b32309f56b848446fd4a230f04b7473026d4b68164f5cb122957671acc7acfc86532e3f7e273510e90
7
- data.tar.gz: cfdac0511e6288950e9ab0218e0095012436bf511af57f5f7ee00cec22af5269dfc8588153ed6829038a6c08eebce89de5bd0750d47eba14e16bcd034457b3a2
6
+ metadata.gz: 8daefdf6dde16ba78128f812aa1d8fa2e0fc5cf0feeb639844207236d9226231925b7915908d1f31895eb306eabeae54c2c37a5e3e2026cd078b4745754128f7
7
+ data.tar.gz: af534c613a3d31f8dd7e61a7dd131bf01b71cd5915fe9b2ae2876b184ef9f68c715075d40d450fc7e07728c5779150bbbedf5224f07403859ca9fa8a48fb70e5
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ .bundle/
2
+ log/*.log
3
+ pkg/
4
+ test/dummy/db/*.sqlite3
5
+ test/dummy/db/*.sqlite3-journal
6
+ test/dummy/log/*.log
7
+ test/dummy/tmp/
data/README.md CHANGED
@@ -25,7 +25,7 @@ mount Sitepress::Engine => "/"
25
25
  Create the `app/content/pages` in your rails project:
26
26
 
27
27
  ```bash
28
- $ mkdir app/content/pages
28
+ $ mkdir -p app/content/pages
29
29
  ```
30
30
 
31
31
  Then add pages to the `app/content/pages` directory:
data/bin/rails ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails gems
3
+ # installed from the root of your application.
4
+
5
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
6
+ ENGINE_PATH = File.expand_path('../../lib/sitepress-rails/engine', __FILE__)
7
+
8
+ # Set up gems listed in the Gemfile.
9
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
10
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
11
+
12
+ require 'rails/all'
13
+ require 'rails/engine/commands'
@@ -0,0 +1,12 @@
1
+ module Sitepress
2
+ module BuildPaths
3
+ # In many cases, you'll want to serve up `pages/blah.html.haml` as `/blah` on
4
+ # hosts like S3. To achieve this effect, we have to compile `pages/blah.html.haml`
5
+ # to a folder with the filename `index.html`, so the final path would be `/blah/index.html`
6
+ class DirectoryIndexPath < IndexPath
7
+ def path_with_default_format
8
+ File.join(node.name, "#{node.default_name}.#{format}")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ module Sitepress
2
+ module BuildPaths
3
+ # Compiles pages directly from `/pages/blah.html.haml` to `/blah.html`. Handles root `index`
4
+ # pages too, mainly grabbing the root, which doesn't have a name in the node, to the default_name
5
+ # of the node, which is usually `index`.
6
+ class IndexPath < RootPath
7
+ def path_without_format
8
+ node.name
9
+ end
10
+
11
+ def path_with_format
12
+ "#{node.name}.#{format}"
13
+ end
14
+
15
+ def path_with_default_format
16
+ path_with_format
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,40 @@
1
+ module Sitepress
2
+ module BuildPaths
3
+ # Compiles pages directly from `/pages/blah.html.haml` to `/blah.html`. Handles root `index`
4
+ # pages too, mainly grabbing the root, which doesn't have a name in the node, to the default_name
5
+ # of the node, which is usually `index`.
6
+ class RootPath
7
+ attr_reader :resource
8
+
9
+ extend Forwardable
10
+ def_delegators :resource, :node, :format
11
+
12
+ def initialize(resource)
13
+ @resource = resource
14
+ end
15
+
16
+ def path
17
+ if format.nil?
18
+ path_without_format
19
+ elsif format == node.default_format
20
+ path_with_default_format
21
+ elsif format
22
+ path_with_format
23
+ end
24
+ end
25
+
26
+ protected
27
+ def path_without_format
28
+ node.default_name
29
+ end
30
+
31
+ def path_with_format
32
+ "#{node.default_name}.#{format}"
33
+ end
34
+
35
+ def path_with_default_format
36
+ path_with_format
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,68 @@
1
+ require "pathname"
2
+ require "fileutils"
3
+
4
+ module Sitepress
5
+ # Compile all resources from a Sitepress site into static pages.
6
+ class Compiler
7
+ include FileUtils
8
+
9
+ class ResourceCompiler
10
+ attr_reader :resource
11
+
12
+ def initialize(resource)
13
+ @resource = resource
14
+ end
15
+
16
+ def compilation_path
17
+ File.join(*resource.lineage, compilation_filename)
18
+ end
19
+
20
+ # Compiled assets have a slightly different filename for assets, especially the root node.
21
+ def compilation_filename(path_builder: BuildPaths::DirectoryIndexPath, root_path_builder: BuildPaths::RootPath)
22
+ path_builder = resource.node.root? ? root_path_builder : path_builder
23
+ path_builder.new(resource).path
24
+ end
25
+
26
+ def render(page)
27
+ Renderers::Server.new(resource).render
28
+ end
29
+ end
30
+
31
+ attr_reader :site
32
+
33
+ def initialize(site:, stdout: $stdout)
34
+ @site = site
35
+ @stdout = stdout
36
+ end
37
+
38
+ # Iterates through all pages and writes them to disk
39
+ def compile(target_path:)
40
+ target_path = Pathname.new(target_path)
41
+ mkdir_p target_path
42
+ cache_resources = @site.cache_resources
43
+ @stdout.puts "Compiling #{@site.root_path.expand_path}"
44
+
45
+ begin
46
+ @site.cache_resources = true
47
+ @site.resources.each do |resource|
48
+ compiler = ResourceCompiler.new(resource)
49
+ path = target_path.join(compiler.compilation_path)
50
+ mkdir_p path.dirname
51
+ if resource.renderable?
52
+ @stdout.puts " Rendering #{path}"
53
+ File.open(path.expand_path, "w"){ |f| f.write compiler.render(resource) }
54
+ else
55
+ @stdout.puts " Copying #{path}"
56
+ FileUtils.cp resource.asset.path, path.expand_path
57
+ end
58
+ rescue => e
59
+ @stdout.puts "Error compiling #{resource.inspect}"
60
+ raise
61
+ end
62
+ @stdout.puts "Successful compilation to #{target_path.expand_path}"
63
+ ensure
64
+ @site.cache_resources = cache_resources
65
+ end
66
+ end
67
+ end
68
+ end
@@ -1,22 +1,54 @@
1
+ require "rails/engine"
2
+
1
3
  module Sitepress
2
4
  class Engine < ::Rails::Engine
3
- config.before_configuration do |app|
4
- Sitepress.configure do |config|
5
- app.paths["app/helpers"].push config.site.root_path.join("helpers")
6
- app.paths["app/assets"].push config.site.root_path.join("assets")
7
- app.paths["app/views"].push config.site.root_path
8
- end
5
+ # Set the root of the engine to the gems rails directory.
6
+ config.root = File.expand_path("../../rails", __dir__)
7
+
8
+ # Set the path for the site configuration file.
9
+ paths.add "config/site.rb", with: [
10
+ File.expand_path("./config/site.rb"), # When Sitepress is launched via `sitepress server`.
11
+ "config/site.rb" # When Sitepress is launched embedded in Rails project.
12
+ ]
13
+
14
+ # Load the `config/site.rb` file so users can configure Sitepress.
15
+ initializer :load_sitepress_file, before: :set_sitepress_paths do
16
+ site_file = paths["config/site.rb"].existent.first
17
+ load site_file if site_file
18
+ end
19
+
20
+ # Load paths from `Sitepress#site` into rails so it can render views, helpers, etc. properly.
21
+ initializer :set_sitepress_paths, before: :set_autoload_paths do |app|
22
+ app.paths["app/helpers"].push site.helpers_path.expand_path
23
+ app.paths["app/views"].push site.root_path.expand_path
24
+ app.paths["app/views"].push site.pages_path.expand_path
9
25
  end
10
26
 
11
- initializer "sitepress.configure" do |app|
12
- Sitepress.configure do |config|
13
- config.parent_engine = app
14
- config.cache_resources = app.config.cache_classes
27
+ # Configure sprockets paths for the site.
28
+ initializer :set_asset_paths, before: :append_assets_path do |app|
29
+ manifest_file = sitepress_configuration.manifest_file_path.expand_path
30
+
31
+ if manifest_file.exist?
32
+ app.paths["app/assets"].push site.assets_path.expand_path
33
+ app.config.assets.precompile << manifest_file.to_s
34
+ else
35
+ Rails.logger.warn "WARNING: Sitepress could not enable Sprockets because it could not find a manifest file at #{manifest_file.to_s.inspect}."
15
36
  end
16
37
  end
17
38
 
18
- initializer "sitepress.middleware" do |app|
19
- app.middleware.use Sitepress::Middleware::RequestCache, site: Sitepress.site
39
+ # Configure Sitepress with Rails settings.
40
+ initializer :configure_sitepress do |app|
41
+ sitepress_configuration.parent_engine = app
42
+ sitepress_configuration.cache_resources = app.config.cache_classes
43
+ end
44
+
45
+ private
46
+ def sitepress_configuration
47
+ Sitepress.configuration
48
+ end
49
+
50
+ def site
51
+ sitepress_configuration.site
20
52
  end
21
53
  end
22
54
  end
@@ -1,19 +1,21 @@
1
1
  require "sitepress-core"
2
2
 
3
3
  module Sitepress
4
- # Contains singletons for rails and some configuration data.
5
- Configuration = Struct.new(:site, :routes, :parent_engine)
6
-
7
- # Rescued by ActionController to display page not found error.
8
- PageNotFoundError = Class.new(StandardError)
9
-
4
+ autoload :Compiler, "sitepress/compiler"
10
5
  autoload :RailsConfiguration, "sitepress/rails_configuration"
11
6
  autoload :RouteConstraint, "sitepress/route_constraint"
12
- module Extensions
13
- autoload :RailsRequestPaths, "sitepress/extensions/rails_request_paths"
14
- autoload :PartialsRemover, "sitepress/extensions/partials_remover"
15
- autoload :IndexRequestPath, "sitepress/extensions/index_request_path"
7
+ module Renderers
8
+ autoload :Controller, "sitepress/renderers/controller"
9
+ autoload :Server, "sitepress/renderers/server"
16
10
  end
11
+ module BuildPaths
12
+ autoload :RootPath, "sitepress/build_paths/root_path"
13
+ autoload :IndexPath, "sitepress/build_paths/index_path"
14
+ autoload :DirectoryIndexPath, "sitepress/build_paths/directory_index_path"
15
+ end
16
+
17
+ # Rescued by ActionController to display page not found error.
18
+ PageNotFoundError = Class.new(StandardError)
17
19
 
18
20
  # Make site available via Sitepress.site from Rails app.
19
21
  def self.site
@@ -6,13 +6,13 @@ module Sitepress
6
6
  # Store in ./app/content by default.
7
7
  DEFAULT_SITE_ROOT = "app/content".freeze
8
8
 
9
- attr_accessor :site, :parent_engine, :routes, :cache_resources
9
+ attr_accessor :routes
10
+ attr_writer :site, :parent_engine
10
11
 
11
12
  # Delegates configuration points into the Sitepress site.
12
13
  extend Forwardable
13
14
  def_delegators :site, :cache_resources, :cache_resources=, :cache_resources?
14
15
 
15
- # Set defaults.
16
16
  def initialize
17
17
  self.routes = true
18
18
  end
@@ -22,10 +22,12 @@ module Sitepress
22
22
  end
23
23
 
24
24
  def site
25
- @site ||= Site.new(root_path: default_root).tap do |site|
26
- site.resources_pipeline << Extensions::PartialsRemover.new
27
- site.resources_pipeline << Extensions::RailsRequestPaths.new
28
- end
25
+ @site ||= Site.new(root_path: default_root)
26
+ end
27
+
28
+ # Location of Sprockets manifest file
29
+ def manifest_file_path
30
+ site.assets_path.join("config/manifest.js")
29
31
  end
30
32
 
31
33
  private
@@ -0,0 +1,51 @@
1
+ module Sitepress
2
+ module Renderers
3
+ class Controller
4
+ attr_reader :controller, :page
5
+
6
+ def initialize(page, controller = SiteController)
7
+ @controller = controller
8
+ @page = page
9
+ end
10
+
11
+ def render
12
+ renderer.render inline: page.body,
13
+ type: page.asset.template_extensions.last,
14
+ layout: resolve_layout,
15
+ content_type: page.mime_type.to_s
16
+ end
17
+
18
+ private
19
+ def layout
20
+ controller._layout
21
+ end
22
+
23
+ def has_layout_conditions?
24
+ controller._layout_conditions?
25
+ end
26
+
27
+ def layout_conditions
28
+ controller._layout_conditions
29
+ end
30
+
31
+ def renderer
32
+ controller.renderer.new("PATH_INFO" => page.request_path)
33
+ end
34
+
35
+ def resolve_layout
36
+ return page.data.fetch("layout") if page.data.key? "layout"
37
+ return layout unless has_layout_conditions?
38
+
39
+ clause, formats = layout_conditions.first
40
+ format = page.format.to_s
41
+
42
+ case clause
43
+ when :only
44
+ layout if formats.include? format
45
+ when :except
46
+ layout if formats.exclude? format
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,25 @@
1
+ module Sitepress
2
+ module Renderers
3
+ class Server
4
+ attr_reader :rails_app, :page
5
+
6
+ def initialize(page, rails_app = Rails.application)
7
+ @rails_app = rails_app
8
+ @page = page
9
+ end
10
+
11
+ def render
12
+ code, headers, response = rails_app.routes.call env
13
+ response.body
14
+ end
15
+
16
+ def env
17
+ {
18
+ "PATH_INFO"=> page.request_path,
19
+ "REQUEST_METHOD"=>"GET",
20
+ "rack.input" => "GET"
21
+ }
22
+ end
23
+ end
24
+ end
25
+ end
@@ -7,12 +7,16 @@ module Sitepress
7
7
  # to return the path to the layout.
8
8
  DEFAULT_PAGE_RAILS_FORMATS = [:html].freeze
9
9
 
10
+ # Default root path of resources.
11
+ ROOT_RESOURCE_PATH = "".freeze
12
+
10
13
  extend ActiveSupport::Concern
11
14
 
12
15
  included do
13
16
  rescue_from Sitepress::PageNotFoundError, with: :page_not_found
14
17
  helper Sitepress::Engine.helpers
15
18
  helper_method :current_page, :site
19
+ before_action :append_relative_partial_path, only: :show
16
20
  end
17
21
 
18
22
  def show
@@ -21,14 +25,15 @@ module Sitepress
21
25
 
22
26
  protected
23
27
  def render_page(page)
24
- render inline: page.body,
25
- type: page.asset.template_extensions.last,
26
- layout: page.data.fetch("layout", controller_layout),
27
- content_type: page.mime_type.to_s
28
+ if page.renderable?
29
+ render_text_resource page
30
+ else
31
+ send_binary_resource page
32
+ end
28
33
  end
29
34
 
30
35
  def current_page
31
- @_current_page ||= find_resource
36
+ @current_page ||= find_resource
32
37
  end
33
38
 
34
39
  def site
@@ -40,6 +45,24 @@ module Sitepress
40
45
  end
41
46
 
42
47
  private
48
+ def append_relative_partial_path
49
+ append_view_path current_page.asset.path.dirname
50
+ end
51
+
52
+ def render_text_resource(resource)
53
+ with_sitepress_render_cache do
54
+ render inline: resource.body,
55
+ type: resource.asset.template_extensions.last,
56
+ layout: resource.data.fetch("layout", controller_layout),
57
+ content_type: resource.mime_type.to_s
58
+ end
59
+ end
60
+
61
+ def send_binary_resource(resource)
62
+ send_file resource.asset.path,
63
+ disposition: :inline,
64
+ type: resource.mime_type.to_s
65
+ end
43
66
 
44
67
  # Sitepress::PageNotFoundError is handled in the default Sitepress::SiteController
45
68
  # with an execption that Rails can use to display a 404 error.
@@ -53,9 +76,23 @@ module Sitepress
53
76
  end
54
77
  end
55
78
 
56
- # Default finder of the resource for the current controller context.###
79
+ # Default finder of the resource for the current controller context. If the :resource_path
80
+ # isn't present, then its probably the root path so grab that.
57
81
  def find_resource
58
- get params[:resource_path]
82
+ get params.fetch(:resource_path, ROOT_RESOURCE_PATH)
83
+ end
84
+
85
+ # When development environments disable the cache, we still want to turn it
86
+ # on during rendering so that view doesn't rebuild the site on each call.
87
+ def with_sitepress_render_cache(&block)
88
+ cache_resources = site.cache_resources
89
+ begin
90
+ site.cache_resources = true
91
+ yield
92
+ ensure
93
+ site.cache_resources = cache_resources
94
+ site.clear_resources_cache unless site.cache_resources
95
+ end
59
96
  end
60
97
 
61
98
  # Returns the current layout for the inline Sitepress renderer. This is
@@ -74,8 +111,12 @@ module Sitepress
74
111
 
75
112
  if layout.instance_of? String # Rails 4 and 5 return a string from above.
76
113
  layout
77
- else # Rails 3 and older return an object that gives us a file name
114
+ elsif layout # Rails 3 and older return an object that gives us a file name
78
115
  File.basename(layout.identifier).split('.').first
116
+ else
117
+ # If none of the conditions are met, then no layout was
118
+ # specified, so nil is returned.
119
+ nil
79
120
  end
80
121
  end
81
122