roda 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +34 -0
  3. data/README.rdoc +18 -13
  4. data/Rakefile +8 -0
  5. data/doc/conventions.rdoc +163 -0
  6. data/doc/release_notes/1.1.0.txt +226 -0
  7. data/lib/roda.rb +51 -22
  8. data/lib/roda/plugins/assets.rb +613 -0
  9. data/lib/roda/plugins/caching.rb +215 -0
  10. data/lib/roda/plugins/chunked.rb +278 -0
  11. data/lib/roda/plugins/error_email.rb +112 -0
  12. data/lib/roda/plugins/flash.rb +3 -3
  13. data/lib/roda/plugins/hooks.rb +1 -1
  14. data/lib/roda/plugins/indifferent_params.rb +3 -3
  15. data/lib/roda/plugins/middleware.rb +3 -8
  16. data/lib/roda/plugins/multi_route.rb +110 -18
  17. data/lib/roda/plugins/not_allowed.rb +3 -3
  18. data/lib/roda/plugins/path.rb +38 -0
  19. data/lib/roda/plugins/render.rb +18 -16
  20. data/lib/roda/plugins/render_each.rb +0 -2
  21. data/lib/roda/plugins/streaming.rb +1 -2
  22. data/lib/roda/plugins/view_subdirs.rb +7 -1
  23. data/lib/roda/version.rb +1 -1
  24. data/spec/assets/css/app.scss +1 -0
  25. data/spec/assets/css/no_access.css +1 -0
  26. data/spec/assets/css/raw.css +1 -0
  27. data/spec/assets/js/head/app.js +1 -0
  28. data/spec/integration_spec.rb +95 -3
  29. data/spec/matchers_spec.rb +2 -2
  30. data/spec/plugin/assets_spec.rb +413 -0
  31. data/spec/plugin/caching_spec.rb +335 -0
  32. data/spec/plugin/chunked_spec.rb +182 -0
  33. data/spec/plugin/default_headers_spec.rb +6 -5
  34. data/spec/plugin/error_email_spec.rb +76 -0
  35. data/spec/plugin/multi_route_spec.rb +120 -0
  36. data/spec/plugin/not_allowed_spec.rb +14 -3
  37. data/spec/plugin/path_spec.rb +29 -0
  38. data/spec/plugin/render_each_spec.rb +6 -1
  39. data/spec/plugin/symbol_matchers_spec.rb +7 -2
  40. data/spec/request_spec.rb +10 -0
  41. data/spec/response_spec.rb +47 -0
  42. data/spec/views/about.erb +1 -0
  43. data/spec/views/about.str +1 -0
  44. data/spec/views/content-yield.erb +1 -0
  45. data/spec/views/home.erb +2 -0
  46. data/spec/views/home.str +2 -0
  47. data/spec/views/layout-alternative.erb +2 -0
  48. data/spec/views/layout-yield.erb +3 -0
  49. data/spec/views/layout.erb +2 -0
  50. data/spec/views/layout.str +2 -0
  51. metadata +57 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ee4a240b4a2d17e55d10cc84f60b28ffd8fcf76
4
- data.tar.gz: 50af03ce96aadac19fa0e9c81e0cb0ea86e90461
3
+ metadata.gz: 75b82517a1e80d73d99ea7d25a8bd543ba958e7c
4
+ data.tar.gz: 4bcb31a61b7f2658092fe80fb339a8651b718edd
5
5
  SHA512:
