content_engine 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +40 -0
  3. data/README.md +43 -0
  4. data/Rakefile +86 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/content_engine/articles_controller.rb +54 -0
  7. data/app/controllers/content_engine/pages_controller.rb +76 -0
  8. data/app/controllers/content_engine_controller.rb +14 -0
  9. data/app/helpers/application_helper.rb +2 -0
  10. data/app/models/article.rb +29 -0
  11. data/app/models/content.rb +64 -0
  12. data/app/models/page.rb +40 -0
  13. data/app/models/site.rb +26 -0
  14. data/app/models/tag.rb +53 -0
  15. data/app/models/user.rb +5 -0
  16. data/app/views/content_engine/articles/_form.erb +8 -0
  17. data/app/views/content_engine/articles/edit.html.erb +7 -0
  18. data/app/views/content_engine/articles/index.html.erb +10 -0
  19. data/app/views/content_engine/articles/new.html.erb +6 -0
  20. data/app/views/content_engine/articles/show.html.erb +9 -0
  21. data/app/views/content_engine/pages/_form.erb +8 -0
  22. data/app/views/content_engine/pages/edit.html.erb +7 -0
  23. data/app/views/content_engine/pages/index.html.erb +10 -0
  24. data/app/views/content_engine/pages/new.html.erb +6 -0
  25. data/app/views/content_engine/pages/show.html.erb +9 -0
  26. data/app/views/layouts/application.html.erb +16 -0
  27. data/config/application.rb +1 -0
  28. data/config/locales/en.yml +5 -0
  29. data/config/routes.rb +25 -0
  30. data/content_engine.gemspec +167 -0
  31. data/db/migrate/20100225105011_create_contents.rb +22 -0
  32. data/db/migrate/20100225105903_create_users.rb +8 -0
  33. data/db/migrate/20100225110024_create_sites.rb +15 -0
  34. data/db/migrate/20100225110037_create_memberships.rb +12 -0
  35. data/db/migrate/20100225112236_acts_as_taggable_on.rb +26 -0
  36. data/db/schema.rb +58 -0
  37. data/lib/content_engine.rb +24 -0
  38. data/lib/tasks/content_engine.rake +24 -0
  39. data/spec/blueprint.rb +41 -0
  40. data/spec/models/article_spec.rb +56 -0
  41. data/spec/models/page_spec.rb +158 -0
  42. data/spec/models/site_spec.rb +32 -0
  43. data/spec/rails_app/.gitignore +4 -0
  44. data/spec/rails_app/Rakefile +10 -0
  45. data/spec/rails_app/app/controllers/admins_controller.rb +6 -0
  46. data/spec/rails_app/app/controllers/application_controller.rb +6 -0
  47. data/spec/rails_app/app/controllers/home_controller.rb +4 -0
  48. data/spec/rails_app/app/controllers/sessions_controller.rb +6 -0
  49. data/spec/rails_app/app/controllers/users_controller.rb +12 -0
  50. data/spec/rails_app/app/helpers/application_helper.rb +3 -0
  51. data/spec/rails_app/app/views/home/index.html.erb +1 -0
  52. data/spec/rails_app/app/views/layouts/application.html.erb +19 -0
  53. data/spec/rails_app/config/application.rb +30 -0
  54. data/spec/rails_app/config/boot.rb +9 -0
  55. data/spec/rails_app/config/database.yml +16 -0
  56. data/spec/rails_app/config/environment.rb +5 -0
  57. data/spec/rails_app/config/environments/development.rb +19 -0
  58. data/spec/rails_app/config/environments/production.rb +33 -0
  59. data/spec/rails_app/config/environments/test.rb +29 -0
  60. data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  61. data/spec/rails_app/config/initializers/cookie_verification_secret.rb +7 -0
  62. data/spec/rails_app/config/initializers/inflections.rb +2 -0
  63. data/spec/rails_app/config/initializers/session_store.rb +15 -0
  64. data/spec/rails_app/config/routes.rb +21 -0
  65. data/spec/rails_app/config.ru +4 -0
  66. data/spec/rails_app/db/migrate/20100225105011_create_contents.rb +22 -0
  67. data/spec/rails_app/db/migrate/20100225105903_create_users.rb +8 -0
  68. data/spec/rails_app/db/migrate/20100225110024_create_sites.rb +15 -0
  69. data/spec/rails_app/db/migrate/20100225110037_create_memberships.rb +12 -0
  70. data/spec/rails_app/db/migrate/20100225112236_acts_as_taggable_on.rb +26 -0
  71. data/spec/rails_app/db/schema.rb +59 -0
  72. data/spec/rails_app/public/404.html +26 -0
  73. data/spec/rails_app/public/422.html +26 -0
  74. data/spec/rails_app/public/500.html +26 -0
  75. data/spec/rails_app/public/favicon.ico +0 -0
  76. data/spec/rails_app/public/images/rails.png +0 -0
  77. data/spec/rails_app/public/javascripts/application.js +2 -0
  78. data/spec/rails_app/public/javascripts/controls.js +963 -0
  79. data/spec/rails_app/public/javascripts/dragdrop.js +973 -0
  80. data/spec/rails_app/public/javascripts/effects.js +1128 -0
  81. data/spec/rails_app/public/javascripts/prototype.js +4320 -0
  82. data/spec/rails_app/public/javascripts/rails.js +110 -0
  83. data/spec/rails_app/public/robots.txt +5 -0
  84. data/spec/rails_app/public/stylesheets/.gitkeep +0 -0
  85. data/spec/rails_app/script/rails +10 -0
  86. data/spec/requests/user_manage_articles_spec.rb +85 -0
  87. data/spec/requests/user_manage_pages_spec.rb +92 -0
  88. data/spec/requests/webrat.log +17 -0
  89. data/spec/spec.opts +2 -0
  90. data/spec/spec_helper.rb +36 -0
  91. metadata +226 -0
