power_resource 0.0.1 → 0.0.2

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/README.md +77 -10
  4. data/app/controllers/power_resource/base_controller.rb +19 -7
  5. data/app/helpers/power_resource/action_helper.rb +147 -0
  6. data/app/helpers/power_resource/base_helper.rb +51 -103
  7. data/app/helpers/power_resource/collection_helper.rb +20 -0
  8. data/app/helpers/power_resource/configuration_helper.rb +11 -0
  9. data/app/helpers/power_resource/rendering_helper.rb +26 -0
  10. data/app/views/power_resource/base/_actions.html.erb +3 -1
  11. data/app/views/power_resource/base/_collection.html.erb +5 -11
  12. data/app/views/power_resource/base/edit.html.erb +1 -1
  13. data/app/views/power_resource/base/index.html.erb +1 -1
  14. data/app/views/power_resource/base/new.html.erb +1 -1
  15. data/app/views/power_resource/builders/_form_for.html.erb +12 -3
  16. data/lib/power_resource.rb +1 -0
  17. data/lib/power_resource/configuration.rb +19 -0
  18. data/lib/power_resource/version.rb +1 -1
  19. data/power_resource.gemspec +9 -7
  20. data/spec/dummy/app/assets/javascripts/application.js +2 -0
  21. data/spec/dummy/app/assets/javascripts/categories.js +2 -0
  22. data/spec/dummy/app/assets/javascripts/comments.js +2 -0
  23. data/spec/dummy/app/assets/stylesheets/categories.css +4 -0
  24. data/spec/dummy/app/assets/stylesheets/comments.css +4 -0
  25. data/spec/dummy/app/controllers/backend/categories_controller.rb +7 -0
  26. data/spec/dummy/app/controllers/backend/comments_controller.rb +9 -0
  27. data/spec/dummy/app/controllers/backend/posts_controller.rb +7 -0
  28. data/spec/dummy/app/controllers/categories_controller.rb +5 -0
  29. data/spec/dummy/app/controllers/comments_controller.rb +7 -0
  30. data/spec/dummy/app/controllers/posts_controller.rb +3 -0
  31. data/spec/dummy/app/helpers/categories_helper.rb +2 -0
  32. data/spec/dummy/app/helpers/comments_helper.rb +2 -0
  33. data/spec/dummy/app/models/category.rb +5 -0
  34. data/spec/dummy/app/models/comment.rb +3 -0
  35. data/spec/dummy/app/models/post.rb +2 -0
  36. data/spec/dummy/app/views/layouts/application.html.erb +23 -11
  37. data/spec/dummy/config/initializers/secret_token.rb +1 -1
  38. data/spec/dummy/config/locales/en.yml +11 -22
  39. data/spec/dummy/config/locales/fi.yml +38 -0
  40. data/spec/dummy/config/routes.rb +13 -1
  41. data/spec/dummy/db/development.sqlite3 +0 -0
  42. data/spec/dummy/db/migrate/{20130722165046_create_posts.rb → 20130915095616_create_posts.rb} +1 -0
  43. data/spec/dummy/db/migrate/20130916174608_create_categories.rb +9 -0
  44. data/spec/dummy/db/migrate/20130916180755_create_comments.rb +11 -0
  45. data/spec/dummy/db/schema.rb +18 -1
  46. data/spec/dummy/db/test.sqlite3 +0 -0
  47. data/spec/dummy/log/development.log +17445 -674
  48. data/spec/dummy/log/test.log +20826 -2
  49. data/spec/features/posts_spec.rb +8 -0
  50. data/spec/helpers/action_helper_spec.rb +111 -0
  51. data/spec/helpers/base_helper_spec.rb +111 -1
  52. data/spec/helpers/collection_helper_spec.rb +53 -0
  53. data/spec/helpers/rendering_helper_spec.rb +162 -0
  54. data/spec/spec_helper.rb +11 -0
  55. metadata +92 -26
  56. data/app/views/power_resource/builders/_formtastic.html.erb +0 -4
  57. data/spec/dummy/spec/controllers/posts_controller_spec.rb +0 -5
  58. data/spec/dummy/spec/helpers/posts_helper_spec.rb +0 -15
  59. data/spec/dummy/spec/models/post_spec.rb +0 -5
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Posts' do
4
+ scenario 'User visits posts index page' do
5
+ visit '/posts'
6
+ expect(page).to have_css('h1', text: 'Posts')
7
+ end
8
+ end
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ describe PowerResource::ActionHelper do
4
+ let(:post) { Post.create(title: 'Test post', content: 'Lorem ipsum dolor') }
5
+
6
+ before :each do
7
+ @controller = PostsController.new
8
+ @controller.request = ActionDispatch::TestRequest.new
9
+ @controller.instance_variable_set('@post', post)
10
+ end
11
+
12
+ describe '#resource_action_human_name' do
13
+ it 'returns humanized collection name for an index action' do
14
+ expect(helper.resource_action_human_name(:index)).to eq('Posts')
15
+ end
16
+
17
+ it 'returns humanized name for a new action' do
18
+ expect(helper.resource_action_human_name(:new)).to eq('New Post')
19
+ end
20
+
21
+ it 'returns humanized name for an edit action' do
22
+ expect(helper.resource_action_human_name(:edit)).to eq('Edit Post')
23
+ end
24
+
25
+ it 'returns humanized name for a delete action' do
26
+ expect(helper.resource_action_human_name(:delete)).to eq('Delete Post')
27
+ end
28
+
29
+ it 'returns humanized name for a custom action' do
30
+ expect(helper.resource_action_human_name(:duplicate)).to eq('Duplicate Post')
31
+ end
32
+ end
33
+
34
+ describe '#resource_action_title' do
35
+ it 'returns humanized collection name for an index action' do
36
+ expect(helper.resource_action_title(:index)).to eq('Posts')
37
+ end
38
+
39
+ it 'returns a title for a new action' do
40
+ expect(helper.resource_action_title(:new)).to eq('New Post')
41
+ end
42
+
43
+ it 'returns a title for an edit action' do
44
+ expect(helper.resource_action_title(:edit)).to eq('Edit Post')
45
+ end
46
+
47
+ it 'returns a title for a delete action' do
48
+ expect(helper.resource_action_title(:delete)).to eq('Delete Post')
49
+ end
50
+
51
+ it 'returns a title for a custom action' do
52
+ expect(helper.resource_action_title(:duplicate)).to eq('Duplicate Post')
53
+ end
54
+ end
55
+
56
+ ### Localization specs
57
+
58
+ context 'when locale is set' do
59
+ before :each do
60
+ I18n.locale = :fi
61
+ end
62
+
63
+ after :each do
64
+ I18n.locale = I18n.default_locale
65
+ end
66
+
67
+ describe '#resource_action_human_name' do
68
+ it 'returns localized collection name for an index action' do
69
+ expect(helper.resource_action_human_name(:index)).to eq('Artikkelit')
70
+ end
71
+
72
+ it 'returns localized name for a new action' do
73
+ expect(helper.resource_action_human_name(:new)).to eq('Uusi artikkeli')
74
+ end
75
+
76
+ it 'returns localized name for an edit action' do
77
+ expect(helper.resource_action_human_name(:edit)).to eq('Muokkaa Artikkeli')
78
+ end
79
+
80
+ it 'returns localized name for a delete action' do
81
+ expect(helper.resource_action_human_name(:delete)).to eq('Poista Artikkeli')
82
+ end
83
+
84
+ it 'returns localized name for a custom action' do
85
+ expect(helper.resource_action_human_name(:duplicate)).to eq('Kopioi Artikkeli')
86
+ end
87
+ end
88
+
89
+ describe '#resource_action_title' do
90
+ it 'returns localized collection name for an index action' do
91
+ expect(helper.resource_action_title(:index)).to eq('Artikkelit')
92
+ end
93
+
94
+ it 'returns localized title for a new action' do
95
+ expect(helper.resource_action_title(:new)).to eq('Uusi artikkeli')
96
+ end
97
+
98
+ it 'returns localized title for an edit action' do
99
+ expect(helper.resource_action_title(:edit)).to eq('Muokkaa artikkelia')
100
+ end
101
+
102
+ it 'returns localized title for a delete action' do
103
+ expect(helper.resource_action_title(:delete)).to eq('Poista Artikkeli')
104
+ end
105
+
106
+ it 'returns localized title for a custom action' do
107
+ expect(helper.resource_action_title(:duplicate)).to eq('Kopioi Artikkeli')
108
+ end
109
+ end
110
+ end
111
+ end
@@ -1,8 +1,118 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PowerResource::BaseHelper do
4
+ let(:post) { Post.create(title: 'Test post', content: 'Lorem ipsum dolor') }
5
+
6
+ before :each do
7
+ @controller = PostsController.new
8
+ @controller.request = ActionDispatch::TestRequest.new
9
+ @controller.instance_variable_set('@post', post)
10
+ end
11
+
12
+ describe '#resource_name' do
13
+ it 'returns a name for a current resource' do
14
+ expect(helper.resource_name).to eq('post')
15
+ end
16
+ end
17
+
18
+ describe '#resource_human_name' do
19
+ it 'returns humanized name for a current resource' do
20
+ expect(helper.resource_human_name).to eq('Post')
21
+ end
22
+ end
23
+
24
+ describe '#resource_human_name_for' do
25
+ it 'returns humanized name for a specific resource' do
26
+ expect(helper.resource_human_name_for('Post')).to eq('Post')
27
+ end
28
+ end
29
+
30
+ describe '#resource_title' do
31
+ it 'returns an unique title for a current resource' do
32
+ expected_title = "Post #{post.id}"
33
+ expect(helper.resource_title).to eq(expected_title)
34
+ end
35
+ end
36
+
37
+ describe '#resource_attributes' do
38
+ it 'returns all attributes for a resource' do
39
+ expected_attributes = %w(id category_id title content created_at updated_at)
40
+ expect(helper.resource_attributes).to be == expected_attributes
41
+ end
42
+ end
43
+
44
+ describe '#resource_non_human_attributes' do
45
+ it 'returns attributes that should be invisible for end-users' do
46
+ expected_attributes = %w(id created_at updated_at)
47
+ expect(helper.resource_non_human_attributes).to be == expected_attributes
48
+ end
49
+ end
50
+
51
+ describe '#resource_human_attributes' do
52
+ it 'returns attributes for a resource without non-human attributes' do
53
+ expected_attributes = %w(category_id title content)
54
+ expect(helper.resource_human_attributes).to be == expected_attributes
55
+ end
56
+ end
57
+
58
+ describe '#resource_attribute_human_name_for' do
59
+ it 'returns humanized attribute name' do
60
+ expect(helper.resource_attribute_human_name_for(:title)).to eq('Title')
61
+ end
62
+ end
63
+
64
+ describe '#attribute_value_for' do
65
+ it 'returns preformatted attribute value of a specific resource' do
66
+ expect(helper.attribute_value_for(post, :title)).to eq('Test post')
67
+ end
68
+ end
69
+
4
70
  describe '#resource_form_path' do
