rad_kit 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/lib/components/captcha.rb +4 -4
  2. data/lib/components/kit.rb +5 -5
  3. data/lib/components/kit.yml +0 -2
  4. data/lib/components/models.rb +2 -5
  5. data/lib/components/models.yml +3 -0
  6. data/lib/kit/controller/authorized.rb +9 -8
  7. data/lib/kit/controller/captcha.rb +6 -6
  8. data/lib/kit/controller/localized.rb +2 -2
  9. data/lib/kit/gems.rb +12 -8
  10. data/lib/kit/i18n.rb +3 -3
  11. data/lib/kit/i18n/locales/ru/pluralization.rb +3 -3
  12. data/lib/kit/kit.rb +7 -7
  13. data/lib/kit/kit_text_utils.rb +6 -6
  14. data/lib/kit/misc/prepare_model.rb +4 -4
  15. data/lib/kit/models.rb +22 -5
  16. data/lib/kit/models/attachment_file.rb +27 -0
  17. data/lib/kit/models/{attachments_uploader_helper.rb → attachments_helper.rb} +34 -28
  18. data/lib/kit/models/authorized.rb +64 -63
  19. data/lib/kit/models/authorized_object.rb +70 -73
  20. data/lib/kit/models/base_file.rb +37 -0
  21. data/lib/kit/models/config.rb +30 -0
  22. data/lib/kit/models/indexes.rb +30 -0
  23. data/lib/kit/models/miscellaneous.rb +7 -1
  24. data/lib/kit/models/role.rb +17 -17
  25. data/lib/kit/models/tags.rb +71 -0
  26. data/lib/kit/models/tags_mixin.rb +39 -0
  27. data/lib/kit/mongodb_model.rb +13 -0
  28. data/lib/kit/mongodb_model/text_processor.rb +32 -0
  29. data/lib/kit/spec.rb +30 -30
  30. data/lib/kit/spec/items_controller_crud.rb +9 -9
  31. data/lib/kit/support.rb +1 -1
  32. data/lib/kit/tasks.rb +3 -7
  33. data/lib/text_utils.rb +2 -2
  34. data/lib/text_utils/code_highlighter.rb +17 -17
  35. data/lib/text_utils/custom_markdown.rb +7 -7
  36. data/lib/text_utils/ensure_utf.rb +3 -3
  37. data/lib/text_utils/format_qualifier.rb +2 -2
  38. data/lib/text_utils/html_sanitizer.rb +9 -9
  39. data/lib/text_utils/markdown.rb +9 -9
  40. data/lib/text_utils/pipe.rb +1 -1
  41. data/lib/text_utils/processor.rb +3 -3
  42. data/lib/text_utils/support.rb +3 -3
  43. data/lib/text_utils/truncate.rb +4 -4
  44. data/readme.md +3 -1
  45. data/spec/controller/authorization_spec.rb +45 -45
  46. data/spec/controller/captcha_spec.rb +18 -18
  47. data/spec/controller/comments_spec.rb +16 -14
  48. data/spec/controller/items_spec.rb +16 -17
  49. data/spec/i18n/i18n_spec.rb +5 -5
  50. data/spec/misc/kit_text_utils_spec.rb +5 -5
  51. data/spec/misc/prepare_model_spec.rb +6 -6
  52. data/spec/misc/user_error_spec.rb +8 -8
  53. data/spec/models/{attachments_uploader_helper_spec.rb → attachments_helper_spec.rb} +46 -50
  54. data/spec/models/{attachments_uploader_helper_spec → attachments_helper_spec}/v1/a.txt +0 -0
  55. data/spec/models/{attachments_uploader_helper_spec → attachments_helper_spec}/v1/b.txt +0 -0
  56. data/spec/models/{attachments_uploader_helper_spec → attachments_helper_spec}/v2/a.txt +0 -0
  57. data/spec/models/attachments_spec.rb +4 -7
  58. data/spec/models/authorization_spec.rb +15 -15
  59. data/spec/models/authorized_object_spec.rb +75 -75
  60. data/spec/models/item_spec.rb +44 -40
  61. data/spec/models/role_spec.rb +4 -4
  62. data/spec/models/tags_spec.rb +47 -21
  63. data/spec/models/uploader_spec.rb +13 -23
  64. data/spec/mongodb_model/text_processor_spec.rb +26 -0
  65. data/spec/spec_helper.rb +6 -4
  66. data/spec/spec_helper/factories.rb +3 -3
  67. data/spec/spec_helper/user.rb +4 -7
  68. data/spec/text_utils/code_highlighter_spec.rb +7 -7
  69. data/spec/text_utils/custom_markdown_spec.rb +14 -14
  70. data/spec/text_utils/format_qualifier_spec.rb +6 -6
  71. data/spec/text_utils/html_sanitizer_spec.rb +15 -15
  72. data/spec/text_utils/markdown_spec.rb +17 -17
  73. data/spec/text_utils/pipe_spec.rb +5 -5
  74. data/spec/text_utils/spec_helper.rb +1 -1
  75. data/spec/text_utils/text_processor_shared.rb +1 -1
  76. data/spec/text_utils/truncate_spec.rb +5 -5
  77. metadata +118 -114
  78. data/lib/kit/models/attachment_uploader.rb +0 -15
  79. data/lib/kit/models/file_uploader.rb +0 -26
  80. data/lib/kit/models_after.rb +0 -27
  81. data/lib/kit/mongoid.rb +0 -22
  82. data/lib/kit/mongoid/rad_miscellaneous.rb +0 -36
  83. data/lib/kit/mongoid/text_processor.rb +0 -44
  84. data/spec/mongoid/basic_spec.rb +0 -36
