sexy_form 0.9.0

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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE +21 -0
  4. data/README.md +275 -0
  5. data/Rakefile +15 -0
  6. data/lib/sexy_form.rb +84 -0
  7. data/lib/sexy_form/builder.rb +306 -0
  8. data/lib/sexy_form/themes.rb +22 -0
  9. data/lib/sexy_form/themes/base_theme.rb +39 -0
  10. data/lib/sexy_form/themes/bootstrap_2_horizontal.rb +83 -0
  11. data/lib/sexy_form/themes/bootstrap_2_inline.rb +73 -0
  12. data/lib/sexy_form/themes/bootstrap_2_vertical.rb +80 -0
  13. data/lib/sexy_form/themes/bootstrap_3_horizontal.rb +95 -0
  14. data/lib/sexy_form/themes/bootstrap_3_inline.rb +71 -0
  15. data/lib/sexy_form/themes/bootstrap_3_vertical.rb +70 -0
  16. data/lib/sexy_form/themes/bootstrap_4_horizontal.rb +95 -0
  17. data/lib/sexy_form/themes/bootstrap_4_inline.rb +80 -0
  18. data/lib/sexy_form/themes/bootstrap_4_vertical.rb +79 -0
  19. data/lib/sexy_form/themes/bulma_horizontal.rb +81 -0
  20. data/lib/sexy_form/themes/bulma_vertical.rb +73 -0
  21. data/lib/sexy_form/themes/default.rb +55 -0
  22. data/lib/sexy_form/themes/foundation.rb +67 -0
  23. data/lib/sexy_form/themes/materialize.rb +65 -0
  24. data/lib/sexy_form/themes/milligram.rb +62 -0
  25. data/lib/sexy_form/themes/semantic_ui_inline.rb +63 -0
  26. data/lib/sexy_form/themes/semantic_ui_vertical.rb +63 -0
  27. data/lib/sexy_form/version.rb +3 -0
  28. data/spec/custom_assertions.rb +21 -0
  29. data/spec/sexy_form/builder_spec.rb +104 -0
  30. data/spec/sexy_form/themes/base_theme_spec.rb +16 -0
  31. data/spec/sexy_form/themes/bootstrap_2_horizontal_spec.rb +114 -0
  32. data/spec/sexy_form/themes/bootstrap_2_inline_spec.rb +108 -0
  33. data/spec/sexy_form/themes/bootstrap_2_vertical_spec.rb +111 -0
  34. data/spec/sexy_form/themes/bootstrap_3_horizontal_spec.rb +116 -0
  35. data/spec/sexy_form/themes/bootstrap_3_inline_spec.rb +104 -0
  36. data/spec/sexy_form/themes/bootstrap_3_vertical_spec.rb +122 -0
  37. data/spec/sexy_form/themes/bootstrap_4_horizontal_spec.rb +124 -0
  38. data/spec/sexy_form/themes/bootstrap_4_inline_spec.rb +116 -0
  39. data/spec/sexy_form/themes/bootstrap_4_vertical_spec.rb +114 -0
  40. data/spec/sexy_form/themes/bulma_horizontal_spec.rb +126 -0
  41. data/spec/sexy_form/themes/bulma_vertical_spec.rb +114 -0
  42. data/spec/sexy_form/themes/default_spec.rb +102 -0
  43. data/spec/sexy_form/themes/foundation_spec.rb +103 -0
  44. data/spec/sexy_form/themes/materialize_spec.rb +103 -0
  45. data/spec/sexy_form/themes/milligram_spec.rb +120 -0
  46. data/spec/sexy_form/themes/semantic_ui_inline_spec.rb +105 -0
  47. data/spec/sexy_form/themes/semantic_ui_vertical_spec.rb +105 -0
  48. data/spec/sexy_form/themes/theme_spec_helper.rb +0 -0
  49. data/spec/sexy_form/themes_spec.rb +52 -0
  50. data/spec/sexy_form_spec.rb +54 -0
  51. data/spec/spec_helper.rb +16 -0
  52. metadata +160 -0
