hobo 1.3.0.pre22 → 1.3.0.pre23
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/VERSION +1 -1
- data/doctests/hobo/scopes.rdoctest +4 -8
- data/lib/hobo/controller.rb +8 -11
- data/lib/hobo/engine.rb +4 -4
- data/lib/hobo/extensions/active_record/{association_collection.rb → associations/collection.rb} +0 -0
- data/lib/hobo/extensions/active_record/{association_proxy.rb → associations/proxy.rb} +6 -7
- data/lib/hobo/extensions/active_record/associations/reflection.rb +23 -0
- data/lib/hobo/extensions/active_record/associations/scope.rb +35 -0
- data/lib/hobo/extensions/array.rb +12 -0
- data/lib/hobo/model.rb +1 -1
- data/lib/hobo/model/lifecycles/lifecycle.rb +1 -1
- data/lib/hobo/model/scopes/automatic_scopes.rb +79 -89
- data/lib/hobo/rapid/generators/rapid/cards.dryml.erb +1 -1
- data/lib/hobo/rapid/generators/rapid/pages.dryml.erb +6 -6
- metadata +17 -17
- data/lib/hobo/extensions/active_record/association_reflection.rb +0 -19
- data/lib/hobo/extensions/active_record/scopes.rb +0 -31
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            1.3.0. | 
| 1 | 
            +
            1.3.0.pre23
         | 
| @@ -285,18 +285,14 @@ Gives the N most recent items: | |
| 285 285 |  | 
| 286 286 | 
             
            ## include
         | 
| 287 287 |  | 
| 288 | 
            -
            DEPRECATED: Automatic scope :include has been deprecated: use : | 
| 288 | 
            +
            DEPRECATED: Automatic scope :include has been deprecated: use :includes instead.
         | 
| 289 289 |  | 
| 290 | 
            -
            ##  | 
| 290 | 
            +
            ## includes
         | 
| 291 291 |  | 
| 292 | 
            -
             | 
| 293 | 
            -
            the `:include` option to the `find` method.
         | 
| 294 | 
            -
             | 
| 295 | 
            -
                >> Person.search("B", :name).including(:friends).*.name  # test LH#839
         | 
| 292 | 
            +
                >> Person.search("B", :name).includes(:friends).*.name  # test LH#839
         | 
| 296 293 | 
             
                => ["Bryan", "Bethany"]
         | 
| 297 | 
            -
            .hidden
         | 
| 298 294 |  | 
| 299 | 
            -
                >> Person. | 
| 295 | 
            +
                >> Person.includes(:friends).*.name
         | 
| 300 296 | 
             
                => ["Bryan", "Bethany"]
         | 
| 301 297 |  | 
| 302 298 | 
             
            ## search
         | 
    
        data/lib/hobo/controller.rb
    CHANGED
    
    | @@ -58,10 +58,9 @@ module Hobo | |
| 58 58 |  | 
| 59 59 | 
             
                def hobo_ajax_response(*args)
         | 
| 60 60 | 
             
                  results = args.extract_options!
         | 
| 61 | 
            -
                  page_path = params[:page_path]
         | 
| 62 61 | 
             
                  r = params[:render]
         | 
| 63 62 | 
             
                  if r
         | 
