Commit 6cdc409cefb859ae3f893cda12dd1f535972e52e
1 parent
68b5c1da
Exists in
master
and in
28 other branches
ActionItem26: displaying as calendar
and several other things git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1886 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
14 changed files
with
373 additions
and
68 deletions
Show diff stats
app/controllers/public/search_controller.rb
... | ... | @@ -16,7 +16,7 @@ class SearchController < ApplicationController |
16 | 16 | @search_in = SEARCH_IN |
17 | 17 | @searching = {} |
18 | 18 | @search_in.each do |key, name| |
19 | - @searching[key] = params[:find_in].nil? || params[:find_in].empty? || params[:find_in].include?(key.to_s) | |
19 | + @searching[key] = (params[:asset].blank? && (params[:find_in].nil? || params[:find_in].empty? || params[:find_in].include?(key.to_s))) || (params[:asset] == key.to_s) | |
20 | 20 | end |
21 | 21 | end |
22 | 22 | |
... | ... | @@ -91,6 +91,33 @@ class SearchController < ApplicationController |
91 | 91 | end |
92 | 92 | end |
93 | 93 | |
94 | + def events | |
95 | + @events = @results[:events] | |
96 | + @calendar = Event.date_range(params[:year], params[:month]).map do |date| | |
97 | + [ | |
98 | + # the day itself | |
99 | + date, | |
100 | + # list of events of that day | |
101 | + @events.select do |event| | |
102 | + event.date_range.include?(date) | |
103 | + end, | |
104 | + # is this date in the current month? | |
105 | + true | |
106 | + ] | |
107 | + end | |
108 | + | |
109 | + # pad with days before | |
110 | + while @calendar.first.first.wday != 0 | |
111 | + @calendar.unshift([@calendar.first.first - 1.day, [], false]) | |
112 | + end | |
113 | + | |
114 | + # pad with days after (until Saturday) | |
115 | + while @calendar.last.first.wday != 6 | |
116 | + @calendar << [@calendar.last.first + 1.day, [], false] | |
117 | + end | |
118 | + | |
119 | + end | |
120 | + | |
94 | 121 | ####################################################### |
95 | 122 | |
96 | 123 | # view the summary of one category |
... | ... | @@ -104,7 +131,7 @@ class SearchController < ApplicationController |
104 | 131 | [ :comments, _('Recent comments'), @finder.recent('comments') ], |
105 | 132 | [ :most_commented_articles, _('Most commented articles'), @finder.most_commented_articles ], |
106 | 133 | [ :enterprises, _('Recently created enterprises'), @finder.recent('enterprises') ], |
107 | - [ :events, _('Recently added events'), @finder.recent('events') ] | |
134 | + [ :events, _('Recently added events'), @finder.current_events(params[:year], params[:month]) ] | |
108 | 135 | ].each do |key, name, list| |
109 | 136 | @results[key] = list |
110 | 137 | @names[key] = name |
... | ... | @@ -112,12 +139,12 @@ class SearchController < ApplicationController |
112 | 139 | end |
113 | 140 | attr_reader :category |
114 | 141 | |
115 | - def assets | |
116 | - @results = { @asset => @finder.recent(@asset, LIST_LIMIT) } | |
142 | + #def assets | |
143 | + #@results = { @asset => @finder.recent(@asset, LIST_LIMIT) } | |
117 | 144 | |
118 | - @asset_name = gettext(SEARCH_IN.find { |entry| entry.first == @asset }[1]) | |
119 | - @names = { @asset => @asset_name } | |
120 | - end | |
145 | + #@asset_name = gettext(SEARCH_IN.find { |entry| entry.first == @asset }[1]) | |
146 | + #@names = { @asset => @asset_name } | |
147 | + #end | |
121 | 148 | |
122 | 149 | def directory |
123 | 150 | @results = { @asset => @finder.find_by_initial(@asset, params[:initial]) } | ... | ... |
app/helpers/application_helper.rb
... | ... | @@ -13,6 +13,8 @@ module ApplicationHelper |
13 | 13 | include AssetsHelper |
14 | 14 | |
15 | 15 | include BlockHelper |
16 | + | |
17 | + include DatesHelper | |
16 | 18 | |
17 | 19 | # Displays context help. You can pass the content of the help message as the |
18 | 20 | # first parameter or using template code inside a block passed to this |
... | ... | @@ -457,32 +459,6 @@ module ApplicationHelper |
457 | 459 | |
458 | 460 | end |
459 | 461 | |
460 | - # formats a date for displaying. | |
461 | - def show_date(date) | |
462 | - if date | |
463 | - date.strftime(_('%d %B %Y')) | |
464 | - else | |
465 | - '' | |
466 | - end | |
467 | - end | |
468 | - | |
469 | - # formats a datetime for displaying. | |
470 | - def show_time(time) | |
471 | - if time | |
472 | - time.strftime(_('%d %B %Y, %H:%m')) | |
473 | - else | |
474 | - '' | |
475 | - end | |
476 | - end | |
477 | - | |
478 | - def show_period(date1, date2 = nil) | |
479 | - if (date1 == date2) || (date2.nil?) | |
480 | - show_date(date1) | |
481 | - else | |
482 | - _('from %s to %s') % [show_date(date1), show_date(date2)] | |
483 | - end | |
484 | - end | |
485 | - | |
486 | 462 | def gravatar_url_for(email, options = {}) |
487 | 463 | # Ta dando erro de roteamento |
488 | 464 | url_for( { :gravatar_id => Digest::MD5.hexdigest(email), | ... | ... |
... | ... | @@ -0,0 +1,89 @@ |
1 | +module DatesHelper | |
2 | + | |
3 | + include GetText | |
4 | + | |
5 | + # formats a date for displaying. | |
6 | + def show_date(date) | |
7 | + if date | |
8 | + date.strftime(_('%d %B %Y')) | |
9 | + else | |
10 | + '' | |
11 | + end | |
12 | + end | |
13 | + | |
14 | + # formats a datetime for displaying. | |
15 | + def show_time(time) | |
16 | + if time | |
17 | + time.strftime(_('%d %B %Y, %H:%m')) | |
18 | + else | |
19 | + '' | |
20 | + end | |
21 | + end | |
22 | + | |
23 | + def show_period(date1, date2 = nil) | |
24 | + if (date1 == date2) || (date2.nil?) | |
25 | + show_date(date1) | |
26 | + else | |
27 | + _('from %s to %s') % [show_date(date1), show_date(date2)] | |
28 | + end | |
29 | + end | |
30 | + | |
31 | + def show_day_of_week(date) | |
32 | + # FIXME Date#strftime should translate this for us !!!! | |
33 | + _([ | |
34 | + N_('Sunday'), | |
35 | + N_('Monday'), | |
36 | + N_('Tuesday'), | |
37 | + N_('Wednesday'), | |
38 | + N_('Thursday'), | |
39 | + N_('Friday'), | |
40 | + N_('Saturday'), | |
41 | + ][date.wday]) | |
42 | + end | |
43 | + | |
44 | + def show_month(year, month) | |
45 | + # FIXME Date#strftime should translate this for us !!! | |
46 | + monthname = _([ | |
47 | + N_('January'), | |
48 | + N_('February'), | |
49 | + N_('March'), | |
50 | + N_('April'), | |
51 | + N_('May'), | |
52 | + N_('June'), | |
53 | + N_('July'), | |
54 | + N_('August'), | |
55 | + N_('September'), | |
56 | + N_('October'), | |
57 | + N_('November'), | |
58 | + N_('December') | |
59 | + ][month.to_i - 1]) | |
60 | + | |
61 | + _('%{month} %{year}') % { :year => year, :month => monthname } | |
62 | + end | |
63 | + | |
64 | + def link_to_previous_month(year, month) | |
65 | + year = year.to_i | |
66 | + month = month.to_i | |
67 | + if month == 1 | |
68 | + year -= 1 | |
69 | + month = 12 | |
70 | + else | |
71 | + month -= 1 | |
72 | + end | |
73 | + | |
74 | + link_to '← ' + show_month(year, month), :year => year, :month => month | |
75 | + end | |
76 | + | |
77 | + def link_to_next_month(year, month) | |
78 | + year = year.to_i | |
79 | + month = month.to_i | |
80 | + if month == 12 | |
81 | + year += 1 | |
82 | + month = 1 | |
83 | + else | |
84 | + month += 1 | |
85 | + end | |
86 | + | |
87 | + link_to show_month(year, month) + ' →', :year => year, :month => month | |
88 | + end | |
89 | +end | ... | ... |
app/models/category.rb
... | ... | @@ -25,6 +25,8 @@ class Category < ActiveRecord::Base |
25 | 25 | has_many :articles, :through => :article_categorizations |
26 | 26 | has_many :comments, :through => :articles |
27 | 27 | |
28 | + has_many :events, :through => :article_categorizations, :class_name => 'Event', :source => :article | |
29 | + | |
28 | 30 | has_many :profile_categorizations |
29 | 31 | has_many :enterprises, :through => :profile_categorizations, :source => :profile, :class_name => 'Enterprise' |
30 | 32 | has_many :people, :through => :profile_categorizations, :source => :profile, :class_name => 'Person' | ... | ... |
app/models/category_finder.rb
... | ... | @@ -31,6 +31,12 @@ class CategoryFinder |
31 | 31 | Article.find(:all, options_for_find(Article, :limit => limit, :order => 'comments_count DESC')) |
32 | 32 | end |
33 | 33 | |
34 | + def current_events(year, month) | |
35 | + range = Event.date_range(year, month) | |
36 | + | |
37 | + Event.find(:all, :include => :categories, :conditions => { 'categories.id' => category_ids, :start_date => range }) | |
38 | + end | |
39 | + | |
34 | 40 | protected |
35 | 41 | |
36 | 42 | def find_in_categorized(klass, query, options={}) | ... | ... |
app/models/event.rb
... | ... | @@ -26,4 +26,61 @@ class Event < Article |
26 | 26 | 'event' |
27 | 27 | end |
28 | 28 | |
29 | + def self.by_month(year = nil, month = nil) | |
30 | + self.find(:all, :conditions => { :start_date => date_range(year, month) }) | |
31 | + end | |
32 | + | |
33 | + def self.date_range(year, month) | |
34 | + if year.nil? || month.nil? | |
35 | + today = Date.today | |
36 | + year = today.year | |
37 | + month = today.month | |
38 | + else | |
39 | + year = year.to_i | |
40 | + month = month.to_i | |
41 | + end | |
42 | + | |
43 | + first_day = Date.new(year, month, 1) | |
44 | + last_day = Date.new(year, month, 1) + 1.month - 1.day | |
45 | + | |
46 | + first_day..last_day | |
47 | + end | |
48 | + | |
49 | + def date_range | |
50 | + start_date..(end_date||start_date) | |
51 | + end | |
52 | + | |
53 | + # FIXME this shouldn't be needed | |
54 | + include ActionView::Helpers::TagHelper | |
55 | + include ActionView::Helpers::UrlHelper | |
56 | + include ActionController::UrlWriter | |
57 | + include DatesHelper | |
58 | + | |
59 | + def to_html | |
60 | + | |
61 | + result = '' | |
62 | + html = Builder::XmlMarkup.new(:target => result) | |
63 | + | |
64 | + html.div { | |
65 | + html.ul { | |
66 | + html.li { | |
67 | + html.strong _('URL:') | |
68 | + html.a(self.link || "", 'href' => self.link || "") | |
69 | + } | |
70 | + html.li { | |
71 | + html.strong _('Address:') | |
72 | + html.text! self.address || "" | |
73 | + } | |
74 | + html.li { | |
75 | + html.strong _('When:') | |
76 | + html.text! show_period(start_date, end_date) | |
77 | + } | |
78 | + } | |
79 | + | |
80 | + html.div self.description | |
81 | + } | |
82 | + | |
83 | + result | |
84 | + end | |
85 | + | |
29 | 86 | end | ... | ... |
app/views/search/assets.rhtml
... | ... | @@ -1,10 +0,0 @@ |
1 | -<h1><%= @category ? (_('%{asset_name} in %{category}') % { :asset_name => @asset_name, :category => @category.name}) : @asset_name %></h1> | |
2 | - | |
3 | -<div style='text-align: center'> | |
4 | - <%= link_to_unless_current(_('Recent'), :action => 'assets') %> | |
5 | - | |
6 | - <%= (?a..?z).map { |initial| link_to_unless_current(('' << initial).upcase, :action => 'directory', :initial => ('' << initial)) }.join(' ') %> | |
7 | -</div> | |
8 | -<br style='clear:both'/> | |
9 | - | |
10 | -<%= render :partial => 'display_results' %> |
... | ... | @@ -0,0 +1,35 @@ |
1 | +<h1><%= show_month(params[:year], params[:month]) %></h1> | |
2 | + | |
3 | +<div style='text-align: center; margin: 1em;'> | |
4 | + <%= link_to_previous_month(params[:year], params[:month]) %> | |
5 | + | |
6 | + | |
7 | + | |
8 | + <%= link_to_next_month(params[:year], params[:month]) %> | |
9 | +</div> | |
10 | + | |
11 | +<table align='center'> | |
12 | + <tr> | |
13 | + <% @calendar.first(7).each do |day,event| %> | |
14 | + <th style='width: 10%;'><%= show_day_of_week(day) %></th> | |
15 | + <% end %> | |
16 | + </tr> | |
17 | + <% @calendar.in_groups_of(7).each do |week| %> | |
18 | + <tr style='height: 80px;'> | |
19 | + <% week.each do |date, events, this_month| %> | |
20 | + <td style='vertical-align: top; <%= ("background-color: gray;" unless this_month) %> <%= ("background-color: #ff9" if date == Date.today) %>'> | |
21 | + <div style='text-align: center;'> | |
22 | + <strong><%= date.day %></strong> | |
23 | + </div> | |
24 | + | |
25 | + <% events.each do |event| %> | |
26 | + <div style='border: 1px solid gray; margin: 0.25em;'> | |
27 | + <%= link_to event.name, event.url, :style => 'display: block;' %> | |
28 | + </div> | |
29 | + <% end %> | |
30 | + | |
31 | + </td> | |
32 | + <% end %> | |
33 | + </tr> | |
34 | + <% end %> | |
35 | +</table> | ... | ... |
config/routes.rb
... | ... | @@ -31,7 +31,7 @@ ActionController::Routing::Routes.draw do |map| |
31 | 31 | map.tag 'tag/:tag', :controller => 'search', :action => 'tag' |
32 | 32 | # categories index |
33 | 33 | map.category 'cat/*category_path', :controller => 'search', :action => 'category_index' |
34 | - map.assets 'assets/:asset/*category_path', :controller => 'search', :action => 'assets' | |
34 | + map.assets 'assets/:asset/*category_path', :controller => 'search', :action => 'index' | |
35 | 35 | map.directory 'directory/:asset/:initial/*category_path', :controller => 'search', :action => 'directory' |
36 | 36 | # search |
37 | 37 | map.connect 'search/:action/*category_path', :controller => 'search' | ... | ... |
test/functional/search_controller_test.rb
... | ... | @@ -901,14 +901,14 @@ class SearchControllerTest < Test::Unit::TestCase |
901 | 901 | end |
902 | 902 | |
903 | 903 | %w[ people enterprises articles events communities products comments ].each do |asset| |
904 | - | |
905 | 904 | should "render asset-specific template when searching for #{asset}" do |
906 | 905 | get :index, :find_in => [ asset ] |
907 | 906 | assert_template asset |
908 | 907 | end |
909 | - | |
910 | 908 | end |
911 | 909 | |
910 | + should 'test somehow the display of events as calendar' | |
911 | + | |
912 | 912 | ################################################################## |
913 | 913 | ################################################################## |
914 | 914 | ... | ... |
test/unit/application_helper_test.rb
... | ... | @@ -100,28 +100,6 @@ class ApplicationHelperTest < Test::Unit::TestCase |
100 | 100 | assert_not_nil theme_javascript |
101 | 101 | end |
102 | 102 | |
103 | - should 'generate period with two dates' do | |
104 | - date1 = mock | |
105 | - expects(:show_date).with(date1).returns('XXX') | |
106 | - date2 = mock | |
107 | - expects(:show_date).with(date2).returns('YYY') | |
108 | - expects(:_).with('from %s to %s').returns('from %s to %s') | |
109 | - assert_equal 'from XXX to YYY', show_period(date1, date2) | |
110 | - end | |
111 | - | |
112 | - should 'generate period with two equal dates' do | |
113 | - date1 = mock | |
114 | - expects(:show_date).with(date1).returns('XXX') | |
115 | - assert_equal 'XXX', show_period(date1, date1) | |
116 | - end | |
117 | - | |
118 | - should 'generate period with one date only' do | |
119 | - date1 = mock | |
120 | - expects(:show_date).with(date1).returns('XXX') | |
121 | - assert_equal 'XXX', show_period(date1) | |
122 | - end | |
123 | - | |
124 | - | |
125 | 103 | protected |
126 | 104 | |
127 | 105 | def content_tag(tag, content, options) | ... | ... |
test/unit/category_finder_test.rb
... | ... | @@ -272,4 +272,18 @@ class CategoryFinderTest < ActiveSupport::TestCase |
272 | 272 | assert_not_includes people, p2 |
273 | 273 | end |
274 | 274 | |
275 | + should 'find current events' do | |
276 | + finder = CategoryFinder.new(@category) | |
277 | + person = create_user('testuser').person | |
278 | + | |
279 | + e1 = Event.create!(:name => 'e1', :profile => person, :start_date => Date.new(2008,1,1), :categories => [@category]) | |
280 | + | |
281 | + # not in category | |
282 | + e2 = Event.create!(:name => 'e2', :profile => person, :start_date => Date.new(2008,1,15)) | |
283 | + | |
284 | + events = finder.current_events(2008, 1) | |
285 | + assert_includes events, e1 | |
286 | + assert_not_includes events, e2 | |
287 | + end | |
288 | + | |
275 | 289 | end | ... | ... |
... | ... | @@ -0,0 +1,61 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | + | |
3 | +class DatesHelperTest < Test::Unit::TestCase | |
4 | + | |
5 | + include DatesHelper | |
6 | + | |
7 | + should 'generate period with two dates' do | |
8 | + date1 = mock | |
9 | + expects(:show_date).with(date1).returns('XXX') | |
10 | + date2 = mock | |
11 | + expects(:show_date).with(date2).returns('YYY') | |
12 | + expects(:_).with('from %s to %s').returns('from %s to %s') | |
13 | + assert_equal 'from XXX to YYY', show_period(date1, date2) | |
14 | + end | |
15 | + | |
16 | + should 'generate period with two equal dates' do | |
17 | + date1 = mock | |
18 | + expects(:show_date).with(date1).returns('XXX') | |
19 | + assert_equal 'XXX', show_period(date1, date1) | |
20 | + end | |
21 | + | |
22 | + should 'generate period with one date only' do | |
23 | + date1 = mock | |
24 | + expects(:show_date).with(date1).returns('XXX') | |
25 | + assert_equal 'XXX', show_period(date1) | |
26 | + end | |
27 | + | |
28 | + should 'show day of week' do | |
29 | + expects(:_).with("Sunday").returns("Domingo") | |
30 | + date = mock | |
31 | + date.expects(:wday).returns(0) | |
32 | + assert_equal "Domingo", show_day_of_week(date) | |
33 | + end | |
34 | + | |
35 | + should 'show month' do | |
36 | + expects(:_).with('January').returns('January') | |
37 | + expects(:_).with('%{month} %{year}').returns('%{month} %{year}') | |
38 | + assert_equal 'January 2008', show_month(2008, 1) | |
39 | + end | |
40 | + | |
41 | + should 'provide link to previous month' do | |
42 | + expects(:link_to).with('← January 2008', { :year => 2008, :month => 1}) | |
43 | + link_to_previous_month('2008', '2') | |
44 | + end | |
45 | + | |
46 | + should 'support last year in link to previous month' do | |
47 | + expects(:link_to).with('← December 2007', { :year => 2007, :month => 12}) | |
48 | + link_to_previous_month('2008', '1') | |
49 | + end | |
50 | + | |
51 | + should 'provide link to next month' do | |
52 | + expects(:link_to).with('March 2008 →', { :year => 2008, :month => 3}) | |
53 | + link_to_next_month('2008', '2') | |
54 | + end | |
55 | + | |
56 | + should 'support next year in link to next month' do | |
57 | + expects(:link_to).with('January 2009 →', { :year => 2009, :month => 1}) | |
58 | + link_to_next_month('2008', '12') | |
59 | + end | |
60 | + | |
61 | +end | ... | ... |
test/unit/event_test.rb
... | ... | @@ -76,4 +76,74 @@ class EventTest < ActiveSupport::TestCase |
76 | 76 | assert !e.errors.invalid?(:start_date) |
77 | 77 | end |
78 | 78 | |
79 | + should 'find by year and month' do | |
80 | + profile = create_user('testuser').person | |
81 | + e1 = Event.create!(:name => 'e1', :start_date => Date.new(2008,1,1), :profile => profile) | |
82 | + e2 = Event.create!(:name => 'e2', :start_date => Date.new(2008,2,1), :profile => profile) | |
83 | + e3 = Event.create!(:name => 'e3', :start_date => Date.new(2008,3,1), :profile => profile) | |
84 | + | |
85 | + found = Event.by_month(2008, 2) | |
86 | + assert_includes found, e2 | |
87 | + assert_not_includes found, e1 | |
88 | + assert_not_includes found, e3 | |
89 | + end | |
90 | + | |
91 | + should 'find when in first day of month' do | |
92 | + profile = create_user('testuser').person | |
93 | + e1 = Event.create!(:name => 'e1', :start_date => Date.new(2008,1,1), :profile => profile) | |
94 | + assert_includes Event.by_month(2008, 1), e1 | |
95 | + end | |
96 | + | |
97 | + should 'find when in last day of month' do | |
98 | + profile = create_user('testuser').person | |
99 | + e1 = Event.create!(:name => 'e1', :start_date => Date.new(2008,1,31), :profile => profile) | |
100 | + assert_includes Event.by_month(2008, 1), e1 | |
101 | + end | |
102 | + | |
103 | + should 'use current month by default' do | |
104 | + profile = create_user('testuser').person | |
105 | + e1 = Event.create!(:name => 'e1', :start_date => Date.new(2008,1,31), :profile => profile) | |
106 | + Date.expects(:today).returns(Date.new(2008, 1, 15)) | |
107 | + assert_includes Event.by_month, e1 | |
108 | + end | |
109 | + | |
110 | + should 'provide period for searching in month' do | |
111 | + assert_equal Date.new(2008, 1, 1)..Date.new(2008,1,31), Event.date_range(2008, 1) | |
112 | + assert_equal Date.new(2008, 2, 1)..Date.new(2008,2,29), Event.date_range(2008, 2) | |
113 | + assert_equal Date.new(2007, 2, 1)..Date.new(2007,2,28), Event.date_range(2007, 2) | |
114 | + end | |
115 | + | |
116 | + should 'support string arguments to Event#date_range' do | |
117 | + assert_equal Date.new(2008,1,1)..Date.new(2008,1,31), Event.date_range('2008', '1') | |
118 | + end | |
119 | + | |
120 | + should 'provide range of dates for event with both dates filled' do | |
121 | + e = Event.new(:start_date => Date.new(2008, 1, 1), :end_date => Date.new(2008, 1, 5)) | |
122 | + | |
123 | + assert_equal (Date.new(2008,1,1)..Date.new(2008,1,5)), e.date_range | |
124 | + end | |
125 | + | |
126 | + should 'provide range of dates for event with only start date' do | |
127 | + e = Event.new(:start_date => Date.new(2008, 1, 1)) | |
128 | + | |
129 | + assert_equal (Date.new(2008,1,1)..Date.new(2008,1,1)), e.date_range | |
130 | + end | |
131 | + | |
132 | + should 'provide nice display format' do | |
133 | + e = Event.new(:start_date => Date.new(2008,1,1), :end_date => Date.new(2008,1,1), :link => 'http://www.myevent.org', :description => 'my somewhat short description') | |
134 | + | |
135 | + assert_tag_in_string e.to_html, :content => Regexp.new("1 January 2008") | |
136 | + assert_tag_in_string e.to_html, :content => 'my somewhat short description' | |
137 | + assert_tag_in_string e.to_html, :tag => 'a', :attributes => { :href => 'http://www.myevent.org' }, :content => 'http://www.myevent.org' | |
138 | + | |
139 | + end | |
140 | + | |
141 | + protected | |
142 | + | |
143 | + def assert_tag_in_string(text, options) | |
144 | + doc = HTML::Document.new(text, false, false) | |
145 | + tag = doc.find(options) | |
146 | + assert tag, "expected tag #{options.inspect}, but not found in #{text.inspect}" | |
147 | + end | |
148 | + | |
79 | 149 | end | ... | ... |