sinatra_more 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -2,7 +2,10 @@
2
2
 
3
3
  == Introduction
4
4
 
5
- This will be a plugin which expand sinatra's capabilities in many ways. Not ready to be used yet!
5
+ (Not quite ready to be used yet!)
6
+
7
+ This will be a plugin which expand sinatra's capabilities in many ways.
8
+ Note that certain template specific helpers are known to work with haml, erb, and erubis
6
9
 
7
10
  Let me expand briefly on what I want to accomplish with this gem. I love sinatra but if I want to use it
8
11
  for any non-trivial application I very quickly miss a lot of the extra tools provided by rails.
@@ -68,6 +71,15 @@ provided to make interacting with warden dead simple.
68
71
 
69
72
  ...list methods here...
70
73
 
74
+ == Acknowledgements
75
+
76
+ Thanks to keldredd for the sinatra-helpers code that helped me to create erb capture and concat methods!
77
+
78
+ == Contributers
79
+
80
+ * Nathan Esquenazi - Project creator and code maintainer
81
+ * Arthur Chiu - Forming the idea and various code contributions
82
+
71
83
  == Note on Patches/Pull Requests
72
84
 
73
85
  * Fork the project.
data/TODO CHANGED
@@ -1,5 +1,13 @@
1
- * I have got to add tests, basically create dummy sinatra applications and use Rack::Test
2
- * Pull from sinatra-helpers and make erb templates work (and credit keldredd)
3
- - http://github.com/kelredd/sinatra-helpers/tree/master/lib/sinatra_helpers/erb/
1
+ = UNFINISHED
2
+
3
+ * image_tag should start in images_path (or /images)
4
+ * I have got to add tests, basically create dummy sinatra applications and use Webrat
4
5
  * Become total warden solution (basically just require warden gem installed, do everything else)
5
- * Remove dependency on activesupport! and enumerate dependencies in rake
6
+ * Make warden password strategy support a callback which explains what to do with username, password
7
+ * WardenPlugin.authenticate_callback { |username, password| User.authenticate(username, password) }
8
+ * Remove dependency on activesupport! and enumerate dependencies in rakefile
9
+
10
+ = COMPLETED
11
+
12
+ * Pull from sinatra-helpers and make erb templates work (and credit keldredd)
13
+ - http://github.com/kelredd/sinatra-helpers/tree/master/lib/sinatra_helpers/erb/
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.7
1
+ 0.0.8
@@ -1,6 +1,7 @@
1
1
  module SinatraMore
2
2
  module AssetTagHelpers
3
- # flash_tag(:notice)
3
+
4
+ # flash_tag(:notice, :class => 'flash', :id => 'flash-notice')
4
5
  def flash_tag(kind, options={})
5
6
  flash_text = flash[kind]
6
7
  return '' if flash_text.blank?
@@ -8,13 +9,14 @@ module SinatraMore
8
9
  content_tag(:div, flash_text, options)
9
10
  end
10
11
 
11
- # name, url='javascript:void(0)', options={}, &block
12
+ # link_to 'click me', '/dashboard', :class => 'linky'
13
+ # parameters: name, url='javascript:void(0)', options={}, &block
12
14
  def link_to(*args, &block)
13
15
  if block_given?
14
16
  url, options = (args[0] || 'javascript:void(0);'), (args[1] || {})
15
17
  options.reverse_merge!(:href => url)
16
- link_content = capture_haml(&block)
17
- haml_concat(content_tag(:a, link_content, options))
18
+ link_content = capture_html(&block)
19
+ concat_content(content_tag(:a, link_content, options))
18
20
  else
19
21
  name, url, options = args.first, (args[1] || 'javascript:void(0);'), (args[2] || {})
20
22
  options.reverse_merge!(:href => url)
@@ -22,27 +24,32 @@ module SinatraMore
22
24
  end
23
25
  end
24
26
 
27
+ # image_tag('icons/avatar.png')
25
28
  def image_tag(url, options={})
26
29
  options.reverse_merge!(:src => url)
27
30
  tag(:img, options)
28
31
  end
29
32
 
