lotusrb 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +53 -0
  3. data/README.md +241 -311
  4. data/bin/lotus +4 -0
  5. data/lib/lotus/application.rb +111 -15
  6. data/lib/lotus/cli.rb +85 -0
  7. data/lib/lotus/commands/console.rb +62 -0
  8. data/lib/lotus/commands/new.rb +32 -0
  9. data/lib/lotus/commands/routes.rb +14 -0
  10. data/lib/lotus/commands/server.rb +65 -0
  11. data/lib/lotus/config/assets.rb +24 -10
  12. data/lib/lotus/config/configure.rb +17 -0
  13. data/lib/lotus/config/framework_configuration.rb +30 -0
  14. data/lib/lotus/config/load_paths.rb +1 -1
  15. data/lib/lotus/config/sessions.rb +97 -0
  16. data/lib/lotus/configuration.rb +698 -40
  17. data/lib/lotus/container.rb +30 -0
  18. data/lib/lotus/environment.rb +377 -0
  19. data/lib/lotus/frameworks.rb +17 -28
  20. data/lib/lotus/generators/abstract.rb +31 -0
  21. data/lib/lotus/generators/application/container/.gitkeep +1 -0
  22. data/lib/lotus/generators/application/container/Gemfile.tt +29 -0
  23. data/lib/lotus/generators/application/container/Rakefile.minitest.tt +10 -0
  24. data/lib/lotus/generators/application/container/config/.env.development.tt +2 -0
  25. data/lib/lotus/generators/application/container/config/.env.test.tt +2 -0
  26. data/lib/lotus/generators/application/container/config/.env.tt +1 -0
  27. data/lib/lotus/generators/application/container/config/environment.rb.tt +7 -0
  28. data/lib/lotus/generators/application/container/config.ru.tt +3 -0
  29. data/lib/lotus/generators/application/container/db/.gitkeep +1 -0
  30. data/lib/lotus/generators/application/container/features_helper.rb.tt +11 -0
  31. data/lib/lotus/generators/application/container/lib/app_name.rb.tt +31 -0
  32. data/lib/lotus/generators/application/container/lib/chirp/entities/.gitkeep +1 -0
  33. data/lib/lotus/generators/application/container/lib/chirp/repositories/.gitkeep +1 -0
  34. data/lib/lotus/generators/application/container/spec_helper.rb.tt +7 -0
  35. data/lib/lotus/generators/application/container.rb +70 -0
  36. data/lib/lotus/generators/slice/.gitkeep.tt +1 -0
  37. data/lib/lotus/generators/slice/action.rb.tt +8 -0
  38. data/lib/lotus/generators/slice/application.rb.tt +182 -0
  39. data/lib/lotus/generators/slice/config/mapping.rb.tt +10 -0
  40. data/lib/lotus/generators/slice/config/routes.rb.tt +8 -0
  41. data/lib/lotus/generators/slice/templates/application.html.erb +9 -0
  42. data/lib/lotus/generators/slice/templates/application.html.erb.tt +9 -0
  43. data/lib/lotus/generators/slice/templates/template.html.erb.tt +2 -0
  44. data/lib/lotus/generators/slice/view.rb.tt +5 -0
  45. data/lib/lotus/generators/slice/views/application_layout.rb.tt +7 -0
  46. data/lib/lotus/generators/slice.rb +103 -0
  47. data/lib/lotus/loader.rb +99 -19
  48. data/lib/lotus/middleware.rb +92 -9
  49. data/lib/lotus/rendering_policy.rb +42 -19
  50. data/lib/lotus/routing/default.rb +1 -1
  51. data/lib/lotus/setup.rb +5 -0
  52. data/lib/lotus/templates/welcome.html +49 -0
  53. data/lib/lotus/version.rb +1 -1
  54. data/lib/lotus/views/default.rb +13 -0
  55. data/lib/lotus/views/default_template_finder.rb +19 -0
  56. data/lib/lotus/welcome.rb +14 -0
  57. data/lib/lotus.rb +1 -0
  58. data/lotusrb.gemspec +9 -5
  59. metadata +122 -36