5
- it 'returns correct form path' do
71
+ it 'returns a resource path for an existing resource' do
72
+ expect(helper.resource_form_path).to eq("/posts/#{post.id}")
73
+ end
74
+
75
+ it 'returns a collection path for a new resource' do
76
+ @controller.request.action = 'new'
77
+ @controller.instance_variable_set('@post', Post.new)
78
+ expect(helper.resource_form_path).to eq('/posts')
79
+ end
80
+ end
81
+
82
+ ### Localization specs
83
+
84
+ context 'when locale is set' do
85
+ before :each do
86
+ I18n.locale = :fi
87
+ end
88
+
89
+ after :each do
90
+ I18n.locale = I18n.default_locale
91
+ end
92
+
93
+ describe '#resource_human_name' do
94
+ it 'returns localized name for a current resource' do
95
+ expect(helper.resource_human_name).to eq('Artikkeli')
96
+ end
97
+ end
98
+
99
+ describe '#resource_human_name_for' do
100
+ it 'returns localized name for a specific resource' do
101
+ expect(helper.resource_human_name_for('Post')).to eq('Artikkeli')
102
+ end
103
+ end
104
+
105
+ describe '#resource_title' do
106
+ it 'returns an unique localized title for a current resource' do
107
+ expected_title = "Artikkeli nro #{post.id}"
108
+ expect(helper.resource_title(resource_id: post.id)).to eq(expected_title)
109
+ end
110
+ end
111
+
112
+ describe '#resource_attribute_human_name_for' do
113
+ it 'returns localized attribute name' do
114
+ expect(helper.resource_attribute_human_name_for(:title)).to eq('Otsikko')
115
+ end
6
116
  end
