Sha256: a39e035c128f5f0574532a2c7459e5862e84d13aabd569156443635a6898f8a1

Contents?: true

Size: 1.72 KB

Versions: 2

Compression:

Stored size: 1.72 KB

Contents

module PufferPages
  module Backends
    module Mixins
      module Localable
        extend ActiveSupport::Concern

        included do
          serialize :locales, Locales

          validate do
            errors[:locales] = locales.error unless locales.valid?
          end
        end

        def locales
          value = read_attribute(:locales)
          value.is_a?(Locales) ? value : Locales.new(value)
        end

        class Locales < ActiveSupport::HashWithIndifferentAccess
          def initialize source
            update (source.presence || {}).stringify_keys
            super()
          end

          def valid?
            !error
          end

          def error
            translations
          rescue ::SyntaxError => e
            e.message
          else
            false
          end

          def translations
            @translations ||= Hash[map do |(locale, yaml)|
              load_arguments = [yaml]
              load_arguments.push "<#{locale}>" if YAML.method(:load).arity == -2
              result = YAML.load yaml
              result = result.presence || {}
              raise ::SyntaxError.new("(<#{locale}>): Locale should be a hash") unless result.is_a?(Hash)
              [locale.to_sym, result.deep_symbolize_keys]
            end]
          end

          class << self
            def dump value
              value = value.is_a?(Locales) ? value : Locales.new(value)
              value ? YAML.dump(value.to_hash) : nil
            end

            def load value
              return unless value
              value = YAML.load(value) if value.is_a?(String)
              value.is_a?(Locales) ? value : Locales.new(value)
            end
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
puffer_pages-0.5.1 lib/puffer_pages/backends/models/mixins/localable.rb
puffer_pages-0.5.0 lib/puffer_pages/backends/models/mixins/localable.rb