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.
Files changed (143) hide show
  1. data/CONTRIBUTING.md +68 -0
  2. data/Gemfile +2 -0
  3. data/LICENSE +21 -0
  4. data/README.md +88 -0
  5. data/Rakefile +136 -0
  6. data/bin/monad +102 -0
  7. data/cucumber.yml +3 -0
  8. data/features/create_sites.feature +112 -0
  9. data/features/data_sources.feature +76 -0
  10. data/features/drafts.feature +25 -0
  11. data/features/embed_filters.feature +60 -0
  12. data/features/markdown.feature +30 -0
  13. data/features/pagination.feature +54 -0
  14. data/features/permalinks.feature +65 -0
  15. data/features/post_data.feature +214 -0
  16. data/features/site_configuration.feature +206 -0
  17. data/features/site_data.feature +101 -0
  18. data/features/step_definitions/monad_steps.rb +175 -0
  19. data/features/support/env.rb +25 -0
  20. data/lib/monad.rb +90 -0
  21. data/lib/monad/command.rb +27 -0
  22. data/lib/monad/commands/build.rb +64 -0
  23. data/lib/monad/commands/doctor.rb +29 -0
  24. data/lib/monad/commands/new.rb +50 -0
  25. data/lib/monad/commands/serve.rb +33 -0
  26. data/lib/monad/configuration.rb +183 -0
  27. data/lib/monad/converter.rb +48 -0
  28. data/lib/monad/converters/identity.rb +21 -0
  29. data/lib/monad/converters/markdown.rb +43 -0
  30. data/lib/monad/converters/markdown/kramdown_parser.rb +44 -0
  31. data/lib/monad/converters/markdown/maruku_parser.rb +47 -0
  32. data/lib/monad/converters/markdown/rdiscount_parser.rb +35 -0
  33. data/lib/monad/converters/markdown/redcarpet_parser.rb +70 -0
  34. data/lib/monad/converters/textile.rb +50 -0
  35. data/lib/monad/convertible.rb +152 -0
  36. data/lib/monad/core_ext.rb +68 -0
  37. data/lib/monad/deprecator.rb +32 -0
  38. data/lib/monad/draft.rb +35 -0
  39. data/lib/monad/drivers/json_driver.rb +39 -0
  40. data/lib/monad/drivers/yaml_driver.rb +23 -0
  41. data/lib/monad/errors.rb +4 -0
  42. data/lib/monad/filters.rb +154 -0
  43. data/lib/monad/generator.rb +4 -0
  44. data/lib/monad/generators/pagination.rb +143 -0
  45. data/lib/monad/layout.rb +42 -0
  46. data/lib/monad/logger.rb +54 -0
  47. data/lib/monad/mime.types +85 -0
  48. data/lib/monad/page.rb +163 -0
  49. data/lib/monad/plugin.rb +75 -0
  50. data/lib/monad/post.rb +377 -0
  51. data/lib/monad/site.rb +455 -0
  52. data/lib/monad/static_file.rb +70 -0
  53. data/lib/monad/tags/gist.rb +30 -0
  54. data/lib/monad/tags/highlight.rb +85 -0
  55. data/lib/monad/tags/include.rb +37 -0
  56. data/lib/monad/tags/post_url.rb +61 -0
  57. data/lib/site_template/.gitignore +1 -0
  58. data/lib/site_template/_config.yml +2 -0
  59. data/lib/site_template/_layouts/default.html +46 -0
  60. data/lib/site_template/_layouts/post.html +9 -0
  61. data/lib/site_template/_posts/0000-00-00-welcome-to-monad.markdown.erb +24 -0
  62. data/lib/site_template/css/main.css +165 -0
  63. data/lib/site_template/css/syntax.css +60 -0
  64. data/lib/site_template/index.html +13 -0
  65. data/monad.gemspec +197 -0
  66. data/script/bootstrap +2 -0
  67. data/test/fixtures/broken_front_matter1.erb +5 -0
  68. data/test/fixtures/broken_front_matter2.erb +4 -0
  69. data/test/fixtures/broken_front_matter3.erb +7 -0
  70. data/test/fixtures/exploit_front_matter.erb +4 -0
  71. data/test/fixtures/front_matter.erb +4 -0
  72. data/test/fixtures/members.yaml +7 -0
  73. data/test/helper.rb +62 -0
  74. data/test/source/.htaccess +8 -0
  75. data/test/source/_includes/sig.markdown +3 -0
  76. data/test/source/_layouts/default.html +27 -0
  77. data/test/source/_layouts/simple.html +1 -0
  78. data/test/source/_plugins/dummy.rb +8 -0
  79. data/test/source/_posts/2008-02-02-not-published.textile +8 -0
  80. data/test/source/_posts/2008-02-02-published.textile +8 -0
  81. data/test/source/_posts/2008-10-18-foo-bar.textile +8 -0
  82. data/test/source/_posts/2008-11-21-complex.textile +8 -0
  83. data/test/source/_posts/2008-12-03-permalinked-post.textile +9 -0
  84. data/test/source/_posts/2008-12-13-include.markdown +8 -0
  85. data/test/source/_posts/2009-01-27-array-categories.textile +10 -0
  86. data/test/source/_posts/2009-01-27-categories.textile +7 -0
  87. data/test/source/_posts/2009-01-27-category.textile +7 -0
  88. data/test/source/_posts/2009-01-27-empty-categories.textile +7 -0
  89. data/test/source/_posts/2009-01-27-empty-category.textile +7 -0
  90. data/test/source/_posts/2009-03-12-hash-#1.markdown +6 -0
  91. data/test/source/_posts/2009-05-18-empty-tag.textile +6 -0
  92. data/test/source/_posts/2009-05-18-empty-tags.textile +6 -0
  93. data/test/source/_posts/2009-05-18-tag.textile +6 -0
  94. data/test/source/_posts/2009-05-18-tags.textile +9 -0
  95. data/test/source/_posts/2009-06-22-empty-yaml.textile +3 -0
  96. data/test/source/_posts/2009-06-22-no-yaml.textile +1 -0
  97. data/test/source/_posts/2010-01-08-triple-dash.markdown +5 -0
  98. data/test/source/_posts/2010-01-09-date-override.textile +7 -0
  99. data/test/source/_posts/2010-01-09-time-override.textile +7 -0
  100. data/test/source/_posts/2010-01-09-timezone-override.textile +7 -0
  101. data/test/source/_posts/2010-01-16-override-data.textile +4 -0
  102. data/test/source/_posts/2011-04-12-md-extension.md +7 -0
  103. data/test/source/_posts/2011-04-12-text-extension.text +0 -0
  104. data/test/source/_posts/2013-01-02-post-excerpt.markdown +14 -0
  105. data/test/source/_posts/2013-01-12-nil-layout.textile +6 -0
  106. data/test/source/_posts/2013-01-12-no-layout.textile +5 -0
  107. data/test/source/_posts/2013-03-19-not-a-post.markdown/.gitkeep +0 -0
  108. data/test/source/_posts/2013-04-11-custom-excerpt.markdown +10 -0
  109. data/test/source/_posts/2013-05-10-number-category.textile +7 -0
  110. data/test/source/_posts/es/2008-11-21-nested.textile +8 -0
  111. data/test/source/about.html +6 -0
  112. data/test/source/category/_posts/2008-9-23-categories.textile +6 -0
  113. data/test/source/contacts.html +5 -0
  114. data/test/source/contacts/bar.html +5 -0
  115. data/test/source/contacts/index.html +5 -0
  116. data/test/source/css/screen.css +76 -0
  117. data/test/source/deal.with.dots.html +7 -0
  118. data/test/source/foo/_posts/bar/2008-12-12-topical-post.textile +8 -0
  119. data/test/source/index.html +22 -0
  120. data/test/source/sitemap.xml +32 -0
  121. data/test/source/symlink-test/symlinked-file +22 -0
  122. data/test/source/win/_posts/2009-05-24-yaml-linebreak.markdown +7 -0
  123. data/test/source/z_category/_posts/2008-9-23-categories.textile +6 -0
  124. data/test/suite.rb +11 -0
  125. data/test/test_command.rb +39 -0
  126. data/test/test_configuration.rb +137 -0
  127. data/test/test_convertible.rb +51 -0
  128. data/test/test_core_ext.rb +88 -0
  129. data/test/test_filters.rb +102 -0
  130. data/test/test_generated_site.rb +83 -0
  131. data/test/test_json_driver.rb +63 -0
  132. data/test/test_kramdown.rb +35 -0
  133. data/test/test_new_command.rb +104 -0
  134. data/test/test_page.rb +193 -0
  135. data/test/test_pager.rb +115 -0
  136. data/test/test_post.rb +573 -0
  137. data/test/test_rdiscount.rb +22 -0
  138. data/test/test_redcarpet.rb +61 -0
  139. data/test/test_redcloth.rb +86 -0
  140. data/test/test_site.rb +374 -0
  141. data/test/test_tags.rb +310 -0
  142. data/test/test_yaml_driver.rb +35 -0
  143. metadata +554 -0
