Sinatra 2.0 发布啦!

作者:zzak,2017 年 5 月 15 日,星期一

今天,我很高兴地终于宣布 Sinatra 2.0 发布了!

如果你没有一直关注,这个主要版本更新包含了许多对项目未来至关重要的变化。

在这篇文章中,你将看到完整的细节,包括新功能、移除的功能以及 2.0 版本中包含的所有内容。

在我们开始之前,我要感谢所有为项目做出贡献、帮助测试预发布版本以及持续使用和支持项目的人。

发布版本

Sinatra 2.0 包含以下 gem 的发布版本及其关联版本

  • sinatra: v2.0.0
  • sinatra-contrib: v2.0.0
  • mustermann: v1.0.0
  • mustermann-contrib: v1.0.0
  • rack-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 进行模式匹配 PRKonstantin Haase 提交
  • 服务器现在提供 -q 标志用于静默模式,该模式禁用启动/停止消息 PRVasiliy 提交
  • 会话中间件现在可以使用 :session_store 设置进行指定 PRJordan Owens 提交
  • APP_ENV 现在优先于 RACK_ENV 用于设置环境 PRDamien Mathieu 提交
  • Reel 支持 PRPatricio Mac Adden 提交

变更

此版本还包含以下值得注意的变更。

  • 在错误处理期间提供路由参数 PRJeremy Evans 提交
  • 统一 not_founderror 404 行为 PRJeremy Evans 提交
  • 启用 Ruby 2.3 frozen_string_literal 功能 PRVladimir Kochnev 提交
  • 添加 Sinatra::ShowExceptions::TEMPLATE 和修补的 Rack::ShowExceptions 以优先使用 Sinatra 模板 commitZachary Scott 提交
  • Sinatra::Runner 在内部用于集成测试 PRNick Sutterer 提交
  • 修复 uri 方法中的大小写敏感问题 PRrennex 提交
  • 使用 Rack::Utils.status_code 允许 status 帮助程序使用符号和数字代码 PRTobias H. Michaelsen 提交
  • 通过 Rack 改进了对无效参数的错误处理 PRJordan Owens 提交
  • 确保模板仅缓存一次 PRPatrik Rak 提交
  • 在开发中对经典和模块化应用程序使用相同的 session_secret PRMarcus Stollsteimer 提交
  • 改进会话密钥文档以鼓励更好的安全实践 PRGlenn Rempe 提交
  • 公开用于 Mustermann 路由解析的全局和每个路由选项 PRMike Pastore 提交
  • 捕获引发的 NotFound 和 BadRequest 的异常消息 PRMike Pastore 提交
  • 添加 :strict_paths 选项用于管理尾部斜杠 PRnamusyaka 提交
  • 将完整的 IndifferentHash 实现添加到 params PRMike PastorePRJohn Hope 提交

现在让我们看看 Sinatra 2.0 发布过程中的一些周边工作。

Sinatra::Contrib

这个 gem 提供了一系列有用的扩展,用于可以应用于 Sinatra 应用程序的常见模式。查看 文档 以了解您将获得的内容列表。

sinatra-contrib gem 的最大变化是它现在捆绑在 Sinatra 源代码树中。 TicketZachary Scott 提交。

自发布以来,如果您通过 gem 安装,您应该不会注意到任何区别。或者,您可以从源代码安装 gem,如下所示

# Gemfile
github 'sinatra/sinatra' do
  gem 'sinatra-contrib'
end

这将获取 sinatra git 源代码 并从树中安装 gem。

此外,我们已经合并了错误跟踪器,您现在可以在 此标签下 找到与 sinatra-contrib 相关的 issue。

功能

以下是 Sinatra::Contrib 中的新功能。

变更

