formtastic 3.0.0 → 3.1.0.rc1
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/.travis.yml +1 -0
- data/Appraisals +4 -0
- data/CHANGELOG +12 -22
- data/DEPRECATIONS +47 -0
- data/README.textile +9 -4
- data/formtastic.gemspec +3 -3
- data/gemfiles/rails_4.2.gemfile +7 -0
- data/lib/formtastic.rb +13 -7
- data/lib/formtastic/action_class_finder.rb +18 -0
- data/lib/formtastic/deprecation.rb +42 -0
- data/lib/formtastic/form_builder.rb +12 -6
- data/lib/formtastic/helpers/action_helper.rb +43 -6
- data/lib/formtastic/helpers/form_helper.rb +2 -2
- data/lib/formtastic/helpers/input_helper.rb +71 -31
- data/lib/formtastic/html_attributes.rb +12 -1
- data/lib/formtastic/input_class_finder.rb +18 -0
- data/lib/formtastic/inputs.rb +1 -0
- data/lib/formtastic/inputs/base.rb +11 -12
- data/lib/formtastic/inputs/base/choices.rb +1 -1
- data/lib/formtastic/inputs/base/collections.rb +1 -1
- data/lib/formtastic/inputs/base/html.rb +3 -3
- data/lib/formtastic/inputs/datalist_input.rb +41 -0
- data/lib/formtastic/inputs/file_input.rb +2 -2
- data/lib/formtastic/namespaced_class_finder.rb +89 -0
- data/lib/formtastic/util.rb +1 -1
- data/lib/formtastic/version.rb +1 -1
- data/lib/generators/templates/formtastic.rb +20 -0
- data/spec/action_class_finder_spec.rb +12 -0
- data/spec/builder/custom_builder_spec.rb +2 -2
- data/spec/builder/semantic_fields_for_spec.rb +4 -4
- data/spec/helpers/action_helper_spec.rb +9 -355
- data/spec/helpers/form_helper_spec.rb +11 -1
- data/spec/helpers/input_helper_spec.rb +1 -916
- data/spec/helpers/namespaced_action_helper_spec.rb +43 -0
- data/spec/helpers/namespaced_input_helper_spec.rb +36 -0
- data/spec/input_class_finder_spec.rb +10 -0
- data/spec/inputs/check_boxes_input_spec.rb +2 -2
- data/spec/inputs/datalist_input_spec.rb +61 -0
- data/spec/inputs/select_input_spec.rb +1 -1
- data/spec/localizer_spec.rb +2 -2
- data/spec/namespaced_class_finder_spec.rb +79 -0
- data/spec/spec_helper.rb +17 -7
- data/spec/support/custom_macros.rb +22 -4
- data/spec/support/shared_examples.rb +1244 -0
- data/spec/support/specialized_class_finder_shared_example.rb +27 -0
- data/spec/support/test_environment.rb +1 -1
- data/spec/util_spec.rb +20 -6
- metadata +66 -15
- checksums.yaml +0 -15
    
        data/.travis.yml
    CHANGED
    
    
    
        data/Appraisals
    CHANGED
    
    
    
        data/CHANGELOG
    CHANGED
    
    | @@ -1,27 +1,17 @@ | |
| 1 | 
            -
            3.0. | 
| 1 | 
            +
            3.1.0.rc1 (unreleased)
         | 
| 2 2 |  | 
| 3 | 
            -
            *  | 
| 3 | 
            +
            * Deprecated support for Rails version < 4.1.0
         | 
| 4 | 
            +
            * Fixed synchronization issues with custom_namespace configuration
         | 
| 5 | 
            +
            * Fixed bug where boolean (checkbox) inputs were not being correctly checked (also in 2.3.1)
         | 
| 6 | 
            +
            * Fixed (silenced) Rails 5 deprecation on column_for_attribute that we're handling fine
         | 
| 7 | 
            +
            * Added new DatalistInput (:as => :datalist) for HTML5 datalists
         | 
