monad 0.0.1
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.
- data/CONTRIBUTING.md +68 -0
- data/Gemfile +2 -0
- data/LICENSE +21 -0
- data/README.md +88 -0
- data/Rakefile +136 -0
- data/bin/monad +102 -0
- data/cucumber.yml +3 -0
- data/features/create_sites.feature +112 -0
- data/features/data_sources.feature +76 -0
- data/features/drafts.feature +25 -0
- data/features/embed_filters.feature +60 -0
- data/features/markdown.feature +30 -0
- data/features/pagination.feature +54 -0
- data/features/permalinks.feature +65 -0
- data/features/post_data.feature +214 -0
- data/features/site_configuration.feature +206 -0
- data/features/site_data.feature +101 -0
- data/features/step_definitions/monad_steps.rb +175 -0
- data/features/support/env.rb +25 -0
- data/lib/monad.rb +90 -0
- data/lib/monad/command.rb +27 -0
- data/lib/monad/commands/build.rb +64 -0
- data/lib/monad/commands/doctor.rb +29 -0
- data/lib/monad/commands/new.rb +50 -0
- data/lib/monad/commands/serve.rb +33 -0
- data/lib/monad/configuration.rb +183 -0
- data/lib/monad/converter.rb +48 -0
- data/lib/monad/converters/identity.rb +21 -0
- data/lib/monad/converters/markdown.rb +43 -0
- data/lib/monad/converters/markdown/kramdown_parser.rb +44 -0
- data/lib/monad/converters/markdown/maruku_parser.rb +47 -0
- data/lib/monad/converters/markdown/rdiscount_parser.rb +35 -0
- data/lib/monad/converters/markdown/redcarpet_parser.rb +70 -0
- data/lib/monad/converters/textile.rb +50 -0
- data/lib/monad/convertible.rb +152 -0
- data/lib/monad/core_ext.rb +68 -0
- data/lib/monad/deprecator.rb +32 -0
- data/lib/monad/draft.rb +35 -0
- data/lib/monad/drivers/json_driver.rb +39 -0
- data/lib/monad/drivers/yaml_driver.rb +23 -0
- data/lib/monad/errors.rb +4 -0
- data/lib/monad/filters.rb +154 -0
- data/lib/monad/generator.rb +4 -0
- data/lib/monad/generators/pagination.rb +143 -0
- data/lib/monad/layout.rb +42 -0
- data/lib/monad/logger.rb +54 -0
- data/lib/monad/mime.types +85 -0
- data/lib/monad/page.rb +163 -0
- data/lib/monad/plugin.rb +75 -0
- data/lib/monad/post.rb +377 -0
- data/lib/monad/site.rb +455 -0
- data/lib/monad/static_file.rb +70 -0
- data/lib/monad/tags/gist.rb +30 -0
- data/lib/monad/tags/highlight.rb +85 -0
- data/lib/monad/tags/include.rb +37 -0
- data/lib/monad/tags/post_url.rb +61 -0
- data/lib/site_template/.gitignore +1 -0
- data/lib/site_template/_config.yml +2 -0
- data/lib/site_template/_layouts/default.html +46 -0
- data/lib/site_template/_layouts/post.html +9 -0
- data/lib/site_template/_posts/0000-00-00-welcome-to-monad.markdown.erb +24 -0
- data/lib/site_template/css/main.css +165 -0
- data/lib/site_template/css/syntax.css +60 -0
- data/lib/site_template/index.html +13 -0
- data/monad.gemspec +197 -0
- data/script/bootstrap +2 -0
- data/test/fixtures/broken_front_matter1.erb +5 -0
- data/test/fixtures/broken_front_matter2.erb +4 -0
- data/test/fixtures/broken_front_matter3.erb +7 -0
- data/test/fixtures/exploit_front_matter.erb +4 -0
- data/test/fixtures/front_matter.erb +4 -0
- data/test/fixtures/members.yaml +7 -0
- data/test/helper.rb +62 -0
- data/test/source/.htaccess +8 -0
- data/test/source/_includes/sig.markdown +3 -0
- data/test/source/_layouts/default.html +27 -0
- data/test/source/_layouts/simple.html +1 -0
- data/test/source/_plugins/dummy.rb +8 -0
- data/test/source/_posts/2008-02-02-not-published.textile +8 -0
- data/test/source/_posts/2008-02-02-published.textile +8 -0
- data/test/source/_posts/2008-10-18-foo-bar.textile +8 -0
- data/test/source/_posts/2008-11-21-complex.textile +8 -0
- data/test/source/_posts/2008-12-03-permalinked-post.textile +9 -0
- data/test/source/_posts/2008-12-13-include.markdown +8 -0
- data/test/source/_posts/2009-01-27-array-categories.textile +10 -0
- data/test/source/_posts/2009-01-27-categories.textile +7 -0
- data/test/source/_posts/2009-01-27-category.textile +7 -0
- data/test/source/_posts/2009-01-27-empty-categories.textile +7 -0
- data/test/source/_posts/2009-01-27-empty-category.textile +7 -0
- data/test/source/_posts/2009-03-12-hash-#1.markdown +6 -0
- data/test/source/_posts/2009-05-18-empty-tag.textile +6 -0
- data/test/source/_posts/2009-05-18-empty-tags.textile +6 -0
- data/test/source/_posts/2009-05-18-tag.textile +6 -0
- data/test/source/_posts/2009-05-18-tags.textile +9 -0
- data/test/source/_posts/2009-06-22-empty-yaml.textile +3 -0
- data/test/source/_posts/2009-06-22-no-yaml.textile +1 -0
- data/test/source/_posts/2010-01-08-triple-dash.markdown +5 -0
- data/test/source/_posts/2010-01-09-date-override.textile +7 -0
- data/test/source/_posts/2010-01-09-time-override.textile +7 -0
- data/test/source/_posts/2010-01-09-timezone-override.textile +7 -0
- data/test/source/_posts/2010-01-16-override-data.textile +4 -0
- data/test/source/_posts/2011-04-12-md-extension.md +7 -0
- data/test/source/_posts/2011-04-12-text-extension.text +0 -0
- data/test/source/_posts/2013-01-02-post-excerpt.markdown +14 -0
- data/test/source/_posts/2013-01-12-nil-layout.textile +6 -0
- data/test/source/_posts/2013-01-12-no-layout.textile +5 -0
- data/test/source/_posts/2013-03-19-not-a-post.markdown/.gitkeep +0 -0
- data/test/source/_posts/2013-04-11-custom-excerpt.markdown +10 -0
- data/test/source/_posts/2013-05-10-number-category.textile +7 -0
- data/test/source/_posts/es/2008-11-21-nested.textile +8 -0
- data/test/source/about.html +6 -0
- data/test/source/category/_posts/2008-9-23-categories.textile +6 -0
- data/test/source/contacts.html +5 -0
- data/test/source/contacts/bar.html +5 -0
- data/test/source/contacts/index.html +5 -0
- data/test/source/css/screen.css +76 -0
- data/test/source/deal.with.dots.html +7 -0
- data/test/source/foo/_posts/bar/2008-12-12-topical-post.textile +8 -0
- data/test/source/index.html +22 -0
- data/test/source/sitemap.xml +32 -0
- data/test/source/symlink-test/symlinked-file +22 -0
- data/test/source/win/_posts/2009-05-24-yaml-linebreak.markdown +7 -0
- data/test/source/z_category/_posts/2008-9-23-categories.textile +6 -0
- data/test/suite.rb +11 -0
- data/test/test_command.rb +39 -0
- data/test/test_configuration.rb +137 -0
- data/test/test_convertible.rb +51 -0
- data/test/test_core_ext.rb +88 -0
- data/test/test_filters.rb +102 -0
- data/test/test_generated_site.rb +83 -0
- data/test/test_json_driver.rb +63 -0
- data/test/test_kramdown.rb +35 -0
- data/test/test_new_command.rb +104 -0
- data/test/test_page.rb +193 -0
- data/test/test_pager.rb +115 -0
- data/test/test_post.rb +573 -0
- data/test/test_rdiscount.rb +22 -0
- data/test/test_redcarpet.rb +61 -0
- data/test/test_redcloth.rb +86 -0
- data/test/test_site.rb +374 -0
- data/test/test_tags.rb +310 -0
- data/test/test_yaml_driver.rb +35 -0
- metadata +554 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
Feature: Data Sources
|
|
2
|
+
In order to use external data in my blog
|
|
3
|
+
As a blog's user
|
|
4
|
+
I want to use data sources in my site
|
|
5
|
+
|
|
6
|
+
Scenario: Use JSON data source
|
|
7
|
+
Given I have a "_config.yml" file with content:
|
|
8
|
+
"""
|
|
9
|
+
data_sources:
|
|
10
|
+
- name: jsonip
|
|
11
|
+
url: 'http://jsonip.com/'
|
|
12
|
+
type: json
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
And I have an "index.html" page that contains "{{ site.jsonip.ip }}"
|
|
16
|
+
When I run monad
|
|
17
|
+
Then the "_site/index.html" file should exist
|
|
18
|
+
And I should see "\d+\.\d+\.\d+\.\d+" in "_site/index.html"
|
|
19
|
+
|
|
20
|
+
Scenario: Use YAML data source
|
|
21
|
+
Given I have a "_config.yml" file with content:
|
|
22
|
+
"""
|
|
23
|
+
data_sources:
|
|
24
|
+
- name: languages
|
|
25
|
+
path: _data/languages.yaml
|
|
26
|
+
type: yaml
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
And I have an "index.html" page that contains "{% for language in site.languages %}{{language}}{% endfor %}"
|
|
30
|
+
And I have a _data directory
|
|
31
|
+
And I have a "_data/languages.yaml" file that contains "[java, ruby]"
|
|
32
|
+
When I run monad
|
|
33
|
+
Then the "_site/index.html" file should exist
|
|
34
|
+
And I should see "java" in "_site/index.html"
|
|
35
|
+
And I should see "ruby" in "_site/index.html"
|
|
36
|
+
|
|
37
|
+
Scenario: Support custom data source driver
|
|
38
|
+
Given I have a "_config.yml" file with content:
|
|
39
|
+
"""
|
|
40
|
+
data_sources:
|
|
41
|
+
- name: languages
|
|
42
|
+
path: _data/languages.json
|
|
43
|
+
type: json_fs
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
And I have a _plugins directory
|
|
47
|
+
And I have a "_plugins/json_fs_driver.rb" file with content:
|
|
48
|
+
"""
|
|
49
|
+
require 'json'
|
|
50
|
+
|
|
51
|
+
module Monad
|
|
52
|
+
module Drivers
|
|
53
|
+
class JsonFsDriver
|
|
54
|
+
def initialize(options)
|
|
55
|
+
@path = options['path']
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def load
|
|
59
|
+
JSON.parse(File.read(@path))
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
And I have a _data directory
|
|
67
|
+
And I have a "_data/languages.json" file with content:
|
|
68
|
+
"""
|
|
69
|
+
["java", "ruby"]
|
|
70
|
+
"""
|
|
71
|
+
And I have an "index.html" page that contains "{% for language in site.languages %}{{language}}{% endfor %}"
|
|
72
|
+
When I run monad
|
|
73
|
+
Then the "_site/index.html" file should exist
|
|
74
|
+
And I should see "java" in "_site/index.html"
|
|
75
|
+
And I should see "ruby" in "_site/index.html"
|
|
76
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Feature: Draft Posts
|
|
2
|
+
As a hacker who likes to blog
|
|
3
|
+
I want to be able to preview drafts locally
|
|
4
|
+
In order to see if they look alright before publishing
|
|
5
|
+
|
|
6
|
+
Scenario: Preview a draft
|
|
7
|
+
Given I have a configuration file with "permalink" set to "none"
|
|
8
|
+
And I have a _drafts directory
|
|
9
|
+
And I have the following draft:
|
|
10
|
+
| title | date | layout | content |
|
|
11
|
+
| Recipe | 3/27/2009 | default | Not baked yet. |
|
|
12
|
+
When I run monad with drafts
|
|
13
|
+
Then the _site directory should exist
|
|
14
|
+
And I should see "Not baked yet." in "_site/recipe.html"
|
|
15
|
+
|
|
16
|
+
Scenario: Don't preview a draft
|
|
17
|
+
Given I have a configuration file with "permalink" set to "none"
|
|
18
|
+
And I have an "index.html" page that contains "Totally index"
|
|
19
|
+
And I have a _drafts directory
|
|
20
|
+
And I have the following draft:
|
|
21
|
+
| title | date | layout | content |
|
|
22
|
+
| Recipe | 3/27/2009 | default | Not baked yet. |
|
|
23
|
+
When I run monad
|
|
24
|
+
Then the _site directory should exist
|
|
25
|
+
And the "_site/recipe.html" file should not exist
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
Feature: Embed filters
|
|
2
|
+
As a hacker who likes to blog
|
|
3
|
+
I want to be able to transform text inside a post or page
|
|
4
|
+
In order to perform cool stuff in my posts
|
|
5
|
+
|
|
6
|
+
Scenario: Convert date to XML schema
|
|
7
|
+
Given I have a _posts directory
|
|
8
|
+
And I have a _layouts directory
|
|
9
|
+
And I have the following post:
|
|
10
|
+
| title | date | layout | content |
|
|
11
|
+
| Star Wars | 3/27/2009 | default | These aren't the droids you're looking for. |
|
|
12
|
+
And I have a default layout that contains "{{ site.time | date_to_xmlschema }}"
|
|
13
|
+
When I run monad
|
|
14
|
+
Then the _site directory should exist
|
|
15
|
+
And I should see today's date in "_site/2009/03/27/star-wars.html"
|
|
16
|
+
|
|
17
|
+
Scenario: Escape text for XML
|
|
18
|
+
Given I have a _posts directory
|
|
19
|
+
And I have a _layouts directory
|
|
20
|
+
And I have the following post:
|
|
21
|
+
| title | date | layout | content |
|
|
22
|
+
| Star & Wars | 3/27/2009 | default | These aren't the droids you're looking for. |
|
|
23
|
+
And I have a default layout that contains "{{ page.title | xml_escape }}"
|
|
24
|
+
When I run monad
|
|
25
|
+
Then the _site directory should exist
|
|
26
|
+
And I should see "Star & Wars" in "_site/2009/03/27/star-wars.html"
|
|
27
|
+
|
|
28
|
+
Scenario: Calculate number of words
|
|
29
|
+
Given I have a _posts directory
|
|
30
|
+
And I have a _layouts directory
|
|
31
|
+
And I have the following post:
|
|
32
|
+
| title | date | layout | content |
|
|
33
|
+
| Star Wars | 3/27/2009 | default | These aren't the droids you're looking for. |
|
|
34
|
+
And I have a default layout that contains "{{ content | xml_escape }}"
|
|
35
|
+
When I run monad
|
|
36
|
+
Then the _site directory should exist
|
|
37
|
+
And I should see "7" in "_site/2009/03/27/star-wars.html"
|
|
38
|
+
|
|
39
|
+
Scenario: Convert an array into a sentence
|
|
40
|
+
Given I have a _posts directory
|
|
41
|
+
And I have a _layouts directory
|
|
42
|
+
And I have the following post:
|
|
43
|
+
| title | date | layout | tags | content |
|
|
44
|
+
| Star Wars | 3/27/2009 | default | [scifi, movies, force] | These aren't the droids you're looking for. |
|
|
45
|
+
And I have a default layout that contains "{{ page.tags | array_to_sentence_string }}"
|
|
46
|
+
When I run monad
|
|
47
|
+
Then the _site directory should exist
|
|
48
|
+
And I should see "scifi, movies, and force" in "_site/2009/03/27/star-wars.html"
|
|
49
|
+
|
|
50
|
+
Scenario: Textilize a given string
|
|
51
|
+
Given I have a _posts directory
|
|
52
|
+
And I have a _layouts directory
|
|
53
|
+
And I have the following post:
|
|
54
|
+
| title | date | layout | content |
|
|
55
|
+
| Star Wars | 3/27/2009 | default | These aren't the droids you're looking for. |
|
|
56
|
+
And I have a default layout that contains "By {{ '_Obi-wan_' | textilize }}"
|
|
57
|
+
When I run monad
|
|
58
|
+
Then the _site directory should exist
|
|
59
|
+
And I should see "By <p><em>Obi-wan</em></p>" in "_site/2009/03/27/star-wars.html"
|
|
60
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
Feature: Markdown
|
|
2
|
+
As a hacker who likes to blog
|
|
3
|
+
I want to be able to make a static site
|
|
4
|
+
In order to share my awesome ideas with the interwebs
|
|
5
|
+
|
|
6
|
+
Scenario: Markdown in list on index
|
|
7
|
+
Given I have a configuration file with "paginate" set to "5"
|
|
8
|
+
And I have an "index.html" page that contains "Index - {% for post in site.posts %} {{ post.content }} {% endfor %}"
|
|
9
|
+
And I have a _posts directory
|
|
10
|
+
And I have the following post:
|
|
11
|
+
| title | date | content | type |
|
|
12
|
+
| Hackers | 3/27/2009 | # My Title | markdown |
|
|
13
|
+
When I run monad
|
|
14
|
+
Then the _site directory should exist
|
|
15
|
+
And I should see "Index" in "_site/index.html"
|
|
16
|
+
And I should see "<h1 id='my_title'>My Title</h1>" in "_site/2009/03/27/hackers.html"
|
|
17
|
+
And I should see "<h1 id='my_title'>My Title</h1>" in "_site/index.html"
|
|
18
|
+
|
|
19
|
+
Scenario: Markdown in pagination on index
|
|
20
|
+
Given I have a configuration file with "paginate" set to "5"
|
|
21
|
+
And I have an "index.html" page that contains "Index - {% for post in paginator.posts %} {{ post.content }} {% endfor %}"
|
|
22
|
+
And I have a _posts directory
|
|
23
|
+
And I have the following post:
|
|
24
|
+
| title | date | content | type |
|
|
25
|
+
| Hackers | 3/27/2009 | # My Title | markdown |
|
|
26
|
+
When I run monad
|
|
27
|
+
Then the _site directory should exist
|
|
28
|
+
And I should see "Index" in "_site/index.html"
|
|
29
|
+
And I should see "<h1 id='my_title'>My Title</h1>" in "_site/index.html"
|
|
30
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
Feature: Site pagination
|
|
2
|
+
In order to paginate my blog
|
|
3
|
+
As a blog's user
|
|
4
|
+
I want divide the posts in several pages
|
|
5
|
+
|
|
6
|
+
Scenario Outline: Paginate with N posts per page
|
|
7
|
+
Given I have a configuration file with "paginate" set to "<num>"
|
|
8
|
+
And I have a _layouts directory
|
|
9
|
+
And I have an "index.html" page that contains "{{ paginator.posts.size }}"
|
|
10
|
+
And I have a _posts directory
|
|
11
|
+
And I have the following posts:
|
|
12
|
+
| title | date | layout | content |
|
|
13
|
+
| Wargames | 3/27/2009 | default | The only winning move is not to play. |
|
|
14
|
+
| Wargames2 | 4/27/2009 | default | The only winning move is not to play2. |
|
|
15
|
+
| Wargames3 | 5/27/2009 | default | The only winning move is not to play3. |
|
|
16
|
+
| Wargames4 | 6/27/2009 | default | The only winning move is not to play4. |
|
|
17
|
+
When I run monad
|
|
18
|
+
Then the _site/page<exist> directory should exist
|
|
19
|
+
And the "_site/page<exist>/index.html" file should exist
|
|
20
|
+
And I should see "<posts>" in "_site/page<exist>/index.html"
|
|
21
|
+
And the "_site/page<not_exist>/index.html" file should not exist
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
| num | exist | posts | not_exist |
|
|
25
|
+
| 1 | 4 | 1 | 5 |
|
|
26
|
+
| 2 | 2 | 2 | 3 |
|
|
27
|
+
| 3 | 2 | 1 | 3 |
|
|
28
|
+
|
|
29
|
+
Scenario Outline: Setting a custom pagination path
|
|
30
|
+
Given I have a configuration file with:
|
|
31
|
+
| key | value |
|
|
32
|
+
| paginate | 1 |
|
|
33
|
+
| paginate_path | /blog/page-:num |
|
|
34
|
+
| permalink | /blog/:year/:month/:day/:title |
|
|
35
|
+
And I have a blog directory
|
|
36
|
+
And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}"
|
|
37
|
+
And I have a _posts directory
|
|
38
|
+
And I have the following posts:
|
|
39
|
+
| title | date | layout | content |
|
|
40
|
+
| Wargames | 3/27/2009 | default | The only winning move is not to play. |
|
|
41
|
+
| Wargames2 | 4/27/2009 | default | The only winning move is not to play2. |
|
|
42
|
+
| Wargames3 | 5/27/2009 | default | The only winning move is not to play3. |
|
|
43
|
+
| Wargames4 | 6/27/2009 | default | The only winning move is not to play4. |
|
|
44
|
+
When I run monad
|
|
45
|
+
Then the _site/blog/page-<exist> directory should exist
|
|
46
|
+
And the "_site/blog/page-<exist>/index.html" file should exist
|
|
47
|
+
And I should see "<posts>" in "_site/blog/page-<exist>/index.html"
|
|
48
|
+
And the "_site/blog/page-<not_exist>/index.html" file should not exist
|
|
49
|
+
|
|
50
|
+
Examples:
|
|
51
|
+
| exist | posts | not_exist |
|
|
52
|
+
| 2 | 1 | 5 |
|
|
53
|
+
| 3 | 1 | 6 |
|
|
54
|
+
| 4 | 1 | 7 |
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
Feature: Fancy permalinks
|
|
2
|
+
As a hacker who likes to blog
|
|
3
|
+
I want to be able to set permalinks
|
|
4
|
+
In order to make my blog URLs awesome
|
|
5
|
+
|
|
6
|
+
Scenario: Use none permalink schema
|
|
7
|
+
Given I have a _posts directory
|
|
8
|
+
And I have the following post:
|
|
9
|
+
| title | date | content |
|
|
10
|
+
| None Permalink Schema | 3/27/2009 | Totally nothing. |
|
|
11
|
+
And I have a configuration file with "permalink" set to "none"
|
|
12
|
+
When I run monad
|
|
13
|
+
Then the _site directory should exist
|
|
14
|
+
And I should see "Totally nothing." in "_site/none-permalink-schema.html"
|
|
15
|
+
|
|
16
|
+
Scenario: Use pretty permalink schema
|
|
17
|
+
Given I have a _posts directory
|
|
18
|
+
And I have the following post:
|
|
19
|
+
| title | date | content |
|
|
20
|
+
| Pretty Permalink Schema | 3/27/2009 | Totally wordpress. |
|
|
21
|
+
And I have a configuration file with "permalink" set to "pretty"
|
|
22
|
+
When I run monad
|
|
23
|
+
Then the _site directory should exist
|
|
24
|
+
And I should see "Totally wordpress." in "_site/2009/03/27/pretty-permalink-schema/index.html"
|
|
25
|
+
|
|
26
|
+
Scenario: Use pretty permalink schema for pages
|
|
27
|
+
Given I have an "index.html" page that contains "Totally index"
|
|
28
|
+
And I have an "awesome.html" page that contains "Totally awesome"
|
|
29
|
+
And I have an "sitemap.xml" page that contains "Totally uhm, sitemap"
|
|
30
|
+
And I have a configuration file with "permalink" set to "pretty"
|
|
31
|
+
When I run monad
|
|
32
|
+
Then the _site directory should exist
|
|
33
|
+
And I should see "Totally index" in "_site/index.html"
|
|
34
|
+
And I should see "Totally awesome" in "_site/awesome/index.html"
|
|
35
|
+
And I should see "Totally uhm, sitemap" in "_site/sitemap.xml"
|
|
36
|
+
|
|
37
|
+
Scenario: Use custom permalink schema with prefix
|
|
38
|
+
Given I have a _posts directory
|
|
39
|
+
And I have the following post:
|
|
40
|
+
| title | category | date | content |
|
|
41
|
+
| Custom Permalink Schema | stuff | 3/27/2009 | Totally custom. |
|
|
42
|
+
And I have a configuration file with "permalink" set to "/blog/:year/:month/:day/:title"
|
|
43
|
+
When I run monad
|
|
44
|
+
Then the _site directory should exist
|
|
45
|
+
And I should see "Totally custom." in "_site/blog/2009/03/27/custom-permalink-schema/index.html"
|
|
46
|
+
|
|
47
|
+
Scenario: Use custom permalink schema with category
|
|
48
|
+
Given I have a _posts directory
|
|
49
|
+
And I have the following post:
|
|
50
|
+
| title | category | date | content |
|
|
51
|
+
| Custom Permalink Schema | stuff | 3/27/2009 | Totally custom. |
|
|
52
|
+
And I have a configuration file with "permalink" set to "/:categories/:title.html"
|
|
53
|
+
When I run monad
|
|
54
|
+
Then the _site directory should exist
|
|
55
|
+
And I should see "Totally custom." in "_site/stuff/custom-permalink-schema.html"
|
|
56
|
+
|
|
57
|
+
Scenario: Use custom permalink schema with squished date
|
|
58
|
+
Given I have a _posts directory
|
|
59
|
+
And I have the following post:
|
|
60
|
+
| title | category | date | content |
|
|
61
|
+
| Custom Permalink Schema | stuff | 3/27/2009 | Totally custom. |
|
|
62
|
+
And I have a configuration file with "permalink" set to "/:month-:day-:year/:title.html"
|
|
63
|
+
When I run monad
|
|
64
|
+
Then the _site directory should exist
|
|
65
|
+
And I should see "Totally custom." in "_site/03-27-2009/custom-permalink-schema.html"
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
Feature: Post data
|
|
2
|
+
As a hacker who likes to blog
|
|
3
|
+
I want to be able to embed data into my posts
|
|
4
|
+
In order to make the posts slightly dynamic
|
|
5
|
+
|
|
6
|
+
Scenario: Use post.title variable
|
|
7
|
+
Given I have a _posts directory
|
|
8
|
+
And I have a _layouts directory
|
|
9
|
+
And I have the following post:
|
|
10
|
+
| title | date | layout | content |
|
|
11
|
+
| Star Wars | 3/27/2009 | simple | Luke, I am your father. |
|
|
12
|
+
And I have a simple layout that contains "Post title: {{ page.title }}"
|
|
13
|
+
When I run monad
|
|
14
|
+
Then the _site directory should exist
|
|
15
|
+
And I should see "Post title: Star Wars" in "_site/2009/03/27/star-wars.html"
|
|
16
|
+
|
|
17
|
+
Scenario: Use post.url variable
|
|
18
|
+
Given I have a _posts directory
|
|
19
|
+
And I have a _layouts directory
|
|
20
|
+
And I have the following post:
|
|
21
|
+
| title | date | layout | content |
|
|
22
|
+
| Star Wars | 3/27/2009 | simple | Luke, I am your father. |
|
|
23
|
+
And I have a simple layout that contains "Post url: {{ page.url }}"
|
|
24
|
+
When I run monad
|
|
25
|
+
Then the _site directory should exist
|
|
26
|
+
And I should see "Post url: /2009/03/27/star-wars.html" in "_site/2009/03/27/star-wars.html"
|
|
27
|
+
|
|
28
|
+
Scenario: Use post.date variable
|
|
29
|
+
Given I have a _posts directory
|
|
30
|
+
And I have a _layouts directory
|
|
31
|
+
And I have the following post:
|
|
32
|
+
| title | date | layout | content |
|
|
33
|
+
| Star Wars | 3/27/2009 | simple | Luke, I am your father. |
|
|
34
|
+
And I have a simple layout that contains "Post date: {{ page.date | date_to_string }}"
|
|
35
|
+
When I run monad
|
|
36
|
+
Then the _site directory should exist
|
|
37
|
+
And I should see "Post date: 27 Mar 2009" in "_site/2009/03/27/star-wars.html"
|
|
38
|
+
|
|
39
|
+
Scenario: Use post.id variable
|
|
40
|
+
Given I have a _posts directory
|
|
41
|
+
And I have a _layouts directory
|
|
42
|
+
And I have the following post:
|
|
43
|
+
| title | date | layout | content |
|
|
44
|
+
| Star Wars | 3/27/2009 | simple | Luke, I am your father. |
|
|
45
|
+
And I have a simple layout that contains "Post id: {{ page.id }}"
|
|
46
|
+
When I run monad
|
|
47
|
+
Then the _site directory should exist
|
|
48
|
+
And I should see "Post id: /2009/03/27/star-wars" in "_site/2009/03/27/star-wars.html"
|
|
49
|
+
|
|
50
|
+
Scenario: Use post.content variable
|
|
51
|
+
Given I have a _posts directory
|
|
52
|
+
And I have a _layouts directory
|
|
53
|
+
And I have the following post:
|
|
54
|
+
| title | date | layout | content |
|
|
55
|
+
| Star Wars | 3/27/2009 | simple | Luke, I am your father. |
|
|
56
|
+
And I have a simple layout that contains "Post content: {{ content }}"
|
|
57
|
+
When I run monad
|
|
58
|
+
Then the _site directory should exist
|
|
59
|
+
And I should see "Post content: <p>Luke, I am your father.</p>" in "_site/2009/03/27/star-wars.html"
|
|
60
|
+
|
|
61
|
+
Scenario: Use post.categories variable when category is in a folder
|
|
62
|
+
Given I have a movies directory
|
|
63
|
+
And I have a movies/_posts directory
|
|
64
|
+
And I have a _layouts directory
|
|
65
|
+
And I have the following post in "movies":
|
|
66
|
+
| title | date | layout | content |
|
|
67
|
+
| Star Wars | 3/27/2009 | simple | Luke, I am your father. |
|
|
68
|
+
And I have a simple layout that contains "Post category: {{ page.categories }}"
|
|
69
|
+
When I run monad
|
|
70
|
+
Then the _site directory should exist
|
|
71
|
+
And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
|
|
72
|
+
|
|
73
|
+
Scenario: Use post.tags variable
|
|
74
|
+
Given I have a _posts directory
|
|
75
|
+
And I have a _layouts directory
|
|
76
|
+
And I have the following post:
|
|
77
|
+
| title | date | layout | tag | content |
|
|
78
|
+
| Star Wars | 5/18/2009 | simple | twist | Luke, I am your father. |
|
|
79
|
+
And I have a simple layout that contains "Post tags: {{ page.tags }}"
|
|
80
|
+
When I run monad
|
|
81
|
+
Then the _site directory should exist
|
|
82
|
+
And I should see "Post tags: twist" in "_site/2009/05/18/star-wars.html"
|
|
83
|
+
|
|
84
|
+
Scenario: Use post.categories variable when categories are in folders
|
|
85
|
+
Given I have a scifi directory
|
|
86
|
+
And I have a scifi/movies directory
|
|
87
|
+
And I have a scifi/movies/_posts directory
|
|
88
|
+
And I have a _layouts directory
|
|
89
|
+
And I have the following post in "scifi/movies":
|
|
90
|
+
| title | date | layout | content |
|
|
91
|
+
| Star Wars | 3/27/2009 | simple | Luke, I am your father. |
|
|
92
|
+
And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
|
|
93
|
+
When I run monad
|
|
94
|
+
Then the _site directory should exist
|
|
95
|
+
And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
|
|
96
|
+
|
|
97
|
+
Scenario: Use post.categories variable when categories are in folders with mixed case
|
|
98
|
+
Given I have a scifi directory
|
|
99
|
+
And I have a scifi/Movies directory
|
|
100
|
+
And I have a scifi/Movies/_posts directory
|
|
101
|
+
And I have a _layouts directory
|
|
102
|
+
And I have the following post in "scifi/Movies":
|
|
103
|
+
| title | date | layout | content |
|
|
104
|
+
| Star Wars | 3/27/2009 | simple | Luke, I am your father. |
|
|
105
|
+
And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
|
|
106
|
+
When I run monad
|
|
107
|
+
Then the _site directory should exist
|
|
108
|
+
And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
|
|
109
|
+
|
|
110
|
+
Scenario: Use post.categories variable when category is in YAML
|
|
111
|
+
Given I have a _posts directory
|
|
112
|
+
And I have a _layouts directory
|
|
113
|
+
And I have the following post:
|
|
114
|
+
| title | date | layout | category | content |
|
|
115
|
+
| Star Wars | 3/27/2009 | simple | movies | Luke, I am your father. |
|
|
116
|
+
And I have a simple layout that contains "Post category: {{ page.categories }}"
|
|
117
|
+
When I run monad
|
|
118
|
+
Then the _site directory should exist
|
|
119
|
+
And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
|
|
120
|
+
|
|
121
|
+
Scenario: Use post.categories variable when category is in YAML and is mixed-case
|
|
122
|
+
Given I have a _posts directory
|
|
123
|
+
And I have a _layouts directory
|
|
124
|
+
And I have the following post:
|
|
125
|
+
| title | date | layout | category | content |
|
|
126
|
+
| Star Wars | 3/27/2009 | simple | Movies | Luke, I am your father. |
|
|
127
|
+
And I have a simple layout that contains "Post category: {{ page.categories }}"
|
|
128
|
+
When I run monad
|
|
129
|
+
Then the _site directory should exist
|
|
130
|
+
And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
|
|
131
|
+
|
|
132
|
+
Scenario: Use post.categories variable when category is in YAML
|
|
133
|
+
Given I have a _posts directory
|
|
134
|
+
And I have a _layouts directory
|
|
135
|
+
And I have the following post:
|
|
136
|
+
| title | date | layout | category | content |
|
|
137
|
+
| Star Wars | 3/27/2009 | simple | movies | Luke, I am your father. |
|
|
138
|
+
And I have a simple layout that contains "Post category: {{ page.categories }}"
|
|
139
|
+
When I run monad
|
|
140
|
+
Then the _site directory should exist
|
|
141
|
+
And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
|
|
142
|
+
|
|
143
|
+
Scenario: Use post.categories variable when categories are in YAML with mixed case
|
|
144
|
+
Given I have a _posts directory
|
|
145
|
+
And I have a _layouts directory
|
|
146
|
+
And I have the following posts:
|
|
147
|
+
| title | date | layout | categories | content |
|
|
148
|
+
| Star Wars | 3/27/2009 | simple | ['scifi', 'Movies'] | Luke, I am your father. |
|
|
149
|
+
| Star Trek | 3/17/2013 | simple | ['SciFi', 'movies'] | Jean Luc, I am your father. |
|
|
150
|
+
And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
|
|
151
|
+
When I run monad
|
|
152
|
+
Then the _site directory should exist
|
|
153
|
+
And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
|
|
154
|
+
And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2013/03/17/star-trek.html"
|
|
155
|
+
|
|
156
|
+
Scenario Outline: Use page.path variable
|
|
157
|
+
Given I have a <dir>/_posts directory
|
|
158
|
+
And I have the following post in "<dir>":
|
|
159
|
+
| title | type | date | content |
|
|
160
|
+
| my-post | html | 4/12/2013 | Source path: {{ page.path }} |
|
|
161
|
+
When I run monad
|
|
162
|
+
Then the _site directory should exist
|
|
163
|
+
And I should see "Source path: <path_prefix>_posts/2013-04-12-my-post.html" in "_site/<dir>/2013/04/12/my-post.html"
|
|
164
|
+
|
|
165
|
+
Examples:
|
|
166
|
+
| dir | path_prefix |
|
|
167
|
+
| . | |
|
|
168
|
+
| dir | dir/ |
|
|
169
|
+
| dir/nested | dir/nested/ |
|
|
170
|
+
|
|
171
|
+
Scenario: Override page.path variable
|
|
172
|
+
Given I have a _posts directory
|
|
173
|
+
And I have the following post:
|
|
174
|
+
| title | date | path | content |
|
|
175
|
+
| override | 4/12/2013 | override-path.html | Custom path: {{ page.path }} |
|
|
176
|
+
When I run monad
|
|
177
|
+
Then the _site directory should exist
|
|
178
|
+
And I should see "Custom path: override-path.html" in "_site/2013/04/12/override.html"
|
|
179
|
+
|
|
180
|
+
Scenario: Disable a post from being published
|
|
181
|
+
Given I have a _posts directory
|
|
182
|
+
And I have an "index.html" file that contains "Published!"
|
|
183
|
+
And I have the following post:
|
|
184
|
+
| title | date | layout | published | content |
|
|
185
|
+
| Star Wars | 3/27/2009 | simple | false | Luke, I am your father. |
|
|
186
|
+
When I run monad
|
|
187
|
+
Then the _site directory should exist
|
|
188
|
+
And the "_site/2009/03/27/star-wars.html" file should not exist
|
|
189
|
+
And I should see "Published!" in "_site/index.html"
|
|
190
|
+
|
|
191
|
+
Scenario: Use a custom variable
|
|
192
|
+
Given I have a _posts directory
|
|
193
|
+
And I have a _layouts directory
|
|
194
|
+
And I have the following post:
|
|
195
|
+
| title | date | layout | author | content |
|
|
196
|
+
| Star Wars | 3/27/2009 | simple | Darth Vader | Luke, I am your father. |
|
|
197
|
+
And I have a simple layout that contains "Post author: {{ page.author }}"
|
|
198
|
+
When I run monad
|
|
199
|
+
Then the _site directory should exist
|
|
200
|
+
And I should see "Post author: Darth Vader" in "_site/2009/03/27/star-wars.html"
|
|
201
|
+
|
|
202
|
+
Scenario: Previous and next posts title
|
|
203
|
+
Given I have a _posts directory
|
|
204
|
+
And I have a _layouts directory
|
|
205
|
+
And I have the following posts:
|
|
206
|
+
| title | date | layout | author | content |
|
|
207
|
+
| Star Wars | 3/27/2009 | ordered | Darth Vader | Luke, I am your father. |
|
|
208
|
+
| Some like it hot | 4/27/2009 | ordered | Osgood | Nobody is perfect. |
|
|
209
|
+
| Terminator | 5/27/2009 | ordered | Arnold | Sayonara, baby |
|
|
210
|
+
And I have a ordered layout that contains "Previous post: {{ page.previous.title }} and next post: {{ page.next.title }}"
|
|
211
|
+
When I run monad
|
|
212
|
+
Then the _site directory should exist
|
|
213
|
+
And I should see "next post: Some like it hot" in "_site/2009/03/27/star-wars.html"
|
|
214
|
+
And I should see "Previous post: Some like it hot" in "_site/2009/05/27/terminator.html"
|