serif 0.5.2 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +58 -21
  4. data/LICENSE +1 -1
  5. data/README.md +11 -13
  6. data/lib/serif.rb +3 -2
  7. data/lib/serif/admin_server.rb +10 -10
  8. data/lib/serif/commands.rb +2 -2
  9. data/lib/serif/config.rb +1 -1
  10. data/lib/serif/content_file.rb +9 -9
  11. data/lib/serif/draft.rb +1 -1
  12. data/lib/serif/errors.rb +1 -1
  13. data/lib/serif/markup_renderer.rb +28 -17
  14. data/lib/serif/post.rb +1 -1
  15. data/lib/serif/server.rb +1 -1
  16. data/lib/serif/site.rb +5 -29
  17. data/rakefile +3 -6
  18. data/serif.gemspec +9 -3
  19. data/statics/assets/js/attachment.js +3 -3
  20. data/statics/skeleton/_config.yml +1 -1
  21. data/statics/skeleton/_layouts/default.html +1 -1
  22. data/statics/skeleton/_templates/archive_page.html +1 -1
  23. data/statics/skeleton/_templates/post.html +1 -1
  24. data/statics/skeleton/archive.html +1 -1
  25. data/statics/skeleton/index.html +1 -1
  26. data/statics/templates/admin/bookmarks.liquid +1 -1
  27. data/statics/templates/admin/edit_draft.liquid +1 -1
  28. data/statics/templates/admin/index.liquid +1 -1
  29. data/statics/templates/admin/layout.liquid +6 -4
  30. data/statics/templates/admin/new_draft.liquid +1 -1
  31. metadata +123 -127
  32. data/test/commands_spec.rb +0 -77
  33. data/test/config_spec.rb +0 -55
  34. data/test/content_file_spec.rb +0 -113
  35. data/test/draft_spec.rb +0 -275
  36. data/test/file_digest_tag_spec.rb +0 -38
  37. data/test/filters_spec.rb +0 -90
  38. data/test/liquid_filter_date_extension_spec.rb +0 -15
  39. data/test/markup_renderer_spec.rb +0 -47
  40. data/test/post_spec.rb +0 -139
  41. data/test/site_dir/_config.yml +0 -18
  42. data/test/site_dir/_drafts/another-sample-draft +0 -3
  43. data/test/site_dir/_drafts/sample-draft +0 -3
  44. data/test/site_dir/_layouts/alt-layout.html +0 -3
  45. data/test/site_dir/_layouts/default.html +0 -8
  46. data/test/site_dir/_posts/2012-01-05-sample-post +0 -4
  47. data/test/site_dir/_posts/2013-01-01-second-post +0 -4
  48. data/test/site_dir/_posts/2013-03-07-post-with-custom-layout +0 -5
  49. data/test/site_dir/_posts/2399-01-01-penultimate-post +0 -4
  50. data/test/site_dir/_posts/2400-01-01-final-post +0 -4
  51. data/test/site_dir/_templates/archive_page.html +0 -9
  52. data/test/site_dir/_templates/post.html +0 -10
  53. data/test/site_dir/archive.html +0 -7
  54. data/test/site_dir/file-digest-test.html +0 -4
  55. data/test/site_dir/index.html +0 -9
  56. data/test/site_dir/page-alt-layout.html +0 -3
  57. data/test/site_dir/page-header-but-no-layout.html +0 -3
  58. data/test/site_dir/test-smarty-filter.html +0 -3
  59. data/test/site_dir/test-stylesheet.css +0 -3
  60. data/test/site_generation_spec.rb +0 -204
  61. data/test/site_spec.rb +0 -189
  62. data/test/test_helper.rb +0 -61
