padrino-admin 0.9.18 → 0.9.19

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.
@@ -43,11 +43,12 @@ module Padrino
43
43
 
44
44
  ext = fetch_component_choice(:renderer)
45
45
 
46
+ empty_directory destination_root("admin")
46
47
  directory "templates/app", destination_root("admin")
47
48
  directory "templates/assets", destination_root("public", "admin")
48
49
 
49
50
  account_params = [
50
- "account", "name:string", "surname:string", "email:string", "crypted_password:string", "salt:string", "role:string",
51
+ "account", "name:string", "surname:string", "email:string", "crypted_password:string", "role:string",
51
52
  "-r=#{options[:root]}"
52
53
  ]
53
54
 
@@ -67,30 +68,49 @@ module Padrino
67
68
  { :name => :role, :field_type => :text_field }
68
69
  ]
69
70
 
70
- admin_app = Padrino::Generators::AdminPage.new(["account"], :root => options[:root])
71
+ admin_app = Padrino::Generators::AdminPage.new(["account"], :root => options[:root], :destroy => options[:destroy])
71
72
  admin_app.default_orm = Padrino::Admin::Generators::Orm.new(:account, orm, columns, column_fields)
72
73
  admin_app.invoke_all
73
74
 
74
75
  template "templates/account/#{orm}.rb.tt", destination_root("app", "models", "account.rb"), :force => true
75
- template "templates/account/seeds.rb.tt", destination_root("db/seeds.rb")
76
+
77
+ if File.exist?(destination_root("db/seeds.rb"))
78
+ append_file(destination_root("db/seeds.rb")) { "\n\n" + File.read(self.class.source_root+"/templates/account/seeds.rb.tt") }
79
+ else
80
+ template "templates/account/seeds.rb.tt", destination_root("db/seeds.rb")
81
+ end
82
+
83
+ empty_directory destination_root("admin/controllers")
84
+ empty_directory destination_root("admin/views")
85
+ empty_directory destination_root("admin/views/base")
86
+ empty_directory destination_root("admin/views/layouts")
87
+ empty_directory destination_root("admin/views/sessions")
88
+
76
89
  template "templates/#{ext}/app/base/_sidebar.#{ext}.tt", destination_root("admin/views/base/_sidebar.#{ext}")
77
90
  template "templates/#{ext}/app/base/index.#{ext}.tt", destination_root("admin/views/base/index.#{ext}")
78
91
  template "templates/#{ext}/app/layouts/application.#{ext}.tt", destination_root("admin/views/layouts/application.#{ext}")
79
92
  template "templates/#{ext}/app/sessions/new.#{ext}.tt", destination_root("admin/views/sessions/new.#{ext}")
80
93
 
81
94
  add_project_module :accounts
95
+ require_dependencies('bcrypt-ruby', :require => 'bcrypt')
82
96
  append_file destination_root("config/apps.rb"), "\nPadrino.mount(\"Admin\").to(\"/admin\")"
83
97
  gsub_file destination_root("admin/views/accounts/_form.#{ext}"), "f.text_field :role, :class => :text_field", "f.select :role, :options => access_control.roles"
84
98
  gsub_file destination_root("admin/controllers/accounts.rb"), "if account.destroy", "if account != current_account && account.destroy"
85
99
  return if self.behavior == :revoke
100
+
101
+ instructions = []
102
+ instructions << "Run 'padrino rake ar:migrate'" if orm == :activerecord
103
+ instructions << "Run 'padrino rake dm:migrate'" if orm == :datamapper
104
+ instructions << "Run 'padrino rake seed'"
105
+ instructions << "Visit the admin panel in the browser at '/admin'"
106
+ instructions.map! { |i| " #{instructions.index(i) + 1}) #{i}" }
107
+
86
108
  say((<<-TEXT).gsub(/ {10}/,''))
87
109
 
88
110
  =================================================================
89
111
  The admin panel has been mounted! Next, follow these steps:
90
112
  =================================================================
91
- 1) Run migrations (if necessary)
92
- 2) Run 'padrino rake seed'
93
- 3) Visit the admin panel in the browser at '/admin'
113
+ #{instructions.join("\n")}
94
114
  =================================================================
95
115
 
96
116
  TEXT
@@ -100,4 +120,4 @@ module Padrino
100
120
  end
101
121
  end # AdminApp
102
122
  end # Generators
103
- end # Padrino
123
+ end # Padrino
@@ -34,13 +34,15 @@ module Padrino
34
34
  self.behavior = :revoke if options[:destroy]
