rad_kit 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 (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