awesome_form 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +113 -0
  4. data/Rakefile +23 -0
  5. data/app/views/awesome_form/default_theme/actions/_default.html.haml +8 -0
  6. data/app/views/awesome_form/default_theme/inputs/_association.html.haml +14 -0
  7. data/app/views/awesome_form/default_theme/inputs/_boolean.html.haml +12 -0
  8. data/app/views/awesome_form/default_theme/inputs/_check_boxes.html.haml +18 -0
  9. data/app/views/awesome_form/default_theme/inputs/_default.html.haml +11 -0
  10. data/app/views/awesome_form/default_theme/inputs/_radios.html.haml +18 -0
  11. data/app/views/awesome_form/default_theme/inputs/_select.html.haml +18 -0
  12. data/app/views/awesome_form/default_theme/inputs/_text.html.haml +9 -0
  13. data/app/views/awesome_form/default_theme/wrappers/_actions.html.haml +2 -0
  14. data/app/views/awesome_form/default_theme/wrappers/_boolean.html.haml +4 -0
  15. data/app/views/awesome_form/default_theme/wrappers/_default.html.haml +4 -0
  16. data/app/views/awesome_form/default_theme/wrappers/_inputs.html.haml +2 -0
  17. data/config/routes.rb +2 -0
  18. data/lib/awesome_form.rb +36 -0
  19. data/lib/awesome_form/action_view_extensions/form_helper.rb +13 -0
  20. data/lib/awesome_form/engine.rb +4 -0
  21. data/lib/awesome_form/form_builder.rb +63 -0
  22. data/lib/awesome_form/methods/actions.rb +78 -0
  23. data/lib/awesome_form/methods/attributes.rb +117 -0
  24. data/lib/awesome_form/methods/inputs.rb +64 -0
  25. data/lib/awesome_form/methods/labels.rb +18 -0
  26. data/lib/awesome_form/methods/naming.rb +32 -0
  27. data/lib/awesome_form/methods/rendering.rb +44 -0
  28. data/lib/awesome_form/version.rb +3 -0
  29. data/lib/tasks/awesome_form_tasks.rake +4 -0
  30. data/spec/dummy/README.rdoc +28 -0
  31. data/spec/dummy/Rakefile +6 -0
  32. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  33. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  34. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  35. data/spec/dummy/app/controllers/forms_controller.rb +3 -0
  36. data/spec/dummy/app/controllers/sessions_controller.rb +2 -0
  37. data/spec/dummy/app/controllers/universes_controller.rb +2 -0
  38. data/spec/dummy/app/controllers/users_controller.rb +2 -0
  39. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  40. data/spec/dummy/app/models/session.rb +3 -0
  41. data/spec/dummy/app/models/universe.rb +3 -0
  42. data/spec/dummy/app/models/user.rb +5 -0
  43. data/spec/dummy/app/views/forms/actions.html.haml +2 -0
  44. data/spec/dummy/app/views/forms/blocks.html.haml +6 -0
  45. data/spec/dummy/app/views/forms/check_boxes.html.haml +4 -0
  46. data/spec/dummy/app/views/forms/data.html.haml +2 -0
  47. data/spec/dummy/app/views/forms/fields_for.html.haml +9 -0
  48. data/spec/dummy/app/views/forms/inputs.html.haml +8 -0
  49. data/spec/dummy/app/views/forms/radios.html.haml +4 -0
  50. data/spec/dummy/app/views/forms/selects.html.haml +9 -0
  51. data/spec/dummy/app/views/forms/wrappers.html.haml +3 -0
  52. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  53. data/spec/dummy/app/views/sessions/new.html.haml +7 -0
  54. data/spec/dummy/app/views/universes/new.html.haml +5 -0
  55. data/spec/dummy/app/views/users/new.html.haml +5 -0
  56. data/spec/dummy/bin/bundle +3 -0
  57. data/spec/dummy/bin/rails +4 -0
  58. data/spec/dummy/bin/rake +4 -0
  59. data/spec/dummy/config.ru +4 -0
  60. data/spec/dummy/config/application.rb +28 -0
  61. data/spec/dummy/config/boot.rb +5 -0
  62. data/spec/dummy/config/database.yml +25 -0
  63. data/spec/dummy/config/environment.rb +5 -0
  64. data/spec/dummy/config/environments/development.rb +29 -0
  65. data/spec/dummy/config/environments/production.rb +80 -0
  66. data/spec/dummy/config/environments/test.rb +36 -0
  67. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  68. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  69. data/spec/dummy/config/initializers/inflections.rb +16 -0
  70. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  71. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  72. data/spec/dummy/config/initializers/session_store.rb +3 -0
  73. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  74. data/spec/dummy/config/locales/en.yml +23 -0
  75. data/spec/dummy/config/routes.rb +18 -0
  76. data/spec/dummy/db/development.sqlite3 +0 -0
  77. data/spec/dummy/db/migrate/20140108211716_create_users.rb +13 -0
  78. data/spec/dummy/db/migrate/20140108213444_create_universes.rb +11 -0
  79. data/spec/dummy/db/migrate/20140108214030_create_sessions.rb +10 -0
  80. data/spec/dummy/db/schema.rb +45 -0
  81. data/spec/dummy/db/test.sqlite3 +0 -0
  82. data/spec/dummy/log/development.log +14421 -0
  83. data/spec/dummy/log/test.log +84789 -0
  84. data/spec/dummy/public/404.html +58 -0
  85. data/spec/dummy/public/422.html +58 -0
  86. data/spec/dummy/public/500.html +57 -0
  87. data/spec/dummy/public/favicon.ico +0 -0
  88. data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  89. data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  90. data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  91. data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  92. data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  93. data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  94. data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  95. data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  96. data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  97. data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  98. data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  99. data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  100. data/spec/features/actions_generation_spec.rb +13 -0
  101. data/spec/features/awesome_form_for_spec.rb +25 -0
  102. data/spec/features/blocks_handling_spec.rb +16 -0
  103. data/spec/features/classes_spec.rb +14 -0
  104. data/spec/features/fields_discovery_spec.rb +34 -0
  105. data/spec/features/inputs_generation_spec.rb +73 -0
  106. data/spec/features/wrappers_generation_spec.rb +36 -0
  107. data/spec/spec_helper.rb +35 -0
  108. data/spec/support/dom/dom_expression.rb +62 -0
  109. data/spec/support/factories/universes.rb +5 -0
  110. data/spec/support/features/match_content_of.rb +6 -0
  111. data/spec/units/awesome_form_spec.rb +11 -0
  112. metadata +263 -0
