wallaby 5.1.3 → 5.1.4
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.
- checksums.yaml +4 -4
- data/app/controllers/wallaby/abstract_resources_controller.rb +8 -8
- data/app/controllers/wallaby/application_controller.rb +10 -6
- data/config/locales/wallaby.en.yml +5 -0
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder.rb +2 -4
- data/lib/adaptors/wallaby/active_record/model_decorator.rb +1 -2
- data/lib/adaptors/wallaby/active_record/model_service_provider/normalizer.rb +3 -3
- data/lib/adaptors/wallaby/active_record/model_service_provider/querier.rb +27 -8
- data/lib/adaptors/wallaby/active_record/model_service_provider.rb +1 -3
- data/lib/errors/wallaby/invalid_error.rb +1 -1
- data/lib/errors/wallaby/unprocessable_entity.rb +4 -0
- data/lib/helpers/wallaby/secure_helper.rb +18 -16
- data/lib/helpers/wallaby/styling_helper.rb +2 -2
- data/lib/interfaces/wallaby/model_decorator/field_helpers.rb +70 -0
- data/lib/interfaces/wallaby/model_decorator.rb +0 -60
- data/lib/services/wallaby/map/model_class_mapper.rb +10 -4
- data/lib/services/wallaby/map.rb +1 -1
- data/lib/services/wallaby/sorting/link_builder.rb +3 -3
- data/lib/wallaby/configuration/security.rb +3 -2
- data/lib/wallaby/engine.rb +2 -0
- data/lib/wallaby/version.rb +1 -1
- data/lib/wallaby.rb +2 -0
- metadata +7 -6
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: '09976f4239802ee3dc2eb137068c2f6289f0cf7a'
         | 
| 4 | 
            +
              data.tar.gz: 724958b07b53194c30c6ccc9bf314791ae0c894e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 2c83059d14238fa032b1a41d44b2809cbbb5b27613335498e8f550296d974a4168697a6b7952f12f6424b7ebbf04f479184911e2c417cc2cbb65c7fc8f2cb914
         | 
| 7 | 
            +
              data.tar.gz: 147288bc92b01a8b9a8f98ce3d9f134e57dca63a1fafea891bb0916b6b79d3449cc3d8ac0d9cd3578871fd51d0a6ecb224a167835dd580d8a6dab2fc79984d9a
         | 
| @@ -286,11 +286,9 @@ module Wallaby | |
| 286 286 | 
             
                # given, or requesting HTML response
         | 
| 287 287 | 
             
                # @see Wallaby::ModelServicer#paginate
         | 
| 288 288 | 
             
                def paginate(query)
         | 
| 289 | 
            -
                   | 
| 290 | 
            -
                     | 
| 291 | 
            -
                   | 
| 292 | 
            -
                    query
         | 
| 293 | 
            -
                  end
         | 
| 289 | 
            +
                  paginatable =
         | 
| 290 | 
            +
                    params[:page] || params[:per] || request.format.symbol == :html
         | 
| 291 | 
            +
                  paginatable ? current_model_service.paginate(query, params) : query
         | 
| 294 292 | 
             
                end
         | 
| 295 293 |  | 
| 296 294 | 
             
                # To whitelist the params for CRUD actions
         | 
| @@ -311,12 +309,14 @@ module Wallaby | |
| 311 309 |  | 
| 312 310 | 
             
                # @return either persisted or unpersisted resource instance
         | 
| 313 311 | 
             
                def resource
         | 
| 314 | 
            -
                  @resource ||=
         | 
| 312 | 
            +
                  @resource ||= begin
         | 
| 313 | 
            +
                    whitelisted = action_name.in?(SAVE_ACTIONS) ? resource_params : {}
         | 
| 315 314 | 
             
                    if resource_id.present?
         | 
| 316 | 
            -
                      current_model_service.find resource_id,  | 
| 315 | 
            +
                      current_model_service.find resource_id, whitelisted
         | 
| 317 316 | 
             
                    else
         | 
| 318 | 
            -
                      current_model_service.new  | 
| 317 | 
            +
                      current_model_service.new whitelisted
         | 
| 319 318 | 
             
                    end
         | 
| 319 | 
            +
                  end
         | 
| 320 320 | 
             
                end
         | 
| 321 321 |  | 
| 322 322 | 
             
                # Get current model decorator so that we could retrive metadata for given
         | 
| @@ -8,12 +8,10 @@ module Wallaby | |
| 8 8 |  | 
| 9 9 | 
             
                ERROR_PATH = ERROR_LAYOUT = 'wallaby/error'.freeze
         | 
| 10 10 |  | 
| 11 | 
            -
                 | 