以下是一些值得注意的更改,这些更改已包含在该版本中。

  • 将规范迁移到 RSpec 3.4 PRJhimy Fernandes Villar 提交。
  • Sinatra::ConfigFile 允许在 YML 文件中使用 ERB 语法 PRJhimy Fernandes Villar 提交。
  • Sinatra::ContentFor 如果未找到指定的键,则渲染给定的块 PRMicah Redding 提交。
  • Sinatra::ContentFor 可以像 ActionView 一样生成一个立即值 PRRyo Nakamura 提交。
  • Sinatra::LinkHeader 使用“,\n”(逗号,换行符)作为分隔符 PRpetedmarsh 提交。
  • Sinatra::Namespace 允许在命名空间中使用 redirect_to PRJhimy Fernandes Villar 提交。
  • Sinatra::RespondWith 在 LoadError 情况下,从 Tilt 中吞下缺少模板的异常 PRMatt Austin 提交。
  • Sinatra::RespondWith 现在如果格式化失败,会引发 500 错误 commit
  • 将 Rack::Test 设为开发依赖项 PRMike Pastore 提交。
  • 向 contrib/cookies 添加显式 set 方法,以覆盖 cookie 设置 PRAndrew Allen 提交。
  • 即使前缀与其他命名空间匹配,也避免执行过滤器 PRnamusyaka 提交。

移除

  • 在添加 Mustermann 支持后,Sinatra::Decompile 不再需要 commitZachary Scott 提交。

有关完整详细信息,请 比较合并前的差异里程碑

Rack::Protection

此 gem 旨在提供多种中间件,以保护您的应用程序免受常见的网络攻击。 请查看 文档 以获取更多信息。

rack-protection gem 的最大变化是它现在已捆绑在 Sinatra 源代码树中。 PRZachary Scott 提交。

虽然我必须承认, 更改 并非 没有 陷阱,但我对过渡期间受到影响的每个人表示歉意。

自发布以来,如果您通过安装 gem,您应该不会注意到。 或者,您可以从源代码安装 gem,如下所示

# Gemfile
github 'sinatra/sinatra' do
  gem 'rack-protection'
end

这将获取 sinatra git 源代码 并从树中安装 gem。

此外,我们已经合并了错误跟踪器,您现在可以在 此标签下 找到与 rack-protection 相关的 issue。

功能

以下是 Rack::Protection 中的新功能

  • Rack::Protection::ContentSecurityPolicy PRChristian Meier 提交,其中包含 2 级和 3 级指令,由 Glenn RempePR 中提交。
  • Rack::Protection::HttpOrigin 和 AuthenticityToken 添加了 :allow_if 选项,以指定允许的 URL,由 Nathan StittPR 中提交。
  • Rack::Protection::CookieTossing 由 Jordan OwensPR 中提交。
  • Rack::Protection::AuthenticityToken 防止 BREACH 攻击,由 Jordan OwensPR 中提交。
  • 在初始化器中添加了 :without_session 选项,以便轻松跳过基于会话的保护,由 Zachary Scottcommit 中提交。

变更

以及以下在发布中进行的显著更改。

  • 将空格迁移到 RSpec 3,由 Maurizio De SantisPR 中提交。
  • Rack::Protection::StrictTransport 由 Maciej MoledaPR 中提交。
  • Rack::Protection::JsonCsrf 在阻止攻击时关闭主体,由 Konstantin HaasePR 中提交。
  • 在检查 CSRF 令牌时使用 Rack::Utils.secure_compare,由 Andreas Karlssoncommit 中提交。
  • Rack::Protection::EscapedParams 确保 Tempfile 未被触碰,由 Albert EngelbrechtPR 中提交。
  • 在 Rack:Protection:StrictTransport 中添加了 preload 选项,由 Ed RobinsonPR 中提交。
  • 添加 allow_if 选项以绕过 json csrf 保护 PRJordan Owens 提交。

有关完整详细信息,请 比较合并前的差异

Mustermann

Mustermann 是一个功能强大的库,具有许多功能并兼容 params 解析接口。它将在 Sinatra 2.0 版本中取代现有的路由器。

查看 文档 以获取更多信息。

除了 Mustermann 核心功能和更改(将在下面列出)之外,第一个稳定版本的最大变化是组织上的。

  • mustermann-everything gem 已弃用
  • mustermann-contrib 已取代它,包括所有非核心扩展

请查看 PR 以获取包含的插件的完整列表,但我希望从现在开始,此更改将使维护和发布 Mustermann 变得更加简单。

功能

以下是 Mustermann 1.0 版本中的最新功能。

变更

以及以下在发布中进行的显著更改。

  • 将非核心扩展移至元 mustermann-contrib gem PRZachary Scott 提交。
  • 将 Tool::EqualityMap 从 tool gem 移动到 Mustermann::EqualityMap PRMichael 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,你令人难忘