lotusrb 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/FEATURES.md +7 -0
  4. data/README.md +2 -1
  5. data/lib/lotus/cli.rb +2 -1
  6. data/lib/lotus/commands/generate.rb +4 -0
  7. data/lib/lotus/config/assets.rb +46 -8
  8. data/lib/lotus/configuration.rb +119 -11
  9. data/lib/lotus/environment.rb +1 -1
  10. data/lib/lotus/frameworks.rb +2 -0
  11. data/lib/lotus/generators/action.rb +22 -1
  12. data/lib/lotus/generators/action/action_spec.rspec.tt +2 -3
  13. data/lib/lotus/generators/action/view_spec.rspec.tt +2 -3
  14. data/lib/lotus/generators/application/app.rb +22 -79
  15. data/lib/lotus/generators/application/app/Gemfile.tt +1 -0
  16. data/lib/lotus/generators/application/app/config/application.rb.tt +8 -3
  17. data/lib/lotus/generators/application/app/lib/app_name.rb.tt +12 -0
  18. data/lib/lotus/generators/application/container.rb +18 -84
  19. data/lib/lotus/generators/application/container/Gemfile.tt +3 -2
  20. data/lib/lotus/generators/application/container/lib/app_name.rb.tt +12 -0
  21. data/lib/lotus/generators/database_config.rb +86 -0
  22. data/lib/lotus/generators/mailer.rb +112 -0
  23. data/lib/lotus/generators/mailer/mailer.rb.tt +7 -0
  24. data/lib/lotus/generators/mailer/mailer_spec.rb.tt +7 -0
  25. data/lib/lotus/generators/mailer/template.html.tt +0 -0
  26. data/lib/lotus/generators/mailer/template.txt.tt +0 -0
  27. data/lib/lotus/generators/model/entity_spec.rspec.tt +0 -2
  28. data/lib/lotus/generators/model/repository_spec.rspec.tt +0 -2
  29. data/lib/lotus/generators/slice/application.rb.tt +8 -3
  30. data/lib/lotus/generators/slice/templates/application.html.erb.tt +1 -1
  31. data/lib/lotus/loader.rb +10 -3
  32. data/lib/lotus/mailer/glue.rb +68 -0
  33. data/lib/lotus/middleware.rb +3 -3
  34. data/lib/lotus/version.rb +1 -1
  35. data/lotusrb.gemspec +6 -5
  36. metadata +38 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 935451417df1119d39a85bc9f5a4ab0b254f5f4a
4
- data.tar.gz: 35a84423b6d404016700fb068965dcc1649742db
3
+ metadata.gz: b7c8e5cd99a779eb8d3a481262d6af49538a457e
4
+ data.tar.gz: 5ea631568ee7e5fc205204e97c7d5daecaa8be5d
5
5
  SHA512:
6
- metadata.gz: 804e4de1c16d7840bcf859608af64eeb68687ccc0dc64f10de35b06bf8660d9c74e6bdaebca9636ec0ecadafc928252a5d989a89548b20e5ff1cacb66da325b0
7
- data.tar.gz: e2ba8789564318ad4d99d489eeed5d42b8484cf21a7124140f6bcfa57d65442ce401217e6ae68a27a425bf0db7c20d2d914c53869fad85b28803e62f0e639035
6
+ metadata.gz: ed2204a15910591470fbb00e31331180a2192bbf0b9b4871a6b7fb5c2cdd9a043e53ecbb2193e32531f27ed5b14229118af90a7d441a69679cb156f6a5f2b0ab
7
+ data.tar.gz: e89361b9895b13d112f743e11ee83889be44561a6159429a24b9eb85c0297c20e9f8ed6e1ea386249776f094a6373417df5d7350e67351650a65f52022794523
data/CHANGELOG.md CHANGED
@@ -1,6 +1,24 @@
1
1
  # Lotus
2
2
  A complete web framework for Ruby
3
3
 