35
35
  ext = fetch_component_choice(:renderer)
36
36
 
37
+ empty_directory destination_root("/admin/views/#{@orm.name_plural}")
38
+
37
39
  template "templates/page/controller.rb.tt", destination_root("/admin/controllers/#{@orm.name_plural}.rb")
38
40
  template "templates/#{ext}/page/_form.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/_form.#{ext}")
39
41
  template "templates/#{ext}/page/edit.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/edit.#{ext}")
40
42
  template "templates/#{ext}/page/index.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/index.#{ext}")
41
43
  template "templates/#{ext}/page/new.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/new.#{ext}")
42
44
 
43
- add_project_module(@orm.name_plural)
45
+ add_project_module(@orm.name_plural) unless options[:destroy]
44
46
  end
45
47
  else
46
48
  say "You are not at the root of a Padrino application! (config/boot.rb not found)"
@@ -18,6 +18,7 @@ module Padrino
18
18
  end
19
19
 
20
20
  def field_type(type)
21
+ type = :string if type.nil? #Couchrest-Hack to avoid the next line to fail
21
22
  type = type.to_s.demodulize.downcase.to_sym unless type.is_a?(Symbol)
22
23
  case type
23
24
  when :integer, :float, :decimal then :text_field
@@ -1,7 +1,5 @@
1
- require 'digest/sha1'
2
-
3
1
  class Account < ActiveRecord::Base
4
- attr_accessor :password
2
+ attr_accessor :password, :password_confirmation
5
3
 
6
4
  # Validations
7
5
  validates_presence_of :email, :role
@@ -15,28 +13,23 @@ class Account < ActiveRecord::Base
15
13
  validates_format_of :role, :with => /[A-Za-z]/
16
14
 
17
15
  # Callbacks
18
- before_save :generate_password
16
+ before_save :encrypt_password
19
17
 
20
18
  ##
21
19
  # This method is for authentication purpose
22
20
  #
23
21
  def self.authenticate(email, password)
24
22
  account = first(:conditions => { :email => email }) if email.present?
25
- account && account.password_clean == password ? account : nil
23
+ account && account.has_password?(password) ? account : nil
26
24
  end
27
25
 
28
- ##
29
- # This method is used to retrieve the original password.
30
- #
31
- def password_clean
32
- crypted_password.decrypt(salt)
26
+ def has_password?(password)
27
+ ::BCrypt::Password.new(crypted_password) == password
33
28
  end
34
29
 
35
30
  private
36
- def generate_password
37
- return if password.blank?
38
- self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if new_record?
39
- self.crypted_password = password.encrypt(self.salt)
31
+ def encrypt_password
32
+ self.crypted_password = ::BCrypt::Password.create(password)
40
33
  end
41
34
 
42
35
  def password_required
@@ -1,5 +1,3 @@
1
- require 'digest/sha1'
2
-
3
1
  class Account < CouchRest::ExtendedDocument
4
2
  include CouchRest::Validation
5
3
  use_database COUCHDB
@@ -11,7 +9,6 @@ class Account < CouchRest::ExtendedDocument
11
9
  property :surname
12
10
  property :email
13
11
  property :crypted_password
14
- property :salt
15
12
  property :role
16
13
 
17
14
  view_by :email
@@ -30,7 +27,7 @@ class Account < CouchRest::ExtendedDocument
30
27
  validates_format_of :role, :with => /[A-Za-z]/
31
28
 
32
29
  # Callbacks
33
- before_save :generate_password
30
+ before_save :encrypt_password
34
31
 
35
32
  ##
36
33
  # This method is for authentication purpose
@@ -38,14 +35,7 @@ class Account < CouchRest::ExtendedDocument
38
35
  def self.authenticate(email, password)
39
36
  email_array = self.by_email :key => email
40
37
  account = email_array[0]
41
- account && account.password_clean == password ? account : nil
42
- end
43
-
44
- ##
45
- # This method is used to retrieve the original password.
46
- #
47
- def password_clean
48
- crypted_password.decrypt(salt)
38
+ account && account.has_password?(password) ? account : nil
49
39
  end
50
40
 
51
41
  ##
@@ -56,11 +46,13 @@ class Account < CouchRest::ExtendedDocument
56
46
  id_array[0]
57
47
  end
58
48
 
49
+ def has_password?(password)
50
+ ::BCrypt::Password.new(crypted_password) == password
51
+ end
52
+
59
53
  private
