puffer 0.0.29 → 0.0.30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +56 -52
  3. data/README.md +51 -43
  4. data/VERSION +1 -1
  5. data/app/assets/javascripts/puffer/application.js +3 -1
  6. data/app/assets/stylesheets/puffer/application.css +2 -0
  7. data/app/assets/stylesheets/puffer/puffer.css +5 -9
  8. data/app/components/base_component.rb +0 -1
  9. data/app/components/boolean/index.html.erb +1 -1
  10. data/app/components/boolean_component.rb +1 -1
  11. data/app/components/references_many/index.html.erb +1 -0
  12. data/app/components/references_many_component.rb +8 -0
  13. data/app/components/references_one_component.rb +6 -1
  14. data/app/components/select/filter.html.erb +2 -0
  15. data/app/components/select/form.html.erb +1 -1
  16. data/app/components/select_component.rb +13 -2
  17. data/app/controllers/admin/puffer_users_controller.rb +5 -1
  18. data/app/controllers/admin/sessions_controller.rb +4 -1
  19. data/app/controllers/puffer/base.rb +1 -1
  20. data/app/controllers/puffer/sessions_base.rb +3 -0
  21. data/app/controllers/puffer/tree_base.rb +4 -4
  22. data/app/helpers/puffer_helper.rb +16 -15
  23. data/app/models/puffer/puffer_user.rb +11 -10
  24. data/app/models/puffer_user.rb +14 -2
  25. data/app/views/layouts/puffer.html.erb +16 -17
  26. data/app/views/layouts/puffer_base.html.erb +1 -2
  27. data/app/views/layouts/puffer_dashboard.html.erb +2 -2
  28. data/app/views/puffer/base/edit.html.erb +12 -3
  29. data/app/views/puffer/base/new.html.erb +12 -3
  30. data/app/views/puffer/dashboard_base/index.html.erb +5 -5
  31. data/lib/generators/puffer/component/component_generator.rb +0 -1
  32. data/lib/generators/puffer/controller/controller_generator.rb +1 -1
  33. data/lib/generators/puffer/controller/templates/controller.rb +8 -0
  34. data/lib/puffer.rb +77 -13
  35. data/lib/puffer/component.rb +14 -9
  36. data/lib/puffer/controller/auth.rb +41 -2
  37. data/lib/puffer/controller/config.rb +1 -1
  38. data/lib/puffer/controller/mutate.rb +15 -6
  39. data/lib/puffer/extensions/core.rb +4 -0
  40. data/lib/puffer/extensions/directive_processor.rb +36 -0
  41. data/lib/puffer/extensions/form.rb +1 -1
  42. data/lib/puffer/extensions/mapper.rb +74 -149
  43. data/lib/puffer/field.rb +2 -4
  44. data/lib/puffer/field_set.rb +3 -15
  45. data/lib/puffer/filters.rb +105 -0
  46. data/lib/puffer/orm_adapter/active_record.rb +33 -0
  47. data/lib/puffer/orm_adapter/base.rb +4 -0
  48. data/lib/puffer/orm_adapter/mongoid.rb +29 -0
  49. data/lib/puffer/resource.rb +63 -62
  50. data/lib/puffer/resource/node.rb +71 -0
  51. data/lib/puffer/resource/routing.rb +4 -4
  52. data/lib/puffer/resource/tree.rb +36 -0
  53. data/puffer.gemspec +28 -8
  54. data/spec/dummy/app/controllers/admin/posts_controller.rb +1 -1
  55. data/spec/dummy/app/controllers/admin/users_controller.rb +1 -0
  56. data/spec/dummy/app/controllers/application_controller.rb +4 -0
  57. data/spec/dummy/app/controllers/orms/active_record_orm_primals_controller.rb +36 -0
  58. data/spec/dummy/app/controllers/orms/mongoid_orm_primals_controller.rb +42 -0
  59. data/spec/dummy/app/models/active_record_orm.rb +5 -0
  60. data/spec/dummy/app/models/active_record_orm/primal.rb +2 -0
  61. data/spec/dummy/app/models/{mongoid_test.rb → mongoid_orm.rb} +1 -1
  62. data/spec/dummy/app/models/mongoid_orm/primal.rb +46 -0
  63. data/spec/dummy/config/environments/development.rb +3 -0
  64. data/spec/dummy/config/routes.rb +2 -1
  65. data/spec/dummy/db/migrate/20110930183902_create_active_record_orm_primals.rb +17 -0
  66. data/spec/dummy/db/schema.rb +15 -1
  67. data/spec/fabricators/active_record_orm/primal.rb +13 -0
  68. data/spec/fabricators/mongoid_orm/primal.rb +12 -0
  69. data/spec/generators/puffer/component/component_generator_spec.rb +32 -0
  70. data/spec/generators/puffer/controller/controller_generator_spec.rb +31 -0
  71. data/spec/helpers/puffer_helper_spec.rb +62 -0
  72. data/spec/lib/filters_spec.rb +21 -0
  73. data/spec/lib/orm_adapter/active_record_spec.rb +33 -0
  74. data/spec/lib/orm_adapter/base_shared.rb +97 -0
  75. data/spec/lib/orm_adapter/mongoid_spec.rb +46 -0
  76. data/spec/lib/resource/routing_spec.rb +5 -5
  77. data/spec/lib/resource/tree_spec.rb +31 -0
  78. data/spec/lib/resource_spec.rb +36 -37
  79. data/spec/spec_helper.rb +3 -2
  80. metadata +71 -43
  81. data/app/views/puffer/base/_form.html.erb +0 -11
  82. data/lib/generators/puffer/component/templates/component_spec.rb +0 -19
  83. data/lib/puffer/resource/scoping.rb +0 -19
  84. data/spec/dummy/app/controllers/orms/mongoid_tests_controller.rb +0 -19
  85. data/spec/lib/params_spec.rb +0 -120
