themes_for_rails 0.2.1

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.
Files changed (75) hide show
  1. data/.gitignore +3 -0
  2. data/.rvmrc +5 -0
  3. data/Gemfile +11 -0
  4. data/Gemfile.lock +108 -0
  5. data/README.textile +155 -0
  6. data/Rakefile +33 -0
  7. data/init.rb +1 -0
  8. data/lib/generators/theme_for_rails/install_generator.rb +11 -0
  9. data/lib/generators/theme_for_rails/templates/theme/images/.gitkeep +0 -0
  10. data/lib/generators/theme_for_rails/templates/theme/javascripts/.gitkeep +0 -0
  11. data/lib/generators/theme_for_rails/templates/theme/stylesheets/.gitkeep +0 -0
  12. data/lib/generators/theme_for_rails/templates/theme/views/layouts/.gitkeep +0 -0
  13. data/lib/generators/theme_for_rails/theme_generator.rb +17 -0
  14. data/lib/tasks/themes_for_rails.rake +21 -0
  15. data/lib/themes_for_rails.rb +23 -0
  16. data/lib/themes_for_rails/assets_controller.rb +37 -0
  17. data/lib/themes_for_rails/common_methods.rb +48 -0
  18. data/lib/themes_for_rails/controller_methods.rb +23 -0
  19. data/lib/themes_for_rails/railtie.rb +18 -0
  20. data/lib/themes_for_rails/routes.rb +15 -0
  21. data/lib/themes_for_rails/url_helpers.rb +23 -0
  22. data/lib/themes_for_rails/version.rb +3 -0
  23. data/lib/themes_for_rails/view_helpers.rb +37 -0
  24. data/test/assets_controller_test.rb +46 -0
  25. data/test/controller_methods_test.rb +78 -0
  26. data/test/dummy_app/.gitignore +4 -0
  27. data/test/dummy_app/Gemfile +30 -0
  28. data/test/dummy_app/Rakefile +7 -0
  29. data/test/dummy_app/app/controllers/application_controller.rb +3 -0
  30. data/test/dummy_app/app/helpers/application_helper.rb +2 -0
  31. data/test/dummy_app/app/views/layouts/application.html.erb +14 -0
  32. data/test/dummy_app/config.ru +4 -0
  33. data/test/dummy_app/config/application.rb +42 -0
  34. data/test/dummy_app/config/boot.rb +13 -0
  35. data/test/dummy_app/config/database.yml +18 -0
  36. data/test/dummy_app/config/environment.rb +5 -0
  37. data/test/dummy_app/config/environments/development.rb +26 -0
  38. data/test/dummy_app/config/environments/production.rb +49 -0
  39. data/test/dummy_app/config/environments/test.rb +35 -0
  40. data/test/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  41. data/test/dummy_app/config/initializers/inflections.rb +10 -0
  42. data/test/dummy_app/config/initializers/mime_types.rb +5 -0
  43. data/test/dummy_app/config/initializers/secret_token.rb +7 -0
  44. data/test/dummy_app/config/initializers/session_store.rb +8 -0
  45. data/test/dummy_app/config/locales/en.yml +5 -0
  46. data/test/dummy_app/config/routes.rb +4 -0
  47. data/test/dummy_app/db/seeds.rb +7 -0
  48. data/test/dummy_app/lib/tasks/.gitkeep +0 -0
  49. data/test/dummy_app/public/404.html +26 -0
  50. data/test/dummy_app/public/422.html +26 -0
  51. data/test/dummy_app/public/500.html +26 -0
  52. data/test/dummy_app/public/favicon.ico +0 -0
  53. data/test/dummy_app/public/images/rails.png +0 -0
  54. data/test/dummy_app/public/index.html +239 -0
  55. data/test/dummy_app/public/javascripts/application.js +2 -0
  56. data/test/dummy_app/public/javascripts/controls.js +965 -0
  57. data/test/dummy_app/public/javascripts/dragdrop.js +974 -0
  58. data/test/dummy_app/public/javascripts/effects.js +1123 -0
  59. data/test/dummy_app/public/javascripts/prototype.js +6001 -0
  60. data/test/dummy_app/public/javascripts/rails.js +175 -0
  61. data/test/dummy_app/public/robots.txt +5 -0
  62. data/test/dummy_app/public/stylesheets/.gitkeep +0 -0
  63. data/test/dummy_app/script/rails +6 -0
  64. data/test/dummy_app/themes/default/images/logo.png +0 -0
  65. data/test/dummy_app/themes/default/javascripts/app.js +1 -0
  66. data/test/dummy_app/themes/default/stylesheets/style.css +0 -0
  67. data/test/dummy_app/themes/default/stylesheets/style2.css +3 -0
  68. data/test/dummy_app/themes/default/views/layouts/default.html.erb +10 -0
  69. data/test/dummy_app/themes/default/views/products/index.html.erb +0 -0
  70. data/test/routes_test.rb +33 -0
  71. data/test/support/extensions.rb +16 -0
  72. data/test/test_helper.rb +10 -0
  73. data/test/themes_for_rails_test.rb +7 -0
  74. data/themes_for_rails.gemspec +133 -0
  75. metadata +157 -0
