cuba-contrib 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2010, 2011 Michel Martens, Damian Janowski and Cyril David
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,142 @@
1
+ # cuba-contrib
2
+
3
+ [Cuba][cuba] is probably one of the tiniest rack-based micro
4
+ frameworks around. Weighing in at only __138 LOC__, it has proven
5
+ itself to be a very resilient tool in various web application domains.
6
+ Check [the list of sites][sites] built using Cuba in order to
7
+ grasp the endless possibilities.
8
+
9
+ ## STEP 1: Cuba::Prelude
10
+
11
+ Cuba [does one thing, and it does it well][unix]. Cuba-contrib, on
12
+ the other hand, layers requirement-specific functionality on
13
+ top of it. This allows us to build simpler and lighter solutions.
14
+
15
+ To get started with `Cuba::Contrib`, install it using RubyGems:
16
+
17
+ ``` bash
18
+ $ gem install cuba # if you haven't already done so
19
+ $ gem install cuba-contrib
20
+ ```
21
+
22
+ For the remainder of the examples below, we'll assume you
23
+ always put your main cuba application in `app.rb` and your
24
+ views in `views`.
25
+
26
+ ``` bash
27
+ $ touch app.rb
28
+ $ mkdir views
29
+ ```
30
+
31
+ Now you can require it in your application
32
+
33
+ ``` ruby
34
+ require "cuba"
35
+ require "cuba/contrib"
36
+
37
+ Cuba.plugin Cuba::Prelude
38
+ ```
39
+
40
+ `Cuba::Prelude` adds the basic stuff you'll need:
41
+
42
+ ``` ruby
43
+ Cuba.define do
44
+ on "about" do
45
+ # same as encodeURIComponent in javascript land
46
+ res.write urlencode("http://www.google.com")
47
+
48
+ # basically an alias for Rack::Utils.escape_html
49
+ res.write h("Cuba & Cuba Contrib")
50
+ end
51
+ end
52
+ ```
53
+
54
+ ## STEP 2: Choose your templating
55
+
56
+ ### Here comes a new challenger: Mote
57
+
58
+ We prefer to use our home-grown templating engine called
59
+ [Mote][mote]. We do that by simply loading the plugin `Cuba::Mote`:
60
+
61
+ ``` ruby
62
+ require "cuba"
63
+ require "cuba/contrib"
64
+
65
+ Cuba.plugin Cuba::Mote
66
+
67
+ Cuba.define do
68
+ on "home" do
69
+ res.write view("home")
70
+ end
71
+
72
+ on "about" do
73
+ res.write partial("about")
74
+ end
75
+ end
76
+ ```
77
+
78
+ This assumes that you have a `views` folder, containing a `home.mote`
79
+ and an `about.mote`.
80
+
81
+ ### Classic templating needs
82
+
83
+ ``` ruby
84
+ require "cuba"
85
+ require "cuba/contrib"
86
+
87
+ Cuba.plugin Cuba::Rendering
88
+ Cuba.set :template_engine, "haml"
89
+
90
+ Cuba.define do
91
+ on "home" do
92
+ res.write view("home") # renders views/home.haml
93
+ end
94
+
95
+ on "about" do
96
+ res.write partial("about") # renders views/about.haml
97
+ end
98
+ end
99
+ ```
100
+
101
+ ## STEP 3: Make your own plugins
102
+
103
+ Authoring your own plugins is pretty straightforward.
104
+
105
+ ``` ruby
106
+ module MyOwnHelper
107
+ def markdown(str)
108
+ BlueCloth.new(str).to_html
109
+ end
110
+ end
111
+
112
+ Cuba.plugin MyOwnHelper
113
+ ```
114
+
115
+ that's the simplest kind of plugin you'll write. In fact,
116
+ that's exactly how the `markdown` helper is written in
117
+ `Cuba::TextHelpers`.
118
+
119
+ A more complicated plugin for example, will make use of
120
+ `Cuba::Settings` to provide default values:
121
+
122
+ ``` ruby
123
+ module Rendering
124
+ def self.setup(app)
125
+ app.plugin Cuba::Settings # we need this for default values
126
+ app.set :template_engine, "erb"
127
+ end
128
+
129
+ def partial(template, locals = {})
130
+ render("#{template}.#{settings.template_engine}", locals)
131
+ end
132
+ end
133
+
134
+ Cuba.plugin Rendering
135
+ ```
136
+
137
+ This sample plugin actually resembles how `Cuba::Rendering` works.
138
+
139
+ [cuba]: http://cuba.is
140
+ [sites]: http://cuba.is/sites
141
+ [mote]: http://github.com/soveran/mote
142
+ [unix]: http://en.wikipedia.org/wiki/Unix_philosophy
@@ -0,0 +1,24 @@
1
+ require "./lib/cuba/contrib/version"
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "cuba-contrib"
5
+ s.version = Cuba::Contrib::VERSION
6
+ s.summary = "Cuba plugins and utilities."
7
+ s.description = "Includes various helper tools for Cuba."
8
+ s.authors = ["Cyril David"]
9
+ s.email = ["me@cyrildavid.com"]
10
+ s.homepage = "http://github.com/cyx/cuba-contrib"
11
+
12
+ s.files = Dir[
13
+ "LICENSE",
14
+ "README.markdown",
15
+ "rakefile",
16
+ "lib/**/*.rb",
17
+ "*.gemspec",
18
+ "test/*.*"
19
+ ]
20
+
21
+ s.add_dependency "cuba"
22
+ s.add_development_dependency "cutest"
23
+ s.add_development_dependency "capybara"
24
+ end
@@ -0,0 +1,22 @@
1
+ class Cuba
2
+ CONTRIB_ROOT = File.expand_path("../../", File.dirname(__FILE__))
3
+
4
+ def self.plugin(mixin)
5
+ include mixin
6
+ extend mixin::ClassMethods if defined?(mixin::ClassMethods)
7
+
8
+ mixin.setup(self) if mixin.respond_to?(:setup)
9
+ end
10
+
11
+ # TODO: remove this as soon as cuba core implements this.
12
+ def session
13
+ env["rack.session"]
14
+ end
15
+
16
+ autoload :Prelude, "cuba/contrib/prelude"
17
+ autoload :Rendering, "cuba/contrib/rendering"
18
+ autoload :Settings, "cuba/contrib/settings"
19
+ autoload :Mote, "cuba/contrib/mote"
20
+ autoload :TextHelpers, "cuba/contrib/text_helpers"
21
+ autoload :FormHelpers, "cuba/contrib/form_helpers"
22
+ end
@@ -0,0 +1,107 @@
1
+ class Cuba
2
+ module FormHelpers
3
+ include Cuba::Prelude
4
+
5
+ def cuba_contrib_partial(template, locals = {})
6
+ partial(cuba_contrib_path("%s.mote" % template), locals)
7
+ end
8
+
9
+ def cuba_contrib_path(*args)
10
+ File.join(Cuba::CONTRIB_ROOT, "views", *args)
11
+ end
12
+
13
+ def cuba_contrib_form(record)
14
+ view(cuba_contrib_path("form"), model: record)
15
+ end
16
+
17
+ def select_options(pairs, selected = nil, prompt = nil)
18
+ "".tap do |ret|
19
+ ret << option_tag(prompt, "") if prompt
20
+
21
+ pairs.each do |label, value|
22
+ ret << option_tag(label, value, selected)
23
+ end
24
+ end
25
+ end
26
+
27
+ def option_tag(label, value, selected = nil)
28
+ cuba_contrib_partial("option", selected: selected, value: value, label: label)
29
+ end
30
+
31
+ def datefield(model, field, hint = nil)
32
+ input(model, field, hint) do
33
+ cuba_contrib_partial("textfield",
34
+ name: field_name(model, field),
35
+ value: model.send(field),
36
+ class: "date"
37
+ )
38
+ end
39
+ end
40
+
41
+ def textfield(model, field, hint = nil)
42
+ input(model, field, hint) do
43
+ cuba_contrib_partial("textfield",
44
+ name: field_name(model, field),
45
+ value: model.send(field)
46
+ )
47
+ end
48
+ end
49
+
50
+ def password_field(model, field, hint = nil)
51
+ input(model, field, hint) do
52
+ cuba_contrib_partial("password",
53
+ name: field_name(model, field)
54
+ )
55
+ end
56
+ end
57
+
58
+ def filefield(model, field, hint = nil)
59
+ input(model, field, hint) do
60
+ cuba_contrib_partial("file",
61
+ name: field_name(model, field)
62
+ )
63
+ end
64
+ end
65
+
66
+ def textarea(model, field, hint = nil)
67
+ input(model, field, hint) do
68
+ cuba_contrib_partial("textarea",
69
+ name: field_name(model, field),
70
+ value: model.send(field)
71
+ )
72
+ end
73
+ end
74
+
75
+ def dropdown(model, field, options, hint = nil)
76
+ input(model, field, hint) do
77
+ cuba_contrib_partial("select",
78
+ name: field_name(model, field),
79
+ options: select_options(options, model.send(field))
80
+ )
81
+ end
82
+ end
83
+
84
+ def input(model, field, hint)
85
+ cuba_contrib_partial("field",
86
+ label: humanize(field),
87
+ input: yield,
88
+ hint: hint,
89
+ error: localize_errors(model, field).join(", ")
90
+ )
91
+ end
92
+
93
+ def localize_errors(model, field)
94
+ model.errors[field].map do |err|
95
+ unless settings.localized_errors[err]
96
+ raise "No localized error defined for: #{err}"
97
+ end
98
+
99
+ settings.localized_errors[err] % { field: humanize(field) }
100
+ end
101
+ end
102
+
103
+ def field_name(model, field)
104
+ "#{underscore(model.class.name)}[#{field}]"
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,49 @@
1
+ require "mote"
2
+
3
+ class Cuba
4
+ module Mote
5
+ include ::Mote::Helpers
6
+
7
+ def self.setup(app)
8
+ app.plugin Cuba::Settings
9
+
10
+ app.set :views, File.expand_path("views", Dir.pwd)
11
+ app.set :layout, "layout"
12
+ end
13
+
14
+ def partial(template, locals = {})
15
+ mote(mote_path(template), locals)
16
+ end
17
+
18
+ def view(template, locals = {})
19
+ raise NoLayout.new(self) unless settings.layout
20
+
21
+ partial(
22
+ settings.layout,
23
+ locals.merge(mote_vars(partial(template, locals)))
24
+ )
25
+ end
26
+
27
+ def mote_path(template)
28
+ return template if template.end_with?(".mote")
29
+
30
+ File.expand_path("#{template}.mote", settings.views)
31
+ end
32
+
33
+ def mote_vars(content)
34
+ { content: content, session: session }
35
+ end
36
+
37
+ class NoLayout < StandardError
38
+ attr :instance
39
+
40
+ def initialize(instance)
41
+ @instance = instance
42
+ end
43
+
44
+ def message
45
+ "Missing Layout: Try doing #{instance.class}.set :layout, 'layout'"
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,14 @@
1
+ require "uri"
2
+
3
+ class Cuba
4
+ module Prelude
5
+ def urlencode(str)
6
+ URI.encode_www_form_component(str)
7
+ end
8
+
9
+ def escape_html(str)
10
+ Rack::Utils.escape_html(str)
11
+ end
12
+ alias :h :escape_html
13
+ end
14
+ end
@@ -0,0 +1,41 @@
1
+ require "tilt"
2
+
3
+ class Cuba
4
+ module Rendering
5
+ def self.setup(app)
6
+ app.plugin Cuba::Settings
7
+ app.set :template_engine, "erb"
8
+ app.set :views, File.expand_path("views", Dir.pwd)
9
+ end
10
+
11
+ def view(template, locals = {})
12
+ partial("layout", { content: partial(template, locals) }.merge(locals))
13
+ end
14
+
15
+ def partial(template, locals = {})
16
+ render("#{settings.views}/#{template}.#{settings.template_engine}", locals)
17
+ end
18
+
19
+ # Render any type of template file supported by Tilt.
20
+ #
21
+ # @example
22
+ #
23
+ # # Renders home, and is assumed to be HAML.
24
+ # render("home.haml")
25
+ #
26
+ # # Renders with some local variables
27
+ # render("home.haml", site_name: "My Site")
28
+ #
29
+ # # Renders with HAML options
30
+ # render("home.haml", {}, ugly: true, format: :html5)
31
+ #
32
+ # # Renders in layout
33
+ # render("layout.haml") { render("home.haml") }
34
+ #
35
+ def render(template, locals = {}, options = {}, &block)
36
+ _cache.fetch(template, locals) {
37
+ Tilt.new(template, 1, options)
38
+ }.render(self, locals, &block)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,20 @@
1
+ class Cuba
2
+ module Settings
3
+ def settings
4
+ self.class
5
+ end
6
+
7
+ module ClassMethods
8
+ def set(key, value)
9
+ metaclass.send :attr_accessor, key
10
+
11
+ send :"#{key}=", value
12
+ end
13
+
14
+ private
15
+ def metaclass
16
+ class << self; self; end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ class Cuba
2
+ module TextHelpers
3
+ def markdown(str)
4
+ require "bluecloth"
5
+
6
+ BlueCloth.new(str).to_html
7
+ end
8
+
9
+ def truncate(str, length, ellipses = "...")
10
+ return str if str.length <= length
11
+
12
+ sprintf("%.#{length}s#{ellipses}", str)
13
+ end
14
+
15
+ def nl2br(str)
16
+ str.gsub(/\n|\r\n/, "<br>")
17
+ end
18
+
19
+ def currency(amount, unit = "$")
20
+ "#{unit} %.2f" % amount
21
+ end
22
+
23
+ def titlecase(str)
24
+ str.to_s.tr("_", " ").gsub(/(^|\s)([a-z])/) { |char| char.upcase }
25
+ end
26
+
27
+ def humanize(str)
28
+ titlecase(str.to_s.tr("_", " ").gsub(/_id$/, ""))
29
+ end
30
+
31
+ def underscore(str)
32
+ str.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').downcase
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ class Cuba
2
+ module Contrib
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
data/rakefile ADDED
@@ -0,0 +1,7 @@
1
+ task :test do
2
+ require "cutest"
3
+
4
+ Cutest.run(Dir["test/*.rb"])
5
+ end
6
+
7
+ task :default => :test
data/test/contrib.rb ADDED
@@ -0,0 +1,68 @@
1
+ require_relative "helper"
2
+
3
+ scope do
4
+ module Helper
5
+ def clean(str)
6
+ str.strip
7
+ end
8
+ end
9
+
10
+ Cuba.plugin Helper
11
+
12
+ Cuba.define do
13
+ on default do
14
+ res.write clean " foo "
15
+ end
16
+ end
17
+
18
+ test do
19
+ _, _, body = Cuba.call({ "PATH_INFO" => "", "SCRIPT_NAME" => "" })
20
+
21
+ assert_response body, ["foo"]
22
+ end
23
+ end
24
+
25
+ scope do
26
+ module Number
27
+ def num
28
+ 1
29
+ end
30
+ end
31
+
32
+ module Plugin
33
+ def self.setup(app)
34
+ app.plugin Number
35
+ end
36
+
37
+ def bar
38
+ "baz"
39
+ end
40
+
41
+ module ClassMethods
42
+ def foo
43
+ "bar"
44
+ end
45
+ end
46
+ end
47
+
48
+ Cuba.reset!
49
+
50
+ Cuba.plugin Plugin
51
+
52
+ Cuba.define do
53
+ on default do
54
+ res.write bar
55
+ res.write num
56
+ end
57
+ end
58
+
59
+ test do
60
+ assert_equal "bar", Cuba.foo
61
+ end
62
+
63
+ test do
64
+ _, _, body = Cuba.call({ "PATH_INFO" => "", "SCRIPT_NAME" => "" })
65
+
66
+ assert_response body, ["baz", "1"]
67
+ end
68
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,11 @@
1
+ $:.unshift(File.expand_path("../lib", File.dirname(__FILE__)))
2
+
3
+ require "cuba"
4
+ require "cuba/contrib"
5
+
6
+ def assert_response(body, expected)
7
+ arr = []
8
+ body.each { |line| arr << line }
9
+
10
+ assert_equal arr, expected
11
+ end
data/test/mote.rb ADDED
@@ -0,0 +1,37 @@
1
+ require_relative "helper"
2
+
3
+ Cuba.plugin Cuba::Mote
4
+
5
+ Cuba.set :views, "./test/views"
6
+
7
+ Cuba.define do
8
+ on "frag" do
9
+ res.write partial("frag", foo: "Bar")
10
+ end
11
+
12
+ on "" do
13
+ res.write view("home", title: "Hola")
14
+ end
15
+
16
+ on "abs_path" do
17
+ res.write view("./test/views/custom/abs_path.mote", title: "Absolute")
18
+ end
19
+ end
20
+
21
+ test do
22
+ _, _, body = Cuba.call({ "PATH_INFO" => "/", "SCRIPT_NAME" => "" })
23
+
24
+ assert_response body, ["<title>Hola</title>\n<h1>Home</h1>"]
25
+ end
26
+
27
+ test do
28
+ _, _, body = Cuba.call({ "PATH_INFO" => "/frag", "SCRIPT_NAME" => "" })
29
+
30
+ assert_response body, ["<h1>Bar</h1>"]
31
+ end
32
+
33
+ test do
34
+ _, _, body = Cuba.call({ "PATH_INFO" => "/abs_path", "SCRIPT_NAME" => "" })
35
+
36
+ assert_response body, ["<title>Absolute</title>\n<h1>Abs Path</h1>"]
37
+ end
data/test/rendering.rb ADDED
@@ -0,0 +1,42 @@
1
+ require_relative "helper"
2
+
3
+ Cuba.plugin Cuba::Rendering
4
+ Cuba.views = "./test/views"
5
+
6
+ Cuba.define do
7
+ on "home" do
8
+ res.write view("home", name: "Agent Smith", title: "Home")
9
+ end
10
+
11
+ on "about" do
12
+ res.write partial("about", title: "About Cuba")
13
+ end
14
+ end
15
+
16
+ test "partial" do
17
+ _, _, body = Cuba.call({ "PATH_INFO" => "/about", "SCRIPT_NAME" => "/" })
18
+
19
+ assert_response body, ["<h1>About Cuba</h1>"]
20
+ end
21
+
22
+ test "view" do
23
+ _, _, body = Cuba.call({ "PATH_INFO" => "/home", "SCRIPT_NAME" => "/" })
24
+
25
+ assert_response body, ["<title>Cuba: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>"]
26
+ end
27
+
28
+ test "partial with str as engine" do
29
+ Cuba.template_engine = "str"
30
+
31
+ _, _, body = Cuba.call({ "PATH_INFO" => "/about", "SCRIPT_NAME" => "/" })
32
+
33
+ assert_response body, ["<h1>About Cuba</h1>"]
34
+ end
35
+
36
+ test "view with str as engine" do
37
+ Cuba.template_engine = "str"
38
+
39
+ _, _, body = Cuba.call({ "PATH_INFO" => "/home", "SCRIPT_NAME" => "/" })
40
+
41
+ assert_response body, ["<title>Cuba: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>"]
42
+ end
data/test/settings.rb ADDED
@@ -0,0 +1,24 @@
1
+ require_relative "helper"
2
+
3
+ Cuba.plugin Cuba::Settings
4
+ Cuba.set :foo, "bar"
5
+
6
+ Cuba.define do
7
+ on default do
8
+ res.write settings.foo
9
+ end
10
+ end
11
+
12
+ test do
13
+ assert_equal "bar", Cuba.foo
14
+ end
15
+
16
+ test do
17
+ _, _, body = Cuba.call({ "PATH_INFO" => "", "SCRIPT_NAME" => "" })
18
+ assert_response body, ["bar"]
19
+ end
20
+
21
+ test do
22
+ Cuba.foo = "baz"
23
+ assert_equal "baz", Cuba.foo
24
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative "helper"
4
+
5
+ setup do
6
+ obj = Object.new
7
+ obj.extend Cuba::TextHelpers
8
+ end
9
+
10
+ test "truncate" do |helper|
11
+ assert_equal "the q...", helper.truncate("the quick brown", 5)
12
+
13
+ assert_equal "same string", helper.truncate("same string", 11)
14
+ end
15
+
16
+ test "markdown" do |helper|
17
+ assert_equal "<h1>Hola Mundo</h1>", helper.markdown("# Hola Mundo")
18
+ end
19
+
20
+ test "nl2br" do |helper|
21
+ assert_equal "Hi<br>there<br>Joe", helper.nl2br("Hi\nthere\r\nJoe")
22
+ end
23
+
24
+ test "currency" do |helper|
25
+ assert_equal "$ 2.22", helper.currency(2.221)
26
+ assert_equal "€ 2.22", helper.currency(2.221, "€")
27
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cuba-contrib
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Cyril David
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-04 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: cuba
16
+ requirement: &2152741820 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2152741820
25
+ - !ruby/object:Gem::Dependency
26
+ name: cutest
27
+ requirement: &2152741300 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2152741300
36
+ - !ruby/object:Gem::Dependency
37
+ name: capybara
38
+ requirement: &2152740680 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2152740680
47
+ description: Includes various helper tools for Cuba.
48
+ email:
49
+ - me@cyrildavid.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - LICENSE
55
+ - README.markdown
56
+ - rakefile
57
+ - lib/cuba/contrib/form_helpers.rb
58
+ - lib/cuba/contrib/mote.rb
59
+ - lib/cuba/contrib/prelude.rb
60
+ - lib/cuba/contrib/rendering.rb
61
+ - lib/cuba/contrib/settings.rb
62
+ - lib/cuba/contrib/text_helpers.rb
63
+ - lib/cuba/contrib/version.rb
64
+ - lib/cuba/contrib.rb
65
+ - cuba-contrib.gemspec
66
+ - test/contrib.rb
67
+ - test/helper.rb
68
+ - test/mote.rb
69
+ - test/rendering.rb
70
+ - test/settings.rb
71
+ - test/text_helper.rb
72
+ homepage: http://github.com/cyx/cuba-contrib
73
+ licenses: []
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 1.8.11
93
+ signing_key:
94
+ specification_version: 3
95
+ summary: Cuba plugins and utilities.
96
+ test_files: []