sinatra 2.2.0 → 3.2.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.

data/Rakefile CHANGED
@@ -1,15 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rake/clean'
2
- require 'rake/testtask'
4
+ require 'minitest/test_task'
3
5
  require 'fileutils'
4
6
  require 'date'
5
7
 
6
- task :default => :test
7
- task :spec => :test
8
-
9
- CLEAN.include "**/*.rbc"
8
+ task default: :test
10
9
 
11
10
  def source_version
12
- @source_version ||= File.read(File.expand_path("../VERSION", __FILE__)).strip
11
+ @source_version ||= File.read(File.expand_path('VERSION', __dir__)).strip
13
12
  end
14
13
 
15
14
  def prev_feature
@@ -17,69 +16,59 @@ def prev_feature
17
16
  end
18
17
 
19
18
  def prev_version
20
- return prev_feature + '.0' if source_version.end_with? '.0'
21
- source_version.gsub(/\d+$/) { |s| s.to_i - 1 }
22
- end
23
-
24
- # SPECS ===============================================================
19
+ return "#{prev_feature}.0" if source_version.end_with? '.0'
25
20
 
26
- task :test do
27
- ENV['LANG'] = 'C'
28
- ENV.delete 'LC_CTYPE'
21
+ source_version.gsub(/\d+$/) { |s| s.to_i - 1 }
29
22
  end
30
23
 
31
- Rake::TestTask.new(:test) do |t|
32
- t.test_files = FileList['test/*_test.rb']
33
- t.ruby_opts = ['-r rubygems'] if defined? Gem
34
- t.ruby_opts << '-I.'
35
- t.warning = true
36
- end
24
+ # Tests ===============================================================
37
25
 
38
- Rake::TestTask.new(:"test:core") do |t|
39
- core_tests = %w[base delegator encoding extensions filter
40
- helpers mapped_error middleware radius rdoc
41
- readme request response result route_added_hook
42
- routing server settings sinatra static templates]
43
- t.test_files = core_tests.map {|n| "test/#{n}_test.rb"}
44
- t.ruby_opts = ["-r rubygems"] if defined? Gem
45
- t.ruby_opts << "-I."
26
+ Minitest::TestTask.create # Default `test` task
27
+ Minitest::TestTask.create(:'test:core') do |t|
46
28
  t.warning = true
29
+ t.test_globs = %w[
30
+ base delegator encoding extensions filter
31
+ helpers mapped_error middleware rdoc
32
+ readme request response result route_added_hook
33
+ routing server settings sinatra static templates
34
+ ].map { |n| "test/#{n}_test.rb" }
47
35
  end
48
36
 
49
- # Rcov ================================================================
37
+ # Test code coverage ==================================================
50
38
 
51
39
  namespace :test do
52
40
  desc 'Measures test coverage'
53
41
  task :coverage do
54
- rm_f "coverage"
42
+ rm_f 'coverage'
55
43
  ENV['COVERAGE'] = '1'
56
44
  Rake::Task['test'].invoke
57
45
  end
58
46
  end
47
+ CLEAN.include('coverage')
59
48
 
60
49
  # Website =============================================================
61
50
 
62
51
  desc 'Generate RDoc under doc/api'
63
- task 'doc' => ['doc:api']
64
- task('doc:api') { sh "yardoc -o doc/api" }
52
+ task 'doc' => ['doc:api']
53
+ task('doc:api') { sh 'yardoc -o doc/api' }
65
54
  CLEAN.include 'doc/api'
66
55
 
67
56
  # README ===============================================================
68
57
 
69
- task :add_template, [:name] do |t, args|
58
+ task :add_template, [:name] do |_t, args|
70
59
  Dir.glob('README.*') do |file|
71
60
  code = File.read(file)
72
61
  if code =~ /^===.*#{args.name.capitalize}/
73
62
  puts "Already covered in #{file}"
74
63
  else
75
- template = code[/===[^\n]*Liquid.*index\.liquid<\/tt>[^\n]*/m]
76
- if !template
77
- puts "Liquid not found in #{file}"
78
- else
64
+ template = code[%r{===[^\n]*Liquid.*index\.liquid</tt>[^\n]*}m]
65
+ if template
79
66
  puts "Adding section to #{file}"
80
67
  template = template.gsub(/Liquid/, args.name.capitalize).gsub(/liquid/, args.name.downcase)
81
68
  code.gsub! /^(\s*===.*CoffeeScript)/, "\n" << template << "\n\\1"
