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
@@ -22,7 +22,7 @@ module Puffer
22
22
  delegate :model_name, :special_attributes, :to => 'self.class'
23
23
 
24
24
  def self.special_attributes
25
- %w(puffer_search puffer_order)
25
+ %w(puffer_search puffer_order puffer_per_page)
26
26
  end
27
27
 
28
28
  special_attributes.each do |attribute|
@@ -59,7 +59,7 @@ module Puffer
59
59
  end
60
60
 
61
61
  def any?
62
- attributes.values.any?
62
+ attributes.except(:puffer_per_page).values.any?
63
63
  end
64
64
 
65
65
  def attributes
@@ -94,18 +94,26 @@ module Puffer
94
94
  end
95
95
 
96
96
  def conditions
97
- fieldset.map(&:field_name).reduce(ActiveSupport::HashWithIndifferentAccess.new()) do |res, attribute|
97
+ fieldset.reduce(ActiveSupport::HashWithIndifferentAccess.new()) do |res, field|
98
+ attribute = field.field_name
98
99
  value = send(attribute)
99
100
 
100
101
  unless value.blank?
102
+ if field.column_type == :boolean
103
+ value = true if Puffer::TRUE_VALUES.include?(value)
104
+ value = false if Puffer::FALSE_VALUES.include?(value)
105
+ end
106
+
101
107
  value = case value
102
108
  when 'puffer_nil' then nil
103
109
  when 'puffer_blank' then ''
104
110
  else value
105
111
  end
112
+
106
113
  res[attribute] = value
107
114
  end
108
115
 
116
+
109
117
  res
110
118
  end
111
119
  end
@@ -118,6 +126,10 @@ module Puffer
118
126
  puffer_order.to_s.split(' ').map(&:to_sym)
119
127
  end
120
128
 
129
+ def per_page
130
+ puffer_per_page.to_i
131
+ end
132
+
121
133
  def query
122
134
  (fieldset.map(&:field_name) + special_attributes).reduce(ActiveSupport::HashWithIndifferentAccess.new()) do |res, attribute|
123
135
  value = send(attribute)
@@ -13,7 +13,9 @@ module Puffer
13
13
  Reflection.new(
14
14
  :klass => reflection.klass,
15
15
  :macro => reflection.macro,
16
- :through? => !!reflection.through_reflection
16
+ :through? => !!reflection.through_reflection,
17
+ :accessor => accessor_for(reflection),
18
+ :primary_key => :id
17
19
  ) if reflection
18
20
  end
19
21
 
@@ -24,7 +26,7 @@ module Puffer
24
26
 
25
27
  conditions_fields = fields.select {|f| f.column && conditions.keys.include?(f.field_name)}.to_fieldset
26
28
  search_fields = fields.select {|f| f.column && !conditions_fields.include?(f) && search_types.include?(f.column_type)}
27
- all_fields = conditions_fields + search_fields
29
+ all_fields = conditions_fields + search_fields
28
30
 
29
31
  scope = scope.includes(includes(all_fields)).includes(reflection_includes(fields)).where(searches(search_fields, options[:search])).order(order)
30
32
 
@@ -70,6 +72,17 @@ module Puffer
70
72
  field.options[:order] || query_column(field)
71
73
  end
72
74
 
75
+ def accessor_for reflection
76
+ case reflection.macro
77
+ when :belongs_to then
78
+ reflection.foreign_key
79
+ when :has_one then
80
+ "#{reflection.name}_id"
81
+ when :has_many, :has_and_belong_to_many then
82
+ "#{reflection.name.to_s.singularize}_ids"
83
+ end
84
+ end
85
+
73
86
  end
74
87
  end
75
88
  end
@@ -6,6 +6,10 @@ module Puffer
6
6
  raise NotSupportedError
7
7
  end
8
8
 
9
+ def reflection name
10
+ raise NotSupportedError
11
+ end
12
+
9
13
  def filter scope, fields, options = {}
10
14
  raise NotSupportedError
11
15
  end
@@ -13,7 +13,9 @@ module Puffer
13
13
  Reflection.new(
14
14
  :klass => reflection.klass,
15
15
  :macro => reflection.macro,
16
- :through? => false
16
+ :through? => false,
17
+ :accessor => accessor_for(reflection),
18
+ :primary_key => :_id
17
19
  ) if reflection
18
20
  end
19
21
 
@@ -25,7 +27,7 @@ module Puffer
25
27
  conditions_fields = fields.select {|f| f.column && conditions.keys.include?(f.field_name)}.to_fieldset
26
28
  search_fields = fields.select {|f| f.column && !conditions_fields.include?(f) && search_types.include?(f.column_type)}
27
29
  all_fields = conditions_fields + search_fields
28
-
30
+
29
31
  scope = scope.any_of(searches(search_fields, options[:search])) if options[:search].present?
30
32
  scope = scope.order_by(order)
31
33
 
@@ -60,6 +62,17 @@ module Puffer
60
62
  field.options[:order] || field.name
61
63
  end
62
64
 
