stevenson 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/assets/stevenson_dotfile.yml +29 -0
  4. data/lib/stevenson/application.rb +34 -29
  5. data/lib/stevenson/dotfile.rb +26 -0
  6. data/lib/stevenson/output_filter/generator.rb +30 -0
  7. data/lib/stevenson/output_filter.rb +42 -0
  8. data/lib/stevenson/output_filters/jekyll.rb +6 -13
  9. data/lib/stevenson/output_filters/zip.rb +12 -14
  10. data/lib/stevenson/template/loader.rb +36 -0
  11. data/lib/stevenson/template.rb +35 -0
  12. data/lib/stevenson/templates/git.rb +16 -17
  13. data/lib/stevenson/templates/local.rb +21 -0
  14. data/lib/stevenson/version.rb +1 -1
  15. data/lib/stevenson.rb +9 -7
  16. data/spec/bin/.gitkeep +0 -0
  17. data/spec/lib/output_filter/generator_spec.rb +37 -0
  18. data/spec/lib/output_filter_spec.rb +57 -0
  19. data/spec/lib/output_filters/jekyll_spec.rb +23 -0
  20. data/spec/lib/output_filters/zip_spec.rb +19 -0
  21. data/spec/lib/template/loader_spec.rb +35 -0
  22. data/spec/lib/template_spec.rb +20 -0
  23. data/spec/lib/templates/git_spec.rb +43 -0
  24. data/spec/lib/templates/local_spec.rb +42 -0
  25. data/stevenson.gemspec +3 -2
  26. metadata +44 -40
  27. data/assets/template_aliases.yml +0 -36
  28. data/lib/stevenson/configurators/yaml_configurator.rb +0 -79
  29. data/lib/stevenson/input/email.rb +0 -19
  30. data/lib/stevenson/input/password.rb +0 -19
  31. data/lib/stevenson/input/select.rb +0 -69
  32. data/lib/stevenson/input/text.rb +0 -28
  33. data/lib/stevenson/input/url.rb +0 -19
  34. data/lib/stevenson/input.rb +0 -51
  35. data/lib/stevenson/template_loader.rb +0 -50
  36. data/lib/stevenson/templates/base.rb +0 -45
  37. data/lib/stevenson/templates/invalid_template_exception.rb +0 -6
  38. data/spec/configurators/yaml_configurator_spec.rb +0 -12
  39. data/spec/input/email_spec.rb +0 -12
  40. data/spec/input/password_spec.rb +0 -12
  41. data/spec/input/select_spec.rb +0 -12
  42. data/spec/input/text_spec.rb +0 -12
  43. data/spec/input/url_spec.rb +0 -12
  44. data/spec/input_spec.rb +0 -38
  45. data/spec/output_filters/jekyll_spec.rb +0 -17
  46. data/spec/output_filters/zip_spec.rb +0 -17
  47. data/spec/template_loader_spec.rb +0 -51
  48. data/spec/templates/base_spec.rb +0 -83
  49. data/spec/templates/git_spec.rb +0 -37
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a01532f19f37e0bbd43a680127d4471c9988edae
4
- data.tar.gz: 0c6ccedfe334238758c7c9e1146fb93e85212350
3
+ metadata.gz: d4bbb1c5387f8971d634dbab92d275947b481e6a
4
+ data.tar.gz: 8944fee22ba3f747259246c6512c9b13860a6b2f
5
5
  SHA512:
6
- metadata.gz: 774610b2e82f5e08bb134b231b664084f91e52b48ef4e2ecadd05f5fc71caf02da37610edfc3745cc9b719dd8ff3ff2fb3bfedd9281d741213fd03563f5cf5d8
7
- data.tar.gz: 4d0bdf722f9ff79cb00d9592cd9610976a0415efdc993e4b47f143260cd76439d8da7c337349f330916579cec6ff79d66e2087b1cb7ef875ddc90e3e8662d8b4
6
+ metadata.gz: a06819996cd37937b72e2d6e000336a867af6723402b41e353654c913a739b8cc9f87bad2e25a27cdb0d051e65e2593cbd87f1d14c38251d8d7c37f3b7734029
7
+ data.tar.gz: a91025832a88cf33489e40a6360c6ee78c6c1f91b70f392f88564966b6e9ad1fd6491df3ece4827b555a5257e6ad80b6a4b13384b7ff859d3b127008088300c4
data/.travis.yml CHANGED
@@ -1,3 +1,5 @@
1
1
  language: ruby
