sinatra 3.0.6 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08567da318760f376b1c6c8ccafd4e1268ff19a800c90939d9f1448a7c85edcb'
4
- data.tar.gz: 4287d74952e33c257cd981ed731e732cd0811dbeaeeb7fa553817ef3ad44a9d8
3
+ metadata.gz: 315dee3d85d7778ffa48e041bd60370e9e89ecd3c01dbf0cf9450e41c62dc0d8
4
+ data.tar.gz: '083a914c0b520684471e2715ec091c67ca8121bfb8b5d4cf410307d6e14e4ac5'
5
5
  SHA512:
6
- metadata.gz: af4979f21e7a5bc8e2aebadc68138ad5885829d5c25060303c526fec354552d178d39ae050f5a49700da4bc4b4653264e5371c6dfda44df585a7f198353f65dc
7
- data.tar.gz: 3cd222fd4e5a5337cc63a6df8d813ec695cb2e4ea73294048de169e92c93dcee36a6d90f2bbb0a3525f3d27b86c3499f762f1c0b8904e79c7a012a9852095aeb
6
+ metadata.gz: 2790a4d58595f0f89667c5fd4530dde2de532ddaf02628f373162cc47d393732b1c9475ab59775c756750dfb52e60e7091118936ac8e70739fb266b46f82d3bd
7
+ data.tar.gz: eb74f34bf0b9a681557809c656754312eb266e66c3b68fcabbf95699c3273cf4d998e3969224b09df9127ff90f5d34fba5bc93b1ff0c321b4a7646ddfcc0b6b7
data/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  * _Your new feature here._
4
4
 
