puffer 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/.gitignore +3 -0
  2. data/.travis.yml +6 -0
  3. data/CHANGELOG.md +14 -0
  4. data/Gemfile.lock +98 -80
  5. data/README.md +6 -0
  6. data/Rakefile +1 -1
  7. data/app/assets/javascripts/puffer/puffer.js +15 -3
  8. data/app/assets/javascripts/puffer/right-sortable-src.js +28 -306
  9. data/app/assets/stylesheets/puffer/application.css +2 -0
  10. data/app/assets/stylesheets/puffer/file_input.css +59 -0
  11. data/app/assets/stylesheets/puffer/puffer.css +1 -0
  12. data/app/assets/stylesheets/puffer/puffer_grid.css +23 -0
  13. data/app/components/boolean/filter.html.erb +9 -0
  14. data/app/components/boolean_component.rb +4 -0
  15. data/app/components/carrierwave/form.html.erb +34 -0
  16. data/app/components/carrierwave/index.html.erb +6 -0
  17. data/app/components/carrierwave_component.rb +16 -0
  18. data/app/components/references_one/form.html.erb +2 -3
  19. data/app/controllers/admin/dashboard_controller.rb +0 -1
  20. data/app/controllers/admin/puffer_users_controller.rb +3 -7
  21. data/app/controllers/admin/sessions_controller.rb +1 -1
  22. data/app/models/puffer_user.rb +3 -18
  23. data/app/views/layouts/puffer.html.erb +2 -0
  24. data/app/views/puffer/base/_edit.html.erb +1 -1
  25. data/app/views/puffer/base/new.html.erb +1 -1
  26. data/app/views/puffer/grid_base/_grid.html.erb +9 -0
  27. data/app/views/puffer/grid_base/_index.html.erb +26 -0
  28. data/config/routes.rb +1 -1
  29. data/gemfiles/Gemfile-rails-3.1 +5 -0
  30. data/gemfiles/Gemfile-rails-3.1.lock +201 -0
  31. data/gemfiles/Gemfile-rails-3.2 +5 -0
  32. data/gemfiles/Gemfile-rails-3.2.lock +199 -0
  33. data/lib/puffer.rb +38 -12
  34. data/{app/controllers/puffer → lib/puffer/backends/controllers}/base.rb +1 -2
  35. data/{app/controllers/puffer → lib/puffer/backends/controllers}/dashboard_base.rb +0 -1
  36. data/lib/puffer/backends/controllers/grid_base.rb +12 -0
  37. data/{app/controllers/puffer → lib/puffer/backends/controllers}/puffer_users_base.rb +0 -0
  38. data/{app/controllers/puffer → lib/puffer/backends/controllers}/sessions/base.rb +0 -1
  39. data/{app/controllers/puffer → lib/puffer/backends/controllers}/sessions/clearance.rb +13 -5
  40. data/{app/controllers/puffer → lib/puffer/backends/controllers}/sessions/devise.rb +1 -1
  41. data/{app/controllers/puffer → lib/puffer/backends/controllers}/sessions/simple.rb +1 -1
  42. data/{app/controllers/puffer → lib/puffer/backends/controllers}/tree_base.rb +0 -1
  43. data/lib/puffer/backends/models/user/active_record.rb +9 -0
  44. data/lib/puffer/backends/models/user/base.rb +30 -0
  45. data/lib/puffer/backends/models/user/mongoid.rb +15 -0
  46. data/lib/puffer/component.rb +2 -2
  47. data/lib/puffer/controller/auth.rb +48 -47
  48. data/lib/puffer/controller/config.rb +4 -6
  49. data/lib/puffer/controller/dsl.rb +2 -4
  50. data/lib/puffer/controller/mutate.rb +23 -26
  51. data/lib/puffer/extensions/directive_processor.rb +11 -16
  52. data/lib/puffer/extensions/engine.rb +7 -9
  53. data/lib/puffer/extensions/{mapper.rb → mapper31.rb} +10 -12
  54. data/lib/puffer/extensions/mapper32.rb +108 -0
  55. data/lib/puffer/filters.rb +15 -3
  56. data/lib/puffer/orm_adapter/active_record.rb +15 -2
  57. data/lib/puffer/orm_adapter/base.rb +4 -0
  58. data/lib/puffer/orm_adapter/mongoid.rb +15 -2
  59. data/lib/puffer/resource.rb +1 -1
  60. data/lib/puffer/version.rb +1 -1
  61. data/puffer.gemspec +10 -4
  62. data/spec/{app/components → components}/base_component_spec.rb +0 -0
  63. data/spec/{app/components → components}/boolean_component_spec.rb +0 -0
  64. data/spec/{app/components → components}/date_time_component_spec.rb +0 -0
  65. data/spec/{app/components → components}/file_component_spec.rb +0 -0
  66. data/spec/{app/components → components}/hidden_component_spec.rb +0 -0
  67. data/spec/{app/components → components}/password_component_spec.rb +0 -0
  68. data/spec/{app/components → components}/references_many_component_spec.rb +0 -0
  69. data/spec/{app/components → components}/references_one_component_spec.rb +0 -0
  70. data/spec/{app/components → components}/select_component_spec.rb +0 -0
  71. data/spec/{app/components → components}/string_component_spec.rb +0 -0
  72. data/spec/{app/components → components}/text_component_spec.rb +0 -0
  73. data/spec/controllers/sessions/base_shared.rb +66 -0
  74. data/spec/controllers/sessions/clearance_spec.rb +21 -0
  75. data/spec/controllers/sessions/simple_spec.rb +14 -0
  76. data/spec/dummy/app/controllers/admin/news_controller.rb +1 -1
  77. data/spec/dummy/app/controllers/admin/profiles_controller.rb +3 -1
  78. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  79. data/spec/dummy/app/controllers/orms/mongoid_orm_primals_controller.rb +16 -0
  80. data/spec/dummy/app/helpers/news_helper.rb +1 -1
  81. data/spec/dummy/app/models/clearance_user.rb +3 -0
  82. data/spec/dummy/app/models/mongoid_orm/embeds_many_reference.rb +9 -0
  83. data/spec/dummy/app/models/mongoid_orm/embeds_one_reference.rb +9 -0
  84. data/spec/dummy/app/models/mongoid_orm/has_many_reference.rb +9 -0
  85. data/spec/dummy/app/models/mongoid_orm/has_one_reference.rb +9 -0
  86. data/spec/dummy/app/models/mongoid_orm/primal.rb +8 -0
  87. data/spec/dummy/app/models/profile.rb +2 -0
  88. data/spec/dummy/app/uploaders/avatar_uploader.rb +8 -0
  89. data/spec/dummy/config/application.rb +5 -3
  90. data/spec/dummy/config/initializers/clearance.rb +3 -0
  91. data/spec/dummy/config/initializers/devise.rb +34 -22
  92. data/spec/dummy/config/locales/devise.en.yml +6 -7
  93. data/spec/dummy/config/routes.rb +0 -1
  94. data/spec/dummy/db/migrate/{20100930133425_create_admin_profiles.rb → 20100930133425_create_profiles.rb} +2 -1
  95. data/spec/dummy/db/migrate/20111208222355_create_clearance_users.rb +13 -0
  96. data/spec/dummy/db/migrate/20120129091339_upgrade_clearance_to_diesel.rb +19 -0
  97. data/spec/dummy/db/schema.rb +12 -1
  98. data/spec/fabricators/clearance_user_fabricator.rb +4 -0
  99. data/spec/fabricators/puffer_user_fabricator.rb +5 -0
  100. data/spec/lib/filters_spec.rb +1 -1
  101. data/spec/lib/orm_adapter/active_record_spec.rb +0 -1
  102. data/spec/lib/orm_adapter/base_shared.rb +80 -76
  103. data/spec/lib/orm_adapter/mongoid_spec.rb +0 -2
  104. data/spec/lib/resource/tree_spec.rb +0 -1
  105. data/spec/spec_helper.rb +5 -3
  106. metadata +150 -75
  107. data/VERSION +0 -1
  108. data/app/models/puffer/puffer_user.rb +0 -25