data/Gemfile CHANGED
@@ -14,6 +14,7 @@ group :development, :test do
14
14
  gem "rspec-rails"
15
15
  gem "capybara"
16
16
  gem 'database_cleaner'
17
+ gem 'ammeter'
17
18
 
18
19
  gem 'guard'
19
20
  gem 'libnotify'
@@ -1,39 +1,43 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- actionmailer (3.1.0)
5
- actionpack (= 3.1.0)
4
+ actionmailer (3.1.1)
5
+ actionpack (= 3.1.1)
6
6
  mail (~> 2.3.0)
7
- actionpack (3.1.0)
8
- activemodel (= 3.1.0)
9
- activesupport (= 3.1.0)
7
+ actionpack (3.1.1)
8
+ activemodel (= 3.1.1)
9
+ activesupport (= 3.1.1)
10
10
  builder (~> 3.0.0)
11
11
  erubis (~> 2.7.0)
12
12
  i18n (~> 0.6)
13
13
  rack (~> 1.3.2)
14
- rack-cache (~> 1.0.3)
14
+ rack-cache (~> 1.1)
15
15
  rack-mount (~> 0.8.2)
16
16
  rack-test (~> 0.6.1)
17
- sprockets (~> 2.0.0)
18
- activemodel (3.1.0)
19
- activesupport (= 3.1.0)
20
- bcrypt-ruby (~> 3.0.0)
17
+ sprockets (~> 2.0.2)
18
+ activemodel (3.1.1)
19
+ activesupport (= 3.1.1)
21
20
  builder (~> 3.0.0)
22
21
  i18n (~> 0.6)
23
- activerecord (3.1.0)
24
- activemodel (= 3.1.0)
25
- activesupport (= 3.1.0)
22
+ activerecord (3.1.1)
23
+ activemodel (= 3.1.1)
24
+ activesupport (= 3.1.1)
26
25
  arel (~> 2.2.1)
