comfy_blog 0.0.0

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 (78) hide show
  1. data/Gemfile +11 -0
  2. data/LICENSE +20 -0
  3. data/README.md +23 -0
  4. data/Rakefile +21 -0
  5. data/VERSION +1 -0
  6. data/app/assets/images/rails.png +0 -0
  7. data/app/assets/javascripts/application.js +8 -0
  8. data/app/assets/stylesheets/comfy_blog/admin.css +57 -0
  9. data/app/assets/stylesheets/comfy_blog/application.css +73 -0
  10. data/app/assets/stylesheets/comfy_blog/reset.css +1 -0
  11. data/app/controllers/application_controller.rb +5 -0
  12. data/app/controllers/blog/admin/base_controller.rb +3 -0
  13. data/app/controllers/blog/admin/comments_controller.rb +34 -0
  14. data/app/controllers/blog/admin/posts_controller.rb +57 -0
  15. data/app/controllers/blog/posts_controller.rb +33 -0
  16. data/app/helpers/blog/application_helper.rb +16 -0
  17. data/app/models/.gitkeep +0 -0
  18. data/app/models/blog/comment.rb +21 -0
  19. data/app/models/blog/post.rb +81 -0
  20. data/app/models/blog/tag.rb +25 -0
  21. data/app/models/blog/tagging.rb +22 -0
  22. data/app/views/blog/admin/_html_head.html.erb +1 -0
  23. data/app/views/blog/admin/_navigation.html.erb +1 -0
  24. data/app/views/blog/admin/comments/_comment.html.erb +22 -0
  25. data/app/views/blog/admin/comments/destroy.js.erb +3 -0
  26. data/app/views/blog/admin/comments/index.html.erb +10 -0
  27. data/app/views/blog/admin/comments/publish.js.erb +1 -0
  28. data/app/views/blog/admin/posts/_form.html.erb +24 -0
  29. data/app/views/blog/admin/posts/_post.html.erb +21 -0
  30. data/app/views/blog/admin/posts/edit.html.erb +5 -0
  31. data/app/views/blog/admin/posts/index.html.erb +9 -0
  32. data/app/views/blog/admin/posts/new.html.erb +5 -0
  33. data/app/views/blog/posts/_post.html.erb +18 -0
  34. data/app/views/blog/posts/index.html.erb +5 -0
  35. data/app/views/blog/posts/show.html.erb +1 -0
  36. data/app/views/layouts/application.html.erb +17 -0
  37. data/comfy_blog.gemspec +125 -0
  38. data/config.ru +4 -0
  39. data/config/application.rb +48 -0
  40. data/config/boot.rb +6 -0
  41. data/config/database.yml +25 -0
  42. data/config/environment.rb +5 -0
  43. data/config/environments/development.rb +33 -0
  44. data/config/environments/production.rb +51 -0
  45. data/config/environments/test.rb +42 -0
  46. data/config/initializers/comfy_blog.rb +18 -0
  47. data/config/initializers/secret_token.rb +3 -0
  48. data/config/initializers/wrap_parameters.rb +14 -0
  49. data/config/locales/en.yml +5 -0
  50. data/config/routes.rb +29 -0
  51. data/db/migrate/01_create_comfy_blog.rb +55 -0
  52. data/db/schema.rb +63 -0
  53. data/db/seeds.rb +7 -0
  54. data/lib/comfy_blog.rb +26 -0
  55. data/lib/comfy_blog/configuration.rb +33 -0
  56. data/lib/comfy_blog/core_ext/string.rb +8 -0
  57. data/lib/comfy_blog/engine.rb +20 -0
  58. data/lib/comfy_blog/form_builder.rb +50 -0
  59. data/lib/generators/README +10 -0
  60. data/lib/generators/blog_generator.rb +31 -0
  61. data/script/rails +6 -0
  62. data/test/fixtures/.gitkeep +0 -0
  63. data/test/fixtures/blog/comments.yml +6 -0
  64. data/test/fixtures/blog/posts.yml +8 -0
  65. data/test/fixtures/blog/taggings.yml +7 -0
  66. data/test/fixtures/blog/tags.yml +9 -0
  67. data/test/functional/.gitkeep +0 -0
  68. data/test/functional/blog/admin/comments_controller_test.rb +38 -0
  69. data/test/functional/blog/admin/posts_controller_test.rb +100 -0
  70. data/test/functional/blog/posts_controller_test.rb +93 -0
  71. data/test/test_helper.rb +40 -0
  72. data/test/unit/.gitkeep +0 -0
  73. data/test/unit/comment_test.rb +34 -0
  74. data/test/unit/configuration_test.rb +19 -0
  75. data/test/unit/post_test.rb +121 -0
  76. data/test/unit/tag_test.rb +44 -0
  77. data/test/unit/tagging_test.rb +30 -0
  78. metadata +172 -0
