From 71015018b67f3a77c8876cace01c60fb581d81f0 Mon Sep 17 00:00:00 2001 From: AntonioTerceiro Date: Tue, 31 Jul 2007 13:01:42 +0000 Subject: [PATCH] r222@sede: terceiro | 2007-07-28 15:54:13 -0300 ActionItem0: implementing a better interface for the old flexible_template --- vendor/plugins/design/README | 4 ++++ vendor/plugins/design/Rakefile | 22 ++++++++++++++++++++++ vendor/plugins/design/init.rb | 25 +++++++++++++++++++++++++ vendor/plugins/design/install.rb | 1 + vendor/plugins/design/lib/design.rb | 29 +++++++++++++++++++++++++++++ vendor/plugins/design/lib/design/editor.rb | 7 +++++++ vendor/plugins/design/lib/design/fixed_design_holder.rb | 25 +++++++++++++++++++++++++ vendor/plugins/design/lib/design/helper.rb | 4 ++++ vendor/plugins/design/lib/design/proxy_design_holder.rb | 43 +++++++++++++++++++++++++++++++++++++++++++ vendor/plugins/design/tasks/design_tasks.rake | 4 ++++ vendor/plugins/design/test/design_test.rb | 24 ++++++++++++++++++++++++ vendor/plugins/design/test/fixed_design_holder_test.rb | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ vendor/plugins/design/test/proxy_design_holder_test.rb | 32 ++++++++++++++++++++++++++++++++ vendor/plugins/design/test/test_helper.rb | 44 ++++++++++++++++++++++++++++++++++++++++++++ vendor/plugins/design/uninstall.rb | 1 + 15 files changed, 318 insertions(+), 0 deletions(-) create mode 100644 vendor/plugins/design/README create mode 100644 vendor/plugins/design/Rakefile create mode 100644 vendor/plugins/design/init.rb create mode 100644 vendor/plugins/design/install.rb create mode 100644 vendor/plugins/design/lib/design.rb create mode 100644 vendor/plugins/design/lib/design/editor.rb create mode 100644 vendor/plugins/design/lib/design/fixed_design_holder.rb create mode 100644 vendor/plugins/design/lib/design/helper.rb create mode 100644 vendor/plugins/design/lib/design/proxy_design_holder.rb create mode 100644 vendor/plugins/design/tasks/design_tasks.rake create mode 100644 vendor/plugins/design/test/design_test.rb create mode 100644 vendor/plugins/design/test/fixed_design_holder_test.rb create mode 100644 vendor/plugins/design/test/proxy_design_holder_test.rb create mode 100644 vendor/plugins/design/test/test_helper.rb create mode 100644 vendor/plugins/design/uninstall.rb diff --git a/vendor/plugins/design/README b/vendor/plugins/design/README new file mode 100644 index 0000000..c3e0785 --- /dev/null +++ b/vendor/plugins/design/README @@ -0,0 +1,4 @@ +Design +====== + +Description goes here \ No newline at end of file diff --git a/vendor/plugins/design/Rakefile b/vendor/plugins/design/Rakefile new file mode 100644 index 0000000..48d08ce --- /dev/null +++ b/vendor/plugins/design/Rakefile @@ -0,0 +1,22 @@ +require 'rake' +require 'rake/testtask' +require 'rake/rdoctask' + +desc 'Default: run unit tests.' +task :default => :test + +desc 'Test the design plugin.' +Rake::TestTask.new(:test) do |t| + t.libs << 'lib' + t.pattern = 'test/**/*_test.rb' + t.verbose = true +end + +desc 'Generate documentation for the design plugin.' +Rake::RDocTask.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'Design' + rdoc.options << '--line-numbers' << '--inline-source' + rdoc.rdoc_files.include('README') + rdoc.rdoc_files.include('lib/**/*.rb') +end diff --git a/vendor/plugins/design/init.rb b/vendor/plugins/design/init.rb new file mode 100644 index 0000000..353ef4f --- /dev/null +++ b/vendor/plugins/design/init.rb @@ -0,0 +1,25 @@ +require 'design' + +class ActionController::Base + + # Declares that this controller uses design plugin to generate its layout. + # See the plugin README for options that can be passed to this method. + def self.design(config = {}) + if (config.has_key?(:holder) && config.has_key?(:fixed)) || (!config.has_key?(:holder) && !config.has_key?(:fixed)) + raise ArgumentError.new("You must supply either :holder or :fixed to design.") + end + + @design_plugin_config = config + + include Design + end + + # declares this controller as a design editor, including in it all the + # functionalities to do that (besides those for using a design). Accepts the + # same options as design. + def self.design_editor(config = {}) + self.design(config) + include Design::Editor + end + +end diff --git a/vendor/plugins/design/install.rb b/vendor/plugins/design/install.rb new file mode 100644 index 0000000..f7732d3 --- /dev/null +++ b/vendor/plugins/design/install.rb @@ -0,0 +1 @@ +# Install hook code here diff --git a/vendor/plugins/design/lib/design.rb b/vendor/plugins/design/lib/design.rb new file mode 100644 index 0000000..69f8cf1 --- /dev/null +++ b/vendor/plugins/design/lib/design.rb @@ -0,0 +1,29 @@ +require 'design/fixed_design_holder' +require 'design/proxy_design_holder' + +require 'design/helper' +require 'design/editor' + +module Design + + # gets the Design object for this controller + def design + @design_plugin_data ||= Hash.new + data = @design_plugin_data + + return data[:design] if data.has_key?(:design) + + config = self.class.instance_variable_get("@design_plugin_config") + + if config.has_key?(:holder) + holder_variable_name = config[:holder] + data[:design] = Design::ProxyDesignHolder.new(self.instance_variable_get("@#{holder_variable_name}")) + else + options = (config[:fixed].kind_of? Hash) ? config[:fixed] : {} + data[:design] = Design::FixedDesignHolder.new(options) + end + + data[:design] # redundant, but makes more clear the return value + end + protected :design +end diff --git a/vendor/plugins/design/lib/design/editor.rb b/vendor/plugins/design/lib/design/editor.rb new file mode 100644 index 0000000..4f75d33 --- /dev/null +++ b/vendor/plugins/design/lib/design/editor.rb @@ -0,0 +1,7 @@ +module Design + + # This module contains the functionality for e design editor. + module Editor + end + +end diff --git a/vendor/plugins/design/lib/design/fixed_design_holder.rb b/vendor/plugins/design/lib/design/fixed_design_holder.rb new file mode 100644 index 0000000..fde139d --- /dev/null +++ b/vendor/plugins/design/lib/design/fixed_design_holder.rb @@ -0,0 +1,25 @@ +module Design + + class FixedDesignHolder + attr_reader :template, :theme, :icon_theme, :boxes + def initialize(options = {}) + @template = options[:template] || 'default' + @theme = options[:theme] || 'default' + @icon_theme = options[:icon_theme] || 'default' + @boxes = options[:boxes] || default_boxes + end + + # creates some default boxes + def default_boxes + box1 = Box.new + box2 = Box.new + box2.blocks << MainBlock.new + box3 = Box.new + + [box1, box2, box3] + end + private :default_boxes + end + +end + diff --git a/vendor/plugins/design/lib/design/helper.rb b/vendor/plugins/design/lib/design/helper.rb new file mode 100644 index 0000000..6e62416 --- /dev/null +++ b/vendor/plugins/design/lib/design/helper.rb @@ -0,0 +1,4 @@ +module Design + module Helper + end +end diff --git a/vendor/plugins/design/lib/design/proxy_design_holder.rb b/vendor/plugins/design/lib/design/proxy_design_holder.rb new file mode 100644 index 0000000..485722a --- /dev/null +++ b/vendor/plugins/design/lib/design/proxy_design_holder.rb @@ -0,0 +1,43 @@ +module Design + + # This class uses an external holder object to hold the details of the + # design, and proxies all access to the template data to it. This object can + # be any object that responds to the following methods: + # + # * +template+ + # * +template=+ + # * +theme+ + # * +theme=+ + # * +icon_theme+ + # * +icon_theme=+ + # * +boxes+ + # * +boxes=+ + # + # These methods must implement get/set semantics for atrributes with their + # names, and can be implemented with +attr_accessor+, as ActiveRecord + # columns, or event explicity by writing the methods and storing the values + # wherever you want. + # + # +template+, +theme+ and +icon_theme+ must return (and accept in the + # setters) strings, while +boxes+ must be an array of Box objects. + class ProxyDesignHolder + + attr_reader :holder + + # creates a new proxy for +holder+ + def initialize(holder) + @holder = holder + end + + # proxies all calls to +template+, +theme+, +icon_theme+ and +boxes+ (as + # well as their setters counterparts) to the holder object + def method_missing(method_id, *args) + if method_id.to_s =~ /^(template|theme|icon_theme|boxes)=?$/ + holder.send(method_id, *args) + else + raise NoMethodError.new("Design has no method \"#{method_id}\"") + end + end + end + +end diff --git a/vendor/plugins/design/tasks/design_tasks.rake b/vendor/plugins/design/tasks/design_tasks.rake new file mode 100644 index 0000000..2408303 --- /dev/null +++ b/vendor/plugins/design/tasks/design_tasks.rake @@ -0,0 +1,4 @@ +# desc "Explaining what the task does" +# task :design do +# # Task goes here +# end \ No newline at end of file diff --git a/vendor/plugins/design/test/design_test.rb b/vendor/plugins/design/test/design_test.rb new file mode 100644 index 0000000..7b9cf05 --- /dev/null +++ b/vendor/plugins/design/test/design_test.rb @@ -0,0 +1,24 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class FixedDesignHolderTest < Test::Unit::TestCase + + def test_design_should_include_design_module + assert FixedDesignTestController.included_modules.include?(Design) + end + + def test_design_editor_should_include_design_and_design_editor_module + assert DesignEditorTestController.included_modules.include?(Design) + assert DesignEditorTestController.included_modules.include?(Design::Editor) + end + + def test_should_not_accept_no_holder_and_no_fixed + assert_raise ArgumentError do + DesignEditorTestController.design + end + end + def test_should_not_accept_both_holder_and_fixed + assert_raise ArgumentError do + DesignEditorTestController.design :holder => 'something', :fixed => true end + end + +end diff --git a/vendor/plugins/design/test/fixed_design_holder_test.rb b/vendor/plugins/design/test/fixed_design_holder_test.rb new file mode 100644 index 0000000..8d4c5c6 --- /dev/null +++ b/vendor/plugins/design/test/fixed_design_holder_test.rb @@ -0,0 +1,53 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class FixedDesignHolderTest < Test::Unit::TestCase + + include Design + + def test_explicit_design + controller = FixedDesignTestController.new + assert_kind_of Design::FixedDesignHolder, controller.design + assert_equal 'some_template', controller.design.template + assert_equal 'some_theme', controller.design.theme + assert_equal 'some_icon_theme', controller.design.icon_theme + assert_equal [FixedDesignTestController::BOX1, FixedDesignTestController::BOX2, FixedDesignTestController::BOX3], controller.design.boxes + end + + def test_explicit_design_should_have_sensible_defaults + controller = FixedDesignDefaultTestController.new + assert_kind_of Design::FixedDesignHolder, controller.design + assert_equal 'default', controller.design.template + assert_equal 'default', controller.design.theme + assert_equal 'default', controller.design.icon_theme + assert_kind_of Array, controller.design.boxes + assert_equal 3, controller.design.boxes.size + end + + def test_should_not_be_able_to_assign_template + # FixedDesignHolder does not implement assigment, on purpose + assert_raise NoMethodError do + FixedDesignHolder.new.template = 'break' + end + end + + def test_should_not_be_able_to_assign_theme + # FixedDesignHolder does not implement assigment, on purpose + assert_raise NoMethodError do + FixedDesignHolder.new.theme = 'break' + end + end + + def test_should_not_be_able_to_assign_icon_theme + assert_raise NoMethodError do + FixedDesignHolder.new.icon_theme = 'break' + end + end + + def test_should_not_be_able_to_assign_boxes + assert_raise NoMethodError do + FixedDesignHolder.new.boxes = [] + end + end + + +end diff --git a/vendor/plugins/design/test/proxy_design_holder_test.rb b/vendor/plugins/design/test/proxy_design_holder_test.rb new file mode 100644 index 0000000..d85b873 --- /dev/null +++ b/vendor/plugins/design/test/proxy_design_holder_test.rb @@ -0,0 +1,32 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + + +class ProxyDesignHolderTest < Test::Unit::TestCase + + # FIXME: rewrite this test with mocha + def test_design_should_interact_with_sample_holder + design = Design::ProxyDesignHolder.new(SampleHolderForTestingProxyDesignHolder.new) + design.template = 'bli' + assert_equal 'bli', design.template + design.theme = 'bli' + assert_equal 'bli', design.theme + design.icon_theme = 'bli' + assert_equal 'bli', design.icon_theme + design.boxes = [] + assert_equal [], design.boxes + end + + def test_design_user_controller_should_get_a_proper_design + controller = ProxyDesignHolderTestController.new + design = controller.send(:design) + design.template = 'bli' + assert_equal 'bli', design.template + design.theme = 'bli' + assert_equal 'bli', design.theme + design.icon_theme = 'bli' + assert_equal 'bli', design.icon_theme + design.boxes = [] + assert_equal [], design.boxes + end + +end diff --git a/vendor/plugins/design/test/test_helper.rb b/vendor/plugins/design/test/test_helper.rb new file mode 100644 index 0000000..7740339 --- /dev/null +++ b/vendor/plugins/design/test/test_helper.rb @@ -0,0 +1,44 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment") + +require 'test/unit' + +######################## +# test clases below here +######################## + +class FixedDesignTestController < ActionController::Base + + BOX1 = Box.new + BOX2 = Box.new + BOX3 = Box.new + + design :fixed => { + :template => 'some_template', + :theme => 'some_theme', + :icon_theme => 'some_icon_theme', + :boxes => [ BOX1, BOX2, BOX3 ], + } +end + +class FixedDesignDefaultTestController < ActionController::Base + design :fixed => true +end + +class SampleHolderForTestingProxyDesignHolder + attr_accessor :template, :theme, :icon_theme, :boxes +end + +class ProxyDesignHolderTestController < ActionController::Base + design :holder => 'sample_object' + def initialize + @sample_object = SampleHolderForTestingProxyDesignHolder.new + end +end + +class DesignEditorTestController < ActionController::Base + design_editor :holder => 'sample_object' + def initialize + @sample_object = SampleHolderForTestingProxyDesignHolder.new + end +end diff --git a/vendor/plugins/design/uninstall.rb b/vendor/plugins/design/uninstall.rb new file mode 100644 index 0000000..9738333 --- /dev/null +++ b/vendor/plugins/design/uninstall.rb @@ -0,0 +1 @@ +# Uninstall hook code here -- libgit2 0.21.2