lotusrb 0.1.0 → 0.2.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.
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
@@ -1,14 +1,24 @@
1
1
  require 'lotus/utils/kernel'
2
+ require 'lotus/environment'
3
+ require 'lotus/config/framework_configuration'
2
4
  require 'lotus/config/load_paths'
3
5
  require 'lotus/config/assets'
4
6
  require 'lotus/config/routes'
5
7
  require 'lotus/config/mapping'
8
+ require 'lotus/config/sessions'
9
+ require 'lotus/config/configure'
6
10
 
7
11
  module Lotus
8
12
  # Configuration for a Lotus application
9
13
  #
10
14
  # @since 0.1.0
11
15
  class Configuration
16
+ # @since 0.2.0
17
+ # @api private
18
+ #
19
+ # @see Lotus::Configuration#ssl?
20
+ SSL_SCHEME = 'https'.freeze
21
+
12
22
  # Initialize a new configuration instance
13
23
  #
14
24
  # @return [Lotus::Configuration]
@@ -17,18 +27,30 @@ module Lotus
17
27
  # @api private
18
28
  def initialize
19
29
  @blk = Proc.new{}
30
+ @env = Environment.new
31
+ @configurations = Hash.new { |k, v| k[v] = [] }
20
32
  end
21
33
 
22
- # Set a block yield when the configuration will be loaded
34
+ # Set a block yield when the configuration will be loaded or
35
+ # set a path for the specific environment.
23
36
  #
37
+ # @param environment [Symbol,nil] the configuration environment name
38
+ # @param environment [String,nil] the configuration path of a specific environment
24
39
  # @param blk [Proc] the configuration block
25
40
  #
26
41
  # @return [self]
27
42
  #
28
43
  # @since 0.1.0
29
44
  # @api private
30
- def configure(&blk)
31
- @blk = blk if block_given?
45
+ def configure(environment = nil, path = nil, &blk)
46
+ if environment && path
47
+ @configurations[environment.to_s] << Config::Configure.new(root, path, &blk)
48
+ elsif environment
49
+ @configurations[environment.to_s] << blk
50
+ else
51
+ @blk = blk
52
+ end
53
+
32
54
  self
33
55
  end
34
56
 
@@ -42,7 +64,8 @@ module Lotus
42
64
  # @api private
43
65
  def load!(namespace = nil)
44
66
  @namespace = namespace
45
- instance_eval(&@blk)
67
+ evaluate_configurations!
68
+
46
69
  self
47
70
  end
48
71
 
@@ -298,21 +321,12 @@ module Lotus
298
321
  end
299
322
  end
300
323
 
301
- # Assets root.
302
- # The application will serve the static assets under this directory.
324
+ # The application will serve the static assets under these directories.
303
325
  #
304
326
  # By default it's equal to the `public/` directory under the application
305
327
  # `root`.
306
328
  #
307
- # Otherwise, you can specify a different relative path under `root`.
308
- #
309
- # This is part of a DSL, for this reason when this method is called with
310
- # an argument, it will set the corresponding instance variable. When
311
- # called without, it will return the already set value, or the default.
312
- #
313
- # @overload assets(value)
314
- # Sets the given value
315
- # @param value [String] the relative path to the assets dir.
329
+ # Otherwise, you can add differents relatives paths under `root`.
316
330
  #
317
331
  # @overload assets
318
332
  # Gets the value
@@ -320,7 +334,7 @@ module Lotus
320
334
  #
321
335
  # @since 0.1.0
322
336
  #
323
- # @see Lotus::Configuration#root
337
+ # @see Lotus::Configuration#serve_assets
324
338
  #
325
339
  # @example Getting the value
326
340
  # require 'lotus'
@@ -333,24 +347,220 @@ module Lotus
333
347
  # Bookshelf::Application.configuration.assets
334
348
  # # => #<Pathname:/root/path/public>
335
349
  #
336
- # @example Setting the value
350
+ # @example Adding new assets paths
337
351
  # require 'lotus'
338
352
  #
339
353
  # module Bookshelf
340
354
  # class Application < Lotus::Application
341
355
  # configure do
342
- # assets 'assets'
356
+ # serve_assets true
357
+ # assets << [
358
+ # 'vendor/assets'
359
+ # ]
343
360
  # end
344
361
  # end
345
362
  # end
346
363
  #