@@ -0,0 +1,58 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style>
6
+ body {
7
+ background-color: #EFEFEF;
8
+ color: #2E2F30;
9
+ text-align: center;
10
+ font-family: arial, sans-serif;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 25em;
15
+ margin: 4em auto 0 auto;
16
+ border: 1px solid #CCC;
17
+ border-right-color: #999;
18
+ border-left-color: #999;
19
+ border-bottom-color: #BBB;
20
+ border-top: #B00100 solid 4px;
21
+ border-top-left-radius: 9px;
22
+ border-top-right-radius: 9px;
23
+ background-color: white;
24
+ padding: 7px 4em 0 4em;
25
+ }
26
+
27
+ h1 {
28
+ font-size: 100%;
29
+ color: #730E15;
30
+ line-height: 1.5em;
31
+ }
32
+
33
+ body > p {
34
+ width: 33em;
35
+ margin: 0 auto 1em;
36
+ padding: 1em 0;
37
+ background-color: #F7F7F7;
38
+ border: 1px solid #CCC;
39
+ border-right-color: #999;
40
+ border-bottom-color: #999;
41
+ border-bottom-left-radius: 4px;
42
+ border-bottom-right-radius: 4px;
43
+ border-top-color: #DADADA;
44
+ color: #666;
45
+ box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
+ }
47
+ </style>
48
+ </head>
49
+
50
+ <body>
51
+ <!-- This file lives in public/404.html -->
52
+ <div class="dialog">
53
+ <h1>The page you were looking for doesn't exist.</h1>
54
+ <p>You may have mistyped the address or the page may have moved.</p>
55
+ </div>
56
+ <p>If you are the application owner check the logs for more information.</p>
57
+ </body>
58
+ </html>
@@ -0,0 +1,58 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style>
6
+ body {
7
+ background-color: #EFEFEF;
8
+ color: #2E2F30;
9
+ text-align: center;
10
+ font-family: arial, sans-serif;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 25em;
15
+ margin: 4em auto 0 auto;
16
+ border: 1px solid #CCC;
17
+ border-right-color: #999;
18
+ border-left-color: #999;
19
+ border-bottom-color: #BBB;
20
+ border-top: #B00100 solid 4px;
21
+ border-top-left-radius: 9px;
22
+ border-top-right-radius: 9px;
23
+ background-color: white;
24
+ padding: 7px 4em 0 4em;
25
+ }
26
+
27
+ h1 {
28
+ font-size: 100%;
29
+ color: #730E15;
30
+ line-height: 1.5em;
31
+ }
32
+
33
+ body > p {
34
+ width: 33em;
35
+ margin: 0 auto 1em;
36
+ padding: 1em 0;
37
+ background-color: #F7F7F7;
38
+ border: 1px solid #CCC;
39
+ border-right-color: #999;
40
+ border-bottom-color: #999;
41
+ border-bottom-left-radius: 4px;
42
+ border-bottom-right-radius: 4px;
43
+ border-top-color: #DADADA;
44
+ color: #666;
45
+ box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
+ }
47
+ </style>
48
+ </head>
49
+
50
+ <body>
51
+ <!-- This file lives in public/422.html -->
52
+ <div class="dialog">
53
+ <h1>The change you wanted was rejected.</h1>
54
+ <p>Maybe you tried to change something you didn't have access to.</p>
55
+ </div>
56
+ <p>If you are the application owner check the logs for more information.</p>
57
+ </body>
58
+ </html>
@@ -0,0 +1,57 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style>
6
+ body {
7
+ background-color: #EFEFEF;
8
+ color: #2E2F30;
9
+ text-align: center;
10
+ font-family: arial, sans-serif;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 25em;
15
+ margin: 4em auto 0 auto;
16
+ border: 1px solid #CCC;
17
+ border-right-color: #999;
18
+ border-left-color: #999;
19
+ border-bottom-color: #BBB;
20
+ border-top: #B00100 solid 4px;
21
+ border-top-left-radius: 9px;
22
+ border-top-right-radius: 9px;
23
+ background-color: white;
24
+ padding: 7px 4em 0 4em;
25
+ }
26
+
27
+ h1 {
28
+ font-size: 100%;
29
+ color: #730E15;
30
+ line-height: 1.5em;
31
+ }
32
+
33
+ body > p {
34
+ width: 33em;
35
+ margin: 0 auto 1em;
36
+ padding: 1em 0;
37
+ background-color: #F7F7F7;
38
+ border: 1px solid #CCC;
39
+ border-right-color: #999;
40
+ border-bottom-color: #999;
41
+ border-bottom-left-radius: 4px;
42
+ border-bottom-right-radius: 4px;
43
+ border-top-color: #DADADA;
44
+ color: #666;
45
+ box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
+ }
47
+ </style>
48
+ </head>
49
+
50
+ <body>
51
+ <!-- This file lives in public/500.html -->
52
+ <div class="dialog">
53
+ <h1>We're sorry, but something went wrong.</h1>
54
+ </div>
55
+ <p>If you are the application owner check the logs for more information.</p>
56
+ </body>
57
+ </html>
File without changes
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'generating actions' do
4
+
5
+ scenario 'with various type' do
6
+ visit '/actions'
7
+
8
+ match_content_of(page, '
9
+ button[type="submit"]
10
+ button[type="reset"]
11
+ ')
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'awesome_form_for used in a view', js: true do
4
+
5
+ scenario 'for a new session' do
6
+ visit '/sessions/new'
7
+
8
+ match_content_of(page, '
9
+ body
10
+ form#new_user
11
+ div
12
+ input[name="utf8"][type="hidden"]
13
+
14
+ input[name="user[email]"][type="email"]
15
+ input[name="user[password]"][type="password"]
16
+ input[name="user[remember_me]"][type="checkbox"]
17
+
18
+ button[type="submit"][name="commit"]
19
+ ')
20
+
21
+ match_content_of(page, '.field input[name="user[email]"][type="email"]')
22
+
23
+ expect(page.find('button[type="submit"]')).to have_content 'Submit'
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'block handling' do
4
+ scenario '' do
5
+ visit '/blocks'
6
+
7
+ match_content_of(page, '
8
+ fieldset.inputs
9
+ input[name="user[name]"]
10
+ input[name="user[email]"]
11
+
12
+ fieldset.actions
13
+ button[type="submit"]
14
+ ')
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'semantic classes' do
4
+ scenario 'on a form' do
5
+ visit '/users/new'
6
+
7
+ match_content_of(page, '
8
+ form
9
+ input.input.user.email
10
+
11
+ button.action.user.submit
12
+ ')
13
+ end
14
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'discovering models field', js: true do
4
+ let(:universe) { FactoryGirl.create :universe }
5
+
6
+ before { universe }
7
+
8
+ scenario 'for a new user' do
9
+
10
+ visit '/users/new'
11
+
12
+ match_content_of(page, '
13
+ form#new_user
14
+ input[name="user[name]"]
15
+ input[name="user[email]"]
16
+ input[name="user[dead]"][type="checkbox"]
17
+ input[name="user[born_at]"][type="datetime"]
18
+ select[name="user[universe_id]"]
19
+ option[value="1"]
20
+ ')
21
+ end
22
+
23
+ scenario 'for a new universe' do
24
+ visit '/universes/new'
25
+
26
+ match_content_of(page, '
27
+ form#new_universe
28
+ input[name="universe[name]"]
29
+ input[name="universe[entropy]"][type="number"]
30
+ input[name="universe[light_years]"][type="number"]
31
+ select[name="universe[user_ids][]"][multiple]
32
+ ')
33
+ end
34
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'for more complex forms' do
4
+ scenario 'such with fields_for' do
5
+ visit '/fields_for'
6
+
7
+ match_content_of(page, '
8
+ form
9
+ input[name="user[name]"]
10
+ input[name="user[universe_attributes][name]"][type="text"]
11
+ ')
12
+ end
13
+
14
+ scenario 'with custom select collection' do
15
+ visit '/selects'
16
+
17
+ match_content_of(page, '
18
+ form
19
+ select[name="universe[bar]"]
20
+ option[value=""]
21
+ option[value="1"]
22
+ option[value="10"]
23
+ option[value="100"][selected]
24
+ option[value="1000"]
25
+
26
+ select[name="universe[foo][]"][multiple]
27
+ option[value=""]
28
+ option[value="a"][selected]
29
+ option[value="b"][selected]
30
+ option[value="c"]
31
+ option[value="d"]
32
+ option[value="e"][selected]
33
+ option[value="f"]
34
+ ')
35
+ end
36
+
37
+ scenario 'with checkbox collection' do
38
+ visit '/check_boxes'
39
+
40
+ page.all('input[type="checkbox"]').length.should == 2
41
+ end
42
+
43
+ scenario 'with radio collection' do
44
+ visit '/radios'
45
+
46
+ page.all('input[type="radio"]').length.should == 2
47
+ end
48
+
49
+ scenario 'with all inputs type' do
50
+ visit '/inputs'
51
+
52
+ match_content_of(page, '
53
+ form
54
+ textarea[name="user[foo]"]
55
+ input[name="user[foo]"][type="text"][value="bar"]
56
+ input[name="user[foo]"][type="range"][value="5"][min][max][step]
57
+ input[name="user[foo]"][type="number"][value="5"][min][max][step]
58
+ input[name="user[foo]"][type="datetime"][value][min][max]
59
+ input[name="user[foo]"][type="checkbox"][value="1"][checked]
60
+ input[name="user[foo]"][type="file"]
61
+
62
+ ')
63
+ end
64
+
65
+ scenario 'with data attributes' do
66
+ visit '/data'
67
+
68
+ match_content_of(page, '
69
+ form
70
+ input[data-id][data-type]
71
+ ')
72
+ end
73
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'wrappers' do
4
+ scenario 'for fields' do
5
+ visit '/sessions/new'
6
+
7
+ match_content_of(page,'
8
+ form
9
+ .field
10
+ label[for="user_email_input"]
11
+ .controls
12
+ input[name="user[email]"][id="user_email_input"]
13
+
14
+ .field
15
+ input[name="user[remember_me]"][id="user_remember_me_input"]
16
+ label[for="user_remember_me_input"]
17
+ ')
18
+
19
+ expect(page.find('label[for="user_email_input"]')).to have_content 'Email'
20
+ expect(page.find('label[for="user_remember_me_input"]')).to have_content 'Remember me'
21
+ end
22
+
23
+ scenario 'for inputs and actions' do
24
+ visit '/wrappers'
25
+
26
+ match_content_of(page, '
27
+ fieldset.inputs
28
+ input
29
+
30
+ fieldset.actions
31
+ button
32
+ ')
33
+
34
+ expect(page.find('legend')).to have_content 'Irrelevant'
35
+ end
36
+ end
@@ -0,0 +1,35 @@
1
+ require 'rubygems'
2
+
3
+ # Coveralls must be required first
4
+ require 'coveralls'
5
+ Coveralls.wear!
6
+
7
+ ENV["RAILS_ENV"] ||= "test"
8
+ ENV["RAILS_ROOT"] = File.expand_path("../dummy", __FILE__)
9
+ require File.expand_path("../dummy/config/environment", __FILE__)
10
+
11
+ require "rspec/rails"
12
+ require "rspec/autorun"
13
+
14
+ require "aruba/api"
15
+
16
+ require "capybara/rails"
17
+ require 'capybara/poltergeist'
18
+ Capybara.javascript_driver = :poltergeist
19
+ Capybara.ignore_hidden_elements = false
20
+
21
+ Dir[File.expand_path("../support/**/*.rb", __FILE__)].each { |f| require f }
22
+
23
+ root = Rails.root
24
+
25
+ RSpec.configure do |config|
26
+
27
+ config.fixture_path = "#{root}/spec/fixtures"
28
+
29
+ config.use_transactional_fixtures = false
30
+
31
+ config.infer_base_class_for_anonymous_controllers = false
32
+
33
+ config.order = "random"
34
+
35
+ end