comfy_carousel 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +7 -0
  3. data/LICENSE +20 -0
  4. data/README.md +35 -2
  5. data/Rakefile +1 -1
  6. data/VERSION +1 -1
  7. data/app/assets/javascripts/slides.jquery.js +555 -0
  8. data/app/assets/javascripts/slides.min.jquery.js +20 -0
  9. data/app/controllers/admin/carousel/base_controller.rb +10 -0
  10. data/app/controllers/admin/carousel/carousels_controller.rb +50 -0
  11. data/app/controllers/admin/carousel/slides_controller.rb +12 -4
  12. data/app/helpers/carousel/application_helper.rb +12 -0
  13. data/app/models/carousel/carousel.rb +25 -0
  14. data/app/models/carousel/slide.rb +21 -17
  15. data/app/views/admin/carousel/_navigation.html.erb +1 -0
  16. data/app/views/admin/carousel/carousels/_form.html.erb +4 -0
  17. data/app/views/admin/carousel/carousels/edit.html.erb +5 -0
  18. data/app/views/admin/carousel/carousels/index.html.erb +20 -0
  19. data/app/views/admin/carousel/carousels/new.html.erb +5 -0
  20. data/app/views/admin/carousel/slides/_form.html.erb +12 -14
  21. data/app/views/admin/carousel/slides/edit.html.erb +4 -3
  22. data/app/views/admin/carousel/slides/index.html.erb +20 -21
  23. data/app/views/admin/carousel/slides/new.html.erb +4 -3
  24. data/comfy_carousel.gemspec +112 -0
  25. data/config/application.rb +3 -0
  26. data/config/environments/development.rb +1 -1
  27. data/config/environments/test.rb +1 -1
  28. data/config/initializers/comfy_carousel.rb +12 -0
  29. data/config/routes.rb +9 -1
  30. data/db/migrate/01_create_comfy_carousel.rb +17 -2
  31. data/db/schema.rb +40 -0
  32. data/lib/comfy_carousel.rb +25 -0
  33. data/lib/comfy_carousel/configuration.rb +22 -0
  34. data/lib/comfy_carousel/engine.rb +19 -0
  35. data/lib/comfy_carousel/form_builder.rb +50 -0
  36. data/lib/generators/comfy/carousel/README +11 -0
  37. data/lib/generators/comfy/carousel/carousel_generator.rb +35 -0
  38. data/lib/tasks/comfy_carousel.rake +4 -0
  39. data/test/fixtures/carousel/carousels.yml +3 -0
  40. data/test/fixtures/carousel/slides.yml +9 -0
  41. data/test/fixtures/files/image.jpg +0 -0
  42. data/test/functional/admin/carousel/carousels_controller_test.rb +92 -0
  43. data/test/functional/admin/carousel/slides_controller_test.rb +59 -30
  44. data/test/test_helper.rb +30 -5
  45. data/test/unit/carousel_test.rb +30 -0
  46. data/test/unit/configuration_test.rb +17 -0
  47. data/test/unit/slide_test.rb +29 -0
  48. metadata +49 -21
  49. data/app/assets/images/rails.png +0 -0
  50. data/app/assets/javascripts/application.js +0 -15
  51. data/app/assets/stylesheets/application.css +0 -13
  52. data/app/helpers/application_helper.rb +0 -2
  53. data/config/environments/production.rb +0 -67
  54. data/config/initializers/backtrace_silencers.rb +0 -7
  55. data/config/initializers/inflections.rb +0 -15
  56. data/config/initializers/mime_types.rb +0 -5
  57. data/config/initializers/secret_token.rb +0 -7
  58. data/config/initializers/session_store.rb +0 -8
  59. data/config/initializers/wrap_parameters.rb +0 -14
  60. data/db/seeds.rb +0 -7
  61. data/lib/assets/.gitkeep +0 -0
@@ -11,6 +11,9 @@ end
11
11
 
12
12
  module ComfyCarousel
13
13
  class Application < Rails::Application
