Sha256: 24b44b81616d0a5732b2fa40c0f9a9ec67a3a825246847c105d8c2f7b0ed674b

Contents?: true

Size: 1.73 KB

Versions: 2

Compression:

Stored size: 1.73 KB

Contents

require "i18n"
require "active_support/inflector"

require "labelizer/version"
require "labelizer/container"

module Labelizer
  def self.included(base)
    base.send :extend, ClassMethods
  end

  def labelized
    @labelized ||= Container.new(self.class.labelized.instance_variable_get(:@keys)){|h,attr|
      h[attr] = self.class.labelized[attr][__send__(attr)]
    }
  end

  module ClassMethods
    def labelized
      @labelized
    end

    private

      def labelize(attr, label_types, converter: {})
        label_types = label_types.map(&:to_sym)

        define_method :"#{attr}_labelized" do
          labelized[attr]
        end

        label_types.each do |label_type|
          define_method :"#{attr}_#{label_type}" do
            labelized[attr][label_type]
          end
        end

        model = self.to_s.underscore
        @labelized ||= Container.new([]){|h,attr|
          h[attr] = Container.new(__send__(attr.to_s.pluralize)){|h,value|
            h[value] = Container.new(label_types){|h,label_type|
              result = ::I18n.translate(
                "labelizer.#{model}.#{attr}.#{value}.#{label_type}",
                default: [
                  :"labelizer.#{model}.#{attr}.#{label_type}",
                  :"labelizer.#{model}.#{label_type}",
                  :"labelizer.#{label_type}",
                  "",
                ],
              )
              if c = converter[label_type]
                result = c[result]
              end
              h[label_type] = result
            }
          }
        }

        @labelized.instance_variable_get(:@keys) << attr
        @labelized.singleton_class.class_eval do
          define_method attr do
            @hash[attr]
          end
        end
      end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
labelizer-0.1.0 lib/labelizer.rb
labelizer-0.0.5 lib/labelizer.rb