rad_kit 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/Rakefile +11 -0
  2. data/lib/components/kit.rb +16 -0
  3. data/lib/components/kit.yml +3 -0
  4. data/lib/components/models.rb +7 -0
  5. data/lib/kit/factories.rb +9 -0
  6. data/lib/kit/gems.rb +16 -0
  7. data/lib/kit/http_controller.rb +4 -0
  8. data/lib/kit/http_controller/authorized.rb +51 -0
  9. data/lib/kit/http_controller/localized.rb +13 -0
  10. data/lib/kit/kit.rb +29 -0
  11. data/lib/kit/models.rb +8 -0
  12. data/lib/kit/models/attachment_uploader.rb +15 -0
  13. data/lib/kit/models/attachments_uploader_helper.rb +79 -0
  14. data/lib/kit/models/authorized.rb +188 -0
  15. data/lib/kit/models/authorized_object.rb +167 -0
  16. data/lib/kit/models/default_permissions.yml +29 -0
  17. data/lib/kit/models/file_uploader.rb +26 -0
  18. data/lib/kit/models/micelaneous.rb +1 -0
  19. data/lib/kit/models/role.rb +88 -0
  20. data/lib/kit/models_after.rb +27 -0
  21. data/lib/kit/mongoid.rb +22 -0
  22. data/lib/kit/mongoid/rad_micelaneous.rb +36 -0
  23. data/lib/kit/mongoid/text_processor.rb +44 -0
  24. data/lib/kit/spec.rb +77 -0
  25. data/lib/kit/spec/items_controller_crud.rb +64 -0
  26. data/lib/kit/support.rb +14 -0
  27. data/lib/kit/support/string.rb +6 -0
  28. data/lib/kit/tasks.rb +18 -0
  29. data/lib/kit/text_utils.rb +43 -0
  30. data/lib/kit/text_utils/code_highlighter.rb +58 -0
  31. data/lib/kit/text_utils/custom_markdown.rb +90 -0
  32. data/lib/kit/text_utils/ensure_utf.rb +8 -0
  33. data/lib/kit/text_utils/github_flavoured_markdown.rb +32 -0
  34. data/lib/kit/text_utils/html_sanitizer.rb +89 -0
  35. data/lib/kit/text_utils/image_box.rb +35 -0
  36. data/lib/kit/text_utils/markup.rb +43 -0
  37. data/lib/kit/text_utils/processor.rb +25 -0
  38. data/lib/kit/text_utils/tag_shortcuts.rb +14 -0
  39. data/lib/kit/text_utils/truncate.rb +29 -0
  40. data/lib/kit/text_utils/truncator.rb +15 -0
  41. data/lib/kit/text_utils/urls.rb +13 -0
  42. data/readme.md +10 -0
  43. data/spec/controller/authorization_spec.rb +149 -0
  44. data/spec/controller/comments_spec.rb +54 -0
  45. data/spec/controller/items_spec.rb +45 -0
  46. data/spec/models/attachments_spec.rb +24 -0
  47. data/spec/models/attachments_spec/a.txt +1 -0
  48. data/spec/models/attachments_uploader_helper_spec.rb +108 -0
  49. data/spec/models/attachments_uploader_helper_spec/v1/a.txt +1 -0
  50. data/spec/models/attachments_uploader_helper_spec/v1/b.txt +1 -0
  51. data/spec/models/attachments_uploader_helper_spec/v2/a.txt +1 -0
  52. data/spec/models/authorization_spec.rb +77 -0
  53. data/spec/models/authorized_object_spec.rb +254 -0
  54. data/spec/models/comments_spec.rb +1 -0
  55. data/spec/models/item_spec.rb +51 -0
  56. data/spec/models/role_spec.rb +17 -0
  57. data/spec/models/tags_spec.rb +44 -0
  58. data/spec/models/uploader_spec.rb +37 -0
  59. data/spec/models/uploader_spec//321/204/320/260/320/270/314/206/320/273 /321/201 /320/277/321/200/320/276/320/261/320/265/320/273/320/260/320/274/320/270.txt" +1 -0
  60. data/spec/mongoid/basic_spec.rb +36 -0
  61. data/spec/spec_helper.rb +20 -0
  62. data/spec/spec_helper/controller.rb +9 -0
  63. data/spec/spec_helper/factories.rb +24 -0
  64. data/spec/spec_helper/user.rb +17 -0
  65. data/spec/utils/text_utils_spec.rb +280 -0
  66. metadata +232 -0
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Attachments" do
4
+ with_tmp_spec_dir
5
+ with_models
6
+ with_files
7
+ login_as :user
8
+
9
+ before do
10
+ @a = File.open("#{spec_dir}/a.txt")
11
+ end
12
+ after do
13
+ @a.close if @a
14
+ end
15
+
16
+ it "smoke test" do
17
+ item = Factory.create :item, name: 'my note', attachments_as_attachments: [@a]
18
+ item.reload
19
+
20
+ item.attachments.size.should == 1
21
+ # item.attachments.first.file.path.should =~ /\/my note\/a\.txt/
22
+ item.attachments.first.file.path.should =~ /\/#{item.id}\/a\.txt/
23
+ end
24
+ end
@@ -0,0 +1 @@
1
+ a
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Attachments" do
4
+ with_tmp_spec_dir
5
+ with_mongoid
6
+ with_files
7
+
8
+ before :all do
9
+ class TheFileUploader < Models::FileUploader
10
+ end
11
+
12
+ class TheFile
13
+ include Mongoid::Document
14
+
15
+ embedded_in :post, class_name: 'ThePost'
16
+ mount_uploader :file, TheFileUploader
17
+ end
18
+
19
+ class ThePost
20
+ include Mongoid::Document
21
+
22
+ embeds_many :files, class_name: 'TheFile'
23
+ mount_embedded_uploader :files, :file
24
+ mount_attachments_uploader :files, :file
25
+
26
+ def sorted_files
27
+ files.sort{|a, b| a.file.url <=> b.file.url}
28
+ end
29
+ end
30
+ end
31
+ after(:all){remove_constants :ThePost, :TheImage, :TheImageUploader}
32
+
33
+ before do
34
+ @a = File.open("#{spec_dir}/v1/a.txt")
35
+ @b = File.open("#{spec_dir}/v1/b.txt")
36
+ @a_v2 = File.open("#{spec_dir}/v2/a.txt")
37
+ end
38
+ after do
39
+ @a.close if @a
40
+ @b.close if @b
41
+ @a_v2.close if @a_v2
42
+ end
43
+
44
+ def post_with_two_files
45
+ params = {
46
+ files_as_attachments: [@a, @b]
47
+ }
48
+
49
+ post = ThePost.new params
50
+ post.save!
51
+ post.reload
52
+ post.files.size.should == 2
53
+ post
54
+ end
55
+
56
+ it "should add files" do
57
+ post = post_with_two_files
58
+
59
+ post.files.size.should == 2
60
+ a, b = post.sorted_files
61
+ a.file.path.should =~ /\/a\.txt/
62
+ b.file.path.should =~ /\/b\.txt/
63
+ end
64
+
65
+ it "should remove files" do
66
+ post = post_with_two_files
67
+ a, b = post.sorted_files
68
+ File.should exist(b.file.path)
69
+
70
+ params = {
71
+ files_as_attachments: ['a.txt']
72
+ }
73
+ post.update_attributes(params).should be_true
74
+ post.reload
75
+
76
+ post.files.size.should == 1
77
+ post.files.first.file.path.should =~ /\/a\.txt/
78
+
79
+ # should also remove physical file
80
+ File.should_not exist(b.file.path)
81
+ end
82
+
83
+ it "should update files" do
84
+ post = post_with_two_files
85
+
86
+ params = {
87
+ files_as_attachments: [@a_v2, 'b.txt']
88
+ }
89
+ post.update_attributes(params).should be_true
90
+ post.reload
91
+
92
+ post.files.size.should == 2
93
+ a, b = post.sorted_files
94
+ a.file.path.should =~ /\/a\.txt/
95
+ File.read(a.file.path).should == 'a v2'
96
+ b.file.path.should =~ /\/b\.txt/
97
+ end
98
+
99
+ it "should provide :files_as_attachments getter" do
100
+ post = post_with_two_files
101
+ a, b = post.sorted_files
102
+
103
+ post.files_as_attachments.should == [
104
+ {name: 'a.txt', url: a.file.url},
105
+ {name: 'b.txt', url: b.file.url}
106
+ ]
107
+ end
108
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Authorization" do
4
+ with_models
5
+
6
+ describe "Roles" do
7
+ it "user should have it's name in roles" do
8
+ user = Factory.build :user, name: 'some_name'
9
+ user.roles.should include('user:some_name')
10
+ end
11
+
12
+ it ":anonymous, :registered, :user roles" do
13
+ anonymous = Factory.build :anonymous
14
+ anonymous.roles.should == %w{anonymous user user:anonymous}
15
+
16
+ user = Factory.build :user, name: 'john'
17
+ user.roles.should == %w{registered user user:john}
18
+
19
+ admin = Factory.build :admin, name: 'john'
20
+ admin.roles.should == %w{admin manager member registered user user:john}
21
+ end
22
+
23
+ it "all managers should also have the member role, always" do
24
+ user = Factory.build :manager, name: 'john'
25
+ user.roles.should == %w{manager member registered user user:john}
26
+ end
27
+
28
+ it "handy methods" do
29
+ u = Factory.build :anonymous
30
+ u.roles.anonymous?.should be_true
31
+ u.roles.registered?.should be_false
32
+ u.roles.has?(:anonymous).should be_true
33
+ u.should have_role(:anonymous)
34
+ end
35
+
36
+ it "add_role" do
37
+ u = Factory.build :member, name: 'john'
38
+ u.should_not have_role('manager')
39
+ u.add_role :manager
40
+ u.save!
41
+ u.reload
42
+ u.should have_role('manager')
43
+ end
44
+
45
+ it "remove_role" do
46
+ u = Factory.build :manager, name: 'john'
47
+ u.remove_role :member
48
+ u.save!
49
+ u.reload
50
+ u.should_not have_role('manager')
51
+ u.should_not have_role('member')
52
+ end
53
+
54
+ it "should add also all lover roles" do
55
+ u = Factory.build :user, name: 'john'
56
+ u.roles.should_not include('member')
57
+ u.add_role :manager
58
+ u.roles.should include('member')
59
+ end
60
+
61
+ it "special case, admin role" do
62
+ u = Factory.build :user, name: 'john'
63
+ u.should_not have_role('manager')
64
+ u.add_role :admin
65
+ u.save!
66
+ u.reload
67
+ u.should have_role('admin')
68
+ u.should have_role('manager')
69
+ end
70
+
71
+ it "major_roles" do
72
+ u = Factory.build :member, name: 'john'
73
+ u.add_role :director
74
+ u.major_roles.should == %w{director member user:john}
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,254 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Authorized Object" do
4
+ with_models
5
+
6
+ before :all do
7
+ class ::AModel
8
+ include Mongoid::Document
9
+ include Mongoid::AuthorizedObject
10
+ end
11
+ end
12
+ after(:all){remove_constants :AModel}
13
+
14
+ def custom_permissions= value
15
+ Mongoid::Authorized.custom_permissions = value
16
+ end
17
+
18
+ after{self.custom_permissions = {}}
19
+
20
+ describe "Owner, Viewers, Collaborators" do
21
+ before do
22
+ rad.delete :user
23
+ @user = Factory.create :user, name: 'auser'
24
+ end
25
+
26
+ it "should be abel to create objects (from error)" do
27
+ rad.user = @user
28
+ o = AModel.new
29
+ o.save!
30
+ end
31
+
32
+ it "should by default set current user_name as owner_name if there is current user" do
33
+ o = AModel.new
34
+ o.owner_name.should be_nil
35
+
36
+ rad.user = @user
37
+ o = AModel.new
38
+ o.owner_name.should == 'auser'
39
+ end
40
+
41
+ it "owner" do
42
+ o = AModel.new
43
+ o.owner = @user
44
+ o.owner_name.should == @user.name
45
+ o.viewers.should == %w{manager user:auser}
46
+ o.should be_valid
47
+ end
48
+
49
+ it 'viewers' do
50
+ o = AModel.new
51
+ o.owner = @user
52
+ o.add_viewer :user
53
+ o.viewers.should == %w{manager member user user:auser}
54
+ o.should be_valid
55
+
56
+ o.remove_viewer :user
57
+ o.viewers.should == %w{manager user:auser}
58
+ o.should be_valid
59
+
60
+ o.add_viewer :member
61
+ o.viewers.should == %w{manager member user:auser}
62
+ o.should be_valid
63
+
64
+ o.add_viewer :user
65
+ o.viewers.should == %w{manager member user user:auser}
66
+ o.should be_valid
67
+ end
68
+
69
+ it "duplicate roles (from error)" do
70
+ o = AModel.new
71
+ o.owner = @user
72
+ o.save!
73
+
74
+ o = AModel.first # don't use reload, it willn't catch this error
75
+ o.viewers.should == %w{manager user:auser}
76
+ end
77
+
78
+ it "collaborators" do
79
+ o = AModel.new
80
+ o.owner = @user
81
+ o.add_collaborator :member
82
+ o.collaborators.should == %w{member}
83
+ o.should be_valid
84
+
85
+ o.add_collaborator :director
86
+ o.collaborators.should == %w{member director}
87
+ o.should be_valid
88
+
89
+ o.remove_collaborator :member
90
+ o.collaborators.should == %w{director}
91
+ o.should be_valid
92
+ end
93
+
94
+ it "normalized_collaborators" do
95
+ o = AModel.new
96
+ o.owner = @user
97
+ o.add_collaborator :member
98
+ o.normalized_collaborators.should == %w{manager member user:auser}
99
+ end
100
+
101
+ it "viewers and collaborators dependance" do
102
+ o = AModel.new
103
+ o.owner = @user
104
+ o.add_collaborator :user
105
+ o.collaborators.should == %w{user}
106
+ o.viewers.should == %w{manager member user user:auser}
107
+ o.should be_valid
108
+
109
+ o.remove_viewer :member
110
+ o.viewers.should == %w{manager user user:auser}
111
+ o.collaborators.should == %w{user}
112
+
113
+ o.remove_viewer :user
114
+ o.viewers.should == %w{manager user:auser}
115
+ o.collaborators.should == %w{}
116
+ end
117
+
118
+ it "major viewers" do
119
+ o = AModel.new
120
+ o.owner = @user
121
+ o.add_viewer :member
122
+ o.add_viewer :director
123
+ o.viewers.should == %w{director manager member user:auser}
124
+ o.minor_viewers.should == %w{director member user:auser}
125
+ end
126
+
127
+ it "collaborators should be able to change object (from error)" do
128
+ col = Factory.create :member, name: 'collaborator'
129
+
130
+ o = AModel.new
131
+ o.owner = @user
132
+ col.can?(:update, o).should be_false
133
+
134
+ o.add_collaborator :member
135
+ o.clear_cache
136
+ col.can?(:update, o).should be_true
137
+ @user.can?(:update, o).should be_true
138
+
139
+ o.save!
140
+ o = AModel.find o.id
141
+ col.can?(:update, o).should be_true
142
+ @user.can?(:update, o).should be_true
143
+ end
144
+
145
+ it 'should allow to create public or private (by default) objects'
146
+ end
147
+
148
+ describe "Permissions" do
149
+ describe "General" do
150
+ before do
151
+ self.custom_permissions = {'manage' => %w{manager}}
152
+ end
153
+
154
+ it "should works for new user" do
155
+ u = Models::User.new
156
+ u.can?(:manage, AModel)
157
+ end
158
+
159
+ it 'permissions' do
160
+ u = Factory.create :user
161
+ u.can?(:manage, AModel).should be_false
162
+
163
+ u = Factory.create :manager
164
+ u.can?(:manage, AModel).should be_true
165
+ end
166
+ end
167
+
168
+ describe "as Owner" do
169
+ before do
170
+ self.custom_permissions = {'manage' => %w{manager owner}}
171
+
172
+ @user = Factory.create :user
173
+
174
+ @object = AModel.new
175
+ @owned_object = AModel.new
176
+ @owned_object.owner = @user
177
+ end
178
+
179
+ it "owner?" do
180
+ @user.should_not be_owner(@object)
181
+ @user.should be_owner(@owned_object)
182
+ end
183
+
184
+ it "anonymous should never be owner of anything" do
185
+ @user = Factory.build :anonymous
186
+
187
+ @owned_object = AModel.new
188
+ @owned_object.owner = @user
189
+
190
+ @user.should_not be_owner(@owned_object)
191
+ end
192
+
193
+ it 'permissions for owner' do
194
+ @user.can?(:manage, @object).should be_false
195
+ @user.can?(:manage, @owned_object).should be_true
196
+ end
197
+ end
198
+
199
+ describe "Special :view permission" do
200
+ before do
201
+ # managers can see anything, always, it's hardcoded
202
+ self.custom_permissions = {'view' => %w{manager}}
203
+ end
204
+
205
+ it "user (public) viewers" do
206
+ user = Factory.create :user
207
+
208
+ o = AModel.new
209
+ o.stub!(:viewers){%w{user}}
210
+
211
+ user.can?(:view, o).should be_true
212
+ end
213
+
214
+ it "member viewers" do
215
+ self.custom_permissions = {'view' => []}
216
+
217
+ user = Factory.create :user
218
+ member = Factory.create :member
219
+ manager = Factory.create :manager
220
+
221
+ o = AModel.new
222
+ o.stub!(:viewers).and_return(%w{member manager})
223
+
224
+ user.can?(:view, o).should be_false
225
+ member.can?(:view, o).should be_true
226
+ manager.can?(:view, o).should be_true
227
+ end
228
+
229
+ it "owner (private) viewers" do
230
+ self.custom_permissions = {'view' => []}
231
+
232
+ owner = Factory.create :user, name: "aname"
233
+ user = Factory.create :user
234
+ member = Factory.create :member
235
+ manager = Factory.create :manager
236
+
237
+ o = AModel.new
238
+ o.stub!(:owner_name){owner.name}
239
+ o.stub!(:viewers){%w{user:aname manager}}
240
+
241
+ owner.can?(:view, o).should be_true
242
+ user.can?(:view, o).should be_false
243
+ member.can?(:view, o).should be_false
244
+ manager.can?(:view, o).should be_true
245
+ end
246
+
247
+ it "should correct works with non authorized objects (from error)" do
248
+ user = Factory.create :user
249
+ user.can?(:view, Object.new).should be_false
250
+ end
251
+ end
252
+
253
+ end
254
+ end