@@ -1,9 +1,9 @@
1
1
  class Rad::Captcha
2
2
  attr_accessor :public_key, :private_key, :timeout, :enabled, :verify_url
3
- attr_required :private_key, :public_key
3
+ attr_required :private_key, :public_key
4
4
  def enabled?; !!enabled end
5
-
6
- def verify request, params
5
+
6
+ def verify request, params
7
7
  recaptcha = nil
8
8
  Timeout::timeout(timeout || 3) do
9
9
  recaptcha = Net::HTTP.post_form URI.parse(verify_url), {
@@ -19,6 +19,6 @@ class Rad::Captcha
19
19
  end
20
20
  end
21
21
 
22
- rad.register :captcha, depends_on: [:template, :controller] do
22
+ rad.register :captcha, depends_on: [:template, :controller] do
23
23
  Rad::Captcha.new
24
24
  end
@@ -1,16 +1,16 @@
1
- rad.register :kit, depends_on: [:web, :assets, :common_interface, :models] do
1
+ rad.register :kit, depends_on: [:web, :assets, :common_interface, :models] do
2
2
  require 'kit/kit'
3
-
3
+
4
4
  rad.router.default_url = '/'
5
5
  (rad.face.availiable_layouts[:default] ||= []) << :default
6
-
7
- rad.configure :web, "#{__FILE__}/../../.." do |c|
6
+
7
+ rad.configure :web, "#{__FILE__}/../../.." do |c|
8
8
  c.routes
9
9
  c.locales
10
10
  c.template_paths 'app/views'
11
11
  c.asset_paths 'app/static'
12
12
  c.autoload_paths 'app'
13
13
  end
14
-
14
+
15
15
  Rad::Kit.new
16
16
  end
@@ -1,3 +1 @@
1
- fs_prefix: '/fs'
2
- fs_type: :file
3
1
  tags_count: 40
@@ -1,7 +1,4 @@
1
- rad.register :models do
2
- require 'kit/models'
1
+ rad.register :models do
2
+ require 'kit/models'
3
3
  Rad::Models.new
4
- end
5
- rad.after :models do
6
- require 'kit/models_after'
7
4
  end
@@ -0,0 +1,3 @@
1
+ fs:
2
+ host: http://localhost
3
+ prefix: /fs
@@ -2,19 +2,20 @@ module Rad::Controller::Authorized
2
2
  inherited do
3
3
  helper_method :can?, :owner?
4
4
  end
5
-
5
+
6
6
  module ClassMethods
7
7
  def require_permission operation, *args, &object_proc
8
- operation = operation.must_be.a(String, Symbol).to_s
9
-
8
+ operation.must_be.a Symbol
9
+
10
10
  options = args.extract_options!
11
11
  # object_proc = args.size > 0 ? args.first : lambda{}
12
12
  object_proc ||= lambda{|controller|}
13
-
14
- method = "require_permission_#{operation}"
13
+
14
+ method = "require_permission_#{operation}".to_sym
15
15
  define_method method do
16
16
  require_permission operation, instance_eval(&object_proc)
17
17
  end
18
+
18
19
  before method, options
19
20
  end
20
21
  end
@@ -22,7 +23,7 @@ module Rad::Controller::Authorized
22
23
  protected
23
24
  def can? *args
24
25
  rad.user.can? *args
25
- end
26
+ end
26
27
 
27
28
  def owner? *args
28
29
  rad.user.owner? *args
@@ -37,7 +38,7 @@ module Rad::Controller::Authorized
37
38
  end
38
39
 
39
40
  def require_permission operation, object = nil
40
- operation = operation.must_be.a(String, Symbol).to_s
41
+ operation.must_be.a Symbol
41
42
 
42
43
  unless rad.user.can? operation, object
43
44
  rad.logger.warn "RAD access denied, #{rad.user.name} hasn't rights to #{operation}!"
@@ -45,7 +46,7 @@ module Rad::Controller::Authorized
45
46
  end
46
47
  end
47
48
 
48
- def access_denied!
49
+ def access_denied!
49
50
  raise_user_error t(:access_denied)
50
51
  end
51
52
  end
@@ -3,19 +3,19 @@ module Rad::Controller::Captcha
3
3
  around :ensure_registered_or_human
4
4
  end
5
5
 
6
- protected
7
- def ensure_registered_or_human
6
+ protected
7
+ def ensure_registered_or_human
8
8
  if rad.captcha.enabled? and rad.user.anonymous? and !request.get?
9
- # right now we support capcha for :js format only
10
- if request.from_browser? and params.format == 'js'
9
+ # right now we support capcha for :js format only
10
+ if request.from_browser? and params.format == 'js'
11
11
  if rad.captcha.verify request, params
12
12
  yield
13
13
  else
14
14
  render '/kit/captcha/action'
15
15
  end
16
- else
16
+ else
17
17
  raise_user_error t(:registered_user_or_human_required)
18
- end
18
+ end
19
19
  else
20
20
  yield
21
21
  end
@@ -3,10 +3,10 @@ module Rad::Controller::Localized
3
3
  before :prepare_locale
4
4
  end
5
5
 
6
- protected
6
+ protected
7
7
  def prepare_locale
8
8
  language = rad.environment.language
9
- I18n.locale = params.l || language
9
+ I18n.locale = params.l || language
10
10
  # Delete l from params if language is the same as default
11
11
  params.delete :l if params.l == language
12
12
  end
data/lib/kit/gems.rb CHANGED
@@ -1,19 +1,23 @@
1
1
  # core gems
2
- gem 'i18n', '0.5.0'
3
- gem 'redcarpet', '1.17.2'
4
- gem 'sanitize', '1.2.1'
5
- gem 'stringex', '1.2.0'
6
- gem 'state_machine', '0.10.4'
2
+ gem 'i18n', '~> 0.5'
3
+ gem 'redcarpet', '~> 1.17'
4
+ gem 'sanitize', '~> 1.2'
5
+ gem 'stringex', '~> 1.2'
6
+ # gem 'state_machine', '~> 0.10'
7
+ gem 'nokogiri', '~> 1.4'
7
8
  # gem 'factory_girl', '1.3.3'
8
- gem 'recaptcha', '0.3.1'
9
+ gem 'recaptcha', '~> 0.3'
10
+ gem 'mini_magick', '~> 3.2'
9
11
 
10
- if respond_to? :fake_gem
12
+ if respond_to? :fake_gem
11
13
  fake_gem 'rad_core'
12
14
  fake_gem 'rad_common_interface'
13
15
  fake_gem 'rad_assets'
14
- fake_gem 'mongoid_misc'
16
+ fake_gem 'mongodb_model'
15
17
  end
16
18
 
19
+ # TODO2 remove dependencies
20
+
17
21
  # old
18
22
  # gem 'bluecloth', '2.0.9'
19
23
  # gem 'paperclip', '2.3.1.1'
data/lib/kit/i18n.rb CHANGED
@@ -2,15 +2,15 @@
2
2
  # gem 'i18n', '>= 0.4.1'
3
3
  # require 'i18n'
4
4
 
5
- require "i18n/backend/pluralization"
5
+ require "i18n/backend/pluralization"
6
6
  I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization)
