aerial 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/.gitignore +1 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.md +74 -0
  4. data/Rakefile +96 -0
  5. data/VERSION +1 -0
  6. data/config/config.yml +19 -0
  7. data/config/deploy.rb +50 -0
  8. data/lib/aerial.rb +100 -0
  9. data/lib/aerial/article.rb +241 -0
  10. data/lib/aerial/base.rb +172 -0
  11. data/lib/aerial/comment.rb +160 -0
  12. data/lib/aerial/config.rb +41 -0
  13. data/lib/aerial/content.rb +74 -0
  14. data/lib/aerial/vendor/akismetor.rb +52 -0
  15. data/lib/aerial/vendor/cache.rb +139 -0
  16. data/lib/features/article.feature +10 -0
  17. data/lib/features/home.feature +16 -0
  18. data/lib/features/step_definitions/article_steps.rb +4 -0
  19. data/lib/features/step_definitions/home_steps.rb +8 -0
  20. data/lib/features/support/env.rb +38 -0
  21. data/lib/features/support/pages/article.rb +9 -0
  22. data/lib/features/support/pages/homepage.rb +9 -0
  23. data/lib/spec/aerial_spec.rb +203 -0
  24. data/lib/spec/article_spec.rb +338 -0
  25. data/lib/spec/base_spec.rb +65 -0
  26. data/lib/spec/comment_spec.rb +216 -0
  27. data/lib/spec/config_spec.rb +25 -0
  28. data/lib/spec/fixtures/articles/sample-article/sample-article.article +6 -0
  29. data/lib/spec/fixtures/articles/test-article-one/test-article.article +7 -0
  30. data/lib/spec/fixtures/articles/test-article-three/test-article.article +7 -0
  31. data/lib/spec/fixtures/articles/test-article-two/comment-missing-fields.comment +8 -0
  32. data/lib/spec/fixtures/articles/test-article-two/test-article.article +7 -0
  33. data/lib/spec/fixtures/articles/test-article-two/test-comment.comment +10 -0
  34. data/lib/spec/fixtures/config.yml +35 -0
  35. data/lib/spec/fixtures/public/javascripts/application.js +109 -0
  36. data/lib/spec/fixtures/public/javascripts/jquery-1.3.1.min.js +19 -0
  37. data/lib/spec/fixtures/public/javascripts/jquery.template.js +255 -0
  38. data/lib/spec/fixtures/views/article.haml +19 -0
  39. data/lib/spec/fixtures/views/articles.haml +2 -0
  40. data/lib/spec/fixtures/views/comment.haml +8 -0
  41. data/lib/spec/fixtures/views/home.haml +2 -0
  42. data/lib/spec/fixtures/views/layout.haml +22 -0
  43. data/lib/spec/fixtures/views/post.haml +27 -0
  44. data/lib/spec/fixtures/views/rss.haml +15 -0
  45. data/lib/spec/fixtures/views/sidebar.haml +21 -0
  46. data/lib/spec/fixtures/views/style.sass +163 -0
  47. data/lib/spec/spec_helper.rb +117 -0
  48. metadata +101 -0