@@ -0,0 +1,15 @@
1
+ module Puffer
2
+ module User
3
+ class Mongoid
4
+ include ::Mongoid::Document
5
+
6
+ self.collection_name = 'puffer_users'
7
+
8
+ field :email, :type => String
9
+ field :password_digest, :type => String
10
+ field :roles, :type => String
11
+
12
+ include Puffer::User::Base
13
+ end
14
+ end
15
+ end
@@ -35,8 +35,8 @@ module Puffer
35
35
  helper 'puffer/helpers/component', 'puffer/helpers/puffer'
36
36
 
37
37
  attr_reader :parent_controller, :field, :identifer, :record, :records, :resource, :opts
38
- delegate :env, :request, :params, :session, :_members, :_collections, :to => :parent_controller
39
- helper_method :params, :session, :_members, :_collections, :parent_controller, :field, :identifer, :component_id, :event_url, :event_path, :record, :records, :resource, :opts
38
+ delegate :env, :request, :params, :session, :to => :parent_controller
39
+ helper_method :params, :session, :parent_controller, :field, :identifer, :component_id, :event_url, :event_path, :record, :records, :resource, :opts
40
40
 
41
41
  def initialize field
42
42
  super()
@@ -4,7 +4,7 @@ module Puffer
4
4
  # controllers. Puffer's authentification system is simple. In general, you
