Class: DslFactory::Generator
- Inherits:
-
Object
- Object
- DslFactory::Generator
- Defined in:
- lib/dsl_factory/generator.rb
Instance Attribute Summary collapse
-
#definition ⇒ Object
readonly
Returns the value of attribute definition.
Instance Method Summary collapse
-
#any(name, callback: nil, validation: nil) ⇒ Object
for more information & examples, please see README.md.
-
#array(plural_name, item_class = nil, callback: nil, &definition_block) ⇒ Object
for more information & examples, please see README.md.
-
#boolean(name, **kwargs) ⇒ Object
for more information & examples, please see README.md.
-
#callable(name, **kwargs) ⇒ Object
for more information & examples, please see README.md.
- #define_inspect ⇒ Object
-
#hash(plural_name, key_class = nil, value_class = nil, callback: nil, &definition_block) ⇒ Object
for more information & examples, please see README.md.
-
#initialize ⇒ Generator
constructor
A new instance of Generator.
-
#numeric(name, **kwargs) ⇒ Object
for more information & examples, please see README.md.
-
#string(name, **kwargs) ⇒ Object
for more information & examples, please see README.md.
-
#symbol(name, **kwargs) ⇒ Object
for more information & examples, please see README.md.
Constructor Details
#initialize ⇒ Generator
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
#definition ⇒ Object (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_inspect ⇒ Object
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 |