nekonote-framework 1.0.0.pre.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +49 -0
  4. data/bin/nekonote +45 -0
  5. data/data/structure/Gemfile +25 -0
  6. data/data/structure/config.ru +14 -0
  7. data/data/structure/handler/base.rb +21 -0
  8. data/data/structure/handler/error.rb +35 -0
  9. data/data/structure/handler/welcome.rb +11 -0
  10. data/data/structure/lib/.gitkeep +0 -0
  11. data/data/structure/preference/development/logger.yml +62 -0
  12. data/data/structure/preference/development/middlewares.rb +152 -0
  13. data/data/structure/preference/development/public.yml +29 -0
  14. data/data/structure/preference/development/route.yml +30 -0
  15. data/data/structure/preference/development/route_error.yml +28 -0
  16. data/data/structure/preference/development/route_include.yml +22 -0
  17. data/data/structure/preference/development/server/puma.rb +63 -0
  18. data/data/structure/preference/development/setting/example.yml +40 -0
  19. data/data/structure/preference/development/setting/site.yml +3 -0
  20. data/data/structure/preference/development/setting/welcome.yml +7 -0
  21. data/data/structure/public/css/layout/common.css +11 -0
  22. data/data/structure/public/css/layout/default.css +3 -0
  23. data/data/structure/public/css/layout/error.css +3 -0
  24. data/data/structure/public/css/welcome.css +47 -0
  25. data/data/structure/public/favicon.ico +0 -0
  26. data/data/structure/public/img/.gitkeep +0 -0
  27. data/data/structure/public/img/logo.png +0 -0
  28. data/data/structure/public/js/.gitkeep +0 -0
  29. data/data/structure/static/layout/default.tpl +19 -0
  30. data/data/structure/static/layout/error.tpl +15 -0
  31. data/data/structure/static/sass/welcome.scss +52 -0
  32. data/data/structure/static/template/error.tpl +4 -0
  33. data/data/structure/static/template/welcome/index.tpl +26 -0
  34. data/data/structure/tmp/pids/.gitkeep +0 -0
  35. data/lib/loader.rb +83 -0
  36. data/lib/nekonote.rb +9 -0
  37. data/lib/nekonote/cli.rb +702 -0
  38. data/lib/nekonote/cmd_parser.rb +55 -0
  39. data/lib/nekonote/core.rb +116 -0
  40. data/lib/nekonote/env.rb +56 -0
  41. data/lib/nekonote/exception/cli_error.rb +34 -0
  42. data/lib/nekonote/exception/error.rb +75 -0
  43. data/lib/nekonote/exception/handler_error.rb +5 -0
  44. data/lib/nekonote/exception/logger_error.rb +8 -0
  45. data/lib/nekonote/exception/page_cache_error.rb +6 -0
  46. data/lib/nekonote/exception/preference_error.rb +11 -0
  47. data/lib/nekonote/exception/view_error.rb +7 -0
  48. data/lib/nekonote/handler.rb +274 -0
  49. data/lib/nekonote/handler/protected_methods.rb +119 -0
  50. data/lib/nekonote/liquid/tag_env_get.rb +12 -0
  51. data/lib/nekonote/liquid/tag_setting_get.rb +12 -0
  52. data/lib/nekonote/logger.rb +135 -0
  53. data/lib/nekonote/page_cache.rb +111 -0
  54. data/lib/nekonote/preference.rb +215 -0
  55. data/lib/nekonote/puma.rb +131 -0
  56. data/lib/nekonote/rack/rack_static.rb +17 -0
  57. data/lib/nekonote/rack/rack_static_file.rb +19 -0
  58. data/lib/nekonote/rack/url_mapper.rb +193 -0
  59. data/lib/nekonote/rackup.rb +319 -0
  60. data/lib/nekonote/request.rb +295 -0
  61. data/lib/nekonote/setting.rb +59 -0
  62. data/lib/nekonote/spec.rb +22 -0
  63. data/lib/nekonote/util/filer.rb +69 -0
  64. data/lib/nekonote/util/process.rb +43 -0
  65. data/lib/nekonote/view.rb +398 -0
  66. data/lib/nekonote/yaml_access.rb +60 -0
  67. metadata +144 -0