@@ -0,0 +1,48 @@
1
+ module ThemesForRails
2
+ module CommonMethods
3
+ def view_path_for(theme)
4
+ File.join(theme_path_for(theme), "views")
5
+ end
6
+ def theme_name
7
+ @cached_theme_name ||= begin
8
+ case @theme_name
9
+ when Symbol then
10
+ self.respond_to?(@theme_name) ? self.send(@theme_name) : @theme_name.to_s
11
+ when String then @theme_name
12
+ else
13
+ nil
14
+ end
15
+ end
16
+ end
17
+ def theme_name=(name)
18
+ @theme_name = name
19
+ end
20
+ def set_theme(name)
21
+ self.theme_name = name
22
+ if valid_theme?
23
+ add_theme_view_path
24
+ end
25
+ end
26
+ public
27
+ def valid_theme?
28
+ !self.theme_name.nil?
29
+ end
30
+ # will add the view path for the current theme
31
+ def add_theme_view_path
32
+ add_theme_view_path_for(self.theme_name)
33
+ end
34
+ # will add the view path for a given theme name
35
+ def add_theme_view_path_for(name)
36
+ self.view_paths << ActionView::FileSystemResolver.new(view_path_for(name))
37
+ end
38
+ def public_theme_path
39
+ theme_path("/")
40
+ end
41
+ def theme_path(base = ::Rails.root)
42
+ theme_path_for(theme_name, base)
43
+ end
44
+ def theme_path_for(name, base = ::Rails.root)
45
+ File.join(base, "themes", name)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,23 @@
1
+ module ThemesForRails
2
+ module ControllerMethods
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ include ThemesForRails::CommonMethods
6
+ include ThemesForRails::UrlHelpers
7
+ end
8
+ module ClassMethods
9
+ def theme(name, options = {})
10
+ before_filter(options) do |controller|
11
+ controller.set_theme(name)
12
+ end
13
+ end
14
+ end
15
+ module InstanceMethods
16
+ def theme(name)
17
+ set_theme(name)
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ ActiveSupport.on_load(:action_controller) { include ThemesForRails::ControllerMethods }
@@ -0,0 +1,18 @@
1
+ # ActiveSupport.on_load(:action_view) { include Devise::Controllers::UrlHelpers }
2
+
3
+ module ThemesForRails
4
+ class Railtie < ::Rails::Railtie
5
+ config.themes_for_rails = ActiveSupport::OrderedOptions.new
6
+ config.themes_for_rails.on = true
7
+ # config.themes_for_rails.base_path = File.join([::Rails.root, 'themes'])
8
+ rake_tasks do
9
+ load "tasks/themes_for_rails.rake"
10
+ end
11
+
12
+ config.to_prepare do
13
+ ThemesForRails::Railtie.config.themes_for_rails.each do |k, v|
14
+ Rails.logger.info "themes_for_rails.#{k}: #{v}"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ module ThemesForRails
2
+ module Routes
3
+ def themes_for_rails
4
+ match 'themes/:theme/stylesheets/:asset(.:extension)' => 'themes_for_rails/assets#stylesheets', :as => :base_theme_stylesheet
5
+ match 'themes/:theme/javascripts/:asset(.:extension)' => 'themes_for_rails/assets#javascripts', :as => :base_theme_javascript
6
+ match 'themes/:theme/images/:asset(.:extension)' => 'themes_for_rails/assets#images', :as => :base_theme_image
7
+ end
8
+ end
9
+ end
10
+ module ActionDispatch::Routing
11
+ class Mapper #:nodoc:
12
+ include ThemesForRails::Routes
13
+ end
14
+ end
15
+
@@ -0,0 +1,23 @@
1
+ module ThemesForRails
2
+ module UrlHelpers
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ include ThemesForRails::CommonMethods
6
+ helper_method :current_theme_stylesheet_path,
7
+ :current_theme_javascript_path,
8
+ :current_theme_image_path
9
+ end
10
+ module InstanceMethods
11
+ def current_theme_stylesheet_path(asset)
12
+ base_theme_stylesheet_path(:theme => self.theme_name, :asset => asset, :extension => 'css')
13
+ end
14
+ def current_theme_javascript_path(asset)
15
+ base_theme_javascript_path(:theme => self.theme_name, :asset => asset, :extension => 'js')
16
+ end
17
+ def current_theme_image_path(asset)
18
+ image, extension = asset.split(".")
19
+ base_theme_image_path(:theme => self.theme_name, :asset => image, :extension => extension)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module ThemesForRails
2
+ VERSION = "0.2.1"
3
+ end
@@ -0,0 +1,37 @@
1
+ module ThemesForRails
2
+ module ViewHelpers
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ include ThemesForRails::CommonMethods
6
+ end
7
+ module InstanceMethods
8
+ def current_theme_stylesheet_path(asset)
9
+ base_theme_stylesheet_path(:theme => self.theme_name, :asset => asset, :extension => 'css')
10
+ end
11
+ def current_theme_javascript_path(asset)
12
+ base_theme_javascript_path(:theme => self.theme_name, :asset => asset, :extension => 'js')
13
+ end
14
+ def current_theme_image_path(asset)
15
+ image, extension = asset.split(".")
16
+ self.base_theme_image_path(:theme => self.theme_name, :asset => image, :extension => extension)
17
+ end
18
+ alias_method :theme_image_path, :current_theme_image_path
19
+ alias_method :theme_javascript_path, :current_theme_javascript_path
20
+ alias_method :theme_stylesheet_path, :current_theme_stylesheet_path
21
+
22
+ def theme_image_tag(source)
23
+ image_tag(theme_image_path(source))
24
+ end
25
+ def theme_javascript_include_tag(*files)
26
+ files.collect! {|file| theme_javascript_path(file) }
27
+ javascript_include_tag *files
28
+ end
29
+ def theme_stylesheet_link_tag(*files)
30
+ files.collect! {|file| theme_stylesheet_path(file) }
31
+ stylesheet_link_tag *files
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ ActiveSupport.on_load(:action_view) { include ThemesForRails::ViewHelpers }
@@ -0,0 +1,46 @@
1
+ require "test_helper"
2
+
3
+ module ThemesForRails
4
+ class AssetsControllerTest < ActionController::TestCase
5
+ tests ThemesForRails::AssetsController
6
+ should "respond to stylesheets" do
7
+ assert @controller.respond_to?(:stylesheets)
8
+ end
9
+ should "respond with the right stylesheet file when requested" do
10
+ get 'stylesheets', { :theme => 'default', :asset => 'style', :extension => 'css'}
11
+ assert_response :success
12
+ assert_equal @response.content_type, 'text/css'
13
+ end
14
+ should "not be success when the stylesheet file is not found" do
15
+ get 'stylesheets', { :theme => 'default', :asset => 'oldstyle', :extension => 'css'}
16
+ assert_response :missing
17
+ end
18
+ # javascripts
19
+ should "respond to javascripts" do
20
+ assert @controller.respond_to?(:javascripts)
21
+ end
22
+ should "respond with the right javascript file when requested" do
23
+ get 'javascripts', { :theme => 'default', :asset => 'app', :extension => 'js'}
24
+ assert_response :success
25
+ assert_equal @response.content_type, 'text/javascript'
26
+ end
27
+ should "not be success when the javascript file is not found" do
28
+ get 'javascripts', { :theme => 'default', :asset => 'oldapp', :extension => 'js'}
29
+ assert_response :missing
30
+ end
31
+
32
+ # images
33
+ should "respond to images" do
34
+ assert @controller.respond_to?(:images)
35
+ end
36
+ should "respond with the right image file when requested" do
37
+ get 'images', { :theme => 'default', :asset => 'logo', :extension => 'png'}
38
+ assert_response :success
39
+ assert_equal @response.content_type, 'image/png'
40
+ end
41
+ should "not be success when the image file is not found" do
42
+ get 'images', { :theme => 'default', :asset => 'i_am_not_here', :extension => 'jpg'}
43
+ assert_response :missing
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,78 @@
1
+ require "test_helper"
2
+
3
+ class MyController < ActionController::Base
4
+ def hello
5
+ render :text => "Just a test"
6
+ end
7
+ end
8
+ class CustomThemeController < ActionController::Base
9
+ def hello
10
+ render :text => "Just a test"
11
+ end
12
+ end
13
+ module ThemesForRails
14
+ class ControllerMethodsTest < ActionController::TestCase
15
+ context "at class level" do
16
+ should "respond_to theme" do
17
+ assert ApplicationController.respond_to?(:theme)
18
+ end
19
+ context "setting the theme with a String" do
20
+ tests MyController
21
+ should "set the selected theme for all actions" do
22
+ MyController.theme 'default'
23
+ @controller.expects(:set_theme).with('default')
24
+ assert_equal nil, @controller.theme_name
25
+ get :hello
26
+ end
27
+ end
28
+ context "setting the theme with a Symbol" do
29
+ tests CustomThemeController
30
+ should "call the selected method" do
31
+ @controller.expects(:theme_selector).returns('custom')
32
+ CustomThemeController.theme :theme_selector
33
+ assert_equal nil, @controller.theme_name
34
+ get :hello
35
+ end
36
+ end
37
+ end
38
+ context "at instance level" do
39
+ tests ApplicationController
40
+ should "respond_to theme" do
41
+ assert @controller.respond_to?(:theme)
42
+ end
43
+ should "should store the theme's name" do
44
+ @controller.theme 'default'
45
+ assert_equal @controller.theme_name, 'default'
46
+ end
47
+ context "when a theme has been set" do
48
+ tests ApplicationController
49
+ should "add the theme's view path to the list of general view paths" do
50
+ antes = @controller.view_paths.size
51
+ @controller.theme 'default'
52
+ assert_equal antes + 1, @controller.view_paths.size
53
+ end
54
+ should "have a proper view path" do
55
+ @controller.theme 'default'
56
+ view_path = @controller.view_paths.last
57
+ theme_path = File.join(File.expand_path(File.dirname(__FILE__)), "dummy_app", "themes", "default", "views")
58
+ assert_equal view_path.to_s, theme_path
59
+ end
60
+ end
61
+ end
62
+ context "using url helpers" do
63
+ tests ApplicationController
64
+ should "provide url method to access a given stylesheet file in the current theme" do
65
+ @controller.theme 'default'
66
+ assert_equal @controller.send(:current_theme_stylesheet_path, "style"), "/themes/default/stylesheets/style.css"
67
+ end
68
+ should "provide url method to access a given javascript file in the current theme" do
69
+ @controller.theme 'default'
70
+ assert_equal @controller.send(:current_theme_javascript_path, "app"), "/themes/default/javascripts/app.js"
71
+ end
72
+ should "provide url method to access a given image file in the current theme" do
73
+ @controller.theme 'default'
74
+ assert_equal @controller.send(:current_theme_image_path, "logo.png"), "/themes/default/images/logo.png"
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,4 @@
1
+ .bundle
2
+ db/*.sqlite3
3
+ log/*.log
4
+ tmp/**/*
@@ -0,0 +1,30 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'rails', '3.0.0'
4
+
5
+ # Bundle edge Rails instead:
6
+ # gem 'rails', :git => 'git://github.com/rails/rails.git'
7
+
8
+ gem 'sqlite3-ruby', :require => 'sqlite3'
9
+
10
+ # Use unicorn as the web server
11
+ # gem 'unicorn'
12
+
13
+ # Deploy with Capistrano
14
+ # gem 'capistrano'
15
+
16
+ # To use debugger
17
+ # gem 'ruby-debug'
18
+
19
+ # Bundle the extra gems:
20
+ # gem 'bj'
21
+ # gem 'nokogiri'
22
+ # gem 'sqlite3-ruby', :require => 'sqlite3'
23
+ # gem 'aws-s3', :require => 'aws/s3'
24
+
25
+ # Bundle gems for the local environment. Make sure to
26
+ # put test-only gems in this group so their generators
27
+ # and rake tasks are available in development mode:
28
+ # group :development, :test do
29
+ # gem 'webrat'
30
+ # end
@@ -0,0 +1,7 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+ require 'rake'
6
+
7
+ DummyApp::Application.load_tasks
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>DummyApp</title>
5
+ <%= stylesheet_link_tag :all %>
6
+ <%= javascript_include_tag :defaults %>
7
+ <%= csrf_meta_tag %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run DummyApp::Application
@@ -0,0 +1,42 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require 'rails/all'
4
+
5
+ # If you have a Gemfile, require the gems listed there, including any gems
6
+ # you've limited to :test, :development, or :production.
7
+ Bundler.require(:default, Rails.env) if defined?(Bundler)
8
+
9
+ module DummyApp
10
+ class Application < Rails::Application
11
+ # Settings in config/environments/* take precedence over those specified here.
12
+ # Application configuration should go into files in config/initializers
13
+ # -- all .rb files in that directory are automatically loaded.
14
+
15
+ # Custom directories with classes and modules you want to be autoloadable.
16
+ # config.autoload_paths += %W(#{config.root}/extras)
17
+
18
+ # Only load the plugins named here, in the order given (default is alphabetical).
19
+ # :all can be used as a placeholder for all plugins not explicitly named.
20
+ # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
21
+
22
+ # Activate observers that should always be running.
23
+ # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
24
+
25
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
26
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
27
+ # config.time_zone = 'Central Time (US & Canada)'
28
+
29
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
30
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
31
+ # config.i18n.default_locale = :de
32
+
33
+ # JavaScript files you want as :defaults (application.js is always included).
34
+ # config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
35
+
36
+ # Configure the default encoding used in templates for Ruby 1.9.
37
+ config.encoding = "utf-8"
38
+
39
+ # Configure sensitive parameters which will be filtered from the log file.
40
+ config.filter_parameters += [:password]
41
+ end
42
+ end
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+
3
+ # Set up gems listed in the Gemfile.
4
+ gemfile = File.expand_path('../../../../Gemfile', __FILE__)
5
+ begin
6
+ ENV['BUNDLE_GEMFILE'] = gemfile
7
+ require 'bundler'
8
+ Bundler.setup
9
+ rescue Bundler::GemNotFound => e
10
+ STDERR.puts e.message
11
+ STDERR.puts "Try running `bundle install`."
12
+ exit!
13
+ end if File.exist?(gemfile)
@@ -0,0 +1,18 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3-ruby (not necessary on OS X Leopard)
3
+ development:
4
+ adapter: sqlite3
5
+ database: db/development.sqlite3
6
+ pool: 5
7
+ timeout: 5000
8
+
9
+ # Warning: The database defined as "test" will be erased and
10
+ # re-generated from your development database when you run "rake".
11
+ # Do not set this db to the same as development or production.
12
+ test:
13
+ adapter: sqlite3
14
+ database: ":memory:"
15
+
16
+ production:
17
+ adapter: sqlite3
18
+ database: ":memory:"