Class: ActiveSupport::Duration::ISO8601Serializer
    Do not use.  This class is for internal use only.
  
| Relationships & Source Files | |
| Inherits: | Object | 
| Defined in: | activesupport/lib/active_support/duration/iso8601_serializer.rb | 
Overview
Serializes duration to string according to ISO 8601 ::ActiveSupport::Duration format.
Constant Summary
- 
    DATE_COMPONENTS =
    
 # File 'activesupport/lib/active_support/duration/iso8601_serializer.rb', line 7%i(years months days)
Class Method Summary
Instance Method Summary
- 
    
      #serialize  
    
    Builds and returns output string. 
- #format_seconds(seconds) private
- 
    
      #normalize  
    
    private
    Return pair of duration’s parts and whole duration sign. 
- #week_mixed_with_date?(parts) ⇒ Boolean private
Constructor Details
    .new(duration, precision: nil)  ⇒ ISO8601Serializer 
  
# File 'activesupport/lib/active_support/duration/iso8601_serializer.rb', line 9
def initialize(duration, precision: nil) @duration = duration @precision = precision end
Instance Method Details
#format_seconds(seconds) (private)
[ GitHub ]#normalize (private)
Return pair of duration’s parts and whole duration sign. Parts are summarized (as they can become repetitive due to addition, etc). Zero parts are removed as not significant.
# File 'activesupport/lib/active_support/duration/iso8601_serializer.rb', line 38
def normalize parts = @duration.parts.each_with_object(Hash.new(0)) do |(k, v), p| p[k] += v unless v.zero? end # Convert weeks to days and remove weeks if mixed with date parts if week_mixed_with_date?(parts) parts[:days] += parts.delete(:weeks) * SECONDS_PER_WEEK / SECONDS_PER_DAY end parts end
#serialize
Builds and returns output string.
# File 'activesupport/lib/active_support/duration/iso8601_serializer.rb', line 15
def serialize parts = normalize return "PT0S" if parts.empty? output = +"P" output << "#{parts[:years]}Y" if parts.key?(:years) output << "#{parts[:months]}M" if parts.key?(:months) output << "#{parts[:days]}D" if parts.key?(:days) output << "#{parts[:weeks]}W" if parts.key?(:weeks) time = +"" time << "#{parts[:hours]}H" if parts.key?(:hours) time << "#{parts[:minutes]}M" if parts.key?(:minutes) if parts.key?(:seconds) time << "#{format_seconds(parts[:seconds])}S" end output << "T#{time}" unless time.empty? output end
    #week_mixed_with_date?(parts)  ⇒ Boolean  (private)
  
# File 'activesupport/lib/active_support/duration/iso8601_serializer.rb', line 51
def week_mixed_with_date?(parts) parts.key?(:weeks) && parts.keys.intersect?(DATE_COMPONENTS) end