New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Refactor collections_dir feature for consistency #6685
Changes from all commits
a09b646
39d0bad
2af6834
f4daf2e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
Feature: Collections Directory | ||
As a hacker who likes to structure content without clutter | ||
I want to be able to organize my collections under a single directory | ||
And render them from there | ||
|
||
Scenario: Custom collections_dir containing only posts | ||
And I have a collections/_posts directory | ||
And I have the following post within the "collections" directory: | ||
| title | date | content | | ||
| Gathered Post | 2009-03-27 | Random Content. | | ||
And I have a "_config.yml" file with content: | ||
""" | ||
collections_dir: collections | ||
""" | ||
When I run jekyll build | ||
Then I should get a zero exit status | ||
And the _site directory should exist | ||
And I should see "Random Content." in "_site/2009/03/27/gathered-post.html" | ||
|
||
Scenario: Rendered collection in custom collections_dir also containing posts | ||
Given I have a collections/_puppies directory | ||
And I have the following document under the "puppies" collection within the "collections" directory: | ||
| title | date | content | | ||
| Rover | 2007-12-31 | content for Rover. | | ||
And I have a collections/_posts directory | ||
And I have the following post within the "collections" directory: | ||
| title | date | content | | ||
| Gathered Post | 2009-03-27 | Random Content. | | ||
And I have a "_config.yml" file with content: | ||
""" | ||
collections: | ||
puppies: | ||
output: true | ||
|
||
collections_dir: collections | ||
""" | ||
When I run jekyll build | ||
Then I should get a zero exit status | ||
And the _site directory should exist | ||
And the "_site/puppies/rover.html" file should exist | ||
And I should see "Random Content." in "_site/2009/03/27/gathered-post.html" | ||
|
||
Scenario: Rendered collection in custom collections_dir with posts at the site root | ||
Given I have a collections/_puppies directory | ||
And I have the following document under the "puppies" collection within the "collections" directory: | ||
| title | date | content | | ||
| Rover | 2007-12-31 | content for Rover. | | ||
And I have a _posts directory | ||
And I have the following post: | ||
| title | date | content | | ||
| Post At Root | 2009-03-27 | Random Content. | | ||
And I have a "_config.yml" file with content: | ||
""" | ||
collections: | ||
puppies: | ||
output: true | ||
|
||
collections_dir: collections | ||
""" | ||
When I run jekyll build | ||
Then I should get a zero exit status | ||
And the _site directory should exist | ||
And the "_site/puppies/rover.html" file should exist | ||
And the "_site/2009/03/27/post-at-root.html" file should not exist | ||
And the _site/_posts directory should not exist | ||
|
||
Scenario: Rendered collection in custom collections_dir also containing drafts | ||
Given I have a collections/_puppies directory | ||
And I have the following document under the "puppies" collection within the "collections" directory: | ||
| title | date | content | | ||
| Rover | 2007-12-31 | content for Rover. | | ||
And I have a collections/_drafts directory | ||
And I have the following draft within the "collections" directory: | ||
| title | date | content | | ||
| Gathered Draft | 2009-03-27 | Random Content. | | ||
And I have a "_config.yml" file with content: | ||
""" | ||
collections: | ||
puppies: | ||
output: true | ||
|
||
collections_dir: collections | ||
""" | ||
When I run jekyll build --drafts | ||
Then I should get a zero exit status | ||
And the _site directory should exist | ||
And the "_site/puppies/rover.html" file should exist | ||
And I should see "Random Content." in "_site/2009/03/27/gathered-draft.html" | ||
And the _site/collections directory should not exist | ||
|
||
Scenario: Rendered collection in custom collections_dir with drafts at the site root | ||
Given I have a collections/_puppies directory | ||
And I have the following document under the "puppies" collection within the "collections" directory: | ||
| title | date | content | | ||
| Rover | 2007-12-31 | content for Rover. | | ||
And I have a _drafts directory | ||
And I have the following draft: | ||
| title | date | content | | ||
| Draft At Root | 2009-03-27 | Random Content. | | ||
And I have a "_config.yml" file with content: | ||
""" | ||
collections: | ||
puppies: | ||
output: true | ||
|
||
collections_dir: collections | ||
""" | ||
When I run jekyll build --drafts | ||
Then I should get a zero exit status | ||
And the _site directory should exist | ||
And the "_site/puppies/rover.html" file should exist | ||
And the "_site/2009/03/27/draft-at-root.html" file should not exist | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
|
||
Scenario: A complex site with collections posts and drafts at various locations | ||
Given I have a gathering/_puppies directory | ||
And I have a gathering/_posts directory | ||
And I have a gathering/_drafts directory | ||
And I have a _puppies directory | ||
And I have a _posts directory | ||
And I have a _drafts directory | ||
And I have the following document under the "puppies" collection within the "gathering" directory: | ||
| title | date | content | | ||
| Rover in Gathering | 2007-12-31 | content for Rover. | | ||
And I have the following document under the puppies collection: | ||
| title | date | content | | ||
| Rover At Root | 2007-12-31 | content for Rover. | | ||
And I have the following post within the "gathering" directory: | ||
| title | date | content | | ||
| Post in Gathering | 2009-03-27 | Totally nothing. | | ||
And I have the following post: | ||
| title | date | content | | ||
| Post At Root | 2009-03-27 | Totally nothing. | | ||
And I have the following draft within the "gathering" directory: | ||
| title | date | content | | ||
| Draft In Gathering | 2009-03-27 | This is a draft. | | ||
And I have the following draft: | ||
| title | date | content | | ||
| Draft At Root | 2009-03-27 | This is a draft. | | ||
And I have a "_config.yml" file with content: | ||
""" | ||
collections: | ||
puppies: | ||
output: true | ||
|
||
collections_dir: gathering | ||
""" | ||
And I have a "gathering/_puppies/static_file.txt" file that contains "Static content." | ||
And I have a gathering/_puppies/nested directory | ||
And I have a "gathering/_puppies/nested/static_file.txt" file that contains "Nested Static content." | ||
When I run jekyll build --drafts | ||
Then I should get a zero exit status | ||
And the _site directory should exist | ||
And the "_site/puppies/rover-in-gathering.html" file should exist | ||
And the "_site/2009/03/27/post-in-gathering.html" file should exist | ||
And the "_site/2009/03/27/draft-in-gathering.html" file should exist | ||
And the "_site/2009/03/27/draft-at-root.html" file should not exist | ||
And the "_site/puppies/rover-at-root.html" file should not exist | ||
And I should see exactly "Static content." in "_site/puppies/static_file.txt" | ||
And I should see exactly "Nested Static content." in "_site/puppies/nested/static_file.txt" | ||
And the _site/gathering directory should not exist | ||
And the _site/_posts directory should not exist |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -95,6 +95,20 @@ | |
|
||
# | ||
|
||
Given(%r!^I have the following (draft|post)s? within the "(.*)" directory:$!) do |type, folder, table| | ||
table.hashes.each do |input_hash| | ||
title = slug(input_hash["title"]) | ||
parsed_date = Time.xmlschema(input_hash["date"]) rescue Time.parse(input_hash["date"]) | ||
|
||
filename = type == "draft" ? "#{title}.markdown" : "#{parsed_date.strftime("%Y-%m-%d")}-#{title}.markdown" | ||
|
||
path = File.join(folder, "_#{type}s", filename) | ||
File.write(path, file_content_from_hash(input_hash)) | ||
end | ||
end | ||
|
||
# | ||
|
||
Given(%r!^I have the following documents? under the (.*) collection:$!) do |folder, table| | ||
table.hashes.each do |input_hash| | ||
title = slug(input_hash["title"]) | ||
|
@@ -108,6 +122,16 @@ | |
|
||
# | ||
|
||
Given(%r!^I have the following documents? under the "(.*)" collection within the "(.*)" directory:$!) do |label, dir, table| | ||
table.hashes.each do |input_hash| | ||
title = slug(input_hash["title"]) | ||
path = File.join(dir, "_#{label}", "#{title}.md") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Any reason why you chose There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. only because that's how our default site gets created from |
||
File.write(path, file_content_from_hash(input_hash)) | ||
end | ||
end | ||
|
||
# | ||
|
||
Given(%r!^I have a configuration file with "(.*)" set to "(.*)"$!) do |key, value| | ||
config = \ | ||
if source_dir.join("_config.yml").exist? | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -95,14 +95,13 @@ def filtered_entries | |||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
# The directory for this Collection, relative to the site source. | ||||||||||||||||||||||||||||
# The directory for this Collection, relative to the site source or the directory | ||||||||||||||||||||||||||||
# containing the collection. | ||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||
# Returns a String containing the directory name where the collection | ||||||||||||||||||||||||||||
# is stored on the filesystem. | ||||||||||||||||||||||||||||
def relative_directory | ||||||||||||||||||||||||||||
@relative_directory ||= Pathname.new(directory).relative_path_from( | ||||||||||||||||||||||||||||
Pathname.new(site.source) | ||||||||||||||||||||||||||||
).to_s | ||||||||||||||||||||||||||||
@relative_directory ||= "_#{label}" | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should be relative to the site source, so if source is There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Things that're going to break if Lines 32 to 36 in f77d704
Lines 76 to 79 in f77d704
Lines 121 to 124 in f77d704
|
||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
# The full path to the directory containing the collection. | ||||||||||||||||||||||||||||
|
@@ -111,7 +110,7 @@ def relative_directory | |||||||||||||||||||||||||||
# is stored on the filesystem. | ||||||||||||||||||||||||||||
def directory | ||||||||||||||||||||||||||||
@directory ||= site.in_source_dir( | ||||||||||||||||||||||||||||
File.join(site.config["collections_dir"], "_#{label}") | ||||||||||||||||||||||||||||
File.join(container, relative_directory) | ||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
|
@@ -125,7 +124,7 @@ def directory | |||||||||||||||||||||||||||
# is stored on the filesystem. | ||||||||||||||||||||||||||||
def collection_dir(*files) | ||||||||||||||||||||||||||||
return directory if files.empty? | ||||||||||||||||||||||||||||
site.in_source_dir(relative_directory, *files) | ||||||||||||||||||||||||||||
site.in_source_dir(container, relative_directory, *files) | ||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
# Checks whether the directory "exists" for this collection. | ||||||||||||||||||||||||||||
|
@@ -204,6 +203,12 @@ def extract_metadata | |||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
private | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
def container | ||||||||||||||||||||||||||||
@container ||= site.config["collections_dir"] | ||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
private | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
def read_document(full_path) | ||||||||||||||||||||||||||||
doc = Jekyll::Document.new(full_path, :site => site, :collection => self) | ||||||||||||||||||||||||||||
doc.read | ||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Woof, this is going to screw people up. We can't enforce that the
_posts
directory is in thecollections_dir
until 4.0, if we even want to.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
its not.. we just released this feature in
3.7.0
.. The sooner we ship this patch, the lesser no.of users gonna have issues..