5
5
  # should use different kinds of routing and controllers namespaces for
6
6
  # partial access of different user types.
7
- #
7
+ #
8
8
  # Method +has_puffer_access?+ with current namespace name as a parameter.
9
9
  # If you want to use appication's own auth system - just redefine this
10
10
  # method in your ApplicationController.
@@ -17,58 +17,59 @@ module Puffer
17
17
  helper_method :current_puffer_user
18
18
  end
19
19
 
20
- module InstanceMethods
21
-
22
- # Return current user instance, used for authorization. This method can
23
- # be redefined in ApplicationController if you want to use application's
24
- # auth system.
25
- #
26
- # ex:
27
- #
28
- # class ApplicationController < ActionController::Base
29
- # def current_puffer_user
30
- # current_user
31
- # end
32
- # end
33
- #
34
- # In this case returner user model instance should respond to has_role?
35
- # method, or you should properly redefine +has_puffer_access?+ See
36
- # +has_puffer_access?+ source and docs.
37
- def current_puffer_user
38
- @current_puffer_user ||= super rescue (::Admin::SessionsController.model.to_adapter.find_first(:conditions => {:_id => session[:puffer_user_id]}) if session[:puffer_user_id])
39
- end
40
-
41
- # This method is also part of auth system and it can be redefined at the
42
- # ApplicationController.
43
- #
44
- # ex:
45
- #
46
- # class ApplicationController < ActionController::Base
47
- # # <tt>current_puffer_user.admin?</tt>
48
- # # <tt>current_puffer_user.manager?</tt>
49
- # # <tt>current_puffer_user.seo?</tt>
50
- # def has_puffer_access? namespace
51
- # current_puffer_user.send("#{namespace}?")
52
- # end
53
- # end
54
- def has_puffer_access? namespace
55
- super rescue (current_puffer_user && current_puffer_user.has_role?(namespace))
20
+ # Return current user instance, used for authorization. This method can
21
+ # be redefined in ApplicationController if you want to use application's
22
+ # auth system.
23
+ #
24
+ # ex:
25
+ #
26
+ # class ApplicationController < ActionController::Base
27
+ # def current_puffer_user
28
+ # current_user
29
+ # end
30
+ # end
31
+ #
32
+ # In this case returner user model instance should respond to has_role?
33
+ # method, or you should properly redefine +has_puffer_access?+ See
34
+ # +has_puffer_access?+ source and docs.
35
+ def current_puffer_user
36
+ @current_puffer_user ||= begin
37
+ super
38
+ rescue NoMethodError
39
+ ::Admin::SessionsController.model.to_adapter.get(session[:puffer_user_id])
56
40
  end
41
+ end
57
42
 