7
117
  end
8
118
  end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe PowerResource::CollectionHelper do
4
+ let(:post) { Post.create(title: 'Test post', content: 'Lorem ipsum dolor') }
5
+
6
+ before :each do
7
+ @controller = PostsController.new
8
+ @controller.request = ActionDispatch::TestRequest.new
9
+ @controller.instance_variable_set('@post', post)
10
+ end
11
+
12
+ describe '#collection_name' do
13
+ it 'returns a name for a current collection' do
14
+ expect(helper.collection_name).to eq('posts')
15
+ end
16
+ end
17
+
18
+ describe '#collection_human_name' do
19
+ it 'returns humanized name for a current collection' do
20
+ expect(helper.collection_human_name).to eq('Posts')
21
+ end
22
+ end
23
+
24
+ describe '#collection_title' do
25
+ it 'returns a title for a current collection' do
26
+ expect(helper.collection_title).to eq('Posts')
27
+ end
28
+ end
29
+
30
+ ### Localization specs
31
+
32
+ context 'when locale is set' do
33
+ before :each do
34
+ I18n.locale = :fi
35
+ end
36
+
37
+ after :each do
38
+ I18n.locale = I18n.default_locale
39
+ end
40
+
41
+ describe '#collection_human_name' do
42
+ it 'returns localized name for a current collection' do
43
+ expect(helper.collection_human_name).to eq('Artikkelit')
44
+ end
45
+ end
46
+
47
+ describe '#collection_title' do
48
+ it 'returns localized title for a current collection' do
49
+ expect(helper.collection_title).to eq('Lista artikkeleista')
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+
3
+ describe PowerResource::RenderingHelper do
4
+ let(:post) { Post.create(title: 'Test post', content: 'Lorem ipsum dolor') }
5
+
6
+ before :each do
7
+ @controller = PostsController.new
8
+ @controller.request = ActionDispatch::TestRequest.new
9
+ @controller.instance_variable_set('@post', post)
10
+ end
11
+
12
+ describe '#render_collection_table' do
13
+ it 'renders collection table' do
14
+ expected = '
15
+ <table class="table">
16
+ <thead>
17
+ <tr>
18
+ <th>Category</th>
19
+ <th>Title</th>
20
+ <th>Content</th>
21
+ <th>&nbsp;</th>
22
+ </tr>
23
+ </thead>
24
+ <tbody>
25
+ <tr>
26
+ <td></td>
27
+ <td>Test post</td>
28
+ <td>Lorem ipsum dolor</td>
29
+ <td>
30
+ <a class="btn btn-default btn-xs" href="/posts/1/comments">Comments</a>
31
+ <a class="btn btn-default btn-xs" href="/posts/1/edit">Edit</a>
32
+ <a class="btn btn-default btn-xs" data-confirm="Are you sure?" data-method="delete"
33
+ href="/posts/1" rel="nofollow">Delete</a>
34
+ </td>
35
+ </tr>
36
+ </tbody>
37
+ </table>
38
+ '
39
+ output = helper.render_collection_table.gsub(/(^ +|\n)/, '')
40
+ expect(output).to eq(expected.gsub(/(^ +|\n)/, ''))
41
+ end
42
+ end
43
+
44
+ context 'when form builder is form_for' do
45
+ context 'with action :edit' do
46
+ describe '#render_form' do
47
+ it 'renders edit form using form_for' do
48
+ expected = '
49
+ <form accept-charset="UTF-8" action="/posts/1" class="edit_post"
50
+ id="edit_post_1" method="post">
51
+ <div style="margin:0;padding:0;display:inline">
52
+ <input name="utf8" type="hidden" value="&#x2713;" />
53
+ <input name="_method" type="hidden" value="patch" />
54
+ </div>
55
+ <ul>
56
+ <li>
57
+ <label for="post_category_id">Category</label>
58
+ <select id="post_category_id" name="post[category_id]"></select>
59
+ </li>
60
+ <li>
61
+ <label for="post_title">Title</label>
62
+ <input id="post_title" name="post[title]" type="text"
63
+ value="Test post" />
64
+ </li>
65
+ <li>
66
+ <label for="post_content">Content</label>
67
+ <textarea id="post_content" name="post[content]">
68
+ Lorem ipsum dolor
69
+ </textarea>
70
+ </li>
71
+ </ul>
72
+ <input name="commit" type="submit" value="Update Post" />
73
+ </form>
74
+ '
75
+ output = helper.render_form.gsub(/(^ +|\n)/, '')
76
+ expect(output).to eq(expected.gsub(/(^ +|\n)/, ''))
77
+ end
78
+ end
79
+ end
80
+
81
+ context 'with action :new' do
82
+ before :each do
83
+ @controller.request.action = 'new'
84
+ @controller.instance_variable_set('@post', Post.new)
85
+ end
86
+
87
+ describe '#render_form' do
88
+ it 'renders new form using form_for' do
89
+ expected = '
90
+ <form accept-charset="UTF-8" action="/posts" class="new_post"
91
+ id="new_post" method="post">
92
+ <div style="margin:0;padding:0;display:inline">
93
+ <input name="utf8" type="hidden" value="&#x2713;" />
94
+ </div>
95
+ <ul>
96
+ <li>
97
+ <label for="post_category_id">Category</label>
98
+ <select id="post_category_id" name="post[category_id]"></select>
99
+ </li>
100
+ <li>
101
+ <label for="post_title">Title</label>
102
+ <input id="post_title" name="post[title]" type="text" />
103
+ </li>
104
+ <li>
105
+ <label for="post_content">Content</label>
106
+ <textarea id="post_content" name="post[content]"></textarea>
107
+ </li>
108
+ </ul>
109
+ <input name="commit" type="submit" value="Create Post" />
110
+ </form>
111
+ '
112
+ output = helper.render_form.gsub(/(^ +|\n)/, '')
113
+ expect(output).to eq(expected.gsub(/(^ +|\n)/, ''))
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ ### Localization specs
120
+
121
+ context 'when locale is set' do
122
+ before :each do
123
+ I18n.locale = :fi
124
+ end
125
+
126
+ after :each do
127
+ I18n.locale = I18n.default_locale
128
+ end
129
+
130
+ describe '#render_collection_table' do
131
+ it 'renders localized collection table' do
132
+ expected = '
133
+ <table class="table">
134
+ <thead>
135
+ <tr>
136
+ <th>Kategoria</th>
137
+ <th>Otsikko</th>
138
+ <th>Sisältö</th>
139
+ <th>&nbsp;</th>
140
+ </tr>
141
+ </thead>
142
+ <tbody>
143
+ <tr>
144
+ <td></td>
145
+ <td>Test post</td>
146
+ <td>Lorem ipsum dolor</td>
147
+ <td>
148
+ <a class="btn btn-default btn-xs" href="/posts/1/comments">Kommentit</a>
149
+ <a class="btn btn-default btn-xs" href="/posts/1/edit">Muokkaa</a>
150
+ <a class="btn btn-default btn-xs" data-confirm="Oletko varma?" data-method="delete"
151
+ href="/posts/1" rel="nofollow">Poista</a>
152
+ </td>
153
+ </tr>
154
+ </tbody>
155
+ </table>
156
+ '
157
+ output = helper.render_collection_table.gsub(/(^ +|\n)/, '')
158
+ expect(output).to eq(expected.gsub(/(^ +|\n)/, ''))
159
+ end
160
+ end
161
+ end
162
+ end