sinatra 2.2.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
19
+ return "#{prev_feature}.0" if source_version.end_with? '.0'
23
20
 
24
- # SPECS ===============================================================
25
-
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 github repository'
204
195
  task :commit_version do
205
196
  %w[
206
197
  lib/sinatra
@@ -219,7 +210,7 @@ if defined?(Gem)
219
210
  SH
220
211
  end
221
212
 
222
- desc "Release all gems as packages"
223
- task :all => [:test, :commit_version] + GEMS_AND_ROOT_DIRECTORIES.keys
213
+ desc 'Release all gems as packages'
214
+ task all: %i[test commit_version] + GEMS_AND_ROOT_DIRECTORIES.keys
224
215
  end
225
216
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 3.1.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/rainbows.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rainbows'
2
4
 
3
5
  module Rack
@@ -8,7 +10,7 @@ module Rack
8
10
  listeners: ["#{options[:Host]}:#{options[:Port]}"],
9
11
  worker_processes: 1,
10
12
  timeout: 30,
11
- config_file: ::File.expand_path('rainbows.conf', __dir__),
13
+ config_file: ::File.expand_path('rainbows.conf', __dir__)
12
14
  }
13
15
 
14
16
  ::Rainbows::HttpServer.new(app, rainbows_options).start.join
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,8 +1,9 @@
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
9
  # rainbows -c rainbows.conf stream.ru # gem install rainbows eventmachine