| 12 | 
            -
                 | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                  rescue_from ::ActiveRecord::StatementInvalid, with: :unprocessable_entity
         | 
| 16 | 
            -
                end
         | 
| 11 | 
            +
                rescue_from NotFound, with: :not_found
         | 
| 12 | 
            +
                rescue_from ::ActionController::ParameterMissing, with: :bad_request
         | 
| 13 | 
            +
                rescue_from ::ActiveRecord::StatementInvalid, with: :unprocessable_entity
         | 
| 14 | 
            +
                rescue_from UnprocessableEntity, with: :unprocessable_entity
         | 
| 17 15 |  | 
| 18 16 | 
             
                layout 'wallaby/application'
         | 
| 19 17 |  | 
| @@ -34,6 +32,12 @@ module Wallaby | |
| 34 32 |  | 
| 35 33 | 
             
                protected
         | 
| 36 34 |  | 
| 35 | 
            +
                # @see https://github.com/rails/rails/blob/5-0-stable/actionpack/lib/action_controller/metal/helpers.rb#L118
         | 
| 36 | 
            +
                # `helpers` exists since Rails 5, need to replicate this for Rails 4.2
         | 
| 37 | 
            +
                def helpers
         | 
| 38 | 
            +
                  @helpers ||= defined?(super) ? super : view_context
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 37 41 | 
             
                def configuration
         | 
| 38 42 | 
             
                  ::Wallaby.configuration
         | 
| 39 43 | 
             
                end
         | 
| @@ -24,6 +24,8 @@ en: | |
| 24 24 | 
             
                count: 'Count: '
         | 
| 25 25 | 
             
                auto_select_hint: 'Type to select...'
         | 
| 26 26 | 
             
                upload: 'Upload'
         | 
| 27 | 
            +
                empty: 'null'
         | 
| 28 | 
            +
                na: 'n/a'
         | 
| 27 29 |  | 
| 28 30 | 
             
              buttons:
         | 
| 29 31 | 
             
                save: 'Save'
         | 
| @@ -60,6 +62,9 @@ en: | |
| 60 62 | 
             
                  collection: 'Records could not be found. Click + button to add one.'
         | 
| 61 63 | 
             
                  model: 'Model %{model} could not be found.'
         | 
| 62 64 | 
             
                  resource: 'Record %{resource} could not be found.'
         | 
| 65 | 
            +
                unprocessable_entity:
         | 
| 66 | 
            +
                  keyword_search: 'Unable to perform keyword search when no text fields can be used.'
         | 
| 67 | 
            +
                  field_colon_search: 'Unable to perform field colon search for %{invalid_fields}.'
         | 
| 63 68 |  | 
| 64 69 | 
             
              pagination:
         | 
| 65 70 | 
             
                prev: 'Prev'
         | 
| @@ -12,8 +12,7 @@ module Wallaby | |
| 12 12 | 
             
                        metadata = {
         | 
| 13 13 | 
             
                          name: column.name,
         | 
| 14 14 | 
             
                          type: column.type.to_s.freeze,
         | 
| 15 | 
            -
                          label: @model_class.human_attribute_name(column.name) | 
| 16 | 
            -
                          is_origin: true
         | 
| 15 | 
            +
                          label: @model_class.human_attribute_name(column.name)
         | 
| 17 16 | 
             
                        }
         | 
| 18 17 | 
             
                        sti_builder.update(metadata, column)
         | 
| 19 18 | 
             
                        fields[column.name] = metadata
         | 
| @@ -24,8 +23,7 @@ module Wallaby | |
| 24 23 | 
             
                      @model_class.reflections.each_with_object({}) do |(name, ref), fields|
         | 
| 25 24 | 
             
                        metadata = {
         | 
| 26 25 | 
             
                          name: name, type: ref.macro.to_s,
         | 
| 27 | 
            -
                          label: @model_class.human_attribute_name(name) | 
| 28 | 
            -
                          is_origin: true
         | 
| 26 | 
            +
                          label: @model_class.human_attribute_name(name)
         | 
| 29 27 | 
             
                        }
         | 
| 30 28 | 
             
                        association_builder.update(metadata, ref)
         | 
| 31 29 | 
             
                        polymorphic_builder.update(metadata, ref)
         | 
| @@ -15,13 +15,12 @@ module Wallaby | |
| 15 15 | 
             
                  #   example:
         | 
| 16 16 | 
             
                  #     {
         | 
| 17 17 | 
             
                  #       # general field
         | 
| 18 | 
            -
                  #       id: { name: 'id', type: 'integer', label: 'Id' | 
