rad_kit 0.0.8 → 0.0.9
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.
- data/lib/components/captcha.rb +4 -4
- data/lib/components/kit.rb +5 -5
- data/lib/components/kit.yml +0 -2
- data/lib/components/models.rb +2 -5
- data/lib/components/models.yml +3 -0
- data/lib/kit/controller/authorized.rb +9 -8
- data/lib/kit/controller/captcha.rb +6 -6
- data/lib/kit/controller/localized.rb +2 -2
- data/lib/kit/gems.rb +12 -8
- data/lib/kit/i18n.rb +3 -3
- data/lib/kit/i18n/locales/ru/pluralization.rb +3 -3
- data/lib/kit/kit.rb +7 -7
- data/lib/kit/kit_text_utils.rb +6 -6
- data/lib/kit/misc/prepare_model.rb +4 -4
- data/lib/kit/models.rb +22 -5
- data/lib/kit/models/attachment_file.rb +27 -0
- data/lib/kit/models/{attachments_uploader_helper.rb → attachments_helper.rb} +34 -28
- data/lib/kit/models/authorized.rb +64 -63
- data/lib/kit/models/authorized_object.rb +70 -73
- data/lib/kit/models/base_file.rb +37 -0
- data/lib/kit/models/config.rb +30 -0
- data/lib/kit/models/indexes.rb +30 -0
- data/lib/kit/models/miscellaneous.rb +7 -1
- data/lib/kit/models/role.rb +17 -17
- data/lib/kit/models/tags.rb +71 -0
- data/lib/kit/models/tags_mixin.rb +39 -0
- data/lib/kit/mongodb_model.rb +13 -0
- data/lib/kit/mongodb_model/text_processor.rb +32 -0
- data/lib/kit/spec.rb +30 -30
- data/lib/kit/spec/items_controller_crud.rb +9 -9
- data/lib/kit/support.rb +1 -1
- data/lib/kit/tasks.rb +3 -7
- data/lib/text_utils.rb +2 -2
- data/lib/text_utils/code_highlighter.rb +17 -17
- data/lib/text_utils/custom_markdown.rb +7 -7
- data/lib/text_utils/ensure_utf.rb +3 -3
- data/lib/text_utils/format_qualifier.rb +2 -2
- data/lib/text_utils/html_sanitizer.rb +9 -9
- data/lib/text_utils/markdown.rb +9 -9
- data/lib/text_utils/pipe.rb +1 -1
- data/lib/text_utils/processor.rb +3 -3
- data/lib/text_utils/support.rb +3 -3
- data/lib/text_utils/truncate.rb +4 -4
- data/readme.md +3 -1
- data/spec/controller/authorization_spec.rb +45 -45
- data/spec/controller/captcha_spec.rb +18 -18
- data/spec/controller/comments_spec.rb +16 -14
- data/spec/controller/items_spec.rb +16 -17
- data/spec/i18n/i18n_spec.rb +5 -5
- data/spec/misc/kit_text_utils_spec.rb +5 -5
- data/spec/misc/prepare_model_spec.rb +6 -6
- data/spec/misc/user_error_spec.rb +8 -8
- data/spec/models/{attachments_uploader_helper_spec.rb → attachments_helper_spec.rb} +46 -50
- data/spec/models/{attachments_uploader_helper_spec → attachments_helper_spec}/v1/a.txt +0 -0
- data/spec/models/{attachments_uploader_helper_spec → attachments_helper_spec}/v1/b.txt +0 -0
- data/spec/models/{attachments_uploader_helper_spec → attachments_helper_spec}/v2/a.txt +0 -0
- data/spec/models/attachments_spec.rb +4 -7
- data/spec/models/authorization_spec.rb +15 -15
- data/spec/models/authorized_object_spec.rb +75 -75
- data/spec/models/item_spec.rb +44 -40
- data/spec/models/role_spec.rb +4 -4
- data/spec/models/tags_spec.rb +47 -21
- data/spec/models/uploader_spec.rb +13 -23
- data/spec/mongodb_model/text_processor_spec.rb +26 -0
- data/spec/spec_helper.rb +6 -4
- data/spec/spec_helper/factories.rb +3 -3
- data/spec/spec_helper/user.rb +4 -7
- data/spec/text_utils/code_highlighter_spec.rb +7 -7
- data/spec/text_utils/custom_markdown_spec.rb +14 -14
- data/spec/text_utils/format_qualifier_spec.rb +6 -6
- data/spec/text_utils/html_sanitizer_spec.rb +15 -15
- data/spec/text_utils/markdown_spec.rb +17 -17
- data/spec/text_utils/pipe_spec.rb +5 -5
- data/spec/text_utils/spec_helper.rb +1 -1
- data/spec/text_utils/text_processor_shared.rb +1 -1
- data/spec/text_utils/truncate_spec.rb +5 -5
- metadata +118 -114
- data/lib/kit/models/attachment_uploader.rb +0 -15
- data/lib/kit/models/file_uploader.rb +0 -26
- data/lib/kit/models_after.rb +0 -27
- data/lib/kit/mongoid.rb +0 -22
- data/lib/kit/mongoid/rad_miscellaneous.rb +0 -36
- data/lib/kit/mongoid/text_processor.rb +0 -44
- data/spec/mongoid/basic_spec.rb +0 -36
data/spec/models/item_spec.rb
CHANGED
@@ -3,49 +3,53 @@ require 'spec_helper'
|
|
3
3
|
describe "item" do
|
4
4
|
with_models
|
5
5
|
login_as :user
|
6
|
-
|
6
|
+
|
7
7
|
it 'slug validation (from error)' do
|
8
8
|
i = Factory.create :item
|
9
9
|
i.slug = 'space '
|
10
10
|
i.should_not be_valid
|
11
11
|
end
|
12
|
-
|
13
|
-
describe 'safe_query' do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
12
|
+
|
13
|
+
# describe 'safe_query' do
|
14
|
+
# it "general case" do
|
15
|
+
# Models::Item.safe_query(
|
16
|
+
# name: 'name',
|
17
|
+
# created_at: '10/11/2000',
|
18
|
+
# sort: [['state', -1]], #"state asc",
|
19
|
+
# owner_name: 'name',
|
20
|
+
# state: ['state'],
|
21
|
+
# tags: 'tag',
|
22
|
+
# # _class: 'Note',
|
23
|
+
# updated_at: ['10/11/2000'],
|
24
|
+
#
|
25
|
+
# viewers: 'role',
|
26
|
+
# collaborators: 'role'
|
27
|
+
# ).should == [{
|
28
|
+
# "name"=>"name",
|
29
|
+
# "created_at" => "10/11/2000".to_time,
|
30
|
+
# # "order" => "state asc",
|
31
|
+
# "owner_name" => "name",
|
32
|
+
# "state" => ["state"],
|
33
|
+
# "tags" => "tag",
|
34
|
+
# # "_class" => "Note",
|
35
|
+
# "updated_at" => ["10/11/2000".to_time]
|
36
|
+
# },
|
37
|
+
# {
|
38
|
+
# 'sort' => [['state', -1]]
|
39
|
+
# },
|
40
|
+
# true]
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# # it "should allow only one-level order and only indexed keywords" do
|
44
|
+
# # Models::Item.safe_query(order: "name").should == [{'order' => "name"}, false]
|
45
|
+
# # Models::Item.safe_query(order: "name desc").should == [{'order' => "name desc"}, false]
|
46
|
+
# # Models::Item.safe_query(order: "name asc").should == [{'order' => "name asc"}, false]
|
47
|
+
# #
|
48
|
+
# # Models::Item.safe_query(order: "dependent").should == [{}, true] # not indexed
|
49
|
+
# #
|
50
|
+
# # # two level order
|
51
|
+
# # Models::Item.safe_query(order: "name created_at").should == [{'order' => 'name'}, true]
|
52
|
+
# # Models::Item.safe_query(order: "name created_at desc").should == [{'order' => 'name'}, true]
|
53
|
+
# # end
|
54
|
+
# end
|
51
55
|
end
|
data/spec/models/role_spec.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "Role" do
|
3
|
+
describe "Role" do
|
4
4
|
with_models
|
5
|
-
|
5
|
+
|
6
6
|
it "normalization" do
|
7
7
|
Role.normalize_roles(%w{manager member specific_role user:user1}).should == %w{member specific_role user:user1}
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
it "denormalization to higher roles" do
|
11
11
|
Role.denormalize_to_higher_roles(%w{member specific_role user:user1}).should == %w{manager member specific_role user:user1}
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
it "denormalization to lower roles" do
|
15
15
|
Role.denormalize_to_lower_roles(%w{member specific_role user:user1}).should == %w{member specific_role user user:user1}
|
16
16
|
end
|
data/spec/models/tags_spec.rb
CHANGED
@@ -3,42 +3,68 @@ require 'spec_helper'
|
|
3
3
|
describe "Tags" do
|
4
4
|
with_models
|
5
5
|
login_as :user
|
6
|
-
|
6
|
+
|
7
|
+
it "contextual tags" do
|
8
|
+
tags = Models::Tags.new ['a', 'b', 'viewers:alex']
|
9
|
+
tags.as_string.should == 'a, b, viewers:alex'
|
10
|
+
|
11
|
+
tags.topic.should == ['a', 'b']
|
12
|
+
tags.topic.as_string.should == 'a, b'
|
13
|
+
|
14
|
+
tags.viewers.should == ['viewers:alex']
|
15
|
+
tags.viewers.as_string.should == 'viewers:alex'
|
16
|
+
|
17
|
+
tags.topic = 'c, d, other:a'
|
18
|
+
tags.should == ['c', 'd', 'viewers:alex']
|
19
|
+
|
20
|
+
tags.viewers = 'viewers:john, a'
|
21
|
+
tags.should == ['c', 'd', 'viewers:john']
|
22
|
+
end
|
23
|
+
|
7
24
|
it "should create tags with constructor initializer (from error)" do
|
8
|
-
item = Models::Item.new name: 'item'
|
25
|
+
item = Models::Item.new name: 'item'
|
26
|
+
item.tags = ['a', 'b']
|
9
27
|
item.save!
|
10
|
-
|
28
|
+
|
11
29
|
item.reload
|
12
|
-
item.tags.should == ['a', 'b']
|
13
|
-
Models::Tag.
|
14
|
-
|
30
|
+
item.tags.topic.should == ['a', 'b']
|
31
|
+
all_tags = Models::Tag.all.collect(&:name)
|
32
|
+
all_tags.should include('a')
|
33
|
+
all_tags.should include('b')
|
15
34
|
end
|
16
|
-
|
35
|
+
|
17
36
|
it "should create tags" do
|
18
|
-
item = Factory.create :item,
|
37
|
+
item = Factory.create :item, topics_as_string: 'a, b'
|
19
38
|
Models::Item.count.should == 1
|
20
39
|
item.reload
|
21
|
-
item.tags.should == ['a', 'b']
|
22
|
-
|
23
|
-
Models::Tag.
|
24
|
-
|
40
|
+
item.tags.topic.should == ['a', 'b']
|
41
|
+
|
42
|
+
all_tags = Models::Tag.all.collect(&:name)
|
43
|
+
all_tags.should include('a')
|
44
|
+
all_tags.should include('b')
|
25
45
|
end
|
26
|
-
|
46
|
+
|
27
47
|
it "should update tags after item update" do
|
28
|
-
item = Factory.create :item,
|
29
|
-
Models::Tag.
|
30
|
-
|
48
|
+
item = Factory.create :item, topics_as_string: 'a, b'
|
49
|
+
all_tags = Models::Tag.all.collect(&:name)
|
50
|
+
all_tags.should include('a')
|
51
|
+
all_tags.should include('b')
|
52
|
+
|
31
53
|
item.tags = ['a', 'c']
|
32
54
|
item.save!
|
33
55
|
|
34
|
-
Models::Tag.
|
35
|
-
|
56
|
+
all_tags = Models::Tag.all.collect(&:name)
|
57
|
+
all_tags.should include('a')
|
58
|
+
all_tags.should_not include('b')
|
59
|
+
all_tags.should include('c')
|
36
60
|
end
|
37
|
-
|
61
|
+
|
38
62
|
it "should update tags after item deletion" do
|
39
|
-
item = Factory.create :item,
|
40
|
-
Models::Tag.count.should
|
63
|
+
item = Factory.create :item, topics_as_string: 'a, b'
|
64
|
+
Models::Tag.count.should > 0
|
41
65
|
item.destroy
|
42
66
|
Models::Tag.count.should == 0
|
43
67
|
end
|
68
|
+
|
69
|
+
|
44
70
|
end
|
@@ -1,38 +1,28 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
describe "Uploading" do
|
5
|
-
|
6
|
-
|
7
|
-
with_files
|
4
|
+
describe "Uploading" do
|
5
|
+
with_mongo_model
|
6
|
+
with_file_model
|
8
7
|
|
9
8
|
before :all do
|
10
|
-
class
|
9
|
+
class TheFile < Models::BaseFile
|
11
10
|
end
|
12
|
-
|
11
|
+
|
13
12
|
class ThePost
|
14
|
-
|
13
|
+
inherit Mongo::Model, Mongo::Model::FileModel
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
22
|
-
after(:all){remove_constants :ThePost, :TheImageUploader}
|
15
|
+
mount_file :file, TheFile
|
16
|
+
end
|
17
|
+
end
|
18
|
+
after(:all){remove_constants :ThePost, :TheFile}
|
23
19
|
|
24
20
|
it "should preserve spaces and unicode characters in filename" do
|
25
21
|
File.open "#{spec_dir}/файл с пробелами.txt" do |f|
|
26
|
-
|
22
|
+
post = ThePost.create! file: f
|
27
23
|
|
28
|
-
|
29
|
-
|
30
|
-
ship.image.path =~ /\/файл с пробелами\.txt/
|
31
|
-
|
32
|
-
# ship.smart_url.should =~ /files\/file with spaces\/file with spaces\.txt\?\d/
|
33
|
-
# f.smart_url.should =~ /files\/data\/ship\?\d+/
|
34
|
-
# f.smart_url(:icon).should =~ /images\/mime\/dat_icon\.png/
|
35
|
-
# f.smart_url(:thumb).should =~ /images\/mime\/dat_thumb\.png/
|
24
|
+
post.file.url.should =~ /\/файл с пробелами\.txt/
|
25
|
+
post.file.file.path =~ /файл с пробелами\.txt/
|
36
26
|
end
|
37
27
|
end
|
38
28
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Rad Mongoid basics" do
|
4
|
+
with_mongo_model
|
5
|
+
after(:all){remove_constants :Post}
|
6
|
+
|
7
|
+
it "to_rson" do
|
8
|
+
class Post
|
9
|
+
inherit Mongo::Model
|
10
|
+
|
11
|
+
attr_accessor :text
|
12
|
+
available_as_markup :text
|
13
|
+
|
14
|
+
validates_presence_of :text
|
15
|
+
end
|
16
|
+
|
17
|
+
post = Post.new
|
18
|
+
post.valid?.should be_false
|
19
|
+
post.errors[:original_text].should be_present
|
20
|
+
|
21
|
+
post = Post.new
|
22
|
+
post.original_text = "<h1>Hello</h1>"
|
23
|
+
post.text.should == "<h1>Hello</h1>"
|
24
|
+
post.save.should be_true
|
25
|
+
end
|
26
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,13 +3,15 @@ require 'rspec_ext'
|
|
3
3
|
require 'rad'
|
4
4
|
require 'rad/spec'
|
5
5
|
|
6
|
-
require 'kit/spec'
|
7
|
-
|
8
|
-
# rad.config.runtime_path = 'tmp'
|
9
6
|
rad.kit
|
10
7
|
|
8
|
+
require 'kit/spec'
|
11
9
|
require 'kit/factories'
|
12
10
|
|
13
11
|
require 'spec_helper/user.rb'
|
14
12
|
require 'spec_helper/controller'
|
15
|
-
require 'spec_helper/factories'
|
13
|
+
require 'spec_helper/factories'
|
14
|
+
|
15
|
+
def logout_path; '' end
|
16
|
+
def login_path; '' end
|
17
|
+
def signup_path; '' end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'factory_girl'
|
2
2
|
|
3
|
-
#
|
3
|
+
#
|
4
4
|
# User
|
5
|
-
#
|
5
|
+
#
|
6
6
|
Factory.define :anonymous, class: 'Models::User' do |u|
|
7
7
|
u.name 'anonymous'
|
8
8
|
end
|
9
9
|
|
10
10
|
Factory.define :user, class: 'Models::User' do |u|
|
11
|
-
u.sequence(:name){|i| "user#{i}"}
|
11
|
+
u.sequence(:name){|i| "user#{i}"}
|
12
12
|
end
|
13
13
|
|
14
14
|
Factory.define :registered, parent: :user do |u|
|
data/spec/spec_helper/user.rb
CHANGED
@@ -1,16 +1,13 @@
|
|
1
1
|
class Models::User
|
2
|
-
|
2
|
+
inherit Mongo::Model
|
3
3
|
|
4
|
-
|
4
|
+
attr_accessor :name
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
# def self.anonymous_name; 'anonymous' end
|
9
|
-
# def anonymous?; name == self.class.anonymous_name end
|
6
|
+
inherit Models::Authorized
|
10
7
|
|
11
8
|
class << self
|
12
9
|
def avatar_url *a; end
|
13
|
-
|
10
|
+
|
14
11
|
inject current: :user
|
15
12
|
end
|
16
13
|
end
|
@@ -2,28 +2,28 @@ require 'text_utils/spec_helper'
|
|
2
2
|
|
3
3
|
describe "Markdown" do
|
4
4
|
include RSpec::TextUtilsHelper
|
5
|
-
|
5
|
+
|
6
6
|
before do
|
7
7
|
@processor = TextUtils::CodeHighlighter.new
|
8
8
|
@options = {format: :html}
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
it_should_behave_like 'text processor'
|
12
|
-
|
12
|
+
|
13
13
|
it "basic" do
|
14
14
|
process(%{<p> text </p><code lang='ruby'>class A; p "Hello World" end</code><p> text </p>}).should =~ /span/i
|
15
15
|
process(%{<p> text </p><code language='ruby'>class A; p "Hello World" end</code><p> text </p>}).should =~ /span/i
|
16
16
|
process(%{<code lang='ruby'>\nclass A \n def p\n 10\n end\nend \n</code>}).should =~ /span/i
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
it "should works with < and > in code" do
|
20
20
|
process(%{<code lang='ruby'>class A < ClassB; end</code>}).should include('ClassB')
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
it 'should preserve custom classes in <code>' do
|
24
24
|
process(%{<code lang='ruby' class='my_code'>\nclass A \n def p\n 10\n end\nend \n</code>}).should =~ /my_code/i
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
it 'markdown' do
|
28
28
|
markdown = <<MARKDOWN
|
29
29
|
text
|
@@ -32,7 +32,7 @@ text
|
|
32
32
|
print "Hello World"
|
33
33
|
```
|
34
34
|
MARKDOWN
|
35
|
-
|
35
|
+
|
36
36
|
process(markdown).should =~ /span/i
|
37
37
|
end
|
38
38
|
end
|
@@ -2,15 +2,15 @@ require 'text_utils/spec_helper'
|
|
2
2
|
|
3
3
|
describe "Markdown" do
|
4
4
|
include RSpec::TextUtilsHelper
|
5
|
-
|
5
|
+
|
6
6
|
before do
|
7
7
|
markdown = TextUtils::Markdown.new
|
8
8
|
@processor = TextUtils::CustomMarkdown.new markdown
|
9
9
|
@options = {format: :markdown}
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
it_should_behave_like 'text processor'
|
13
|
-
|
13
|
+
|
14
14
|
it "should apply markup inside of html elements (from error)" do
|
15
15
|
html = <<HTML
|
16
16
|
<div class='right'>
|
@@ -19,16 +19,16 @@ describe "Markdown" do
|
|
19
19
|
|
20
20
|
[img]: /some_link
|
21
21
|
HTML
|
22
|
-
|
22
|
+
|
23
23
|
to_doc(html).css('.right img').size.should == 1
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
it "should leave existing links intact" do
|
27
27
|
doc = to_doc(%{<a href="http://some_domain.com">http://some_domain.com</a>})
|
28
28
|
doc.css('a').size.should == 1
|
29
29
|
doc.css('a').first['href'].should == "http://some_domain.com"
|
30
|
-
end
|
31
|
-
|
30
|
+
end
|
31
|
+
|
32
32
|
describe 'image box' do
|
33
33
|
it "should use simplifyed syntax for image boxes (!![img_thumb] => [![img_thumb]][img_full_version])" do
|
34
34
|
html = <<HTML
|
@@ -45,10 +45,10 @@ HTML
|
|
45
45
|
doc = to_doc html
|
46
46
|
doc.css('a').first.to_fuzzy_hash.should == {href: "/some_prefix/image_name.png"}
|
47
47
|
doc.css('a img').first.to_fuzzy_hash.should == {src: "/some_prefix/image_name.thumb.png"}
|
48
|
-
|
48
|
+
|
49
49
|
doc.css('a').last.to_fuzzy_hash.should == {href: "/some_prefix/image_name2.png"}
|
50
50
|
doc.css('a img').last.to_fuzzy_hash.should == {src: "/some_prefix/image_name2.icon.png"}
|
51
|
-
|
51
|
+
|
52
52
|
doc.css('img').size.should == 4
|
53
53
|
end
|
54
54
|
|
@@ -61,19 +61,19 @@ HTML
|
|
61
61
|
# discarded
|
62
62
|
# it "clear div" do
|
63
63
|
# html = "[clear]"
|
64
|
-
#
|
64
|
+
#
|
65
65
|
# doc = to_doc html
|
66
66
|
# doc.css('div.clear').size.should == 1
|
67
67
|
# end
|
68
|
-
|
68
|
+
|
69
69
|
# discarded
|
70
70
|
# it "space div" do
|
71
71
|
# html = "[space]"
|
72
|
-
#
|
72
|
+
#
|
73
73
|
# doc = to_doc html
|
74
74
|
# doc.css('div.space').size.should == 1
|
75
|
-
# end
|
76
|
-
|
75
|
+
# end
|
76
|
+
|
77
77
|
# discarded
|
78
78
|
# it "should skip empty paragraphs" do
|
79
79
|
# html = "line 1\n\nline 2\n\n\n\nline 3"
|