4
+ ## v0.5.0 - 2015-09-30
5
+ ### Added
6
+ - [Ines Coelho & Rosa Faria] Mailers
7
+ - [Theo Felippe] Added configuration entries: `#default_request_format` and `default_response_format`
8
+ - [Rodrigo Panachi] Introduced `logger` configuration for applications, to be used like this: `Web::Logger.debug`
9
+ - [Ben Lovell] Simpler and less verbose RSpec tests
10
+ - [Pascal Betz] Introduced `--method` CLI argument for action generator as a way to specify the HTTP verb
11
+
12
+ ### Fixed
13
+ - [Luca Guidi] Handle conflicts between directories with the same name while serving static assets
14
+ - [Derk-Jan Karrenbeld] Include default value `font-src: self` for CSP HTTP header
15
+ - [Cam Huynh] Make CLI arguments immutable for `Lotus::Environment`
16
+ - [Andrii Ponomarov] Disable welcome page in test environment
17
+ - [Alfonso Uceda Pompa] Print error message and exit when no name is provided to model generator
18
+
19
+ ### Changed
20
+ - [Theo Felippe] Deprecated `#default_format` in favor of: `#default_request_format`
21
+
4
22
  ## v0.4.1 - 2015-07-10
5
23
  ### Added
6
24
  - [Trung Lê] Alias `--database` as `--db` for `lotus new`
data/FEATURES.md CHANGED
@@ -3,6 +3,13 @@
3
3
 
4
4
  ## Features
5
5
 
6
+ ## v0.5.0 - 2015-09-30
7
+
8
+ - Mailers
9
+ - CLI: `lotus generate mailer`
10
+ - SQL joins
11
+ - Custom coercers for data mapper
12
+
6
13
  ## v0.4.1 - 2015-07-10
7
14
 
8
15
  ## v0.4.0 - 2015-06-23
data/README.md CHANGED
@@ -8,8 +8,9 @@ Lotus combines small yet powerful frameworks:
8
8
 