@@ -0,0 +1,9 @@
1
+ begin
2
+ require_relative 'loader'
3
+ rescue StandardError, ScriptError => e
4
+ begin
5
+ Nekonote::Error.abort e
6
+ rescue
7
+ raise e
8
+ end
9
+ end
@@ -0,0 +1,702 @@
1
+ module Nekonote
2
+ @@from_cli = true
3
+
4
+ class Cli
5
+ STRING_RELOADABLE_PREFS = %('setting/', 'logger.yml')
6
+ STRING_CAT_AND_MOUSE = ' . . . - - - - - - /=^x^)=/ - - ~~(=**)='
7
+ SPACE = ' '
8
+
9
+ # @param string cmd
10
+ # @param string subcmd
11
+ # @param string val
12
+ # @param hash options
13
+ public
14
+ def initialize(cmd, subcmd=nil, val=nil, options=nil)
15
+ path_structure = File.expand_path(File.dirname(__FILE__)).split '/'
16
+ path_structure.pop
17
+ path_structure.pop
18
+ @path_structure =%(#{path_structure.join('/')}/data/structure)
19
+
20
+ Cli.usage if !cmd.is_a? String
21
+ subcmd ||= ''
22
+ val ||= ''
23
+ options ||= {}
24
+
25
+ # set-up properties
26
+ root = options[:root]
27
+ root ||= './'
28
+ root += '/' if !root.end_with? '/'
29
+ @root = root
30
+
31
+ @cmd = cmd.intern
32
+ @val = val.to_s
33
+ @options = options
34
+
35
+ if subcmd == ''
36
+ @subcmd = subcmd
37
+ else
38
+ @subcmd = subcmd.intern
39
+ end
40
+ end
41
+
42
+ # execute task
43
+ public
44
+ def exec
45
+ case @cmd
46
+ when :new
47
+ # generate something
48
+ case @subcmd
49
+ when :app, :application
50
+ generate_structure @val
51
+
52
+ when :env
53
+ Nekonote.set_root @root
54
+ generate_env @val
55
+
56
+ when :handler
57
+ Nekonote.set_root @root
58
+ generate_handler @val
59
+
60
+ when :template, :tpl
61
+ Nekonote.set_root @root
62
+ generate_template @val
63
+
64
+ when :layout
65
+ Nekonote.set_root @root
66
+ generate_layout @val
67
+
68
+ when ''
69
+ # show usage
70
+ Nekonote::Cli.usage_new
71
+
72
+ else
73
+ raise CLIError, CLIError::MSG_UNKNOWN_AFTER_NEW% @subcmd
74
+ end
75
+
76
+ when :server, :s
77
+ # control server
78
+ case @subcmd
79
+ when :start, :st
80
+ Nekonote.set_root @root
81
+ start_server
82
+
83
+ when :status, :stop, :halt, :restart, :phased_restart
84
+ Nekonote.set_root @root
85
+ ctl_server @subcmd
86
+
87
+ when :config, :conf
88
+ Nekonote.set_root @root
89
+ disp_server_config
90
+
91
+ when ''
92
+ # show usage
93
+ Nekonote::Cli.usage_server
94
+
95
+ else
96
+ raise CLIError, CLIError::MSG_UNKNOWN_AFTER_SERVER% @subcmd
97
+ end
98
+
99
+ when :reload_pref, :rp
100
+ # reload preferences
101
+ Nekonote.set_root @root
102
+ reload_preference
103
+
104
+ when :page_cache_clear, :pcc
105
+ # page caches clear
106
+ Nekonote.set_root @root
107
+ page_cache_clear
108
+
109
+ when :env
110
+ # disp env
111
+ disp_env
112
+
113
+ when :info
114
+ # disp information
115
+ disp_info
116
+
117
+ else
118
+ # wrong sub command
119
+ raise CLIError, CLIError::MSG_UNKNOWN_SUB_COMMAND% @cmd
120
+ end
121
+
122
+ exit 0
123
+ end
124
+
125
+ private
126
+ def start_server
127
+ begin
128
+ puts %(Environment: #{Nekonote.get_env})
129
+ ctl_server :start
130
+
131
+ rescue SystemExit
132
+ exit 0
133
+
134
+ rescue Exception => e
135
+ CLIError.warning CLIError::MSG_FAILED_START_SERVER
136
+ raise e
137
+ end
138
+ end
139
+
140
+ # @param cmd symbol
141
+ private
142
+ def ctl_server(cmd)
143
+ # selectable only puma so far
144
+ (::Nekonote::Puma.new Nekonote.get_root, Nekonote.get_env).ctl_server cmd
145
+ end
146
+
147
+ # make temp file to reload preferences
148
+ private
149
+ def reload_preference
150
+ Util::Filer::safe_make_empty_file(Nekonote.get_root_path + Preference::FILE_NAME_FOR_RELOAD)
151
+ disp_success_message %(Now ready for reloading -> #{STRING_RELOADABLE_PREFS})
152
+ end
153
+
154
+ private
155
+ def page_cache_clear
156
+ if PageCache.instance.cache_clear
157
+ disp_success_message 'Page cache files was removed.'
158
+ else
159
+ msg = 'No page cache file found. Nothing to do.'
160
+ puts msg
161
+ end
162
+ end
163
+
164
+ # @param string env_name
165
+ private
166
+ def generate_handler(path)
167
+ stack = get_absolute_path_list path, 'handler'
168
+ handler_path = stack.pop
169
+ handler_name = File.basename handler_path
170
+ handler_path += '.rb'
171
+ gen_dir_list = stack
172
+
173
+ # check whether the handler exists?
174
+ if File.exists? handler_path
175
+ raise CLIError, CLIError::MSG_ALREADY_EXISTS_HANDLER% handler_path
176
+ end
177
+
178
+ # get handler class name
179
+ handler_class_name = ''
180
+ handler_name.split('_').each do |word|
181
+ next if word.empty?
182
+ handler_class_name += word.slice!(0).upcase + word
183
+ end
184
+ if handler_class_name == ''
185
+ raise CLIError, CLIError::MSG_INVALID_HANDLER_NAME% path
186
+ end
187
+ handler_class_name += 'Handler'
188
+
189
+ # make directories if necessery
190
+ generate_directory gen_dir_list
191
+ puts '' if gen_dir_list.size > 0
192
+
193
+ # make handler class
194
+ content = <<EOS
195
+ class #{handler_class_name} < BaseHandler
196
+ def index
197
+ end
198
+ end
199
+ EOS
200
+
201
+ begin
202
+ File.open(handler_path, 'a+') do |f|
203
+ f.print content
204
+ end
205
+ rescue => e
206
+ raise CLIError, CLIError::MSG_FAILED_CREATE_HANDLER% e.message
207
+ end
208
+ disp_success_message %(Created a new Handler '#{handler_class_name}', '#{handler_path}')
209
+
210
+ disp_note <<EOS
211
+ In order to use the created Handler, there is a need to configure routes as:
212
+
213
+ e.g.
214
+ #{handler_class_name}:
215
+ path: /#{handler_name}
216
+ execute: index
217
+ EOS
218
+ end
219
+
220
+ # @param string path
221
+ private
222
+ def generate_template(path)
223
+ stack = get_absolute_path_list path, 'static/template'
224
+ template_path = stack.pop + '.tpl'
225
+ gen_dir_list = stack
226
+
227
+ path = path.sub /\/$/, '' if path.end_with? '/'
228
+
229
+ # check whether the template exists?
230
+ if File.exists? template_path
231
+ raise CLIError, CLIError::MSG_ALREADY_EXISTS_TEMPLATE% template_path
232
+ end
233
+
234
+ # make directories if necessery
235
+ generate_directory gen_dir_list
236
+ puts '' if gen_dir_list.size > 0
237
+
238
+ # make template
239
+ content = %()
240
+
241
+ begin
242
+ File.open(template_path, 'a+') do |f|
243
+ f.print content
244
+ end
245
+ rescue => e
246
+ raise CLIError, CLIError::MSG_FAILED_CREATE_TEMPLATE% e.message
247
+ end
248
+ disp_success_message %(Created a new template '#{template_path}')
249
+
250
+ disp_note <<EOS
251
+ In order to use the template file you created, you need to set 'template' directive in your route as:
252
+
253
+ e.g.
254
+ ExampleHandler
255
+ path: /example
256
+ execute: index
257
+ template: #{path}
258
+ EOS
259
+ end
260
+
261
+ # @param string path
262
+ private
263
+ def generate_layout(path)
264
+ stack = get_absolute_path_list path, 'static/layout'
265
+ layout_path = stack.pop + '.tpl'
266
+ gen_dir_list = stack
267
+
268
+ path = path.sub /\/$/, '' if path.end_with? '/'
269
+
270
+ # check whether the layout exists?
271
+ if File.exists? layout_path
272
+ raise CLIError, CLIError::MSG_ALREADY_EXISTS_LAYOUT% layout_path
273
+ end
274
+
275
+ # make directories if necessery
276
+ generate_directory gen_dir_list
277
+ puts '' if gen_dir_list.size > 0
278
+
279
+ # make layout
280
+ content = %()
281
+
282
+ begin
283
+ File.open(layout_path, 'a+') do |f|
284
+ f.print content
285
+ end
286
+ rescue => e
287
+ raise CLIError, CLIError::MSG_FAILED_CREATE_LAYOUT% e.message
288
+ end
289
+ disp_success_message %(Created a new layout '#{layout_path}')
290
+
291
+ disp_note <<EOS
292
+ In order to use the layout file you created, you need to set 'layout' directive in your route as:
293
+
294
+ e.g.
295
+ ExampleHandler
296
+ path: /example
297
+ execute: index
298
+ layout: #{path}
299
+ EOS
300
+ end
301
+
302
+ # @param string env
303
+ private
304
+ def generate_env(env)
305
+ stack = get_absolute_path_list env, 'preference'
306
+ if stack.size != 1
307
+ raise CLIError, CLIError::MSG_INVALID_ENV_NAME% env
308
+ end
309
+ env_path = stack.pop
310
+
311
+ # check whether the envinronment exists or not
312
+ if File.exists? env_path
313
+ raise CLIError, CLIError::MSG_ALREADY_EXISTS_ENV% env_path
314
+ end
315
+
316
+ # get base path
317
+ base_path = get_base_path 'preference/development'
318
+
319
+ # copy
320
+ begin
321
+ FileUtils.cp_r base_path, env_path
322
+ rescue => e
323
+ msg = 'Failed to create a new envinroment by the following reason.' + $/
324
+ msg += e.message
325
+ raise CLIError, msg
326
+ end
327
+
328
+ # replace
329
+ replace_puma_config Nekonote.get_root, env
330
+
331
+ # display message
332
+ disp_success_message %(Created a new environment '#{env}' on the application #{Nekonote.get_root})
333
+ disp_note <<EOS
334
+ In order to use the environment you created, you need to set '#{env}' to a shell variable called NEKONOTE_ENV.
335
+ EOS
336
+ end
337
+
338
+ # @param string app_name
339
+ private
340
+ def generate_structure(app_name)
341
+ # validation
342
+ option = {:allow_first_slash => true}
343
+ check_new_name app_name, option
344
+
345
+ base_dir = File.expand_path File.dirname(app_name)
346
+ name = File.basename app_name
347
+
348
+ # is it possible to make application structure in base_dir?
349
+ if !Util::Filer.available_dir? base_dir
350
+ raise CLIError, CLIError::MSG_PERMIT_MAKE_DIR% base_dir
351
+ end
352
+
353
+ # application root
354
+ app_root = base_dir + '/' + name
355
+
356
+ # check whether there is something or not?
357
+ if File.exist? app_root
358
+ raise CLIError, CLIError::MSG_ALREADY_EXISTS_APP% app_root
359
+ end
360
+
361
+ # check whether there is the directory for generating structure
362
+ if !File.directory? @path_structure
363
+ raise CLIError, CLIError::MSG_MISSING_STRUCTURE_DIR% @path_structure
364
+ end
365
+
366
+ # generate apps root dir
367
+ Dir.mkdir app_root
368
+
369
+ # generate files and directories
370
+ cp_from = @path_structure + '/'
371
+ files = ['Gemfile', 'config.ru']
372
+ dirs = ['handler', 'lib', 'preference', 'public', 'static', 'tmp']
373
+ free_dirs_to_make = ['cache', 'log']
374
+
375
+ # copy files
376
+ files.each do |name|
377
+ file_path = "#{app_root}/#{name}"
378
+ FileUtils.cp cp_from + name, file_path
379
+ CE.once.fg(:green).tx(:bold)
380
+ puts SPACE + "* Created a file -> #{file_path}"
381
+ end
382
+
383
+ # copy directories
384
+ dirs.each do |name|
385
+ dir_path = "#{app_root}/#{name}"
386
+ FileUtils.cp_r cp_from + name, dir_path
387
+ CE.once.fg(:yellow).tx(:bold)
388
+ puts SPACE + "* Created a directory -> #{dir_path}"
389
+
390
+ files = Dir[dir_path + '/**/*']
391
+ files.each do |path|
392
+ if File.directory? path
393
+ CE.once.fg :yellow
394
+ puts SPACE + " Created a directory -> #{path}"
395
+ else
396
+ CE.once.fg :green
397
+ puts SPACE + " Created a file -> #{path}"
398
+ end
399
+ end
400
+ end
401
+
402
+ # replace
403
+ env = 'development'
404
+ replace_puma_config app_root, env
405
+ replace_gemfile app_root, Nekonote::VERSION
406
+
407
+ # change the permissions
408
+ puts ''
409
+ free_dirs_to_make.each do |name|
410
+ file_path = "#{app_root}/#{name}"
411
+ Dir.mkdir file_path
412
+ FileUtils.chmod 0777, file_path
413
+ CE.once.fg(:yellow).tx(:bold)
414
+ puts SPACE + "* Created a directory (0777) -> #{file_path}"
415
+
416
+ keep_file = "#{file_path}/.gitkeep"
417
+ File.open keep_file, 'w' do end
418
+ CE.once.fg :green
419
+ puts SPACE + " Created a file -> #{keep_file}"
420
+ end
421
+
422
+ # display success messages
423
+ puts ''
424
+ disp_success_message "Generated a new application -> #{app_root}"
425
+
426
+ # display the note
427
+ msg = <<EOS
428
+ The generated application will be published on TCP port 2002 after starting the web server by
429
+ 'NEKONOTE_ENV=#{env} nekonote server start --root #{app_root}' or 'cd #{app_root} && NEKONOTE_ENV=#{env} nekonote server start'
430
+ The web server will accpet accessing from any IP addresses.
431
+ EOS
432
+ disp_note msg, '1'
433
+
434
+ msg = <<EOS
435
+ It's possible to configure preferences for the web server by the configuration file located in the structure you just generated.
436
+ You can display the path to the configuration file by typing 'NEKONOTE_ENV=#{env} nekonote server conf --root #{app_root}'
437
+ EOS
438
+ disp_note msg, '2'
439
+
440
+ msg = <<EOS
441
+ The web server is deamonized by default. You can see the help for controlling the web server just typing 'nekonote server'.
442
+ In order to start the web server, Please typing 'NEKONOTE_ENV=#{env} nekonote server start --root #{app_root}'
443
+ As of now you have just one environment named '#{env}'.
444
+ When the shell variable NEKONOTE_ENV is set on your shell, you don't need to place NEKONOTE_ENV=#{env} to the beginning of 'nekonote' command.
445
+ EOS
446
+ disp_note msg, '3'
447
+
448
+ msg = <<EOS
449
+ Have you had installed the dependent libraries?
450
+ If you didn't yet, please install them by 'Bundler' like following:
451
+
452
+ * bundle install
453
+ Installing dependencies into all system gems.
454
+
455
+ * bundle install --path vendor/bundle
456
+ Installing into a specific directory in your application structure.
457
+ EOS
458
+ disp_note msg, '4'
459
+
460
+ puts STRING_CAT_AND_MOUSE + $/ + $/
461
+ end
462
+
463
+ # @param string app_root
464
+ # @param string env
465
+ private
466
+ def replace_puma_config(app_root, env)
467
+ after = ''
468
+ config_path = "#{app_root}/preference/#{env}/server/puma.rb"
469
+ File.open(config_path, 'r+') do |f|
470
+ after = f.read.sub 'REPLACE_ME_TO_APP_ROOT', app_root
471
+ f.truncate 0
472
+ end
473
+ File.open(config_path, 'r+') do |f|
474
+ f.print after
475
+ end
476
+ end
477
+
478
+ # @param string app_root
479
+ # @param string env
480
+ private
481
+ def replace_gemfile(app_root, version)
482
+ after = ''
483
+ gemfile_path = "#{app_root}/Gemfile"
484
+ File.open(gemfile_path, 'r+') do |f|
485
+ after = f.read.sub 'REPLACE_ME_TO_NEKONOTE_VERSION', version
486
+ f.truncate 0
487
+ end
488
+ File.open(gemfile_path, 'r+') do |f|
489
+ f.print after
490
+ end
491
+ end
492
+
493
+ # @param string path
494
+ # @param string dest
495
+ # @return array
496
+ private
497
+ def get_absolute_path_list(path, dest)
498
+ # validation
499
+ check_new_name path
500
+
501
+ # check if there is the directory to generate new handler
502
+ base_path = Nekonote.get_root_path + dest
503
+ if !File.directory? base_path
504
+ raise CLIError, CLIError::MSG_MISSING_DEST_PATH% base_path
505
+ end
506
+ base_path += '/'
507
+
508
+ # perse handler name and its path
509
+ stack = []
510
+ dir = base_path
511
+ path.split('/').each do |name|
512
+ stack << dir + name
513
+ dir += name + '/'
514
+ end
515
+
516
+ if stack.size == 0
517
+ raise CLIError, CLIError::MSG_INVALID_NEW_NAME% path
518
+ end
519
+
520
+ return stack
521
+ end
522
+
523
+ # @param string path path to base that without starting with slash
524
+ private
525
+ def get_base_path(path = '')
526
+ # check there is the directory for generating structure
527
+ if !File.directory? @path_structure
528
+ raise CLIError, CLIError::MSG_MISSING_STRUCTURE_DIR% @path_structure
529
+ end
530
+
531
+ # check there is the base-directory for generating new env
532
+ base_path = @path_structure + '/' + path
533
+ if !File.directory? base_path
534
+ raise CLIError, CLIError::MSG_MISSING_STRUCTURE_DIR% base_path
535
+ end
536
+
537
+ return base_path
538
+ end
539
+
540
+ # @param array stack
541
+ private
542
+ def generate_directory(stack)
543
+ stack.each do |dir|
544
+ if File.directory? dir
545
+ # nothing to do
546
+ elsif File.exist? dir
547
+ raise CLIError, CLIError::MSG_FAILED_GEN_DIR_BY_FILE% dir
548
+ else
549
+ Dir.mkdir dir
550
+ CE.once.fg :yellow
551
+ puts SPACE + '* Created a directory -> ' + dir
552
+ end
553
+ end
554
+ end
555
+
556
+ # @param string name
557
+ # @param hash option
558
+ # @throw CLIError
559
+ # @return void
560
+ private
561
+ def check_new_name(name, option = {})
562
+ if name == ''
563
+ raise CLIError, CLIError::MSG_MISSING_NEW_PATH
564
+ end
565
+
566
+ option = {} if !option.is_a? Hash
567
+ if name =~ /^[^0-9a-zA-Z]/
568
+ if !option[:allow_first_slash]
569
+ raise CLIError, CLIError::MSG_INVALID_NEW_NAME% name
570
+ end
571
+ end
572
+ end
573
+
574
+ # @param string msg
575
+ private
576
+ def disp_success_message(msg)
577
+ CE.times(2).fg :cyan
578
+ puts SPACE + 'Success!'
579
+ puts SPACE + ' ' + msg + $/
580
+ end
581
+
582
+ # @param string msg
583
+ # @param string|nil
584
+ private
585
+ def disp_note(msg, num = nil)
586
+ puts ''
587
+ CE.once.fg(:white).tx(:bold)
588
+ if num.is_a? String
589
+ header = %(Note #{num}:)
590
+ else
591
+ header = %(Note:)
592
+ end
593
+ puts SPACE + header
594
+
595
+ CE.fg(:white)
596
+ msg.lines do |line|
597
+ puts SPACE + ' ' + line
598
+ end
599
+ CE.off
600
+ puts ''
601
+ end
602
+
603
+ # disp information
604
+ private
605
+ def disp_info
606
+ env = Nekonote.has_valid_env? ? Nekonote.get_env : 'Environment is not set. Please set NEKONOTE_ENV.'
607
+ puts %(Version: #{VERSION})
608
+ puts %(Current Environment: #{env})
609
+ puts $/ + STRING_CAT_AND_MOUSE + $/ + $/
610
+ end
611
+
612
+ # disp current environment
613
+ private
614
+ def disp_env
615
+ begin
616
+ env = Nekonote.get_env
617
+ rescue Nekonote::Error
618
+ env = nil
619
+ end
620
+
621
+ if env != nil
622
+ puts env
623
+ else
624
+ puts 'Missing Environment:'
625
+ disp_note <<EOS
626
+ You haven't set any environment now!
627
+ You need to set some environment for your application by declaring a shell variable called NEKONOTE_ENV.
628
+ EOS
629
+ end
630
+ end
631
+
632
+ private
633
+ def disp_server_config
634
+ puma = ::Nekonote::Puma.new Nekonote.get_root, Nekonote.get_env
635
+ puts puma.get_config_path
636
+ end
637
+
638
+ # ----------------
639
+ # class methods
640
+ # ----------------
641
+ # output the version
642
+ def self.version(status = 0)
643
+ puts VERSION
644
+ exit status if status != nil
645
+ end
646
+
647
+ # out put the usage for nekonote new
648
+ def self.usage_new
649
+ puts <<-EOS
650
+ [Usage]
651
+ nekonote new <sub_command> <value>
652
+
653
+ [Sub Commands]
654
+ application, app <application_name> Generates a new nekonote application structure.
655
+ env <environment_name> Create a new environment for an existing application structure.
656
+ handler <handler_name> Create a new handler for an existing application structure. You may pass a relative path.
657
+ template, tpl <template_name> Create a new template file for an existing application structure. You may pass a relative path.
658
+ layout <layout_name> Create a new layout file for an existing application structure. You may pass a relative path.
659
+ EOS
660
+ end
661
+
662
+ # out put the usage for nekonote server
663
+ def self.usage_server
664
+ puts <<-EOS
665
+ [Usage]
666
+ nekonote server, s <sub_command>
667
+
668
+ [Sub Commands]
669
+ start, st Starts the web server.
670
+ stop Stop the web server.
671
+ halt Halts the web server.
672
+ restart Restarts the web server.
673
+ phased_restart Reqests phased restart to puma web server.
674
+ status Displays status of the web server.
675
+ config, conf Displays a path to the configuration file.
676
+ EOS
677
+ end
678
+
679
+ # output the usage
680
+ def self.usage
681
+ puts <<-EOS
682
+ [Usage]
683
+ nekonote [options] <command> [<sub_command> [<value>]]
684
+
685
+ [Commands]
686
+ new Creates something. You can see the details by just typing 'nekonote new'.
687
+ server, s Controls the web server. You can see the details by just typing 'nekonote server'.
688
+ reload_pref, rp Reloads preferences without restarting or reloading server. Only #{STRING_RELOADABLE_PREFS} are reloadable.
689
+ page_cache_clear, pcc Removes page cache files in the 'cache' directory.
690
+ env Displays the current application environment.
691
+ info Displays some information.
692
+
693
+ [Options]
694
+ -v, --version Shows the version of your Nekonote Framework.
695
+ -h, --help Shows this information.
696
+ --root <path> Declares an application root. The default is your current directory.
697
+ EOS
698
+
699
+ exit 0
700
+ end
701
+ end
702
+ end