5
+ ## 3.1.0 / 2023-08-07
6
+
7
+ * New: Add sass support via sass-embedded [#1911] by なつき
8
+
9
+ * New: Add start and stop callbacks [#1913] by Jevin Sew
10
+
11
+ * New: Warn on dropping sessions [#1900] by Jonathan del Strother
12
+
13
+ * New: Make Puma the default server [#1924] by Patrik Ragnarsson
14
+
15
+ * Fix: Remove use of Tilt::Cache [#1922] by Jeremy Evans (allows use of Tilt 2.2.0 without deprecation warning)
16
+
17
+ * Fix: rack-protection: specify rack version requirement [#1932] by Patrik Ragnarsson
18
+
19
+ [#1913]: https://github.com/sinatra/sinatra/pull/1913
20
+ [#1900]: https://github.com/sinatra/sinatra/pull/1900
21
+ [#1924]: https://github.com/sinatra/sinatra/pull/1924
22
+ [#1922]: https://github.com/sinatra/sinatra/pull/1922
23
+ [#1932]: https://github.com/sinatra/sinatra/pull/1932
24
+
5
25
  ## 3.0.6 / 2023-04-11
6
26
 
7
27
  * Fix: Add support to keep open streaming connections with Puma [#1858](https://github.com/sinatra/sinatra/pull/1858) by Jordan Owens
data/Gemfile CHANGED
@@ -31,6 +31,12 @@ gem 'yard'
31
31
  gem 'rack-protection', path: 'rack-protection'
32
32
  gem 'sinatra-contrib', path: 'sinatra-contrib'
33
33
 
34
+ # traces 0.10.0 started to use Ruby 2.7 syntax without specifying required Ruby version
35
+ # https://github.com/socketry/traces/pull/8#discussion_r1237988182
36
+ # async-http 0.60.2 added traces 0.10.0 as dependency
37
+ # https://github.com/socketry/async-http/pull/124/files#r1237988899
38
+ gem 'traces', '< 0.10.0' if RUBY_VERSION >= '2.6.0' && RUBY_VERSION < '2.7.0'
39
+
34
40
  gem 'activesupport', '~> 6.1'
35
41
 
36
42
  gem 'asciidoctor'
@@ -50,6 +56,7 @@ gem 'rainbows', platforms: [:mri] # uses #fork
50
56
  gem 'rdiscount', platforms: [:ruby]
51
57
  gem 'rdoc'
52
58
  gem 'redcarpet', platforms: [:ruby]
59
+ gem 'sass-embedded', '~> 1.54'
53
60
  gem 'simplecov', require: false
54
61
  gem 'slim', '~> 4'
55
62
  gem 'yajl-ruby', platforms: [:ruby]
data/README.md CHANGED
@@ -54,6 +54,8 @@ pick up if available.
54
54
  - [Erb Templates](#erb-templates)
55
55
  - [Builder Templates](#builder-templates)
56
56
  - [Nokogiri Templates](#nokogiri-templates)
57
+ - [Sass Templates](#sass-templates)
58
+ - [Scss Templates](#scss-templates)
57
59
  - [Liquid Templates](#liquid-templates)
58
60
  - [Markdown Templates](#markdown-templates)
59
61
  - [RDoc Templates](#rdoc-templates)
@@ -93,6 +95,7 @@ pick up if available.
93
95
  - [Configuration](#configuration)
94
96
  - [Configuring attack protection](#configuring-attack-protection)
95
97
  - [Available Settings](#available-settings)
98
+ - [Lifecycle Events](#lifecycle-events)
96
99
  - [Environments](#environments)
97
100
  - [Error Handling](#error-handling)
98
101
  - [Not Found](#not-found)
@@ -649,6 +652,39 @@ It also takes a block for inline templates (see [example](#inline-templates)).
649
652
 
650
653
  It also takes a block for inline templates (see [example](#inline-templates)).
651
654
 
655
+ #### Sass Templates
656
+
657
+ <table>
658
+ <tr>
659
+ <td>Dependency</td>
660
+ <td><a href="https://github.com/ntkme/sass-embedded-host-ruby" title="sass-embedded">sass-embedded</a></td>
661
+ </tr>
662
+ <tr>
663
+ <td>File Extension</td>
664
+ <td><tt>.sass</tt></td>
665
+ </tr>
666
+ <tr>
667
+ <td>Example</td>
668
+ <td><tt>sass :stylesheet, :style => :expanded</tt></td>
669
+ </tr>
670
+ </table>
671
+
672
+ #### Scss Templates
673
+
674
+ <table>
675
+ <tr>
676
+ <td>Dependency</td>
677
+ <td><a href="https://github.com/ntkme/sass-embedded-host-ruby" title="sass-embedded">sass-embedded</a></td>
678
+ </tr>
679
+ <tr>
680
+ <td>File Extension</td>
681
+ <td><tt>.scss</tt></td>
682
+ </tr>
683
+ <tr>
684
+ <td>Example</td>
685
+ <td><tt>scss :stylesheet, :style => :expanded</tt></td>
686
+ </tr>
687
+ </table>
652
688
 
653
689
  #### Liquid Templates
654
690
 
@@ -2089,9 +2125,13 @@ set :protection, :session => true
2089
2125
 
2090
2126
  <dt>raise_errors</dt>
2091
2127
  <dd>
2092
- Raise exceptions (will stop application). Enabled by default when
2128
+ Raise unhandled errors (will stop application). Enabled by default when
2093
2129
  <tt>environment</tt> is set to <tt>"test"</tt>, disabled otherwise.
2094
2130
  </dd>
2131
+ <dd>
2132
+ Any explicitly defined error handlers always override this setting. See
2133
+ the "Error" section below.
2134
+ </dd>
2095
2135
 
2096
2136
  <dt>run</dt>
2097
2137
  <dd>
@@ -2184,6 +2224,24 @@ set :protection, :session => true
2184
2224
  </dd>
2185
2225
  </dl>
2186
2226
 
2227
+ ## Lifecycle Events
2228
+
2229
+ There are 2 lifecycle events currently exposed by Sinatra. One when the server starts and one when it stops.
2230
+
2231
+ They can be used like this:
2232
+
2233
+ ```ruby
2234
+ on_start do
2235
+ puts "===== Booting up ====="
2236
+ end
2237
+
2238
+ on_stop do
2239
+ puts "===== Shutting down ====="
2240
+ end
2241
+ ```
2242
+
2243
+ Note that these callbacks only work when using Sinatra to start the web server.
2244
+
2187
2245
  ## Environments
2188
2246
 
2189
2247
  There are three predefined `environments`: `"development"`,
@@ -2240,6 +2298,14 @@ show exceptions option to `:after_handler`:
2240
2298
  set :show_exceptions, :after_handler
2241
2299
  ```
2242
2300
 
2301
+ A catch-all error handler can be defined with `error` and a block:
2302
+
2303
+ ```ruby
2304
+ error do
2305
+ 'Sorry there was a nasty error'
2306
+ end
2307
+ ```
2308
+
2243
2309
  The exception object can be obtained from the `sinatra.error` Rack variable:
2244
2310
 
2245
2311
  ```ruby
@@ -2248,7 +2314,7 @@ error do
2248
2314
  end
2249
2315
  ```
2250
2316
 
2251
- Custom errors:
2317
+ Pass an error class as an argument to create handlers for custom errors:
2252
2318
 
2253
2319
  ```ruby
2254
2320
  error MyCustomError do
@@ -2294,6 +2360,51 @@ Sinatra installs special `not_found` and `error` handlers when
2294
2360
  running under the development environment to display nice stack traces
2295
2361
  and additional debugging information in your browser.
2296
2362
 
2363
+ ### Behavior with `raise_errors` option
2364
+
2365
+ When `raise_errors` option is `true`, errors that are unhandled are raised
2366
+ outside of the application. Additionally, any errors that would have been
2367
+ caught by the catch-all error handler are raised.
2368
+
2369
+ For example, consider the following configuration:
2370
+
2371
+ ```ruby
2372
+ # First handler
2373
+ error MyCustomError do
2374
+ 'A custom message'
2375
+ end
2376
+
2377
+ # Second handler
2378
+ error do
2379
+ 'A catch-all message'
2380
+ end
2381
+ ```
2382
+
2383
+ If `raise_errors` is `false`:
2384
+
2385
+ * When `MyCustomError` or descendant is raised, the first handler is invoked.
2386
+ The HTTP response body will contain `"A custom message"`.
2387
+ * When any other error is raised, the second handler is invoked. The HTTP
2388
+ response body will contain `"A catch-all message"`.
2389
+
2390
+ If `raise_errors` is `true`:
2391
+
2392
+ * When `MyCustomError` or descendant is raised, the behavior is identical to
2393
+ when `raise_errors` is `false`, described above.
2394
+ * When any other error is raised, the second handler is *not* invoked, and
2395
+ the error is raised outside of the application.
2396
+ * If the environment is `production`, the HTTP response body will contain
2397
+ a generic error message, e.g. `"An unhandled lowlevel error occurred. The
2398
+ application logs may have details."`
2399
+ * If the environment is not `production`, the HTTP response body will contain
2400
+ the verbose error backtrace.
2401
+ * Regardless of environment, if `show_exceptions` is set to `:after_handler`,
2402
+ the HTTP response body will contain the verbose error backtrace.
2403
+
2404
+ In the `test` environment, `raise_errors` is set to `true` by default. This
2405
+ means that in order to write a test for a catch-all error handler,
2406
+ `raise_errors` must temporarily be set to `false` for that particular test.
2407
+
2297
2408
  ## Rack Middleware
2298
2409
 
2299
2410
  Sinatra rides on [Rack](https://rack.github.io/), a minimal standard
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.0.6
1
+ 3.1.0
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby -I ../lib -I lib
2
+ # frozen_string_literal: true
3
+
4
+ require 'sinatra'
5
+
6
+ get('/') do
7
+ 'This shows how lifecycle events work'
8
+ end
9
+
10
+ on_start do
11
+ puts "=============="
12
+ puts " Booting up"
13
+ puts "=============="
14
+ end
15
+
16
+ on_stop do
17
+ puts "================="
18
+ puts " Shutting down"
19
+ puts "================="
20
+ end
data/examples/stream.ru CHANGED
@@ -4,7 +4,6 @@
4
4
  #
5
5
  # run *one* of these:
6
6
  #
7
- # rackup -s mongrel stream.ru # gem install mongrel
8
7
  # unicorn stream.ru # gem install unicorn
9
8
  # puma stream.ru # gem install puma
10
9
  # rainbows -c rainbows.conf stream.ru # gem install rainbows eventmachine
data/lib/sinatra/base.rb CHANGED
@@ -726,7 +726,7 @@ module Sinatra
726
726
  # Possible options are:
727
727
  # :content_type The content type to use, same arguments as content_type.
728
728
  # :layout If set to something falsy, no layout is rendered, otherwise
729
- # the specified layout is used
729
+ # the specified layout is used (Ignored for `sass`)
730
730
  # :layout_engine Engine to use for rendering the layout.
731
731
  # :locals A hash with local variables that should be available
732
732
  # in the template
@@ -752,6 +752,20 @@ module Sinatra
752
752
  render(:haml, template, options, locals, &block)
753
753
  end
754
754
 
755
+ def sass(template, options = {}, locals = {})
756
+ options[:default_content_type] = :css
757
+ options[:exclude_outvar] = true
758
+ options[:layout] = nil
759
+ render :sass, template, options, locals
760
+ end
761
+
762
+ def scss(template, options = {}, locals = {})
763
+ options[:default_content_type] = :css
764
+ options[:exclude_outvar] = true
765
+ options[:layout] = nil
766
+ render :scss, template, options, locals
767
+ end
768
+
755
769
  def builder(template = nil, options = {}, locals = {}, &block)
756
770
  options[:default_content_type] = :xml
757
771
  render_ruby(:builder, template, options, locals, &block)
@@ -862,7 +876,11 @@ module Sinatra
862
876
  catch(:layout_missing) { return render(layout_engine, layout, options, locals) { output } }
863
877
  end
864
878
 
865
- output.extend(ContentTyped).content_type = content_type if content_type
879
+ if content_type
880
+ # sass-embedded returns a frozen string
881
+ output = +output
882
+ output.extend(ContentTyped).content_type = content_type
883
+ end
866
884
  output
867
885
  end
868
886
 
@@ -914,6 +932,35 @@ module Sinatra
914
932
  end
915
933
  end
916
934
 
935
+ # Extremely simple template cache implementation.
936
+ # * Not thread-safe.
937
+ # * Size is unbounded.
938
+ # * Keys are not copied defensively, and should not be modified after
939
+ # being passed to #fetch. More specifically, the values returned by
940
+ # key#hash and key#eql? should not change.
941
+ #
942
+ # Implementation copied from Tilt::Cache.
943
+ class TemplateCache
944
+ def initialize
945
+ @cache = {}
946
+ end
947
+
948
+ # Caches a value for key, or returns the previously cached value.
949
+ # If a value has been previously cached for key then it is
950
+ # returned. Otherwise, block is yielded to and its return value
951
+ # which may be nil, is cached under key and returned.
952
+ def fetch(*key)
953
+ @cache.fetch(key) do
954
+ @cache[key] = yield
955
+ end
956
+ end
957
+
958
+ # Clears the cache.
959
+ def clear
960
+ @cache = {}
961
+ end
962
+ end
963
+
917
964
  # Base class for all Sinatra applications and middleware.
918
965
  class Base
919
966
  include Rack::Utils
@@ -928,7 +975,7 @@ module Sinatra
928
975
  def initialize(app = nil, **_kwargs)
929
976
  super()
930
977
  @app = app
931
- @template_cache = Tilt::Cache.new
978
+ @template_cache = TemplateCache.new
932
979
  @pinned_response = nil # whether a before! filter pinned the content-type
933
980
  yield self if block_given?
934
981
  end
@@ -1230,7 +1277,7 @@ module Sinatra
1230
1277
  %r{zeitwerk/kernel\.rb} # Zeitwerk kernel#require decorator
1231
1278
  ].freeze
1232
1279
 
1233
- attr_reader :routes, :filters, :templates, :errors
1280
+ attr_reader :routes, :filters, :templates, :errors, :on_start_callback, :on_stop_callback
1234
1281
 
1235
1282
  def callers_to_ignore
1236
1283
  CALLERS_TO_IGNORE
@@ -1423,6 +1470,14 @@ module Sinatra
1423
1470
  filters[type] << compile!(type, path, block, **options)
1424
1471
  end
1425
1472
 
1473
+ def on_start(&on_start_callback)
1474
+ @on_start_callback = on_start_callback
1475
+ end
1476
+
1477
+ def on_stop(&on_stop_callback)
1478
+ @on_stop_callback = on_stop_callback
1479
+ end
1480
+
1426
1481
  # Add a route condition. The route is considered non-matching when the
1427
1482
  # block returns false.
1428
1483
  def condition(name = "#{caller.first[/`.*'/]} condition", &block)
@@ -1512,12 +1567,14 @@ module Sinatra
1512
1567
  warn '== Sinatra has ended his set (crowd applauds)' unless suppress_messages?
1513
1568
  set :running_server, nil
1514
1569
  set :handler_name, nil
1570
+
1571
+ on_stop_callback.call unless on_stop_callback.nil?
1515
1572
  end
1516
1573
 
1517
1574
  alias stop! quit!
1518
1575
 
1519
1576
  # Run the Sinatra app as a self-hosted server using
1520
- # Puma, Falcon, Mongrel, or WEBrick (in that order). If given a block, will call
1577
+ # Puma, Falcon, or WEBrick (in that order). If given a block, will call
1521
1578
  # with the constructed handler once we have taken the stage.
1522
1579
  def run!(options = {}, &block)
1523
1580
  return if running?
@@ -1599,7 +1656,7 @@ module Sinatra
1599
1656
  set :running_server, server
1600
1657
  set :handler_name, handler_name
1601
1658
  server.threaded = settings.threaded if server.respond_to? :threaded=
1602
-
1659
+ on_start_callback.call unless on_start_callback.nil?
1603
1660
  yield server if block_given?
1604
1661
  end
1605
1662
  end
@@ -1870,11 +1927,10 @@ module Sinatra
1870
1927
 
1871
1928
  ruby_engine = defined?(RUBY_ENGINE) && RUBY_ENGINE
1872
1929
 
1873
- server.unshift 'puma'
1874
- server.unshift 'falcon' if ruby_engine != 'jruby'
1875
- server.unshift 'mongrel' if ruby_engine.nil?
1876
1930
  server.unshift 'thin' if ruby_engine != 'jruby'
1931
+ server.unshift 'falcon' if ruby_engine != 'jruby'
1877
1932
  server.unshift 'trinidad' if ruby_engine == 'jruby'
1933
+ server.unshift 'puma'
1878
1934
 
1879
1935
  set :absolute_redirects, true
1880
1936
  set :prefixed_redirects, false
@@ -1991,7 +2047,7 @@ module Sinatra
1991
2047
  delegate :get, :patch, :put, :post, :delete, :head, :options, :link, :unlink,
1992
2048
  :template, :layout, :before, :after, :error, :not_found, :configure,
1993
2049
  :set, :mime_type, :enable, :disable, :use, :development?, :test?,
1994
- :production?, :helpers, :settings, :register
2050
+ :production?, :helpers, :settings, :register, :on_start, :on_stop
1995
2051
 
1996
2052
  class << self
1997
2053
  attr_accessor :target
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sinatra
4
- VERSION = '3.0.6'
4
+ VERSION = '3.1.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.6
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Blake Mizerany
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2023-04-11 00:00:00.000000000 Z
14
+ date: 2023-08-07 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: mustermann
@@ -53,14 +53,14 @@ dependencies:
53
53
  requirements:
54
54
  - - '='
55
55
  - !ruby/object:Gem::Version
56
- version: 3.0.6
56
+ version: 3.1.0
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - '='
62
62
  - !ruby/object:Gem::Version
63
- version: 3.0.6
63
+ version: 3.1.0
64
64
  - !ruby/object:Gem::Dependency
65
65
  name: tilt
66
66
  requirement: !ruby/object:Gem::Requirement
@@ -110,6 +110,7 @@ files:
110
110
  - SECURITY.md
111
111
  - VERSION
112
112
  - examples/chat.rb
113
+ - examples/lifecycle_events.rb
113
114
  - examples/rainbows.conf
114
115
  - examples/rainbows.rb
115
116
  - examples/simple.rb
@@ -154,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
154
155
  - !ruby/object:Gem::Version
155
156
  version: '0'
156
157
  requirements: []
157
- rubygems_version: 3.4.10
158
+ rubygems_version: 3.4.18
158
159
  signing_key:
159
160
  specification_version: 4
160
161
  summary: Classy web-development dressed in a DSL