staticpress 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data.tar.gz.sig +0 -0
  2. data/docs/Gemfile +8 -0
  3. data/{tests/sample_sites/test_blog → docs}/README.markdown +0 -0
  4. data/{tests/sample_sites/test_blog → docs}/config.ru +0 -0
  5. data/docs/config.yml +2 -0
  6. data/docs/content/docs/diving-deeper.markdown +3 -0
  7. data/docs/content/docs/setup.markdown +15 -0
  8. data/docs/content/index.markdown +1 -0
  9. data/features/happy_path.feature +36 -1
  10. data/features/step_definitions/staticpress_steps.rb +1 -1
  11. data/lib/skeleton/Gemfile +0 -2
  12. data/lib/staticpress/booter.rb +1 -1
  13. data/lib/staticpress/cli.rb +2 -2
  14. data/lib/staticpress/content/base.rb +66 -23
  15. data/lib/staticpress/content/category.rb +12 -3
  16. data/lib/staticpress/content/collection_content.rb +0 -4
  17. data/lib/staticpress/content/index.rb +10 -3
  18. data/lib/staticpress/content/page.rb +32 -17
  19. data/lib/staticpress/content/post.rb +22 -27
  20. data/lib/staticpress/content/resource_content.rb +11 -3
  21. data/lib/staticpress/content/static_content.rb +10 -4
  22. data/lib/staticpress/content/tag.rb +12 -3
  23. data/lib/staticpress/content/theme.rb +17 -19
  24. data/lib/staticpress/helpers.rb +4 -0
  25. data/lib/staticpress/route.rb +21 -95
  26. data/lib/staticpress/server.rb +1 -3
  27. data/lib/staticpress/site.rb +20 -16
  28. data/lib/staticpress/version.rb +1 -1
  29. data/tests/staticpress/configuration_test.rb +4 -0
  30. data/tests/staticpress/content/base_test.rb +271 -0
  31. data/tests/staticpress/content/category_test.rb +29 -0
  32. data/tests/staticpress/content/index_test.rb +6 -0
  33. data/tests/staticpress/content/page_test.rb +37 -0
  34. data/tests/staticpress/content/post_test.rb +45 -0
  35. data/tests/staticpress/content/tag_test.rb +33 -0
  36. data/tests/staticpress/content/theme_test.rb +29 -0
  37. data/tests/{lib/staticpress → staticpress}/helpers_test.rb +2 -2
  38. data/tests/staticpress/js_object_test.rb +43 -0
  39. data/tests/staticpress/metadata_test.rb +16 -0
  40. data/tests/staticpress/plugin_test.rb +4 -0
  41. data/tests/staticpress/pusher_test.rb +9 -0
  42. data/tests/{lib/staticpress → staticpress}/route_test.rb +19 -41
  43. data/tests/{lib/staticpress → staticpress}/server_test.rb +5 -14
  44. data/tests/staticpress/site_test.rb +21 -0
  45. data/tests/staticpress/theme_test.rb +86 -0
  46. data/tests/staticpress/view_helpers_test.rb +28 -0
  47. data/tests/{lib/staticpress_test.rb → staticpress_test.rb} +3 -3
  48. data/tests/{sample_sites/test_blog → test_blog}/Gemfile +0 -2
  49. data/tests/test_blog/README.markdown +21 -0
  50. data/tests/test_blog/config.ru +8 -0
  51. data/tests/{sample_sites/test_blog → test_blog}/config.yml +0 -0
  52. data/tests/{sample_sites/test_blog → test_blog}/content/_posts/2011-07-20-hello.markdown +0 -0
  53. data/tests/{sample_sites/test_blog → test_blog}/content/_posts/2011-08-01-announcing-staticpress.markdown +0 -0
  54. data/tests/{sample_sites/test_blog → test_blog}/content/_posts/2011-08-02-staticpress.markdown +0 -0
  55. data/tests/{sample_sites/test_blog → test_blog}/content/_posts/2011-08-06-blogging-with-staticpress.markdown +0 -0
  56. data/tests/{sample_sites/test_blog → test_blog}/content/_posts/2011-08-06-conferences.markdown +0 -0
  57. data/tests/{sample_sites/test_blog → test_blog}/content/_posts/2011-08-06-in-charlotte.markdown +0 -0
  58. data/tests/{sample_sites/test_blog → test_blog}/content/_posts/2011-08-20-forever.markdown +0 -0
  59. data/tests/{sample_sites/test_blog → test_blog}/content/about.markdown +0 -0
  60. data/tests/{sample_sites/test_blog → test_blog}/content/contact.markdown +0 -0
  61. data/tests/{sample_sites/test_blog → test_blog}/content/foo/bar/baz.markdown +0 -0
  62. data/tests/test_blog/content/index.markdown +1 -0
  63. data/tests/{sample_sites/test_blog → test_blog}/content/plain.txt +0 -0
  64. data/tests/{sample_sites/test_blog → test_blog}/content/ruby.png +0 -0
  65. data/tests/{sample_sites/test_blog → test_blog}/content/style1.css +0 -0
  66. data/tests/{sample_sites/test_blog → test_blog}/content/style2.css.sass +0 -0
  67. data/tests/{sample_sites/test_blog → test_blog}/content/style3.sass +0 -0
  68. data/tests/{sample_sites/test_blog → test_blog}/themes/test_theme/assets/scripts/application.js +0 -0
  69. data/tests/{sample_sites/test_blog → test_blog}/themes/test_theme/assets/styles/all.sass +0 -0
  70. data/tests/{sample_sites/test_blog → test_blog}/themes/test_theme/includes/list_posts.haml +0 -0
  71. data/tests/{sample_sites/test_blog → test_blog}/themes/test_theme/layouts/archive.haml +0 -0
  72. data/tests/{sample_sites/test_blog → test_blog}/themes/test_theme/layouts/atom.haml +0 -0
  73. data/tests/{sample_sites/test_blog → test_blog}/themes/test_theme/layouts/default.haml +0 -0
  74. data/tests/{sample_sites/test_blog → test_blog}/themes/test_theme/layouts/index.haml +0 -0
  75. data/tests/{sample_sites/test_blog → test_blog}/themes/test_theme/layouts/post_index.haml +0 -0
  76. data/tests/{sample_sites/test_blog → test_blog}/themes/test_theme/views/default.haml +0 -0
  77. data/tests/{test_helper.rb → test_case.rb} +9 -5
  78. metadata +81 -73
  79. metadata.gz.sig +0 -0
  80. data/tests/lib/staticpress/configuration_test.rb +0 -4
  81. data/tests/lib/staticpress/content/base_test.rb +0 -6
  82. data/tests/lib/staticpress/content/category_test.rb +0 -62
  83. data/tests/lib/staticpress/content/index_test.rb +0 -45
  84. data/tests/lib/staticpress/content/page_test.rb +0 -147
  85. data/tests/lib/staticpress/content/post_test.rb +0 -89
  86. data/tests/lib/staticpress/content/tag_test.rb +0 -60
  87. data/tests/lib/staticpress/content/theme_test.rb +0 -114
  88. data/tests/lib/staticpress/js_object_test.rb +0 -45
  89. data/tests/lib/staticpress/metadata_test.rb +0 -19
  90. data/tests/lib/staticpress/plugin_test.rb +0 -4
  91. data/tests/lib/staticpress/pusher_test.rb +0 -9
  92. data/tests/lib/staticpress/site_test.rb +0 -26
  93. data/tests/lib/staticpress/theme_test.rb +0 -86
  94. data/tests/lib/staticpress/view_helpers_test.rb +0 -33