65
+ def accessor_for reflection
66
+ case reflection.macro
67
+ when :referenced_in, :belongs_to then
68
+ reflection.foreign_key
69
+ when :references_one, :has_one then
70
+ "#{reflection.name}_id"
71
+ when :references_many, :references_and_referenced_in_many, :has_many, :has_and_belong_to_many then
72
+ "#{reflection.name.to_s.singularize}_ids"
73
+ end
74
+ end
75
+
63
76
  end
64
77
  end
65
78
  end
@@ -19,7 +19,7 @@ module Puffer
19
19
  params = ActiveSupport::HashWithIndifferentAccess.new.deep_merge params
20
20
 
21
21
  @resource_node = params[:puffer]
22
- @scope = swallow_nil{@resource_node.scope} || params[:puffer_scope]
22
+ @scope = swallow_nil{@resource_node.scope} || controller_instance.puffer_namespace
23
23
  @params = params
24
24
  @controller_instance = controller_instance
25
25
  end
@@ -1,3 +1,3 @@
1
1
  module Puffer
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.version = Puffer::VERSION
8
8
  s.authors = ["pyromaniac"]
9
9
  s.email = ["kinwizard@gmail.com"]
10
- s.homepage = ""
10
+ s.homepage = "http://github.com/puffer/puffer"
11
11
  s.summary = %q{In Soviet Russia puffer admins you}
12
12
  s.description = %q{Admin interface builder}
13
13
 
@@ -19,23 +19,29 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  # specify any dependencies here; for example:
22
- s.add_runtime_dependency(%q<rails>, ["~> 3.1.0"])
22
+ s.add_runtime_dependency(%q<rails>, ["~> 3.1"])
23
23
  s.add_runtime_dependency(%q<kaminari>, [">= 0"])
24
24
  s.add_runtime_dependency(%q<orm_adapter>, [">= 0"])
25
25
 
26
26
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
27
27
  s.add_development_dependency(%q<mongoid>, [">= 0"])
28
28
  s.add_development_dependency(%q<bson_ext>, [">= 0"])
29
- s.add_development_dependency(%q<devise>, [">= 0"])
30
29
  s.add_development_dependency(%q<rspec-rails>, [">= 0"])
31
30
  s.add_development_dependency(%q<capybara>, [">= 0"])
32
31
  s.add_development_dependency(%q<database_cleaner>, [">= 0"])
33
32
  s.add_development_dependency(%q<ammeter>, [">= 0"])
34
33
  s.add_development_dependency(%q<timecop>, [">= 0"])
35
34
  s.add_development_dependency(%q<guard>, [">= 0"])
36
- s.add_development_dependency(%q<libnotify>, [">= 0"])
37
35
  s.add_development_dependency(%q<guard-rspec>, [">= 0"])
36
+ s.add_development_dependency(%q<rb-inotify>, [">= 0"])
37
+ s.add_development_dependency(%q<libnotify>, [">= 0"])
38
38
  s.add_development_dependency(%q<forgery>, [">= 0"])
39
39
  s.add_development_dependency(%q<fabrication>, [">= 0"])
40
40
  s.add_development_dependency(%q<nested_set>, [">= 0"])
41
+
42
+ s.add_development_dependency(%q<devise>, [">= 0"])
43
+ s.add_development_dependency(%q<clearance>, [">= 0"])
44
+
45
+ s.add_development_dependency(%q<carrierwave>, [">= 0"])
46
+ s.add_development_dependency(%q<mini_magick>, [">= 0"])
41
47
  end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples "a session controller" do
4
+
5
+ controller do
6
+ def send_action method_name, *args
7
+ params[:puffer] = Puffer::Resource::Node.new(nil, :name => :anonymous, :controller => self.class, :singular => false)
8
+ send method_name, *args
9
+ end
10
+ end
11
+
12
+ describe "GET new" do
13
+ it "assigns @record" do
14
+ get :new
15
+ assigns(:record).should be_a_new controller.model
16
+ end
17
+
18
+ it "renders the new template" do
19
+ pending 'some strange rspec behavior'
20
+ get :new
21
+ response.should render_template
22
+ end
23
+ end
24
+
25
+ describe "POST create" do
26
+ it "with invalid data" do
27
+ post :create, param_key => {:email => user.email, :password => '111'}
28
+ response.should render_template 'new'
29
+ end
30
+
31
+ it "assigns @record with invalid data" do
32
+ post :create, param_key => {:email => user.email, :password => '111'}
33
+ assigns(:record).should be_a_new controller.model
34
+ end
35
+
36
+ it "with valid data" do
37
+ post :create, param_key => {:email => user.email, :password => '123456'}
38
+ response.should redirect_to '/admin'
39
+ end
40
+
41
+ it "with valid data and return_to" do
42
+ return_to = "/hello/world"
43
+
44
+ post :create, param_key => {:email => user.email, :password => '123456'}, :return_to => return_to
45
+ response.should redirect_to return_to
46
+ end
47
+
48
+ it "current_puffer_user shoul be set" do
49
+ post :create, param_key => {:email => user.email, :password => '123456'}
50
+ controller.current_puffer_user.should == user
51
+ end
52
+ end
53
+
54
+ describe "DELETE destroy" do
55
+ it "current_puffer_user shoul be nil" do
56
+ delete :destroy, :id => 42
57
+ controller.current_puffer_user.should be_nil
58
+ end
59
+
60
+ it "should redirect" do
61
+ delete :destroy, :id => 42
62
+ response.should redirect_to '/admin/session/new'
63
+ end
64
+ end
65
+
66
+ end
@@ -0,0 +1,21 @@
1
+ require 'clearance/testing'
2
+ require 'controllers/sessions/base_shared'
3
+
4
+ describe Puffer::Sessions::Clearance do
5
+ controller do
6
+ include Clearance::Authentication
7
+
8
+ setup do
9
+ model_name :clearance_user
10
+ end
11
+
12
+ def current_puffer_user
13
+ current_user
14
+ end
15
+ end
16
+
17
+ it_behaves_like "a session controller" do
18
+ let(:user) {Fabricate :clearance_user}
19
+ let(:param_key) {:clearance_user}
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ require 'controllers/sessions/base_shared'
2
+
3
+ describe Puffer::Sessions::Simple do
4
+ controller do
5
+ def current_puffer_user
6
+ model.to_adapter.get(session[:puffer_user_id])
7
+ end
8
+ end
9
+
10
+ it_behaves_like "a session controller" do
11
+ let(:user) {Fabricate :puffer_user}
12
+ let(:param_key) {:puffer_user}
13
+ end
14
+ end
@@ -8,7 +8,7 @@ class Admin::NewsController < Puffer::Base
8
8
  field :title
