alula 0.2.3 → 0.4.0b

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 (182) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +7 -0
  3. data/Guardfile +9 -0
  4. data/Rakefile +12 -1
  5. data/VERSION +1 -1
  6. data/alula.gemspec +20 -4
  7. data/lib/alula/attachment_processor.rb +77 -0
  8. data/lib/alula/cdn.rb +30 -0
  9. data/lib/alula/cdns/edgecast.rb +16 -0
  10. data/lib/alula/cdns/hosts.rb +14 -0
  11. data/lib/alula/cli.rb +90 -39
  12. data/lib/alula/compressors.rb +22 -10
  13. data/lib/alula/config.rb +141 -0
  14. data/lib/alula/content.rb +113 -0
  15. data/lib/alula/contents/attachment.rb +8 -0
  16. data/lib/alula/contents/item.rb +409 -0
  17. data/lib/alula/contents/metadata.rb +73 -0
  18. data/lib/alula/contents/page.rb +9 -0
  19. data/lib/alula/contents/post.rb +32 -0
  20. data/lib/alula/context.rb +72 -0
  21. data/lib/alula/core_ext.rb +5 -0
  22. data/lib/alula/core_ext/environment.rb +20 -0
  23. data/lib/alula/core_ext/filter.rb +20 -0
  24. data/lib/alula/core_ext/filters/smilies.rb +36 -0
  25. data/lib/alula/core_ext/manifest.rb +30 -0
  26. data/lib/alula/core_ext/tag.rb +100 -0
  27. data/lib/alula/core_ext/tags/attachment.rb +28 -0
  28. data/lib/alula/core_ext/tags/blockquote.rb +21 -0
  29. data/lib/alula/core_ext/tags/image.rb +48 -0
  30. data/lib/alula/core_ext/tags/locale.rb +17 -0
  31. data/lib/alula/core_ext/tags/video.rb +103 -0
  32. data/lib/alula/generator.rb +31 -0
  33. data/lib/alula/generators/feedbuilder.rb +44 -0
  34. data/lib/alula/generators/paginate.rb +88 -0
  35. data/lib/alula/generators/sitemap.rb +26 -0
  36. data/lib/alula/helpers.rb +2 -0
  37. data/lib/alula/helpers/addons.rb +12 -0
  38. data/lib/alula/helpers/assets.rb +56 -0
  39. data/lib/alula/helpers/url_helpers.rb +16 -0
  40. data/lib/alula/plugin.rb +32 -0
  41. data/lib/alula/processor.rb +86 -0
  42. data/lib/alula/processors/dummy.rb +24 -0
  43. data/lib/alula/processors/image.rb +52 -0
  44. data/lib/alula/processors/magick.rb +83 -0
  45. data/lib/alula/processors/video.rb +97 -0
  46. data/lib/alula/processors/zencoder.rb +199 -0
  47. data/lib/alula/progress.rb +95 -0
  48. data/lib/alula/progressbar.rb +66 -0
  49. data/lib/alula/site.rb +331 -262
  50. data/lib/alula/storage.rb +46 -0
  51. data/lib/alula/storages/file_item.rb +43 -0
  52. data/lib/alula/storages/filestorage.rb +96 -0
  53. data/lib/alula/storages/item.rb +12 -0
  54. data/lib/alula/support/commonlogger.rb +30 -0
  55. data/lib/alula/theme.rb +70 -13
  56. data/lib/alula/theme/layout.rb +56 -0
  57. data/lib/alula/theme/view.rb +43 -0
  58. data/lib/alula/version.rb +1 -1
  59. data/locales/en.yml +9 -0
  60. data/locales/fi.yml +10 -0
  61. data/locales/l10n/ar.yml +199 -0
  62. data/locales/l10n/az.yml +199 -0
  63. data/locales/l10n/bg.yml +199 -0
  64. data/locales/l10n/bn-IN.yml +182 -0
  65. data/locales/l10n/bs.yml +242 -0
  66. data/locales/l10n/ca.yml +199 -0
  67. data/locales/l10n/cs.yml +198 -0
  68. data/locales/l10n/csb.yml +210 -0
  69. data/locales/l10n/cy.yml +199 -0
  70. data/locales/l10n/da.yml +199 -0
  71. data/locales/l10n/de-AT.yml +203 -0
  72. data/locales/l10n/de-CH.yml +203 -0
  73. data/locales/l10n/de.yml +203 -0
  74. data/locales/l10n/dsb.yml +215 -0
  75. data/locales/l10n/el.yml +199 -0
  76. data/locales/l10n/en-AU.yml +205 -0
  77. data/locales/l10n/en-CA.yml +214 -0
  78. data/locales/l10n/en-GB.yml +205 -0
  79. data/locales/l10n/en-IN.yml +205 -0
  80. data/locales/l10n/en-US.yml +205 -0
  81. data/locales/l10n/en.yml +205 -0
  82. data/locales/l10n/eo.yml +201 -0
  83. data/locales/l10n/es-AR.yml +205 -0
  84. data/locales/l10n/es-CL.yml +199 -0
  85. data/locales/l10n/es-CO.yml +205 -0
  86. data/locales/l10n/es-MX.yml +205 -0
  87. data/locales/l10n/es-PE.yml +181 -0
  88. data/locales/l10n/es-VE.yml +205 -0
  89. data/locales/l10n/es.yml +199 -0
  90. data/locales/l10n/et.yml +199 -0
  91. data/locales/l10n/eu.yml +199 -0
  92. data/locales/l10n/fa.yml +199 -0
  93. data/locales/l10n/fi.yml +199 -0
  94. data/locales/l10n/fr-CA.yml +207 -0
  95. data/locales/l10n/fr-CH.yml +207 -0
  96. data/locales/l10n/fr.yml +222 -0
  97. data/locales/l10n/fur.yml +199 -0
  98. data/locales/l10n/gl-ES.yml +178 -0
  99. data/locales/l10n/gsw-CH.yml +199 -0
  100. data/locales/l10n/he.yml +201 -0
  101. data/locales/l10n/hi-IN.yml +199 -0
  102. data/locales/l10n/hi.yml +199 -0
  103. data/locales/l10n/hr.yml +237 -0
  104. data/locales/l10n/hsb.yml +214 -0
  105. data/locales/l10n/hu.yml +199 -0
  106. data/locales/l10n/id.yml +200 -0
  107. data/locales/l10n/is.yml +213 -0
  108. data/locales/l10n/it.yml +205 -0
  109. data/locales/l10n/ja.yml +197 -0
  110. data/locales/l10n/kn.yml +199 -0
  111. data/locales/l10n/ko.yml +197 -0
  112. data/locales/l10n/lo.yml +186 -0
  113. data/locales/l10n/lt.yml +182 -0
  114. data/locales/l10n/lv.yml +215 -0
  115. data/locales/l10n/mk.yml +170 -0
  116. data/locales/l10n/mn.yml +205 -0
  117. data/locales/l10n/nb.yml +207 -0
  118. data/locales/l10n/nl.yml +199 -0
  119. data/locales/l10n/nn.yml +160 -0
  120. data/locales/l10n/pl.yml +221 -0
  121. data/locales/l10n/pt-BR.yml +207 -0
  122. data/locales/l10n/pt-PT.yml +207 -0
  123. data/locales/l10n/quotes.yml +24 -0
  124. data/locales/l10n/rm.yml +182 -0
  125. data/locales/l10n/ro.yml +199 -0
  126. data/locales/l10n/ru.yml +257 -0
  127. data/locales/l10n/sk.yml +213 -0
  128. data/locales/l10n/sl.yml +210 -0
  129. data/locales/l10n/sr-Latn.yml +170 -0
  130. data/locales/l10n/sr.yml +170 -0
  131. data/locales/l10n/sv-SE.yml +199 -0
  132. data/locales/l10n/sw.yml +197 -0
  133. data/locales/l10n/th.yml +173 -0
  134. data/locales/l10n/tl.yml +229 -0
  135. data/locales/l10n/tr.yml +199 -0
  136. data/locales/l10n/uk.yml +257 -0
  137. data/locales/l10n/vi.yml +201 -0
  138. data/locales/l10n/wo.yml +205 -0
  139. data/locales/l10n/zh-CN.yml +199 -0
  140. data/locales/l10n/zh-TW.yml +199 -0
  141. data/template/Gemfile.erb +14 -4
  142. data/template/README +16 -0
  143. data/template/config.yml.erb +42 -38
  144. data/test/fixtures/config_001_simple.yml +2 -0
  145. data/test/fixtures/config_002_l10n.yml +5 -0
  146. data/test/fixtures/pages/invalid-page.markdown +1 -0
  147. data/test/fixtures/pages/multilingual-page.markdown +20 -0
  148. data/test/fixtures/pages/section/subpage.markdown +5 -0
  149. data/test/fixtures/pages/simple-page.markdown +7 -0
  150. data/test/fixtures/posts/2012-07-02-invalid-post.markdown +1 -0
  151. data/test/fixtures/posts/2012-07-02-simple.markdown +7 -0
  152. data/test/fixtures/posts/2012-07-03-full-metadata.markdown +8 -0
  153. data/test/fixtures/posts/2012-07-03-multilingual-full-metadata.markdown +20 -0
  154. data/test/fixtures/theme/test/layouts/default.html.erb +1 -0
  155. data/test/fixtures/theme/test/views/page.html.erb +1 -0
  156. data/test/fixtures/theme/test/views/post.html.erb +1 -0
  157. data/test/minitest_helper.rb +14 -0
  158. data/test/test_config.rb +33 -0
  159. data/test/test_content.rb +30 -0
  160. data/test/test_metadata.rb +83 -0
  161. data/test/test_page.rb +81 -0
  162. data/test/test_post.rb +123 -0
  163. data/test/test_storage.rb +23 -0
  164. data/test/test_storage_file.rb +32 -0
  165. data/test/test_theme.rb +45 -0
  166. data/vendor/assets/images/favicon.png +0 -0
  167. data/vendor/assets/images/grey.gif +0 -0
  168. data/vendor/assets/javascripts/jquery.alula.js.coffee +16 -0
  169. data/vendor/{javascripts → assets/javascripts}/jquery.js +0 -0
  170. data/vendor/assets/javascripts/jquery.lazyload.js +210 -0
  171. data/vendor/assets/javascripts/lazyload.js.coffee +15 -0
  172. data/vendor/layouts/feed.xml.builder +19 -0
  173. data/vendor/layouts/sitemap.xml.builder +10 -0
  174. data/vendor/views/feed_post.html.haml +1 -0
  175. metadata +529 -50
  176. data/lib/alula.rb +0 -5
  177. data/lib/alula/assethelper.rb +0 -75
  178. data/lib/alula/plugins.rb +0 -23
  179. data/lib/alula/plugins/assets.rb +0 -82
  180. data/lib/alula/plugins/pagination.rb +0 -121
  181. data/lib/alula/rake_tasks.rb +0 -42
  182. data/lib/alula/tasks.rb +0 -2