2
+ cache: bundler
3
+ sudo: false
2
4
  rvm:
3
5
  - 2.1.2
@@ -0,0 +1,29 @@
1
+ template_aliases:
2
+ hyde-base:
3
+ name: https://github.com/RootsRated/hyde.git
4
+ options:
5
+ subdirectory: base
6
+ templatedco-exmachina:
7
+ name: https://github.com/RootsRated/hyde.git
8
+ options:
9
+ subdirectory: exmachina
10
+ templatedco-horizons:
11
+ name: https://github.com/RootsRated/hyde.git
12
+ options:
13
+ subdirectory: horizons
14
+ templatedco-ion:
15
+ name: https://github.com/RootsRated/hyde.git
16
+ options:
17
+ subdirectory: ion
18
+ templatedco-linear:
19
+ name: https://github.com/RootsRated/hyde.git
20
+ options:
21
+ subdirectory: linear
22
+ templatedco-phaseshift:
23
+ name: https://github.com/RootsRated/hyde.git
24
+ options:
25
+ subdirectory: phaseshift
26
+ templatedco-solarize:
27
+ name: https://github.com/RootsRated/hyde.git
28
+ options:
29
+ subdirectory: solarize
@@ -2,52 +2,57 @@ require 'thor'
2
2
 
3
3
  module Stevenson
4
4
  class Application < Thor
5
- desc 'stevenson new PROJECT_NAME', 'generates a Jekyll at PROJECT_NAME'
5
+ desc 'new PROJECT_NAME CONFIG_PATH', 'generates a Jekyll at PROJECT_NAME with a config file at CONFIG_PATH'
6
6
 
7
+ method_option :template,
8
+ aliases: '-t',
9
+ default: 'hyde-base',
10
+ desc: 'The template to use'
11
+
12
+ # Template Options
7
13
  method_option :branch,
8
14
  aliases: '-b',
9
15
  desc: 'The git branch you would like to use from your template'
10
- method_option :jekyll,
11
- type: :boolean,
12
- aliases: '-j',
13
- desc: 'Jekyll compiles the output directory'
14
16
  method_option :subdirectory,
15
17
  aliases: '-s',
16
18
  desc: 'The subdirectory to use from the template, if any'
17
- method_option :template,
18
- aliases: '-t',
19
- default: 'hyde-base',
20
- desc: 'The template repository to use'
19
+
20
+ # Data Options
21
+ method_option :data,
22
+ aliases: "-d",
23
+ desc: 'The path to related data yml files'
24
+
25
+ # Output Options
26
+ method_option :output,
27
+ type: :array,
28
+ aliases: "-o",
29
+ desc: 'Array of output filters to be applied in order'
21
30
  method_option :zip,
22
31
  type: :boolean,
23
32
  aliases: "-z",
24
33
  desc: 'Zip compresses the output directory'
25
34
 
26
- def new(output_directory)
35
+ def new(output_directory, config_path)
27
36
  # Load the template using the template loader
28
- template = Stevenson::TemplateLoader.load options[:template]
29
-
30
- # If a branch is provided, switch to that branch
31
- template.switch_branch options[:branch] if options[:branch]
32
-
33
- # If a subdirectory is provided, switch to that directory
34
- template.select_subdirectory options[:subdirectory] if options[:subdirectory]
37
+ template = Stevenson::Template.load(options[:template], options)
35
38
 
36
- # Configure the template
37
- configurator = Stevenson::Configurator::YAMLConfigurator.new template.path
38
- configurator.configure
39
+ # Place yml files
40
+ template.place_config(config_path)
41
+ template.place_files(options[:data], '_data') if options[:data]
39
42
 
40
- # If the jekyll flag is set, compile the template output
41
- template.extend(Stevenson::OutputFilters::JekyllFilter) if options[:jekyll]
43
+ # Run output filters, in order, against the template
44
+ puts Stevenson::OutputFilter.generate!(template, options)
42
45
 
43
- # If the zip flag is set, zip up the template output
44
- template.extend(Stevenson::OutputFilters::ZipFilter) if options[:zip]
45
-
46
- # Save the repo to the output directory
47
- template.output output_directory
48
-
49
- rescue Templates::InvalidTemplateException => e
46
+ rescue StandardError => e
50
47
  say e.message
48
+ ensure
49
+ template.close
50
+ end
51
+
52
+ desc 'generate_dotfile', 'Generates a Stevenson configuration dotfile'
53
+ def generate_dotfile
54
+ Dotfile.install
55
+ puts "Generated dotfile at #{Dotfile.path}"
51
56
  end
