spokes_blog 0.0.2 → 0.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6fe259d812ee077303d0c8568d0a53924a821b3e
4
- data.tar.gz: 2f80615157378e1ac24d23f6511fac08291bcb01
3
+ metadata.gz: 6512cf9fc0e532bb2bcda3ef233435ff8341435c
4
+ data.tar.gz: 042c3f97f6342d2c94fec5f9dc488c94b59a6a12
5
5
  SHA512:
6
- metadata.gz: c11e7fcfae26f4703f72477d5966274f90ccc87af915a5e5a610ec68650fe031ea033837196cfb25aed008fd93d1ac4b79a5016abc1e11bd85dfc6212ef868a7
7
- data.tar.gz: 0f1e23c806718d6e84eb4b20d6f082100bfd0fda023ceb1e3700b9028ed88ba2350fb0e713f56b99fc7a91c1c21595c6f082c03f4844580a548a2171ec2ff187
6
+ metadata.gz: 182e4c97fd9107558abe9b2ddb0af5d2cf4fbbfbd25640fe83e8f32450ab47248333b8d8b153501aa339948001f7eee8d67e7083c12d0b9e13d19e851e778d92
7
+ data.tar.gz: a4d4e2b6700204f6a3f6b8b8d8cc147e8f2f6e026c9db8cf64d2e44cd09959934e807fe5a199fc50965fa0650e3f7e39b355ab610e4fe4431eb8c155039d0842
@@ -9,35 +9,40 @@ module SpokesBlog
9
9
  generate "acts_as_taggable_on:migration"
10
10
  end
11
11
 
12
- def generate_files
13
- #models and concerns
12
+ def copy_models_and_concerns
14
13
  copy_file "models/block.rb", "app/models/spokes_blog/block.rb"
15
14
  copy_file "models/post.rb", "app/models/spokes_blog/post.rb"
16
15
  copy_file "models/seo_meta.rb", "app/models/spokes_blog/seo_meta.rb"
17
16
  copy_file "models/concerns/pageable.rb", "app/models/spokes_blog/concerns/pageable.rb"
17
+ end
18
18
 
19
19
 
20
- #controllers
20
+ def copy_controllers
21
21
  copy_file "controllers/admin/posts_controller.rb", "app/controllers/admin/spokes_blog/posts_controller.rb"
22
22
  copy_file "controllers/posts_controller.rb", "app/controllers/spokes_blog/posts_controller.rb"
23
+ end
23
24
 
24
- #admin views
25
+ def copy_admin_views
25
26
  copy_file "views/admin/index.html.haml", "app/views/admin/spokes_blog/posts/index.html.haml"
26
27
  copy_file "views/admin/index.json.jbuilder", "app/views/admin/spokes_blog/posts/index.json.jbuilder"
27
28
  copy_file "views/admin/new.html.haml", "app/views/admin/spokes_blog/posts/new.html.haml"
28
29
  copy_file "views/admin/_form.html.haml", "app/views/admin/spokes_blog/posts/_form.html.haml"
29
30
  copy_file "views/admin/_block_content_form.html.haml", "app/views/admin/spokes_blog/posts/_block_content_form.html.haml"
31
+ copy_file "views/admin/_seo_meta_form.html.haml", "app/views/admin_spokes_blog/posts/_seo_meta_form.html.haml"
32
+ end
30
33
 
31
- #user_views
34
+ def copy_user_views
32
35
  copy_file "views/index.html.haml", "app/views/spokes_blog/posts/index.html.haml"
33
36
  copy_file "views/show.html.haml", "app/views/spokes_blog/posts/show.html.haml"
37
+ end
34
38
 
35
39
 
36
- #presenters
40
+ def copy_presenters
37
41
  copy_file "presenters/presenter.rb", "app/presenters/spokes_blog/presenter.rb"
38
42
  copy_file "presenters/post_presenter.rb", "app/presenters/spokes_blog/post_presenter.rb"
43
+ end
39
44
 