347
364
  # Bookshelf::Application.configuration.assets
348
- # # => #<Pathname:/root/path/assets>
349
- def assets(value = nil)
350
- if value
351
- @assets = value
365
+ # # => #<Lotus::Config::Assets @root=#<Pathname:/root/path/assets>, @paths=["public"]>
366
+ #
367
+ def assets
368
+ @assets ||= Config::Assets.new(root)
369
+ end
370
+
371
+ # Configure serving of assets
372
+ # Enable static assets (disabled by default).
373
+ #
374
+ # This is part of a DSL, for this reason when this method is called with
375
+ # an argument, it will set the corresponding instance variable. When
376
+ # called without, it will return the already set value, or the default.
377
+ #
378
+ # @since 0.2.0
379
+ #
380
+ # @overload serve_assets(value)
381
+ # Sets the given value.
382
+ # @param value [TrueClass, FalseClass]
383
+ #
384
+ # @overload serve_assets
385
+ # Gets the value.
386
+ # @return [TrueClass, FalseClass]
387
+ #
388
+ # @see Lotus::Configuration#assets
389
+ #
390
+ # @example Getting serve assets configuration by default
391
+ # require 'lotus'
392
+ #
393
+ # module Bookshelf
394
+ # class Application < Lotus::Application
395
+ # end
396
+ # end
397
+ #
398
+ # Bookshelf::Application.configuration.serve_assets
399
+ # # => false
400
+ #
401
+ # @example Enabling static assets
402
+ # require 'lotus'
403
+ #
404
+ # module Bookshelf
405
+ # class Application < Lotus::Application
406
+ # configure do
407
+ # serve_assets true
408
+ # end
409
+ # end
410
+ # end
411
+ #
412
+ # Bookshelf::Application.configuration.serve_assets
413
+ # # => true
414
+ def serve_assets(value = nil)
415
+ if value.nil?
416
+ @serve_assets || false
417
+ else
418
+ @serve_assets = value
419
+ end
420
+ end
421
+
422
+ # Configure cookies
423
+ # Enable cookies (disabled by default).
424
+ #
425
+ # This is part of a DSL, for this reason when this method is called with
426
+ # an argument, it will set the corresponding instance variable. When
427
+ # called without, it will return the already set value, or the default.
428
+ #
429
+ # @overload cookies(value)
430
+ # Sets the given value.
431
+ # @param value [TrueClass, FalseClass]
432
+ #
433
+ # @overload cookies
434
+ # Gets the value.
435
+ # @return [TrueClass, FalseClass]
436
+ #
437
+ # @example Getting the value
438
+ # require 'lotus'
439
+ #
440
+ # module Bookshelf
441
+ # class Application < Lotus::Application
442
+ # end
443
+ # end
444
+ #
445
+ # Bookshelf::Application.configuration.cookies
446
+ # # => false
447
+ #
448
+ # @example Setting the value
449
+ # require 'lotus'
450
+ #
451
+ # module Bookshelf
452
+ # class Application < Lotus::Application
453
+ # configure do
454
+ # cookies true
455
+ # end
456
+ # end
457
+ # end
458
+ #
459
+ # Bookshelf::Application.configuration.cookies
460
+ # # => true
461
+ #
462
+ # @example Setting a new value after one is set.
463
+ # require 'lotus'
464
+ #
465
+ # module Bookshelf
466
+ # class Application < Lotus::Application
467
+ # configure do
468
+ # cookies false
469
+ # cookies true
470
+ # end
471
+ # end
472
+ # end
473
+ #
474
+ # Bookshelf::Application.configuration.cookies
475
+ # # => true
476
+ #
477
+ def cookies(value = nil)
478
+ if value.nil?
479
+ @cookies || false
480
+ else
481
+ @cookies = value
482
+ end
483
+ end
484
+
485
+ # Configure sessions
486
+ # Enable sessions (disabled by default).
487
+ #
488
+ # This is part of a DSL, for this reason when this method is called with
489
+ # an argument, it will set the corresponding instance variable. When
490
+ # called without, it will return the already set value, or the default.
491
+ #
492
+ # Given Class as adapter it will be used as sessions middleware.
493
+ # Given String as adapter it will be resolved as class name and used as
494
+ # sessions middleware.
495
+ # Given Symbol as adapter it is assumed it's name of the class under
496
+ # Rack::Session namespace that will be used as sessions middleware
497
+ # (e.g. :cookie for Rack::Session::Cookie).
498
+ #
499
+ # By default options include domain inferred from host configuration, and
500
+ # secure flag inferred from scheme configuration.
501
+ #
502
+ # @overload sessions(adapter, options)
503
+ # Sets the given value.
504
+ # @param adapter [Class, String, Symbol] Rack middleware for sessions management
505
+ # @param options [Hash] options to pass to sessions middleware
506
+ #
507
+ # @overload sessions(false)
508
+ # Disables sessions
509
+ #
510
+ # @overload sessions
511
+ # Gets the value.
512
+ # @return [Lotus::Config::Sessions] sessions configuration
513
+ #
514
+ # @since 0.2.0
515
+ #
516
+ # @see Lotus::Configuration#host
517
+ # @see Lotus::Configuration#scheme
518
+ #
519
+ # @example Getting the value
520
+ # require 'lotus'
521
+ #
522
+ # module Bookshelf
523
+ # class Application < Lotus::Application
524
+ # end
525
+ # end
526
+ #
527
+ # Bookshelf::Application.configuration.sessions
528
+ # # => #<Lotus::Config::Sessions:0x00000001ca0c28 @enabled=false>
529
+ #
530
+ # @example Setting the value with symbol
531
+ # require 'lotus'
532
+ #
533
+ # module Bookshelf
534
+ # class Application < Lotus::Application
535
+ # configure do
536
+ # sessions :cookie, secret: 'abc123'
537
+ # end
538
+ # end
539
+ # end
540
+ #
541
+ # Bookshelf::Application.configuration.sessions
542
+ # # => #<Lotus::Config::Sessions:0x00000001589458 @enabled=true, @adapter=:cookie, @options={:domain=>"localhost", :secure=>false}>
543
+ #
544
+ # @example Disabling previusly enabled sessions
545
+ # require 'lotus'
546
+ #
547
+ # module Bookshelf
548
+ # class Application < Lotus::Application
549
+ # configure do
550
+ # sessions :cookie
551
+ # sessions false
552
+ # end
553
+ # end
554
+ # end
555
+ #
556
+ # Bookshelf::Application.configuration.sessions
557
+ # # => #<Lotus::Config::Sessions:0x00000002460d78 @enabled=false>
558
+ #
559
+ def sessions(adapter = nil, options = {})
560
+ if adapter.nil?
561
+ @sessions ||= Config::Sessions.new
352
562
  else
