padrino-admin 0.6.7 → 0.7.0

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