40
- #modify or create user model
45
+ def modify_or_create_user_model
41
46
  if File.exist?(Rails.root.join('app', 'models', 'user.rb')) and
42
47
  File.readlines(Rails.root.join('app', 'models', 'user.rb')).grep(/authored_posts/).size == 0
43
48
  line = "class User < ActiveRecord::Base"
@@ -47,60 +52,67 @@ module SpokesBlog
47
52
  else
48
53
  copy_file "models/user.rb", "app/models/user.rb"
49
54
  end
55
+ end
50
56
 
51
- #modify routes file using default routes
57
+ def add_default_routes
52
58
  if File.readlines(Rails.root.join('config', 'routes.rb')).grep(/spokes_blog/).size == 0
53
59
  line = "::Application.routes.draw do"
54
60
  gsub_file Rails.root.join('config', 'routes.rb'), /(#{Regexp.escape(line)})/mi do |match|
55
61
  %{#{match}
56
- namespace :admin do
57
- scope module: 'spokes_blog' do
58
- resources :posts
59
- end
60
- end
62
+ namespace :admin do
63
+ scope module: 'spokes_blog' do
64
+ resources :posts
65
+ end
66
+ end
61
67
 
62
- scope module: 'spokes_blog' do
63
- resources :posts
64
- end}
68
+ scope module: 'spokes_blog' do
69
+ resources :posts, only: [:index]
70
+ end
71
+ get "/posts/:slug" => "spokes_blog/posts#show", as: :post_slug
72
+ }
65
73
  end
66
74
  end
75
+ end
67
76
 
68
- #modify application.rb ot add models and concerns to load path
77
+ def add_spokes_blog_models_to_load_path
69
78
  if File.readlines(Rails.root.join("config", "application.rb")).grep(/spokes_blog config/).size == 0
70
79
  line = "class Application < Rails::Application"
71
80
  gsub_file Rails.root.join("config", "application.rb"), /(#{Regexp.escape(line)})/mi do |match|
72
81
  %{#{match}
73
- # spokes_blog config
74
- config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/}')]}
82
+ # spokes_blog config
83
+ config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/}')]}
75
84
  end
76
85
  end
86
+ end
77
87
 
78
- #add acts-as-taggable-on to gemfile
79
- add_gem_entry_to_gemfile("acts-as-taggable-on")
80
- add_gem_entry_to_gemfile("haml")
81
- add_gem_entry_to_gemfile("kaminari")
88
+ def add_gems_to_gem_file
89
+ %w(acts-as-taggable-on haml kaminari).each do |gem|
90
+ add_gem_entry_to_gemfile(gem)
91
+ end
92
+ end
82
93
 
83
- #migrations for posts and blocks
94
+ def create_migrations
95
+ @migration_count = 10
84
96
  if Dir.glob("db/migrate/*_create_post.rb").empty?
85
- sleep(1)
97
+ #sleep(1)
86
98
  copy_file "migrations/post_migration.rb", "db/migrate/#{migration_timestamp}_create_post.rb"
87
99
  end
88
100
  if Dir.glob("db/migrate/*_create_block.rb").empty?
89
- sleep(1)
101
+ #sleep(1)
90
102
  copy_file "migrations/block_migration.rb", "db/migrate/#{migration_timestamp}_create_block.rb"
91
103
  end
92
104
  if Dir.glob("db/migrate/*_create_seo_meta.rb").empty?
93
- sleep(1)
105
+ #sleep(1)
94
106
  copy_file "migrations/seo_meta_migration.rb", "db/migrate/#{migration_timestamp}_create_seo_meta.rb"
95
107
  end
96
-
97
108
  end
98
109
 
99
110
  private
100
111
 
101
112
  def migration_timestamp
102
113
  migration_number = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
103
- migration_number += 1
114
+ migration_number += @migration_count
115
+ @migration_count += 1
104
116
  migration_number.to_s
105
117
  end
106
118
 
@@ -47,7 +47,9 @@ class Admin::SpokesBlog::PostsController < ApplicationController
47
47
 
48
48
  def post_params