58
- # Used in before_filter to prevent unauthorized access
59
- def require_puffer_user
60
- unless has_puffer_access?(puffer_namespace)
61
- redirect_to new_admin_session_url(:return_to => request.fullpath)
62
- return false
63
- end
64
- end
43
+ # This method is also part of auth system and it can be redefined at the
44
+ # ApplicationController.
45
+ #
46
+ # ex:
47
+ #
48
+ # class ApplicationController < ActionController::Base
49
+ # # <tt>current_puffer_user.admin?</tt>
50
+ # # <tt>current_puffer_user.manager?</tt>
51
+ # # <tt>current_puffer_user.seo?</tt>
52
+ # def has_puffer_access? namespace
53
+ # current_puffer_user.send("#{namespace}?")
54
+ # end
55
+ # end
56
+ def has_puffer_access? namespace
57
+ super
58
+ rescue NoMethodError
59
+ (current_puffer_user && current_puffer_user.has_role?(namespace))
60
+ end
65
61
 
66
- def redirect_back_or default
67
- redirect_to(params[:return_to].presence || default)
62
+ # Used in before_filter to prevent unauthorized access
63
+ def require_puffer_user
64
+ unless has_puffer_access?(puffer_namespace)
65
+ redirect_to new_admin_session_url(:return_to => request.fullpath)
66
+ return false
68
67
  end
69
-
70
68
  end
71
69
 
70
+ def redirect_back_or default
71
+ redirect_to(params[:return_to].presence || default)
72
+ end
72
73
  end
73
74
  end
74
75
  end
@@ -25,16 +25,14 @@ module Puffer
25
25
  puffer_class_attribute :scope
26
26
  # order - default order option. Is a string with field name and direction. Ex: 'email', 'first_name asc', 'title desc'
27
27
  puffer_class_attribute :order
28
+ # obviously< records per page
29
+ puffer_class_attribute :per_page, 30
28
30
 
29
31
  helper_method :configuration
30
32
  end
31
33
 
32
- module InstanceMethods
33
-
34
- def configuration
35
- self.class.configuration
36
- end
37
-
34
+ def configuration
35
+ self.class.configuration
38
36
  end
39
37
 
40
38
  module ClassMethods
@@ -14,10 +14,8 @@ module Puffer
14
14
  helper_method :_members, :_collections
15
15
  end
16
16
 
17
- module InstanceMethods
18
- def fields set
19
- self.class.fields set
20
- end
17
+ def fields set
18
+ self.class.fields set
21
19
  end
22
20
 
23
21
  module ClassMethods
@@ -5,42 +5,39 @@ module Puffer
5
5
 
6
6
  included do
7
7
  helper 'puffer/helpers/puffer'
8
-
8
+
9
9
  delegate :model, :model_name, :to => 'self.class'
10
10
  helper_method :puffer_filters, :puffer_namespace, :resource, :record, :records
11
11
  end
12
12
 
13
- module InstanceMethods
14
-
15
- def process_action method_name, *args
16
- params[:puffer] = Rails.application.routes.resources_tree[params[:puffer]] if params[:puffer]
17
- super
18
- end
19
-
20
- def puffer_filters
21
- @puffer_filters ||= begin
22
- filters = params[Puffer::Filters.model_name.param_key] || {}
23
- filters = {:puffer_order => configuration.order}.merge(filters) if configuration.order.present?
24
- Puffer::Filters.new filter_fields, filters
25
- end
26
- end
13
+ def process_action method_name, *args
14
+ params[:puffer] = Rails.application.routes.resources_tree[params[:puffer]] if params[:puffer]
15
+ super
16
+ end
27
17
 
28
- def puffer_namespace
29
- resource.scope
18
+ def puffer_filters
19
+ @puffer_filters ||= begin
20
+ filters = params[Puffer::Filters.model_name.param_key] || {}
21
+ filters.reverse_merge! :puffer_order => configuration.order if configuration.order.present?
22
+ filters.reverse_merge! :puffer_per_page => configuration.per_page if configuration.per_page.present?
23
+ Puffer::Filters.new filter_fields, filters
30
24
  end
25
+ end
31
26
 
32
- def resource
33
- @resource ||= Puffer::Resource.new params, self
34
- end
27
+ def puffer_namespace
28
+ request.path_info.split('/').delete_if(&:blank?).first.to_sym
29
+ end
35
30
 
36
- def record
37
- @record || instance_variable_get("@#{resource.model_name}")
38
- end
31
+ def resource
32
+ @resource ||= Puffer::Resource.new params, self
33
+ end
39
34
 
40
- def records
41
- @records || instance_variable_get("@#{resource.model_name.pluralize}")
42
- end
35
+ def record
36
+ @record || instance_variable_get("@#{resource.model_name}")
37
+ end
43
38
 