33
+ # stylesheet_link_tag 'style', 'application', 'layout'
30
34
  def stylesheet_link_tag(*sources)
31
35
  options = sources.extract_options!.symbolize_keys
32
36
  sources.collect { |sheet| stylesheet_tag(sheet, options) }.join("\n")
33
37
  end
34
38
 
39
+ # stylesheet_tag('style', :media => 'screen')
35
40
  def stylesheet_tag(source, options={})
36
41
  rel_path = "/stylesheets/#{source}.css?#{Time.now.to_i}"
37
42
  options = options.dup.reverse_merge!(:href => rel_path, :media => 'screen', :rel => 'stylesheet', :type => 'text/css')
38
43
  tag(:link, options)
39
44
  end
40
45
 
46
+ # javascript_include_tag 'application', 'special'
41
47
  def javascript_include_tag(*sources)
42
48
  options = sources.extract_options!.symbolize_keys
43
49
  sources.collect { |script| javascript_tag(script, options) }.join("\n")
44
50
  end
45
51
 
52
+ # javascript_tag 'application', :src => '/javascripts/base/application.js'
46
53
  def javascript_tag(source, options={})
47
54
  rel_path = "/javascripts/#{source}.js?#{Time.now.to_i}"
48
55
  options = options.dup.reverse_merge!(:content => "", :src => rel_path, :type => 'text/javascript')
@@ -8,59 +8,75 @@ class AbstractFormBuilder
8
8
  @object = object
9
9
  end
10
10
 
11
+ # f.error_messages
11
12
  def error_messages(options={})
12
13
  @template.error_messages_for(@object, options)
13
14
  end
14
15
 
16
+ # f.label :username, :caption => "Nickname"
15
17
  def label(field, options={})
16
18
  options.reverse_merge!(:caption => field.to_s.titleize)
17
19
  @template.label_tag(field_id(field), options)
18
20
  end
19
21
 
22
+ # f.text_field :username, :value => "(blank)", :id => 'username'
20
23
  def text_field(field, options={})
21
24
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
22
25
  @template.text_field_tag field_name(field), options
23
26
  end
24
27
 
28
+ # f.text_area :summary, :value => "(enter summary)", :id => 'summary'
25
29
  def text_area(field, options={})
26
30
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
27
31
  @template.text_area_tag field_name(field), options
28
32
  end
29
33
 
34
+ # f.password_field :password, :id => 'password'
30
35
  def password_field(field, options={})
31
36
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
32
37
  @template.password_field_tag field_name(field), options
33
38
  end
34
39
 
40
+ # f.file_field(:photo, :class => 'avatar')
35
41
  def file_field(field, options={})
36
42
  options.reverse_merge!(:id => field_id(field))
37
43
  @template.file_field_tag field_name(field), options
38
44
  end
39
45
 
46
+ # f.submit "Update", :class => 'large'
40
47
  def submit(caption, options={})
41
48
  @template.submit_tag caption, options
42
49
  end
43
50
 
44
51
  protected
45
52
 
53
+ # Returns the known field types for a formbuilder
46
54
  def self.field_types
47
55
  [:text_field, :text_area, :password_field, :file_field]
48
56
  end
49
57
 
50
58
  private
51
59
 
60
+ # Returns the object's models name
61
+ # => user_assignment
52
62
  def object_name
53
63
  object.class.to_s.underscore
54
64
  end
55
65
 
66
+ # Returns the value for the object's field
67
+ # field_value(:username) => "Joey"
56
68
  def field_value(field)
57
69
  @object && @object.respond_to?(field) ? @object.send(field) : ""
58
70
  end
59
71
 
72
+ # Returns the name for the given field
73
+ # field_name(:username) => "user[username]"
60
74
  def field_name(field)
61
75
  "#{object_name}[#{field}]"
62
76
  end
63
77
 
78
+ # Returns the id for the given field
79
+ # field_id(:username) => "user_username"
64
80
  def field_id(field)
65
81
  "#{object_name}_#{field}"
66
82
  end
@@ -1,4 +1,9 @@
1
1
  class StandardFormBuilder < AbstractFormBuilder