27
26
  tzinfo (~> 0.3.29)
28
- activeresource (3.1.0)
29
- activemodel (= 3.1.0)
30
- activesupport (= 3.1.0)
31
- activesupport (3.1.0)
27
+ activeresource (3.1.1)
28
+ activemodel (= 3.1.1)
29
+ activesupport (= 3.1.1)
30
+ activesupport (3.1.1)
32
31
  multi_json (~> 1.0)
32
+ ammeter (0.2.1)
33
+ activesupport (~> 3.0)
34
+ railties (~> 3.0)
35
+ rspec (~> 2.2)
36
+ rspec-rails (~> 2.2)
33
37
  arel (2.2.1)
34
- bcrypt-ruby (3.0.0)
35
- bson (1.3.1)
36
- bson_ext (1.3.1)
38
+ bcrypt-ruby (3.0.1)
39
+ bson (1.4.1)
40
+ bson_ext (1.4.0)
37
41
  builder (3.0.0)
38
42
  capybara (1.1.1)
39
43
  mime-types (>= 1.16)
@@ -45,29 +49,28 @@ GEM
45
49
  childprocess (0.2.2)
46
50
  ffi (~> 1.0.6)
47
51
  database_cleaner (0.6.7)
48
- devise (1.4.5)
52
+ devise (1.4.8)
49
53
  bcrypt-ruby (~> 3.0)
50
54
  orm_adapter (~> 0.0.3)
51
55
  warden (~> 1.0.3)
52
56
  diff-lcs (1.1.3)
53
57
  erubis (2.7.0)
54
- fabrication (1.1.0)
58
+ fabrication (1.2.0)
55
59
  ffi (1.0.9)
56
- forgery (0.4.3)
57
- nokogiri (~> 1.4)
60
+ forgery (0.5.0)
58
61
  git (1.2.5)
59
- guard (0.6.3)
62
+ guard (0.8.4)
60
63
  thor (~> 0.14.6)
61
- guard-rspec (0.4.4)
62
- guard (>= 0.4.0)
64
+ guard-rspec (0.5.0)
65
+ guard (>= 0.8.4)
63
66
  hike (1.2.1)
64
67
  i18n (0.6.0)
65
68
  jeweler (1.6.4)
66
69
  bundler (~> 1.0)
67
70
  git (>= 1.2.5)
68
71
  rake
69
- json_pure (1.5.4)
70
- spruz (~> 0.2.8)
72
+ json (1.6.1)
73
+ json_pure (1.6.1)
71
74
  kaminari (0.12.4)
72
75
  rails (>= 3.0.0)
73
76
  libnotify (0.5.7)
@@ -76,11 +79,11 @@ GEM
76
79
  mime-types (~> 1.16)
77
80
  treetop (~> 1.4.8)
78
81
  mime-types (1.16)
79
- mongo (1.3.1)
80
- bson (>= 1.3.1)
81
- mongoid (2.2.0)
82
- activemodel (~> 3.0)
83
- mongo (~> 1.3)
82
+ mongo (1.4.1)
83
+ bson (= 1.4.1)
84
+ mongoid (2.3.2)
85
+ activemodel (~> 3.1)
86
+ mongo (~> 1.4)
84
87
  tzinfo (~> 0.3.22)
85
88
  multi_json (1.0.3)
86
89
  nested_set (1.6.8)
@@ -89,8 +92,8 @@ GEM
89
92
  nokogiri (1.5.0)
90
93
  orm_adapter (0.0.5)
91
94
  polyglot (0.3.2)
92
- rack (1.3.2)
93
- rack-cache (1.0.3)
95
+ rack (1.3.4)
96
+ rack-cache (1.1)
94
97
  rack (>= 0.4)
95
98
  rack-mount (0.8.3)
96
99
  rack (>= 1.0.0)
@@ -98,23 +101,24 @@ GEM
98
101
  rack