52
57
  end
53
58
  end
@@ -0,0 +1,26 @@
1
+ require 'delegate'
2
+ require 'hashie/mash'
3
+ require 'yaml'
4
+
5
+ module Stevenson
6
+ class Dotfile < SimpleDelegator
7
+
8
+ TEMPLATE_PATH = File.join(File.dirname(__FILE__), '..', '..', 'assets', 'stevenson_dotfile.yml')
9
+ DOTFILE_PATH = File.join(Dir.home, ".stevenson")
10
+
11
+ class << self
12
+ def install
13
+ FileUtils.copy TEMPLATE_PATH, DOTFILE_PATH
14
+ end
15
+
16
+ def path
17
+ DOTFILE_PATH
18
+ end
19
+ end
20
+
21
+ def initialize
22
+ dotfile_path = File.exist?(self.class.path) ? self.class.path : TEMPLATE_PATH
23
+ super Hashie::Mash.new YAML.load_file(dotfile_path)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ module Stevenson
2
+ module OutputFilter
3
+ class Generator
4
+ attr_reader :options
5
+
6
+ def initialize(options)
7
+ @options = options
8
+ end
9
+
10
+ def generate!(template)
11
+ filters.inject(template.local_directory) do |rendered, filter|
12
+ OutputFilter.filter_for(filter).new(rendered).output
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def filters
19
+ @_filters ||= begin
20
+ filters = [:jekyll]
21
+ filters.concat options[:output] if options[:output]
22
+ filters << :zip if options[:zip]
23
+ filters.uniq
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,42 @@
1
+ module Stevenson
2
+ module OutputFilter
3
+ autoload :Jekyll, 'stevenson/output_filters/jekyll'
4
+ autoload :Zip, 'stevenson/output_filters/zip'
5
+
6
+ autoload :Generator, 'stevenson/output_filter/generator'
7
+
8
+ class Base
9
+ attr_reader :directory
10
+
11
+ def self.included(filter)
12
+ filter.extend ClassMethods
13
+
14
+ Stevenson.output_filters[filter.filter_name] = filter
15
+ end
16
+
17
+ module ClassMethods
18
+ def filter_name
19
+ name.gsub(/^.*::/, '').downcase.to_sym
20
+ end
21
+ end
22
+
23
+ def initialize(directory)
24
+ @directory = directory
25
+ end
26
+
27
+ def output
28
+ raise NotImplementedError
29
+ end
30
+ end
31
+
32
+ def self.generate!(template, options)
33
+ Generator.new(options).generate!(template)
34
+ end
35
+
36
+ def self.filter_for(type)
37
+ Stevenson.output_filters[type] || const_get(type.to_s.capitalize)
38
+ rescue NameError => e
39
+ raise NameError.new "Type '#{type}' is not a valid output type.", e
40
+ end
41
+ end
42
+ end
@@ -1,21 +1,14 @@
1
1
  module Stevenson
2
- module OutputFilters
3
- module JekyllFilter
4
- def output(directory)
2
+ module OutputFilter
3
+ class Jekyll < Base
4
+
5
+ def output
5
6
  # Jekyll Build the Directory
6
- Dir.chdir(path) do
7
+ Dir.chdir(directory) do
7
8
  `jekyll b`
8
9
  end
9
10
 
10
- # Replace the repository with the compiled directory
11
- Dir.mktmpdir do |dir|
12
- FileUtils.cp_r File.join(path, '_site', '.'), dir
13
- FileUtils.rm_r path
14
- FileUtils.cp_r dir, path
15
- end
16
-
17
- # Call the parent method
18
- super directory
11
+ File.join(directory, '_site', '.')
19
12
  end
20
13
  end
21
14
  end
@@ -1,15 +1,13 @@
1
1
  require 'zip'
2
2
 
3
3
  module Stevenson
4
- module OutputFilters
5
- module ZipFilter
6
- def output(directory)
7
- Dir.mktmpdir do |dir|
8
- # Call the parent method
9
- super dir
10
-
4
+ module OutputFilter
5
+ class Zip < Base
6
+
7
+ def output
8
+ "#{directory}.zip".tap do |dir|
11
9
  # Zip up the output directory
12
- write dir, directory
10
+ write directory, dir
13
11
  end
14
12
  end
15
13
 
@@ -22,24 +20,24 @@ module Stevenson
22
20
  entries = Dir.entries(@inputDir)
23
21
  entries.delete(".")
24
22
  entries.delete("..")