@@ -1,38 +0,0 @@
1
- require "test_helper"
2
-
3
- describe Serif::FileDigest do
4
- def file_digest(markup)
5
- Serif::FileDigest.new("file_digest", markup, "no tokens needed")
6
- end
7
-
8
- before :each do
9
- site = Serif::Site.new(testing_dir)
10
- @context = { "site" => { "directory" => site.directory }}
11
- end
12
-
13
- describe "#render" do
14
- it "returns the md5 hex digest of the finally deployed site path" do
15
- file_digest("test-stylesheet.css").render(@context).should == "f8390232f0c354a871f9ba0ed306163c"
16
- end
17
-
18
- it "ignores leading slashes" do
19
- file_digest("/test-stylesheet.css").render(@context).should == "f8390232f0c354a871f9ba0ed306163c"
20
- end
21
-
22
- it "ignores surrounding whitespace" do
23
- file_digest(" test-stylesheet.css ").render(@context).should == "f8390232f0c354a871f9ba0ed306163c"
24
- end
25
-
26
- it "includes a prefix if one is specified" do
27
- file_digest("test-stylesheet.css prefix:.").render(@context).should == ".f8390232f0c354a871f9ba0ed306163c"
28
- end
29
-
30
- it "ignores trailing whitespace on the prefix" do
31
- file_digest("test-stylesheet.css prefix:. ").render(@context).should == ".f8390232f0c354a871f9ba0ed306163c"
32
- end
33
-
34
- it "raises a SyntaxError on invalid syntax" do
35
- expect { file_digest("test-stylesheet.css pefoiejw").render(@context) }.to raise_error(SyntaxError)
36
- end
37
- end
38
- end
@@ -1,90 +0,0 @@
1
- require "test_helper"
2
-
3
- describe Serif::Filters do
4
- subject do
5
- o = Object.new
6
- o.extend(Serif::Filters)
7
- o
8
- end
9
-
10
- describe "#strip" do
11
- it "calls strip on its argument" do
12
- double = double("")
13
- double.should_receive(:strip).once
14
- subject.strip(double)
15
-
16
- s = " foo "
17
- subject.strip(s).should == s.strip
18
- end
19
- end
20
-
21
- describe "#smarty" do
22
- it "runs the input through a SmartyPants processor" do
23
- subject.smarty("Testing").should == "Testing"
24
- subject.smarty("Testing's").should == "Testing’s"
25
- subject.smarty("\"Testing\" some \"text's\" input...").should == "“Testing” some “text’s” input…"
26
- end
27
-
28
- it "does not do any markdown processing" do
29
- subject.smarty("# Heading").should == "# Heading"
30
- subject.smarty("Testing `code blocks` input").should == "Testing `code blocks` input"
31
- end
32
-
33
- it "deals with HTML appropriately" do
34
- subject.smarty("<p>Testing's <span>span</span> testing</p>").should == "<p>Testing&rsquo;s <span>span</span> testing</p>"
35
- end
36
- end
37
-
38
- describe "#encode_uri_component" do
39
- it "percent-encodes various characters for use in a URI" do
40
- {
41
- " " => "+",
42
- "!" => "%21",
43
- "$" => "%24",
44
- "&" => "%26",
45
- "'" => "%27",
46
- "(" => "%28",
47
- ")" => "%29",
48
- "*" => "%2A",
49
- "+" => "%2B",
50
- "/" => "%2F",
51
- ":" => "%3A",
52
- ";" => "%3B",
53
- "=" => "%3D",
54
- "?" => "%3F",
55
- "@" => "%40",
56
- "[" => "%5B",
57
- "]" => "%5D",
58
- "~" => "%7E"
59
- }.each do |char, enc_char|
60
- subject.encode_uri_component(char).should == enc_char
61
- end
62
- end
63
-
64
- it "returns an empty string on nil input" do
65
- subject.encode_uri_component(nil).should == ""
66
- end
67
- end
68
-
69
- describe "#xmlschema" do
70
- it "calls xmlschema on its input" do
71
- d = double("")
72
- d.should_receive(:xmlschema).once
73
- subject.xmlschema(d)
74
-
75
- subject.xmlschema(Time.parse("2012-01-01")).should == "2012-01-01T00:00:00+00:00"
76
- subject.xmlschema(Time.parse("2012-01-01").utc).should == "2012-01-01T00:00:00Z"
77
- end
78
- end
79
-
80
- describe "#markdown" do
81
- it "processes its input as markdown" do
82
- # bit of a stub test
83
- subject.markdown("# Hi!").should == "<h1>Hi!</h1>\n"
84
- end
85
-
86
- it "uses curly single quotes properly" do
87
- subject.markdown("# something's test").should include("something&rsquo;s")
88
- end
89
- end
90
- end
@@ -1,15 +0,0 @@
1
- require "test_helper"
2
-
3
- describe Liquid::StandardFilters do
4
- subject do
5
- o = Object.new
6
- o.extend(Liquid::StandardFilters)
7
- o
8
- end
9
-
10
- describe "#date" do
11
- it "accepts 'now' for the current time" do
12
- subject.date("now", "%Y").should == Time.now.year.to_s
13
- end
14
- end
15
- end
@@ -1,47 +0,0 @@
1
- require "test_helper"
2
-
3
- describe Serif::MarkupRenderer do
4
- subject do
5
- Redcarpet::Markdown.new(Serif::MarkupRenderer, fenced_code_blocks: true)
6
- end
7
-
8
- it "renders language-free code blocks correctly" do
9
- subject.render(<<END_SOURCE).should == <<END_OUTPUT.chomp
10
- foo
11
-
12
- ```
13
- some code
14
- ```
15
- END_SOURCE
16
- <p>foo</p>
17
- <pre><code>some code
18
- </code></pre>
19
- END_OUTPUT
20
- end
21
-
22
- it "renders code blocks with a language correctly" do
23
- subject.render(<<END_SOURCE).should == <<END_OUTPUT
24
- foo
25
-
26
- ```ruby
27
- foo
28
- ```
29
- END_SOURCE
30
- <p>foo</p>
31
- <pre class="highlight"><code><span class="n">foo</span>
32
- </code></pre>
33
- END_OUTPUT
34
- end
35
-
36
- # NOTE: The output here is not the desired output.
37
- #
38
- # See vmg/redcarpet#57 and note that any filters that use this renderer
39
- # are tested elsewhere.
40
- it "renders quote marks properly" do
41
- subject.render(<<END_SOURCE).should == <<END_OUTPUT
42
- This "very" sentence's structure "isn't" necessary.
43
- END_SOURCE
44
- <p>This &ldquo;very&rdquo; sentence&#39;s structure &ldquo;isn&#39;t&rdquo; necessary.</p>
45
- END_OUTPUT
46
- end
47
- end
@@ -1,139 +0,0 @@
1
- require "test_helper"
2
-
3
- describe Serif::Post do
4
- subject do
5
- Serif::Site.new(testing_dir)
6
- end
7
-
8
- before :each do
9
- @posts = subject.posts
10
- end
11
-
12
- around :each do |example|
13
- begin
14
- d = Serif::Draft.new(subject)
15
- d.slug = "foo-bar-bar-temp"
16
- d.title = "Testing title"
17
- d.save("# some content")
18
- d.publish!
19
- @temporary_post = Serif::Post.new(subject, d.path)
20
-
21
- example.run
22
- ensure
23
- FileUtils.rm(@temporary_post.path)
24
- end
25
- end
26
-
27
- describe "#from_basename" do
28
- it "is nil if there is nothing found" do
29
- Serif::Post.from_basename(subject, "eoijfwoifjweofej").should be_nil
30
- end
31
-
32
- it "takes full filename within _posts" do
33
- Serif::Post.from_basename(subject, @temporary_post.basename).path.should == @temporary_post.path
34
- end
35
- end
36
-
37
- it "uses the config file's permalink value" do
38
- @posts.all? { |p| p.url == "/test-blog/#{p.slug}" }.should be_true
39
- end
40
-
41
- describe "#inspect" do
42
- it "includes headers" do
43
- @posts.all? { |p| p.inspect.should include(p.headers.inspect) }
44
- end
45
- end
46
-
47
- describe "#autoupdate=" do
48
- it "sets the 'update' header to 'now' if truthy assigned value" do
49
- @temporary_post.autoupdate = true
50
- @temporary_post.headers[:update].should == "now"
51
- end
52
-
53
- it "removes the 'update' header entirely if falsey assigned value" do
54
- @temporary_post.autoupdate = false
55
- @temporary_post.headers.key?(:update).should be_false
56
- end
57
-
58
- it "marks the post as autoupdate? == true" do
59
- @temporary_post.autoupdate?.should be_false
60
- @temporary_post.autoupdate = true
61
- @temporary_post.autoupdate?.should be_true
62
- end
63
- end
64
-
65
- describe "#autoupdate?" do
66
- it "returns true if there is an update: now header" do
67
- @temporary_post.stub(:headers) { { :update => "foo" } }
68
- @temporary_post.autoupdate?.should be_false
69
- @temporary_post.stub(:headers) { { :update => "now" } }
70
- @temporary_post.autoupdate?.should be_true
71
- end
72
-
73
- it "is ignorant of whitespace in the update header value" do
74
- @temporary_post.stub(:headers) { { :update => "now" } }
75
- @temporary_post.autoupdate?.should be_true
76
-
77
- (1..3).each do |left|
78
- (1..3).each do |right|
79
- @temporary_post.stub(:headers) { { :update => "#{" " * left}now#{" " * right}"} }
80
- @temporary_post.autoupdate?.should be_true
81
- end
82
- end
83
- end
84
- end
85
-
86
- describe "#update!" do
87
- it "sets the updated header timestamp to the current time" do
88
- old_update_time = @temporary_post.updated
89
- t = Time.now + 50
90
-
91
- Timecop.freeze(t) do
92
- @temporary_post.update!
93
- @temporary_post.updated.should_not == old_update_time
94
- @temporary_post.updated.to_i.should == t.to_i
95
- @temporary_post.headers[:updated].to_i.should == t.to_i
96
- end
97
- end
98
-
99
- it "calls save and writes out the new timestamp value, without a publish: now header" do
100
- @temporary_post.should_receive(:save).once.and_call_original
101
-
102
- t = Time.now + 50
103
- Timecop.freeze(t) do
104
- @temporary_post.update!
105
-
106
- file_content = Redhead::String[File.read(@temporary_post.path)]
107
- Time.parse(file_content.headers[:updated].value).to_i.should == t.to_i
108
- file_content.headers[:publish].should be_nil
109
- end
110
- end
111
-
112
- it "marks the post as no longer auto-updating" do
113
- @temporary_post.autoupdate?.should be_false
114
- @temporary_post.autoupdate = true
115
- @temporary_post.autoupdate?.should be_true
116
- @temporary_post.update!
117
- @temporary_post.autoupdate?.should be_false
118
- end
119
- end
120
-
121
- describe "#to_liquid" do
122
- it "contains the relevant keys" do
123
- liq = subject.posts.sample.to_liquid
124
-
125
- ["title",
126
- "created",
127
- "updated",
128
- "content",
129
- "slug",
130
- "url",
131
- "type",
132
- "draft",
133
- "published",
134
- "basename"].each do |e|
135
- liq.key?(e).should be_true
136
- end
137
- end
138
- end
139
- end
@@ -1,18 +0,0 @@
1
- # This is the Serif config file. It must be a valid YAML document.
2
- #
3
- # Some configuration options:
4
- #
5
- # admin:
6
- # username: [a username for the admin web interface]
7
- # password: [a password for the admin web interface]
8
- # permalink: [permalink format for generated posts]
9
- #
10
- # See the README for information on permalink formats.
11
-
12
- admin:
13
- username: test-changethisusername
14
- password: test-changethispassword
15
- permalink: /test-blog/:title
16
- archive:
17
- enabled: yes
18
- url_format: /test-archive/:year/:month
@@ -1,3 +0,0 @@
1
- title: another sample draft
2
-
3
- another-sample-draft
@@ -1,3 +0,0 @@
1
- title: Sample draft
2
-
3
- Just a sample draft.
@@ -1,3 +0,0 @@
1
- <h1 id="layout" data-name="alternate-layout">Alternate layout</h1>
2
-
3
- {{ content }}
@@ -1,8 +0,0 @@
1
- <!doctype html>
2
- <meta charset="UTF-8">
3
- <title>My site: {% if page.title and page.title != empty %}{{ page.title | join:" - " }}{% endif %}</title>
4
- <h1>mysite.com</h1>
5
-
6
- {% if post_page %}<p>post_page flag set for layout</p>{% endif %}
7
-
8
- {{ content }}
@@ -1,4 +0,0 @@
1
- title: Sample post
2
- Created: 2012-11-21T17:07:09+00:00
3
-
4
- Just a sample post.
@@ -1,4 +0,0 @@
1
- title: Second post
2
- Created: 2013-01-01T00:00:00+00:00
3
-
4
- Second post.
@@ -1,5 +0,0 @@
1
- title: Custom layout
2
- Created: 2013-03-07T00:00:00+00:00
3
- layout: alt-layout
4
-
5
- Second post.
@@ -1,4 +0,0 @@
1
- title: Penultimate post
2
- Created: 2399-01-01T00:00:00+00:00
3
-
4
- Penultimate post
@@ -1,4 +0,0 @@
1
- title: Final post
2
- Created: 2400-01-01T00:00:00+00:00
3
-
4
- The final post in the blog
@@ -1,9 +0,0 @@
1
- <h1>{{ month | date: "%b %Y" }} ({{ posts | size }})</h1>
2
-
3
- <ul>
4
- {% for post in posts %}
5
- <li>
6
- <a href="{{ post.url }}">{{ post.title }}</a>
7
- </li>
8
- {% endfor %}
9
- </ul>
@@ -1,10 +0,0 @@
1
- {% if draft_preview %}<p>draftpreviewflagexists</p>{% endif %}
2
- {% if post_page %}<p>post_page flag set for template</p>{% endif %}
3
- <h2>{{ post.title }}</h2>
4
-
5
- {{ post.content | markdown }}
6
-
7
- <p><a href="http://twitter.com/share?text={{ post.title | encode_uri_component }}&amp;url={{ 'http://www.mysite.com' | encode_uri_component }}{{ post.url | encode_uri_component }}">Submit this to Twitter.</p>
8
-
9
- {% if prev_post %}Previous post: {{ prev_post.title }}{% endif %}
10
- {% if next_post %}Next post: {{ next_post.title }}{% endif %}
@@ -1,7 +0,0 @@
1
- {% for year in site.archive.years %}
2
- {% for month in year.months %}
3
- <h1>
4
- <a href="{{ month.archive_url }}">{{ month.date | date: "%B %Y" }}</a>
5
- </h1>
6
- {% endfor %}
7
- {% endfor %}
@@ -1,4 +0,0 @@
1
- layout: none
2
-
3
- {% file_digest test-stylesheet.css %}
4
- {% file_digest test-stylesheet.css prefix:. %}