49
49
  params.require(:spokes_blog_post).permit(:title, :slug, :description, :tag_list,
50
- :author_id, blocks_attributes: [:content, :id])
50
+ :author_id, :state,
51
+ blocks_attributes: [:content, :id],
52
+ seo_meta_attributes: [:browser_title, :meta_description])
51
53
  end
52
54
  end
53
55
 
@@ -1,11 +1,12 @@
1
1
  class SpokesBlog::PostsController < ApplicationController
2
+ around_filter :check_if_record_found, only: :show
2
3
 
3
4
  def index
4
5
  @posts = SpokesBlog::Post.published.page(params[:page]).per(10)
5
6
  end
6
7
 
7
8
  def show
8
- @presenter = post_presenter.single_post(slug: params[:slug])
9
+ @presenter = SpokesBlog::Post.post_presenter.single_post(slug: params[:slug])
9
10
  end
10
11
 
11
12
  private
@@ -13,5 +14,15 @@ class SpokesBlog::PostsController < ApplicationController
13
14
  def post_presenter
14
15
  @post_presenter || @post_presenter = PostPresenter.new
15
16
  end
17
+
18
+ def check_if_record_found
19
+ begin
20
+ yield
21
+ rescue ActiveRecord::RecordNotFound
22
+ #this should be handled in application controller
23
+ raise ActionController::RoutingError.new("Not Found")
24
+ end
25
+ end
26
+
16
27
  end
17
28
 
@@ -26,7 +26,7 @@ module Pageable
26
26
 
27
27
  module ClassMethods
28
28
  def by_slug(slug)
29
- self.find_by(slug: slug)
29
+ self.find_by!(slug: slug)
30
30
  end
31
31
 
32
32
  def by_template(template)
@@ -6,10 +6,13 @@ class SpokesBlog::Post < ActiveRecord::Base
6
6
  belongs_to :created_by, class_name: User
7
7
  belongs_to :author, class_name: User
8
8
  has_many :blocks, class_name: :'SpokesBlog::Block'
9
+ has_one :seo_meta, as: :seo_meta, class_name: :'SpokesBlog::SeoMeta'
9
10
 
10
11
  accepts_nested_attributes_for :blocks,
11
12
  reject_if: lambda { |attrs| attrs['content'].blank? }
12
13
 
14
+ accepts_nested_attributes_for :seo_meta
15
+
13
16
  validates_presence_of :title, :slug
14
17
 
15
18
  validates_format_of :slug, with: /\A[a-zA-Z0-9-]+\z/
@@ -1,4 +1,4 @@
1
- class SeoMeta < ActiveRecord::Base
1
+ class SpokesBlog::SeoMeta < ActiveRecord::Base
2
2
  belongs_to :seo_meta, polymorphic: true
3
3
 
4
4
  end
@@ -1,7 +1,7 @@
1
1
  class SpokesBlog::PostPresenter < Presenter
2
2
 
3
3
  def single_post(params = {})
4
- @post = Post.includes(:author).includes(:blocks).by_slug(params[:slug])
4
+ @post = SpokesBlog::Post.includes(:author).includes(:blocks).includes(:seo_meta).by_slug(params[:slug])
5
5
  self
6
6
  end
7
7
 
@@ -20,5 +20,13 @@ class SpokesBlog::PostPresenter < Presenter
20
20
  def published_at
21
21
  @post.updated_at.strftime("%A, %b %d, %Y")
22
22
  end
23
+
24
+ def browser_title
25
+ @post.seo_meta.browser_title
26
+ end
27
+
28
+ def meta_description
29
+ @post.seo_meta.meta_description
30
+ end
23
31
  end
24
32
 
@@ -1,4 +1,4 @@
1
1
  = f.fields_for :blocks do |block_form|
2
2
  = block_form.label :content
3
- = block_form.text_area
3
+ = block_form.text_area :content
4
4
 
@@ -1,18 +1,25 @@
1
- = form_for [:admin, @post] do |f|
2
- %fieldset
3
- = f.label :title
4
- = f.text_field :title
1
+ %fieldset
2
+ = f.label :title
3
+ = f.text_field :title
5
4
 