| 18 | 
            +
                  #       id: { name: 'id', type: 'integer', label: 'Id' },
         | 
| 19 19 | 
             
                  #       # association field
         | 
| 20 20 | 
             
                  #       category: {
         | 
| 21 21 | 
             
                  #         'name' => 'category',
         | 
| 22 22 | 
             
                  #         'type' => 'belongs_to',
         | 
| 23 23 | 
             
                  #         'label' => 'Category',
         | 
| 24 | 
            -
                  #         'is_origin' => true,
         | 
| 25 24 | 
             
                  #         'is_association' => true,
         | 
| 26 25 | 
             
                  #         'is_through' => false,
         | 
| 27 26 | 
             
                  #         'has_scope' => false,
         | 
| @@ -9,10 +9,10 @@ module Wallaby | |
| 9 9 |  | 
| 10 10 | 
             
                    def normalize(params)
         | 
| 11 11 | 
             
                      params.each do |field_name, values|
         | 
| 12 | 
            -
                         | 
| 13 | 
            -
             | 
| 12 | 
            +
                        type = @model_decorator.metadata_of(field_name)[:type]
         | 
| 13 | 
            +
                                               .try(:[], /range|point|binary/)
         | 
| 14 14 | 
             
                        next unless type
         | 
| 15 | 
            -
                         | 
| 15 | 
            +
                        public_send "normalize_#{type}_values", params, field_name, values
         | 
| 16 16 | 
             
                      end
         | 
| 17 17 | 
             
                    end
         | 
| 18 18 |  | 
| @@ -3,7 +3,7 @@ module Wallaby | |
| 3 3 | 
             
                class ModelServiceProvider
         | 
| 4 4 | 
             
                  # Query builder
         | 
| 5 5 | 
             
                  class Querier
         | 
| 6 | 
            -
                    TEXT_FIELDS = %w(string text citext).freeze
         | 
| 6 | 
            +
                    TEXT_FIELDS = %w(string text citext longtext tinytext mediumtext).freeze
         | 
| 7 7 |  | 
| 8 8 | 
             
                    def initialize(model_decorator)
         | 
| 9 9 | 
             
                      @model_decorator = model_decorator
         | 
| @@ -68,7 +68,7 @@ module Wallaby | |
| 68 68 | 
             
                    end
         | 
| 69 69 |  | 
| 70 70 | 
             
                    def text_search(keywords, query = nil)
         | 
| 71 | 
            -
                      return query  | 
| 71 | 
            +
                      return query unless keywords_check? keywords
         | 
| 72 72 | 
             
                      text_fields.each do |field_name|
         | 
| 73 73 | 
             
                        sub_query = nil
         | 
| 74 74 | 
             
                        keywords.each do |keyword|
         | 
| @@ -81,8 +81,8 @@ module Wallaby | |
| 81 81 | 
             
                    end
         | 
| 82 82 |  | 
| 83 83 | 
             
                    def field_search(field_queries, query)
         | 
| 84 | 
            +
                      return query unless field_check? field_queries
         | 
| 84 85 | 
             
                      field_queries.each do |exp|
         | 
| 85 | 
            -
                        next unless @model_decorator.fields[exp[:left]]
         | 
| 86 86 | 
             
                        sub_query = table[exp[:left]].public_send(exp[:op], exp[:right])
         | 
| 87 87 | 
             
                        query = query.try(:and, sub_query) || sub_query
         | 
| 88 88 | 
             
                      end
         | 
| @@ -90,11 +90,30 @@ module Wallaby | |
| 90 90 | 
             
                    end
         | 
| 91 91 |  | 
| 92 92 | 
             
                    def text_fields
         | 
| 93 | 
            -
                       | 
| 94 | 
            -
             | 
| 95 | 
            -
                         | 
| 96 | 
            -
                           | 
| 97 | 
            -
             | 
| 93 | 
            +
                      @text_fields ||= begin
         | 
| 94 | 
            +
                        index_field_names = @model_decorator.index_field_names.map(&:to_s)
         | 
| 95 | 
            +
                        @model_decorator.fields.select do |field_name, metadata|
         | 
| 96 | 
            +
                          index_field_names.include?(field_name) &&
         | 
| 97 | 
            +
                            TEXT_FIELDS.include?(metadata[:type].to_s)
         | 
| 98 | 
            +
                        end.keys
         | 
| 99 | 
            +
                      end
         | 
| 100 | 
            +
                    end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                    def keywords_check?(keywords)
         | 
| 103 | 
            +
                      return false if keywords.blank?
         | 
| 104 | 
            +
                      return true if text_fields.present?
         | 
| 105 | 
            +
                      message = I18n.t 'errors.unprocessable_entity.keyword_search'
         | 
