ceo 0.1.1 → 0.1.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 008b08c08e1bb883011dfa307098b1cb6642d2a0
4
- data.tar.gz: 7e745cd40cfe1cb9d24f0ab399b2d95e6d8a231e
3
+ metadata.gz: 4fe4507acb62425bac279534c26165ad40ea9680
4
+ data.tar.gz: 81da4b3f285fdfc004af84b2282f41761e0623d1
5
5
  SHA512:
6
- metadata.gz: 7319bc1cace93793d747a53c104c4a49d76833f36fc326f7347fa3d03daf1c0b2cd62def7b4e5e23a3e869adadff2222420d76a9532e245a0b11135d74d043e6
7
- data.tar.gz: deafd1e7671597cc8870f325d65372d065e07210f4491ddbf44c5e4a4aa76c7114d77a72c90d109f111ed858039b110a358af4f2a0269efda8223e78e603413d
6
+ metadata.gz: 88770460906957b449ee82e101d41872045102dd73eeb6cd2b75fc764eb944eae6de788d99ac0452aea4e0b3cb14d9551d462e3943adae53f8ef7c1e59af1201
7
+ data.tar.gz: 9bdf1ac39832693cd2fa520ed77aaab8f5d2cd5df92d003bc2d607b0af07bd0374b900719f5ef548582f9f06e50dfce43521e2b1840609028909d32ba4be9510
data/README.md CHANGED
@@ -2,9 +2,9 @@ CEO
2
2
  ---
3
3
 
4
4
  > Your app's chief executive.