39
+ def records
40
+ @records || instance_variable_get("@#{resource.model_name.pluralize}")
44
41
  end
45
42
 
46
43
  module ClassMethods
@@ -5,30 +5,25 @@ module Puffer
5
5
  module DirectiveProcessor
6
6
  extend ActiveSupport::Concern
7
7
 
8
- module InstanceMethods
8
+ def process_require_all_directive(path)
9
+ raise ArgumentError, "require_all argument must be relative" unless relative?(path)
9
10
 
10
- def process_require_all_directive(path)
11
- raise ArgumentError, "require_all argument must be relative" unless relative?(path)
11
+ context.environment.paths.each do |root_path|
12
+ root = Pathname.new(root_path).join(path).expand_path
12
13
 
13
- context.environment.paths.each do |root_path|
14
- root = Pathname.new(root_path).join(path).expand_path
14
+ if root.exist? && root.directory?
15
+ context.depend_on(root)
15
16
 
16
- if root.exist? && root.directory?
17
- context.depend_on(root)
18
-
19
- Dir["#{root}/*"].sort.each do |filename|
20
- if filename == self.file
21
- next
22
- elsif context.asset_requirable?(filename)
23
- context.require_asset(filename)
24
- end
17
+ Dir["#{root}/*"].sort.each do |filename|
18
+ if filename == self.file
19
+ next
20
+ elsif context.asset_requirable?(filename)
21
+ context.require_asset(filename)
25
22
  end
26
23
  end
27
24
  end
28
25
  end
29
-
30
26
  end
31
-
32
27
  end
33
28
  end
34
29
  end
@@ -4,22 +4,20 @@ module Puffer
4
4
  module Engine
5
5
  module Configuration
6
6
  extend ActiveSupport::Concern
7
-
7
+
8
8
  included do
9
9
  alias_method_chain :paths, :components
10
10
  end
11
11
 
12
- module InstanceMethods
13
- def paths_with_components
14
- @paths ||= begin
15
- paths = paths_without_components
16
- paths.add 'app/components', :eager_load => true
17
- paths
18
- end
12
+ def paths_with_components
13
+ @paths ||= begin
14
+ paths = paths_without_components
15
+ paths.add 'app/components', :eager_load => true
16
+ paths
19
17
  end
20
18
  end
21
19
  end
22
-
20
+
23
21
  extend ActiveSupport::Concern
24
22
 
25
23
  included do
@@ -3,11 +3,11 @@ module Puffer
3
3
  # Extends rails mapper to provide resources nesting tree structure with
4
4
  # request params. Route defaults contains <tt>:puffer</tt> key with node
5
5
  # index in resources tree nodes array. See <tt>Puffer::Resource::Tree</tt>
6
- #
6
+ #
7
7
  # Resource tree depends on routes resources nesting.
8
8
  #
9
9
  # ex:
10
- #
10
+ #
11
11
  # namespace :admin do
12
12
  # resources :users do
13
13
  # resource :profile
@@ -24,7 +24,7 @@ module Puffer
24
24
  # {:scope => 'admin', :current => :articles, :children => [], :ancestors => [:users]},
25
25
  # {:scope => 'admin', :current => :orders, :children => [], :ancestors => []},
26
26
  # ]
27
- #
27
+ #
28
28
  # a complete tree structure with nodes array to acces with node index
29
29
  # (<tt>Puffer::Resource::Tree#to_struct</tt>).
30
30
  #
@@ -41,15 +41,13 @@ module Puffer
41
41
  module InstanceMethods
42
42
 
43
43
  def namespace_with_puffer path, options = {}
44
- defaults :puffer_scope => path.to_sym do
45
- namespace_without_puffer path, options do
46
- yield
47
-
48
- if ::Rails.application.routes.resources_tree.any? {|node| node.scope == @scope[:module].to_sym}
49
- old, @scope[:module] = @scope[:module], 'admin'
50
- root :to => 'dashboard#index'
51
- @scope[:module] = old
52
- end
44
+ namespace_without_puffer path, options do
45
+ yield
46
+
47
+ if ::Rails.application.routes.resources_tree.any? {|node| node.scope == @scope[:module].to_sym}
48
+ old, @scope[:module] = @scope[:module], 'admin'
49
+ root :to => 'dashboard#index'
50
+ @scope[:module] = old
53
51
  end
