mojotech/capybara-ui

View on GitHub
lib/capybara/ui/widgets/parts/struct.rb

Summary

Maintainability
A
0 mins
Test Coverage
F
35%
module Capybara
  module UI
    module WidgetParts
      module Struct
        def self.included(target)
          target.extend ClassMethods
        end

        module ClassMethods
          def attribute(name, selector, &block)
            child = widget(name, selector, &block)

            class_eval <<-WIDGET
              def #{name}
                widget(:#{name}).value
              end
            WIDGET

            child
          end

          def boolean(name, selector, &block)
            child = widget(name, selector, &block)

            class_eval <<-WIDGET
              def #{name}?
                widget(:#{name}).value
              end
            WIDGET

            child.class_eval <<-VALUE
              def value
                Capybara::UI::Conversions::Boolean(text)
              end
            VALUE

            child
          end

          def date(name, selector, &block)
            child = attribute(name, selector, &block)

            child.class_eval <<-VALUE
              def value
                Date.parse(text)
              end
            VALUE

            child
          end

          def float(name, selector, &block)
            child = attribute(name, selector, &block)

            child.class_eval <<-VALUE
              def value
                Float(text)
              end
            VALUE

            child
          end

          def integer(name, selector, &block)
            child = attribute(name, selector, &block)

            child.class_eval <<-VALUE
              def value
                Integer(text)
              end
            VALUE

            child
          end

          def list(name, selector, options = {}, &block)
            child = widget(name, selector, Capybara::UI::List) do
              item options[:item_selector], options[:item_class] || ListItem
            end

            class_eval <<-WIDGET
              def #{name}
                widget(:#{name}).value
              end
            WIDGET

            child.class_eval(&block) if block_given?

            child
          end

          def string(name, *args, &block)
            child = attribute(name, *args, &block)

            child.class_eval <<-VALUE
              def value
                text
              end
            VALUE

            child
          end

          def time(name, *args, &block)
            child = attribute(name, *args, &block)

            child.class_eval <<-VALUE
              def value
                Time.parse(text)
              end
            VALUE

            child
          end
        end
      end
    end
  end
end