@@ -0,0 +1,206 @@
1
+ Feature: Site configuration
2
+ As a hacker who likes to blog
3
+ I want to be able to configure monad
4
+ In order to make setting up a site easier
5
+
6
+ Scenario: Change source directory
7
+ Given I have a blank site in "_sourcedir"
8
+ And I have an "_sourcedir/index.html" file that contains "Changing source directory"
9
+ And I have a configuration file with "source" set to "_sourcedir"
10
+ When I run monad
11
+ Then the _site directory should exist
12
+ And I should see "Changing source directory" in "_site/index.html"
13
+
14
+ Scenario: Change destination directory
15
+ Given I have an "index.html" file that contains "Changing destination directory"
16
+ And I have a configuration file with "destination" set to "_mysite"
17
+ When I run monad
18
+ Then the _mysite directory should exist
19
+ And I should see "Changing destination directory" in "_mysite/index.html"
20
+
21
+ Scenario: Exclude files inline
22
+ Given I have an "Rakefile" file that contains "I want to be excluded"
23
+ And I have an "README" file that contains "I want to be excluded"
24
+ And I have an "index.html" file that contains "I want to be included"
25
+ And I have a configuration file with "exclude" set to "['Rakefile', 'README']"
26
+ When I run monad
27
+ Then I should see "I want to be included" in "_site/index.html"
28
+ And the "_site/Rakefile" file should not exist
29
+ And the "_site/README" file should not exist
30
+
31
+ Scenario: Exclude files with YAML array
32
+ Given I have an "Rakefile" file that contains "I want to be excluded"
33
+ And I have an "README" file that contains "I want to be excluded"
34
+ And I have an "index.html" file that contains "I want to be included"
35
+ And I have a configuration file with "exclude" set to:
36
+ | value |
37
+ | README |
38
+ | Rakefile |
39
+ When I run monad
40
+ Then I should see "I want to be included" in "_site/index.html"
41
+ And the "_site/Rakefile" file should not exist
42
+ And the "_site/README" file should not exist
43
+
44
+ Scenario: Use RDiscount for markup
45
+ Given I have an "index.markdown" page that contains "[Google](http://google.com)"
46
+ And I have a configuration file with "markdown" set to "rdiscount"
47
+ When I run monad
48
+ Then the _site directory should exist
49
+ And I should see "<a href="http://google.com">Google</a>" in "_site/index.html"
50
+
51
+ Scenario: Use Kramdown for markup
52
+ Given I have an "index.markdown" page that contains "[Google](http://google.com)"
53
+ And I have a configuration file with "markdown" set to "kramdown"
54
+ When I run monad
55
+ Then the _site directory should exist
56
+ And I should see "<a href="http://google.com">Google</a>" in "_site/index.html"
57
+
58
+ Scenario: Use Redcarpet for markup
59
+ Given I have an "index.markdown" page that contains "[Google](http://google.com)"
60
+ And I have a configuration file with "markdown" set to "redcarpet"
61
+ When I run monad
62
+ Then the _site directory should exist
63
+ And I should see "<a href="http://google.com">Google</a>" in "_site/index.html"
64
+
65
+ Scenario: Use Maruku for markup
66
+ Given I have an "index.markdown" page that contains "[Google](http://google.com)"
67
+ And I have a configuration file with "markdown" set to "maruku"
68
+ When I run monad
69
+ Then the _site directory should exist
70
+ And I should see "<a href='http://google.com'>Google</a>" in "_site/index.html"
71
+
72
+ Scenario: Highlight code with pygments
73
+ Given I have an "index.html" file that contains "{% highlight ruby %} puts 'Hello world!' {% endhighlight %}"
74
+ And I have a configuration file with "pygments" set to "true"
75
+ When I run monad
76
+ Then the _site directory should exist
77
+ And I should see "puts 'Hello world!'" in "_site/index.html"
78
+
79
+ Scenario: Set time and no future dated posts
80
+ Given I have a _layouts directory
81
+ And I have a page layout that contains "Page Layout: {{ site.posts.size }} on {{ site.time | date: "%Y-%m-%d" }}"
82
+ And I have a post layout that contains "Post Layout: {{ content }}"
83
+ And I have an "index.html" page with layout "page" that contains "site index page"
84
+ And I have a configuration file with:
85
+ | key | value |
86
+ | time | 2010-01-01 |
87
+ | future | false |
88
+ And I have a _posts directory
89
+ And I have the following posts:
90
+ | title | date | layout | content |
91
+ | entry1 | 12/31/2007 | post | content for entry1. |
92
+ | entry2 | 01/31/2020 | post | content for entry2. |
93
+ When I run monad
94
+ Then the _site directory should exist
95
+ And I should see "Page Layout: 1 on 2010-01-01" in "_site/index.html"
96
+ And I should see "Post Layout: <p>content for entry1.</p>" in "_site/2007/12/31/entry1.html"
97
+ And the "_site/2020/01/31/entry2.html" file should not exist
98
+
99
+ Scenario: Set time and future dated posts allowed
100
+ Given I have a _layouts directory
101
+ And I have a page layout that contains "Page Layout: {{ site.posts.size }} on {{ site.time | date: "%Y-%m-%d" }}"
102
+ And I have a post layout that contains "Post Layout: {{ content }}"
103
+ And I have an "index.html" page with layout "page" that contains "site index page"
104
+ And I have a configuration file with:
105
+ | key | value |
106
+ | time | 2010-01-01 |
107
+ | future | true |
108
+ And I have a _posts directory
109
+ And I have the following posts:
110
+ | title | date | layout | content |
111
+ | entry1 | 12/31/2007 | post | content for entry1. |
112
+ | entry2 | 01/31/2020 | post | content for entry2. |
113
+ When I run monad
114
+ Then the _site directory should exist
115
+ And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html"
116
+ And I should see "Post Layout: <p>content for entry1.</p>" in "_site/2007/12/31/entry1.html"
117
+ And I should see "Post Layout: <p>content for entry2.</p>" in "_site/2020/01/31/entry2.html"
118
+
119
+ Scenario: Generate proper dates with explicitly set timezone (same as posts' time)
120
+ Given I have a _layouts directory
121
+ And I have a page layout that contains "Page Layout: {{ site.posts.size }}"
122
+ And I have a post layout that contains "Post Layout: {{ content }} built at {{ page.date | date_to_xmlschema }}"
123
+ And I have an "index.html" page with layout "page" that contains "site index page"
124
+ And I have a configuration file with:
125
+ | key | value |
126
+ | timezone | America/New_York |
127
+ And I have a _posts directory
128
+ And I have the following posts:
129
+ | title | date | layout | content |
130
+ | entry1 | 2013-04-09 23:22 -0400 | post | content for entry1. |
131
+ | entry2 | 2013-04-10 03:14 -0400 | post | content for entry2. |
132
+ When I run monad
133
+ Then the _site directory should exist
134
+ And I should see "Page Layout: 2" in "_site/index.html"
135
+ And I should see "Post Layout: <p>content for entry1.</p> built at 2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html"
136
+ And I should see "Post Layout: <p>content for entry2.</p> built at 2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html"
137
+
138
+ Scenario: Generate proper dates with explicitly set timezone (different than posts' time)
139
+ Given I have a _layouts directory
140
+ And I have a page layout that contains "Page Layout: {{ site.posts.size }}"
141
+ And I have a post layout that contains "Post Layout: {{ content }} built at {{ page.date | date_to_xmlschema }}"
142
+ And I have an "index.html" page with layout "page" that contains "site index page"
143
+ And I have a configuration file with:
144
+ | key | value |
145
+ | timezone | Australia/Melbourne |
146
+ And I have a _posts directory
147
+ And I have the following posts:
148
+ | title | date | layout | content |
149
+ | entry1 | 2013-04-09 23:22 -0400 | post | content for entry1. |
150
+ | entry2 | 2013-04-10 03:14 -0400 | post | content for entry2. |
151
+ When I run monad
152
+ Then the _site directory should exist
153
+ And I should see "Page Layout: 2" in "_site/index.html"
154
+ And the "_site/2013/04/10/entry1.html" file should exist
155
+ And the "_site/2013/04/10/entry2.html" file should exist
156
+ And I should see escaped "Post Layout: <p>content for entry1.</p> built at 2013-04-10T13:22:00+10:00" in "_site/2013/04/10/entry1.html"
157
+ And I should see escaped "Post Layout: <p>content for entry2.</p> built at 2013-04-10T17:14:00+10:00" in "_site/2013/04/10/entry2.html"
158
+
159
+ Scenario: Limit the number of posts generated by most recent date
160
+ Given I have a _posts directory
161
+ And I have a configuration file with:
162
+ | key | value |
163
+ | limit_posts | 2 |
164
+ And I have the following posts:
165
+ | title | date | content |
166
+ | Apples | 3/27/2009 | An article about apples |
167
+ | Oranges | 4/1/2009 | An article about oranges |
168
+ | Bananas | 4/5/2009 | An article about bananas |
169
+ When I run monad
170
+ Then the _site directory should exist
171
+ And the "_site/2009/04/05/bananas.html" file should exist
172
+ And the "_site/2009/04/01/oranges.html" file should exist
173
+ And the "_site/2009/03/27/apples.html" file should not exist
174
+
175
+ Scenario: Copy over normally excluded files when they are explicitly included
176
+ Given I have a ".gitignore" file that contains ".DS_Store"
177
+ And I have an ".htaccess" file that contains "SomeDirective"
178
+ And I have a configuration file with "include" set to:
179
+ | value |
180
+ | .gitignore |
181
+ | .foo |
182
+ When I run monad
183
+ Then the _site directory should exist
184
+ And I should see ".DS_Store" in "_site/.gitignore"
185
+ And the "_site/.htaccess" file should not exist
186
+
187
+ Scenario: Using a different layouts directory
188
+ Given I have a _theme directory
189
+ And I have a page theme that contains "Page Layout: {{ site.posts.size }} on {{ site.time | date: "%Y-%m-%d" }}"
190
+ And I have a post theme that contains "Post Layout: {{ content }}"
191
+ And I have an "index.html" page with layout "page" that contains "site index page"
192
+ And I have a configuration file with:
193
+ | key | value |
194
+ | time | 2010-01-01 |
195
+ | future | true |
196
+ | layouts | _theme |
197
+ And I have a _posts directory
198
+ And I have the following posts:
199
+ | title | date | layout | content |
200
+ | entry1 | 12/31/2007 | post | content for entry1. |
201
+ | entry2 | 01/31/2020 | post | content for entry2. |
202
+ When I run monad
203
+ Then the _site directory should exist
204
+ And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html"
205
+ And I should see "Post Layout: <p>content for entry1.</p>" in "_site/2007/12/31/entry1.html"
206
+ And I should see "Post Layout: <p>content for entry2.</p>" in "_site/2020/01/31/entry2.html"
@@ -0,0 +1,101 @@
1
+ Feature: Site data
2
+ As a hacker who likes to blog
3
+ I want to be able to embed data into my site
4
+ In order to make the site slightly dynamic
5
+
6
+ Scenario: Use page variable in a page
7
+ Given I have an "contact.html" page with title "Contact" that contains "{{ page.title }}: email@me.com"
8
+ When I run monad
9
+ Then the _site directory should exist
10
+ And I should see "Contact: email@me.com" in "_site/contact.html"
11
+
12
+ Scenario Outline: Use page.path variable in a page
13
+ Given I have a <dir> directory
14
+ And I have a "<path>" page that contains "Source path: {{ page.path }}"
15
+ When I run monad
16
+ Then the _site directory should exist
17
+ And I should see "Source path: <path>" in "_site/<path>"
18
+
19
+ Examples:
20
+ | dir | path |
21
+ | . | index.html |
22
+ | dir | dir/about.html |
23
+ | dir/nested | dir/nested/page.html |
24
+
25
+ Scenario: Override page.path
26
+ Given I have an "override.html" page with path "custom-override.html" that contains "Custom path: {{ page.path }}"
27
+ When I run monad
28
+ Then the _site directory should exist
29
+ And I should see "Custom path: custom-override.html" in "_site/override.html"
30
+
31
+ Scenario: Use site.time variable
32
+ Given I have an "index.html" page that contains "{{ site.time }}"
33
+ When I run monad
34
+ Then the _site directory should exist
35
+ And I should see today's time in "_site/index.html"
36
+
37
+ Scenario: Use site.posts variable for latest post
38
+ Given I have a _posts directory
39
+ And I have an "index.html" page that contains "{{ site.posts.first.title }}: {{ site.posts.first.url }}"
40
+ And I have the following posts:
41
+ | title | date | content |
42
+ | First Post | 3/25/2009 | My First Post |
43
+ | Second Post | 3/26/2009 | My Second Post |
44
+ | Third Post | 3/27/2009 | My Third Post |
45
+ When I run monad
46
+ Then the _site directory should exist
47
+ And I should see "Third Post: /2009/03/27/third-post.html" in "_site/index.html"
48
+
49
+ Scenario: Use site.posts variable in a loop
50
+ Given I have a _posts directory
51
+ And I have an "index.html" page that contains "{% for post in site.posts %} {{ post.title }} {% endfor %}"
52
+ And I have the following posts:
53
+ | title | date | content |
54
+ | First Post | 3/25/2009 | My First Post |
55
+ | Second Post | 3/26/2009 | My Second Post |
56
+ | Third Post | 3/27/2009 | My Third Post |
57
+ When I run monad
58
+ Then the _site directory should exist
59
+ And I should see "Third Post Second Post First Post" in "_site/index.html"
60
+
61
+ Scenario: Use site.categories.code variable
62
+ Given I have a _posts directory
63
+ And I have an "index.html" page that contains "{% for post in site.categories.code %} {{ post.title }} {% endfor %}"
64
+ And I have the following posts:
65
+ | title | date | category | content |
66
+ | Awesome Hack | 3/26/2009 | code | puts 'Hello World' |
67
+ | Delicious Beer | 3/26/2009 | food | 1) Yuengling |
68
+ When I run monad
69
+ Then the _site directory should exist
70
+ And I should see "Awesome Hack" in "_site/index.html"
71
+
72
+ Scenario: Use site.tags variable
73
+ Given I have a _posts directory
74
+ And I have an "index.html" page that contains "{% for post in site.tags.beer %} {{ post.content }} {% endfor %}"
75
+ And I have the following posts:
76
+ | title | date | tag | content |
77
+ | Delicious Beer | 3/26/2009 | beer | 1) Yuengling |
78
+ When I run monad
79
+ Then the _site directory should exist
80
+ And I should see "Yuengling" in "_site/index.html"
81
+
82
+ Scenario: Order Posts by name when on the same date
83
+ Given I have a _posts directory
84
+ And I have an "index.html" page that contains "{% for post in site.posts %}{{ post.title }}:{{ post.previous.title}},{{ post.next.title}} {% endfor %}"
85
+ And I have the following posts:
86
+ | title | date | content |
87
+ | first | 2/26/2009 | first |
88
+ | A | 3/26/2009 | A |
89
+ | B | 3/26/2009 | B |
90
+ | C | 3/26/2009 | C |
91
+ | last | 4/26/2009 | last |
92
+ When I run monad
93
+ Then the _site directory should exist
94
+ And I should see "last:C, C:B,last B:A,C A:first,B first:,A" in "_site/index.html"
95
+
96
+ Scenario: Use configuration date in site payload
97
+ Given I have an "index.html" page that contains "{{ site.url }}"
98
+ And I have a configuration file with "url" set to "http://mysite.com"
99
+ When I run monad
100
+ Then the _site directory should exist
101
+ And I should see "http://mysite.com" in "_site/index.html"
@@ -0,0 +1,175 @@
1
+ Before do
2
+ FileUtils.rm_rf(TEST_DIR)
3
+ FileUtils.mkdir(TEST_DIR)
4
+ Dir.chdir(TEST_DIR)
5
+ end
6
+
7
+ After do
8
+ Dir.chdir(File.expand_path("..", TEST_DIR))
9
+ FileUtils.rm_rf(TEST_DIR)
10
+ end
11
+
12
+ Given /^I have a blank site in "(.*)"$/ do |path|
13
+ FileUtils.mkdir(path)
14
+ end
15
+
16
+ # Like "I have a foo file" but gives a yaml front matter so monad actually processes it
17
+ Given /^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$/ do |file, key, value, text|
18
+ File.open(file, 'w') do |f|
19
+ f.write <<EOF
20
+ ---
21
+ #{key || 'layout'}: #{value || 'nil'}
22
+ ---
23
+ #{text}
24
+ EOF
25
+ end
26
+ end
27
+
28
+ Given /^I have an? "(.*)" file that contains "(.*)"$/ do |file, text|
29
+ File.open(file, 'w') do |f|
30
+ f.write(text)
31
+ end
32
+ end
33
+
34
+ Given /^I have an? "(.*)" file with content:$/ do |file, text|
35
+ File.open(file, 'w') do |f|
36
+ f.write(text)
37
+ end
38
+ end
39
+
40
+ Given /^I have a (.*) layout that contains "(.*)"$/ do |layout, text|
41
+ File.open(File.join('_layouts', layout + '.html'), 'w') do |f|
42
+ f.write(text)
43
+ end
44
+ end
45
+
46
+ Given /^I have a (.*) theme that contains "(.*)"$/ do |layout, text|
47
+ File.open(File.join('_theme', layout + '.html'), 'w') do |f|
48
+ f.write(text)
49
+ end
50
+ end
51
+
52
+ Given /^I have an? (.*) directory$/ do |dir|
53
+ FileUtils.mkdir_p(dir)
54
+ end
55
+
56
+ Given /^I have the following (draft|post)s?(?: (.*) "(.*)")?:$/ do |status, direction, folder, table|
57
+ table.hashes.each do |post|
58
+ title = post['title'].downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, '-')
59
+
60
+ if direction && direction == "in"
61
+ before = folder || '.'
62
+ elsif direction && direction == "under"
63
+ after = folder || '.'
64
+ end
65
+
66
+ ext = post['type'] || 'textile'
67
+
68
+ if "draft" == status
69
+ path = File.join(before || '.', '_drafts', after || '.', "#{title}.#{ext}")
70
+ else
71
+ format = if has_time_component?(post['date'])
72
+ '%Y-%m-%d %H:%M %z'
73
+ else
74
+ '%m/%d/%Y' # why even
75
+ end
76
+ parsed_date = DateTime.strptime(post['date'], format)
77
+ post['date'] = parsed_date.to_s
78
+ date = parsed_date.strftime('%Y-%m-%d')
79
+ path = File.join(before || '.', '_posts', after || '.', "#{date}-#{title}.#{ext}")
80
+ end
81
+
82
+ matter_hash = {}
83
+ %w(title layout tag tags category categories published author path).each do |key|
84
+ matter_hash[key] = post[key] if post[key]
85
+ end
86
+ if "post" == status
87
+ matter_hash["date"] = post["date"] if post["date"]
88
+ end
89
+ matter = matter_hash.map { |k, v| "#{k}: #{v}\n" }.join.chomp
90
+
91
+ content = post['content']
92
+ if post['input'] && post['filter']
93
+ content = "{{ #{post['input']} | #{post['filter']} }}"
94
+ end
95
+
96
+ File.open(path, 'w') do |f|
97
+ f.write <<EOF
98
+ ---
99
+ #{matter}
100
+ ---
101
+ #{content}
102
+ EOF
103
+ end
104
+ end
105
+ end
106
+
107
+ Given /^I have a configuration file with "(.*)" set to "(.*)"$/ do |key, value|
108
+ File.open('_config.yml', 'w') do |f|
109
+ f.write("#{key}: #{value}\n")
110
+ end
111
+ end
112
+
113
+ Given /^I have a configuration file with:$/ do |table|
114
+ File.open('_config.yml', 'w') do |f|
115
+ table.hashes.each do |row|
116
+ f.write("#{row["key"]}: #{row["value"]}\n")
117
+ end
118
+ end
119
+ end
120
+
121
+ Given /^I have a configuration file with "([^\"]*)" set to:$/ do |key, table|
122
+ File.open('_config.yml', 'w') do |f|
123
+ f.write("#{key}:\n")
124
+ table.hashes.each do |row|
125
+ f.write("- #{row["value"]}\n")
126
+ end
127
+ end
128
+ end
129
+
130
+
131
+ When /^I run monad$/ do
132
+ run_monad
133
+ end
134
+
135
+ When /^I run monad with drafts$/ do
136
+ run_monad(:drafts => true)
137
+ end
138
+
139
+ When /^I debug monad$/ do
140
+ run_monad(:debug => true)
141
+ end
142
+
143
+ When /^I change "(.*)" to contain "(.*)"$/ do |file, text|
144
+ File.open(file, 'a') do |f|
145
+ f.write(text)
146
+ end
147
+ end
148
+
149
+ Then /^the (.*) directory should exist$/ do |dir|
150
+ assert File.directory?(dir), "The directory \"#{dir}\" does not exist"
151
+ end
152
+
153
+ Then /^I should see "(.*)" in "(.*)"$/ do |text, file|
154
+ assert Regexp.new(text).match(File.open(file).readlines.join)
155
+ end
156
+
157
+ Then /^I should see escaped "(.*)" in "(.*)"$/ do |text, file|
158
+ assert Regexp.new(Regexp.escape(text)).match(File.open(file).readlines.join)
159
+ end
160
+
161
+ Then /^the "(.*)" file should exist$/ do |file|
162
+ assert File.file?(file)
163
+ end
164
+
165
+ Then /^the "(.*)" file should not exist$/ do |file|
166
+ assert !File.exists?(file)
167
+ end
168
+
169
+ Then /^I should see today's time in "(.*)"$/ do |file|
170
+ assert_match Regexp.new(Regexp.escape(Time.now.to_s)), File.open(file).readlines.join
171
+ end
172
+
173
+ Then /^I should see today's date in "(.*)"$/ do |file|
174
+ assert_match Regexp.new(Date.today.to_s), File.open(file).readlines.join
175
+ end