Class: DslFactory::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/dsl_factory/generator.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeGenerator

Returns a new instance of Generator.



4
5
6
7
8
9
10
11
12
13
14
15
16
# File 'lib/dsl_factory/generator.rb', line 4

def initialize
  @definition = Module.new do
    def get_dsl_value(name)
      @dsl_values ||= {}
      @dsl_values[name]
    end

    def set_dsl_value(name, value, &block)
      @dsl_values ||= {}
      @dsl_values[name] = value
    end
  end
end

Instance Attribute Details

#definitionObject (readonly)

Returns the value of attribute definition.



2
3
4
# File 'lib/dsl_factory/generator.rb', line 2

def definition
  @definition
end

Instance Method Details

#any(name, callback: nil, validation: nil) ⇒ Object

for more information & examples, please see README.md

if a ‘callback` is given it will be called when the extended class uses this attribute (after setting the value). the callback block will be called with the value as first parameter (if you need multiple parameter pass a list). for examples, please see `README.md“.

if a validation is given the block will be called with the value as first parameter. if the block returns false a ‘DslFactory::ValidationError` will be raised.



32
33
34
35
36
37
38
39
# File 'lib/dsl_factory/generator.rb', line 32

def any(name, callback: nil, validation: nil)
  @definition.define_method(name) do |value = :not_given, &block|
    return get_dsl_value(name) if value == :not_given
    raise DslFactory::ValidationError, "#{name} is not valid" if validation && !validation.call(value)
    set_dsl_value(name, value)
    self.instance_exec(value, &callback) if callback
  end
end

#array(plural_name, item_class = nil, callback: nil, &definition_block) ⇒ Object

for more information & examples, please see README.md



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/dsl_factory/generator.rb', line 67

def array(plural_name, item_class=nil, callback: nil, &definition_block)
  singular_name = build_singular_name!(plural_name)
  raise DslFactory::DefinitionError, "#{plural_name} item_class can not given at the same time as a block" if item_class && definition_block

  any(plural_name, callback: callback, validation: ->(value) { value.is_a?(Array) && (item_class.nil? || value.all? { |item| item.is_a?(item_class) }) })

  @definition.define_method(singular_name) do |value = :not_given, &block|
    old_value = get_dsl_value(plural_name)
    return old_value if value == :not_given && !block

    if block # we deal with a sub-DSL
      value_object = Class.new
      value_object.extend(DslFactory.define_dsl(inspectable: true, &definition_block))
      value_object.instance_eval(&block)
      value = value_object
    end
    raise DslFactory::ValidationError, "#{singular_name} is not valid" if item_class && !value.is_a?(item_class)
    new_value = old_value || []
    new_value << value
    set_dsl_value(plural_name, new_value)
    self.instance_exec([value], &callback) if callback # wrap the item in a list
  end
end

#boolean(name, **kwargs) ⇒ Object

for more information & examples, please see README.md



57
58
59
# File 'lib/dsl_factory/generator.rb', line 57

def boolean(name, **kwargs)
  any(name, validation: ->(value) { value.is_a?(TrueClass) || value.is_a?(FalseClass) }, **kwargs)
end

#callable(name, **kwargs) ⇒ Object

for more information & examples, please see README.md



62
63
64
# File 'lib/dsl_factory/generator.rb', line 62

def callable(name, **kwargs)
  any(name, validation: ->(value) { value.respond_to?(:call) }, **kwargs)
end

#define_inspectObject



18
19
20
21
22
# File 'lib/dsl_factory/generator.rb', line 18

def define_inspect
  @definition.define_method(:inspect) do
    "DSL#{@dsl_values.inspect}"
  end
end

#hash(plural_name, key_class = nil, value_class = nil, callback: nil, &definition_block) ⇒ Object

for more information & examples, please see README.md



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/dsl_factory/generator.rb', line 92

def hash(plural_name, key_class=nil, value_class=nil, callback: nil, &definition_block)
  singular_name = build_singular_name!(plural_name)
  raise DslFactory::DefinitionError, "#{plural_name} value_class can not given at the same time as a block" if value_class && definition_block

  @definition.define_method(plural_name) do |value = nil|
    raise DslFactory::DefinitionError, "hashes do not support setting values with the plural form, please use #{singular_name} to define items" if value
    get_dsl_value(plural_name)
  end

  @definition.define_method(singular_name) do |key, value = nil, &block|
    raise DslFactory::ValidationError, "value can not be given at the same time as a block for a hash" if value && block

    if block # we deal with a sub-DSL
      value_object = Class.new
      value_object.extend(DslFactory.define_dsl(inspectable: true, &definition_block))
      value_object.instance_eval(&block)
      value = value_object
    end
    raise DslFactory::ValidationError, "#{singular_name}'s key is not a #{key_class}" if key_class && !key.is_a?(key_class)
    raise DslFactory::ValidationError, "#{singular_name}'s value is not a #{value_class}" if value_class && !value.is_a?(value_class)
    new_value = get_dsl_value(plural_name) || {}
    new_value[key] = value
    set_dsl_value(plural_name, new_value)
    self.instance_exec(key, value, &callback) if callback
  end
end

#numeric(name, **kwargs) ⇒ Object

for more information & examples, please see README.md



52
53
54
# File 'lib/dsl_factory/generator.rb', line 52

def numeric(name, **kwargs)
  any(name, validation: ->(value) { value.is_a?(Numeric) }, **kwargs)
end

#string(name, **kwargs) ⇒ Object

for more information & examples, please see README.md



42
43
44
# File 'lib/dsl_factory/generator.rb', line 42

def string(name, **kwargs)
  any(name, validation: ->(value) { value.is_a?(String) }, **kwargs)
end

#symbol(name, **kwargs) ⇒ Object

for more information & examples, please see README.md



47
48
49
# File 'lib/dsl_factory/generator.rb', line 47

def symbol(name, **kwargs)
  any(name, validation: ->(value) { value.is_a?(Symbol) }, **kwargs)
end