cukemin 0.1.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/CHANGELOG +3 -0
- data/README.md +13 -0
- data/Rakefile +42 -0
- data/cukemin.gemspec +61 -0
- data/generators/cukemin/USAGE +1 -0
- data/generators/cukemin/cukemin_generator.rb +73 -0
- data/generators/cukemin/templates/controller.rb +37 -0
- data/generators/cukemin/templates/feature.feature +33 -0
- data/generators/cukemin/templates/views/_form.html.erb +8 -0
- data/generators/cukemin/templates/views/edit.html.erb +3 -0
- data/generators/cukemin/templates/views/index.html.erb +33 -0
- data/generators/cukemin/templates/views/new.html.erb +3 -0
- data/rails/init.rb +0 -0
- data/spec/blueprints.rb +6 -0
- data/spec/cukemin_generator_spec.rb +104 -0
- data/spec/database.yml +21 -0
- data/spec/debug.log +5627 -0
- data/spec/schema.rb +7 -0
- data/spec/spec_helper.rb +42 -0
- metadata +88 -0
data/CHANGELOG
ADDED
data/README.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Cukemin
|
2
|
+
=======
|
3
|
+
|
4
|
+
Rails generator to generate super lightweight admin controllers complete with cucumber specs!
|
5
|
+
|
6
|
+
About me
|
7
|
+
========
|
8
|
+
|
9
|
+
I'm Paul Campbell. I'm an avid Ruby on Rails web developer. Follow my ramblings at [http://www.pabcas.com](http://www.pabcas.com)
|
10
|
+
|
11
|
+
Follow me on Twitter [http://twitter.com/paulca](http://twitter.com/paulca)
|
12
|
+
|
13
|
+
Copyright (c) 2010 Paul Campbell, released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
|
4
|
+
desc 'Default: run specs.'
|
5
|
+
task :default => :spec
|
6
|
+
|
7
|
+
desc 'Run the specs'
|
8
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
9
|
+
t.spec_opts = ['--colour --format progress --loadby mtime --reverse']
|
10
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
11
|
+
end
|
12
|
+
|
13
|
+
PKG_FILES = FileList[
|
14
|
+
'[a-zA-Z]*',
|
15
|
+
'app/**/*',
|
16
|
+
'generators/**/*',
|
17
|
+
'config/*',
|
18
|
+
'lib/**/*',
|
19
|
+
'rails/**/*',
|
20
|
+
'spec/**/*',
|
21
|
+
'features/**/*'
|
22
|
+
]
|
23
|
+
|
24
|
+
begin
|
25
|
+
require 'jeweler'
|
26
|
+
Jeweler::Tasks.new do |s|
|
27
|
+
s.name = "cukemin"
|
28
|
+
s.version = "0.1.0"
|
29
|
+
s.author = "Paul Campbell"
|
30
|
+
s.email = "paul@rslw.com"
|
31
|
+
s.homepage = "http://www.github.com/paulca/cukemin"
|
32
|
+
s.platform = Gem::Platform::RUBY
|
33
|
+
s.summary = "Simple admin controllers and views, with cucumber features"
|
34
|
+
s.files = PKG_FILES.to_a
|
35
|
+
s.has_rdoc = false
|
36
|
+
s.extra_rdoc_files = ["README.md"]
|
37
|
+
end
|
38
|
+
rescue LoadError
|
39
|
+
puts "Jeweler not available. Install it with: sudo gem install jeweler"
|
40
|
+
end
|
41
|
+
|
42
|
+
Jeweler::GemcutterTasks.new
|
data/cukemin.gemspec
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{cukemin}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Paul Campbell"]
|
12
|
+
s.date = %q{2010-05-24}
|
13
|
+
s.email = %q{paul@rslw.com}
|
14
|
+
s.extra_rdoc_files = [
|
15
|
+
"README.md"
|
16
|
+
]
|
17
|
+
s.files = [
|
18
|
+
"CHANGELOG",
|
19
|
+
"README.md",
|
20
|
+
"Rakefile",
|
21
|
+
"cukemin.gemspec",
|
22
|
+
"generators/cukemin/USAGE",
|
23
|
+
"generators/cukemin/cukemin_generator.rb",
|
24
|
+
"generators/cukemin/templates/controller.rb",
|
25
|
+
"generators/cukemin/templates/feature.feature",
|
26
|
+
"generators/cukemin/templates/views/_form.html.erb",
|
27
|
+
"generators/cukemin/templates/views/edit.html.erb",
|
28
|
+
"generators/cukemin/templates/views/index.html.erb",
|
29
|
+
"generators/cukemin/templates/views/new.html.erb",
|
30
|
+
"rails/init.rb",
|
31
|
+
"spec/blueprints.rb",
|
32
|
+
"spec/cukemin_generator_spec.rb",
|
33
|
+
"spec/database.yml",
|
34
|
+
"spec/debug.log",
|
35
|
+
"spec/schema.rb",
|
36
|
+
"spec/spec_helper.rb"
|
37
|
+
]
|
38
|
+
s.has_rdoc = false
|
39
|
+
s.homepage = %q{http://www.github.com/paulca/cukemin}
|
40
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
41
|
+
s.require_paths = ["lib"]
|
42
|
+
s.rubygems_version = %q{1.3.7}
|
43
|
+
s.summary = %q{Simple admin controllers and views, with cucumber features}
|
44
|
+
s.test_files = [
|
45
|
+
"spec/blueprints.rb",
|
46
|
+
"spec/cukemin_generator_spec.rb",
|
47
|
+
"spec/schema.rb",
|
48
|
+
"spec/spec_helper.rb"
|
49
|
+
]
|
50
|
+
|
51
|
+
if s.respond_to? :specification_version then
|
52
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
53
|
+
s.specification_version = 3
|
54
|
+
|
55
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
56
|
+
else
|
57
|
+
end
|
58
|
+
else
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
./script generate cukemin MODELNAME
|
@@ -0,0 +1,73 @@
|
|
1
|
+
class CukeminGenerator < Rails::Generator::NamedBase
|
2
|
+
def manifest
|
3
|
+
record do |m|
|
4
|
+
# puts "#{module_name}, #{model_name}, #{class_name}, #{file_name}, #{file_path}"
|
5
|
+
# debugger
|
6
|
+
m.class_collisions class_name, "#{class_name}Controller"
|
7
|
+
|
8
|
+
m.directory controller_dir
|
9
|
+
m.template "controller.rb", "#{controller_dir}/#{plural_name}_controller.rb"
|
10
|
+
|
11
|
+
m.directory view_dir
|
12
|
+
m.template "views/index.html.erb", "#{view_dir}/index.html.erb"
|
13
|
+
m.template "views/new.html.erb", "#{view_dir}/new.html.erb"
|
14
|
+
m.template "views/edit.html.erb", "#{view_dir}/edit.html.erb"
|
15
|
+
m.template "views/_form.html.erb", "#{view_dir}/_form.html.erb"
|
16
|
+
|
17
|
+
m.directory 'features'
|
18
|
+
m.template 'feature.feature', "features/#{plural_path_helper}.feature"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def split_class_name
|
23
|
+
class_name.split('::')
|
24
|
+
end
|
25
|
+
|
26
|
+
def module_parts
|
27
|
+
split_class_name[0,split_class_name.length - 1]
|
28
|
+
end
|
29
|
+
|
30
|
+
def module_name
|
31
|
+
module_parts.join('::')
|
32
|
+
end
|
33
|
+
|
34
|
+
def form_object
|
35
|
+
if module_parts.empty?
|
36
|
+
"@#{singular_name}"
|
37
|
+
else
|
38
|
+
"[#{module_parts.map{ |p| ':' + p.downcase }.join(',')}, @#{singular_name}]"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def model_name
|
43
|
+
class_name.split('::').last
|
44
|
+
end
|
45
|
+
|
46
|
+
def controller_dir
|
47
|
+
"app/controllers/#{File.dirname(file_path)}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def view_dir
|
51
|
+
"app/views/#{File.dirname(file_path)}/#{plural_name}"
|
52
|
+
end
|
53
|
+
|
54
|
+
def plural_class_name
|
55
|
+
"#{module_name}::#{plural_name.camelize}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def singular_path_helper
|
59
|
+
file_path.gsub('/', '_')
|
60
|
+
end
|
61
|
+
|
62
|
+
def plural_path_helper
|
63
|
+
"#{File.dirname(file_path).gsub('/', '_')}_#{plural_name}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def after_generate
|
67
|
+
puts "
|
68
|
+
|
69
|
+
Generated!
|
70
|
+
|
71
|
+
"
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class <%= plural_class_name %>Controller < ApplicationController
|
2
|
+
def index
|
3
|
+
@<%= plural_name %> = <%= model_name %>.paginate(:page => params[:page])
|
4
|
+
end
|
5
|
+
|
6
|
+
def new
|
7
|
+
@<%= singular_name %> = <%= model_name %>.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def create
|
11
|
+
@<%= singular_name %> = <%= model_name %>.new(params[:<%= singular_name %>])
|
12
|
+
if @<%= singular_name %>.save
|
13
|
+
redirect_to <%= plural_path_helper %>_path
|
14
|
+
else
|
15
|
+
render :new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def edit
|
20
|
+
@<%= singular_name %> = <%= model_name %>.find(params[:id])
|
21
|
+
end
|
22
|
+
|
23
|
+
def update
|
24
|
+
@<%= singular_name %> = <%= model_name %>.find(params[:id])
|
25
|
+
if @<%= singular_name %>.update_attributes(params[:<%= singular_name %>])
|
26
|
+
redirect_to <%= plural_path_helper %>_path
|
27
|
+
else
|
28
|
+
render :edit
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy
|
33
|
+
@<%= singular_name %> = <%= model_name %>.find(params[:id])
|
34
|
+
@<%= singular_name %>.destroy
|
35
|
+
redirect_to <%= plural_path_helper %>_path
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
Feature: Managing <%= plural_name.titleize %>
|
2
|
+
In order to ...
|
3
|
+
As a ...
|
4
|
+
I want to be able to manage <%= plural_name %>
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given an admin "edgar@hoover.com" with password "monkeys"
|
8
|
+
And I log in as admin "edgar@hoover.com" with password "monkeys"
|
9
|
+
And I am on the admin dashboard
|
10
|
+
|
11
|
+
Scenario: Creating a new <%= singular_name %>
|
12
|
+
When I follow "<%= plural_name.titleize %>"
|
13
|
+
And I follow "Add New <%= singular_name.titleize %>"
|
14
|
+
And I fill in "Name" with "Biggles"
|
15
|
+
And I press "Save"
|
16
|
+
Then I should see "Biggles"
|
17
|
+
|
18
|
+
Scenario: Editing an existing <%= singular_name %>
|
19
|
+
Given a <%= singular_name %> "Goravia"
|
20
|
+
And I am on the admin dashboard
|
21
|
+
And I follow "<%= plural_name.titleize %>"
|
22
|
+
And I follow "Edit"
|
23
|
+
And I fill in "Name" with "Gooravia"
|
24
|
+
And I press "Save"
|
25
|
+
Then I should see "Gooravia"
|
26
|
+
And I should not see "Goravia"
|
27
|
+
|
28
|
+
Scenario: Deleting an existing <%= singular_name %>
|
29
|
+
Given a <%= singular_name %> "Goravia"
|
30
|
+
And I am on the admin dashboard
|
31
|
+
And I follow "<%= plural_name.titleize %>"
|
32
|
+
And I follow "Delete"
|
33
|
+
Then I should not see "Goravia"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<h2><%= plural_name.titleize %></h2>
|
2
|
+
|
3
|
+
<ul>
|
4
|
+
<li><%%= link_to 'Add New <%= singular_name.titleize %>', new_<%= singular_path_helper %>_path %></li>
|
5
|
+
</ul>
|
6
|
+
|
7
|
+
|
8
|
+
<%%- if @<%= plural_name %>.empty? -%>
|
9
|
+
<p>No <%= plural_name %> found.</p>
|
10
|
+
<%%- else -%>
|
11
|
+
<table>
|
12
|
+
<thead>
|
13
|
+
<tr>
|
14
|
+
<th>Name</th>
|
15
|
+
<th> </th>
|
16
|
+
</tr>
|
17
|
+
</thead>
|
18
|
+
<tbody>
|
19
|
+
<%%- @<%= plural_name %>.each do |<%= singular_name %>| -%>
|
20
|
+
<tr>
|
21
|
+
<td>
|
22
|
+
<%%= <%= singular_name %>.name %>
|
23
|
+
(<%%= link_to "Edit", edit_<%= singular_path_helper %>_path(<%= singular_name %>) -%>)
|
24
|
+
</td>
|
25
|
+
<td>
|
26
|
+
<%%= link_to "Delete", <%= singular_path_helper %>_path(<%= singular_name %>), :method => :delete, :confirm => 'Are you sure?' -%>
|
27
|
+
</td>
|
28
|
+
</tr>
|
29
|
+
<%%- end -%>
|
30
|
+
</tbody>
|
31
|
+
</table>
|
32
|
+
<%%= will_paginate(@<%= plural_name %>) %>
|
33
|
+
<%%- end -%>
|
data/rails/init.rb
ADDED
File without changes
|
data/spec/blueprints.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rails_generator'
|
3
|
+
require 'rails_generator/scripts/generate'
|
4
|
+
|
5
|
+
describe CukeminGenerator do
|
6
|
+
|
7
|
+
before do
|
8
|
+
Rails::Generator::Scripts::Generate.new.run(["cukemin", 'admin/place'], :destination => fake_rails_root, :backtrace => true)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:controller_file) { fake_rails_root + '/app/controllers/admin/places_controller.rb' }
|
12
|
+
let(:index_view_file) { fake_rails_root + '/app/views/admin/places/index.html.erb' }
|
13
|
+
let(:edit_view_file) { fake_rails_root + '/app/views/admin/places/edit.html.erb' }
|
14
|
+
let(:new_view_file) { fake_rails_root + '/app/views/admin/places/new.html.erb' }
|
15
|
+
let(:form_view_file) { fake_rails_root + '/app/views/admin/places/_form.html.erb' }
|
16
|
+
let(:feature_file) { fake_rails_root + '/features/admin_places.feature' }
|
17
|
+
|
18
|
+
it "should create the controller file" do
|
19
|
+
File.exists?(controller_file).should be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should output the controller" do
|
23
|
+
output = File.read(controller_file)
|
24
|
+
output.should match(/Admin::PlacesController < ApplicationController/)
|
25
|
+
output.should match(/@place = Place.new/)
|
26
|
+
output.should match(/@place = Place.new\(params\[\:place\]\)/)
|
27
|
+
output.should match(/if @place.save/)
|
28
|
+
output.should match(/redirect_to admin_places_path/)
|
29
|
+
output.should match(/@place = Place.find\(params\[:id\]\)/)
|
30
|
+
output.should match(/if @place.update_attributes\(params\[:place\]\)/)
|
31
|
+
output.should match(/@place.destroy/)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should create the index view file" do
|
35
|
+
File.exists?(index_view_file).should be_true
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should output the index view" do
|
39
|
+
output = File.read(index_view_file)
|
40
|
+
output.should match(/Places/)
|
41
|
+
output.should include(%Q[<li><%= link_to 'Add New Place', new_admin_place_path %></li>])
|
42
|
+
output.should match(/if @places.empty?/)
|
43
|
+
output.should match(/No places found./)
|
44
|
+
output.should match(/@places.each do |place|/)
|
45
|
+
output.should match(/place.name/)
|
46
|
+
output.should match(/link_to "Edit", edit_admin_place_path\(place\)/)
|
47
|
+
output.should include(%Q[link_to "Delete", admin_place_path(place), :method => :delete, :confirm => 'Are you sure?'])
|
48
|
+
output.should include("will_paginate(@places)")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should create the new view file" do
|
52
|
+
File.exists?(new_view_file).should be_true
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should output the new view" do
|
56
|
+
output = File.read(new_view_file)
|
57
|
+
output.should include("New Place")
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should create the edit view file" do
|
61
|
+
File.exists?(edit_view_file).should be_true
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should output the new view" do
|
65
|
+
output = File.read(edit_view_file)
|
66
|
+
output.should include("Edit Place")
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should create the form partial file" do
|
70
|
+
File.exists?(form_view_file).should be_true
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should output the form partial" do
|
74
|
+
output = File.read(form_view_file)
|
75
|
+
output.should include(%Q[<%- form_for([:admin, @place]) do |f| -%>])
|
76
|
+
output.should include(%Q[<%= f.submit "Save" %> or <%= link_to "Cancel", admin_places_path %>])
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should create the feature file" do
|
80
|
+
File.exists?(feature_file).should be_true
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should output the form partial" do
|
84
|
+
output = File.read(feature_file)
|
85
|
+
output.should include(%Q[Feature: Managing Places])
|
86
|
+
output.should include(%Q[Scenario: Creating a new place])
|
87
|
+
output.should include(%Q[When I follow "Places"])
|
88
|
+
output.should include(%Q[And I follow "Add New Place"])
|
89
|
+
end
|
90
|
+
|
91
|
+
after do
|
92
|
+
FileUtils.rm_r(fake_rails_root)
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
def fake_rails_root
|
97
|
+
File.join(File.dirname(__FILE__), 'spec', 'rails_root')
|
98
|
+
end
|
99
|
+
|
100
|
+
def file_list(dir)
|
101
|
+
Dir.glob(File.join(dir, "*"))
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
data/spec/database.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
sqlite:
|
2
|
+
:adapter: sqlite
|
3
|
+
:database: spec/cukemin.sqlite.db
|
4
|
+
|
5
|
+
sqlite3:
|
6
|
+
:adapter: sqlite3
|
7
|
+
:database: spec/cukemin.sqlite3.db
|
8
|
+
|
9
|
+
postgresql:
|
10
|
+
:adapter: postgresql
|
11
|
+
:username: postgres
|
12
|
+
:password: postgres
|
13
|
+
:database: cukemin_test
|
14
|
+
:min_messages: ERROR
|
15
|
+
|
16
|
+
mysql:
|
17
|
+
:adapter: mysql
|
18
|
+
:host: localhost
|
19
|
+
:username: root
|
20
|
+
:password: password
|
21
|
+
:database: cukemin_test
|