54
52
  end
55
53
  end
@@ -0,0 +1,108 @@
1
+ module Puffer
2
+ module Extensions
3
+ # Extends rails mapper to provide resources nesting tree structure with
4
+ # request params. Route defaults contains <tt>:puffer</tt> key with node
5
+ # index in resources tree nodes array. See <tt>Puffer::Resource::Tree</tt>
6
+ #
7
+ # Resource tree depends on routes resources nesting.
8
+ #
9
+ # ex:
10
+ #
11
+ # namespace :admin do
12
+ # resources :users do
13
+ # resource :profile
14
+ # resources :articles
15
+ # end
16
+ # resources :orders
17
+ # end
18
+ #
19
+ # will produce:
20
+ #
21
+ # [
22
+ # {:scope => 'admin', :current => :users, :children => [:profile, :articles], :ancestors => []},
23
+ # {:scope => 'admin', :current => :profile, :children => [], :ancestors => [:users]},
24
+ # {:scope => 'admin', :current => :articles, :children => [], :ancestors => [:users]},
25
+ # {:scope => 'admin', :current => :orders, :children => [], :ancestors => []},
26
+ # ]
27
+ #
28
+ # a complete tree structure with nodes array to acces with node index
29
+ # (<tt>Puffer::Resource::Tree#to_struct</tt>).
30
+ #
31
+ # Also this mapper extension adds come aaditional routes for every pufer
32
+ # controller and namespace.
33
+ module Mapper
34
+ extend ActiveSupport::Concern
35
+
36
+ included do
37
+ alias_method_chain :namespace, :puffer
38
+ alias_method_chain :resource_scope, :puffer
39
+ end
40
+
41
+ def namespace_with_puffer path, options = {}
42
+ namespace_without_puffer path, options do
43
+ yield
44
+
45
+ if ::Rails.application.routes.resources_tree.any? {|node| node.scope == @scope[:module].to_sym}
46
+ old, @scope[:module] = @scope[:module], 'admin'
47
+ root :to => 'dashboard#index'
48
+ @scope[:module] = old
49
+ end
50
+ end
51
+ end
52
+
53
+ def resource_scope_with_puffer kind, resource, &block
54
+ controller = "#{[@scope[:module], resource.controller].compact.join("/")}_controller".camelize.constantize rescue nil
55
+ if controller && controller.puffer?
56
+ singular = kind == :resource
57
+ name = (singular ? resource.singular : resource.plural).to_sym
58
+
59
+ resource_node = ::Rails.application.routes.resources_tree.append_node swallow_nil{@scope[:defaults][:puffer]},
60
+ :name => name, :scope => @scope[:module].to_sym, :controller => controller, :singular => singular
61
+
62
+ defaults :puffer => resource_node do
63
+ resource_scope_without_puffer kind, resource do
64
+ block.call if block
65
+
66
+ member do
67
+ controller._members.each do |action|
68
+ send *action.route
69
+ end
70
+ end
71
+
72
+ collection do
73
+ controller._collections.each do |action|
74
+ send *action.route
75
+ end
76
+ get '/event/:fieldset/:field/:event(/:identifer)', :action => :event, :as => :event
77
+ end
78
+ end
79
+ end
80
+ else
81
+ resource_scope_without_puffer kind, resource, &block
82
+ end
83
+ end
84
+ end
85
+
86
+ module RouteSet
87
+ extend ActiveSupport::Concern
88
+
89
+ included do
90
+ alias_method_chain :clear!, :puffer
91
+ attr_writer :resources_tree
92
+
93
+ def resources_tree
94
+ @resources_tree ||= Puffer::Resource::Tree.new
95
+ end
96
+ end
97
+
98
+ def clear_with_puffer!
99
+ @resources_tree = nil
100
+ clear_without_puffer!
101
+ end
102
+ end
103
+
104
+ end
105
+ end
106
+
107
+ ActionDispatch::Routing::RouteSet.send :include, Puffer::Extensions::RouteSet
108
+ ActionDispatch::Routing::Mapper.send :include, Puffer::Extensions::Mapper