353
- Config::Assets.new(root, @assets)
563
+ @sessions = Config::Sessions.new(adapter, options, self)
354
564
  end
355
565
  end
356
566
 
@@ -473,8 +683,177 @@ module Lotus
473
683
  end
474
684
  end
475
685
 
476
- # since 0.1.0
477
- # @api private
686
+ # Body parsing configuration.
687
+ #
688
+ # Specify a set of parsers for specific mime types that your application will use. This method will
689
+ # return the application's parsers which you can use to add existing and new custom parsers for your
690
+ # application to use.
691
+ #
692
+ # By default it's an empty `Array`
693
+ #
694
+ # This is part of a DSL, for this reason when this method is called with
695
+ # an argument, it will set the corresponding instance variable. When
696
+ # called without, it will return the already set value, or the default.
697
+ #
698
+ # @overload body_parsers(parsers)
699
+ # Specify a set of body parsers.
700
+ # @param parsers [Array] the body parser definitions
701
+ #
702
+ # @overload body_parsers
703
+ # Gets the value
704
+ # @return [Array] the set of parsers
705
+ #
706
+ # @since 0.2.0
707
+ #
708
+ # @example Getting the value
709
+ # require 'lotus'
710
+ #
711
+ # module Bookshelf
712
+ # class Application < Lotus::Application
713
+ # end
714
+ # end
715
+ #
716
+ # Bookshelf::Application.configuration.body_parsers
717
+ # # => []
718
+ #
719
+ # @example Setting the value
720
+ # require 'lotus'
721
+ #
722
+ # module Bookshelf
723
+ # class Application < Lotus::Application
724
+ # configure do
725
+ # body_parsers :json, XmlParser.new
726
+ # end
727
+ # end
728
+ # end
729
+ #
730
+ # Bookshelf::Application.configuration.body_parsers
731
+ # # => [:json, XmlParser.new]
732
+ #
733
+ # @example Setting a new value after one is set.
734
+ # require 'lotus'
735
+ #
736
+ # module Bookshelf
737
+ # class Application < Lotus::Application
738
+ # configure do
739
+ # body_parsers :json
740
+ # body_parsers XmlParser.new
741
+ # end
742
+ # end
743
+ # end
744
+ #
745
+ # Bookshelf::Application.configuration.body_parsers
746
+ # # => [XmlParser.new]
747
+ #
748
+ def body_parsers(*parsers)
749
+ if parsers.empty?
750
+ @body_parsers ||= []
751
+ else
752
+ @body_parsers = parsers
753
+ end
754
+ end
755
+
756
+ # Application middleware.
757
+ #
758
+ # Specify middleware that your application will use. This method will return
759
+ # the application's underlying Middleware stack which you can use to add new
760
+ # middleware for your application to use. By default, the middleware stack
761
+ # will contain only `Rack::Static` and `Rack::MethodOverride`. However, if
762
+ # `assets false` was specified # in the configuration block, the default
763
+ # `Rack::Static` will be removed.
764
+ #
765
+ # @since 0.2.0
766
+ #
767
+ # @see http://rdoc.info/gems/rack/Rack/Static
768
+ # @see Lotus::Middleware#use
769
+ #
770
+ # @example
771
+ # require 'lotus'
772
+ #
773
+ # module Bookshelf
774
+ # class Application < Lotus::Application
775
+ # configure do
776
+ # middleware.use Rack::MethodOverride, nil, 'max-age=0, private, must-revalidate'
777
+ # middleware.use Rack::ETag
778
+ # end
779
+ # end
780
+ # end
781
+ def middleware
782
+ @middleware ||= Lotus::Middleware.new(self)
783
+ end
784
+
785
+ # Application collection mapping.
786
+ #
787
+ # Specify a set of collections for the application, by passing a block, or a
788
+ # relative path where to find the file that describes them.
789
+ #
790
+ # By default it's `nil`.
791
+ #
792
+ # This is part of a DSL, for this reason when this method is called with
793
+ # an argument, it will set the corresponding instance variable. When
794
+ # called without, it will return the already set value, or the default.
795
+ #
796
+ # @overload mapping(blk)
797
+ # Specify a set of mapping in the given block
798
+ # @param blk [Proc] the mapping definitions
799
+ #
800
+ # @overload mapping(path)
801
+ # Specify a relative path where to find the mapping file
802
+ # @param path [String] the relative path
803
+ #
804
+ # @overload mapping
805
+ # Gets the value
806
+ # @return [Lotus::Config::Mapping] the set of mappings
807
+ #
808
+ # @since 0.2.0
809
+ #
810
+ # @see http://rdoc.info/gems/lotus-model/Lotus/Mapper
811
+ #
812
+ # @example Getting the value
813
+ # require 'lotus'
814
+ #
815
+ # module Bookshelf
816
+ # class Application < Lotus::Application
817
+ # end
818
+ # end
819
+ #
820
+ # Bookshelf::Application.configuration.mapping
821
+ # # => nil
822
+ #
823
+ # @example Setting the value, by passing a block
824
+ # require 'lotus'
825
+ #
826
+ # module Bookshelf
827
+ # class Application < Lotus::Application
828
+ # configure do
829
+ # mapping do
830
+ # collection :users do
831
+ # entity User
832
+ #
833
+ # attribute :id, Integer
834
+ # attribute :name, String
835
+ # end
836
+ # end
837
+ # end
838
+ # end
839
+ # end
840
+ #
841
+ # Bookshelf::Application.configuration.mapping
842
+ # # => #<Lotus::Config::Mapping:0x007ff50a991388 @blk=#<Proc:0x007ff123991338@(irb):4>, @path=#<Pathname:.>>
843
+ #
844
+ # @example Setting the value, by passing a relative path
845
+ # require 'lotus'
846
+ #
847
+ # module Bookshelf
848
+ # class Application < Lotus::Application
849
+ # configure do
850
+ # mapping 'config/mapping'
851
+ # end
852
+ # end
853
+ # end
854
+ #
855
+ # Bookshelf::Application.configuration.mapping
856
+ # # => #<Lotus::Config::Routes:0x007ff50a991388 @blk=nil, @path=#<Pathname:config/mapping.rb>>
478
857
  def mapping(path = nil, &blk)