@@ -0,0 +1,10 @@
1
+ ____ __ ____ _
2
+ / ___| ___ / _| __ _ | __ )| | ___ __ _
3
+ \___ \ / _ \| |_ / _` | | _ \| |/ _ \ / _` |
4
+ ___) | (_) | _| (_| | | |_) | | (_) | (_| |
5
+ |____/ \___/|_| \__,_| |____/|_|\___/ \__, |
6
+ |___/
7
+
8
+ Hey! Everything is almost done. Please don't forget to
9
+
10
+ * run migrations -> `rake db:migrate`
@@ -0,0 +1,31 @@
1
+ class BlogGenerator < Rails::Generators::Base
2
+ require 'rails/generators/active_record'
3
+ include Rails::Generators::Migration
4
+ include Thor::Actions
5
+
6
+ source_root File.expand_path('../../..', __FILE__)
7
+
8
+ def generate_migration
9
+ destination = File.expand_path('db/migrate/01_create_sofa_blog.rb', self.destination_root)
10
+ migration_dir = File.dirname(destination)
11
+ destination = self.class.migration_exists?(migration_dir, 'create_sofa_blog')
12
+
13
+ if destination
14
+ puts "\e[0m\e[31mFound existing create_sofa_blog.rb migration. Remove it if you want to regenerate.\e[0m"
15
+ else
16
+ migration_template 'db/migrate/01_create_comfy_blog.rb', 'db/migrate/create_comfy_blog.rb'
17
+ end
18
+ end
19
+
20
+ def generate_initialization
21
+ copy_file 'config/initializers/comfy_blog.rb', 'config/initializers/comfy_blog.rb'
22
+ end
23
+
24
+ def show_readme
25
+ readme 'lib/generators/README'
26
+ end
27
+
28
+ def self.next_migration_number(dirname)
29
+ ActiveRecord::Generators::Base.next_migration_number(dirname)
30
+ end
31
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
File without changes
@@ -0,0 +1,6 @@
1
+ default:
2
+ post: default
3
+ author: Default Name
4
+ email: default@test.test
5
+ content: Default Content
6
+ is_published: true
@@ -0,0 +1,8 @@
1
+ default:
2
+ title: Default Title
3
+ slug: default-title
4
+ content: Default Content
5
+ author: Default Author
6
+ is_published: true
7
+ year: 2012
8
+ month: 1
@@ -0,0 +1,7 @@
1
+ tag:
2
+ post: default
3
+ tag: tag
4
+
5
+ category:
6
+ post: default
7
+ tag: category
@@ -0,0 +1,9 @@
1
+ tag:
2
+ name: tag
3
+ taggings_count: 1
4
+ is_category: false
5
+
6
+ category:
7
+ name: category
8
+ taggings_count: 1
9
+ is_category: true
File without changes
@@ -0,0 +1,38 @@
1
+ require File.expand_path('../../../test_helper', File.dirname(__FILE__))
2
+
3
+ class Blog::Admin::CommentsControllerTest < ActionController::TestCase
4
+
5
+ def test_get_index
6
+ get :index
7
+ assert_response :success
8
+ assert_template :index
9
+ assert assigns(:comments)
10
+ assert !assigns(:post)
11
+ end
12
+
13
+ def test_get_index_for_post
14
+ get :index, :post_id => blog_posts(:default)
15
+ assert_response :success
16
+ assert_template :index
17
+ assert assigns(:post)
18
+ assert assigns(:comments)
19
+ end
20
+
21
+ def test_publish
22
+ comment = blog_comments(:default)
23
+ comment.update_attribute(:is_published, false)
24
+ xhr :put, :publish, :id => comment
25
+ assert_response :success
26
+
27
+ comment.reload
28
+ assert comment.is_published
29
+ end
30
+
31
+ def test_destroy
32
+ assert_difference 'Blog::Comment.count', -1 do
33
+ xhr :delete, :destroy, :id => blog_comments(:default)
34
+ assert_response :success
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,100 @@
1
+ require File.expand_path('../../../test_helper', File.dirname(__FILE__))
2
+
3
+ class Blog::Admin::PostsControllerTest < ActionController::TestCase
4
+
5
+ def test_get_index
6
+ get :index
7
+ assert_response :success
8
+ assert assigns(:posts)
9
+ assert_template :index
10
+ end
11
+
12
+ def test_get_index_with_pagination
13
+ get :index, :page => 99
14
+ assert_response :success
15
+ assert assigns(:posts)
16
+ assert_equal 0, assigns(:posts).size
17
+ end
18
+
19
+ def test_get_new
20
+ get :new
21
+ assert_response :success
22
+ assert assigns(:post)
23
+ assert_template :new
24
+ assert_select "form[action='/admin/posts']"
25
+ end
26
+
27
+ def test_creation
28
+ assert_difference 'Blog::Post.count' do
29
+ post :create, :post => {
30
+ :title => 'Test',
31
+ :content => 'Content'
32
+ }
33
+ assert_response :success
34
+ assert_template :new
35
+ assert assigns(:post)
36
+ assert_equal 'Blog Post created', flash[:notice]
37
+ end
38
+ end
39
+
40
+ def test_creation_failure
41
+ assert_no_difference 'Blog::Post.count' do
42
+ post :create, :post => { }
43
+ assert_response :success
44
+ assert_template :new
45
+ assert assigns(:post)
46
+ assert_equal 'Failed to create Blog Post', flash[:error]
47
+ end
48
+ end
49
+
50
+ def test_get_edit
51
+ get :edit, :id => blog_posts(:default)
52
+ assert_response :success
53
+ assert_template :edit
54
+ assert assigns(:post)
55
+ end
56
+
57
+ def test_get_edit_failure
58
+ get :edit, :id => 'bogus'
59
+ assert_response :redirect
60
+ assert_redirected_to :action => :index
61
+ assert_equal 'Blog Post not found', flash[:error]
62
+ end
63
+
64
+ def test_update
65
+ post = blog_posts(:default)
66
+ put :update, :id => post, :post => {
67
+ :title => 'Updated Post'
68
+ }
69
+ assert_response :success
70
+ assert_template :edit
71
+ assert assigns(:post)
72
+ assert_equal 'Blog Post updated', flash[:notice]
73
+
74
+ post.reload
75
+ assert_equal 'Updated Post', post.title
76
+ end
77
+
78
+ def test_update_failure
79
+ post = blog_posts(:default)
80
+ put :update, :id => post, :post => {
81
+ :title => ''
82
+ }
83
+ assert_response :success
84
+ assert_template :edit
85
+ assert_equal 'Failed to update Blog Post', flash[:error]
86
+
87
+ post.reload
88
+ assert_not_equal '', post.title
89
+ end
90
+
91
+ def test_destroy
92
+ assert_difference 'Blog::Post.count', -1 do
93
+ delete :destroy, :id => blog_posts(:default)
94
+ assert_response :redirect
95
+ assert_redirected_to :action => :index
96
+ assert_equal 'Blog Post removed', flash[:notice]
97
+ end
98
+ end
99
+
100
+ end
@@ -0,0 +1,93 @@
1
+ require File.expand_path('../../test_helper', File.dirname(__FILE__))
2
+
3
+ class Blog::PostsControllerTest < ActionController::TestCase
4
+
5
+ def test_get_index
6
+ get :index
7
+ assert_response :success
8
+ assert_template :index
9
+ assert assigns(:posts)
10
+ assert_equal 1, assigns(:posts).size
11
+ end
12
+
13
+ def test_get_index_with_unpublished
14
+ blog_posts(:default).update_attribute(:is_published, false)
15
+ get :index
16
+ assert_response :success
17
+ assert_equal 0, assigns(:posts).size
18
+ end
19
+
20
+ def test_get_index_with_pagination
21
+ get :index, :page => 99
22
+ assert_response :success
23
+ assert_equal 0, assigns(:posts).size
24
+ end
25
+
26
+ def test_get_index_for_tagged
27
+ get :index, :tag => blog_tags(:tag).name
28
+ assert_response :success
29
+ assert_equal 1, assigns(:posts).size
30
+
31
+ get :index, :tag => 'invalid'
32
+ assert_response :success
33
+ assert_equal 0, assigns(:posts).size
34
+ end
35
+
36
+ def test_get_index_for_categorized
37
+ get :index, :category => blog_tags(:category).name
38
+ assert_response :success
39
+ assert_equal 1, assigns(:posts).size
40
+
41
+ get :index, :category => 'invalid'
42
+ assert_response :success
43
+ assert_equal 0, assigns(:posts).size
44
+ end
45
+
46
+ def test_get_index_for_year_archive
47
+ get :index, :year => 2012
48
+ assert_response :success
49
+ assert_equal 1, assigns(:posts).size
50
+
51
+ get :index, :year => 1999
52
+ assert_response :success
53
+ assert_equal 0, assigns(:posts).size
54
+ end
55
+
56
+ def test_get_index_for_month_archive
57
+ get :index, :year => 2012, :month => 1
58
+ assert_response :success
59
+ assert_equal 1, assigns(:posts).size
60
+
61
+ get :index, :year => 2012, :month => 12
62
+ assert_response :success
63
+ assert_equal 0, assigns(:posts).size
64
+ end
65
+
66
+ def test_get_show
67
+ get :show, :id => blog_posts(:default)
68
+ assert_response :success
69
+ assert_template :show
70
+ assert assigns(:post)
71
+ end
72
+
73
+ def test_get_show_unpublished
74
+ post = blog_posts(:default)
75
+ post.update_attribute(:is_published, false)
76
+ get :show, :id => post
77
+ assert_response 404
78
+ end
79
+
80
+ def test_get_show_with_date
81
+ post = blog_posts(:default)
82
+ get :show, :year => post.year, :month => post.month, :slug => blog_posts(:default).slug
83
+ assert_response :success
84
+ assert_template :show
85
+ assert assigns(:post)
86
+ end
87
+
88
+ def test_get_show_with_date_invalid
89
+ get :show, :year => '1999', :month => '99', :slug => 'invalid'
90
+ assert_response 404
91
+ end
92
+
93
+ end
@@ -0,0 +1,40 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+
7
+ fixtures :all
8
+ include ActionDispatch::TestProcess
9
+
10
+ def setup
11
+ reset_config
12
+ end
13
+
14
+ # resetting default configuration
15
+ def reset_config
16
+ ComfyBlog.configure do |config|
17
+ config.admin_route_prefix = 'admin'
18
+ config.public_route_prefix = ''
19
+ config.admin_controller = 'ApplicationController'
20
+ config.form_builder = 'ActionView::Helpers::FormBuilder'
21
+ config.public_layout = 'application'
22
+ config.posts_per_page = 10
23
+ end
24
+ end
25
+
26
+ # Example usage:
27
+ # assert_has_errors_on( @record, [:field_1, :field_2] )
28
+ # assert_has_errors_on( @record, {:field_1 => 'Message1', :field_2 => 'Message 2'} )
29
+ def assert_has_errors_on(record, fields)
30
+ fields = [fields].flatten unless fields.is_a?(Hash)
31
+ fields.each do |field, message|
32
+ assert record.errors.to_hash.has_key?(field.to_sym), "#{record.class.name} should error on invalid #{field}"
33
+ if message && record.errors[field].is_a?(Array) && !message.is_a?(Array)
34
+ assert_not_nil record.errors[field].index(message)
35
+ elsif message
36
+ assert_equal message, record.errors[field]
37
+ end
38
+ end
39
+ end
40
+ end
File without changes
@@ -0,0 +1,34 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class CommentTest < ActiveSupport::TestCase
4
+
5
+ def test_fixtures_validity
6
+ Blog::Comment.all.each do |comment|
7
+ assert comment.valid?, comment.errors.full_messages.to_s
8
+ end
9
+ end
10
+
11
+ def test_validations
12
+ comment = Blog::Comment.new
13
+ assert comment.invalid?
14
+ assert_has_errors_on comment, [:post_id, :content, :author, :email]
15
+ end
16
+
17
+ def test_creation
18
+ assert_difference 'Blog::Comment.count' do
19
+ blog_posts(:default).comments.create(
20
+ :content => 'Test Content',
21
+ :author => 'Tester',
22
+ :email => 'test@test.test'
23
+ )
24
+ end
25
+ end
26
+
27
+ def test_scope_published
28
+ assert_equal 1, Blog::Comment.published.count
29
+
30
+ blog_comments(:default).update_attribute(:is_published, false)
31
+ assert_equal 0, Blog::Comment.published.count
32
+ end
33
+
34
+ end
@@ -0,0 +1,19 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class ConfigurationTest < ActiveSupport::TestCase
4
+
5
+ def test_configuration
6
+ assert config = ComfyBlog.configuration
7
+ assert_equal 'admin', config.admin_route_prefix
8
+ assert_equal '', config.public_route_prefix
9
+ assert_equal 'ApplicationController', config.admin_controller
10
+ assert_equal 'ActionView::Helpers::FormBuilder', config.form_builder
11
+ assert_equal 10, config.posts_per_page
12
+ end
13
+
14
+ def test_initialization_overrides
15
+ ComfyBlog.config.admin_route_prefix = 'new-admin'
16
+ assert_equal 'new-admin', ComfyBlog.config.admin_route_prefix
17
+ end
18
+
19
+ end
@@ -0,0 +1,121 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class PostTest < ActiveSupport::TestCase
4
+
5
+ def test_fixtures_validity
6
+ Blog::Post.all.each do |post|
7
+ assert post.valid?, post.errors.full_messages.to_s
8
+ end
9
+ end
10
+
11
+ def test_validation
12
+ post = Blog::Post.new
13
+ assert post.invalid?
14
+ assert_has_errors_on post, [:title, :slug, :content]
15
+ end
16
+
17
+ def test_validation_of_slug_uniqueness
18
+ old_post = blog_posts(:default)
19
+ old_post.update_attributes!(:year => Time.now.year, :month => Time.now.month)
20
+ post = Blog::Post.new(:title => old_post.title, :content => 'Test Content')
21
+ assert post.invalid?
22
+ assert_has_errors_on post, [:slug]
23
+
24
+ old_post.update_attributes!(:year => 1.year.ago.year, :month => Time.now.month)
25
+ assert post.valid?
26
+ end
27
+
28
+ def test_creation
29
+ assert_difference 'Blog::Post.count' do
30
+ post = Blog::Post.create!(
31
+ :title => 'Test Post',
32
+ :content => 'Test Content'
33
+ )
34
+ assert_equal 'test-post', post.slug
35
+ assert_equal Time.now.year, post.year
36
+ assert_equal Time.now.month, post.month
37
+ end
38
+ end
39
+
40
+ def test_set_slug
41
+ post = Blog::Post.new(:title => 'Test Title')
42
+ post.send(:set_slug)
43
+ assert_equal 'test-title', post.slug
44
+ end
45
+
46
+ def test_set_date
47
+ post = Blog::Post.new
48
+ post.send(:set_date)
49
+ assert_equal Time.now.year, post.year
50
+ assert_equal Time.now.month, post.month
51
+ end
52
+
53
+ def test_sync_tags
54
+ post = blog_posts(:default)
55
+ assert_equal 'tag', post.tag_names
56
+
57
+ post.tag_names = 'one, two, three'
58
+ assert_equal 'one, two, three', post.tag_names
59
+
60
+ assert_difference ['Blog::Tag.count', 'Blog::Tagging.count'], 2 do
61
+ post.save!
62
+ post.reload
63
+ assert_equal 'one, two, three', post.tag_names
64
+ end
65
+ end
66
+
67
+ def test_sync_categories
68
+ post = blog_posts(:default)
69
+ assert_equal 1, post.tags.categories.count
70
+
71
+ assert_difference 'Blog::Tagging.count', -1 do
72
+ post.update_attribute(:category_ids, blog_tags(:category).id => 0)
73
+ post.reload
74
+ assert_equal 0, post.tags.categories.count
75
+ end
76
+
77
+ assert_difference 'Blog::Tagging.count' do
78
+ post.update_attribute(:category_ids, blog_tags(:category).id => 1)
79
+ post.reload
80
+ assert_equal 1, post.tags.categories.count
81
+ end
82
+ end
83
+
84
+ def test_destroy
85
+ assert_difference ['Blog::Post.count', 'Blog::Comment.count'], -1 do
86
+ blog_posts(:default).destroy
87
+ end
88
+ end
89
+
90
+ def test_scope_published
91
+ post = blog_posts(:default)
92
+ assert post.is_published?
93
+ assert_equal 1, Blog::Post.published.count
94
+
95
+ post.update_attribute(:is_published, false)
96
+ assert_equal 0, Blog::Post.published.count
97
+ end
98
+
99
+ def test_scope_for_year
100
+ assert_equal 1, Blog::Post.for_year(2012).count
101
+ assert_equal 0, Blog::Post.for_year(2013).count
102
+ end
103
+
104
+ def test_scope_for_month
105
+ assert_equal 1, Blog::Post.for_month(1).count
106
+ assert_equal 0, Blog::Post.for_month(2).count
107
+ end
108
+
109
+ def test_scope_tagged_with
110
+ assert_equal 1, Blog::Post.tagged_with('tag').count
111
+ assert_equal 0, Blog::Post.tagged_with('category').count
112
+ assert_equal 0, Blog::Post.tagged_with('invalid').count
113
+ end
114
+
115
+ def test_scope_categorized_as
116
+ assert_equal 1, Blog::Post.categorized_as('category').count
117
+ assert_equal 0, Blog::Post.categorized_as('tag').count
118
+ assert_equal 0, Blog::Post.categorized_as('invalid').count
119
+ end
120
+
121
+ end