6
- = f.label :slug
7
- = f.text_field :slug
5
+ = f.label :slug
6
+ = f.text_field :slug
8
7
 
9
- = f.label :description
10
- = f.text_area :description
8
+ = f.label :description
9
+ = f.text_area :description
11
10
 
12
- = render "block_content_form", { f: f }
11
+ = render "seo_meta_form", { f: f }
13
12
 
14
- = f.label :tags
15
- = f.text_field :tag_list
13
+ = render "block_content_form", { f: f }
16
14
 
17
- = f.submit "Submit"
15
+ = f.label :author_id
16
+ = f.select :author_id, options_from_collection_for_select(User.all.where(role: :admin), "id", "email", current_user.id)
17
+
18
+ = f.label :state
19
+ = f.select :state, options_from_collection_for_select(SpokesBlog::Post::STATES, :last, :first, @post.state)
20
+
21
+ = f.label :tags
22
+ = f.text_field :tag_list
23
+
24
+ = f.submit "Submit"
18
25
 
@@ -0,0 +1,7 @@
1
+ = f.fields_for :seo_meta, @post.seo_meta||SpokesBlog::SeoMeta.new do |meta|
2
+ = meta.label :browser_title
3
+ = meta.text_field :browser_title
4
+
5
+ = meta.label :meta_description
6
+ = meta.text_field :meta_description
7
+
@@ -0,0 +1,2 @@
1
+ = form_for @post, url: admin_post_path(@post) do |f|
2
+ = render "form", { f: f }
@@ -14,12 +14,12 @@
14
14
  $(document).ready(function() {
15
15
  $('.table').dataTable({
16
16
  "bProcessing": true,
17
- "sAjaxSource": "/admin/spokes_blog/posts.json",
17
+ "sAjaxSource": "/admin/posts.json",
18
18
  "sDom": "<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>",
19
19
  "sPaginationType": "bootstrap"
20
20
  });
21
21
 
22
- $.extend($.fin.dataTableExt.oStdClasses, {
22
+ $.extend($.fn.dataTableExt.oStdClasses, {
23
23
  "sWrapper": "dataTables_wrapper form-inline"
24
24
  });
25
25
  });
@@ -1 +1,2 @@
1
- = render "form"
1
+ = form_for @post, url: admin_posts_path(@post) do |f|
2
+ = render "form", { f: f }
@@ -1,6 +1,6 @@
1
1
  = @presenter.title
2
2
  = @presenter.published_at
3
3
  = @presenter.author
4
- - @presenter.blocks.each do |block|
4
+ - @presenter.content.each do |block|
5
5
  = block.content.html_safe
6
6
 
@@ -1,3 +1,3 @@
1
1
  module SpokesBlog
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spokes_blog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Obarzanek
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-02 00:00:00.000000000 Z
12
+ date: 2013-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - '>='
47
47
  - !ruby/object:Gem::Version
48
- version: '0'
48
+ version: '4.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - '>='
54
54
  - !ruby/object:Gem::Version
55
- version: '0'
55
+ version: '4.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: acts-as-taggable-on
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -122,7 +122,9 @@ files:
122
122
  - lib/generators/spokes_blog/templates/views/admin/_block_content_form.html.haml
123
123
  - lib/generators/spokes_blog/templates/views/admin/new.html.haml
124
124
  - lib/generators/spokes_blog/templates/views/admin/index.html.haml
125
+ - lib/generators/spokes_blog/templates/views/admin/edit.html.haml
125
126
  - lib/generators/spokes_blog/templates/views/admin/_form.html.haml
127
+ - lib/generators/spokes_blog/templates/views/admin/_seo_meta_form.html.haml
126
128
  - lib/generators/spokes_blog/templates/views/show.html.haml
127
129
  - lib/generators/spokes_blog/templates/views/index.html.haml
128
130
  - lib/generators/spokes_blog/templates/controllers/admin/posts_controller.rb