sinatra 3.0.6 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sinatra might be problematic. Click here for more details.

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