14
+
15
+ require 'comfy_carousel'
16
+
14
17
  # Settings in config/environments/* take precedence over those specified here.
15
18
  # Application configuration should go into files in config/initializers
16
19
  # -- all .rb files in that directory are automatically loaded.
@@ -1,4 +1,4 @@
1
- ComfyCarousel::Application.configure do
1
+ defined?(ComfyCarousel::Application) && ComfyCarousel::Application.configure do
2
2
  # Settings specified here will take precedence over those in config/application.rb
3
3
 
4
4
  # In the development environment your application's code is reloaded on
@@ -1,4 +1,4 @@
1
- ComfyCarousel::Application.configure do
1
+ defined?(ComfyCarousel::Application) && ComfyCarousel::Application.configure do
2
2
  # Settings specified here will take precedence over those in config/application.rb
3
3
 
4
4
  # The test environment is used exclusively to run your application's
@@ -0,0 +1,12 @@
1
+ ComfyCarousel.configure do |config|
2
+
3
+ # set the cms admin path if you have changed it for CMS
4
+ # config.admin_route_prefix = 'admin'
5
+
6
+ # Controller that should be used for admin area
7
+ # config.admin_controller = 'ApplicationController'
8
+
9
+ # Form builder
10
+ # config.form_builder = 'ComfyBlog::FormBuilder'
11
+
12
+ end
data/config/routes.rb CHANGED
@@ -1,5 +1,13 @@
1
1
  Rails.application.routes.draw do
2
2
 
3
-
3
+ namespace :admin, :path => ComfyCarousel.config.admin_route_prefix do
4
+ namespace :carousel do
5
+ resources :carousels, :except => [:show] do
6
+ resources :slides, :except => [:show] do
7
+ put :reorder, :on => :collection
8
+ end
9
+ end
10
+ end
11
+ end unless ComfyCarousel.config.admin_route_prefix.blank?
4
12
 
5
13
  end
@@ -1,14 +1,29 @@
1
1
  class CreateComfyCarousel < ActiveRecord::Migration
2
2
 
3
3
  def self.up
4
- create_table :carousel_slides do |t|
5
-
4
+ create_table :carousel_carousels do |t|
5
+ t.string :label, :null => false
6
+ t.string :identifier, :null => false
6
7
  t.timestamps
7
8
  end
9
+ add_index :carousel_carousels, :identifier
8
10
 
11
+ create_table :carousel_slides do |t|
12
+ t.integer :carousel_id, :null => false
13
+ t.string :label, :null => false
14
+ t.text :content
15
+ t.string :url
16
+ t.string :file_file_name
17
+ t.string :file_content_type
18
+ t.integer :file_file_size
19
+ t.integer :position, :null => false, :default => 0
20
+ t.timestamps
21
+ end
22
+ add_index :carousel_slides, [:carousel_id, :position]
9
23
  end
10
24
 
11
25
  def self.down
26
+ drop_table :carousel_carousels
12
27
  drop_table :carousel_slides
13
28
  end
14
29
  end