479
858
  if path or block_given?
480
859
  @mapping = Config::Mapping.new(root, path, &blk)
@@ -483,11 +862,56 @@ module Lotus
483
862
  end
484
863
  end
485
864
 
865
+ # Adapter configuration.
866
+ # The application will instantiate adapter instance based on this configuration.
867
+ #
868
+ # The given options must have key pairs :type and :uri
869
+ # If it isn't, at the runtime the framework will raise a
870
+ # `ArgumentError`.
871
+ #
872
+ # This is part of a DSL, for this reason when this method is called with
873
+ # an argument, it will set the corresponding instance variable. When
874
+ # called without, it will return the already set value, or the default.
875
+ #
876
+ # @overload adapter(options)
877
+ # Sets the given type and uri
878
+ # @param options [Hash] a set of options for adapter
879
+ #
880
+ # @overload adapter
881
+ # Gets the value
882
+ # @return [Hash] adapter options
883
+ #
884
+ # @since 0.2.0
885
+ #
886
+ # @see Lotus::Configuration#adapter
887
+ # @see http://rdoc.info/gems/lotus-model/Lotus/Model/Configuration:adapter
888
+ #
889
+ # @example
890
+ # require 'lotus'
891
+ #
892
+ # module Bookshelf
893
+ # class Application < Lotus::Application
894
+ # configure do
895
+ # adapter type: :sql, uri: 'sqlite3://uri'
896
+ # end
897
+ # end
898
+ # end
899
+ #
900
+ # Bookshelf::Application.configuration.adapter
901
+ # # => {type: :sql, uri: 'sqlite3://uri'}
902
+ def adapter(options = {})
903
+ if !options.empty?
904
+ @adapter = options
905
+ else
906
+ @adapter
907
+ end
908
+ end
909
+
486
910
  # Set a format as default fallback for all the requests without a strict