| 106 | 
            +
                      raise UnprocessableEntity, message
         | 
| 107 | 
            +
                    end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                    def field_check?(field_queries)
         | 
| 110 | 
            +
                      return false if field_queries.blank?
         | 
| 111 | 
            +
                      fields = field_queries.map { |exp| exp[:left] }
         | 
| 112 | 
            +
                      invalid_fields = fields - @model_decorator.fields.keys
         | 
| 113 | 
            +
                      return true if invalid_fields.blank?
         | 
| 114 | 
            +
                      message = I18n.t 'errors.unprocessable_entity.field_colon_search',
         | 
| 115 | 
            +
                                       invalid_fields: invalid_fields.to_sentence
         | 
| 116 | 
            +
                      raise UnprocessableEntity, message
         | 
| 98 117 | 
             
                    end
         | 
| 99 118 | 
             
                  end
         | 
| 100 119 | 
             
                end
         | 
| @@ -5,9 +5,7 @@ module Wallaby | |
| 5 5 | 
             
                class ModelServiceProvider < ::Wallaby::ModelServiceProvider
         | 
| 6 6 | 
             
                  # @see Wallaby::ModelServiceProvider#permit
         | 
| 7 7 | 
             
                  def permit(params)
         | 
| 8 | 
            -
                     | 
| 9 | 
            -
                    # using fetch could avoid ActionController::ParameterMissing
         | 
| 10 | 
            -
                    params.fetch(param_key, {}).permit permitted_fields
         | 
| 8 | 
            +
                    params.require(param_key).permit permitted_fields
         | 
| 11 9 | 
             
                  end
         | 
| 12 10 |  | 
| 13 11 | 
             
                  # @see Wallaby::ModelServiceProvider#collection
         | 
| @@ -5,9 +5,11 @@ module Wallaby | |
| 5 5 | 
             
                # @param user [Object]
         | 
| 6 6 | 
             
                # @return [String] IMG or I element
         | 
| 7 7 | 
             
                def user_portrait(user = current_user)
         | 
| 8 | 
            -
                   | 
| 8 | 
            +
                  email_method = Wallaby.configuration.security.email_method || :email
         | 
| 9 | 
            +
                  email = user.respond_to?(email_method) && user.public_send(email_method)
         | 
| 10 | 
            +
                  if email.present?
         | 
| 9 11 | 
             
                    https = "http#{request.ssl? ? 's' : EMPTY_STRING}"
         | 
| 10 | 
            -
                    email_md5 = Digest::MD5.hexdigest  | 
| 12 | 
            +
                    email_md5 = ::Digest::MD5.hexdigest email.downcase
         | 
| 11 13 | 
             
                    image_source = "#{https}://www.gravatar.com/avatar/#{email_md5}"
         | 
| 12 14 | 
             
                    image_tag image_source, class: 'hidden-xs user-portrait'
         | 
| 13 15 | 
             
                  else
         | 
| @@ -20,23 +22,23 @@ module Wallaby | |
| 20 22 | 
             
                # @param app [Object]
         | 
| 21 23 | 
             
                # @return [String] HTML anchor element
         | 
| 22 24 | 
             
                def logout_path(user = current_user, app = main_app)
         | 
| 23 | 
            -
                   | 
| 24 | 
            -
                  path  | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
                      'logout_path'
         | 
| 30 | 
            -
                    end
         | 
| 31 | 
            -
                  app.public_send path if app.respond_to? path
         | 
| 25 | 
            +
                  path = Wallaby.configuration.security.logout_path
         | 
| 26 | 
            +
                  path ||= if defined? ::Devise
         | 
| 27 | 
            +
                             scope = ::Devise::Mapping.find_scope! user
         | 
| 28 | 
            +
                             "destroy_#{scope}_session_path"
         | 
| 29 | 
            +
                           end
         | 
| 30 | 
            +
                  app.public_send path if path && app.respond_to?(path)
         | 
| 32 31 | 
             
                end
         | 
| 33 32 |  | 
| 34 | 
            -
                # Logout method
         | 
| 33 | 
            +
                # Logout method for given user
         | 
| 35 34 | 
             
                # @return [String, Symbol]
         | 
| 36 | 
            -
                def logout_method
         | 
| 37 | 
            -
                   | 
| 38 | 
            -
                   | 
| 39 | 
            -
             | 
| 35 | 
            +
                def logout_method(user = current_user)
         | 
| 36 | 
            +
                  http_method = Wallaby.configuration.security.logout_method
         | 
| 37 | 
            +
                  http_method || if defined? ::Devise
         | 