25
- io = Zip::File.open(@outputFile, Zip::File::CREATE)
23
+ io = ::Zip::File.open(@outputFile, ::Zip::File::CREATE)
26
24
 
27
25
  writeEntries(entries, "", io)
28
26
  io.close()
29
27
  end
30
28
 
31
29
  def writeEntries(entries, path, io)
32
- entries.each { |e|
33
- zipFilePath = path == "" ? e : File.join(path, e)
30
+ entries.each do |entry|
31
+ zipFilePath = path == "" ? entry : File.join(path, entry)
34
32
  diskFilePath = File.join(@inputDir, zipFilePath)
35
33
  if File.directory?(diskFilePath)
36
34
  io.mkdir(zipFilePath)
37
- subdir =Dir.entries(diskFilePath); subdir.delete("."); subdir.delete("..")
35
+ subdir = Dir.entries(diskFilePath); subdir.delete("."); subdir.delete("..")
38
36
  writeEntries(subdir, zipFilePath, io)
39
37
  else
40
- io.get_output_stream(zipFilePath) { |f| f.puts(File.open(diskFilePath, "rb").read())}
38
+ io.get_output_stream(zipFilePath) { |f| f.puts(File.open(diskFilePath, "rb").read()) }
41
39
  end
42
- }
40
+ end
43
41
  end
44
42
  end
45
43
  end
@@ -0,0 +1,36 @@
1
+ module Stevenson
2
+ module Template
3
+ class Loader
4
+ attr_reader :template_name, :options
5
+
6
+ def initialize(template_name, options)
7
+ @template_name, @options = template_name, options
8
+ end
9
+
10
+ def template
11
+ return Template.load(matching_alias.name, matching_alias.options) if matching_alias?
12
+
13
+ template_klass.new template_name, options
14
+ end
15
+
16
+ def template_klass
17
+ case template_name
18
+ when /^.*\.git$/
19
+ Template::Git
20
+ else
21
+ Template::Local
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def matching_alias
28
+ Stevenson.dotfile.template_aliases.fetch(template_name, nil)
29
+ end
30
+
31
+ def matching_alias?
32
+ !!matching_alias
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,35 @@
1
+ module Stevenson
2
+ module Template
3
+ autoload :Git, 'stevenson/templates/git'
4
+ autoload :Local, 'stevenson/templates/local'
5
+
6
+ autoload :Loader, 'stevenson/template/loader'
7
+
8
+ def self.load(template, options)
9
+ Loader.new(template, options).template
10
+ end
11
+
12
+ class Base
13
+ attr_reader :name, :options
14
+
15
+ def initialize(name, options = {})
16
+ @name, @options = name, options
17
+ end
18
+
19
+ def place_config(config_file)
20
+ place_files(config_file, 'config.yml')
21
+ end
22
+
23
+ def place_files(files, directory)
24
+ action = File.directory?(files) ? :cp_r : :cp
25
+ FileUtils.send(action, files, File.join(local_directory, directory))
26
+ end
27
+
28
+ def close
29
+ FileUtils.rm_rf local_directory if local_directory
30
+ end
31
+ end
32
+
33
+ class InvalidTemplateException < StandardError; end
34
+ end
35
+ end
@@ -1,26 +1,25 @@
1
1
  require 'git'
2
- require 'stevenson/templates/base'
3
2
 
4
3
  module Stevenson
5
- module Templates
6
- class GitTemplate < Base
7
- def initialize(template_url)
8
- # Create a temporary directory to clone the repo at
9
- Dir.mktmpdir do |dir|
10
- # Clone the repo to a temporary directory for later use
11
- Git.clone template_url, File.join(dir, 'repo')
4
+ module Template
5
+ class Git < Base
6
+ attr_reader :template_url, :options
12
7
 
13
- # Call the super, thereby assigning the @path
14
- super File.join(dir, 'repo')
15
- end
16
- rescue Git::GitExecuteError => e
17
- # If the given URL is not valid, raise an exception and cleanup
18
- raise InvalidTemplateException.new('Failed to clone the repository')
8
+ def initialize(template_url, options)
9
+ @template_url, @options = template_url, options
19
10
  end
20
11
 
21
- def switch_branch(branch)
22
- repo = Git::Base.open(path)
23
- repo.checkout(branch)
12
+ def local_directory
13
+ @_local_directory ||= Dir.mktmpdir.tap do |dir|
14
+ # Clone the repo to a temporary directory for later use
15
+ ::Git.clone(template_url, dir).tap do |repo|
16
+ # Switch_branch if set
17
+ repo.checkout(options[:branch]) if options.has_key?(:branch)
18
+ end
19
+ end
20
+ rescue ::Git::GitExecuteError
21
+ # If the given repo URL is not valid, raise an exception
22
+ raise InvalidTemplateException.new('Failed to clone the repository')
24
23
  end