487
911
  # requirement for the mime type.
488
912
  #
489
913
  # The given format must be coercible to a symbol, and be a valid mime type
490
- # alias. If it isn't, at the runtime the framework will raise a
914
+ # alias. If it isn't, at the runtime the framework will raise a
491
915
  # `Lotus::Controller::UnknownFormatError`.
492
916
  #
493
917
  # By default this value is `:html`.
@@ -590,6 +1014,17 @@ module Lotus
590
1014
  end
591
1015
  end
592
1016
 
1017
+ # Check if the application uses SSL
1018
+ #
1019
+ # @return [FalseClass,TrueClass] the result of the check
1020
+ #
1021
+ # @since 0.2.0
1022
+ #
1023
+ # @see Lotus::Configuration#scheme
1024
+ def ssl?
1025
+ scheme == SSL_SCHEME
1026
+ end
1027
+
593
1028
  # The URI host for this application.
594
1029
  # This is used by the router helpers to generate absolute URLs.
595
1030
  #
@@ -637,18 +1072,14 @@ module Lotus
637
1072
  if value
638
1073
  @host = value
639
1074
  else
640
- @host ||= 'localhost'
1075
+ @host ||= @env.host
641
1076
  end
642
1077
  end
643
1078
 
644
1079
  # The URI port for this application.
645
1080
  # This is used by the router helpers to generate absolute URLs.
646
1081
  #
647
- # By default this value is `80`, if `scheme` is `"http"`, or `443` if
648
- # `scheme` is `"https"`.
649
- #
650
- # This is optional, you should set this value only if your application
651
- # listens on a port not listed above.
1082
+ # By default this value is `2300`.
652
1083
  #
653
1084
  # This is part of a DSL, for this reason when this method is called with
654
1085
  # an argument, it will set the corresponding instance variable. When
@@ -675,7 +1106,7 @@ module Lotus
675
1106
  # end
676
1107
  # end
677
1108
  #
678
- # Bookshelf::Application.configuration.port # => 80
1109
+ # Bookshelf::Application.configuration.port # => 2300
679
1110
  #
680
1111
  # @example Setting the value
681
1112
  # require 'lotus'
@@ -683,21 +1114,17 @@ module Lotus
683
1114
  # module Bookshelf
684
1115
  # class Application < Lotus::Application
685
1116
  # configure do
686
- # port 2323
1117
+ # port 8080
687
1118
  # end
688
1119
  # end
689
1120
  # end
690
1121
  #
