simonmenke-mr_henry 0.0.1
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/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
@@ -0,0 +1,14 @@
|
|
1
|
+
<%% form_for([:lalala, <%= singular_name %>]) do |f| %>
|
2
|
+
|
3
|
+
<% for attribute in attributes -%>
|
4
|
+
<div>
|
5
|
+
<%%= f.label :<%= attribute.name %> %>
|
6
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
|
7
|
+
</div>
|
8
|
+
<% end -%>
|
9
|
+
<div class="button">
|
10
|
+
<%%= f.submit (<%= singular_name %>.new_record? ? "Create" : "Update") %>
|
11
|
+
<%%= link_to "Cancel", lalala_<%= plural_name %>_path %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<%% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<h1 id="title"><%= singular_name %></h1>
|
2
|
+
|
3
|
+
<div class="actions">
|
4
|
+
<%%= link_to "Edit", [:edit, :lalala, <%= singular_name %>] %>
|
5
|
+
<%%= link_to "Delete", [:lalala, <%= singular_name %>], :method => :delete, :confirm => "Are you sure?" %>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<% for attribute in attributes -%>
|
9
|
+
<p>
|
10
|
+
<b><%= attribute.column.human_name %>:</b>
|
11
|
+
<%%=h <%= singular_name %>.<%= attribute.name %> %>
|
12
|
+
</p>
|
13
|
+
|
14
|
+
<% end -%>
|
data/lib/mr_henry.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
module MrHenry
|
3
|
+
module ActionController
|
4
|
+
module HandlesResource
|
5
|
+
|
6
|
+
def self.included(target)
|
7
|
+
target.send :extend, ::MrHenry::ActionController::HandlesResource::Macros
|
8
|
+
end
|
9
|
+
|
10
|
+
module Macros
|
11
|
+
|
12
|
+
def resource(name,options={})
|
13
|
+
options.reverse_merge! :param => :id
|
14
|
+
parent = options[:from].nil? ? nil : options[:from].to_s.underscore.singularize
|
15
|
+
|
16
|
+
klass = name.to_s.classify
|
17
|
+
singular_name = klass.underscore.singularize
|
18
|
+
association = singular_name
|
19
|
+
if parent.nil?
|
20
|
+
singular_finder = %(#{klass}.find(params[:#{options[:param]}]))
|
21
|
+
singular_builder = %(#{klass}.new(params[:#{singular_name}]))
|
22
|
+
else
|
23
|
+
singular_finder = %(#{parent}.#{association})
|
24
|
+
singular_builder = %(#{parent}.#{association}.build(params[:#{singular_name}]))
|
25
|
+
end
|
26
|
+
|
27
|
+
generate_resource_method(singular_name, options[:param], singular_finder, singular_builder)
|
28
|
+
end
|
29
|
+
|
30
|
+
def resources(name,options={})
|
31
|
+
options.reverse_merge! :paginate => false, :param => :id
|
32
|
+
parent = options[:from].nil? ? nil : options[:from].to_s.underscore.singularize
|
33
|
+
|
34
|
+
klass = name.to_s.classify
|
35
|
+
singular_name = klass.underscore.singularize
|
36
|
+
plural_name = singular_name.pluralize
|
37
|
+
association = plural_name
|
38
|
+
finder_method = options[:paginate] ? "paginate" : "find"
|
39
|
+
finder_options = Array.new
|
40
|
+
finder_options << %(:all)
|
41
|
+
finder_options << %(:page => params[:page]) if options[:paginate]
|
42
|
+
finder_options << %(:order => '#{options[:order]}') unless options[:order].nil?
|
43
|
+
if parent.nil?
|
44
|
+
singular_finder = %(#{klass}.find(params[:#{options[:param]}]))
|
45
|
+
singular_builder = %(#{klass}.new(params[:#{singular_name}]))
|
46
|
+
plural_finder = %(#{klass}.#{finder_method}(#{finder_options.join(', ')}))
|
47
|
+
else
|
48
|
+
singular_finder = %(#{parent}.#{association}.find(params[:#{options[:param]}]))
|
49
|
+
singular_builder = %(#{parent}.#{association}.build(params[:#{singular_name}]))
|
50
|
+
plural_finder = %(#{parent}.#{association}.#{finder_method}(#{finder_options.join(', ')}))
|
51
|
+
end
|
52
|
+
|
53
|
+
generate_resource_method(singular_name, options[:param], singular_finder, singular_builder)
|
54
|
+
generate_resources_method(plural_name, plural_finder)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def generate_resource_method(name, param, finder, builder)
|
60
|
+
class_eval %(
|
61
|
+
def #{name}
|
62
|
+
@#{name} ||= if params[:#{param}]
|
63
|
+
#{finder}
|
64
|
+
else
|
65
|
+
#{builder}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
helper_method :#{name}
|
69
|
+
private :#{name})
|
70
|
+
end
|
71
|
+
|
72
|
+
def generate_resources_method(name, finder)
|
73
|
+
class_eval %(
|
74
|
+
def #{name}
|
75
|
+
@#{name} ||= #{finder}
|
76
|
+
end
|
77
|
+
helper_method :#{name}
|
78
|
+
private :#{name})
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
|
2
|
+
module MrHenry
|
3
|
+
module Generator
|
4
|
+
module Create
|
5
|
+
|
6
|
+
def plugin(repo)
|
7
|
+
logger.plugin repo
|
8
|
+
system(%{script/plugin install #{repo} > /dev/null 2>&1})
|
9
|
+
end
|
10
|
+
|
11
|
+
def patch(patch_file, target_file)
|
12
|
+
patch_file = source_path(File.join("..", "patches", patch_file))
|
13
|
+
target_file = destination_path(target_file)
|
14
|
+
logger.patch target_file
|
15
|
+
system(%{patch -i '#{patch_file}' '#{target_file}' > /dev/null 2>&1})
|
16
|
+
end
|
17
|
+
|
18
|
+
def drop(target_file)
|
19
|
+
target_file = destination_path(target_file)
|
20
|
+
logger.drop target_file
|
21
|
+
system(%{rm -fr '#{target_file}' > /dev/null 2>&1})
|
22
|
+
end
|
23
|
+
|
24
|
+
def route_lalala_resources(*resources)
|
25
|
+
resource_list = resources.map { |r| r.to_sym.inspect }.join(', ')
|
26
|
+
sentinel = ' map.namespace :lalala do |lalala|'
|
27
|
+
|
28
|
+
logger.route_lalala "lalala.resources #{resource_list}"
|
29
|
+
unless options[:pretend]
|
30
|
+
gsub_file 'config/routes.rb', /(#{Regexp.escape(sentinel)})/mi do |match|
|
31
|
+
"#{match}\n lalala.resources #{resource_list}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def lalala_menu(name, resource)
|
37
|
+
sentinel = " <div id=\"menu\">\n "
|
38
|
+
|
39
|
+
logger.menu_lalala "menu_item(\"#{name}\", :lalala_#{resource}_path)"
|
40
|
+
unless options[:pretend]
|
41
|
+
gsub_file 'app/views/lalala/layouts/application.html.erb', /(#{Regexp.escape(sentinel)})/mi do |match|
|
42
|
+
"#{match}\n <%= menu_item(\"#{name}\", :lalala_#{resource}_path) %>"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def asset(relative_source, *rest, &block)
|
48
|
+
file(File.join("..", "assets", relative_source), *rest, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_gem(gem, c={})
|
52
|
+
sentinel = " # config.gem \"aws-s3\", :lib => \"aws/s3\""
|
53
|
+
|
54
|
+
logger.add_gem "config.gem '#{gem}', #{c.inspect}"
|
55
|
+
unless options[:pretend]
|
56
|
+
gsub_file 'config/environment.rb', /(#{Regexp.escape(sentinel)})/mi do |match|
|
57
|
+
"#{match}\n config.gem '#{gem}', #{c.inspect}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def reset_session_id
|
63
|
+
gsub_file 'config/environment.rb', /\:session_key => '[^']+',/mi, ":session_key => '_session_id',"
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
module MrHenry
|
3
|
+
module Generator
|
4
|
+
module Destroy
|
5
|
+
|
6
|
+
def plugin(repo)
|
7
|
+
logger.plugin repo
|
8
|
+
system(%{script/plugin remove #{repo} > /dev/null 2>&1})
|
9
|
+
end
|
10
|
+
|
11
|
+
def patch(patch_file, target_file)
|
12
|
+
patch_file = source_path(File.join("..", "patches", patch_file))
|
13
|
+
target_file = destination_path(target_file)
|
14
|
+
logger.patch target_file
|
15
|
+
system(%{patch -R -i '#{patch_file}' '#{target_file}' > /dev/null 2>&1})
|
16
|
+
end
|
17
|
+
|
18
|
+
def drop(target_file)
|
19
|
+
# do nothing
|
20
|
+
end
|
21
|
+
|
22
|
+
def route_lalala_resources(*resources)
|
23
|
+
resource_list = resources.map { |r| r.to_sym.inspect }.join(', ')
|
24
|
+
look_for = "\n lalala.resources #{resource_list}"
|
25
|
+
logger.route_lalala "lalala.resources #{resource_list}"
|
26
|
+
gsub_file 'config/routes.rb', /(#{look_for})/mi, ''
|
27
|
+
end
|
28
|
+
|
29
|
+
def lalala_menu(name, resource)
|
30
|
+
look_for = "\n <%= menu_item(\"#{name}\", :lalala_#{resource}_path) %>"
|
31
|
+
logger.menu_lalala "menu_item(\"#{name}\", :lalala_#{resource}_path)"
|
32
|
+
gsub_file 'app/views/lalala/layouts/application.html.erb', /(#{look_for})/mi, ''
|
33
|
+
end
|
34
|
+
|
35
|
+
def asset(relative_source, *rest, &block)
|
36
|
+
file(File.join("..", "assets", relative_source), *rest, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def reset_session_id
|
40
|
+
# do nothing
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_gem(gem, c={})
|
44
|
+
look_for = "\n config.gem '#{gem}', #{c.inspect}"
|
45
|
+
logger.add_gem "config.gem '#{gem}', #{c.inspect}"
|
46
|
+
gsub_file 'config/environment.rb', /(#{Regexp.escape(look_for)})/mi, ''
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
module MrHenry
|
3
|
+
module Generator
|
4
|
+
module Update
|
5
|
+
|
6
|
+
def plugin(repo)
|
7
|
+
logger.plugin repo
|
8
|
+
system(%{script/plugin update #{repo} > /dev/null 2>&1})
|
9
|
+
end
|
10
|
+
|
11
|
+
def patch(patch_file, target_file)
|
12
|
+
# do nothing
|
13
|
+
end
|
14
|
+
|
15
|
+
def drop(target_file)
|
16
|
+
# do nothing
|
17
|
+
end
|
18
|
+
|
19
|
+
def route_lalala_resources(*resources)
|
20
|
+
# do nothing
|
21
|
+
end
|
22
|
+
|
23
|
+
def lalala_menu(name, resource)
|
24
|
+
# do nothing
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_gem(*args)
|
28
|
+
# do nothing
|
29
|
+
end
|
30
|
+
|
31
|
+
def reset_session_id
|
32
|
+
# do nothing
|
33
|
+
end
|
34
|
+
|
35
|
+
def asset(relative_source, *rest, &block)
|
36
|
+
file(File.join("..", "assets", relative_source), *rest, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// CSS Browser Selector v0.2.5
|
2
|
+
// Documentation: http://rafael.adm.br/css_browser_selector
|
3
|
+
// License: http://creativecommons.org/licenses/by/2.5/
|
4
|
+
// Author: Rafael Lima (http://rafael.adm.br)
|
5
|
+
// Contributors: http://rafael.adm.br/css_browser_selector#contributors
|
6
|
+
|
7
|
+
var css_browser_selector = function() {
|
8
|
+
var
|
9
|
+
ua=navigator.userAgent.toLowerCase(),
|
10
|
+
is=function(t){ return ua.indexOf(t) != -1; },
|
11
|
+
h=document.getElementsByTagName('html')[0],
|
12
|
+
b=(!(/opera|webtv/i.test(ua))&&/msie (\d)/.test(ua))?('ie ie'+RegExp.$1):is('gecko/')? 'gecko':is('opera/9')?'opera opera9':/opera (\d)/.test(ua)?'opera opera'+RegExp.$1:is('konqueror')?'konqueror':is('applewebkit/')?'webkit safari':is('mozilla/')?'gecko':'',
|
13
|
+
os=(is('x11')||is('linux'))?' linux':is('mac')?' mac':is('win')?' win':'';
|
14
|
+
var c=b+os+' js';
|
15
|
+
h.className += h.className?' '+c:c;
|
16
|
+
}();
|
@@ -0,0 +1,69 @@
|
|
1
|
+
|
2
|
+
@behavior LanguageButton {
|
3
|
+
initialize(parent) {
|
4
|
+
this.parent = parent;
|
5
|
+
}
|
6
|
+
onchange {
|
7
|
+
var index = this.element.selectedIndex;
|
8
|
+
var option = this.element.options[index];
|
9
|
+
this.parent._selectLanguage(option.value);
|
10
|
+
return false;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
@behavior LanguageChooser {
|
15
|
+
initialize {
|
16
|
+
var self = this;
|
17
|
+
self.languages = [];
|
18
|
+
self.elements_by_language = {};
|
19
|
+
self.default_language = self.element.readAttribute('lang');
|
20
|
+
self.current_language = null;
|
21
|
+
|
22
|
+
$$('.lang').each(function(element){
|
23
|
+
var lang = element.readAttribute('lang');
|
24
|
+
self.languages.push(lang);
|
25
|
+
if (!self.elements_by_language[lang]) { self.elements_by_language[lang] = []; }
|
26
|
+
self.elements_by_language[lang].push(element);
|
27
|
+
element.hide();
|
28
|
+
});
|
29
|
+
|
30
|
+
self.languages = self.languages.uniq();
|
31
|
+
|
32
|
+
self._buildSelectTag();
|
33
|
+
self._selectLanguage(self.default_language);
|
34
|
+
}
|
35
|
+
|
36
|
+
_buildSelectTag {
|
37
|
+
var html = '';
|
38
|
+
var default_language = this.default_language;
|
39
|
+
html += 'languages: <select id="lang_chooser_select_tag">';
|
40
|
+
this.languages.each(function(lang){
|
41
|
+
html += '<option value="'+lang+'" '+(default_language == lang ? 'selected="selected"' : '')+'>'+lang+'</option>';
|
42
|
+
});
|
43
|
+
html += '</select>';
|
44
|
+
this.element.insert(html);
|
45
|
+
LanguageButton.attach($('lang_chooser_select_tag'), this);
|
46
|
+
}
|
47
|
+
|
48
|
+
_selectLanguage(lang) {
|
49
|
+
var self = this;
|
50
|
+
if (self.current_language) {
|
51
|
+
self.elements_by_language[self.current_language].each(function(element){
|
52
|
+
element.hide();
|
53
|
+
});
|
54
|
+
|
55
|
+
self.elements_by_language[lang].each(function(element){
|
56
|
+
element.show();
|
57
|
+
element.highlight();
|
58
|
+
});
|
59
|
+
} else {
|
60
|
+
self.elements_by_language[lang].each(function(element){
|
61
|
+
element.show();
|
62
|
+
});
|
63
|
+
}
|
64
|
+
|
65
|
+
self.current_language = lang;
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
#lang_chooser % LanguageChooser ;
|