apotomo 0.1.2 → 0.1.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 +2 -1
- data/Gemfile.lock +3 -0
- data/Rakefile +6 -43
- data/lib/apotomo/event_methods.rb +1 -1
- data/lib/apotomo/rails/controller_methods.rb +4 -4
- data/lib/apotomo/request_processor.rb +2 -2
- data/lib/apotomo/test_methods.rb +8 -0
- data/lib/apotomo/tree_node.rb +5 -7
- data/lib/apotomo/version.rb +1 -1
- data/lib/apotomo/widget.rb +45 -48
- data/lib/apotomo.rb +1 -9
- data/test/rails/controller_methods_test.rb +8 -8
- data/test/rails/rails_integration_test.rb +2 -2
- data/test/rails/view_helper_test.rb +2 -3
- data/test/rails/view_methods_test.rb +2 -2
- data/test/rails/widget_generator_test.rb +2 -2
- data/test/unit/apotomo_test.rb +2 -2
- data/test/unit/container_test.rb +2 -2
- data/test/unit/event_handler_test.rb +1 -2
- data/test/unit/event_methods_test.rb +2 -2
- data/test/unit/event_test.rb +2 -2
- data/test/unit/invoke_test.rb +2 -2
- data/test/unit/javascript_generator_test.rb +2 -3
- data/test/unit/onfire_integration_test.rb +2 -2
- data/test/unit/persistence_test.rb +2 -2
- data/test/unit/render_test.rb +20 -2
- data/test/unit/request_processor_test.rb +2 -2
- data/test/unit/stateful_widget_test.rb +2 -2
- data/test/unit/test_addressing.rb +1 -2
- data/test/unit/test_caching.rb +1 -2
- data/test/unit/test_jump_to_state.rb +1 -1
- data/test/unit/test_methods_test.rb +11 -0
- data/test/unit/test_tab_panel.rb +1 -2
- data/test/unit/test_widget_shortcuts.rb +1 -2
- data/test/unit/transition_test.rb +2 -2
- data/test/unit/widget_shortcuts_test.rb +2 -2
- data/test/unit/widget_test.rb +35 -36
- metadata +22 -13
- data/app/cells/apotomo/child_switch_widget/switch.html.erb +0 -1
- data/app/cells/apotomo/child_switch_widget/switch.rhtml +0 -1
- data/app/cells/apotomo/deep_link_widget/setup.html.erb +0 -20
- data/app/cells/apotomo/deep_link_widget.rb +0 -27
- data/app/cells/apotomo/java_script_widget.rb +0 -12
- data/app/cells/apotomo/tab_panel_widget/display.html.erb +0 -57
- data/app/cells/apotomo/tab_panel_widget.rb +0 -87
- data/app/cells/apotomo/tab_widget/display.html.erb +0 -1
- data/app/cells/apotomo/tab_widget.rb +0 -18
    
        data/Gemfile
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -14,6 +14,8 @@ GEM | |
| 14 14 | 
             
                cells (3.3.4)
         | 
| 15 15 | 
             
                gemcutter (0.6.1)
         | 
| 16 16 | 
             
                git (1.2.5)
         | 
| 17 | 
            +
                hooks (0.1)
         | 
| 18 | 
            +
                  activesupport (>= 2.3.0)
         | 
| 17 19 | 
             
                jeweler (1.4.0)
         | 
| 18 20 | 
             
                  gemcutter (>= 0.1.0)
         | 
| 19 21 | 
             
                  git (>= 1.2.5)
         | 
| @@ -40,6 +42,7 @@ PLATFORMS | |
| 40 42 |  | 
| 41 43 | 
             
            DEPENDENCIES
         | 
| 42 44 | 
             
              cells (= 3.3.4)
         | 
| 45 | 
            +
              hooks (~> 0.1)
         | 
| 43 46 | 
             
              jeweler
         | 
| 44 47 | 
             
              mocha
         | 
| 45 48 | 
             
              onfire
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -5,59 +5,21 @@ require 'rake' | |
| 5 5 | 
             
            require 'rake/testtask'
         | 
| 6 6 | 
             
            require 'rake/rdoctask'
         | 
| 7 7 |  | 
| 8 | 
            +
            $:.unshift File.dirname(__FILE__)+"/lib" # add current dir to LOAD_PATHS
         | 
| 9 | 
            +
             | 
| 8 10 | 
             
            desc 'Default: run unit tests.'
         | 
| 9 11 | 
             
            task :default => :test
         | 
| 10 12 |  | 
| 11 13 | 
             
            desc 'Test the Apotomo plugin.'
         | 
| 12 14 | 
             
            Rake::TestTask.new(:test) do |t|
         | 
| 13 | 
            -
              t.libs << ' | 
| 15 | 
            +
              t.libs << 'test'
         | 
| 14 16 | 
             
              t.pattern = 'test/**/*_test.rb'
         | 
| 15 17 | 
             
              t.verbose = true
         | 
| 16 18 | 
             
            end
         | 
| 17 19 |  | 
| 18 | 
            -
            namespace 'rdoc' do
         | 
| 19 | 
            -
            	desc 'Generate documentation for Apotomo.'
         | 
| 20 | 
            -
            	Rake::RDocTask.new(:build) do |rdoc|
         | 
| 21 | 
            -
            		rdoc.rdoc_dir = 'rdoc'
         | 
| 22 | 
            -
            		rdoc.title    = 'Apotomo API'
         | 
| 23 | 
            -
            		rdoc.options << '--line-numbers' << '--inline-source' << '-m README'
         | 
| 24 | 
            -
            		
         | 
| 25 | 
            -
            		rdoc.rdoc_files.include('lib/**/*.rb')
         | 
| 26 | 
            -
            		rdoc.rdoc_files.include('app/**/*.rb')
         | 
| 27 | 
            -
            		rdoc.rdoc_files.include('test/*.rb')
         | 
| 28 | 
            -
            		rdoc.rdoc_files.include('README')
         | 
| 29 | 
            -
            	end
         | 
| 30 | 
            -
            	
         | 
| 31 | 
            -
            	desc 'Upload the rdocs to apotomo.rubyforge.org.'
         | 
| 32 | 
            -
            	task :upload do
         | 
| 33 | 
            -
            		sh %{ scp -r rdoc nix@rubyforge.org:/var/www/gforge-projects/apotomo/ }
         | 
| 34 | 
            -
            	end
         | 
| 35 | 
            -
            end
         | 
| 36 20 |  | 
| 37 | 
            -
            # Gem managment tasks.
         | 
| 38 | 
            -
            #
         | 
| 39 | 
            -
            # == Bump gem version (any):
         | 
| 40 | 
            -
            #
         | 
| 41 | 
            -
            #   rake version:bump:major
         | 
| 42 | 
            -
            #   rake version:bump:minor
         | 
| 43 | 
            -
            #   rake version:bump:patch
         | 
| 44 | 
            -
            #
         | 
| 45 | 
            -
            # == Generate gemspec, build & install locally:
         | 
| 46 | 
            -
            #
         | 
| 47 | 
            -
            #   rake gemspec
         | 
| 48 | 
            -
            #   rake build
         | 
| 49 | 
            -
            #   sudo rake install
         | 
| 50 | 
            -
            #
         | 
| 51 | 
            -
            # == Git tag & push to origin/master
         | 
| 52 | 
            -
            #
         | 
| 53 | 
            -
            #   rake release
         | 
| 54 | 
            -
            #
         | 
| 55 | 
            -
            # == Release to Gemcutter.org:
         | 
| 56 | 
            -
            #
         | 
| 57 | 
            -
            #   rake gemcutter:release
         | 
| 58 | 
            -
            #
         | 
| 59 21 | 
             
            require 'jeweler'
         | 
| 60 | 
            -
            require ' | 
| 22 | 
            +
            require 'apotomo/version'
         | 