@@ -1,7 +1,15 @@
1
1
  require 'staticpress'
2
+ require 'staticpress/content/static_content'
2
3
 
3
4
  module Staticpress::Content
4
5
  module ResourceContent
6
+ # FIXME add tests
7
+ def find_supported_extension(extensionless_path)
8
+ Staticpress::Content::StaticContent.supported_extensions.detect do |extension|
9
+ extension.to_sym if Pathname.new("#{extensionless_path}.#{extension}").file?
10
+ end
11
+ end
12
+
5
13
  def gather_resources_from(paths)
6
14
  paths.map do |child|
7
15
  if child.directory?
@@ -14,11 +22,11 @@ module Staticpress::Content
14
22
  end.flatten.compact
15
23
  end
16
24
 
17
- def load_resource(route, base, stub)
25
+ def load_resource(base, stub, params)
18
26
  catch :resource do
19
- supported_extensions.detect do |extension|
27
+ Staticpress::Content::StaticContent.supported_extensions.each do |extension|
20
28
  path = base + "#{stub}.#{extension}"
21
- throw :resource, new(route, path) if path.file?
29
+ throw :resource, new(params) if path.file?
22
30
  end
23
31
 
24
32
  nil
@@ -10,15 +10,21 @@ module Staticpress::Content
10
10
  def parse_slug(path, base_path)
11
11
  path_string = path.to_s
12
12
 
