simonmenke-mr_henry 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/License.txt +20 -0
- data/README +8 -0
- data/about.yml +7 -0
- data/app/controllers/lalala/base_controller.rb +8 -0
- data/app/helpers/lalala/base_helper.rb +47 -0
- data/app/helpers/lalala/tabs_helper.rb +96 -0
- data/app/views/lalala/layouts/application.html.erb +39 -0
- data/config/routes.rb +0 -0
- data/generators/mr_resource/USAGE +25 -0
- data/generators/mr_resource/mr_resource_generator.rb +103 -0
- data/generators/mr_resource/templates/controller.rb +24 -0
- data/generators/mr_resource/templates/functional_test.rb +45 -0
- data/generators/mr_resource/templates/helper.rb +2 -0
- data/generators/mr_resource/templates/partial_form.html.erb +14 -0
- data/generators/mr_resource/templates/partial_item.html.erb +3 -0
- data/generators/mr_resource/templates/view_edit.html.erb +2 -0
- data/generators/mr_resource/templates/view_index.html.erb +7 -0
- data/generators/mr_resource/templates/view_new.html.erb +2 -0
- data/generators/mr_resource/templates/view_show.html.erb +14 -0
- data/lib/mr_henry.rb +4 -0
- data/lib/mr_henry/action_controller.rb +5 -0
- data/lib/mr_henry/action_controller/handles_resource.rb +85 -0
- data/lib/mr_henry/generator.rb +5 -0
- data/lib/mr_henry/generator/create.rb +68 -0
- data/lib/mr_henry/generator/destroy.rb +51 -0
- data/lib/mr_henry/generator/update.rb +41 -0
- data/lib/mr_henry/version.rb +10 -0
- data/lib/tasks/passenger.rake +5 -0
- data/public/images/error.png +0 -0
- data/public/images/handle.png +0 -0
- data/public/images/henry.png +0 -0
- data/public/images/pointer.gif +0 -0
- data/public/images/spinner.gif +0 -0
- data/public/images/tab-active.png +0 -0
- data/public/images/tab-hover.png +0 -0
- data/public/javascripts/c_b_s.js +16 -0
- data/public/javascripts/lang.cbs +69 -0
- data/public/javascripts/lowpro.js +320 -0
- data/public/stylesheets/lalala.css +367 -0
- data/public/stylesheets/lalala_custom.css +0 -0
- data/rails/init.rb +35 -0
- data/setup/setup.rb +6 -0
- metadata +149 -0
data/License.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 FIX_ME:author
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
data/about.yml
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
module Lalala::BaseHelper
|
2
|
+
|
3
|
+
def menu_item(name, url, *args)
|
4
|
+
options = args.extract_options!
|
5
|
+
options[:condition] ||= Proc.new { |ctx|
|
6
|
+
hash = ctx.send("hash_for_#{url}", *args)
|
7
|
+
params[:controller] == hash[:controller]
|
8
|
+
}
|
9
|
+
|
10
|
+
final_url = send(url, *args)
|
11
|
+
content = image_tag('pointer.gif', :class => "pointer")+link_to(name, final_url)
|
12
|
+
content_tag :div, content, :class => (["item", ("active" if options[:condition].call(self))].join(' '))
|
13
|
+
end
|
14
|
+
|
15
|
+
def link_to_modal(*args)
|
16
|
+
link_to_function(*args) do |page|
|
17
|
+
page << "Modalbox.show(this.href, {title: this.title, width: 750});"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def boolean(bool)
|
22
|
+
bool ? 'yes' : 'no'
|
23
|
+
end
|
24
|
+
|
25
|
+
def icon_for(path)
|
26
|
+
case File.extname(path)
|
27
|
+
when '.ods' then 'page_doc.png'
|
28
|
+
when '.doc' then 'page_doc.png'
|
29
|
+
when '.docx' then 'page_doc.png'
|
30
|
+
when '.html' then 'page_html.png'
|
31
|
+
when '.pdf' then 'page_pdf.png'
|
32
|
+
when '.ppt' then 'page_ppt.png'
|
33
|
+
when '.pptx' then 'page_ppt.png'
|
34
|
+
when '.xls' then 'page_xls.png'
|
35
|
+
when '.xlsx' then 'page_xls.png'
|
36
|
+
when '.zip' then 'page_zip.png'
|
37
|
+
when '.tar' then 'page_zip.png'
|
38
|
+
when '.gz' then 'page_zip.png'
|
39
|
+
else 'page_other.png'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def icon_tag_for(path)
|
44
|
+
image_tag(icon_for(path))
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
|
2
|
+
module Lalala::TabsHelper
|
3
|
+
|
4
|
+
def tabs(&block)
|
5
|
+
|
6
|
+
concat("<div id=\"tabs\">", block.binding)
|
7
|
+
tabs = ::Lalala::TabsHelper::Proxy.new(self, block.binding, request)
|
8
|
+
block.call(tabs)
|
9
|
+
tabs.to_html
|
10
|
+
concat("</div>", block.binding)
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
class Proxy
|
15
|
+
|
16
|
+
def initialize(template, binding, request)
|
17
|
+
@template = template
|
18
|
+
@request = request
|
19
|
+
@binding = binding
|
20
|
+
@tabs = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def url_for(*args)
|
24
|
+
@template.url_for(*args)
|
25
|
+
end
|
26
|
+
|
27
|
+
def link_to(*args)
|
28
|
+
@template.link_to(*args)
|
29
|
+
end
|
30
|
+
|
31
|
+
def concat(*args)
|
32
|
+
@template.concat(*args)
|
33
|
+
end
|
34
|
+
|
35
|
+
def tab(*args)
|
36
|
+
options = args.extract_options!
|
37
|
+
conditions = options.delete(:active)
|
38
|
+
conditions ||= options.delete(:if)
|
39
|
+
|
40
|
+
case conditions
|
41
|
+
when String then conditions = [conditions]
|
42
|
+
when Regexp then conditions = [conditions]
|
43
|
+
when Hash then conditions = [url_for(conditions)]
|
44
|
+
when Array
|
45
|
+
if (conditions.any? do |condition|
|
46
|
+
condition.is_a? Symbol or
|
47
|
+
condition.is_a? ActiveRecord::Base
|
48
|
+
end)
|
49
|
+
conditions = [url_for(conditions)]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
conditions.collect! do |condition|
|
54
|
+
case condition
|
55
|
+
when String then Regexp.new("^"+Regexp.escape(condition), true)
|
56
|
+
when Regexp then condition
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
@tabs << [args, options, conditions]
|
61
|
+
end
|
62
|
+
|
63
|
+
def active_tab_index
|
64
|
+
return @active_tab_index unless @active_tab_index.nil?
|
65
|
+
|
66
|
+
best_match_index = 0
|
67
|
+
best_match_score = 0
|
68
|
+
|
69
|
+
@tabs.each_with_index do |(args, options, conditions), i|
|
70
|
+
conditions.each do |condition|
|
71
|
+
match = condition.match(@request.path)
|
72
|
+
if (!match.nil?) and (match[0].length > best_match_score)
|
73
|
+
best_match_index = i
|
74
|
+
best_match_score = match[0].length
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
@active_tab_index = best_match_index
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_html
|
83
|
+
@tabs.each_with_index do |(args, options, conditions), i|
|
84
|
+
|
85
|
+
options[:class] = [options[:class],
|
86
|
+
("active" if active_tab_index == i)
|
87
|
+
].compact.join(' ')
|
88
|
+
args << options
|
89
|
+
|
90
|
+
concat(link_to(*args), @binding)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
5
|
+
<head>
|
6
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
7
|
+
<title>Lalala :: MrHenry</title>
|
8
|
+
<%= stylesheet_link_tag "lalala", "lalala_custom" %>
|
9
|
+
<%= javascript_include_tag :all %>
|
10
|
+
</head>
|
11
|
+
<body>
|
12
|
+
|
13
|
+
<div id="sidebar">
|
14
|
+
<% if logged_in? %>
|
15
|
+
<div id="menu-shadow">
|
16
|
+
<div id="menu">
|
17
|
+
|
18
|
+
<%= menu_item("Users", :lalala_users_path) %>
|
19
|
+
<%= menu_item("Logout", :lalala_logout_path) %>
|
20
|
+
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
<% end %>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div class="shadow">
|
27
|
+
<div class="header">
|
28
|
+
<h1>MrHenry</h1>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<div class="shadow">
|
33
|
+
<div class="container">
|
34
|
+
<%= yield %>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
</body>
|
39
|
+
</html>
|
data/config/routes.rb
ADDED
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Description:
|
2
|
+
Scaffolds an entire resource, from model and migration to controller and
|
3
|
+
views, along with a full test suite. The resource is ready to use as a
|
4
|
+
starting point for your restful, resource-oriented application.
|
5
|
+
|
6
|
+
Pass the name of the model, either CamelCased or under_scored, as the first
|
7
|
+
argument, and an optional list of attribute pairs.
|
8
|
+
|
9
|
+
Attribute pairs are column_name:sql_type arguments specifying the
|
10
|
+
model's attributes. Timestamps are added by default, so you don't have to
|
11
|
+
specify them by hand as 'created_at:datetime updated_at:datetime'.
|
12
|
+
|
13
|
+
You don't have to think up every attribute up front, but it helps to
|
14
|
+
sketch out a few so you can start working with the resource immediately.
|
15
|
+
|
16
|
+
For example, `scaffold post title:string body:text published:boolean`
|
17
|
+
gives you a model with those three attributes, a controller that handles
|
18
|
+
the create/show/update/destroy, forms to create and edit your posts, and
|
19
|
+
an index that lists them all, as well as a map.resources :posts
|
20
|
+
declaration in config/routes.rb.
|
21
|
+
|
22
|
+
Examples:
|
23
|
+
`./script/generate mr_resource post` # no attributes, view will be anemic
|
24
|
+
`./script/generate mr_resource post title:string body:text published:boolean`
|
25
|
+
`./script/generate mr_resource purchase order_id:integer amount:decimal`
|
@@ -0,0 +1,103 @@
|
|
1
|
+
::Rails::Generator::Commands::Create.send :include, ::MrHenry::Generator::Create
|
2
|
+
::Rails::Generator::Commands::Update.send :include, ::MrHenry::Generator::Update
|
3
|
+
::Rails::Generator::Commands::Destroy.send :include, ::MrHenry::Generator::Destroy
|
4
|
+
|
5
|
+
class MrResourceGenerator < Rails::Generator::NamedBase
|
6
|
+
default_options :skip_timestamps => false, :skip_migration => false
|
7
|
+
|
8
|
+
attr_reader :controller_name,
|
9
|
+
:controller_class_path,
|
10
|
+
:controller_file_path,
|
11
|
+
:controller_class_nesting,
|
12
|
+
:controller_class_nesting_depth,
|
13
|
+
:controller_class_name,
|
14
|
+
:controller_underscore_name,
|
15
|
+
:controller_singular_name,
|
16
|
+
:controller_plural_name
|
17
|
+
alias_method :controller_file_name, :controller_underscore_name
|
18
|
+
alias_method :controller_table_name, :controller_plural_name
|
19
|
+
|
20
|
+
def initialize(runtime_args, runtime_options = {})
|
21
|
+
super
|
22
|
+
|
23
|
+
@controller_name = "Lalala::"+@name.pluralize
|
24
|
+
|
25
|
+
base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
|
26
|
+
@controller_class_name_without_nesting, @controller_underscore_name, @controller_plural_name = inflect_names(base_name)
|
27
|
+
@controller_singular_name=base_name.singularize
|
28
|
+
if @controller_class_nesting.empty?
|
29
|
+
@controller_class_name = @controller_class_name_without_nesting
|
30
|
+
else
|
31
|
+
@controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def manifest
|
36
|
+
record do |m|
|
37
|
+
# Check for class naming collisions.
|
38
|
+
m.class_collisions(controller_class_path, "#{controller_class_name}Controller", "#{controller_class_name}Helper")
|
39
|
+
m.class_collisions(class_path, "#{class_name}")
|
40
|
+
|
41
|
+
# Controller, helper, views, test and stylesheets directories.
|
42
|
+
m.directory(File.join('app/models', class_path))
|
43
|
+
m.directory(File.join('app/controllers', controller_class_path))
|
44
|
+
m.directory(File.join('app/helpers', controller_class_path))
|
45
|
+
m.directory(File.join('app/views', controller_class_path, controller_file_name))
|
46
|
+
m.directory(File.join('app/views/layouts', controller_class_path))
|
47
|
+
m.directory(File.join('test/functional', controller_class_path))
|
48
|
+
m.directory(File.join('test/unit', class_path))
|
49
|
+
m.directory(File.join('public/stylesheets', class_path))
|
50
|
+
|
51
|
+
for action in scaffold_views
|
52
|
+
m.template(
|
53
|
+
"view_#{action}.html.erb",
|
54
|
+
File.join('app/views', controller_class_path, controller_file_name, "#{action}.html.erb")
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
m.template(
|
59
|
+
"partial_form.html.erb",
|
60
|
+
File.join('app/views', controller_class_path, controller_file_name, "_form.html.erb")
|
61
|
+
)
|
62
|
+
m.template(
|
63
|
+
"partial_item.html.erb",
|
64
|
+
File.join('app/views', controller_class_path, controller_file_name, "_#{name.underscore}.html.erb")
|
65
|
+
)
|
66
|
+
|
67
|
+
m.template(
|
68
|
+
'controller.rb', File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb")
|
69
|
+
)
|
70
|
+
|
71
|
+
m.template('functional_test.rb', File.join('test/functional', controller_class_path, "#{controller_file_name}_controller_test.rb"))
|
72
|
+
m.template('helper.rb', File.join('app/helpers', controller_class_path, "#{controller_file_name}_helper.rb"))
|
73
|
+
|
74
|
+
# m.route_lalala_resources controller_file_name
|
75
|
+
# m.lalala_menu(controller_file_name.humanize, controller_file_name)
|
76
|
+
|
77
|
+
m.dependency 'model', [name] + @args, :collision => :skip
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
protected
|
82
|
+
# Override with your own usage banner.
|
83
|
+
def banner
|
84
|
+
"Usage: #{$0} scaffold ModelName [field:type, field:type]"
|
85
|
+
end
|
86
|
+
|
87
|
+
def add_options!(opt)
|
88
|
+
opt.separator ''
|
89
|
+
opt.separator 'Options:'
|
90
|
+
opt.on("--skip-timestamps",
|
91
|
+
"Don't add timestamps to the migration file for this model") { |v| options[:skip_timestamps] = v }
|
92
|
+
opt.on("--skip-migration",
|
93
|
+
"Don't generate a migration file for this model") { |v| options[:skip_migration] = v }
|
94
|
+
end
|
95
|
+
|
96
|
+
def scaffold_views
|
97
|
+
%w[ index show new edit ]
|
98
|
+
end
|
99
|
+
|
100
|
+
def model_name
|
101
|
+
class_name.demodulize
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class <%= controller_class_name %>Controller < Lalala::BaseController
|
2
|
+
|
3
|
+
resources :<%= table_name %>
|
4
|
+
|
5
|
+
def create
|
6
|
+
<%= file_name %>.save!
|
7
|
+
redirect_to [:lalala, <%= file_name %>]
|
8
|
+
rescue ActiveRecord::RecordInvalid => e
|
9
|
+
render :action => "new"
|
10
|
+
end
|
11
|
+
|
12
|
+
def update
|
13
|
+
<%= file_name %>.update_attributes!(params[:<%= file_name %>])
|
14
|
+
redirect_to [:lalala, <%= file_name %>]
|
15
|
+
rescue ActiveRecord::RecordInvalid => e
|
16
|
+
render :action => "edit"
|
17
|
+
end
|
18
|
+
|
19
|
+
def destroy
|
20
|
+
<%= file_name %>.destroy
|
21
|
+
redirect_to lalala_<%= table_name %>_path
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class <%= controller_class_name %>ControllerTest < ActionController::TestCase
|
4
|
+
def test_should_get_index
|
5
|
+
get :index
|
6
|
+
assert_response :success
|
7
|
+
assert_not_nil assigns(:<%= table_name %>)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_should_get_new
|
11
|
+
get :new
|
12
|
+
assert_response :success
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_should_create_<%= file_name %>
|
16
|
+
assert_difference('<%= class_name %>.count') do
|
17
|
+
post :create, :<%= file_name %> => { }
|
18
|
+
end
|
19
|
+
|
20
|
+
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_should_show_<%= file_name %>
|
24
|
+
get :show, :id => <%= table_name %>(:one).id
|
25
|
+
assert_response :success
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_should_get_edit
|
29
|
+
get :edit, :id => <%= table_name %>(:one).id
|
30
|
+
assert_response :success
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_update_<%= file_name %>
|
34
|
+
put :update, :id => <%= table_name %>(:one).id, :<%= file_name %> => { }
|
35
|
+
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_should_destroy_<%= file_name %>
|
39
|
+
assert_difference('<%= class_name %>.count', -1) do
|
40
|
+
delete :destroy, :id => <%= table_name %>(:one).id
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_redirected_to <%= table_name %>_path
|
44
|
+
end
|
45
|
+
end
|