60
- def generate_password
61
- return if password.blank?
62
- self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if self.salt.blank?
63
- self.crypted_password = password.encrypt(self.salt)
54
+ def encrypt_password
55
+ self.crypted_password = ::BCrypt::Password.create(password)
64
56
  end
65
57
 
66
58
  def password_required
@@ -75,6 +67,6 @@ class Account < CouchRest::ExtendedDocument
75
67
  # there is an id, make sure updates are being applied to same account
76
68
  return true if self["_id"] == account["_id"]
77
69
  end
78
- [false, "Email has already been taken"]
70
+ [false, "Email has already been taken"]
79
71
  end
80
72
  end
@@ -1,5 +1,3 @@
1
- require 'digest/sha1'
2
-
3
1
  class Account
4
2
  include DataMapper::Resource
5
3
  include DataMapper::Validate
@@ -11,7 +9,6 @@ class Account
11
9
  property :surname, String
12
10
  property :email, String
13
11
  property :crypted_password, String
14
- property :salt, String
15
12
  property :role, String
16
13
 
17
14
  # Validations
@@ -30,7 +27,7 @@ class Account
30
27
  #
31
28
  def self.authenticate(email, password)
32
29
  account = first(:conditions => { :email => email }) if email.present?
33
- account && account.password_clean == password ? account : nil
30
+ account && account.has_password?(password) ? account : nil
34
31
  end
35
32
 
36
33
  ##
@@ -40,25 +37,16 @@ class Account
40
37
  get(id) rescue nil
41
38
  end
42
39
 
