serif 0.5.2 → 0.6

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 (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:. %}