data/config/routes.rb ADDED
@@ -0,0 +1,25 @@
1
+ Rails::Application.routes.draw do
2
+ # resources :users, :only => [:index] do
3
+ # get :expire, :on => :member
4
+ # end
5
+ #
6
+ # resources :admins, :only => [:index]
7
+ #
8
+ # devise_for :users
9
+ # devise_for :admin, :as => "admin_area", :controllers => { :sessions => "sessions" }
10
+ # devise_for :accounts, :scope => "manager", :path_prefix => ":locale",
11
+ # :class_name => "User", :path_names => {
12
+ # :sign_in => "login", :sign_out => "logout",
13
+ # :password => "secret", :confirmation => "verification",
14
+ # :unlock => "unblock", :sign_up => "register"
15
+ # }
16
+ #
17
+ # match "/admin_area/home", :to => "admins#index", :as => :admin_root
18
+ # match "/sign_in", :to => "devise/sessions#new"
19
+
20
+ resources :pages, :controller => 'content_engine/pages'
21
+ resources :articles, :controller => 'content_engine/articles'
22
+
23
+ match "/:year/:month/:id", :to => "content_engine/articles#show", :requirements => {:year => /\d{4}/, :month => /\d{2}/}
24
+ match "/*url", :to => 'content_engine/pages#lookup'
25
+ end
@@ -0,0 +1,167 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{content_engine}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Taylor Luk"]
12
+ s.date = %q{2010-02-28}
13
+ s.description = %q{Extracted from shop2, site-rest}
14
+ s.email = %q{taylor.luk@idealian.net}
15
+ s.extra_rdoc_files = [
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ ".gitignore",
20
+ "Gemfile",
21
+ "README.md",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "app/controllers/content_engine/articles_controller.rb",
25
+ "app/controllers/content_engine/pages_controller.rb",
26
+ "app/controllers/content_engine_controller.rb",
27
+ "app/helpers/application_helper.rb",
28
+ "app/models/article.rb",
29
+ "app/models/content.rb",
30
+ "app/models/page.rb",
31
+ "app/models/site.rb",
32
+ "app/models/tag.rb",
33
+ "app/models/user.rb",
34
+ "app/views/content_engine/articles/_form.erb",
35
+ "app/views/content_engine/articles/edit.html.erb",
36
+ "app/views/content_engine/articles/index.html.erb",
37
+ "app/views/content_engine/articles/new.html.erb",
38
+ "app/views/content_engine/articles/show.html.erb",
39
+ "app/views/content_engine/pages/_form.erb",
40
+ "app/views/content_engine/pages/edit.html.erb",
41
+ "app/views/content_engine/pages/index.html.erb",
42
+ "app/views/content_engine/pages/new.html.erb",
43
+ "app/views/content_engine/pages/show.html.erb",
44
+ "app/views/layouts/application.html.erb",
45
+ "config/application.rb",
46
+ "config/locales/en.yml",
47
+ "config/routes.rb",
48
+ "content_engine.gemspec",
49
+ "db/migrate/20100225105011_create_contents.rb",
50
+ "db/migrate/20100225105903_create_users.rb",
51
+ "db/migrate/20100225110024_create_sites.rb",
52
+ "db/migrate/20100225110037_create_memberships.rb",
53
+ "db/migrate/20100225112236_acts_as_taggable_on.rb",
54
+ "db/schema.rb",
55
+ "lib/content_engine.rb",
56
+ "lib/tasks/content_engine.rake",
57
+ "spec/blueprint.rb",
58
+ "spec/models/article_spec.rb",
59
+ "spec/models/page_spec.rb",
60
+ "spec/models/site_spec.rb",
61
+ "spec/rails_app/.gitignore",
62
+ "spec/rails_app/Rakefile",
63
+ "spec/rails_app/app/controllers/application_controller.rb",
64
+ "spec/rails_app/app/controllers/home_controller.rb",
65
+ "spec/rails_app/app/helpers/application_helper.rb",
66
+ "spec/rails_app/app/views/home/index.html.erb",
67
+ "spec/rails_app/app/views/layouts/application.html.erb",
68
+ "spec/rails_app/config.ru",
69
+ "spec/rails_app/config/application.rb",
70
+ "spec/rails_app/config/boot.rb",
71
+ "spec/rails_app/config/database.yml",
72
+ "spec/rails_app/config/environment.rb",
73
+ "spec/rails_app/config/environments/development.rb",
74
+ "spec/rails_app/config/environments/production.rb",
75
+ "spec/rails_app/config/environments/test.rb",
76
+ "spec/rails_app/config/initializers/backtrace_silencers.rb",
77
+ "spec/rails_app/config/initializers/cookie_verification_secret.rb",
78
+ "spec/rails_app/config/initializers/inflections.rb",
79
+ "spec/rails_app/config/initializers/session_store.rb",
80
+ "spec/rails_app/config/routes.rb",
81
+ "spec/rails_app/db/migrate/20100225105011_create_contents.rb",
82
+ "spec/rails_app/db/migrate/20100225105903_create_users.rb",
83
+ "spec/rails_app/db/migrate/20100225110024_create_sites.rb",
84
+ "spec/rails_app/db/migrate/20100225110037_create_memberships.rb",
85
+ "spec/rails_app/db/migrate/20100225112236_acts_as_taggable_on.rb",
86
+ "spec/rails_app/db/schema.rb",
87
+ "spec/rails_app/public/404.html",
88
+ "spec/rails_app/public/422.html",
89
+ "spec/rails_app/public/500.html",
90
+ "spec/rails_app/public/favicon.ico",
91
+ "spec/rails_app/public/images/rails.png",
92
+ "spec/rails_app/public/javascripts/application.js",
93
+ "spec/rails_app/public/javascripts/controls.js",
94
+ "spec/rails_app/public/javascripts/dragdrop.js",
95
+ "spec/rails_app/public/javascripts/effects.js",
96
+ "spec/rails_app/public/javascripts/prototype.js",
97
+ "spec/rails_app/public/javascripts/rails.js",
98
+ "spec/rails_app/public/robots.txt",
99
+ "spec/rails_app/public/stylesheets/.gitkeep",
100
+ "spec/rails_app/script/rails",
101
+ "spec/requests/user_manage_articles_spec.rb",
102
+ "spec/requests/user_manage_pages_spec.rb",
103
+ "spec/requests/webrat.log",
104
+ "spec/spec.opts",
105
+ "spec/spec_helper.rb"
106
+ ]
107
+ s.homepage = %q{http://github.com/idealian/content_engine}
108
+ s.rdoc_options = ["--charset=UTF-8"]
109
+ s.require_paths = ["lib"]
110
+ s.rubygems_version = %q{1.3.6}
111
+ s.summary = %q{A Rails 3 Engine for sexier site and content management}
112
+ s.test_files = [
113
+ "spec/blueprint.rb",
114
+ "spec/models/article_spec.rb",
115
+ "spec/models/page_spec.rb",
116
+ "spec/models/site_spec.rb",
117
+ "spec/rails_app/app/controllers/admins_controller.rb",
118
+ "spec/rails_app/app/controllers/application_controller.rb",
119
+ "spec/rails_app/app/controllers/home_controller.rb",
120
+ "spec/rails_app/app/controllers/sessions_controller.rb",
121
+ "spec/rails_app/app/controllers/users_controller.rb",
122
+ "spec/rails_app/app/helpers/application_helper.rb",
123
+ "spec/rails_app/config/application.rb",
124
+ "spec/rails_app/config/boot.rb",
125
+ "spec/rails_app/config/environment.rb",
126
+ "spec/rails_app/config/environments/development.rb",
127
+ "spec/rails_app/config/environments/production.rb",
128
+ "spec/rails_app/config/environments/test.rb",
129
+ "spec/rails_app/config/initializers/backtrace_silencers.rb",
130
+ "spec/rails_app/config/initializers/cookie_verification_secret.rb",
131
+ "spec/rails_app/config/initializers/inflections.rb",
132
+ "spec/rails_app/config/initializers/session_store.rb",
133
+ "spec/rails_app/config/routes.rb",
134
+ "spec/rails_app/db/migrate/20100225105011_create_contents.rb",
135
+ "spec/rails_app/db/migrate/20100225105903_create_users.rb",
136
+ "spec/rails_app/db/migrate/20100225110024_create_sites.rb",
137
+ "spec/rails_app/db/migrate/20100225110037_create_memberships.rb",
138
+ "spec/rails_app/db/migrate/20100225112236_acts_as_taggable_on.rb",
139
+ "spec/rails_app/db/schema.rb",
140
+ "spec/requests/user_manage_articles_spec.rb",
141
+ "spec/requests/user_manage_pages_spec.rb",
142
+ "spec/spec_helper.rb"
143
+ ]
144
+
145
+ if s.respond_to? :specification_version then
146
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
147
+ s.specification_version = 3
148
+
149
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
150
+ s.add_runtime_dependency(%q<will_paginate>, [">= 0"])
151
+ s.add_runtime_dependency(%q<rdiscount>, [">= 0"])
152
+ s.add_runtime_dependency(%q<formtastic>, [">= 0"])
153
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
154
+ else
155
+ s.add_dependency(%q<will_paginate>, [">= 0"])
156
+ s.add_dependency(%q<rdiscount>, [">= 0"])
157
+ s.add_dependency(%q<formtastic>, [">= 0"])
158
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
159
+ end
160
+ else
161
+ s.add_dependency(%q<will_paginate>, [">= 0"])
162
+ s.add_dependency(%q<rdiscount>, [">= 0"])
163
+ s.add_dependency(%q<formtastic>, [">= 0"])
164
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
165
+ end
166
+ end
167
+
@@ -0,0 +1,22 @@
1
+ class CreateContents < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :contents do |t|
4
+ t.string :title
5
+ t.string :permalink
6
+ t.text :description
7
+ t.text :body
8
+ t.string :type, :default => 'Page'
9
+ t.integer :parent_id
10
+ t.integer :site_id
11
+ t.integer :user_id
12
+ t.integer :lft
13
+ t.integer :rgt
14
+ t.datetime :published_at
15
+ t.timestamps
16
+ end
17
+ end
18
+
19
+ def self.down
20
+ drop_table :contents
21
+ end
22
+ end
@@ -0,0 +1,8 @@
1
+ class CreateUsers < ActiveRecord::Migration
2
+ def self.up
3
+
4
+ end
5
+
6
+ def self.down
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ class CreateSites < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :sites do |t|
4
+ t.string :title
5
+ t.text :description
6
+ t.string :time_zone
7
+ t.integer :owner_id
8
+ t.string :host
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :sites
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ class CreateMemberships < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :memberships do |t|
4
+ t.integer :site_id
5
+ t.integer :user_id
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ drop_table :memberships
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ class ActsAsTaggableOn < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :tags do |t|
4
+ t.column :name, :string
5
+ end
6
+
7
+ create_table :taggings do |t|
8
+ t.column :tag_id, :integer
9
+ t.column :taggable_id, :integer
10
+ t.column :tagger_id, :integer
11
+ t.column :tagger_type, :string
12
+
13
+ # You should make sure that the column created is
14
+ # long enough to store the required class names.
15
+ t.column :taggable_type, :string
16
+ t.column :context, :string
17
+
18
+ t.column :created_at, :datetime
19
+ end
20
+
21
+ add_index :taggings, :tag_id
22
+ end
23
+
24
+ def self.down
25
+ end
26
+ end
data/db/schema.rb ADDED
@@ -0,0 +1,58 @@
1
+ # This file is auto-generated from the current state of the database. Instead of editing this file,
2
+ # please use the migrations feature of Active Record to incrementally modify your database, and
3
+ # then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
+ # to create the application database on another system, you should be using db:schema:load, not running
7
+ # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
9
+ #
10
+ # It's strongly recommended to check this file into your version control system.
11
+ ActiveRecord::Schema.define(:version => 20100225112236) do
12
+
13
+ create_table "contents", :force => true do |t|
14
+ t.string "title"
15
+ t.string "permalink"
16
+ t.text "description"
17
+ t.text "body"
18
+ t.string "type", :default => "Page"
19
+ t.integer "parent_id"
20
+ t.integer "site_id"
21
+ t.integer "user_id"
22
+ t.integer "lft"
23
+ t.integer "rgt"
24
+ t.datetime "published_at"
25
+ t.datetime "created_at"
26
+ t.datetime "updated_at"
27
+ end
28
+
29
+ create_table "memberships", :force => true do |t|
30
+ t.integer "site_id"
31
+ t.integer "user_id"
32
+ end
33
+
34
+ create_table "sites", :force => true do |t|
35
+ t.string "title"
36
+ t.text "description"
37
+ t.string "time_zone"
38
+ t.integer "owner_id"
39
+ t.string "host"
40
+ end
41
+
42
+ create_table "taggings", :force => true do |t|
43
+ t.integer "tag_id"
44
+ t.integer "taggable_id"
45
+ t.integer "tagger_id"
46
+ t.string "tagger_type"
47
+ t.string "taggable_type"
48
+ t.string "context"
49
+ t.datetime "created_at"
50
+ end
51
+
52
+ add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
53
+
54
+ create_table "tags", :force => true do |t|
55
+ t.string "name"
56
+ end
57
+
58
+ end
@@ -0,0 +1,24 @@
1
+ require 'rdiscount'
2
+ require 'will_paginate'
3
+ require 'formtastic'
4
+
5
+ module ContentEngine
6
+ class Engine < ::Rails::Engine
7
+ engine_name :content_engine
8
+ end
9
+ end
10
+
11
+
12
+ # Mixing in plugin methods
13
+
14
+ # Permalink Fu
15
+ ActiveRecord::Base.send(:extend, PermalinkFu::PluginMethods)
16
+
17
+ # ActsAsTaggableOn
18
+ ActiveRecord::Base.send :include, ActiveRecord::Acts::TaggableOn
19
+ ActiveRecord::Base.send :include, ActiveRecord::Acts::Tagger
20
+ ActionView::Base.send :include, TagsHelper if defined?(ActionView::Base)
21
+
22
+ # require 'formtastic/layout_helper'
23
+ ActionView::Base.send :include, Formtastic::SemanticFormHelper
24
+ # ActionView::Base.send :include, Formtastic::LayoutHelper
@@ -0,0 +1,24 @@
1
+ namespace :content_engine do
2
+
3
+ desc "Generate content engine migration files"
4
+ task :migrate do
5
+ puts "Generating migration files"
6
+
7
+ system "rsync -ruv #{File.expand_path('../../../db/migrate', __FILE__)} db"
8
+
9
+ puts "========================="
10
+ puts " Please run db:migrate"
11
+ puts "========================="
12
+ end
13
+
14
+ desc "Execute pending migration and create default site"
15
+ task :install => :environment do
16
+ unless ENV.include?("site")
17
+ raise 'usage: rake content_engine:install site="My site name"'
18
+ end
19
+
20
+ Rake::Task["db:migrate"].invoke
21
+
22
+ Site.create(:name => ENV["site"])
23
+ end
24
+ end
data/spec/blueprint.rb ADDED
@@ -0,0 +1,41 @@
1
+ require 'machinist/active_record'
2
+ require 'sham'
3
+ require 'faker'
4
+
5
+ Sham.name { Faker::Name.name }
6
+ Sham.email { Faker::Internet.email }
7
+ Sham.login { Faker::Internet.user_name }
8
+ Sham.title { Faker::Lorem.sentence }
9
+ Sham.host{|n| "something-else-#{n}"}
10
+ Sham.body { Faker::Company.bs }
11
+
12
+
13
+ Site.blueprint do
14
+ title "Article title"
15
+ host
16
+ end
17
+ #
18
+ Article.blueprint do
19
+ title
20
+ body
21
+ # site { Site.current }
22
+ end
23
+
24
+ Page.blueprint do
25
+ title
26
+ body
27
+ published_at {Time.now.utc}
28
+ # site { Site.current }
29
+ end
30
+
31
+ User.blueprint do
32
+ login
33
+ email
34
+ # password "test password"
35
+ # password_confirmation "test password"
36
+ end
37
+ #
38
+ # Tag.blueprint do
39
+ # title { Sham.title }
40
+ # body "Page body <br />......</br/> The end"
41
+ # end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe Article do
4
+ # context "Validation" do
5
+ # should_validate_presence_of :title, :body
6
+ # should_belong_to :site
7
+ # should_belong_to :user
8
+ # end
9
+
10
+ before do
11
+ @site = Site.make
12
+ @post_1 = @site.articles.make(:title => "first post")
13
+ @post_2 = @site.articles.make(:title => "second post")
14
+ end
15
+
16
+ it "should set published_at when publish" do
17
+ article = @site.articles.make
18
+ article.published?.should == false
19
+
20
+ article.publish!
21
+
22
+ article.published?.should == true
23
+ article.published_at.should be_a(Time)
24
+ end
25
+
26
+ it "has link to prev article" do
27
+ @post_1.publish!
28
+ @post_2.publish!
29
+
30
+ @post_1.prev.should == nil
31
+ @post_2.prev.should == @post_1
32
+ end
33
+
34
+ it "has link to next article" do
35
+ @post_1.publish!
36
+ @post_2.publish!
37
+
38
+ @post_1.next.should == @post_2
39
+ @post_2.next.should == nil
40
+ end
41
+
42
+ it "has a article style url (/:year/:month/:permalink)" do
43
+ pattern = /^\/articles\/[0-9]{4}\/[0-9]{2}\/[0-9]{2}\/([a-z0-9-]+)$/
44
+ Article.make.url.should =~ pattern
45
+ end
46
+
47
+ context "Tagging" do
48
+ it "tag list for multiple tagging" do
49
+ @post_1.tag_list = 'ruby, rails'
50
+
51
+ @post_1.save
52
+
53
+ @post_1.should have(2).tags
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,158 @@
1
+ require 'spec_helper'
2
+
3
+ describe Page do
4
+ before do
5
+ @site = Site.make
6
+ end
7
+ #
8
+ # context "Validations" do
9
+ # it { should validate_presence_of :title, :body, :site_id }
10
+ # it { should belong_to :site }
11
+ # it { should belong_to :user }
12
+ # end
13
+
14
+ context "Page content" do
15
+ before do
16
+ @page = @site.pages.make(:body => '# hello world')
17
+ end
18
+
19
+ it "should make markdown into html" do
20
+ @page.body.should =~ /<h1>hello world<\/h1>/
21
+
22
+ p2 = @site.pages.make(:body => "testing content body")
23
+ p2.body.should =~ /<p>testing content body<\/p>/
24
+ end
25
+
26
+ it "should have access of original source" do
27
+ @page.body_source.should == '# hello world'
28
+ end
29
+ end
30
+
31
+ context "Page hierachy" do
32
+ before do
33
+ @site.pages.count.should == 0
34
+
35
+ @page = @site.pages.make(:body => 'home page content')
36
+ end
37
+
38
+ it "should mark the first page of a site as homepage" do
39
+ @page.root?.should == true
40
+
41
+ @page.children.make(:body => 'second page').root?.should == false
42
+ end
43
+
44
+ it "all pages without a parent becomes direct children of home page" do
45
+ page = @site.pages.make(:title => 'standard page')
46
+ page2 = @site.pages.make(:title => 'standard page 2')
47
+
48
+ @page.children.first.should == page
49
+ @page.children.second.should == page2
50
+
51
+ page.root?.should == false
52
+ page2.root?.should == false
53
+ end
54
+
55
+ it "should have child pages" do
56
+ 3.times { @page.children.make }
57
+ @page.children.count.should == 3
58
+ end
59
+ end
60
+
61
+ context "Page url" do
62
+ before do
63
+ @site.pages.count.should == 0
64
+ @page = @site.pages.make(:title => 'home page content')
65
+ end
66
+
67
+ it "should permalink should be valid" do
68
+ page = @site.pages.make(:title => 'Some of the most complecated page title !@#!123123')
69
+ page.permalink.should =~ /[a-z0-9-]+/
70
+ end
71
+
72
+ it "should make / as root url" do
73
+ @page.url.should == '/'
74
+ end
75
+
76
+ it "should make subpage url" do
77
+ @page.children.make(:title => 'sub page').url.should == '/sub-page'
78
+ end
79
+
80
+ it "should make url based on all ancestors" do
81
+ page2 = @page.children.make(:title => 'sub page 2')
82
+ page2.url.should == '/sub-page-2'
83
+
84
+ page3 = page2.children.make(:title => 'sub sub page')
85
+ page3.url.should == '/sub-page-2/sub-sub-page'
86
+ end
87
+
88
+ it "should be able to find by page url" do
89
+ @site.pages.destroy_all
90
+
91
+ p1 = @site.pages.make(:title => 'home page yo')
92
+ p2 = p1.children.make(:title => 'about')
93
+ p3 = p2.children.make(:title => 'about taylor')
94
+
95
+ @site.pages.root.should == p1
96
+ @site.pages.find_by_url('/about').should == p2
97
+ @site.pages.find_by_url('/about/about-taylor').should == p3
98
+ @site.pages.find_by_url('/about/about-taylor/not-exists').should == nil
99
+
100
+ p4 = @site.pages.make(:title => 'sections')
101
+ p5 = @site.pages.make(:title => 'customer support', :parent => p4)
102
+ p6 = @site.pages.make(:title => 'Return and Refund', :parent => p5)
103
+
104
+ @site.pages.find_by_url('/sections/customer-support/return-and-refund').should == p6
105
+ end
106
+ end
107
+
108
+ context "Permalink scoping" do
109
+ it "should be unique permalink within a site" do
110
+ # Site one
111
+ @site.pages.make(:title => 'home')
112
+ @site.pages.make(:title => 'about')
113
+ @site.pages.make(:title => 'profile')
114
+
115
+ # Site two
116
+ @site2 = Site.make(:title => 'different site')
117
+ @site2.pages.make :title => 'home' do |page|
118
+ page.children.make(:title => 'about', :site => @site2)
119
+ page.children.make(:title => 'profile', :site => @site2)
120
+ end
121
+
122
+ @site.pages.find_by_url('about').site.should == @site
123
+ @site2.pages.find_by_url('about').site.should == @site2
124
+ end
125
+
126
+ it "should scoped to a parent_id" do
127
+ p1 = @site.pages.make(:title => 'home')
128
+ p2 = @site.pages.make(:title => 'about')
129
+
130
+ p3 = @site.pages.make(:title => 'company')
131
+ p4 = p3.children.make(:title => 'about')
132
+
133
+
134
+ p2.permalink.should == 'about'
135
+ p4.permalink.should == 'about'
136
+
137
+ @site.pages.find_by_url('about').should == p2
138
+ @site.pages.find_by_url('company/about').should == p4
139
+ end
140
+ end
141
+
142
+ context "Tagging" do
143
+ it "tag list for multiple tagging" do
144
+ @page = @site.pages.make(:body => 'home page content')
145
+
146
+ @page.tag_list = 'ruby, rails'
147
+
148
+ @page.save
149
+
150
+ @page.should have(2).tags
151
+ end
152
+ end
153
+
154
+ #
155
+ # after do
156
+ # @site.destroy
157
+ # end
158
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Site do
4
+ before do
5
+ @site = Site.make
6
+ @first_page = @site.pages.make(:title => 'home')
7
+ @second_page = @site.pages.make(:title => 'about us')
8
+ end
9
+
10
+ it "has a homepage" do
11
+ @site.homepage.should be_a(Page)
12
+ end
13
+
14
+ it "marks the first page as homepage" do
15
+ @site.homepage.should == @first_page
16
+ end
17
+
18
+ it "has many pages" do
19
+ @site.pages.count.should == 2
20
+ end
21
+
22
+ it "has many articles" do
23
+ @post_1 = @site.articles.make(:title => "first post")
24
+ @post_2 = @site.articles.make(:title => "second post")
25
+
26
+ @site.should have(2).articles
27
+ end
28
+
29
+ it "finds pages by url" do
30
+ @site.pages.find_by_url("")
31
+ end
32
+ end