puffer 0.1.0 → 0.1.1

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