@@ -0,0 +1,30 @@
1
+ require 'thread'
2
+ require 'lotus/router'
3
+
4
+ module Lotus
5
+ class Container
6
+ attr_reader :routes
7
+
8
+ def self.configure(&blk)
9
+ Mutex.new.synchronize { @@configuration = blk }
10
+ end
11
+
12
+ def initialize
13
+ Mutex.new.synchronize do
14
+ assert_configuration_presence!
15
+ @routes = Lotus::Router.new(&@@configuration)
16
+ end
17
+ end
18
+
19
+ def call(env)
20
+ @routes.call(env)
21
+ end
22
+
23
+ private
24
+ def assert_configuration_presence!
25
+ unless self.class.class_variable_defined?(:@@configuration)
26
+ raise ArgumentError.new("#{ self.class } doesn't have any application mounted.")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,377 @@
1
+ require 'thread'
2
+ require 'pathname'
3
+ require 'dotenv'
4
+ require 'lotus/utils/hash'
5
+
6
+ module Lotus
7
+ # Define and expose information about the Lotus environment.
8
+ #
9
+ # @since 0.1.0
10
+ # @api private
11
+ class Environment
12
+ # Standard Rack ENV key
13
+ #
14
+ # @since 0.1.0
15
+ # @api private
16
+ RACK_ENV = 'RACK_ENV'.freeze
17
+
18
+ # Standard Lotus ENV key
19
+ #
20
+ # @since 0.1.0
21
+ # @api private
22
+ LOTUS_ENV = 'LOTUS_ENV'.freeze
23
+
24
+ # Default Lotus environment
25
+ #
26
+ # @since 0.1.0
27
+ # @api private
28
+ DEFAULT_ENV = 'development'.freeze
29
+
30
+ # Default `.env` file name
31
+ #
32
+ # @since 0.2.0
33
+ # @api private
34
+ DEFAULT_DOTENV = '.env'.freeze
35
+
36
+ # Default `.env` per environment file name
37
+ #
38
+ # @since 0.2.0
39
+ # @api private
40
+ DEFAULT_DOTENV_ENV = '.env.%s'.freeze
41
+
42
+ # Default configuration directory under application root
43
+ #
44
+ # @since 0.2.0
45
+ # @api private
46
+ DEFAULT_CONFIG = 'config'.freeze
47
+
48
+ # Standard Lotus host ENV key
49
+ #
50
+ # @since 0.1.0
51
+ # @api private
52
+ LOTUS_HOST = 'LOTUS_HOST'.freeze
53
+
54
+ # Default HTTP host
55
+ #
56
+ # @since 0.1.0
57
+ # @api private
58
+ DEFAULT_HOST = 'localhost'.freeze
59
+
60
+ # Default IP address listen
61
+ #
62
+ # @since 0.1.0
63
+ # @api private
64
+ LISTEN_ALL_HOST = '0.0.0.0'.freeze
65
+
66
+ # Standard Lotus port ENV key
67
+ #
68
+ # @since 0.1.0
69
+ # @api private
70
+ LOTUS_PORT = 'LOTUS_PORT'.freeze
71
+
72
+ # Default Lotus HTTP port
73
+ #
74
+ # @since 0.1.0
75
+ # @api private
76
+ DEFAULT_PORT = 2300
77
+
78
+ # Default Rack configuration file
79
+ #
80
+ # @since 0.2.0
81
+ # @api private
82
+ DEFAULT_RACKUP = 'config.ru'.freeze
83
+
84
+ # Default environment configuration file
85
+ #
86
+ # @since 0.2.0
87
+ # @api private
88
+ DEFAULT_ENVIRONMENT_CONFIG = 'environment'.freeze
89
+
90
+ # Code reloading per environment
91
+ #
92
+ # @since 0.2.0
93
+ # @api private
94
+ CODE_RELOADING = { 'development' => true }.freeze
95
+
96
+ # Initialize a Lotus environment
97
+ #
98
+ # It accepts an optional set of configurations from the CLI commands.
99
+ # Those settings override the defaults defined by this object.
100
+ #
101
+ # When initialized, it sets standard `ENV` variables for Rack and Lotus,
102
+ # such as `RACK_ENV` and `LOTUS_ENV`.
103
+ #
104
+ # It also evaluates configuration from `.env` and `.env.<environment>`
105
+ # located under the config directory. All the settings in those files will
106
+ # be exported as `ENV` variables.
107
+ #
108
+ # The format of those `.env` files is compatible with `dotenv` and `foreman`
109
+ # gems.
110
+ #
111
+ # @param options [Hash] override default options for various environment
112
+ # attributes
113
+ #
114
+ # @return [Lotus::Environment] the environment
115
+ #
116
+ # @see Lotus::Commands::Console
117
+ # @see Lotus::Commands::Routes
118
+ # @see Lotus::Commands::Server
119
+ # @see Lotus::Environment#config
120
+ #
121
+ # @example Define ENV variables from .env
122
+ #
123
+ # # % tree config/
124
+ # # config
125
+ # # ├── .env
126
+ # # ├── .env.development
127
+ # # └── environment.rb
128
+ #
129
+ # # % cat config/.env
130
+ # # FOO="bar"
131
+ # # XYZ="yes"
132
+ #
133
+ # # % cat config/.env.development
134
+ # # FOO="ok"
135
+ #
136
+ # require 'lotus/environment'
137
+ #
138
+ # env = Lotus::Environment.new
139
+ # env.environment # => "development"
140
+ #
141
+ # # Framework defined ENV vars
142
+ # ENV['LOTUS_ENV'] # => "development"
143
+ # ENV['RACK_ENV'] # => "development"
144
+ #
145
+ # ENV['LOTUS_HOST'] # => "localhost"
146
+ # ENV['LOTUS_PORT'] # => "2300"
147
+ #
148
+ # # User defined ENV vars
149
+ # ENV['FOO'] # => "ok"
150
+ # ENV['XYZ'] # => "yes"
151
+ #
152
+ # # Lotus::Environment evaluates `.env` first as master configuration.
153
+ # # Then it evaluates `.env.development` because the current environment
154
+ # # is "development". The settings defined in this last file override
155
+ # # the one defined in the parent (eg `FOO` is overwritten). All the
156
+ # # other settings (eg `XYZ`) will be left untouched.
157
+ def initialize(options = {})
158
+ @options = Utils::Hash.new(options).symbolize!.freeze
159
+ @mutex = Mutex.new
160
+ @mutex.synchronize { set_env_vars! }
161
+ end
162
+
163
+ # The current environment
164
+ #
165
+ # In order to decide the value, it looks up to the following `ENV` vars:
166
+ #
167
+ # * LOTUS_ENV
168
+ # * RACK_ENV
169
+ #
170
+ # If those are missing it falls back to the defalt one: `"development"`.
171
+ #
172
+ # @return [String] the current environment
173
+ #
174
+ # @since 0.1.0
175
+ #
176
+ # @see Lotus::Environment::DEFAULT_ENV
177
+ def environment
178
+ @environment ||= ENV[LOTUS_ENV] || ENV[RACK_ENV] || DEFAULT_ENV
179
+ end
180
+
181
+ # A set of Bundler groups
182
+ #
183
+ # @return [Array] A set of groups
184
+ #
185
+ # @since 0.2.0
186
+ # @api private
187
+ #
188
+ # @see http://bundler.io/v1.7/groups.html
189
+ def bundler_groups
190
+ [environment]
191
+ end
192
+
193
+ # Application's root
194
+ #
195
+ # It defaults to the current working directory.
196
+ # Lotus assumes that all the commands are executed from there.
197
+ #
198
+ # @return [Pathname] application's root
199
+ #
200
+ # @since 0.2.0
201
+ def root
202
+ @root ||= Pathname.new(Dir.pwd)
203
+ end
204
+
205
+ # Application's config directory
206
+ #
207
+ # It's the application where all the configurations are stored.
208
+ #
209
+ # In order to decide the value, it looks up the following sources:
210
+ #
211
+ # * CLI option `config`
212
+ #
213
+ # If those are missing it falls back to the default one: `"config/"`.
214
+ #
215
+ # When a relative path is given via CLI option, it assumes to be located
216
+ # under application's root. If absolute path, it will be used as it is.
217
+ #
218
+ # @return [Pathname] the config directory
219
+ #
220
+ # @since 0.2.0
221
+ #
222
+ # @see Lotus::Environment::DEFAULT_CONFIG
223
+ # @see Lotus::Environment#root
224
+ def config
225
+ @config ||= root.join(@options.fetch(:config) { DEFAULT_CONFIG })
226
+ end
227
+
228
+ # The HTTP host name
229
+ #
230
+ # In order to decide the value, it looks up the following sources:
231
+ #
232
+ # * CLI option `host`
233
+ # * LOTUS_HOST ENV var
234
+ #
235
+ # If those are missing it falls back to the following defaults:
236
+ #
237
+ # * `"localhost"` for development
238
+ # * `"0.0.0.0"` for all the other environments
239
+ #
240
+ # @return [String] the HTTP host name
241
+ #
242
+ # @since 0.1.0
243
+ #
244
+ # @see Lotus::Environment::DEFAULT_HOST
245
+ # @see Lotus::Environment::LISTEN_ALL_HOST
246
+ def host
247
+ @host ||= @options.fetch(:host) {
248
+ ENV[LOTUS_HOST] || default_host
249
+ }
250
+ end
251
+
252
+ # The HTTP port
253
+ #
254
+ # In order to decide the value, it looks up the following sources:
255
+ #
256
+ # * CLI option `port`
257
+ # * LOTUS_PORT ENV var
258
+ #
259
+ # If those are missing it falls back to the default one: `2300`.
260
+ #
261
+ # @return [Integer] the default port
262
+ #
263
+ # @since 0.1.0
264
+ #
265
+ # @see Lotus::Environment::DEFAULT_PORT
266
+ def port
267
+ @port ||= @options.fetch(:port) { ENV[LOTUS_PORT] || DEFAULT_PORT }.to_i
268
+ end
269
+
270
+ # Path to the Rack configuration file
271
+ #
272
+ # In order to decide the value, it looks up the following sources:
273
+ #
274
+ # * CLI option `rackup`
275
+ #
276
+ # If those are missing it falls back to the default one: `"config.ru"`.
277
+ #
278
+ # When a relative path is given via CLI option, it assumes to be located
279
+ # under application's root. If absolute path, it will be used as it is.
280
+ #
281
+ # @return [Pathname] path to the Rack configuration file
282
+ #
283
+ # @since 0.2.0
284
+ def rackup
285
+ root.join(@options.fetch(:rackup) { DEFAULT_RACKUP })
286
+ end
287
+
288
+ # Path to environment configuration file.
289
+ #
290
+ # In order to decide the value, it looks up the following sources:
291
+ #
292
+ # * CLI option `environment`
293
+ #
294
+ # If those are missing it falls back to the default one:
295
+ # `"config/environment.rb"`.
296
+ #
297
+ # When a relative path is given via CLI option, it assumes to be located
298
+ # under application's root. If absolute path, it will be used as it is.
299
+ #
300
+ # @return [Pathname] path to applications
301
+ #
302
+ # @since 0.1.0
303
+ #
304
+ # @see Lotus::Environment::DEFAULT_ENVIRONMENT_CONFIG
305
+ def env_config
306
+ root.join(@options.fetch(:environment) { config.join(DEFAULT_ENVIRONMENT_CONFIG) })
307
+ end
308
+
309
+ # Determine if activate code reloading for the current environment while
310
+ # running the server.
311
+ #
312
+ # In order to decide the value, it looks up the following sources:
313
+ #
314
+ # * CLI option `code_reloading`
315
+ #
316
+ # If those are missing it falls back to the following defaults:
317
+ #
318
+ # * true for development
319
+ # * false for all the other environments
320
+ #
321
+ # @return [TrueClass,FalseClass] the result of the check
322
+ #
323
+ # @since 0.2.0
324
+ #
325
+ # @see Lotus::Commands::Server
326
+ # @see Lotus::Environment::CODE_RELOADING
327
+ def code_reloading?
328
+ @options.fetch(:code_reloading) { !!CODE_RELOADING[environment] }
329
+ end
330
+
331
+ # Serialize the most relevant settings into a Hash
332
+ #
333
+ # @return [Lotus::Utils::Hash]
334
+ #
335
+ # @since 0.1.0
336
+ # @api private
337
+ def to_options
338
+ @options.merge(
339
+ environment: environment,
340
+ env_config: env_config,
341
+ rackup: rackup,
342
+ host: host,
343
+ port: port
344
+ )
345
+ end
346
+
347
+ private
348
+
349
+ # @since 0.1.0
350
+ # @api private
351
+ def set_env_vars!
352
+ set_lotus_env_vars!
353
+ set_application_env_vars!
354
+ end
355
+
356
+ # @since 0.2.0
357
+ # @api private
358
+ def set_lotus_env_vars!
359
+ ENV[LOTUS_ENV] = ENV[RACK_ENV] = environment
360
+ ENV[LOTUS_HOST] = host
361
+ ENV[LOTUS_PORT] = port.to_s
362
+ end
363
+
364
+ # @since 0.2.0
365
+ # @api private
366
+ def set_application_env_vars!
367
+ Dotenv.load config.join(DEFAULT_DOTENV)
368
+ Dotenv.overload config.join(DEFAULT_DOTENV_ENV % environment)
369
+ end
370
+
371
+ # @since 0.1.0
372
+ # @api private
373
+ def default_host
374
+ environment == DEFAULT_ENV ? DEFAULT_HOST : LISTEN_ALL_HOST
375
+ end
376
+ end
377
+ end
@@ -1,38 +1,27 @@
1
1
  require 'lotus/router'
