padrino-admin 0.6.7 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -89,7 +89,52 @@ All upload definitions are defined in lib/uploader.rb, here you can preproces yo
89
89
 
90
90
  See http://github.com/jnicklas/carrierwave
91
91
 
92
- ... here some example howto attach uploads to any model ...
92
+ ==== Attach Many Uploads to a Model
93
+
94
+ If you want attach in a model ex: Account many uploads you can do that in a simple way add a habtm relation!
95
+
96
+ # app/models/account.rb
97
+ has n, :uploads
98
+
99
+ or for ActiveRecord
100
+
101
+ # app/models/account.rb
102
+ has_and_belongs_to_many :uploads
103
+
104
+ Now edit the form and add these lines:
105
+
106
+ # admin/views/accounts/_form.haml
107
+ %tr
108
+ %td=f.label :uploads
109
+ %td=f.open_window_grid :upload_ids, :with => :uploads, :get => :id, :show => :file, :multiple => true, :item => :panel
110
+
111
+ *open_window_grid* is a padrino-admin method that open an extjs window contains your +grids+ so in this case:
112
+
113
+ open window grid for :+account+ model in method :+upload_ids+ with the help of controller :+uploads+ and
114
+ get as a value the :+id+ and display :+file+.
115
+
116
+ :+multiple+ indicate that we need more than one :+id+.
117
+ :+item+ tell to the grid who is the container, we need to explicit this because we have two container in our upload.js
118
+
119
+ See view helpers[http://github.com/padrino/padrino-framework/blob/master/padrino-admin/lib/padrino-admin/helpers/view.rb#L145] for more docs.
120
+
121
+ That's all! Now run mingrations and browse accounts for see our uploader.
122
+
123
+ ==== Attach One Upload to a Model
124
+
125
+ The process is the same as above you need only define in your model:
126
+
127
+ # app/models/account.rb
128
+ belongs_to :upload
129
+
130
+ and add this to your account form:
131
+
132
+ # admin/views/accounts/_form.haml
133
+ %tr
134
+ %td=f.label :upload
135
+ %td=f.open_window_grid :upload_id, :with => :uploads, :get => :id, :show => :file, :item => :panel
136
+
137
+ Remember to run migrations before start your server.
93
138
 
94
139
  == Copyright
95
140
 
data/Rakefile CHANGED
@@ -15,6 +15,7 @@ begin
15
15
  gem.add_runtime_dependency "json_pure", ">= 1.2.0"
16
16
  gem.add_runtime_dependency "padrino-core", "= #{GEM_VERSION}"
17
17
  gem.add_runtime_dependency "padrino-gen", "= #{GEM_VERSION}"
18
+ gem.add_runtime_dependency "padrino-helpers", "= #{GEM_VERSION}"
18
19
  gem.add_runtime_dependency "tilt", ">= 0.4"
19
20
  gem.add_development_dependency "haml", ">= 2.2.1"
20
21
  gem.add_development_dependency "shoulda", ">= 0"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.7
1
+ 0.7.0
data/lib/padrino-admin.rb CHANGED
@@ -2,6 +2,7 @@ require 'tilt'
2
2
  require 'thor'
3
3
  require 'padrino-core'
4
4
  require 'padrino-gen'
5
+ require 'padrino-helpers'
5
6
 
6
7
  Dir[File.dirname(__FILE__) + '/padrino-admin/*.rb'].each {|file| require file }
7
8
  Dir[File.dirname(__FILE__) + '/padrino-admin/{helpers,orm,generators,middleware,utils}/*.rb'].each {|file| require file }
@@ -23,6 +24,11 @@ Padrino::Application.send(:access_control=, Class.new(Padrino::AccessControl::Ba
23
24
  #
24
25
  CarrierWave.root = Padrino.root if defined?(CarrierWave)
25
26
 
27
+ ##
28
+ # Extend Abastract Form builder
29
+ #
30
+ Padrino::Helpers::FormBuilder::AbstractFormBuilder.send(:include, Padrino::Admin::Helpers::AbstractFormBuilder)
31
+
26
32
  ##
27
33
  # Load our Padrino::Admin locales
28
34
  #
@@ -53,11 +53,8 @@ module Padrino
53
53
  -----------------------------------------------------------------
54
54
  Your admin now is installed, now follow this steps:
55
55
 
56
- - edit your config/database.rb
57
- - run padrino rake -T and run db creation according to your orm
58
- - run padrino rake seed
59
-
60
- That's all
56
+ 1) Run migrations
57
+ 2) That's all!!
61
58
  -----------------------------------------------------------------
62
59
 
63
60
  TEXT
@@ -67,10 +67,12 @@ module Padrino
67
67
 
68
68
  say (<<-TEXT).gsub(/ {10}/,'')
69
69
 
70
- -----------------------------------------------------
71
- 1) Run migrations
72
- 2) That's all!!
73
- -----------------------------------------------------
70
+ --------------------------------------------------------
71
+ Your admin uploader is installed, now follow this steps:
72
+
73
+ 1) Run migrations
74
+ 2) That's all!!
75
+ --------------------------------------------------------
74
76
 
