nesta 0.12.0 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/tests.yml +21 -0
- data/.gitignore +1 -0
- data/.gitmodules +0 -6
- data/CHANGES +99 -0
- data/Gemfile.lock +43 -39
- data/LICENSE +1 -1
- data/README.md +9 -14
- data/RELEASING.md +9 -7
- data/Rakefile +2 -2
- data/bin/nesta +5 -2
- data/config/deploy.rb.sample +1 -1
- data/lib/nesta/app.rb +1 -2
- data/lib/nesta/commands/build.rb +38 -0
- data/lib/nesta/commands/demo/content.rb +8 -10
- data/lib/nesta/commands/edit.rb +2 -6
- data/lib/nesta/commands/new.rb +11 -12
- data/lib/nesta/commands/plugin/create.rb +7 -9
- data/lib/nesta/commands/template.rb +20 -0
- data/lib/nesta/commands/theme/create.rb +8 -8
- data/lib/nesta/commands/theme/enable.rb +3 -5
- data/lib/nesta/commands/theme/install.rb +6 -10
- data/lib/nesta/commands.rb +9 -0
- data/lib/nesta/config.rb +49 -75
- data/lib/nesta/config_file.rb +29 -0
- data/lib/nesta/helpers.rb +0 -5
- data/lib/nesta/models.rb +33 -34
- data/lib/nesta/navigation.rb +0 -5
- data/lib/nesta/overrides.rb +32 -43
- data/lib/nesta/plugin.rb +0 -16
- data/lib/nesta/static/assets.rb +50 -0
- data/lib/nesta/static/html_file.rb +26 -0
- data/lib/nesta/static/site.rb +104 -0
- data/lib/nesta/system_command.rb +15 -0
- data/lib/nesta/version.rb +1 -1
- data/lib/nesta.rb +7 -4
- data/nesta.gemspec +5 -5
- data/templates/config/config.yml +28 -2
- data/templates/themes/README.md +1 -1
- data/templates/themes/views/master.sass +1 -1
- data/test/integration/atom_feed_test.rb +1 -1
- data/test/integration/commands/build_test.rb +53 -0
- data/test/integration/commands/demo/content_test.rb +8 -6
- data/test/integration/commands/edit_test.rb +4 -4
- data/test/integration/commands/new_test.rb +22 -51
- data/test/integration/commands/plugin/create_test.rb +7 -4
- data/test/integration/commands/theme/create_test.rb +8 -2
- data/test/integration/commands/theme/enable_test.rb +7 -1
- data/test/integration/commands/theme/install_test.rb +13 -9
- data/test/integration/overrides_test.rb +1 -1
- data/test/integration/sitemap_test.rb +1 -1
- data/test/support/temporary_files.rb +1 -1
- data/test/support/test_configuration.rb +2 -4
- data/test/unit/config_test.rb +25 -94
- data/test/unit/static/assets_test.rb +56 -0
- data/test/unit/static/html_file_test.rb +41 -0
- data/test/unit/static/site_test.rb +104 -0
- data/test/unit/system_command_test.rb +20 -0
- data/views/atom.haml +2 -2
- data/views/comments.haml +2 -2
- data/views/footer.haml +1 -1
- data/views/header.haml +2 -3
- data/views/layout.haml +2 -2
- data/views/master.sass +1 -1
- data/views/mixins.sass +2 -2
- data/views/normalize.scss +0 -1
- data/views/sitemap.haml +1 -1
- metadata +44 -31
- data/.hound.yml +0 -2
- data/.rspec +0 -1
- data/.travis.yml +0 -11
- data/lib/nesta/commands/command.rb +0 -57
- data/test/support/silence_commands_during_tests.rb +0 -5
- data/test/unit/commands_test.rb +0 -23
@@ -0,0 +1,20 @@
|
|
1
|
+
module Nesta
|
2
|
+
module Commands
|
3
|
+
class Template
|
4
|
+
def initialize(filename)
|
5
|
+
@filename = filename
|
6
|
+
end
|
7
|
+
|
8
|
+
def template_path
|
9
|
+
dir = File.expand_path('../../../templates', File.dirname(__FILE__))
|
10
|
+
File.join(dir, @filename)
|
11
|
+
end
|
12
|
+
|
13
|
+
def copy_to(dest, context)
|
14
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
15
|
+
template = ERB.new(File.read(template_path), trim_mode: "-")
|
16
|
+
File.open(dest, 'w') { |file| file.puts template.result(context) }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,18 +1,16 @@
|
|
1
|
-
require File.expand_path('../command', File.dirname(__FILE__))
|
2
|
-
|
3
1
|
module Nesta
|
4
2
|
module Commands
|
5
3
|
module Theme
|
6
4
|
class Create
|
7
|
-
include Command
|
8
|
-
|
9
5
|
def initialize(*args)
|
10
6
|
name = args.shift
|
11
7
|
options = args.shift || {}
|
12
8
|
name.nil? && (raise UsageError.new('name not specified'))
|
13
9
|
@name = name
|
14
10
|
@theme_path = Nesta::Path.themes(@name)
|
15
|
-
|
11
|
+
if File.exist?(@theme_path)
|
12
|
+
Nesta.fail_with("#{@theme_path} already exists")
|
13
|
+
end
|
16
14
|
end
|
17
15
|
|
18
16
|
def make_directories
|
@@ -20,15 +18,17 @@ module Nesta
|
|
20
18
|
FileUtils.mkdir_p(File.join(@theme_path, 'views'))
|
21
19
|
end
|
22
20
|
|
23
|
-
def execute
|
21
|
+
def execute(process)
|
24
22
|
make_directories
|
25
|
-
|
23
|
+
{
|
26
24
|
'themes/README.md' => "#{@theme_path}/README.md",
|
27
25
|
'themes/app.rb' => "#{@theme_path}/app.rb",
|
28
26
|
'themes/views/layout.haml' => "#{@theme_path}/views/layout.haml",
|
29
27
|
'themes/views/page.haml' => "#{@theme_path}/views/page.haml",
|
30
28
|
'themes/views/master.sass' => "#{@theme_path}/views/master.sass"
|
31
|
-
|
29
|
+
}.each do |src, dest|
|
30
|
+
Nesta::Commands::Template.new(src).copy_to(dest, binding)
|
31
|
+
end
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -1,11 +1,9 @@
|
|
1
|
-
require File.expand_path('
|
1
|
+
require File.expand_path('../../config_file', File.dirname(__FILE__))
|
2
2
|
|
3
3
|
module Nesta
|
4
4
|
module Commands
|
5
5
|
module Theme
|
6
6
|
class Enable
|
7
|
-
include Command
|
8
|
-
|
9
7
|
def initialize(*args)
|
10
8
|
name = args.shift
|
11
9
|
options = args.shift || {}
|
@@ -13,8 +11,8 @@ module Nesta
|
|
13
11
|
@name = name
|
14
12
|
end
|
15
13
|
|
16
|
-
def execute
|
17
|
-
|
14
|
+
def execute(process)
|
15
|
+
Nesta::ConfigFile.new.set_value('theme', @name)
|
18
16
|
end
|
19
17
|
end
|
20
18
|
end
|
@@ -1,11 +1,7 @@
|
|
1
|
-
require File.expand_path('../command', File.dirname(__FILE__))
|
2
|
-
|
3
1
|
module Nesta
|
4
2
|
module Commands
|
5
3
|
module Theme
|
6
4
|
class Install
|
7
|
-
include Command
|
8
|
-
|
9
5
|
def initialize(*args)
|
10
6
|
@url = args.shift
|
11
7
|
@url.nil? && (raise UsageError.new('URL not specified'))
|
@@ -16,14 +12,14 @@ module Nesta
|
|
16
12
|
File.basename(@url, '.git').sub(/nesta-theme-/, '')
|
17
13
|
end
|
18
14
|
|
19
|
-
def execute
|
20
|
-
|
21
|
-
FileUtils.
|
22
|
-
enable
|
15
|
+
def execute(process)
|
16
|
+
process.run('git', 'clone', @url, "themes/#{theme_name}")
|
17
|
+
FileUtils.rm_rf(File.join("themes/#{theme_name}", '.git'))
|
18
|
+
enable(process)
|
23
19
|
end
|
24
20
|
|
25
|
-
def enable
|
26
|
-
Enable.new(theme_name).execute
|
21
|
+
def enable(process)
|
22
|
+
Enable.new(theme_name).execute(process)
|
27
23
|
end
|
28
24
|
end
|
29
25
|
end
|
data/lib/nesta/commands.rb
CHANGED
@@ -4,10 +4,19 @@ require 'fileutils'
|
|
4
4
|
require File.expand_path('env', File.dirname(__FILE__))
|
5
5
|
require File.expand_path('app', File.dirname(__FILE__))
|
6
6
|
require File.expand_path('path', File.dirname(__FILE__))
|
7
|
+
require File.expand_path('system_command', File.dirname(__FILE__))
|
7
8
|
require File.expand_path('version', File.dirname(__FILE__))
|
8
9
|
|
10
|
+
require File.expand_path('commands/build', File.dirname(__FILE__))
|
9
11
|
require File.expand_path('commands/demo', File.dirname(__FILE__))
|
10
12
|
require File.expand_path('commands/edit', File.dirname(__FILE__))
|
11
13
|
require File.expand_path('commands/new', File.dirname(__FILE__))
|
12
14
|
require File.expand_path('commands/plugin', File.dirname(__FILE__))
|
15
|
+
require File.expand_path('commands/template', File.dirname(__FILE__))
|
13
16
|
require File.expand_path('commands/theme', File.dirname(__FILE__))
|
17
|
+
|
18
|
+
module Nesta
|
19
|
+
module Commands
|
20
|
+
class UsageError < RuntimeError; end
|
21
|
+
end
|
22
|
+
end
|
data/lib/nesta/config.rb
CHANGED
@@ -1,115 +1,89 @@
|
|
1
|
+
require 'singleton'
|
1
2
|
require 'yaml'
|
2
3
|
|
4
|
+
require_relative './config_file'
|
5
|
+
|
3
6
|
module Nesta
|
4
7
|
class Config
|
8
|
+
include Singleton
|
9
|
+
|
5
10
|
class NotDefined < KeyError; end
|
6
11
|
|
7
|
-
|
8
|
-
|
12
|
+
SETTINGS = %w[
|
13
|
+
author
|
14
|
+
build
|
9
15
|
content
|
10
16
|
disqus_short_name
|
17
|
+
domain
|
11
18
|
google_analytics_code
|
12
19
|
read_more
|
13
20
|
subtitle
|
14
21
|
theme
|
15
22
|
title
|
16
23
|
]
|
17
|
-
|
18
|
-
@yaml = nil
|
19
|
-
|
24
|
+
|
20
25
|
class << self
|
21
|
-
|
26
|
+
extend Forwardable
|
27
|
+
def_delegators *[:instance, :fetch].concat(SETTINGS.map(&:to_sym))
|
22
28
|
end
|
23
29
|
|
24
|
-
|
25
|
-
|
30
|
+
attr_accessor :config
|
31
|
+
|
32
|
+
def fetch(setting, *default)
|
33
|
+
setting = setting.to_s
|
34
|
+
self.config ||= read_config_file(setting)
|
35
|
+
env_config = config.fetch(Nesta::App.environment.to_s, {})
|
36
|
+
env_config.fetch(
|
37
|
+
setting,
|
38
|
+
config.fetch(setting) { raise NotDefined.new(setting) }
|
39
|
+
)
|
26
40
|
rescue NotDefined
|
27
|
-
|
28
|
-
from_yaml(key.to_s)
|
29
|
-
rescue NotDefined
|
30
|
-
default.empty? && raise || (return default.first)
|
31
|
-
end
|
41
|
+
default.empty? && raise || (return default.first)
|
32
42
|
end
|
33
43
|
|
34
|
-
def
|
35
|
-
if
|
36
|
-
fetch(method, nil)
|
44
|
+
def method_missing(method, *args)
|
45
|
+
if SETTINGS.include?(method.to_s)
|
46
|
+
fetch(method.to_s, nil)
|
37
47
|
else
|
38
48
|
super
|
39
49
|
end
|
40
50
|
end
|
41
|
-
|
42
|
-
def self.author
|
43
|
-
environment_config = {}
|
44
|
-
%w[name uri email].each do |setting|
|
45
|
-
variable = "NESTA_AUTHOR__#{setting.upcase}"
|
46
|
-
ENV[variable] && environment_config[setting] = ENV[variable]
|
47
|
-
end
|
48
|
-
environment_config.empty? ? from_yaml('author') : environment_config
|
49
|
-
rescue NotDefined
|
50
|
-
nil
|
51
|
-
end
|
52
51
|
|
53
|
-
def
|
54
|
-
|
55
|
-
'see http://nestacms.com/docs/deployment/page-caching')
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.content_path(basename = nil)
|
59
|
-
get_path(content, basename)
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.page_path(basename = nil)
|
63
|
-
get_path(File.join(content_path, "pages"), basename)
|
52
|
+
def respond_to_missing?(method, include_private = false)
|
53
|
+
SETTINGS.include?(method.to_s) || super
|
64
54
|
end
|
65
|
-
|
66
|
-
def
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
def self.yaml_path
|
71
|
-
File.expand_path('config/config.yml', Nesta::App.root)
|
55
|
+
|
56
|
+
def build
|
57
|
+
fetch('build', {})
|
72
58
|
end
|
73
59
|
|
74
|
-
def
|
60
|
+
def read_more
|
75
61
|
fetch('read_more', 'Continue reading')
|
76
62
|
end
|
77
63
|
|
78
|
-
|
79
|
-
|
80
|
-
|
64
|
+
private
|
65
|
+
|
66
|
+
def read_config_file(setting)
|
67
|
+
YAML::load(ERB.new(IO.read(Nesta::ConfigFile.path)).result)
|
68
|
+
rescue Errno::ENOENT
|
81
69
|
raise NotDefined.new(setting)
|
82
|
-
else
|
83
|
-
overrides = { "true" => true, "false" => false }
|
84
|
-
overrides.has_key?(value) ? overrides[value] : value
|
85
|
-
end
|
86
|
-
private_class_method :from_environment
|
87
|
-
|
88
|
-
def self.yaml_exists?
|
89
|
-
File.exist?(yaml_path)
|
90
70
|
end
|
91
|
-
private_class_method :yaml_exists?
|
92
71
|
|
93
|
-
def self.from_hash(hash, setting)
|
94
|
-
hash.fetch(setting) { raise NotDefined.new(setting) }
|
95
|
-
end
|
96
|
-
private_class_method :from_hash
|
97
|
-
|
98
|
-
def self.from_yaml(setting)
|
99
|
-
raise NotDefined.new(setting) unless yaml_exists?
|
100
|
-
self.yaml_conf ||= YAML::load(ERB.new(IO.read(yaml_path)).result)
|
101
|
-
env_config = self.yaml_conf.fetch(Nesta::App.environment.to_s, {})
|
102
|
-
begin
|
103
|
-
from_hash(env_config, setting)
|
104
|
-
rescue NotDefined
|
105
|
-
from_hash(self.yaml_conf, setting)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
private_class_method :from_yaml
|
109
|
-
|
110
72
|
def self.get_path(dirname, basename)
|
111
73
|
basename.nil? ? dirname : File.join(dirname, basename)
|
112
74
|
end
|
113
75
|
private_class_method :get_path
|
76
|
+
|
77
|
+
def self.content_path(basename = nil)
|
78
|
+
get_path(content, basename)
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.page_path(basename = nil)
|
82
|
+
get_path(File.join(content_path, "pages"), basename)
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.attachment_path(basename = nil)
|
86
|
+
get_path(File.join(content_path, "attachments"), basename)
|
87
|
+
end
|
114
88
|
end
|
115
89
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Nesta
|
2
|
+
class ConfigFile
|
3
|
+
def self.path
|
4
|
+
File.expand_path('config/config.yml', Nesta::App.root)
|
5
|
+
end
|
6
|
+
|
7
|
+
def set_value(key, value)
|
8
|
+
pattern = /^\s*#?\s*#{key}:.*/
|
9
|
+
replacement = "#{key}: #{value}"
|
10
|
+
|
11
|
+
configured = false
|
12
|
+
File.open(self.class.path, 'r+') do |file|
|
13
|
+
output = ''
|
14
|
+
file.each_line do |line|
|
15
|
+
if configured
|
16
|
+
output << line
|
17
|
+
else
|
18
|
+
output << line.sub(pattern, replacement)
|
19
|
+
configured = true if line =~ pattern
|
20
|
+
end
|
21
|
+
end
|
22
|
+
output << "#{replacement}\n" unless configured
|
23
|
+
file.pos = 0
|
24
|
+
file.print(output)
|
25
|
+
file.truncate(file.pos)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/nesta/helpers.rb
CHANGED
@@ -60,11 +60,6 @@ module Nesta
|
|
60
60
|
date.strftime("%d %B %Y")
|
61
61
|
end
|
62
62
|
|
63
|
-
def local_stylesheet?
|
64
|
-
Nesta.deprecated('local_stylesheet?', 'use local_stylesheet_link_tag')
|
65
|
-
File.exist?(File.expand_path('views/local.sass', Nesta::App.root))
|
66
|
-
end
|
67
|
-
|
68
63
|
def local_stylesheet_link_tag(name)
|
69
64
|
pattern = File.expand_path("views/#{name}.s{a,c}ss", Nesta::App.root)
|
70
65
|
if Dir.glob(pattern).size > 0
|
data/lib/nesta/models.rb
CHANGED
@@ -380,45 +380,44 @@ module Nesta
|
|
380
380
|
end
|
381
381
|
end
|
382
382
|
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
if
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
sub_menu_for_depth(menu, current_depth) << page
|
395
|
-
end
|
383
|
+
private_class_method def self.append_menu_item(menu, file, depth)
|
384
|
+
path = file.readline
|
385
|
+
rescue EOFError
|
386
|
+
else
|
387
|
+
page = Page.load(path.strip)
|
388
|
+
current_depth = path.scan(INDENT).size
|
389
|
+
if page
|
390
|
+
if current_depth > depth
|
391
|
+
sub_menu_for_depth(menu, depth) << [page]
|
392
|
+
else
|
393
|
+
sub_menu_for_depth(menu, current_depth) << page
|
396
394
|
end
|
397
|
-
append_menu_item(menu, file, current_depth)
|
398
395
|
end
|
396
|
+
append_menu_item(menu, file, current_depth)
|
397
|
+
end
|
399
398
|
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
399
|
+
private_class_method def self.sub_menu_for_depth(menu, depth)
|
400
|
+
sub_menu = menu
|
401
|
+
depth.times { sub_menu = sub_menu[-1] }
|
402
|
+
sub_menu
|
403
|
+
end
|
405
404
|
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
end
|
405
|
+
private_class_method def self.find_menu_item_by_path(menu, path)
|
406
|
+
item = menu.detect do |item|
|
407
|
+
item.respond_to?(:path) && (item.path == path)
|
408
|
+
end
|
409
|
+
if item
|
410
|
+
subsequent = menu[menu.index(item) + 1]
|
411
|
+
item = [item]
|
412
|
+
item << subsequent if subsequent.respond_to?(:each)
|
413
|
+
else
|
414
|
+
sub_menus = menu.select { |menu_item| menu_item.respond_to?(:each) }
|
415
|
+
sub_menus.each do |sub_menu|
|
416
|
+
item = find_menu_item_by_path(sub_menu, path)
|
417
|
+
break if item
|
420
418
|
end
|
421
|
-
item
|
422
419
|
end
|
420
|
+
item
|
421
|
+
end
|
423
422
|
end
|
424
423
|
end
|
data/lib/nesta/navigation.rb
CHANGED
data/lib/nesta/overrides.rb
CHANGED
@@ -1,30 +1,47 @@
|
|
1
1
|
module Nesta
|
2
2
|
module Overrides
|
3
3
|
module Renderers
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
def find_template(views, name, engine, &block)
|
5
|
+
user_paths = [
|
6
|
+
Nesta::Overrides.local_view_path,
|
7
|
+
Nesta::Overrides.theme_view_path,
|
8
|
+
views
|
9
|
+
].flatten.compact
|
10
|
+
user_paths.each do |path|
|
11
|
+
super(path, name, engine, &block)
|
12
|
+
end
|
12
13
|
end
|
13
14
|
|
14
15
|
def scss(template, options = {}, locals = {})
|
15
|
-
|
16
|
-
|
16
|
+
find_template(Nesta::App.settings.views, template, Tilt::ScssTemplate) do |file|
|
17
|
+
return Tilt.new(file).render if File.exist?(file)
|
18
|
+
end
|
19
|
+
raise IOError, "SCSS template not found: #{template}"
|
17
20
|
end
|
18
21
|
|
19
22
|
def sass(template, options = {}, locals = {})
|
20
|
-
|
21
|
-
|
23
|
+
find_template(Nesta::App.settings.views, template, Tilt::SassTemplate) do |file|
|
24
|
+
return Tilt.new(file).render if File.exist?(file)
|
25
|
+
end
|
26
|
+
raise IOError, "Sass template not found: #{template}"
|
22
27
|
end
|
23
28
|
|
24
29
|
def stylesheet(template, options = {}, locals = {})
|
25
|
-
|
26
|
-
|
27
|
-
|
30
|
+
scss(template, options, locals)
|
31
|
+
rescue IOError
|
32
|
+
sass(template, options, locals)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.local_view_path
|
37
|
+
Nesta::Path.local("views")
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.theme_view_path
|
41
|
+
if Nesta::Config.theme.nil?
|
42
|
+
nil
|
43
|
+
else
|
44
|
+
Nesta::Path.themes(Nesta::Config.theme, "views")
|
28
45
|
end
|
29
46
|
end
|
30
47
|
|
@@ -39,33 +56,5 @@ module Nesta
|
|
39
56
|
require app_file if File.exist?(app_file)
|
40
57
|
end
|
41
58
|
end
|
42
|
-
|
43
|
-
private
|
44
|
-
def self.template_exists?(engine, views, template)
|
45
|
-
views && File.exist?(File.join(views, "#{template}.#{engine}"))
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.render_options(template, *engines)
|
49
|
-
[local_view_path, theme_view_path].each do |path|
|
50
|
-
engines.each do |engine|
|
51
|
-
if template_exists?(engine, path, template)
|
52
|
-
return { views: path }, engine
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
[{}, :sass]
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.local_view_path
|
60
|
-
Nesta::Path.local("views")
|
61
|
-
end
|
62
|
-
|
63
|
-
def self.theme_view_path
|
64
|
-
if Nesta::Config.theme.nil?
|
65
|
-
nil
|
66
|
-
else
|
67
|
-
Nesta::Path.themes(Nesta::Config.theme, "views")
|
68
|
-
end
|
69
|
-
end
|
70
59
|
end
|
71
60
|
end
|
data/lib/nesta/plugin.rb
CHANGED
@@ -15,21 +15,5 @@ module Nesta
|
|
15
15
|
def self.initialize_plugins
|
16
16
|
self.loaded.each { |name| require "#{name}/init" }
|
17
17
|
end
|
18
|
-
|
19
|
-
def self.load_local_plugins
|
20
|
-
# This approach is deprecated; plugins should now be distributed
|
21
|
-
# as gems. See http://nestacms.com/docs/plugins/writing-plugins
|
22
|
-
plugins = Dir.glob(File.expand_path('../plugins/*', File.dirname(__FILE__)))
|
23
|
-
plugins.each { |path| require_local_plugin(path) }
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.require_local_plugin(path)
|
27
|
-
Nesta.deprecated(
|
28
|
-
'loading plugins from ./plugins', "convert #{path} to a gem")
|
29
|
-
require File.join(path, 'lib', File.basename(path))
|
30
|
-
rescue LoadError => e
|
31
|
-
$stderr.write("Couldn't load plugins/#{File.basename(path)}: #{e}\n")
|
32
|
-
end
|
33
|
-
private_class_method :require_local_plugin
|
34
18
|
end
|
35
19
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
module Nesta
|
4
|
+
module Static
|
5
|
+
class Assets
|
6
|
+
def initialize(build_dir, logger = nil)
|
7
|
+
@build_dir = build_dir
|
8
|
+
@logger = logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def copy_attachments
|
12
|
+
dest_basename = File.basename(Nesta::Config.attachment_path)
|
13
|
+
dest_dir = File.join(@build_dir, dest_basename)
|
14
|
+
copy_file_tree(Nesta::Config.attachment_path, dest_dir)
|
15
|
+
end
|
16
|
+
|
17
|
+
def copy_public_folder
|
18
|
+
copy_file_tree(Nesta::App.settings.public_folder, @build_dir)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def log(message)
|
24
|
+
@logger.call(message) if @logger
|
25
|
+
end
|
26
|
+
|
27
|
+
def copy_file_tree(source_dir, dest_dir)
|
28
|
+
files_in_tree(source_dir).each do |file|
|
29
|
+
target = File.join(dest_dir, file.sub(/^#{source_dir}\//, ''))
|
30
|
+
task = Rake::FileTask.define_task(target => file) do
|
31
|
+
target_dir = File.dirname(target)
|
32
|
+
FileUtils.mkdir_p(target_dir) unless Dir.exist?(target_dir)
|
33
|
+
FileUtils.cp(file, target_dir)
|
34
|
+
log("Copied #{file} to #{target}")
|
35
|
+
end
|
36
|
+
task.invoke
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def files_in_tree(directory)
|
41
|
+
Rake::FileList["#{directory}/**/*"].tap do |assets|
|
42
|
+
assets.exclude('~*')
|
43
|
+
assets.exclude do |f|
|
44
|
+
File.directory?(f)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Nesta
|
2
|
+
module Static
|
3
|
+
class HtmlFile
|
4
|
+
def initialize(build_dir, page)
|
5
|
+
@build_dir = build_dir
|
6
|
+
@content_path = page.filename
|
7
|
+
end
|
8
|
+
|
9
|
+
def page_shares_path_with_directory?(dir, base_without_ext)
|
10
|
+
Dir.exist?(File.join(dir, base_without_ext))
|
11
|
+
end
|
12
|
+
|
13
|
+
def filename
|
14
|
+
dir, base = File.split(@content_path)
|
15
|
+
base_without_ext = File.basename(base, File.extname(base))
|
16
|
+
subdir = dir.sub(/^#{Nesta::Config.page_path}/, '')
|
17
|
+
path = File.join(@build_dir, subdir, base_without_ext)
|
18
|
+
if page_shares_path_with_directory?(dir, base_without_ext)
|
19
|
+
File.join(path, 'index.html')
|
20
|
+
else
|
21
|
+
path + '.html'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|