| 61 23 |  | 
| 62 24 | 
             
            Jeweler::Tasks.new do |spec|
         | 
| 63 25 | 
             
              spec.name         = "apotomo"
         | 
| @@ -73,6 +35,7 @@ Jeweler::Tasks.new do |spec| | |
| 73 35 | 
             
              spec.add_dependency 'cells', '~> 3.3'
         | 
| 74 36 | 
             
              spec.add_dependency 'activesupport', '>= 2.3.0'
         | 
| 75 37 | 
             
              spec.add_dependency 'onfire', '>= 0.1.0'
         | 
| 38 | 
            +
              spec.add_dependency 'hooks', '~> 0.1'
         | 
| 76 39 | 
             
            end
         | 
| 77 40 |  | 
| 78 | 
            -
            Jeweler::GemcutterTasks.new
         | 
| 41 | 
            +
            Jeweler::GemcutterTasks.new
         | 
| @@ -11,8 +11,8 @@ require 'apotomo/rails/view_methods' | |
| 11 11 | 
             
                        extend WidgetShortcuts
         | 
| 12 12 | 
             
                        extend ClassMethods      
         | 
| 13 13 |  | 
| 14 | 
            -
                        class_inheritable_array : | 
| 15 | 
            -
                        self. | 
| 14 | 
            +
                        class_inheritable_array :has_widgets_blocks
         | 
| 15 | 
            +
                        self.has_widgets_blocks = []
         | 
| 16 16 |  | 
| 17 17 | 
             
                        helper ::Apotomo::Rails::ViewMethods
         | 
| 18 18 |  | 
| @@ -22,7 +22,7 @@ require 'apotomo/rails/view_methods' | |
| 22 22 |  | 
| 23 23 | 
             
                    module ClassMethods
         | 
| 24 24 | 
             
                      def has_widgets(&block)
         | 
| 25 | 
            -
                         | 
| 25 | 
            +
                        has_widgets_blocks << block
         | 
| 26 26 | 
             
                      end
         | 
| 27 27 |  | 
| 28 28 | 
             
                      alias_method :uses_widgets, :has_widgets
         | 
| @@ -45,7 +45,7 @@ require 'apotomo/rails/view_methods' | |
| 45 45 | 
             
                                  :js_framework   => Apotomo.js_framework || :prototype,
         | 
| 46 46 | 
             
                      }  ### TODO: process rails options (flush_tree, version)
         | 