99
102
  rack-test (0.6.1)
100
103
  rack (>= 1.0)
101
- rails (3.1.0)
102
- actionmailer (= 3.1.0)
103
- actionpack (= 3.1.0)
104
- activerecord (= 3.1.0)
105
- activeresource (= 3.1.0)
106
- activesupport (= 3.1.0)
104
+ rails (3.1.1)
105
+ actionmailer (= 3.1.1)
106
+ actionpack (= 3.1.1)
107
+ activerecord (= 3.1.1)
108
+ activeresource (= 3.1.1)
109
+ activesupport (= 3.1.1)
107
110
  bundler (~> 1.0)
108
- railties (= 3.1.0)
109
- railties (3.1.0)
110
- actionpack (= 3.1.0)
111
- activesupport (= 3.1.0)
111
+ railties (= 3.1.1)
112
+ railties (3.1.1)
113
+ actionpack (= 3.1.1)
114
+ activesupport (= 3.1.1)
112
115
  rack-ssl (~> 1.3.2)
113
116
  rake (>= 0.8.7)
114
117
  rdoc (~> 3.4)
115
118
  thor (~> 0.14.6)
116
119
  rake (0.9.2)
117
- rdoc (3.9.4)
120
+ rdoc (3.10)
121
+ json (~> 1.4)
118
122
  rspec (2.6.0)
119
123
  rspec-core (~> 2.6.0)
120
124
  rspec-expectations (~> 2.6.0)
@@ -129,24 +133,23 @@ GEM
129
133
  railties (~> 3.0)
130
134
  rspec (~> 2.6.0)
131
135
  rubyzip (0.9.4)
132
- selenium-webdriver (2.5.0)
136
+ selenium-webdriver (2.8.0)
133
137
  childprocess (>= 0.2.1)
134
138
  ffi (>= 1.0.7)
135
139
  json_pure
136
140
  rubyzip
137
- sprockets (2.0.0)
141
+ sprockets (2.0.2)
138
142
  hike (~> 1.2)
139
143
  rack (~> 1.0)
140
144
  tilt (~> 1.1, != 1.3.0)
141
- spruz (0.2.13)
142
145
  sqlite3 (1.3.4)
143
146
  thor (0.14.6)
144
147
  tilt (1.3.3)
145
148
  treetop (1.4.10)
146
149
  polyglot
147
150
  polyglot (>= 0.3.1)
148
- tzinfo (0.3.29)
149
- warden (1.0.5)
151
+ tzinfo (0.3.30)
152
+ warden (1.0.6)
150
153
  rack (>= 1.0)
151
154
  xpath (0.1.4)
152
155
  nokogiri (~> 1.3)
@@ -155,6 +158,7 @@ PLATFORMS
155
158
  ruby
156
159
 
157
160
  DEPENDENCIES
161
+ ammeter
158
162
  bson_ext
159
163
  capybara
160
164
  database_cleaner
data/README.md CHANGED
@@ -1,26 +1,34 @@
1
1
  # Puffer - YARAI (Yet Another Rails Admin Interface). Rails 3.1 only.
2
2
 
3
- Puffer was created to help project owner or moderators view and edit all the project`s data models. It is rails 3.1 only
3
+ Puffer was created to help a project owner or moderators view and edit all the project's data models. It's compatible with Rails 3.1 only.
4
4
 
5
- ## Keyfeatures
5
+ ## Discussion and help
6
6
 
7
- * Full rails integration. Puffer has no configs, just DSL to create interfaces. And this DSL depends on rails convensions.
7
+ puffer@conference.jabber.org
8
+
9
+ ## Key features
10
+
11
+ * Full Rails integration. Puffer has no configuration, just a DSL to create interfaces. And this DSL depends on Rails conventions.
8
12
  * Flexibility. Puffer designed to be as flexible as possible, so you can create your own modules easily.
9
13
  * I18n. Surely.
10
- * Bla bla
14
+ * Puffer can support different ORMs or ODMs through orm_adapter.
15
+ * Implemented full AR and Mongoid support.
11
16
 
12
17
  ## Installation.
13
18
 
14
- You can instal puffer as a gem:
15
- <pre>gem install puffer</pre>
19
+ You can install puffer as a gem:
20
+
21
+ `gem install puffer`
22
+
16
23
  Or in Gemfile:
17
- <pre>gem "puffer"</pre>
24
+
25
+ `gem "puffer"`
18
26
 
19
27
  ## Introduction.
20
28
 
21
- So, you have some data structure of your project. Let it`ll be like this:
29
+ Let's assume this is the data structure of your project:
22
30
 
