nekonote-framework 1.0.0.pre.beta

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.
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