9
9
  * [**Lotus::Utils**](https://github.com/lotus/utils) - Ruby core extensions and class utilities
10
10
  * [**Lotus::Router**](https://github.com/lotus/router) - Rack compatible HTTP router for Ruby
11
- * [**Lotus::Validations**](https://github.com/lotus/validations) - Validation mixin for Ruby objects
11
+ * [**Lotus::Validations**](https://github.com/lotus/validations) - Validations mixin for Ruby objects
12
12
  * [**Lotus::Helpers**](https://github.com/lotus/helpers) - View helpers for Ruby applications
13
+ * [**Lotus::Mailer**](https://github.com/lotus/mailer) - Mail for Ruby applications
13
14
  * [**Lotus::Model**](https://github.com/lotus/model) - Persistence with entities, repositories and data mapper
14
15
  * [**Lotus::View**](https://github.com/lotus/view) - Presentation with a separation between views and templates
15
16
  * [**Lotus::Controller**](https://github.com/lotus/controller) - Full featured, fast and testable actions for Rack
data/lib/lotus/cli.rb CHANGED
@@ -79,10 +79,11 @@ module Lotus
79
79
  end
80
80
  end
81
81
 
82
- desc 'generate', 'generates app, action, model or migration'
82
+ desc 'generate', 'generates app, action, model, mailer or migration'
83
83
  method_option :application_base_url, desc: 'application base url', type: :string
84
84
  method_option :path, desc: 'applications path', type: :string
85
85
  method_option :url, desc: 'relative URL for action', type: :string
86
+ method_option :method, desc: "HTTP method for action. Upper/lower case is ignored. Must be one of GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, TRACE.", type: :string, default: 'GET'
86
87
  method_option :skip_view, desc: 'skip the creation of view and templates (only for action)', type: :boolean, default: false
87
88
  method_option :help, aliases: '-h', desc: 'displays the usage method'
88
89
 
@@ -70,6 +70,10 @@ module Lotus
70
70
  .join(::File::SEPARATOR))
71
71
  end
72
72
 
73
+ # @since 0.5.0
74
+ # @api private
75
+ alias_method :core_root, :model_root
76
+
73
77
  private
74
78
  # @since 0.3.0
75
79
  # @api private
@@ -7,23 +7,60 @@ module Lotus
7
7
  class Assets < Utils::LoadPaths
8
8
  DEFAULT_DIRECTORY = 'public'.freeze
9
9
 
10
+ # Assets source (directory)
11
+ #
12
+ # @since 0.5.0
13
+ # @api private
14
+ class Source
15
+ # @since 0.5.0
16
+ # @api private
17
+ BLANK = ''.freeze
18
+
19
+ # @since 0.5.0
20
+ # @api private
21
+ URL_SEPARATOR = '/'.freeze
22
+
23
+ # @since 0.5.0
24
+ # @api private
25
+ attr_reader :urls
26
+
27
+ # @since 0.5.0
28
+ # @api private
29
+ attr_reader :root
30
+
31
+ # @since 0.5.0
32
+ # @api private
33
+ def initialize(path)
34
+ @path = path.to_s
35
+ @root = @path.sub("#{ Lotus.root }/", BLANK)
36
+ @urls = {}
37
+
38
+ Dir.glob("#{ path }/**/*").each do |file|
39
+ next if ::File.directory?(file)
40
+
41
+ @urls.store(
42
+ file.sub(@path, BLANK).sub(::File::SEPARATOR, URL_SEPARATOR),
43
+ file.sub("#{ @path }/", BLANK)
44
+ )
45
+ end
46
+
47
+ @urls.freeze
48
+ end
49
+ end
50
+
10
51
  # @since 0.1.0
11
52
  # @api private
12
53
  def initialize(root)
13
- @root = root
54
+ @root = root
14
55
  @paths = Array(DEFAULT_DIRECTORY)
15
56
  end
16
57
 
17
- # @since 0.1.0
58
+ # @since 0.5.0
18
59
  # @api private
19
- def entries
20
- hash = Hash.new { |k, v| k[v] = [] }
60
+ def for_each_source
21
61
  each do |path|
22
- if path.exist?
23
- hash[path.to_s] = path.children.map { |child| "/#{ child.basename }" }
24
- end
62
+ yield Source.new(path) if path.exist?
25
63
  end
26
- hash
27
64
  end
28
65
 
29
66
  # @since 0.2.0
@@ -41,3 +78,4 @@ module Lotus
41
78
  end
42
79
  end
43
80
  end
81
+
@@ -1,4 +1,5 @@
1
1
  require 'lotus/utils/kernel'
2
+ require 'lotus/utils/deprecation'
2
3
  require 'lotus/environment'
3
4
  require 'lotus/config/framework_configuration'
4
5
  require 'lotus/config/load_paths'
@@ -958,18 +959,18 @@ module Lotus
958
959
  # an argument, it will set the corresponding instance variable. When
959
960
  # called without, it will return the already set value, or the default.
960
961
  #
961
- # @overload default_format(format)
962
+ # @overload default_request_format(format)
962
963
  # Sets the given value
963
964
  # @param format [#to_sym] the symbol format
964
965
  # @raise [TypeError] if it cannot be coerced to a symbol
965
966
  #
966
- # @overload default_format
967
+ # @overload default_request_format
967
968
  # Gets the value
968
969
  # @return [Symbol]
969
970
  #
970
- # @since 0.1.0
971
+ # @since 0.5.0
971
972
  #
972
- # @see http://rdoc.info/gems/lotus-controller/Lotus/Controller/Configuration#default_format
973
+ # @see http://rdoc.info/gems/lotus-controller/Lotus/Controller/Configuration#default_request_format
973
974
  #
974
975
  # @example Getting the value
975
976
  # require 'lotus'
@@ -979,7 +980,7 @@ module Lotus
979
980
  # end
980
981
  # end
981
982
  #
982
- # Bookshelf::Application.configuration.default_format # => :html
983
+ # Bookshelf::Application.configuration.default_request_format # => :html
983
984
  #
984
985
  # @example Setting the value
985
986
  # require 'lotus'
@@ -987,20 +988,86 @@ module Lotus
987
988
  # module Bookshelf
988
989
  # class Application < Lotus::Application
989
990
  # configure do
990
- # default_format :json
991
+ # default_request_format :json
991
992
  # end
992
993
  # end
993
994
  # end
994
995
  #
995
- # Bookshelf::Application.configuration.default_format # => :json
996
- def default_format(format = nil)
996
+ # Bookshelf::Application.configuration.default_request_format # => :json
997
+ def default_request_format(format = nil)
997
998
  if format
998
- @default_format = Utils::Kernel.Symbol(format)
999
+ @default_request_format = Utils::Kernel.Symbol(format)
999
1000
  else
1000
- @default_format || :html
1001
+ @default_request_format || :html
1001
1002
  end
1002
1003
  end
1003
1004
 
1005
+ # Set a format to be used for all responses regardless of the request type.
1006
+ #
1007
+ # The given format must be coercible to a symbol, and be a valid mime type
1008
+ # alias. If it isn't, at the runtime the framework will raise a
1009
+ # `Lotus::Controller::UnknownFormatError`.
1010
+ #
1011
+ # By default this value is `:html`.
1012
+ #
1013
+ # This is part of a DSL, for this reason when this method is called with
1014
+ # an argument, it will set the corresponding instance variable. When
1015
+ # called without, it will return the already set value, or the default.
1016
+ #
1017
+ # @overload default_response_format(format)
1018
+ # Sets the given value
1019
+ # @param format [#to_sym] the symbol format
1020
+ # @raise [TypeError] if it cannot be coerced to a symbol
1021
+ #
1022
+ # @overload default_response_format
1023
+ # Gets the value
1024
+ # @return [Symbol,nil]
1025
+ #
1026
+ # @since 0.5.0
1027
+ #
1028
+ # @see http://rdoc.info/gems/lotus-controller/Lotus/Controller/Configuration#default_response_format
1029
+ #
1030
+ # @example Getting the value
1031
+ # require 'lotus'
1032
+ #
1033
+ # module Bookshelf
1034
+ # class Application < Lotus::Application
1035
+ # end
1036
+ # end
1037
+ #
1038
+ # Bookshelf::Application.configuration.default_response_format # => :html
1039
+ #
1040
+ # @example Setting the value
1041
+ # require 'lotus'
1042
+ #
1043
+ # module Bookshelf
1044
+ # class Application < Lotus::Application
1045
+ # configure do
1046
+ # default_response_format :json
1047
+ # end
1048
+ # end
1049
+ # end
1050
+ #
1051
+ # Bookshelf::Application.configuration.default_response_format # => :json
1052
+ def default_response_format(format = nil)
1053
+ if format
1054
+ @default_response_format = Utils::Kernel.Symbol(format)
1055
+ else
1056
+ @default_response_format
1057
+ end
1058
+ end
1059
+
1060
+ # Set a format as default fallback for all the requests without a strict
1061
+ # requirement for the mime type.
1062
+ #
1063
+ # @since 0.1.0
1064
+ #
1065
+ # @deprecated Use {#default_request_format} instead.
1066
+ def default_format(format = nil)
1067
+ Lotus::Utils::Deprecation.new('default_format is deprecated, please use default_request_format')
1068
+ default_request_format(format)
1069
+ end
1070
+
1004
1071
  # The URI scheme for this application.
1005
1072
  # This is used by the router helpers to generate absolute URLs.
1006
1073
  #
@@ -1577,7 +1644,7 @@ module Lotus
1577
1644
  # module Bookshelf
1578
1645
  # class Application < Lotus::Application
1579
1646
  # configure do
1580
- # controller.default_format :json
1647
+ # controller.default_request_format :json
1581
1648
  # end
1582
1649
  # end
1583
1650
  # end
@@ -1642,6 +1709,46 @@ module Lotus
1642
1709
  @view ||= Config::FrameworkConfiguration.new
1643
1710
  end
1644
1711
 
1712
+ # Defines a logger instance to the configuration
1713
+ #
1714
+ # This logger instance will be used to set the logger available on application module
1715
+ #
1716
+ # If no logger instance is defined, a Lotus::Logger will be set by default
1717
+ #
1718
+ # @return [Logger, NilClass] logger instance
1719
+ #
1720
+ # @since 0.5.0
1721
+ #
1722
+ # @example Define a logger
1723
+ # require 'lotus'
1724
+ #
1725
+ # module Bookshelf
1726
+ # class Application < Lotus::Application
1727
+ # configure do
1728
+ # logger Logger.new(STDOUT)
1729
+ # end
1730
+ # load!
1731
+ # end
1732
+ #
1733
+ # module Controllers::Error
1734
+ # include Bookshelf::Controller
1735
+ #
1736
+ # action 'Index' do
1737
+ # def call(params)
1738
+ # Bookshelf::Logger.info "Logging to STDOUT"
1739
+ # end
1740
+ # end
1741
+ # end
1742
+ # end
1743
+ #
1744
+ def logger(value = nil)
1745
+ if value.nil?
1746
+ @logger
1747
+ else
1748
+ @logger = value
1749
+ end
1750
+ end
1751
+
1645
1752
  # This options is used as a bridge between container and router application.
1646
1753
  #
1647
1754
  # @return [String, NilClass] path prefix for routes
@@ -1657,6 +1764,7 @@ module Lotus
1657
1764
  end
1658
1765
 
1659
1766
  private
1767
+
1660
1768
  # @since 0.2.0
1661
1769
  # @api private
1662
1770
  def evaluate_configurations!
@@ -174,7 +174,7 @@ module Lotus
174
174
  # # other settings (eg `XYZ`) will be left untouched.
175
175
  def initialize(options = {})
176
176
  @options = Lotus::Lotusrc.new(root, options).read
177
- @options.merge! Utils::Hash.new(options).symbolize!
177
+ @options.merge! Utils::Hash.new(options.clone).symbolize!
178
178
  @mutex = Mutex.new
179
179
  @mutex.synchronize { set_env_vars! }
180
180
  end
@@ -3,6 +3,8 @@ require 'lotus/view'
3
3
  require 'lotus/controller'
4
4
  require 'lotus/action/glue'
5
5
  require 'lotus/action/csrf_protection'
6
+ require 'lotus/mailer'
7
+ require 'lotus/mailer/glue'
6
8
 
7
9
  Lotus::Controller.configure do
8
10
  prepare do
@@ -1,5 +1,6 @@
1
1
  require 'lotus/generators/abstract'
2
2
  require 'lotus/utils/string'
3
+ require 'lotus/routing/route'
3
4
 
4
5
  module Lotus
5
6
  module Generators
@@ -30,6 +31,11 @@ module Lotus
30
31
  # @api private
31
32
  DEFAULT_TEMPLATE = 'erb'.freeze
32
33
 
34
+ # Default HTTP method used when generating an action.
35
+ # @since 0.5.0
36
+ # @api private
37
+ DEFAULT_HTTP_METHOD = 'GET'.freeze
38
+
33
39
  # @since 0.3.0
34
40
  # @api private
35
41
  def initialize(command)
@@ -48,6 +54,7 @@ module Lotus
48
54
  def start
49
55
  assert_existing_app!
50
56
  assert_action!
57
+ assert_http_method!
51
58
 
52
59
  opts = {
53
60
  app: app,
@@ -108,6 +115,14 @@ module Lotus
108
115
  end
109
116
  end
110
117
 
118
+ # @since 0.5.0
119
+ # @api private
120
+ def assert_http_method!
121
+ if !Lotus::Routing::Route::VALID_HTTP_VERBS.include?(_http_method.upcase)
122
+ raise Lotus::Commands::Generate::Error.new("Unknown HTTP method '#{_http_method}', please use one of #{Lotus::Routing::Route::VALID_HTTP_VERBS.join(', ')}.")
123
+ end
124
+ end
125
+
111
126
  def app
112
127
  if env.container?
113
128
  super
@@ -127,10 +142,16 @@ module Lotus
127
142
 
128
143
  # Insert at the top of the file
129
144
  cli.insert_into_file _routes_path, before: /\A(.*)/ do
130
- "get '#{ _route_url }', to: '#{ _route_endpoint }'\n"
145
+ "#{ _http_method } '#{ _route_url }', to: '#{ _route_endpoint }'\n"
131
146
  end
132
147
  end
133
148
 
149
+ # @since 0.5.0
150
+ # @api private
151
+ def _http_method
152
+ options.fetch(:method, DEFAULT_HTTP_METHOD).downcase
153
+ end
154
+
134
155
  # @since 0.4.0
135
156
  # @api private
136
157
  def _route_url
@@ -1,11 +1,10 @@
1
- require 'spec_helper'
2
1
  require_relative '<%= config[:relative_action_path] %>'
3
2
 
4
3
  describe <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %> do
5
- let(:action) { <%= config[:app] %>::Controllers::<%= config[:controller] %>::<%= config[:action] %>.new }
4
+ let(:action) { described_class.new }
6
5
  let(:params) { Hash[] }
7
6
 
8
- it "is successful" do
7
+ it 'is successful' do
9
8
  response = action.call(params)
10
9
  expect(response[0]).to eq 200
11
10
  end