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.
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