| 64 | 
            -
                    ajax_update_response( | 
| 63 | 
            +
                    ajax_update_response(r.values, results)
         | 
| 65 64 | 
             
                    true
         | 
| 66 65 | 
             
                  else
         | 
| 67 66 | 
             
                    false
         | 
| @@ -69,15 +68,13 @@ module Hobo | |
| 69 68 | 
             
                end
         | 
| 70 69 |  | 
| 71 70 |  | 
| 72 | 
            -
                def ajax_update_response( | 
| 73 | 
            -
                   | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
                    renderer = Dryml.page_renderer(view_context, identifier, [], controller)
         | 
| 80 | 
            -
                  end
         | 
| 71 | 
            +
                def ajax_update_response(render_specs, results={})
         | 
| 72 | 
            +
                  controller, action = controller_action_from_page_path
         | 
| 73 | 
            +
                  identifier = view_context.view_paths.find( action,
         | 
| 74 | 
            +
                                                             controller,
         | 
| 75 | 
            +
                                                             false,
         | 
| 76 | 
            +
                                                             view_context.lookup_context.instance_variable_get('@details')).identifier
         | 
| 77 | 
            +
                  renderer = Dryml.page_renderer(view_context, identifier, [], controller)
         | 
| 81 78 |  | 
| 82 79 | 
             
                  render :update do |page|
         | 
| 83 80 | 
             
                    page << "var _update = typeof Hobo == 'undefined' ? Element.update : Hobo.updateElement;"
         | 
    
        data/lib/hobo/engine.rb
    CHANGED
    
    | @@ -23,12 +23,12 @@ module Hobo | |
| 23 23 | 
             
                end
         | 
| 24 24 |  | 
| 25 25 | 
             
                ActiveSupport.on_load(:active_record) do
         | 
| 26 | 
            -
                  require 'hobo/extensions/active_record/ | 
| 27 | 
            -
                  require 'hobo/extensions/active_record/ | 
| 28 | 
            -
                  require 'hobo/extensions/active_record/ | 
| 26 | 
            +
                  require 'hobo/extensions/active_record/associations/collection'
         | 
| 27 | 
            +
                  require 'hobo/extensions/active_record/associations/proxy'
         | 
| 28 | 
            +
                  require 'hobo/extensions/active_record/associations/reflection'
         | 
| 29 29 | 
             
                  require 'hobo/extensions/active_record/hobo_methods'
         | 
| 30 30 | 
             
                  require 'hobo/extensions/active_record/permissions'
         | 
| 31 | 
            -
                  require 'hobo/extensions/active_record/ | 
| 31 | 
            +
                  require 'hobo/extensions/active_record/associations/scope'
         | 
| 32 32 | 
             
                  require 'hobo/extensions/active_record/relation_with_origin'
         | 
| 33 33 | 
             
                  require 'hobo/extensions/active_model/name'
         | 
| 34 34 | 
             
                  require 'hobo/extensions/active_model/translation'
         | 
    
        data/lib/hobo/extensions/active_record/{association_collection.rb → associations/collection.rb}
    RENAMED
    
    | 
            File without changes
         | 
| @@ -2,17 +2,16 @@ module ActiveRecord | |
| 2 2 | 
             
              module Associations
         | 
| 3 3 | 
             
                class AssociationProxy #:nodoc:
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 5 | 
            +
                  def origin
         | 
| 6 | 
            +
                    proxy_owner
         | 
| 7 | 
            +
                  end
         | 
| 8 8 |  | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 9 | 
            +
                  def origin_attribute
         | 
| 10 | 
            +
                    proxy_reflection.name
         | 
| 11 | 
            +
                  end
         | 
| 12 12 |  | 
| 13 13 | 
             
                  private
         | 
| 14 14 |  | 
| 15 | 
            -
             | 
| 16 15 | 
             
                  def raise_on_type_mismatch(record)
         | 
| 17 16 | 
             
                    # Don't complain if the interface type of a polymorphic association doesn't exist
         | 
| 18 17 | 
             
                    klass = @reflection.klass rescue nil
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module ActiveRecord
         | 
| 2 | 
            +
              module Reflection
         | 
| 3 | 
            +
                class AssociationReflection
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                  alias_method :association_name, :name
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  def klass_with_create_polymorphic_class
         | 
| 8 | 
            +
                    if options[:polymorphic]
         | 
| 9 | 
            +
                      begin
         | 
| 10 | 
            +
                        klass_without_create_polymorphic_class
         | 
| 11 | 
            +
                      rescue NameError => e
         | 
| 12 | 
            +
                        Object.class_eval "class #{e.missing_name} < ActiveRecord::Base; set_table_name '#{active_record.name.tableize}'; end"
         | 
| 13 | 
            +
                        e.missing_name.constantize
         | 
| 14 | 
            +
                      end
         | 
| 15 | 
            +
                    else
         | 
| 16 | 
            +
                      klass_without_create_polymorphic_class
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                  alias_method_chain :klass, :create_polymorphic_class
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # Add support for :scope => :my_scope to associations
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ActiveRecord
         | 
| 4 | 
            +
              module Associations
         | 
| 5 | 
            +
                module ThroughAssociationScope
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  def construct_scope_with_scope
         | 
| 8 | 
            +
                    s = construct_scope_without_scope
         | 
| 9 | 
            +
                    s[:find][:scope] = @reflection.options[:scope]
         | 
| 10 | 
            +
                    s
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                  alias_method_chain :construct_scope, :scope
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              module SpawnMethods
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def apply_finder_options_with_scope(options)
         | 
| 20 | 
            +
                  scopes = []
         | 
| 21 | 
            +
                  Array.wrap(options.delete(:scope)).each do |s|
         | 
| 22 | 
            +
                    if s.is_a?(Hash)
         | 
| 23 | 
            +
                      s.each_pair{|k,v| scopes << [k,v] }
         | 
| 24 | 
            +
                    else
         | 
| 25 | 
            +
                      scopes << [s]
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                  relation = apply_finder_options_without_scope(options)
         | 
| 29 | 
            +
                  return relation if scopes.empty?
         | 
| 30 | 
            +
                  scopes.inject(relation) {|r, s| r.send *s }
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                alias_method_chain :apply_finder_options, :scope
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -1,4 +1,7 @@ | |
| 1 1 | 
             
            # Add support for type metadata to arrays
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'will_paginate/array'
         | 
| 4 | 
            +
             | 
| 2 5 | 
             
            class Array
         | 
| 3 6 |  | 
| 4 7 | 
             
              attr_accessor :member_class, :origin, :origin_attribute
         | 
| @@ -12,4 +15,13 @@ class Array | |
| 12 15 | 
             
                origin and origin_id = origin.try.typed_id and "#{origin_id}:#{origin_attribute}"
         | 
| 13 16 | 
             
              end
         | 
| 14 17 |  | 
| 18 | 
            +
              def paginate_with_hobo_metadata(*args, &block)
         | 
| 19 | 
            +
                collection = paginate_without_hobo_metadata(*args, &block)
         | 
| 20 | 
            +
                collection.member_class     = member_class
         | 
| 21 | 
            +
                collection.origin           = try.proxy_owner
         | 
| 22 | 
            +
                collection.origin_attribute = try.proxy_reflection._?.name
         | 
| 23 | 
            +
                collection
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
              alias_method_chain :paginate, :hobo_metadata
         | 
| 26 | 
            +
             | 
| 15 27 | 
             
            end
         | 
    
        data/lib/hobo/model.rb
    CHANGED
    
    | @@ -61,7 +61,7 @@ module Hobo | |
| 61 61 | 
             
                    WillPaginate::Finders::Base.class_eval do
         | 
| 62 62 | 
             
                      def paginate_with_hobo_metadata(*args, &block)
         | 
| 63 63 | 
             
                        collection = paginate_without_hobo_metadata(*args, &block)
         | 
| 64 | 
            -
                        collection.member_class     = self
         | 
| 64 | 
            +
                        collection.member_class     = self.is_a?(ActiveRecord::Relation) ? member_class : self
         | 
| 65 65 | 
             
                        collection.origin           = try.proxy_owner
         | 
| 66 66 | 
             
                        collection.origin_attribute = try.proxy_reflection._?.name
         | 
| 67 67 | 
             
                        collection
         | 
| @@ -31,11 +31,11 @@ module Hobo | |
| 31 31 | 
             
                    def create_scope(check_only=false)
         | 
| 32 32 | 
             
                      matched_scope = true
         | 
| 33 33 |  | 
| 34 | 
            -
             | 
| 34 | 
            +
                      case
         | 
| 35 35 | 
             
                      # --- Association Queries --- #
         | 
| 36 36 |  | 
| 37 37 | 
             
                      # with_players(player1, player2)
         | 
| 38 | 
            -
                       | 
| 38 | 
            +
                      when name =~ /^with_(.*)/ && (refl = reflection($1))
         | 
| 39 39 | 
             
                        return true if check_only
         | 
| 40 40 |  | 
| 41 41 | 
             
                        def_scope do |*records|
         | 
| @@ -49,7 +49,7 @@ module Hobo | |
| 49 49 | 
             
                        end
         | 
| 50 50 |  | 
| 51 51 | 
             
                      # with_player(a_player)
         | 
| 52 | 
            -
                       | 
| 52 | 
            +
                      when name =~ /^with_(.*)/ && (refl = reflection($1.pluralize))
         | 
| 53 53 | 
             
                        return true if check_only
         | 
| 54 54 |  | 
| 55 55 | 
             
                        exists_sql = exists_sql_condition(refl)
         | 
| @@ -59,7 +59,7 @@ module Hobo | |
| 59 59 | 
             
                        end
         | 
| 60 60 |  | 
| 61 61 | 
             
                      # any_of_players(player1, player2)
         | 
| 62 | 
            -
                       | 
| 62 | 
            +
                      when name =~ /^any_of_(.*)/ && (refl = reflection($1))
         | 
| 63 63 | 
             
                        return true if check_only
         | 
| 64 64 |  | 
| 65 65 | 
             
                        def_scope do |*records|
         | 
| @@ -73,7 +73,7 @@ module Hobo | |
| 73 73 | 
             
                        end
         | 
| 74 74 |  | 
| 75 75 | 
             
                      # without_players(player1, player2)
         | 
| 76 | 
            -
                       | 
| 76 | 
            +
                      when name =~ /^without_(.*)/ && (refl = reflection($1))
         | 
| 77 77 | 
             
                        return true if check_only
         | 
| 78 78 |  | 
| 79 79 | 
             
                        def_scope do |*records|
         | 
| @@ -87,7 +87,7 @@ module Hobo | |
| 87 87 | 
             
                        end
         | 
| 88 88 |  | 
| 89 89 | 
             
                      # without_player(a_player)
         | 
| 90 | 
            -
                       | 
| 90 | 
            +
                      when name =~ /^without_(.*)/ && (refl = reflection($1.pluralize))
         | 
| 91 91 | 
             
                        return true if check_only
         | 
| 92 92 |  | 
| 93 93 | 
             
                        exists_sql = exists_sql_condition(refl)
         | 
| @@ -97,7 +97,7 @@ module Hobo | |
| 97 97 | 
             
                        end
         | 
| 98 98 |  | 
| 99 99 | 
             
                      # team_is(a_team)
         | 
| 100 | 
            -
                       | 
| 100 | 
            +
                      when name =~ /^(.*)_is$/ && (refl = reflection($1)) && refl.macro.in?([:has_one, :belongs_to])
         | 
| 101 101 | 
             
                        return true if check_only
         | 
| 102 102 |  | 
| 103 103 | 
             
                        if refl.options[:polymorphic]
         | 
| @@ -113,7 +113,7 @@ module Hobo | |
| 113 113 | 
             
                        end
         | 
| 114 114 |  | 
| 115 115 | 
             
                      # team_is_not(a_team)
         | 
| 116 | 
            -
                       | 
| 116 | 
            +
                      when name =~ /^(.*)_is_not$/ && (refl = reflection($1)) && refl.macro.in?([:has_one, :belongs_to])
         | 
| 117 117 | 
             
                        return true if check_only
         | 
| 118 118 |  | 
| 119 119 | 
             
                        if refl.options[:polymorphic]
         | 
| @@ -132,7 +132,7 @@ module Hobo | |
| 132 132 | 
             
                      # --- Column Queries --- #
         | 
| 133 133 |  | 
| 134 134 | 
             
                      # name_is(str)
         | 
| 135 | 
            -
                       | 
| 135 | 
            +
                      when name =~ /^(.*)_is$/ && (col = column($1))
         | 
| 136 136 | 
             
                        return true if check_only
         | 
| 137 137 |  | 
| 138 138 | 
             
                        def_scope do |str|
         | 
| @@ -140,7 +140,7 @@ module Hobo | |
| 140 140 | 
             
                        end
         | 
| 141 141 |  | 
| 142 142 | 
             
                      # name_is_not(str)
         | 
| 143 | 
            -
                       | 
| 143 | 
            +
                      when name =~ /^(.*)_is_not$/ && (col = column($1))
         | 
| 144 144 | 
             
                        return true if check_only
         | 
| 145 145 |  | 
| 146 146 | 
             
                        def_scope do |str|
         | 
| @@ -148,7 +148,7 @@ module Hobo | |
| 148 148 | 
             
                        end
         | 
| 149 149 |  | 
| 150 150 | 
             
                      # name_contains(str)
         | 
| 151 | 
            -
                       | 
| 151 | 
            +
                      when name =~ /^(.*)_contains$/ && (col = column($1))
         | 
| 152 152 | 
             
                        return true if check_only
         | 
| 153 153 |  | 
| 154 154 | 
             
                        def_scope do |str|
         | 
| @@ -156,7 +156,7 @@ module Hobo | |
| 156 156 | 
             
                        end
         | 
| 157 157 |  | 
| 158 158 | 
             
                      # name_does_not_contain
         | 
| 159 | 
            -
                       | 
| 159 | 
            +
                      when name =~ /^(.*)_does_not_contain$/ && (col = column($1))
         | 
| 160 160 | 
             
                        return true if check_only
         | 
| 161 161 |  | 
| 162 162 | 
             
                        def_scope do |str|
         | 
| @@ -164,7 +164,7 @@ module Hobo | |
| 164 164 | 
             
                        end
         | 
| 165 165 |  | 
| 166 166 | 
             
                      # name_starts(str)
         | 
| 167 | 
            -
                       | 
| 167 | 
            +
                      when name =~ /^(.*)_starts$/ && (col = column($1))
         | 
| 168 168 | 
             
                        return true if check_only
         | 
| 169 169 |  | 
| 170 170 | 
             
                        def_scope do |str|
         | 
| @@ -172,7 +172,7 @@ module Hobo | |
| 172 172 | 
             
                        end
         | 
| 173 173 |  | 
| 174 174 | 
             
                      # name_does_not_start
         | 
| 175 | 
            -
                       | 
| 175 | 
            +
                      when name =~ /^(.*)_does_not_start$/ && (col = column($1))
         | 
| 176 176 | 
             
                        return true if check_only
         | 
| 177 177 |  | 
| 178 178 | 
             
                        def_scope do |str|
         | 
| @@ -180,7 +180,7 @@ module Hobo | |
| 180 180 | 
             
                        end
         | 
| 181 181 |  | 
| 182 182 | 
             
                      # name_ends(str)
         | 
| 183 | 
            -
                       | 
| 183 | 
            +
                      when name =~ /^(.*)_ends$/ && (col = column($1))
         | 
| 184 184 | 
             
                        return true if check_only
         | 
| 185 185 |  | 
| 186 186 | 
             
                        def_scope do |str|
         | 
| @@ -188,7 +188,7 @@ module Hobo | |
| 188 188 | 
             
                        end
         | 
| 189 189 |  | 
| 190 190 | 
             
                      # name_does_not_end(str)
         | 
| 191 | 
            -
                       | 
| 191 | 
            +
                      when name =~ /^(.*)_does_not_end$/ && (col = column($1))
         | 
| 192 192 | 
             
                        return true if check_only
         | 
| 193 193 |  | 
| 194 194 | 
             
                        def_scope do |str|
         | 
| @@ -196,7 +196,7 @@ module Hobo | |
| 196 196 | 
             
                        end
         | 
| 197 197 |  | 
| 198 198 | 
             
                      # published (a boolean column)
         | 
| 199 | 
            -
                       | 
| 199 | 
            +
                      when (col = column(name)) && (col.type == :boolean)
         | 
| 200 200 | 
             
                        return true if check_only
         | 
| 201 201 |  | 
| 202 202 | 
             
                        def_scope do
         | 
| @@ -204,7 +204,7 @@ module Hobo | |
| 204 204 | 
             
                        end
         | 
| 205 205 |  | 
| 206 206 | 
             
                      # not_published
         | 
| 207 | 
            -
                       | 
| 207 | 
            +
                      when name =~ /^not_(.*)$/ && (col = column($1)) && (col.type == :boolean)
         | 
| 208 208 | 
             
                        return true if check_only
         | 
| 209 209 |  | 
| 210 210 | 
             
                        def_scope do
         | 
| @@ -212,7 +212,7 @@ module Hobo | |
| 212 212 | 
             
                        end
         | 
| 213 213 |  | 
| 214 214 | 
             
                      # published_before(time)
         | 
| 215 | 
            -
                       | 
| 215 | 
            +
                      when name =~ /^(.*)_before$/ && (col = column("#{$1}_at") || column("#{$1}_date") || column("#{$1}_on")) && col.type.in?([:date, :datetime, :time, :timestamp])
         | 
| 216 216 | 
             
                        return true if check_only
         | 
| 217 217 |  | 
| 218 218 | 
             
                        def_scope do |time|
         | 
| @@ -220,7 +220,7 @@ module Hobo | |
| 220 220 | 
             
                        end
         | 
| 221 221 |  | 
| 222 222 | 
             
                      # published_after(time)
         | 
| 223 | 
            -
                       | 
| 223 | 
            +
                      when name =~ /^(.*)_after$/ && (col = column("#{$1}_at") || column("#{$1}_date") || column("#{$1}_on")) && col.type.in?([:date, :datetime, :time, :timestamp])
         | 
| 224 224 | 
             
                        return true if check_only
         | 
| 225 225 |  | 
| 226 226 | 
             
                        def_scope do |time|
         | 
| @@ -228,7 +228,7 @@ module Hobo | |
| 228 228 | 
             
                        end
         | 
| 229 229 |  | 
| 230 230 | 
             
                      # published_between(time1, time2)
         | 
| 231 | 
            -
                       | 
| 231 | 
            +
                      when name =~ /^(.*)_between$/ && (col = column("#{$1}_at") || column("#{$1}_date") || column("#{$1}_on")) && col.type.in?([:date, :datetime, :time, :timestamp])
         | 
| 232 232 | 
             
                        return true if check_only
         | 
| 233 233 |  | 
| 234 234 | 
             
                        def_scope do |time1, time2|
         | 
| @@ -236,12 +236,12 @@ module Hobo | |
| 236 236 | 
             
                        end
         | 
| 237 237 |  | 
| 238 238 | 
             
                       # active (a lifecycle state)
         | 
| 239 | 
            -
                       | 
| 239 | 
            +
                      when @klass.has_lifecycle? && name.to_sym.in?(@klass::Lifecycle.state_names)
         | 
| 240 240 | 
             
                        return true if check_only
         | 
| 241 241 |  | 
| 242 242 | 
             
                        if @klass::Lifecycle.state_names.length == 1
         | 
| 243 243 | 
             
                          # nothing to check for - create a dummy scope
         | 
| 244 | 
            -
                          def_scope { @klass. | 
| 244 | 
            +
                          def_scope { @klass.scoped }
         | 
| 245 245 | 
             
                          true
         | 
| 246 246 | 
             
                        else
         | 
| 247 247 | 
             
                          def_scope do
         | 
| @@ -250,104 +250,94 @@ module Hobo | |
| 250 250 | 
             
                        end
         | 
| 251 251 |  | 
| 252 252 | 
             
                      # self is / is not
         | 
| 253 | 
            -
                       | 
| 253 | 
            +
                      when name == "is"
         | 
| 254 254 | 
             
                        return true if check_only
         | 
| 255 255 |  | 
| 256 256 | 
             
                        def_scope do |record|
         | 
| 257 257 | 
             
                          @klass.where "#{@klass.table_name}.#{@klass.primary_key} = ?", record
         | 
| 258 258 | 
             
                        end
         | 
| 259 259 |  | 
| 260 | 
            -
                       | 
| 260 | 
            +
                      when name == "is_not"
         | 
| 261 261 | 
             
                        return true if check_only
         | 
| 262 262 |  | 
| 263 263 | 
             
                        def_scope do |record|
         | 
| 264 264 | 
             
                          @klass.where "#{@klass.table_name}.#{@klass.primary_key} <> ?", record
         | 
| 265 265 | 
             
                        end
         | 
| 266 266 |  | 
| 267 | 
            -
                      else
         | 
| 268 | 
            -
             | 
| 269 | 
            -
                        case name
         | 
| 270 267 |  | 
| 271 | 
            -
             | 
| 272 | 
            -
             | 
| 268 | 
            +
                      when name == "by_most_recent"
         | 
| 269 | 
            +
                        return true if check_only
         | 
| 273 270 |  | 
| 274 | 
            -
             | 
| 275 | 
            -
             | 
| 276 | 
            -
             | 
| 271 | 
            +
                        def_scope do
         | 
| 272 | 
            +
                          @klass.order "#{@klass.table_name}.created_at DESC"
         | 
| 273 | 
            +
                        end
         | 
| 277 274 |  | 
| 278 | 
            -
             | 
| 279 | 
            -
             | 
| 275 | 
            +
                      when name == "recent"
         | 
| 276 | 
            +
                        return true if check_only
         | 
| 280 277 |  | 
| 281 | 
            -
             | 
| 282 | 
            -
             | 
| 283 | 
            -
             | 
| 284 | 
            -
             | 
| 285 | 
            -
                            end
         | 
| 286 | 
            -
                          else
         | 
| 287 | 
            -
                            def_scope do |*args|
         | 
| 288 | 
            -
                              count = args.first || 6
         | 
| 289 | 
            -
                              limit(count)
         | 
| 290 | 
            -
                            end
         | 
| 278 | 
            +
                        if "created_at".in?(@klass.columns.*.name)
         | 
| 279 | 
            +
                          def_scope do |*args|
         | 
| 280 | 
            +
                            count = args.first || 6
         | 
| 281 | 
            +
                            @klass.order("#{@klass.table_name}.created_at DESC").limit(count)
         | 
| 291 282 | 
             
                          end
         | 
| 292 | 
            -
             | 
| 293 | 
            -
                        when "order_by"
         | 
| 294 | 
            -
                          return true if check_only
         | 
| 295 | 
            -
             | 
| 296 | 
            -
                          klass = @klass
         | 
| 283 | 
            +
                        else
         | 
| 297 284 | 
             
                          def_scope do |*args|
         | 
| 298 | 
            -
                             | 
| 299 | 
            -
                             | 
| 300 | 
            -
                            if type.nil? #a virtual attribute from an SQL alias, e.g., 'total' from 'COUNT(*) AS total'
         | 
| 301 | 
            -
                              colspec = "#{field}" # don't prepend the table name
         | 
| 302 | 
            -
                            elsif type.respond_to?(:name_attribute) && (name = type.name_attribute)
         | 
| 303 | 
            -
                              include = field
         | 
| 304 | 
            -
                              colspec = "#{type.table_name}.#{name}"
         | 
| 305 | 
            -
                            else
         | 
| 306 | 
            -
                              colspec = "#{klass.table_name}.#{field}"
         | 
| 307 | 
            -
                            end
         | 
| 308 | 
            -
                            @klass.includes(include).order("#{colspec} #{asc._?.upcase}")
         | 
| 285 | 
            +
                            count = args.first || 6
         | 
| 286 | 
            +
                            limit(count)
         | 
| 309 287 | 
             
                          end
         | 
| 288 | 
            +
                        end
         | 
| 310 289 |  | 
| 290 | 
            +
                      when name == "order_by"
         | 
| 291 | 
            +
                        # DEPRECATED: use :order instead.
         | 
| 292 | 
            +
                        Rails.logger.warn "Automatic scope :order_by has been deprecated: use :order instead."
         | 
| 293 | 
            +
                        return true if check_only
         | 
| 311 294 |  | 
| 312 | 
            -
                         | 
| 313 | 
            -
             | 
| 314 | 
            -
                           | 
| 315 | 
            -
                           | 
| 316 | 
            -
                           | 
| 317 | 
            -
             | 
| 318 | 
            -
                           | 
| 319 | 
            -
                             | 
| 295 | 
            +
                        klass = @klass
         | 
| 296 | 
            +
                        def_scope do |*args|
         | 
| 297 | 
            +
                          field, asc = args
         | 
| 298 | 
            +
                          type = klass.attr_type(field)
         | 
| 299 | 
            +
                          if type.nil? #a virtual attribute from an SQL alias, e.g., 'total' from 'COUNT(*) AS total'
         | 
| 300 | 
            +
                            colspec = "#{field}" # don't prepend the table name
         | 
| 301 | 
            +
                          elsif type.respond_to?(:name_attribute) && (name = type.name_attribute)
         | 
| 302 | 
            +
                            include = field
         | 
| 303 | 
            +
                            colspec = "#{type.table_name}.#{name}"
         | 
| 304 | 
            +
                          else
         | 
| 305 | 
            +
                            colspec = "#{klass.table_name}.#{field}"
         | 
| 320 306 | 
             
                          end
         | 
| 307 | 
            +
                          @klass.includes(include).order("#{colspec} #{asc._?.upcase}")
         | 
| 308 | 
            +
                        end
         | 
| 321 309 |  | 
| 322 | 
            -
             | 
| 323 | 
            -
             | 
| 324 | 
            -
             | 
| 325 | 
            -
             | 
| 326 | 
            -
             | 
| 327 | 
            -
                          end
         | 
| 310 | 
            +
                      when name == "include"
         | 
| 311 | 
            +
                        # DEPRECATED: it clashes with Module.include when called on an ActiveRecord::Relation
         | 
| 312 | 
            +
                        # after a scope chain, if you didn't call it on the class itself first
         | 
| 313 | 
            +
                        Rails.logger.warn "Automatic scope :include has been deprecated: use :includes instead."
         | 
| 314 | 
            +
                        return true if check_only
         | 
| 328 315 |  | 
| 329 | 
            -
                         | 
| 330 | 
            -
                           | 
| 316 | 
            +
                        def_scope do |inclusions|
         | 
| 317 | 
            +
                          @klass.includes(inclusions)
         | 
| 318 | 
            +
                        end
         | 
| 331 319 |  | 
| 332 | 
            -
             | 
| 333 | 
            -
             | 
| 320 | 
            +
                      when name == "search"
         | 
| 321 | 
            +
                        return true if check_only
         | 
| 334 322 |  | 
| 335 | 
            -
             | 
| 336 | 
            -
             | 
| 337 | 
            -
                            word_queries = words.map do |word|
         | 
| 338 | 
            -
                              field_query = '(' + fields.map { |field| "(#{@klass.table_name}.#{field} #{match_keyword} ?)" }.join(" OR ") + ')'
         | 
| 339 | 
            -
                              args += ["%#{word}%"] * fields.length
         | 
| 340 | 
            -
                              field_query
         | 
| 341 | 
            -
                            end
         | 
| 323 | 
            +
                        def_scope do |query, *fields|
         | 
| 324 | 
            +
                          match_keyword = ::ActiveRecord::Base.connection.adapter_name == "PostgreSQL" ? "ILIKE" : "LIKE"
         | 
| 342 325 |  | 
| 343 | 
            -
             | 
| 326 | 
            +
                          words = query.split
         | 
| 327 | 
            +
                          args = []
         | 
| 328 | 
            +
                          word_queries = words.map do |word|
         | 
| 329 | 
            +
                            field_query = '(' + fields.map { |field| "(#{@klass.table_name}.#{field} #{match_keyword} ?)" }.join(" OR ") + ')'
         | 
| 330 | 
            +
                            args += ["%#{word}%"] * fields.length
         | 
| 331 | 
            +
                            field_query
         | 
| 344 332 | 
             
                          end
         | 
| 345 333 |  | 
| 346 | 
            -
             | 
| 347 | 
            -
                          matched_scope = false
         | 
| 334 | 
            +
                          @klass.where *([word_queries.join(" AND ")] + args)
         | 
| 348 335 | 
             
                        end
         | 
| 349 336 |  | 
| 337 | 
            +
                      else
         | 
| 338 | 
            +
                        matched_scope = false
         | 
| 350 339 | 
             
                      end
         | 
| 340 | 
            +
             | 
| 351 341 | 
             
                      matched_scope
         | 
| 352 342 | 
             
                    end
         | 
| 353 343 |  | 
| @@ -53,7 +53,7 @@ model_key = model.to_s.underscore | |
| 53 53 | 
             
                  <view:<%= creator_attribute %> param="creator"/>
         | 
| 54 54 | 
             
            <% end -%>
         | 
| 55 55 | 
             
            <% if primary_collection -%>
         | 
| 56 | 
            -
                  <ht key="<%= primary_collection.to_s.underscore %>.collection.count" count="&this.<%= primary_collection %>.size">
         | 
| 56 | 
            +
                  <ht key="<%= model.reflect_on_association(primary_collection).klass.to_s.underscore %>.collection.count" count="&this.<%= primary_collection %>.size">
         | 
| 57 57 | 
             
                     <count:<%= primary_collection%> param/>
         | 
| 58 58 | 
             
                  </ht>
         | 
| 59 59 | 
             
            <% end -%>
         | 
| @@ -177,7 +177,7 @@ end | |
| 177 177 | 
             
            <% if collection -%>
         | 
| 178 178 | 
             
                        <section param="collection-section">
         | 
| 179 179 | 
             
                          <h3 param="collection-heading">
         | 
| 180 | 
            -
                            <ht key="<%=  | 
| 180 | 
            +
                            <ht key="<%= collection_class.to_s.underscore %>.collection.heading" count="&this.<%= collection.to_s %>.count" >
         | 
| 181 181 | 
             
                              <human-collection-name collection="<%= collection %>" your/>
         | 
| 182 182 | 
             
                            </ht>
         | 
| 183 183 | 
             
                          </h3>
         | 
| @@ -190,21 +190,21 @@ end | |
| 190 190 | 
             
            <%   if add_link -%>
         | 
| 191 191 |  | 
| 192 192 | 
             
                          <a:<%= collection %> action="new" if="&can_create?(@<%= model.name.underscore %>.<%= collection %>)" param="new-link">
         | 
| 193 | 
            -
                            <ht key="<%=  | 
| 194 | 
            -
                              New <%=  | 
| 193 | 
            +
                            <ht key="<%= collection_class.to_s.underscore %>.actions.new" count="1">
         | 
| 194 | 
            +
                              New <%= collection_class.to_s.titleize %>
         | 
| 195 195 | 
             
                            </ht>
         | 
| 196 196 | 
             
                          </a:<%= collection %>>
         | 
| 197 197 | 
             
            <%   elsif add_form -%>
         | 
| 198 198 |  | 
| 199 199 | 
             
                          <section param="add-to-collection" if="&can_create?(@<%= model.name.underscore %>.<%= collection %>)">
         | 
| 200 200 | 
             
                            <h3 param="add-form-heading">
         | 
| 201 | 
            -
                              <ht key="<%=  | 
| 202 | 
            -
                                Add <%= a_or_an  | 
| 201 | 
            +
                              <ht key="<%= collection_class.to_s.underscore %>.collection.add_form_heading" count="1">
         | 
| 202 | 
            +
                                Add <%= a_or_an collection_class.to_s.titleize %>
         | 
| 203 203 | 
             
                              </ht>
         | 
| 204 204 | 
             
                            </h3>
         | 
| 205 205 | 
             
                            <form with="&@<%= collection_class.name.underscore %> || new_for_current_user(@<%= model.name.underscore %>.<%= collection %>)" owner="<%= owner %>" without-cancel param>
         | 
| 206 206 | 
             
                              <field-list: skip="<%= owner %>"/>
         | 
| 207 | 
            -
                              <submit: label="#{ht '<%= sq_escape  | 
| 207 | 
            +
                              <submit: label="#{ht '<%= sq_escape collection_class.to_s.underscore %>.actions.add', :default=>['Add'] }"/>
         | 
| 208 208 | 
             
                            </form>
         | 
| 209 209 | 
             
                          </section>
         | 
| 210 210 | 
             
            <%   end -%>
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: hobo
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash: - | 
| 4 | 
            +
              hash: -1637108443
         | 
| 5 5 | 
             
              prerelease: true
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 1
         | 
| 8 8 | 
             
              - 3
         | 
| 9 9 | 
             
              - 0
         | 
| 10 | 
            -
              -  | 
| 11 | 
            -
              version: 1.3.0. | 
| 10 | 
            +
              - pre23
         | 
| 11 | 
            +
              version: 1.3.0.pre23
         | 
| 12 12 | 
             
            platform: ruby
         | 
| 13 13 | 
             
            authors: 
         | 
| 14 14 | 
             
            - Tom Locke
         | 
| @@ -16,7 +16,7 @@ autorequire: | |
| 16 16 | 
             
            bindir: bin
         | 
| 17 17 | 
             
            cert_chain: []
         | 
| 18 18 |  | 
| 19 | 
            -
            date: 2010-11- | 
| 19 | 
            +
            date: 2010-11-28 00:00:00 -04:00
         | 
| 20 20 | 
             
            default_executable: 
         | 
| 21 21 | 
             
            dependencies: 
         | 
| 22 22 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -59,13 +59,13 @@ dependencies: | |
| 59 59 | 
             
                requirements: 
         | 
| 60 60 | 
             
                - - "="
         | 
| 61 61 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 62 | 
            -
                    hash: - | 
| 62 | 
            +
                    hash: -1637108443
         | 
| 63 63 | 
             
                    segments: 
         | 
| 64 64 | 
             
                    - 1
         | 
| 65 65 | 
             
                    - 3
         | 
| 66 66 | 
             
                    - 0
         | 
| 67 | 
            -
                    -  | 
| 68 | 
            -
                    version: 1.3.0. | 
| 67 | 
            +
                    - pre23
         | 
| 68 | 
            +
                    version: 1.3.0.pre23
         | 
| 69 69 | 
             
              type: :runtime
         | 
| 70 70 | 
             
              version_requirements: *id003
         | 
| 71 71 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -76,13 +76,13 @@ dependencies: | |
| 76 76 | 
             
                requirements: 
         | 
| 77 77 | 
             
                - - "="
         | 
| 78 78 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 79 | 
            -
                    hash: - | 
| 79 | 
            +
                    hash: -1637108443
         | 
| 80 80 | 
             
                    segments: 
         | 
| 81 81 | 
             
                    - 1
         | 
| 82 82 | 
             
                    - 3
         | 
| 83 83 | 
             
                    - 0
         | 
| 84 | 
            -
                    -  | 
| 85 | 
            -
                    version: 1.3.0. | 
| 84 | 
            +
                    - pre23
         | 
| 85 | 
            +
                    version: 1.3.0.pre23
         | 
| 86 86 | 
             
              type: :runtime
         | 
| 87 87 | 
             
              version_requirements: *id004
         | 
| 88 88 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -93,13 +93,13 @@ dependencies: | |
| 93 93 | 
             
                requirements: 
         | 
| 94 94 | 
             
                - - "="
         | 
| 95 95 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 96 | 
            -
                    hash: - | 
| 96 | 
            +
                    hash: -1637108443
         | 
| 97 97 | 
             
                    segments: 
         | 
| 98 98 | 
             
                    - 1
         | 
| 99 99 | 
             
                    - 3
         | 
| 100 100 | 
             
                    - 0
         | 
| 101 | 
            -
                    -  | 
| 102 | 
            -
                    version: 1.3.0. | 
| 101 | 
            +
                    - pre23
         | 
| 102 | 
            +
                    version: 1.3.0.pre23
         | 
| 103 103 | 
             
              type: :runtime
         | 
| 104 104 | 
             
              version_requirements: *id005
         | 
| 105 105 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -266,13 +266,13 @@ files: | |
| 266 266 | 
             
            - lib/hobo/extensions/action_view/translation_helper.rb
         | 
| 267 267 | 
             
            - lib/hobo/extensions/active_model/name.rb
         | 
| 268 268 | 
             
            - lib/hobo/extensions/active_model/translation.rb
         | 
| 269 | 
            -
            - lib/hobo/extensions/active_record/ | 
| 270 | 
            -
            - lib/hobo/extensions/active_record/ | 
| 271 | 
            -
            - lib/hobo/extensions/active_record/ | 
| 269 | 
            +
            - lib/hobo/extensions/active_record/associations/collection.rb
         | 
| 270 | 
            +
            - lib/hobo/extensions/active_record/associations/proxy.rb
         | 
| 271 | 
            +
            - lib/hobo/extensions/active_record/associations/reflection.rb
         | 
| 272 | 
            +
            - lib/hobo/extensions/active_record/associations/scope.rb
         | 
| 272 273 | 
             
            - lib/hobo/extensions/active_record/hobo_methods.rb
         | 
| 273 274 | 
             
            - lib/hobo/extensions/active_record/permissions.rb
         | 
| 274 275 | 
             
            - lib/hobo/extensions/active_record/relation_with_origin.rb
         | 
| 275 | 
            -
            - lib/hobo/extensions/active_record/scopes.rb
         | 
| 276 276 | 
             
            - lib/hobo/extensions/array.rb
         | 
| 277 277 | 
             
            - lib/hobo/extensions/enumerable.rb
         | 
| 278 278 | 
             
            - lib/hobo/extensions/i18n.rb
         | 
| @@ -1,19 +0,0 @@ | |
| 1 | 
            -
            class ActiveRecord::Reflection::AssociationReflection
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              alias_method :association_name, :name
         | 
| 4 | 
            -
             | 
| 5 | 
            -
              def klass_with_create_polymorphic_class
         | 
| 6 | 
            -
                if options[:polymorphic]
         | 
| 7 | 
            -
                  begin
         | 
| 8 | 
            -
                    klass_without_create_polymorphic_class
         | 
| 9 | 
            -
                  rescue NameError => e
         | 
| 10 | 
            -
                    Object.class_eval "class #{e.missing_name} < ActiveRecord::Base; set_table_name '#{active_record.name.tableize}'; end"
         | 
| 11 | 
            -
                    e.missing_name.constantize
         | 
| 12 | 
            -
                  end
         | 
| 13 | 
            -
                else
         | 
| 14 | 
            -
                  klass_without_create_polymorphic_class
         | 
| 15 | 
            -
                end
         | 
| 16 | 
            -
              end
         | 
| 17 | 
            -
              alias_method_chain :klass, :create_polymorphic_class
         | 
| 18 | 
            -
             | 
| 19 | 
            -
            end
         | 
| @@ -1,31 +0,0 @@ | |
| 1 | 
            -
            # Add support for :scope => :my_scope to associations
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            ActiveRecord::Associations::ThroughAssociationScope.class_eval do
         | 
| 4 | 
            -
             | 
| 5 | 
            -
              def construct_scope_with_scope
         | 
| 6 | 
            -
                s = construct_scope_without_scope
         | 
| 7 | 
            -
                s[:find][:scope] = @reflection.options[:scope]
         | 
| 8 | 
            -
                s
         | 
| 9 | 
            -
              end
         | 
| 10 | 
            -
              alias_method_chain :construct_scope, :scope
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
            ActiveRecord::SpawnMethods.class_eval do
         | 
| 15 | 
            -
             | 
| 16 | 
            -
              def apply_finder_options_with_scope(options)
         | 
| 17 | 
            -
                scopes = []
         | 
| 18 | 
            -
                Array.wrap(options.delete(:scope)).each do |s|
         | 
| 19 | 
            -
                  if s.is_a?(Hash)
         | 
| 20 | 
            -
                    s.each_pair{|k,v| scopes << [k,v] }
         | 
| 21 | 
            -
                  else
         | 
| 22 | 
            -
                    scopes << [s]
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
                end
         | 
| 25 | 
            -
                relation = apply_finder_options_without_scope(options)
         | 
| 26 | 
            -
                return relation if scopes.empty?
         | 
| 27 | 
            -
                scopes.inject(relation) {|r, s| r.send *s }
         | 
| 28 | 
            -
              end
         | 
| 29 | 
            -
              alias_method_chain :apply_finder_options, :scope
         | 
| 30 | 
            -
             | 
| 31 | 
            -
            end
         |