75
77
  TEXT
76
78
  else
@@ -1,10 +1,3 @@
1
- /*
2
- * Lipsiasadmin
3
- * Copyright(c) 2007-2008, LipsiaSoft s.r.l.
4
- * info@lipsiasoft.com
5
- *
6
- * http://www.lipsiasoft.com
7
- */
8
1
  body { font-size:12px; font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; padding:0; margin:0; color:#222; }
9
2
  table { font-size:12px; font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; }
10
3
  table.form { padding:10px; }
@@ -63,5 +56,7 @@ input,textarea{margin:0;font:normal 12px tahoma,arial,helvetica,sans-serif;width
63
56
  input,textarea{padding:1px 3px;background:#fff url(../images/ext/default/form/text-bg.gif) repeat-x 0 0;border:1px solid #B5B8C8;}
64
57
  input{height:22px;line-height:18px;vertical-align:middle;}
65
58
  /* Errors */
66
- .errorExplanation{font-size:13px;padding:10px;width:300px;border:2px solid #B64134;margin:0 auto; background-color:#E5BD69;}
67
- .errorExplanation h1{font-size:15px;}
59
+ .field-errors{border:2px solid red;background-color:#ECEBC3;padding:10px;margin-top:5px;margin-bottom:5px;}
60
+ .field-errors h2{font-size:1.2em}
61
+ .field-errors ul{list-style-type: disc;margin-left:25px;margin-top:10px;display:block;}
62
+ .field-errors ul li{margin-left:0px;padding-top:5px;margin:0px;}
@@ -91,6 +91,14 @@ Admin.app = function(){
91
91
  this.cleanScripts();
92
92
  this.clean();
93
93
  Ext.History.add(url, true);
94
+ // Enable this for debug errors:
95
+ // // We append the js into the head so we can easy inspect errors
96
+ // var hd = document.getElementsByTagName("head")[0];
97
+ // var s = document.createElement("script");
98
+ // s.src = url;
99
+ // s.type = 'text/javascript';
100
+ // // Now we can append the child.
101
+ // hd.appendChild(s);
94
102
  Ext.Ajax.request({ url: url, nocache:true });
95
103
  } else if (ext == 'html'){
96
104
  this.loadWidget(url);
@@ -222,7 +230,7 @@ Admin.app = function(){
222
230
  defaults: { autoScroll:true, layout:'fit' }
223
231
  });
224
232
 
225
- this.tabPanel.render();
233
+ this.addItem(this.tabPanel);
226
234
  }
227
235
 
228
236
  this.fireEvent('contentLoaded');
@@ -264,7 +272,6 @@ Admin.grid = Ext.extend(Ext.grid.GridPanel, {
264
272
  title: 'Grid',
265
273
  baseUrl: '',
266
274
  region: "center",
267
- viewConfig: { forceFit: true },
268
275
  border: false,
269
276
  buttons: ['add', 'edit', 'remove'],
270
277
  search: true,
@@ -275,65 +282,50 @@ Admin.grid = Ext.extend(Ext.grid.GridPanel, {
275
282
 
276
283
  initComponent: function(){
277
284
  // Prepare our View/Cm/Sm
278
- this.view = new Ext.grid.GroupingView({ forceFit: true }),
279
- this.sm = new Ext.grid.CheckboxSelectionModel(),
280
- this.column_fields.unshift(new Ext.grid.CheckboxSelectionModel());
281
- this.cm = new Ext.grid.ColumnModel({ columns: this.column_fields });
285
+ this.view = new Ext.grid.GroupingView({ forceFit: true });
286
+ this.selModel = new Ext.grid.CheckboxSelectionModel();
287
+ this.column_fields.unshift(this.selModel);
288
+ this.colModel = new Ext.grid.ColumnModel({ columns: this.column_fields });
282
289
  // Toolbar
283
290
  if (this.buttons.length > 0 || this.search){ this.tbar = new Ext.Toolbar() };
284
291
  // Add Buttons
285
292
  Ext.each(this.buttons, function(button){
286
293
  switch(button){
287
294
  case 'add':
288
- this.tbar.addButton({
295
+ this.btnAdd = this.tbar.addButton({
289
296
  handler: this.addRecord,
290
297
  text: Admin.locale.buttons.add,
291
298
  disabled: false,
292
299
  scope: this,
293
300
  cls: "x-btn-text-icon add",
294
- id: "add"
301
+ name: "add"
295
302
  });
296
303
  break;
297
304
  case 'edit':
298
- this.tbar.addButton({
305
+ this.btnEdit = this.tbar.addButton({
299
306
  handler: this.editRecord,
300
307
  text: Admin.locale.buttons.edit,
301
308
  disabled: true,
302
309
  scope: this,
303
310
  cls: "x-btn-text-icon edit",
304
- id: "edit"
311
+ name: "edit"
305
312
  });
306
- break
313
+ break;
307
314
  case 'remove':
308
- this.tbar.addButton({
315
+ this.btnRemove = this.tbar.addButton({
309
316
  handler: this.removeRecord,
310
317
  text: Admin.locale.buttons.remove,
311
318
  disabled: true,
312
319
  scope: this,
313
320
  cls: "x-btn-text-icon remove",
314
- id: "remove"
321
+ name: "remove"
315
322
  });
323
+ break;
316
324
  }
317
325
  }, this);
318
326
  this.buttons = undefined; // Remove all bbar buttons, we don't want them in the bottom of grid.
319
- // Now we need to add some handlers for activate/deactivate buttons
320
- this.sm.on('selectionchange', function(){
321
- var n = this.getSelectionModel().getSelected();
322
- var btns = this.getTopToolbar().items.map;
323
- if(!n){
324
- if (btns.remove){ btns.remove.disable() };
325
- if (btns.edit){ btns.edit.disable() };
326
- } else {
327
- if (btns.remove){ btns.remove.enable() };
328
- if (btns.edit){ btns.edit.enable() };
329
- }
330
- }, this);
331
327
  // Add search functions
332
328
  if (this.search){ this.plugins = [new Ext.grid.Search()] };
333
- // Add dblclick
334
- this.on("dblclick", function() {
335
- if (this.getTopToolbar().items.map.edit){ this.editRecord() }
336
- }, this);
337
329
  // Build our store
338
330
  this.store = new Ext.data.GroupingStore({
339
331
  remoteSort: true,
@@ -346,8 +338,6 @@ Admin.grid = Ext.extend(Ext.grid.GridPanel, {
346
338
  id: "id"
347
339
  })
348
340
  });
349
- this.store.on('beforeload', function(){ this.el.mask(); }, this);
350
- this.store.on('load', function(){ this.el.unmask(); }, this);
351
341
  // Build bbar
352
342
  this.bbar = new Ext.PagingToolbar({
353
343
  pageSize: 50,
@@ -356,8 +346,23 @@ Admin.grid = Ext.extend(Ext.grid.GridPanel, {
356
346
  });
357
347
  // Call our superclass
358
348
  Admin.grid.superclass.initComponent.call(this);
359
- // Now we can load our records
349
+ // Now we need to add some handlers for activate/deactivate buttons
360
350
  this.on('render', function(){ this.store.load() }, this);
351
+ this.selModel.on('selectionchange', function(){
352
+ var n = this.selModel.getSelected();
353
+ if(!n){
354
+ if (this.btnRemove){ this.btnRemove.disable() };
355
+ if (this.btnEdit){ this.btnEdit.disable() };
356
+ } else {
357
+ if (this.btnRemove){ this.btnRemove.enable() };
358
+ if (this.btnEdit){ this.btnEdit.enable() };
359
+ }
360
+ }, this);
361
+ this.on("dblclick", function() {
362
+ if (this.btnEdit){ this.editRecord() }
363
+ }, this);
364
+ this.store.on('beforeload', function(){ this.el.mask(); }, this);
365
+ this.store.on('load', function(){ this.el.unmask(); }, this);
361
366
  }, // initComponent
362
367
 
363
368
  addRecord: function(){
@@ -365,17 +370,22 @@ Admin.grid = Ext.extend(Ext.grid.GridPanel, {
365
370
  }, // addRecord
366
371
 
367
372
  editRecord: function(){
368
- Ext.each(this.getSelectionModel().getSelections(), function(selection){
369
- var id = this.baseUrl + '-edit-' + selection.id;
370
- Admin.app.loadWidget(this.baseUrl + '/edit/' + selection.id);
371
- }, this)
373
+ var selections = this.selModel.getSelections();
374
+ if (selections.length > 10) {
375
+ Admin.showAlert(Admin.locale.messages.alert.tooMany);
376
+ } else {
377
+ Ext.each(selections, function(selection){
378
+ var id = this.baseUrl + '-edit-' + selection.id;
379
+ Admin.app.loadWidget(this.baseUrl + '/edit/' + selection.id);
380
+ }, this);
381
+ }
372
382
  }, // editRecord
373
383
 
374
384
  removeRecord: function(){
375
385
  Ext.Msg.confirm(Admin.locale.messages.confirm.title, String.format(Admin.locale.messages.confirm.message, this.getSelectionModel().getCount()), function(btn, text){
376
386
  if (btn == 'yes'){
377
387
  Admin.app.mask();
378
- var records = this.getSelectionModel().getSelections();
388
+ var records = this.selModel.getSelections();
379
389
  var store = this.store;
380
390
  Ext.Ajax.request({
381
391
  url: this.baseUrl + '/destroy.json',
@@ -403,7 +413,6 @@ Admin.grid = Ext.extend(Ext.grid.GridPanel, {
403
413
  Admin.window = Ext.extend(Ext.Window, {
404
414
  width: 700,
405
415
  layout: 'fit',
406
- autoScroll: true,
407
416
  maximizable: true,
408
417
  bodyStyle: 'background-color:#FFF',
409
418
  grid: undefined,
@@ -422,7 +431,6 @@ Admin.window = Ext.extend(Ext.Window, {
422
431
  handler: this[this.closeAction].createDelegate(this, [])
423
432
  });
424
433
  if (this.grid){
425
- this.border = false;
426
434
  this.addButton({
427
435
  text: Admin.locale.buttons.select,
428
436
  handler: this.closeWithSelections.createDelegate(this, [])}
@@ -1,3 +1,3 @@
1
1
  =title "Edit <%= @model_name %>"
2
- -form_for @<%= @model_singular %>, url(:<%= @model_plural %>_update, :id => @<%= @model_singular %>.id, :format => :js), :method => :put, :remote => true do |f|
2
+ -form_for :<%= @model_singular %>, url(:<%= @model_plural %>_update, :id => @<%= @model_singular %>.id, :format => :js), :method => :put, :remote => true do |f|
3
3
  =partial '<%= @model_plural %>/form', :locals => { :f => f }
@@ -1,3 +1,3 @@
1
1
  =title "New <%= @model_plural %>"
2
- -form_for @<%= @model_singular %>, url(:<%= @model_plural %>_create, :format => :js), :remote => true do |f|
2
+ -form_for :<%= @model_singular %>, url(:<%= @model_plural %>_create, :format => :js), :remote => true do |f|
3
3
  =partial '<%= @model_plural %>/form', :locals => { :f => f }
@@ -13,7 +13,7 @@ class Uploader < CarrierWave::Uploader::Base
13
13
  # This is a sensible default for uploaders that are meant to be mounted:
14
14
 
15
15
  def root
16
- "shared/public"
16
+ "app/public"
17
17
  end
18
18
 
19
19
  def store_dir
@@ -50,6 +50,7 @@ upload.on('fileUploadComplete', function(){ grid.store.reload() });
50
50
 
51
51
  var panel = new Ext.Panel({
52
52
  layout: 'border',
53
+ border: false,
53
54
  items: [grid, upload]
54
55
  });
55
56
 
@@ -67,7 +67,7 @@ module Padrino
67
67
  # if the account is not allowed/logged return it to a default page
68
68
  #
69
69
  def redirect_back_or_default(default)
70
- redirect_to(session[:return_to] || default)
70
+ redirect(session[:return_to] || default)
71
71
  session[:return_to] = nil
72
72
  end
73
73
 
@@ -21,7 +21,7 @@ module Padrino
21
21
  def show_messages_for(*objects)
22
22
  options = objects.extract_options!.symbolize_keys
23
23
  count = objects.inject(0) {|sum, object| sum + object.errors.count }
24
- error_cleaner = objects.map{|object| object.class.properties.map{|k| "if ($('#{object.class.to_s.downcase}_#{k.name}')) $('#{object.class.to_s.downcase}_#{k.name}').removeClassName('x-form-invalid');" } }.join("\n")
24
+ error_cleaner = objects.map{|object| object.class.properties.map {|k| "var x = parent.body.select('*[id=#{object.class.to_s.downcase}_#{k.name}]').first(); if (x) { x.removeClass('x-form-invalid') };" } }.join("\n")
25
25
 
26
26
  unless count.zero?
27
27
  html = {}
@@ -37,12 +37,13 @@ module Padrino
37
37
  end
38
38
  message = escape_javascript(options.include?(:message) ? options[:message] : locale.t(:body))
39
39
  error_messages = objects.map {|object| object.errors.full_messages.map {|msg| content_tag(:li, escape_javascript(msg)) } }.join
40
- error_highlighter = objects.map {|object| object.errors_keys.map{ |k| "$('#{object.class.to_s.downcase}_#{k}').addClassName('x-form-invalid');" } }.join("\n")
40
+ error_highlighter = objects.map {|object| object.errors_keys.map{ |k| "var x = parent.body.select('*[id=#{object.class.to_s.downcase}_#{k}]').first(); x.addClass('x-form-invalid');" } }.join("\n")
41
41
  contents = ''
42
42
  contents << content_tag(:p, message) if message.present?
43
43
  contents << content_tag(:ul, error_messages, :class => :list)
44
-
44
+
45
45
  (<<-JAVASCRIPT).gsub(/ {14}/, '')
46
+ var parent = Ext.WindowMgr.getActive();
46
47
  #{error_cleaner}
47
48
  Ext.Msg.show({
48
49
  title: '#{header_message}',
@@ -55,6 +56,7 @@ module Padrino
55
56
  end
56
57
  else
57
58
  (<<-JAVASCRIPT).gsub(/ {12}/, '')
59
+ var parent = Ext.WindowMgr.getActive();
58
60
  #{error_cleaner}
59
61
  Ext.Msg.alert(Admin.locale.messages.compliments.title, Admin.locale.messages.compliments.message);
60
62
  JAVASCRIPT
@@ -71,16 +73,9 @@ module Padrino
71
73
  # tab :settings do
72
74
  # ...
73
75
  #
74
- # The second argument specify if is necessary 10px of padding inside the tab, default is +true+
75
- #
76
- # Third argument is an hash that accepts:
77
- #
78
- # :id:: The id of the tab
79
- # :style:: Custom style of the tab
80
- #
81
- def tab(name, padding=true, options={}, &block)
76
+ def tab(name, options={}, &block)
82
77
  options[:id] ||= name.to_s.downcase.gsub(/[^a-z0-9]+/, '_').gsub(/-+$/, '').gsub(/^-+$/, '')
83
- options[:style] ||= "padding:10px;#{options[:style]}" if padding
78
+ options[:style] = "padding:10px;#{options[:style]}"
84
79
  options[:title] = name.is_a?(Symbol) ? I18n.t("admin.tabs.#{name.to_s.downcase}", :default => name.to_s.humanize) : name
85
80
  options[:tabbed] = true
86
81
  options[:class] = "x-hide-display"
@@ -225,7 +220,8 @@ module Padrino
225
220
  end
226
221
 
227
222
  # And we add our link for add new records
228
- collection << content_tag(:li, link_to(options[:prompt], "#", :onclick => "#{options[:function]}(); return false;"), :class => :clean)
223
+ li_link = content_tag(:li, link_to(options[:prompt], "#", :onclick => "#{options[:function]}(); return false;"), :class => :clean)
224
+ collection << li_link
229
225
 
230
226
  # Now we have the final container
231
227
  container = content_tag(:ul, collection.join.gsub("\\",""), :id => "#{object_name}_#{method}", :class => "open-window-grid")
@@ -234,30 +230,33 @@ module Padrino
234
230
  show = "data['#{controller}.#{options[:show]}']" if options[:show].is_a?(Symbol)
235
231
  get = options[:get].is_a?(Symbol) && options[:get] != :id ? "data['#{controller}.#{options[:get]}']" : options[:get]
236
232
 
233
+ # Updater handler
237
234
  update_function = if options[:multiple]
238
235
  (<<-JAVASCRIPT).gsub(/ {12}/, "")
236
+ var parent = win.parent.body.select("*[id=#{object_name}_#{method}]").first();
239
237
  Ext.each(selections, function(selection){
240
238
  var template = String.format('#{template.gsub(/\n/,"")}', selection.#{show}, selection.#{get});
241
- Ext.fly('#{object_name}_#{method}').insertHtml('afterBegin', template);
239
+ parent.insertHtml('afterBegin', template);
242
240
  });
243
241
  JAVASCRIPT
244
242
  else
245
243
  (<<-JAVASCRIPT).gsub(/ {12}/, "")
246
244
  var selection = selections.first();
247
- var template = String.format('#{template.gsub(/\n/,"")}', selection.#{show}, selection.#{get});
248
- Ext.fly('#{object_name}_#{method}').update(template);
245
+ var template = String.format('#{template.gsub(/\n/,"")}', selection.#{show}, selection.#{get}) + '#{li_link}';
246
+ win.parent.body.select("*[id=#{object_name}_#{method}]").first().update(template);
249
247
  JAVASCRIPT
250
248
  end
251
249
 
252
250
  # Now we build the update function (if not present)
253
251
  javascript = (<<-JAVASCRIPT).gsub(/ {10}/, '')
254
252
  function #{options[:function]}(){
253
+ var me = Ext.WindowMgr.getActive();
255
254
  Ext.Ajax.request({
256
255
  url: '#{options[:url]}',
257
256
  scripts: false,
258
257
  success: function(response){
259
258
  try { eval(response.responseText) } catch(e) { Admin.app.error(e) };
260
- var win = new Admin.window({ grid: #{options[:grid]}, item: #{options[:item]}, width: 800, height: 600 });
259
+ var win = new Admin.window({ grid: #{options[:grid]}, item: #{options[:item]}, width: 800, height:600, modal: true, parent:me });
261
260
  win.on('selected', function(win, selections){
262
261
  #{update_function}
263
262
  });
@@ -270,6 +269,13 @@ module Padrino
270
269
  # Now we return our html code
271
270
  [content_tag(:script, javascript, :type => 'text/javascript'), container, tag(:div, :class => :clear)].join("\n")
272
271
  end
272
+
273
+ module AbstractFormBuilder
274
+ # f.open_window_grid :upload_ids, :brand_ids, :with => :brands, :get => :id, :show => :name
275
+ def open_window_grid(field, options={})
276
+ @template.open_window_grid object_name, field, options
277
+ end
278
+ end
273
279
  end # Helpers
274
280
  end # Admin
275
281
  end # Padrino
@@ -66,6 +66,7 @@ en:
66
66
  message: "There are some connection issues.<br />Contact tecnical support."
67
67
  notConfigured: "This fatures is not ready yet.<br />Contact tecnical support."
68
68
  notSelected: "You must select at least one record"
69
+ tooMany: "You have selected too many records. Maximum is 10!"
69
70
  print:
70
71
  footer:
71
72
  page: "Page"
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{padrino-admin}
8
- s.version = "0.6.7"
8
+ s.version = "0.7.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
12
- s.date = %q{2010-01-26}
12
+ s.date = %q{2010-01-31}
13
13
  s.description = %q{Admin View for Padrino applications}
14
14
  s.email = %q{nesquena@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -355,8 +355,9 @@ Gem::Specification.new do |s|
355
355
 
356
356
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
357
357
  s.add_runtime_dependency(%q<json_pure>, [">= 1.2.0"])
358
- s.add_runtime_dependency(%q<padrino-core>, ["= 0.6.7"])
359
- s.add_runtime_dependency(%q<padrino-gen>, ["= 0.6.7"])
358
+ s.add_runtime_dependency(%q<padrino-core>, ["= 0.7.0"])
359
+ s.add_runtime_dependency(%q<padrino-gen>, ["= 0.7.0"])
360
+ s.add_runtime_dependency(%q<padrino-helpers>, ["= 0.7.0"])
360
361
  s.add_runtime_dependency(%q<tilt>, [">= 0.4"])
361
362
  s.add_development_dependency(%q<haml>, [">= 2.2.1"])
362
363
  s.add_development_dependency(%q<shoulda>, [">= 0"])
@@ -365,8 +366,9 @@ Gem::Specification.new do |s|
365
366
  s.add_development_dependency(%q<webrat>, [">= 0.5.1"])
366
367
  else
367
368
  s.add_dependency(%q<json_pure>, [">= 1.2.0"])
368
- s.add_dependency(%q<padrino-core>, ["= 0.6.7"])
369
- s.add_dependency(%q<padrino-gen>, ["= 0.6.7"])
369
+ s.add_dependency(%q<padrino-core>, ["= 0.7.0"])
370
+ s.add_dependency(%q<padrino-gen>, ["= 0.7.0"])
371
+ s.add_dependency(%q<padrino-helpers>, ["= 0.7.0"])
370
372
  s.add_dependency(%q<tilt>, [">= 0.4"])
371
373
  s.add_dependency(%q<haml>, [">= 2.2.1"])
372
374
  s.add_dependency(%q<shoulda>, [">= 0"])
@@ -376,8 +378,9 @@ Gem::Specification.new do |s|
376
378
  end
377
379
  else
378
380
  s.add_dependency(%q<json_pure>, [">= 1.2.0"])
379
- s.add_dependency(%q<padrino-core>, ["= 0.6.7"])
380
- s.add_dependency(%q<padrino-gen>, ["= 0.6.7"])
381
+ s.add_dependency(%q<padrino-core>, ["= 0.7.0"])
382
+ s.add_dependency(%q<padrino-gen>, ["= 0.7.0"])
383
+ s.add_dependency(%q<padrino-helpers>, ["= 0.7.0"])
381
384
  s.add_dependency(%q<tilt>, [">= 0.4"])
382
385
  s.add_dependency(%q<haml>, [">= 2.2.1"])
383
386
  s.add_dependency(%q<shoulda>, [">= 0"])
@@ -33,6 +33,7 @@ class TestActiveRecord < Test::Unit::TestCase
33
33
  assert_respond_to account, :new_record?
34
34
  assert_respond_to account, :to_param
35
35
  assert_respond_to account, :update_attributes
36
+ assert_respond_to Account, :properties
36
37
  assert_respond_to Account, :count
37
38
  end
38
39
 
@@ -42,6 +43,12 @@ class TestActiveRecord < Test::Unit::TestCase
42
43
  assert_equal [:email, :role, :password, :password_confirmation], account.errors_keys
43
44
  end
44
45
 
46
+ should 'have columns names' do
47
+ property = Account.properties.first
48
+ assert_respond_to property, :name
49
+ assert_equal "id", property.name
50
+ end
51
+
45
52
  should 'have table name' do
46
53
  assert_equal "accounts", Account.table_name
47
54
  end
@@ -37,6 +37,7 @@ class TestDataMapper < Test::Unit::TestCase
37
37
  assert_respond_to account, :new_record?
38
38
  assert_respond_to account, :to_param
39
39
  assert_respond_to account, :update_attributes
40
+ assert_respond_to Account, :properties
40
41
  assert_respond_to Account, :count
41
42
  end
42
43
 
@@ -53,6 +54,12 @@ class TestDataMapper < Test::Unit::TestCase
53
54
  assert_equal [:email, :role, :password, :password_confirmation], account.errors_keys
54
55
  end
55
56
 
57
+ should 'have columns names' do
58
+ property = Account.properties.first
59
+ assert_respond_to property, :name
60
+ assert_equal :id, property.name
61
+ end
62
+
56
63
  should 'have table name' do
57
64
  assert_equal "accounts", Account.table_name
58
65
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: padrino-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.7
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Padrino Team
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2010-01-26 00:00:00 +01:00
15
+ date: 2010-01-31 00:00:00 +01:00
16
16
  default_executable:
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
@@ -33,7 +33,7 @@ dependencies:
33
33
  requirements:
34
34
  - - "="
35
35
  - !ruby/object:Gem::Version
36
- version: 0.6.7
36
+ version: 0.7.0
37
37
  version:
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: padrino-gen
@@ -43,7 +43,17 @@ dependencies:
43
43
  requirements:
44
44
  - - "="
45
45
  - !ruby/object:Gem::Version
46
- version: 0.6.7
46
+ version: 0.7.0
47
+ version:
48
+ - !ruby/object:Gem::Dependency
49
+ name: padrino-helpers
50
+ type: :runtime
51
+ version_requirement:
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "="
55
+ - !ruby/object:Gem::Version
56
+ version: 0.7.0
47
57
  version:
48
58
  - !ruby/object:Gem::Dependency
49
59
  name: tilt