rack-jekyll 0.4.1 → 0.4.2

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 65a9a75b71d00f183b26748662eee97d23ab42cf
4
+ data.tar.gz: af266d768a47a4fc17050955626480e437e67388
5
+ SHA512:
6
+ metadata.gz: 7be8456d67a62653587ff1282b771abd5899766d0a9a4eb9ff82c467dbb1551a887b7d8baa1c7b31ea0ac387c5088d65857158c226036408651144e3cf116aaf
7
+ data.tar.gz: b11490d802a8ffc92654dcd6a24fe26f78e7d880364c0df37ba50352c9d116c5ad07972b304897e0ae155fca43b20dd3da82457f3dc46e36d2ef17e838157a42
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org/'
2
+
3
+ group :test do
4
+ gem "cucumber", "2.1.0"
5
+ end
6
+
7
+ gemspec
data/README.markdown CHANGED
@@ -1,75 +1,86 @@
1
1
  Rack-Jekyll
2
2
  ===========
3
3
 
4
- Transform your [Jekyll](http://github.com/mojombo/jekyll) app into [Rack](http://github.com/rack/rack) application
4
+ Transform your [Jekyll](https://jekyllrb.com/) app
5
+ into a [Rack](https://github.com/rack/rack) application.
5
6
 
6
- - Can run it with rackup and [shotgun](http://github.com/rtomakyo/shotgun), [unicorn](http://github.com/defunkt/unicorn), and more.
7
+ - You can run it with rackup, [shotgun](https://github.com/rtomayko/shotgun),
8
+ [unicorn](http://unicorn.bogomips.org/), and more.
9
+ - You can run Rack-Jekyll with any modified Jekyll.
10
+ - You can deploy Rack-Jekyll to Heroku, EC2, Rackspace,
11
+ dedicated servers, VPS, etc.
7
12
 
8
- - Can run rack-jekyll with any modified jekyll
9
13
 
10
- - Can deploy rack-jekyll on Heroku, EC2, Slicehost, Rackspace Cloud, Dedicated server, VPS, etc..
14
+ ## How to use it
11
15
 
16
+ A `config.ru` file is required in order to run with shotgun and rackup.
17
+ You can even deploy your Jekyll app to [Heroku](https://www.heroku.com/)!
12
18
 
13
- Heroku Demo: [http://bry4n.heroku.com/](http://bry4n.heroku.com/)
19
+ Copy this into `config.ru` in your Jekyll site's root directory:
14
20
 
15
- ### How to use it?
21
+ ``` ruby
22
+ require "rack/jekyll"
16
23
 
17
- *config.ru* is required in order to run with shotgun and rackup. Even you can deploy your jekyll app to [Heroku!](http://www.heroku.com/)
24
+ run Rack::Jekyll.new
25
+ ```
18
26
 
19
- Copy this and put in config.ru in your jekyll's root directory.
20
-
21
-
22
- config.ru:
23
-
24
- require "rack/jekyll"
25
-
26
- run Rack::Jekyll.new
27
+ That's it.
27
28
 
29
+ Heroku provides a read-only filesystem, so you need to generate pages
30
+ and git-commit them *before* you deploy your Jekyll site to Heroku.
28
31
 
29
- That's it.
32
+ 1. `cd` to your Jekyll directory
33
+ 2. add a `config.ru` file (see example above)
34
+ 3. build pages with `jekyll build`
35
+ 4. add `gem "rack-jekyll"` to your `Gemfile`
36
+ 5. `git init && git add .`
37
+ 6. `git commit -m "Initial commit"`
38
+ 7. `heroku create`
39
+ 8. `git push heroku master`
30
40
 
31
41
 
32
- Heroku is a [read-only filesystem](http://docs.heroku.com/constraints#read-only-filesystem):
42
+ ## Configuration
33
43
 
34
- You need to generate pages and git-add pages and git-commit before you deploy your jekyll to Heroku
44
+ Jekyll configuration options can be specified in a `_config.yml` file
45
+ or as Rack-Jekyll initialization options in `config.ru`.
35
46
 
36
- 1) cd to your jekyll directory
47
+ Example:
37
48
 
38
- 2) add config.ru (see example above)
39
-
40
- 3) build pages, type: jekyll
41
-
42
- 4) echo "rack-jekyll" > .gems
43
-
44
- 5) git init && git add .
45
-
46
- 6) git commit -m "first heroku app"
47
-
48
- 7) heroku create
49
-
50
- 8) git push heroku master
49
+ ``` ruby
50
+ run Rack::Jekyll.new(:destination => "mysite")
51
+ ```
51
52
 
53
+ This will set a custom destination path, overriding the default (`_site`)
54
+ and settings from a config file.
52
55
 
53
- ## Initialization Options
56
+ See [Jekyll's configuration docs](https://jekyllrb.com/docs/configuration/)
57
+ for more settings.
54
58
 
55
- :destination - use the desintation path (default: _site)
59
+ Additional Rack-Jekyll initialization options:
56
60
 
61
+ :config - use given config file (default: "_config.yml")
62
+ :force_build - whether to always generate the site at startup, even
63
+ when the destination path is not empty (default: false)
64
+ :auto - whether to watch for changes and rebuild (default: false)
57
65
 
58
- *Example:*
66
+ Note that on read-only filesystems a site build will fail,
67
+ so do not set `:force_build => true` in these cases.
59
68
 
60
- run Rack::Jekyll.new(:destination => "mysite")
61
69
 
70
+ ## 404 page
62
71
 
63
- ## YAML Config
72
+ In your site's root directory you can provide a custom `404.html` file
73
+ with YAML front matter.
64
74
 
65
- It now can read the `_config.yml` file for destination path. Read [Jekyll Configuration](http://wiki.github.com/mojombo/jekyll/configuration)
66
75
 
76
+ ## Contributing
67
77
 
68
- ## 404 page
78
+ Contributions are more than just welcome.
79
+ Fork this repo and create a new branch, then submit a pull request.
69
80
 
70
- You can create a new file: `404.html` with YAML Front Matter. See my [Heroku Demo 404](http://bry4n.heroku.com/show/me/404/)
71
81
 
72
82
  ## Contributors
83
+
73
84
  * adaoraul (Adão Raul)
74
85
  * Nerian (Gonzalo Rodríguez-Baltanás Díaz)
75
86
  * scottwater (Scott Watermasysk)
@@ -79,7 +90,4 @@ You can create a new file: `404.html` with YAML Front Matter. See my [Heroku Dem
79
90
  * bemurphy (Brendon Murphy)
80
91
  * imajes (James Cox)
81
92
  * mattr- (Matt Rogers)
82
-
83
- ## Contribution
84
-
85
- Contributing this is more than just welcome. Fork this and create a new branch then pull request.
93
+ * stomar (Marcus Stollsteimer)
data/Rakefile ADDED
@@ -0,0 +1,42 @@
1
+ require 'rubygems'
2
+ require 'rubygems/specification'
3
+ require 'rubygems/package_task'
4
+ require 'rake/testtask'
5
+ #require 'extensions/all'
6
+ require_relative 'lib/rack/jekyll'
7
+
8
+ task :default => :test
9
+
10
+ Rake::TestTask.new do |t|
11
+ t.pattern = 'test/test_*.rb'
12
+ t.verbose = true
13
+ t.warning = true
14
+ end
15
+
16
+ desc "Build gem"
17
+ task :build do
18
+ sh "gem build rack-jekyll.gemspec"
19
+ end
20
+
21
+ desc "Install gem"
22
+ task :install => :build do
23
+ sh "gem install rack-jekyll-#{Rack::Jekyll.version}.gem"
24
+ end
25
+
26
+ desc "Push gem to rubygems.org"
27
+ task :push do
28
+ sh "gem push rack-jekyll-#{Rack::Jekyll.version}.gem"
29
+ end
30
+
31
+ desc "Clean up gem"
32
+ task :clean do
33
+ sh "rm *.gem"
34
+ end
35
+
36
+ desc "Run demo"
37
+ task :demo do
38
+ puts " ==> Starting demo: http://localhost:3000/"
39
+ Dir.chdir("example") do
40
+ sh "rackup -p 3000"
41
+ end
42
+ end
@@ -0,0 +1,36 @@
1
+ Feature: Rack-Jekyll
2
+ In order to ensure results are correct
3
+ As a Jekyll
4
+ I want to become a Rack application
5
+
6
+ Scenario: Request 200 page
7
+ Given I have entered the path /
8
+ When I request a page
9
+ Then the http status should be 200
10
+ Then the content-type should be text/html
11
+ And the content-length should be 24
12
+ And the data should show <p>Rack-Jekyll Test</p>
13
+
14
+ Scenario: Request 304 page
15
+ Given I have entered the path /
16
+ When I request a page with a date of Last-Modified
17
+ Then the http status should be 304
18
+ And there should be no 'Content-Length' header
19
+
20
+ Scenario: Request 404 page
21
+ Given I have entered the path /show/me/404/
22
+ When I request a page
23
+ Then the http status should be 404
24
+ And the content-type should be text/html
25
+ And the content-length should be 9
26
+
27
+ Scenario: Request static pages
28
+ Given I have entered the path /css/test.css
29
+ When I request a page
30
+ Then the http status should be 200
31
+ Then the content-type should be text/css
32
+
33
+ Given I have entered the path /js/test.js
34
+ When I request a page
35
+ Then the http status should be 200
36
+ Then the content-type should be application/javascript
@@ -0,0 +1,58 @@
1
+ Before do
2
+ @old_pwd = Dir.pwd
3
+ FileUtils.mkdir_p(TEMP_DIR) unless File.exist?(TEMP_DIR)
4
+ Dir.chdir(TEMP_DIR)
5
+
6
+ FileUtils.mkdir_p(SOURCE_DIR) unless File.exist?(SOURCE_DIR)
7
+ FileUtils.mkdir_p(DEST_DIR) unless File.exist?(DEST_DIR)
8
+
9
+ @jekyll = Rack::Jekyll.new(:force_build => true,
10
+ :source => SOURCE_DIR,
11
+ :destination => DEST_DIR)
12
+ end
13
+
14
+ After do
15
+ FileUtils.rm_rf(TEMP_DIR) if File.exist?(TEMP_DIR)
16
+ Dir.chdir(@old_pwd)
17
+ end
18
+
19
+
20
+ Given /^I have entered the path (.*)$/ do |path|
21
+ @path = path
22
+ end
23
+
24
+
25
+ When /^I request a page$/ do
26
+ @response = get(@path)
27
+ end
28
+
29
+ When /^I request a page with a date of Last-Modified$/ do
30
+ modify_time = get(@path).headers["Last-Modified"]
31
+ @response = get(@path, {'HTTP_IF_MODIFIED_SINCE' => modify_time})
32
+ end
33
+
34
+
35
+ Then /^the http status should be (.*)$/ do |code|
36
+ assert_equal(code, @response.status.to_s)
37
+ end
38
+
39
+ Then /^the content\-type should be (.*)$/ do |type|
40
+ assert_equal(type, @response.headers["Content-Type"])
41
+ end
42
+
43
+ Then /^the content\-length should be (.*)$/ do |length|
44
+ assert_equal(length, @response.original_headers["Content-Length"])
45
+ end
46
+
47
+ Then /^the data should show (.*)$/ do |body|
48
+ assert_equal(body.chomp, @response.body.chomp)
49
+ end
50
+
51
+ Then /^there should be no '(.*)' header$/ do |header|
52
+ refute @response.headers.has_key?(header)
53
+ end
54
+
55
+ def get(path, headers={})
56
+ req = Rack::MockRequest.new(@jekyll)
57
+ req.get(path,headers)
58
+ end
@@ -0,0 +1,9 @@
1
+ require "minitest"
2
+ require "rack/mock"
3
+
4
+ require_relative "../../lib/rack/jekyll"
5
+
6
+ TEST_DIR = File.expand_path("../../../test", __FILE__)
7
+ TEMP_DIR = File.join(TEST_DIR, "tmp")
8
+ SOURCE_DIR = File.join(TEST_DIR, "source")
9
+ DEST_DIR = File.join(TEMP_DIR, "_site")
data/lib/rack/jekyll.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require "rack"
2
- require "yaml"
2
+ require "jekyll"
3
3
  require "rack/request"
4
4
  require "rack/response"
5
5
  require File.join(File.dirname(__FILE__), 'jekyll', 'helpers')
@@ -8,54 +8,65 @@ require File.join(File.dirname(__FILE__), 'jekyll', 'ext')
8
8
 
9
9
  module Rack
10
10
  class Jekyll
11
- @compiling = false
12
11
 
13
- def initialize(opts = {})
14
- config_file = '_config.yml'
15
- if ::File.exist?(config_file)
16
- config = YAML.load_file(config_file)
17
- @path = (config['destination'].nil? && "_site") || config['destination']
12
+ attr_reader :config, :destination
18
13
 
19
- @files = ::Dir[@path + "/**/*"].inspect
20
- @files unless ENV['RACK_DEBUG']
21
- end
14
+ # Initializes a new Rack::Jekyll site.
15
+ #
16
+ # Options:
17
+ #
18
+ # +:config+:: use given config file (default: "_config.yml")
19
+ #
20
+ # +:force_build+:: whether to always generate the site at startup, even
21
+ # when the destination path is not empty (default: +false+)
22
+ #
23
+ # +:auto+:: whether to watch for changes and rebuild (default: +false+)
24
+ #
25
+ # Other options are passed on to Jekyll::Site.
26
+ def initialize(options = {})
27
+ overrides = options.dup
28
+ @compiling = false
29
+ @force_build = overrides.fetch(:force_build, false)
30
+ @auto = overrides.fetch(:auto, false)
31
+
32
+ overrides.delete(:force_build)
33
+ overrides.delete(:auto)
34
+ @config = ::Jekyll.configuration(overrides)
35
+
36
+ @destination = @config["destination"]
37
+ @source = @config["source"]
38
+
39
+ load_file_list
40
+ puts @files.inspect if ENV['RACK_DEBUG']
22
41
 
23
42
  @mimes = Rack::Mime::MIME_TYPES.map{|k,v| /#{k.gsub('.','\.')}$/i }
24
- require "jekyll"
25
- options = ::Jekyll.configuration(opts)
26
- site = ::Jekyll::Site.new(options)
27
- if ::Dir[@path + "/**/*"].empty?
28
- site.process
29
- @compiling = true
30
- else
31
- @compiling = false
43
+
44
+ @site = ::Jekyll::Site.new(@config)
45
+
46
+ if ::Dir[@destination + "/**/*"].empty? || @force_build
47
+ process("Generating site: #{@source} -> #{@destination}")
32
48
  end
33
- if options['auto']
34
- require 'directory_watcher'
49
+
50
+ if @auto
51
+ require 'listen'
52
+ require 'listen/version'
35
53
  require 'pathname'
36
- source, destination = options['source'], options['destination']
37
- puts "Auto-regenerating enabled: #{source} -> #{destination}"
38
54
 
39
- dw = DirectoryWatcher.new(source)
40
- dw.interval = 1
41
- dw.glob = globs(source)
55
+ puts "Auto-regeneration enabled: #{@source} -> #{@destination}"
56
+
57
+ source_abs = ::File.expand_path(@source)
58
+ dest_abs = ::File.expand_path(@destination)
59
+ relative_path_to_dest = Pathname.new(dest_abs)
60
+ .relative_path_from(Pathname.new(source_abs))
61
+ .to_path
62
+ ignore_pattern = %r{#{Regexp.escape(relative_path_to_dest)}}
42
63
 
43
- dw.add_observer do |*args|
64
+ listener = Listen.to(@source, :ignore => ignore_pattern) do |modified, added, removed|
44
65
  t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
45
- puts "[#{t}] regeneration: #{args.size} files changed"
46
- site.process
66
+ n = modified.length + added.length + removed.length
67
+ process("[#{t}] Regenerating: #{n} file(s) changed")
47
68
  end
48
-
49
- dw.start
50
- end
51
- end
52
-
53
- def globs(source)
54
- Dir.chdir(source) do
55
- dirs = Dir['*'].select { |x| Pathname(x).directory? }
56
- dirs -= ['_site']
57
- dirs = dirs.map { |x| "#{x}/**/*" }
58
- dirs += ['*']
69
+ listener.start unless Listen::VERSION =~ /\A[0-1]\./
59
70
  end
60
71
  end
61
72
 
@@ -63,8 +74,10 @@ module Rack
63
74
  @request = Rack::Request.new(env)
64
75
  @response = Rack::Response.new
65
76
  path_info = @request.path_info
66
- @files = ::Dir[@path + "/**/*"].inspect if @files == "[]"
67
- if @files.include?(path_info)
77
+ while @compiling
78
+ sleep 0.1
79
+ end
80
+ if @files.inspect.include?(path_info)
68
81
  if path_info =~ /(\/?)$/
69
82
  if @mimes.collect {|regex| path_info =~ regex }.compact.empty?
70
83
  path_info += $1.nil? ? "/index.html" : "index.html"
@@ -72,7 +85,7 @@ module Rack
72
85
  end
73
86
  mime = mime(path_info)
74
87
 
75
- file = file_info(@path + path_info)
88
+ file = file_info(@destination + path_info)
76
89
  body = file[:body]
77
90
  time = file[:time]
78
91
  hdrs = { 'Last-Modified' => time }
@@ -80,21 +93,31 @@ module Rack
80
93
  if time == @request.env['HTTP_IF_MODIFIED_SINCE']
81
94
  [304, hdrs, []]
82
95
  else
83
- hdrs.update({ 'Content-length' => body.bytesize.to_s,
96
+ hdrs.update({ 'Content-Length' => body.bytesize.to_s,
84
97
  'Content-Type' => mime, } )
85
98
  [@response.status, hdrs, [body]]
86
99
  end
87
100
 
88
101
  else
89
- status, body, path_info = ::File.exist?(@path+"/404.html") ? [404,file_info(@path+"/404.html")[:body],"404.html"] : [404,"Not found","404.html"]
102
+ status, body, path_info = ::File.exist?(@destination+"/404.html") ? [404,file_info(@destination+"/404.html")[:body],"404.html"] : [404,"Not found","404.html"]
90
103
  mime = mime(path_info)
91
- if !@compiling
92
- [status, {"Content-Type" => mime, "Content-length" => body.bytesize.to_s}, [body]]
93
- else
94
- @compiling = ::Dir[@path + "/**/*"].empty?
95
- [200, {"Content-Type" => "text/plain"}, ["This site is currently generating pages. Please reload this page after a couple of seconds."]]
96
- end
104
+
105
+ [status, {"Content-Type" => mime, "Content-Length" => body.bytesize.to_s}, [body]]
97
106
  end
98
107
  end
108
+
109
+ private
110
+
111
+ def load_file_list
112
+ @files = ::Dir[@destination + "/**/*"]
113
+ end
114
+
115
+ def process(message = nil)
116
+ @compiling = true
117
+ puts message if message
118
+ @site.process
119
+ load_file_list
120
+ @compiling = false
121
+ end
99
122
  end
100
123
  end
@@ -1,7 +1,7 @@
1
1
  module Rack
2
2
  class Jekyll
3
3
  def self.version
4
- '0.4.1'
4
+ '0.4.2'
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), "lib", "rack", "jekyll", "version")
4
+
5
+ Gem::Specification.new do |s|
6
+ s.required_rubygems_version = ">= 1.3.6"
7
+
8
+ s.name = "rack-jekyll"
9
+ s.version = Rack::Jekyll.version
10
+
11
+ s.summary = "Transform your Jekyll app into a Rack application."
12
+ s.description = "Rack-Jekyll transforms your Jekyll app into a Rack application."
13
+
14
+ s.authors = ["Bryan Goines", "Adão Raul"]
15
+ s.email = "adao.raul@gmail.com"
16
+ s.homepage = "https://github.com/adaoraul/rack-jekyll"
17
+
18
+ s.files = %w{
19
+ README.markdown
20
+ rack-jekyll.gemspec
21
+ Gemfile
22
+ Rakefile
23
+ LICENSE
24
+ } +
25
+ Dir.glob("lib/**/*")
26
+ s.test_files = Dir.glob("{test,features}/**/*")
27
+ s.require_paths = ["lib"]
28
+
29
+ s.extra_rdoc_files = ["README.markdown"]
30
+ s.rdoc_options = ['--charset=UTF-8', '--main=README.markdown']
31
+
32
+ s.add_dependency "jekyll", ">= 1.3"
33
+ s.add_dependency "rack", "~> 1.5"
34
+ s.add_dependency "listen", ">= 1.3"
35
+
36
+ s.add_development_dependency "rake"
37
+ s.add_development_dependency "minitest"
38
+
39
+ s.platform = Gem::Platform::RUBY
40
+ s.rubyforge_project = "rack-jekyll"
41
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,72 @@
1
+ require "minitest/autorun"
2
+ require "stringio"
3
+ require "time"
4
+ require "rack/mock"
5
+
6
+ require_relative "../lib/rack/jekyll"
7
+
8
+ TEST_DIR = File.expand_path("..", __FILE__)
9
+
10
+
11
+ def silence_warnings
12
+ original_verbose, $VERBOSE = $VERBOSE, nil
13
+
14
+ yield
15
+ ensure
16
+ $VERBOSE = original_verbose
17
+ end
18
+
19
+ def silence_output
20
+ original_stderr, original_stdout = $stderr, $stdout
21
+ $stderr, $stdout = StringIO.new, StringIO.new
22
+
23
+ yield
24
+ ensure
25
+ $stderr, $stdout = original_stderr, original_stdout
26
+ end
27
+
28
+ def without_processing
29
+ silence_warnings do
30
+ Jekyll::Site.class_eval do
31
+ alias :original_process :process
32
+ def process; end
33
+ end
34
+ end
35
+
36
+ yield
37
+ ensure
38
+ silence_warnings do
39
+ Jekyll::Site.class_eval do
40
+ alias :process :original_process
41
+ remove_method :original_process
42
+ end
43
+ end
44
+ end
45
+
46
+ def rack_jekyll(options = {})
47
+ jekyll = nil
48
+ silence_output do
49
+ jekyll = Rack::Jekyll.new(options)
50
+ end
51
+
52
+ jekyll
53
+ end
54
+
55
+ def rack_jekyll_without_build(options = {})
56
+ jekyll = nil
57
+ without_processing do
58
+ jekyll = rack_jekyll(options)
59
+ end
60
+
61
+ jekyll
62
+ end
63
+
64
+ def file_must_exist(filename)
65
+ assert File.exist?(filename),
66
+ "Expected file `#{filename}' to exist."
67
+ end
68
+
69
+ def file_wont_exist(filename)
70
+ assert !File.exist?(filename),
71
+ "Expected file `#{filename}' to not exist."
72
+ end
@@ -0,0 +1 @@
1
+ fake_option: "ok"
@@ -0,0 +1,3 @@
1
+ ---
2
+ ---
3
+ Rack-Jekyll post
@@ -0,0 +1,3 @@
1
+ ---
2
+ ---
3
+ ¡Buenos días!
File without changes
@@ -0,0 +1,3 @@
1
+ ---
2
+ ---
3
+ Rack-Jekyll Test
File without changes
File without changes
@@ -0,0 +1,55 @@
1
+ require_relative "helper"
2
+
3
+
4
+ describe "when initializing a Rack::Jekyll instance" do
5
+
6
+ before do
7
+ @tempdir = File.join(TEST_DIR, "tmp")
8
+ FileUtils.mkdir_p(@tempdir) unless File.exist?(@tempdir)
9
+ Dir.chdir(@tempdir)
10
+
11
+ @sourcedir = File.join(TEST_DIR, "source")
12
+ @destdir = File.join(@tempdir, "_site")
13
+ FileUtils.mkdir_p(@sourcedir) unless File.exist?(@sourcedir)
14
+ FileUtils.mkdir_p(@destdir) unless File.exist?(@destdir)
15
+
16
+ @page = File.join(@destdir, "index.html")
17
+ @fake_page = File.join(@destdir, "fake.html")
18
+ end
19
+
20
+ after do
21
+ FileUtils.rm_rf(@tempdir) if File.exist?(@tempdir)
22
+ end
23
+
24
+ describe "when non-empty destination directory exists" do
25
+
26
+ before do
27
+ FileUtils.touch(@fake_page)
28
+ end
29
+
30
+ it "should not build the site by default" do
31
+ file_wont_exist(@page)
32
+ rack_jekyll(:source => @sourcedir,
33
+ :destination => @destdir)
34
+ file_wont_exist(@page)
35
+ end
36
+
37
+ it "should build the site when :force_build option is set" do
38
+ file_wont_exist(@page)
39
+ rack_jekyll(:force_build => true,
40
+ :source => @sourcedir,
41
+ :destination => @destdir)
42
+ file_must_exist(@page)
43
+ end
44
+ end
45
+
46
+ describe "when empty destination directory exists" do
47
+
48
+ it "should build the site" do
49
+ file_wont_exist(@page)
50
+ rack_jekyll(:source => @sourcedir,
51
+ :destination => @destdir)
52
+ file_must_exist(@page)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,110 @@
1
+ require_relative "helper"
2
+
3
+
4
+ describe "when configuring site" do
5
+
6
+ before do
7
+ @tempdir = File.join(TEST_DIR, "tmp")
8
+ FileUtils.mkdir_p(@tempdir) unless File.exist?(@tempdir)
9
+ Dir.chdir(@tempdir)
10
+ end
11
+
12
+ after do
13
+ FileUtils.rmdir(@tempdir) if File.exist?(@tempdir)
14
+ end
15
+
16
+ describe "when no options are given and no config file exists" do
17
+
18
+ it "loads the correct default destination" do
19
+ jekyll = rack_jekyll_without_build
20
+ jekyll.destination.must_equal File.join(Dir.pwd, "_site")
21
+ end
22
+ end
23
+
24
+ describe "when using default config file" do
25
+
26
+ it "loads the configuration from file" do
27
+ begin
28
+ File.open("_config.yml", "w") do |f|
29
+ f.puts "config_file_opt: ok"
30
+ end
31
+
32
+ jekyll = rack_jekyll_without_build
33
+ jekyll.config.must_include "config_file_opt"
34
+ jekyll.config["config_file_opt"].must_equal "ok"
35
+ ensure
36
+ FileUtils.rm("_config.yml")
37
+ end
38
+ end
39
+ end
40
+
41
+ describe "when using custom config file" do
42
+
43
+ it "loads the configuration from file" do
44
+ begin
45
+ File.open("_my_config.yml", "w") do |f|
46
+ f.puts "config_file_opt: ok"
47
+ end
48
+
49
+ jekyll = rack_jekyll_without_build(:config => "_my_config.yml")
50
+ jekyll.config.must_include "config_file_opt"
51
+ jekyll.config["config_file_opt"].must_equal "ok"
52
+ ensure
53
+ FileUtils.rm("_my_config.yml")
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "when initialization options are given" do
59
+
60
+ it "has the initialization options" do
61
+ jekyll = rack_jekyll_without_build(:init_opt => "ok")
62
+ jekyll.config.must_include "init_opt"
63
+ jekyll.config["init_opt"].must_equal "ok"
64
+ end
65
+
66
+ it "has the correct destination" do
67
+ jekyll = rack_jekyll_without_build(:destination => "/project/_site")
68
+ jekyll.destination.must_equal "/project/_site"
69
+ end
70
+
71
+ it ":auto is not passed on to Jekyll" do
72
+ jekyll = rack_jekyll_without_build(:auto => "ok")
73
+ jekyll.config.wont_include "auto"
74
+ end
75
+
76
+ it ":force_build is not passed on to Jekyll" do
77
+ jekyll = rack_jekyll_without_build(:force_build => "ok")
78
+ jekyll.config.wont_include "force_build"
79
+ end
80
+ end
81
+
82
+ describe "when initialization options are given and a config file exists" do
83
+
84
+ before do
85
+ File.open("_config.yml", "w") do |f|
86
+ f.puts "config_file_opt: ok"
87
+ f.puts "common_opt: from config"
88
+ f.puts "destination: /project/_site_from_config"
89
+ end
90
+ end
91
+
92
+ after do
93
+ FileUtils.rm("_config.yml")
94
+ end
95
+
96
+ it "has all options and initialization options override file options" do
97
+ jekyll = rack_jekyll_without_build(:init_opt => "ok",
98
+ :common_opt => "from init")
99
+ jekyll.config.must_include "init_opt"
100
+ jekyll.config.must_include "config_file_opt"
101
+ jekyll.config.must_include "common_opt"
102
+ jekyll.config["common_opt"].must_equal "from init"
103
+ end
104
+
105
+ it "has the correct destination" do
106
+ jekyll = rack_jekyll_without_build(:destination => "/project/_site_from_init")
107
+ jekyll.destination.must_equal "/project/_site_from_init"
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,91 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "helper"
4
+
5
+
6
+ describe "when handling requests" do
7
+
8
+ before do
9
+ @tempdir = File.join(TEST_DIR, "tmp")
10
+ FileUtils.mkdir_p(@tempdir) unless File.exist?(@tempdir)
11
+ Dir.chdir(@tempdir)
12
+
13
+ @sourcedir = File.join(TEST_DIR, "source")
14
+ @destdir = File.join(@tempdir, "_site")
15
+ FileUtils.mkdir_p(@sourcedir) unless File.exist?(@sourcedir)
16
+ FileUtils.mkdir_p(@destdir) unless File.exist?(@destdir)
17
+
18
+ @jekyll = rack_jekyll(:force_build => true,
19
+ :source => @sourcedir,
20
+ :destination => @destdir)
21
+ @request = Rack::MockRequest.new(@jekyll)
22
+ end
23
+
24
+ after do
25
+ FileUtils.rm_rf(@tempdir) if File.exist?(@tempdir)
26
+ end
27
+
28
+ it "can be created" do
29
+ @jekyll.wont_be_nil
30
+ @request.wont_be_nil
31
+ end
32
+
33
+ it "should return correct http status code" do
34
+ @request.get("/").status.must_equal 200
35
+ @request.get("/show/me/404").status.must_equal 404
36
+ end
37
+
38
+ it "should return correct http status code for If-Modified-Since" do
39
+ modify_time = @request.get("/").headers["Last-Modified"]
40
+ earlier_time = (Time.parse(modify_time) - 3600).httpdate
41
+
42
+ @request.get("/", {"HTTP_IF_MODIFIED_SINCE" => modify_time}).status.must_equal 304
43
+ @request.get("/", {"HTTP_IF_MODIFIED_SINCE" => earlier_time}).status.must_equal 200
44
+ end
45
+
46
+ it "should return correct http status code for If-Modified-Since with 404s" do
47
+ modify_time = @request.get("/").headers["Last-Modified"]
48
+ earlier_time = (Time.parse(modify_time) - 3600).httpdate
49
+
50
+ @request.get("/show/me/404", {"HTTP_IF_MODIFIED_SINCE" => earlier_time}).status.must_equal 404
51
+ end
52
+
53
+ it "should return correct Content-Type header" do
54
+ @request.get("/").headers["Content-Type"].must_equal "text/html"
55
+ @request.get("/css/test.css").headers["Content-Type"].must_equal "text/css"
56
+ @request.get("/js/test.js").headers["Content-Type"].must_equal "application/javascript"
57
+ @request.get("/js/test.min.js").headers["Content-Type"].must_equal "application/javascript"
58
+ @request.get("/show/me/404").headers["Content-Type"].must_equal "text/html"
59
+ end
60
+
61
+ it "should return correct Content-Length header" do
62
+ @request.get("/").original_headers["Content-Length"].to_i.must_equal 24
63
+ @request.get("/show/me/404").original_headers["Content-Length"].to_i.must_equal 9
64
+ end
65
+
66
+ it "should return correct Content-Length header for If-Modified-Since" do
67
+ modify_time = @request.get("/").headers["Last-Modified"]
68
+ @request.get("/", {"HTTP_IF_MODIFIED_SINCE" => modify_time}).original_headers["Content-Length"].must_be_nil
69
+ end
70
+
71
+ it "should return correct body" do
72
+ @request.get("/").body.must_equal "<p>Rack-Jekyll Test</p>\n"
73
+ @request.get("/show/me/404").body.must_equal "Not found"
74
+ end
75
+
76
+
77
+ describe "when page contains multibyte characters" do
78
+
79
+ before do
80
+ @response = @request.get("/buenos_dias.html")
81
+ end
82
+
83
+ it "should return correct body" do
84
+ @response.body.must_equal "<p>¡Buenos días!</p>\n"
85
+ end
86
+
87
+ it "should return the bytesize as Content-Length header" do
88
+ @response.original_headers["Content-Length"].to_i.must_equal 23
89
+ end
90
+ end
91
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-jekyll
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
5
- prerelease:
4
+ version: 0.4.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Bryan Goines
@@ -10,101 +9,145 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-05-15 00:00:00.000000000 Z
12
+ date: 2015-10-12 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: jekyll
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
- - - ! '>='
18
+ - - ">="
21
19
  - !ruby/object:Gem::Version
22
- version: 0.12.0
23
- - - <
24
- - !ruby/object:Gem::Version
25
- version: '2.0'
20
+ version: '1.3'
26
21
  type: :runtime
27
22
  prerelease: false
28
23
  version_requirements: !ruby/object:Gem::Requirement
29
- none: false
30
24
  requirements:
31
- - - ! '>='
32
- - !ruby/object:Gem::Version
33
- version: 0.12.0
34
- - - <
25
+ - - ">="
35
26
  - !ruby/object:Gem::Version
36
- version: '2.0'
27
+ version: '1.3'
37
28
  - !ruby/object:Gem::Dependency
38
29
  name: rack
39
30
  requirement: !ruby/object:Gem::Requirement
40
- none: false
41
31
  requirements:
42
- - - ~>
32
+ - - "~>"
43
33
  - !ruby/object:Gem::Version
44
- version: 1.5.0
34
+ version: '1.5'
45
35
  type: :runtime
46
36
  prerelease: false
47
37
  version_requirements: !ruby/object:Gem::Requirement
48
- none: false
49
38
  requirements:
50
- - - ~>
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.5'
42
+ - !ruby/object:Gem::Dependency
43
+ name: listen
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '1.3'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '1.3'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
51
68
  - !ruby/object:Gem::Version
52
- version: 1.5.0
69
+ version: '0'
53
70
  - !ruby/object:Gem::Dependency
54
- name: bacon
71
+ name: minitest
55
72
  requirement: !ruby/object:Gem::Requirement
56
- none: false
57
73
  requirements:
58
- - - ! '>='
74
+ - - ">="
59
75
  - !ruby/object:Gem::Version
60
76
  version: '0'
61
77
  type: :development
62
78
  prerelease: false
63
79
  version_requirements: !ruby/object:Gem::Requirement
64
- none: false
65
80
  requirements:
66
- - - ! '>='
81
+ - - ">="
67
82
  - !ruby/object:Gem::Version
68
83
  version: '0'
69
- description: Transform your jekyll based app into a Rack application
84
+ description: Rack-Jekyll transforms your Jekyll app into a Rack application.
70
85
  email: adao.raul@gmail.com
71
86
  executables: []
72
87
  extensions: []
73
88
  extra_rdoc_files:
74
89
  - README.markdown
75
90
  files:
76
- - README.markdown
91
+ - Gemfile
77
92
  - LICENSE
93
+ - README.markdown
94
+ - Rakefile
95
+ - features/requests.feature
96
+ - features/step_definitions/rack_jekyll_steps.rb
97
+ - features/support/env.rb
78
98
  - lib/rack/jekyll.rb
79
- - lib/rack/jekyll/test.rb
99
+ - lib/rack/jekyll/ext.rb
80
100
  - lib/rack/jekyll/helpers.rb
81
101
  - lib/rack/jekyll/version.rb
82
- - lib/rack/jekyll/ext.rb
83
- homepage: http://github.com/adaoraul/rack-jekyll
102
+ - rack-jekyll.gemspec
103
+ - test/helper.rb
104
+ - test/source/_config.yml
105
+ - test/source/_posts/2015-10-05-hello-world.md
106
+ - test/source/buenos_dias.md
107
+ - test/source/css/test.css
108
+ - test/source/index.md
109
+ - test/source/js/test.js
110
+ - test/source/js/test.min.js
111
+ - test/test_build.rb
112
+ - test/test_configuration.rb
113
+ - test/test_requests.rb
114
+ homepage: https://github.com/adaoraul/rack-jekyll
84
115
  licenses: []
116
+ metadata: {}
85
117
  post_install_message:
86
- rdoc_options: []
118
+ rdoc_options:
119
+ - "--charset=UTF-8"
120
+ - "--main=README.markdown"
87
121
  require_paths:
88
122
  - lib
89
123
  required_ruby_version: !ruby/object:Gem::Requirement
90
- none: false
91
124
  requirements:
92
- - - ! '>='
125
+ - - ">="
93
126
  - !ruby/object:Gem::Version
94
127
  version: '0'
95
- segments:
96
- - 0
97
- hash: -1218847350686625781
98
128
  required_rubygems_version: !ruby/object:Gem::Requirement
99
- none: false
100
129
  requirements:
101
- - - ! '>='
130
+ - - ">="
102
131
  - !ruby/object:Gem::Version
103
132
  version: 1.3.6
104
133
  requirements: []
105
134
  rubyforge_project: rack-jekyll
106
- rubygems_version: 1.8.23
135
+ rubygems_version: 2.4.5.1
107
136
  signing_key:
108
- specification_version: 3
109
- summary: rack-jekyll
110
- test_files: []
137
+ specification_version: 4
138
+ summary: Transform your Jekyll app into a Rack application.
139
+ test_files:
140
+ - test/helper.rb
141
+ - test/source/_config.yml
142
+ - test/source/_posts/2015-10-05-hello-world.md
143
+ - test/source/buenos_dias.md
144
+ - test/source/css/test.css
145
+ - test/source/index.md
146
+ - test/source/js/test.js
147
+ - test/source/js/test.min.js
148
+ - test/test_build.rb
149
+ - test/test_configuration.rb
150
+ - test/test_requests.rb
151
+ - features/requests.feature
152
+ - features/step_definitions/rack_jekyll_steps.rb
153
+ - features/support/env.rb
@@ -1,43 +0,0 @@
1
- require "rack"
2
- require "rack/request"
3
- require "rack/response"
4
- require File.join(File.dirname(__FILE__), 'ext')
5
-
6
- module Rack
7
- class Jekyll
8
- class Test
9
- def initialize
10
- @files = %w{_fake/ _fake/index.html _fake/3/2/1/helloworld/index.html _fake/css/test.css _fake/js/test.js _fake/js/test.min.js}
11
- @mimes = Rack::Mime::MIME_TYPES.reject{|k,v|k=~%r{html?}}.map{|k,v|%r{#{k.gsub('.','\.')}$}i}
12
- end
13
-
14
- def call(env)
15
- request = Request.new(env)
16
- path_info = "_fake" + request.path_info
17
- if @files.include?(path_info)
18
- if path_info =~ /(\/?)$/
19
- if @mimes.collect {|regex| path_info =~ regex }.compact.empty?
20
- path_info += $1.nil? ? "/index.html" : "index.html"
21
- end
22
- end
23
- mime = mime(path_info)
24
- body = "Jekyll/Rack"
25
- time = "Thu, 01 Apr 2010 15:27:52 GMT"
26
- if time == request.env['HTTP_IF_MODIFIED_SINCE']
27
- [304, {'Last-Modified' => time}, []]
28
- else
29
- [200, {"Content-Type" => mime, "Content-length" => body.bytesize.to_s, "Last-Modified" => "Thu, 01 Apr 2010 15:27:52 GMT"}, [body]]
30
- end
31
- else
32
- status, body, path_info = [404,"Not found","404.html"]
33
- mime = mime(path_info)
34
- [status, {"Content-Type" => mime, "Content-Type" => body.bytesize.to_s}, [body]]
35
- end
36
- end
37
- def mime(path_info)
38
- ext = $1 if path_info =~ /(\.[\S&&[^.]]+)$/
39
- Mime.mime_type((ext.nil? ? ".html" : ext))
40
- end
41
- end
42
- end
43
- end