2
- require 'lotus/controller'
3
2
  require 'lotus/view'
3
+ require 'lotus/controller'
4
4
 
5
- # FIXME Ideally, this should be done like this:
6
- #
7
- # module Lotus
8
- # module Frameworks
9
- # module Action
10
- # module Rack
11
- # protected
12
- # def response
13
- # [super, self].flatten
14
- # end
15
- # end
16
- # end
17
- # end
18
- # end
19
- #
20
- # Lotus::Action::Rack.class_eval do
21
- # include Lotus::Frameworks::Action::Rack
22
- # end
23
- #
24
- # ..but it doesn't work and I want to ship it!
25
-
26
- Lotus::Action::Rack.class_eval do
27
- DEFAULT_RESPONSE_CODE = 200
28
- DEFAULT_RESPONSE_BODY = []
5
+ module Lotus
6
+ module Frameworks
7
+ module Action
8
+ module Rack
9
+ ENV_KEY = 'lotus.action'.freeze
29
10
 
30
- protected
31
- def response
32
- [ @_status || DEFAULT_RESPONSE_CODE, headers, @_body || DEFAULT_RESPONSE_BODY.dup, self ]
11
+ protected
12
+ def finish
13
+ super
14
+ @_env[ENV_KEY] = self
15
+ end
16
+ end
17
+ end
33
18
  end