@@ -0,0 +1,19 @@
1
+ - article = @article if @article
2
+ .article
3
+ %h2
4
+ %a{:href => article.permalink}
5
+ =article.title
6
+ %span
7
+ =article.comments.size
8
+ %h3
9
+ ="Posted by #{article.author} on #{humanized_date article.published_at}"
10
+ %p.entry
11
+ =article.body_html
12
+ .meta
13
+ %span
14
+ Tags:
15
+ =link_to_tags article.tags
16
+ %br/
17
+ %span
18
+ Meta:
19
+ ="#{article.comments.size} comments, <a href='#{article.permalink}' rel='permalink'>permalink</a>"
@@ -0,0 +1,2 @@
1
+ #articles
2
+ =partial :article, :collection => @articles
@@ -0,0 +1,8 @@
1
+ .comment
2
+ %h2
3
+ %a{:href => comment.homepage}
4
+ =comment.author
5
+ %span
6
+ =comment.published_at
7
+ %p
8
+ =comment.body
@@ -0,0 +1,2 @@
1
+ #articles
2
+ =partial :article, :collection => @articles
@@ -0,0 +1,22 @@
1
+ !!! Strict
2
+ %html
3
+ %head
4
+ %title= page_title
5
+ %script{ 'type' => "text/javascript", :src => "/javascripts/jquery-1.3.1.min.js" }
6
+ %script{ 'type' => "text/javascript", :src => "/javascripts/jquery.template.js" }
7
+ %script{ 'type' => "text/javascript", :src => "/javascripts/application.js" }
8
+ %link{:href => '/style.css', :rel => 'stylesheet', :type => 'text/css'}
9
+ %link{:href => "http://#{hostname}/feed", :rel => 'alternate', :type => 'application/atom+xml', :title => "Feed for #{}" }
10
+ %body
11
+ #container
12
+ #header
13
+ #logo
14
+ %h1
15
+ %a{:href => '/'}= Aerial.config.title
16
+ %span
17
+ =Aerial.config.subtitle
18
+ #content= yield
19
+ #sidebar= partial :sidebar
20
+ #footer
21
+ %p#legal= "&copy; #{Time.now.strftime('%Y')} #{Aerial.config.author}"
22
+ %p#powered= "powered by <a href='http://github.com/mattsears/aerial' title='Aerial'>Aerial</a>"
@@ -0,0 +1,27 @@
1
+ =partial :article
2
+ %h5
3
+ Comments
4
+ #comments
5
+ =partial :comment, :collection => @article.comments
6
+
7
+ %div{:id => "new_comment"}
8
+ %form{:action => "/article/#{@article.id}/comments"}
9
+ %p
10
+ %input{:type => "text", :id => "comment_author"}
11
+ %label{:id => "author_label"}
12
+ Your name (required)
13
+ %p
14
+ %input{:type => "text", :id => "comment_email"}
15
+ %label{:id => "email_label"}
16
+ Your email address (required)
17
+ %p
18
+ %input{:type => "text", :id => "comment_homepage"}
19
+ %label{:id => "homepage_label"}
20
+ Website
21
+ %p
22
+ %label{:id => "comment_label"}
23
+ Please enter your comment
24
+ %textarea{:id => "comment_body"}
25
+ %p
26
+ %button{:type => "submit", :id => "comment_submit", :onclick => "Comment.submit('#{@article.id}'); return false;"}
27
+ Submit Comment (Thanks)
@@ -0,0 +1,15 @@
1
+ !!! XML
2
+ %rss{"version" => "2.0"}
3
+ %channel
4
+ %title= "#{Aerial.config.title}"
5
+ %link= "http://#{hostname}"
6
+ %language= "en-us"
7
+ %ttl= "40"
8
+ %description= "#{Aerial.config.subtitle}"
9
+ - @articles.each do |article|
10
+ %item
11
+ %title= article.title
12
+ %link= full_hostname(article.permalink)
13
+ %description= article.body_html
14
+ %pubDate= article.published_at
15
+ %guid{"isPermaLink" => "false"}= article.id
@@ -0,0 +1,21 @@
1
+ #about
2
+ %h2 About
3
+ %p
4
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut
5
+ labore et dolore magna aliqua. Ut enimad minim veniam, quis nostrud exercitation ullamco
6
+ laboris nisi ut aliquip ex ea commodo consequat.
7
+ %h2 Recent Posts
8
+ %ul
9
+ -Aerial::Article.recent.each do |article|
10
+ %li
11
+ %a{:href => "#{article.permalink}"}=article.title
12
+ %h2 Categories
13
+ %ul
14
+ -Aerial::Article.tags.each do |tag|
15
+ %li
16
+ %a{:href => "/tags/#{tag}"}=tag
17
+ %h2 Archives
18
+ %ul
19
+ -Aerial::Article.archives.each do |archive|
20
+ %li
21
+ %a{:href => "/archives/#{archive[0][0]}"}="#{archive[0][1]} (#{archive[1]})"
@@ -0,0 +1,163 @@
1
+ !red = #f00
2
+ !black = #000
3
+ !darkgrey = #555
4
+ !lightgrey = #eeeeee
5
+ !blue = #2168a6
6
+ !red = #ed1e24
7
+
8
+ =image-replacement
9
+ :text-indent -9999px
10
+ :margin-bottom 0.3em
11
+
12
+ body
13
+ :color = !black
14
+ :font normal 12px Verdana, Arial, sans-serif
15
+ :font-size 88%
16
+ :line-height 1.5
17
+ a
18
+ :text-decoration none
19
+ :color = !darkgrey
20
+ &:visited
21
+ :color = !darkgrey
22
+ &:hover, &:visited
23
+ :text-decoration underline
24
+ h2
25
+ :font-size 100%
26
+
27
+ ul
28
+ :padding 0
29
+ li
30
+ :list-style none
31
+ :line-height 1.2
32
+ :margin 0 0 5px 0
33
+ a
34
+ :text-decoration underline
35
+ &:hover
36
+ :text-decoration none
37
+ form
38
+ :background = !lightgrey
39
+ :padding 10px
40
+ :border-top 1px solid #ddd
41
+ :font-size 100%
42
+ p
43
+ :margin 0 0 5px 0
44
+ label
45
+ :font-size 88%
46
+ label.error
47
+ :background-color = !red
48
+ :padding 2px
49
+ :color #fff
50
+ input
51
+ :border 1px solid
52
+ :padding 2px
53
+ :width 300px
54
+ :border-color = #ddd
55
+ :font-size 100%
56
+ textarea
57
+ :border 1px solid
58
+ :border-color = #ddd
59
+ :width 500px
60
+ :padding 3px
61
+ :height 75px
62
+ :font normal 14px Verdana, Arial, sans-serif
63
+
64
+ #header
65
+ :height 60px
66
+ :width 100%
67
+ :border-bottom 1px dashed
68
+ :border-color = !lightgrey
69
+ #logo
70
+ :float left
71
+ :height 50px
72
+ h1
73
+ :font 300% arial, sans-serif
74
+ :padding 5px 0
75
+ :margin 0
76
+ a
77
+ :color = !blue
78
+ :text-decoration none
79
+ span
80
+ :font-size 16pt
81
+ :color = !darkgrey
82
+
83
+ #container
84
+ :width 800px
85
+ :margin 0 auto
86
+
87
+ #content
88
+ :width 575px
89
+ :float left
90
+ :border-right 1px dashed
91
+ :border-color = !lightgrey
92
+ :padding 10px 10px 0 0
93
+ h5
94
+ :font-size 110%
95
+ :background-color #ffd
96
+ :margin 1.2em 0 0.3em
97
+ :padding 3px
98
+ :border-bottom 1px dotted #aaa
99
+ .article, .page
100
+ h2
101
+ :color = !darkgrey
102
+ :font-family arial, sans-serif
103
+ :font-weight normal
104
+ :letter-spacing -1px
105
+ :font-size 28px
106
+ :margin 0 0 -9px 0
107
+ a
108
+ :text-decoration none
109
+ span
110
+ :color = !lightgrey
111
+ h3
112
+ :color #777
113
+ :font-weight normal
114
+ :margin 0 0 0 2px
115
+ :padding 0
116
+ :font-size 110%
117
+ :letter-spacing -0.5px
118
+ .meta
119
+ :font-size 8pt
120
+ :background = !lightgrey
121
+ :padding 5px
122
+ :border 1px solid #ddd
123
+ :margin 15px 0
124
+ span
125
+ :color = !darkgrey !important
126
+ :font-weight bold
127
+
128
+ .comment
129
+ :margin 15px 0
130
+ :padding 10px
131
+ :border 3px solid
132
+ :border-color = !lightgrey
133
+ h2
134
+ span
135
+ :font-size 88%
136
+ :margin-left 5px
137
+ :color #777
138
+
139
+ #sidebar
140
+ :float right
141
+ :width 200px
142
+ :font-size 88%
143
+ p
144
+ :margin-top -7px
145
+ a
146
+ :color = !blue
147
+
148
+ #footer
149
+ :width 100%
150
+ :height 100px
151
+ :float left
152
+ :margin-top 20px
153
+ :border-top 1px dashed
154
+ :border-color = !lightgrey
155
+ p
156
+ :margin-top 5px
157
+ #legal
158
+ :width 40%
159
+ :float left
160
+ #powered
161
+ :width 50%
162
+ :float right
163
+ :text-align right
@@ -0,0 +1,117 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__)
2
+
3
+ require 'rubygems'
4
+ require 'hpricot'
5
+ require 'sinatra'
6
+ require 'git'
7
+ require 'fileutils'
8
+ require 'grit'
9
+ require 'rack'
10
+ require 'spec'
11
+ require 'sinatra/test/rspec'
12
+
13
+ # Helper for matching html tags
14
+ module TagMatchers
15
+
16
+ class TagMatcher
17
+
18
+ def initialize (expected)
19
+ @expected = expected
20
+ @text = nil
21
+ end
22
+
23
+ def with_text (text)
24
+ @text = text
25
+ self
26
+ end
27
+
28
+ def matches? (target)
29
+ @target = target
30
+ doc = Hpricot(target)
31
+ @elem = doc.at(@expected)
32
+ @elem && (@text.nil? || @elem.inner_html == @text)
33
+ end
34
+
35
+ def failure_message
36
+ "Expected #{match_message}"
37
+ end
38
+
39
+ def negative_failure_message
40
+ "Did not expect #{match_message}"
41
+ end
42
+
43
+ protected
44
+
45
+ def match_message
46
+ if @elem
47
+ "#{@elem} to have text #{@text} but got #{@elem.inner_html}"
48
+ else
49
+ "#{@target.inspect} to contain element #{@expected.inspect}"
50
+ end
51
+ end
52
+ end
53
+
54
+ def have_tag (expression)
55
+ TagMatcher.new(expression)
56
+ end
57
+
58
+ end
59
+
60
+ # Helpers for creating a test Git repo
61
+ module GitHelper
62
+
63
+ def new_git_repo
64
+ delete_git_repo # delete the old repo first
65
+
66
+ path = File.expand_path( File.join(File.dirname(__FILE__), 'repo') )
67
+ data = File.expand_path( File.join(File.dirname(__FILE__), 'fixtures') )
68
+ Dir.mkdir(path)
69
+ Dir.chdir(path) do
70
+ git = Git.init
71
+ FileUtils.cp_r "#{data}/.", "#{path}/"
72
+ git.add
73
+ git.commit('Copied test articles from Fixtures directory so we can test against them')
74
+ end
75
+ return path
76
+ end
77
+
78
+ def delete_git_repo
79
+ repo = File.join(File.dirname(__FILE__), 'repo')
80
+ if File.directory? repo
81
+ FileUtils.rm_rf repo
82
+ end
83
+ end
84
+
85
+ def new_file(name, contents)
86
+ File.open(name, 'w') do |f|
87
+ f.puts contents
88
+ end
89
+ end
90
+
91
+ end
92
+
93
+ include GitHelper
94
+
95
+ Spec::Runner.configure do |config|
96
+ repo_path = new_git_repo
97
+ CONFIG = YAML.load_file( File.join(File.dirname(__FILE__), 'fixtures', 'config.yml') ) unless defined?(CONFIG)
98
+ AERIAL_ROOT = File.join(File.dirname(__FILE__), 'repo') unless defined?(AERIAL_ROOT)
99
+ require File.expand_path(File.dirname(__FILE__) + "/../aerial")
100
+ config.include TagMatchers
101
+ config.include GitHelper
102
+ config.include Aerial
103
+ config.include Aerial::Helper
104
+ end
105
+
106
+ # set test environment
107
+ set :environment, :test
108
+ set :run, false
109
+ set :raise_errors, true
110
+ set :logging, false
111
+
112
+ include Aerial
113
+
114
+ def setup_repo
115
+ @repo_path = new_git_repo
116
+ Aerial.stub!(:repo).and_return(Grit::Repo.new(@repo_path))
117
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aerial
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Matt Sears
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-15 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: A simple, blogish software build with Sinatra, jQuery, and uses Git for data storage
17
+ email: matt@mattsears.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.md
24
+ files:
25
+ - .gitignore
26
+ - MIT-LICENSE
27
+ - README.md
28
+ - Rakefile
29
+ - VERSION
30
+ - config/config.yml
31
+ - config/deploy.rb
32
+ - lib/aerial.rb
33
+ - lib/aerial/article.rb
34
+ - lib/aerial/base.rb
35
+ - lib/aerial/comment.rb
36
+ - lib/aerial/config.rb
37
+ - lib/aerial/content.rb
38
+ - lib/aerial/vendor/akismetor.rb
39
+ - lib/aerial/vendor/cache.rb
40
+ - lib/features/article.feature
41
+ - lib/features/home.feature
42
+ - lib/features/step_definitions/article_steps.rb
43
+ - lib/features/step_definitions/home_steps.rb
44
+ - lib/features/support/env.rb
45
+ - lib/features/support/pages/article.rb
46
+ - lib/features/support/pages/homepage.rb
47
+ - lib/spec/aerial_spec.rb
48
+ - lib/spec/article_spec.rb
49
+ - lib/spec/base_spec.rb
50
+ - lib/spec/comment_spec.rb
51
+ - lib/spec/config_spec.rb
52
+ - lib/spec/fixtures/articles/sample-article/sample-article.article
53
+ - lib/spec/fixtures/articles/test-article-one/test-article.article
54
+ - lib/spec/fixtures/articles/test-article-three/test-article.article
55
+ - lib/spec/fixtures/articles/test-article-two/comment-missing-fields.comment
56
+ - lib/spec/fixtures/articles/test-article-two/test-article.article
57
+ - lib/spec/fixtures/articles/test-article-two/test-comment.comment
58
+ - lib/spec/fixtures/config.yml
59
+ - lib/spec/fixtures/public/javascripts/application.js
60
+ - lib/spec/fixtures/public/javascripts/jquery-1.3.1.min.js
61
+ - lib/spec/fixtures/public/javascripts/jquery.template.js
62
+ - lib/spec/fixtures/views/article.haml
63
+ - lib/spec/fixtures/views/articles.haml
64
+ - lib/spec/fixtures/views/comment.haml
65
+ - lib/spec/fixtures/views/home.haml
66
+ - lib/spec/fixtures/views/layout.haml
67
+ - lib/spec/fixtures/views/post.haml
68
+ - lib/spec/fixtures/views/rss.haml
69
+ - lib/spec/fixtures/views/sidebar.haml
70
+ - lib/spec/fixtures/views/style.sass
71
+ - lib/spec/spec_helper.rb
72
+ has_rdoc: true
73
+ homepage: http://github.com/mattsears/aerial
74
+ licenses: []
75
+
76
+ post_install_message:
77
+ rdoc_options:
78
+ - --charset=UTF-8
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: "0"
86
+ version:
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: "0"
92
+ version:
93
+ requirements: []
94
+
95
+ rubyforge_project:
96
+ rubygems_version: 1.3.5
97
+ signing_key:
98
+ specification_version: 3
99
+ summary: A simple, blogish software build with Sinatra, jQuery, and uses Git for data storage
100
+ test_files: []
101
+