@@ -1,5 +1,15 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
- gem "alula"
4
- gem "alula-plugins"
5
- gem "alula-themes"
3
+ <% if options["path"] %>
4
+ gem 'alula', path: '<%= options["path"] %>/alula'
5
+ gem 'alula-themes', path: '<%= options["path"] %>/alula-themes'
6
+ gem 'alula-plugins', path: '<%= options["path"] %>/alula-plugins'
7
+ <% elsif options["edge"] %>
8
+ gem 'alula', git: 'git://github.com/owlforestry/alula.git'
9
+ gem 'alula-themes', git: 'git://github.com/owlforestry/alula-themes.git'
10
+ gem 'alula-plugins', git: 'git://github.com/owlforestry/alula-plugins.git'
11
+ <% else %>
12
+ gem 'alula'
13
+ gem 'alula-themes'
14
+ #gem 'alula-plugins'
15
+ <% end %>
@@ -0,0 +1,16 @@
1
+ Alula Blog
2
+
3
+ Directories:
4
+
5
+ - content/ This has blog contents, posts, pages, attachments
6
+ posts/ Put all posts here
7
+ pages/ Put all static pages here
8
+ static/ Put all files that needs to be just copied to public here
9
+ attachments/ Put all attachments, photos, videos here
10
+ - custom/ Blog customisation
11
+ stylesheets/ Custom stylesheets
12
+ custom.css Add your blog customisations here, you may use sprockets directives here
13
+ javascripts/ Custom javascripts, not yet implemented
14
+ images/ Custom images, fonts, etc.
15
+ - cache/ Contains generated content, it is a good idea to keep this around...
16
+ - public/ Contains your generated blog ready for publishing
@@ -1,38 +1,42 @@
1
- # Alula Blog
2
-
3
- # Author of this blog
4
- author: YOUR NAME
5
-
6
- # Blog main title
7
- title: BLOG TITLE
8
-
9
- # Subtitle, tagline
10
- tagline: BLOG TAGLINE
11
-
12
- # Chosed theme
13
- theme: minimal
14
-
15
- # Options for image settings
16
- images:
17
- size: 800x600 # Resize photos to this size
18
- thumbnails: 300x300 # # Thumbnail size (width x height)
19
- retina: true # Generate photos for retina displays
20
-
21
- # Root URL, if you host blog in directory, fix this according
22
- root: /
23
-
24
- # Permalinks style
25
- permalink: /:year/:month/:title
26
-
27
- # Posts per page on the blog index
28
- paginate: 10
29
-
30
- # Directory base for pagination URLs eg. /blog/page/2/
31
- pagination_dir:
32
-
33
- # "Continue reading" link text at the bottom of excerpted articles
34
- excerpt_link: "Read on &rarr;"
35
-
36
- # Plugins
37
- plugins:
38
- lightbox:
1
+ #
2
+ # Alula Configuration File
3
+ #
4
+ # You set different values for different
5
+ # locales and environments if required for some options
6
+ #
7
+ # For example to localise title use following syntax
8
+ # title:
9
+ # en: Title in English
10
+ # fi: Otsikko suomeksi
11
+ #
12
+ # To have different options for different environments
13
+ # title:
14
+ # development: Title (development)
15
+ # production: Title
16
+ #
17
+ # To combine
18
+ # title:
19
+ # development:
20
+ # en: Title (development)
21
+ # fi: Otsikko (kehitysversio)
22
+ # production:
23
+ # en: Title
24
+ # fi: Otsikko
25
+ #
26
+ # Existing environments:
27
+ # - development => By default, when testing locally
28
+ # - production => Enabled when generating site with --production option
29
+ #
30
+
31
+ # OPTIONS
32
+ # Localisation and environments supported
33
+ title: The title for blog
34
+ tagline: The cathy tagline for your blog
35
+ author: You name
36
+ url:
37
+ development: http://0.0.0.0:3000
38
+ production: http://your.host.here
39
+
40
+ # Use paginated page as blog index
41
+ # This could be set to any slug of post or page to change default index page
42
+ index: page-1
@@ -0,0 +1,2 @@
1
+ title: Yet Another Blog
2
+
@@ -0,0 +1,5 @@
1
+ title:
2
+ en: Yet Another Blog
3
+ fi: Toinen Blogi
4
+
5
+
@@ -0,0 +1 @@
1
+ This is invalid page without payload.
@@ -0,0 +1,20 @@
1
+ ---
2
+ title:
3
+ en: About
4
+ fi: Minä
5
+ slug:
6
+ en: about
7
+ fi: mina
8
+ ---
9
+
10
+ {% locale en %}
11
+ # About
12
+
13
+ About blah blah blah
14
+ {% endlocale %}
15
+
16
+ {% locale fi %}
17
+ # Minä
18
+
19
+ Minä blah blah blah
20
+ {% endlocale %}
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: Subpage under Section
3
+ ---
4
+
5
+ # This is a subpage under a named section (Folder).
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: Simple Page
3
+ ---
4
+
5
+ # Header
6
+
7
+ This is a simple page.
@@ -0,0 +1 @@
1
+ This is invalid post, i.e. not having payload.
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: Simple Post
3
+ ---
4
+
5
+ # Header
6
+
7
+ This is a simple post.
@@ -0,0 +1,8 @@
1
+ ---
2
+ title: Metadata Post
3
+ permalink: /blog/path/to/long/nonce/to/get/nonce/
4
+ ---
5
+
6
+ # Header
7
+
8
+ This is a simple post, with metadata.
@@ -0,0 +1,20 @@
1
+ ---
2
+ title:
3
+ en: Multilingual Post
4
+ fi: Monikielinen kirjoitelma
5
+ slug:
6
+ en: multilingual-post
7
+ fi: monikielinen-blogi-kirjoitelma
8
+ ---
9
+
10
+ {% locale en %}
11
+ # Header
12
+
13
+ This is not a simple post.
14
+ {% endlocale %}
15
+
16
+ {% locale fi %}
17
+ # Otsikko
18
+
19
+ Tämä ei ole yksinkertainen kirjoitelma.
20
+ {% endlocale %}
@@ -0,0 +1 @@
1
+ <html><body><%= yield %></body></html>
@@ -0,0 +1 @@
1
+ <%= content %>
@@ -0,0 +1 @@
1
+ <p><%= content %></p>
@@ -0,0 +1,14 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ # Skip support (from ActiveSupport)
4
+ add_filter "lib/alula/support/deep_merge.rb"
5
+
6
+ add_group "Gem", "lib/"
7
+ add_group "Tests", "test/"
8
+ end
9
+
10
+ require 'turn/autorun' unless ENV["DEBUG"]
11
+ require "minitest/autorun"
12
+ require "minitest/mock"
13
+
14
+ Turn.config.format = :outline unless ENV["DEBUG"]
@@ -0,0 +1,33 @@
1
+ require "minitest_helper"
2
+ require 'alula/config'
3
+
4
+ describe Alula::Config do
5
+ it "loads default config" do
6
+ config = Alula::Config.new()
7
+
8
+ config.title.must_equal "The Unnamed Blog"
9
+ config.url.must_equal "http://localhost:3000"
10
+ end
11
+
12
+ it "overrides given configurations" do
13
+ config = Alula::Config.new(title: "Overriden fun")
14
+
15
+ config.title.must_equal "Overriden fun"
16
+ config.url.must_equal "http://localhost:3000"
17
+ end
18
+
19
+ it "loads project configuration" do
20
+ config = Alula::Config.new({}, File.join("test/fixtures/config_001_simple.yml"))
21
+
22
+ config.title.must_equal "Yet Another Blog"
23
+ config.url.must_equal "http://localhost:3000"
24
+ end
25
+
26
+ it "loads project configuration with overrides" do
27
+ config = Alula::Config.new({url: "http://lvh.me:3000"}, File.join("test/fixtures/config_001_simple.yml"))
28
+
29
+ config.title.must_equal "Yet Another Blog"
30
+ config.url.must_equal "http://lvh.me:3000"
31
+ end
32
+
33
+ end
@@ -0,0 +1,30 @@
1
+ require "minitest_helper"
2
+ require 'alula/content'
3
+
4
+ describe "Content" do
5
+ before do
6
+ @site = MiniTest::Mock.new
7
+
8
+ item = MiniTest::Mock.new
9
+ item.expect :nil?, false
10
+ item.expect :exists?, true
11
+ item.expect :has_payload?, true
12
+ item.expect :name, "item"
13
+ item.expect :read, ""
14
+
15
+ storage = MiniTest::Mock.new
16
+ storage.expect :posts, { "item" => item }
17
+ storage.expect :pages, { "item" => item }
18
+ storage.expect :attachments, { "item" => item }
19
+ @site.expect :storage, storage
20
+ end
21
+
22
+ it "loads site content" do
23
+ @content = Alula::Content.new(site: @site)
24
+ @content.load
25
+
26
+ @content.pages.count.must_equal 1
27
+ @content.posts.count.must_equal 1
28
+ @content.attachments.count.must_equal 1
29
+ end
30
+ end
@@ -0,0 +1,83 @@
1
+ require "minitest_helper"
2
+ require 'alula/contents/metadata'
3
+
4
+ describe Alula::Content::Metadata do
5
+ it "loads empty metadata" do
6
+ meta = Alula::Content::Metadata.new
7
+ meta.title.must_be_nil
8
+ end
9
+
10
+ it "accepts simple metadata" do
11
+ meta = Alula::Content::Metadata.new
12
+ meta.title = "Simple Title"
13
+ meta.title.must_equal "Simple Title"
14
+ end
15
+
16
+ it "load simple payload" do
17
+ payload = <<-EOF
18
+ title: Simple Title
19
+ layout: default
20
+ slug: another-slug
21
+ EOF
22
+
23
+ meta = Alula::Content::Metadata.new
24
+ meta.load(payload)
25
+
26
+ meta.title.must_equal "Simple Title"
27
+ meta.layout.must_equal "default"
28
+ meta.slug.must_equal "another-slug"
29
+
30
+ meta.languages.must_be_nil
31
+ end
32
+
33
+ it "localised payload" do
34
+ payload = <<-EOF
35
+ title:
36
+ en: Simple Title
37
+ fi: Yksinkertainen otsikko
38
+ layout:
39
+ en: default
40
+ slug:
41
+ en: another-slug
42
+ fi: yksinkertainen-otsikko
43
+ EOF
44
+
45
+ meta = Alula::Content::Metadata.new
46
+ meta.load(payload)
47
+
48
+ # Default language, i.e. first localisation
49
+ meta.title.must_equal "Simple Title"
50
+ meta.layout.must_equal "default"
51
+ meta.slug.must_equal "another-slug"
52
+
53
+ # Specific language
54
+ meta.title("fi").must_equal "Yksinkertainen otsikko"
55
+ meta.layout("fi").must_equal "default"
56
+ meta.slug("fi").must_equal "yksinkertainen-otsikko"
57
+
58
+ # Fetch proper languages list
59
+ meta.languages.must_equal ["en", "fi"]
60
+ end
61
+
62
+ it "custom date setter" do
63
+ require 'time'
64
+
65
+ meta = Alula::Content::Metadata.new
66
+
67
+ meta.date = "2012-07-02"
68
+ meta.date.must_be_kind_of Time
69
+ meta.date.year.must_equal 2012
70
+ meta.date.month.must_equal 7
71
+ meta.date.day.must_equal 2
72
+
73
+ d = Time.parse("2012-07-02")
74
+ meta.date = d
75
+ meta.date.must_be_kind_of Time
76
+ meta.date.year.must_equal d.year
77
+ meta.date.month.must_equal d.month
78
+ meta.date.day.must_equal d.day
79
+
80
+ meta.date = "2012-13-45"
81
+ meta.date.must_be_nil
82
+ end
83
+ end
@@ -0,0 +1,81 @@
1
+ require "minitest_helper"
2
+ require 'alula/contents/page'
3
+
4
+ describe Alula::Content::Page do
5
+ before do
6
+ @site = MiniTest::Mock.new
7
+ @site.expect :context, {}
8
+ @site.expect :config, OpenStruct.new({
9
+ permalinks: "/:year/:month/:title/",
10
+ pagelinks: "/:locale/:slug/",
11
+ locale: "en", hides_base_locale: true,
12
+ })
13
+ end
14
+
15
+ def mock_item(name)
16
+ item = MiniTest::Mock.new
17
+ item.expect :nil?, false
18
+ item.expect :exists?, File.exists?("test/fixtures/pages/#{name}")
19
+ item.expect :name, name
20
+ if File.exists?("test/fixtures/pages/#{name}")
21
+ item.expect :has_payload?, File.read("test/fixtures/pages/#{name}", 3) == "---"
22
+ item.expect :read, File.read("test/fixtures/pages/#{name}")
23
+ end
24
+
25
+ item
26
+ end
27
+
28
+ let :simple_page do
29
+ mock_item("simple-page.markdown")
30
+ end
31
+
32
+ let :invalid_page do
33
+ mock_item("invalid-page.markdown")
34
+ end
35
+
36
+ let :multilingual_page do
37
+ mock_item("multilingual-page.markdown")
38
+ end
39
+
40
+ let :subpage do
41
+ mock_item("section/subpage.markdown")
42
+ end
43
+
44
+ let :missing_page do
45
+ mock_item("missing.page")
46
+ end
47
+
48
+ it "fails with non-existing file" do
49
+ page = Alula::Content::Page.load(item: missing_page, site: @site)
50
+ end
51
+
52
+ it "loads simple page" do
53
+ page = Alula::Content::Page.load(item: simple_page, site: @site)
54
+ end
55
+
56
+ it "skips invalid page" do
57
+ page = Alula::Content::Page.load(item: invalid_page, site: @site)
58
+ end
59
+
60
+ it "parses simple post" do
61
+ page = Alula::Content::Page.load(item: simple_page, site: @site)
62
+ page.metadata.title.must_equal "Simple Page"
63
+ page.metadata.languages.must_be_nil
64
+
65
+ # Parse and render
66
+ page.send(:parse_liquid).must_equal "# Header\n\nThis is a simple page.\n"
67
+
68
+ page.send(:parse_markdown).must_equal "<h1>Header</h1>\n\n<p>This is a simple page.</p>\n"
69
+ end
70
+
71
+ it "parses multilingual page" do
72
+ page = Alula::Content::Page.load(item: multilingual_page, site: @site)
73
+ page.url.must_equal "/about/"
74
+ page.url("fi").must_equal "/fi/mina/"
75
+ end
76
+
77
+ it "parses subpages" do
78
+ page = Alula::Content::Page.load(item: subpage, site: @site)
79
+ page.url.must_equal "/section/subpage/"
80
+ end
81
+ end