5
+
5
6
  [![Dependency Status](http://img.shields.io/gemnasium/littlelines/ceo.svg)](https://gemnasium.com/littlelines/ceo)
6
7
  [![Gem Version](http://img.shields.io/gem/v/ceo.svg)](https://rubygems.org/gems/ceo)
7
8
  [![License](http://img.shields.io/:license-mit-blue.svg)](http://littlelines.mit-license.org)
8
9
  [![Build Status](https://travis-ci.org/littlelines/ceo.svg?branch=master)](https://travis-ci.org/littlelines/ceo)
9
10
  [![Code Climate](https://codeclimate.com/github/littlelines/ceo/badges/gpa.svg)](https://codeclimate.com/github/littlelines/ceo)
10
-
@@ -166,7 +166,7 @@ class Admin::AdminController < ApplicationController
166
166
  # Returns the path of the thing.
167
167
  def thing_path(model, object)
168
168
  id = object['ID'] || object['id']
169
- send(:"admin_#{model.to_s.underscore.downcase}_path", id: id)
169
+ send(:"admin_#{undersingularize(model)}_path", id: id)
170
170
  end
171
171
 
172
172
  # Private: Returns the index path of a model.
@@ -176,7 +176,7 @@ class Admin::AdminController < ApplicationController
176
176
  # Returns the path of many things.
177
177
  def things_path(object = nil)
178
178
  object ||= @route_name || controller_name
179
- send(:"admin_#{object.to_s.pluralize.downcase}_path")
179
+ send(:"admin_#{underpluralize(object)}_path")
180
180
  end
181
181
 
182
182
  # Private
@@ -187,7 +187,7 @@ class Admin::AdminController < ApplicationController
187
187
  # Returns the edit path of a model.
188
188
  def edit_thing_path(model, object)
189
189
  id = object['ID'] || object['id']
190
- send(:"edit_admin_#{model}_path", id: id)
190
+ send(:"edit_admin_#{undersingularize(model)}_path", id: id)
191
191
  end
192
192
 
193
193
  # Private
@@ -196,9 +196,8 @@ class Admin::AdminController < ApplicationController
196
196
  # object - An instance of a model.
197
197
  #
198
198
  # Returns the new path of a model.
199
- def new_thing_path(model, object)
200
- id = object['ID'] || object['id']
201
- send(:"new_admin_#{model}_path", id: id)
199
+ def new_thing_path(model)
200
+ send(:"new_admin_#{undersingularize(model)}_path")
202
201
  end
203
202
 
204
203
  # Private
@@ -208,6 +207,24 @@ class Admin::AdminController < ApplicationController
208
207
  #
209
208
  # Returns the paginated path of an object.
210
209
  def thing_page_path(model, page)
211
- send(:"page_admin_#{model.to_s.underscore.pluralize}_path", page: page)
210
+ send(:"page_admin_#{underpluralize(model)}_path", page: page)
211
+ end
212
+
213
+ # Private
214
+ #
215
+ # noun - Something to underpluralize. (String)
216
+ #
217
+ # Returns an underscored and pluralized string.
218
+ def underpluralize(noun)
219
+ noun.to_s.underscore.pluralize.downcase
220
+ end
221
+
222
+ # Private
223
+ #
224
+ # noun - Something to undersingularize. (String)
225
+ #
226
+ # Returns an underscored and singularized string.
227
+ def undersingularize(noun)
228
+ noun.to_s.underscore.singularize.downcase
212
229
  end
213
230
  end
@@ -1,11 +1,14 @@
1
1
  <h1><%= @title %></h1>
2
2
 
3
+ <div>
4
+ <p><%= link_to "New #{@title.singularize}", new_thing_path(@model_name), id: "new-#{@model_name}" %></p>
5
+ <p><%= "There are no #{@human_model.downcase.pluralize} in the database." if @things.blank? %></p>
6
+ </div>
7
+
3
8
  <table>
4
9
  <thead>
5
10
  <tr>
6
- <% if @things.blank? %>
7
- <%= "There are no #{@human_model.downcase.pluralize} in the database." %>
8
- <% else %>
11
+ <% unless @things.blank? %>
9
12
  <% @things.first.each_key do |heading| %>
10
13
  <th>
11
14
  <%= heading %>
@@ -17,15 +20,15 @@
17
20
 
18
21
  <tbody>
19
22
  <% @things.each do |thing| %>
20
- <tr>
23
+ <tr id="#{@controller_name}-#{thing.id}">
21
24
  <% thing.each do |heading, value| %>
22
25
  <td label="<%= heading %>: ">
23
26
  <%= value %>
24
27
  </td>
25
28
 
26
29
  <div class="actions">
27
- <td><%= link_to("Edit #{@title}", edit_thing_path(@model_name, thing)) %></td>
28
- <td><%= link_to("Show #{@title}", thing_path(@model_name, thing)) %></td>
30
+ <td><%= link_to("Edit", edit_thing_path(@model_name, thing)) %></td>
31
+ <td><%= link_to("Show", thing_path(@model_name, thing)) %></td>
29
32
  </div>
30
33
  <% end %>
31
34
  </tr>
@@ -35,28 +38,30 @@
35
38
 
36
39
  <nav class="navigation" role="navigation">
37
40
  <ul>
38
- <% unless @page == 1 %>
41
+ <% if @page == 1 %>
42
+ <li><a>1</a></li>
43
+ <% else %>
39
44
  <!-- First Page -->
40
45
  <li>
41
46
  <%= link_to('1', thing_page_path(@model_name, @page - 1)) %>
42
47
  </li>
43
48
  <% end %>
44
49
 
45
- <% if @page > 1 %>
50
+ <% if @page.to_i > 2 %>
46
51
  <!-- Previous Page -->
47
52
  <li>
48
- <%= link_to("#{page - 1}", thing_page_path(@model_name, @page - 1)) %>
53
+ <%= link_to("#{@page - 1}", thing_page_path(@model_name, @page - 1)) %>
49
54
  </li>
50
55
  <% end %>
51
56
 
52
- <% unless @total_page == 1 %>
57
+ <% unless @page == 1 %>
53
58
  <!-- Current Page -->
54
59
  <li>
55
60
  <a><%= @page %></a>
56
61
  </li>
57
62
  <% end %>
58
63
 
59
- <% if @page < @total_pages %>
64
+ <% if @page < @total_pages && @page + 1 < @total_pages %>
60
65
  <!-- Next Page -->
61
66
  <li>
62
67
  <%= link_to("#{@page + 1}", thing_page_path(@model_name, @page + 1)) %>
data/lib/ceo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module CEO
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
@@ -0,0 +1,11 @@
1
+ Description:
2
+ Admin page generator.
3
+
4
+ Example:
5
+ rails generate admin apples
6
+
7
+ This will create:
8
+ app/controllers/admin/apples_controller.rb
9
+
10
+ AND route:
11
+ admin_for :apples
@@ -0,0 +1,28 @@
1
+ require 'rails/generators'
2
+
3
+ # Public: Generator for admin page controllers.
4
+ class AdminGenerator < Rails::Generators::NamedBase
5
+ source_root File.expand_path('../templates', __FILE__)
6
+
7
+ def create_admin_page_controller
8
+ @controller = file_name
9
+ template(
10
+ 'admin_page_controller.rb.erb',
11
+ "app/controllers/admin/#{@controller.underscore}_controller.rb"
12
+ )
13
+ end
14
+
15
+ def add_admin_route
16
+ route "admin_for :#{@controller.underscore}"
17
+ end
18
+
19
+ def add_form_view
20
+ unless Dir.exist?(Rails.root.join('app/views/admin'))
21
+ Dir.mkdir(Rails.root.join('app/views/admin'))
22
+ end
23
+
24
+ create_file "app/views/admin/#{@controller.underscore}/_form.html.erb", <<VIEW
25
+ <% # "f" is exposed as a form object %>
26
+ VIEW
27
+ end
28
+ end
@@ -0,0 +1,5 @@
1
+ module Admin
2
+ class <%= @controller.camelize %>Controller < AdminController
3
+ # leave empty for basic CRUD
4
+ end
5
+ end
@@ -1,24 +1,35 @@
1
1
  require 'test_helper'
2
2
 
3
- describe 'apples admin pages' do
3
+ describe 'Apple admin pages' do
4
4
  include TestHelper
5
+
5
6
  describe 'index' do
6
7
  before do
8
+ 30.times { Apple.create }
7
9
  admin_page '/apples'
8
10
  end
9
11
 
12
+ it 'should not error when there are no apples' do
13
+ Apple.delete_all
14
+ admin_page '/apples'
15
+
16
+ assert_equal 0, Apple.count
17
+ expected_text = 'There are no apples in the database.'
18
+ assert page.has_css?('p', text: expected_text)
19
+ end
20
+
10
21
  describe 'correct attributes' do
11
22
  let(:attributes) { Apple.new.attributes.keys }
12
- let(:headers) { page.all('table thead th') }
13
23
 
14
24
  it 'should have the right number of headers' do
25
+ headers = page.all('table thead th')
15
26
  assert_equal attributes.size, headers.size
16
27
  end
17
28
 
18
29
  it 'should have the right header names' do
19
- page.has_css?('table thead tr th', text: 'ID')
20
- page.has_css?('table thead tr th', text: 'Name')
21
- page.has_css?('table thead tr th', text: 'Fruit')
30
+ assert page.has_css?('table thead tr th', text: 'ID')
31
+ assert page.has_css?('table thead tr th', text: 'Name')
32
+ assert page.has_css?('table thead tr th', text: 'Fruit')
22
33
  end
23
34
 
24
35
  it 'should have all IDs shown' do
@@ -27,5 +38,48 @@ describe 'apples admin pages' do
27
38
  end
28
39
  end
29
40
  end
41
+
42
+ it 'it should include a new button' do
43
+ el = page.find('a#new-apple')
44
+ assert_equal '/admin/apples/new', el['href']
45
+ assert_equal 'New Apple', el.text
46
+ end
47
+
48
+ describe 'pagination' do
49
+ it 'shows 20 apples per page' do
50
+ assert_equal 20, page.all('table tbody tr').size
51
+ refute_equal 20, Apple.count
52
+ end
53
+
54
+ describe 'pagination links' do
55
+ describe 'first page' do
56
+ it 'should have a disabled link' do
57
+ el = page.find('nav ul li a', text: '1')
58
+ assert_equal '1', el.text
59
+ assert el['href'].nil?
60
+ end
61
+
62
+ it 'should have a link to the next page' do
63
+ el = page.find('nav ul li a', text: '2')
64
+ assert_equal '/admin/apples/page/2', el['href']
65
+ end
66
+ end
67
+
68
+ describe 'second page' do
69
+ before { visit '/admin/apples/page/2' }
70
+
71
+ it 'should have a disabled link' do
72
+ el = page.find('nav ul li a', text: '2')
73
+ assert_equal '2', el.text
74
+ assert el['href'].nil?
75
+ end
76
+
77
+ it 'should have a first page button' do
78
+ el = page.find('nav ul li a', text: '1')
79
+ assert_equal '/admin/apples/page/1', el['href']
80
+ end
81
+ end
82
+ end
83
+ end
30
84
  end
31
85
  end
@@ -0,0 +1,7 @@
1
+ Apple Load (2.4ms) SELECT "apples".* FROM "apples" ORDER BY "apples"."id" ASC LIMIT 1
2
+  (0.1ms) BEGIN
3
+ SQL (8.7ms) INSERT INTO "apples" DEFAULT VALUES RETURNING "id"
4
+  (0.5ms) COMMIT
5
+ Apple Load (0.5ms) SELECT "apples".* FROM "apples" ORDER BY "apples"."id" ASC LIMIT 1
6
+ Apple Load (0.5ms) SELECT "apples".* FROM "apples" ORDER BY "apples"."id" ASC LIMIT 1
7
+ Apple Load (0.4ms) SELECT "apples".* FROM "apples" ORDER BY "apples"."id" ASC LIMIT 1