| 38 | 
            +
                                   scope = ::Devise::Mapping.find_scope! user
         | 
| 39 | 
            +
                                   mapping = ::Devise.mappings[scope]
         | 
| 40 | 
            +
                                   mapping.sign_out_via
         | 
| 41 | 
            +
                                 end
         | 
| 40 42 | 
             
                end
         | 
| 41 43 | 
             
              end
         | 
| 42 44 | 
             
            end
         | 
| @@ -0,0 +1,70 @@ | |
| 1 | 
            +
            module Wallaby
         | 
| 2 | 
            +
              # @private
         | 
| 3 | 
            +
              class ModelDecorator
         | 
| 4 | 
            +
                # @private
         | 
| 5 | 
            +
                # Field helper for model decorator
         | 
| 6 | 
            +
                module FieldHelpers
         | 
| 7 | 
            +
                  # @return [Hash] metadata information for a given field
         | 
| 8 | 
            +
                  def metadata_of(field_name)
         | 
| 9 | 
            +
                    fields[field_name] || {}
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  # @return [String] label for a given field
         | 
| 13 | 
            +
                  def label_of(field_name)
         | 
| 14 | 
            +
                    metadata_of(field_name)[:label]
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  # @return [String, Symbol] type for a given field
         | 
| 18 | 
            +
                  def type_of(field_name)
         | 
| 19 | 
            +
                    validate_presence_of metadata_of(field_name)[:type]
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  # @return [Hash] index metadata information for a given field
         | 
| 23 | 
            +
                  def index_metadata_of(field_name)
         | 
| 24 | 
            +
                    index_fields[field_name] || {}
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  # @return [String] index label for a given field
         | 
| 28 | 
            +
                  def index_label_of(field_name)
         | 
| 29 | 
            +
                    index_metadata_of(field_name)[:label]
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  # @return [String, Symbol] index type for a given field
         | 
| 33 | 
            +
                  def index_type_of(field_name)
         | 
| 34 | 
            +
                    validate_presence_of index_metadata_of(field_name)[:type]
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  # @return [Hash] show metadata information for a given field
         | 
| 38 | 
            +
                  def show_metadata_of(field_name)
         | 
| 39 | 
            +
                    show_fields[field_name] || {}
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  # @return [String] show label for a given field
         | 
| 43 | 
            +
                  def show_label_of(field_name)
         | 
| 44 | 
            +
                    show_metadata_of(field_name)[:label]
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  # @return [String, Symbol] show type for a given field
         | 
| 48 | 
            +
                  def show_type_of(field_name)
         | 
| 49 | 
            +
                    validate_presence_of show_metadata_of(field_name)[:type]
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  # @return [Hash] form metadata information for a given field
         | 
| 53 | 
            +
                  def form_metadata_of(field_name)
         | 
| 54 | 
            +
                    form_fields[field_name] || {}
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  # @return [String] form label for a given field
         | 
| 58 | 
            +
                  def form_label_of(field_name)
         | 
| 59 | 
            +
                    form_metadata_of(field_name)[:label]
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  # @return [String, Symbol] form type for a given field
         | 
| 63 | 
            +
                  def form_type_of(field_name)
         | 
| 64 | 
            +
                    validate_presence_of form_metadata_of(field_name)[:type]
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                include FieldHelpers
         | 
| 69 | 
            +
              end
         | 
| 70 | 
            +
            end
         | 
| @@ -28,21 +28,6 @@ module Wallaby | |
| 28 28 | 
             
                  @field_names ||= reposition fields.keys, primary_key
         | 
| 29 29 | 
             
                end
         | 
| 30 30 |  | 
| 31 | 
            -
                # @return [Hash] metadata information for a given field
         | 
| 32 | 
            -
                def metadata_of(field_name)
         | 
| 33 | 
            -
                  fields[field_name] || {}
         | 
| 34 | 
            -
                end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                # @return [String] label for a given field
         | 
| 37 | 
            -
                def label_of(field_name)
         | 
| 38 | 
            -
                  metadata_of(field_name)[:label]
         | 
| 39 | 
            -
                end
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                # @return [String, Symbol] type for a given field
         | 
| 42 | 
            -
                def type_of(field_name)
         | 
| 43 | 
            -
                  validate_presence_of metadata_of(field_name)[:type]
         | 
| 44 | 
            -
                end
         | 
| 45 | 
            -
             | 
| 46 31 | 
             
                # @return [Hash] metadata information for all fields that would be used on
         | 
| 47 32 | 
             
                #   index page
         | 
| 48 33 | 
             
                def index_fields
         | 
| @@ -60,21 +45,6 @@ module Wallaby | |
| 60 45 | 
             
                  @index_field_names ||= reposition index_fields.keys, primary_key
         | 
