sinatra_more 0.2.9 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/README.rdoc +48 -4
- data/Rakefile +2 -1
- data/TODO +2 -1
- data/VERSION +1 -1
- data/bin/sinatra_gen +5 -0
- data/generators/base_app/app/.empty_directory +0 -0
- data/generators/base_app/app/helpers/.empty_directory +0 -0
- data/generators/base_app/app/helpers/view_helpers.rb +3 -0
- data/generators/base_app/app/models/.empty_directory +0 -0
- data/generators/base_app/app/routes/.empty_directory +0 -0
- data/generators/base_app/app.rb.tt +5 -0
- data/generators/base_app/config/boot.rb.tt +37 -0
- data/generators/base_app/config/dependencies.rb.tt +26 -0
- data/generators/base_app/config.ru.tt +13 -0
- data/generators/base_app/lib/.empty_directory +0 -0
- data/generators/base_app/log/.empty_directory +0 -0
- data/generators/base_app/public/images/.empty_directory +0 -0
- data/generators/base_app/public/images/.gitignore +0 -0
- data/generators/base_app/public/javascripts/.empty_directory +0 -0
- data/generators/base_app/public/stylesheets/.empty_directory +0 -0
- data/generators/base_app/test/models/.empty_directory +0 -0
- data/generators/base_app/test/routes/.empty_directory +0 -0
- data/generators/base_app/test/test_config.rb.tt +6 -0
- data/generators/base_app/tmp/.empty_directory +0 -0
- data/generators/base_app/vendor/gems/.empty_directory +0 -0
- data/generators/components/component_actions.rb +37 -0
- data/generators/components/mocks/mocha_mock_gen.rb +8 -0
- data/generators/components/mocks/rr_mock_gen.rb +8 -0
- data/generators/components/orms/activerecord_orm_gen.rb +60 -0
- data/generators/components/orms/datamapper_orm_gen.rb +44 -0
- data/generators/components/orms/mongomapper_orm_gen.rb +94 -0
- data/generators/components/orms/sequel_orm_gen.rb +48 -0
- data/generators/components/renderers/erb_renderer_gen.rb +7 -0
- data/generators/components/renderers/haml_renderer_gen.rb +17 -0
- data/generators/components/scripts/jquery_script_gen.rb +9 -0
- data/generators/components/scripts/prototype_script_gen.rb +10 -0
- data/generators/components/scripts/rightjs_script_gen.rb +9 -0
- data/generators/components/tests/bacon_test_gen.rb +21 -0
- data/generators/components/tests/riot_test_gen.rb +19 -0
- data/generators/components/tests/rspec_test_gen.rb +19 -0
- data/generators/components/tests/shoulda_test_gen.rb +19 -0
- data/generators/components/tests/testspec_test_gen.rb +19 -0
- data/generators/generator_actions.rb +77 -0
- data/generators/skeleton_generator.rb +41 -0
- data/sinatra_more.gemspec +52 -5
- data/test/generators/test_skeleton_generator.rb +172 -0
- data/test/helper.rb +16 -0
- metadata +59 -7
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -58,9 +58,8 @@ Keep in mind, the user will be able to pull in these components seperately and l
|
|
58
58
|
Please help me brainstorm and fork the project if you have any ideas to contribute.
|
59
59
|
|
60
60
|
== Installation
|
61
|
-
|
62
|
-
|
63
|
-
If you want to use the WardenPlugin component, then the 'warden' gem would also be required.
|
61
|
+
|
62
|
+
If you want to use the WardenPlugin component, then the 'warden' gem would need to be installed.
|
64
63
|
|
65
64
|
To install sinatra_more, simply grab the latest version from gemcutter:
|
66
65
|
|
@@ -541,12 +540,57 @@ or perhaps we want to have a short body without the need for a template file:
|
|
541
540
|
body "This is a short body defined right in the mailer itself"
|
542
541
|
end
|
543
542
|
end
|
543
|
+
|
544
|
+
== Sinatra Generators
|
545
|
+
|
546
|
+
In addition to the support provided above, sinatra_more also comes preloaded with flexible code generators for Sinatra
|
547
|
+
powered in part by the excellent Thor gem (incidentally also used in the Rails 3 generators). These generators are intended
|
548
|
+
to allow for easy code generation both in creating new applications and building on existing ones. The generators have been
|
549
|
+
built to be as library-agnostic as possible, supporting a myriad of test frameworks, js libraries, mocking libraries, etc.
|
550
|
+
|
551
|
+
The usage for the generator is quite simple:
|
552
|
+
|
553
|
+
$ sinatra_gen <the_app_name> </path/to/create/app> --<component-name> <value>
|
554
|
+
|
555
|
+
The simplest possible command to generate a base application would be:
|
556
|
+
|
557
|
+
$ sinatra_gen demo_app .
|
558
|
+
|
559
|
+
This would construct a Sinatra application DemoApp (which extends from Sinatra::Application)
|
560
|
+
inside the folder 'demo_app' at our current path. Inside the application there would be configuration and
|
561
|
+
setup performed for the default components. You can also define specific components to be used:
|
544
562
|
|
563
|
+
$ sinatra_gen demo_app . --test=rspec --renderer=haml --mock=rr --script=jquery --orm datamapper
|
564
|
+
|
565
|
+
There is also support for aliases for each component within the command:
|
566
|
+
|
567
|
+
$ sinatra_gen demo_app . -t=rspec -r=haml -m=rr -s=jquery -d=datamapper
|
568
|
+
|
569
|
+
The available components and their default options are listed below:
|
570
|
+
|
571
|
+
* test: <tt>bacon</tt> (default), <tt>shoulda</tt>, <tt>rspec</tt>, <tt>testspec</tt>,<tt>riot</tt>
|
572
|
+
* renderer: <tt>erb</tt> (default), <tt>haml</tt>
|
573
|
+
* mock: <tt>mocha</tt> (default), <tt>rr</tt>
|
574
|
+
* script: <tt>jquery</tt> (default), <tt>prototype</tt>, <tt>rightjs</tt>
|
575
|
+
* orm: <tt>sequel</tt> (default), <tt>datamapper</tt>, <tt>mongomapper</tt>, <tt>activerecord</tt>
|
576
|
+
|
577
|
+
The generator framework within sinatra_more is highly extensible and additional components and tools can easily be added.
|
578
|
+
This would be achieved through forking our project and reading through the code in <tt>/generators/sinatra_generator.rb</tt> and
|
579
|
+
the setup instructions inside the relevant files within <tt>/generators/components/</tt>. We are happy to accept pull requests
|
580
|
+
for additional component types not originally included (although helping us maintain them would also be appreciated).
|
581
|
+
|
582
|
+
We are planning to add additional generator actions such as:
|
583
|
+
|
584
|
+
* Model generator (working for any of the available orms listed)
|
585
|
+
* Routes generator
|
586
|
+
* Migrations generator
|
587
|
+
|
545
588
|
== Acknowledgements
|
546
589
|
|
547
|
-
* Thanks to
|
590
|
+
* Thanks to kelredd (http://github.com/kelredd) for the <tt>sinatra_helpers</tt> code that helped me to create erb capture and concat methods.
|
548
591
|
* Thanks to sbfaulkner for the <tt>sinatra-helpers</tt> code that I browsed through many times while starting this library.
|
549
592
|
* Thanks to vestel for the excellent modified <tt>pony</tt> fork which in part powers the mailer_plugin (http://github.com/vestel/pony)
|
593
|
+
* Thanks to wycats and all for the awesome Thor gem which made creating the sinatra generator relatively painless
|
550
594
|
|
551
595
|
== Contributors
|
552
596
|
|
data/Rakefile
CHANGED
@@ -12,8 +12,9 @@ begin
|
|
12
12
|
gem.email = "nesquena@gmail.com"
|
13
13
|
gem.homepage = "http://github.com/nesquena/sinatra_more"
|
14
14
|
gem.authors = ["Nathan Esquenazi"]
|
15
|
-
gem.add_runtime_dependency "tilt", ">= 0.2"
|
16
15
|
gem.add_runtime_dependency "sinatra", ">= 0.9.2"
|
16
|
+
gem.add_runtime_dependency "tilt", ">= 0.2"
|
17
|
+
gem.add_runtime_dependency "thor", ">= 0.11.8"
|
17
18
|
gem.add_runtime_dependency "activesupport", ">= 2.2.2"
|
18
19
|
gem.add_development_dependency "haml", ">= 2.2.1"
|
19
20
|
gem.add_development_dependency "shoulda", ">= 2.10.2"
|
data/TODO
CHANGED
@@ -5,7 +5,8 @@
|
|
5
5
|
* Add support for check_box_group, radio_button_group which create a set of checkboxes or radio buttons
|
6
6
|
* Look into creating sinatra generators using rubigen (http://github.com/drnic/rubigen)
|
7
7
|
* http://github.com/quirkey/sinatra-gen
|
8
|
-
*
|
8
|
+
* test generators
|
9
|
+
* add support for model, routes, migration generator types
|
9
10
|
* Become total warden solution (basically just require warden gem installed, do everything else)
|
10
11
|
* Look into removing overlapping methods and simply leverage sinatra_warden
|
11
12
|
* Take advantage of shared strategies: http://github.com/hassox/warden_strategies/tree/master/lib/
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/bin/sinatra_gen
ADDED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# This file is merely for beginning the boot process, check dependencies.rb for more information
|
2
|
+
|
3
|
+
ROOT_DIR = File.dirname(__FILE__) + '/../' unless defined? ROOT_DIR
|
4
|
+
|
5
|
+
# Helper method for file references.
|
6
|
+
#
|
7
|
+
# @param args [Array] Path components relative to ROOT_DIR.
|
8
|
+
# @example Referencing a file in config called settings.yml:
|
9
|
+
# root_path("config", "settings.yml")
|
10
|
+
def root_path(*args)
|
11
|
+
File.join(ROOT_DIR, *args)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns the full path to the public folder along with any given additions
|
15
|
+
# public_path("images")
|
16
|
+
def public_path(*args)
|
17
|
+
root_path('public', *args)
|
18
|
+
end
|
19
|
+
|
20
|
+
class <%= @class_name %> < Sinatra::Application
|
21
|
+
# Defines basic application settings
|
22
|
+
set :root, root_path
|
23
|
+
set :views, root_path("app", "views")
|
24
|
+
set :images_path, public_path("images")
|
25
|
+
set :default_builder, 'StandardFormBuilder'
|
26
|
+
|
27
|
+
# Dependencies contains all required gems and core configuration
|
28
|
+
require File.dirname(__FILE__) + '/dependencies.rb'
|
29
|
+
|
30
|
+
# Requires the initializer modules which configure specific components
|
31
|
+
Dir[File.dirname(__FILE__) + '/initializers/*.rb'].each do |file|
|
32
|
+
# Each initializer file contains a module called 'XxxxInitializer' (i.e HassleInitializer)
|
33
|
+
require file
|
34
|
+
file_class = File.basename(file, '.rb').classify
|
35
|
+
register "#{file_class}Initializer".constantize
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Dependencies contains all required gems, helpers and core configuration
|
2
|
+
|
3
|
+
class <%= @class_name %> < Sinatra::Application
|
4
|
+
%w[rubygems rack-flash warden sinatra_more bcrypt].each { |gem| require gem }
|
5
|
+
|
6
|
+
# Required middleware
|
7
|
+
use Rack::Session::Cookie
|
8
|
+
use Rack::Flash
|
9
|
+
|
10
|
+
# Returns the list of load paths for this sinatra application
|
11
|
+
def self.file_loading_paths
|
12
|
+
["lib/**/*.rb", "app/helpers/**/*.rb", "app/routes/**/*.rb", "app/models/*.rb"]
|
13
|
+
end
|
14
|
+
|
15
|
+
# Require all the folders and files necessary to run the application
|
16
|
+
file_loading_paths.each { |load_path| Dir[root_path(load_path)].each { |file| require file } }
|
17
|
+
|
18
|
+
# Includes all necessary sinatra_more helpers
|
19
|
+
register SinatraMore::MarkupPlugin
|
20
|
+
register SinatraMore::RenderPlugin
|
21
|
+
register SinatraMore::MailerPlugin
|
22
|
+
register SinatraMore::WardenPlugin
|
23
|
+
|
24
|
+
# Required helpers
|
25
|
+
helpers ViewHelpers
|
26
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
RACK_ENV = ENV["RACK_ENV"] ||= "development" unless defined? RACK_ENV
|
2
|
+
ROOT_DIR = $0.gsub(%r{^.*?/}, '/') unless defined? ROOT_DIR
|
3
|
+
|
4
|
+
require File.dirname(__FILE__) + '/app.rb'
|
5
|
+
|
6
|
+
FileUtils.mkdir_p 'log' unless File.exists?('log')
|
7
|
+
log = File.new("log/sinatra.log", "a")
|
8
|
+
$stdout.reopen(log)
|
9
|
+
$stderr.reopen(log)
|
10
|
+
|
11
|
+
ENV['DATABASE_URL'] = 'your_database_here'
|
12
|
+
|
13
|
+
run <%= @class_name %>
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SinatraMore
|
2
|
+
module ComponentActions
|
3
|
+
# Injects require statement into target file
|
4
|
+
# insert_require('active_record', :path => "test/test_config.rb", :indent => 2)
|
5
|
+
# options = { :path => '...', :indent => 2, :after => /.../ }
|
6
|
+
def insert_require(*libs)
|
7
|
+
options = libs.extract_options!
|
8
|
+
options.reverse_merge!(:indent => 0, :after => /require\sgem.*?\n/)
|
9
|
+
multiple_gem_require = "%w[#{libs.join(' ')}].each { |gem| require gem }\n"
|
10
|
+
req = indent_spaces(options[:indent]) + (libs.size == 1 ? "require '#{libs}'\n" : multiple_gem_require)
|
11
|
+
inject_into_file(options[:path], req, :after => options[:after])
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns space characters of given count
|
15
|
+
# indent_spaces(2)
|
16
|
+
def indent_spaces(count)
|
17
|
+
' ' * count
|
18
|
+
end
|
19
|
+
|
20
|
+
# Injects the test class text into the test_config file for setting up the test gen
|
21
|
+
# insert_test_suite_setup('...CLASS_NAME...')
|
22
|
+
# => inject_into_file("test/test_config.rb", TEST.gsub(/CLASS_NAME/, @class_name), :after => "set :environment, :test\n")
|
23
|
+
def insert_test_suite_setup(suite_text, options={})
|
24
|
+
options.reverse_merge!(:path => "test/test_config.rb", :after => "set :environment, :test\n")
|
25
|
+
inject_into_file(options[:path], suite_text.gsub(/CLASS_NAME/, @class_name), :after => options[:after])
|
26
|
+
end
|
27
|
+
|
28
|
+
# Injects the mock library include into the test class in test_config for setting up mock gen
|
29
|
+
# insert_mock_library_include('Mocha::API')
|
30
|
+
# => inject_into_file("test/test_config.rb", " include Mocha::API\n", :after => /class.*?\n/)
|
31
|
+
def insert_mocking_include(library_name, options={})
|
32
|
+
options.reverse_merge!(:indent => 2, :after => /class.*?\n/, :path => "test/test_config.rb")
|
33
|
+
include_text = indent_spaces(options[:indent]) + "include #{library_name}\n"
|
34
|
+
inject_into_file(options[:path], include_text, :after => options[:after])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module SinatraMore
|
2
|
+
module ActiverecordOrmGen
|
3
|
+
|
4
|
+
AR = <<-AR
|
5
|
+
module ActiveRecordInitializer
|
6
|
+
def self.registered(app)
|
7
|
+
app.configure do
|
8
|
+
ActiveRecord::Base.establish_connection(
|
9
|
+
:adapter => 'sqlite3',
|
10
|
+
:dbfile => ENV['DATABASE_URL']
|
11
|
+
)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
AR
|
16
|
+
|
17
|
+
|
18
|
+
MIGRATION = <<-MIGRATION
|
19
|
+
class CreateUsers < ActiveRecord::Migration
|
20
|
+
def self.up
|
21
|
+
create_table :users do |t|
|
22
|
+
t.column :name, :string
|
23
|
+
t.column :username, :string
|
24
|
+
t.column :email, :string
|
25
|
+
t.column :crypted_password, :string
|
26
|
+
t.column :created_at, :datetime
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.down
|
31
|
+
drop_table :users
|
32
|
+
end
|
33
|
+
end
|
34
|
+
MIGRATION
|
35
|
+
|
36
|
+
USER = <<-USER
|
37
|
+
class User < ActiveRecord::Base
|
38
|
+
def self.authenticate(username, password)
|
39
|
+
user = User.first(:conditions => { :username => username })
|
40
|
+
user && user.has_password?(password) ? user : nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def encrypt_password
|
44
|
+
self.crypted_password = BCrypt::Password.create(password)
|
45
|
+
end
|
46
|
+
|
47
|
+
def has_password?(password)
|
48
|
+
BCrypt::Password.new(crypted_password) == password
|
49
|
+
end
|
50
|
+
end
|
51
|
+
USER
|
52
|
+
|
53
|
+
def setup_orm
|
54
|
+
insert_require 'active_record', :path => "config/dependencies.rb", :indent => 2
|
55
|
+
create_file("config/initializers/activerecord.rb", AR)
|
56
|
+
create_file("db/migrate/001_create_users.rb", MIGRATION)
|
57
|
+
create_file("app/models/user.rb", USER)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module SinatraMore
|
2
|
+
module DatamapperOrmGen
|
3
|
+
|
4
|
+
DM = <<-DM
|
5
|
+
module DatamapperInitializer
|
6
|
+
def self.registered(app)
|
7
|
+
app.configure do
|
8
|
+
DataMapper.setup(:default, ENV['DATABASE_URL'])
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
DM
|
13
|
+
|
14
|
+
USER = <<-USER
|
15
|
+
class User
|
16
|
+
include DataMapper::Resource
|
17
|
+
|
18
|
+
property :name, String
|
19
|
+
property :username, String
|
20
|
+
property :email, String
|
21
|
+
property :crypted_password, String
|
22
|
+
|
23
|
+
def self.authenticate(username, password)
|
24
|
+
user = User.first(:username => username)
|
25
|
+
user && user.has_password?(password) ? user : nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def encrypt_password
|
29
|
+
self.crypted_password = BCrypt::Password.create(password)
|
30
|
+
end
|
31
|
+
|
32
|
+
def has_password?(password)
|
33
|
+
BCrypt::Password.new(crypted_password) == password
|
34
|
+
end
|
35
|
+
end
|
36
|
+
USER
|
37
|
+
|
38
|
+
def setup_orm
|
39
|
+
insert_require 'dm-core', :path => "config/dependencies.rb", :indent => 2
|
40
|
+
create_file("config/initializers/datamapper.rb", DM)
|
41
|
+
create_file("app/models/user.rb", USER)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module SinatraMore
|
2
|
+
module MongomapperOrmGen
|
3
|
+
|
4
|
+
MONGO = <<-MONGO
|
5
|
+
class MongoDBConnectionFailure < RuntimeError; end
|
6
|
+
|
7
|
+
module MongoDBInitializer
|
8
|
+
def self.registered(app)
|
9
|
+
MongoMapper.connection = Mongo::Connection.new('localhost')
|
10
|
+
MongoMapper.database = 'fyourparking'
|
11
|
+
User.first
|
12
|
+
rescue RuntimeError
|
13
|
+
raise MongoDBConnectionFailure.new("mongodb cannot connect to db! Start the mongodb process and try again.")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
MONGO
|
17
|
+
|
18
|
+
CONCERNED = <<-CONCERN
|
19
|
+
module MongoMapper
|
20
|
+
module Document
|
21
|
+
module ClassMethods
|
22
|
+
# TODO find a cleaner way for it to know where to look for dependencies
|
23
|
+
def concerned_with(*concerns)
|
24
|
+
concerns.each { |concern| require_dependency "./app/models/\#{name.underscore}/\#{concern}" }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
CONCERN
|
30
|
+
|
31
|
+
USER = <<-USER
|
32
|
+
class User
|
33
|
+
include MongoMapper::Document
|
34
|
+
concerned_with :authentications
|
35
|
+
|
36
|
+
key :name, String, :required => true
|
37
|
+
key :username, String, :required => true
|
38
|
+
key :email, String, :required => true
|
39
|
+
key :crypted_password, String, :required => true
|
40
|
+
|
41
|
+
many :car_photos
|
42
|
+
end
|
43
|
+
USER
|
44
|
+
|
45
|
+
AUTH = <<-AUTH
|
46
|
+
class User
|
47
|
+
attr_accessor :password, :password_confirmation
|
48
|
+
before_validation :password_checks
|
49
|
+
validate :validate_password
|
50
|
+
|
51
|
+
def password_checks
|
52
|
+
if password_required?
|
53
|
+
encrypt_password if password.present? && password == password_confirmation
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def password_required?
|
58
|
+
crypted_password.blank? || !password.blank?
|
59
|
+
end
|
60
|
+
|
61
|
+
def encrypt_password
|
62
|
+
self.crypted_password = BCrypt::Password.create(password)
|
63
|
+
end
|
64
|
+
|
65
|
+
def has_password?(password)
|
66
|
+
BCrypt::Password.new(crypted_password) == password
|
67
|
+
end
|
68
|
+
|
69
|
+
def encrypt_password
|
70
|
+
return if password.blank?
|
71
|
+
self.crypted_password = BCrypt::Password.create(password)
|
72
|
+
end
|
73
|
+
|
74
|
+
def validate_password
|
75
|
+
errors.add :password, "must not be empty" if crypted_password.blank? && password.blank?
|
76
|
+
errors.add :password, "must match password confirmation" unless password == password_confirmation
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.authenticate(username, password)
|
80
|
+
user = User.first(:conditions => { :username => username })
|
81
|
+
user && user.has_password?(password) ? user : nil
|
82
|
+
end
|
83
|
+
end
|
84
|
+
AUTH
|
85
|
+
|
86
|
+
def setup_orm
|
87
|
+
insert_require 'mongo_mapper', :path => "config/dependencies.rb", :indent => 2
|
88
|
+
create_file("config/initializers/mongodb.rb", MONGO)
|
89
|
+
create_file("lib/ext/mongo_mapper.rb", CONCERNED)
|
90
|
+
create_file("app/models/user.rb", USER)
|
91
|
+
create_file("app/models/user/authentications.rb", AUTH)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module SinatraMore
|
2
|
+
module SequelOrmGen
|
3
|
+
|
4
|
+
SEQUEL = <<-SEQUEL
|
5
|
+
module SequelInitializer
|
6
|
+
def self.registered(app)
|
7
|
+
app.configure do
|
8
|
+
Sequel.connect(ENV['DATABASE_URL'])
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
SEQUEL
|
13
|
+
|
14
|
+
USER = <<-USER
|
15
|
+
class User < Sequel::Model(:users)
|
16
|
+
unless table_exists?
|
17
|
+
set_schema do
|
18
|
+
primary_key :id
|
19
|
+
string :name
|
20
|
+
string :username
|
21
|
+
string :email
|
22
|
+
string :crypted_password
|
23
|
+
end
|
24
|
+
create_table
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.authenticate(username, password)
|
28
|
+
user = User.filter(:username => username).first
|
29
|
+
user && user.has_password?(password) ? user : nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def encrypt_password
|
33
|
+
self.crypted_password = BCrypt::Password.create(password)
|
34
|
+
end
|
35
|
+
|
36
|
+
def has_password?(password)
|
37
|
+
BCrypt::Password.new(crypted_password) == password
|
38
|
+
end
|
39
|
+
end
|
40
|
+
USER
|
41
|
+
|
42
|
+
def setup_orm
|
43
|
+
insert_require 'sequel', :path => "config/dependencies.rb", :indent => 2
|
44
|
+
create_file("config/initializers/sequel.rb", SEQUEL)
|
45
|
+
create_file("app/models/user.rb", USER)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module SinatraMore
|
2
|
+
module HamlRendererGen
|
3
|
+
|
4
|
+
HASSLE = <<-HASSLE
|
5
|
+
module HassleInitializer
|
6
|
+
def self.registered(app)
|
7
|
+
app.use Hassle
|
8
|
+
end
|
9
|
+
end
|
10
|
+
HASSLE
|
11
|
+
|
12
|
+
def setup_renderer
|
13
|
+
insert_require('haml', 'sass', 'hassle', :path => 'config/dependencies.rb', :indent => 2)
|
14
|
+
create_file("config/initializers/hassle.rb", HASSLE)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module SinatraMore
|
2
|
+
module PrototypeScriptGen
|
3
|
+
|
4
|
+
def setup_script
|
5
|
+
get("http://prototypejs.org/assets/2009/8/31/prototype.js", "public/javascripts/prototype.js")
|
6
|
+
get('http://github.com/nesquena/lowpro/raw/master/dist/lowpro.js', "public/javascripts/lowpro.js")
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SinatraMore
|
2
|
+
module BaconTestGen
|
3
|
+
BACON_SETUP = <<-TEST
|
4
|
+
\nclass Bacon::Context
|
5
|
+
include Rack::Test::Methods
|
6
|
+
end
|
7
|
+
|
8
|
+
def app
|
9
|
+
CLASS_NAME
|
10
|
+
end
|
11
|
+
TEST
|
12
|
+
|
13
|
+
def setup_test
|
14
|
+
insert_require 'bacon', :path => "test/test_config.rb"
|
15
|
+
insert_test_suite_setup BACON_SETUP
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module SinatraMore
|
2
|
+
module RiotTestGen
|
3
|
+
RIOT_SETUP = <<-TEST
|
4
|
+
\nclass Riot::Context
|
5
|
+
include Rack::Test::Methods
|
6
|
+
|
7
|
+
def app
|
8
|
+
CLASS_NAME
|
9
|
+
end
|
10
|
+
end
|
11
|
+
TEST
|
12
|
+
|
13
|
+
def setup_test
|
14
|
+
insert_require 'riot', :path => "test/test_config.rb"
|
15
|
+
insert_test_suite_setup RIOT_SETUP
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|