25
24
  end
26
25
  end
@@ -0,0 +1,21 @@
1
+ module Stevenson
2
+ module Template
3
+ class Local < Base
4
+ attr_reader :template_path, :options
5
+
6
+ def initialize(template_path, options)
7
+ @template_path, @options = template_path, options
8
+ end
9
+
10
+ def local_directory
11
+ raise InvalidTemplateException.new('The given path is not a directory') unless File.directory?(template_path)
12
+
13
+ @_local_directory ||= Dir.mktmpdir.tap do |dir|
14
+ directories = [template_path, options[:subdirectory], '.'].compact
15
+
16
+ FileUtils.cp_r File.join(*directories), dir
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module Stevenson
2
- VERSION = "1.0.1"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/stevenson.rb CHANGED
@@ -1,14 +1,16 @@
1
- require 'stevenson/configurators/yaml_configurator'
2
- require 'stevenson/output_filters/jekyll'
3
- require 'stevenson/output_filters/zip'
4
- require 'stevenson/template_loader'
5
1
  require 'stevenson/version'
6
2
 
7
3
  module Stevenson
8
4
  autoload :Application, 'stevenson/application'
9
- autoload :Input, 'stevenson/input'
5
+ autoload :Dotfile, 'stevenson/dotfile'
6
+ autoload :Template, 'stevenson/template'
7
+ autoload :OutputFilter, 'stevenson/output_filter'
10
8
 
11
- def self.inputs
12
- @_inputs ||= {}
9
+ def self.dotfile
10
+ @_dotfile ||= Dotfile.new
11
+ end
12
+
13
+ def self.output_filters
14
+ @_output_filters ||= {}
13
15
  end
14
16
  end
