mongoid/mongoid

View on GitHub
lib/mongoid/extensions/string.rb

Summary

Maintainability
A
0 mins
Test Coverage
# encoding: utf-8
module Mongoid
  module Extensions
    module String

      # @attribute [rw] unconvertable_to_bson If the document is unconvetable.
      attr_accessor :unconvertable_to_bson

      # Evolve the string into an object id if possible.
      #
      # @example Evolve the string.
      #   "test".__evolve_object_id__
      #
      # @return [ String, BSON::ObjectId ] The evolved string.
      #
      # @since 3.0.0
      def __evolve_object_id__
        convert_to_object_id
      end

      # Mongoize the string into an object id if possible.
      #
      # @example Evolve the string.
      #   "test".__mongoize_object_id__
      #
      # @return [ String, BSON::ObjectId, nil ] The mongoized string.
      #
      # @since 3.0.0
      def __mongoize_object_id__
        convert_to_object_id unless blank?
      end

      # Mongoize the string for storage.
      #
      # @example Mongoize the string.
      #   "2012-01-01".__mongoize_time__
      #
      # @note The extra parse from Time is because ActiveSupport::TimeZone
      #   either returns nil or Time.now if the string is empty or invalid,
      #   which is a regression from pre-3.0 and also does not agree with
      #   the core Time API.
      #
      # @return [ Time ] The time.
      #
      # @since 3.0.0
      def __mongoize_time__
        ::Time.parse(self)
        ::Time.configured.parse(self)
      end

      # Convert the string to a collection friendly name.
      #
      # @example Collectionize the string.
      #   "namespace/model".collectionize
      #
      # @return [ String ] The string in collection friendly form.
      #
      # @since 1.0.0
      def collectionize
        tableize.gsub("/", "_")
      end

      # Is the string a valid value for a Mongoid id?
      #
      # @example Is the string an id value?
      #   "_id".mongoid_id?
      #
      # @return [ true, false ] If the string is id or _id.
      #
      # @since 2.3.1
      def mongoid_id?
        self =~ /\A(|_)id$/
      end

      # Is the string a number?
      #
      # @example Is the string a number.
      #   "1234.23".numeric?
      #
      # @return [ true, false ] If the string is a number.
      #
      # @since 3.0.0
      def numeric?
        true if Float(self) rescue (self == "NaN")
      end

      # Get the string as a getter string.
      #
      # @example Get the reader/getter
      #   "model=".reader
      #
      # @return [ String ] The string stripped of "=".
      #
      # @since 1.0.0
      def reader
        delete("=").sub(/\_before\_type\_cast$/, '')
      end

      # Is this string a writer?
      #
      # @example Is the string a setter method?
      #   "model=".writer?
      #
      # @return [ true, false ] If the string contains "=".
      #
      # @since 1.0.0
      def writer?
        include?("=")
      end

      # Is this string a valid_method_name?
      #
      # @example Is the string a valid Ruby idenfier for use as a method name
      #   "model=".valid_method_name?
      #
      # @return [ true, false ] If the string contains a valid Ruby identifier.
      #
      # @since 3.0.15
      def valid_method_name?
        /[@$"]/ !~ self
      end

      # Does the string end with _before_type_cast?
      #
      # @example Is the string a setter method?
      #   "price_before_type_cast".before_type_cast?
      #
      # @return [ true, false ] If the string ends with "_before_type_cast"
      #
      # @since 3.1.0
      def before_type_cast?
        ends_with?("_before_type_cast")
      end

      # Is the object not to be converted to bson on criteria creation?
      #
      # @example Is the object unconvertable?
      #   object.unconvertable_to_bson?
      #
      # @return [ true, false ] If the object is unconvertable.
      #
      # @since 2.2.1
      def unconvertable_to_bson?
        @unconvertable_to_bson ||= false
      end

      private

      # If the string is a legal object id, convert it.
      #
      # @api private
      #
      # @example Convert to the object id.
      #   string.convert_to_object_id
      #
      # @return [ String, BSON::ObjectId ] The string or the id.
      #
      # @since 3.0.0
      def convert_to_object_id
        BSON::ObjectId.legal?(self) ? BSON::ObjectId.from_string(self) : self
      end

      module ClassMethods

        # Convert the object from its mongo friendly ruby type to this type.
        #
        # @example Demongoize the object.
        #   String.demongoize(object)
        #
        # @param [ Object ] object The object to demongoize.
        #
        # @return [ String ] The object.
        #
        # @since 3.0.0
        def demongoize(object)
          object.try(:to_s)
        end

        # Turn the object from the ruby type we deal with to a Mongo friendly
        # type.
        #
        # @example Mongoize the object.
        #   String.mongoize("123.11")
        #
        # @param [ Object ] object The object to mongoize.
        #
        # @return [ String ] The object mongoized.
        #
        # @since 3.0.0
        def mongoize(object)
          demongoize(object)
        end
      end
    end
  end
end

::String.__send__(:include, Mongoid::Extensions::String)
::String.extend(Mongoid::Extensions::String::ClassMethods)