| 61 46 | 
             
                end
         | 
| 62 47 |  | 
| 63 | 
            -
                # @return [Hash] index metadata information for a given field
         | 
| 64 | 
            -
                def index_metadata_of(field_name)
         | 
| 65 | 
            -
                  index_fields[field_name] || {}
         | 
| 66 | 
            -
                end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                # @return [String] index label for a given field
         | 
| 69 | 
            -
                def index_label_of(field_name)
         | 
| 70 | 
            -
                  index_metadata_of(field_name)[:label]
         | 
| 71 | 
            -
                end
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                # @return [String, Symbol] index type for a given field
         | 
| 74 | 
            -
                def index_type_of(field_name)
         | 
| 75 | 
            -
                  validate_presence_of index_metadata_of(field_name)[:type]
         | 
| 76 | 
            -
                end
         | 
| 77 | 
            -
             | 
| 78 48 | 
             
                # @return [Hash] metadata information for all fields that would be used on
         | 
| 79 49 | 
             
                #   show page
         | 
| 80 50 | 
             
                def show_fields
         | 
| @@ -92,21 +62,6 @@ module Wallaby | |
| 92 62 | 
             
                  @show_field_names ||= reposition show_fields.keys, primary_key
         | 
| 93 63 | 
             
                end
         | 
| 94 64 |  | 
| 95 | 
            -
                # @return [Hash] show metadata information for a given field
         | 
| 96 | 
            -
                def show_metadata_of(field_name)
         | 
| 97 | 
            -
                  show_fields[field_name] || {}
         | 
| 98 | 
            -
                end
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                # @return [String] show label for a given field
         | 
| 101 | 
            -
                def show_label_of(field_name)
         | 
| 102 | 
            -
                  show_metadata_of(field_name)[:label]
         | 
| 103 | 
            -
                end
         | 
| 104 | 
            -
             | 
| 105 | 
            -
                # @return [String, Symbol] show type for a given field
         | 
| 106 | 
            -
                def show_type_of(field_name)
         | 
| 107 | 
            -
                  validate_presence_of show_metadata_of(field_name)[:type]
         | 
| 108 | 
            -
                end
         | 
| 109 | 
            -
             | 
| 110 65 | 
             
                # @return [Hash] metadata information for all fields that would be used on
         | 
| 111 66 | 
             
                #   form page
         | 
| 112 67 | 
             
                def form_fields
         | 
| @@ -124,21 +79,6 @@ module Wallaby | |
| 124 79 | 
             
                  @form_field_names ||= reposition form_fields.keys, primary_key
         | 
| 125 80 | 
             
                end
         | 
| 126 81 |  | 
| 127 | 
            -
                # @return [Hash] form metadata information for a given field
         | 
| 128 | 
            -
                def form_metadata_of(field_name)
         | 
| 129 | 
            -
                  form_fields[field_name] || {}
         | 
| 130 | 
            -
                end
         | 
| 131 | 
            -
             | 
| 132 | 
            -
                # @return [String] form label for a given field
         | 
| 133 | 
            -
                def form_label_of(field_name)
         | 
| 134 | 
            -
                  form_metadata_of(field_name)[:label]
         | 
| 135 | 
            -
                end
         | 
| 136 | 
            -
             | 
| 137 | 
            -
                # @return [String, Symbol] form type for a given field
         | 
| 138 | 
            -
                def form_type_of(field_name)
         | 
| 139 | 
            -
                  validate_presence_of form_metadata_of(field_name)[:type]
         | 
| 140 | 
            -
                end
         | 
| 141 | 
            -
             | 
| 142 82 | 
             
                # @return [Hash] custom filters
         | 
| 143 83 | 
             
                def filters
         | 
| 144 84 | 
             
                  @filters ||= ::ActiveSupport::HashWithIndifferentAccess.new
         | 
| @@ -2,15 +2,17 @@ module Wallaby | |
| 2 2 | 
             
              class Map
         | 
| 3 3 | 
             
                # To map model class to a klass
         | 
| 4 4 | 
             
                class ModelClassMapper
         | 
| 5 | 
            +
                  DEFAULT_BLOCK = ->(same) { same }.freeze
         | 
| 6 | 
            +
             | 
| 5 7 | 
             
                  def initialize(base_class)
         | 
| 6 8 | 
             
                    @base_class = base_class
         | 
| 7 9 | 
             
                  end
         | 
| 8 10 |  | 
| 9 | 
            -
                  def map
         | 
| 10 | 
            -
                     | 
| 11 | 
            -
             | 
