site_logic 1.9.2 → 1.9.3
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.
- data/Gemfile +1 -1
- data/VERSION +1 -1
- data/app/models/nav_item.rb +8 -24
- data/app/models/page.rb +16 -18
- data/app/models/redirect.rb +5 -25
- data/app/models/site.rb +16 -30
- data/app/views/admin/pages/_form.html.erb +1 -1
- data/init.rb +1 -1
- data/lib/site_logic/navigation.rb +0 -5
- data/lib/site_logic/railtie.rb +0 -2
- data/lib/site_logic.rb +6 -3
- data/site_logic.gemspec +5 -16
- data/spec/blueprints.rb +10 -15
- data/spec/controllers/admin/pages_controller_spec.rb +3 -3
- data/spec/controllers/admin/redirects_controller_spec.rb +3 -3
- data/spec/controllers/admin/sites_controller_spec.rb +1 -1
- data/spec/controllers/pages_controller_spec.rb +4 -5
- data/spec/models/nav_item_spec.rb +1 -1
- data/spec/models/page_spec.rb +15 -17
- data/spec/models/redirect_spec.rb +1 -1
- data/spec/models/site_spec.rb +1 -1
- metadata +27 -23
- data/Capfile +0 -4
- data/README.rdoc +0 -17
- data/config/deploy.rb +0 -40
- data/config/locales/en.yml +0 -5
- data/lib/site_logic/base.rb +0 -41
- data/lib/site_logic/engine.rb +0 -7
- data/public/404.html +0 -26
- data/public/422.html +0 -26
- data/public/500.html +0 -26
- data/public/javascripts/link_obfuscator.js +0 -31
- data/public/robots.txt +0 -5
data/Gemfile
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
|
-
source 'http://jose.seologic.com:8808/'
|
3
2
|
|
4
3
|
gem 'bson_ext'
|
5
4
|
gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'
|
@@ -9,6 +8,7 @@ gem 'mongoid-tree', :require => 'mongoid/tree'
|
|
9
8
|
gem 'rails', '3.0.10'
|
10
9
|
gem 'rmagick', '2.12.2' # version compatible with heroku
|
11
10
|
gem 'scaffold_logic', '>= 1.0.3'
|
11
|
+
gem 'stringex'
|
12
12
|
gem 'SystemTimer'
|
13
13
|
gem 'tanker'
|
14
14
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.9.
|
1
|
+
1.9.3
|
data/app/models/nav_item.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
class NavItem
|
2
|
-
|
3
2
|
include Mongoid::Document
|
4
3
|
include Mongoid::Timestamps
|
5
|
-
include SiteLogic::Base
|
6
4
|
|
7
|
-
#
|
5
|
+
# Constants ======================================================================================
|
6
|
+
KINDS = ['Main', 'Secondary', 'Footer']
|
8
7
|
|
8
|
+
# Mongoid ========================================================================================
|
9
9
|
field :link_title
|
10
10
|
field :link_text
|
11
11
|
field :url
|
@@ -13,39 +13,24 @@ class NavItem
|
|
13
13
|
field :position, :type => Integer
|
14
14
|
field :obfuscate, :type => Boolean
|
15
15
|
field :kind
|
16
|
-
|
17
|
-
# Indices ========================================================================================
|
18
|
-
|
19
|
-
# Scopes =========================================================================================
|
16
|
+
embedded_in :site, :inverse_of => :nav_items
|
20
17
|
scope :roots, :where => {:parent_id => nil}
|
21
18
|
scope :primary, :where => {:kind => 'Main'}
|
22
19
|
scope :secondary, :where => {:kind => 'Secondary'}
|
23
20
|
scope :footer, :where => {:kind => 'Footer'}
|
24
21
|
|
25
|
-
# Relationships ==================================================================================
|
26
|
-
embedded_in :site, :inverse_of => :nav_items
|
27
|
-
|
28
22
|
# Behavior =======================================================================================
|
29
23
|
attr_accessor :status
|
30
24
|
attr_accessor :creating_page
|
31
25
|
|
32
|
-
# Constants ======================================================================================
|
33
|
-
|
34
|
-
KINDS = ["Main", "Secondary", "Footer"]
|
35
|
-
|
36
|
-
# Callbacks ======================================================================================
|
37
|
-
|
38
26
|
# Validations ====================================================================================
|
39
27
|
validates_presence_of :link_text
|
40
28
|
validates_presence_of :link_title
|
41
29
|
validates_presence_of :url
|
42
30
|
|
43
|
-
# Class methods ==================================================================================
|
44
|
-
|
45
31
|
# Instance methods ===============================================================================
|
46
|
-
|
47
32
|
def children
|
48
|
-
self.site.nav_items.select{|ni| ni.parent_id == self.id.to_s}.
|
33
|
+
self.site.nav_items.select{|ni| ni.parent_id == self.id.to_s}.sort_by{|ni| ni.position.to_i}
|
49
34
|
end
|
50
35
|
|
51
36
|
def decoded_url
|
@@ -53,7 +38,7 @@ class NavItem
|
|
53
38
|
end
|
54
39
|
|
55
40
|
def encoded_url
|
56
|
-
self[:url].gsub(
|
41
|
+
self[:url].gsub('/', '#').tr('A-Ma-mN-Zn-z', 'N-Zn-zA-Ma-m')
|
57
42
|
end
|
58
43
|
|
59
44
|
def omit_from_sitemap?
|
@@ -61,7 +46,7 @@ class NavItem
|
|
61
46
|
end
|
62
47
|
|
63
48
|
def parent
|
64
|
-
self.site.nav_items.find
|
49
|
+
self.site.nav_items.find self.parent_id
|
65
50
|
end
|
66
51
|
|
67
52
|
def root?
|
@@ -79,5 +64,4 @@ class NavItem
|
|
79
64
|
def url
|
80
65
|
@url = self.obfuscate? ? encoded_url : self[:url]
|
81
66
|
end
|
82
|
-
|
83
|
-
end
|
67
|
+
end
|
data/app/models/page.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Page
|
2
|
+
include LuckySneaks::StringExtensions
|
2
3
|
include Mongoid::Document
|
3
4
|
include Mongoid::Timestamps
|
4
|
-
include SiteLogic::Base
|
5
5
|
include Tanker
|
6
6
|
|
7
7
|
# Constants ======================================================================================
|
@@ -33,8 +33,9 @@ class Page
|
|
33
33
|
|
34
34
|
# Behavior =======================================================================================
|
35
35
|
attr_accessor :create_navigation_item
|
36
|
-
|
37
|
-
|
36
|
+
before_save :set_slug
|
37
|
+
validates_presence_of :content, :page_title
|
38
|
+
validates_uniqueness_of :slug
|
38
39
|
|
39
40
|
# Tanker =========================================================================================
|
40
41
|
tankit 'idx' do
|
@@ -47,31 +48,22 @@ class Page
|
|
47
48
|
after_destroy :delete_tank_indexes
|
48
49
|
after_save :update_tank_indexes
|
49
50
|
|
50
|
-
# Validations ====================================================================================
|
51
|
-
class DesiredSlugPresenceAndUniquenessValidator < ActiveModel::EachValidator
|
52
|
-
def validate_each(object, attribute, value)
|
53
|
-
return unless object.desired_slug
|
54
|
-
if object.site && object.site.pages.map{|p| p.slug unless p == object}.include?(object.desired_slug)
|
55
|
-
object.errors[attribute] << (options[:message] || 'must be unique.')
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
validates :desired_slug, :desired_slug_presence_and_uniqueness => true
|
61
|
-
validates_presence_of :page_title
|
62
|
-
validates_presence_of :content
|
63
|
-
|
64
51
|
# Instance methods ===============================================================================
|
65
52
|
def draft?
|
66
53
|
self.state == 'draft' || self.state.nil?
|
67
54
|
end
|
68
55
|
|
56
|
+
# @deprecated Please use {#path} instead
|
69
57
|
def humanize_path
|
58
|
+
warn "[DEPRECATION] `humanize_path` is deprecated. Please use `path` instead."
|
70
59
|
self.path
|
71
60
|
end
|
72
61
|
|
62
|
+
# Returns this page's path.
|
63
|
+
#
|
64
|
+
# @return [String] the path for this page
|
73
65
|
def path
|
74
|
-
self.slug == '' ? '/' : "/#{self.slug}".gsub(
|
66
|
+
self.slug == '' ? '/' : "/#{self.slug}".gsub('//', '/')
|
75
67
|
end
|
76
68
|
|
77
69
|
def publish!
|
@@ -105,4 +97,10 @@ class Page
|
|
105
97
|
def window_title
|
106
98
|
self[:window_title] || self.page_title
|
107
99
|
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def set_slug
|
104
|
+
self.slug = (self.window_title || self.page_title).to_s.to_url if self.slug.blank?
|
105
|
+
end
|
108
106
|
end
|
data/app/models/redirect.rb
CHANGED
@@ -1,39 +1,19 @@
|
|
1
1
|
class Redirect
|
2
|
-
|
3
2
|
include Mongoid::Document
|
4
3
|
include Mongoid::Timestamps
|
5
|
-
include SiteLogic::Base
|
6
|
-
|
7
|
-
# Attributes =====================================================================================
|
8
4
|
|
5
|
+
# Mongoid ========================================================================================
|
9
6
|
field :source_url
|
10
7
|
field :destination_url
|
11
|
-
|
12
|
-
# Indices ========================================================================================
|
13
8
|
index :source_url, :unique => true
|
14
|
-
|
15
|
-
# Constants ======================================================================================
|
16
|
-
|
17
|
-
# Scopes ===================================================================================
|
18
|
-
|
19
|
-
# Relationships ==================================================================================
|
20
9
|
embedded_in :site, :inverse_of => :redirects
|
21
10
|
|
22
11
|
# Behavior =======================================================================================
|
23
|
-
|
24
|
-
# Callbacks ======================================================================================
|
25
|
-
|
26
|
-
# Validations ====================================================================================
|
27
|
-
validates_presence_of :source_url
|
28
|
-
validates_presence_of :destination_url
|
12
|
+
validates_presence_of :destination_url, :source_url
|
29
13
|
validates_uniqueness_of :source_url
|
30
14
|
|
31
|
-
# Class methods ==================================================================================
|
32
|
-
|
33
15
|
# Instance methods ===============================================================================
|
34
|
-
|
35
|
-
|
36
|
-
self[:source_url] = url.gsub(/^http:\/\/.+\.#{self.site.try(:domain)}/,'')
|
16
|
+
def source_url= url
|
17
|
+
self[:source_url] = url.gsub /^http:\/\/.+\.#{self.site.try(:domain)}/, ''
|
37
18
|
end
|
38
|
-
|
39
|
-
end
|
19
|
+
end
|
data/app/models/site.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
class Site
|
2
|
-
|
3
2
|
include Mongoid::Document
|
4
3
|
include Mongoid::Timestamps
|
5
|
-
include SiteLogic::Base
|
6
4
|
|
7
|
-
#
|
5
|
+
# Constants ======================================================================================
|
6
|
+
STATES = ['inactive', 'active']
|
8
7
|
|
8
|
+
# Scopes ===================================================================================
|
9
|
+
scope :active, :where => {:state => 'active'}
|
10
|
+
scope :inactive, :where => {:state => 'inactive'}
|
11
|
+
|
12
|
+
# Mongoid ========================================================================================
|
9
13
|
field :domain
|
10
14
|
field :name
|
11
15
|
field :layout
|
@@ -17,58 +21,41 @@ class Site
|
|
17
21
|
field :bing_webmaster_code
|
18
22
|
field :netinsert_code
|
19
23
|
field :activation_date, :type => DateTime
|
20
|
-
|
21
|
-
# Indices ========================================================================================
|
22
24
|
index :domain, :unique => true
|
23
25
|
index :name, :unique => true
|
24
|
-
|
25
|
-
# Constants ======================================================================================
|
26
|
-
STATES = ['inactive', 'active']
|
27
|
-
|
28
|
-
# Scopes ===================================================================================
|
29
|
-
scope :active, :where => {:state => 'active'}
|
30
|
-
scope :inactive, :where => {:state => 'inactive'}
|
31
|
-
|
32
|
-
# Relationships ==================================================================================
|
33
26
|
embeds_many :pages
|
34
27
|
embeds_many :nav_items
|
35
28
|
embeds_many :redirects
|
36
29
|
|
37
30
|
# Behavior =======================================================================================
|
38
31
|
attr_accessor :status
|
39
|
-
|
40
|
-
# Callbacks ======================================================================================
|
41
|
-
|
42
|
-
# Validations ====================================================================================
|
43
32
|
validates_presence_of :domain
|
44
33
|
validates_uniqueness_of :domain
|
45
34
|
validates_presence_of :name
|
46
35
|
validates_uniqueness_of :name
|
47
36
|
|
48
37
|
# Class methods ==================================================================================
|
49
|
-
|
50
38
|
def self.layouts
|
51
39
|
basedir = "#{Rails.root.to_s}/app/views/layouts/"
|
52
|
-
files = Dir.glob
|
40
|
+
files = Dir.glob "#{Rails.root.to_s}/app/views/layouts/*.html.erb"
|
53
41
|
files.map{|f| f.gsub(/.+layouts\/(.+)\.html.erb/, '\1')}
|
54
42
|
end
|
55
43
|
|
56
44
|
# Instance methods ===============================================================================
|
57
|
-
|
58
45
|
def active?
|
59
|
-
self.state ==
|
46
|
+
self.state == 'active'
|
60
47
|
end
|
61
48
|
|
62
49
|
def activate!
|
63
|
-
self.update_attributes
|
50
|
+
self.update_attributes :state => 'active', :activation_date => Time.zone.now
|
64
51
|
end
|
65
52
|
|
66
53
|
def deactivate!
|
67
|
-
self.update_attributes
|
54
|
+
self.update_attributes :state => 'inactive', :activation_date => nil
|
68
55
|
end
|
69
56
|
|
70
57
|
def footer_navigation
|
71
|
-
self.nav_items.roots.footer.
|
58
|
+
self.nav_items.roots.footer.sort_by{|a| a.position.to_i}
|
72
59
|
end
|
73
60
|
|
74
61
|
def home_page
|
@@ -76,15 +63,15 @@ class Site
|
|
76
63
|
end
|
77
64
|
|
78
65
|
def inactive?
|
79
|
-
self.
|
66
|
+
! self.active?
|
80
67
|
end
|
81
68
|
|
82
69
|
def primary_navigation
|
83
|
-
self.nav_items.roots.primary.
|
70
|
+
self.nav_items.roots.primary.sort_by{|a| a.position.to_i}
|
84
71
|
end
|
85
72
|
|
86
73
|
def secondary_navigation
|
87
|
-
self.nav_items.roots.secondary.
|
74
|
+
self.nav_items.roots.secondary.sort_by{|a| a.position.to_i}
|
88
75
|
end
|
89
76
|
|
90
77
|
def state
|
@@ -94,5 +81,4 @@ class Site
|
|
94
81
|
def status
|
95
82
|
self.state.capitalize
|
96
83
|
end
|
97
|
-
|
98
|
-
end
|
84
|
+
end
|
@@ -21,7 +21,7 @@
|
|
21
21
|
<div class="form_column">
|
22
22
|
<%= f.text_field :page_title, :label => 'Page Header', :help => 'This title will appear on the page before any content, and is used by search engines to identify the main idea of the page.' -%>
|
23
23
|
<%= f.text_field :window_title, :label => 'Title Tag', :help => 'This title appears at the top of the browser window and is used by search engine spiders to uniquely identify a given page.' -%>
|
24
|
-
<%= f.text_field :
|
24
|
+
<%= f.text_field :slug, :help => "The slug forms part of the URL for this page. For example, entering my-page will create the URL 'http://www.#{@site.domain}/my-page/'." -%>
|
25
25
|
<%= f.select :state, Page::STATES.map{|s| s.capitalize}, :selected => @page.status, :label => 'Status', :help => 'Content may either be in a published or draft state. Draft content can be previewed but will not appear on the public-facing web site.' -%>
|
26
26
|
</div>
|
27
27
|
<div class="form_column">
|
data/init.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require 'site_logic'
|
1
|
+
require 'site_logic'
|
data/lib/site_logic/railtie.rb
CHANGED
data/lib/site_logic.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
module SiteLogic
|
2
|
-
require 'site_logic/engine' if defined?(Rails)
|
3
|
-
require 'site_logic/railtie' if defined?(Rails)
|
4
|
-
require 'site_logic/base'
|
5
2
|
require 'site_logic/navigation'
|
3
|
+
require 'site_logic/railtie' if defined?(Rails)
|
6
4
|
|
7
5
|
mattr_accessor :navigation_options
|
8
6
|
mattr_accessor :primary_nav
|
9
7
|
mattr_accessor :secondary_nav
|
10
8
|
mattr_accessor :footer_nav
|
11
9
|
|
10
|
+
module SiteLogic
|
11
|
+
class Engine < Rails::Engine
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
12
15
|
def self.setup
|
13
16
|
yield self
|
14
17
|
end
|
data/site_logic.gemspec
CHANGED
@@ -5,22 +5,17 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "site_logic"
|
8
|
-
s.version = "1.9.
|
8
|
+
s.version = "1.9.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Bantik"]
|
12
|
-
s.date = "2011-
|
12
|
+
s.date = "2011-11-01"
|
13
13
|
s.description = "An engine for search-engine-optimized content management."
|
14
14
|
s.email = "corey@seologic.com"
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"README.rdoc"
|
17
|
-
]
|
18
15
|
s.files = [
|
19
16
|
".document",
|
20
17
|
".rspec",
|
21
|
-
"Capfile",
|
22
18
|
"Gemfile",
|
23
|
-
"README.rdoc",
|
24
19
|
"Rakefile",
|
25
20
|
"VERSION",
|
26
21
|
"app/controllers/admin/nav_items_controller.rb",
|
@@ -72,7 +67,6 @@ Gem::Specification.new do |s|
|
|
72
67
|
"config/application.rb",
|
73
68
|
"config/boot.rb",
|
74
69
|
"config/cucumber.yml",
|
75
|
-
"config/deploy.rb",
|
76
70
|
"config/environment.rb",
|
77
71
|
"config/environments/development.rb",
|
78
72
|
"config/environments/production.rb",
|
@@ -81,7 +75,6 @@ Gem::Specification.new do |s|
|
|
81
75
|
"config/initializers/metric_fu.rb",
|
82
76
|
"config/initializers/secret_token.rb",
|
83
77
|
"config/initializers/session_store.rb",
|
84
|
-
"config/locales/en.yml",
|
85
78
|
"config/mongoid.yml",
|
86
79
|
"config/routes.rb",
|
87
80
|
"doc/TODO",
|
@@ -94,15 +87,10 @@ Gem::Specification.new do |s|
|
|
94
87
|
"features/support/paths.rb",
|
95
88
|
"init.rb",
|
96
89
|
"lib/site_logic.rb",
|
97
|
-
"lib/site_logic/base.rb",
|
98
|
-
"lib/site_logic/engine.rb",
|
99
90
|
"lib/site_logic/navigation.rb",
|
100
91
|
"lib/site_logic/railtie.rb",
|
101
92
|
"lib/tasks/cucumber.rake",
|
102
93
|
"lib/tasks/rcov.rake",
|
103
|
-
"public/404.html",
|
104
|
-
"public/422.html",
|
105
|
-
"public/500.html",
|
106
94
|
"public/favicon.ico",
|
107
95
|
"public/images/icons/add.png",
|
108
96
|
"public/images/icons/collapsed.gif",
|
@@ -793,10 +781,8 @@ Gem::Specification.new do |s|
|
|
793
781
|
"public/javascripts/controls.js",
|
794
782
|
"public/javascripts/dragdrop.js",
|
795
783
|
"public/javascripts/effects.js",
|
796
|
-
"public/javascripts/link_obfuscator.js",
|
797
784
|
"public/javascripts/prototype.js",
|
798
785
|
"public/javascripts/rails.js",
|
799
|
-
"public/robots.txt",
|
800
786
|
"public/stylesheets/.gitkeep",
|
801
787
|
"public/stylesheets/application.css",
|
802
788
|
"public/stylesheets/core.css",
|
@@ -835,6 +821,7 @@ Gem::Specification.new do |s|
|
|
835
821
|
s.add_runtime_dependency(%q<rails>, ["= 3.0.10"])
|
836
822
|
s.add_runtime_dependency(%q<rmagick>, ["= 2.12.2"])
|
837
823
|
s.add_runtime_dependency(%q<scaffold_logic>, [">= 1.0.3"])
|
824
|
+
s.add_runtime_dependency(%q<stringex>, [">= 0"])
|
838
825
|
s.add_runtime_dependency(%q<SystemTimer>, [">= 0"])
|
839
826
|
s.add_runtime_dependency(%q<tanker>, [">= 0"])
|
840
827
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
@@ -848,6 +835,7 @@ Gem::Specification.new do |s|
|
|
848
835
|
s.add_dependency(%q<rails>, ["= 3.0.10"])
|
849
836
|
s.add_dependency(%q<rmagick>, ["= 2.12.2"])
|
850
837
|
s.add_dependency(%q<scaffold_logic>, [">= 1.0.3"])
|
838
|
+
s.add_dependency(%q<stringex>, [">= 0"])
|
851
839
|
s.add_dependency(%q<SystemTimer>, [">= 0"])
|
852
840
|
s.add_dependency(%q<tanker>, [">= 0"])
|
853
841
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
@@ -862,6 +850,7 @@ Gem::Specification.new do |s|
|
|
862
850
|
s.add_dependency(%q<rails>, ["= 3.0.10"])
|
863
851
|
s.add_dependency(%q<rmagick>, ["= 2.12.2"])
|
864
852
|
s.add_dependency(%q<scaffold_logic>, [">= 1.0.3"])
|
853
|
+
s.add_dependency(%q<stringex>, [">= 0"])
|
865
854
|
s.add_dependency(%q<SystemTimer>, [">= 0"])
|
866
855
|
s.add_dependency(%q<tanker>, [">= 0"])
|
867
856
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
data/spec/blueprints.rb
CHANGED
@@ -1,21 +1,16 @@
|
|
1
|
-
require 'machinist/mongoid'
|
2
|
-
require 'sham'
|
3
|
-
require 'faker'
|
4
|
-
|
5
|
-
Site.blueprint do
|
6
|
-
name { Faker::Lorem.words(5) * " " }
|
7
|
-
domain { "www#{rand(1000)}.#{Faker::Internet.domain_name}" }
|
8
|
-
end
|
9
|
-
|
10
1
|
Page.blueprint do
|
11
|
-
page_title { Faker::Lorem.words(5) *
|
12
|
-
|
13
|
-
content { "Some content" }
|
2
|
+
page_title { Faker::Lorem.words(5) * ' ' }
|
3
|
+
content { 'Some content' }
|
14
4
|
end
|
15
5
|
|
16
6
|
NavItem.blueprint do
|
17
7
|
kind { 'Primary' }
|
18
|
-
url { Faker::Lorem.words(5) *
|
19
|
-
link_text { Faker::Lorem.words(5) *
|
20
|
-
link_title { Faker::Lorem.words(5) *
|
8
|
+
url { Faker::Lorem.words(5) * '_' }
|
9
|
+
link_text { Faker::Lorem.words(5) * ' ' }
|
10
|
+
link_title { Faker::Lorem.words(5) * ' ' }
|
11
|
+
end
|
12
|
+
|
13
|
+
Site.blueprint do
|
14
|
+
name { Faker::Lorem.words(5) * ' ' }
|
15
|
+
domain { "www#{rand(1000)}.#{Faker::Internet.domain_name}" }
|
21
16
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Admin::PagesController do
|
4
4
|
before :all do
|
5
5
|
Site.destroy_all
|
6
6
|
@site = Site.make
|
7
|
-
@page = @site.pages.create
|
7
|
+
@page = @site.pages.create :page_title => 'Vampire Bunnies', :content => 'Scary monsters.'
|
8
8
|
end
|
9
9
|
|
10
10
|
it "show action should render show template" do
|
@@ -40,7 +40,7 @@ describe Admin::PagesController do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it "update action should redirect when model is valid" do
|
43
|
-
put :update, :id => @page.id, :site_id => @site.id.to_s, :page => {:
|
43
|
+
put :update, :id => @page.id, :site_id => @site.id.to_s, :page => {:page_title => 'foozball'}
|
44
44
|
response.should redirect_to(admin_site_pages_url(@site))
|
45
45
|
end
|
46
46
|
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Admin::RedirectsController do
|
4
4
|
before :all do
|
5
5
|
Site.destroy_all
|
6
6
|
@site = Site.make
|
7
|
-
@page = @site.pages.create
|
8
|
-
@redirect = @site.redirects.create
|
7
|
+
@page = @site.pages.create :page_title => 'Vampire Bunnies', :content => 'Scary monsters.'
|
8
|
+
@redirect = @site.redirects.create :source_url => 'foo', :destination_url => 'bar'
|
9
9
|
end
|
10
10
|
|
11
11
|
it "index action should render index template" do
|
@@ -1,15 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe PagesController do
|
4
4
|
before :all do
|
5
5
|
Site.destroy_all
|
6
6
|
@site = Site.make
|
7
|
-
@page = @site.pages.create
|
7
|
+
@page = @site.pages.create :page_title => 'Vampire Bunnies', :content => 'Scary monsters.', :state => 'published'
|
8
8
|
end
|
9
9
|
|
10
|
-
it
|
10
|
+
it 'show action should render show template' do
|
11
11
|
get :show, :page_slug => '/bunnicula/'
|
12
12
|
response.should render_template(:show)
|
13
13
|
end
|
14
|
-
|
15
|
-
end
|
14
|
+
end
|
data/spec/models/page_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Page do
|
4
4
|
before :all do
|
@@ -12,11 +12,12 @@ describe Page do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'should be valid with required values' do
|
15
|
-
@site.pages.new(
|
15
|
+
page = @site.pages.new(
|
16
16
|
:page_title => 'Home',
|
17
|
-
:desired_slug => 'home',
|
18
17
|
:content => 'Welcome home.'
|
19
|
-
)
|
18
|
+
)
|
19
|
+
page.send :set_slug
|
20
|
+
page.should be_valid
|
20
21
|
end
|
21
22
|
|
22
23
|
it 'should not allow duplicate slugs' do
|
@@ -27,7 +28,6 @@ describe Page do
|
|
27
28
|
)
|
28
29
|
@site.pages.create(
|
29
30
|
:page_title => 'Bar',
|
30
|
-
:desired_slug => 'foo',
|
31
31
|
:content => 'Welcome to bar.'
|
32
32
|
).should_not be_valid
|
33
33
|
end
|
@@ -50,7 +50,6 @@ describe Page do
|
|
50
50
|
it 'publishes a page, setting the publication date' do
|
51
51
|
page = @site.pages.create(
|
52
52
|
:page_title => 'Stiff',
|
53
|
-
:desired_slug => 'corpse',
|
54
53
|
:content => 'Dead stuff.'
|
55
54
|
)
|
56
55
|
page.publish!
|
@@ -62,7 +61,6 @@ describe Page do
|
|
62
61
|
it 'unpublishes a page, clearing the publication date' do
|
63
62
|
page = @site.pages.create(
|
64
63
|
:page_title => 'Stuff',
|
65
|
-
:desired_slug => 'detritus',
|
66
64
|
:content => 'Random stuff.'
|
67
65
|
)
|
68
66
|
page.publish!
|
@@ -74,31 +72,31 @@ describe Page do
|
|
74
72
|
end
|
75
73
|
|
76
74
|
describe 'slug' do
|
77
|
-
it 'is generated based on the
|
78
|
-
page = @site.pages.
|
75
|
+
it 'is generated based on the title' do
|
76
|
+
page = @site.pages.new(
|
79
77
|
:page_title => 'Snakes',
|
80
|
-
:desired_slug => 'snakes and stuff',
|
81
78
|
:content => 'Random stuff.'
|
82
79
|
)
|
83
|
-
page.
|
80
|
+
page.send :set_slug
|
81
|
+
page.slug.should == 'snakes'
|
84
82
|
end
|
85
83
|
|
86
84
|
it 'truncates extra hyphens' do
|
87
|
-
page = @site.pages.
|
85
|
+
page = @site.pages.new(
|
88
86
|
:page_title => 'Spiders',
|
89
|
-
:desired_slug => 'spiders!! and stuff',
|
90
87
|
:content => 'Random stuff.'
|
91
88
|
)
|
92
|
-
page.
|
89
|
+
page.send :set_slug
|
90
|
+
page.slug.should == 'spiders'
|
93
91
|
end
|
94
92
|
|
95
93
|
it 'truncates trailing hyphens' do
|
96
|
-
page = @site.pages.
|
94
|
+
page = @site.pages.new(
|
97
95
|
:page_title => 'Sinews',
|
98
|
-
:desired_slug => 'sinews? really?',
|
99
96
|
:content => 'Random stuff.'
|
100
97
|
)
|
101
|
-
page.
|
98
|
+
page.send :set_slug
|
99
|
+
page.slug.should == 'sinews'
|
102
100
|
end
|
103
101
|
end
|
104
102
|
|
data/spec/models/site_spec.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: site_logic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 53
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 1.9.
|
9
|
+
- 3
|
10
|
+
version: 1.9.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Bantik
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-11-01 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: bson_ext
|
@@ -140,7 +140,7 @@ dependencies:
|
|
140
140
|
type: :runtime
|
141
141
|
version_requirements: *id008
|
142
142
|
- !ruby/object:Gem::Dependency
|
143
|
-
name:
|
143
|
+
name: stringex
|
144
144
|
prerelease: false
|
145
145
|
requirement: &id009 !ruby/object:Gem::Requirement
|
146
146
|
none: false
|
@@ -154,7 +154,7 @@ dependencies:
|
|
154
154
|
type: :runtime
|
155
155
|
version_requirements: *id009
|
156
156
|
- !ruby/object:Gem::Dependency
|
157
|
-
name:
|
157
|
+
name: SystemTimer
|
158
158
|
prerelease: false
|
159
159
|
requirement: &id010 !ruby/object:Gem::Requirement
|
160
160
|
none: false
|
@@ -168,7 +168,7 @@ dependencies:
|
|
168
168
|
type: :runtime
|
169
169
|
version_requirements: *id010
|
170
170
|
- !ruby/object:Gem::Dependency
|
171
|
-
name:
|
171
|
+
name: tanker
|
172
172
|
prerelease: false
|
173
173
|
requirement: &id011 !ruby/object:Gem::Requirement
|
174
174
|
none: false
|
@@ -179,12 +179,26 @@ dependencies:
|
|
179
179
|
segments:
|
180
180
|
- 0
|
181
181
|
version: "0"
|
182
|
-
type: :
|
182
|
+
type: :runtime
|
183
183
|
version_requirements: *id011
|
184
184
|
- !ruby/object:Gem::Dependency
|
185
|
-
name:
|
185
|
+
name: jeweler
|
186
186
|
prerelease: false
|
187
187
|
requirement: &id012 !ruby/object:Gem::Requirement
|
188
|
+
none: false
|
189
|
+
requirements:
|
190
|
+
- - ">="
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
hash: 3
|
193
|
+
segments:
|
194
|
+
- 0
|
195
|
+
version: "0"
|
196
|
+
type: :development
|
197
|
+
version_requirements: *id012
|
198
|
+
- !ruby/object:Gem::Dependency
|
199
|
+
name: rspec
|
200
|
+
prerelease: false
|
201
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
188
202
|
none: false
|
189
203
|
requirements:
|
190
204
|
- - ">="
|
@@ -196,21 +210,19 @@ dependencies:
|
|
196
210
|
- 9
|
197
211
|
version: 1.2.9
|
198
212
|
type: :development
|
199
|
-
version_requirements: *
|
213
|
+
version_requirements: *id013
|
200
214
|
description: An engine for search-engine-optimized content management.
|
201
215
|
email: corey@seologic.com
|
202
216
|
executables: []
|
203
217
|
|
204
218
|
extensions: []
|
205
219
|
|
206
|
-
extra_rdoc_files:
|
207
|
-
|
220
|
+
extra_rdoc_files: []
|
221
|
+
|
208
222
|
files:
|
209
223
|
- .document
|
210
224
|
- .rspec
|
211
|
-
- Capfile
|
212
225
|
- Gemfile
|
213
|
-
- README.rdoc
|
214
226
|
- Rakefile
|
215
227
|
- VERSION
|
216
228
|
- app/controllers/admin/nav_items_controller.rb
|
@@ -262,7 +274,6 @@ files:
|
|
262
274
|
- config/application.rb
|
263
275
|
- config/boot.rb
|
264
276
|
- config/cucumber.yml
|
265
|
-
- config/deploy.rb
|
266
277
|
- config/environment.rb
|
267
278
|
- config/environments/development.rb
|
268
279
|
- config/environments/production.rb
|
@@ -271,7 +282,6 @@ files:
|
|
271
282
|
- config/initializers/metric_fu.rb
|
272
283
|
- config/initializers/secret_token.rb
|
273
284
|
- config/initializers/session_store.rb
|
274
|
-
- config/locales/en.yml
|
275
285
|
- config/mongoid.yml
|
276
286
|
- config/routes.rb
|
277
287
|
- doc/TODO
|
@@ -284,15 +294,10 @@ files:
|
|
284
294
|
- features/support/paths.rb
|
285
295
|
- init.rb
|
286
296
|
- lib/site_logic.rb
|
287
|
-
- lib/site_logic/base.rb
|
288
|
-
- lib/site_logic/engine.rb
|
289
297
|
- lib/site_logic/navigation.rb
|
290
298
|
- lib/site_logic/railtie.rb
|
291
299
|
- lib/tasks/cucumber.rake
|
292
300
|
- lib/tasks/rcov.rake
|
293
|
-
- public/404.html
|
294
|
-
- public/422.html
|
295
|
-
- public/500.html
|
296
301
|
- public/favicon.ico
|
297
302
|
- public/images/icons/add.png
|
298
303
|
- public/images/icons/collapsed.gif
|
@@ -983,10 +988,8 @@ files:
|
|
983
988
|
- public/javascripts/controls.js
|
984
989
|
- public/javascripts/dragdrop.js
|
985
990
|
- public/javascripts/effects.js
|
986
|
-
- public/javascripts/link_obfuscator.js
|
987
991
|
- public/javascripts/prototype.js
|
988
992
|
- public/javascripts/rails.js
|
989
|
-
- public/robots.txt
|
990
993
|
- public/stylesheets/.gitkeep
|
991
994
|
- public/stylesheets/application.css
|
992
995
|
- public/stylesheets/core.css
|
@@ -1042,3 +1045,4 @@ specification_version: 3
|
|
1042
1045
|
summary: An engine for search-engine-optimized content management.
|
1043
1046
|
test_files: []
|
1044
1047
|
|
1048
|
+
has_rdoc:
|
data/Capfile
DELETED
data/README.rdoc
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
= site_logic
|
2
|
-
|
3
|
-
Description goes here.
|
4
|
-
|
5
|
-
== Note on Patches/Pull Requests
|
6
|
-
|
7
|
-
* Fork the project.
|
8
|
-
* Make your feature addition or bug fix.
|
9
|
-
* Add tests for it. This is important so I don't break it in a
|
10
|
-
future version unintentionally.
|
11
|
-
* Commit, do not mess with rakefile, version, or history.
|
12
|
-
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
13
|
-
* Send me a pull request. Bonus points for topic branches.
|
14
|
-
|
15
|
-
== Copyright
|
16
|
-
|
17
|
-
Copyright (c) 2010 Bantik. See LICENSE for details.
|
data/config/deploy.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# Deploy this gem to the gem server.
|
2
|
-
#
|
3
|
-
# Usage for a gem already on the gem server:
|
4
|
-
#
|
5
|
-
# cap deploy
|
6
|
-
#
|
7
|
-
# For a new gem:
|
8
|
-
#
|
9
|
-
# cap deploy:new
|
10
|
-
|
11
|
-
# Global Variables =================================================================================
|
12
|
-
default_run_options[:pty] = true
|
13
|
-
role :app, 'jose.seologic.com'
|
14
|
-
set :deploy_to, '/home/containers/rails/system/site_logic'
|
15
|
-
set :repository, 'git@github.com:ivanoblomov/site_logic.git'
|
16
|
-
set :scm, :git
|
17
|
-
set :use_sudo, false
|
18
|
-
set :user, 'cnewton'
|
19
|
-
|
20
|
-
namespace :deploy do
|
21
|
-
desc "Clone a new gem's repository on the gem server."
|
22
|
-
task :new do
|
23
|
-
run "git clone -q #{repository} #{deploy_to}"
|
24
|
-
end
|
25
|
-
|
26
|
-
task :install do
|
27
|
-
run "cd #{deploy_to}; rm -f Gemfile.lock; sudo bundle; sudo rake install"
|
28
|
-
end
|
29
|
-
|
30
|
-
# disable default behavior
|
31
|
-
task :restart do
|
32
|
-
end
|
33
|
-
|
34
|
-
task :update do
|
35
|
-
run "cd #{deploy_to}; git pull"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
after 'deploy', 'deploy:install'
|
40
|
-
after 'deploy:new', 'deploy:install'
|
data/config/locales/en.yml
DELETED
data/lib/site_logic/base.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module SiteLogic
|
2
|
-
|
3
|
-
module Base
|
4
|
-
|
5
|
-
@@sluggable_attribute = nil
|
6
|
-
|
7
|
-
module ClassMethods
|
8
|
-
def has_slug(attr)
|
9
|
-
self.send(:set_callback, :save, :before, Proc.new{|doc| doc.make_slug})
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.included(base)
|
14
|
-
base.extend(ClassMethods)
|
15
|
-
end
|
16
|
-
|
17
|
-
def make_slug
|
18
|
-
if self.desired_slug && ! self.desired_slug.blank?
|
19
|
-
text = self.desired_slug
|
20
|
-
elsif self.slug
|
21
|
-
text = self.slug
|
22
|
-
elsif self.respond_to?(:page_title)
|
23
|
-
text = self.page_title.to_s.downcase
|
24
|
-
elsif self.respond_to?(:name)
|
25
|
-
text = self.name.to_s.downcase
|
26
|
-
end
|
27
|
-
|
28
|
-
# Translation borrowed from permalink_fu
|
29
|
-
text = text.to_s
|
30
|
-
text.gsub!(/[^\x00-\x7F]+/, '-') # Remove anything non-ASCII entirely (e.g. diacritics).
|
31
|
-
text.gsub!(/[^\/\w_ \-]+/i, '-') # Remove unwanted chars.
|
32
|
-
text.gsub!(/[ \-]+/i, '-') # No more than one of the separator in a row.
|
33
|
-
text.gsub!(/^\-|\-$/i, '') # Remove leading/trailing separator.
|
34
|
-
text.downcase!
|
35
|
-
self.slug = text
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
data/lib/site_logic/engine.rb
DELETED
data/public/404.html
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
-
<style type="text/css">
|
6
|
-
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
-
div.dialog {
|
8
|
-
width: 25em;
|
9
|
-
padding: 0 4em;
|
10
|
-
margin: 4em auto 0 auto;
|
11
|
-
border: 1px solid #ccc;
|
12
|
-
border-right-color: #999;
|
13
|
-
border-bottom-color: #999;
|
14
|
-
}
|
15
|
-
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
-
</style>
|
17
|
-
</head>
|
18
|
-
|
19
|
-
<body>
|
20
|
-
<!-- This file lives in public/404.html -->
|
21
|
-
<div class="dialog">
|
22
|
-
<h1>The page you were looking for doesn't exist.</h1>
|
23
|
-
<p>You may have mistyped the address or the page may have moved.</p>
|
24
|
-
</div>
|
25
|
-
</body>
|
26
|
-
</html>
|
data/public/422.html
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>The change you wanted was rejected (422)</title>
|
5
|
-
<style type="text/css">
|
6
|
-
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
-
div.dialog {
|
8
|
-
width: 25em;
|
9
|
-
padding: 0 4em;
|
10
|
-
margin: 4em auto 0 auto;
|
11
|
-
border: 1px solid #ccc;
|
12
|
-
border-right-color: #999;
|
13
|
-
border-bottom-color: #999;
|
14
|
-
}
|
15
|
-
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
-
</style>
|
17
|
-
</head>
|
18
|
-
|
19
|
-
<body>
|
20
|
-
<!-- This file lives in public/422.html -->
|
21
|
-
<div class="dialog">
|
22
|
-
<h1>The change you wanted was rejected.</h1>
|
23
|
-
<p>Maybe you tried to change something you didn't have access to.</p>
|
24
|
-
</div>
|
25
|
-
</body>
|
26
|
-
</html>
|
data/public/500.html
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>We're sorry, but something went wrong (500)</title>
|
5
|
-
<style type="text/css">
|
6
|
-
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
-
div.dialog {
|
8
|
-
width: 25em;
|
9
|
-
padding: 0 4em;
|
10
|
-
margin: 4em auto 0 auto;
|
11
|
-
border: 1px solid #ccc;
|
12
|
-
border-right-color: #999;
|
13
|
-
border-bottom-color: #999;
|
14
|
-
}
|
15
|
-
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
-
</style>
|
17
|
-
</head>
|
18
|
-
|
19
|
-
<body>
|
20
|
-
<!-- This file lives in public/500.html -->
|
21
|
-
<div class="dialog">
|
22
|
-
<h1>We're sorry, but something went wrong.</h1>
|
23
|
-
<p>We've been notified about this issue and we'll take a look at it shortly.</p>
|
24
|
-
</div>
|
25
|
-
</body>
|
26
|
-
</html>
|
@@ -1,31 +0,0 @@
|
|
1
|
-
Obfuscator = {
|
2
|
-
|
3
|
-
extractUrl: function(url) {
|
4
|
-
pattern = /#(.+)$/
|
5
|
-
if (url.match(pattern)) {
|
6
|
-
return "/" + RegExp.$1.replace(/%23/g,'/');
|
7
|
-
}
|
8
|
-
},
|
9
|
-
|
10
|
-
decode: function(elem){
|
11
|
-
|
12
|
-
var text = Obfuscator.extractUrl(elem.href);
|
13
|
-
var dst = '';
|
14
|
-
var len = text.length;
|
15
|
-
|
16
|
-
if (text.length > 0) {
|
17
|
-
for(var i=0; i < text.length ; i++) {
|
18
|
-
b = text.charCodeAt(i)
|
19
|
-
if( ( (b>64) && (b<78) ) || ( (b>96) && (b<110) ) ) {
|
20
|
-
b=b+13;
|
21
|
-
} else {
|
22
|
-
if( ( (b>77) && (b<91) ) || ( (b>109) && (b<123) ) ) { b=b-13; }
|
23
|
-
}
|
24
|
-
t=String.fromCharCode(b);
|
25
|
-
dst=dst.concat(t);
|
26
|
-
}
|
27
|
-
}
|
28
|
-
elem.href = dst;
|
29
|
-
}
|
30
|
-
}
|
31
|
-
|