@@ -0,0 +1,104 @@
1
+ require_relative "../../spec_helper"
2
+ require_relative "./theme_spec_helper"
3
+
4
+ theme_klass = SexyForm::Themes::Bootstrap3Inline
5
+ theme = theme_klass.new
6
+
7
+ describe theme_klass do
8
+
9
+ describe ".theme_name" do
10
+ it "is correct" do
11
+ theme_klass.theme_name.should eq("bootstrap_3_inline")
12
+ end
13
+ end
14
+
15
+ describe ".wrap_field" do
16
+ it "works" do
17
+
18
+ end
19
+ end
20
+
21
+ describe "SexyForm.form" do
22
+ it "matches docs example" do
23
+ expected = build_string do |str|
24
+ str << %Q(<form class="form-inline" method="post">)
25
+ str << %Q(<div class="form-group">)
26
+ str << %Q(<label for="email">Email</label>)
27
+ str << %Q(<input type="text" name="email" id="email">)
28
+ str << "</div>"
29
+
30
+ str << %Q(<div class="form-group">)
31
+ str << %Q(<label for="password">Password</label>)
32
+ str << %Q(<input type="password" name="password" id="password">)
33
+ str << "</div>"
34
+
35
+ str << %Q(<div class="form-group">)
36
+ str << %Q(<label for="remember_me">)
37
+ str << %Q(<input type="checkbox" name="remember_me" id="remember_me"> Remember Me)
38
+ str << %Q(</label>)
39
+ str << "</div>"
40
+
41
+ str << %Q(<button type="submit" class="btn">Sign in</button>)
42
+ str << "</form>"
43
+ end
44
+
45
+ actual = SexyForm.form(theme: theme_klass.theme_name) do |f|
46
+ f << f.field(type: :text, name: :email)
47
+ f << f.field(type: :password, name: :password)
48
+ f << f.field(type: :checkbox, name: :remember_me)
49
+ f << %Q(<button type="submit" class="btn">Sign in</button>)
50
+ end
51
+
52
+ actual.should eq(expected)
53
+ end
54
+ end
55
+
56
+ describe ".form_html_attributes" do
57
+ it "returns correct attributes" do
58
+ attrs = {}
59
+
60
+ attrs["class"] = "form-inline"
61
+
62
+ theme.form_html_attributes(html_attrs: {}).should eq(attrs)
63
+ end
64
+ end
65
+
66
+ SexyForm::Builder::FIELD_TYPES.each do |field_type|
67
+ describe ".input_html_attributes" do
68
+ it "returns correct #{field_type} attributes" do
69
+ attrs = {}
70
+
71
+ theme.input_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
72
+ end
73
+ end
74
+
75
+ describe ".label_html_attributes" do
76
+ it "returns correct #{field_type} attributes" do
77
+ attrs = {}
78
+
79
+ theme.label_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
80
+ end
81
+ end
82
+
83
+ describe ".build_html_help_text" do
84
+ it "returns correct #{field_type} attributes" do
85
+ expected = "<span class=\"help-block\">foobar</span>"
86
+
87
+ attrs = {}
88
+
89
+ theme.build_html_help_text(html_attrs: attrs, field_type: field_type, help_text: "foobar").should eq(expected)
90
+ end
91
+ end
92
+
93
+ describe ".build_html_error" do
94
+ it "returns correct #{field_type} attributes" do
95
+ expected = "<span class=\"help-block\">foobar</span>"
96
+
97
+ attrs = {}
98
+
99
+ theme.build_html_error(html_attrs: attrs, field_type: field_type, error: "foobar").should eq(expected)
100
+ end
101
+ end
102
+ end
103
+
104
+ end
@@ -0,0 +1,122 @@
1
+ require_relative "../../spec_helper"
2
+ require_relative "./theme_spec_helper"
3
+
4
+ theme_klass = SexyForm::Themes::Bootstrap3Vertical
5
+ theme = theme_klass.new
6
+
7
+ describe theme_klass do
8
+
9
+ describe ".theme_name" do
10
+ it "is correct" do
11
+ theme_klass.theme_name.should eq("bootstrap_3_vertical")
12
+ end
13
+ end
14
+
15
+ describe ".wrap_field" do
16
+ it "works" do
17
+
18
+ end
19
+ end
20
+
21
+ describe "SexyForm.form" do
22
+ it "matches docs example" do
23
+ expected = build_string do |str|
24
+ str << %Q(<form method="post">)
25
+ str << %Q(<div class="form-group">)
26
+ str << %Q(<label for="email">Email</label>)
27
+ str << %Q(<input type="text" name="email" id="email">)
28
+ str << "</div>"
29
+
30
+ str << %Q(<div class="form-group">)
31
+ str << %Q(<label for="password">Password</label>)
32
+ str << %Q(<input type="password" name="password" id="password">)
33
+ str << "</div>"
34
+
35
+ str << %Q(<div class="form-group">)
36
+ str << %Q(<label for="remember_me">)
37
+ str << %Q(<input type="checkbox" name="remember_me" id="remember_me"> Remember Me)
38
+ str << %Q(</label>)
39
+ str << "</div>"
40
+
41
+ str << %Q(<button type="submit" class="btn">Sign in</button>)
42
+ str << "</form>"
43
+ end
44
+
45
+ actual = SexyForm.form(theme: theme_klass.theme_name) do |f|
46
+ f << f.field(type: :text, name: :email)
47
+ f << f.field(type: :password, name: :password)
48
+ f << f.field(type: :checkbox, name: :remember_me)
49
+ f << %Q(<button type="submit" class="btn">Sign in</button>)
50
+ end
51
+
52
+ actual.should eq(expected)
53
+ end
54
+ end
55
+
56
+ describe ".input_html_attributes" do
57
+ SexyForm::Builder::FIELD_TYPES.each do |field_type|
58
+ it "returns correct #{field_type} attributes" do
59
+ attrs = {}
60
+
61
+ theme.input_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
62
+ end
63
+ end
64
+ end
65
+
66
+ describe ".label_html_attributes" do
67
+ SexyForm::Builder::FIELD_TYPES.each do |field_type|
68
+ it "returns correct #{field_type} attributes" do
69
+ attrs = {}
70
+
71
+ theme.label_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
72
+ end
73
+ end
74
+ end
75
+
76
+ describe ".form_html_attributes" do
77
+ it "returns correct attributes" do
78
+ attrs = {}
79
+
80
+ theme.form_html_attributes(html_attrs: {}).should eq(attrs)
81
+ end
82
+ end
83
+
84
+ SexyForm::Builder::FIELD_TYPES.each do |field_type|
85
+ describe ".input_html_attributes" do
86
+ it "returns correct #{field_type} attributes" do
87
+ attrs = {}
88
+
89
+ theme.input_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
90
+ end
91
+ end
92
+
93
+ describe ".label_html_attributes" do
94
+ it "returns correct #{field_type} attributes" do
95
+ attrs = {}
96
+
97
+ theme.label_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
98
+ end
99
+ end
100
+
101
+ describe ".build_html_help_text" do
102
+ it "returns correct #{field_type} attributes" do
103
+ expected = "<span class=\"help-block\">foobar</span>"
104
+
105
+ attrs = {}
106
+
107
+ theme.build_html_help_text(html_attrs: attrs, field_type: field_type, help_text: "foobar").should eq(expected)
108
+ end
109
+ end
110
+
111
+ describe ".build_html_error" do
112
+ it "returns correct #{field_type} attributes" do
113
+ expected = "<span class=\"help-block\">foobar</span>"
114
+
115
+ attrs = {}
116
+
117
+ theme.build_html_error(html_attrs: attrs, field_type: field_type, error: "foobar").should eq(expected)
118
+ end
119
+ end
120
+ end
121
+
122
+ end
@@ -0,0 +1,124 @@
1
+ require_relative "../../spec_helper"
2
+ require_relative "./theme_spec_helper"
3
+
4
+ theme_klass = SexyForm::Themes::Bootstrap4Horizontal
5
+ theme = theme_klass.new
6
+
7
+ describe theme_klass do
8
+
9
+ describe ".theme_name" do
10
+ it "is correct" do
11
+ theme_klass.theme_name.should eq("bootstrap_4_horizontal")
12
+ end
13
+ end
14
+
15
+ describe ".wrap_field" do
16
+ it "works" do
17
+
18
+ end
19
+ end
20
+
21
+ describe "SexyForm.form" do
22
+ it "matches docs example" do
23
+ expected = build_string do |str|
24
+ str << %Q(<form method="post">)
25
+ str << %Q(<div class="form-group row">)
26
+ str << %Q(<label class="col-sm-3 col-form-label" for="email">Email</label>)
27
+ str << %Q(<div class="col-sm-9">)
28
+ str << %Q(<input type="text" class="form-control" name="email" id="email">)
29
+ str << %Q(</div>)
30
+ str << %Q(</div>)
31
+
32
+ str << %Q(<div class="form-group row">)
33
+ str << %Q(<label class="col-sm-3 col-form-label" for="password">Password</label>)
34
+ str << %Q(<div class="col-sm-9">)
35
+ str << %Q(<input type="password" class="form-control" name="password" id="password">)
36
+ str << %Q(</div>)
37
+ str << %Q(</div>)
38
+
39
+ str << %Q(<div class="form-group row">)
40
+ str << %Q(<div class="col-sm-offset-3 col-sm-9">)
41
+ str << %Q(<div class="form-check">)
42
+ str << %Q(<input type="checkbox" class="form-check-input" name="remember_me" id="remember_me">)
43
+ str << %Q(<label class="form-check-label" for="remember_me">Remember Me</label>)
44
+ str << %Q(</div>)
45
+ str << %Q(</div>)
46
+ str << %Q(</div>)
47
+
48
+ str << %Q(<button type="submit" class="btn btn-default">Sign in</button>)
49
+ str << %Q(</form>)
50
+ end
51
+
52
+ actual = SexyForm.form(theme: theme_klass.new(column_classes: ["col-sm-3", "col-sm-9"])) do |f|
53
+ f << f.field(type: :text, name: :email)
54
+ f << f.field(type: :password, name: :password)
55
+ f << f.field(type: :checkbox, name: :remember_me)
56
+ f << %Q(<button type="submit" class="btn btn-default">Sign in</button>)
57
+ end
58
+
59
+ actual.should eq(expected)
60
+ end
61
+ end
62
+
63
+ describe ".form_html_attributes" do
64
+ it "returns correct attributes" do
65
+ attrs = {}
66
+
67
+ theme.form_html_attributes(html_attrs: {}).should eq(attrs)
68
+ end
69
+ end
70
+
71
+ SexyForm::Builder::FIELD_TYPES.each do |field_type|
72
+ describe ".input_html_attributes" do
73
+ it "returns correct #{field_type} attributes" do
74
+ attrs = {}
75
+
76
+ case field_type
77
+ when "checkbox", "radio"
78
+ attrs["class"] = "form-check-input"
79
+ when "file"
80
+ attrs["class"] = "form-control-file"
81
+ else
82
+ attrs["class"] = "form-control"
83
+ end
84
+
85
+ theme.input_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
86
+ end
87
+ end
88
+
89
+ describe ".label_html_attributes" do
90
+ it "returns correct #{field_type} attributes" do
91
+ attrs = {}
92
+
93
+ if ["checkbox", "radio"].include?(field_type)
94
+ attrs["class"] = "form-check-label"
95
+ else
96
+ attrs["class"] = "col-sm-3 col-form-label"
97
+ end
98
+
99
+ theme.label_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
100
+ end
101
+ end
102
+
103
+ describe ".build_html_help_text" do
104
+ it "returns correct #{field_type} attributes" do
105
+ expected = "<small class=\"form-text\">foobar</small>"
106
+
107
+ attrs = {}
108
+
109
+ theme.build_html_help_text(html_attrs: attrs, field_type: field_type, help_text: "foobar").should eq(expected)
110
+ end
111
+ end
112
+
113
+ describe ".build_html_error" do
114
+ it "returns correct #{field_type} attributes" do
115
+ expected = "<div class=\"invalid-feedback\">foobar</div>"
116
+
117
+ attrs = {}
118
+
119
+ theme.build_html_error(html_attrs: attrs, field_type: field_type, error: "foobar").should eq(expected)
120
+ end
121
+ end
122
+ end
123
+
124
+ end
@@ -0,0 +1,116 @@
1
+ require_relative "../../spec_helper"
2
+ require_relative "./theme_spec_helper"
3
+
4
+ theme_klass = SexyForm::Themes::Bootstrap4Inline
5
+ theme = theme_klass.new
6
+
7
+ describe theme_klass do
8
+
9
+ describe ".theme_name" do
10
+ it "is correct" do
11
+ theme_klass.theme_name.should eq("bootstrap_4_inline")
12
+ end
13
+ end
14
+
15
+ describe ".wrap_field" do
16
+ it "works" do
17
+
18
+ end
19
+ end
20
+
21
+ describe "SexyForm.form" do
22
+ it "matches docs example" do
23
+ expected = build_string do |str|
24
+ str << %Q(<form class="form-inline" method="post">)
25
+ str << %Q(<div class="form-group">)
26
+ str << %Q(<label for="email">Email</label>)
27
+ str << %Q(<input type="text" class="form-control" name="email" id="email">)
28
+ str << "</div>"
29
+
30
+ str << %Q(<div class="form-group">)
31
+ str << %Q(<label for="password">Password</label>)
32
+ str << %Q(<input type="password" class="form-control" name="password" id="password">)
33
+ str << "</div>"
34
+
35
+ str << %Q(<div class="form-group form-check">)
36
+ str << %Q(<input type="checkbox" class="form-check-input" name="remember_me" id="remember_me">)
37
+ str << %Q(<label class="form-check-label" for="remember_me">Remember Me</label>)
38
+ str << "</div>"
39
+
40
+ str << %Q(<button type="submit" class="btn btn-primary">Sign in</button>)
41
+ str << "</form>"
42
+ end
43
+
44
+ actual = SexyForm.form(theme: theme_klass.theme_name) do |f|
45
+ f << f.field(type: :text, name: :email)
46
+ f << f.field(type: :password, name: :password)
47
+ f << f.field(type: :checkbox, name: :remember_me)
48
+ f << %Q(<button type="submit" class="btn btn-primary">Sign in</button>)
49
+ end
50
+
51
+ actual.should eq(expected)
52
+ end
53
+ end
54
+
55
+ describe ".form_html_attributes" do
56
+ it "returns correct attributes" do
57
+ attrs = {}
58
+
59
+ attrs["class"] = "form-inline"
60
+
61
+ theme.form_html_attributes(html_attrs: {}).should eq(attrs)
62
+ end
63
+ end
64
+
65
+ SexyForm::Builder::FIELD_TYPES.each do |field_type|
66
+ describe ".input_html_attributes" do
67
+ it "returns correct #{field_type} attributes" do
68
+ attrs = {}
69
+
70
+ case field_type
71
+ when "checkbox", "radio"
72
+ attrs["class"] = "form-check-input"
73
+ when "file"
74
+ attrs["class"] = "form-control-file"
75
+ else
76
+ attrs["class"] = "form-control"
77
+ end
78
+
79
+ theme.input_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
80
+ end
81
+ end
82
+
83
+ describe ".label_html_attributes" do
84
+ it "returns correct #{field_type} attributes" do
85
+ attrs = {}
86
+
87
+ if ["checkbox", "radio"].include?(field_type)
88
+ attrs["class"] = "form-check-label"
89
+ end
90
+
91
+ theme.label_html_attributes(html_attrs: {}, field_type: field_type, has_errors: false).should eq(attrs)
92
+ end
93
+ end
94
+
95
+ describe ".build_html_help_text" do
96
+ it "returns correct #{field_type} attributes" do
97
+ expected = "<small class=\"form-text\">foobar</small>"
98
+
99
+ attrs = {}
100
+
101
+ theme.build_html_help_text(html_attrs: attrs, field_type: field_type, help_text: "foobar").should eq(expected)
102
+ end
103
+ end
104
+
105
+ describe ".build_html_error" do
106
+ it "returns correct #{field_type} attributes" do
107
+ expected = "<div class=\"invalid-feedback\">foobar</div>"
108
+
109
+ attrs = {}
110
+
111
+ theme.build_html_error(html_attrs: attrs, field_type: field_type, error: "foobar").should eq(expected)
112
+ end
113
+ end
114
+ end
115
+
116
+ end