active_form 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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