Downloading theme-classic for default behavior of create command.

This commit is contained in:
Adam Williams 2012-01-18 16:25:14 -05:00
parent dc85be2ff6
commit c6f194fb1e
7 changed files with 104 additions and 9 deletions

View File

@ -2,16 +2,16 @@ Feature: create subcommand
In order to make blogs for hackers In order to make blogs for hackers
As a hacker using the octopress executable As a hacker using the octopress executable
I want to create a blog from a template I want to create a blog using a theme
Scenario: No flags, switches or arguments Scenario: No flags, switches or arguments
When I successfully run `octopress create` When I successfully run `octopress create`
Then an empty project structure should exist Then a theme-classic project structure should exist
Scenario: Path argument provided Scenario: Path argument provided
When I successfully run `octopress create pathto/myblog` When I successfully run `octopress create pathto/myblog`
Then a directory named "pathto/myblog" should exist Then a directory named "pathto/myblog" should exist
When I cd to "pathto/myblog" When I cd to "pathto/myblog"
Then an empty project structure should exist Then a theme-classic project structure should exist
Scenario: directory exists Scenario: directory exists

View File

@ -1,6 +1,9 @@
Then /an empty project structure should exist/ do Then /a theme-classic project structure should exist/ do
# Basic project structure
check_directory_presence(%w( check_directory_presence(%w(
_plugins _plugins
_posts
), true) ), true)
check_file_presence(%w( check_file_presence(%w(
@ -8,6 +11,25 @@ Then /an empty project structure should exist/ do
.rbenv-version .rbenv-version
_config.yml _config.yml
Gemfile Gemfile
_plugins/octopress.rb
), true) ), true)
# Classic theme files
check_directory_presence(%w(
_includes
_layouts
_sass
assets
blog
images
javascripts
), true)
check_file_presence(%w(
blog/archives/index.html
atom.xml
favicon.png
index.html
_sass/screen.scss
), true)
end end

View File

@ -1 +1,5 @@
require 'aruba/cucumber' require 'aruba/cucumber'
Before do
@aruba_timeout_seconds = 10
end

View File

@ -1,13 +1,62 @@
require 'fileutils'
class Octopress::Commands::Create class Octopress::Commands::Create
include FileUtils
def initialize(project_path) def initialize(project_path)
@project_root = File.expand_path project_path @project_root = File.expand_path project_path
@project_tmp = File.join @project_root, 'tmp'
@template_root = Octopress.template_root @template_root = Octopress.template_root
end end
def execute def execute
mkdir_p @project_root FileUtils.mkdir_p @project_root
cp_r File.join(@template_root, '.'), @project_root FileUtils.cp_r File.join(@template_root, '.'), @project_root
FileUtils.mkdir File.join(@project_root, '_posts')
zip_file_path = download 'https://github.com/octopress/theme-classic/zipball/master', 'theme-classic.zip'
unzip zip_file_path, @project_tmp
extracted_root = Dir[File.join(@project_tmp, 'octopress-theme-classic-*')].first
FileUtils.cp_r Dir.glob(File.join(extracted_root, '*')), @project_root
end
def read_url(url, &block)
require 'net/http'
success_response, limit, tries = false, 5, 0
uri = URI(url)
until success_response || tries == limit
tries += 1
Net::HTTP.start(uri.host, uri.port, use_ssl:(uri.scheme == 'https')) do |http|
http.request_get(uri.path) { |response|
case response
when Net::HTTPRedirection
success_response = false
uri = URI(response['location'])
when Net::HTTPSuccess
success_response = true
block.call response
end
}
end end
end end
end
def download(url, filename)
FileUtils.mkdir_p @project_tmp
File.join(@project_tmp, filename).tap do |download_path|
File.open(download_path, 'w') do |f|
read_url(url) { |resp| resp.read_body { |segment| f.write(segment) } }
end
end
end
def unzip(file, destination)
require 'zip/zip'
Zip::ZipFile.open(file) do |zip_file|
zip_file.each do |f|
f_path = File.join(destination, f.name)
FileUtils.mkdir_p File.dirname(f_path)
zip_file.extract f, f_path unless File.exist?(f_path)
end
end
end
end

View File

@ -19,7 +19,9 @@ bin/octopress
s.executables << 'octopress' s.executables << 'octopress'
s.add_dependency('gli', '~> 1.4.0') s.add_dependency('gli', '~> 1.4.0')
s.add_dependency('jekyll', '~> 0.11.0') s.add_dependency('jekyll', '~> 0.11.0')
s.add_dependency('rubyzip', '~> 0.9.5')
s.add_development_dependency('rake') s.add_development_dependency('rake')
s.add_development_dependency('rdoc') s.add_development_dependency('rdoc')
s.add_development_dependency('aruba', '~> 0.4.9') s.add_development_dependency('fakefs')
s.add_development_dependency('aruba', '0.4.10')
end end

View File

@ -0,0 +1,16 @@
require 'spec_helper'
describe Octopress::Commands::Create do
include FakeFS::SpecHelpers
let(:project_path) { File.expand_path File.join('tmp', 'create') }
subject { described_class.new(project_path) }
it 'downloads to tmp location in project_path' do
download_path = subject.download 'https://github.com/octopress/theme-classic/zipball/master', 'theme-classic.zip'
download_path.should == File.join(project_path, 'tmp', 'theme-classic.zip')
File.exists?(download_path).should be_true
File.size(download_path).should > 0
end
end

View File

@ -0,0 +1,2 @@
require 'fakefs/spec_helpers'
require 'octopress'