hobo 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +9 -0
- data/bin/hobo +16 -5
- data/dryml_generators/rapid/pages.dryml.erb +1 -1
- data/lib/hobo.rb +1 -1
- data/lib/hobo/controller.rb +1 -2
- data/lib/hobo/dryml/template.rb +20 -4
- data/lib/hobo/lifecycles.rb +1 -0
- data/lib/hobo/model.rb +6 -5
- data/lib/hobo/translations.rb +6 -1
- data/taglibs/rapid_core.dryml +3 -4
- data/taglibs/rapid_navigation.dryml +5 -5
- data/taglibs/rapid_pages.dryml +1 -1
- data/taglibs/rapid_plus.dryml +5 -5
- data/taglibs/rapid_summary.dryml +4 -2
- data/taglibs/rapid_translations.dryml +1 -1
- metadata +7 -7
data/CHANGES.txt
CHANGED
@@ -14,6 +14,15 @@ likely to cause conflicts, so it is highly recommended that you have
|
|
14
14
|
your code backed up and in a change control system such as git or
|
15
15
|
subversion.
|
16
16
|
|
17
|
+
=== Hobo 1.0.1 ===
|
18
|
+
|
19
|
+
This version contains two speedups: one fix that reduces the number of
|
20
|
+
database accesses by Matt Jones and one that speeds up compilation of
|
21
|
+
DRYML by Petteri Räty.
|
22
|
+
|
23
|
+
This version also contains several bug fixes. See the [github
|
24
|
+
log](http://github.com/tablatom/hobo/tree/v1.0.1) for more details.
|
25
|
+
|
17
26
|
=== Hobo 1.0.0 ===
|
18
27
|
|
19
28
|
Drumm-roll! Trumpets! Fanfare!
|
data/bin/hobo
CHANGED
@@ -7,6 +7,11 @@ require 'rbconfig'
|
|
7
7
|
|
8
8
|
RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']).sub(/.*\s.*/m, '"\&"')
|
9
9
|
|
10
|
+
if RUBY.empty?
|
11
|
+
puts "ruby not found"
|
12
|
+
exit 2
|
13
|
+
end
|
14
|
+
|
10
15
|
Signal.trap("INT") { puts; exit }
|
11
16
|
|
12
17
|
hobo_src = File.join(File.dirname(__FILE__), "../hobo_files/plugin")
|
@@ -87,11 +92,17 @@ if run_rails
|
|
87
92
|
opts = []
|
88
93
|
if rails_version
|
89
94
|
opts << "_#{rails_version}_"
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
+
else
|
96
|
+
v=`#{RUBY} -S rails -v`.split[1].split(".")
|
97
|
+
unless v.length>=3
|
98
|
+
puts "rails not found!"
|
99
|
+
exit 2
|
100
|
+
end
|
101
|
+
unless v[0]=='2' && ['2', '3'].include?(v[1])
|
102
|
+
puts "Rails 2.2 or 2.3 required!"
|
103
|
+
puts "Rails 3 requires Hobo 1.1 or later."
|
104
|
+
exit 2
|
105
|
+
end
|
95
106
|
end
|
96
107
|
opts << "-d #{database_type}" if database_type
|
97
108
|
system("#{RUBY} -S rails #{opts * ' '} #{app_path}")
|
data/lib/hobo.rb
CHANGED
data/lib/hobo/controller.rb
CHANGED
@@ -133,12 +133,11 @@ module Hobo
|
|
133
133
|
tag_renderer.send(name, options)
|
134
134
|
end
|
135
135
|
|
136
|
-
NO_SEARCH_RESULTS_HTML = "<p>Your search returned no matches.</p>"
|
137
136
|
def site_search(query)
|
138
137
|
results_hash = Hobo.find_by_search(query)
|
139
138
|
all_results = results_hash.values.flatten.select { |r| r.viewable_by?(current_user) }
|
140
139
|
if all_results.empty?
|
141
|
-
render :text =>
|
140
|
+
render :text => "<p>"+ ht(:"hobo.live_search.no_results", :default=>["Your search returned no matches."]) + "</p>"
|
142
141
|
else
|
143
142
|
# TODO: call one tag that renders all the search results with headings for each model
|
144
143
|
render_tags(all_results, :search_card, :for_type => true)
|
data/lib/hobo/dryml/template.rb
CHANGED
@@ -72,7 +72,7 @@ module Hobo::Dryml
|
|
72
72
|
# compile the build instructions
|
73
73
|
@builder.build(local_names, auto_taglibs, mtime)
|
74
74
|
|
75
|
-
logger.info(" DRYML: Compiled #{template_path} in %.2fs
|
75
|
+
logger.info(" DRYML: Compiled #{template_path} in #{'%.2fs' % (Time.now - now)}") if parsed
|
76
76
|
end
|
77
77
|
|
78
78
|
|
@@ -319,9 +319,25 @@ module Hobo::Dryml
|
|
319
319
|
res
|
320
320
|
end
|
321
321
|
|
322
|
+
def self.descendents(el,&block)
|
323
|
+
return if el.elements.empty?
|
324
|
+
el.elements.each do |child|
|
325
|
+
block.call(child)
|
326
|
+
descendents(child,&block)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
# Using REXML::XPath is slow
|
331
|
+
def self.descendent_select(el)
|
332
|
+
result = []
|
333
|
+
descendents(el) { |desc|
|
334
|
+
result << desc if yield(desc)
|
335
|
+
}
|
336
|
+
result
|
337
|
+
end
|
322
338
|
|
323
339
|
def param_names_in_definition(el)
|
324
|
-
|
340
|
+
self.class.descendent_select(el) { |el| el.attribute 'param' }.map do |e|
|
325
341
|
name = get_param_name(e)
|
326
342
|
dryml_exception("invalid param name: #{name.inspect}", e) unless
|
327
343
|
is_code_attribute?(name) || name =~ RUBY_NAME_RX || name =~ /#\{/
|
@@ -486,7 +502,7 @@ module Hobo::Dryml
|
|
486
502
|
|
487
503
|
|
488
504
|
def call_name(el)
|
489
|
-
dryml_exception("invalid tag name", el) unless el.dryml_name =~ /^#{DRYML_NAME}(\.#{DRYML_NAME})*$/
|
505
|
+
dryml_exception("invalid tag name (remember to use '-' rather than '_')", el) unless el.dryml_name =~ /^#{DRYML_NAME}(\.#{DRYML_NAME})*$/
|
490
506
|
|
491
507
|
name = Hobo::Dryml.unreserve(ruby_name(el.dryml_name))
|
492
508
|
if call_to_self_from_type_specific_def?(el)
|
@@ -777,7 +793,7 @@ module Hobo::Dryml
|
|
777
793
|
def tag_attributes(el)
|
778
794
|
attributes = el.attributes
|
779
795
|
items = attributes.map do |n,v|
|
780
|
-
dryml_exception("invalid attribute name '#{n}'", el) unless n =~ DRYML_NAME_RX
|
796
|
+
dryml_exception("invalid attribute name '#{n}' (remember to use '-' rather than '_')", el) unless n =~ DRYML_NAME_RX
|
781
797
|
|
782
798
|
next if n.in?(SPECIAL_ATTRIBUTES) || n =~ /^without-/
|
783
799
|
next if el.attributes['part'] && n == 'id' # The id is rendered on the <div class="part-wrapper"> instead
|
data/lib/hobo/lifecycles.rb
CHANGED
data/lib/hobo/model.rb
CHANGED
@@ -57,11 +57,12 @@ module Hobo
|
|
57
57
|
|
58
58
|
WillPaginate::Finder::ClassMethods.class_eval do
|
59
59
|
def paginate_with_hobo_metadata(*args, &block)
|
60
|
-
returning
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
# using 'returning' here triggers a full load
|
61
|
+
collection = paginate_without_hobo_metadata(*args, &block)
|
62
|
+
collection.member_class = self
|
63
|
+
collection.origin = try.proxy_owner
|
64
|
+
collection.origin_attribute = try.proxy_reflection._?.name
|
65
|
+
collection
|
65
66
|
end
|
66
67
|
alias_method_chain :paginate, :hobo_metadata
|
67
68
|
|
data/lib/hobo/translations.rb
CHANGED
@@ -72,7 +72,12 @@ module Hobo
|
|
72
72
|
|
73
73
|
Rails.logger.info "..translate(#{key}, #{options.inspect}) to #{I18n.locale}" if defined?(HOBO_VERBOSE_TRANSLATIONS)
|
74
74
|
|
75
|
-
I18n.translate(key.to_sym, options)
|
75
|
+
translation = I18n.translate(key.to_sym, options)
|
76
|
+
if translation.respond_to? :to_str
|
77
|
+
key_prefix ? translation.to_str+key_prefix : translation
|
78
|
+
else
|
79
|
+
"translation invalid: #{key}"
|
80
|
+
end
|
76
81
|
end
|
77
82
|
|
78
83
|
# if somebody includes us, give them ht as an instance method
|
data/taglibs/rapid_core.dryml
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
<!-- Core Rapid tags and tags that don't belong anywhere else. -->
|
2
1
|
|
3
2
|
<!-- Renders a table with one row per field, where each row contains a `<th>` with the field name, and a `<td>` with (by default)
|
4
3
|
a `<view>` of the field.
|
@@ -310,7 +309,7 @@ Or a new page if the context is a class:
|
|
310
309
|
|
311
310
|
* to: Use this item as the target instead of the current context.
|
312
311
|
|
313
|
-
* params, query-params: These are appended to the target as a query string after a "?".
|
312
|
+
* params, query-params: These are appended to the target as a query string after a "?". Params are passed as a ruby hash. Example: `params="&{id=>17, name=>'joe'}"`
|
314
313
|
|
315
314
|
* href, name: If either of these attributes are present, the smart features of this tag are turned off.
|
316
315
|
|
@@ -613,8 +612,8 @@ The context should be a user object. If `this == current_user` the "you" form is
|
|
613
612
|
<def tag="dev-user-changer">
|
614
613
|
<set user="&Hobo::User.default_user_model"/>
|
615
614
|
<select-menu if="&user && RAILS_ENV == 'development'"
|
616
|
-
first-option="Guest" options="&user.all(:limit => 30).*.login"
|
617
|
-
onchange="location.href = '#{dev_support_path}/set_current_user?login=' + this.options[this.selectedIndex].value"
|
615
|
+
first-option="#{ht('hobo.dev_user_changer.guest', {:default=>'Guest'})}" options="&user.all(:limit => 30).*.login"
|
616
|
+
onchange="location.href = '#{dev_support_path}/set_current_user?login=' + encodeURIComponent(this.options[this.selectedIndex].value)"
|
618
617
|
selected="#{current_user.login}"
|
619
618
|
class="dev-user-changer"
|
620
619
|
merge-attrs/>
|
@@ -70,13 +70,13 @@ This is a simple tag - just look at the source if you need to know more detail.
|
|
70
70
|
<ul class="navigation account-nav" param>
|
71
71
|
<li if="&RAILS_ENV == 'development'" param="dev-user-changer"><dev-user-changer/></li>
|
72
72
|
<if test="&logged_in?">
|
73
|
-
<li class='nav-item' param="logged-in-as"><a to="¤t_user">Logged in as <name/></a></li>
|
74
|
-
<li class='nav-item' param="account"><a action="account">Account</a></li>
|
75
|
-
<li class='nav-item' param="log-out"><a href="&logout_url">Log out</a></li>
|
73
|
+
<li class='nav-item' param="logged-in-as"><a to="¤t_user"><ht key="hobo.actions.logged_in_as" name="#{name}">Logged in as <name/></ht></a></li>
|
74
|
+
<li class='nav-item' param="account"><a action="account"><ht key="hobo.actions.account">Account</ht></a></li>
|
75
|
+
<li class='nav-item' param="log-out"><a href="&logout_url"><ht key="hobo.actions.logout">Log out</ht></a></li>
|
76
76
|
</if>
|
77
77
|
<else>
|
78
|
-
<li class='nav-item' param="log-in"><a href="&login_url">Log in</a></li>
|
79
|
-
<li if="&signup_url" class="nav-item" param="sign-up"><a href="&signup_url">Sign up</a></li>
|
78
|
+
<li class='nav-item' param="log-in"><a href="&login_url"><ht key="hobo.actions.login">Log in</ht></a></li>
|
79
|
+
<li if="&signup_url" class="nav-item" param="sign-up"><a href="&signup_url"><ht key="hobo.actions.signup">Sign up</ht></a></li>
|
80
80
|
</else>
|
81
81
|
</ul>
|
82
82
|
</do>
|
data/taglibs/rapid_pages.dryml
CHANGED
@@ -243,7 +243,7 @@ The flash is output in a `<div class="flash notice">`, where `notice` is the `ty
|
|
243
243
|
|
244
244
|
<!-- Renders `<flash-message>` for every flash type given in the `names` attribute (comma separated), or for all flash messages that have been set if `names` is not given -->
|
245
245
|
<def tag="flash-messages" attrs="names"><%=
|
246
|
-
scope.flash_rendered = true
|
246
|
+
scope.flash_rendered = true if scope.respond_to? :flash_rendered
|
247
247
|
names = names.nil? ? flash.keys : comma_split(names)
|
248
248
|
names.map { |name| flash_message :type => name }.join
|
249
249
|
%></def>
|
data/taglibs/rapid_plus.dryml
CHANGED
@@ -15,7 +15,7 @@ An [worked example](/tutorials/agility#improve_the_project_page_with_a_searchabl
|
|
15
15
|
<div class="search">
|
16
16
|
<form param="search-form" method="get" action="">
|
17
17
|
<hidden-fields for-query-string skip="page, search"/>
|
18
|
-
<span>Search</span>
|
18
|
+
<span><ht key="hobo.table_plus.search">Search</ht></span>
|
19
19
|
<input class="search" type="search" name="search" value="¶ms[:search]"/>
|
20
20
|
<submit label="Go" class="search-button" param="search-submit"/>
|
21
21
|
</form>
|
@@ -43,7 +43,7 @@ An [worked example](/tutorials/agility#improve_the_project_page_with_a_searchabl
|
|
43
43
|
<th if="&all_parameters[:controls]" class="controls"></th>
|
44
44
|
</field-heading-row>
|
45
45
|
</table>
|
46
|
-
<do param="empty-message" if="empty?">No <collection-name lowercase/> to display</do>
|
46
|
+
<do param="empty-message" if="empty?"><ht key="hobo.table_plus.empty" model="#{name.downcase}">No <collection-name lowercase/> to display</ht></do>
|
47
47
|
|
48
48
|
|
49
49
|
<page-nav param if="&this.respond_to?(:page_count) || this.respond_to?(:total_pages)"/>
|
@@ -101,7 +101,7 @@ This tag assumes the controller has a `reorder` action. This action is added aut
|
|
101
101
|
<% name ||= collection_name.pluralize -%>
|
102
102
|
<section class="#{name.gsub(' ', '-').dasherize} preview-with-more" param="default">
|
103
103
|
<h3 param="heading"><%= name.titleize %></h3>
|
104
|
-
<a param="more">More <type-name plural lowercase/>...</a>
|
104
|
+
<a param="more"><ht key="hobo.live_search.more">More</ht> <type-name plural lowercase/>...</a>
|
105
105
|
<collection param/>
|
106
106
|
<a action="new" if="&can_create?(this.new)" param="new-link">New <%= this.member_class.view_hints.model_name %></a>
|
107
107
|
</section>
|
@@ -125,11 +125,11 @@ This tag assumes the controller has a `reorder` action. This action is added aut
|
|
125
125
|
<!-- Provides an ajax-powered *find-as-you-type* live search field which is hooked up to Hobo's site-side search feature. At the moment this tag is not very flexible. It is not easy to use if for anything other than Hobo's site-wide search. -->
|
126
126
|
<def tag="live-search">
|
127
127
|
<div class="search">
|
128
|
-
<label for="search-field">Search</label><input type="search" class="live-search"/>
|
128
|
+
<label for="search-field"><ht key="hobo.live_search.label">Search</ht></label><input type="search" class="live-search"/>
|
129
129
|
<spinner id="search-spinner"/>
|
130
130
|
</div>
|
131
131
|
<section class="hidden" id="search-results-panel">
|
132
|
-
<h2>Search Results</h2><div param="close-button">close</div>
|
132
|
+
<h2><ht key="hobo.live_search.results_label">Search Results</ht></h2><div param="close-button"><ht key="hobo.live_search.close_button">close</ht></div>
|
133
133
|
<section id="search-results"> </section>
|
134
134
|
</section>
|
135
135
|
</def>
|
data/taglibs/rapid_summary.dryml
CHANGED
@@ -102,7 +102,9 @@
|
|
102
102
|
</def>
|
103
103
|
|
104
104
|
<def tag="gem-version-requirement">
|
105
|
-
|
105
|
+
<unless test="this.nil?"><%=
|
106
|
+
this.requirements.map{|l| l.first+l.second.to_s}.join(",")
|
107
|
+
-%></unless>
|
106
108
|
</def>
|
107
109
|
|
108
110
|
<!-- inside `<with-gems>`, returns the version required -->
|
@@ -123,7 +125,7 @@
|
|
123
125
|
<!-- inside `<with-gems>`, returns the gem dependencies -->
|
124
126
|
<def tag="gem-dependencies">
|
125
127
|
<repeat with="&this.dependencies">
|
126
|
-
<%= this.name -%><gem-version-requirement
|
128
|
+
<%= this.name -%><gem-version-requirement with="&this.requirement || this.version_requirements" />
|
127
129
|
</repeat>
|
128
130
|
</def>
|
129
131
|
|
@@ -20,7 +20,7 @@ Will lookup the "my.app"-key for your locale and replaces the "My Application" c
|
|
20
20
|
|
21
21
|
Will look up both the "my"- and "app"-key for your locale, and replaces the "My Application" with the "my"-key contents (interpolated using the "app"-key.
|
22
22
|
|
23
|
-
sample.
|
23
|
+
sample.no.yml-file:
|
24
24
|
|
25
25
|
"no":
|
26
26
|
my: "Mitt {{app}}"
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 1.0.
|
8
|
+
- 1
|
9
|
+
version: 1.0.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Tom Locke
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-06-01 00:00:00 +01:00
|
18
18
|
default_executable: hobo
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -55,8 +55,8 @@ dependencies:
|
|
55
55
|
segments:
|
56
56
|
- 1
|
57
57
|
- 0
|
58
|
-
-
|
59
|
-
version: 1.0.
|
58
|
+
- 1
|
59
|
+
version: 1.0.1
|
60
60
|
type: :runtime
|
61
61
|
version_requirements: *id003
|
62
62
|
- !ruby/object:Gem::Dependency
|
@@ -69,8 +69,8 @@ dependencies:
|
|
69
69
|
segments:
|
70
70
|
- 1
|
71
71
|
- 0
|
72
|
-
-
|
73
|
-
version: 1.0.
|
72
|
+
- 1
|
73
|
+
version: 1.0.1
|
74
74
|
type: :runtime
|
75
75
|
version_requirements: *id004
|
76
76
|
description:
|