82
- File.open(file, "w") { |f| f << code }
69
+ File.open(file, 'w') { |f| f << code }
70
+ else
71
+ puts "Liquid not found in #{file}"
83
72
  end
84
73
  end
85
74
  end
@@ -87,29 +76,31 @@ end
87
76
 
88
77
  # Thanks in announcement ===============================================
89
78
 
90
- team = ["Ryan Tomayko", "Blake Mizerany", "Simon Rozet", "Konstantin Haase", "Zachary Scott"]
91
- desc "list of contributors"
92
- task :thanks, ['release:all', :backports] do |t, a|
93
- a.with_defaults :release => "#{prev_version}..HEAD",
94
- :backports => "#{prev_feature}.0..#{prev_feature}.x"
79
+ team = ['Ryan Tomayko', 'Blake Mizerany', 'Simon Rozet', 'Konstantin Haase', 'Zachary Scott']
80
+ desc 'list of contributors'
81
+ task :thanks, ['release:all', :backports] do |_t, a|
82
+ a.with_defaults release: "#{prev_version}..HEAD",
83
+ backports: "#{prev_feature}.0..#{prev_feature}.x"
84
+
95
85
  included = `git log --format=format:"%aN\t%s" #{a.release}`.lines.map { |l| l.force_encoding('binary') }
96
86
  excluded = `git log --format=format:"%aN\t%s" #{a.backports}`.lines.map { |l| l.force_encoding('binary') }
97
87
  commits = (included - excluded).group_by { |c| c[/^[^\t]+/] }
98
88
  authors = commits.keys.sort_by { |n| - commits[n].size } - team
99
- puts authors[0..-2].join(', ') << " and " << authors.last,
100
- "(based on commits included in #{a.release}, but not in #{a.backports})"
89
+ puts authors[0..-2].join(', ') << ' and ' << authors.last,
90
+ "(based on commits included in #{a.release}, but not in #{a.backports})"
101
91
  end
102
92
 
103
- desc "list of authors"
104
- task :authors, [:commit_range, :format, :sep] do |t, a|
105
- a.with_defaults :format => "%s (%d)", :sep => ", ", :commit_range => '--all'
93
+ desc 'list of authors'
94
+ task :authors, [:commit_range, :format, :sep] do |_t, a|
95
+ a.with_defaults format: '%s (%d)', sep: ', ', commit_range: '--all'
106
96
  authors = Hash.new(0)
107
- blake = "Blake Mizerany"
97
+ blake = 'Blake Mizerany'
108
98
  overall = 0
109
99
  mapping = {
110
- "blake.mizerany@gmail.com" => blake, "bmizerany" => blake,
111
- "a_user@mac.com" => blake, "ichverstehe" => "Harry Vangberg",
112
- "Wu Jiang (nouse)" => "Wu Jiang" }
100
+ 'blake.mizerany@gmail.com' => blake, 'bmizerany' => blake,
101
+ 'a_user@mac.com' => blake, 'ichverstehe' => 'Harry Vangberg',
102
+ 'Wu Jiang (nouse)' => 'Wu Jiang'
103
+ }
113
104
  `git shortlog -s #{a.commit_range}`.lines.map do |line|
114
105
  line = line.force_encoding 'binary' if line.respond_to? :force_encoding
115
106
  num, name = line.split("\t", 2).map(&:strip)
@@ -117,18 +108,18 @@ task :authors, [:commit_range, :format, :sep] do |t, a|
117
108
  overall += num.to_i
118
109
  end
119
110
  puts "#{overall} commits by #{authors.count} authors:"
120
- puts authors.sort_by { |n,c| -c }.map { |e| a.format % e }.join(a.sep)
111
+ puts authors.sort_by { |_n, c| -c }.map { |e| a.format % e }.join(a.sep)
121
112
  end
122
113
 
123
- desc "generates TOC"
124
- task :toc, [:readme] do |t, a|
125
- a.with_defaults :readme => 'README.md'
114
+ desc 'generates TOC'
115
+ task :toc, [:readme] do |_t, a|
116
+ a.with_defaults readme: 'README.md'
126
117
 
127
118
  def self.link(title)
128
119
  title.downcase.gsub(/(?!-)\W /, '-').gsub(' ', '-').gsub(/(?!-)\W/, '')
129
120
  end
130
121
 