6
- metadata.gz: 6f3d44551360e5c38fbbe07826793a7fe986bb6c017bb9136e9494c7a8ec15741b74693f725be32cee455e4d10b6bf4083d44f32e8427b9b76296b5d4dc61090
7
- data.tar.gz: db885f610de332b033bb565eadc86239c842e28e49d352cbb45513fed0404b934320ab9b1f9a09b30844e84f08a759cc931dde9ddbba55c1e4b46327f5b4c925
6
+ metadata.gz: a8d8776bd1e9c282dc6d5df795a790a2272103421125233ffe5f6112c77c99d00f37f364c7879b73eb03aafd2c946e45e123c0e261f3ff7f1b576936a986e1ee
7
+ data.tar.gz: f8b85158682a132cd00d2a929532bb466a15c502f94abd54afcdaad35dde2fab96a2e2ff6d5b180b62220a6e0944de5ac824c0c25285bd04a8e8d39f959ad171
data/CHANGELOG CHANGED
@@ -1,3 +1,37 @@
1
+ = 1.1.0 (2014-11-11)
2
+
3
+ * Add assets plugin, for rendering assets on the fly, or compiling them to a single compressed file (cj, jeremyevans) (#5)
4
+
5
+ * Make InstanceMethods in plugins not include constants, as they would pollute the constant namespace (jeremyevans)
6
+
7
+ * Make response.finish add the Content-Length header, not response.write (jeremyevans)
8
+
9
+ * Add response.finish_with_body to override response body used (jeremyevans)
10
+
11
+ * Use allocate instead of new in rack app (jeremyevans)
12
+
13
+ * Add chunked plugin, for easy streaming of template responses using Transfer-Encoding: chunked (jeremyevans)
14
+
15
+ * Add namespace support to the multi_route plugin, to support more complex applications (jeremyevans)
16
+
17
+ * Make r.multi_route use named route return value if not passed a block (jeremyevans)
18
+
19
+ * Make r.multi_route prefer longer route if multiple routes have the same prefix (jeremyevans)
20
+
21
+ * Add caching plugin, for handling http caching (jeremyevans)
22
+
23
+ * Support adding middleware after the route block has been added (jeremyevans)
24
+
25
+ * Allow Roda subclasses to use route block from superclass (jeremyevans)
26
+
27
+ * Have r.multi_route ignore non-String named routes (jeremyevans)
28
+
29
+ * Pick up newly added named routes while running in the multi_route plugin, useful for development (jeremyevans)
30
+
31
+ * Add path plugin, for named path support (jeremyevans) (#4)
32
+
33
+ * Add error_email plugin, for easily emailing an error notification for an exception (jeremyevans)
34
+
1
35
  = 1.0.0 (2014-08-19)
2
36
 
3
37
  * Don't have :extension hash matcher force a terminal match (jeremyevans)
data/README.rdoc CHANGED
@@ -691,17 +691,17 @@ attempt to render the template inside the default layout template, where
691
691
  end
692
692
  end
693
693
 
694
- You can override the default rendering options by passing a hash to the plugin,
695
- or modifying the +render_opts+ hash after loading the plugin:
694
+ You can override the default rendering options by passing a hash to the plugin:
696
695
 
697
696
  class App < Roda
698
- plugin :render, :escape => true # Automatically escape output in erb templates
699
- render_opts[:views] = 'admin_views' # Default views directory
700
- render_opts[:layout] = "admin_layout" # Default layout template
701
- render_opts[:layout_opts] = {:engine=>'haml'} # Default layout template options
702
- render_opts[:opts] = {:default_encoding=>'UTF-8'} # Default template options
703
- render_opts[:cache] = false # Disable template caching
704
- render_opts[:engine] = 'slim' # Tilt engine/template file extension to use
697
+ plugin :render,
698
+ :cache => false, # Disable template caching, useful in development
699
+ :engine => 'erb', # Tilt engine/template file extension to use
700
+ :escape => true, # Automatically escape output in erb templates
701
+ :layout => "admin_layout", # Default layout template
702
+ :layout_opts => {:ext=>'html.erb'}, # Default layout template options
703
+ :opts => {:default_encoding=>'UTF-8'}, # Default template options
704
+ :views => 'admin_views' # Default views directory
705
705
  end
706
706
 
707
707
  == Sessions
@@ -755,10 +755,6 @@ default, so that in your templates:
755
755
  <%= '<>' %> # outputs &lt;&gt;
756
756
  <%== '<>' %> # outputs <>
757
757
 
758
- Note that unlike most other render options, the :escape option
759
- must be passed to the <tt>plugin :render</tt> call, it won't be
760
- respected if added later.
761
-
762
758
  This support requires {Erubis}[http://www.kuwata-lab.com/erubis/].
763
759
 
764
760
  === Other
@@ -785,13 +781,21 @@ override any Roda method and call +super+ to get the default behavior.
785
781
  These plugins ship with roda:
786
782
 
787
783
  all_verbs :: Adds routing methods to the request for all http verbs.
784
+ assets :: Adds support for rendering CSS/JS javascript assets on the fly
785
+ in development, or compiling them into a single compressed file
786
+ in production.
788
787
  backtracking_array :: Allows array matchers to backtrack if later matchers
789
788
  do not match.
789
+ caching :: Adds request and response methods related to http caching.
790
+ chunked :: Adds support for streaming template responses using
791
+ Transfer-Encoding: chunked.
790
792
  content_for :: Allows storage of content in one template and retrieval of
791
793
  that content in a different template.
792
794
  csrf :: Adds CSRF protection and helper methods using
793
795
  {rack_csrf}[https://github.com/baldowl/rack_csrf].
794
796
  default_headers :: Override the default response headers used.
797
+ error_email :: Adds an +error_email+ method that can be used to email when
798
+ an exception is raised.
795
799
  error_handler :: Adds a +error+ block that is called for all responses that
796
800
  raise exceptions.
797
801
  flash :: Adds a flash handler.
@@ -815,6 +819,7 @@ not_found :: Adds a +not_found+ block that is called for all 404 responses
815
819
  without bodies.
816
820
  pass :: Adds a pass method allowing you to skip the current +r.on+ block as if
817
821
  it did not match.
822
+ path :: Adds support for named paths.
818
823
  per_thread_caching :: Switches the thread-safe cache from a shared cache to a
819
824
  per-thread cache.
820
825
  render :: Adds support for rendering templates via tilt, as described above.
data/Rakefile CHANGED
@@ -82,6 +82,14 @@ begin
82
82
  spec = lambda do |name, files, d|
83
83
  lib_dir = File.join(File.dirname(File.expand_path(__FILE__)), 'lib')
84
84
  ENV['RUBYLIB'] ? (ENV['RUBYLIB'] += ":#{lib_dir}") : (ENV['RUBYLIB'] = lib_dir)
85
+
86
+ desc "#{d} with -w, some warnings filtered"
87
+ task "#{name}_w" do
88
+ ENV['RUBYOPT'] ? (ENV['RUBYOPT'] += " -w") : (ENV['RUBYOPT'] = '-w')
89
+ rake = ENV['RAKE'] || "#{FileUtils::RUBY} -S rake"
90
+ sh "#{rake} #{name} 2>&1 | egrep -v \"(spec/.*: warning: (possibly )?useless use of == in void context|: warning: instance variable @.* not initialized|: warning: method redefined; discarding old|: warning: previous definition of)|rspec\""
91
+ end
92
+
85
93
  desc d
86
94
  spec_class.new(name) do |t|
87
95
  t.send spec_files_meth, files
@@ -0,0 +1,163 @@
1
+ = Conventions
2
+
3
+ This guide goes over conventions for directory layout and file layout for Roda applications.
4
+ You are free to ignore these conventions, but following them will make your code similar
5
+ to other Roda applications.
6
+
7
+ == Directory Layout
8
+
9
+ Which directory layout to use should reflect the size of your application.
10
+
11
+ === Small Applications
12
+
13
+ For a small application, the following directory layout is recommended:
14
+
15
+ Rakefile
16
+ app_name.rb
17
+ assets/
18
+ migrate/
19
+ models.rb
20
+ models/
21
+ public/
22
+ spec/
23
+ views/
24
+
25
+ +app_name.rb+ should contain the Roda application, and should reflect the name of your application.
26
+ So if your application is named +FooBar+, you should use +foo_bar.rb+.
27
+
28
+ +views/+ should contain your template files. This assumes you are using the +render+ plugin
29
+ and server-side rendering. If you are creating a single page application and just serving
30
+ JSON, then you won't need a +views+ directory. For small applications, all view files should
31
+ in the +views+ directory.
32
+
33
+ +public/+ should contain any static files that should be served directly by the webserver.
34
+ Again, for pure JSON applications, you won't need a +public+ directory.
35
+
36
+ +assets/+ should contain the source files for your CSS and javascript assets. If you are
37
+ not using the +assets+ plugin, you won't need an +assets+ directory.
38
+
39
+ +models.rb+ should contain all code related to your database/ORM. This file should be required
40
+ by +app_name.rb+. This keeps your model code separate from your web code, making it easier
41
+ to use outside of your web code. It allows you to get an IRB shell for accessing your models
42
+ via <tt>irb -r ./models</tt>, without loading the Roda application.
43
+
44
+ +models/+ should contain your ORM models, with a separate file per model class.
45
+
46
+ +migrate/+ should create your database migration files, if you are using an ORM that uses
47
+ migrations.
48
+
49
+ +spec/+ should contain your specifications/tests. For a small application, it's recommended
50
+ to a have a single file for your model tests, and a single file for your web/integration tests.
51
+
52
+ +Rakefile+ should contain the rake tasks for the application. The convention is that the
53
+ default rake task will run all specs/tests related to the application. If you are using
54
+ the +assets+ plugin, you should have an <tt>assets:precompile</tt> task for precompiling
55
+ assets.
56
+
57
+ === Large Applications
58
+
59
+ Large applications generally need more structure:
60
+
61
+ Rakefile
62
+ app_name.rb
63
+ assets/
64
+ helpers/
65
+ migrate/
66
+ models.rb
67
+ models/
68
+ public/
69
+ routes/
70
+ prefix1.rb
71
+ prefix2.rb
72
+ spec/
73
+ models/
74
+ web/
75
+ views/
76
+ prefix1/
77
+ prefix2/
78
+
79
+ For larger apps, the +Rakefile+, +assets/+, +migrate+, +models.rb+, +models/+, +public/+, remain the same.
80
+
81
+ +app_name.rb+ should use the +multi_route+ and +view_subdirs+ plugins. The routes used by the +multi_route+
82
+ plugin should be stored in routing files in the +routes/+ directory, with one file per prefix.
83
+
84
+ For specs/tests, you should have +spec/models/+ and +spec/web/+, with one file per model in +spec/models/+
85
+ and one file per prefix in +spec/web/+.
86
+
87
+ You should have a separate view subdirectory per prefix, and use +set_view_subdir+ in your routing files
88
+ to specify the subdirectory to use, so it doesn't need to be specified on every call to view.
89
+
90
+ +helpers/+ should be used to store helper methods for your application, that you call in your routing files
91
+ and views. In a small application, these methods should just be specified in +app_name.rb+
92
+
93
+ === Really Large Applications
94
+
95
+ For very large applications, it's expected that there will be deviations from these conventions. However,
96
+ it is recommended to use namespaces in the +multi_route+ plugin, and have subdirectories in the +routes/+
97
+ directory, and nested subdirectories in the +views/+ directory.
98
+
99
+ == Roda Application File Layout
100
+
101
+ === Small Applications
102
+
103
+ For a small application, the convention in Roda is to layout your Roda application file (+app_name.rb+) like this:
104
+
105
+ require 'roda'
106
+ require './models'
107
+
108
+ class AppName < Roda
109
+ SOME_CONSTANT = 1
110
+
111
+ use SomeMiddleware
112
+
113
+ plugin :render
114
+ plugin :assets
115
+
116
+ route do |r|
117
+ # ...
118
+ end
119
+
120
+ def view_method
121
+ 'foo'
122
+ end
123
+ end
124
+
125
+ You should first require +roda+ and +./models+, followed by any other libraries needed by the
126
+ application.
127
+
128
+ You should subclass Roda and make the application's name the name of the Roda subclass.
129
+ Inside the subclass, you first define the constants used by the application. Then you add
130
+ any middleware used by the application, followed by loading any plugins used by the application.
131
+ Then you add the route block for the application. After the route block, define the instance methods
132
+ used in your route block or views.
133
+
134
+ === Large Applications
135
+
136
+ For larger applications, there are some slight changes to the Roda application file layout:
137
+
138
+ require 'roda'
139
+ require './models'
140
+
141
+ class AppName < Roda
142
+ SOME_CONSTANT = 1
143
+
144
+ use SomeMiddleware
145
+
146
+ plugin :render
147
+ plugin :assets
148
+ plugin :view_subdirs
149
+ plugin :multi_route
150
+ Dir['./routes/*.rb'].each{|f| require f}
151
+
152
+ route do |r|
153
+ r.multi_route
154
+ end
155
+
156
+ Dir['./helpers/*.rb'].each{|f| require f}
157
+ end
158
+
159
+ After loading the +view_subdirs+ and +multi_route+ plugin, you require all of your
160
+ routing files. Inside your route block, instead of defining your routes, you just call
161
+ +r.multi_route+, which will dispatch to all of your routing files. After your route
162
+ block, you require all of your helper files containing the instance methods for your
163
+ route block or views, instead of defining the methods directly.
@@ -0,0 +1,226 @@
1
+ = New Plugins
2
+
3
+ * An assets plugin has been added, for rendering your CSS and
4
+ javascript asset files on the fly in development, and compiling
5
+ them to a single, compressed file in production.
6
+
7
+ When loading the plugin, you just specify the assets to use via :css
8
+ and/or :js options:
9
+
10
+ plugin :assets, :css=>'some_file.scss', :js=>'some_file.coffee'
11
+
12
+ Inside your Roda.route block, you call r.assets to serve the assets:
13
+
14
+ route do |r|
15
+ r.assets
16
+ end
17
+
18
+ In your views, you can call the assets method, which returns strings
19
+ containing link/script tags for your assets:
20
+
21
+ <%= assets(:css) %>
22
+ <%= assets(:js) %>
23
+
24
+ In production mode, you call compile_assets after loading the
25
+ plugin, and it will compile all of the asset files into a single
26
+ file per type, optionally compress it (using yuicompressor), and
27
+ write the file to the public folder where it can be served by the
28
+ webserver. In compiled mode, calling assets in your views will
29
+ reference the compiled file.
30
+
31
+ It's possible to precompile your assets before application boot, so
32
+ they don't need to be compiled every time your application boots.
33
+
34
+ The assets plugin also supports asset groups, useful when different
35
+ sections of your application use different sets of assets.
36
+
37
+ * A chunked plugin has been added, for streaming template rendering
38
+ using Transfer-Encoding: chunked. By default, this flushes the
39
+ rendering of the top part of the layout template before rendering
40
+ the content template, allowing the client to load the assets
41
+ necessary to fully render the page while the content template is
42
+ still being rendered on the server. This can significantly decrease
43
+ client rendering times.
44
+
45
+ To use chunked encoding for a response, just call the chunked method
46
+ instead of view:
47
+
48
+ r.root do
49
+ chunked(:index)
50
+ end
51
+
52
+ If you want to execute code after flushing the top part of the layout
53
+ template, but before rendering the content template, pass a block to
54
+ chunked:
55
+
56
+ r.root do
57
+ chunked(:index) do
58
+ # expensive calculation here
59
+ end
60
+ end
61
+
62
+ If you want to use chunked encoding for all responses, pass the
63
+ :chunk_by_default option when loading the plugin:
64
+
65
+ plugin :chunked, :chunk_by_default => true
66
+
67
+ Inside your layout or content templates, you can call the flush method
68
+ to flush the current result of the template to the user, useful for
69
+ streaming large datasets.
70
+
71
+ <% (1..100).each do |i| %>
72
+ <%= i %>
73
+ <% sleep 0.1 %>
74
+ <% flush %>
75
+ <% end %>
76
+
77
+ * A caching plugin has been added, for simple HTTP caching support.
78
+ The implementation is based on Sinatra's, and offers
79
+ r.last_modifed and r.etag methods for conditional responses:
80
+
81
+ r.get '/albums/:d' do |album_id|
82
+ @album = Album[album_id]
83
+ r.last_modified @album.updated_at
84
+ r.etag @album.sha1
85
+ view('album')
86
+ end
87
+
88
+ This also adds response.cache_control and response.expires methods
89
+ for setting the Cache-Control/Expires headers for the response.
90
+
91
+ * A path plugin has been added for simple support for named paths:
92
+
93
+ plugin :path
94
+ path :foo, '/foo' # foo_path => '/foo'
95
+ path :bar do |bar| # bar_path(bar) => '/bar/1'
96
+ "/bar/#{bar.id}"
97
+ end
98
+
99
+ * An error_email plugin has been added, for easily emailing error
100
+ notifications for an exception. This is designed for use with
101
+ the error_handler plugin, and should only be used in low-traffic
102
+ environments:
103
+
104
+ plugin :error_email, :to=>'to@example.com',
105
+ :from=>'from@example.com'
106
+ plugin :error_handler do |e|
107
+ error_email(e)
108
+ 'Internal Server Error'
109
+ end
110
+
111
+ = multi_route Plugin Improvements
112
+
113
+ * The multi_route plugin now supports namespaces, allowing it to
114
+ support routing trees of arbitrary complexity. Previously, only
115
+ a single namespace was supported. For example, if you want
116
+ to store your named routes in a directory tree:
117
+
118
+ /routes/foo.rb
119
+ /routes/foo/baz.rb
120
+ /routes/foo/quux.rb
121
+ /routes/bar.rb
122
+ /routes/bar/baz.rb
123
+ /routes/bar/quux.rb
124
+
125
+ You can load all of the routing files in the routes subdirectory
126
+ tree, and structure your routing tree as follows:
127
+
128
+ # app.rb
129
+ route do |r|
130
+ r.multi_route
131
+ end
132
+
133
+ # routes/foo.rb
134
+ route('foo') do |r|
135
+ check_foo_access!
136
+ r.multi_route('foo')
137
+ end
138
+
139
+ # routes/bar.rb
140
+ route('bar') do |r|
141
+ check_bar_access!
142
+ r.multi_route('bar')
143
+ end
144
+
145
+ # routes/foo/baz.rb
146
+ route('baz', 'foo') do
147
+ # ...
148
+ end
149
+
150
+ * Newly added named routes are now picked up while running, useful in
151
+ development when using code reloading.
152
+
153
+ * r.multi_route now ignores non-String named routes, allowing you to
154
+ only dispatch to the String named routes. Previously, calling
155
+ r.multi_route when any non-String names routes were present resulted
156
+ in an error.
157
+
158
+ * r.multi_route now prefers longer routes to shorter routes if
159
+ routes have the same prefix. This can fix behavior if you have
160
+ named routes such as "foo" and "foo/bar".
161
+
162
+ * If you don't pass a block to r.multi_route, it will use the
163
+ return value of the named route as the block value to return,
164
+ instead of always returning nil.
165
+
166
+ = Optimizations
167
+
168
+ * Dispatch speed is slightly improved by using allocate instead of
169
+ new to create new instances.
170
+
171
+ * Hash allocations in the render plugin have been reduced.
172
+
173
+ = Other Improvements
174
+
175
+ * The Roda.route block is now inherited when subclassing, making
176
+ it possible to subclass a Roda application and have the subclass
177
+ work without adding a route block.
178
+
179
+ * Middleware added to a Roda app after the Roda.route method is
180
+ called are now used instead of being ignored.
181
+
182
+ * A response.finish_with_body method has been added, for overriding
183
+ the response body to use. This is useful if you want to support
184
+ arbitrary response bodies.
185
+
186
+ * The render plugin now defaults the locals argument to an empty
187
+ frozen hash instead of nil when rendering templates via tilt.
188
+ This is faster as it avoids a hash allocation inside tilt, and
189
+ also works with broken external tilt templates that require that
190
+ the locals argument be a hash.
191
+
192
+ * Plugins that ship with Roda no longer set constants inside
193
+ InstanceMethods. Instead, the constants are set at the plugin
194
+ module level. This is done to avoid polluting the namespace of
195
+ the application with the constants. Roda's policy is that all
196
+ internal constants inside the Roda namespace are prefixed with
197
+ Roda, so they don't pollute the user's namespace, and setting
198
+ these constants inside InstanceMethods in plugins violated that
199
+ policy.
200
+
201
+ = Backwards Compatibility
202
+
203
+ * response.write no longer sets a Content-Length header. Instead,
204
+ response.finish sets it. This is faster if you call
205
+ response.write multiple times, and more correct if you call
206
+ response.finish without calling response.write.
207
+
208
+ * In the render plugin, modifying render_opts directly is now
209
+ deprecated and will raise an error in the next major release (the
210
+ hash will be frozen). Instead, users should call plugin :render
211
+ again with a new hash, which will be merged into the existing
212
+ render_opts hash.
213
+
214
+ * Moving plugin's constants from InstanceMethods to the plugin level
215
+ can break applications where the constant was referenced directly.
216
+ For example, if you were doing:
217
+
218
+ Roda::SESSION_KEY
219
+
220
+ to get the constant for the session key, you would now need to use:
221
+
222
+ Roda::RodaPlugins::Base::SESSION_KEY
223
+
224
+ In general, it is recommended to not reference such constants at
225
+ all. If you think there should be a general reason to access them,
226
+ request that a method is added that returns them.