active_form 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data.tar.gz.sig +2 -0
  2. data/History.txt +4 -0
  3. data/License.txt +20 -0
  4. data/MIT-LICENSE +19 -0
  5. data/Manifest.txt +181 -0
  6. data/README.txt +1 -0
  7. data/Rakefile +4 -0
  8. data/config/hoe.rb +71 -0
  9. data/config/requirements.rb +17 -0
  10. data/init.rb +5 -0
  11. data/lib/active_form.rb +86 -0
  12. data/lib/active_form/core_extensions.rb +179 -0
  13. data/lib/active_form/definition.rb +72 -0
  14. data/lib/active_form/element.rb +50 -0
  15. data/lib/active_form/elements/base.rb +67 -0
  16. data/lib/active_form/elements/builder.rb +103 -0
  17. data/lib/active_form/elements/button.rb +15 -0
  18. data/lib/active_form/elements/checkbox.rb +18 -0
  19. data/lib/active_form/elements/file.rb +15 -0
  20. data/lib/active_form/elements/hidden.rb +9 -0
  21. data/lib/active_form/elements/image.rb +7 -0
  22. data/lib/active_form/elements/input.rb +23 -0
  23. data/lib/active_form/elements/password.rb +12 -0
  24. data/lib/active_form/elements/radio.rb +18 -0
  25. data/lib/active_form/elements/reset.rb +15 -0
  26. data/lib/active_form/elements/section.rb +37 -0
  27. data/lib/active_form/elements/select.rb +42 -0
  28. data/lib/active_form/elements/submit.rb +19 -0
  29. data/lib/active_form/elements/text.rb +9 -0
  30. data/lib/active_form/elements/textarea.rb +18 -0
  31. data/lib/active_form/errors.rb +73 -0
  32. data/lib/active_form/facets/checkbox_group.rb +11 -0
  33. data/lib/active_form/facets/collection_input.rb +96 -0
  34. data/lib/active_form/facets/radio_group.rb +11 -0
  35. data/lib/active_form/facets/select_date.rb +10 -0
  36. data/lib/active_form/facets/select_datetime.rb +10 -0
  37. data/lib/active_form/facets/select_day.rb +17 -0
  38. data/lib/active_form/facets/select_from_model.rb +60 -0
  39. data/lib/active_form/facets/select_hour.rb +17 -0
  40. data/lib/active_form/facets/select_minute.rb +17 -0
  41. data/lib/active_form/facets/select_month.rb +46 -0
  42. data/lib/active_form/facets/select_numeric_range.rb +59 -0
  43. data/lib/active_form/facets/select_second.rb +17 -0
  44. data/lib/active_form/facets/select_time.rb +10 -0
  45. data/lib/active_form/facets/select_timebased.rb +145 -0
  46. data/lib/active_form/facets/select_weekday.rb +46 -0
  47. data/lib/active_form/facets/select_year.rb +24 -0
  48. data/lib/active_form/mixins/attribute_methods.rb +33 -0
  49. data/lib/active_form/mixins/casting.rb +152 -0
  50. data/lib/active_form/mixins/collection_element_methods.rb +204 -0
  51. data/lib/active_form/mixins/common_methods.rb +350 -0
  52. data/lib/active_form/mixins/container_methods.rb +417 -0
  53. data/lib/active_form/mixins/css_methods.rb +70 -0
  54. data/lib/active_form/mixins/element_methods.rb +314 -0
  55. data/lib/active_form/mixins/javascript_methods.rb +99 -0
  56. data/lib/active_form/mixins/loader_methods.rb +72 -0
  57. data/lib/active_form/mixins/option_element_methods.rb +61 -0
  58. data/lib/active_form/mixins/validation_methods.rb +253 -0
  59. data/lib/active_form/validator.rb +47 -0
  60. data/lib/active_form/validators/alpha.rb +9 -0
  61. data/lib/active_form/validators/alphanum.rb +9 -0
  62. data/lib/active_form/validators/base.rb +132 -0
  63. data/lib/active_form/validators/digits.rb +9 -0
  64. data/lib/active_form/validators/email.rb +29 -0
  65. data/lib/active_form/validators/format.rb +15 -0
  66. data/lib/active_form/validators/length_range.rb +24 -0
  67. data/lib/active_form/validators/number.rb +9 -0
  68. data/lib/active_form/validators/option_count.rb +24 -0
  69. data/lib/active_form/validators/proc.rb +22 -0
  70. data/lib/active_form/validators/required.rb +9 -0
  71. data/lib/active_form/validators/set.rb +21 -0
  72. data/lib/active_form/validators/time_range.rb +30 -0
  73. data/lib/active_form/validators/uri.rb +54 -0
  74. data/lib/active_form/version.rb +9 -0
  75. data/lib/active_form/views/fieldsets.rb +34 -0
  76. data/lib/active_form/views/plain.rb +32 -0
  77. data/lib/active_form/views/tables.rb +28 -0
  78. data/lib/active_form/widget.rb +43 -0
  79. data/lib/active_form/widgets/base.rb +28 -0
  80. data/lib/loob/uri_validator.rb +140 -0
  81. data/lib/rails/acts_as_dropdown/MIT-LICENSE +20 -0
  82. data/lib/rails/acts_as_dropdown/acts_as_dropdown.rb +119 -0
  83. data/lib/rails/acts_as_dropdown/dropdown.rb +27 -0
  84. data/lib/rails/controller_helper.rb +19 -0
  85. data/lib/rails/model/loader.rb +206 -0
  86. data/lib/rails/view_helper.rb +20 -0
  87. data/samples/html/css/style.css +175 -0
  88. data/samples/html/js/effects.js +958 -0
  89. data/samples/html/js/prototype.js +2006 -0
  90. data/samples/html/js/validation.js +228 -0
  91. data/samples/html/plain_view.html +77 -0
  92. data/samples/html/sample001.html +158 -0
  93. data/samples/html/sample002.html +76 -0
  94. data/samples/html/sample003.html +34 -0
  95. data/samples/layouts/default.rhtml +18 -0
  96. data/samples/layouts/plain.rhtml +21 -0
  97. data/samples/layouts/sample003.rhtml +25 -0
  98. data/samples/plain_view.rb +58 -0
  99. data/samples/sample001.rb +111 -0
  100. data/samples/sample002.rb +92 -0
  101. data/samples/sample003.rb +30 -0
  102. data/script/destroy +14 -0
  103. data/script/generate +14 -0
  104. data/script/txt2html +74 -0
  105. data/setup.rb +1585 -0
  106. data/tasks/deployment.rake +34 -0
  107. data/tasks/environment.rake +7 -0
  108. data/tasks/website.rake +17 -0
  109. data/test/elements/test_base_element.rb +159 -0
  110. data/test/elements/test_builder_element.rb +81 -0
  111. data/test/elements/test_button_element.rb +12 -0
  112. data/test/elements/test_checkbox_element.rb +233 -0
  113. data/test/elements/test_file_element.rb +20 -0
  114. data/test/elements/test_hidden_element.rb +11 -0
  115. data/test/elements/test_image_element.rb +11 -0
  116. data/test/elements/test_input_element.rb +39 -0
  117. data/test/elements/test_password_element.rb +16 -0
  118. data/test/elements/test_radio_element.rb +197 -0
  119. data/test/elements/test_reset_element.rb +12 -0
  120. data/test/elements/test_section_element.rb +162 -0
  121. data/test/elements/test_select_element.rb +364 -0
  122. data/test/elements/test_submit_element.rb +12 -0
  123. data/test/elements/test_text_element.rb +91 -0
  124. data/test/elements/test_textarea_element.rb +23 -0
  125. data/test/facets/test_checkbox_group_element.rb +388 -0
  126. data/test/facets/test_radio_group_element.rb +312 -0
  127. data/test/facets/test_select_date_element.rb +211 -0
  128. data/test/facets/test_select_datetime_element.rb +56 -0
  129. data/test/facets/test_select_day_element.rb +37 -0
  130. data/test/facets/test_select_from_model_element.rb +86 -0
  131. data/test/facets/test_select_hour_element.rb +37 -0
  132. data/test/facets/test_select_minute_element.rb +52 -0
  133. data/test/facets/test_select_month_element.rb +79 -0
  134. data/test/facets/test_select_numeric_range_element.rb +14 -0
  135. data/test/facets/test_select_second_element.rb +48 -0
  136. data/test/facets/test_select_time_element.rb +148 -0
  137. data/test/facets/test_select_weekday_element.rb +71 -0
  138. data/test/facets/test_select_year_element.rb +73 -0
  139. data/test/fixtures/author.rb +11 -0
  140. data/test/fixtures/authors.yml +0 -0
  141. data/test/fixtures/book.rb +14 -0
  142. data/test/fixtures/books.yml +8 -0
  143. data/test/fixtures/categories.yml +0 -0
  144. data/test/fixtures/categorization.rb +2 -0
  145. data/test/fixtures/categorizations.yml +0 -0
  146. data/test/fixtures/category.rb +8 -0
  147. data/test/fixtures/publisher.rb +5 -0
  148. data/test/fixtures/publishers.yml +10 -0
  149. data/test/fixtures/schema.rb +43 -0
  150. data/test/rails/test_model_autodefinition.rb +121 -0
  151. data/test/rails/test_model_loader.rb +61 -0
  152. data/test/resources/elements/chunky.rb +11 -0
  153. data/test/resources/forms/demo.rb +5 -0
  154. data/test/resources/models/book.rb +8 -0
  155. data/test/resources/models/register_publisher.rb +5 -0
  156. data/test/resources/sections/demo.rb +6 -0
  157. data/test/resources/sections/foo.rb +6 -0
  158. data/test/resources/validators/foo.rb +9 -0
  159. data/test/resources/widgets/custom.rb +13 -0
  160. data/test/test_active_form.rb +1050 -0
  161. data/test/test_casting.rb +124 -0
  162. data/test/test_definition.rb +68 -0
  163. data/test/test_definition_class.rb +118 -0
  164. data/test/test_element_class.rb +201 -0
  165. data/test/test_helper.rb +74 -0
  166. data/test/test_javascript.rb +234 -0
  167. data/test/test_load_definition.rb +68 -0
  168. data/test/test_load_element.rb +35 -0
  169. data/test/test_load_section_element.rb +43 -0
  170. data/test/test_load_validator.rb +31 -0
  171. data/test/test_load_widget.rb +93 -0
  172. data/test/test_validation.rb +722 -0
  173. data/test/validators/test_validates_as_alpha.rb +26 -0
  174. data/test/validators/test_validates_as_alphanum.rb +26 -0
  175. data/test/validators/test_validates_as_digits.rb +26 -0
  176. data/test/validators/test_validates_as_email.rb +29 -0
  177. data/test/validators/test_validates_as_number.rb +26 -0
  178. data/test/validators/test_validates_as_uri.rb +128 -0
  179. data/test/validators/test_validates_with_format.rb +26 -0
  180. data/test/validators/test_validates_within_length_range.rb +46 -0
  181. data/test/validators/test_validates_within_set.rb +46 -0
  182. data/test/validators/test_validates_within_time_range.rb +53 -0
  183. metadata +307 -0
  184. metadata.gz.sig +4 -0