data/db/schema.rb ADDED
@@ -0,0 +1,40 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended to check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(:version => 1) do
15
+
16
+ create_table "carousel_carousels", :force => true do |t|
17
+ t.string "label", :null => false
18
+ t.string "identifier", :null => false
19
+ t.datetime "created_at", :null => false
20
+ t.datetime "updated_at", :null => false
21
+ end
22
+
23
+ add_index "carousel_carousels", ["identifier"], :name => "index_carousel_carousels_on_identifier"
24
+
25
+ create_table "carousel_slides", :force => true do |t|
26
+ t.integer "carousel_id", :null => false
27
+ t.string "label", :null => false
28
+ t.text "content"
29
+ t.string "url"
30
+ t.string "file_file_name"
31
+ t.string "file_content_type"
32
+ t.integer "file_file_size"
33
+ t.integer "position", :default => 0, :null => false
34
+ t.datetime "created_at", :null => false
35
+ t.datetime "updated_at", :null => false
36
+ end
37
+
38
+ add_index "carousel_slides", ["carousel_id", "position"], :name => "index_carousel_slides_on_carousel_id_and_position"
39
+
40
+ end
@@ -0,0 +1,25 @@
1
+ # Loading engine only if this is not a standalone installation
2
+ unless defined? ComfyCarousel::Application
3
+ require File.expand_path('comfy_carousel/engine', File.dirname(__FILE__))
4
+ end
5
+
6
+ [ 'comfy_carousel/configuration',
7
+ 'comfy_carousel/form_builder'
8
+ ].each do |path|
9
+ require File.expand_path(path, File.dirname(__FILE__))
10
+ end
11
+
12
+ module ComfyCarousel
13
+ class << self
14
+
15
+ def configure
16
+ yield configuration
17
+ end
18
+
19
+ def configuration
20
+ @configuration ||= Configuration.new
21
+ end
22
+ alias :config :configuration
23
+
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ module ComfyCarousel
2
+ class Configuration
3
+
4
+ # Default url to access admin area is http://yourhost/cms-admin/
5
+ # You can change 'cms-admin' to 'admin', for example.
6
+ attr_accessor :admin_route_prefix
7
+
8
+ # Controller that should be used for admin area
9
+ attr_accessor :admin_controller
10
+
11
+ # Form builder
12
+ attr_accessor :form_builder
13
+
14
+ # Configuration defaults
15
+ def initialize
16
+ @admin_route_prefix = 'admin'
17
+ @admin_controller = 'ApplicationController'
18
+ @form_builder = 'ComfyCarousel::FormBuilder'
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ require 'comfy_carousel'
2
+ require 'rails'
3
+
4
+ module ComfyCarousel
5
+ class Engine < Rails::Engine
6
+ initializer 'comfy_carousel.configuration' do |app|
7
+ if defined?(ComfortableMexicanSofa)
8
+ # Applying configuraion
9
+ ComfyCarousel.configure do |conf|
10
+ conf.admin_route_prefix = ComfortableMexicanSofa.config.admin_route_prefix
11
+ conf.admin_controller = 'CmsAdmin::BaseController'
12
+ conf.form_builder = 'ComfortableMexicanSofa::FormBuilder'
13
+ end
14
+ # Adding view hooks
15
+ ComfortableMexicanSofa::ViewHooks.add(:navigation, '/admin/carousel/navigation')
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,50 @@
1
+ class ComfyCarousel::FormBuilder < ActionView::Helpers::FormBuilder
2
+
3
+ helpers = field_helpers -
4
+ %w(hidden_field fields_for) +
5
+ %w(select)
6
+
7
+ helpers.each do |name|
8
+ class_eval %Q^
9
+ def #{name}(field, *args)
10
+ options = args.extract_options!
11
+ args << options
12
+ return super if options.delete(:disable_builder)
13
+ default_field('#{name}', field, options){ super }
14
+ end
15
+ ^
16
+ end
17
+
18
+ def default_field(type, field, options = {}, &block)
19
+ errors = if object.respond_to?(:errors) && object.errors[field].present?
20
+ "<div class='errors'>#{[object.errors[field]].flatten.first}</div>"
21
+ end
22
+ if desc = options.delete(:desc)
23
+ desc = "<div class='desc'>#{desc}</div>"
24
+ end
25
+ %(
26
+ <div class='form_element #{type}_element #{'errors' if errors}'>
27
+ <div class='label'>#{label_for(field, options)}</div>
28
+ <div class='value'>#{yield}</div>
29
+ #{desc}
30
+ #{errors}
31
+ </div>
32
+ ).html_safe
33
+ end
34
+
35
+ def label_for(field, options)
36
+ label = options.delete(:label) || field.to_s.titleize.capitalize
37
+ "<label for=\"#{object_name}_#{field}\">#{label}</label>".html_safe
38
+ end
39
+
40
+ def simple_field(label = nil, content = nil, options = {}, &block)
41
+ content ||= @template.capture(&block) if block_given?
42
+ %(
43
+ <div class='form_element #{options.delete(:class)}'>
44
+ <div class='label'>#{label}</div>
45
+ <div class='value'>#{content}</div>
46
+ </div>
47
+ ).html_safe
48
+ end
49
+
50
+ end
@@ -0,0 +1,11 @@
1
+ ____ __ ____ _
2
+ / ___|___ _ __ ___ / _|_ _ / ___|__ _ _ __ ___ _ _ ___ ___| |
3
+ | | / _ \| '_ ` _ \| |_| | | | | / _` | '__/ _ \| | | / __|/ _ \ |
4
+ | |__| (_) | | | | | | _| |_| | |__| (_| | | | (_) | |_| \__ \ __/ |
5
+ \____\___/|_| |_| |_|_| \__, |\____\__,_|_| \___/ \__,_|___/\___|_|
6
+ |___/
7
+
8
+ Hey! Everything is almost done. Please don't forget to
9
+
10
+ * run migrations -> `rake db:migrate`
11
+
@@ -0,0 +1,35 @@
1
+ module Comfy
2
+ module Generators
3
+ class CarouselGenerator < Rails::Generators::Base
4
+ require 'rails/generators/active_record'
5
+ include Rails::Generators::Migration
6
+ include Thor::Actions
7
+
8
+ source_root File.expand_path('../../../../..', __FILE__)
9
+
10
+ def generate_migration
11
+ destination = File.expand_path('db/migrate/01_create_comfy_carousel.rb', self.destination_root)
12
+ migration_dir = File.dirname(destination)
13
+ destination = self.class.migration_exists?(migration_dir, 'create_comfy_carousel')
14
+
15
+ if destination
16
+ puts "\e[0m\e[31mFound existing create_comfy_carousel.rb migration. Remove it if you want to regenerate.\e[0m"
17
+ else
18
+ migration_template 'db/migrate/01_create_comfy_carousel.rb', 'db/migrate/create_comfy_carousel.rb'
19
+ end
20
+ end
21
+
22
+ def generate_initialization
23
+ copy_file 'config/initializers/comfy_carousel.rb', 'config/initializers/comfy_carousel.rb'
24
+ end
25
+
26
+ def show_readme
27
+ readme 'lib/generators/comfy/carousel/README'
28
+ end
29
+
30
+ def self.next_migration_number(dirname)
31
+ ActiveRecord::Generators::Base.next_migration_number(dirname)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,4 @@
1
+ # Small hack to auto-run migrations during testing
2
+ namespace :db do
3
+ task :abort_if_pending_migrations => [:migrate]
4
+ end
@@ -0,0 +1,3 @@
1
+ default:
2
+ label: Default
3
+ identifier: default
@@ -0,0 +1,9 @@
1
+ default:
2
+ carousel: default
3
+ label: Default Slide
4
+ content: Default Slide Content
5
+ url: http://test.test
6
+ file_file_name: sample.jpg
7
+ file_content_type: image/jpeg
8
+ file_file_size: 20099
9
+ position: 0
Binary file
@@ -0,0 +1,92 @@
1
+ require File.expand_path('../../../test_helper', File.dirname(__FILE__))
2
+
3
+ class Admin::Carousel::CarouselsControllerTest < ActionController::TestCase
4
+
5
+ def test_get_index
6
+ get :index
7
+ assert_response :success
8
+ assert_template :index
9
+ assert assigns(:carousels)
10
+ end
11
+
12
+ def test_get_new
13
+ get :new
14
+ assert_response :success
15
+ assert_template :new
16
+ assert_select "form[action='/admin/carousel/carousels']"
17
+ end
18
+
19
+ def test_get_edit
20
+ carousel = carousel_carousels(:default)
21
+ get :edit, :id => carousel
22
+ assert_response :success
23
+ assert_template :edit
24
+ assert_select "form[action='/admin/carousel/carousels/#{carousel.id}']"
25
+ end
26
+
27
+ def test_get_edit_failure
28
+ get :edit, :id => 'invalid'
29
+ assert_response :redirect
30
+ assert_redirected_to :action => :index
31
+ assert_equal 'Carousel not found', flash[:error]
32
+ end
33
+
34
+ def test_creation
35
+ assert_difference 'Carousel::Carousel.count' do
36
+ post :create, :carousel => {
37
+ :label => 'Test',
38
+ :identifier => 'test'
39
+ }
40
+ assert_response :redirect
41
+ assert_redirected_to new_admin_carousel_carousel_slide_path(assigns(:carousel))
42
+ assert_equal 'Carousel created', flash[:notice]
43
+ end
44
+ end
45
+
46
+ def test_creation_failure
47
+ assert_no_difference 'Carousel::Carousel.count' do
48
+ post :create, :carousel => { }
49
+ assert_response :success
50
+ assert_template :new
51
+ assert_equal 'Failed to create Carousel', flash[:error]
52
+ end
53
+ end
54
+
55
+ def test_update
56
+ carousel = carousel_carousels(:default)
57
+
58
+ put :update, :id => carousel, :carousel => {
59
+ :label => 'Updated'
60
+ }
61
+ assert_response :redirect
62
+ assert_redirected_to :action => :edit, :id => carousel
63
+ assert_equal 'Carousel updated', flash[:notice]
64
+
65
+ carousel.reload
66
+ assert_equal 'Updated', carousel.label
67
+ end
68
+
69
+ def test_update_failure
70
+ carousel = carousel_carousels(:default)
71
+
72
+ put :update, :id => carousel, :carousel => {
73
+ :identifier => ''
74
+ }
75
+ assert_response :success
76
+ assert_template :edit
77
+ assert_equal 'Failed to update Carousel', flash[:error]
78
+
79
+ carousel.reload
80
+ assert_not_equal '', carousel.identifier
81
+ end
82
+
83
+ def test_destroy
84
+ assert_difference 'Carousel::Carousel.count', -1 do
85
+ delete :destroy, :id => carousel_carousels(:default)
86
+ assert_response :redirect
87
+ assert_redirected_to :action => :index
88
+ assert_equal 'Carousel removed', flash[:notice]
89
+ end
90
+ end
91
+
92
+ end
@@ -1,53 +1,60 @@
1
- require 'test_helper'
1
+ require File.expand_path('../../../test_helper', File.dirname(__FILE__))
2
2
 
3
- class Admin::SlidesControllerTest < ActionController::TestCase
3
+ class Admin::Carousel::SlidesControllerTest < ActionController::TestCase
4
4
 
5
5
  def test_get_index
6
- get :index
6
+ get :index, :carousel_id => carousel_carousels(:default)
7
7
  assert_response :success
8
8
  assert_template :index
9
9
  assert assigns(:slides)
10
10
  end
11
11
 
12
12
  def test_get_new
13
- get :new
13
+ carousel = carousel_carousels(:default)
14
+ get :new, :carousel_id => carousel
14
15
  assert_response :success
15
16
  assert_template :new
16
17
  assert assigns(:slide)
18
+ assert_select "form[action='/admin/carousel/carousels/#{carousel.id}/slides']"
17
19
  end
18
20
 
19
21
  def test_get_edit
20
- get :edit, :id => slides(:one)
22
+ carousel = carousel_carousels(:default)
23
+ slide = carousel_slides(:default)
24
+
25
+ get :edit, :carousel_id => carousel, :id => slide
21
26
  assert_response :success
22
27
  assert_template :edit
23
28
  assert assigns(:slide)
29
+ assert_select "form[action='/admin/carousel/carousels/#{carousel.id}/slides/#{slide.id}']"
24
30
  end
25
31
 
26
32
  def test_get_edit_failure
27
- get :edit, :id => 'invalid'
33
+ get :edit, :carousel_id => carousel_carousels(:default), :id => 'invalid'
28
34
  assert_response :redirect
29
35
  assert_redirected_to :action => :index
30
36
  assert_equal 'Slide not found', flash[:error]
31
37
  end
32
38
 
33
39
  def test_creation
34
- assert_difference 'Slide.count' do
35
- post :create, :slide => {
36
- :description => "MyText",
37
- :url => "MyString",
38
- :title => "MySlideTitle",
39
- :sort => 1
40
+ assert_difference 'Carousel::Slide.count' do
41
+ post :create, :carousel_id => carousel_carousels(:default), :slide => {
42
+ :label => 'Test',
43
+ :url => 'http://test.test',
44
+ :content => 'Test Slide'
40
45
  }
41
46
  assert_response :redirect
42
47
  assert_redirected_to :action => :index
43
- slide = Slide.last
44
- assert_equal 'MyText', slide.description
48
+ assert_equal 'Slide created', flash[:notice]
49
+
50
+ slide = Carousel::Slide.last
51
+ assert_equal 'Test', slide.label
45
52
  end
46
53
  end
47
54
 
48
55
  def test_creation_failure
49
- assert_no_difference 'Slide.count' do
50
- post :create, :slide => { }
56
+ assert_no_difference 'Carousel::Slide.count' do
57
+ post :create, :carousel_id => carousel_carousels(:default), :slide => { }
51
58
  assert_response :success
52
59
  assert_template :new
53
60
  assert_equal 'Failed to create Slide', flash[:error]
@@ -55,38 +62,60 @@ class Admin::SlidesControllerTest < ActionController::TestCase
55
62
  end
56
63
 
57
64
  def test_update
58
- slide = slides(:one)
59
- put :update, :id => slide, :slide => {
60
- :description => "MyText",
61
- :url => "MyString",
62
- :title => "UpdatedTitle",
63
- :sort => 1
65
+ carousel = carousel_carousels(:default)
66
+ slide = carousel_slides(:default)
67
+
68
+ put :update, :carousel_id => carousel, :id => slide, :slide => {
69
+ :label => 'Updated'
64
70
  }
65
71
  assert_response :redirect
66
- assert_redirected_to :action => :edit
72
+ assert_redirected_to :action => :edit, :id => slide
73
+ assert_equal 'Slide updated', flash[:notice]
74
+
67
75
  slide.reload
68
- assert_equal 'UpdatedTitle', slide.title
76
+ assert_equal 'Updated', slide.label
69
77
  end
70
78
 
71
79
  def test_update_failure
72
- slide = slides(:one)
73
- put :update, :id => slide, :slide => {
74
- :description => ''
80
+ carousel = carousel_carousels(:default)
81
+ slide = carousel_slides(:default)
82
+
83
+ put :update, :carousel_id => carousel, :id => slide, :slide => {
84
+ :label => ''
75
85
  }
76
86
  assert_response :success
77
87
  assert_template :edit
78
88
  assert_equal 'Failed to update Slide', flash[:error]
89
+
79
90
  slide.reload
80
- assert_not_equal '', slide.description
91
+ assert_not_equal '', slide.label
81
92
  end
82
93
 
83
94
  def test_destroy
84
- assert_difference 'Slide.count', -1 do
85
- delete :destroy, :id => slides(:one)
95
+ assert_difference 'Carousel::Slide.count', -1 do
96
+ delete :destroy, :carousel_id => carousel_carousels(:default), :id => carousel_slides(:default)
86
97
  assert_response :redirect
87
98
  assert_redirected_to :action => :index
88
99
  assert_equal 'Slide deleted', flash[:notice]
89
100
  end
90
101
  end
102
+
103
+ def test_reorder
104
+ carousel = carousel_carousels(:default)
105
+ slide_one = carousel_slides(:default)
106
+ slide_two = carousel.slides.create!(
107
+ :label => 'test'
108
+ )
109
+ assert_equal 0, slide_one.position
110
+ assert_equal 1, slide_two.position
111
+
112
+ post :reorder, :carousel_id => carousel, :carousel_slide => [slide_two.id, slide_one.id]
113
+ assert_response :success
114
+ slide_one.reload
115
+ slide_two.reload
116
+
117
+ assert_equal 1, slide_one.position
118
+ assert_equal 0, slide_two.position
119
+ end
91
120
 
92
121
  end