tandem 0.2.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +205 -0
  3. data/Rakefile +31 -0
  4. data/app/assets/images/tandem/blank_image.jpg +0 -0
  5. data/app/assets/images/tandem/colorbox/border1.png +0 -0
  6. data/app/assets/images/tandem/colorbox/border2.png +0 -0
  7. data/app/assets/images/tandem/colorbox/ie6/borderBottomCenter.png +0 -0
  8. data/app/assets/images/tandem/colorbox/ie6/borderBottomLeft.png +0 -0
  9. data/app/assets/images/tandem/colorbox/ie6/borderBottomRight.png +0 -0
  10. data/app/assets/images/tandem/colorbox/ie6/borderMiddleLeft.png +0 -0
  11. data/app/assets/images/tandem/colorbox/ie6/borderMiddleRight.png +0 -0
  12. data/app/assets/images/tandem/colorbox/ie6/borderTopCenter.png +0 -0
  13. data/app/assets/images/tandem/colorbox/ie6/borderTopLeft.png +0 -0
  14. data/app/assets/images/tandem/colorbox/ie6/borderTopRight.png +0 -0
  15. data/app/assets/images/tandem/colorbox/loading.gif +0 -0
  16. data/app/assets/images/tandem/ic-delete_image.png +0 -0
  17. data/app/assets/images/tandem/ic-star.png +0 -0
  18. data/app/assets/images/tandem/loader.gif +0 -0
  19. data/app/assets/images/tandem/loader_stripe.png +0 -0
  20. data/app/assets/images/tandem/tandem-editImage2.jpg +0 -0
  21. data/app/assets/images/tandem/tandem_logo.png +0 -0
  22. data/app/assets/images/tandem/tandem_logo_nav.png +0 -0
  23. data/app/assets/javascripts/tandem/contents.js +2 -0
  24. data/app/assets/javascripts/tandem/current_image.jst.eco +19 -0
  25. data/app/assets/javascripts/tandem/gallery_image.jst.eco +10 -0
  26. data/app/assets/javascripts/tandem/images.coffee +42 -0
  27. data/app/assets/javascripts/tandem/pages.js.coffee +32 -0
  28. data/app/assets/javascripts/tandem/popup.js +23 -0
  29. data/app/assets/javascripts/tandem.js +16 -0
  30. data/app/assets/stylesheets/tandem/colorbox.css.erb +83 -0
  31. data/app/assets/stylesheets/tandem/contents.scss +541 -0
  32. data/app/assets/stylesheets/tandem/scaffold.scss +61 -0
  33. data/app/assets/stylesheets/tandem/variables.scss +38 -0
  34. data/app/assets/stylesheets/tandem.css +7 -0
  35. data/app/controllers/tandem/application_controller.rb +19 -0
  36. data/app/controllers/tandem/contents_controller.rb +94 -0
  37. data/app/controllers/tandem/images_controller.rb +92 -0
  38. data/app/controllers/tandem/pages_controller.rb +108 -0
  39. data/app/helpers/tandem/application_helper.rb +29 -0
  40. data/app/helpers/tandem/contents_helper.rb +19 -0
  41. data/app/helpers/tandem/images_helper.rb +10 -0
  42. data/app/helpers/tandem/pages_helper.rb +243 -0
  43. data/app/models/tandem/ability.rb +6 -0
  44. data/app/models/tandem/content/image.rb +7 -0
  45. data/app/models/tandem/content/text.rb +7 -0
  46. data/app/models/tandem/content.rb +41 -0
  47. data/app/models/tandem/image.rb +27 -0
  48. data/app/models/tandem/page.rb +41 -0
  49. data/app/views/layouts/tandem/image.html.slim +19 -0
  50. data/app/views/layouts/tandem/popup.html.slim +17 -0
  51. data/app/views/tandem/contents/_form.html.slim +36 -0
  52. data/app/views/tandem/contents/edit.html.slim +3 -0
  53. data/app/views/tandem/contents/index.html.slim +29 -0
  54. data/app/views/tandem/contents/new.html.slim +3 -0
  55. data/app/views/tandem/contents/show.html.slim +20 -0
  56. data/app/views/tandem/images/_form.html.slim +24 -0
  57. data/app/views/tandem/images/_gallery.html.slim +4 -0
  58. data/app/views/tandem/images/edit.html.slim +8 -0
  59. data/app/views/tandem/images/index.html.slim +9 -0
  60. data/app/views/tandem/images/new.html.slim +4 -0
  61. data/app/views/tandem/images/show.html.slim +10 -0
  62. data/app/views/tandem/images/thumb.html.slim +1 -0
  63. data/app/views/tandem/pages/_form.html.slim +56 -0
  64. data/app/views/tandem/pages/edit.html.slim +1 -0
  65. data/app/views/tandem/pages/index.html.slim +35 -0
  66. data/app/views/tandem/pages/new.html.slim +1 -0
  67. data/app/views/tandem/pages/show.html.slim +16 -0
  68. data/config/cucumber.yml +8 -0
  69. data/config/routes.rb +17 -0
  70. data/db/migrate/20111122221549_create_tandem_pages.rb +20 -0
  71. data/db/migrate/20111122222037_create_tandem_contents.rb +21 -0
  72. data/db/migrate/20111215001943_create_tandem_images.rb +12 -0
  73. data/db/migrate/30000000000000_create_default_page.rb +10 -0
  74. data/db/migrate/30000000000001_add_request_key_to_tandem_contents.rb +44 -0
  75. data/lib/generators/tandem_generator.rb +26 -0
  76. data/lib/generators/templates/initializer.rb +70 -0
  77. data/lib/tandem/engine.rb +23 -0
  78. data/lib/tandem/version.rb +3 -0
  79. data/lib/tandem.rb +46 -0
  80. data/lib/tasks/cucumber.rake +65 -0
  81. data/lib/tasks/tandem_tasks.rake +4 -0
  82. metadata +354 -0
