BrianTheCoder-ratpack 0.2.0 → 0.2.2
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/Rakefile +56 -0
- data/VERSION.yml +1 -1
- data/lib/ratpack.rb +4 -4
- data/lib/ratpack/core_ext/hash.rb +16 -0
- data/lib/ratpack/forms.rb +48 -123
- data/lib/ratpack/html_helpers.rb +5 -1
- data/lib/ratpack/routes.rb +1 -1
- data/lib/ratpack/tag.rb +1 -1
- data/lib/sinatra/ratpack.rb +6 -11
- metadata +10 -10
data/Rakefile
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "ratpack"
|
8
|
+
gem.summary = %Q{A collection of helpers I wanted for sinatra, thought I'd share}
|
9
|
+
gem.email = "wbsmith83@gmail.com"
|
10
|
+
gem.homepage = "http://github.com/BrianTheCoder/ratpack"
|
11
|
+
gem.authors = ["brianthecoder"]
|
12
|
+
|
13
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
|
+
end
|
15
|
+
rescue LoadError
|
16
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'rake/testtask'
|
20
|
+
Rake::TestTask.new(:test) do |test|
|
21
|
+
test.libs << 'lib' << 'test'
|
22
|
+
test.pattern = 'test/**/*_test.rb'
|
23
|
+
test.verbose = false
|
24
|
+
end
|
25
|
+
|
26
|
+
begin
|
27
|
+
require 'rcov/rcovtask'
|
28
|
+
Rcov::RcovTask.new do |test|
|
29
|
+
test.libs << 'test'
|
30
|
+
test.pattern = 'test/**/*_test.rb'
|
31
|
+
test.verbose = true
|
32
|
+
end
|
33
|
+
rescue LoadError
|
34
|
+
task :rcov do
|
35
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
task :default => :test
|
41
|
+
|
42
|
+
require 'rake/rdoctask'
|
43
|
+
Rake::RDocTask.new do |rdoc|
|
44
|
+
if File.exist?('VERSION.yml')
|
45
|
+
config = YAML.load(File.read('VERSION.yml'))
|
46
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
47
|
+
else
|
48
|
+
version = ""
|
49
|
+
end
|
50
|
+
|
51
|
+
rdoc.rdoc_dir = 'rdoc'
|
52
|
+
rdoc.title = "Rat Pack #{version}"
|
53
|
+
rdoc.rdoc_files.include('README*')
|
54
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
55
|
+
end
|
56
|
+
|
data/VERSION.yml
CHANGED
data/lib/ratpack.rb
CHANGED
@@ -2,7 +2,7 @@ require 'sinatra/base'
|
|
2
2
|
require 'extlib'
|
3
3
|
|
4
4
|
module RatPack
|
5
|
-
VERSION = '0.
|
5
|
+
VERSION = '0.2.2'
|
6
6
|
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
7
7
|
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
8
8
|
|
@@ -22,9 +22,9 @@ module RatPack
|
|
22
22
|
dir ||= ::File.basename(fname, '.*')
|
23
23
|
search_me = ::File.expand_path(
|
24
24
|
::File.join(::File.dirname(fname), dir, '**', '*.rb'))
|
25
|
-
|
26
25
|
Dir.glob(search_me).sort.each {|rb| require rb}
|
27
26
|
end
|
28
|
-
end # module
|
27
|
+
end # module RatPack
|
29
28
|
|
30
|
-
RatPack.require_all_libs_relative_to(__FILE__)
|
29
|
+
RatPack.require_all_libs_relative_to(__FILE__)
|
30
|
+
require File.join(RatPack::LIBPATH,'sinatra','ratpack')
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Hash
|
2
|
+
# Returns the value of self for each argument and deletes those entries.
|
3
|
+
#
|
4
|
+
# ==== Parameters
|
5
|
+
# *args:: the keys whose values should be extracted and deleted.
|
6
|
+
#
|
7
|
+
# ==== Returns
|
8
|
+
# Array[Object]:: The values of the provided arguments in corresponding order.
|
9
|
+
#
|
10
|
+
# :api: public
|
11
|
+
def extract!(*args)
|
12
|
+
args.map do |arg|
|
13
|
+
self.delete(arg)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/ratpack/forms.rb
CHANGED
@@ -1,126 +1,83 @@
|
|
1
1
|
module RatPack
|
2
2
|
module Forms
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
def error_messages_for(obj = nil, opts = {})
|
4
|
+
return unless obj.respond_to?(:errors)
|
5
|
+
html = tag(:h2, "Form submission failed be cause of #{obj.errors.size} #{pluralize("error",obj.errors.size)}")
|
6
|
+
obj.errors.each do |field,msg|
|
7
|
+
html << tag(:li,msg)
|
8
|
+
end
|
9
|
+
end
|
9
10
|
|
10
11
|
%w(text password hidden file).each do |kind|
|
11
12
|
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
12
13
|
def #{kind}_field(attrs)
|
13
|
-
|
14
|
-
|
15
|
-
label + self_closing_tag(:input, {:type => "#{kind}"}.merge(attrs))
|
14
|
+
attrs[:class] = "text" if %w(text password).include?("#{kind}")
|
15
|
+
closed_form_field(:input, {:type => "#{kind}"}.merge(attrs))
|
16
16
|
end
|
17
17
|
RUBY
|
18
18
|
end
|
19
|
-
|
20
|
-
def
|
21
|
-
|
22
|
-
if attrs.delete(:boolean)
|
23
|
-
on, off = attrs.delete(:on), attrs.delete(:off)
|
24
|
-
unbound_hidden_field(:name => attrs[:name], :value => off) <<
|
25
|
-
self_closing_tag(:input, {:type => "checkbox", :value => on}.merge(attrs)) + unbound_label(attrs)
|
26
|
-
else
|
27
|
-
self_closing_tag(:input, {:type => "checkbox"}.merge(attrs)) + unbound_label(attrs)
|
28
|
-
end
|
19
|
+
|
20
|
+
def text_area(attrs = {})
|
21
|
+
form_field(:textarea, attrs.delete(:value) || "", attrs)
|
29
22
|
end
|
30
|
-
|
23
|
+
|
24
|
+
def button(contents, attrs = {})
|
25
|
+
form_field(:button, contents, attrs)
|
26
|
+
end
|
27
|
+
|
31
28
|
def radio_button(attrs)
|
32
|
-
|
33
|
-
self_closing_tag(:input, {:type => "radio"}.merge(attrs)) + unbound_label(attrs)
|
29
|
+
closed_form_field(:input, {:type => "radio"}.merge(attrs))
|
34
30
|
end
|
35
31
|
|
36
32
|
def radio_group(arr, attrs = {})
|
37
33
|
arr.map do |ind_attrs|
|
38
34
|
ind_attrs = {:value => ind_attrs} unless ind_attrs.is_a?(Hash)
|
39
35
|
joined = attrs.merge(ind_attrs)
|
40
|
-
joined.merge!(:label => joined[:label] || joined[:value])
|
41
36
|
radio_button(joined)
|
42
37
|
end.join
|
43
38
|
end
|
44
39
|
|
45
|
-
def
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
def label(contents, attrs = {})
|
51
|
-
if contents
|
52
|
-
if contents.is_a?(Hash)
|
53
|
-
label_attrs = contents
|
54
|
-
contents = label_attrs.delete(:title)
|
55
|
-
else
|
56
|
-
label_attrs = attrs
|
57
|
-
end
|
58
|
-
tag(:label, contents, label_attrs)
|
40
|
+
def check_box(attrs)
|
41
|
+
if attrs.delete(:boolean)
|
42
|
+
on, off = attrs.delete(:on), attrs.delete(:off)
|
43
|
+
hidden_field(:name => attrs[:name], :value => off) <<
|
44
|
+
closed_form_field(:input, {:type => "checkbox", :value => on}.merge(attrs))
|
59
45
|
else
|
60
|
-
""
|
46
|
+
closed_form_field(:input, {:type => "checkbox"}.merge(attrs))
|
61
47
|
end
|
62
48
|
end
|
63
49
|
|
64
50
|
def select(attrs = {})
|
65
|
-
update_unbound_controls(attrs, "select")
|
66
51
|
attrs[:name] << "[]" if attrs[:multiple] && !(attrs[:name] =~ /\[\]$/)
|
67
|
-
|
52
|
+
form_field(:select, options_for(attrs), attrs)
|
68
53
|
end
|
69
54
|
|
70
|
-
def
|
71
|
-
update_unbound_controls(attrs, "button")
|
72
|
-
tag(:button, contents, attrs)
|
73
|
-
end
|
74
|
-
|
75
|
-
def submit(value, attrs)
|
55
|
+
def submit(value, attrs = {})
|
76
56
|
attrs[:type] ||= "submit"
|
77
57
|
attrs[:name] ||= "submit"
|
78
58
|
attrs[:value] ||= value
|
79
|
-
|
80
|
-
self_closing_tag(:input, attrs)
|
59
|
+
closed_form_field(:input, attrs)
|
81
60
|
end
|
82
61
|
|
83
|
-
# def form(attrs = {}, &blk)
|
84
|
-
# captured = @origin.capture(&blk)
|
85
|
-
# fake_method_tag = process_form_attrs(attrs)
|
86
|
-
# tag(:form, fake_method_tag + captured, attrs)
|
87
|
-
# end
|
88
|
-
#
|
89
|
-
# def fieldset(attrs, &blk)
|
90
|
-
# captured = @origin.capture(&blk)
|
91
|
-
# legend = (l_attr = attrs.delete(:legend)) ? tag(:legend, l_attr) : ""
|
92
|
-
# tag(:fieldset, legend + captured, attrs)
|
93
|
-
# end
|
94
|
-
|
95
62
|
private
|
96
|
-
|
97
|
-
def
|
98
|
-
|
99
|
-
attrs
|
100
|
-
method == :post || method == :get ? "" : fake_out_method(attrs, method)
|
63
|
+
|
64
|
+
def form_field(type, content, attrs)
|
65
|
+
attrs[:id] = attrs[:name] unless attrs.has_key?(:id)
|
66
|
+
build_field(attrs) + tag(type, content, attrs)
|
101
67
|
end
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
self_closing_tag(
|
68
|
+
|
69
|
+
def closed_form_field(type, attrs)
|
70
|
+
attrs[:id] = attrs[:name] unless attrs.has_key?(:id)
|
71
|
+
build_field(attrs) + self_closing_tag(type, attrs)
|
106
72
|
end
|
107
73
|
|
108
|
-
def
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
when "radio"
|
113
|
-
update_unbound_radio_button(attrs)
|
114
|
-
when "file"
|
115
|
-
@multipart = true
|
116
|
-
when "text","password"
|
117
|
-
attrs[:class] = "text"
|
118
|
-
end
|
119
|
-
|
120
|
-
attrs[:disabled] ? attrs[:disabled] = "disabled" : attrs.delete(:disabled)
|
74
|
+
def build_field(attrs)
|
75
|
+
label = attrs.has_key?(:label) ? build_label(attrs) : ""
|
76
|
+
hint = attrs.has_key?(:hint) ? tag(:div,attrs.delete(:hint), :class => "hint") : ""
|
77
|
+
label + hint
|
121
78
|
end
|
122
79
|
|
123
|
-
def
|
80
|
+
def build_label(attrs)
|
124
81
|
if attrs[:id]
|
125
82
|
label_attrs = {:for => attrs[:id]}
|
126
83
|
elsif attrs[:name]
|
@@ -128,64 +85,32 @@ module RatPack
|
|
128
85
|
else
|
129
86
|
label_attrs = {}
|
130
87
|
end
|
131
|
-
|
132
|
-
label_option = attrs.delete(:label)
|
133
|
-
if label_option.is_a? Hash
|
134
|
-
label(label_attrs.merge(label_option))
|
135
|
-
else
|
136
|
-
label(label_option, label_attrs)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
def update_unbound_check_box(attrs)
|
141
|
-
boolean = attrs[:boolean] || (attrs[:on] && attrs[:off]) ? true : false
|
142
|
-
|
143
|
-
case
|
144
|
-
when attrs.key?(:on) ^ attrs.key?(:off)
|
145
|
-
raise ArgumentError, ":on and :off must be specified together"
|
146
|
-
when (attrs[:boolean] == false) && (attrs.key?(:on))
|
147
|
-
raise ArgumentError, ":boolean => false cannot be used with :on and :off"
|
148
|
-
when boolean && attrs.key?(:value)
|
149
|
-
raise ArgumentError, ":value can't be used with a boolean checkbox"
|
150
|
-
end
|
151
|
-
|
152
|
-
if attrs[:boolean] = boolean
|
153
|
-
attrs[:on] ||= "1"; attrs[:off] ||= "0"
|
154
|
-
end
|
155
|
-
|
156
|
-
attrs[:checked] = "checked" if attrs.delete(:checked)
|
157
|
-
end
|
158
|
-
|
159
|
-
def update_unbound_radio_button(attrs)
|
160
|
-
attrs[:checked] = "checked" if attrs.delete(:checked)
|
88
|
+
tag(:label, attrs.delete(:label), label_attrs)
|
161
89
|
end
|
162
90
|
|
163
91
|
def options_for(attrs)
|
164
92
|
blank, prompt = attrs.delete(:include_blank), attrs.delete(:prompt)
|
165
93
|
b = blank || prompt ? tag(:option, prompt || "", :value => "") : ""
|
166
|
-
|
167
94
|
# yank out the options attrs
|
168
|
-
collection, selected, text_method, value_method =
|
169
|
-
attrs.extract!(:collection, :selected, :text_method, :value_method)
|
170
|
-
|
95
|
+
collection, selected, text_method, value_method = attrs.extract!(:collection, :selected, :text_method, :value_method)
|
171
96
|
# if the collection is a Hash, optgroups are a-coming
|
172
97
|
if collection.is_a?(Hash)
|
173
98
|
([b] + collection.map do |g,col|
|
174
|
-
tag(:optgroup,
|
99
|
+
tag(:optgroup, select_options(col, text_method, value_method, selected), :label => g)
|
175
100
|
end).join
|
176
101
|
else
|
177
|
-
|
102
|
+
select_options(collection || [], text_method, value_method, selected, b)
|
178
103
|
end
|
179
104
|
end
|
180
|
-
|
181
|
-
def
|
105
|
+
|
106
|
+
def select_options(col, text_meth, value_meth, sel, b = nil)
|
182
107
|
([b] + col.map do |item|
|
183
108
|
text_meth = text_meth && item.respond_to?(text_meth) ? text_meth : :last
|
184
109
|
value_meth = value_meth && item.respond_to?(value_meth) ? value_meth : :first
|
185
|
-
|
110
|
+
|
186
111
|
text = item.is_a?(String) ? item : item.send(text_meth)
|
187
112
|
value = item.is_a?(String) ? item : item.send(value_meth)
|
188
|
-
|
113
|
+
|
189
114
|
option_attrs = {:value => value}
|
190
115
|
if sel.is_a?(Array)
|
191
116
|
option_attrs.merge!(:selected => "selected") if value.in? sel
|
data/lib/ratpack/html_helpers.rb
CHANGED
data/lib/ratpack/routes.rb
CHANGED
data/lib/ratpack/tag.rb
CHANGED
@@ -2,7 +2,7 @@ module RatPack
|
|
2
2
|
module Tag
|
3
3
|
def tag(name, contents = nil, attrs = {}, &block)
|
4
4
|
attrs, contents = contents, nil if contents.is_a?(Hash)
|
5
|
-
contents = capture(&block) if block_given?
|
5
|
+
# contents = capture(&block) if block_given?
|
6
6
|
open_tag(name, attrs) + contents.to_s + close_tag(name)
|
7
7
|
end
|
8
8
|
|
data/lib/sinatra/ratpack.rb
CHANGED
@@ -1,17 +1,12 @@
|
|
1
1
|
module Sinatra
|
2
|
-
module
|
3
|
-
module Helpers
|
4
|
-
include RatPack::Tag
|
5
|
-
include RatPack::HtmlHelpers
|
6
|
-
include RatPack::Forms
|
7
|
-
include RatPack::Routes
|
8
|
-
end
|
9
|
-
|
2
|
+
module RatPack
|
10
3
|
def self.registered(app)
|
11
|
-
|
12
|
-
app.helpers
|
4
|
+
app.helpers ::RatPack::Tag
|
5
|
+
app.helpers ::RatPack::HtmlHelpers
|
6
|
+
app.helpers ::RatPack::Routes
|
7
|
+
app.helpers ::RatPack::Forms
|
13
8
|
end
|
14
9
|
end
|
15
10
|
|
16
|
-
register
|
11
|
+
register RatPack
|
17
12
|
end # Sinatra
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: BrianTheCoder-ratpack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- brianthecoder
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-12 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -20,27 +20,26 @@ executables: []
|
|
20
20
|
extensions: []
|
21
21
|
|
22
22
|
extra_rdoc_files:
|
23
|
-
- README.rdoc
|
24
23
|
- LICENSE
|
24
|
+
- README.rdoc
|
25
25
|
files:
|
26
|
+
- LICENSE
|
26
27
|
- README.rdoc
|
28
|
+
- Rakefile
|
27
29
|
- VERSION.yml
|
28
|
-
- lib/ratpack
|
30
|
+
- lib/ratpack.rb
|
31
|
+
- lib/ratpack/core_ext/hash.rb
|
29
32
|
- lib/ratpack/forms.rb
|
30
33
|
- lib/ratpack/html_helpers.rb
|
31
34
|
- lib/ratpack/routes.rb
|
32
35
|
- lib/ratpack/tag.rb
|
33
|
-
- lib/ratpack.rb
|
34
|
-
- lib/sinatra
|
35
36
|
- lib/sinatra/ratpack.rb
|
36
37
|
- test/ratpack_test.rb
|
37
38
|
- test/test_helper.rb
|
38
|
-
- LICENSE
|
39
39
|
has_rdoc: true
|
40
40
|
homepage: http://github.com/BrianTheCoder/ratpack
|
41
41
|
post_install_message:
|
42
42
|
rdoc_options:
|
43
|
-
- --inline-source
|
44
43
|
- --charset=UTF-8
|
45
44
|
require_paths:
|
46
45
|
- lib
|
@@ -63,5 +62,6 @@ rubygems_version: 1.2.0
|
|
63
62
|
signing_key:
|
64
63
|
specification_version: 2
|
65
64
|
summary: A collection of helpers I wanted for sinatra, thought I'd share
|
66
|
-
test_files:
|
67
|
-
|
65
|
+
test_files:
|
66
|
+
- test/ratpack_test.rb
|
67
|
+
- test/test_helper.rb
|