2
+
3
+ # text_field_block(:username, { :class => 'long' }, { :class => 'wide-label' })
4
+ # text_area_block(:username, { :class => 'long' }, { :class => 'wide-label' })
5
+ # password_field_block(:username, { :class => 'long' }, { :class => 'wide-label' })
6
+ # file_field_block(:username, { :class => 'long' }, { :class => 'wide-label' })
2
7
  self.field_types.each do |field_type|
3
8
  class_eval <<-EOF
4
9
  def #{field_type}_block(field, options={}, label_options={})
@@ -11,6 +16,7 @@ class StandardFormBuilder < AbstractFormBuilder
11
16
  EOF
12
17
  end
13
18
 
19
+ # submit_block("Update")
14
20
  def submit_block(caption)
15
21
  @template.content_block_tag(:p) do
16
22
  @template.submit_tag(caption)
@@ -1,28 +1,28 @@
1
1
  module SinatraMore
2
2
  module FormHelpers
3
- # form_for @user, '/register', :id => 'register'
3
+ # form_for @user, '/register', :id => 'register' do |f| ... end
4
4
  def form_for(object, url, settings={}, &block)
5
- default_builder = settings[:builder] || self.options.default_builder.constantize
5
+ configured_builder = settings[:builder] || self.options.default_builder.constantize
6
6
  settings.reverse_merge!(:method => 'post', :action => url)
7
7
  settings[:enctype] = "multipart/form-data" if settings.delete(:multipart)
8
- # TODO make this work with erb!!
9
- form_html = capture_haml(default_builder.new(self, object), &block)
10
- haml_concat content_tag('form', form_html, settings)
8
+ form_html = capture_html(configured_builder.new(self, object), &block)
9
+ concat_content content_tag('form', form_html, settings)
11
10
  end
12
11
 
13
12
  # form_tag '/register' do ... end
14
13
  def form_tag(url, options={}, &block)
15
14
  options.reverse_merge!(:method => 'post', :action => url)
16
- # TODO make this work with erb!!
17
- haml_concat content_tag('form', capture_haml(&block), options)
15
+ concat_content content_tag('form', capture_html(&block), options)
18
16
  end
19
17
 
20
- def field_set_tag(legend=nil, options={}, &block)
21
- # TODO make this work with erb!!
22
- field_set_content = ''
23
- field_set_content << content_tag(:legend, legend) if legend.present?
24
- field_set_content << capture_haml(&block)
25
- haml_concat content_tag('fieldset', field_set_content, options)
18
+ # field_set_tag("Office", :class => 'office-set')
19
+ # parameters: legend_text=nil, options={}
20
+ def field_set_tag(*args, &block)
21
+ options = args.extract_options!
22
+ legend_text = args[0].is_a?(String) ? args.first : nil
23
+ legend_html = legend_text.blank? ? '' : content_tag(:legend, legend_text)
24
+ field_set_content = legend_html + capture_html(&block)
25
+ concat_content content_tag('fieldset', field_set_content, options)
26
26
  end
27
27
 
28
28
  # error_messages_for @user
@@ -38,44 +38,44 @@ module SinatraMore
38
38
  end
39
39
  end
40
40
 
41
- # label_tag :username
41
+ # label_tag :username, :class => 'long-label'
42
+ # label_tag :username, :class => 'long-label' do ... end
42
43
  def label_tag(name, options={}, &block)
43
44
  options.reverse_merge!(:caption => name.to_s.titleize, :for => name)
44
45
  caption_text = options.delete(:caption) + ": "
45
- # TODO make this work with erb!!
46
46
  if block_given? # label with inner content
47
- label_content = caption_text + capture_haml(&block)
48
- haml_concat(content_tag(:label, label_content, options))
47
+ label_content = caption_text + capture_html(&block)
48
+ concat_content(content_tag(:label, label_content, options))
49
49
  else # regular label
50
50
  content_tag(:label, caption_text, options)
51
51
  end
52
52
  end
53
53
 
54
- # text_field_tag :username
54
+ # text_field_tag :username, :class => 'long'
55
55
  def text_field_tag(name, options={})
56
56
  options.reverse_merge!(:name => name)
