stevenson 1.0.1 → 2.0.0

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 (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