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,104 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
require_relative './html_file'
|
4
|
+
|
5
|
+
module Nesta
|
6
|
+
module Static
|
7
|
+
class Site
|
8
|
+
def initialize(build_dir, domain, logger = nil)
|
9
|
+
@build_dir = build_dir
|
10
|
+
@domain = domain
|
11
|
+
@logger = logger
|
12
|
+
@app = Nesta::App.new
|
13
|
+
set_app_root
|
14
|
+
end
|
15
|
+
|
16
|
+
def render_pages
|
17
|
+
Nesta::Page.find_all.each do |page|
|
18
|
+
target = HtmlFile.new(@build_dir, page).filename
|
19
|
+
source = page.filename
|
20
|
+
task = Rake::FileTask.define_task(target => source) do
|
21
|
+
save_markup(target, render(page.abspath, target, source))
|
22
|
+
end
|
23
|
+
task.invoke
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def render_not_found
|
28
|
+
path_info = '/404'
|
29
|
+
source = 'no-such-file.md'
|
30
|
+
target = File.join(@build_dir, '404.html')
|
31
|
+
markup = render(path_info, target, source, expected_code: 404)
|
32
|
+
save_markup(target, markup)
|
33
|
+
end
|
34
|
+
|
35
|
+
def render_atom_feed
|
36
|
+
filename = 'articles.xml'
|
37
|
+
path_info = "/#{filename}"
|
38
|
+
description = 'Atom feed'
|
39
|
+
target = File.join(@build_dir, filename)
|
40
|
+
markup = render(path_info, target, description)
|
41
|
+
save_markup(target, markup)
|
42
|
+
end
|
43
|
+
|
44
|
+
def render_sitemap
|
45
|
+
filename = File.join(@build_dir, 'sitemap.xml')
|
46
|
+
save_markup(filename, render('/sitemap.xml', filename, 'site'))
|
47
|
+
end
|
48
|
+
|
49
|
+
def render_templated_assets
|
50
|
+
Nesta::Config.build.fetch('templated_assets', []).each do |path|
|
51
|
+
filename = File.join(@build_dir, path)
|
52
|
+
save_markup(filename, render(path, filename, path))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def log(message)
|
59
|
+
@logger.call(message) if @logger
|
60
|
+
end
|
61
|
+
|
62
|
+
def set_app_root
|
63
|
+
root = ::File.expand_path('.')
|
64
|
+
['Gemfile', ].each do |expected|
|
65
|
+
if ! File.exist?(File.join(root, 'config', 'config.yml'))
|
66
|
+
message = "is this a Nesta site? (expected './#{expected}')"
|
67
|
+
raise RuntimeError, message
|
68
|
+
end
|
69
|
+
end
|
70
|
+
Nesta::App.root = root
|
71
|
+
end
|
72
|
+
|
73
|
+
def rack_environment(abspath)
|
74
|
+
{
|
75
|
+
'REQUEST_METHOD' => 'GET',
|
76
|
+
'SCRIPT_NAME' => '',
|
77
|
+
'PATH_INFO' => abspath,
|
78
|
+
'QUERY_STRING' => '',
|
79
|
+
'SERVER_NAME' => @domain,
|
80
|
+
'SERVER_PROTOCOL' => 'https',
|
81
|
+
'rack.url_scheme' => 'https',
|
82
|
+
'rack.input' => StringIO.new,
|
83
|
+
'rack.errors' => STDERR
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
def render(abspath, filename, description, expected_code: 200)
|
88
|
+
http_code, headers, body = @app.call(rack_environment(abspath))
|
89
|
+
if http_code != expected_code
|
90
|
+
raise RuntimeError, "Can't render #{filename} from #{description}"
|
91
|
+
end
|
92
|
+
body.join
|
93
|
+
end
|
94
|
+
|
95
|
+
def save_markup(filename, content)
|
96
|
+
FileUtils.mkdir_p(File.dirname(filename))
|
97
|
+
if (! File.exist?(filename)) || (open(filename, 'r').read != content)
|
98
|
+
open(filename, 'w') { |output| output.write(content) }
|
99
|
+
log("Rendered #{filename}")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Nesta
|
2
|
+
class SystemCommand
|
3
|
+
def run(*args)
|
4
|
+
system(*args)
|
5
|
+
if ! $?.success?
|
6
|
+
message = if $?.exitstatus == 127
|
7
|
+
"#{args[0]} not found"
|
8
|
+
else
|
9
|
+
"'#{args.join(' ')}' failed with status #{$?.exitstatus}"
|
10
|
+
end
|
11
|
+
Nesta.fail_with(message)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/nesta/version.rb
CHANGED
data/lib/nesta.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
module Nesta
|
2
2
|
def self.deprecated(name, message)
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
$stderr.puts "DEPRECATION WARNING: #{name} is deprecated; #{message}"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.fail_with(message)
|
7
|
+
$stderr.puts "Error: #{message}"
|
8
|
+
exit 1
|
6
9
|
end
|
7
10
|
end
|
8
11
|
|
9
|
-
require 'nesta/plugin'
|
12
|
+
require File.expand_path('nesta/plugin', File.dirname(__FILE__))
|
data/nesta.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Graham Ashton"]
|
10
10
|
s.email = ["graham@effectif.com"]
|
11
|
-
s.homepage = "
|
11
|
+
s.homepage = "https://nestacms.com"
|
12
12
|
s.summary = %q{Ruby CMS, written in Sinatra}
|
13
13
|
s.description = <<-EOF
|
14
14
|
Nesta is a lightweight Content Management System, written in Ruby using
|
@@ -29,12 +29,13 @@ EOF
|
|
29
29
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
30
30
|
s.require_paths = ["lib"]
|
31
31
|
|
32
|
-
s.add_dependency('haml', '>= 3.1')
|
32
|
+
s.add_dependency('haml', '>= 3.1', '< 6.0')
|
33
33
|
s.add_dependency('haml-contrib', '>= 1.0')
|
34
|
-
s.add_dependency('rack', '~> 2
|
34
|
+
s.add_dependency('rack', '~> 2')
|
35
|
+
s.add_dependency('rake')
|
35
36
|
s.add_dependency('rdiscount', '~> 2.1')
|
36
37
|
s.add_dependency('RedCloth', '~> 4.2')
|
37
|
-
s.add_dependency('
|
38
|
+
s.add_dependency('sass-embedded', '~> 1.58')
|
38
39
|
s.add_dependency('sinatra', '~> 2.0')
|
39
40
|
s.add_dependency('tilt', '~> 2.0')
|
40
41
|
|
@@ -46,5 +47,4 @@ EOF
|
|
46
47
|
s.add_development_dependency('capybara', '~> 2.0')
|
47
48
|
s.add_development_dependency('minitest', '~> 5.0')
|
48
49
|
s.add_development_dependency('minitest-reporters')
|
49
|
-
s.add_development_dependency('rake')
|
50
50
|
end
|
data/templates/config/config.yml
CHANGED
@@ -12,7 +12,7 @@ subtitle: "(change this text in config/config.yml)"
|
|
12
12
|
#
|
13
13
|
# author:
|
14
14
|
# name: Your Name
|
15
|
-
# uri:
|
15
|
+
# uri: https://yourdomain.com
|
16
16
|
# email: you@yourdomain.com
|
17
17
|
|
18
18
|
# You can stick with the default look and feel, or use a theme. Themes are
|
@@ -21,7 +21,7 @@ subtitle: "(change this text in config/config.yml)"
|
|
21
21
|
#
|
22
22
|
# theme: name-of-theme
|
23
23
|
|
24
|
-
# If you want to use the Disqus service (
|
24
|
+
# If you want to use the Disqus service (https://disqus.com) to display
|
25
25
|
# comments on your site, register a Disqus account and then specify your
|
26
26
|
# site's short name here. A comment form will automatically be added to
|
27
27
|
# the bottom of your pages.
|
@@ -65,3 +65,29 @@ content: content
|
|
65
65
|
# production:
|
66
66
|
# content: /var/apps/nesta/shared/content
|
67
67
|
# google_analytics_code: "UA-???????-?"
|
68
|
+
|
69
|
+
# The following settings control the behaviour of the `nesta build`
|
70
|
+
# command, which is used to generate a "static" version of your site.
|
71
|
+
# It's optional, but allows you to deploy your site on hosting providers
|
72
|
+
# that serve pre-prepared HTML and CSS files (instead of generating them
|
73
|
+
# in real-time with a web server).
|
74
|
+
#
|
75
|
+
# You can either set the `domain` key here, or specify it on the command
|
76
|
+
# line with the `--domain` switch. Nesta needs to know your site's
|
77
|
+
# domain name so that it can generate the correct URLs in sitemap.xml,
|
78
|
+
# and in your Atom feed.
|
79
|
+
#
|
80
|
+
# The templated_assets setting is a list of the things that Nesta
|
81
|
+
# generates for you, other from all the page in your content directory.
|
82
|
+
# The example below is for a site that has two stylesheets, both of
|
83
|
+
# which are converted from .sass or .scss files in your ./views folder.
|
84
|
+
#
|
85
|
+
# If you're not using Sass and are just editing CSS files directly, you
|
86
|
+
# can keep them in your ./public folder and Nesta's build command will
|
87
|
+
# find them automatically.
|
88
|
+
#
|
89
|
+
# build:
|
90
|
+
# domain: yourdomain.com
|
91
|
+
# templated_assets:
|
92
|
+
# - /css/master.css
|
93
|
+
# - /css/local.css
|
data/templates/themes/README.md
CHANGED
@@ -18,7 +18,7 @@ describe 'Atom feed' do
|
|
18
18
|
it "uses Atom's XML namespace" do
|
19
19
|
with_temp_content_directory do
|
20
20
|
visit_feed
|
21
|
-
assert_has_xpath '//feed[@xmlns="
|
21
|
+
assert_has_xpath '//feed[@xmlns="https://www.w3.org/2005/Atom"]'
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require_relative '../../../lib/nesta/commands'
|
3
|
+
|
4
|
+
describe 'nesta build' do
|
5
|
+
include ModelFactory
|
6
|
+
include TestConfiguration
|
7
|
+
|
8
|
+
def silencing_stdout(&block)
|
9
|
+
stdout, $stdout = $stdout, StringIO.new
|
10
|
+
yield
|
11
|
+
ensure
|
12
|
+
$stdout.close
|
13
|
+
$stdout = stdout
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'builds HTML file from Markdown file' do
|
17
|
+
in_temporary_project do
|
18
|
+
with_temp_content_directory do
|
19
|
+
page = create(:page)
|
20
|
+
command = Nesta::Commands::Build.new('output_dir')
|
21
|
+
|
22
|
+
process = Minitest::Mock.new
|
23
|
+
silencing_stdout { command.execute(process) }
|
24
|
+
|
25
|
+
assert_exists_in_project File.join('output_dir', page.abspath + '.html')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'reads domain name from config file' do
|
31
|
+
domain = 'mysite.com'
|
32
|
+
|
33
|
+
in_temporary_project do
|
34
|
+
stub_config('build' => { 'domain' => domain }) do
|
35
|
+
command = Nesta::Commands::Build.new('output_dir')
|
36
|
+
|
37
|
+
assert_equal domain, command.domain
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'overrides domain name if set on command line' do
|
43
|
+
domain = 'mysite.com'
|
44
|
+
|
45
|
+
in_temporary_project do
|
46
|
+
stub_config('build' => { 'domain' => 'ignored.com' }) do
|
47
|
+
command = Nesta::Commands::Build.new('output_dir', 'domain' => domain)
|
48
|
+
|
49
|
+
assert_equal domain, command.domain
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -1,9 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require_relative '../../../support/silence_commands_during_tests'
|
3
2
|
require_relative '../../../../lib/nesta/commands'
|
4
3
|
|
5
|
-
Nesta::Commands::Demo::Content.send(:include, SilenceCommandsDuringTests)
|
6
|
-
|
7
4
|
describe 'nesta demo:content' do
|
8
5
|
include TemporaryFiles
|
9
6
|
|
@@ -11,10 +8,15 @@ describe 'nesta demo:content' do
|
|
11
8
|
Nesta::Commands::Demo::Content.demo_repository = '../../fixtures/demo-content.git'
|
12
9
|
end
|
13
10
|
|
11
|
+
def process_stub
|
12
|
+
Object.new.tap do |stub|
|
13
|
+
def stub.run(*args); end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
14
17
|
it 'clones the demo repository and configures project to use it' do
|
15
18
|
in_temporary_project do
|
16
|
-
Nesta::Commands::Demo::Content.new.execute
|
17
|
-
assert_exists_in_project 'content-demo/pages/index.haml'
|
19
|
+
Nesta::Commands::Demo::Content.new.execute(process_stub)
|
18
20
|
|
19
21
|
yaml = File.read(File.join(project_root, 'config', 'config.yml'))
|
20
22
|
assert_match /content: content-demo/, yaml
|
@@ -24,7 +26,7 @@ describe 'nesta demo:content' do
|
|
24
26
|
it 'ensures demo repository is ignored by git' do
|
25
27
|
in_temporary_project do
|
26
28
|
FileUtils.mkdir('.git')
|
27
|
-
Nesta::Commands::Demo::Content.new.execute
|
29
|
+
Nesta::Commands::Demo::Content.new.execute(process_stub)
|
28
30
|
assert_match /content-demo/, File.read(project_path('.git/info/exclude'))
|
29
31
|
end
|
30
32
|
end
|
@@ -9,13 +9,13 @@ describe 'nesta edit' do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'launches the editor' do
|
12
|
-
ENV['EDITOR'] = '
|
12
|
+
ENV['EDITOR'] = 'vi'
|
13
13
|
edited_file = 'path/to/page.md'
|
14
|
+
process = Minitest::Mock.new
|
15
|
+
process.expect(:run, true, [ENV['EDITOR'], /#{edited_file}$/])
|
14
16
|
with_temp_content_directory do
|
15
|
-
FileUtils.mkdir_p(Nesta::Config.page_path(File.dirname(edited_file)))
|
16
17
|
command = Nesta::Commands::Edit.new(edited_file)
|
17
|
-
command.execute
|
18
|
-
assert File.exist?(Nesta::Config.page_path(edited_file)), 'editor not run'
|
18
|
+
command.execute(process)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -1,9 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require_relative '../../support/silence_commands_during_tests'
|
3
2
|
require_relative '../../../lib/nesta/commands'
|
4
3
|
|
5
|
-
Nesta::Commands::New.send(:include, SilenceCommandsDuringTests)
|
6
|
-
|
7
4
|
describe 'nesta new' do
|
8
5
|
include TemporaryFiles
|
9
6
|
|
@@ -19,30 +16,36 @@ describe 'nesta new' do
|
|
19
16
|
remove_temp_directory
|
20
17
|
end
|
21
18
|
|
19
|
+
def process_stub
|
20
|
+
Object.new.tap do |stub|
|
21
|
+
def stub.run(*args); end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
22
25
|
describe 'without options' do
|
23
26
|
it 'creates the content directories' do
|
24
|
-
Nesta::Commands::New.new(project_root).execute
|
27
|
+
Nesta::Commands::New.new(project_root).execute(process_stub)
|
25
28
|
assert_exists_in_project 'content/attachments'
|
26
29
|
assert_exists_in_project 'content/pages'
|
27
30
|
end
|
28
31
|
|
29
32
|
it 'creates the home page' do
|
30
|
-
Nesta::Commands::New.new(project_root).execute
|
33
|
+
Nesta::Commands::New.new(project_root).execute(process_stub)
|
31
34
|
assert_exists_in_project 'content/pages/index.haml'
|
32
35
|
end
|
33
36
|
|
34
37
|
it 'creates the rackup file' do
|
35
|
-
Nesta::Commands::New.new(project_root).execute
|
38
|
+
Nesta::Commands::New.new(project_root).execute(process_stub)
|
36
39
|
assert_exists_in_project 'config.ru'
|
37
40
|
end
|
38
41
|
|
39
42
|
it 'creates the config.yml file' do
|
40
|
-
Nesta::Commands::New.new(project_root).execute
|
43
|
+
Nesta::Commands::New.new(project_root).execute(process_stub)
|
41
44
|
assert_exists_in_project 'config/config.yml'
|
42
45
|
end
|
43
46
|
|
44
47
|
it 'creates a Gemfile' do
|
45
|
-
Nesta::Commands::New.new(project_root).execute
|
48
|
+
Nesta::Commands::New.new(project_root).execute(process_stub)
|
46
49
|
assert_exists_in_project 'Gemfile'
|
47
50
|
assert_match /gem 'nesta'/, gemfile_source
|
48
51
|
end
|
@@ -51,67 +54,35 @@ describe 'nesta new' do
|
|
51
54
|
describe 'with --git option' do
|
52
55
|
it 'creates a .gitignore file' do
|
53
56
|
command = Nesta::Commands::New.new(project_root, 'git' => '')
|
54
|
-
command.
|
55
|
-
|
56
|
-
assert_match /\.bundle/, File.read(project_path('.gitignore'))
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def disabling_git_hooks
|
61
|
-
# I (@gma) have got a git repository template setup on my computer
|
62
|
-
# containing git hooks that automatically run ctags in a
|
63
|
-
# background process whenever I run `git commit`. The hooks are
|
64
|
-
# copied into new repositories when I run `git init`.
|
65
|
-
#
|
66
|
-
# The generation of the ctags file (in a forked process) causes a
|
67
|
-
# race condition; sometimes ctags will recreate a test's project
|
68
|
-
# folder and git directory after the test's `after` block has
|
69
|
-
# deleted it. If the project directory isn't removed after each
|
70
|
-
# test, the New command will throw an error in the subsequent
|
71
|
-
# test (complaining that the project directory already exists).
|
72
|
-
#
|
73
|
-
templates = temp_path('git_template')
|
74
|
-
FileUtils.mkdir_p(templates)
|
75
|
-
ENV['GIT_TEMPLATE_DIR'] = templates
|
76
|
-
yield
|
77
|
-
ENV.delete('GIT_TEMPLATE_DIR')
|
78
|
-
FileUtils.rm_r(templates)
|
57
|
+
command.execute(process_stub)
|
58
|
+
assert_match /\.bundle/, File.read(project_path('.gitignore'))
|
79
59
|
end
|
80
60
|
|
81
61
|
it 'creates a git repo' do
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
it 'commits the blank project' do
|
90
|
-
disabling_git_hooks do
|
91
|
-
command = Nesta::Commands::New.new(project_root, 'git' => '')
|
92
|
-
command.execute
|
93
|
-
Dir.chdir(project_root) do
|
94
|
-
assert_match /Initial commit/, `git log --pretty=oneline | head -n 1`
|
95
|
-
end
|
96
|
-
end
|
62
|
+
command = Nesta::Commands::New.new(project_root, 'git' => '')
|
63
|
+
process = Minitest::Mock.new
|
64
|
+
process.expect(:run, true, ['git', 'init'])
|
65
|
+
process.expect(:run, true, ['git', 'add', '.'])
|
66
|
+
process.expect(:run, true, ['git', 'commit', '-m', 'Initial commit'])
|
67
|
+
command.execute(process)
|
97
68
|
end
|
98
69
|
end
|
99
70
|
|
100
71
|
describe 'with --vlad option' do
|
101
72
|
it 'adds vlad to Gemfile' do
|
102
|
-
Nesta::Commands::New.new(project_root, 'vlad' => '').execute
|
73
|
+
Nesta::Commands::New.new(project_root, 'vlad' => '').execute(process_stub)
|
103
74
|
assert_match /gem 'vlad', '2.1.0'/, gemfile_source
|
104
75
|
assert_match /gem 'vlad-git', '2.2.0'/, gemfile_source
|
105
76
|
end
|
106
77
|
|
107
78
|
it 'configures the vlad rake tasks' do
|
108
|
-
Nesta::Commands::New.new(project_root, 'vlad' => '').execute
|
79
|
+
Nesta::Commands::New.new(project_root, 'vlad' => '').execute(process_stub)
|
109
80
|
assert_exists_in_project 'Rakefile'
|
110
81
|
assert_match /require 'vlad'/, rakefile_source
|
111
82
|
end
|
112
83
|
|
113
84
|
it 'creates deploy.rb' do
|
114
|
-
Nesta::Commands::New.new(project_root, 'vlad' => '').execute
|
85
|
+
Nesta::Commands::New.new(project_root, 'vlad' => '').execute(process_stub)
|
115
86
|
assert_exists_in_project 'config/deploy.rb'
|
116
87
|
deploy_source = File.read(project_path('config/deploy.rb'))
|
117
88
|
assert_match /set :application, 'mysite.com'/, deploy_source
|
@@ -24,13 +24,16 @@ describe 'nesta plugin:create' do
|
|
24
24
|
"nesta-plugin-#{plugin_name}"
|
25
25
|
end
|
26
26
|
|
27
|
+
def process_stub
|
28
|
+
Object.new.tap do |stub|
|
29
|
+
def stub.run(*args); end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
27
33
|
def create_plugin(&block)
|
28
34
|
Dir.chdir(working_directory) do
|
29
35
|
command = Nesta::Commands::Plugin::Create.new(plugin_name)
|
30
|
-
command.
|
31
|
-
command.execute
|
32
|
-
yield
|
33
|
-
end
|
36
|
+
command.execute(process_stub)
|
34
37
|
end
|
35
38
|
end
|
36
39
|
|
@@ -16,9 +16,15 @@ describe 'nesta theme:create' do
|
|
16
16
|
remove_temp_directory
|
17
17
|
end
|
18
18
|
|
19
|
+
def process_stub
|
20
|
+
Object.new.tap do |stub|
|
21
|
+
def stub.run(*args); end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
19
25
|
it 'creates default files in the theme directory' do
|
20
26
|
Dir.chdir(project_root) do
|
21
|
-
Nesta::Commands::Theme::Create.new('theme-name').execute
|
27
|
+
Nesta::Commands::Theme::Create.new('theme-name').execute(process_stub)
|
22
28
|
end
|
23
29
|
assert_exists_in_project theme_path('README.md')
|
24
30
|
assert_exists_in_project theme_path('app.rb')
|
@@ -26,7 +32,7 @@ describe 'nesta theme:create' do
|
|
26
32
|
|
27
33
|
it 'copies default view templates into views directory' do
|
28
34
|
Dir.chdir(project_root) do
|
29
|
-
Nesta::Commands::Theme::Create.new('theme-name').execute
|
35
|
+
Nesta::Commands::Theme::Create.new('theme-name').execute(process_stub)
|
30
36
|
end
|
31
37
|
%w(layout.haml page.haml master.sass).each do |template|
|
32
38
|
assert_exists_in_project theme_path("views/#{template}")
|
@@ -13,9 +13,15 @@ describe 'nesta theme:enable' do
|
|
13
13
|
remove_temp_directory
|
14
14
|
end
|
15
15
|
|
16
|
+
def process_stub
|
17
|
+
Object.new.tap do |stub|
|
18
|
+
def stub.run(*args); end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
16
22
|
it 'enables the theme' do
|
17
23
|
Dir.chdir(project_root) do
|
18
|
-
Nesta::Commands::Theme::Enable.new('theme-name').execute
|
24
|
+
Nesta::Commands::Theme::Enable.new('theme-name').execute(process_stub)
|
19
25
|
assert_match /^theme: theme-name/, File.read('config/config.yml')
|
20
26
|
end
|
21
27
|
end
|
@@ -1,9 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require_relative '../../../support/silence_commands_during_tests'
|
3
2
|
require_relative '../../../../lib/nesta/commands'
|
4
3
|
|
5
|
-
Nesta::Commands::Theme::Install.send(:include, SilenceCommandsDuringTests)
|
6
|
-
|
7
4
|
describe 'nesta theme:install' do
|
8
5
|
include TemporaryFiles
|
9
6
|
|
@@ -27,35 +24,42 @@ describe 'nesta theme:install' do
|
|
27
24
|
remove_temp_directory
|
28
25
|
end
|
29
26
|
|
27
|
+
def process_stub
|
28
|
+
Object.new.tap do |stub|
|
29
|
+
def stub.run(*args); end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
30
33
|
it 'clones the repository' do
|
34
|
+
process = Minitest::Mock.new
|
35
|
+
process.expect(:run, true, ['git', 'clone', repo_url, "themes/#{theme_name}"])
|
31
36
|
in_temporary_project do
|
32
|
-
Nesta::Commands::Theme::Install.new(repo_url).execute
|
33
|
-
assert File.directory?(theme_dir), 'theme not cloned'
|
37
|
+
Nesta::Commands::Theme::Install.new(repo_url).execute(process)
|
34
38
|
end
|
35
39
|
end
|
36
40
|
|
37
41
|
it "removes the theme's .git directory" do
|
38
42
|
in_temporary_project do
|
39
|
-
Nesta::Commands::Theme::Install.new(repo_url).execute
|
43
|
+
Nesta::Commands::Theme::Install.new(repo_url).execute(process_stub)
|
40
44
|
refute File.exist?("#{theme_dir}/.git"), '.git folder found'
|
41
45
|
end
|
42
46
|
end
|
43
47
|
|
44
48
|
it 'enables the freshly installed theme' do
|
45
49
|
in_temporary_project do
|
46
|
-
Nesta::Commands::Theme::Install.new(repo_url).execute
|
50
|
+
Nesta::Commands::Theme::Install.new(repo_url).execute(process_stub)
|
47
51
|
assert_match /theme: #{theme_name}/, File.read('config/config.yml')
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
51
55
|
it 'determines name of theme from name of repository' do
|
52
|
-
url = '
|
56
|
+
url = 'https://foobar.com/path/to/nesta-theme-the-name.git'
|
53
57
|
command = Nesta::Commands::Theme::Install.new(url)
|
54
58
|
assert_equal 'the-name', command.theme_name
|
55
59
|
end
|
56
60
|
|
57
61
|
it "falls back to name of repo when theme name doesn't match correct format" do
|
58
|
-
url = '
|
62
|
+
url = 'https://foobar.com/path/to/mytheme.git'
|
59
63
|
command = Nesta::Commands::Theme::Install.new(url)
|
60
64
|
assert_equal 'mytheme', command.theme_name
|
61
65
|
end
|
@@ -75,7 +75,7 @@ describe 'Overriding files in gem and themes' do
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
-
it 'renders stylesheet in the
|
78
|
+
it 'renders stylesheet in the gem if no others found' do
|
79
79
|
in_nesta_project do
|
80
80
|
visit '/css/master.css'
|
81
81
|
assert_equal 200, page.status_code
|
@@ -31,7 +31,7 @@ describe 'XML sitemap' do
|
|
31
31
|
|
32
32
|
it 'has a urlset tag' do
|
33
33
|
for_site_with_page do
|
34
|
-
namespace = '
|
34
|
+
namespace = 'https://www.sitemaps.org/schemas/sitemap/0.9'
|
35
35
|
assert_has_xpath "//urlset[@xmlns='#{namespace}']"
|
36
36
|
end
|
37
37
|
end
|
@@ -22,7 +22,7 @@ module TemporaryFiles
|
|
22
22
|
def in_temporary_project(*args, &block)
|
23
23
|
FileUtils.mkdir_p(File.join(project_root, 'config'))
|
24
24
|
File.open(File.join(project_root, 'config', 'config.yml'), 'w').close
|
25
|
-
Dir.chdir(project_root) { yield }
|
25
|
+
Dir.chdir(project_root) { yield project_root }
|
26
26
|
ensure
|
27
27
|
remove_temp_directory
|
28
28
|
end
|
@@ -2,10 +2,8 @@ module TestConfiguration
|
|
2
2
|
include TemporaryFiles
|
3
3
|
|
4
4
|
def stub_config(config, &block)
|
5
|
-
Nesta::Config.stub(:
|
6
|
-
|
7
|
-
yield
|
8
|
-
end
|
5
|
+
Nesta::Config.instance.stub(:config, config) do
|
6
|
+
yield
|
9
7
|
end
|
10
8
|
end
|
11
9
|
|