7
7
 
8
8
  I18n.load_path += Dir["#{__FILE__.dirname}/i18n/locales/*/*.{rb,yml}"]
9
9
 
10
10
 
11
- #
11
+ #
12
12
  # Helpers for Rad
13
- #
13
+ #
14
14
  [Rad::Controller::Abstract, Rad::Controller::Context].each do |klass|
15
15
  klass.delegate :t, to: I18n
16
16
  end
@@ -1,6 +1,6 @@
1
1
  # {
2
2
  # :'ru' => {
3
- # pluralize: lambda { |n|
3
+ # pluralize: lambda { |n|
4
4
  # # Правило плюрализации для русского языка, взято из CLDR, http://unicode.org/cldr/
5
5
  # #
6
6
  # #
@@ -19,7 +19,7 @@
19
19
  # # :other = 1.31, 2.31, 5.31...
20
20
  # modulo10 = n.modulo(10)
21
21
  # modulo100 = n.modulo(100)
22
- #
22
+ #
23
23
  # if modulo10 == 1 && modulo100 != 11
24
24
  # :one
25
25
  # elsif (modulo10 == 2 || modulo10 == 3 || modulo10 == 4) && !(modulo100 == 12 || modulo100 == 13 || modulo100 == 14)
@@ -54,7 +54,7 @@
54
54
  # :few = 2-4, 22-24, 32-34...