691
- # Bookshelf::Application.configuration.port # => 2323
1122
+ # Bookshelf::Application.configuration.port # => 8080
692
1123
  def port(value = nil)
693
1124
  if value
694
1125
  @port = Integer(value)
695
1126
  else
696
- @port ||
697
- case scheme
698
- when 'http' then 80
699
- when 'https' then 443
700
- end
1127
+ @port || @env.port
701
1128
  end
702
1129
  end
703
1130
 
@@ -957,5 +1384,236 @@ module Lotus
957
1384
  @view_pattern ||= 'Views::%{controller}::%{action}'
958
1385
  end
959
1386
  end
1387
+
1388
+ # Decide if handle exceptions with an HTTP status or let them uncaught
1389
+ #
1390
+ # If this value is set to `true`, the configured exceptions will return
1391
+ # the specified HTTP status, the rest of them with `500`.
1392
+ #
1393
+ # If this value is set to `false`, the exceptions won't be caught.
1394
+ #
1395
+ # This is part of a DSL, for this reason when this method is called with
1396
+ # an argument, it will set the corresponding instance variable. When
1397
+ # called without, it will return the already set value, or the default.
1398
+ #
1399
+ # @overload handle_exceptions(value)
1400
+ # Sets the given value
1401
+ # @param value [TrueClass, FalseClass] true or false, default to true
1402
+ #
1403
+ # @overload handle_exceptions
1404
+ # Gets the value
1405
+ # @return [TrueClass, FalseClass]
1406
+ #
1407
+ # @since 0.2.0
1408
+ #
1409
+ # @see http://rdoc.info/gems/lotus-controller/Lotus/Controller/Configuration:handle_exceptions
1410
+ # @see http://httpstatus.es/500
1411
+ #
1412
+ # @example Enabled (default)
1413
+ # require 'lotus'
1414
+ #
1415
+ # module Bookshelf
1416
+ # class Application < Lotus::Application
1417
+ # configure do
1418
+ # routes do
1419
+ # get '/error', to: 'error#index'
1420
+ # end
1421
+ # end
1422
+ #
1423
+ # load!
1424
+ # end
1425
+ #
1426
+ # module Controllers::Error
1427
+ # include Bookshelf::Controller
1428
+ #
1429
+ # action 'Index' do
1430
+ # def call(params)
1431
+ # raise ArgumentError
1432
+ # end
1433
+ # end
1434
+ # end
1435
+ # end
1436
+ #
1437
+ # # GET '/error' # => 500 - Internal Server Error
1438
+ #
1439
+ # @example Disabled
1440
+ # require 'lotus'
1441
+ #
1442
+ # module Bookshelf
1443
+ # class Application < Lotus::Application
1444
+ # configure do
1445
+ # handle_exceptions false
1446
+ #
1447
+ # routes do
1448
+ # get '/error', to: 'error#index'
1449
+ # end
1450
+ # end
1451
+ #
1452
+ # load!
1453
+ # end
1454
+ #
1455
+ # module Controllers::Error
1456
+ # include Bookshelf::Controller
1457
+ #
1458
+ # action 'Index' do
1459
+ # def call(params)
1460
+ # raise ArgumentError
1461
+ # end
1462
+ # end
1463
+ # end
1464
+ # end
1465
+ #
1466
+ # # GET '/error' # => raises ArgumentError
1467
+ def handle_exceptions(value = nil)
1468
+ if value.nil?
1469
+ @handle_exceptions
1470
+ else
1471
+ @handle_exceptions = value
1472
+ end
1473
+ end
1474
+
1475
+ # It lazily collects all the low level settings for Lotus::Model's
1476
+ # configuration and applies them when the application is loaded.
1477
+ #
1478
+ # NOTE: This forwards all the configurations to Lotus::Model, without
1479
+ # checking them. Before to use this feature, please have a look at the
1480
+ # current Lotus::Model version installed.
1481
+ #
1482
+ # NOTE: This may override some configurations of your application.
1483
+ #
1484
+ # @return [Lotus::Config::FrameworkConfiguration] the configuration
1485
+ #
1486
+ # @since 0.2.0
1487
+ #
1488
+ # @see http://www.rubydoc.info/gems/lotus-model/Lotus/Model/Configuration
1489
+ #
1490
+ # @example Define a setting
1491
+ # require 'lotus'
1492
+ # require 'lotus/model'
1493
+ #
1494
+ # module Bookshelf
1495
+ # class Application < Lotus::Application
1496
+ # configure do
1497
+ # model.adapter type: :memory, uri: 'memory://localhost/database'
1498
+ # end
1499
+ # end
1500
+ # end
1501
+ #
1502
+ # @example Override a setting
1503
+ # require 'lotus'
1504
+ # require 'lotus/model'
1505
+ #
1506
+ # module Bookshelf
1507
+ # class Application < Lotus::Application
1508
+ # configure do
1509
+ # adapter type: :sql, uri: 'postgres://localhost/database'
1510
+ # model.adapter type: :memory, uri: 'memory://localhost/database'
1511
+ # end
1512
+ # end
1513
+ # end
1514
+ #
1515
+ # # The memory adapter will override the SQL one
1516
+ def model
1517
+ @model ||= Config::FrameworkConfiguration.new
1518
+ end
1519
+
1520
+ # It lazily collects all the low level settings for Lotus::Controller's
1521
+ # configuration and applies them when the application is loaded.
1522
+ #
1523
+ # NOTE: This forwards all the configurations to Lotus::Controller, without
1524
+ # checking them. Before to use this feature, please have a look at the
1525
+ # current Lotus::Controller version installed.
1526
+ #
1527
+ # NOTE: This may override some configurations of your application.
1528
+ #
1529
+ # @return [Lotus::Config::FrameworkConfiguration] the configuration
1530
+ #
1531
+ # @since 0.2.0
1532
+ #
1533
+ # @see http://www.rubydoc.info/gems/lotus-controller/Lotus/Controller/Configuration
1534
+ #
1535
+ # @example Define a setting
1536
+ # require 'lotus'
1537
+ #
1538
+ # module Bookshelf
1539
+ # class Application < Lotus::Application
1540
+ # configure do
1541
+ # controller.default_format :json
1542
+ # end
1543
+ # end
1544
+ # end
1545
+ #
1546
+ # @example Override a setting
1547
+ # require 'lotus'
1548
+ #
1549
+ # module Bookshelf
1550
+ # class Application < Lotus::Application
1551
+ # configure do
1552
+ # handle_exceptions false
1553
+ # controller.handle_exceptions true
1554
+ # end
1555
+ # end
1556
+ # end
1557
+ #
1558
+ # # Exceptions will be handled
1559
+ def controller
1560
+ @controller ||= Config::FrameworkConfiguration.new
1561
+ end
1562
+
1563
+ # It lazily collects all the low level settings for Lotus::View's
1564
+ # configuration and applies them when the application is loaded.
1565
+ #
1566
+ # NOTE: This forwards all the configurations to Lotus::View, without
1567
+ # checking them. Before to use this feature, please have a look at the
1568
+ # current Lotus::View version installed.
1569
+ #
1570
+ # NOTE: This may override some configurations of your application.
1571
+ #
1572
+ # @return [Lotus::Config::FrameworkConfiguration] the configuration
1573
+ #
1574
+ # @since 0.2.0
1575
+ #
1576
+ # @see http://www.rubydoc.info/gems/lotus-view/Lotus/View/Configuration
1577
+ #
1578
+ # @example Define a setting
1579
+ # require 'lotus'
1580
+ #
1581
+ # module Bookshelf
1582
+ # class Application < Lotus::Application
1583
+ # configure do
1584
+ # view.layout :application
1585
+ # end
1586
+ # end
1587
+ # end
1588
+ #
1589
+ # @example Override a setting
1590
+ # require 'lotus'
1591
+ #
1592
+ # module Bookshelf
1593
+ # class Application < Lotus::Application
1594
+ # configure do
1595
+ # layout :application
1596
+ # view.layout :backend
1597
+ # end
1598
+ # end
1599
+ # end
1600
+ #
1601
+ # # It will use `:backend` layout
1602
+ def view
1603
+ @view ||= Config::FrameworkConfiguration.new
1604
+ end
1605
+
1606
+ private
1607
+ # @since 0.2.0
1608
+ # @api private
1609
+ def evaluate_configurations!
1610
+ configurations.each { |c| instance_eval(&c) }
1611
+ end
1612
+
1613
+ # @since 0.2.0
1614
+ # @api private
1615
+ def configurations
1616
+ [ @blk ] + @configurations[@env.environment]
1617
+ end
960
1618
  end
961
1619
  end