23
- <pre>
31
+ ```
24
32
  create_table "users", :force => true do |t|
25
33
  t.string "email"
26
34
  t.string "password"
@@ -35,33 +43,35 @@ create_table "posts", :force => true do |t|
35
43
  t.datetime "created_at"
36
44
  t.datetime "updated_at"
37
45
  end
38
- </pre>
46
+ ```
39
47
 
40
- Also, you have two models:
48
+ And let's also assume your models look like this:
41
49
 
42
- <pre>
43
- class User &lt; ActiveRecord::Base
50
+ ```
51
+ class User < ActiveRecord::Base
44
52
  has_many :posts
45
53
  validates_presence_of :email, :password
46
54
  validates_length_of :password, :minimum => 6
47
55
  end
48
- </pre>
49
56
 
50
- <pre>
51
- class Profile &lt; ActiveRecord::Base
57
+ class Profile < ActiveRecord::Base
52
58
  belongs_to :user
53
59
  validates_presence_of :name, :surname
54
60
  end
55
- </pre>
61
+ ```
62
+
63
+ First, let's generate Puffer controllers:
64
+
65
+ `rails g puffer:controller User`
56
66
 
57
- At first, lets generate puffers controllers:
58
- <pre>rails g puffer:controller User</pre>
59
67
  and
60
- <pre>rails g puffer:controller Post</pre>
61
68
 
62
- This will generate a kind of:
63
- <pre>
64
- class Admin::PostsController &lt; Puffer::Base
69
+ `rails g puffer:controller Post`
70
+
71
+ This will generate this:
72
+
73
+ ```
74
+ class Admin::PostsController < Puffer::Base
65
75
  setup do
66
76
  group :posts
67
77
  end
@@ -85,37 +95,35 @@ class Admin::PostsController &lt; Puffer::Base
85
95
  end
86
96
 
87
97
  end
88
- </pre>
98
+ ```
89
99
 
90
- Puffer controller`s DSL creates all the actions we need. Next step - routing
100
+ Puffer's controller DSL creates all the actions you need. Next step: routing.
91
101
 
92
- <pre>
93
- namespace :admin
102
+ ```
103
+ namespace :admin do
94
104
  resources :users do
95
105
  resources :posts
96
106
  end
97
107
  resources :posts
98
108
  end
99
- </pre>
109
+ ```
100
110
 
101
- Let me explain this feature. Puffer tracks all the nested resources. So, with this routing structure we can access, for example, only specified user`s posts:
111
+ Let me explain this feature. Puffer tracks all the nested resources. So, with this routing structure we can access, for example, only specified user's posts:
102
112
 
103
- <pre>
104
- /admin/users/1/post
105
- </pre>
113
+ `/admin/users/1/post`
106
114
 
107
115
  Routing nesting defines admin interface resources nesting.
108
116
 
109
117
  ## Advanced usage
110
118
 
111
- Puffer can be used in other namespaces, then admin:
119
+ Puffer can be used in other namespaces than admin:
112
120
 
113
- <pre>rails g puffer:controller moderator/posts</pre>
121
+ `rails g puffer:controller moderator/posts`
114
122
 