@@ -0,0 +1,41 @@
1
+ module Tandem
2
+ class Page < ActiveRecord::Base
3
+ has_many :contents
4
+ belongs_to :parent, :class_name => 'Page'
5
+ has_many :children, :class_name => 'Page', :foreign_key => :parent_id
6
+
7
+ validates :link_label, presence: true, uniqueness: true
8
+ validates :slug, presence: true, uniqueness: true
9
+ validates :is_default, :inclusion => {:in => [true, false]}
10
+
11
+ before_validation :do_before_validation
12
+ after_save :do_after_save
13
+
14
+ scope :top_level, where( parent_id: nil )
15
+
16
+ attr_accessible :parent_id, :title, :page_label, :link_label, :layout, :template, :keywords, :description, :slug, :is_default
17
+
18
+ def to_param
19
+ persisted? ? slug : nil
20
+ end
21
+
22
+ private
23
+
24
+ #auto increment slug until it is unique
25
+ def do_before_validation
26
+ prim_slug, i = slug, 0
27
+ prim_slug, i = $1, $2.to_i if slug =~ /^(.*)_([0-9]+)$/
28
+
29
+ return unless prim_slug.present?
30
+
31
+ attempts = 0
32
+ conditions = new_record? ? ['slug = ?',slug] : ['slug = ? AND id != ?',slug,id]
33
+ conditions[1] = "#{prim_slug}_#{i+=1}" while Page.where(conditions).first && (attempts += 1) < 20
34
+ write_attribute(:slug,conditions[1])
35
+ end
36
+
37
+ def do_after_save
38
+ self.class.update_all({is_default: false}, ['id != ?',id]) if is_default?
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,19 @@
1
+ doctype 5
2
+ | <!--[if lt IE 7 ]> <html class="ie6 no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <![endif]-->
3
+ | <!--[if IE 7 ]> <html class="ie7 no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <![endif]-->
4
+ | <!--[if IE 8 ]> <html class="ie8 no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <![endif]-->
5
+ | <!--[if IE 9 ]> <html class="ie9 no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <![endif]-->
6
+ | <!--[if !(IE)]><!--> <html class="no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <!--<![endif]-->
7
+
8
+ head
9
+ title Tandem Image Gallery
10
+
11
+ = stylesheet_link_tag "tandem"
12
+ = csrf_meta_tags
13
+
14
+ body
15
+
16
+ = yield
17
+ = javascript_include_tag "tandem"
18
+
19
+ | </html>
@@ -0,0 +1,17 @@
1
+ doctype 5
2
+ | <!--[if lt IE 7 ]> <html class="ie6 no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <![endif]-->
3
+ | <!--[if IE 7 ]> <html class="ie7 no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <![endif]-->
4
+ | <!--[if IE 8 ]> <html class="ie8 no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <![endif]-->
5
+ | <!--[if IE 9 ]> <html class="ie9 no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <![endif]-->
6
+ | <!--[if !(IE)]><!--> <html class="no-js" lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <!--<![endif]-->
7
+ head
8
+ title Tandem Popup
9
+
10
+ = stylesheet_link_tag "tandem"
11
+ = csrf_meta_tags
12
+
13
+ body
14
+ = yield
15
+ = javascript_include_tag "tandem"
16
+
17
+ |</html>
@@ -0,0 +1,36 @@
1
+ // This is the form that controls Image upload and Text Editor
2
+ #tandem-editor-wym
3
+ = form_for @content, url: tandem.content_path(@content.id), remote: true, html: {class: "tandem_content_editor tandem_#{@content.class.simple_type}_editor"} do |f|
4
+ -if @content.errors.any?
5
+ #tandem_error_explanation
6
+ h2 = "#{pluralize(@content.errors.count, "error")} prohibited this content from being saved:"
7
+ ul
8
+ - @content.errors.full_messages.each do |msg|
9
+ li= msg
10
+
11
+ -if @content.is_a?(Tandem::Content::Text)
12
+ .field
13
+ = f.text_area :content, text_content_text_area_options(params[:editor])
14
+
15
+ -if @content.is_a?(Tandem::Content::Image)
16
+ = render_eco_template 'current_image', @content.image.as_json
17
+
18
+ #tandem_advanced_settings
19
+ h3.settings-toggle Advanced Settings
20
+ .advanced-settings
21
+ .field
22
+ = f.label :link_url
23
+ = f.text_field :link_url
24
+ .field
25
+ = f.label :link_target
26
+ = f.text_field :link_target
27
+
28
+ .actions
29
+ = f.submit 'Save Your Changes', class: "wymupdate"
30
+
31
+ - if @content.is_a?(Tandem::Content::Image)
32
+ div#tandem-image-editor.clearfix
33
+ = render '/tandem/images/form'
34
+
35
+ #gallery-image.clearfix
36
+ = render '/tandem/images/gallery'
@@ -0,0 +1,3 @@
1
+ == render 'form'
2
+
3
+
@@ -0,0 +1,29 @@
1
+ h1.tandem-title Listing contents
2
+
3
+ table
4
+ tr
5
+ th Page
6
+ th Type
7
+ th Token
8
+ th Tag
9
+ th Content
10
+ th Bcontent
11
+ th
12
+ th
13
+ th
14
+
15
+ - @contents.each do |content|
16
+ tr
17
+ td= content.page_id
18
+ td= content.type
19
+ td= content.token
20
+ td= content.tag
21
+ td= content.content
22
+ td= content.bcontent
23
+ td= link_to 'Show', content
24
+ td= link_to 'Edit', edit_content_path(content)
25
+ td= link_to 'Delete', content, :confirm => 'Are you sure?', :method => :delete
26
+
27
+ br
28
+
29
+ = link_to 'New Content', new_content_path
@@ -0,0 +1,3 @@
1
+ h1.tandem-title New content
2
+ h4.tandem-logo
3
+ == render 'form'
@@ -0,0 +1,20 @@
1
+ p#notice = notice
2
+
3
+ p
4
+ b Page:
5
+ = @content.page_id
6
+ p
7
+ b Type:
8
+ = @content.type
9
+ p
10
+ b Token:
11
+ = @content.token
12
+ p
13
+ b Tag:
14
+ = @content.tag
15
+ p
16
+ b Content:
17
+ = @content.content
18
+ p
19
+ b Bcontent:
20
+ = @content.bcontent
@@ -0,0 +1,24 @@
1
+ #tandem-upload-image
2
+ = form_for (@image ||= ::Tandem::Image.new), :url => (@image.new_record? ? tandem.images_path : tandem.image_path(@image)), :html => { :multipart => true, :id => 'new_tandem_image' } do |f|
3
+
4
+ -if f.object.errors.any?
5
+ #error_explanation
6
+ h2 = "#{pluralize(f.object.errors.count, "error")} prohibited this image from being saved:"
7
+ ul
8
+ - f.object.errors.full_messages.each do |msg|
9
+ li= msg
10
+
11
+ span#upload-button
12
+ | Upload a New Image
13
+ = f.file_field :resource
14
+
15
+ div.loader
16
+ div.range
17
+ span 0%
18
+
19
+ section#error_explanation
20
+ header
21
+ h1 Oops&mdash;there's been a problem
22
+
23
+ ul
24
+
@@ -0,0 +1,4 @@
1
+ section id='tandem_image_gallery'
2
+ ul
3
+ - ::Tandem::Image.all.each do |image|
4
+ = render_eco_template 'gallery_image', image.as_json
@@ -0,0 +1,8 @@
1
+ h1 Editing image
2
+
3
+ == render 'form'
4
+
5
+ = link_to 'Show', tandem.image_path(@image)
6
+ '|
7
+ = link_to 'Back', tandem.images_path
8
+
@@ -0,0 +1,9 @@
1
+ .tandem-gallery
2
+ ul
3
+ - @images.each do |image|
4
+ li
5
+ = image_tag image.resource.url(:thumb), :onclick => "select_gallery_item(#{image.id})", :class => "thumb"
6
+ ul.actions
7
+ li
8
+ a.use href="/" Use
9
+ = link_to 'Delete', image, :confirm => 'Are you sure?', :method => :delete, :class => "delete"
@@ -0,0 +1,4 @@
1
+ h4.tandem-logo
2
+ p#notice = notice
3
+
4
+ == render 'form'
@@ -0,0 +1,10 @@
1
+ p#notice = notice
2
+
3
+ p
4
+ b Resource:
5
+ = image_tag @image.resource.url(:thumb)
6
+
7
+
8
+ = link_to 'Edit', tandem.edit_image_path(@image)
9
+ '|
10
+ = link_to 'Back', tandem.images_path
@@ -0,0 +1 @@
1
+ = image_content_tag @content, {}, :thumb
@@ -0,0 +1,56 @@
1
+ // This form controls New Page, Edit Page
2
+ #tandem-editor
3
+ = form_for @page, url: (@page.new_record? ? tandem.pages_path : tandem.page_path(@page)), remote: true, html: { class: 'tandem-page-form' } do |f|
4
+ -if @page.errors.any?
5
+ #error_explanation
6
+ h2 = "#{pluralize(@page.errors.count, "error")} prohibited this page from being saved:"
7
+ ul
8
+ - @page.errors.full_messages.each do |msg|
9
+ li= msg
10
+ #tandem_settings
11
+ h1.tandem-title Page Settings
12
+ .field
13
+ = f.label :parent_id
14
+ = f.radio_button :parent_id, ''
15
+ span Top Level Page
16
+ - if @page.parent.present?
17
+ = f.radio_button :parent_id, @page.parent_id
18
+ span
19
+ | Child Page (
20
+ = page_path(@page.parent)
21
+ | )
22
+ .field
23
+ = f.label :title
24
+ = f.text_field :title
25
+ .field
26
+ = f.label :link_label
27
+ = f.text_field :link_label
28
+ .field
29
+ = f.label :slug
30
+ = f.text_field :slug
31
+ .field
32
+ = f.label :layout
33
+ = f.select :layout, options_for_select(valid_layouts,@page.layout), :include_blank => true
34
+ .field
35
+ = f.label :template
36
+ = f.select :template, options_for_select(valid_templates, @page.template), :include_blank => true
37
+
38
+ #tandem_advanced_settings
39
+ h3.settings-toggle Advanced Settings
40
+ .advanced-settings
41
+ .field
42
+ = f.label :page_label
43
+ = f.text_field :page_label
44
+ .field
45
+ = f.label :keywords
46
+ = f.text_field :keywords
47
+ .field
48
+ = f.label :description
49
+ = f.text_field :description
50
+ .field
51
+ = f.label :is_default, 'Set As Home Page?', :style => "width: auto;margin-right: 8px;"
52
+ = f.check_box :is_default
53
+ .actions
54
+ = f.submit 'Save', :class => "save"
55
+
56
+
@@ -0,0 +1 @@
1
+ == render 'form'
@@ -0,0 +1,35 @@
1
+ #tandem-defaults
2
+ h1.tandem-title Pages Listing
3
+
4
+ table
5
+ tr
6
+ th Parent
7
+ th Link Label
8
+ th Page Label
9
+ th Page Title
10
+ th Layout
11
+ th Keywords
12
+ th Description
13
+ th
14
+ th
15
+ th
16
+
17
+ - @pages.each do |page|
18
+ tr
19
+ td= page.parent.try :slug
20
+ td= page.link_label
21
+ td= page.page_label
22
+ td= page.title
23
+ td= page.layout
24
+ td= page.keywords
25
+ td= page.description
26
+ td= link_to 'Show', tandem.page_path(page)
27
+ - if can?(:update, page)
28
+ td= link_to 'Edit', tandem.edit_page_path(page), :class => :page_link
29
+ - if can?(:destroy, page)
30
+ td= link_to 'Delete', tandem.page_path(page), :confirm => 'Are you sure?', :method => :delete
31
+
32
+ br
33
+
34
+ - if can?(:create, ::Tandem::Page)
35
+ = link_to 'New Page', tandem.new_page_path, :class => :page_link, :id => :page_new_link
@@ -0,0 +1 @@
1
+ == render 'form'
@@ -0,0 +1,16 @@
1
+ #tandem-defaults
2
+ = tandem_page_links
3
+
4
+ // Our built-in page uses classes for bootstrap or 960.gs
5
+
6
+ .container_12.row.clearfix
7
+ p#notice = notice
8
+ .grid_12.span12
9
+ = tandem_image_tag(:default_image)
10
+ .grid_7.span7
11
+ = tandem_text_tag(:tandem_text_block, editor: :wysiwyg)
12
+ .grid_5.span5
13
+ = tandem_text_tag(:tandem_sidebar)
14
+
15
+ - unless @page.persisted?
16
+ | This is the default page content and should tell the user to go create a page
@@ -0,0 +1,8 @@
1
+ <%
2
+ rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
+ rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
+ std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip"
5
+ %>
6
+ default: --drb <%= std_opts %> features
7
+ wip: --drb --tags @wip:3 --wip features
8
+ rerun: --drb <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
data/config/routes.rb ADDED
@@ -0,0 +1,17 @@
1
+ Tandem::Engine.routes.draw do
2
+ resources :images do
3
+ member do
4
+ get :thumb
5
+ end
6
+ end
7
+
8
+ resources :pages do
9
+ collection do
10
+ get :home
11
+ end
12
+ end
13
+
14
+ resources :contents, :only => [:edit, :update]
15
+
16
+ root :to => 'pages#home'
17
+ end
@@ -0,0 +1,20 @@
1
+ class CreateTandemPages < ActiveRecord::Migration
2
+ def change
3
+ create_table :tandem_pages do |t|
4
+ t.integer :parent_id
5
+ t.string :title
6
+ t.string :page_label
7
+ t.string :link_label, :null => false
8
+ t.string :layout
9
+ t.string :template
10
+ t.string :keywords
11
+ t.string :description
12
+ t.string :slug, :null => false
13
+ t.boolean :is_default, :default => false, :null => false
14
+
15
+ t.timestamps
16
+ end
17
+
18
+ add_index :tandem_pages, :parent_id
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ class CreateTandemContents < ActiveRecord::Migration
2
+ def change
3
+ create_table :tandem_contents do |t|
4
+ t.integer :page_id, :null => false
5
+ t.string :type, :null => false
6
+ t.string :tag, :null => false
7
+ t.text :content
8
+ t.text :details
9
+ t.string :link_url
10
+ t.string :link_target
11
+ t.integer :attachment_id
12
+ t.string :attachment_type, :default => "Tandem::Image"
13
+ t.integer :image_id
14
+
15
+ t.timestamps
16
+ end
17
+
18
+ add_index :tandem_contents, :page_id
19
+ add_index :tandem_contents, [:page_id, :type, :tag], :unique => true
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ class CreateTandemImages < ActiveRecord::Migration
2
+ def change
3
+ create_table :tandem_images do |t|
4
+ t.string :resource_file_name
5
+ t.string :resource_content_type
6
+ t.integer :resource_file_size
7
+ t.datetime :resource_updated_at
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ #NOTE:: The timestamp for the this file is set way into the future so that it is always the last migration run
2
+ class CreateDefaultPage < ActiveRecord::Migration
3
+ def up
4
+ Tandem::Page.new(link_label: 'Sample Page', slug: 'sample').save!
5
+ end
6
+
7
+ def down
8
+ Tandem::Page.delete_all
9
+ end
10
+ end
@@ -0,0 +1,44 @@
1
+ class AddRequestKeyToTandemContents < ActiveRecord::Migration
2
+ def up
3
+ add_column :tandem_contents, :request_key, :string
4
+
5
+ Tandem::Content.all.each do |content|
6
+ if Tandem::Page.exists?(content.page_id)
7
+ page = Tandem::Page.find(content.page_id)
8
+ content.update_attributes!(:request_key => "tandem-pages-#{page.slug}")
9
+ end
10
+ end
11
+
12
+ remove_index :tandem_contents, :page_id
13
+ remove_index :tandem_contents, [:page_id, :type, :tag]
14
+
15
+ remove_column :tandem_contents, :page_id
16
+
17
+ add_index :tandem_contents, :request_key
18
+ add_index :tandem_contents, [:request_key, :type, :tag], :unique => true
19
+ end
20
+
21
+ def down
22
+ add_column :tandem_contents, :page_id, :integer
23
+
24
+ Tandem::Content.all.each do |content|
25
+ if content.request_key =~ /^tandem-pages-.*$/
26
+ page = Tandem::Page.find_by_slug(content.request_key.gsub(/^tandem-pages-/, ''))
27
+
28
+ if page.present?
29
+ content.update_attributes!(:page_id => page.id)
30
+ else
31
+ raise ActiveRecord::IrreversibleMigration
32
+ end
33
+ end
34
+ end
35
+
36
+ remove_index :tandem_contents, :request_key
37
+ remove_index :tandem_contents, [:request_key, :type, :tag]
38
+
39
+ remove_column :tandem_contents, :request_key
40
+
41
+ add_index :tandem_contents, :page_id
42
+ add_index :tandem_contents, [:page_id, :type, :tag], :unique => true
43
+ end
44
+ end
@@ -0,0 +1,26 @@
1
+ require 'rails/generators'
2
+
3
+ class TandemGenerator < Rails::Generators::Base
4
+ desc "This generator sets up tandem."
5
+
6
+ def self.source_root
7
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
8
+ end
9
+
10
+ def create_initializer_file
11
+ initializer 'tandem.rb', File.open(File.join(self.class.source_root,'initializer.rb'), 'rb') { |f| f.read }
12
+ end
13
+
14
+ def add_mounting_route
15
+ route('mount Tandem::Engine => "/"')
16
+ end
17
+
18
+ def import_migrations
19
+ rake("tandem:install:migrations")
20
+ end
21
+
22
+ def inject_tandem_assets
23
+ append_to_file 'app/assets/javascripts/application.js', '//= require tandem'
24
+ insert_into_file 'app/assets/stylesheets/application.css', " *= require tandem\n", :before => /^\*\/$/
25
+ end
26
+ end
@@ -0,0 +1,70 @@
1
+ Tandem::Configuration.current_user_proc { |request|
2
+ # Uncomment and/or modify the following line once your project has a user model to
3
+ # derive abilities from.
4
+ #
5
+ # The request is passed in so you can access it directly to specify what the current
6
+ # user is, regardless of the context, e.g. main app or Tandem, the proc is called from.
7
+ #
8
+ # User.find(request.session['user_id']) unless request.session['user_id'].blank?
9
+ #
10
+ # Or, for devise:
11
+ #
12
+ # request.env['warden'].authenticate(:scope => :user)
13
+ }
14
+ Tandem::Configuration.user_abilities_proc { |user|
15
+ # Define abilities for the passed in user here. For example:
16
+ #
17
+ # user ||= User.new # guest user (not logged in)
18
+ # if user.admin?
19
+ # can :manage, :all
20
+ # else
21
+ # can :read, :all
22
+ # end
23
+ #
24
+ # The first argument to `can` is the action you are giving the user permission to do.
25
+ # If you pass :manage it will apply to every action. Other common actions here are
26
+ # :read, :create, :update and :destroy.
27
+ #
28
+ # The second argument is the resource the user can perform the action on. If you pass
29
+ # :all it will apply to every resource. Otherwise pass a Ruby class of the resource.
30
+ #
31
+ # The third argument is an optional hash of conditions to further filter the objects.
32
+ # For example, here the user can only update published articles.
33
+ #
34
+ # can :update, Article, :published => true
35
+ #
36
+ # See the wiki for details: https://github.com/ryanb/cancan/wiki/Defining-Abilities
37
+
38
+ can :manage, :all
39
+ #can :manage, Page
40
+ #can :read, Page
41
+
42
+ #can :manage, Content
43
+ #can :update, Content
44
+ #can :read, Content
45
+ }
46
+
47
+ # By default, tandem will redirect a user back to the engine mount point "/tandem" on
48
+ # an authentication error. This can cause an infinite loop if for example
49
+ # PageController#index is not readable by all users. Uncomment this to redirect to the
50
+ # app root instead.
51
+ # Tandem::Configuration.unauthorized_path = '/'
52
+
53
+ # Change this to move your layouts directory from /app/views/layouts/tandem
54
+ # Tandem::Configuration.layouts_dir = 'tandem'
55
+
56
+ # Change this to move your uploaded images directory from /public/assets/images/...
57
+ # Tandem::Configuration.uploaded_images_dir = ":rails_root/public"
58
+
59
+ # Change this to modify your uploaded images directory structure & routing from /public/assets/images/1/original/...
60
+ # Tandem::Configuration.uploaded_images_template = "/assets/images/:id/:style/:basename.:extension"
61
+
62
+ # Override Tandem's default paperclip options
63
+ # For example, to use S3, add the aws-sdk gem to your gemfile and uncomment the following
64
+ # Tandem::Configuration.paperclip_options = { :styles => { :thumb => "150x150>" },
65
+ #:storage => :s3,
66
+ #:bucket => Proc.new { Rails.application.engine_name.gsub(/application$/, Rails.env) },
67
+ #:s3_credentials => {
68
+ #:access_key_id => ENV['S3_KEY'],
69
+ #:secret_access_key => ENV['S3_SECRET']
70
+ #} }
@@ -0,0 +1,23 @@
1
+ module Tandem
2
+ class Engine < Rails::Engine
3
+ isolate_namespace Tandem
4
+
5
+ config.generators do |g|
6
+ g.test_framework :rspec, :fixture => true
7
+ g.fixture_replacement :factory_girl, :dir => "spec/factories"
8
+ g.template_engine :slim
9
+ end
10
+
11
+ config.eager_load_paths << File.expand_path("../../../app/models/tandem/content", __FILE__)
12
+
13
+ initializer "tandem.include_page_helpers" do |app|
14
+ ActiveSupport.on_load(:action_controller) do
15
+ helper ::Tandem::PagesHelper
16
+ end
17
+
18
+ ActiveSupport.on_load(:action_view) do
19
+ include ::Tandem::PagesHelper
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Tandem
2
+ VERSION = "0.2.0.rc"
3
+ end