tennpipes-base 3.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +294 -0
- data/Rakefile +1 -0
- data/bin/tennpipes +8 -0
- data/lib/tennpipes-base.rb +196 -0
- data/lib/tennpipes-base/application.rb +175 -0
- data/lib/tennpipes-base/application/application_setup.rb +202 -0
- data/lib/tennpipes-base/application/authenticity_token.rb +25 -0
- data/lib/tennpipes-base/application/flash.rb +229 -0
- data/lib/tennpipes-base/application/params_protection.rb +129 -0
- data/lib/tennpipes-base/application/routing.rb +1002 -0
- data/lib/tennpipes-base/application/show_exceptions.rb +50 -0
- data/lib/tennpipes-base/caller.rb +53 -0
- data/lib/tennpipes-base/cli/adapter.rb +33 -0
- data/lib/tennpipes-base/cli/base.rb +105 -0
- data/lib/tennpipes-base/cli/console.rb +20 -0
- data/lib/tennpipes-base/cli/launcher.rb +103 -0
- data/lib/tennpipes-base/cli/rake.rb +50 -0
- data/lib/tennpipes-base/cli/rake_tasks.rb +72 -0
- data/lib/tennpipes-base/command.rb +38 -0
- data/lib/tennpipes-base/ext/sinatra.rb +29 -0
- data/lib/tennpipes-base/filter.rb +52 -0
- data/lib/tennpipes-base/images/404.png +0 -0
- data/lib/tennpipes-base/images/500.png +0 -0
- data/lib/tennpipes-base/loader.rb +202 -0
- data/lib/tennpipes-base/logger.rb +492 -0
- data/lib/tennpipes-base/module.rb +58 -0
- data/lib/tennpipes-base/mounter.rb +308 -0
- data/lib/tennpipes-base/path_router.rb +119 -0
- data/lib/tennpipes-base/path_router/compiler.rb +110 -0
- data/lib/tennpipes-base/path_router/error_handler.rb +8 -0
- data/lib/tennpipes-base/path_router/matcher.rb +123 -0
- data/lib/tennpipes-base/path_router/route.rb +169 -0
- data/lib/tennpipes-base/reloader.rb +309 -0
- data/lib/tennpipes-base/reloader/rack.rb +26 -0
- data/lib/tennpipes-base/reloader/storage.rb +55 -0
- data/lib/tennpipes-base/router.rb +98 -0
- data/lib/tennpipes-base/server.rb +119 -0
- data/lib/tennpipes-base/tasks.rb +21 -0
- data/lib/tennpipes-base/version.rb +20 -0
- data/lib/tennpipes-base/version.rb~ +20 -0
- data/test/fixtures/app_gem/Gemfile +4 -0
- data/test/fixtures/app_gem/app/app.rb +3 -0
- data/test/fixtures/app_gem/app_gem.gemspec +17 -0
- data/test/fixtures/app_gem/lib/app_gem.rb +7 -0
- data/test/fixtures/app_gem/lib/app_gem/version.rb +3 -0
- data/test/fixtures/apps/complex.rb +32 -0
- data/test/fixtures/apps/demo_app.rb +7 -0
- data/test/fixtures/apps/demo_demo.rb +7 -0
- data/test/fixtures/apps/demo_project/api/app.rb +7 -0
- data/test/fixtures/apps/demo_project/api/lib/api_lib.rb +3 -0
- data/test/fixtures/apps/demo_project/app.rb +7 -0
- data/test/fixtures/apps/external_apps/fake_lib.rb +1 -0
- data/test/fixtures/apps/external_apps/fake_root.rb +2 -0
- data/test/fixtures/apps/helpers/class_methods_helpers.rb +4 -0
- data/test/fixtures/apps/helpers/instance_methods_helpers.rb +4 -0
- data/test/fixtures/apps/helpers/support.rb +1 -0
- data/test/fixtures/apps/helpers/system_helpers.rb +8 -0
- data/test/fixtures/apps/kiq.rb +3 -0
- data/test/fixtures/apps/lib/myklass.rb +2 -0
- data/test/fixtures/apps/lib/myklass/mysubklass.rb +4 -0
- data/test/fixtures/apps/models/child.rb +2 -0
- data/test/fixtures/apps/models/parent.rb +5 -0
- data/test/fixtures/apps/mountable_apps/rack_apps.rb +15 -0
- data/test/fixtures/apps/mountable_apps/static.html +1 -0
- data/test/fixtures/apps/precompiled_app.rb +19 -0
- data/test/fixtures/apps/simple.rb +32 -0
- data/test/fixtures/apps/static.rb +10 -0
- data/test/fixtures/apps/system.rb +13 -0
- data/test/fixtures/apps/system_class_methods_demo.rb +7 -0
- data/test/fixtures/apps/system_instance_methods_demo.rb +7 -0
- data/test/fixtures/dependencies/a.rb +9 -0
- data/test/fixtures/dependencies/b.rb +4 -0
- data/test/fixtures/dependencies/c.rb +1 -0
- data/test/fixtures/dependencies/circular/e.rb +13 -0
- data/test/fixtures/dependencies/circular/f.rb +2 -0
- data/test/fixtures/dependencies/circular/g.rb +2 -0
- data/test/fixtures/dependencies/d.rb +4 -0
- data/test/fixtures/reloadable_apps/external/app/app.rb +6 -0
- data/test/fixtures/reloadable_apps/external/app/controllers/base.rb +6 -0
- data/test/fixtures/reloadable_apps/main/app.rb +10 -0
- data/test/helper.rb +30 -0
- data/test/test_application.rb +185 -0
- data/test/test_core.rb +93 -0
- data/test/test_csrf_protection.rb +208 -0
- data/test/test_dependencies.rb +57 -0
- data/test/test_filters.rb +389 -0
- data/test/test_flash.rb +168 -0
- data/test/test_locale.rb +21 -0
- data/test/test_logger.rb +295 -0
- data/test/test_mounter.rb +302 -0
- data/test/test_params_protection.rb +195 -0
- data/test/test_reloader_complex.rb +74 -0
- data/test/test_reloader_external.rb +21 -0
- data/test/test_reloader_simple.rb +101 -0
- data/test/test_reloader_system.rb +113 -0
- data/test/test_restful_routing.rb +33 -0
- data/test/test_router.rb +281 -0
- data/test/test_routing.rb +2328 -0
- metadata +301 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cbcb2d5135e3229fa1a8c47913992afd6c80b665
|
4
|
+
data.tar.gz: 2041d262a1202552fcd382bea5d0e4a7f7be8375
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 78733ce2ec65e8b5b2e2c0306e87110f5d2739462c86d7b3e3c381b7890bb739ee19a1c3ec39194a2891a13b30bdda8d3f6bf206712fba2bbf5a18649aacf3f2
|
7
|
+
data.tar.gz: 40272f77796040f4aa8d42af105f185a002bb4629cac7ed2e3b91ba9ce5f1aab40dcbf7f625d383fe4a3746432ff28a721df80fd6a339e9cba741ef35823302c
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Tennpipes
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,294 @@
|
|
1
|
+
= Tennpipes (tennpipes-base)
|
2
|
+
|
3
|
+
Tennpipes is the framework based on Sinatra.
|
4
|
+
|
5
|
+
== Preface
|
6
|
+
|
7
|
+
Tennpipes is a ruby framework built upon the excellent {Sinatra Microframework}[http://www.sinatrarb.com].
|
8
|
+
Sinatra is a DSL for creating simple web applications in Ruby with speed and minimal effort.
|
9
|
+
This framework tries hard to make it as fun and easy as possible to code much more advanced web applications by
|
10
|
+
building upon the Sinatra philosophies and foundation.
|
11
|
+
|
12
|
+
== Introduction
|
13
|
+
|
14
|
+
Many people love Sinatra's simplicity and lightweight but often quickly come to miss a great deal
|
15
|
+
of functionality provided by other web frameworks such as Rails when building non-trivial applications.
|
16
|
+
|
17
|
+
Our goal with this framework is to match the essence of Sinatra and at the same time create a standard library
|
18
|
+
of tools, helpers and components that will make Sinatra suitable for more complex applications.
|
19
|
+
|
20
|
+
Here is a brief overview of functionality provided by the Tennpipes framework:
|
21
|
+
|
22
|
+
Agnostic:: Full support for many popular testing, templating, mocking, and data storage choices.
|
23
|
+
Generators:: Create Tennpipes applications, models, controllers i.e: tennpipes-init project.
|
24
|
+
Mountable:: Unlike other ruby frameworks, principally designed for mounting multiple apps.
|
25
|
+
Routing:: Full url named routes, named params, before/after filter support.
|
26
|
+
Tag Helpers:: View helpers such as: tag, content_tag, input_tag.
|
27
|
+
Asset Helpers:: View helpers such as: link_to, image_tag, javascript_include_tag.
|
28
|
+
Form Helpers:: Builder support such as: form_tag, form_for, field_set_tag, text_field.
|
29
|
+
Text Helpers:: Useful formatting like: time_ago_in_words, js_escape_html, sanitize_html.
|
30
|
+
Mailer:: Fast and simple delivery support for sending emails (akin to ActionMailer).
|
31
|
+
Admin:: Builtin Admin interface (like Django)
|
32
|
+
Logging:: Provide a unified logger that can interact with your ORM or any library.
|
33
|
+
Reloading:: Automatically reloads server code during development.
|
34
|
+
Localization:: Full support of I18n language localization and can auto-set user's locale.
|
35
|
+
|
36
|
+
Keep in mind, the user will be able to pull in these components
|
37
|
+
{seperately into existing Sinatra applications}[http://www.tennpipesrb.com/guides/standalone-usage-in-sinatra]
|
38
|
+
or use them altogether for a comprehensive upgrade to Sinatra (a full-stack Tennpipes application).
|
39
|
+
|
40
|
+
== Installation
|
41
|
+
|
42
|
+
To install the tennpipes framework, simply grab the latest version from gemcutter:
|
43
|
+
|
44
|
+
$ sudo gem install tennpipes
|
45
|
+
|
46
|
+
This will install the necessary tennpipes gems to get you started.
|
47
|
+
Now you are ready to use this gem to enhance your sinatra projects or to create new Tennpipes applications.
|
48
|
+
|
49
|
+
For a more detailed look at Tennpipes installation,
|
50
|
+
check out the {Installation Guide}[http://www.tennpipesrb.com/guides/installation].
|
51
|
+
|
52
|
+
== Usage
|
53
|
+
|
54
|
+
Tennpipes is a framework which builds on the existing functionality and Sinatra and provides a variety of
|
55
|
+
additional tools and helpers to build upon that foundation. This README and Tennpipes documentation in general will focus
|
56
|
+
on the enhancements to the core Sinatra functionality. To use Tennpipes, one should be familiar with the basic
|
57
|
+
usage of Sinatra itself.
|
58
|
+
|
59
|
+
Please check out the
|
60
|
+
{Understanding Sinatra}[http://www.tennpipesrb.com/guides/underlying-sinatra-overview] guide
|
61
|
+
to learn more about these fundamentals.
|
62
|
+
|
63
|
+
For information on how to use a specific gem in isolation within an existing Sinatra project, checkout the guide for
|
64
|
+
{Using Tennpipes in Sinatra}[http://www.tennpipesrb.com/guides/standalone-usage-in-sinatra].
|
65
|
+
|
66
|
+
== Getting Started
|
67
|
+
|
68
|
+
Once a developer understands Sinatra, Tennpipes is quite easy to get comfortable with since Tennpipes is simply a superset
|
69
|
+
of existing Sinatra Functionality! Best way to get started with building Tennpipes applications is to read following resources:
|
70
|
+
|
71
|
+
* {Blog Tutorial}[http://www.tennpipesrb.com/guides/blog-tutorial] - Step-by-step guide to building a blog application with Tennpipes.
|
72
|
+
* {Quick Overview}[http://www.tennpipesrb.com/guides/basic-projects] - Outlines basic generation commands.
|
73
|
+
* {Tennpipes Examples}[http://www.tennpipesrb.com/guides/examples] - List of known Tennpipes applications which can serve as examples.
|
74
|
+
|
75
|
+
== Enhanced Base Application (tennpipes-base)
|
76
|
+
|
77
|
+
Sinatra has support for classes which can be extended to create an application: <tt>Sinatra::Base</tt> and <tt>Sinatra::Application</tt>
|
78
|
+
These classes can be extended in order to create a Sinatra web application. These classes provide support for all the basic
|
79
|
+
functionality afforded by Sinatra.
|
80
|
+
|
81
|
+
Tennpipes has support for an enhanced base application class <tt>Tennpipes::Application</tt>. <tt>Tennpipes::Application</tt>
|
82
|
+
expands the capabilities of Sinatra::Application and automatically provides the resulting application access to all of
|
83
|
+
the tennpipes framework's functionalities.
|
84
|
+
|
85
|
+
=== Simple Application Definition
|
86
|
+
|
87
|
+
Let us first take a look at the simplest possible Tennpipes application:
|
88
|
+
|
89
|
+
# app.rb
|
90
|
+
TENNPIPES_ROOT = File.dirname(__FILE__) unless defined? TENNPIPES_ROOT
|
91
|
+
require 'tennpipes'
|
92
|
+
Tennpipes.load!
|
93
|
+
|
94
|
+
class SimpleApp < Tennpipes::Application
|
95
|
+
get '/' do
|
96
|
+
'Hello world'
|
97
|
+
end
|
98
|
+
|
99
|
+
# and for read better we can divide with controllers
|
100
|
+
controller '/admin' do
|
101
|
+
get '/foo' do
|
102
|
+
'Url is /admin/foo'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
=== Enhanced Route Definitions and Controllers
|
108
|
+
|
109
|
+
For a complete overview of the Tennpipes routing and controller system,
|
110
|
+
check out the {Routing and Controller guide}[http://www.tennpipesrb.com/guides/controllers].
|
111
|
+
|
112
|
+
Suppose we wanted to add additional routes to our Tennpipes application, and we want to organize the routes
|
113
|
+
within a more structured layout. Simply add a <tt>controllers</tt> or <tt>app/controllers</tt> folder and create a file as such:
|
114
|
+
|
115
|
+
# Simple Example
|
116
|
+
SimpleApp.controllers do
|
117
|
+
get "/test" do
|
118
|
+
"Text to return"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
You can also do more complex route alias definitions:
|
123
|
+
|
124
|
+
# app/controllers/example.rb
|
125
|
+
SimpleApp.controllers :posts do
|
126
|
+
get :index do
|
127
|
+
...
|
128
|
+
end
|
129
|
+
|
130
|
+
get :show, :with => :id do
|
131
|
+
# url generated is '/posts/show/:id'
|
132
|
+
# access params[:id]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
as well as mapping the route aliases to an explicit url:
|
137
|
+
|
138
|
+
# app/controllers/example.rb
|
139
|
+
SimpleApp.controllers do
|
140
|
+
get :index, :map => '/index' do
|
141
|
+
...
|
142
|
+
end
|
143
|
+
|
144
|
+
get :account, :map => '/the/accounts/:name/and/:id' do
|
145
|
+
# access params[:name] and params[:index]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
and even configure the +provides+ for each route:
|
150
|
+
|
151
|
+
# app/controllers/example.rb
|
152
|
+
SimpleApp.controllers :admin do
|
153
|
+
get :show, :with => :id, :provides => :js do
|
154
|
+
"Url is /admin/show/#{params[:id]}.#{params[:format]}"
|
155
|
+
end
|
156
|
+
|
157
|
+
get :other, :with => [:id, :name], :provides => [:html, :json] do
|
158
|
+
case content_type
|
159
|
+
when :js then ... end
|
160
|
+
when :json then ... end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
or auto lookup for current locale or content_type
|
166
|
+
|
167
|
+
# app/controllers/example.rb
|
168
|
+
SimpleApp.controllers :admin do
|
169
|
+
get :show, :with => :id, :provides => [:html, :js] do
|
170
|
+
render "admin/show"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
When you visit :+show+ and your I18n.locale == :ru Tennpipes try to look for "admin/show.ru.js.*" if nothing match that path
|
175
|
+
they try "admin/show.ru.*" then "admin/show.js.*" if none match return "admin/show.erb" (or other engine i.e. haml)
|
176
|
+
|
177
|
+
For a complete overview of the routing and controller system, check out the
|
178
|
+
{Routing and Controller guide}[http://www.tennpipesrb.com/guides/controllers].
|
179
|
+
|
180
|
+
=== Rendering
|
181
|
+
|
182
|
+
Unlike Sinatra, Tennpipes supports automatic template lookups such as:
|
183
|
+
|
184
|
+
# searches for 'account/index.{erb,haml,...}
|
185
|
+
render 'account/index'
|
186
|
+
|
187
|
+
This render does not require any template engine to be specified and will choose the first one that is discovered.
|
188
|
+
The existing render function works as well if an engine type should be specified:
|
189
|
+
|
190
|
+
# example.haml
|
191
|
+
render :haml, 'account/index'
|
192
|
+
|
193
|
+
For a complete overview of the Tennpipes rendering system, check out the
|
194
|
+
{Routing and Controller guide}[http://www.tennpipesrb.com/guides/controllers].
|
195
|
+
|
196
|
+
=== Layout
|
197
|
+
|
198
|
+
With Tennpipes you can (like rails do) use for your custom layout, disable it
|
199
|
+
|
200
|
+
class SimpleApp < Tennpipes::Application
|
201
|
+
|
202
|
+
# Disable layouts
|
203
|
+
disable layout
|
204
|
+
|
205
|
+
# Use the layout located in views/layouts/custom.haml
|
206
|
+
layout :custom
|
207
|
+
|
208
|
+
For a complete overview of the layout functionality,
|
209
|
+
check out the {Routing and Controller guide}[http://www.tennpipesrb.com/guides/controllers].
|
210
|
+
|
211
|
+
=== Mounting Applications
|
212
|
+
|
213
|
+
Tennpipes applications are all automatically mountable into other Tennpipes projects. This means that a given Tennpipes
|
214
|
+
project directory can easily mount multiple applications. This allows for better organization of complex applications,
|
215
|
+
re-usable applications that can be applied (i.e admin, auth, blog) and even more flexibility.
|
216
|
+
|
217
|
+
You can think of mountable applications as a 'full-featured' merb slice or rails engine. Instead of a separate construct,
|
218
|
+
any application can simply be packaged and mounted into another project.
|
219
|
+
|
220
|
+
Tennpipes stores application mounting information by default within <tt>config/apps.rb</tt>. This file is intended
|
221
|
+
to keep all information regarding what applications are mounted to which uri's.
|
222
|
+
|
223
|
+
For a complete look at mounting applications within a Tennpipes project,
|
224
|
+
check out the guide on {Mounting Applications}[http://www.tennpipesrb.com/guides/mounting-applications].
|
225
|
+
|
226
|
+
=== Auto Load Paths
|
227
|
+
|
228
|
+
Tennpipes also intelligently supports requiring useful files within your application automatically and provides
|
229
|
+
functionality for easily splitting up your application into separate files. Tennpipes automatically requires <tt>config/database.rb</tt>
|
230
|
+
as a convention for establishing database connection. Also, any files within the <tt>lib</tt> folder will be required
|
231
|
+
automatically by Tennpipes.
|
232
|
+
|
233
|
+
For a complete overview of auto-loaded paths within Tennpipes,
|
234
|
+
check out the {Tennpipes Development Guide}[http://www.tennpipesrb.com/guides/development-and-terminal-commands].
|
235
|
+
|
236
|
+
=== Application Logging
|
237
|
+
|
238
|
+
Tennpipes also supports robust logging capabilities. By default, logging information will
|
239
|
+
go to the STDOUT in development (for use in a console) and in an environment-specific log file <tt>log/development.log</tt>
|
240
|
+
in test and production environments.
|
241
|
+
|
242
|
+
To use the logger within a Tennpipes application, simply refer to the <tt>logger</tt> method accessible
|
243
|
+
within your app and any controller or views:
|
244
|
+
|
245
|
+
# controllers/example.rb
|
246
|
+
SimpleApp.controllers do
|
247
|
+
get("/test") { logger.info "This is a test" }
|
248
|
+
end
|
249
|
+
|
250
|
+
For a complete overview of Tennpipes logger functionality, check out the
|
251
|
+
{Tennpipes Development Guide}[http://www.tennpipesrb.com/guides/development-and-terminal-commands].
|
252
|
+
|
253
|
+
=== Development Reloader
|
254
|
+
|
255
|
+
Tennpipes applications also have the enabled ability to automatically reload all changing application files without
|
256
|
+
the need to restart the server. Through the use of a customized Rack middleware, all files on the 'load path'
|
257
|
+
are monitored and reloaded whenever changes are applied.
|
258
|
+
|
259
|
+
This makes rapid development much easier and provides a better alternative to 'shotgun' or 'rerun'
|
260
|
+
which requires the application server to be restarted which makes requests take much longer to complete.
|
261
|
+
|
262
|
+
For a complete overview of code reloading in development,
|
263
|
+
check out the {Tennpipes Development Guide}[http://www.tennpipesrb.com/guides/development-and-terminal-commands].
|
264
|
+
|
265
|
+
=== Terminal Commands
|
266
|
+
|
267
|
+
Tennpipes also comes equipped with multiple useful terminal commands which can be activated to perform
|
268
|
+
common tasks such as starting / stopping the application, executing the unit tests or activating an irb session.
|
269
|
+
|
270
|
+
The following commands are available:
|
271
|
+
|
272
|
+
# starts the app server (non-daemonized)
|
273
|
+
$ tennpipes start
|
274
|
+
# starts the app server (daemonized) with given port, environment and adapter
|
275
|
+
$ tennpipes start -d -p 3000 -e development -a thin
|
276
|
+
|
277
|
+
# Stops a daemonized app server
|
278
|
+
$ tennpipes stop
|
279
|
+
|
280
|
+
# Bootup the Tennpipes console (irb)
|
281
|
+
$ tennpipes console
|
282
|
+
|
283
|
+
# Run/List tasks
|
284
|
+
$ tennpipes rake
|
285
|
+
|
286
|
+
You can also create custom rake tasks as well. Using these commands can simplify common tasks
|
287
|
+
making development that much smoother.
|
288
|
+
|
289
|
+
For a complete overview of Tennpipes terminal commands, check out the
|
290
|
+
{Tennpipes Commands Guide}[http://www.tennpipesrb.com/guides/development-and-terminal-commands].
|
291
|
+
|
292
|
+
== Copyright
|
293
|
+
|
294
|
+
Copyright (c) 2011-2013 Tennpipes. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../gem_rake_helper')
|
data/bin/tennpipes
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'bundler/setup' if %w(Gemfile .components).all? { |f| File.exist?(f) }
|
3
|
+
|
4
|
+
tennpipes_core_path = File.expand_path('../../lib', __FILE__)
|
5
|
+
$:.unshift(tennpipes_core_path) if File.directory?(tennpipes_core_path) && !$:.include?(tennpipes_core_path)
|
6
|
+
|
7
|
+
require 'tennpipes-base/cli/base'
|
8
|
+
Tennpipes::Cli::Base.start(ARGV)
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'tennpipes-base/version'
|
3
|
+
require 'tennpipes-assist'
|
4
|
+
require 'tennpipes-base/application'
|
5
|
+
|
6
|
+
require 'tennpipes-base/caller'
|
7
|
+
require 'tennpipes-base/command'
|
8
|
+
require 'tennpipes-base/loader'
|
9
|
+
require 'tennpipes-base/logger'
|
10
|
+
require 'tennpipes-base/mounter'
|
11
|
+
require 'tennpipes-base/reloader'
|
12
|
+
require 'tennpipes-base/router'
|
13
|
+
require 'tennpipes-base/server'
|
14
|
+
require 'tennpipes-base/tasks'
|
15
|
+
require 'tennpipes-base/module'
|
16
|
+
|
17
|
+
if ENV["TENNPIPES_ENV"] || defined?(TENNPIPES_ENV)
|
18
|
+
warn 'Environment variable TENNPIPES_ENV is deprecated. Please, use RACK_ENV.'
|
19
|
+
ENV["RACK_ENV"] ||= ENV["TENNPIPES_ENV"] ||= TENNPIPES_ENV
|
20
|
+
end
|
21
|
+
RACK_ENV = ENV["RACK_ENV"] ||= "development" unless defined?(RACK_ENV)
|
22
|
+
TENNPIPES_ROOT = ENV["TENNPIPES_ROOT"] ||= File.dirname(Tennpipes.first_caller) unless defined?(TENNPIPES_ROOT)
|
23
|
+
|
24
|
+
module Tennpipes
|
25
|
+
class ApplicationLoadError < RuntimeError # @private
|
26
|
+
end
|
27
|
+
|
28
|
+
extend Loader
|
29
|
+
|
30
|
+
class << self
|
31
|
+
##
|
32
|
+
# Helper method for file references.
|
33
|
+
#
|
34
|
+
# @param [Array<String>] args
|
35
|
+
# The directories to join to {TENNPIPES_ROOT}.
|
36
|
+
#
|
37
|
+
# @return [String]
|
38
|
+
# The absolute path.
|
39
|
+
#
|
40
|
+
# @example
|
41
|
+
# # Referencing a file in config called settings.yml
|
42
|
+
# Tennpipes.root("config", "settings.yml")
|
43
|
+
# # returns TENNPIPES_ROOT + "/config/setting.yml"
|
44
|
+
#
|
45
|
+
def root(*args)
|
46
|
+
File.expand_path(File.join(TENNPIPES_ROOT, *args))
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Helper method that return {RACK_ENV}.
|
51
|
+
#
|
52
|
+
# @return [Symbol]
|
53
|
+
# The Tennpipes Environment.
|
54
|
+
#
|
55
|
+
def env
|
56
|
+
@_env ||= RACK_ENV.to_s.downcase.to_sym
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# The resulting rack builder mapping each 'mounted' application.
|
61
|
+
#
|
62
|
+
# @return [Tennpipes::Router]
|
63
|
+
# The router for the application.
|
64
|
+
#
|
65
|
+
# @raise [ApplicationLoadError]
|
66
|
+
# No applications were mounted.
|
67
|
+
#
|
68
|
+
def application
|
69
|
+
warn 'WARNING! No apps are mounted. Please, mount apps in `config/apps.rb`' unless Tennpipes.mounted_apps.present?
|
70
|
+
router = Tennpipes::Router.new
|
71
|
+
Tennpipes.mounted_apps.each { |app| app.map_onto(router) }
|
72
|
+
middleware.present? ? add_middleware(router) : router
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# Configure Global Project Settings for mounted apps. These can be overloaded
|
77
|
+
# in each individual app's own personal configuration. This can be used like:
|
78
|
+
#
|
79
|
+
# @yield []
|
80
|
+
# The given block will be called to configure each application.
|
81
|
+
#
|
82
|
+
# @example
|
83
|
+
# Tennpipes.configure_apps do
|
84
|
+
# enable :sessions
|
85
|
+
# disable :raise_errors
|
86
|
+
# end
|
87
|
+
#
|
88
|
+
def configure_apps(&block)
|
89
|
+
return unless block_given?
|
90
|
+
global_configurations << block
|
91
|
+
end
|
92
|
+
|
93
|
+
##
|
94
|
+
# Stores global configuration blocks.
|
95
|
+
#
|
96
|
+
def global_configurations
|
97
|
+
@_global_configurations ||= []
|
98
|
+
end
|
99
|
+
|
100
|
+
##
|
101
|
+
# Set +Encoding.default_internal+ and +Encoding.default_external+
|
102
|
+
# to +Encoding::UFT_8+.
|
103
|
+
#
|
104
|
+
# Please note that in +1.9.2+ with some template engines like +haml+
|
105
|
+
# you should turn off Encoding.default_internal to prevent problems.
|
106
|
+
#
|
107
|
+
# @see https://github.com/rtomayko/tilt/issues/75
|
108
|
+
#
|
109
|
+
# @return [NilClass]
|
110
|
+
#
|
111
|
+
def set_encoding
|
112
|
+
Encoding.default_external = Encoding::UTF_8
|
113
|
+
Encoding.default_internal = Encoding::UTF_8
|
114
|
+
nil
|
115
|
+
end
|
116
|
+
|
117
|
+
##
|
118
|
+
# Creates Rack stack with the router added to the middleware chain.
|
119
|
+
#
|
120
|
+
def add_middleware(router)
|
121
|
+
builder = Rack::Builder.new
|
122
|
+
middleware.each{ |mw,args,block| builder.use(mw, *args, &block) }
|
123
|
+
builder.run(router)
|
124
|
+
builder.to_app
|
125
|
+
end
|
126
|
+
|
127
|
+
##
|
128
|
+
# A Rack::Builder object that allows to add middlewares in front of all
|
129
|
+
# Tennpipes applications.
|
130
|
+
#
|
131
|
+
# @return [Array<Array<Class, Array, Proc>>]
|
132
|
+
# The middleware classes.
|
133
|
+
#
|
134
|
+
def middleware
|
135
|
+
@middleware ||= []
|
136
|
+
end
|
137
|
+
|
138
|
+
##
|
139
|
+
# Clears all previously configured middlewares.
|
140
|
+
#
|
141
|
+
# @return [Array]
|
142
|
+
# An empty array
|
143
|
+
#
|
144
|
+
def clear_middleware!
|
145
|
+
@middleware = []
|
146
|
+
end
|
147
|
+
|
148
|
+
##
|
149
|
+
# Convenience method for adding a Middleware to the whole tennpipes app.
|
150
|
+
#
|
151
|
+
# @param [Class] m
|
152
|
+
# The middleware class.
|
153
|
+
#
|
154
|
+
# @param [Array] args
|
155
|
+
# The arguments for the middleware.
|
156
|
+
#
|
157
|
+
# @yield []
|
158
|
+
# The given block will be passed to the initialized middleware.
|
159
|
+
#
|
160
|
+
def use(mw, *args, &block)
|
161
|
+
middleware << [mw, args, block]
|
162
|
+
end
|
163
|
+
|
164
|
+
##
|
165
|
+
# Registers a gem with tennpipes. This relieves the caller from setting up
|
166
|
+
# loadpaths by itself and enables Tennpipes to look up apps in gem folder.
|
167
|
+
#
|
168
|
+
# The name given has to be the proper gem name as given in the gemspec.
|
169
|
+
#
|
170
|
+
# @param [String] name
|
171
|
+
# The name of the gem being registered.
|
172
|
+
#
|
173
|
+
# @param [Module] main_module
|
174
|
+
# The main module of the gem.
|
175
|
+
#
|
176
|
+
# @returns The root path of the loaded gem
|
177
|
+
def gem(name, main_module)
|
178
|
+
_, spec = Gem.loaded_specs.find{|spec_pair| spec_pair[0] == name }
|
179
|
+
gems << spec
|
180
|
+
modules << main_module
|
181
|
+
spec.full_gem_path
|
182
|
+
end
|
183
|
+
|
184
|
+
##
|
185
|
+
# @returns [Gem::Specification]
|
186
|
+
def gems
|
187
|
+
@gems ||= []
|
188
|
+
end
|
189
|
+
|
190
|
+
##
|
191
|
+
# @returns [<Tennpipes::Module>]
|
192
|
+
def modules
|
193
|
+
@modules ||= []
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|