lotusrb 0.2.1 → 0.3.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -3
- data/FEATURES.md +94 -0
- data/README.md +73 -22
- data/lib/lotus/cli.rb +24 -5
- data/lib/lotus/commands/db/console.rb +54 -0
- data/lib/lotus/commands/db.rb +27 -0
- data/lib/lotus/commands/generate.rb +70 -0
- data/lib/lotus/config/cookies.rb +47 -0
- data/lib/lotus/config/security.rb +58 -0
- data/lib/lotus/configuration.rb +65 -24
- data/lib/lotus/environment.rb +3 -1
- data/lib/lotus/generators/action/action.rb.tt +8 -0
- data/lib/lotus/generators/action/action_spec.minitest.tt +12 -0
- data/lib/lotus/generators/action/action_spec.rspec.tt +12 -0
- data/lib/lotus/generators/action/template.tt +0 -0
- data/lib/lotus/generators/action/view.rb.tt +5 -0
- data/lib/lotus/generators/action/view_spec.minitest.tt +12 -0
- data/lib/lotus/generators/action/view_spec.rspec.tt +12 -0
- data/lib/lotus/generators/action.rb +149 -0
- data/lib/lotus/generators/application/container/Gemfile.tt +7 -2
- data/lib/lotus/generators/application/container/config/.env.development.tt +1 -1
- data/lib/lotus/generators/application/container/config/.env.test.tt +1 -1
- data/lib/lotus/generators/application/container/gitignore.tt +2 -0
- data/lib/lotus/generators/application/container/lib/app_name.rb.tt +4 -2
- data/lib/lotus/generators/application/container/lotusrc.tt +3 -0
- data/lib/lotus/generators/application/container.rb +78 -8
- data/lib/lotus/generators/slice/application.rb.tt +63 -11
- data/lib/lotus/generators/slice/config/mapping.rb.tt +4 -1
- data/lib/lotus/loader.rb +10 -2
- data/lib/lotus/lotusrc.rb +146 -0
- data/lib/lotus/middleware.rb +2 -2
- data/lib/lotus/routes.rb +62 -6
- data/lib/lotus/version.rb +1 -1
- data/lotusrb.gemspec +6 -5
- metadata +41 -28
data/lib/lotus/configuration.rb
CHANGED
@@ -7,6 +7,8 @@ require 'lotus/config/routes'
|
|
7
7
|
require 'lotus/config/mapping'
|
8
8
|
require 'lotus/config/sessions'
|
9
9
|
require 'lotus/config/configure'
|
10
|
+
require 'lotus/config/security'
|
11
|
+
require 'lotus/config/cookies'
|
10
12
|
|
11
13
|
module Lotus
|
12
14
|
# Configuration for a Lotus application
|
@@ -35,7 +37,6 @@ module Lotus
|
|
35
37
|
# set a path for the specific environment.
|
36
38
|
#
|
37
39
|
# @param environment [Symbol,nil] the configuration environment name
|
38
|
-
# @param environment [String,nil] the configuration path of a specific environment
|
39
40
|
# @param blk [Proc] the configuration block
|
40
41
|
#
|
41
42
|
# @return [self]
|
@@ -69,6 +70,44 @@ module Lotus
|
|
69
70
|
self
|
70
71
|
end
|
71
72
|
|
73
|
+
# Returns the security policy
|
74
|
+
#
|
75
|
+
# @return [Lotus::Config::Security]
|
76
|
+
#
|
77
|
+
# @since 0.3.0
|
78
|
+
#
|
79
|
+
# @see Lotus::Config::Security
|
80
|
+
#
|
81
|
+
# @example Getting values
|
82
|
+
# require 'lotus'
|
83
|
+
#
|
84
|
+
# module Bookshelf
|
85
|
+
# class Application < Lotus::Application
|
86
|
+
# configure do
|
87
|
+
# security.x_frame_options "ALLOW ALL"
|
88
|
+
# security.content_security_policy "script-src 'self' https://apis.example.com"
|
89
|
+
# end
|
90
|
+
# end
|
91
|
+
# end
|
92
|
+
#
|
93
|
+
# Bookshelf::Application.configuration.security.x_frame_options # => "ALLOW ALL"
|
94
|
+
# Bookshelf::Application.configuration.security.content_security_policy # => "script-src 'self' https://apis.example.com"
|
95
|
+
#
|
96
|
+
# @example Setting values
|
97
|
+
# require 'lotus'
|
98
|
+
#
|
99
|
+
# module Bookshelf
|
100
|
+
# class Application < Lotus::Application
|
101
|
+
# configure do
|
102
|
+
# security.x_frame_options "ALLOW ALL"
|
103
|
+
# security.content_security_policy "script-src 'self' https://apis.example.com"
|
104
|
+
# end
|
105
|
+
# end
|
106
|
+
# end
|
107
|
+
def security
|
108
|
+
@security ||= Config::Security.new
|
109
|
+
end
|
110
|
+
|
72
111
|
# The root of the application
|
73
112
|
#
|
74
113
|
# By default it returns the current directory, for this reason, **all the
|
@@ -426,13 +465,14 @@ module Lotus
|
|
426
465
|
# an argument, it will set the corresponding instance variable. When
|
427
466
|
# called without, it will return the already set value, or the default.
|
428
467
|
#
|
429
|
-
# @overload cookies(value)
|
430
|
-
# Sets the given value.
|
468
|
+
# @overload cookies(value, options)
|
469
|
+
# Sets the given value with their options.
|
431
470
|
# @param value [TrueClass, FalseClass]
|
471
|
+
# @param options [Hash]
|
432
472
|
#
|
433
473
|
# @overload cookies
|
434
474
|
# Gets the value.
|
435
|
-
# @return [
|
475
|
+
# @return [Lotus::Config::Cookies]
|
436
476
|
#
|
437
477
|
# @example Getting the value
|
438
478
|
# require 'lotus'
|
@@ -443,7 +483,7 @@ module Lotus
|
|
443
483
|
# end
|
444
484
|
#
|
445
485
|
# Bookshelf::Application.configuration.cookies
|
446
|
-
# # => false
|
486
|
+
# # => #<Lotus::Config::Cookies:0x0000000329f880 @enabled=false, @default_options={:httponly=>true}>
|
447
487
|
#
|
448
488
|
# @example Setting the value
|
449
489
|
# require 'lotus'
|
@@ -451,13 +491,13 @@ module Lotus
|
|
451
491
|
# module Bookshelf
|
452
492
|
# class Application < Lotus::Application
|
453
493
|
# configure do
|
454
|
-
# cookies true
|
494
|
+
# cookies true, { domain: 'lotusrb.org' }
|
455
495
|
# end
|
456
496
|
# end
|
457
497
|
# end
|
458
498
|
#
|
459
499
|
# Bookshelf::Application.configuration.cookies
|
460
|
-
# # => true
|
500
|
+
# # => #<Lotus::Config::Cookies:0x0000000329f880 @enabled=true, @default_options={:domain=>'lotusrb.org', :httponly=>true}>
|
461
501
|
#
|
462
502
|
# @example Setting a new value after one is set.
|
463
503
|
# require 'lotus'
|
@@ -472,13 +512,13 @@ module Lotus
|
|
472
512
|
# end
|
473
513
|
#
|
474
514
|
# Bookshelf::Application.configuration.cookies
|
475
|
-
# # => true
|
515
|
+
# # => #<Lotus::Config::Cookies:0x0000000329f880 @enabled=true, @default_options={:httponly=>true}>
|
476
516
|
#
|
477
|
-
def cookies(value = nil)
|
517
|
+
def cookies(value = nil, options = {})
|
478
518
|
if value.nil?
|
479
|
-
@cookies
|
519
|
+
@cookies ||= Config::Cookies.new
|
480
520
|
else
|
481
|
-
@cookies = value
|
521
|
+
@cookies = Config::Cookies.new(value, options)
|
482
522
|
end
|
483
523
|
end
|
484
524
|
|
@@ -1134,14 +1174,15 @@ module Lotus
|
|
1134
1174
|
# setting helps to understand the namespace where to find applications'
|
1135
1175
|
# controllers and actions.
|
1136
1176
|
#
|
1137
|
-
# By default this equals to
|
1177
|
+
# By default this equals to <tt>"Controllers::%{controller}::%{action}"</tt>
|
1138
1178
|
# That means controllers must be structured like this:
|
1139
|
-
#
|
1140
|
-
# application module,
|
1141
|
-
# pattern,
|
1179
|
+
# <tt>Bookshelf::Controllers::Dashboard::Index</tt>, where <tt>Bookshelf</tt>
|
1180
|
+
# is the application module, <tt>Controllers</tt> is the first value
|
1181
|
+
# specified in the pattern, <tt>Dashboard</tt> the controller and
|
1182
|
+
# <tt>Index</tt> the action.
|
1142
1183
|
#
|
1143
|
-
# This pattern MUST always contain
|
1144
|
-
# This pattern SHOULD be used accordingly to
|
1184
|
+
# This pattern MUST always contain <tt>"%{controller}"</tt> and <tt>%{action}</tt>.
|
1185
|
+
# This pattern SHOULD be used accordingly to <tt>#view_pattern</tt> value.
|
1145
1186
|
#
|
1146
1187
|
# This is part of a DSL, for this reason when this method is called with
|
1147
1188
|
# an argument, it will set the corresponding instance variable. When
|
@@ -1267,15 +1308,15 @@ module Lotus
|
|
1267
1308
|
# setting helps to understand the namespace where to find applications'
|
1268
1309
|
# views:.
|
1269
1310
|
#
|
1270
|
-
# By default this equals to
|
1311
|
+
# By default this equals to <tt>"Views::%{controller}::%{action}"</tt>
|
1271
1312
|
# That means views must be structured like this:
|
1272
|
-
#
|
1273
|
-
# application module,
|
1274
|
-
# pattern,
|
1275
|
-
# and
|
1313
|
+
# <tt>Bookshelf::Views::Dashboard::Index</tt>, where <tt>Bookshelf</tt> is
|
1314
|
+
# the application module, <tt>Views</tt> is the first value specified in the
|
1315
|
+
# pattern, <tt>Dashboard</tt> a module corresponding to the controller name
|
1316
|
+
# and <tt>Index</tt> the view, corresponding to the action name.
|
1276
1317
|
#
|
1277
|
-
# This pattern MUST always contain
|
1278
|
-
# This pattern SHOULD be used accordingly to
|
1318
|
+
# This pattern MUST always contain <tt>"%{controller}"</tt> and <tt>%{action}</tt>.
|
1319
|
+
# This pattern SHOULD be used accordingly to <tt>#controller_pattern</tt> value.
|
1279
1320
|
#
|
1280
1321
|
# This is part of a DSL, for this reason when this method is called with
|
1281
1322
|
# an argument, it will set the corresponding instance variable. When
|
data/lib/lotus/environment.rb
CHANGED
@@ -2,6 +2,7 @@ require 'thread'
|
|
2
2
|
require 'pathname'
|
3
3
|
require 'dotenv'
|
4
4
|
require 'lotus/utils/hash'
|
5
|
+
require 'lotus/lotusrc'
|
5
6
|
|
6
7
|
module Lotus
|
7
8
|
# Define and expose information about the Lotus environment.
|
@@ -155,7 +156,8 @@ module Lotus
|
|
155
156
|
# # the one defined in the parent (eg `FOO` is overwritten). All the
|
156
157
|
# # other settings (eg `XYZ`) will be left untouched.
|
157
158
|
def initialize(options = {})
|
158
|
-
@options =
|
159
|
+
@options = Lotus::Lotusrc.new(root).read
|
160
|
+
@options.merge! Utils::Hash.new(options).symbolize!
|
159
161
|
@mutex = Mutex.new
|
160
162
|
@mutex.synchronize { set_env_vars! }
|
161
163
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../../../../<%= config[:action_path] %>'
|
3
|
+
|
4
|
+
describe <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %> do
|
5
|
+
let(:action) { <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %>.new }
|
6
|
+
let(:params) { Hash[] }
|
7
|
+
|
8
|
+
it "is successful" do
|
9
|
+
response = action.call(params)
|
10
|
+
response[0].must_equal 200
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../../../../<%= config[:action_path] %>'
|
3
|
+
|
4
|
+
describe <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %> do
|
5
|
+
let(:action) { <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %>.new }
|
6
|
+
let(:params) { Hash[] }
|
7
|
+
|
8
|
+
it "is successful" do
|
9
|
+
response = action.call(params)
|
10
|
+
expect(response[0]).to eq 200
|
11
|
+
end
|
12
|
+
end
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../../../../<%= config[:view_path] %>'
|
3
|
+
|
4
|
+
describe <%= config[:app] %>::Views::<%= config[:controller] %>::<%= config[:action] %> do
|
5
|
+
let(:exposures) { Hash[foo: 'bar'] }
|
6
|
+
let(:template) { Lotus::View::Template.new('<%= config[:template_path] %>') }
|
7
|
+
let(:view) { <%= config[:app] %>::Views::<%= config[:controller] %>::<%= config[:action] %>.new(template, exposures) }
|
8
|
+
|
9
|
+
it "exposes #foo" do
|
10
|
+
view.foo.must_equal exposures.fetch(:foo)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../../../../<%= config[:view_path] %>'
|
3
|
+
|
4
|
+
describe <%= config[:app] %>::Views::<%= config[:controller] %>::<%= config[:action] %> do
|
5
|
+
let(:exposures) { Hash[foo: 'bar'] }
|
6
|
+
let(:template) { Lotus::View::Template.new('<%= config[:template_path] %>') }
|
7
|
+
let(:view) { <%= config[:app] %>::Views::<%= config[:controller] %>::<%= config[:action] %>.new(template, exposures) }
|
8
|
+
|
9
|
+
it "exposes #foo" do
|
10
|
+
expect(view.foo).to eq exposures.fetch(:foo)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'lotus/generators/abstract'
|
2
|
+
require 'lotus/utils/string'
|
3
|
+
|
4
|
+
module Lotus
|
5
|
+
module Generators
|
6
|
+
# @since 0.3.0
|
7
|
+
# @api private
|
8
|
+
class Action < Abstract
|
9
|
+
# @since 0.3.0
|
10
|
+
# @api private
|
11
|
+
ACTION_SEPARATOR = /\/|\#/
|
12
|
+
|
13
|
+
# @since 0.3.0
|
14
|
+
# @api private
|
15
|
+
SUFFIX = '.rb'.freeze
|
16
|
+
|
17
|
+
# @since 0.3.0
|
18
|
+
# @api private
|
19
|
+
TEMPLATE_SUFFIX = '.html.'.freeze
|
20
|
+
|
21
|
+
# @since 0.3.0
|
22
|
+
# @api private
|
23
|
+
DEFAULT_TEMPLATE = 'erb'.freeze
|
24
|
+
|
25
|
+
# @since 0.3.0
|
26
|
+
# @api private
|
27
|
+
def initialize(command)
|
28
|
+
super
|
29
|
+
|
30
|
+
@controller, @action = name.split(ACTION_SEPARATOR)
|
31
|
+
@controller_name = Utils::String.new(@controller).classify
|
32
|
+
@action_name = Utils::String.new(@action).classify
|
33
|
+
|
34
|
+
cli.class.source_root(source)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @since 0.3.0
|
38
|
+
# @api private
|
39
|
+
def start
|
40
|
+
assert_existing_app!
|
41
|
+
|
42
|
+
opts = {
|
43
|
+
app: app,
|
44
|
+
controller: @controller_name,
|
45
|
+
action: @action_name,
|
46
|
+
action_path: _action_path_without_suffix,
|
47
|
+
view_path: _view_path_without_suffix,
|
48
|
+
template_path: _template_path,
|
49
|
+
}
|
50
|
+
|
51
|
+
templates = {
|
52
|
+
'action.rb.tt' => _action_path,
|
53
|
+
'view.rb.tt' => _view_path,
|
54
|
+
'template.tt' => _template_path
|
55
|
+
}
|
56
|
+
|
57
|
+
case options[:test]
|
58
|
+
when 'rspec'
|
59
|
+
templates.merge!({
|
60
|
+
'action_spec.rspec.tt' => _action_spec_path,
|
61
|
+
'view_spec.rspec.tt' => _view_spec_path,
|
62
|
+
})
|
63
|
+
else
|
64
|
+
templates.merge!({
|
65
|
+
'action_spec.minitest.tt' => _action_spec_path,
|
66
|
+
'view_spec.minitest.tt' => _view_spec_path,
|
67
|
+
})
|
68
|
+
end
|
69
|
+
|
70
|
+
generate_route
|
71
|
+
|
72
|
+
templates.each do |src, dst|
|
73
|
+
cli.template(source.join(src), target.join(dst), opts)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
# @since 0.3.0
|
79
|
+
# @api private
|
80
|
+
def assert_existing_app!
|
81
|
+
unless target.join(app_root).exist?
|
82
|
+
raise Lotus::Commands::Generate::Error.new("Unknown app: `#{ app_name }'")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# @since 0.3.0
|
87
|
+
# @api private
|
88
|
+
def generate_route
|
89
|
+
path = target.join(_routes_path)
|
90
|
+
path.dirname.mkpath
|
91
|
+
|
92
|
+
FileUtils.touch(path)
|
93
|
+
|
94
|
+
# Insert at the top of the file
|
95
|
+
cli.insert_into_file _routes_path, before: /\A(.*)/ do
|
96
|
+
"get '/#{ @controller }', to: '#{ name }'\n"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# @since 0.3.0
|
101
|
+
# @api private
|
102
|
+
def _routes_path
|
103
|
+
app_root.join("config", "routes#{ SUFFIX }")
|
104
|
+
end
|
105
|
+
|
106
|
+
# @since 0.3.0
|
107
|
+
# @api private
|
108
|
+
def _action_path
|
109
|
+
_action_path_without_suffix.to_s + SUFFIX
|
110
|
+
end
|
111
|
+
|
112
|
+
# @since 0.3.0
|
113
|
+
# @api private
|
114
|
+
def _view_path
|
115
|
+
_view_path_without_suffix.to_s + SUFFIX
|
116
|
+
end
|
117
|
+
|
118
|
+
# @since 0.3.0
|
119
|
+
# @api private
|
120
|
+
def _action_path_without_suffix
|
121
|
+
app_root.join("controllers", @controller, "#{ @action }")
|
122
|
+
end
|
123
|
+
|
124
|
+
# @since 0.3.0
|
125
|
+
# @api private
|
126
|
+
def _view_path_without_suffix
|
127
|
+
app_root.join("views", @controller, "#{ @action }")
|
128
|
+
end
|
129
|
+
|
130
|
+
# @since 0.3.0
|
131
|
+
# @api private
|
132
|
+
def _template_path
|
133
|
+
app_root.join("templates", @controller, "#{ @action }#{ TEMPLATE_SUFFIX }#{ options.fetch(:template) { DEFAULT_TEMPLATE } }")
|
134
|
+
end
|
135
|
+
|
136
|
+
# @since 0.3.0
|
137
|
+
# @api private
|
138
|
+
def _action_spec_path
|
139
|
+
spec_root.join(app_name, 'controllers', @controller, "#{ @action }_spec#{ SUFFIX }")
|
140
|
+
end
|
141
|
+
|
142
|
+
# @since 0.3.0
|
143
|
+
# @api private
|
144
|
+
def _view_spec_path
|
145
|
+
spec_root.join(app_name, 'views', @controller, "#{ @action }_spec#{ SUFFIX }")
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -7,13 +7,18 @@ gem 'rake'
|
|
7
7
|
gem 'lotus-utils', require: false, github: 'lotus/utils'
|
8
8
|
gem 'lotus-router', require: false, github: 'lotus/router'
|
9
9
|
gem 'lotus-validations', require: false, github: 'lotus/validations'
|
10
|
+
gem 'lotus-helpers', require: false, github: 'lotus/helpers'
|
10
11
|
gem 'lotus-controller', require: false, github: 'lotus/controller'
|
11
12
|
gem 'lotus-view', require: false, github: 'lotus/view'
|
12
13
|
gem 'lotus-model', require: false, github: 'lotus/model'
|
13
14
|
gem 'lotusrb', github: 'lotus/lotus'
|
14
15
|
<%- else -%>
|
15
|
-
gem 'lotusrb',
|
16
|
-
gem 'lotus-model',
|
16
|
+
gem 'lotusrb', '<%= Lotus::VERSION %>'
|
17
|
+
gem 'lotus-model', '<%= config[:lotus_model_version] %>'
|
18
|
+
<%- end -%>
|
19
|
+
|
20
|
+
<%- if config[:database_config][:gem] %>
|
21
|
+
gem '<%= config[:database_config][:gem] %>'
|
17
22
|
<%- end -%>
|
18
23
|
|
19
24
|
group :test do
|
@@ -1,2 +1,2 @@
|
|
1
1
|
# Define ENV variables for development environment
|
2
|
-
<%= config[:app_name].to_env_s %>_DATABASE_URL="
|
2
|
+
<%= config[:app_name].to_env_s %>_DATABASE_URL="<%= config[:database_config][:uri][:development] %>"
|
@@ -1,2 +1,2 @@
|
|
1
1
|
# Define ENV variables for test environment
|
2
|
-
<%= config[:app_name].to_env_s %>_DATABASE_URL="
|
2
|
+
<%= config[:app_name].to_env_s %>_DATABASE_URL="<%= config[:database_config][:uri][:test] %>"
|
@@ -10,15 +10,17 @@ Lotus::Model.configure do
|
|
10
10
|
# adapter type: :memory, uri: 'memory://localhost/<%= config[:app_name] %>_development'
|
11
11
|
#
|
12
12
|
# * SQL adapter
|
13
|
-
# adapter type: :sql, uri: 'sqlite://db/<%= config[:app_name] %>_development.
|
13
|
+
# adapter type: :sql, uri: 'sqlite://db/<%= config[:app_name] %>_development.sqlite3'
|
14
14
|
# adapter type: :sql, uri: 'postgres://localhost/<%= config[:app_name] %>_development'
|
15
15
|
# adapter type: :sql, uri: 'mysql://localhost/<%= config[:app_name] %>_development'
|
16
16
|
#
|
17
|
-
adapter type: :
|
17
|
+
adapter type: :<%= config[:database_config][:type] %>, uri: ENV['<%= config[:app_name].to_env_s %>_DATABASE_URL']
|
18
18
|
|
19
19
|
##
|
20
20
|
# Database mapping
|
21
21
|
#
|
22
|
+
# Intended for specifying application wide mappings.
|
23
|
+
#
|
22
24
|
# You can specify mapping file to load with:
|
23
25
|
#
|
24
26
|
# mapping "#{__dir__}/config/mapping"
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'shellwords'
|
1
2
|
require 'lotus/generators/abstract'
|
2
3
|
require 'lotus/generators/slice'
|
3
4
|
|
@@ -8,10 +9,11 @@ module Lotus
|
|
8
9
|
def initialize(command)
|
9
10
|
super
|
10
11
|
|
11
|
-
@slice_generator
|
12
|
-
@lotus_head
|
13
|
-
@test
|
14
|
-
@
|
12
|
+
@slice_generator = Slice.new(command)
|
13
|
+
@lotus_head = options.fetch(:lotus_head)
|
14
|
+
@test = options[:test]
|
15
|
+
@database = options[:database]
|
16
|
+
@lotus_model_version = '~> 0.3'
|
15
17
|
|
16
18
|
cli.class.source_root(source)
|
17
19
|
end
|
@@ -19,13 +21,16 @@ module Lotus
|
|
19
21
|
def start
|
20
22
|
|
21
23
|
opts = {
|
22
|
-
app_name:
|
23
|
-
lotus_head:
|
24
|
-
test:
|
25
|
-
|
24
|
+
app_name: app_name,
|
25
|
+
lotus_head: @lotus_head,
|
26
|
+
test: @test,
|
27
|
+
database: @database,
|
28
|
+
database_config: database_config,
|
29
|
+
lotus_model_version: @lotus_model_version,
|
26
30
|
}
|
27
31
|
|
28
32
|
templates = {
|
33
|
+
'lotusrc.tt' => '.lotusrc',
|
29
34
|
'Gemfile.tt' => 'Gemfile',
|
30
35
|
'config.ru.tt' => 'config.ru',
|
31
36
|
'config/environment.rb.tt' => 'config/environment.rb',
|
@@ -74,8 +79,73 @@ module Lotus
|
|
74
79
|
cli.template(source.join(gitkeep), target.join(dir, gitkeep), opts)
|
75
80
|
end
|
76
81
|
|
82
|
+
unless git_dir_present?
|
83
|
+
cli.template(source.join('gitignore.tt'), target.join('.gitignore'), opts)
|
84
|
+
cli.run("git init #{Shellwords.escape(target)}", capture: true)
|
85
|
+
end
|
86
|
+
|
77
87
|
@slice_generator.start
|
78
88
|
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def git_dir_present?
|
93
|
+
File.directory?(source.join('.git'))
|
94
|
+
end
|
95
|
+
|
96
|
+
def database_config
|
97
|
+
{
|
98
|
+
gem: database_gem,
|
99
|
+
uri: database_uri,
|
100
|
+
type: database_type
|
101
|
+
}
|
102
|
+
end
|
103
|
+
|
104
|
+
def database_gem
|
105
|
+
{
|
106
|
+
'mysql' => 'mysql',
|
107
|
+
'mysql2' => 'mysql2',
|
108
|
+
'postgresql' => 'pg',
|
109
|
+
'postgres' => 'pg',
|
110
|
+
'sqlite' => 'sqlite3',
|
111
|
+
'sqlite3' => 'sqlite3'
|
112
|
+
}[@database]
|
113
|
+
end
|
114
|
+
|
115
|
+
def database_type
|
116
|
+
case @database
|
117
|
+
when 'mysql', 'mysql2', 'postgresql', 'postgres', 'sqlite', 'sqlite3'
|
118
|
+
:sql
|
119
|
+
when 'filesystem'
|
120
|
+
:file_system
|
121
|
+
when 'memory'
|
122
|
+
:memory
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def database_uri
|
127
|
+
{
|
128
|
+
development: "#{database_base_uri}_development",
|
129
|
+
test: "#{database_base_uri}_test"
|
130
|
+
}
|
131
|
+
end
|
132
|
+
|
133
|
+
def database_base_uri
|
134
|
+
case @database
|
135
|
+
when 'mysql'
|
136
|
+
"mysql://localhost/#{app_name}"
|
137
|
+
when 'mysql2'
|
138
|
+
"mysql2://localhost/#{app_name}"
|
139
|
+
when 'postgresql', 'postgres'
|
140
|
+
"postgres://localhost/#{app_name}"
|
141
|
+
when 'sqlite', 'sqlite3'
|
142
|
+
"sqlite://db/#{Shellwords.escape(app_name)}"
|
143
|
+
when 'memory'
|
144
|
+
"memory://localhost/#{app_name}"
|
145
|
+
else
|
146
|
+
"file:///db/#{app_name}"
|
147
|
+
end
|
148
|
+
end
|
79
149
|
end
|
80
150
|
end
|
81
151
|
end
|