hobo 1.0.0 → 1.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/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:
|