| 47 47 |  | 
| 48 | 
            -
                      @apotomo_request_processor = Apotomo::RequestProcessor.new(self, session, options, self.class. | 
| 48 | 
            +
                      @apotomo_request_processor = Apotomo::RequestProcessor.new(self, session, options, self.class.has_widgets_blocks)
         | 
| 49 49 |  | 
| 50 50 | 
             
                      flush_bound_use_widgets_blocks if @apotomo_request_processor.widgets_flushed?
         | 
| 51 51 |  | 
| @@ -4,14 +4,14 @@ module Apotomo | |
| 4 4 |  | 
| 5 5 | 
             
                attr_reader :session, :root
         | 
| 6 6 |  | 
| 7 | 
            -
                def initialize(controller, session, options={},  | 
| 7 | 
            +
                def initialize(controller, session, options={}, has_widgets_blocks=[])
         | 
| 8 8 | 
             
                  @session              = session
         | 
| 9 9 | 
             
                  @widgets_flushed      = false
         | 
| 10 10 |  | 
| 11 11 | 
             
                  @root = widget('apotomo/widget', 'root')
         | 
| 12 12 | 
             
                  @root.controller = controller
         | 
| 13 13 |  | 
| 14 | 
            -
                  attach_stateless_blocks_for( | 
| 14 | 
            +
                  attach_stateless_blocks_for(has_widgets_blocks, @root, controller)
         | 
| 15 15 |  | 
| 16 16 | 
             
                  if options[:flush_widgets].blank? and ::Apotomo::StatefulWidget.frozen_widget_in?(session)  
         | 
| 17 17 | 
             
                    @root = ::Apotomo::StatefulWidget.thaw_for(session, @root)
         | 
    
        data/lib/apotomo/tree_node.rb
    CHANGED
    
    | @@ -8,14 +8,10 @@ module TreeNode | |
| 8 8 | 
             
              attr_writer :content, :parent
         | 
| 9 9 |  | 
| 10 10 | 
             
              def self.included(base)
         | 
| 11 | 
            -
                base.after_initialize : | 
| 11 | 
            +
                base.after_initialize :initialize_tree_node
         | 
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| 14 | 
            -
               | 
| 15 | 
            -
              #
         | 
| 16 | 
            -
              # name of the node is expected to be unique across the
         | 
| 17 | 
            -
              # tree.
         | 
| 18 | 
            -
              def initialize_tree_node_for(name, *args)
         | 
| 14 | 
            +
              def initialize_tree_node(*)
         | 
| 19 15 | 
             
                self.setAsRoot!
         | 
| 20 16 |  | 
| 21 17 | 
             
                @childrenHash = Hash.new
         | 
| @@ -49,7 +45,9 @@ module TreeNode | |
| 49 45 | 
             
                  @childrenHash[child.name]  = child
         | 
| 50 46 | 
             
                  @children << child
         | 
| 51 47 | 
             
                  child.parent = self
         | 
| 52 | 
            -
                   | 
| 48 | 
            +
                  
         | 
| 49 | 
            +
                  child.run_hook :after_add, child, self
         | 
| 50 | 
            +
                child
         | 
| 53 51 | 
             
              end
         | 
| 54 52 |  | 
| 55 53 | 
             
              # Removes the specified child node from the receiver node.
         | 
    
        data/lib/apotomo/version.rb
    CHANGED
    
    
    
        data/lib/apotomo/widget.rb
    CHANGED
    
    | @@ -1,25 +1,33 @@ | |
| 1 | 
            +
            require 'cells'
         | 
| 1 2 | 
             
            require 'onfire'
         | 
| 2 | 
            -
            require ' | 
| 3 | 
            -
             | 
| 3 | 
            +
            require 'hooks'
         | 
| 4 4 |  | 
| 5 | 
            +
            require 'apotomo/tree_node'
         | 
| 5 6 | 
             
            require 'apotomo/event'
         | 
| 6 7 | 
             
            require 'apotomo/event_methods'
         | 
| 7 8 | 
             
            require 'apotomo/transition'
         | 
| 8 9 | 
             
            require 'apotomo/caching'
         | 
| 9 | 
            -
            require 'apotomo/deep_link_methods'
         | 
| 10 10 | 
             
            require 'apotomo/widget_shortcuts'
         | 
| 11 11 | 
             
            require 'apotomo/rails/view_helper'
         | 
| 12 12 |  | 
| 13 | 
            -
            ### TODO: use load_hooks when switching to rails 3.
         | 
| 14 | 
            -
            # wycats@gmail.com: ActiveSupport.run_load_hooks(:name)
         | 
| 15 | 
            -
            # (21:01:17) wycats@gmail.com: ActiveSupport.on_load(:name) { … }
         | 
| 16 | 
            -
            #require 'active_support/lazy_load_hooks'
         | 
| 17 | 
            -
             | 
| 18 13 | 
             
            module Apotomo
         | 
| 19 14 | 
             
              class Widget < Cell::Base
         | 
| 15 | 
            +
                include Hooks
         | 
| 20 16 |  | 
| 21 | 
            -
                 | 
| 22 | 
            -
                 | 
| 17 | 
            +
                # Use this for setup code you're calling in every state. Almost like a +before_filter+ except that it's
         | 
| 18 | 
            +
                # invoked after the initialization in #has_widgets.
         | 
| 19 | 
            +
                #
         | 
| 20 | 
            +
                # Example:
         | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                #   class MouseWidget < Apotomo::Widget
         | 
| 23 | 
            +
                #     after_initialize :setup_cheese
         | 
| 24 | 
            +
                #     
         | 
| 25 | 
            +
                #     # we need @cheese in every state:
         | 
| 26 | 
            +
                #     def setup_cheese(*)
         | 
| 27 | 
            +
                #       @cheese = Cheese.find @opts[:cheese_id]
         | 
| 28 | 
            +
                define_hook :after_initialize
         | 
| 29 | 
            +
                define_hook :has_widgets
         | 
| 30 | 
            +
                define_hook :after_add
         | 
| 23 31 |  | 
| 24 32 | 
             
                attr_accessor :opts
         | 
| 25 33 | 
             
                attr_writer   :visible
         | 
| @@ -27,34 +35,8 @@ module Apotomo | |
| 27 35 | 
             
                attr_writer   :controller
         | 
| 28 36 | 
             
                attr_accessor :version
         | 
| 29 37 |  | 
| 30 | 
            -
                ### DISCUSS: extract to has_widgets_methods for both Widget and Controller?
         | 
| 31 | 
            -
                #class_inheritable_array :has_widgets_blocks
         | 
| 32 | 
            -
                
         | 
| 33 38 | 
             
                class << self
         | 
| 34 39 | 
             
                  include WidgetShortcuts
         | 
| 35 | 
            -
                  
         | 
| 36 | 
            -
                  def has_widgets_blocks
         | 
| 37 | 
            -
                    @has_widgets_blocks ||= []
         | 
| 38 | 
            -
                  end
         | 
| 39 | 
            -
                  
         | 
| 40 | 
            -
                  def has_widgets(&block)
         | 
| 41 | 
            -
                    has_widgets_blocks << block
         | 
| 42 | 
            -
                  end
         | 
| 43 | 
            -
                  
         | 
| 44 | 
            -
                  # Use this for setup code you're calling in every state. Almost like a +before_filter+ except that it's
         | 
| 45 | 
            -
                  # invoked after the initialization in #has_widgets.
         | 
| 46 | 
            -
                  #
         | 
| 47 | 
            -
                  # Example:
         | 
| 48 | 
            -
                  #
         | 
| 49 | 
            -
                  #   class MouseWidget < Apotomo::Widget
         | 
| 50 | 
            -
                  #     after_initialize :setup_cheese
         | 
| 51 | 
            -
                  #     
         | 
| 52 | 
            -
                  #     # we need @cheese in every state:
         | 
| 53 | 
            -
                  #     def setup_cheese(*)
         | 
| 54 | 
            -
                  #       @cheese = Cheese.find @opts[:cheese_id]
         | 
| 55 | 
            -
                  def after_initialize(method)
         | 
| 56 | 
            -
                    self.initialize_hooks << method
         | 
| 57 | 
            -
                  end
         | 
| 58 40 | 
             
                end
         | 
| 59 41 |  | 
| 60 42 | 
             
                include TreeNode
         | 
| @@ -64,15 +46,15 @@ module Apotomo | |
| 64 46 |  | 
| 65 47 | 
             
                include Transition
         | 
| 66 48 | 
             
                include Caching
         | 
| 67 | 
            -
                
         | 
| 68 | 
            -
                include DeepLinkMethods
         | 
| 69 49 | 
             
                include WidgetShortcuts
         | 
| 70 50 |  | 
| 71 51 | 
             
                helper Apotomo::Rails::ViewHelper
         | 
| 72 52 |  | 
| 73 53 |  | 
| 54 | 
            +
                
         | 
| 55 | 
            +
                
         | 
| 74 56 | 
             
                def add_has_widgets_blocks(*)
         | 
| 75 | 
            -
                   | 
| 57 | 
            +
                  run_hook :has_widgets, self
         | 
| 76 58 | 
             
                end
         | 
| 77 59 | 
             
                after_initialize :add_has_widgets_blocks
         | 
| 78 60 |  | 
| @@ -89,11 +71,7 @@ module Apotomo | |
| 89 71 |  | 
| 90 72 | 
             
                  @cell         = self
         | 
| 91 73 |  | 
| 92 | 
            -
                   | 
| 93 | 
            -
                end
         | 
| 94 | 
            -
                
         | 
| 95 | 
            -
                def process_initialize_hooks(*args)
         | 
| 96 | 
            -
                  self.class.initialize_hooks.each { |method| send(method, *args) }
         | 
| 74 | 
            +
                  run_hook(:after_initialize, id, start_state, opts)
         | 
| 97 75 | 
             
                end
         | 
| 98 76 |  | 
| 99 77 | 
             
                def last_state
         | 
| @@ -211,15 +189,32 @@ module Apotomo | |
| 211 189 |  | 
| 212 190 | 
             
                alias_method :emit, :render
         | 
| 213 191 |  | 
| 214 | 
            -
                
         | 
| 192 | 
            +
                # Wraps the rendered content in a replace statement targeted at your +Apotomo.js_framework+ setting.
         | 
| 193 | 
            +
                # Use +:selector+ to change the selector.
         | 
| 194 | 
            +
                #
         | 
| 195 | 
            +
                # Example:
         | 
| 196 | 
            +
                #
         | 
| 197 | 
            +
                # Assuming you set 
         | 
| 198 | 
            +
                #   Apotomo.js_framework = :jquery
         | 
| 199 | 
            +
                #
         | 
| 200 | 
            +
                # and call replace in a state
         | 
| 201 | 
            +
                #
         | 
| 202 | 
            +
                #   replace :view => :squeak, :selector => "div#mouse"
         | 
| 203 | 
            +
                #   #=> "$(\"div#mouse\").replaceWith(\"<div id=\\\"mum\\\">squeak!<\\/div>\")"
         | 
| 215 204 | 
             
                def replace(options={})
         | 
| 216 205 | 
             
                  content = render(options)
         | 
| 217 | 
            -
                  Apotomo.js_generator.replace(self.name, content) | 
| 206 | 
            +
                  Apotomo.js_generator.replace(options[:selector] || self.name, content)
         | 
| 218 207 | 
             
                end
         | 
| 219 208 |  | 
| 209 | 
            +
                # Same as replace except that the content is wrapped in an update statement.
         | 
| 210 | 
            +
                #
         | 
| 211 | 
            +
                # Example for +:jquery+:
         | 
| 212 | 
            +
                #
         | 
| 213 | 
            +
                #   update :view => :squeak
         | 
| 214 | 
            +
                #   #=> "$(\"mum\").html(\"<div id=\\\"mum\\\">squeak!<\\/div>\")"
         | 
| 220 215 | 
             
                def update(options={})
         | 
| 221 216 | 
             
                  content = render(options)
         | 
| 222 | 
            -
                  Apotomo.js_generator.update(self.name, content)
         | 
| 217 | 
            +
                  Apotomo.js_generator.update(options[:selector] || self.name, content)
         | 
| 223 218 | 
             
                end
         | 
| 224 219 |  | 
| 225 220 | 
             
                # Force the FSM to go into <tt>state</tt>, regardless whether it's a valid 
         | 
| @@ -299,5 +294,7 @@ module Apotomo | |
| 299 294 | 
             
                def controller
         | 
| 300 295 | 
             
                  root? ? @controller : root.controller
         | 
| 301 296 | 
             
                end
         | 
| 297 | 
            +
                
         | 
| 298 | 
            +
                alias_method :widget_id, :name
         | 
| 302 299 | 
             
              end
         | 
| 303 | 
            -
            end
         | 
| 300 | 
            +
            end
         | 
    
        data/lib/apotomo.rb
    CHANGED
    
    | @@ -19,11 +19,6 @@ | |
| 19 19 | 
             
            #  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
         | 
| 20 20 | 
             
            #  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
         | 
| 21 21 | 
             
            #  THE SOFTWARE.
         | 
| 22 | 
            -
            #  
         | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
            require 'cells'
         | 
| 26 | 
            -
            require 'onfire'
         | 
| 27 22 |  | 
| 28 23 | 
             
            module Apotomo
         | 
| 29 24 | 
             
              class << self
         | 
| @@ -47,13 +42,10 @@ module Apotomo | |
| 47 42 | 
             
              end
         | 
| 48 43 | 
             
            end
         | 
| 49 44 |  | 
| 50 | 
            -
            ### FIXME: move to rails.rb
         | 
| 51 | 
            -
             | 
| 52 45 | 
             
            require 'apotomo/javascript_generator'
         | 
| 53 46 | 
             
            Apotomo.js_framework = :prototype ### DISCUSS: move to rails.rb
         | 
| 54 47 |  | 
| 55 | 
            -
            ### DISCUSS: move to 'apotomo/widgets'?
         | 
| 56 48 | 
             
            require 'apotomo/widget'
         | 
| 57 49 | 
             
            require 'apotomo/stateful_widget'
         | 
| 58 50 | 
             
            require 'apotomo/container_widget'
         | 
| 59 | 
            -
            require 'apotomo/widget_shortcuts'
         | 
| 51 | 
            +
            require 'apotomo/widget_shortcuts'
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class ControllerMethodsTest < ActionController::TestCase
         | 
| 4 4 | 
             
              context "A Rails controller" do
         | 
| @@ -24,9 +24,9 @@ class ControllerMethodsTest < ActionController::TestCase | |
| 24 24 | 
             
                  end
         | 
| 25 25 | 
             
                end
         | 
| 26 26 |  | 
| 27 | 
            -
                context "invoking # | 
| 27 | 
            +
                context "invoking #has_widgets" do
         | 
| 28 28 | 
             
                  setup do
         | 
| 29 | 
            -
                    @controller.class. | 
| 29 | 
            +
                    @controller.class.has_widgets do |root|
         | 
| 30 30 | 
             
                      root << mouse_mock('mum')
         | 
| 31 31 | 
             
                    end
         | 
| 32 32 | 
             
                  end
         | 
| @@ -40,8 +40,8 @@ class ControllerMethodsTest < ActionController::TestCase | |
| 40 40 | 
             
                    assert @controller.apotomo_root['mum']
         | 
| 41 41 | 
             
                  end
         | 
| 42 42 |  | 
| 43 | 
            -
                  should "allow multiple calls to  | 
| 44 | 
            -
                    @controller.class. | 
| 43 | 
            +
                  should "allow multiple calls to has_widgets" do
         | 
| 44 | 
            +
                    @controller.class.has_widgets do |root|
         | 
| 45 45 | 
             
                      root << mouse_mock('kid')
         | 
| 46 46 | 
             
                    end
         | 
| 47 47 |  | 
| @@ -49,10 +49,10 @@ class ControllerMethodsTest < ActionController::TestCase | |
| 49 49 | 
             
                    assert @controller.apotomo_root['kid']
         | 
| 50 50 | 
             
                  end
         | 
| 51 51 |  | 
| 52 | 
            -
                  should "inherit  | 
| 52 | 
            +
                  should "inherit has_widgets blocks to sub-controllers" do
         | 
| 53 53 | 
             
                    berry = mouse_mock('berry')
         | 
| 54 54 | 
             
                    @sub_controller = Class.new(@controller.class) do
         | 
| 55 | 
            -
                       | 
| 55 | 
            +
                      has_widgets { |root| root << berry }
         | 
| 56 56 | 
             
                    end.new
         | 
| 57 57 | 
             
                    @sub_controller.params  = {}
         | 
| 58 58 | 
             
                    @sub_controller.session = {}
         | 
| @@ -203,4 +203,4 @@ class ControllerMethodsTest < ActionController::TestCase | |
| 203 203 | 
             
                end
         | 
| 204 204 | 
             
              end
         | 
| 205 205 |  | 
| 206 | 
            -
            end
         | 
| 206 | 
            +
            end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class RailsIntegrationTest < ActionController::TestCase
         | 
| 4 4 | 
             
              def simulate_request!
         | 
| @@ -96,4 +96,4 @@ class RailsIntegrationTest < ActionController::TestCase | |
| 96 96 | 
             
                  assert_equal "<html><body><script type='text/javascript' charset='utf-8'>\nvar loc = document.location;\nwith(window.parent) { setTimeout(function() { window.eval('<div id=\\\"mum\\\"><snuggle><\\/snuggle><\\/div>'); window.loc && loc.replace('about:blank'); }, 1) }\n</script></body></html>", @response.body
         | 
| 97 97 | 
             
                end
         | 
| 98 98 | 
             
              end
         | 
| 99 | 
            -
            end
         | 
| 99 | 
            +
            end
         | 
| @@ -1,5 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 2 | 
            -
             | 
| 1 | 
            +
            require 'test_helper'
         | 
| 3 2 | 
             
            require 'action_view/test_case'
         | 
| 4 3 |  | 
| 5 4 | 
             
            class ViewHelperTest < ActionView::TestCase
         | 
| @@ -96,4 +95,4 @@ class ViewHelperTest < ActionView::TestCase | |
| 96 95 | 
             
                  @mum.url_for_event(:bla)
         | 
| 97 96 | 
             
                end
         | 
| 98 97 | 
             
              end
         | 
| 99 | 
            -
            end
         | 
| 98 | 
            +
            end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class ViewMethodsTest < ActionController::TestCase
         | 
| 4 4 | 
             
              context "A Rails controller view" do
         | 
| @@ -37,4 +37,4 @@ class ViewMethodsTest < ActionController::TestCase | |
| 37 37 | 
             
                  assert_equal "/apotomo/render_event_response?source=mum&type=footsteps", @response.body
         | 
| 38 38 | 
             
                end
         | 
| 39 39 | 
             
              end
         | 
| 40 | 
            -
            end
         | 
| 40 | 
            +
            end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 | 
             
            require 'rails_generator'
         | 
| 3 3 | 
             
            require 'rails_generator/scripts/generate'
         | 
| 4 4 |  | 
| @@ -44,4 +44,4 @@ class WidgetGeneratorTest < Test::Unit::TestCase | |
| 44 44 | 
             
              def file_list
         | 
| 45 45 | 
             
                Dir.glob(File.join(fake_rails_root, "**/*"))
         | 
| 46 46 | 
             
              end 
         | 
| 47 | 
            -
            end
         | 
| 47 | 
            +
            end
         | 
    
        data/test/unit/apotomo_test.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class ApotomoTest < Test::Unit::TestCase
         | 
| 4 4 | 
             
              context "The main module" do    
         | 
| @@ -17,4 +17,4 @@ class ApotomoTest < Test::Unit::TestCase | |
| 17 17 | 
             
                  assert_respond_to Apotomo.js_generator, :prototype
         | 
| 18 18 | 
             
                end
         | 
| 19 19 | 
             
              end
         | 
| 20 | 
            -
            end
         | 
| 20 | 
            +
            end
         | 
    
        data/test/unit/container_test.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class ContainerTest < Test::Unit::TestCase
         | 
| 4 4 | 
             
              context "Rendering a container" do
         | 
| @@ -17,4 +17,4 @@ class ContainerTest < Test::Unit::TestCase | |
| 17 17 | 
             
                  assert_equal "<div id=\"family\"><div id=\"mum\">burp!</div>\n<div id=\"kid\">burp!</div></div>", @family.invoke
         | 
| 18 18 | 
             
                end
         | 
| 19 19 | 
             
              end
         | 
| 20 | 
            -
            end
         | 
| 20 | 
            +
            end
         | 
    
        data/test/unit/event_test.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class EventTest < Test::Unit::TestCase
         | 
| 4 4 | 
             
              context "An Event" do
         | 
| @@ -27,4 +27,4 @@ class EventTest < Test::Unit::TestCase | |
| 27 27 | 
             
                  assert_not Apotomo::Event.new(:footsteps, 'mum').stopped?
         | 
| 28 28 | 
             
                end
         | 
| 29 29 | 
             
              end
         | 
| 30 | 
            -
            end
         | 
| 30 | 
            +
            end
         | 
    
        data/test/unit/invoke_test.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class InvokeTest < Test::Unit::TestCase
         | 
| 4 4 | 
             
              class LocalMouse < MouseCell
         | 
| @@ -120,4 +120,4 @@ class InvokeTest < Test::Unit::TestCase | |
| 120 120 | 
             
                  end
         | 
| 121 121 | 
             
                end
         | 
| 122 122 | 
             
              end
         | 
| 123 | 
            -
            end
         | 
| 123 | 
            +
            end
         | 
| @@ -1,5 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 2 | 
            -
             | 
| 1 | 
            +
            require 'test_helper'
         | 
| 3 2 |  | 
| 4 3 | 
             
            class JavascriptGeneratorTest < Test::Unit::TestCase
         | 
| 5 4 | 
             
              context "The JavascriptGenerator" do
         | 
| @@ -87,4 +86,4 @@ class JavascriptGeneratorTest < Test::Unit::TestCase | |
| 87 86 | 
             
                  end
         | 
| 88 87 | 
             
                end
         | 
| 89 88 | 
             
              end
         | 
| 90 | 
            -
            end
         | 
| 89 | 
            +
            end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class OnfireIntegrationTest < Test::Unit::TestCase
         | 
| 4 4 | 
             
              context "including Onfire into the StatefulWidget it" do
         | 
| @@ -16,4 +16,4 @@ class OnfireIntegrationTest < Test::Unit::TestCase | |
| 16 16 | 
             
                  assert_equal @mum, @kid.parent
         | 
| 17 17 | 
             
                end
         | 
| 18 18 | 
             
              end
         | 
| 19 | 
            -
            end
         | 
| 19 | 
            +
            end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class PersistenceTest < Test::Unit::TestCase
         | 
| 4 4 |  | 
| @@ -237,4 +237,4 @@ class PersistenceTest < Test::Unit::TestCase | |
| 237 237 | 
             
                  assert_not @mum.symbolized_instance_variables.find { |ivar| ivar.kind_of? String }
         | 
| 238 238 | 
             
                end
         | 
| 239 239 | 
             
              end
         | 
| 240 | 
            -
            end
         | 
| 240 | 
            +
            end
         | 
    
        data/test/unit/render_test.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class RenderTest < ActionView::TestCase
         | 
| 4 4 | 
             
              context "Rendering a single widget" do
         | 
| @@ -158,6 +158,15 @@ class RenderTest < ActionView::TestCase | |
| 158 158 | 
             
                    end
         | 
| 159 159 | 
             
                    assert_equal "$(\"mouse\").update(\"squeak!\")", @mum.invoke(:squeak)
         | 
| 160 160 | 
             
                  end
         | 
| 161 | 
            +
                  
         | 
| 162 | 
            +
                  should "accept :selector" do
         | 
| 163 | 
            +
                    @mum.instance_eval do
         | 
| 164 | 
            +
                      def squeak
         | 
| 165 | 
            +
                        update :text => '<div id="mum">squeak!</div>', :selector => "div#mouse"
         | 
| 166 | 
            +
                      end
         | 
| 167 | 
            +
                    end
         | 
| 168 | 
            +
                    assert_equal "$(\"div#mouse\").update(\"<div id=\\\"mum\\\">squeak!<\\/div>\")", @mum.invoke(:squeak)
         | 
| 169 | 
            +
                  end
         | 
| 161 170 | 
             
                end
         | 
| 162 171 |  | 
| 163 172 | 
             
                context "with #replace" do
         | 
| @@ -173,6 +182,15 @@ class RenderTest < ActionView::TestCase | |
| 173 182 | 
             
                    end
         | 
| 174 183 | 
             
                    assert_equal "$(\"mouse\").replace(\"<div id=\\\"mum\\\">squeak!<\\/div>\")", @mum.invoke(:squeak)
         | 
| 175 184 | 
             
                  end
         | 
| 185 | 
            +
                  
         | 
| 186 | 
            +
                  should "accept :selector" do
         | 
| 187 | 
            +
                    @mum.instance_eval do
         | 
| 188 | 
            +
                      def squeak
         | 
| 189 | 
            +
                        replace :text => '<div id="mum">squeak!</div>', :selector => "div#mouse"
         | 
| 190 | 
            +
                      end
         | 
| 191 | 
            +
                    end
         | 
| 192 | 
            +
                    assert_equal "$(\"div#mouse\").replace(\"<div id=\\\"mum\\\">squeak!<\\/div>\")", @mum.invoke(:squeak)
         | 
| 193 | 
            +
                  end
         | 
| 176 194 | 
             
                end
         | 
| 177 195 | 
             
              end
         | 
| 178 196 |  | 
| @@ -200,4 +218,4 @@ class RenderTest < ActionView::TestCase | |
| 200 218 | 
             
                should_eventually "provide an ordered rendered_children hash"
         | 
| 201 219 | 
             
              end
         | 
| 202 220 |  | 
| 203 | 
            -
            end
         | 
| 221 | 
            +
            end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class RequestProcessorTest < Test::Unit::TestCase
         | 
| 4 4 | 
             
              context "#root" do
         | 
| @@ -198,4 +198,4 @@ class RequestProcessorTest < Test::Unit::TestCase | |
| 198 198 | 
             
                  end
         | 
| 199 199 | 
             
                end
         | 
| 200 200 | 
             
              end
         | 
| 201 | 
            -
            end
         | 
| 201 | 
            +
            end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class StatefulWidgetTest < Test::Unit::TestCase
         | 
| 4 4 | 
             
              context "The StatefulWidget" do
         | 
| @@ -53,4 +53,4 @@ class StatefulWidgetTest < Test::Unit::TestCase | |
| 53 53 | 
             
                  end
         | 
| 54 54 | 
             
                end
         | 
| 55 55 | 
             
              end
         | 
| 56 | 
            -
            end
         | 
| 56 | 
            +
            end
         | 
    
        data/test/unit/test_caching.rb
    CHANGED
    
    
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            require 'test_helper'
         | 
| 2 | 
            +
            require 'apotomo/test_methods'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class TestMethodsTest < Test::Unit::TestCase
         | 
| 5 | 
            +
              include Apotomo::TestMethods
         | 
| 6 | 
            +
              context "A Unit test with included module" do    
         | 
| 7 | 
            +
                should "provide #render_widget" do
         | 
| 8 | 
            +
                  assert_respond_to self, :render_widget
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
            end
         | 
    
        data/test/unit/test_tab_panel.rb
    CHANGED
    
    
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class TransitionTest < Test::Unit::TestCase
         | 
| 4 4 | 
             
              context "Calling #next_state_for" do
         | 
| @@ -30,4 +30,4 @@ class TransitionTest < Test::Unit::TestCase | |
| 30 30 | 
             
                  assert_equal :snore, @mum.send(:next_state_for, :snuggle)
         | 
| 31 31 | 
             
                end
         | 
| 32 32 | 
             
              end
         | 
| 33 | 
            -
            end
         | 
| 33 | 
            +
            end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class MumWidget < MouseCell; end
         | 
| 4 4 | 
             
            class MouseTabs;end
         | 
| @@ -77,4 +77,4 @@ class WidgetShortcutsTest < Test::Unit::TestCase | |
| 77 77 | 
             
                  assert_kind_of ::Apotomo::ContainerWidget, section('family')
         | 
| 78 78 | 
             
                end
         | 
| 79 79 | 
             
              end
         | 
| 80 | 
            -
            end
         | 
| 80 | 
            +
            end
         | 
    
        data/test/unit/widget_test.rb
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class WidgetTest < ActiveSupport::TestCase
         | 
| 4 | 
            -
              context " | 
| 4 | 
            +
              context "Widget.has_widgets" do
         | 
| 5 5 | 
             
                setup do
         | 
| 6 6 | 
             
                  @mum = Class.new(MouseCell) do
         | 
| 7 7 | 
             
                    has_widgets do |me|
         | 
| @@ -17,8 +17,35 @@ class WidgetTest < ActiveSupport::TestCase | |
| 17 17 | 
             
                  assert_kind_of Apotomo::StatefulWidget, @mum['baby']
         | 
| 18 18 | 
             
                end
         | 
| 19 19 |  | 
| 20 | 
            -
                should " | 
| 21 | 
            -
                  assert_equal  | 
| 20 | 
            +
                should "inherit trees for now" do
         | 
| 21 | 
            +
                  assert_equal 1, @mum.children.size
         | 
| 22 | 
            +
                  assert_kind_of Apotomo::StatefulWidget, @mum['baby']
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
              
         | 
| 26 | 
            +
              context "Widget.after_add" do
         | 
| 27 | 
            +
                setup do
         | 
| 28 | 
            +
                  @mum = Class.new(MouseCell) do
         | 
| 29 | 
            +
                    after_add do |me, parent|
         | 
| 30 | 
            +
                      parent << widget('mouse_cell', 'kid', :squeak)
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end.new('mum', :squeak)
         | 
| 33 | 
            +
                  
         | 
| 34 | 
            +
                  @root = mouse_mock('root')
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
                
         | 
| 37 | 
            +
                should "be invoked after mum is added" do
         | 
| 38 | 
            +
                  assert_equal [], @root.children
         | 
| 39 | 
            +
                  @root << @mum
         | 
| 40 | 
            +
                  
         | 
| 41 | 
            +
                  assert_equal ['mum', 'kid'], @root.children.collect { |w| w.name }
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                should "inherit callbacks for now" do
         | 
| 45 | 
            +
                  @berry = Class.new(@mum.class).new('berry', :squeak)
         | 
| 46 | 
            +
                  @root << @berry
         | 
| 47 | 
            +
                  
         | 
| 48 | 
            +
                  assert_equal ['berry', 'kid'], @root.children.collect { |w| w.name }
         | 
| 22 49 | 
             
                end
         | 
| 23 50 | 
             
              end
         | 
| 24 51 |  | 
| @@ -78,43 +105,15 @@ class WidgetTest < ActiveSupport::TestCase | |
| 78 105 | 
             
                  should "respond to #find_widget" do
         | 
| 79 106 | 
             
                    mum_and_kid!
         | 
| 80 107 | 
             
                    assert_not @mum.find_widget('pet')
         | 
| 81 | 
            -
                     | 
| 108 | 
            +
                    assert_equal @kid, @mum.find_widget('kid')
         | 
| 82 109 | 
             
                  end
         | 
| 83 110 |  | 
| 84 111 | 
             
                  should "respond to the WidgetShortcuts methods, like #widget" do
         | 
| 85 112 | 
             
                    assert_respond_to @mum, :widget
         | 
| 86 113 | 
             
                  end
         | 
| 87 114 |  | 
| 88 | 
            -
                   | 
| 89 | 
            -
                     | 
| 90 | 
            -
                      @mum = mouse_class_mock.new('mum', :eating)
         | 
| 91 | 
            -
                      @mum.class.instance_eval { self.initialize_hooks << :initialize_mouse }
         | 
| 92 | 
            -
                      assert ::Apotomo::StatefulWidget.initialize_hooks.size + 1 == @mum.class.initialize_hooks.size
         | 
| 93 | 
            -
                    end
         | 
| 94 | 
            -
                    
         | 
| 95 | 
            -
                    should "execute the initialize_hooks in the correct order in #process_initialize_hooks" do
         | 
| 96 | 
            -
                      @mum = mouse_class_mock.new('mum', :eating)
         | 
| 97 | 
            -
                      @mum.class.instance_eval do
         | 
| 98 | 
            -
                        define_method(:executed) { |*args| @executed ||= [] }
         | 
| 99 | 
            -
                        define_method(:setup) { |*args| executed << :setup }
         | 
| 100 | 
            -
                        define_method(:configure) { |*args| executed << :configure }
         | 
| 101 | 
            -
                        initialize_hooks << :setup
         | 
| 102 | 
            -
                        initialize_hooks << :configure
         | 
| 103 | 
            -
                      end
         | 
| 104 | 
            -
                      
         | 
| 105 | 
            -
                      assert_equal [:setup, :configure], @mum.class.new('zombie', nil).executed
         | 
| 106 | 
            -
                    end
         | 
| 107 | 
            -
                    
         | 
| 108 | 
            -
                    should "provide after_initialize" do
         | 
| 109 | 
            -
                      @mum = mouse_class_mock.new('mum', :eat)
         | 
| 110 | 
            -
                      @mum.class.instance_eval do
         | 
| 111 | 
            -
                        after_initialize :first
         | 
| 112 | 
            -
                        after_initialize :second
         | 
| 113 | 
            -
                      end
         | 
| 114 | 
            -
                      
         | 
| 115 | 
            -
                      assert_equal @mum.class.initialize_hooks[-1], :second
         | 
| 116 | 
            -
                      assert_equal @mum.class.initialize_hooks[-2], :first
         | 
| 117 | 
            -
                    end
         | 
| 115 | 
            +
                  should "alias #widget_id to #name" do
         | 
| 116 | 
            +
                    assert_equal @mum.name, @mum.widget_id
         | 
| 118 117 | 
             
                  end
         | 
| 119 118 | 
             
                end
         | 
| 120 | 
            -
            end
         | 
| 119 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: apotomo
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash:  | 
| 4 | 
            +
              hash: 29
         | 
| 5 5 | 
             
              prerelease: false
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 8 | 
             
              - 1
         | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              version: 0.1. | 
| 9 | 
            +
              - 3
         | 
| 10 | 
            +
              version: 0.1.3
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - Nick Sutterer
         | 
| @@ -15,7 +15,7 @@ autorequire: | |
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 17 |  | 
| 18 | 
            -
            date: 2010- | 
| 18 | 
            +
            date: 2010-10-12 00:00:00 +02:00
         | 
| 19 19 | 
             
            default_executable: 
         | 
| 20 20 | 
             
            dependencies: 
         | 
| 21 21 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -65,6 +65,21 @@ dependencies: | |
| 65 65 | 
             
                    version: 0.1.0
         | 
| 66 66 | 
             
              type: :runtime
         | 
| 67 67 | 
             
              version_requirements: *id003
         | 
| 68 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 69 | 
            +
              name: hooks
         | 
| 70 | 
            +
              prerelease: false
         | 
| 71 | 
            +
              requirement: &id004 !ruby/object:Gem::Requirement 
         | 
| 72 | 
            +
                none: false
         | 
| 73 | 
            +
                requirements: 
         | 
| 74 | 
            +
                - - ~>
         | 
| 75 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 76 | 
            +
                    hash: 9
         | 
| 77 | 
            +
                    segments: 
         | 
| 78 | 
            +
                    - 0
         | 
| 79 | 
            +
                    - 1
         | 
| 80 | 
            +
                    version: "0.1"
         | 
| 81 | 
            +
              type: :runtime
         | 
| 82 | 
            +
              version_requirements: *id004
         | 
| 68 83 | 
             
            description: A generic widget framework for Rails. Event-driven. Clean. Fast. Free optional statefulness included.
         | 
| 69 84 | 
             
            email: apotonick@gmail.com
         | 
| 70 85 | 
             
            executables: []
         | 
| @@ -82,15 +97,6 @@ files: | |
| 82 97 | 
             
            - README.rdoc
         | 
| 83 98 | 
             
            - Rakefile
         | 
| 84 99 | 
             
            - TODO
         | 
| 85 | 
            -
            - app/cells/apotomo/child_switch_widget/switch.html.erb
         | 
| 86 | 
            -
            - app/cells/apotomo/child_switch_widget/switch.rhtml
         | 
| 87 | 
            -
            - app/cells/apotomo/deep_link_widget.rb
         | 
| 88 | 
            -
            - app/cells/apotomo/deep_link_widget/setup.html.erb
         | 
| 89 | 
            -
            - app/cells/apotomo/java_script_widget.rb
         | 
| 90 | 
            -
            - app/cells/apotomo/tab_panel_widget.rb
         | 
| 91 | 
            -
            - app/cells/apotomo/tab_panel_widget/display.html.erb
         | 
| 92 | 
            -
            - app/cells/apotomo/tab_widget.rb
         | 
| 93 | 
            -
            - app/cells/apotomo/tab_widget/display.html.erb
         | 
| 94 100 | 
             
            - config/routes.rb
         | 
| 95 101 | 
             
            - generators/widget/USAGE
         | 
| 96 102 | 
             
            - generators/widget/templates/functional_test.rb
         | 
| @@ -114,6 +120,7 @@ files: | |
| 114 120 | 
             
            - lib/apotomo/rails/view_methods.rb
         | 
| 115 121 | 
             
            - lib/apotomo/request_processor.rb
         | 
| 116 122 | 
             
            - lib/apotomo/stateful_widget.rb
         | 
| 123 | 
            +
            - lib/apotomo/test_methods.rb
         | 
| 117 124 | 
             
            - lib/apotomo/transition.rb
         | 
| 118 125 | 
             
            - lib/apotomo/tree_node.rb
         | 
| 119 126 | 
             
            - lib/apotomo/version.rb
         | 
| @@ -133,6 +140,7 @@ files: | |
| 133 140 | 
             
            - test/unit/event_handler_test.rb
         | 
| 134 141 | 
             
            - test/unit/widget_shortcuts_test.rb
         | 
| 135 142 | 
             
            - test/unit/stateful_widget_test.rb
         | 
| 143 | 
            +
            - test/unit/test_methods_test.rb
         | 
| 136 144 | 
             
            - test/unit/test_addressing.rb
         | 
| 137 145 | 
             
            - test/unit/invoke_test.rb
         | 
| 138 146 | 
             
            - test/unit/container_test.rb
         | 
| @@ -197,6 +205,7 @@ test_files: | |
| 197 205 | 
             
            - test/unit/event_handler_test.rb
         | 
| 198 206 | 
             
            - test/unit/widget_shortcuts_test.rb
         | 
| 199 207 | 
             
            - test/unit/stateful_widget_test.rb
         | 
| 208 | 
            +
            - test/unit/test_methods_test.rb
         | 
| 200 209 | 
             
            - test/unit/test_addressing.rb
         | 
| 201 210 | 
             
            - test/unit/invoke_test.rb
         | 
| 202 211 | 
             
            - test/unit/container_test.rb
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            <%= @content.to_s %>
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            <%= @content.to_s %>
         | 
| @@ -1,20 +0,0 @@ | |
| 1 | 
            -
            <%= javascript_tag "
         | 
| 2 | 
            -
               	SWFAddress.onInternalChange = function() {
         | 
| 3 | 
            -
               		//alert('internalChange');
         | 
| 4 | 
            -
               		#{remote_function :url => address_to_event(:type=>:internalChange),  :with => '\'deep_link=\'+SWFAddress.getPath()'}
         | 
| 5 | 
            -
               	}
         | 
| 6 | 
            -
               	
         | 
| 7 | 
            -
               	SWFAddress.onExternalChange = function() {
         | 
| 8 | 
            -
               		//alert(SWFAddress.getPath()+SWFAddress.getQueryString());
         | 
| 9 | 
            -
               		#{remote_function :url => address_to_event(:type=>:internalChange),  :with => '\'deep_link=\'+SWFAddress.getPath()'}
         | 
| 10 | 
            -
               	}
         | 
| 11 | 
            -
               	
         | 
| 12 | 
            -
               	
         | 
| 13 | 
            -
                	SWFAddress.onChange = function() {
         | 
| 14 | 
            -
               		}
         | 
| 15 | 
            -
               		
         | 
| 16 | 
            -
               		SWFAddress.onInit = function() {
         | 
| 17 | 
            -
               		#{remote_function :url => address_to_event(:type=>:internalChange),  :with => '\'deep_link=\'+SWFAddress.getPath()'}
         | 
| 18 | 
            -
               			//alert('init');
         | 
| 19 | 
            -
               		}
         | 
| 20 | 
            -
               		" %>
         | 
| @@ -1,27 +0,0 @@ | |
| 1 | 
            -
            class Apotomo::DeepLinkWidget < Apotomo::StatefulWidget
         | 
| 2 | 
            -
              
         | 
| 3 | 
            -
              transition :from => :setup, :to => :process
         | 
| 4 | 
            -
              transition :in   => :process
         | 
| 5 | 
            -
              
         | 
| 6 | 
            -
              def setup
         | 
| 7 | 
            -
                root.respond_to_event :externalChange, :on => 'deep_link', :with => :process
         | 
| 8 | 
            -
                root.respond_to_event :internalChange, :on => 'deep_link', :with => :process
         | 
| 9 | 
            -
                
         | 
| 10 | 
            -
                render
         | 
| 11 | 
            -
              end
         | 
| 12 | 
            -
              
         | 
| 13 | 
            -
              def process
         | 
| 14 | 
            -
                # find out what changed in the deep link
         | 
| 15 | 
            -
                  # find the update root (### DISCUSS: this might be more than one root, as in A--B)
         | 
| 16 | 
            -
                #path = param(:deep_link)  # path is #tab=users/icon=3
         | 
| 17 | 
            -
                
         | 
| 18 | 
            -
                update_root = root.find {|w| w.responds_to_url_change? and w.responds_to_url_change_for?(url_fragment)}  ### DISCUSS: we just look for one root here.
         | 
| 19 | 
            -
                
         | 
| 20 | 
            -
                if update_root
         | 
| 21 | 
            -
                  controller.logger.debug "deep_link#process: `#{update_root.name}` responds to :urlChange"
         | 
| 22 | 
            -
                  update_root.trigger(:urlChange)
         | 
| 23 | 
            -
                end
         | 
| 24 | 
            -
                
         | 
| 25 | 
            -
                render :nothing => true
         | 
| 26 | 
            -
              end
         | 
| 27 | 
            -
            end
         | 
| @@ -1,12 +0,0 @@ | |
| 1 | 
            -
            module Apotomo
         | 
| 2 | 
            -
              
         | 
| 3 | 
            -
              ### TODO: if a state doesn't return anything, the view-finding is invoked, which
         | 
| 4 | 
            -
              ###   is nonsense in a JS widget. current work-around: return render :js => ""
         | 
| 5 | 
            -
              
         | 
| 6 | 
            -
              class JavaScriptWidget < StatefulWidget
         | 
| 7 | 
            -
                def frame_content(content)
         | 
| 8 | 
            -
                  content
         | 
| 9 | 
            -
                end
         | 
| 10 | 
            -
              end
         | 
| 11 | 
            -
              
         | 
| 12 | 
            -
            end
         | 
| @@ -1,57 +0,0 @@ | |
| 1 | 
            -
            <style type="text/css">
         | 
| 2 | 
            -
              .TabPanel ul {
         | 
| 3 | 
            -
                display: block;
         | 
| 4 | 
            -
                list-style: none;
         | 
| 5 | 
            -
                padding: 0;
         | 
| 6 | 
            -
                margin: 0 0 -1px 0;
         | 
| 7 | 
            -
                height: 100%;
         | 
| 8 | 
            -
                font-size: 14px;
         | 
| 9 | 
            -
                border-left: 1px solid #888888;
         | 
| 10 | 
            -
             | 
| 11 | 
            -
              }
         | 
| 12 | 
            -
             | 
| 13 | 
            -
              .TabPanel ul li {
         | 
| 14 | 
            -
                float: left;
         | 
| 15 | 
            -
                margin: 0;
         | 
| 16 | 
            -
                padding: 5px;
         | 
| 17 | 
            -
                background-color: #dbdbdb;
         | 
| 18 | 
            -
                color: #888888;
         | 
| 19 | 
            -
                border-top: 1px solid #888888;
         | 
| 20 | 
            -
                border-right: 1px solid #888888;
         | 
| 21 | 
            -
                border-bottom: 1px solid #888888;
         | 
| 22 | 
            -
              }
         | 
| 23 | 
            -
             | 
| 24 | 
            -
              .TabPanel ul li.active {
         | 
| 25 | 
            -
                border-bottom: 1px solid #ffffff;
         | 
| 26 | 
            -
                background-color: #ffffff;
         | 
| 27 | 
            -
                color: #000000;
         | 
| 28 | 
            -
             | 
| 29 | 
            -
              }
         | 
| 30 | 
            -
             | 
| 31 | 
            -
              .TabPanel ul li a, .TabPanel ul li a:visited {
         | 
| 32 | 
            -
                color: #888888
         | 
| 33 | 
            -
              }
         | 
| 34 | 
            -
            </style>
         | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
            <div class="TabPanel">
         | 
| 38 | 
            -
              <ul>
         | 
| 39 | 
            -
                <% tabs.each do |tab|
         | 
| 40 | 
            -
              	  tab_class = ""   
         | 
| 41 | 
            -
            	  tab_class = "active" if tab.name == @current_child_id
         | 
| 42 | 
            -
                %>
         | 
| 43 | 
            -
                <li class="<%= tab_class %>">
         | 
| 44 | 
            -
                  <%- if @cell.responds_to_url_change? %>
         | 
| 45 | 
            -
                  	<%= link_to_function tab.title, update_url(@cell.url_fragment_for_tab(tab)) %>
         | 
| 46 | 
            -
                  <%- else %>
         | 
| 47 | 
            -
            		<%= link_to_event tab.title, {:type => :switchChild, @cell.param_name => tab.name} %>
         | 
| 48 | 
            -
                  <% end %>
         | 
| 49 | 
            -
                </li>
         | 
| 50 | 
            -
                <% end -%>
         | 
| 51 | 
            -
                
         | 
| 52 | 
            -
                <div style="clear: both;" />
         | 
| 53 | 
            -
              </ul>
         | 
| 54 | 
            -
            </div>
         | 
| 55 | 
            -
            <div style="clear: both;"></div>
         | 
| 56 | 
            -
             | 
| 57 | 
            -
            <%= rendered_children.first %>
         | 
| @@ -1,87 +0,0 @@ | |
| 1 | 
            -
            module Apotomo
         | 
| 2 | 
            -
              class TabPanelWidget < StatefulWidget
         | 
| 3 | 
            -
                transition :from => :display, :to => :switch
         | 
| 4 | 
            -
                transition                    :in => :switch
         | 
| 5 | 
            -
                
         | 
| 6 | 
            -
                attr_accessor :current_child_id
         | 
| 7 | 
            -
                
         | 
| 8 | 
            -
                
         | 
| 9 | 
            -
                # Called in StatefulWidget's constructor.
         | 
| 10 | 
            -
                def initialize_deep_link_for(id, start_states, opts)
         | 
| 11 | 
            -
                  return unless opts[:is_url_listener]
         | 
| 12 | 
            -
                  
         | 
| 13 | 
            -
                  respond_to_event :urlChange, :from => self.name, :with => :switch
         | 
| 14 | 
            -
                end
         | 
| 15 | 
            -
                
         | 
| 16 | 
            -
                
         | 
| 17 | 
            -
                
         | 
| 18 | 
            -
                def display
         | 
| 19 | 
            -
                  respond_to_event(:switchChild, :with => :switch)
         | 
| 20 | 
            -
                  
         | 
| 21 | 
            -
                  
         | 
| 22 | 
            -
                  @current_child_id  = find_current_child.name
         | 
| 23 | 
            -
                  
         | 
| 24 | 
            -
                  render :locals => {:tabs => children}
         | 
| 25 | 
            -
                end
         | 
| 26 | 
            -
                
         | 
| 27 | 
            -
                
         | 
| 28 | 
            -
                def switch
         | 
| 29 | 
            -
                  @current_child_id  = find_current_child.name
         | 
| 30 | 
            -
                  
         | 
| 31 | 
            -
                  render :view => :display, :locals => {:tabs => children}
         | 
| 32 | 
            -
                end
         | 
| 33 | 
            -
                
         | 
| 34 | 
            -
                
         | 
| 35 | 
            -
                def children_to_render
         | 
| 36 | 
            -
                  [children.find{ |c| c.name == @current_child_id } ]
         | 
| 37 | 
            -
                end
         | 
| 38 | 
            -
                
         | 
| 39 | 
            -
                ### DISCUSS: use #find_param instead of #param to provide a cleaner parameter retrieval?
         | 
| 40 | 
            -
                def find_current_child
         | 
| 41 | 
            -
                  if responds_to_url_change?
         | 
| 42 | 
            -
                    child_id  = url_fragment[param_name]
         | 
| 43 | 
            -
                  else
         | 
| 44 | 
            -
                    child_id  = param(param_name)
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
                  
         | 
| 47 | 
            -
                  find_child(child_id) || find_child(@current_child_id) || default_child
         | 
| 48 | 
            -
                end
         | 
| 49 | 
            -
                
         | 
| 50 | 
            -
                def default_child;  children.first;   end
         | 
| 51 | 
            -
                
         | 
| 52 | 
            -
                
         | 
| 53 | 
            -
                def find_child(id)
         | 
| 54 | 
            -
                  children.find { |c| c.name.to_s == id }
         | 
| 55 | 
            -
                end
         | 
| 56 | 
            -
                
         | 
| 57 | 
            -
                def param_name; name; end
         | 
| 58 | 
            -
                
         | 
| 59 | 
            -
                
         | 
| 60 | 
            -
                # Called by deep_link_widget#process to query if we're involved in an URL change.
         | 
| 61 | 
            -
                def responds_to_url_change_for?(fragment)
         | 
| 62 | 
            -
                  # don't respond to an empty/invalid/ fragment as we don't get any information from it:
         | 
| 63 | 
            -
                  return if fragment[param_name].blank?
         | 
| 64 | 
            -
                  
         | 
| 65 | 
            -
                  fragment[param_name] != @current_child_id
         | 
| 66 | 
            -
                end
         | 
| 67 | 
            -
                
         | 
| 68 | 
            -
                def local_fragment
         | 
| 69 | 
            -
                  "#{param_name}=#{current_child_id}"
         | 
| 70 | 
            -
                end
         | 
| 71 | 
            -
                
         | 
| 72 | 
            -
                
         | 
| 73 | 
            -
                # Used in view to create the tab link in deep-linking mode.
         | 
| 74 | 
            -
                def url_fragment_for_tab(tab)
         | 
| 75 | 
            -
                  url_fragment_for("#{param_name}=#{tab.name}")
         | 
| 76 | 
            -
                end
         | 
| 77 | 
            -
                
         | 
| 78 | 
            -
                
         | 
| 79 | 
            -
                def address(way={}, target=self, state=nil)
         | 
| 80 | 
            -
                  way.merge!( local_address(target, way, state) )
         | 
| 81 | 
            -
             | 
| 82 | 
            -
                  return way if isRoot?
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                  return parent.address(way, target)
         | 
| 85 | 
            -
                end
         | 
| 86 | 
            -
              end
         | 
| 87 | 
            -
            end
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            <%= rendered_children.collect{|e| e.last}.join("") %>
         |