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,72 @@
1
+ class ActiveForm::Definition
2
+
3
+ undef :method
4
+
5
+ include ActiveForm::Mixins::CommonMethods
6
+ include ActiveForm::Mixins::ElementMethods
7
+ include ActiveForm::Mixins::ContainerMethods
8
+
9
+ inheritable_set :element_attribute_names, :element_option_flag_names, :element_html_flag_names
10
+
11
+ define_standard_option_flags
12
+
13
+ define_attributes :title, :action, :method, :target, :enctype, :accept, :"accept-charset"
14
+
15
+ define_option_flags :multipart
16
+
17
+ def initialize_element(*args)
18
+ super
19
+ self.action ||= "##{self.name}"
20
+ self.method ||= 'post'
21
+ end
22
+
23
+ def header(include_advice = false)
24
+ html = "<!--o" + "[ #{identifier} ]".center(32, 'o') + "o-->\n"
25
+ html << "<form #{element_attributes.as_attributes_string}>\n"
26
+ html << validation_advice.to_s if include_advice
27
+ html
28
+ end
29
+
30
+ def footer
31
+ html = "</form>\n"
32
+ html << script_tag
33
+ html << "<!--x" + "[ #{identifier} ]".center(32, 'x') + "x-->\n"
34
+ html
35
+ end
36
+
37
+ def render_label(builder = create_builder)
38
+ builder.span(label, label_attributes)
39
+ end
40
+ alias :to_label :render_label
41
+
42
+ def render_frozen(builder = create_builder)
43
+ builder.form(element_attributes) { render_elements(builder) }
44
+ end
45
+
46
+ def render_element(builder = create_builder)
47
+ if contained?
48
+ render_elements(builder)
49
+ else
50
+ builder.form(element_attributes) { render_elements(builder) }
51
+ end
52
+ end
53
+
54
+ def render_elements(builder = create_builder, &block)
55
+ elements.each { |elem| elem.to_html(builder, &block) }
56
+ end
57
+
58
+ def default_attributes
59
+ attrs = { :id => identifier, :class => css }
60
+ attrs[:enctype] = 'multipart/form-data' if multipart?
61
+ attrs
62
+ end
63
+
64
+ def label_attributes
65
+ { :class => label_css }
66
+ end
67
+
68
+ def self.element_type
69
+ :form
70
+ end
71
+
72
+ end
@@ -0,0 +1,50 @@
1
+ module ActiveForm::Element
2
+
3
+ include ActiveForm::Mixins::LoaderMethods
4
+
5
+ class NoElemException < StandardError #:nodoc:
6
+ end
7
+
8
+ class MismatchException < StandardError #:nodoc:
9
+ end
10
+
11
+ class << self
12
+
13
+ def element?(klass)
14
+ klass.respond_to?(:element?) && klass.element?
15
+ end
16
+
17
+ # loader related
18
+
19
+ def load_paths
20
+ @@load_paths ||= [*base_load_paths]
21
+ @@load_paths
22
+ end
23
+
24
+ def base_load_paths
25
+ [ ::File.join(ActiveForm::BASE_PATH, 'elements'), ::File.join(ActiveForm::BASE_PATH, 'facets') ]
26
+ end
27
+
28
+ def instance(definition_name, klass, *args, &block)
29
+ args.unshift(definition_name) if args.empty? || args.first.kind_of?(Hash)
30
+ item = klass.new(*args)
31
+ item.accept_block(&block) if block_given?
32
+ item
33
+ end
34
+
35
+ def create(definition_name, &block)
36
+ ActiveForm::Element::Base::create(definition_name, &block)
37
+ end
38
+
39
+ def register(elem_class)
40
+ if element?(elem_class) && !self.methods.include?("#{elem_class.loadable_type}_element")
41
+ self.module_eval("
42
+ def #{elem_class.loadable_type}_element(*args, &block)
43
+ define_element(:#{elem_class.loadable_type}, *args, &block)
44
+ end")
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -0,0 +1,67 @@
1
+ class ActiveForm::Element::Base
2
+
3
+ include ActiveForm::Mixins::CommonMethods
4
+ include ActiveForm::Mixins::ElementMethods
5
+
6
+ inheritable_set :element_attribute_names, :element_option_flag_names, :element_html_flag_names
7
+
8
+ define_standard_option_flags
9
+
10
+ define_attributes :title, :accesskey, :tabindex
11
+
12
+ cattr_accessor :default_timezone
13
+ @@default_timezone = :local
14
+
15
+ def render_label(builder = create_builder)
16
+ builder.label(label, label_attributes) if labelled?
17
+ end
18
+ alias :to_label :render_label
19
+
20
+ def render_frozen(builder = create_builder)
21
+ return builder.span('-', :class => 'blank') if formatted_value.blank?
22
+ builder.text!(formatted_value)
23
+ end
24
+
25
+ def render_element(builder = create_builder)
26
+ builder.span(label, { :id => identifier, :class => css })
27
+ end
28
+
29
+ def default_attributes
30
+ { :name => element_name, :id => identifier, :class => css }
31
+ end
32
+
33
+ def label_attributes
34
+ { :for => identifier, :class => label_css }
35
+ end
36
+
37
+ def default_css_class
38
+ "elem_#{element_type}"
39
+ end
40
+
41
+ def method_missing(method, *args, &block)
42
+ if (match = /^validates_(with_|within_|as_)?(.*)$/.match(method.to_s)) && ActiveForm::Validator::exists?(match.captures[1])
43
+ define_validator(match.captures[1], *args, &block)
44
+ else
45
+ super
46
+ end
47
+ end
48
+
49
+ def self.inherited(derivative)
50
+ ActiveForm::Element::register(derivative) if derivative.kind_of?(ActiveForm::Element::Base)
51
+ super
52
+ end
53
+
54
+ def self.create(definition_name, &block)
55
+ class_name = type_classname(definition_name)
56
+ if !ActiveForm::Element.const_defined?(class_name)
57
+ ActiveForm::Element.const_set(class_name, Class.new(self))
58
+ if klass = ActiveForm::Element.const_get(class_name)
59
+ klass.module_eval(&block) if block_given?
60
+ ActiveForm::Element::register(klass)
61
+ return klass
62
+ end
63
+ end
64
+ nil
65
+ end
66
+
67
+ end
@@ -0,0 +1,103 @@
1
+ class ActiveForm::Element::Builder
2
+
3
+ NIL_LAMBDA = lambda { |elem| }
4
+ DEFAULT_HTML_BUILDER = lambda { |builder, elem| builder.div('') }
5
+
6
+ include ActiveForm::Mixins::CommonMethods
7
+ include ActiveForm::Mixins::ElementMethods
8
+
9
+ inheritable_set :element_attribute_names, :element_option_flag_names, :element_html_flag_names
10
+
11
+ def initialize_element(*args, &block)
12
+ super(*args, &NIL_LAMBDA)
13
+ define_html_builder(&block) if block_given?
14
+ end
15
+
16
+ def accept_block(&block)
17
+ define_html_builder(&block) if block_given?
18
+ end
19
+
20
+ def element_value(export = false)
21
+ @element_value ||= default_value
22
+ end
23
+ alias :values :element_value
24
+ alias :value :element_value
25
+
26
+ def element_value=(value)
27
+ @element_value = value
28
+ end
29
+ alias :initial_value= :element_value=
30
+ alias :values= :element_value=
31
+ alias :value= :element_value=
32
+ alias :binding= :element_value=
33
+ alias :bind_to :element_value=
34
+ alias :html= :element_value=
35
+
36
+ def html_builder
37
+ @html_builder ||= self.class.respond_to?(:html_builder_proc) ? self.class.method_to_proc(:html_builder_proc) : nil
38
+ end
39
+
40
+ def define_html_builder(prc = nil, &block)
41
+ @html_builder = (block_given? ? block : prc)
42
+ end
43
+ alias :html :define_html_builder
44
+ alias :html_builder= :define_html_builder
45
+
46
+ def reset_html_builder
47
+ @html_builder = nil
48
+ end
49
+
50
+ def render_label(builder = create_builder)
51
+ element_name
52
+ end
53
+
54
+ def render_frozen(builder = create_builder)
55
+ render_element(builder)
56
+ end
57
+
58
+ def render_element(builder = create_builder)
59
+ if html_builder.respond_to?(:call)
60
+ html_builder.call(builder, self)
61
+ elsif !element_value.blank?
62
+ builder << "#{element_value}\n"
63
+ else
64
+ DEFAULT_HTML_BUILDER.call(builder, self)
65
+ end
66
+ end
67
+
68
+ def self.element_type
69
+ :builder
70
+ end
71
+
72
+ def self.inherited(derivative)
73
+ ActiveForm::Element::register(derivative) if derivative.kind_of?(ActiveForm::Element::Base)
74
+ super
75
+ end
76
+
77
+ class << self
78
+
79
+ def create(definition_name, &block)
80
+ class_name = type_classname(definition_name)
81
+ if !ActiveForm::Element.const_defined?(class_name)
82
+ ActiveForm::Element.const_set(class_name, Class.new(self))
83
+ if klass = ActiveForm::Element.const_get(class_name)
84
+ klass.html_builder_proc = block if block_given?
85
+ ActiveForm::Element::register(klass)
86
+ return klass
87
+ end
88
+ end
89
+ nil
90
+ end
91
+
92
+ def html_builder(prc = nil, &block)
93
+ define_singleton_method(:html_builder_proc, &(block_given? ? block : prc))
94
+ end
95
+ alias :html_builder_proc= :html_builder
96
+
97
+ def reset_html_builder
98
+ undefine_singleton_method(:html_builder_proc) rescue nil
99
+ end
100
+
101
+ end
102
+
103
+ end
@@ -0,0 +1,15 @@
1
+ ActiveForm::Element::Input::create :button do
2
+
3
+ def default_attributes
4
+ super.merge(:type => 'button')
5
+ end
6
+
7
+ def element_attributes
8
+ super.merge('value' => label)
9
+ end
10
+
11
+ def labelled?
12
+ false
13
+ end
14
+
15
+ end
@@ -0,0 +1,18 @@
1
+ ActiveForm::Element::Input::create :checkbox do
2
+
3
+ include ActiveForm::Mixins::OptionElementMethods
4
+
5
+ def setup
6
+ super
7
+ self.checked_value = 1
8
+ end
9
+
10
+ def default_attributes
11
+ super.merge(:type => 'checkbox')
12
+ end
13
+
14
+ def element_attributes
15
+ super.merge('value' => checked_value)
16
+ end
17
+
18
+ end
@@ -0,0 +1,15 @@
1
+ ActiveForm::Element::Input::create :file do
2
+
3
+ define_attributes :size, :accept
4
+
5
+ def default_attributes
6
+ super.merge(:type => 'file')
7
+ end
8
+
9
+ def element_attributes
10
+ attrs = super
11
+ attrs.delete('value')
12
+ attrs
13
+ end
14
+
15
+ end
@@ -0,0 +1,9 @@
1
+ ActiveForm::Element::Input::create :hidden do
2
+
3
+ define_attributes :type, :value
4
+
5
+ def default_attributes
6
+ { :name => element_name, :id => identifier, :type => 'hidden' }
7
+ end
8
+
9
+ end
@@ -0,0 +1,7 @@
1
+ ActiveForm::Element::Input::create :image do
2
+
3
+ def default_attributes
4
+ super.merge(:type => 'image')
5
+ end
6
+
7
+ end
@@ -0,0 +1,23 @@
1
+ ActiveForm::Element::Base::create :input do
2
+
3
+ define_attributes :type, :value
4
+
5
+ define_option_flags :autocomplete_off
6
+
7
+ def render_element(builder = create_builder)
8
+ builder.input(element_attributes)
9
+ end
10
+
11
+ def default_attributes
12
+ attrs = Hash.new
13
+ attrs[:disabled] = 'disabled' if disabled?
14
+ attrs[:readonly] = 'readonly' if readonly?
15
+ attrs[:autocomplete] = 'off' if autocomplete_off?
16
+ super.merge(attrs)
17
+ end
18
+
19
+ def element_attributes
20
+ super.merge('value' => formatted_value)
21
+ end
22
+
23
+ end
@@ -0,0 +1,12 @@
1
+ ActiveForm::Element::Input::create :password do
2
+
3
+ def default_attributes
4
+ super.merge(:type => 'password', :size => 30)
5
+ end
6
+
7
+ def render_frozen(builder = create_builder)
8
+ return builder.span('-', :class => 'blank') if formatted_value.blank?
9
+ builder << formatted_value.gsub(/./, '&#8226;')
10
+ end
11
+
12
+ end
@@ -0,0 +1,18 @@
1
+ ActiveForm::Element::Input::create :radio do
2
+
3
+ include ActiveForm::Mixins::OptionElementMethods
4
+
5
+ def setup
6
+ super
7
+ self.checked_value = 1
8
+ end
9
+
10
+ def default_attributes
11
+ super.merge(:type => 'radio')
12
+ end
13
+
14
+ def element_attributes
15
+ super.merge('value' => checked_value)
16
+ end
17
+
18
+ end
@@ -0,0 +1,15 @@
1
+ ActiveForm::Element::Input::create :reset do
2
+
3
+ def default_attributes
4
+ super.merge(:type => 'reset')
5
+ end
6
+
7
+ def element_attributes
8
+ super.merge('value' => label)
9
+ end
10
+
11
+ def labelled?
12
+ false
13
+ end
14
+
15
+ end