34
19
  end
35
20
 
21
+ Lotus::Action::Rack.class_eval do
22
+ prepend Lotus::Frameworks::Action::Rack
23
+ end
24
+
36
25
  Lotus::Action.class_eval do
37
26
  def to_rendering
38
27
  exposures.merge(format: format)
@@ -0,0 +1,31 @@
1
+ require 'delegate'
2
+
3
+ module Lotus
4
+ module Generators
5
+ # Abstract super class for generators
6
+ #
7
+ # @abstract
8
+ # @since 0.2.0
9
+ class Abstract < SimpleDelegator
10
+ # Initialize a generator
11
+ #
12
+ # @param command [Thor] a Thor instance that comes from Lotus::Cli
13
+ #
14
+ # @since 0.2.0
15
+ # @api private
16
+ def initialize(command)
17
+ super(command)
18
+ end
19
+
20
+ # Start the generator
21
+ #
22
+ # @raise [NotImplementedError]
23
+ #
24
+ # @abstract
25
+ # @since 0.2.0
26
+ def start
27
+ raise NotImplementedError
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'bundler'
4
+ gem 'rake'
5
+
6
+ <%- if config[:lotus_head] -%>
7
+ gem 'lotus-utils', require: false, github: 'lotus/utils'
8
+ gem 'lotus-router', require: false, github: 'lotus/router'
9
+ gem 'lotus-validations', require: false, github: 'lotus/validations'
10
+ gem 'lotus-controller', require: false, github: 'lotus/controller'
11
+ gem 'lotus-view', require: false, github: 'lotus/view'
12
+ gem 'lotus-model', require: false, github: 'lotus/model'
13
+ gem 'lotusrb', github: 'lotus/lotus'
14
+ <%- else -%>
15
+ gem 'lotusrb', '<%= Lotus::VERSION %>'
16
+ gem 'lotus-model', '<%= config[:lotus_model_version] %>'
17
+ <%- end -%>
18
+
19
+ group :test do
20
+ <%- if config[:test] == 'rspec' -%>
21
+ <%- else -%>
22
+ gem 'minitest'
23
+ <%- end -%>
24
+ gem 'capybara'
25
+ end
26
+
27
+ group :production do
28
+ # gem 'puma'
29
+ end
@@ -0,0 +1,10 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = 'spec/**/*_spec.rb'
6
+ t.libs << 'spec'
7
+ end
8
+
9
+ task default: :test
10
+ task spec: :test
@@ -0,0 +1,2 @@
1
+ # Define ENV variables for development environment
2
+ <%= config[:app_name].upcase %>_DATABASE_URL="file:///db/<%= config[:app_name] %>_development"
@@ -0,0 +1,2 @@
1
+ # Define ENV variables for test environment
2
+ <%= config[:app_name].upcase %>_DATABASE_URL="file:///db/<%= config[:app_name] %>_test"
@@ -0,0 +1 @@
1
+ # Define ENV variables
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'lotus/setup'
4
+ require_relative '../lib/<%= config[:app_name] %>'
5
+
6
+ Lotus::Container.configure do
7
+ end
@@ -0,0 +1,3 @@
1
+ require './config/environment'
2
+
3
+ run Lotus::Container.new
@@ -0,0 +1,11 @@
1
+ # Require this file for feature tests
2
+ require_relative './spec_helper'
3
+
4
+ require 'capybara'
5
+ require 'capybara/dsl'
6
+
7
+ Capybara.app = Lotus::Container.new
8
+
9
+ class MiniTest::Spec
10
+ include Capybara::DSL
11
+ end
@@ -0,0 +1,31 @@
1
+ require 'lotus/model'
2
+ Dir["#{ __dir__ }/**/*.rb"].each { |file| require_relative file }
3
+
4
+ Lotus::Model.configure do
5
+ # Database adapter
6
+ #
7
+ # Available options:
8
+ #
9
+ # * Memory adapter
10
+ # adapter type: :memory, uri: 'memory://localhost/<%= config[:app_name] %>_development'
11
+ #
12
+ # * SQL adapter
13
+ # adapter type: :sql, uri: 'sqlite://db/<%= config[:app_name] %>_development.db'
14
+ # adapter type: :sql, uri: 'postgres://localhost/<%= config[:app_name] %>_development'
15
+ # adapter type: :sql, uri: 'mysql://localhost/<%= config[:app_name] %>_development'
16
+ #
17
+ adapter type: :file_system, uri: ENV['<%= config[:app_name].upcase %>_DATABASE_URL']
18
+
19
+ ##
20
+ # Database mapping
21
+ #
22
+ mapping do
23
+ # collection :users do
24
+ # entity User
25
+ # repository UserRepository
26
+ #
27
+ # attribute :id, Integer
28
+ # attribute :name, String
29
+ # end
30
+ end
31
+ end.load!
@@ -0,0 +1,7 @@
1
+ # Require this file for unit tests
2
+ ENV['LOTUS_ENV'] ||= 'test'
3
+
4
+ require_relative '../config/environment'
5
+ require 'minitest/autorun'
6
+
7
+ Lotus::Application.preload!
@@ -0,0 +1,70 @@
1
+ require 'lotus/generators/abstract'
2
+ require 'lotus/generators/slice'
3
+
4
+ module Lotus
5
+ module Generators
6
+ module Application
7
+ class Container < Abstract
8
+ def initialize(command)
9
+ super
10
+
11
+ @slice_generator = Slice.new(command)
12
+ @lotus_head = options.fetch(:lotus_head)
13
+ @lotus_model_version = '~> 0.2'
14
+
15
+ cli.class.source_root(source)
16
+ end
17
+
18
+ def start
19
+ opts = {
20
+ app_name: app_name,
21
+ lotus_head: @lotus_head,
22
+ lotus_model_version: @lotus_model_version
23
+ }
24
+
25
+ templates = {
26
+ 'Gemfile.tt' => 'Gemfile',
27
+ 'config.ru.tt' => 'config.ru',
28
+ 'config/environment.rb.tt' => 'config/environment.rb',
29
+ 'config/.env.tt' => 'config/.env',
30
+ 'config/.env.development.tt' => 'config/.env.development',
31
+ 'config/.env.test.tt' => 'config/.env.test',
32
+ 'lib/app_name.rb.tt' => "lib/#{ app_name }.rb",
33
+ }
34
+
35
+ empty_directories = [
36
+ "db",
37
+ "lib/#{ app_name }/entities",
38
+ "lib/#{ app_name }/repositories"
39
+ ]
40
+
41
+ case options[:test]
42
+ when 'rspec'
43
+ else # minitest (default)
44
+ templates.merge!(
45
+ 'Rakefile.minitest.tt' => 'Rakefile',
46
+ 'spec_helper.rb.tt' => 'spec/spec_helper.rb',
47
+ 'features_helper.rb.tt' => 'spec/features_helper.rb'
48
+ )
49
+
50
+ empty_directories << [
51
+ "spec/#{ app_name }/entities",
52
+ "spec/#{ app_name }/repositories"
53
+ ]
54
+ end
55
+
56
+ templates.each do |src, dst|
57
+ cli.template(source.join(src), target.join(dst), opts)
58
+ end
59
+
60
+ empty_directories.flatten.each do |dir|
61
+ gitkeep = '.gitkeep'
62
+ cli.template(source.join(gitkeep), target.join(dir, gitkeep), opts)
63
+ end
64
+
65
+ @slice_generator.start
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end