59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# File 'lib/cistern/attributes.rb', line 59
def attribute(_name, options = {})
if defined? Cistern::Coverage
attribute_call = Cistern::Coverage.find_caller_before("cistern/attributes.rb")
if attribute_call and attribute_call.label.start_with? "<class:"
options[:coverage_file] = attribute_call.absolute_path
options[:coverage_line] = attribute_call.lineno
options[:coverage_hits] = 0
end
end
name = _name.to_s.to_sym
parser = Cistern::Attributes.parsers[options[:type]] ||
options[:parser] ||
Cistern::Attributes.default_parser
transform = Cistern::Attributes.transforms[options[:squash] ? :squash : :none] ||
Cistern::Attributes.default_transform
self.send(:define_method, name) do
self.class.attributes[name.to_s.to_sym][:coverage_hits] += 1 rescue nil
attributes.fetch(name.to_s.to_sym, options[:default])
end unless self.instance_methods.include?(name)
if options[:type] == :boolean
self.send(:alias_method, "#{name}?", name)
end
self.send(:define_method, "#{name}=") do |value|
transformed = transform.call(name, value, options)
attributes[name.to_s.to_sym]= parser.call(transformed, options)
end unless self.instance_methods.include?("#{name}=".to_sym)
if self.attributes[name]
raise(ArgumentError, "#{self.name} attribute[#{_name}] specified more than once")
else
self.attributes[name] = options
end
Array(options[:aliases]).each do |new_alias|
aliases[new_alias] ||= []
aliases[new_alias] << name
end
end
|