57
57
  input_tag(:text, options)
58
58
  end
59
59
 
60
- # text_field_tag :username
60
+ # text_area_tag :username, :class => 'long'
61
61
  def text_area_tag(name, options={})
62
62
  options.reverse_merge!(:name => name)
63
63
  content_tag(:textarea, '', options)
64
64
  end
65
65
 
66
- # password_field_tag :password
66
+ # password_field_tag :password, :class => 'long'
67
67
  def password_field_tag(name, options={})
68
68
  options.reverse_merge!(:name => name)
69
69
  input_tag(:password, options)
70
70
  end
71
71
 
72
- # field_field_tag
72
+ # field_field_tag :photo, :class => 'long'
73
73
  def file_field_tag(name, options={})
74
74
  options.reverse_merge!(:name => name)
75
75
  input_tag(:file, options)
76
76
  end
77
77
 
78
- # submit_tag "Create"
78
+ # submit_tag "Create", :class => 'success'
79
79
  def submit_tag(caption, options={})
80
80
  options.reverse_merge!(:value => caption)
81
81
  input_tag(:submit, options)
@@ -1,5 +1,7 @@
1
1
  module SinatraMore
2
2
  module FormatHelpers
3
+
4
+ # relative_time_ago(Time.now)
3
5
  def relative_time_ago(date)
4
6
  date = date.to_date
5
7
  date = Date.parse(date, true) unless /Date.*/ =~ date.class.to_s
@@ -16,15 +18,18 @@ module SinatraMore
16
18
  return date.strftime('%A, %B %e, %Y')
17
19
  end
18
20
 
19
- def escape_javascript(javascript)
20
- return '' unless javascript
21
+ # escape_javascript("<h1>Hey</h1>")
22
+ # Used in xxxx.js.erb files to escape html so that it can be passed to javascript from sinatra
23
+ def escape_javascript(html_content)
24
+ return '' unless html_content
21
25
  javascript_mapping = { '\\' => '\\\\', '</' => '<\/', "\r\n" => '\n', "\n" => '\n' }
22
26
  javascript_mapping.merge("\r" => '\n', '"' => '\\"', "'" => "\\'")
23
- escaped_string = javascript.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { javascript_mapping[$1] }
27
+ escaped_string = html_content.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { javascript_mapping[$1] }
24
28
  "\"#{escaped_string}\""
25
29
  end
26
30
 
27
31
  alias js_escape escape_javascript
32
+ alias escape_for_javascript escape_javascript
28
33
 
29
34
  end
30
35
  end
@@ -0,0 +1,38 @@
1
+ module SinatraMore
2
+ module OutputHelpers
3
+ # Captures the html from a block of template code for erb or haml
4
+ # capture_html(&block) => "...html..."
5
+ def capture_html(*args, &block)
6
+ if is_haml?
7
+ block_is_haml?(block) ? capture_haml(*args, &block) : block.call
8
+ else
9
+ capture_erb(*args, &block)
10
+ end
11
+ end
12
+
13
+ # Outputs the given text to the templates buffer directly
14
+ # concat_content("This will be output to the template buffer in erb or haml")
15
+ def concat_content(text="")
16
+ if is_haml?
17
+ haml_concat(text)
18
+ else
19
+ @_out_buf << text
20
+ end
21
+ end
22
+
23
+ # Used to capture the html from a block of erb code
24
+ # capture_erb(&block) => '...html...'
25
+ def capture_erb(*args, &block)
26
+ erb_with_output_buffer { block.call(*args) }
27
+ end
28
+
29
+ # Used to direct the buffer for the erb capture
30
+ def erb_with_output_buffer(buf = '') #:nodoc:
31
+ @_out_buf, old_buffer = buf, @_out_buf
32
+ yield
33
+ @_out_buf
34
+ ensure
35
+ @_out_buf = old_buffer
36
+ end
37
+ end
38
+ end
@@ -6,16 +6,19 @@ module SinatraMore
6
6
  tag(:input, options)
7
7
  end
8
8
 
9
+ # content_block_tag(:p, :class => 'dark') do ... end
9
10
  def content_block_tag(name, options={}, &block)