| 8 | 
            +
            * Added configurable namespaces for custom inputs
         | 
| 9 | 
            +
            * Various performance and documentation improvements
         | 
| 4 10 |  | 
| 5 | 
            -
             | 
| 11 | 
            +
            ---
         | 
| 6 12 |  | 
| 7 | 
            -
             | 
| 13 | 
            +
            See 3.0-stable branch for 3.0.x changes
         | 
| 14 | 
            +
            https://github.com/justinfrench/formtastic/blob/3.0-stable/CHANGELOG
         | 
| 8 15 |  | 
| 9 | 
            -
             | 
| 10 | 
            -
            3.0.0.rc
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            * Removed support for Ruby version < 1.9.3
         | 
| 13 | 
            -
            * Removed support for Rails version < 3.2.13
         | 
| 14 | 
            -
            * Removed deprecated option :input_html => { :value => '...'} (#1025)
         | 
| 15 | 
            -
            * Removed deprecated option :hint_class (#1025)
         | 
| 16 | 
            -
            * Removed deprecated option :error_class (#1025)
         | 
| 17 | 
            -
            * Removed deprecated option :group_by (#1025)
         | 
| 18 | 
            -
            * Removed deprecated option :group_label (#1025)
         | 
| 19 | 
            -
            * Removed deprecated option :find_options (#1025)
         | 
| 20 | 
            -
            * Deprecated support for Rails < 4.0.4
         | 
| 21 | 
            -
            * Changed i18n lookups to use the `:as` option from the form builder (#1033)
         | 
| 22 | 
            -
            * Improved documentation for country_select gem compatibility & support (#1061)
         | 
| 23 | 
            -
            * Improved documentation for browser support of datetime and datetime-local (#1029)
         | 
| 24 | 
            -
            * Added support for ColorInput (:as => :color) in Rails 4 (#1039)
         | 
| 25 | 
            -
             | 
| 26 | 
            -
            See 2.3-stable branch for earlier releases
         | 
| 16 | 
            +
            See 2.3-stable branch for 2.3.x and earlier releases
         | 
| 27 17 | 
             
            https://github.com/justinfrench/formtastic/blob/2.3-stable/CHANGELOG
         | 
    
        data/DEPRECATIONS
    ADDED
    
    | @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            This document is for tracking deprecations and removals of 
         | 
| 2 | 
            +
            Formtastic features and compatibilities.
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            v4.0 (planned)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            * Remove support for Rails < 4.1
         | 
| 7 | 
            +
            * Remove support for country_select 1.x syntax (they want to remove it in 3.0)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            v3.1 (master)
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            * Deprecate support for Rails < 4.1
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            v3.0
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            * Remove support for Ruby version < 1.9.3
         | 
| 16 | 
            +
            * Remove support for Rails version < 3.2.13
         | 
| 17 | 
            +
            * Remove deprecated option :value (#1025)
         | 
| 18 | 
            +
            * Remove deprecated option :hint_class (#1025)
         | 
| 19 | 
            +
            * Remove deprecated option :error_class (#1025)
         | 
| 20 | 
            +
            * Remove deprecated option :group_by (#1025)
         | 
| 21 | 
            +
            * Remove deprecated option :group_label (#1025)
         | 
| 22 | 
            +
            * Remove deprecated option :find_options (#1025)
         | 
| 23 | 
            +
            * Deprecate support for Rails < 4.0.4
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            v2.3
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            * Remove deprecated date, time and datetime inputs
         | 
| 28 | 
            +
            * Deprecate :error_class option
         | 
| 29 | 
            +
            * Deprecate support for Rails < 3.2.13
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            v2.2
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            * Remove deprecated buttons DSL, ButtonHelper and commit_button helper
         | 
| 34 | 
            +
            * Deprecate :value option
         | 
| 35 | 
            +
            * Deprecate :hint_class option
         | 
| 36 | 
            +
            * Deprecate :error_class option
         | 
| 37 | 
            +
            * Deprecate :group_by and :group_label options
         | 
| 38 | 
            +
            * Deprecate :find_options option
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            v2.1
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            * Remove the previously deprecated :label_method, :value_method & :group_label_method options
         | 
| 43 | 
            +
            * Remove the previously deprecated :as => :numeric
         | 
| 44 | 
            +
            * Remove the previously deprecated inline_errors_for and related methods
         | 
| 45 | 
            +
            * Remove the previously deprecated SemanticFormHelper and SemanticFormBuilder
         | 
| 46 | 
            +
            * Deprecate the Buttons DSL (f.buttons, f.commit_button) in favor of the new Actions DSL — see above
         | 
| 47 | 
            +
             | 
    
        data/README.textile
    CHANGED
    
    | @@ -20,9 +20,10 @@ h2. Documentation & Support | |
| 20 20 |  | 
| 21 21 | 
             
            h2. Compatibility
         | 
| 22 22 |  | 
| 23 | 
            -
            * Formtastic 3 (master  | 
| 24 | 
            -
            * Formtastic  | 
| 25 | 
            -
            * Formtastic 2. | 
| 23 | 
            +
            * Formtastic 3.1 (master branch) will require Rails 4.1 minimum
         | 
| 24 | 
            +
            * Formtastic 3.0 requires Rails 3.2.13 minimum
         | 
| 25 | 
            +
            * Formtastic 2.3 deprecated Rails < 3.2.13
         | 
| 26 | 
            +
            * Formtastic 2.1, 2.2 & 2.3 are Rails 3.x–4.1.x compatible
         | 
| 26 27 | 
             
            * Formtastic, much like Rails, is very ActiveRecord-centric. Many are successfully using other ActiveModel-like ORMs and objects (DataMapper, MongoMapper, Mongoid, Authlogic, Devise...) but we're not guaranteeing full compatibility at this stage. Patches are welcome!
         | 
| 27 28 |  | 
| 28 29 |  | 
| @@ -93,7 +94,7 @@ h2. Installation | |
| 93 94 | 
             
            Simply add Formtastic to your Gemfile and bundle it up:
         | 
| 94 95 |  | 
| 95 96 | 
             
            <pre>
         | 
| 96 | 
            -
              gem 'formtastic'
         | 
| 97 | 
            +
              gem 'formtastic', '~> 3.0'
         | 
| 97 98 | 
             
            </pre>
         | 
| 98 99 |  | 
| 99 100 | 
             
            Run the installation generator:
         | 
| @@ -315,6 +316,7 @@ Many inputs provide a collection of options to choose from (like @:select@, @:ra | |
| 315 316 | 
             
              f.input :author,  :as => :radio,       :collection => ["Justin", "Kate", "Amelia", "Gus", "Meg"]
         | 
| 316 317 | 
             
              f.input :admin,   :as => :radio,       :collection => ["Yes!", "No"]
         | 
| 317 318 | 
             
              f.input :book_id, :as => :select,      :collection => Hash[Book.all.map{|b| [b.name,b.id]}]
         | 
| 319 | 
            +
              f.input :fav_book,:as => :datalist   , :collection => Book.pluck(:name)
         | 
| 318 320 | 
             
            </pre>
         | 
| 319 321 |  | 
| 320 322 |  | 
| @@ -342,6 +344,7 @@ The Formtastic input types: | |
| 342 344 | 
             
            * @:search@ - a text field (just like string). Default for columns with name matching @"search"@. New in HTML5. Works on Safari.
         | 
| 343 345 | 
             
            * @:hidden@ - a hidden field. Creates a hidden field (added for compatibility).
         | 
| 344 346 | 
             
            * @:range@ - a slider field.
         | 
| 347 | 
            +
            * @:datalist@ - a text field with a accompanying "datalist tag":https://developer.mozilla.org/en/docs/Web/HTML/Element/datalist which provides options for autocompletion
         | 
| 345 348 |  | 
| 346 349 | 
             
            The comments in the code are pretty good for each of these (what it does, what the output is, what the options are, etc.) so go check it out.
         | 
| 347 350 |  | 
| @@ -516,6 +519,8 @@ For more flexible forms; Formtastic finds translations using a bottom-up approac | |
| 516 519 |  | 
| 517 520 | 
             
            Values for @labels@/@hints@/@actions@ are can take values: @String@ (explicit value), @Symbol@ (i18n-lookup-key relative to the current "type", e.g. actions:), @true@ (force I18n lookup), @false@ (force no I18n lookup). Titles (legends) can only take: @String@ and @Symbol@ - true/false have no meaning.
         | 
| 518 521 |  | 
| 522 | 
            +
            *7. Basic Translations*
         | 
| 523 | 
            +
            If you want some basic translations, take a look on the "formtastic_i18n gem":https://github.com/timoschilling/formtastic_i18n.
         | 
| 519 524 |  | 
| 520 525 | 
             
            h2. Semantic errors
         | 
| 521 526 |  | 
    
        data/formtastic.gemspec
    CHANGED
    
    | @@ -27,7 +27,7 @@ Gem::Specification.new do |s| | |
| 27 27 |  | 
| 28 28 | 
             
              s.add_dependency(%q<actionpack>, [">= 3.2.13"])
         | 
| 29 29 |  | 
| 30 | 
            -
              s.add_development_dependency(%q<nokogiri | 
| 30 | 
            +
              s.add_development_dependency(%q<nokogiri>) 
         | 
| 31 31 | 
             
              s.add_development_dependency(%q<rspec-rails>, ["~> 2.14"])
         | 
| 32 32 | 
             
              s.add_development_dependency(%q<rspec_tag_matchers>, ["~> 1.0"])
         | 
| 33 33 | 
             
              s.add_development_dependency(%q<hpricot>, ["~> 0.8.3"])
         | 
| @@ -35,8 +35,8 @@ Gem::Specification.new do |s| | |
| 35 35 | 
             
              s.add_development_dependency(%q<yard>, ["~> 0.6"])
         | 
| 36 36 | 
             
              s.add_development_dependency(%q<colored>, ["~> 1.2"])
         | 
| 37 37 | 
             
              s.add_development_dependency(%q<tzinfo>)
         | 
| 38 | 
            -
              s.add_development_dependency(%q<ammeter>, [" | 
| 38 | 
            +
              s.add_development_dependency(%q<ammeter>, ["1.1.1"])
         | 
| 39 39 | 
             
              s.add_development_dependency(%q<appraisal>, ["~> 1.0"])
         | 
| 40 | 
            -
              s.add_development_dependency(%q<rake | 
| 40 | 
            +
              s.add_development_dependency(%q<rake>)
         | 
| 41 41 | 
             
              s.add_development_dependency(%q<activemodel>, [">= 3.2.13"])
         | 
| 42 42 | 
             
            end
         | 
    
        data/lib/formtastic.rb
    CHANGED
    
    | @@ -13,25 +13,31 @@ module Formtastic | |
| 13 13 | 
             
              autoload :LocalizedString
         | 
| 14 14 | 
             
              autoload :Localizer
         | 
| 15 15 | 
             
              autoload :Util
         | 
| 16 | 
            -
              
         | 
| 16 | 
            +
              autoload :NamespacedClassFinder
         | 
| 17 | 
            +
              autoload :InputClassFinder
         | 
| 18 | 
            +
              autoload :ActionClassFinder
         | 
| 19 | 
            +
              autoload :Deprecation
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              # @private
         | 
| 22 | 
            +
              mattr_accessor :deprecation
         | 
| 23 | 
            +
              self.deprecation = Formtastic::Deprecation.new('4.0', 'Formtastic')
         | 
| 24 | 
            +
             | 
| 17 25 | 
             
              if defined?(::Rails) && Util.deprecated_version_of_rails?
         | 
| 18 | 
            -
                 | 
| 19 | 
            -
                  "Support for Rails < 4.0.4 will be dropped from Formtastic 4.0",
         | 
| 20 | 
            -
                  caller)
         | 
| 26 | 
            +
                deprecation.warn("Support for Rails < 4.0.4 will be dropped ")
         | 
| 21 27 | 
             
              end
         | 
| 22 28 |  | 
| 23 29 | 
             
              # @private
         | 
| 24 30 | 
             
              class UnknownInputError < NameError
         | 
| 25 31 | 
             
              end
         | 
| 26 | 
            -
             | 
| 32 | 
            +
             | 
| 27 33 | 
             
              # @private
         | 
| 28 34 | 
             
              class UnknownActionError < NameError
         | 
| 29 35 | 
             
              end
         | 
| 30 | 
            -
             | 
| 36 | 
            +
             | 
| 31 37 | 
             
              # @private
         | 
| 32 38 | 
             
              class PolymorphicInputWithoutCollectionError < ArgumentError
         | 
| 33 39 | 
             
              end
         | 
| 34 | 
            -
             | 
| 40 | 
            +
             | 
| 35 41 | 
             
              # @private
         | 
| 36 42 | 
             
              class UnsupportedMethodForAction < ArgumentError
         | 
| 37 43 | 
             
              end
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            module Formtastic
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              # Uses the +NamespacedClassFinder+ to look up action class names.
         | 
| 4 | 
            +
              #
         | 
| 5 | 
            +
              # See +Formtastic::Helpers::ActionHelper#namespaced_action_class+ for details.
         | 
| 6 | 
            +
              #
         | 
| 7 | 
            +
              class ActionClassFinder < NamespacedClassFinder
         | 
| 8 | 
            +
                def initialize(builder)
         | 
| 9 | 
            +
                  super builder.action_namespaces
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                private
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def class_name(as)
         | 
| 15 | 
            +
                  "#{super}Action"
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            require 'active_support/deprecation'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # TODO: remove this branch and file when support for rails 3.2 is dropped
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Formtastic
         | 
| 6 | 
            +
              if ActiveSupport::Deprecation.respond_to?(:new)
         | 
| 7 | 
            +
                Deprecation = ActiveSupport::Deprecation
         | 
| 8 | 
            +
              else
         | 
| 9 | 
            +
                require 'forwardable'
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                class Deprecation
         | 
| 12 | 
            +
                  mattr_accessor :deprecation
         | 
| 13 | 
            +
                  self.deprecation = ActiveSupport::Deprecation.dup
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  extend Forwardable
         | 
| 16 | 
            +
                  methods = deprecation.methods - deprecation.class.methods
         | 
| 17 | 
            +
                  def_delegators :deprecation, *methods
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def initialize(version, _library)
         | 
| 20 | 
            +
                    deprecation.silenced = false
         | 
| 21 | 
            +
                    deprecation.deprecation_horizon = version
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil)
         | 
| 25 | 
            +
                    caller_backtrace ||= caller(2)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    deprecated_method_warning(deprecated_method_name, message).tap do |msg|
         | 
| 28 | 
            +
                      warn(msg, caller_backtrace)
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  def deprecated_method_warning(method_name, message = nil)
         | 
| 33 | 
            +
                    warning = "#{method_name} is deprecated and will be removed from Formtastic #{deprecation_horizon}"
         | 
| 34 | 
            +
                    case message
         | 
| 35 | 
            +
                      when Symbol then "#{warning} (use #{message} instead)"
         | 
| 36 | 
            +
                      when String then "#{warning} (#{message})"
         | 
| 37 | 
            +
                      else warning
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| @@ -31,6 +31,12 @@ module Formtastic | |
| 31 31 | 
             
                configure :default_hint_class, 'inline-hints'
         | 
| 32 32 | 
             
                configure :use_required_attribute, false
         | 
| 33 33 | 
             
                configure :perform_browser_validations, false
         | 
| 34 | 
            +
                configure :input_namespaces, [::Object, ::Formtastic::Inputs]
         | 
| 35 | 
            +
                # TODO: enable this as default in 4.0 and remove it from configuration generator template
         | 
| 36 | 
            +
                configure :input_class_finder #, Formtastic::InputClassFinder
         | 
| 37 | 
            +
                configure :action_namespaces, [::Object, ::Formtastic::Actions]
         | 
| 38 | 
            +
                # TODO: enable this as default in 4.0 and remove it from configuration generator template
         | 
| 39 | 
            +
                configure :action_class_finder#, Formtastic::ActionClassFinder
         | 
| 34 40 |  | 
| 35 41 | 
             
                attr_reader :template
         | 
| 36 42 |  | 
| @@ -43,8 +49,8 @@ module Formtastic | |
| 43 49 | 
             
                include Formtastic::Helpers::ActionHelper
         | 
| 44 50 | 
             
                include Formtastic::Helpers::ActionsHelper
         | 
| 45 51 | 
             
                include Formtastic::Helpers::ErrorsHelper
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                # This is a wrapper around Rails' `ActionView::Helpers::FormBuilder#fields_for`, originally | 
| 52 | 
            +
             | 
| 53 | 
            +
                # This is a wrapper around Rails' `ActionView::Helpers::FormBuilder#fields_for`, originally
         | 
| 48 54 | 
             
                # provided to ensure that the `:builder` from `semantic_form_for` was passed down into
         | 
| 49 55 | 
             
                # the nested `fields_for`. Rails 3 no longer requires us to do this, so this method is
         | 
| 50 56 | 
             
                # provided purely for backwards compatibility and DSL consistency.
         | 
| @@ -76,11 +82,11 @@ module Formtastic | |
| 76 82 | 
             
                  # Add a :parent_builder to the args so that nested translations can be possible in Rails 3
         | 
| 77 83 | 
             
                  options = args.extract_options!
         | 
| 78 84 | 
             
                  options[:parent_builder] ||= self
         | 
| 79 | 
            -
             | 
| 85 | 
            +
             | 
| 80 86 | 
             
                  # Wrap the Rails helper
         | 
| 81 87 | 
             
                  fields_for(record_or_name_or_array, *(args << options), &block)
         | 
| 82 88 | 
             
                end
         | 
| 83 | 
            -
             | 
| 89 | 
            +
             | 
| 84 90 | 
             
                def initialize(object_name, object, template, options, block=nil)
         | 
| 85 91 | 
             
                  # rails 3 supported passing in the block parameter to FormBuilder
         | 
| 86 92 | 
             
                  # rails 4.0 deprecated the block parameter and does nothing with it
         | 
| @@ -90,12 +96,12 @@ module Formtastic | |
| 90 96 | 
             
                  else # Must be rails4_1 or greater
         | 
| 91 97 | 
             
                    super object_name, object, template, options
         | 
| 92 98 | 
             
                  end
         | 
| 93 | 
            -
             | 
| 99 | 
            +
             | 
| 94 100 | 
             
                  if respond_to?('multipart=') && options.is_a?(Hash) && options[:html]
         | 
| 95 101 | 
             
                    self.multipart = options[:html][:multipart]
         | 
| 96 102 | 
             
                  end
         | 
| 97 103 | 
             
                end
         | 
| 98 | 
            -
             | 
| 104 | 
            +
             | 
| 99 105 | 
             
              end
         | 
| 100 106 |  | 
| 101 107 | 
             
            end
         | 
| @@ -2,7 +2,9 @@ | |
| 2 2 | 
             
            module Formtastic
         | 
| 3 3 | 
             
              module Helpers
         | 
| 4 4 | 
             
                module ActionHelper
         | 
| 5 | 
            -
                  
         | 
| 5 | 
            +
                  ACTION_CLASS_DEPRECATION = 'configure Formtastic::FormBuilder.action_class_finder instead'.freeze
         | 
| 6 | 
            +
                  private_constant(:ACTION_CLASS_DEPRECATION)
         | 
| 7 | 
            +
             | 
| 6 8 | 
             
                  # Renders an action for the form (such as a subit/reset button, or a cancel link).
         | 
| 7 9 | 
             
                  #
         | 
| 8 10 | 
             
                  # Each action is wrapped in an `<li class="action">` tag with other classes added based on the
         | 
| @@ -23,9 +25,9 @@ module Formtastic | |
| 23 25 | 
             
                  #         reset: "Reset form"
         | 
| 24 26 | 
             
                  #         submit: "Submit"
         | 
| 25 27 | 
             
                  #
         | 
| 26 | 
            -
                  # For forms with an object present, the `update` key will be used if calling `persisted?` on | 
| 27 | 
            -
                  # the object returns true (saving changes to a record), otherwise the `create`  | 
| 28 | 
            -
                  # used. The `submit` key is used as a fallback when there is no object or we cannot determine | 
| 28 | 
            +
                  # For forms with an object present, the `update` key will be used if calling `persisted?` on
         | 
| 29 | 
            +
                  # the object returns true (saving changes to a record), otherwise the `create` key will be
         | 
| 30 | 
            +
                  # used. The `submit` key is used as a fallback when there is no object or we cannot determine
         | 
| 29 31 | 
             
                  # if `create` or `update` is appropriate.
         | 
| 30 32 | 
             
                  #
         | 
| 31 33 | 
             
                  # @example Basic usage
         | 
| @@ -90,12 +92,35 @@ module Formtastic | |
| 90 92 | 
             
                  def default_action_type(method, options = {}) #:nodoc:
         | 
| 91 93 | 
             
                    case method
         | 
| 92 94 | 
             
                      when :submit then :input
         | 
| 93 | 
            -
                      when :reset | 
| 95 | 
            +
                      when :reset  then :input
         | 
| 94 96 | 
             
                      when :cancel then :link
         | 
| 97 | 
            +
                      else method
         | 
| 95 98 | 
             
                    end
         | 
| 96 99 | 
             
                  end
         | 
| 97 100 |  | 
| 101 | 
            +
                  # Takes the `:as` option and attempts to return the corresponding action
         | 
| 102 | 
            +
                  # class. In the case of `:as => :awesome` it will first attempt to find a
         | 
| 103 | 
            +
                  # top level `AwesomeAction` class (to allow the application to subclass
         | 
| 104 | 
            +
                  # and modify to suit), falling back to `Formtastic::Actions::AwesomeAction`.
         | 
| 105 | 
            +
                  #
         | 
| 106 | 
            +
                  # Custom action namespaces to look into can be configured via the
         | 
| 107 | 
            +
                  # .action_namespaces +FormBuilder+ configuration setting.
         | 
| 108 | 
            +
                  # See +Formtastic::Helpers::InputHelper#namespaced_input_class+ for details.
         | 
| 109 | 
            +
                  #
         | 
| 110 | 
            +
                  def namespaced_action_class(as)
         | 
| 111 | 
            +
                    @action_class_finder ||= action_class_finder.new(self)
         | 
| 112 | 
            +
                    @action_class_finder.find(as)
         | 
| 113 | 
            +
                  rescue Formtastic::ActionClassFinder::NotFoundError => e
         | 
| 114 | 
            +
                    raise Formtastic::UnknownActionError, "Unable to find action #{e.message}"
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                  # @api private
         | 
| 118 | 
            +
                  # @deprecated Use {#namespaced_action_class} instead.
         | 
| 98 119 | 
             
                  def action_class(as)
         | 
| 120 | 
            +
                    return namespaced_action_class(as) if action_class_finder
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                    action_class_deprecation_warning(__method__)
         | 
| 123 | 
            +
             | 
| 99 124 | 
             
                    @input_classes_cache ||= {}
         | 
| 100 125 | 
             
                    @input_classes_cache[as] ||= begin
         | 
| 101 126 | 
             
                      begin
         | 
| @@ -105,21 +130,33 @@ module Formtastic | |
| 105 130 | 
             
                          standard_action_class_name(as).constantize
         | 
| 106 131 | 
             
                        end
         | 
| 107 132 | 
             
                      rescue NameError
         | 
| 108 | 
            -
                        raise Formtastic::UnknownActionError
         | 
| 133 | 
            +
                        raise Formtastic::UnknownActionError, "Unable to find action #{as}"
         | 
| 109 134 | 
             
                      end
         | 
| 110 135 | 
             
                    end
         | 
| 111 136 | 
             
                  end
         | 
| 112 137 |  | 
| 138 | 
            +
                  # @api private
         | 
| 139 | 
            +
                  # @deprecated Use {Formtastic::ActionClassFinder#class_name} instead.
         | 
| 113 140 | 
             
                  # :as => :button # => ButtonAction
         | 
| 114 141 | 
             
                  def custom_action_class_name(as)
         | 
| 142 | 
            +
                    action_class_deprecation_warning(__method__)
         | 
| 115 143 | 
             
                    "#{as.to_s.camelize}Action"
         | 
| 116 144 | 
             
                  end
         | 
| 117 145 |  | 
| 146 | 
            +
                  # @api private
         | 
| 147 | 
            +
                  # @deprecated Use {Formtastic::ActionClassFinder#class_name} instead.
         | 
| 118 148 | 
             
                  # :as => :button # => Formtastic::Actions::ButtonAction
         | 
| 119 149 | 
             
                  def standard_action_class_name(as)
         | 
| 150 | 
            +
                    action_class_deprecation_warning(__method__)
         | 
| 120 151 | 
             
                    "Formtastic::Actions::#{as.to_s.camelize}Action"
         | 
| 121 152 | 
             
                  end
         | 
| 122 153 |  | 
| 154 | 
            +
                  private
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  def action_class_deprecation_warning(method)
         | 
| 157 | 
            +
                    @action_class_deprecation_warned ||=
         | 
| 158 | 
            +
                        Formtastic.deprecation.deprecation_warning(method, ACTION_CLASS_DEPRECATION, caller(2))
         | 
| 159 | 
            +
                  end
         | 
| 123 160 | 
             
                end
         | 
| 124 161 | 
             
              end
         | 
| 125 162 | 
             
            end
         | 
| @@ -155,7 +155,7 @@ module Formtastic | |
| 155 155 | 
             
                    options[:builder] ||= @@builder
         | 
| 156 156 | 
             
                    options[:html] ||= {}
         | 
| 157 157 | 
             
                    options[:html][:novalidate] = !@@builder.perform_browser_validations unless options[:html].key?(:novalidate)
         | 
| 158 | 
            -
                     | 
| 158 | 
            +
                    options[:custom_namespace] = options.delete(:namespace)
         | 
| 159 159 |  | 
| 160 160 | 
             
                    singularizer = defined?(ActiveModel::Naming.singular) ? ActiveModel::Naming.method(:singular) : ActionController::RecordIdentifier.method(:singular_class_name)
         | 
| 161 161 |  | 
| @@ -182,7 +182,7 @@ module Formtastic | |
| 182 182 | 
             
                  def semantic_fields_for(record_name, record_object = nil, options = {}, &block)
         | 
| 183 183 | 
             
                    options, record_object = record_object, nil if record_object.is_a?(Hash) && record_object.extractable_options?
         | 
| 184 184 | 
             
                    options[:builder] ||= @@builder
         | 
| 185 | 
            -
                     | 
| 185 | 
            +
                    options[:custom_namespace] = options.delete(:namespace)
         | 
| 186 186 |  | 
| 187 187 | 
             
                    with_custom_field_error_proc do
         | 
| 188 188 | 
             
                      self.fields_for(record_name, record_object, options, &block)
         |