43
- ##
44
- # This method is used to retrieve the original password.
45
- #
46
- def password_clean
47
- crypted_password.decrypt(salt)
48
- end
49
-
50
- ###
51
- # Password setter generates salt and crypted_password
52
- #
53
- def password=(val)
54
- return if val.blank?
55
- attribute_set(:salt, Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--")) if new?
56
- attribute_set(:crypted_password, val.encrypt(self.salt))
40
+ def has_password?(password)
41
+ ::BCrypt::Password.new(crypted_password) == password
57
42
  end
58
43
 
59
44
  private
60
-
61
45
  def password_required
62
46
  crypted_password.blank? || !password.blank?
63
47
  end
48
+
49
+ def encrypt_password
50
+ self.crypted_password = ::BCrypt::Password.create(password)
51
+ end
64
52
  end
@@ -1,15 +1,12 @@
1
- require 'digest/sha1'
2
-
3
1
  class Account
4
2
  include Mongoid::Document
5
- attr_accessor :password
3
+ attr_accessor :password, :password_confirmation
6
4
 
7
5
  # Fields
8
6
  field :name, :type => String
9
7
  field :surname, :type => String
10
8
  field :email, :type => String
11
9
  field :crypted_password, :type => String
12
- field :salt, :type => String
13
10
  field :role, :type => String
14
11
 
15
12
  # Validations
@@ -31,7 +28,7 @@ class Account
31
28
  #
32
29
  def self.authenticate(email, password)
33
30
  account = first(:conditions => { :email => email }) if email.present?
34
- account && account.password_clean == password ? account : nil
31
+ account && account.has_password?(password) ? account : nil
35
32
  end
36
33
 
37
34
  ##
@@ -41,18 +38,13 @@ class Account
41
38
  find(id) rescue nil
42
39
  end
43
40
 
44
- ##
45
- # This method is used to retrieve the original password.
46
- #
47
- def password_clean
48
- crypted_password.decrypt(salt)
41
+ def has_password?(password)
42
+ ::BCrypt::Password.new(crypted_password) == password
49
43
  end
50
44
 
51
45
  private
52
46
  def generate_password
53
- return if password.blank?
54
- self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if new_record?
55
- self.crypted_password = password.encrypt(self.salt)
47
+ self.crypted_password = ::BCrypt::Password.create(self.password)
56
48
  end
57
49
 
58
50
  def password_required
@@ -1,15 +1,12 @@
1
- require 'digest/sha1'
2
-
3
1
  class Account
4
2
  include MongoMapper::Document
5
- attr_accessor :password
3
+ attr_accessor :password, :password_confirmation
6
4
 
7
5
  # Keys
8
6
  key :name, String
9
7
  key :surname, String
10
8
  key :email, String
11
9
  key :crypted_password, String
12
- key :salt, String
13
10
  key :role, String
14
11
 
15
12
  # Validations
@@ -31,21 +28,16 @@ class Account
31
28
  #
32
29
  def self.authenticate(email, password)
33
30
  account = first(:email => email) if email.present?
34
- account && account.password_clean == password ? account : nil
31
+ account && account.has_password?(password) ? account : nil
35
32
  end
36
33
 
37
- ##
38
- # This method is used to retrieve the original password.
39
- #
40
- def password_clean
41
- crypted_password.decrypt(salt)
34
+ def has_password?(password)
35
+ ::BCrypt::Password.new(crypted_password) == password
42
36
  end
43
37
 
44
38
  private
45
39
  def generate_password
46
- return if password.blank?
47
- self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if new_record?
48
- self.crypted_password = password.encrypt(self.salt)
40
+ self.crypted_password = ::BCrypt::Password.create(password)
49
41
  end
50
42
 
51
43
  def password_required
@@ -5,7 +5,7 @@
5
5
  # name = shell.ask("What's your name?")
6
6
  # shell.say name
7
7
  #
8
- email = shell.ask "Which email do you want use for loggin into admin?"
8
+ email = shell.ask "Which email do you want use for logging into admin?"
9
9
  password = shell.ask "Tell me the password to use:"
10
10
 
11
11
  shell.say ""
@@ -20,7 +20,7 @@ if account.valid?
20
20
  shell.say " password: #{password}"
21
21
  shell.say "================================================================="
22
22
  else
23
- shell.say "Sorry but some thing went worng!"
23
+ shell.say "Sorry but some thing went wrong!"
24
24
  shell.say ""
25
25
  account.errors.full_messages.each { |m| shell.say " - #{m}" }
26
26
  end
@@ -1,5 +1,3 @@
1
- require 'digest/sha1'
2
-
3
1
  class Account < ::Sequel::Model
4
2
 
5
3
  plugin :validation_helpers
@@ -29,7 +27,7 @@ class Account < ::Sequel::Model
29
27
  #
30
28
  def self.authenticate(email, password)
31
29
  account = filter(:email => email).first
32
- account && account.password_clean == password ? account : nil
30
+ account && account.has_password?(password) ? account : nil
33
31
  end
34
32
 
35
33
  ##
@@ -39,19 +37,13 @@ class Account < ::Sequel::Model
39
37
  self[id] rescue nil
40
38
  end
41
39
 
42
- ##
43
- # This method is used to retrieve the original password.
44
- #
45
- def password_clean
46
- self.crypted_password.decrypt(salt)
40
+ def has_password?(password)
41
+ ::BCrypt::Password.new(crypted_password) == password
47
42
  end
48
43
 
49
44
  private
50
-
51
45
  def generate_password
52
- return if password.blank?
53
- self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if new?
54
- self.crypted_password = password.encrypt(self.salt)
46
+ self.crypted_password = ::BCrypt::Password.create(password)
55
47
  end
56
48
 
57
49
  def password_required
@@ -8,6 +8,10 @@ Admin.controllers :sessions do
8
8
  if account = Account.authenticate(params[:email], params[:password])
9
9
  set_current_account(account)
10
10
  redirect url(:base, :index)
11
+ elsif Padrino.env == :development && params[:bypass]
12
+ account = Account.first
13
+ set_current_account(account)
14
+ redirect url(:base, :index)
11
15
  else
12
16
  flash[:warning] = "Login or password wrong."
13
17
  redirect url(:sessions, :new)
@@ -32,6 +32,16 @@
32
32
  <%%= password_field_tag :password, :value => params[:password], :class => 'text_field' %>
33
33
  </div>
34
34
  </div>
35
+ <%% if Padrino.env == :development %>
36
+ <div class="group wat-cf">
37
+ <div class="left">
38
+ <label class="label right">Bypass login?</label>
39
+ </div>
40
+ <div class="right">
41
+ <%%= check_box_tag :bypass %>
42
+ </div>
43
+ </div>
44
+ <%% end %>
35
45
  <div class="group navform wat-cf">
36
46
  <div class="right">
37
47
  <%%= submit_tag "Sign in", :class => :button %>
@@ -43,4 +53,4 @@
43
53
  </div>
44
54
  </div>
45
55
  </body>
46
- </html>
56
+ </html>
@@ -6,7 +6,7 @@
6
6
  </ul>
7
7
  </div>
8
8
  <div class="content">
9
- <h2 class="title"><%%= pat(:all) %> <%% mt(:<%= @orm.name_singular %>) %></h2>
9
+ <h2 class="title"><%%= pat(:all) %> <%% mt(:<%= @orm.name_plural %>) %></h2>
10
10
  <div class="inner">
11
11
  <table class="table">
12
12
  <tr>
@@ -21,5 +21,11 @@
21
21
  .left
22
22
  %label.label.right Password
23
23
  .right=password_field_tag :password, :value => params[:password], :class => :text_field
24
+ -if Padrino.env == :development
25
+ .group.wat-cf
26
+ .left
27
+ %label.label.right Bypass login?
28
+ .right=check_box_tag :bypass
29
+
24
30
  .group.navform.wat-cf
25
31
  .right=submit_tag('Sign In', :class => :button)
@@ -6,7 +6,7 @@
6
6
  .content
7
7
  %h2.title
8
8
  =pat(:all)
9
- =mt(:<%= @orm.name_singular %>)
9
+ =mt(:<%= @orm.name_plural %>)
10
10
  .inner
11
11
  %table.table
12
12
  %tr
@@ -0,0 +1,17 @@
1
+ "no":
2
+ padrino:
3
+ admin:
4
+ save: Lagre
5
+ cancel: Avbryt
6
+ list: Liste
7
+ edit: Rediger
8
+ new: Ny
9
+ show: Vis
10
+ delete: Slett
11
+ confirm: Er du sikker?
12
+ created_at: Opprettet
13
+ all: Alle
14
+ profile: Profil
15
+ settings: Instillinger
16
+ logout: Logg ut
17
+
@@ -0,0 +1,27 @@
1
+ "no":
2
+ activemodel: &activemodel
3
+ errors:
4
+ messages:
5
+ inclusion: "finnes ikke i listen"
6
+ exclusion: "er reservert"
7
+ invalid: "er ikke gyldig"
8
+ confirmation: "matcher ikke bekreftelsen"
9
+ accepted: "må aksepteres"
10
+ empty: "kan ikke være tom"
11
+ blank: "kan ikke være blank"
12
+ too_long: "er for lang (maksimum er %{count} tegn)"
13
+ too_short: "er for kort (minimum er %{count} tegn)"
14
+ wrong_length: "har ikke den riktige lengden(skal være på %{count} tegn)"
15
+ taken: "er allerede i bruk"
16
+ not_a_number: "er ikke et tall"
17
+ greater_than: "skal være større enn %{count}"
18
+ greater_than_or_equal_to: "skal være større enn eller lik %{count}"
19
+ equal_to: "skal være lik %{count}"
20
+ less_than: "skal være mindre enn %{count}"
21
+ less_than_or_equal_to: "skal være mindre enn eller lik %{count}"
22
+ odd: "skal være ulik"
23
+ even: "skal være lik"
24
+ record_invalid: "Valideringsfeil: %{errors}"
25
+ content_type: "fileformatet er ikke støttet"
26
+ activerecord: *activemodel
27
+
@@ -90,5 +90,24 @@ class TestAdminAppGenerator < Test::Unit::TestCase
90
90
  assert_match_in_file 'class Admin < Padrino::Application', "#{@apptmp}/sample_project/admin/app.rb"
91
91
  assert_match_in_file 'role.project_module :accounts, "/accounts"', "#{@apptmp}/sample_project/admin/app.rb"
92
92
  end
93
+
94
+ should 'not conflict with existing seeds file' do
95
+ assert_nothing_raised { silence_logger { generate(:project, 'sample_project', "--root=#{@apptmp}", '-d=activerecord', '-e=erb') } }
96
+
97
+ # Add seeds file
98
+ FileUtils.mkdir_p @apptmp + '/sample_project/db' unless File.exist?(@apptmp + '/sample_project/db')
99
+ File.open(@apptmp + '/sample_project/db/seeds.rb', 'w+') do |seeds_rb|
100
+ seeds_rb.puts "# Old Seeds Content"
101
+ end
102
+
103
+ silence_logger do
104
+ $stdout.expects(:print).with { |value| value =~ /Overwrite\s.*?\/db\/seeds.rb/ }.never
105
+ $stdin.stubs(:gets).returns('y')
106
+ generate(:admin_app, "--root=#{@apptmp}/sample_project")
107
+ end
108
+
109
+ assert_match_in_file '# Old Seeds Content', "#{@apptmp}/sample_project/db/seeds.rb"
110
+ assert_match_in_file 'Account.create(', "#{@apptmp}/sample_project/db/seeds.rb"
111
+ end
93
112
  end
94
113
  end
@@ -52,6 +52,8 @@ class TestAdminPageGenerator < Test::Unit::TestCase
52
52
  assert_match_in_file "text_field :#{field}", "#{@apptmp}/sample_project/admin/views/people/_form.haml"
53
53
  end
54
54
  assert_match_in_file 'role.project_module :people, "/people"', "#{@apptmp}/sample_project/admin/app.rb"
55
+ assert_match_in_file "elsif Padrino.env == :development && params[:bypass]", "#{@apptmp}/sample_project/admin/controllers/sessions.rb"
56
+ assert_match_in_file "check_box_tag :bypass", "#{@apptmp}/sample_project/admin/views/sessions/new.haml"
55
57
  end
56
58
 
57
59
  should 'correctly generate a new padrino admin application with erb renderer' do
@@ -69,6 +71,8 @@ class TestAdminPageGenerator < Test::Unit::TestCase
69
71
  assert_match_in_file "text_field :#{field}", "#{@apptmp}/sample_project/admin/views/people/_form.erb"
70
72
  end
71
73
  assert_match_in_file 'role.project_module :people, "/people"', "#{@apptmp}/sample_project/admin/app.rb"
74
+ assert_match_in_file "elsif Padrino.env == :development && params[:bypass]", "#{@apptmp}/sample_project/admin/controllers/sessions.rb"
75
+ assert_match_in_file "check_box_tag :bypass", "#{@apptmp}/sample_project/admin/views/sessions/new.erb"
72
76
  end
73
77
 
74
78
  should 'correctly generate a new padrino admin application with multiple models' do
@@ -101,4 +105,4 @@ class TestAdminPageGenerator < Test::Unit::TestCase
101
105
  assert_match_in_file 'role.project_module :pages, "/pages"', "#{@apptmp}/sample_project/admin/app.rb"
102
106
  end
103
107
  end
104
- end
108
+ end
data/test/helper.rb CHANGED
@@ -7,6 +7,7 @@ require 'rack/test'
7
7
  require 'uuid'
8
8
  require 'rack'
9
9
  require 'shoulda'
10
+ require 'mocha'
10
11
  require 'thor/group'
11
12
  require 'padrino-core/support_lite' unless defined?(SupportLite)
12
13
  require 'padrino-admin'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: padrino-admin
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 18
10
- version: 0.9.18
9
+ - 19
10
+ version: 0.9.19
11
11
  platform: ruby
12
12
  authors:
13
13
  - Padrino Team
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2010-10-05 00:00:00 -07:00
21
+ date: 2010-11-17 00:00:00 +01:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
@@ -29,12 +29,12 @@ dependencies:
29
29
  requirements:
30
30
  - - "="
31
31
  - !ruby/object:Gem::Version
32
- hash: 31
32
+ hash: 29
33
33
  segments:
34
34
  - 0
35
35
  - 9
36
- - 18
37
- version: 0.9.18
36
+ - 19
37
+ version: 0.9.19
38
38
  type: :runtime
39
39
  version_requirements: *id001
40
40
  - !ruby/object:Gem::Dependency
@@ -45,12 +45,12 @@ dependencies:
45
45
  requirements:
46
46
  - - "="
47
47
  - !ruby/object:Gem::Version
48
- hash: 31
48
+ hash: 29
49
49
  segments:
50
50
  - 0
51
51
  - 9
52
- - 18
53
- version: 0.9.18
52
+ - 19
53
+ version: 0.9.19
54
54
  type: :runtime
55
55
  version_requirements: *id002
56
56
  description: Admin View for Padrino applications
@@ -123,6 +123,7 @@ files:
123
123
  - lib/padrino-admin/locale/admin/fr.yml
124
124
  - lib/padrino-admin/locale/admin/it.yml
125
125
  - lib/padrino-admin/locale/admin/nl.yml
126
+ - lib/padrino-admin/locale/admin/no.yml
126
127
  - lib/padrino-admin/locale/admin/pl.yml
127
128
  - lib/padrino-admin/locale/admin/pt_br.yml
128
129
  - lib/padrino-admin/locale/admin/ru.yml
@@ -136,6 +137,7 @@ files:
136
137
  - lib/padrino-admin/locale/orm/fr.yml
137
138
  - lib/padrino-admin/locale/orm/it.yml
138
139
  - lib/padrino-admin/locale/orm/nl.yml
140
+ - lib/padrino-admin/locale/orm/no.yml
139
141
  - lib/padrino-admin/locale/orm/pl.yml
140
142
  - lib/padrino-admin/locale/orm/pt_br.yml
141
143
  - lib/padrino-admin/locale/orm/ru.yml