55
55
  # :many = 0, 5-20, 25-30, 35-40...
56
56
  # :other = 1.31, 2.31, 5.31...
57
- n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other
57
+ n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other
58
58
  }
59
59
  }
60
60
  }
data/lib/kit/kit.rb CHANGED
@@ -2,9 +2,9 @@ require 'kit/support'
2
2
 
3
3
  # Configs
4
4
  class Rad::Kit
5
- attr_accessor :default_item, :fs_prefix, :fs_type, :fs_cache_path, :fs_path, :tags_count, :use_code_highlighter
6
- attr_required :tags_count, :fs_prefix, :fs_type, :fs_path, :fs_cache_path
7
- def items; @items ||= [] end
5
+ attr_accessor :default_item, :tags_count, :use_code_highlighter
6
+ attr_required :tags_count
7
+ def items; @items ||= [] end
8
8
  end
9
9
 
10
10
  rad.router.class.class_eval do
@@ -12,21 +12,21 @@ rad.router.class.class_eval do
12
12
  attr_required :default_url
13
13
  end
14
14
 
15
- rad.config.class.class_eval do
15
+ rad.config.class.class_eval do
16
16
  def custom_roles; @custom_roles ||= [] end
17
17
  def permissions; @permissions ||= {} end
18
18
  def default_viewers; @default_viewers ||= [] end
19
19
  end
20
20
 
21
21
  # Kit
22
- #
22
+ #
23
23
  # TODO3 move :text_utils to standalone gem
