sinatra_more 0.0.7 → 0.0.8

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 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