9
9
  field :body
10
10
  field :renderable, :render => lambda { @record.title }
11
- field :renderable2, :render => :render_title
11
+ #field :renderable2, :render => :render_title
12
12
  end
13
13
 
14
14
  form do
@@ -1,4 +1,4 @@
1
- class Admin::ProfilesController < Puffer::Base
1
+ class Admin::ProfilesController < Puffer::GridBase
2
2
 
3
3
  setup do
4
4
  group :users
@@ -8,6 +8,7 @@ class Admin::ProfilesController < Puffer::Base
8
8
  field 'user.email'
9
9
  field :name
10
10
  field :surname
11
+ field :avatar
11
12
  field :birth_date, :format => :long
12
13
  end
13
14
 
@@ -18,6 +19,7 @@ class Admin::ProfilesController < Puffer::Base
18
19
  end
19
20
  field :name
20
21
  field :surname
22
+ field :avatar
21
23
  field :birth_date
22
24
  field :created_at
23
25
  end
@@ -1,6 +1,11 @@
1
1
  class ApplicationController < ActionController::Base
2
+ include Clearance::Authentication
2
3
  protect_from_forgery
3
4
 
5
+ def current_puffer_user
6
+ nil
7
+ end
8
+
4
9
  def has_puffer_access? namespace
5
10
  true
6
11
  end
@@ -23,6 +23,22 @@ class Orms::MongoidOrmPrimalsController < Puffer::Base
23
23
  end
24
24
 
25
25
  form do
26
+ field :has_one_reference do
27
+ field :name
28
+ end
29
+
30
+ field :has_many_references do
31
+ field :name
32
+ end
33
+
34
+ field :embeds_one_reference do
35
+ field :name
36
+ end
37
+
38
+ field :embeds_many_references do
39
+ field :name
40
+ end
41
+
26
42
  field :string_field
27
43
  field :symbol_field
28
44
  field :select_field, :select => (1..5).map {|i| "option #{i}"}
@@ -3,5 +3,5 @@ module NewsHelper
3
3
  def render_title
4
4
  @record.title
5
5
  end
6
-
6
+
7
7
  end
@@ -0,0 +1,3 @@
1
+ class ClearanceUser < ActiveRecord::Base
2
+ include Clearance::User
3
+ end
@@ -0,0 +1,9 @@
1
+ class MongoidOrm::EmbedsManyReference
2
+ include Mongoid::Document
3
+
4
+ field :name
5
+
6
+ embedded_in :primal, :class_name => 'MongoidOrm::Primal'
7
+
8
+ validates :name, :presence => true
9
+ end
@@ -0,0 +1,9 @@
1
+ class MongoidOrm::EmbedsOneReference
2
+ include Mongoid::Document
3
+
4
+ field :name
5
+
6
+ embedded_in :primal, :class_name => 'MongoidOrm::Primal'
7
+
8
+ validates :name, :presence => true
9
+ end
@@ -0,0 +1,9 @@
1
+ class MongoidOrm::HasManyReference
2
+ include Mongoid::Document
3
+
4
+ field :name
5
+
6
+ belongs_to :primal, :class_name => 'MongoidOrm::Primal'
7
+
8
+ validates :name, :presence => true
9
+ end
@@ -0,0 +1,9 @@
1
+ class MongoidOrm::HasOneReference
2
+ include Mongoid::Document
3
+
4
+ field :name
5
+
6
+ belongs_to :primal, :class_name => 'MongoidOrm::Primal'
7
+
8
+ validates :name, :presence => true
9
+ end