24
- %w(
24
+ %w(
25
25
  support
26
26
  controller
27
27
  i18n
28
28
  kit_text_utils
29
-
29
+
30
30
  misc/prepare_model
31
31
  misc/user_error
32
32
  ).each{|f| require "kit/#{f}"}
@@ -3,20 +3,20 @@ require 'text_utils'
3
3
  module TextUtils
4
4
  class << self
5
5
  # TODO2 rename
6
- def markup data
6
+ def markup data
7
7
  ps = []
8
8
  ps << EnsureUtf
9
9
  ps << HtmlSanitizer
10
- ps << FormatQualifier
10
+ ps << FormatQualifier
11
11
  ps << CodeHighlighter if rad.config.use_code_highlighter
12
12
  ps << CustomMarkdown
13
- ps << Markdown
13
+ ps << Markdown
14
14
 
15
15
  markup = Pipe.new *ps
16
16
  markup.call data
17
17
  end
18
-
19
-
18
+
19
+
20
20
  def truncate data, length
21
21
  truncate = Pipe.new(
22
22
  EnsureUtf,
@@ -26,5 +26,5 @@ module TextUtils
26
26
  )
27
27
  truncate.call data
28
28
  end
29
- end
29
+ end
30
30
  end
@@ -1,12 +1,12 @@
1
1
  Rad::Controller::Abstract::ClassMethods.class_eval do
2
2
  def prepare_model aclass, opt = {}
3
3
  opt = opt.symbolize_keys
4
- id = opt.delete(:id) || :id
4
+ id = opt.delete(:id) || :id
5
5
  variable = opt.delete(:variable) || aclass.alias.underscore
6
-
6
+
7
7
  finder = opt.delete(:finder) || :find!
8
-
9
- method = "prepare_#{variable}"
8
+
9
+ method = "prepare_#{variable}".to_sym
10
10
  define_method method do
11
11
  model = aclass.send finder, params[id]
12
12
  instance_variable_set "@#{variable}", model
data/lib/kit/models.rb CHANGED
@@ -1,8 +1,25 @@
1
1
  require 'kit/support'
2
- require 'kit/mongoid'
3
- require 'state_machine'
4
- StateMachine::Integrations::Mongoid.defaults[:action] = nil
2
+ require 'kit/mongodb_model'
5
3
 
6
4
  class Rad::Models
7
- attr_accessor :config
8
- end
5
+ attr_accessor :db
6
+ attr_required :db
7
+
8
+ attr_accessor :fs
9
+ attr_required :fs
10
+ end
11
+
12
+ %w(
13
+ config
14
+ tags
15
+ tags_mixin
16
+ miscellaneous
17
+ role
18
+ authorized
19
+ authorized_object
20
+ base_file
21
+ attachment_file
22
+ attachments_helper
23
+ ).each{|n| require "kit/models/#{n}"}
24
+
25
+ Mongo::Model.inherit Mongo::Model::AttachmentsHelper, Models::Miscellaneous
@@ -0,0 +1,27 @@
1
+ class Models::AttachmentFile < Models::BaseFile
2
+ rad.extension :attachment_file_path, self do
3
+ define_method :build_path do |*args|
4
+ "#{rad.models.fs['prefix']}/#{model_id}" + build_standard_path(*args)
5
+ end
6
+
7
+ define_method :build_url do |*args|
8
+ "#{rad.models.fs['prefix']}/#{model_id}" + build_standard_url(*args)
9
+ end
10
+ end
11
+
12
+ version :icon do
13
+ def process &block
14
+ mini_magic block do |image|
15
+ image.resize '50x50'
16
+ end
17
+ end
18
+ end
19
+
20
+ version :thumb do
21
+ def process &block
22
+ mini_magic block do |image|
23
+ image.resize '150x150'
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,79 +1,85 @@
1
- module Mongoid::AttachmentsUploaderHelper
2
- extend ActiveSupport::Concern
3
-
1
+ module Mongo::Model::AttachmentsHelper
4
2
  class FileHelper
5
3
  attr_reader :object
6
4
  def initialize object
7
5
  @object = object
8
6
  end
9
-
7
+
10
8
  def file?
11
- object.is_a?(Hash) or object.is_a?(IO)
9
+ object.is_a?(Hash) or object.is_a?(IO) or object.is_a?(Vfs::File)
12
10
  end
13
-
11
+
14
12
  def name
15
13
  if object.is_a?(Hash)
16
14
  object['filename'] || object[:filename]
17
15
  elsif object.is_a?(IO)
18
16
  File.basename(object.path)
17
+ elsif object.is_a?(Vfs::File)
18
+ object.name
19
19
  else
20
20
  object
21
21
  end
22
22
  end
23
23
  end
24
-
24
+
25
25
  def get_attachments association_name, field_name
26
26
  send(association_name).
27
- sort{|a, b| a.send(field_name).name <=> b.send(field_name).name}.
28
- collect{|o| {name: o.send(field_name).name, url: o.send(field_name).url}.to_openobject}
27
+ sort{|a, b| a.send(field_name).file.name <=> b.send(field_name).file.name}.
28
+ collect{|o| {name: o.send(field_name).file.name, url: o.send(field_name).url}.to_openobject}
29
29
  end
30
-
31
- def set_attachments association_name, field_name, values
30
+
31
+ def set_attachments association_name, field_name, values, &block
32
32
  association = send(association_name)
33
- existing_names = association.collect{|o| o.send(field_name).name}.sort
34
-
35
- add = values.select do |o|
33
+ existing_names = association.collect{|o| o.send(field_name).file.name}.sort
34
+
35
+ add = values.select do |o|
36
36
  h = FileHelper.new o
37
37
  h.file? and !existing_names.include?(h.name)
38
- end
39
- update = values.select do |o|
38
+ end
39
+ update = values.select do |o|
40
40
  h = FileHelper.new o
41
- h.file? and existing_names.include?(h.name)
42
- end
41
+ h.file? and existing_names.include?(h.name)
42
+ end
43
43
  remove = association.select do |model|
44
44
  values.none? do |o|
45
45
  h = FileHelper.new o
46
46
  model.send(field_name).name == h.name
47
47
  end
48
- end
48
+ end
49
49
 
50
- add.each{|file| association.build field_name => file}
50
+ add.each do |file|
51
+ model = block.call
52
+ model._parent = self
53
+ model.send "#{field_name}=", file
54
+ association << model
55
+ end
51
56
  update.each do |file|
52
57
  h = FileHelper.new file
53
58
  association.each do |model|
54
- if model.send(field_name).name == h.name
59
+ if model.send(field_name).file.name == h.name
55
60
  model.send "#{field_name}=", file
56
61
  break
57
62
  end
58
63
  end
59
- end
64
+ end
60
65
  remove.each do |model|
61
- association.where(_id: model.id).destroy_all
66
+ association.delete model
67
+ # association.where(_id: model._id).destroy_all
62
68
  end
63
69
  end
64
70
 
65
71
  module ClassMethods
66
- def mount_attachments_uploader association_name, field_name
72
+ def mount_attachments association_name, field_name, &block
67
73
  define_method "#{association_name}_as_attachments" do
68
74
  get_attachments association_name, field_name
69
75
  end
70
-
76
+
71
77
  define_method "#{association_name}_as_attachments=" do |values|
72
- set_attachments association_name, field_name, values
78
+ set_attachments association_name, field_name, values, &block
73
79
  end
74
-
80
+
75
81
  # we can't allow to destroy model with changed attachments because it's too complicated to support this case.
76
- before_destroy{|o| raise "Can't destroy item with changed attachments!" if o.changes.include? association_name}
82
+ # before_destroy{|o| raise "Can't destroy item with changed attachments!" if o.changes.include? association_name}
77
83
  end
78
84
  end
79
85
  end