13
- if supported_extensions.any? { |ext| path_string.end_with? ext.to_s }
14
- extensionless_path(path).to_s
13
+ clean = lambda { |str| str.sub(base_path.to_s, '').sub(/^\//, '') }
14
+
15
+ if Staticpress::Content::StaticContent.supported_extensions.any? { |ext| path_string.end_with? ext.to_s }
16
+ [ clean.call(extensionless_path(path).to_s), path.extname.sub(/^\./, '').to_sym ]
15
17
  else
16
- path_string
17
- end.sub(base_path.to_s, '').sub(/^\//, '')
18
+ [ clean.call(path_string), nil ]
19
+ end
18
20
  end
19
21
 
20
22
  def render_partial(locals = {})
21
23
  static? ? template_path_content : super
22
24
  end
25
+
26
+ def self.supported_extensions
27
+ Tilt.mappings.keys.reject { |mapping| mapping == '' }.map &:to_sym
28
+ end
23
29
  end
24
30
  end
@@ -1,19 +1,28 @@
1
1
  require 'staticpress'
2
2
  require 'staticpress/content/base'
3
3
  require 'staticpress/content/collection_content'
4
- require 'staticpress/route'
4
+ require 'staticpress/content/resource_content'
5
5
 
6
6
  module Staticpress::Content
7
7
  class Tag < Base
8
8
  extend CollectionContent
9
+ extend ResourceContent
10
+
11
+ def optional_param_defaults
12
+ { :number => 1 }
13
+ end
9
14
 
10
15
  def sub_content
11
- paginate(self.class.content_by_tag[route.params[:name]].sort)[(Integer route.params[:number]) - 1]
16
+ paginate(self.class.content_by_tag[params[:name]].sort)[params[:number] - 1]
17
+ end
18
+
19
+ def template_path
20
+ self.class.template_path
12
21
  end
13
22
 
14
23
  def self.all
15
24
  tags.map do |tag|
16
- find_by_route Staticpress::Route.new(:content_type => self, :name => tag, :number => '1')
25
+ new :name => tag, :number => '1'
17
26
  end
18
27
  end
19
28
 
@@ -6,12 +6,25 @@ require 'staticpress/route'
6
6
 
7
7
  module Staticpress::Content
8
8
  class Theme < Base
9
+ include ResourceContent
9
10
  include StaticContent
10
11
  extend ResourceContent
11
12
  extend StaticContent
12
13
 
14
+ attr_reader :extension
15
+
16
+ def initialize(params)
17
+ super
18
+ @extension = find_supported_extension template_path
19
+ end
20
+
13
21
  def static?
14
- (Staticpress::Theme.new(route.params[:theme]).root + 'assets' + route.params[:asset_type] + route.params[:slug]).file?
22
+ (Staticpress::Theme.new(params[:theme]).root + 'assets' + params[:asset_type] + params[:slug]).file?
23
+ end
24
+
25
+ def template_path
26
+ slug = extension ? "#{params[:slug]}.#{extension}" : params[:slug]
27
+ Staticpress::Theme.new(params[:theme]).root + 'assets' + params[:asset_type] + slug
15
28
  end
16
29
 
17
30
  def self.all
@@ -23,26 +36,11 @@ module Staticpress::Content
23
36
  stubs = Staticpress::Route::REGEX_STUBS
24
37
  regex = /#{stubs[:theme].regex}\/assets\/#{stubs[:asset_type].regex}\/#{stubs[:slug].regex}/
25
38
 
26
- if filename_parts = parse_slug(path, (Staticpress.root + 'themes')).match(regex)
27
- params = {
28
- :content_type => self,
29
- :theme => filename_parts[:theme],
30
- :asset_type => filename_parts[:asset_type],
31
- :slug => filename_parts[:slug]
32
- }
33
- find_by_route Staticpress::Route.new(params)
39
+ # FIXME send parse_slug something more intelligent as second parameter
40
+ if match = regex.match(parse_slug(path, Staticpress.root + 'themes').first)
41
+ new hash_from_match_data(match)
34
42
  end
35
43
  end
36
44
  end
37
-
38
- def self.find_by_route(route)
39
- return nil unless route
40
-
41
- base = Staticpress::Theme.new(route.params[:theme]).root + 'assets' + route.params[:asset_type]
42
- path = base + route.params[:slug]
43
- return new(route, path) if path.file?
44
-
45
- load_resource route, base, route.params[:slug]
46
- end
47
45
  end
48
46
  end
@@ -25,6 +25,10 @@ module Staticpress
25
25
  Hash[reply]
26
26
  end
27
27
 
28
+ def hash_from_match_data(match)
29
+ Hash[match.names.map { |match_key| [match_key.to_sym, match[match_key]] }]
30
+ end
31
+
28
32
  def paginate(range)
29
33
  reply = []
30
34
 
@@ -1,68 +1,40 @@
1
1
  require 'staticpress'
2
- require 'staticpress/error'
3
2
  require 'staticpress/helpers'
4
- require 'staticpress/site'
5
3
 
6
4
  module Staticpress
7
- class Route
5
+ module Route
8
6
  extend Staticpress::Helpers
9
- include Staticpress::Helpers
10
7
 
11
- RegexStub = Struct.new :regex, :default
8
+ RegexStub = Struct.new :klass, :regex
12
9
 
13
10
  REGEX_STUBS = {
14
- :asset_type => RegexStub.new(/(?<asset_type>fonts|images|scripts|styles)/),
15
- :date => RegexStub.new(/(?<date>\d{4}-\d{2}-\d{2})/),
16
- :year => RegexStub.new(/(?<year>\d{4})/),
17
- :month => RegexStub.new(/(?<month>\d{2})/),
18
- :day => RegexStub.new(/(?<day>\d{2})/),
19
- :slug => RegexStub.new(/(?<slug>[0-9a-z\-_\.\/]+)/),
20
- :title => RegexStub.new(/(?<title>[0-9a-z\-_]*)/),
21
- :name => RegexStub.new(/(?<name>[0-9a-z\-_]*)/),
22
- :number => RegexStub.new(/(?<number>\d+)/, '1'),
23
- :theme => RegexStub.new(/(?<theme>[0-9a-z\-_]*)/)
11
+ :asset_type => RegexStub.new(:string, /(?<asset_type>fonts|images|scripts|styles)/),
12
+ :date => RegexStub.new(:date, /(?<date>\d{4}-\d{2}-\d{2})/),
13
+ :year => RegexStub.new(:string, /(?<year>\d{4})/),
14
+ :month => RegexStub.new(:string, /(?<month>\d{2})/),
15
+ :day => RegexStub.new(:string, /(?<day>\d{2})/),
16
+ :slug => RegexStub.new(:string, /(?<slug>[0-9a-z\-_\.\/]*)/),
17
+ :title => RegexStub.new(:string, /(?<title>[0-9a-z\-_]*)/),
18
+ :name => RegexStub.new(:string, /(?<name>[0-9a-z\-_]*)/),
19
+ :number => RegexStub.new(:integer, /(?<number>\d+)/),
20
+ :theme => RegexStub.new(:string, /(?<theme>[0-9a-z\-_]*)/)
24
21
  }
25
22
 
26
- attr_reader :params
27
-
28
- def initialize(params)
29
- # TODO apply default values to all params for which a default value exist
30
- # TODO ensure all param values are correct type (not always strings)
31
- @params = if params.key?(:number)
32
- params[:number] ? params : params.merge(:number => REGEX_STUBS[:number].default)
33
- else
34
- params
23
+ def self.extract_params(pattern, url_path)
24
+ if match = regex_for_pattern(pattern).match(url_path)
25
+ hash_from_match_data match
35
26
  end
36
27
  end
37
28
 
38
- def ==(other)
39
- other.respond_to?(:params) && (params == other.params)
40
- end
41
-
42
- def content
43
- params[:content_type].find_by_route self
44
- end
45
-
46
- def inspect
47
- parts = [
48
- "url_path=#{url_path}",
49
- "content_type=#{params[:content_type]}"
50
- ]
51
-
52
- p = Hash[self.params.clone.sort]
53
- p.delete :content_type
54
- parts << "params=#{p}"
55
-
56
- "#<#{self.class} #{parts.join ', '}>"
57
- end
58
-
59
- def route
60
- route_options(route_title).inject(route_pattern) do |reply, (key, value)|
61
- reply.gsub /:#{key}/, value.to_s
29
+ def self.regex_for_pattern(pattern)
30
+ regex = REGEX_STUBS.inject("^#{pattern}$") do |snip, (key, value)|
31
+ snip.gsub /:#{key}/, value.regex.source
62
32
  end
33
+
34
+ Regexp.new regex
63
35
  end
64
36
 
65
- def route_options(title)
37
+ def self.route_options(title)
66
38
  t = Time.now.utc
67
39
 
68
40
  {
@@ -73,51 +45,5 @@ module Staticpress
73
45
  :title => title
74
46
  }
75
47
  end
76
-
77
- def route_pattern
78
- config.routes[type]
79
- end
80
-
81
- def url_path
82
- return nil unless params[:content_type]
83
-
84
- pattern = config.routes[params[:content_type].type].clone
85
-
86
- # http://www.rubular.com/r/UTV5dNDq6c
87
- optional_segment_finder = /\((?<optional_segment>.+)\)\?/
88
- pattern.gsub! optional_segment_finder do |match|
89
- # http://www.rubular.com/r/LiOup53CI1
90
- optional_key = /:(?<optional_key>[0-9a-z_]+)/.match(match)[:optional_key].to_sym
91
- optional_segment_finder.match(match)[:optional_segment] unless params[optional_key] == REGEX_STUBS[optional_key].default
92
- end
93
-
94
- REGEX_STUBS.keys.inject(pattern) do |p, key|
95
- p.gsub /:#{key}/, params[key].to_s
96
- end
97
- end
98
- alias :to_s :url_path
99
-
100
- def self.from_url_path(url_path)
101
- catch :route do
102
- Staticpress::Site.content_types.each do |content_type|
103
- if match = regex_for_pattern(config.routes[content_type.type]).match(url_path)
104
- params = { :content_type => content_type }
105
- match.names.each { |match_key| params[match_key.to_sym] = match[match_key] }
106
- route = new params
107
- throw :route, route if route.content
108
- end
109
- end
110
-
111
- nil
112
- end
113
- end
114
-
115
- def self.regex_for_pattern(pattern)
116
- regex = REGEX_STUBS.inject("^#{pattern}$") do |snip, (key, value)|
117
- snip.gsub /:#{key}/, value.regex.source
118
- end
119
-
120
- Regexp.new regex
121
- end
122
48
  end
123
49
  end
@@ -9,9 +9,7 @@ module Staticpress
9
9
  end
10
10
 
11
11
  def call(env)
12
- content = @site.find_content_by_url_path env['REQUEST_PATH']
13
-
14
- if content
12
+ if content = @site.find_content_by_env(env)
15
13
  [ 200, { 'Content-Type' => content.content_type }, [ content.render ] ]
16
14
  else
17
15
  [ 404, {}, [] ]
@@ -9,10 +9,19 @@ require 'staticpress/content/post'
9
9
  require 'staticpress/content/theme'
10
10
  require 'staticpress/helpers'
11
11
  require 'staticpress/metadata'
12
- require 'staticpress/route'
13
12
 
14
13
  module Staticpress
15
14
  class Site
15
+ # ordered by priority
16
+ CONTENT_TYPES = [
17
+ Staticpress::Content::Page,
18
+ Staticpress::Content::Post,
19
+ Staticpress::Content::Index,
20
+ Staticpress::Content::Category,
21
+ Staticpress::Content::Tag,
22
+ Staticpress::Content::Theme
23
+ ]
24
+
16
25
  include Staticpress::Helpers
17
26
 
18
27
  attr_reader :directory
@@ -22,12 +31,18 @@ module Staticpress
22
31
  end
23
32
 
24
33
  def all_content
25
- self.class.content_types.map(&:all).flatten
34
+ CONTENT_TYPES.map(&:all).flatten
26
35
  end
27
36
 
28
- def find_content_by_url_path(url_path)
29
- route = Staticpress::Route.from_url_path url_path
30
- route.content if route
37
+ def find_content_by_env(env)
38
+ catch :content do
39
+ CONTENT_TYPES.detect do |content_type|
40
+ content = content_type.find_by_url_path env['REQUEST_PATH']
41
+ throw :content, content if content && content.exist?
42
+ end
43
+
44
+ nil
45
+ end
31
46
  end
32
47
 
33
48
  def meta
@@ -42,16 +57,5 @@ module Staticpress
42
57
  FileUtils.rm_r destination if destination.directory?
43
58
  all_content.each &:save
44
59
  end
45
-
46
- def self.content_types
47
- [
48
- Staticpress::Content::Index,
49
- Staticpress::Content::Category,
50
- Staticpress::Content::Tag,
51
- Staticpress::Content::Page,
52
- Staticpress::Content::Post,
53
- Staticpress::Content::Theme
54
- ]
55
- end
56
60
  end
57
61
  end
@@ -2,7 +2,7 @@ module Staticpress
2
2
  # TODO figure out how to implement Gem::Version properly
3
3
  class Version
4
4
  MAJOR = 0
5
- MINOR = 3
5
+ MINOR = 4
6
6
  PATCH = 0
7
7
 
8
8
  def self.to_s
@@ -0,0 +1,4 @@
1
+ require_relative '../test_case'
2
+
3
+ class ConfigurationTest < TestCase
4
+ end
@@ -0,0 +1,271 @@
1
+ require_relative '../../test_case'
2
+
3
+ require 'staticpress/content/base'
4
+ require 'staticpress/content/category'
5
+ require 'staticpress/content/index'
6
+ require 'staticpress/content/page'
7
+ require 'staticpress/content/post'
8
+ require 'staticpress/content/tag'
9
+ require 'staticpress/content/theme'
10
+
11
+ class ContentBaseTest < TestCase
12
+ let(:category) { Staticpress::Content::Category.new :name => 'programming' }
13
+ let(:category_1) { Staticpress::Content::Category.new(:name => 'programming', :number => '1') }
14
+ let(:category_2) { Staticpress::Content::Category.new(:name => 'programming', :number => '2') }
15
+
16
+ let(:index) { Staticpress::Content::Index.new :number => 1 }
17
+ let(:index_2) { Staticpress::Content::Index.new :number => 2 }
18
+
19
+ let(:page) { Staticpress::Content::Page.new(:slug => 'about') }
20
+ let(:second_page) { Staticpress::Content::Page.new :slug => 'contact' }
21
+ let(:page_root) { Staticpress::Content::Page.new :slug => '' }
22
+ let(:style_2) { Staticpress::Content::Page.new :slug => 'style2.css' }
23
+ let(:page_nested) { Staticpress::Content::Page.new :slug => 'foo/bar/baz' }
24
+ let(:static_bin) { Staticpress::Content::Page.new :slug => 'ruby.png' }
25
+ let(:static_txt) { Staticpress::Content::Page.new :slug => 'plain.txt' }
26
+ let(:page_fake) { Staticpress::Content::Page.new :slug => 'i/dont/exist' }
27
+
28
+ let(:post) { Staticpress::Content::Post.new(:year => '2011', :month => '07', :day => '20', :title => 'hello') }
29
+
30
+ let(:tag) { Staticpress::Content::Tag.new :name => 'charlotte' }
31
+
32
+ let(:asset_style) { Staticpress::Content::Theme.new :theme => 'test_theme', :asset_type => 'styles', :slug => 'all' }
33
+ let(:asset_script) { Staticpress::Content::Theme.new :theme => 'test_theme', :asset_type => 'scripts', :slug => 'application.js' }
34
+
35
+ def test__equalsequals
36
+ assert_operator category, :==, Staticpress::Content::Category.new(:name => 'programming')
37
+ refute_operator category, :==, nil
38
+
39
+ assert_operator index, :==, Staticpress::Content::Index.new(:number => 1)
40
+ refute_operator index, :==, index_2
41
+ refute_operator index, :==, nil
42
+
43
+ assert_operator page, :==, Staticpress::Content::Page.new(:slug => 'about')
44
+ refute_operator page, :==, second_page
45
+ refute_operator page, :==, nil
46
+ assert_operator static_bin, :==, Staticpress::Content::Page.new(:slug => 'ruby.png')
47
+ refute_operator static_bin, :==, nil
48
+ refute_operator static_bin, :==, static_txt
49
+
50
+ assert_operator post, :==, Staticpress::Content::Post.new(:year => '2011', :month => '07', :day => '20', :title => 'hello')
51
+ refute_operator post, :==, nil
52
+
53
+ assert_operator tag, :==, Staticpress::Content::Tag.new(:name => 'charlotte')
54
+ refute_operator tag, :==, nil
55
+
56
+ assert_operator asset_style, :==, Staticpress::Content::Theme.new(:theme => 'test_theme', :asset_type => 'styles', :slug => 'all')
57
+ refute_operator asset_style, :==, nil
58
+
59
+ refute_operator Staticpress::Content::Category.new(:name => 'programming'), :==, Staticpress::Content::Tag.new(:name => 'programming')
60
+ end
61
+
62
+ def test_content_type
63
+ assert_equal 'text/html', page.content_type
64
+ assert_equal 'text/css', style_2.content_type
65
+ assert_equal 'image/png', static_bin.content_type
66
+ assert_equal 'text/plain', static_txt.content_type
67
+ end
68
+
69
+ def test_exist?
70
+ assert category.exist?, "#{category} does not exist"
71
+ assert index.exist?, "#{index} does not exist"
72
+
73
+ assert page.exist?, "#{page} does not exist"
74
+ assert second_page.exist?, "#{second_page} does not exist"
75
+ assert static_bin.exist?, "#{static_bin} does not exist"
76
+ assert static_txt.exist?, "#{static_txt} does not exist"
77
+ assert page_root.exist?, "#{page_root} does not exist"
78
+
79
+ assert post.exist?, "#{post} does not exist"
80
+ assert tag.exist?, "#{tag} does not exist"
81
+
82
+ assert asset_style.exist?, "#{asset_style} does not exist"
83
+ assert asset_script.exist?, "#{asset_script} does not exist"
84
+
85
+ refute page_fake.exist?, "#{page_fake} exists"
86
+ end
87
+
88
+ def test_find_by_url_path
89
+ assert_equal category, Staticpress::Content::Category.find_by_url_path('/category/programming')
90
+ assert_equal index, Staticpress::Content::Index.find_by_url_path('/')
91
+
92
+ assert_equal page_root, Staticpress::Content::Page.find_by_url_path('/')
93
+ assert_equal page, Staticpress::Content::Page.find_by_url_path('/about')
94
+ assert_equal static_bin, Staticpress::Content::Page.find_by_url_path('/ruby.png')
95
+
96
+ assert_equal post, Staticpress::Content::Post.find_by_url_path('/2011/07/20/hello')
97
+ assert_equal tag, Staticpress::Content::Tag.find_by_url_path('/tag/charlotte')
98
+
99
+ assert_equal asset_style, Staticpress::Content::Theme.find_by_url_path('/assets/test_theme/styles/all')
100
+ assert_equal asset_script, Staticpress::Content::Theme.find_by_url_path('/assets/test_theme/scripts/application.js')
101
+
102
+ assert_nil Staticpress::Content::Theme.find_by_url_path(nil)
103
+ end
104
+
105
+ def test_full_title
106
+ assert_equal 'Foo -> Bar -> Baz | Test Blog', page_nested.full_title
107
+ end
108
+
109
+ def test_output_path
110
+ assert_equal (Staticpress.blog_path + 'public' + 'about' + 'index.html'), page.output_path
111
+ assert_equal (Staticpress.blog_path + 'public' + 'index.html'), page_root.output_path
112
+ assert_equal (Staticpress.blog_path + 'public' + 'style2.css'), style_2.output_path
113
+ assert_equal (Staticpress.blog_path + 'public' + 'ruby.png'), static_bin.output_path
114
+ assert_equal (Staticpress.blog_path + 'public' + 'plain.txt'), static_txt.output_path
115
+ assert_equal (Staticpress.blog_path + 'public' + '2011' + '07' + '20' + 'hello' + 'index.html'), post.output_path
116
+ assert_equal (Staticpress.blog_path + 'public' + 'assets' + 'test_theme' + 'styles' + 'all'), asset_style.output_path
117
+ assert_equal (Staticpress.blog_path + 'public' + 'assets' + 'test_theme' + 'scripts' + 'application.js'), asset_script.output_path
118
+ end
119
+
120
+ def test_params
121
+ expected = { :name => 'charlotte', :number => 1 }
122
+ assert_equal expected, tag.params
123
+ assert_equal expected, Staticpress::Content::Tag.new(:name => 'charlotte', :number => nil).params
124
+ assert_equal expected, Staticpress::Content::Tag.new(:name => 'charlotte', :number => 1).params
125
+ assert_equal expected, Staticpress::Content::Tag.new(:name => 'charlotte', :number => '1').params
126
+ end
127
+
128
+ def test_raw
129
+ assert_equal '= partial :list_posts, :posts => page.sub_content', category.raw
130
+
131
+ assert_equal 'in page', page.raw
132
+ assert_equal "in page\n\nin page", second_page.raw
133
+ assert_equal 'this file intentionally left blank', static_txt.raw
134
+
135
+ assert_equal 'in post', post.raw
136
+ assert_equal '= partial :list_posts, :posts => page.sub_content', tag.raw
137
+ assert_equal '@import "compass/reset/utilities"', asset_style.raw
138
+
139
+ expected = <<-JS
140
+ (function ($) {
141
+ $(document).ready(function () {
142
+ });
143
+ })(jQuery);
144
+ JS
145
+ assert_equal expected.strip, asset_script.raw
146
+ end
147
+
148
+ def test_render
149
+ expected_page = <<-HTML
150
+ <!DOCTYPE html>
151
+ <html>
152
+ <head>
153
+ <title>About | Test Blog</title>
154
+ </head>
155
+ <body>
156
+ <p>in page</p>
157
+ </body>
158
+ </html>
159
+ HTML
160
+ assert_equal expected_page, page.render
161
+
162
+ expected_style2 = <<-CSS
163
+ body{color:green}
164
+ CSS
165
+ assert_equal expected_style2, style_2.render
166
+
167
+ assert_equal 'this file intentionally left blank', static_txt.render
168
+ refute_raises(Sass::SyntaxError) { asset_style.render }
169
+
170
+ expected = <<-SASS
171
+ SASS
172
+ assert_equal expected, asset_style.render
173
+
174
+ expected = <<-JS
175
+ (function ($) {
176
+ $(document).ready(function () {
177
+ });
178
+ })(jQuery);
179
+ JS
180
+ assert_equal expected, asset_script.render
181
+ end
182
+
183
+ def test_render_partial
184
+ assert_equal "<p>in page</p>\n", page.render_partial
185
+ assert_equal "<p>in page</p>\n\n<p>in page</p>\n", second_page.render_partial
186
+
187
+ expected_style2 = <<-CSS
188
+ body{color:green}
189
+ CSS
190
+ assert_equal expected_style2, style_2.render_partial
191
+
192
+ assert_equal 'this file intentionally left blank', static_txt.render_partial
193
+ assert_equal "<p>in post</p>\n", post.render_partial
194
+
195
+ refute_raises(Sass::SyntaxError) { asset_style.render_partial }
196
+ expected = <<-SASS
197
+ SASS
198
+
199
+ assert_equal expected, asset_style.render_partial
200
+ expected = <<-JS
201
+ (function ($) {
202
+ $(document).ready(function () {
203
+ });
204
+ })(jQuery);
205
+ JS
206
+ assert_equal expected, asset_script.render_partial
207
+ end
208
+
209
+ def test_save
210
+ static_bin.save
211
+ assert_equal static_bin.template_path.binread, static_bin.output_path.binread
212
+
213
+ static_txt.save
214
+ assert_equal static_txt.template_path.read, static_txt.output_path.read
215
+ end
216
+
217
+ def test_template_engine_options
218
+ expected = Compass.sass_engine_options.merge :line_comments => false, :style => :compressed
219
+ assert_eql expected, asset_style.template_engine_options
220
+ assert_equal({}, asset_script.template_engine_options)
221
+ end
222
+
223
+ def test_template_type
224
+ assert_equal :markdown, page.template_type
225
+ assert_equal :sass, asset_style.template_type
226
+ assert_equal :js, asset_script.template_type
227
+ end
228
+
229
+ def test_title
230
+ assert_equal 'Foo -> Bar -> Baz', page_nested.title
231
+ end
232
+
233
+ def test_to_s
234
+ assert_equal '#<Staticpress::Content::Category url_path=/category/programming, params={:name=>"programming", :number=>1}>', category.to_s
235
+ assert_equal '#<Staticpress::Content::Category url_path=/category/programming, params={:name=>"programming", :number=>1}>', Staticpress::Content::Category.new(:name => 'programming', :number => nil).to_s
236
+
237
+ assert_equal '#<Staticpress::Content::Index url_path=/, params={:number=>1}>', index.to_s
238
+ assert_equal '#<Staticpress::Content::Index url_path=/page/2, params={:number=>2}>', index_2.to_s
239
+
240
+ assert_equal '#<Staticpress::Content::Page url_path=/, params={:slug=>""}>', page_root.to_s
241
+ assert_equal '#<Staticpress::Content::Page url_path=/about, params={:slug=>"about"}>', page.to_s
242
+ assert_equal '#<Staticpress::Content::Page url_path=/ruby.png, params={:slug=>"ruby.png"}>', static_bin.to_s
243
+
244
+ assert_equal '#<Staticpress::Content::Post url_path=/2011/07/20/hello, params={:day=>"20", :month=>"07", :title=>"hello", :year=>"2011"}>', post.to_s
245
+
246
+ assert_equal '#<Staticpress::Content::Tag url_path=/tag/charlotte, params={:name=>"charlotte", :number=>1}>', tag.to_s
247
+
248
+ assert_equal '#<Staticpress::Content::Theme url_path=/assets/test_theme/styles/all, params={:asset_type=>"styles", :slug=>"all", :theme=>"test_theme"}>', asset_style.to_s
249
+ end
250
+
251
+ def test_url_path
252
+ assert_equal '/category/programming', category.url_path
253
+ assert_equal '/category/programming', category_1.url_path
254
+ assert_equal '/category/programming/page/2', category_2.url_path
255
+
256
+ assert_equal '/', index.url_path
257
+ assert_equal '/page/2', index_2.url_path
258
+
259
+ assert_equal '/', page_root.url_path
260
+ assert_equal '/about', page.url_path
261
+ assert_equal '/contact', second_page.url_path
262
+ assert_equal '/ruby.png', static_bin.url_path
263
+ assert_equal '/plain.txt', static_txt.url_path
264
+
265
+ assert_equal '/2011/07/20/hello', post.url_path
266
+
267
+ assert_equal '/2011/07/20/hello', post.url_path
268
+ assert_equal '/tag/charlotte', tag.url_path
269
+ assert_equal '/assets/test_theme/styles/all', asset_style.url_path
270
+ end
271
+ end