131
- puts "* [Sinatra](#sinatra)"
122
+ puts '* [Sinatra](#sinatra)'
132
123
  title = Regexp.new('(?<=\* )(.*)') # so Ruby 1.8 doesn't complain
133
124
  File.binread(a.readme).scan(/^##.*/) do |line|
134
125
  puts line.gsub(/#(?=#)/, ' ').gsub('#', '*').gsub(title) { "[#{$1}](##{link($1)})" }
@@ -139,12 +130,12 @@ end
139
130
 
140
131
  if defined?(Gem)
141
132
  GEMS_AND_ROOT_DIRECTORIES = {
142
- "sinatra" => ".",
143
- "sinatra-contrib" => "./sinatra-contrib",
144
- "rack-protection" => "./rack-protection"
145
- }
133
+ 'sinatra' => '.',
134
+ 'sinatra-contrib' => './sinatra-contrib',
135
+ 'rack-protection' => './rack-protection'
136
+ }.freeze
146
137
 
147
- def package(gem, ext='')
138
+ def package(gem, ext = '')
148
139
  "pkg/#{gem}-#{source_version}" + ext
149
140
  end
150
141
 
@@ -152,12 +143,12 @@ if defined?(Gem)
152
143
  CLOBBER.include('pkg')
153
144
 
154
145
  GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
155
- file package(gem, '.gem') => ["pkg/", "#{directory + '/' + gem}.gemspec"] do |f|
146
+ file package(gem, '.gem') => ['pkg/', "#{"#{directory}/#{gem}"}.gemspec"] do |f|
156
147
  sh "cd #{directory} && gem build #{gem}.gemspec"
157
- mv directory + "/" + File.basename(f.name), f.name
148
+ mv "#{directory}/#{File.basename(f.name)}", f.name
158
149
  end
159
150
 
160
- file package(gem, '.tar.gz') => ["pkg/"] do |f|
151
+ file package(gem, '.tar.gz') => ['pkg/'] do |f|
161
152
  sh <<-SH
162
153
  git archive \
163
154
  --prefix=#{gem}-#{source_version}/ \
@@ -168,29 +159,29 @@ if defined?(Gem)
168
159
  end
169
160
 
170
161
  namespace :package do
171
- GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
162
+ GEMS_AND_ROOT_DIRECTORIES.each do |gem, _directory|
172
163
  desc "Build #{gem} packages"
173
164
  task gem => %w[.gem .tar.gz].map { |e| package(gem, e) }
174
165
  end
175
166
 
176
- desc "Build all packages"
177
- task :all => GEMS_AND_ROOT_DIRECTORIES.keys
167
+ desc 'Build all packages'
168
+ task all: GEMS_AND_ROOT_DIRECTORIES.keys
178
169
  end
179
170
 
180
171
  namespace :install do
181
- GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
172
+ GEMS_AND_ROOT_DIRECTORIES.each do |gem, _directory|
182
173
  desc "Build and install #{gem} as local gem"
183
174
  task gem => package(gem, '.gem') do
184
175
  sh "gem install #{package(gem, '.gem')}"
185
176
  end
186
177
  end
187
178
 
188
- desc "Build and install all of the gems as local gems"
189
- task :all => GEMS_AND_ROOT_DIRECTORIES.keys
179
+ desc 'Build and install all of the gems as local gems'
180
+ task all: GEMS_AND_ROOT_DIRECTORIES.keys
190
181
  end
191
182
 
192
183
  namespace :release do
193
- GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
184
+ GEMS_AND_ROOT_DIRECTORIES.each do |gem, _directory|
194
185
  desc "Release #{gem} as a package"
195
186
  task gem => "package:#{gem}" do
196
187
  sh <<-SH
@@ -200,7 +191,7 @@ if defined?(Gem)
200
191
  end
201
192
  end
202
193
 
203
- desc "Commits the version to github repository"
194
+ desc 'Commits the version to git (no push)'
204
195
  task :commit_version do
205
196
  %w[
206
197
  lib/sinatra
@@ -212,14 +203,26 @@ if defined?(Gem)
212
203
  end
213
204
 
214
205
  sh <<-SH
215
- git commit --allow-empty -a -m '#{source_version} release' &&
216
- git tag -s v#{source_version} -m '#{source_version} release' &&
217
- git push && (git push origin || true) &&
218
- git push --tags && (git push origin --tags || true)
206
+ git commit --allow-empty --all --message '#{source_version} release'
207
+ SH
208
+ end
209
+
210
+ desc 'Tags the version in git (no push)'
211
+ task :tag_version do
212
+ sh <<-SH
213
+ git tag --sign v#{source_version} --message '#{source_version} release'
214
+ SH
215
+ end
216
+
217
+ desc 'Watch the release workflow run'
218
+ task :watch do
219
+ sh <<-SH
220
+ runId=$(gh run list --workflow=release.yml --limit 1 --json databaseId --jq '.[].databaseId')
221
+ gh run watch --interval 1 --exit-status $runId
219
222
  SH
220
223
  end
221
224
 
222
- desc "Release all gems as packages"
223
- task :all => [:test, :commit_version] + GEMS_AND_ROOT_DIRECTORIES.keys
225
+ desc 'Release all gems as packages'
226
+ task all: %i[test commit_version] + GEMS_AND_ROOT_DIRECTORIES.keys
224
227
  end
225
228
  end
data/SECURITY.md CHANGED
@@ -6,7 +6,7 @@ After the initial reply to your report the security team will endeavor to keep y
6
6
 
7
7
  If you have not received a reply to your email within 48 hours, or have not heard from the security team for the past five days there are a few steps you can take:
8
8
 
9
- * Contact the current security coordinator [Zachary Scott](mailto:zzak@ruby-lang.org) directly
9
+ * Reach out to us on [discord](https://discord.gg/ncjsfsNHh7)
10
10
 
11
11
  ## Disclosure Policy
12
12
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 3.2.0
data/examples/chat.rb CHANGED
@@ -1,24 +1,37 @@
1
1
  #!/usr/bin/env ruby -I ../lib -I lib
2
- # coding: utf-8
3
- require_relative 'rainbows'
2
+ # frozen_string_literal: true
3
+
4
+ # This example does *not* work properly with WEBrick or other
5
+ # servers that buffer output. To shut down the server, close any
6
+ # open browser tabs that are connected to the chat server.
7
+
4
8
  require 'sinatra'
5
- set :server, :rainbows
6
- connections = []
9
+ set :server, :puma
10
+ connections = Set.new
7
11
 
8
12
  get '/' do
9
13
  halt erb(:login) unless params[:user]
10
- erb :chat, :locals => { :user => params[:user].gsub(/\W/, '') }
14
+ erb :chat, locals: { user: params[:user].gsub(/\W/, '') }
11
15
  end
12
16
 
13
- get '/stream', :provides => 'text/event-stream' do
17
+ get '/stream', provides: 'text/event-stream' do
14
18
  stream :keep_open do |out|
15
- connections << out
16
- out.callback { connections.delete(out) }
19
+ if connections.add?(out)
20
+ out.callback { connections.delete(out) }
21
+ end
22
+ out << "heartbeat:\n"
23
+ sleep 1
24
+ rescue
25
+ out.close
17
26
  end
18
27
  end
19
28
 
20
29
  post '/' do
21
- connections.each { |out| out << "data: #{params[:msg]}\n\n" }
30
+ connections.each do |out|
31
+ out << "data: #{params[:msg]}\n\n"
32
+ rescue
33
+ out.close
34
+ end
22
35
  204 # response without entity body
23
36
  end
24
37
 
@@ -35,10 +48,10 @@ __END__
35
48
  </html>
36
49
 
37
50
  @@ login
38
- <form action='/'>
51
+ <form action="/">
39
52
  <label for='user'>User Name:</label>
40
- <input name='user' value='' />
41
- <input type='submit' value="GO!" />
53
+ <input name="user" value="" />
54
+ <input type="submit" value="GO!" />
42
55
  </form>
43
56
 
44
57
  @@ chat
@@ -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/simple.rb CHANGED
@@ -1,3 +1,5 @@
1
1
  #!/usr/bin/env ruby -I ../lib -I lib
2
+ # frozen_string_literal: true
3
+
2
4
  require 'sinatra'
3
5
  get('/') { 'this is a simple app' }
data/examples/stream.ru CHANGED
@@ -1,11 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # this example does *not* work properly with WEBrick
2
4
  #
3
5
  # run *one* of these:
4
6
  #
5
- # rackup -s mongrel stream.ru # gem install mongrel
6
7
  # unicorn stream.ru # gem install unicorn
7
8
  # puma stream.ru # gem install puma
8
- # rainbows -c rainbows.conf stream.ru # gem install rainbows eventmachine
9
9
 
10
10
  require 'sinatra/base'
11
11