| 11 | 
            +
                  def map(&block)
         | 
| 12 | 
            +
                    block ||= DEFAULT_BLOCK
         | 
| 13 | 
            +
                    classes_array.each_with_object({}) do |klass, map|
         | 
| 12 14 | 
             
                      next if anonymous? klass
         | 
| 13 | 
            -
                      map[klass.model_class] =  | 
| 15 | 
            +
                      map[klass.model_class] = block.call klass
         | 
| 14 16 | 
             
                    end
         | 
| 15 17 | 
             
                  end
         | 
| 16 18 |  | 
| @@ -19,6 +21,10 @@ module Wallaby | |
| 19 21 | 
             
                  def anonymous?(klass)
         | 
| 20 22 | 
             
                    klass.name.blank?
         | 
| 21 23 | 
             
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def classes_array
         | 
| 26 | 
            +
                    @base_class.try(:descendants) || EMPTY_ARRAY
         | 
| 27 | 
            +
                  end
         | 
| 22 28 | 
             
                end
         | 
| 23 29 | 
             
              end
         | 
| 24 30 | 
             
            end
         | 
    
        data/lib/services/wallaby/map.rb
    CHANGED
    
    
| @@ -22,7 +22,7 @@ module Wallaby | |
| 22 22 | 
             
                  def build(field_name)
         | 
| 23 23 | 
             
                    metadata = @model_decorator.index_metadata_of field_name
         | 
| 24 24 | 
             
                    label = Utils.to_field_label field_name, metadata
         | 
| 25 | 
            -
                    return label unless sortable? metadata
         | 
| 25 | 
            +
                    return label unless sortable? field_name, metadata
         | 
| 26 26 | 
             
                    sort_field_name = metadata[:sort_field_name] || field_name
         | 
| 27 27 | 
             
                    url_params = next_builder.next_params sort_field_name
         | 
| 28 28 | 
             
                    @helper.index_link(model_class, url_params: url_params) { label }
         | 
| @@ -36,8 +36,8 @@ module Wallaby | |
| 36 36 | 
             
                  end
         | 
| 37 37 |  | 
| 38 38 | 
             
                  # If it's non-association field or custom sorting field
         | 
| 39 | 
            -
                  def sortable?(metadata)
         | 
| 40 | 
            -
                     | 
| 39 | 
            +
                  def sortable?(field_name, metadata)
         | 
| 40 | 
            +
                    @model_decorator.fields[field_name] && !metadata[:is_association] \
         | 
| 41 41 | 
             
                      || metadata[:sort_field_name]
         | 
| 42 42 | 
             
                  end
         | 
| 43 43 | 
             
                end
         | 
| @@ -2,10 +2,11 @@ module Wallaby | |
| 2 2 | 
             
              class Configuration
         | 
| 3 3 | 
             
                # Security configuration
         | 
| 4 4 | 
             
                class Security
         | 
| 5 | 
            +
                  attr_accessor :logout_path, :logout_method, :email_method
         | 
| 5 6 | 
             
                  # by default, current_user returns nil
         | 
| 6 | 
            -
                  DEFAULT_CURRENT_USER | 
| 7 | 
            +
                  DEFAULT_CURRENT_USER = -> { nil }
         | 
| 7 8 | 
             
                  # by default, not to stop the before_action chain
         | 
| 8 | 
            -
                  DEFAULT_AUTHENTICATE | 
| 9 | 
            +
                  DEFAULT_AUTHENTICATE = -> { true }
         | 
| 9 10 |  | 
| 10 11 | 
             
                  # Configure how to get the current user. All application controller
         | 
| 11 12 | 
             
                  # methods will be available.
         | 
    
        data/lib/wallaby/engine.rb
    CHANGED
    
    | @@ -66,6 +66,7 @@ require 'tree/wallaby/node' | |
| 66 66 |  | 
| 67 67 | 
             
            require 'interfaces/wallaby/mode'
         | 
| 68 68 | 
             
            require 'interfaces/wallaby/model_decorator'
         | 
| 69 | 
            +
            require 'interfaces/wallaby/model_decorator/field_helpers'
         | 
| 69 70 | 
             
            require 'interfaces/wallaby/model_finder'
         | 
| 70 71 | 
             
            require 'interfaces/wallaby/model_service_provider'
         | 
| 71 72 | 
             
            require 'interfaces/wallaby/model_pagination_provider'
         | 
| @@ -77,6 +78,7 @@ require 'errors/wallaby/model_not_found' | |
| 77 78 | 
             
            require 'errors/wallaby/not_authenticated'
         | 
| 78 79 | 
             
            require 'errors/wallaby/not_implemented'
         | 