10
- # TODO make this work with erb!!
11
- options.merge!(:content => block.call)
11
+ options.merge!(:content => capture_html(&block))
12
12
  tag(name, options)
13
13
  end
14
14
 
15
+ # content_tag(:p, "hello", :class => 'light')
15
16
  def content_tag(name, content, options={})
16
17
  tag(name, options.merge(:content => content))
17
18
  end
18
19
 
20
+ # tag(:br, :style => 'clear:both')
21
+ # tag(:p, :content => "hello", :class => 'large')
19
22
  def tag(name, options={})
20
23
  content = options.delete(:content)
21
24
  html_attrs = options.collect { |a, v| v.blank? ? nil : "#{a}=\"#{v}\"" }.compact.join(" ")
@@ -3,6 +3,7 @@ Dir.glob(File.dirname(__FILE__) + '/markup_plugin/**/*.rb').each { |f| require
3
3
  module SinatraMore
4
4
  module MarkupPlugin
5
5
  def self.registered(app)
6
+ app.helpers OutputHelpers
6
7
  app.helpers TagHelpers
7
8
  app.helpers AssetTagHelpers
8
9
  app.helpers FormHelpers
@@ -25,8 +25,8 @@ module SinatraMore
25
25
  def authenticated?(&block)
26
26
  if block_given?
27
27
  return '' unless logged_in?
28
- authenticated_content = capture_haml(&block)
29
- haml_concat(authenticated_content)
28
+ authenticated_content = capture_html(&block)
29
+ concat_content(authenticated_content)
30
30
  else
31
31
  return logged_in?
32
32
  end
@@ -37,8 +37,8 @@ module SinatraMore
37
37
  def unregistered?(&block)
38
38
  if block_given?
39
39
  return '' if logged_in?
40
- unregistered_content = capture_haml(&block)
41
- haml_concat(unregistered_content)
40
+ unregistered_content = capture_html(&block)
41
+ concat_content(unregistered_content)
42
42
  else
43
43
  return !logged_in?
44
44
  end
@@ -15,13 +15,21 @@ module SinatraMore
15
15
 
16
16
  Warden::Strategies.add(:password) do
17
17
  def valid?
18
- params['username'] || params['password']
18
+ username || password
19
19
  end
20
20
 
21
21
  def authenticate!
22
- u = User.authenticate(params['username'], params['password'])
22
+ u = User.authenticate(username, password)
23
23
  u.nil? ? fail!("Could not log in") : success!(u)
24
24
  end
25
+
26
+ def username
27
+ params['username'] || params['nickname'] || params['login'] || params['email']
28
+ end
29
+
30
+ def password
31
+ params['password'] || params['pass']
32
+ end
25
33
  end
26
34
  end
27
35
  end
data/sinatra_more.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sinatra_more}
8
- s.version = "0.0.7"
8
+ s.version = "0.0.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nathan Esquenazi"]
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
31
31
  "lib/sinatra_more/markup_plugin/form_builder/standard_form_builder.rb",
32
32
  "lib/sinatra_more/markup_plugin/form_helpers.rb",
33
33
  "lib/sinatra_more/markup_plugin/format_helpers.rb",
34
+ "lib/sinatra_more/markup_plugin/output_helpers.rb",
34
35
  "lib/sinatra_more/markup_plugin/tag_helpers.rb",
35
36
  "lib/sinatra_more/render_plugin.rb",
36
37
  "lib/sinatra_more/render_plugin/render_helpers.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra_more
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Esquenazi
@@ -46,6 +46,7 @@ files:
46
46
  - lib/sinatra_more/markup_plugin/form_builder/standard_form_builder.rb
47
47
  - lib/sinatra_more/markup_plugin/form_helpers.rb
48
48
  - lib/sinatra_more/markup_plugin/format_helpers.rb
49
+ - lib/sinatra_more/markup_plugin/output_helpers.rb
49
50
  - lib/sinatra_more/markup_plugin/tag_helpers.rb
50
51
  - lib/sinatra_more/render_plugin.rb
51
52
  - lib/sinatra_more/render_plugin/render_helpers.rb