115
- And we`ll get posts controller for moderator:
123
+ And we'll get posts controller for moderators:
116
124
 
117
- <pre>
118
- class Moderator::PostsController &lt; Puffer::Base
125
+ ```
126
+ class Moderator::PostsController < Puffer::Base
119
127
  before_filter :require_moderator
120
128
 
121
129
  setup do
@@ -137,14 +145,14 @@ class Moderator::PostsController &lt; Puffer::Base
137
145
  field :updated_at
138
146
  end
139
147
  end
140
- </pre>
148
+ ```
141
149
 
142
- As you can see, moderators can not destroy posts, also moderator`s posts controller placed at Posting tab of admin interface.
143
- And don`t forget about routing:
150
+ As you can see, moderators can't destroy posts. The moderator's post controller is placed in the Posting tab of the admin interface.
144
151
 
145
- <pre>
152
+ Finally, don't forget about routing:
153
+
154
+ ```
146
155
  namespace :moderator do
147
156
  resources :posts
148
157
  end
149
- </pre>
150
-
158
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.29
1
+ 0.0.30
@@ -5,4 +5,6 @@
5
5
  //= require puffer/right-autocompleter-src
6
6
  //= require puffer/paginator
7
7
  //= require puffer/rails
8
- //= require puffer/puffer
8
+ //= require puffer/puffer
9
+
10
+ //= require_all ./puffer
@@ -4,4 +4,6 @@
4
4
  *= require puffer/paginator
5
5
  *= require puffer/puffer
6
6
  *= require puffer/puffer_tree
7
+
8
+ *= require_all ./puffer
7
9
  */
@@ -206,13 +206,9 @@ h2
206
206
  {
207
207
  display: table-cell;
208
208
  vertical-align: top;
209
- }
210
-
211
- .column,
212
- {
213
- display: inline;
214
- vertical-align: top;
215
- width: expression(function(t){
209
+ _display: inline;
210
+ _vertical-align: top;
211
+ _width: expression(function(t){
216
212
  var sum = 0;
217
213
  for (var i = 0; i < t.parentNode.childNodes.length; i++) {
218
214
  if (t.parentNode.childNodes[i] != t) {
@@ -220,8 +216,8 @@ h2
220
216
  }
221
217
  }
222
218
  return t.parentNode.clientWidth - sum + 'px';
223
- }(this));
224
- zoom: 1;
219
+ }(this));
220
+ zoom: 1;
225
221
  }
226
222
 
227
223
  .sidebar
@@ -9,7 +9,6 @@ class BaseComponent < Puffer::Component::Base
9
9
  end
10
10
 
11
11
  def filter
12
-
13
12
  end
14
13
 
15
14
  end
@@ -1,3 +1,3 @@
1
1
  <%= component_wrap do %>
2
- <%= link_to opts[:record].call_chain(field.to_s) ? 'True' : 'False', event_path(:update, :id => opts[:record].to_param), :remote => true %>
2
+ <%= link_to opts[:record].call_chain(field.to_s) ? 'True' : 'False', event_path(:change, :id => opts[:record].to_param), :remote => true %>
3
3
  <% end %>
@@ -4,7 +4,7 @@ class BooleanComponent < BaseComponent
4
4
  render
5
5
  end
6
6
 
7
- def update
7
+ def change
8
8
  opts[:record] = resource.member
9
9
  opts[:record].update_attributes field.to_s => !opts[:record].call_chain(field.to_s)
10
10
  replace :index
@@ -0,0 +1 @@
1
+ <%= link_to field.human, resource.children_hash[field.name].collection_path %>
@@ -1,7 +1,15 @@
1
1
  class ReferencesManyComponent < Puffer::Component::Base
2
2
 
3
+ def index
4
+ render
5
+ end
6
+
3
7
  def form
4
8
  render
5
9
  end
10
+
11
+ def filter
12
+
13
+ end
6
14
 
7
15
  end