| 79 80 | 
             
            require 'errors/wallaby/resource_not_found'
         | 
| 81 | 
            +
            require 'errors/wallaby/unprocessable_entity'
         | 
| 80 82 |  | 
| 81 83 | 
             
            require 'parsers/wallaby/parser'
         | 
| 82 84 |  | 
    
        data/lib/wallaby/version.rb
    CHANGED
    
    
    
        data/lib/wallaby.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            module Wallaby
         | 
| 2 2 | 
             
              EMPTY_STRING = ''.freeze
         | 
| 3 3 | 
             
              EMPTY_HASH = {}.freeze
         | 
| 4 | 
            +
              EMPTY_ARRAY = [].freeze
         | 
| 4 5 | 
             
              SPACE = ' '.freeze
         | 
| 5 6 | 
             
              SLASH = '/'.freeze
         | 
| 6 7 | 
             
              COLONS = '::'.freeze
         | 
| @@ -19,6 +20,7 @@ module Wallaby | |
| 19 20 | 
             
              ).freeze
         | 
| 20 21 | 
             
              WILDCARD = 'QUERY'.freeze
         | 
| 21 22 | 
             
              FORM_ACTIONS = %w(new create edit update).freeze
         | 
| 23 | 
            +
              SAVE_ACTIONS = %w(create update).freeze
         | 
| 22 24 | 
             
            end
         | 
| 23 25 |  | 
| 24 26 | 
             
            require 'wallaby/engine'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: wallaby
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 5.1. | 
| 4 | 
            +
              version: 5.1.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Tianwen Chen
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018-01- | 
| 11 | 
            +
            date: 2018-01-21 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bootstrap-sass
         | 
| @@ -170,14 +170,14 @@ dependencies: | |
| 170 170 | 
             
                requirements:
         | 
| 171 171 | 
             
                - - ">="
         | 
| 172 172 | 
             
                  - !ruby/object:Gem::Version
         | 
| 173 | 
            -
                    version:  | 
| 173 | 
            +
                    version: 4.2.0
         | 
| 174 174 | 
             
              type: :runtime
         | 
| 175 175 | 
             
              prerelease: false
         | 
| 176 176 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 177 177 | 
             
                requirements:
         | 
| 178 178 | 
             
                - - ">="
         | 
| 179 179 | 
             
                  - !ruby/object:Gem::Version
         | 
| 180 | 
            -
                    version:  | 
| 180 | 
            +
                    version: 4.2.0
         | 
| 181 181 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 182 182 | 
             
              name: responders
         | 
| 183 183 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -519,6 +519,7 @@ files: | |
| 519 519 | 
             
            - lib/errors/wallaby/not_found.rb
         | 
| 520 520 | 
             
            - lib/errors/wallaby/not_implemented.rb
         | 
| 521 521 | 
             
            - lib/errors/wallaby/resource_not_found.rb
         | 
| 522 | 
            +
            - lib/errors/wallaby/unprocessable_entity.rb
         | 
| 522 523 | 
             
            - lib/forms/wallaby/form_builder.rb
         | 
| 523 524 | 
             
            - lib/helpers/wallaby/application_helper.rb
         | 
| 524 525 | 
             
            - lib/helpers/wallaby/base_helper.rb
         | 
| @@ -530,6 +531,7 @@ files: | |
| 530 531 | 
             
            - lib/helpers/wallaby/styling_helper.rb
         | 
| 531 532 | 
             
            - lib/interfaces/wallaby/mode.rb
         | 
| 532 533 | 
             
            - lib/interfaces/wallaby/model_decorator.rb
         | 
| 534 | 
            +
            - lib/interfaces/wallaby/model_decorator/field_helpers.rb
         | 
| 533 535 | 
             
            - lib/interfaces/wallaby/model_finder.rb
         | 
| 534 536 | 
             
            - lib/interfaces/wallaby/model_pagination_provider.rb
         | 
| 535 537 | 
             
            - lib/interfaces/wallaby/model_service_provider.rb
         | 
| @@ -584,9 +586,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 584 586 | 
             
                  version: '0'
         | 
| 585 587 | 
             
            requirements: []
         | 
| 586 588 | 
             
            rubyforge_project: 
         | 
| 587 | 
            -
            rubygems_version: 2. | 
| 589 | 
            +
            rubygems_version: 2.5.2
         | 
| 588 590 | 
             
            signing_key: 
         | 
| 589 591 | 
             
            specification_version: 4
         | 
| 590 592 | 
             
            summary: Rails way database admin interface
         | 
| 591 593 | 
             
            test_files: []
         | 
| 592 | 
            -
            has_rdoc: 
         |