@@ -0,0 +1,204 @@
1
+ module ActiveForm::Mixins::CollectionElementMethods
2
+
3
+ def self.included(base)
4
+ base.send(:include, Enumerable)
5
+
6
+ base.send(:alias_method, :values, :element_value)
7
+ base.send(:alias_method, :value, :element_value)
8
+
9
+ base.send(:alias_method, :selected=, :element_value=)
10
+ base.send(:alias_method, :update_from_params, :element_value=)
11
+ base.send(:alias_method, :params=, :element_value=)
12
+ base.send(:alias_method, :initial_value=, :element_value=)
13
+ base.send(:alias_method, :update_value, :element_value=)
14
+ base.send(:alias_method, :values=, :element_value=)
15
+ base.send(:alias_method, :value=, :element_value=)
16
+ base.send(:alias_method, :binding=, :element_value=)
17
+ base.send(:alias_method, :bind_to, :element_value=)
18
+ end
19
+
20
+ def each(&block)
21
+ options.each(&block)
22
+ end
23
+
24
+ def recurse(&block)
25
+ options.each do |option|
26
+ if option.kind_of?(ActiveForm::Element::CollectionOptionGroup)
27
+ option.options.each(&block)
28
+ else
29
+ block.call(option)
30
+ end
31
+ end
32
+ end
33
+
34
+ def element_name
35
+ elem_name = super
36
+ elem_name << '[]' if multiple?
37
+ elem_name
38
+ end
39
+
40
+ def element_value
41
+ multiple? ? [*super].compact.flatten : [*super].compact.first
42
+ end
43
+
44
+ def element_value=(val)
45
+ super(cast_value(multiple? ? [*val].compact.flatten : val.respond_to?(:compact) ? [*val].compact.first : val))
46
+ end
47
+
48
+ def default_value
49
+ multiple? ? [] : super
50
+ end
51
+
52
+ def fallback_value=(value)
53
+ if multiple?
54
+ @fallback_value = value.respond_to?(:to_a) ? value.to_a : [value].flatten
55
+ else
56
+ @fallback_value = [*value].compact.first
57
+ end
58
+ end
59
+
60
+ def option_labels
61
+ results = []
62
+ self.recurse { |option| results << option.label }
63
+ results
64
+ end
65
+
66
+ def option_values
67
+ results = []
68
+ self.recurse { |option| results << option.value }
69
+ results
70
+ end
71
+
72
+ def valid_option?(value)
73
+ (option_values + [*fallback_value] + [*default_value]).compact.include?(value)
74
+ end
75
+
76
+ def valid_value?
77
+ raw_values = [*element_value]
78
+ (raw_values & option_values).length == raw_values.length
79
+ end
80
+
81
+ def options
82
+ @options ||= []
83
+ end
84
+
85
+ def options=(values)
86
+ reset_options!
87
+ add_options(values)
88
+ end
89
+
90
+ def add_options(values)
91
+ values.each { |value| add_option(value) }
92
+ end
93
+ alias :append :add_options
94
+
95
+ def add_option(value)
96
+ if value.kind_of?(ActiveForm::Element::CollectionOption)
97
+ self.options << value
98
+ elsif (value.kind_of?(Array) || value.kind_of?(Set))
99
+ self.options << ActiveForm::Element::CollectionOption.new(value.first, value.last)
100
+ else
101
+ self.options << ActiveForm::Element::CollectionOption.new(value, value)
102
+ end
103
+ self
104
+ end
105
+ alias :<< :add_option
106
+
107
+ def option(label, value = nil)
108
+ self << [label, (value || label)]
109
+ end
110
+
111
+ def reset_options!
112
+ @options = []
113
+ end
114
+
115
+ def empty_option=(label = '--')
116
+ add_empty_option(label)
117
+ end
118
+ alias :empty= :empty_option=
119
+
120
+ def add_empty=(value)
121
+ add_empty_option if value
122
+ end
123
+
124
+ def add_empty_option(label = '--', value = :blank)
125
+ self.options.unshift(ActiveForm::Element::CollectionOption.new(label, value))
126
+ end
127
+ alias :add_empty :add_empty_option
128
+
129
+ def add_optgroup(*args, &block)
130
+ self.options << ActiveForm::Element::CollectionOptionGroup.new(*args, &block)
131
+ end
132
+ alias :option_group :add_optgroup
133
+
134
+ def select_first=(bool = true)
135
+ self.element_value = option_values.first if bool
136
+ end
137
+ alias :select_first :select_first=
138
+
139
+ def selected_value?(value)
140
+ multiple? ? (element_value || []).include?(value) : element_value == value
141
+ end
142
+ alias :selected? :selected_value?
143
+
144
+ def selected_option_label
145
+ self.options.inject([]) { |ary, opt| ary << opt.label if selected_value?(opt.value); ary }.join(', ')
146
+ end
147
+
148
+ def blank?
149
+ element_value.blank? || !valid_value?
150
+ end
151
+
152
+ def required=(value)
153
+ if value.kind_of?(Numeric)
154
+ min_required = value.kind_of?(Numeric) ? value.to_i : 0
155
+ max_required = min_required
156
+ elsif value.respond_to?(:first) && value.respond_to?(:last)
157
+ min_required = value.first.to_i
158
+ max_required = value.last.to_i
159
+ else
160
+ min_required = 0
161
+ max_required = 0
162
+ end
163
+ validate_with_count = (min_required > 0 || (min_required == 0 && max_required > 0))
164
+ self.option_flags[:required] = value.to_s.to_boolean || validate_with_count
165
+ if self.option_flags[:required]
166
+ if validate_with_count
167
+ validates_with_option_count :code => 'required', :range => (min_required..max_required)
168
+ else
169
+ validates_as_required
170
+ end
171
+ else
172
+ validators.delete_if { |v| v.code == 'required' }
173
+ end
174
+ end
175
+
176
+ end
177
+
178
+ class ActiveForm::Element::CollectionOption
179
+
180
+ attr_accessor :label, :value
181
+
182
+ def initialize(label, value)
183
+ @label, @value = label.to_s, value
184
+ end
185
+
186
+ end
187
+
188
+ class ActiveForm::Element::CollectionOptionGroup
189
+
190
+ include ActiveForm::Mixins::CollectionElementMethods
191
+
192
+ attr_accessor :label
193
+
194
+ def initialize(label, options = [], &block)
195
+ @label = label.to_s
196
+ self.options = options
197
+ block.call(self) if block_given?
198
+ end
199
+
200
+ def value
201
+ @options.collect(&:value)
202
+ end
203
+
204
+ end
@@ -0,0 +1,350 @@
1
+ module ActiveForm::Mixins::CommonMethods
2
+
3
+ def self.included(base)
4
+ base.send(:attr_reader, :name)
5
+ base.send(:attr_writer, :label, :description)
6
+ base.send(:attr_accessor, :group)
7
+
8
+ base.send(:include, ActiveForm::Mixins::CssMethods)
9
+ base.send(:include, ActiveForm::Mixins::JavascriptMethods)
10
+ base.send(:include, ActiveForm::Mixins::ValidationMethods)
11
+
12
+ base.send(:include, StubInstanceMethods)
13
+ base.send(:extend, StubClassMethods)
14
+ base.send(:extend, ClassMethods)
15
+ end
16
+
17
+ def initialize(*args, &block)
18
+ setup
19
+ initialize_element(*args, &block)
20
+ after_initialize
21
+ end
22
+
23
+ def setup
24
+ self.class.setup_method(self) if self.class.respond_to?(:setup_method)
25
+ end
26
+
27
+ def after_initialize
28
+ end
29
+
30
+ def rebuild!
31
+ after_initialize
32
+ end
33
+
34
+ def definition?
35
+ self.class.definition?
36
+ end
37
+
38
+ def element?
39
+ self.class.element?
40
+ end
41
+
42
+ def container?
43
+ self.class.container?
44
+ end
45
+
46
+ def group?
47
+ self.class.group?
48
+ end
49
+
50
+ def is_element?(arg)
51
+ arg.respond_to?(:element?) && arg.element?
52
+ end
53
+
54
+ def is_container?(arg)
55
+ arg.respond_to?(:container?) && arg.container?
56
+ end
57
+
58
+ def blank?
59
+ element_value.blank?
60
+ end
61
+
62
+ def option_flags
63
+ @option_flags ||= HashWithIndifferentAccess.new
64
+ end
65
+
66
+ def option_flag_names
67
+ self.class.element_option_flag_names
68
+ end
69
+
70
+ def option_flag_attributes
71
+ Hash.new
72
+ end
73
+
74
+ def html_flags
75
+ @html_flags ||= HashWithIndifferentAccess.new
76
+ end
77
+
78
+ def html_flag_names
79
+ self.class.element_html_flag_names
80
+ end
81
+
82
+ def html_flag_attributes
83
+ html_flag_names.inject({}) { |attrs, flag| attrs[flag.to_s] = flag.to_s if send("#{flag}?"); attrs }
84
+ end
85
+
86
+ def render_input(builder = create_builder, wrapped = false)
87
+ render_call(builder, wrapped).call
88
+ end
89
+ alias :to_input :render_input
90
+
91
+ def to_html(builder = create_builder, &block)
92
+ render_wrapper, wrapped = wrapper(&block)
93
+ render_wrapper.call(builder, self, render_call(builder, wrapped))
94
+ end
95
+ alias :to_s :to_html
96
+ alias :to_element :to_html
97
+
98
+ def render(builder = create_builder, &block)
99
+ html = "<!--o" + "[ #{identifier} ]".center(64, '-') + "o-->\n"
100
+ html << validation_advice.to_s
101
+ html << to_html(builder, &block)
102
+ html << script_tag
103
+ html << "<!--x" + "[ #{identifier} ]".center(64, '-') + "x-->\n"
104
+ html
105
+ end
106
+
107
+ def display(builder = create_builder, &block)
108
+ puts render(builder, &block)
109
+ end
110
+
111
+ def render_call(builder = create_builder, wrapped = false)
112
+ if wrapped
113
+ lambda do
114
+ skipclass = skip_css_class?
115
+ skipstyle = skip_css_style?
116
+ self.skip_css_class = true
117
+ self.skip_css_style = true
118
+ frozen? ? render_frozen(builder) : render_element(builder)
119
+ self.skip_css_class = skipclass
120
+ self.skip_css_style = skipstyle
121
+ end
122
+ else
123
+ lambda do
124
+ frozen? ? render_frozen(builder) : render_element(builder)
125
+ end
126
+ end
127
+ end
128
+
129
+ def wrapper(&block)
130
+ if container? && !contained?
131
+ wrapper_name, default_name = :container_wrapper, :default_container_wrapper
132
+ else
133
+ wrapper_name, default_name = :element_wrapper, :default_element_wrapper
134
+ end
135
+ wrapped, wrapper = [true, block ] if block_given?
136
+ wrapped, wrapper = [true, self.method_to_proc(wrapper_name) ] if wrapper.nil? && self.respond_to?(wrapper_name)
137
+ wrapped, wrapper = [true, self.class.method_to_proc(wrapper_name) ] if wrapper.nil? && self.class.respond_to?(wrapper_name)
138
+ wrapped, wrapper = [false, self.class.method_to_proc(default_name) ] if wrapper.nil?
139
+ [wrapper, wrapped]
140
+ end
141
+
142
+ def define_container_wrapper(prc = nil, &block)
143
+ define_singleton_method(:container_wrapper, &(block_given? ? block : prc)) if container?
144
+ end
145
+ alias :container_wrapper= :define_container_wrapper
146
+
147
+ def reset_container_wrapper
148
+ undefine_singleton_method(:container_wrapper) rescue nil
149
+ end
150
+
151
+ def define_element_wrapper(prc = nil, &block)
152
+ define_singleton_method(:element_wrapper, &(block_given? ? block : prc))
153
+ end
154
+ alias :element_wrapper= :define_element_wrapper
155
+
156
+ def reset_element_wrapper
157
+ undefine_singleton_method(:element_wrapper) rescue nil
158
+ end
159
+
160
+ def value_to_identifier(value)
161
+ str = value.to_s.downcase.strip
162
+ str.gsub!(/\s+/, '_')
163
+ str.gsub!(/[\x00-\x1f]|[\xc0-\xfd][\x80-\xbf]+/) { "#{$&.unpack('U')[0]}" rescue '_' }
164
+ str.gsub!(/[^a-z0-9_]/, ' ')
165
+ str.gsub!(/^([\s_]+)/, '')
166
+ str.gsub!(/([\s_]+)$/, '')
167
+ str.gsub!(/\s+/, '_')
168
+ str.gsub!(/_{2,}/, '_')
169
+ str.strip
170
+ end
171
+
172
+ module ClassMethods
173
+
174
+ def definition?
175
+ self.kind_of?(ActiveForm::Definition)
176
+ end
177
+
178
+ def element?
179
+ self.included_modules.include?(ActiveForm::Mixins::ElementMethods)
180
+ end
181
+
182
+ def container?
183
+ self.included_modules.include?(ActiveForm::Mixins::ContainerMethods)
184
+ end
185
+
186
+ def group?
187
+ false
188
+ end
189
+
190
+ def define_html_flags(*flags)
191
+ skip_methods = (flags.last == false ? !flags.pop : false)
192
+ flags.flatten.each do |flag|
193
+ self.element_html_flag_names += [flag.to_sym]
194
+ unless skip_methods
195
+ define_method("#{flag}=") { |value| self.html_flags[flag.to_sym] = value.to_s.to_boolean } unless instance_methods.include?("#{flag}=")
196
+ define_method("#{flag}?") { self.html_flags[flag.to_sym] == true } unless instance_methods.include?("#{flag}?")
197
+ define_method("#{flag}") { self.html_flags[flag.to_sym] } unless instance_methods.include?("#{flag}")
198
+ end
199
+ end
200
+ end
201
+
202
+ def define_option_flags(*flags)
203
+ skip_methods = (flags.last == false ? !flags.pop : false)
204
+ flags.flatten.each do |flag|
205
+ self.element_option_flag_names += [flag.to_sym]
206
+ unless skip_methods
207
+ define_method("#{flag}=") { |value| self.option_flags[flag.to_sym] = value.to_s.to_boolean } unless instance_methods.include?("#{flag}=")
208
+ define_method("#{flag}?") { self.option_flags[flag.to_sym] == true } unless instance_methods.include?("#{flag}?")
209
+ define_method("#{flag}") { self.option_flags[flag.to_sym] } unless instance_methods.include?("#{flag}")
210
+ end
211
+ end
212
+ end
213
+
214
+ def default_container_wrapper(builder, elem, render)
215
+ render.call
216
+ end
217
+
218
+ def define_container_wrapper(prc = nil, &block)
219
+ define_singleton_method(:container_wrapper, &(block_given? ? block : prc)) if container?
220
+ end
221
+ alias :container_wrapper= :define_container_wrapper
222
+
223
+ def reset_container_wrapper
224
+ undefine_singleton_method(:container_wrapper) rescue nil
225
+ end
226
+
227
+ def default_element_wrapper(builder, elem, render)
228
+ render.call
229
+ end
230
+
231
+ def define_element_wrapper(prc = nil, &block)
232
+ define_singleton_method(:element_wrapper, &(block_given? ? block : prc))
233
+ end
234
+ alias :element_wrapper= :define_element_wrapper
235
+
236
+ def reset_element_wrapper
237
+ undefine_singleton_method(:element_wrapper) rescue nil
238
+ end
239
+
240
+ end
241
+
242
+ module StubInstanceMethods
243
+
244
+ def label
245
+ raise ActiveForm::StubException
246
+ end
247
+
248
+ def title
249
+ raise ActiveForm::StubException
250
+ end
251
+
252
+ def description
253
+ raise ActiveForm::StubException
254
+ end
255
+
256
+ def initialize_element(*args)
257
+ raise ActiveForm::StubException
258
+ end
259
+
260
+ def initialize_properties
261
+ end
262
+
263
+ def identifier
264
+ raise ActiveForm::StubException
265
+ end
266
+
267
+ def element_name
268
+ raise ActiveForm::StubException
269
+ end
270
+
271
+ def export_value
272
+ raise ActiveForm::StubException
273
+ end
274
+
275
+ def element_value
276
+ raise ActiveForm::StubException
277
+ end
278
+
279
+ def element_value=(value)
280
+ raise ActiveForm::StubException
281
+ end
282
+
283
+ def label_attributes
284
+ raise ActiveForm::StubException
285
+ end
286
+
287
+ def render_label(builder = create_builder)
288
+ raise ActiveForm::StubException
289
+ end
290
+
291
+ def render_frozen(builder = create_builder)
292
+ raise ActiveForm::StubException
293
+ end
294
+
295
+ def render_element(builder = create_builder)
296
+ raise ActiveForm::StubException
297
+ end
298
+
299
+ def frozen?
300
+ raise ActiveForm::StubException
301
+ end
302
+
303
+ def hidden?
304
+ raise ActiveForm::StubException
305
+ end
306
+
307
+ def disabled?
308
+ raise ActiveForm::StubException
309
+ end
310
+
311
+ def required?
312
+ raise ActiveForm::StubException
313
+ end
314
+
315
+ def contained?
316
+ raise ActiveForm::StubException
317
+ end
318
+
319
+ def localized?
320
+ raise ActiveForm::StubException
321
+ end
322
+
323
+ def localize(*args)
324
+ raise ActiveForm::StubException
325
+ end
326
+
327
+ def create_builder
328
+ Builder::XhtmlMarkup.new(:indent => 2)
329
+ end
330
+
331
+ end
332
+
333
+ module StubClassMethods
334
+
335
+ def create(*args, &block)
336
+ raise ActiveForm::StubException
337
+ end
338
+
339
+ def setup(prc = nil, &block)
340
+ define_singleton_method(:setup_method, &(block_given? ? block : prc))
341
+ end
342
+ alias :setup_proc= :setup
343
+
344
+ def reset_setup
345
+ undefine_singleton_method(:setup_method) rescue nil
346
+ end
347
+
348
+ end
349
+
350
+ end