data/spec/bin/.gitkeep ADDED
File without changes
@@ -0,0 +1,37 @@
1
+ describe Stevenson::OutputFilter::Generator do
2
+ let(:options) { Hash.new }
3
+ subject { described_class.new(options) }
4
+
5
+ describe "#generate!(template)" do
6
+ let(:template) { double(:template, local_directory: '/tmp/path/to/template') }
7
+ let(:jekyll_output) { double(:jekyll_output) }
8
+ let(:zip_output) { double(:zip_output) }
9
+ before do
10
+ allow_any_instance_of(Stevenson::OutputFilter::Jekyll).to receive(:output).and_return(jekyll_output)
11
+ end
12
+
13
+ it "should create a new filter for the jekyll filter's output" do
14
+ expect(Stevenson::OutputFilter::Jekyll).to receive(:new).with(template.local_directory).and_call_original
15
+ subject.generate!(template)
16
+ end
17
+
18
+ it "should return the filter's output result" do
19
+ expect(subject.generate!(template)).to eq jekyll_output
20
+ end
21
+
22
+ context "when more than one filter exists" do
23
+ let(:options) { { zip: true } }
24
+ let(:zip_filter) { double(:zip_filter, output: zip_output) }
25
+
26
+ it "should build subsequent filters with the previous' output" do
27
+ expect(Stevenson::OutputFilter::Zip).to receive(:new).with(jekyll_output).and_return(zip_filter)
28
+ subject.generate!(template)
29
+ end
30
+
31
+ it "should return the subsequent filter's output" do
32
+ allow(Stevenson::OutputFilter::Zip).to receive(:new).with(jekyll_output).and_return(zip_filter)
33
+ expect(subject.generate!(template)).to eq zip_output
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,57 @@
1
+ module Stevenson::OutputFilter
2
+ class Test < Base
3
+ end
4
+ end
5
+
6
+ describe Stevenson::OutputFilter do
7
+ let(:filter) { Stevenson::OutputFilter::Test }
8
+
9
+ describe ".generate!(template, options)" do
10
+ let(:template) { double(:template) }
11
+ let(:options) { Hash.new }
12
+ let(:output) { double(:output) }
13
+ let(:generator) { double(:generator, generate!: output) }
14
+ subject { described_class.generate!(template, options) }
15
+
16
+ it "should call Generator.new with options" do
17
+ expect(Stevenson::OutputFilter::Generator).to receive(:new).with(options).and_return(generator)
18
+ subject
19
+ end
20
+
21
+ it "should call generator's generate! with template" do
22
+ allow(Stevenson::OutputFilter::Generator).to receive(:new).and_return(generator)
23
+ expect(generator).to receive(:generate!).with(template)
24
+ subject
25
+ end
26
+
27
+ it "should return generate!er's output response" do
28
+ allow(Stevenson::OutputFilter::Generator).to receive(:new).and_return(generator)
29
+ expect(subject).to eq output
30
+ end
31
+ end
32
+
33
+ describe ".filter_for()" do
34
+ context "when the filter has been registered previously" do
35
+ it "should return the filter class from Stevenson.output_filters" do
36
+ expect(Stevenson::OutputFilter.filter_for(:test)).to eq(filter)
37
+ end
38
+ end
39
+
40
+ context "when the filter has not been registered previously" do
41
+ it "should return the filter class from Stevenson.output_filters" do
42
+ allow(Stevenson).to receive(:output_filters).and_return({})
43
+ expect(Stevenson::OutputFilter.filter_for(:test)).to eq(filter)
44
+ end
45
+ end
46
+
47
+ context "when the filter doesn't exist" do
48
+ it "should raise a NameError with a descriptive error message" do
49
+ expect { Stevenson::OutputFilter.filter_for(:bad_filter) }.to raise_error do |error|
50
+ expect(error).to be_a(NameError)
51
+ expect(error.message).to eq("Type 'bad_filter' is not a valid output type.")
52
+ expect(error.cause).to be_a(NameError)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,23 @@
1
+ describe Stevenson::OutputFilter::Jekyll do
2
+ let(:temporary_directory) { '/tmp/directory' }
3
+ let(:template) { double(:template, local_directory: temporary_directory) }
4
+ subject { described_class.new(template.local_directory) }
5
+
6
+ describe '#output' do
7
+ it "should change into the template's directory" do
8
+ expect(Dir).to receive(:chdir).with(temporary_directory)
9
+ subject.output
10
+ end
11
+
12
+ it "should build jekyll" do
13
+ allow(Dir).to receive(:chdir).with(temporary_directory).and_yield
14
+ expect(subject).to receive(:`).with("jekyll b")
15
+ subject.output
16
+ end
17
+
18
+ it 'outputs a jekyll compiled directory' do
19
+ allow(Dir).to receive(:chdir).with(temporary_directory)
20
+ expect(subject.output).to eq File.join(temporary_directory, '_site', '.')
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ describe Stevenson::OutputFilter::Zip do
2
+ let(:temporary_directory) { '/tmp/directory' }
3
+ let(:template) { double(:template, local_directory: temporary_directory) }
4
+ subject { described_class.new(template.local_directory) }
5
+
6
+ describe '#output' do
7
+ let(:output_zip) { "#{temporary_directory}.zip" }
8
+
9
+ it "should zip the files in temporary_directory to the zip" do
10
+ expect(subject).to receive(:write).with(temporary_directory, output_zip).and_return(true)
11
+ subject.output
12
+ end
13
+
14
+ it "should return the temporary_directory with '.zip' appended" do
15
+ allow(subject).to receive(:write).and_return(true)
16
+ expect(subject.output).to eq output_zip
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,35 @@
1
+ describe Stevenson::Template::Loader do
2
+ let(:template_name) { 'template' }
3
+ let(:options) { Hash.new }
4
+ subject { described_class.new(template_name, options) }
5
+
6
+ describe "#template" do
7
+ context "when 'template_name' matches an alias" do
8
+ let(:aliased_template) do
9
+ double(:aliased_template, name: 'template_path', options: {})
10
+ end
11
+ let(:dotfile) do
12
+ double(:dotfile, template_aliases: { template_name => aliased_template })
13
+ end
14
+
15
+ before { allow(Stevenson).to receive(:dotfile).and_return(dotfile) }
16
+
17
+ it "should call Loader on Template with the name" do
18
+ expect(Stevenson::Template).to receive(:load).with(aliased_template.name, aliased_template.options)
19
+ subject.template
20
+ end
21
+ end
22
+
23
+ context "when 'template' matches a git repo" do
24
+ let(:template_name) { 'http://www.github.com/Org/repo.git' }
25
+
26
+ it "should return a Git template" do
27
+ expect(subject.template).to be_a Stevenson::Template::Git
28
+ end
29
+ end
30
+
31
+ it "should return a Local template " do
32
+ expect(subject.template).to be_a Stevenson::Template::Local
33
+ end
34
+ end
35
+ end