sinatra 2.2.4 → 3.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +91 -17
- data/Gemfile +44 -64
- data/README.md +105 -402
- data/Rakefile +65 -65
- data/VERSION +1 -1
- data/examples/chat.rb +5 -3
- data/examples/rainbows.rb +3 -1
- data/examples/simple.rb +2 -0
- data/examples/stream.ru +2 -0
- data/lib/sinatra/base.rb +331 -328
- data/lib/sinatra/indifferent_hash.rb +25 -33
- data/lib/sinatra/main.rb +18 -16
- data/lib/sinatra/show_exceptions.rb +17 -15
- data/lib/sinatra/version.rb +3 -1
- data/lib/sinatra.rb +2 -0
- data/sinatra.gemspec +38 -33
- metadata +32 -24
- data/README.de.md +0 -3239
- data/README.es.md +0 -3231
- data/README.fr.md +0 -3111
- data/README.hu.md +0 -728
- data/README.ja.md +0 -2844
- data/README.ko.md +0 -2967
- data/README.malayalam.md +0 -3141
- data/README.pt-br.md +0 -3787
- data/README.pt-pt.md +0 -791
- data/README.ru.md +0 -3207
- data/README.zh.md +0 -2934
data/Rakefile
CHANGED
@@ -1,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake/clean'
|
2
4
|
require 'rake/testtask'
|
3
5
|
require 'fileutils'
|
4
6
|
require 'date'
|
5
7
|
|
6
|
-
task :
|
7
|
-
task :
|
8
|
+
task default: :test
|
9
|
+
task spec: :test
|
8
10
|
|
9
|
-
CLEAN.include
|
11
|
+
CLEAN.include '**/*.rbc'
|
10
12
|
|
11
13
|
def source_version
|
12
|
-
@source_version ||= File.read(File.expand_path(
|
14
|
+
@source_version ||= File.read(File.expand_path('VERSION', __dir__)).strip
|
13
15
|
end
|
14
16
|
|
15
17
|
def prev_feature
|
@@ -17,32 +19,28 @@ def prev_feature
|
|
17
19
|
end
|
18
20
|
|
19
21
|
def prev_version
|
20
|
-
return prev_feature
|
22
|
+
return "#{prev_feature}.0" if source_version.end_with? '.0'
|
23
|
+
|
21
24
|
source_version.gsub(/\d+$/) { |s| s.to_i - 1 }
|
22
25
|
end
|
23
26
|
|
24
27
|
# SPECS ===============================================================
|
25
28
|
|
26
|
-
task :test do
|
27
|
-
ENV['LANG'] = 'C'
|
28
|
-
ENV.delete 'LC_CTYPE'
|
29
|
-
end
|
30
|
-
|
31
29
|
Rake::TestTask.new(:test) do |t|
|
32
30
|
t.test_files = FileList['test/*_test.rb']
|
33
31
|
t.ruby_opts = ['-r rubygems'] if defined? Gem
|
34
|
-
t.ruby_opts << '-I.'
|
35
32
|
t.warning = true
|
36
33
|
end
|
37
34
|
|
38
|
-
Rake::TestTask.new(:
|
39
|
-
core_tests = %w[
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
t.
|
35
|
+
Rake::TestTask.new(:'test:core') do |t|
|
36
|
+
core_tests = %w[
|
37
|
+
base delegator encoding extensions filter
|
38
|
+
helpers mapped_error middleware rdoc
|
39
|
+
readme request response result route_added_hook
|
40
|
+
routing server settings sinatra static templates
|
41
|
+
]
|
42
|
+
t.test_files = core_tests.map { |n| "test/#{n}_test.rb" }
|
43
|
+
t.ruby_opts = ['-r rubygems'] if defined? Gem
|
46
44
|
t.warning = true
|
47
45
|
end
|
48
46
|
|
@@ -51,7 +49,7 @@ end
|
|
51
49
|
namespace :test do
|
52
50
|
desc 'Measures test coverage'
|
53
51
|
task :coverage do
|
54
|
-
rm_f
|
52
|
+
rm_f 'coverage'
|
55
53
|
ENV['COVERAGE'] = '1'
|
56
54
|
Rake::Task['test'].invoke
|
57
55
|
end
|
@@ -60,26 +58,26 @@ end
|
|
60
58
|
# Website =============================================================
|
61
59
|
|
62
60
|
desc 'Generate RDoc under doc/api'
|
63
|
-
task 'doc'
|
64
|
-
task('doc:api') { sh
|
61
|
+
task 'doc' => ['doc:api']
|
62
|
+
task('doc:api') { sh 'yardoc -o doc/api' }
|
65
63
|
CLEAN.include 'doc/api'
|
66
64
|
|
67
65
|
# README ===============================================================
|
68
66
|
|
69
|
-
task :add_template, [:name] do |
|
67
|
+
task :add_template, [:name] do |_t, args|
|
70
68
|
Dir.glob('README.*') do |file|
|
71
69
|
code = File.read(file)
|
72
70
|
if code =~ /^===.*#{args.name.capitalize}/
|
73
71
|
puts "Already covered in #{file}"
|
74
72
|
else
|
75
|
-
template = code[
|
76
|
-
if
|
77
|
-
puts "Liquid not found in #{file}"
|
78
|
-
else
|
73
|
+
template = code[%r{===[^\n]*Liquid.*index\.liquid</tt>[^\n]*}m]
|
74
|
+
if template
|
79
75
|
puts "Adding section to #{file}"
|
80
76
|
template = template.gsub(/Liquid/, args.name.capitalize).gsub(/liquid/, args.name.downcase)
|
81
77
|
code.gsub! /^(\s*===.*CoffeeScript)/, "\n" << template << "\n\\1"
|
82
|
-
File.open(file,
|
78
|
+
File.open(file, 'w') { |f| f << code }
|
79
|
+
else
|
80
|
+
puts "Liquid not found in #{file}"
|
83
81
|
end
|
84
82
|
end
|
85
83
|
end
|
@@ -87,29 +85,31 @@ end
|
|
87
85
|
|
88
86
|
# Thanks in announcement ===============================================
|
89
87
|
|
90
|
-
team = [
|
91
|
-
desc
|
92
|
-
task :thanks, ['release:all', :backports] do |
|
93
|
-
a.with_defaults :
|
94
|
-
|
88
|
+
team = ['Ryan Tomayko', 'Blake Mizerany', 'Simon Rozet', 'Konstantin Haase', 'Zachary Scott']
|
89
|
+
desc 'list of contributors'
|
90
|
+
task :thanks, ['release:all', :backports] do |_t, a|
|
91
|
+
a.with_defaults release: "#{prev_version}..HEAD",
|
92
|
+
backports: "#{prev_feature}.0..#{prev_feature}.x"
|
93
|
+
|
95
94
|
included = `git log --format=format:"%aN\t%s" #{a.release}`.lines.map { |l| l.force_encoding('binary') }
|
96
95
|
excluded = `git log --format=format:"%aN\t%s" #{a.backports}`.lines.map { |l| l.force_encoding('binary') }
|
97
96
|
commits = (included - excluded).group_by { |c| c[/^[^\t]+/] }
|
98
97
|
authors = commits.keys.sort_by { |n| - commits[n].size } - team
|
99
|
-
puts authors[0..-2].join(', ') <<
|
100
|
-
|
98
|
+
puts authors[0..-2].join(', ') << ' and ' << authors.last,
|
99
|
+
"(based on commits included in #{a.release}, but not in #{a.backports})"
|
101
100
|
end
|
102
101
|
|
103
|
-
desc
|
104
|
-
task :authors, [:commit_range, :format, :sep] do |
|
105
|
-
a.with_defaults :
|
102
|
+
desc 'list of authors'
|
103
|
+
task :authors, [:commit_range, :format, :sep] do |_t, a|
|
104
|
+
a.with_defaults format: '%s (%d)', sep: ', ', commit_range: '--all'
|
106
105
|
authors = Hash.new(0)
|
107
|
-
blake =
|
106
|
+
blake = 'Blake Mizerany'
|
108
107
|
overall = 0
|
109
108
|
mapping = {
|
110
|
-
|
111
|
-
|
112
|
-
|
109
|
+
'blake.mizerany@gmail.com' => blake, 'bmizerany' => blake,
|
110
|
+
'a_user@mac.com' => blake, 'ichverstehe' => 'Harry Vangberg',
|
111
|
+
'Wu Jiang (nouse)' => 'Wu Jiang'
|
112
|
+
}
|
113
113
|
`git shortlog -s #{a.commit_range}`.lines.map do |line|
|
114
114
|
line = line.force_encoding 'binary' if line.respond_to? :force_encoding
|
115
115
|
num, name = line.split("\t", 2).map(&:strip)
|
@@ -117,18 +117,18 @@ task :authors, [:commit_range, :format, :sep] do |t, a|
|
|
117
117
|
overall += num.to_i
|
118
118
|
end
|
119
119
|
puts "#{overall} commits by #{authors.count} authors:"
|
120
|
-
puts authors.sort_by { |
|
120
|
+
puts authors.sort_by { |_n, c| -c }.map { |e| a.format % e }.join(a.sep)
|
121
121
|
end
|
122
122
|
|
123
|
-
desc
|
124
|
-
task :toc, [:readme] do |
|
125
|
-
a.with_defaults :
|
123
|
+
desc 'generates TOC'
|
124
|
+
task :toc, [:readme] do |_t, a|
|
125
|
+
a.with_defaults readme: 'README.md'
|
126
126
|
|
127
127
|
def self.link(title)
|
128
128
|
title.downcase.gsub(/(?!-)\W /, '-').gsub(' ', '-').gsub(/(?!-)\W/, '')
|
129
129
|
end
|
130
130
|
|
131
|
-
puts
|
131
|
+
puts '* [Sinatra](#sinatra)'
|
132
132
|
title = Regexp.new('(?<=\* )(.*)') # so Ruby 1.8 doesn't complain
|
133
133
|
File.binread(a.readme).scan(/^##.*/) do |line|
|
134
134
|
puts line.gsub(/#(?=#)/, ' ').gsub('#', '*').gsub(title) { "[#{$1}](##{link($1)})" }
|
@@ -139,12 +139,12 @@ end
|
|
139
139
|
|
140
140
|
if defined?(Gem)
|
141
141
|
GEMS_AND_ROOT_DIRECTORIES = {
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
}
|
142
|
+
'sinatra' => '.',
|
143
|
+
'sinatra-contrib' => './sinatra-contrib',
|
144
|
+
'rack-protection' => './rack-protection'
|
145
|
+
}.freeze
|
146
146
|
|
147
|
-
def package(gem, ext='')
|
147
|
+
def package(gem, ext = '')
|
148
148
|
"pkg/#{gem}-#{source_version}" + ext
|
149
149
|
end
|
150
150
|
|
@@ -152,12 +152,12 @@ if defined?(Gem)
|
|
152
152
|
CLOBBER.include('pkg')
|
153
153
|
|
154
154
|
GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
|
155
|
-
file package(gem, '.gem') => [
|
155
|
+
file package(gem, '.gem') => ['pkg/', "#{"#{directory}/#{gem}"}.gemspec"] do |f|
|
156
156
|
sh "cd #{directory} && gem build #{gem}.gemspec"
|
157
|
-
mv directory
|
157
|
+
mv "#{directory}/#{File.basename(f.name)}", f.name
|
158
158
|
end
|
159
159
|
|
160
|
-
file package(gem, '.tar.gz') => [
|
160
|
+
file package(gem, '.tar.gz') => ['pkg/'] do |f|
|
161
161
|
sh <<-SH
|
162
162
|
git archive \
|
163
163
|
--prefix=#{gem}-#{source_version}/ \
|
@@ -168,29 +168,29 @@ if defined?(Gem)
|
|
168
168
|
end
|
169
169
|
|
170
170
|
namespace :package do
|
171
|
-
GEMS_AND_ROOT_DIRECTORIES.each do |gem,
|
171
|
+
GEMS_AND_ROOT_DIRECTORIES.each do |gem, _directory|
|
172
172
|
desc "Build #{gem} packages"
|
173
173
|
task gem => %w[.gem .tar.gz].map { |e| package(gem, e) }
|
174
174
|
end
|
175
175
|
|
176
|
-
desc
|
177
|
-
task :
|
176
|
+
desc 'Build all packages'
|
177
|
+
task all: GEMS_AND_ROOT_DIRECTORIES.keys
|
178
178
|
end
|
179
179
|
|
180
180
|
namespace :install do
|
181
|
-
GEMS_AND_ROOT_DIRECTORIES.each do |gem,
|
181
|
+
GEMS_AND_ROOT_DIRECTORIES.each do |gem, _directory|
|
182
182
|
desc "Build and install #{gem} as local gem"
|
183
183
|
task gem => package(gem, '.gem') do
|
184
184
|
sh "gem install #{package(gem, '.gem')}"
|
185
185
|
end
|
186
186
|
end
|
187
187
|
|
188
|
-
desc
|
189
|
-
task :
|
188
|
+
desc 'Build and install all of the gems as local gems'
|
189
|
+
task all: GEMS_AND_ROOT_DIRECTORIES.keys
|
190
190
|
end
|
191
191
|
|
192
192
|
namespace :release do
|
193
|
-
GEMS_AND_ROOT_DIRECTORIES.each do |gem,
|
193
|
+
GEMS_AND_ROOT_DIRECTORIES.each do |gem, _directory|
|
194
194
|
desc "Release #{gem} as a package"
|
195
195
|
task gem => "package:#{gem}" do
|
196
196
|
sh <<-SH
|
@@ -200,7 +200,7 @@ if defined?(Gem)
|
|
200
200
|
end
|
201
201
|
end
|
202
202
|
|
203
|
-
desc
|
203
|
+
desc 'Commits the version to github repository'
|
204
204
|
task :commit_version do
|
205
205
|
%w[
|
206
206
|
lib/sinatra
|
@@ -219,7 +219,7 @@ if defined?(Gem)
|
|
219
219
|
SH
|
220
220
|
end
|
221
221
|
|
222
|
-
desc
|
223
|
-
task :
|
222
|
+
desc 'Release all gems as packages'
|
223
|
+
task all: %i[test commit_version] + GEMS_AND_ROOT_DIRECTORIES.keys
|
224
224
|
end
|
225
225
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.0.5
|
data/examples/chat.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
#!/usr/bin/env ruby -I ../lib -I lib
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
3
4
|
require_relative 'rainbows'
|
5
|
+
|
4
6
|
require 'sinatra'
|
5
7
|
set :server, :rainbows
|
6
8
|
connections = []
|
7
9
|
|
8
10
|
get '/' do
|
9
11
|
halt erb(:login) unless params[:user]
|
10
|
-
erb :chat, :
|
12
|
+
erb :chat, locals: { user: params[:user].gsub(/\W/, '') }
|
11
13
|
end
|
12
14
|
|
13
|
-
get '/stream', :
|
15
|
+
get '/stream', provides: 'text/event-stream' do
|
14
16
|
stream :keep_open do |out|
|
15
17
|
connections << out
|
16
18
|
out.callback { connections.delete(out) }
|
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