jakewendt-simply_helpful 2.2.14

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/README.rdoc ADDED
@@ -0,0 +1,28 @@
1
+ = Simply Helpful
2
+
3
+
4
+ == ToDo
5
+
6
+ == Installation / Usage
7
+
8
+ config.gem 'jakewendt-simply_helpful',
9
+ :source => 'http://rubygems.org'
10
+
11
+ script/generate simply_helpful
12
+
13
+ == Gemified with Jeweler
14
+
15
+ vi Rakefile
16
+ rake version:write
17
+
18
+ rake version:bump:patch
19
+ rake version:bump:minor
20
+ rake version:bump:major
21
+
22
+ rake gemspec
23
+
24
+ rake install
25
+ rake release
26
+
27
+
28
+ Copyright (c) 2010 [George 'Jake' Wendt], released under the MIT license
File without changes
@@ -0,0 +1,92 @@
1
+ class SimplyHelpfulGenerator < Rails::Generator::Base
2
+
3
+ def manifest
4
+ # See Rails::Generator::Commands::Create
5
+ # rails-2.3.10/lib/rails_generator/commands.rb
6
+ # for code methods for record (Manifest)
7
+ record do |m|
8
+ m.directory('config/autotest')
9
+ m.file('autotest_simply_helpful.rb', 'config/autotest/simply_helpful.rb')
10
+ m.directory('lib/tasks')
11
+ m.file('simply_helpful.rake', 'lib/tasks/simply_helpful.rake')
12
+
13
+ # File.open('Rakefile','a'){|f|
14
+ # f.puts <<-EOF
15
+ ## From `script/generate simply_helpful` ...
16
+ #require 'simply_helpful/test_tasks'
17
+ # EOF
18
+ # }
19
+ #
20
+ # File.open('.autotest','a'){|f|
21
+ # f.puts <<-EOF
22
+ ## From `script/generate simply_helpful` ...
23
+ #require 'simply_helpful/autotest'
24
+ # EOF
25
+ # }
26
+
27
+ # %w( ).each do |migration|
28
+ # m.migration_template "migrations/#{migration}.rb",
29
+ # 'db/migrate', :migration_file_name => migration
30
+ # end
31
+ dot = File.dirname(__FILE__)
32
+ m.directory('public/javascripts')
33
+ Dir["#{dot}/templates/javascripts/*js"].each{|file|
34
+ f = file.split('/').slice(-2,2).join('/')
35
+ m.file(f, "public/javascripts/#{File.basename(file)}")
36
+ }
37
+ m.directory('public/stylesheets')
38
+ Dir["#{dot}/templates/stylesheets/*css"].each{|file|
39
+ f = file.split('/').slice(-2,2).join('/')
40
+ m.file(f, "public/stylesheets/#{File.basename(file)}")
41
+ }
42
+
43
+ # m.directory('public/images')
44
+ # %w( full large medium original small ).each do |style|
45
+ # m.directory("public/images/#{style}")
46
+ # m.file("images/#{style}/missing.png",
47
+ # "public/images/#{style}/missing.png")
48
+ # end
49
+
50
+ # m.directory('test/functional/helpful')
51
+ # Dir["#{dot}/templates/functional/*rb"].each{|file|
52
+ # f = file.split('/').slice(-2,2).join('/')
53
+ # m.file(f, "test/functional/helpful/#{File.basename(file)}")
54
+ # }
55
+ # m.directory('test/unit/helpful')
56
+ # Dir["#{dot}/templates/unit/*rb"].each{|file|
57
+ # f = file.split('/').slice(-2,2).join('/')
58
+ # m.file(f, "test/unit/helpful/#{File.basename(file)}")
59
+ # }
60
+ end
61
+ end
62
+
63
+ end
64
+ module Rails::Generator::Commands
65
+ class Create
66
+ def migration_template(relative_source,
67
+ relative_destination, template_options = {})
68
+ migration_directory relative_destination
69
+ migration_file_name = template_options[
70
+ :migration_file_name] || file_name
71
+ if migration_exists?(migration_file_name)
72
+ puts "Another migration is already named #{migration_file_name}: #{existing_migrations(migration_file_name).first}: Skipping"
73
+ else
74
+ template(relative_source, "#{relative_destination}/#{next_migration_string}_#{migration_file_name}.rb", template_options)
75
+ end
76
+ end
77
+ end # Create
78
+ class Base
79
+ protected
80
+ # the loop through migrations happens so fast
81
+ # that they all have the same timestamp which
82
+ # won't work when you actually try to migrate.
83
+ # All the timestamps MUST be unique.
84
+ def next_migration_string(padding = 3)
85
+ @s = (!@s.nil?)? @s.to_i + 1 : if ActiveRecord::Base.timestamped_migrations
86
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
87
+ else
88
+ "%.#{padding}d" % next_migration_number
89
+ end
90
+ end
91
+ end # Base
92
+ end
@@ -0,0 +1,2 @@
1
+ # From `script/generate simply_helpful` ...
2
+ require 'simply_helpful/autotest'
@@ -0,0 +1,72 @@
1
+ jQuery(function(){
2
+
3
+ /*
4
+ 'clicking' a submit button apparently skips the 'submit' method
5
+ which then skips the destroy confirmation, so we need to explicitly
6
+ catch the click and manually submit to trigger the confirmation.
7
+ */
8
+ jQuery('form.destroy_link_to input[type=submit]').click(function(){
9
+ jQuery(this).parents('form').submit();
10
+ return false;
11
+ });
12
+
13
+ jQuery('form.destroy_link_to').submit(function(){
14
+ var message = "Destroy? Seriously?"
15
+ if( this.confirm && this.confirm.value ) {
16
+ message = this.confirm.value
17
+ }
18
+ if( !confirm(message) ){
19
+ return false;
20
+ }
21
+ });
22
+
23
+ jQuery('p.flash').click(function(){$(this).remove();});
24
+
25
+ if( typeof jQuery('.datepicker').datepicker == 'function' ){
26
+ jQuery('.datepicker').datepicker();
27
+ }
28
+
29
+ jQuery('form a.submit.button').siblings('input[type=submit]').hide();
30
+
31
+ jQuery('form a.submit.button').click(function(){
32
+ if( jQuery(this).next('input[type=submit]').length > 0 ){
33
+ jQuery(this).next().click();
34
+ } else {
35
+ jQuery(this).parents('form').submit();
36
+ }
37
+ return false;
38
+ });
39
+
40
+ });
41
+
42
+
43
+ jQuery(window).resize(function(){
44
+ resize_text_areas()
45
+ });
46
+
47
+ jQuery(window).load(function(){
48
+ /*
49
+ This MUST be in window/load, not the normal document/ready,
50
+ for Google Chrome to get correct values
51
+ */
52
+ resize_text_areas()
53
+ });
54
+
55
+ function resize_text_areas() {
56
+ /*
57
+ jQuery('textarea.autosize').each(function(){
58
+ */
59
+ jQuery('.autosize').each(function(){
60
+ new_width = $(this).parent().innerWidth() +
61
+ $(this).parent().position().left -
62
+ $(this).position().left -
63
+ parseInt($(this).css('margin-left')) -
64
+ parseInt($(this).css('margin-right')) -
65
+ parseInt($(this).css('padding-left')) -
66
+ parseInt($(this).css('padding-right')) -
67
+ parseInt($(this).css('border-left-width')) -
68
+ parseInt($(this).css('border-right-width') )
69
+ $(this).css('width',new_width-10) /* take 10 more for good measure */
70
+ })
71
+ }
72
+
@@ -0,0 +1,6 @@
1
+ # From `script/generate simply_helpful` ...
2
+ unless Gem.source_index.find_name('jakewendt-simply_helpful').empty?
3
+ gem 'jakewendt-simply_helpful'
4
+ require 'simply_helpful/tasks'
5
+ require 'simply_helpful/test_tasks'
6
+ end
@@ -0,0 +1,48 @@
1
+ .flash {
2
+ /* http://css-radius.heroku.com */
3
+ -webkit-border-radius: 8px;
4
+ -moz-border-radius: 8px;
5
+ border-radius: 8px;
6
+ padding: 0.7em;
7
+ text-align: center;
8
+ font-weight: bold;
9
+ font-size: 12pt;
10
+ }
11
+ .flash.error,
12
+ .flash#error {
13
+ border: 2px solid #F44;
14
+ background-color: #FCC;
15
+ }
16
+ .flash.warn,
17
+ .flash#warn {
18
+ border: 2px solid #FF6600;
19
+ background-color: #FFCC99;
20
+ }
21
+ .flash.notice,
22
+ .flash#notice {
23
+ border: 2px solid #4F4;
24
+ background-color: #CFC;
25
+ }
26
+ .flash.noscript,
27
+ .flash#noscript {
28
+ border: 2px solid #FF8C00;
29
+ background-color: #FFC5AF;
30
+ }
31
+
32
+
33
+ a.button {
34
+ /* http://css-radius.heroku.com */
35
+ -webkit-border-radius: 10px;
36
+ -moz-border-radius: 10px;
37
+ border-radius: 10px;
38
+ border: 1px solid gray;
39
+ text-decoration:none;
40
+ padding: 1px 8px;
41
+ color:black;
42
+
43
+ /* for webkit browsers */
44
+ background: -webkit-gradient(linear, left top, left bottom, from(#EEEEEE), to(#CCCCCC));
45
+ /* for firefox 3.6+ */
46
+ background: -moz-linear-gradient(top, #EEEEEE, #CCCCCC);
47
+ }
48
+
@@ -0,0 +1 @@
1
+ require 'simply_helpful'
@@ -0,0 +1,6 @@
1
+ module SimplyHelpful
2
+ # predefine my namespace
3
+ end
4
+ require 'action_view'
5
+ require 'simply_helpful/rails_helpers.rb'
6
+ require 'simply_helpful/form_helper.rb'
@@ -0,0 +1,26 @@
1
+ class Autotest::Rails
2
+
3
+ #
4
+ # Need both the mapping and the extra files
5
+ #
6
+ def run_with_simply_helpful
7
+ add_exception %r%config/%
8
+ add_exception %r%versions/%
9
+ add_exception %r%\.git/%
10
+ self.extra_files << File.expand_path(File.join(
11
+ File.dirname(__FILE__),'/../../test/unit/helpful/'))
12
+
13
+ self.extra_files << File.expand_path(File.join(
14
+ File.dirname(__FILE__),'/../../test/functional/helpful/'))
15
+
16
+ add_mapping(
17
+ %r{^#{File.expand_path(File.join(File.dirname(__FILE__),'/../../test/'))}/(unit|functional)/helpful/.*_test\.rb$}
18
+ ) do |filename, _|
19
+ filename
20
+ end
21
+ run_without_simply_helpful
22
+ end
23
+ alias_method_chain :run, :simply_helpful
24
+
25
+
26
+ end
@@ -0,0 +1,254 @@
1
+ module SimplyHelpful::FormHelper
2
+
3
+ def mdy(date)
4
+ ( date.nil? ) ? '&nbsp;' : date.strftime("%m/%d/%Y")
5
+ end
6
+
7
+ def time_mdy(time)
8
+ ( time.nil? ) ? '&nbsp;' : time.strftime("%I:%M %p %m/%d/%Y")
9
+ end
10
+
11
+ def y_n_dk(value)
12
+ case value
13
+ when 1 then 'Yes'
14
+ when 2 then 'No'
15
+ when 999 then "Don't Know"
16
+ else '&nbsp;'
17
+ end
18
+ end
19
+ alias_method :yndk, :y_n_dk
20
+
21
+ def field_wrapper(method,options={},&block)
22
+ classes = [method,options[:class]].compact.join(' ')
23
+ s = "<div class='#{classes} field_wrapper'>\n"
24
+ s << yield
25
+ s << "\n</div><!-- class='#{classes}' -->"
26
+ end
27
+
28
+ # This is NOT a form field
29
+ def _wrapped_spans(object_name,method,options={})
30
+ s = "<span class='label'>#{options[:label_text]||method}</span>\n"
31
+ value = if options[:value]
32
+ options[:value]
33
+ else
34
+ object = instance_variable_get("@#{object_name}")
35
+ value = object.send(method)
36
+ value = (value.to_s.blank?)?'&nbsp;':value
37
+ end
38
+ s << "<span class='value'>#{value}</span>"
39
+ end
40
+
41
+ def _wrapped_y_n_dk_spans(object_name,method,options={})
42
+ object = instance_variable_get("@#{object_name}")
43
+ _wrapped_spans(object_name,method,options.update(
44
+ :value => y_n_dk(object.send(method)) ) )
45
+ end
46
+ alias_method :_wrapped_yndk_spans, :_wrapped_y_n_dk_spans
47
+
48
+ def _wrapped_date_spans(object_name,method,options={})
49
+ object = instance_variable_get("@#{object_name}")
50
+ _wrapped_spans(object_name,method,options.update(
51
+ :value => mdy(object.send(method)) ) )
52
+ end
53
+
54
+ def sex_select(object_name, method,
55
+ options={}, html_options={})
56
+ select(object_name, method,
57
+ [['male','M'],['female','F']],
58
+ options, html_options)
59
+ end
60
+ alias_method :gender_select, :sex_select
61
+
62
+ def date_text_field(object_name,method,options={})
63
+ format = options.delete(:format) || '%m/%d/%Y'
64
+ tmp_value = if options[:value].blank? #and !options[:object].nil?
65
+ object = options[:object]
66
+ tmp = object.send("#{method}") ||
67
+ object.send("#{method}_before_type_cast")
68
+ else
69
+ options[:value]
70
+ end
71
+ begin
72
+ options[:value] = tmp_value.to_date.try(:strftime,format)
73
+ rescue NoMethodError, ArgumentError
74
+ options[:value] = tmp_value
75
+ end
76
+ options.update(:class => [options[:class],'datepicker'].compact.join(' '))
77
+ text_field( object_name, method, options )
78
+ end
79
+
80
+ # This is NOT a form field
81
+ def _wrapped_yes_or_no_spans(object_name,method,options={})
82
+ object = instance_variable_get("@#{object_name}")
83
+ s = "<span class='label'>#{options[:label_text]||method}</span>\n"
84
+ value = (object.send("#{method}?"))?'Yes':'No'
85
+ s << "<span class='value'>#{value}</span>"
86
+ end
87
+
88
+ def y_n_dk_select(object_name, method,
89
+ options={}, html_options={})
90
+ select(object_name, method,
91
+ [['Yes',1],['No',2],["Don't Know",999]],
92
+ {:include_blank => true}.merge(options), html_options)
93
+ end
94
+ alias_method :yndk_select, :y_n_dk_select
95
+
96
+ def hour_select(object_name, method,
97
+ options={}, html_options={})
98
+ select(object_name, method,
99
+ (1..12),
100
+ {:include_blank => 'Hour'}.merge(options), html_options)
101
+ end
102
+
103
+ def minute_select(object_name, method,
104
+ options={}, html_options={})
105
+ minutes = (0..59).to_a.collect{|m|[sprintf("%02d",m),m]}
106
+ select(object_name, method,
107
+ minutes,
108
+ {:include_blank => 'Minute'}.merge(options), html_options)
109
+ end
110
+
111
+ def meridiem_select(object_name, method,
112
+ options={}, html_options={})
113
+ select(object_name, method,
114
+ ['AM','PM'],
115
+ {:include_blank => 'Meridiem'}.merge(options), html_options)
116
+ end
117
+
118
+ def self.included(base)
119
+ base.class_eval do
120
+ alias_method_chain( :method_missing, :wrapping
121
+ ) unless base.respond_to?(:method_missing_without_wrapping)
122
+ end
123
+ end
124
+
125
+ def method_missing_with_wrapping(symb,*args, &block)
126
+ method_name = symb.to_s
127
+ if method_name =~ /^wrapped_(.+)$/
128
+ unwrapped_method_name = $1
129
+ #
130
+ # It'd be nice to be able to genericize all of the
131
+ # wrapped_* methods since they are all basically
132
+ # the same.
133
+ # Strip of the "wrapped_"
134
+ # Label
135
+ # Call "unwrapped" method
136
+ #
137
+
138
+ object_name = args[0]
139
+ method = args[1]
140
+
141
+ content = field_wrapper(method,:class => unwrapped_method_name) do
142
+ s = if respond_to?(unwrapped_method_name)
143
+ options = args.detect{|i| i.is_a?(Hash) }
144
+ label_text = options.delete(:label_text) unless options.nil?
145
+ if unwrapped_method_name == 'check_box'
146
+ send("#{unwrapped_method_name}",*args,&block) <<
147
+ label( object_name, method, label_text )
148
+ else
149
+ label( object_name, method, label_text ) <<
150
+ send("#{unwrapped_method_name}",*args,&block)
151
+ end
152
+ else
153
+ send("_#{method_name}",*args,&block)
154
+ end
155
+
156
+ s << (( block_given? )? capture(&block) : '')
157
+ # send("_#{method_name}",*args) <<
158
+ # (( block_given? )? capture(&block) : '')
159
+ end
160
+ if block_called_from_erb?(block)
161
+ concat(content)
162
+ else
163
+ content
164
+ end
165
+ else
166
+ method_missing_without_wrapping(symb,*args, &block)
167
+ end
168
+ end
169
+
170
+ end
171
+ ActionView::Base.send(:include, SimplyHelpful::FormHelper)
172
+
173
+
174
+
175
+ ActionView::Helpers::FormBuilder.class_eval do
176
+
177
+ def submit_link_to(value=nil,options={})
178
+ # submit_link_to will remove :value, which is intended for submit
179
+ # so it MUST be executed first. Unfortunately, my javascript
180
+ # expects it to be AFTER the a tag.
181
+ # s = submit(value,options.reverse_merge(
182
+ # :id => "#{object_name}_submit_#{value.try(:downcase).try(:gsub,/\s+/,'_')}"
183
+ # ) ) << @template.submit_link_to(value,nil,options)
184
+ s1 = submit(value,options.reverse_merge(
185
+ :id => "#{object_name}_submit_#{value.try(:downcase).try(
186
+ :gsub,/\s+/,'_').try(
187
+ :gsub,/(&amp;|'|\/)/,'').try(
188
+ :gsub,/_+/,'_')}"
189
+ ) )
190
+ s2 = @template.submit_link_to(value,nil,options)
191
+ s2 << s1
192
+ end
193
+
194
+ def hour_select(method,options={},html_options={})
195
+ @template.hour_select(
196
+ @object_name, method,
197
+ objectify_options(options),
198
+ html_options)
199
+ end
200
+
201
+ def minute_select(method,options={},html_options={})
202
+ @template.minute_select(
203
+ @object_name, method,
204
+ objectify_options(options),
205
+ html_options)
206
+ end
207
+
208
+ def meridiem_select(method,options={},html_options={})
209
+ @template.meridiem_select(
210
+ @object_name, method,
211
+ objectify_options(options),
212
+ html_options)
213
+ end
214
+
215
+ def sex_select(method,options={},html_options={})
216
+ @template.sex_select(
217
+ @object_name, method,
218
+ objectify_options(options),
219
+ html_options)
220
+ end
221
+ alias_method :gender_select, :sex_select
222
+
223
+ def date_text_field(method, options = {})
224
+ @template.date_text_field(
225
+ @object_name, method, objectify_options(options))
226
+ end
227
+
228
+ def y_n_dk_select(method,options={},html_options={})
229
+ @template.y_n_dk_select(
230
+ @object_name, method,
231
+ objectify_options(options),
232
+ html_options)
233
+ end
234
+ alias_method :yndk_select, :y_n_dk_select
235
+
236
+ def method_missing_with_wrapping(symb,*args, &block)
237
+ method_name = symb.to_s
238
+ if method_name =~ /^wrapped_(.+)$/
239
+ i = args.find_index{|i| i.is_a?(Hash) }
240
+ if i.nil?
241
+ args.push(objectify_options({}))
242
+ else
243
+ args[i] = objectify_options(args[i])
244
+ end
245
+ @template.send(method_name,@object_name,*args,&block)
246
+ else
247
+ method_missing_without_wrapping(symb,*args, &block)
248
+ end
249
+ end
250
+
251
+ alias_method_chain( :method_missing, :wrapping
252
+ ) unless respond_to?(:method_missing_without_wrapping)
253
+
254
+ end
@@ -0,0 +1,123 @@
1
+ module SimplyHelpful::RailsHelpers
2
+
3
+ # Just add the classes 'submit' and 'button'
4
+ # for styling and function
5
+ def submit_link_to(*args,&block)
6
+ html_options = if block_given?
7
+ args[1] ||= {}
8
+ else
9
+ args[2] ||= {}
10
+ end
11
+ html_options.delete(:value) # possible key meant for submit button
12
+ html_options.delete('value') # possible key meant for submit button
13
+ ( html_options[:class] ||= '' ) << ' submit button'
14
+ link_to( *args, &block )
15
+ end
16
+
17
+
18
+ def form_link_to( title, url, options={}, &block )
19
+ # "action='#{url}' " <<
20
+ extra_tags = extra_tags_for_form(options)
21
+ s = "\n" <<
22
+ "<form " <<
23
+ "class='#{options.delete(:class)||'form_link_to'}' " <<
24
+ "action='#{url_for(url)}' " <<
25
+ "method='#{options.delete('method')}'>\n" <<
26
+ extra_tags << "\n"
27
+ s << (( block_given? )? capture(&block) : '')
28
+ s << submit_tag(title, :name => nil ) << "\n" <<
29
+ "</form>\n"
30
+ if block_called_from_erb?(block)
31
+ concat(s)
32
+ else
33
+ s
34
+ end
35
+ end
36
+
37
+ def destroy_link_to( title, url, options={}, &block )
38
+ s = form_link_to( title, url, options.merge(
39
+ 'method' => 'delete',
40
+ :class => 'destroy_link_to'
41
+ ),&block )
42
+ end
43
+
44
+ def aws_image_tag(image,options={})
45
+ # in console @controller is nil
46
+ protocol = @controller.try(:request).try(:protocol) || 'http://'
47
+ host = 's3.amazonaws.com/'
48
+ bucket = ( defined?(RAILS_APP_NAME) && RAILS_APP_NAME ) || 'ccls'
49
+ src = "#{protocol}#{host}#{bucket}/images/#{image}"
50
+ alt = options.delete(:alt) || options.delete('alt') || image
51
+ tag('img',options.merge({:src => src, :alt => alt}))
52
+ end
53
+
54
+ # This style somehow for some reason actually submits the request TWICE?
55
+ # In many cases, this is no big deal, but when using it to send
56
+ # emails or something, the controller/action is called twice
57
+ # resulting in 2 emails (if that's what your action does)
58
+ # I'd really like to understand why.
59
+ def button_link_to( title, url, options={} )
60
+ classes = ['link']
61
+ classes << options[:class]
62
+ s = "<a href='#{url_for(url)}' style='text-decoration:none;'>"
63
+ s << "<button type='button'>"
64
+ s << title
65
+ s << "</button></a>\n"
66
+ end
67
+
68
+ # This creates a button that looks like a submit button
69
+ # but is just a javascript controlled link.
70
+ # I don't like it.
71
+ def old_button_link_to( title, url, options={} )
72
+ # id = "id='#{options[:id]}'" unless options[:id].blank?
73
+ # klass = if options[:class].blank?
74
+ # "class='link'"
75
+ # else
76
+ # "class='#{options[:class]}'"
77
+ # end
78
+ # s = "<button #{id} #{klass} type='button'>"
79
+ classes = ['link']
80
+ classes << options[:class]
81
+ s = "<button class='#{classes.flatten.join(' ')}' type='button'>"
82
+ s << "<span class='href' style='display:none;'>"
83
+ s << url_for(url)
84
+ s << "</span>"
85
+ s << title
86
+ s << "</button>"
87
+ s
88
+ end
89
+
90
+ def flasher
91
+ s = ''
92
+ flash.each do |key, msg|
93
+ s << content_tag( :p, msg, :id => key, :class => 'flash' )
94
+ s << "\n"
95
+ end
96
+ s << "<noscript><p id='noscript' class='flash'>\n"
97
+ s << "Javascript is required for this site to be fully functional.\n"
98
+ s << "</p></noscript>\n"
99
+ end
100
+
101
+ # Created to stop multiple entries of same stylesheet
102
+ def stylesheets(*args)
103
+ @stylesheets ||= []
104
+ args.each do |stylesheet|
105
+ unless @stylesheets.include?(stylesheet.to_s)
106
+ @stylesheets.push(stylesheet.to_s)
107
+ content_for(:head,stylesheet_link_tag(stylesheet.to_s))
108
+ end
109
+ end
110
+ end
111
+
112
+ def javascripts(*args)
113
+ @javascripts ||= []
114
+ args.each do |javascript|
115
+ unless @javascripts.include?(javascript.to_s)
116
+ @javascripts.push(javascript.to_s)
117
+ content_for(:head,javascript_include_tag(javascript).to_s)
118
+ end
119
+ end
120
+ end
121
+
122
+ end
123
+ ActionView::Base.send(:include, SimplyHelpful::RailsHelpers)
@@ -0,0 +1 @@
1
+ Dir["#{File.dirname(__FILE__)}/../tasks/**/*.rake"].sort.each { |ext| load ext }
@@ -0,0 +1,62 @@
1
+ module SimplyHelpful;end
2
+ namespace :test do
3
+ namespace :units do
4
+ Rake::TestTask.new(:simply_helpful => "db:test:prepare") do |t|
5
+ t.pattern = File.expand_path(File.join(
6
+ File.dirname(__FILE__),'/../../test/unit/helpful/*_test.rb'))
7
+ t.libs << "test"
8
+ t.verbose = true
9
+ end
10
+ end
11
+ namespace :functionals do
12
+ Rake::TestTask.new(:simply_helpful => "db:test:prepare") do |t|
13
+ t.pattern = File.expand_path(File.join(
14
+ File.dirname(__FILE__),'/../../test/functional/helpful/*_test.rb'))
15
+ t.libs << "test"
16
+ t.verbose = true
17
+ end
18
+ end
19
+ end
20
+ Rake::Task['test:functionals'].prerequisites.unshift(
21
+ "test:functionals:simply_helpful" )
22
+ Rake::Task['test:units'].prerequisites.unshift(
23
+ "test:units:simply_helpful" )
24
+
25
+ # I thought of possibly just including this file
26
+ # but that would make __FILE__ different.
27
+ # Hmmm
28
+
29
+ #
30
+ # used in simply_helpful's rake test:coverage to run gem's
31
+ # tests in the context of the application
32
+ #
33
+ @gem_test_dirs ||= []
34
+ #@gem_test_dirs << File.expand_path(File.join(File.dirname(__FILE__),
35
+ # '/../../test/unit/helpful/'))
36
+
37
+
38
+ #
39
+ # No functional tests so...
40
+ #
41
+ #/Library/Ruby/Gems/1.8/gems/rcov-0.9.9/bin/rcov:516:in `load': no such file to load -- /Library/Ruby/Gems/1.8/gems/jakewendt-simply_helpful-2.2.12/test/functional/helpful/*_test.rb (LoadError)
42
+ # from /Library/Ruby/Gems/1.8/gems/rcov-0.9.9/bin/rcov:516
43
+ # from /usr/bin/rcov:19:in `load'
44
+ # from /usr/bin/rcov:19
45
+ #
46
+ # Actually, I think the error is because the directory isn't there
47
+ # because there aren't any files in the gem in that directory.
48
+ # Perhaps I could try to force it. Until then, comment this line out.
49
+ #
50
+ #@gem_test_dirs << File.expand_path(File.join(File.dirname(__FILE__),
51
+ # '/../../test/functional/helpful/'))
52
+
53
+ #
54
+ # More flexible. Find all test files, pick out their dir, uniq 'em and add.
55
+ #
56
+ Dir.glob( File.expand_path(File.join(File.dirname(__FILE__),
57
+ '/../../test/*/helpful/*_test.rb'))
58
+ ).collect{|f|
59
+ File.dirname(f)
60
+ }.uniq.each{ |dir|
61
+ @gem_test_dirs << dir
62
+ }
@@ -0,0 +1,52 @@
1
+ namespace :db do
2
+
3
+ desc "Create yml fixtures for given model in database\n" <<
4
+ "rake db:extract_fixtures_from pages"
5
+ task :extract_fixtures_from => :environment do
6
+ me = $*.shift
7
+ while( table_name = $*.shift )
8
+ File.open("#{RAILS_ROOT}/db/#{table_name}.yml", 'w') do |file|
9
+ data = table_name.singularize.capitalize.constantize.find(
10
+ :all).collect(&:attributes)
11
+ file.write data.inject({}) { |hash, record|
12
+ record.delete('created_at')
13
+ record.delete('updated_at')
14
+ hash["#{table_name}_#{record['id']}"] = record
15
+ hash
16
+ }.to_yaml
17
+ end
18
+ end
19
+ exit
20
+ end
21
+
22
+ desc "Dump MYSQL table descriptions."
23
+ task :describe => :environment do
24
+ puts
25
+ puts "FYI: This task ONLY works on MYSQL databases."
26
+ puts
27
+ config = ActiveRecord::Base.connection.instance_variable_get(:@config)
28
+ #=> {:adapter=>"mysql", :host=>"localhost", :password=>nil, :username=>"root", :database=>"my_development", :encoding=>"utf8"}
29
+
30
+ tables = ActiveRecord::Base.connection.execute('show tables;')
31
+ while( table = tables.fetch_row ) do
32
+ puts "Table: #{table}"
33
+
34
+ # may have to include host and port
35
+ system("mysql --table=true " <<
36
+ "--user=#{config[:username]} " <<
37
+ "--password='#{config[:password]}' " <<
38
+ "--execute='describe #{table}' " <<
39
+ config[:database]);
40
+
41
+ #
42
+ # mysql formats the table well so doing it by hand is something that
43
+ # will have to wait until I feel like wasting my time
44
+ #
45
+ # columns = ActiveRecord::Base.connection.execute("describe #{table};")
46
+ # while( column = columns.fetch_hash ) do
47
+ # puts column.keys Extra Default Null Type Field Key
48
+ # end
49
+ end
50
+ end
51
+
52
+ end
@@ -0,0 +1,52 @@
1
+ #
2
+ # This is from Advanced Rails Recipes, page 277
3
+ #
4
+ namespace :test do
5
+
6
+ desc 'Tracks test coverage with rcov'
7
+ task :coverage do
8
+ rm_f "coverage"
9
+ rm_f "coverage.data"
10
+
11
+ unless PLATFORM['i386-mswin32']
12
+ rcov = "rcov --sort coverage --rails --aggregate coverage.data " <<
13
+ "--text-summary -Ilib:test -T "
14
+ # exclusions are ...
15
+ # -x, --exclude PATTERNS Don't generate info for files matching a
16
+ # pattern (comma-separated regexp list)
17
+ exclusions = ['gems/','db/.*schema.rb','db/migrate']
18
+ exclusions += RCOV_EXCLUDES if defined?(RCOV_EXCLUDES)
19
+ puts "Excluding : #{exclusions.join(',')}"
20
+ rcov << "-x #{exclusions.join(',')}"
21
+ # "-x gems/*,db/migrate/*,jrails/*/*"
22
+ # ',\(eval\),\(recognize_optimized\),\(erb\)' << # needed in jruby
23
+ # ",yaml,yaml/*,lib/tmail/parser.y,jruby.jar!/*" << # needed in jruby
24
+ # ",db/*schema.rb"
25
+ # ",html_test/*/*" <<
26
+ # ",html_test_extension/*/*"
27
+ else
28
+ rcov = "rcov.cmd --sort coverage --rails --aggregate " <<
29
+ "coverage.data --text-summary -Ilib -T"
30
+ end
31
+
32
+ dirs = Dir.glob("test/**/*_test.rb").collect{|f|File.dirname(f)}.uniq
33
+ if defined?(@gem_test_dirs) && @gem_test_dirs.is_a?(Array)
34
+ dirs += @gem_test_dirs
35
+ end
36
+ lastdir = dirs.pop
37
+ dirs.each do |dir|
38
+ system("#{rcov} --no-html #{dir}/*_test.rb")
39
+ end
40
+ system("#{rcov} --html #{lastdir}/*_test.rb") unless lastdir.nil?
41
+
42
+ unless PLATFORM['i386-mswin32']
43
+ # jruby-1.5.0.RC1 > PLATFORM
44
+ # => "java"
45
+ # system("open coverage/index.html") if PLATFORM['darwin']
46
+ system("open coverage/index.html")
47
+ else
48
+ system("\"C:/Program Files/Mozilla Firefox/firefox.exe\" " +
49
+ "coverage/index.html")
50
+ end
51
+ end
52
+ end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'jakewendt-simply_helpful'
@@ -0,0 +1,16 @@
1
+ class ApplicationController < ActionController::Base
2
+
3
+ helper :all # include all helpers, all the time
4
+
5
+ # See ActionController::RequestForgeryProtection for details
6
+ protect_from_forgery
7
+
8
+ def redirections
9
+ @redirections ||= HashWithIndifferentAccess.new({
10
+ :not_be_user => {
11
+ :redirect_to => user_path(current_user)
12
+ }
13
+ })
14
+ end
15
+
16
+ end
@@ -0,0 +1,10 @@
1
+ class HomeController < ApplicationController
2
+
3
+ skip_before_filter :login_required
4
+
5
+ def show
6
+ render :text => "You are home.",
7
+ :layout => true
8
+ end
9
+
10
+ end
@@ -0,0 +1,6 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+
3
+ map.resource :home, :only => :show
4
+ map.root :controller => :home, :action => :show
5
+
6
+ end
@@ -0,0 +1,192 @@
1
+ #require File.dirname(__FILE__) + '/../../test_helper'
2
+ require 'test_helper'
3
+
4
+ class SimplyHelpful::User
5
+ attr_accessor :yes_or_no, :yndk, :dob, :sex, :name, :dob_before_type_cast
6
+ def initialize(*args,&block)
7
+ yield self if block_given?
8
+ end
9
+ def yes_or_no?
10
+ !!yes_or_no
11
+ end
12
+ end
13
+
14
+ class SimplyHelpful::FormHelperTest < ActionView::TestCase
15
+
16
+ test "field_wrapper" do
17
+ response = HTML::Document.new(
18
+ field_wrapper('mymethod') do
19
+ 'Yield'
20
+ end).root
21
+ #<div class="mymethod field_wrapper">
22
+ #Yield
23
+ #</div><!-- class='mymethod' -->
24
+ assert_select response, 'div.mymethod.field_wrapper'
25
+ end
26
+
27
+ test "wrapped_spans without options" do
28
+ @user = SimplyHelpful::User.new
29
+ response = HTML::Document.new(
30
+ wrapped_spans(:user, :name)).root
31
+ #<div class="name field_wrapper">
32
+ #<span class="label">name</span>
33
+ #<span class="value">&nbsp;</span>
34
+ #</div><!-- class='name' -->
35
+ assert_select response, 'div.name.field_wrapper', 1 do
36
+ assert_select 'span.label', 1
37
+ assert_select 'span.value', 1
38
+ end
39
+ end
40
+
41
+ test "wrapped_yes_or_no_spans blank" do
42
+ @user = SimplyHelpful::User.new
43
+ response = HTML::Document.new(
44
+ wrapped_yes_or_no_spans(:user, :yes_or_no)).root
45
+ #<div class="yes_or_no field_wrapper">
46
+ #<span class="label">yes_or_no</span>
47
+ #<span class="value">no</span>
48
+ #</div><!-- class='yes_or_no' -->
49
+ assert_select response, 'div.yes_or_no.field_wrapper' do
50
+ assert_select 'span.label','yes_or_no',1
51
+ assert_select 'span.value','No',1
52
+ end
53
+ end
54
+
55
+ test "wrapped_yes_or_no_spans true" do
56
+ @user = SimplyHelpful::User.new{|u| u.yes_or_no = true }
57
+ response = HTML::Document.new(
58
+ wrapped_yes_or_no_spans(:user, :yes_or_no)).root
59
+ #<div class="yes_or_no field_wrapper">
60
+ #<span class="label">yes_or_no</span>
61
+ #<span class="value">yes</span>
62
+ #</div><!-- class='yes_or_no' -->
63
+ assert_select response, 'div.yes_or_no.field_wrapper' do
64
+ assert_select 'span.label','yes_or_no',1
65
+ assert_select 'span.value','Yes',1
66
+ end
67
+ end
68
+
69
+ test "wrapped_yes_or_no_spans false" do
70
+ @user = SimplyHelpful::User.new(:yes_or_no => false)
71
+ response = HTML::Document.new(
72
+ wrapped_yes_or_no_spans(:user, :yes_or_no)).root
73
+ #<div class="yes_or_no field_wrapper">
74
+ #<span class="label">yes_or_no</span>
75
+ #<span class="value">no</span>
76
+ #</div><!-- class='yes_or_no' -->
77
+ assert_select response, 'div.yes_or_no.field_wrapper' do
78
+ assert_select 'span.label','yes_or_no',1
79
+ assert_select 'span.value','No',1
80
+ end
81
+ end
82
+
83
+ test "wrapped_sex_select" do
84
+ @user = SimplyHelpful::User.new
85
+ response = HTML::Document.new(
86
+ wrapped_sex_select(:user, :sex)).root
87
+ #<div class="sex field_wrapper">
88
+ #<label for="user_sex">Sex</label><select id="user_sex" name="user[sex]"><option value="M">male</option>
89
+ #<option value="F">female</option></select>
90
+ #</div><!-- class='sex' -->
91
+ assert_select response, 'div.sex.field_wrapper', 1 do
92
+ assert_select 'label[for=user_sex]','Sex',1
93
+ assert_select "select#user_sex[name='user[sex]']" do
94
+ assert_select 'option[value=M]', 'male'
95
+ assert_select 'option[value=F]', 'female'
96
+ end
97
+ end
98
+ end
99
+
100
+ test "wrapped_gender_select" do
101
+ @user = SimplyHelpful::User.new
102
+ response = HTML::Document.new(
103
+ wrapped_gender_select(:user, :sex)).root
104
+ #<div class="sex field_wrapper">
105
+ #<label for="user_sex">Sex</label><select id="user_sex" name="user[sex]"><option value="M">male</option>
106
+ #<option value="F">female</option></select>
107
+ #</div><!-- class='sex' -->
108
+ assert_select response, 'div.sex.field_wrapper', 1 do
109
+ assert_select 'label[for=user_sex]','Sex',1
110
+ assert_select "select#user_sex[name='user[sex]']" do
111
+ assert_select 'option[value=M]', 'male'
112
+ assert_select 'option[value=F]', 'female'
113
+ end
114
+ end
115
+ end
116
+
117
+ test "wrapped_date_text_field" do
118
+ @user = SimplyHelpful::User.new
119
+ response = HTML::Document.new(
120
+ wrapped_date_text_field(:user,:dob, :object => @user)).root
121
+ #<div class="dob field_wrapper">
122
+ #<label for="user_dob">Dob</label><input id="user_dob" name="user[dob]" size="30" type="text" />
123
+ #</div><!-- class='dob' -->
124
+ assert_select response, 'div.dob.field_wrapper', 1 do
125
+ assert_select 'label[for=user_dob]','Dob', 1
126
+ assert_select "input#user_dob[name='user[dob]']"
127
+ end
128
+ end
129
+
130
+ test "wrapped_date_text_field with invalid dob" do
131
+ @user = SimplyHelpful::User.new
132
+ @user.dob = "07181989"
133
+ # will raise ...
134
+ #ArgumentError: invalid date
135
+ # /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/date.rb:752:in `new'
136
+ # lib/simply_helpful/form_helper.rb:67:in `date_text_field'
137
+ # lib/simply_helpful/form_helper.rb:123:in `send'
138
+ # lib/simply_helpful/form_helper.rb:123:in `method_missing'
139
+ # lib/simply_helpful/form_helper.rb:19:in `field_wrapper'
140
+ # lib/simply_helpful/form_helper.rb:114:in `method_missing'
141
+ # /test/unit/helpful/form_helper_test.rb:134:in `test_wrapped_date_text_field_with_invalid_dob'
142
+ #
143
+ response = HTML::Document.new(
144
+ wrapped_date_text_field(:user,:dob, :object => @user)).root
145
+ #<div class="dob field_wrapper">
146
+ #<label for="user_dob">Dob</label><input id="user_dob" name="user[dob]" size="30" type="text" />
147
+ #</div><!-- class='dob' -->
148
+ assert_select response, 'div.dob.field_wrapper', 1 do
149
+ assert_select 'label[for=user_dob]','Dob', 1
150
+ assert_select "input#user_dob[name='user[dob]']"
151
+ end
152
+ end
153
+
154
+ test "wrapped_y_n_dk_select" do
155
+ @user = SimplyHelpful::User.new
156
+ response = HTML::Document.new(
157
+ wrapped_y_n_dk_select(:user, :yndk)).root
158
+ #<div class="yndk field_wrapper">
159
+ #<label for="user_yndk">Yndk</label><select id="user_yndk" name="user[yndk]"><option value="1">Yes</option>
160
+ #<option value="2">No</option>
161
+ #<option value="999">Don't Know</option></select>
162
+ #</div><!-- class='yndk' -->
163
+ assert_select response, 'div.yndk.field_wrapper', 1 do
164
+ assert_select 'label[for=user_yndk]','Yndk',1
165
+ assert_select "select#user_yndk[name='user[yndk]']" do
166
+ assert_select 'option[value=1]', 'Yes'
167
+ assert_select 'option[value=2]', 'No'
168
+ assert_select 'option[value=999]', "Don't Know"
169
+ end
170
+ end
171
+ end
172
+
173
+ test "wrapped_yndk_select" do
174
+ @user = SimplyHelpful::User.new
175
+ response = HTML::Document.new(
176
+ wrapped_yndk_select(:user, :yndk)).root
177
+ #<div class="yndk field_wrapper">
178
+ #<label for="user_yndk">Yndk</label><select id="user_yndk" name="user[yndk]"><option value="1">Yes</option>
179
+ #<option value="2">No</option>
180
+ #<option value="999">Don't Know</option></select>
181
+ #</div><!-- class='yndk' -->
182
+ assert_select response, 'div.yndk.field_wrapper', 1 do
183
+ assert_select 'label[for=user_yndk]','Yndk',1
184
+ assert_select "select#user_yndk[name='user[yndk]']" do
185
+ assert_select 'option[value=1]', 'Yes'
186
+ assert_select 'option[value=2]', 'No'
187
+ assert_select 'option[value=999]', "Don't Know"
188
+ end
189
+ end
190
+ end
191
+
192
+ end
@@ -0,0 +1,121 @@
1
+ #require File.dirname(__FILE__) + '/../../test_helper'
2
+ require 'test_helper'
3
+
4
+ class SimplyHelpful::RailsHelpersTest < ActionView::TestCase
5
+
6
+ def flash
7
+ {:notice => "Hello There"}
8
+ end
9
+ # delegate :flash, :to => :controller
10
+
11
+ test "form_link_to with block" do
12
+ response = HTML::Document.new(
13
+ form_link_to('mytitle','/myurl') do
14
+ hidden_field_tag('apple','orange')
15
+ end).root
16
+ #<form class='form_link_to' action='/myurl' method='post'>
17
+ #<input id="apple" name="apple" type="hidden" value="orange" />
18
+ #<input type="submit" value="mytitle" />
19
+ #</form>
20
+ assert_select response, 'form.form_link_to[action=/myurl]', 1 do
21
+ assert_select 'input', 2
22
+ end
23
+ end
24
+
25
+ test "form_link_to without block" do
26
+ response = HTML::Document.new(form_link_to('mytitle','/myurl')).root
27
+ assert_select response, 'form.form_link_to[action=/myurl]', 1 do
28
+ assert_select 'input', 1
29
+ end
30
+ #<form class="form_link_to" action="/myurl" method="post">
31
+ #<input type="submit" value="mytitle" />
32
+ #</form>
33
+ end
34
+
35
+ test "destroy_link_to with block" do
36
+ response = HTML::Document.new(
37
+ destroy_link_to('mytitle','/myurl') do
38
+ hidden_field_tag('apple','orange')
39
+ end).root
40
+ #<form class="destroy_link_to" action="/myurl" method="post">
41
+ #<div style="margin:0;padding:0;display:inline"><input name="_method" type="hidden" value="delete" /></div>
42
+ #<input id="apple" name="apple" type="hidden" value="orange" /><input type="submit" value="mytitle" />
43
+ #</form>
44
+ assert_select response, 'form.destroy_link_to[action=/myurl]', 1 do
45
+ assert_select 'div', 1 do
46
+ assert_select 'input[name=_method][value=delete]',1
47
+ end
48
+ assert_select 'input', 3
49
+ end
50
+ end
51
+
52
+ test "destroy_link_to without block" do
53
+ response = HTML::Document.new(destroy_link_to('mytitle','/myurl')).root
54
+ #<form class="destroy_link_to" action="/myurl" method="post">
55
+ #<div style="margin:0;padding:0;display:inline"><input name="_method" type="hidden" value="delete" /></div>
56
+ #<input type="submit" value="mytitle" />
57
+ #</form>
58
+ assert_select response, 'form.destroy_link_to[action=/myurl]', 1 do
59
+ assert_select 'div', 1 do
60
+ assert_select 'input[name=_method][value=delete]',1
61
+ end
62
+ assert_select 'input', 2
63
+ end
64
+ end
65
+
66
+ test "button_link_to without block" do
67
+ response = HTML::Document.new(button_link_to('mytitle','/myurl')).root
68
+ assert_select response, 'a[href=/myurl]', 1 do
69
+ assert_select 'button[type=button]', 1
70
+ end
71
+ #<a href="/myurl" style="text-decoration:none;"><button type="button">mytitle</button></a>
72
+ end
73
+
74
+ test "aws_image_tag" do
75
+ response = HTML::Document.new(
76
+ aws_image_tag('myimage')
77
+ ).root
78
+ bucket = ( defined?(RAILS_APP_NAME) && RAILS_APP_NAME ) || 'ccls'
79
+ #<img alt="myimage" src="http://s3.amazonaws.com/ccls/images/myimage" />
80
+ assert_select response, "img[src=http://s3.amazonaws.com/#{bucket}/images/myimage]", 1
81
+ end
82
+
83
+ test "flasher" do
84
+ response = HTML::Document.new(
85
+ flasher
86
+ ).root
87
+ #<p class="flash" id="notice">Hello There</p>
88
+ #<noscript>
89
+ #<p id="noscript" class="flash">Javascript is required for this site to be fully functional.</p>
90
+ #</noscript>
91
+ assert_select response, 'p#notice.flash'
92
+ assert_select response, 'noscript' do
93
+ assert_select 'p#noscript.flash'
94
+ end
95
+ end
96
+
97
+ test "javascripts" do
98
+ assert_nil @javascripts
99
+ javascripts('myjavascript')
100
+ assert @javascripts.include?('myjavascript')
101
+ assert_equal 1, @javascripts.length
102
+ javascripts('myjavascript')
103
+ assert_equal 1, @javascripts.length
104
+ #<script src="/javascripts/myjavascript.js" type="text/javascript"></script>
105
+ response = HTML::Document.new( @content_for_head).root
106
+ assert_select response, 'script[src=/javascripts/myjavascript.js]'
107
+ end
108
+
109
+ test "stylesheets" do
110
+ assert_nil @stylesheets
111
+ stylesheets('mystylesheet')
112
+ assert @stylesheets.include?('mystylesheet')
113
+ assert_equal 1, @stylesheets.length
114
+ stylesheets('mystylesheet')
115
+ assert_equal 1, @stylesheets.length
116
+ #<link href="/stylesheets/mystylesheet.css" media="screen" rel="stylesheet" type="text/css" />
117
+ response = HTML::Document.new( @content_for_head).root
118
+ assert_select response, 'link[href=/stylesheets/mystylesheet.css]'
119
+ end
120
+
121
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jakewendt-simply_helpful
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 2
8
+ - 2
9
+ - 14
10
+ version: 2.2.14
11
+ platform: ruby
12
+ authors:
13
+ - George 'Jake' Wendt
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-08-10 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rails
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 2
32
+ version: "2"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: jakewendt-rails_extension
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ description: longer description of your gem
50
+ email: github@jake.otherinbox.com
51
+ executables: []
52
+
53
+ extensions: []
54
+
55
+ extra_rdoc_files:
56
+ - README.rdoc
57
+ files:
58
+ - generators/simply_helpful/USAGE
59
+ - generators/simply_helpful/simply_helpful_generator.rb
60
+ - generators/simply_helpful/templates/autotest_simply_helpful.rb
61
+ - generators/simply_helpful/templates/javascripts/simply_helpful.js
62
+ - generators/simply_helpful/templates/simply_helpful.rake
63
+ - generators/simply_helpful/templates/stylesheets/simply_helpful.css
64
+ - lib/jakewendt-simply_helpful.rb
65
+ - lib/simply_helpful.rb
66
+ - lib/simply_helpful/autotest.rb
67
+ - lib/simply_helpful/form_helper.rb
68
+ - lib/simply_helpful/rails_helpers.rb
69
+ - lib/simply_helpful/tasks.rb
70
+ - lib/simply_helpful/test_tasks.rb
71
+ - lib/tasks/database.rake
72
+ - lib/tasks/rcov.rake
73
+ - rails/init.rb
74
+ - README.rdoc
75
+ - test/app/controllers/application_controller.rb
76
+ - test/app/controllers/home_controller.rb
77
+ - test/config/routes.rb
78
+ - test/unit/helpful/form_helper_test.rb
79
+ - test/unit/helpful/rails_helpers_test.rb
80
+ has_rdoc: true
81
+ homepage: http://github.com/jakewendt/simply_helpful
82
+ licenses: []
83
+
84
+ post_install_message:
85
+ rdoc_options: []
86
+
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ hash: 3
95
+ segments:
96
+ - 0
97
+ version: "0"
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
105
+ - 0
106
+ version: "0"
107
+ requirements: []
108
+
109
+ rubyforge_project:
110
+ rubygems_version: 1.6.2
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: one-line summary of your gem
114
+ test_files:
115
+ - test/app/controllers/application_controller.rb
116
+ - test/app/controllers/home_controller.rb
117
+ - test/config/routes.rb
118
+ - test/unit/helpful/form_helper_test.rb
119
+ - test/unit/helpful/rails_helpers_test.rb