Sinatra 2.0 发布啦!
今天,我很高兴地终于宣布 Sinatra 2.0 发布了!
如果你没有一直关注,这个主要版本更新包含了许多对项目未来至关重要的变化。
在这篇文章中,你将看到完整的细节,包括新功能、移除的功能以及 2.0 版本中包含的所有内容。
在我们开始之前,我要感谢所有为项目做出贡献、帮助测试预发布版本以及持续使用和支持项目的人。
发布版本
Sinatra 2.0 包含以下 gem 的发布版本及其关联版本
sinatra
: v2.0.0sinatra-contrib
: v2.0.0mustermann
: v1.0.0mustermann-contrib
: v1.0.0rack-protection
: v2.0.0
你可以从 rubygems.org 下载所有这些 gem。
主要功能
- 支持 Rack 2.0,不再支持 Rack 1.x
- 支持 Ruby 2.2+,不再支持 Ruby < 2.2
- Sinatra 路由器被替换为 Mustermann
- 与 Rails 5 兼容!:trollface
Sinatra 核心
许多人自 Rails 5 发布 以来,一直在等待 Sinatra 2.0 的预发布版本。
在我们开始介绍更改之前,我想说明一下。
为什么 2.0 版本延迟发布
首先,有大量的荒谬的问题要求发布,数量之多,以至于我真的记不清了,说实话。
我只想说,感谢大家耐心等待,我希望这次发布值得大家等待!
简而言之。
当我承担起发布 Sinatra 2.0 的挑战时,我的目标不仅是提高最低依赖项要求,而且要确保 Sinatra 得到良好的维护,并提供人们对该项目及其之前的维护者所期望的品质。
话虽如此,我希望以下发布的功能和更改能够达到(不仅是我的)所有人的期望。
功能
- 使用 Mustermann 进行模式匹配 PR 由 Konstantin Haase 提交
- 服务器现在提供
-q
标志用于静默模式,该模式禁用启动/停止消息 PR 由 Vasiliy 提交 - 会话中间件现在可以使用
:session_store
设置进行指定 PR 由 Jordan Owens 提交 APP_ENV
现在优先于RACK_ENV
用于设置环境 PR 由 Damien Mathieu 提交- Reel 支持 PR 由 Patricio Mac Adden 提交
变更
此版本还包含以下值得注意的变更。
- 在错误处理期间提供路由参数 PR 由 Jeremy Evans 提交
- 统一
not_found
和error
404 行为 PR 由 Jeremy Evans 提交 - 启用 Ruby 2.3
frozen_string_literal
功能 PR 由 Vladimir Kochnev 提交 - 添加 Sinatra::ShowExceptions::TEMPLATE 和修补的 Rack::ShowExceptions 以优先使用 Sinatra 模板 commit 由 Zachary Scott 提交
- Sinatra::Runner 在内部用于集成测试 PR 由 Nick Sutterer 提交
- 修复
uri
方法中的大小写敏感问题 PR 由 rennex 提交 - 使用
Rack::Utils.status_code
允许status
帮助程序使用符号和数字代码 PR 由 Tobias H. Michaelsen 提交 - 通过 Rack 改进了对无效参数的错误处理 PR 由 Jordan Owens 提交
- 确保模板仅缓存一次 PR 由 Patrik Rak 提交
- 在开发中对经典和模块化应用程序使用相同的
session_secret
PR 由 Marcus Stollsteimer 提交 - 改进会话密钥文档以鼓励更好的安全实践 PR 由 Glenn Rempe 提交
- 公开用于 Mustermann 路由解析的全局和每个路由选项 PR 由 Mike Pastore 提交
- 捕获引发的 NotFound 和 BadRequest 的异常消息 PR 由 Mike Pastore 提交
- 添加
:strict_paths
选项用于管理尾部斜杠 PR 由 namusyaka 提交 - 将完整的 IndifferentHash 实现添加到 params PR 由 Mike Pastore 和 PR 由 John Hope 提交
现在让我们看看 Sinatra 2.0 发布过程中的一些周边工作。
Sinatra::Contrib
这个 gem 提供了一系列有用的扩展,用于可以应用于 Sinatra 应用程序的常见模式。查看 文档 以了解您将获得的内容列表。
对 sinatra-contrib
gem 的最大变化是它现在捆绑在 Sinatra 源代码树中。 Ticket 由 Zachary Scott 提交。
自发布以来,如果您通过 gem 安装,您应该不会注意到任何区别。或者,您可以从源代码安装 gem,如下所示
# Gemfile
github 'sinatra/sinatra' do
gem 'sinatra-contrib'
end
这将获取 sinatra git 源代码 并从树中安装 gem。
此外,我们已经合并了错误跟踪器,您现在可以在 此标签下 找到与 sinatra-contrib
相关的 issue。
功能
以下是 Sinatra::Contrib
中的新功能。
- Sinatra::Contrib 现在捆绑在 Sinatra 源代码树中 PR
- Sinatra::ContentFor 添加了
clear_content_for
方法 PR 由 Ben Darlow 提交 - Sinatra::Namespace 支持 Mustermann PR 由 Vasiliy 和 Jordan Owens (PR) 提交
- Sinatra::RequiredParams 用于允许必需的查询参数 PR 由 Daisuke Taniwaki 提交
- Sinatra::Runner PR 由 Nick Sutterer 提交
- Sinatra::WebDAV PR 由 Yegor Timoshenko 提交,最初由 Mark Bates 提交
- Sinatra::Reloader 添加了
after_reload
钩子,允许在触发时手动重新加载更改 PR 由 Jhimy Fernandes Villar 提交。
变更
以下是一些值得注意的更改,这些更改已包含在该版本中。
- 将规范迁移到 RSpec 3.4 PR 由 Jhimy Fernandes Villar 提交。
- Sinatra::ConfigFile 允许在 YML 文件中使用 ERB 语法 PR 由 Jhimy Fernandes Villar 提交。
- Sinatra::ContentFor 如果未找到指定的键,则渲染给定的块 PR 由 Micah Redding 提交。
- Sinatra::ContentFor 可以像 ActionView 一样生成一个立即值 PR 由 Ryo Nakamura 提交。
- Sinatra::LinkHeader 使用“,\n”(逗号,换行符)作为分隔符 PR 由 petedmarsh 提交。
- Sinatra::Namespace 允许在命名空间中使用
redirect_to
PR 由 Jhimy Fernandes Villar 提交。 - Sinatra::RespondWith 在
LoadError
情况下,从Tilt
中吞下缺少模板的异常 PR 由 Matt Austin 提交。 - Sinatra::RespondWith 现在如果格式化失败,会引发 500 错误 commit。
- 将 Rack::Test 设为开发依赖项 PR 由 Mike Pastore 提交。
- 向 contrib/cookies 添加显式 set 方法,以覆盖 cookie 设置 PR 由 Andrew Allen 提交。
- 即使前缀与其他命名空间匹配,也避免执行过滤器 PR 由 namusyaka 提交。
移除
- 在添加 Mustermann 支持后,Sinatra::Decompile 不再需要 commit 由 Zachary Scott 提交。
Rack::Protection
此 gem 旨在提供多种中间件,以保护您的应用程序免受常见的网络攻击。 请查看 文档 以获取更多信息。
rack-protection
gem 的最大变化是它现在已捆绑在 Sinatra 源代码树中。 PR 由 Zachary Scott 提交。
虽然我必须承认,此 更改 并非 没有 陷阱,但我对过渡期间受到影响的每个人表示歉意。
自发布以来,如果您通过安装 gem,您应该不会注意到。 或者,您可以从源代码安装 gem,如下所示
# Gemfile
github 'sinatra/sinatra' do
gem 'rack-protection'
end
这将获取 sinatra git 源代码 并从树中安装 gem。
此外,我们已经合并了错误跟踪器,您现在可以在 此标签下 找到与 rack-protection
相关的 issue。
功能
以下是 Rack::Protection
中的新功能
- Rack::Protection::ContentSecurityPolicy PR 由 Christian Meier 提交,其中包含 2 级和 3 级指令,由 Glenn Rempe 在 PR 中提交。
- Rack::Protection::HttpOrigin 和 AuthenticityToken 添加了
:allow_if
选项,以指定允许的 URL,由 Nathan Stitt 在 PR 中提交。 - Rack::Protection::CookieTossing 由 Jordan Owens 在 PR 中提交。
- Rack::Protection::AuthenticityToken 防止 BREACH 攻击,由 Jordan Owens 在 PR 中提交。
- 在初始化器中添加了
:without_session
选项,以便轻松跳过基于会话的保护,由 Zachary Scott 在 commit 中提交。
变更
以及以下在发布中进行的显著更改。
- 将空格迁移到 RSpec 3,由 Maurizio De Santis 在 PR 中提交。
- Rack::Protection::StrictTransport 由 Maciej Moleda 在 PR 中提交。
- Rack::Protection::JsonCsrf 在阻止攻击时关闭主体,由 Konstantin Haase 在 PR 中提交。
- 在检查 CSRF 令牌时使用 Rack::Utils.secure_compare,由 Andreas Karlsson 在 commit 中提交。
- Rack::Protection::EscapedParams 确保 Tempfile 未被触碰,由 Albert Engelbrecht 在 PR 中提交。
- 在 Rack:Protection:StrictTransport 中添加了 preload 选项,由 Ed Robinson 在 PR 中提交。
- 添加
allow_if
选项以绕过 json csrf 保护 PR 由 Jordan Owens 提交。
有关完整详细信息,请 比较合并前的差异。
Mustermann
Mustermann 是一个功能强大的库,具有许多功能并兼容 params
解析接口。它将在 Sinatra 2.0 版本中取代现有的路由器。
查看 文档 以获取更多信息。
除了 Mustermann
核心功能和更改(将在下面列出)之外,第一个稳定版本的最大变化是组织上的。
mustermann-everything
gem 已弃用mustermann-contrib
已取代它,包括所有非核心扩展
请查看 PR 以获取包含的插件的完整列表,但我希望从现在开始,此更改将使维护和发布 Mustermann 变得更加简单。
功能
以下是 Mustermann
1.0 版本中的最新功能。
- Rails 模式:添加 Rails 5.0 兼容模式,使其成为默认模式。 commit 由 Konstantin Haase 提交。
- 添加串联支持 (
Mustermann::Pattern#+
)。 commit 由 Konstantin Haase 提交。 - Mustermann::Grape PR 由 namusyaka 提交。
-
实现 ({foo} 的简写 {bar}) 模式 PR 由 namusyaka 提交。 - Sinatra 模式:允许
|
在括号之外 commit 由 Konstantin Haase 提交。 Mustermann::Sinatra#|
现在可以生成 Sinatra 模式,而不是真正的复合模式 commit 由 Konstantin Haase 提交。
变更
以及以下在发布中进行的显著更改。
- 将非核心扩展移至元
mustermann-contrib
gem PR 由 Zachary Scott 提交。 - 将 Tool::EqualityMap 从
tool
gem 移动到 Mustermann::EqualityMap PR 由 Michael Stock 提交。 - 移除路由器(它们不在主要 gem 的范围内)。提交 由 Konstantin Haase 完成。
有关完整详细信息,请比较差异。
总结
最终,该项目仍有更多工作要做,未来一片光明。
在撰写本文时,有近 30 个未解决的问题 和大约 10 个拉取请求。
Sinatra 有很多地方可以改进,虽然我已经添加了一些功能票,但我希望以简要列出其中一些具体领域来结束本文。
日志记录
目前,Sinatra 在幕后使用 Rack::Logger
中间件,并带有一些额外的功能。
此记录器非常基础,我相信我们可以自己构建一个更友好的日志记录 API,这将被证明对处理生产服务更有用。
流式传输
虽然,有一些缺少的功能 被提及,但当这个 API 最初实现时,Rack 的劫持 API 仍未完成。
我不确定最好的路线,但可能从 Rack 层中的某些内容开始 - 就像正在讨论的那样。然后,我们可以在 Sinatra 的 DSL 中提供一个基于此的 API。作为额外奖励,我们可以包装类似 Sinatra::Streaming 的内容,使其真正好用。
异常处理
当前的错误处理实现归结为“handle_exception!”。
在我看来,此方法迫切需要重构,仅仅是糟糕的 API 设计造成的(抱歉)。
我的意思是,它绝对可以改进,也许它是“糟糕的设计”,但嘿,它有效!对吧!
还要看看“error_block!” 和 “dump_errors!”.. 什么!
所有这些以及一个名为 “ShowExceptions” 的中间件,用于以纯文本和/或 html 格式显示错误。
等等,还有更多!
不赘述细节,路由调度(包括前后过滤器)需要改进。此外,@rkh 也提到了想要改进模板 API。
此外,还有一些东西,例如“indifferent_params” 和 “indifferent_hash” 的实现,可以上游到 Ruby 中。
无论如何,这里还有很多东西,以及来自 @rkh 本人的一些很棒的想法,应该会让我们忙上一阵子。
简要介绍一下弃用
在结束这篇文章之前,我想说一句,拜托拜托拜托拜托
如果没有充分的理由,请不要提交 PR 来删除弃用或未分解的代码。
在我们开始考虑版本 2.1
之前,我不会考虑任何这样的更改。
谢谢
无论如何,我希望 Sinatra 2.0 能满足您的所有期望,甚至超出您的期望,并为您的补丁或错误没有包含在发布版本中而道歉。
感谢多年来为这个项目做出贡献的每个人,并继续确保它能够延续下去。
用伟大的纳特·金·科尔的 words,你令人难忘。