gitlab/Gemfile

542 lines
13 KiB
Ruby
Raw Permalink Normal View History

# frozen_string_literal: true
2016-07-02 01:14:12 +02:00
source 'https://rubygems.org'
2011-10-08 23:36:38 +02:00
gem 'rails', '~> 6.1.4.1'
2015-11-25 17:18:44 +01:00
gem 'bootsnap', '~> 1.9.1', require: false
2015-11-25 17:18:44 +01:00
# Responders respond_to and respond_with
2019-10-22 23:25:51 +02:00
gem 'responders', '~> 3.0'
gem 'sprockets', '~> 3.7.0'
# Default values for AR models
gem 'default_value_for', '~> 3.4.0'
2012-06-20 12:45:26 +02:00
# Supported DBs
gem 'pg', '~> 1.1'
2012-06-20 12:45:26 +02:00
gem 'rugged', '~> 1.2'
gem 'grape-path-helpers', '~> 1.7.0'
gem 'faraday', '~> 1.0'
gem 'marginalia', '~> 1.10.0'
2017-04-12 03:29:30 +02:00
# Authorization
2021-11-05 13:02:38 +01:00
gem 'declarative_policy', '~> 1.1.0'
2015-06-30 21:25:36 +02:00
# Authentication libraries
gem 'devise', '~> 4.7.2'
gem 'bcrypt', '~> 3.1', '>= 3.1.14'
gem 'doorkeeper', '~> 5.5.0.rc2'
gem 'doorkeeper-openid_connect', '~> 1.7.5'
2021-04-08 09:52:02 +02:00
gem 'rexml', '~> 3.2.5'
gem 'ruby-saml', '~> 1.13.0'
2018-03-15 08:38:01 +01:00
gem 'omniauth', '~> 1.8'
gem 'omniauth-auth0', '~> 2.0.0'
gem 'omniauth-azure-activedirectory-v2', '~> 1.0'
gem 'omniauth-azure-oauth2', '~> 0.0.9' # Deprecated v1 version
gem 'omniauth-cas3', '~> 1.1.4'
2017-02-08 19:41:27 +01:00
gem 'omniauth-facebook', '~> 4.0.0'
2020-02-14 22:53:52 +01:00
gem 'omniauth-github', '~> 1.4'
2017-02-08 19:41:27 +01:00
gem 'omniauth-gitlab', '~> 1.0.2'
gem 'omniauth-google-oauth2', '~> 0.6.0'
2017-02-08 19:41:27 +01:00
gem 'omniauth-kerberos', '~> 0.3.0', group: :kerberos
gem 'omniauth-oauth2-generic', '~> 0.2.2'
2018-03-15 09:20:51 +01:00
gem 'omniauth-saml', '~> 1.10'
gem 'omniauth-shibboleth', '~> 1.3.0'
2018-03-20 07:52:10 +01:00
gem 'omniauth-twitter', '~> 1.4'
gem 'omniauth_crowd', '~> 2.4.0'
2018-05-24 20:08:16 +02:00
gem 'omniauth-authentiq', '~> 0.3.3'
gem 'gitlab-omniauth-openid-connect', '~> 0.8.0', require: 'omniauth_openid_connect'
gem 'omniauth-salesforce', '~> 1.0.5'
gem 'omniauth-atlassian-oauth2', '~> 0.2.0'
gem 'rack-oauth2', '~> 1.16.0'
gem 'jwt', '~> 2.1.0'
2017-07-20 19:09:11 +02:00
# Kerberos authentication. EE-only
gem 'gssapi', group: :kerberos
2012-06-20 12:45:26 +02:00
# Spam and anti-bot protection
2018-11-16 08:34:16 +01:00
gem 'recaptcha', '~> 4.11', require: 'recaptcha/rails'
gem 'akismet', '~> 3.0'
gem 'invisible_captcha', '~> 1.1.0'
2015-03-27 23:35:26 +01:00
# Two-factor authentication
gem 'devise-two-factor', '~> 4.0.0'
2015-08-26 03:42:46 +02:00
gem 'rqrcode-rails3', '~> 0.1.7'
gem 'attr_encrypted', '~> 3.1.0'
gem 'u2f', '~> 0.2.1'
2015-03-27 23:35:26 +01:00
2016-02-09 18:06:55 +01:00
# GitLab Pages
gem 'validates_hostname', '~> 1.0.11'
gem 'rubyzip', '~> 2.0.0', require: 'zip'
# GitLab Pages letsencrypt support
gem 'acme-client', '~> 2.0', '>= 2.0.6'
2016-02-09 18:06:55 +01:00
# Browser detection
2020-07-13 12:41:30 +02:00
gem 'browser', '~> 4.2'
# OS detection for usage ping
gem 'ohai', '~> 16.10'
2017-02-15 01:01:30 +01:00
# GPG
2019-11-13 10:53:35 +01:00
gem 'gpgme', '~> 2.0.19'
2017-02-15 01:01:30 +01:00
# LDAP Auth
# GitLab fork with several improvements to original library. For full list of changes
# see https://github.com/intridea/omniauth-ldap/compare/master...gitlabhq:master
gem 'gitlab_omniauth-ldap', '~> 2.1.1', require: 'omniauth-ldap'
gem 'net-ldap', '~> 0.16.3'
2012-08-11 21:59:56 +02:00
# API
gem 'grape', '~> 1.5.2'
gem 'grape-entity', '~> 0.10.0'
gem 'rack-cors', '~> 1.0.6', require: 'rack/cors'
2012-08-11 21:59:56 +02:00
2017-08-16 15:04:41 +02:00
# GraphQL API
gem 'graphql', '~> 1.11.8'
# NOTE: graphiql-rails v1.5+ doesn't work: https://gitlab.com/gitlab-org/gitlab/issues/31771
# TODO: remove app/views/graphiql/rails/editors/show.html.erb when https://github.com/rmosolgo/graphiql-rails/pull/71 is released:
# https://gitlab.com/gitlab-org/gitlab/issues/31747
gem 'graphiql-rails', '~> 1.4.10'
gem 'apollo_upload_server', '~> 2.1.0'
gem 'graphql-docs', '~> 1.6.0', group: [:development, :test]
gem 'graphlient', '~> 0.4.0' # Used by BulkImport feature (group::import)
2017-08-16 15:04:41 +02:00
gem 'hashie'
# Disable strong_params so that Mash does not respond to :permitted?
gem 'hashie-forbidden_attributes'
2012-08-11 21:59:56 +02:00
# Pagination
gem 'kaminari', '~> 1.0'
2012-08-11 21:59:56 +02:00
# HAML
gem 'hamlit', '~> 2.15.0'
2012-08-11 21:59:56 +02:00
# Files attachments
gem 'carrierwave', '~> 1.3'
2020-10-06 15:03:18 +02:00
gem 'mini_magick', '~> 4.10.1'
2013-07-08 08:47:31 +02:00
# for backups
gem 'fog-aws', '~> 3.12'
# Locked until fog-google resolves https://github.com/fog/fog-google/issues/421.
# Also see config/initializers/fog_core_patch.rb.
gem 'fog-core', '= 2.1.0'
gem 'fog-google', '~> 1.15', require: 'fog/google'
gem 'fog-local', '~> 0.6'
gem 'fog-openstack', '~> 1.0'
gem 'fog-rackspace', '~> 0.1.1'
gem 'fog-aliyun', '~> 0.3'
gem 'gitlab-fog-azure-rm', '~> 1.2.0', require: 'fog/azurerm'
# for Google storage
gem 'google-api-client', '~> 0.33'
2013-05-01 11:41:37 +02:00
# for aws storage
2016-07-02 01:14:12 +02:00
gem 'unf', '~> 0.1.4'
2012-08-11 21:59:56 +02:00
# Seed data
gem 'seed-fu', '~> 2.3.7'
2012-08-11 21:59:56 +02:00
# Search
gem 'elasticsearch-model', '~> 6.1'
gem 'elasticsearch-rails', '~> 6.1', require: 'elasticsearch/rails/instrumentation'
gem 'elasticsearch-api', '~> 6.8.2'
gem 'aws-sdk-core', '~> 3'
gem 'aws-sdk-cloudformation', '~> 1'
gem 'aws-sdk-s3', '~> 1'
gem 'faraday_middleware-aws-sigv4', '~>0.3.0'
2015-04-29 21:02:41 +02:00
# Markdown and HTML processing
gem 'html-pipeline', '~> 2.13.2'
gem 'deckar01-task_list', '2.3.1'
gem 'gitlab-markup', '~> 1.7.1'
gem 'github-markup', '~> 1.7.0', require: 'github/markup'
gem 'commonmarker', '~> 0.23.2'
gem 'kramdown', '~> 2.3.1'
2017-02-08 19:41:27 +01:00
gem 'RedCloth', '~> 4.3.2'
gem 'rdoc', '~> 6.3.2'
2017-02-08 19:41:27 +01:00
gem 'org-ruby', '~> 0.9.12'
gem 'creole', '~> 0.5.0'
gem 'wikicloth', '0.8.1'
gem 'asciidoctor', '~> 2.0.10'
gem 'asciidoctor-include-ext', '~> 0.3.1', require: false
gem 'asciidoctor-plantuml', '~> 0.0.12'
gem 'asciidoctor-kroki', '~> 0.5.0', require: false
gem 'rouge', '~> 3.26.1'
gem 'truncato', '~> 0.7.11'
gem 'bootstrap_form', '~> 4.2.0'
gem 'nokogiri', '~> 1.11.4'
gem 'escape_utils', '~> 1.1'
# Calendar rendering
gem 'icalendar'
2014-04-15 17:02:02 +02:00
# Diffs
2020-02-23 09:52:25 +01:00
gem 'diffy', '~> 3.3'
gem 'diff_match_patch', '~> 0.1.0'
2014-04-15 17:02:02 +02:00
# Application server
gem 'rack', '~> 2.2.3'
# https://github.com/sharpstone/rack-timeout/blob/master/README.md#rails-apps-manually
gem 'rack-timeout', '~> 0.5.1', require: 'rack/timeout/base'
group :puma do
gem 'puma', '~> 5.3.1', require: false
gem 'puma_worker_killer', '~> 0.3.1', require: false
gem 'sd_notify', '~> 0.1.0', require: false
end
2013-02-14 16:33:20 +01:00
# State machine
gem 'state_machines-activerecord', '~> 0.8.0'
2013-02-14 16:33:20 +01:00
2012-08-11 21:59:56 +02:00
# Issue tags
gem 'acts-as-taggable-on', '~> 7.0'
2012-08-11 21:59:56 +02:00
# Background jobs
gem 'sidekiq', '~> 6.2.2'
gem 'sidekiq-cron', '~> 1.0'
gem 'redis-namespace', '~> 1.8.1'
gem 'gitlab-sidekiq-fetcher', '0.8.0', require: 'sidekiq-reliable-fetch'
2012-08-11 21:59:56 +02:00
2017-03-29 15:22:40 +02:00
# Cron Parser
gem 'fugit', '~> 1.2.1'
2017-03-29 15:22:40 +02:00
2012-08-11 21:59:56 +02:00
# HTTP requests
gem 'httparty', '~> 0.16.4'
2012-08-11 21:59:56 +02:00
# Colored output to console
gem 'rainbow', '~> 3.0'
2012-08-11 21:59:56 +02:00
# Progress bar
gem 'ruby-progressbar', '~> 1.10'
2012-11-18 21:51:49 +01:00
# GitLab settings
2015-08-26 03:42:46 +02:00
gem 'settingslogic', '~> 2.0.9'
2011-11-04 08:42:36 +01:00
# Linear-time regex library for untrusted regular expressions
gem 're2', '~> 1.2.0'
2012-08-11 21:59:56 +02:00
# Misc
2015-08-26 03:42:46 +02:00
gem 'version_sorter', '~> 2.2.4'
2012-08-11 21:59:56 +02:00
# Export Ruby Regex to Javascript
gem 'js_regex', '~> 3.7'
2018-05-02 10:08:16 +02:00
# User agent parsing
gem 'device_detector'
# Redis
gem 'redis', '~> 4.4.0'
gem 'connection_pool', '~> 2.0'
# Redis session store
gem 'redis-actionpack', '~> 5.2.0'
2018-10-30 12:23:20 +01:00
# Discord integration
gem 'discordrb-webhooks', '~> 3.4', require: false
2018-10-30 12:23:20 +01:00
# Jira integration
gem 'jira-ruby', '~> 2.1.4'
gem 'atlassian-jwt', '~> 0.2.0'
2016-01-14 15:20:23 +01:00
# Flowdock integration
gem 'flowdock', '~> 0.7'
2014-03-18 18:27:03 +01:00
# Slack integration
gem 'slack-messenger', '~> 2.3.4'
2014-03-18 18:27:03 +01:00
# Hangouts Chat integration
gem 'hangouts-chat', '~> 0.0.5', require: 'hangouts_chat'
# Asana integration
gem 'asana', '~> 0.10.3'
2015-08-05 00:21:12 +02:00
# FogBugz integration
2015-09-15 22:09:32 +02:00
gem 'ruby-fogbugz', '~> 0.2.1'
2015-08-05 00:21:12 +02:00
# Kubernetes integration
2021-07-09 09:56:12 +02:00
gem 'kubeclient', '~> 4.9.2'
2013-07-10 12:48:03 +02:00
# Sanitize user input
gem 'sanitize', '~> 5.2.1'
gem 'babosa', '~> 1.0.4'
2013-07-10 12:48:03 +02:00
# Sanitizes SVG input
gem 'loofah', '~> 2.2'
# Working with license
gem 'licensee', '~> 9.14.1'
# Detect and convert string character encoding
gem 'charlock_holmes', '~> 0.7.7'
# Detect mime content type from content
gem 'ruby-magic', '~> 0.4'
# Faster blank
gem 'fast_blank'
# Parse time & duration
gem 'gitlab-chronic', '~> 0.10.5'
gem 'gitlab_chronic_duration', '~> 0.10.6.2'
2016-05-18 22:21:51 +02:00
gem 'rack-proxy', '~> 0.6.0'
gem 'sassc-rails', '~> 2.1.0'
2021-07-08 18:26:21 +02:00
gem 'autoprefixer-rails', '10.2.5.1'
gem 'terser', '1.0.2'
gem 'addressable', '~> 2.8'
gem 'tanuki_emoji', '~> 0.5'
gem 'gon', '~> 6.4.0'
gem 'request_store', '~> 1.5'
2017-02-08 19:41:27 +01:00
gem 'base32', '~> 0.3.0'
2017-07-13 12:25:43 +02:00
gem 'gitlab-license', '~> 2.0'
2011-10-08 23:36:38 +02:00
# Protect against bruteforcing
gem 'rack-attack', '~> 6.3.0'
# Sentry integration
gem 'sentry-raven', '~> 3.1'
# PostgreSQL query parsing
#
gem 'pg_query', '~> 2.1'
gem 'premailer-rails', '~> 1.10.3'
2016-01-28 17:54:13 +01:00
# LabKit: Tracing and Correlation
gem 'gitlab-labkit', '~> 0.21.1'
# Thrift is a dependency of gitlab-labkit, we want a version higher than 0.14.0
# because of https://gitlab.com/gitlab-org/gitlab/-/issues/321900
gem 'thrift', '>= 0.14.0'
2017-04-13 05:41:46 +02:00
# I18n
gem 'ruby_parser', '~> 3.15', require: false
gem 'rails-i18n', '~> 6.0'
2017-04-13 05:41:46 +02:00
gem 'gettext_i18n_rails', '~> 1.8.0'
gem 'gettext_i18n_rails_js', '~> 1.3'
gem 'gettext', '~> 3.3', require: false, group: :development
2017-04-13 05:41:46 +02:00
gem 'batch-loader', '~> 2.0.1'
# Perf bar
gem 'peek', '~> 1.1'
# Snowplow events tracking
gem 'snowplow-tracker', '~> 0.6.1'
Storing of application metrics in InfluxDB This adds the ability to write application metrics (e.g. SQL timings) to InfluxDB. These metrics can in turn be visualized using Grafana, or really anything else that can read from InfluxDB. These metrics can be used to track application performance over time, between different Ruby versions, different GitLab versions, etc. == Transaction Metrics Currently the following is tracked on a per transaction basis (a transaction is a Rails request or a single Sidekiq job): * Timings per query along with the raw (obfuscated) SQL and information about what file the query originated from. * Timings per view along with the path of the view and information about what file triggered the rendering process. * The duration of a request itself along with the controller/worker class and method name. * The duration of any instrumented method calls (more below). == Sampled Metrics Certain metrics can't be directly associated with a transaction. For example, a process' total memory usage is unrelated to any running transactions. While a transaction can result in the memory usage going up there's no accurate way to determine what transaction is to blame, this becomes especially problematic in multi-threaded environments. To solve this problem there's a separate thread that takes samples at a fixed interval. This thread (using the class Gitlab::Metrics::Sampler) currently tracks the following: * The process' total memory usage. * The number of file descriptors opened by the process. * The amount of Ruby objects (using ObjectSpace.count_objects). * GC statistics such as timings, heap slots, etc. The default/current interval is 15 seconds, any smaller interval might put too much pressure on InfluxDB (especially when running dozens of processes). == Method Instrumentation While currently not yet used methods can be instrumented to track how long they take to run. Unlike the likes of New Relic this doesn't require modifying the source code (e.g. including modules), it all happens from the outside. For example, to track `User.by_login` we'd add the following code somewhere in an initializer: Gitlab::Metrics::Instrumentation. instrument_method(User, :by_login) to instead instrument an instance method: Gitlab::Metrics::Instrumentation. instrument_instance_method(User, :save) Instrumentation for either all public model methods or a few crucial ones will be added in the near future, I simply haven't gotten to doing so just yet. == Configuration By default metrics are disabled. This means users don't have to bother setting anything up if they don't want to. Metrics can be enabled by editing one's gitlab.yml configuration file (see config/gitlab.yml.example for example settings). == Writing Data To InfluxDB Because InfluxDB is still a fairly young product I expect the worse. Data loss, unexpected reboots, the database not responding, you name it. Because of this data is _not_ written to InfluxDB directly, instead it's queued and processed by Sidekiq. This ensures that users won't notice anything when InfluxDB is giving trouble. The metrics worker can be started in a standalone manner as following: bundle exec sidekiq -q metrics The corresponding class is called MetricsWorker.
2015-12-09 16:45:51 +01:00
# Metrics
gem 'method_source', '~> 1.0', require: false
gem 'webrick', '~> 1.6.1', require: false
gem 'prometheus-client-mmap', '~> 0.15.0', require: 'prometheus/client'
Storing of application metrics in InfluxDB This adds the ability to write application metrics (e.g. SQL timings) to InfluxDB. These metrics can in turn be visualized using Grafana, or really anything else that can read from InfluxDB. These metrics can be used to track application performance over time, between different Ruby versions, different GitLab versions, etc. == Transaction Metrics Currently the following is tracked on a per transaction basis (a transaction is a Rails request or a single Sidekiq job): * Timings per query along with the raw (obfuscated) SQL and information about what file the query originated from. * Timings per view along with the path of the view and information about what file triggered the rendering process. * The duration of a request itself along with the controller/worker class and method name. * The duration of any instrumented method calls (more below). == Sampled Metrics Certain metrics can't be directly associated with a transaction. For example, a process' total memory usage is unrelated to any running transactions. While a transaction can result in the memory usage going up there's no accurate way to determine what transaction is to blame, this becomes especially problematic in multi-threaded environments. To solve this problem there's a separate thread that takes samples at a fixed interval. This thread (using the class Gitlab::Metrics::Sampler) currently tracks the following: * The process' total memory usage. * The number of file descriptors opened by the process. * The amount of Ruby objects (using ObjectSpace.count_objects). * GC statistics such as timings, heap slots, etc. The default/current interval is 15 seconds, any smaller interval might put too much pressure on InfluxDB (especially when running dozens of processes). == Method Instrumentation While currently not yet used methods can be instrumented to track how long they take to run. Unlike the likes of New Relic this doesn't require modifying the source code (e.g. including modules), it all happens from the outside. For example, to track `User.by_login` we'd add the following code somewhere in an initializer: Gitlab::Metrics::Instrumentation. instrument_method(User, :by_login) to instead instrument an instance method: Gitlab::Metrics::Instrumentation. instrument_instance_method(User, :save) Instrumentation for either all public model methods or a few crucial ones will be added in the near future, I simply haven't gotten to doing so just yet. == Configuration By default metrics are disabled. This means users don't have to bother setting anything up if they don't want to. Metrics can be enabled by editing one's gitlab.yml configuration file (see config/gitlab.yml.example for example settings). == Writing Data To InfluxDB Because InfluxDB is still a fairly young product I expect the worse. Data loss, unexpected reboots, the database not responding, you name it. Because of this data is _not_ written to InfluxDB directly, instead it's queued and processed by Sidekiq. This ensures that users won't notice anything when InfluxDB is giving trouble. The metrics worker can be started in a standalone manner as following: bundle exec sidekiq -q metrics The corresponding class is called MetricsWorker.
2015-12-09 16:45:51 +01:00
gem 'warning', '~> 1.2.0'
2011-10-27 21:37:17 +02:00
group :development do
2021-04-08 13:29:22 +02:00
gem 'lefthook', '~> 0.7.0', require: false
2021-08-03 07:00:33 +02:00
gem 'solargraph', '~> 0.43', require: false
2015-08-26 03:42:46 +02:00
gem 'letter_opener_web', '~> 2.0.0'
2013-10-01 14:15:14 +02:00
# Better errors handler
2021-04-08 13:29:22 +02:00
gem 'better_errors', '~> 2.9.0'
# thin instead webrick
2021-02-08 20:15:31 +01:00
gem 'thin', '~> 1.8.0'
gem 'sprite-factory', '~> 1.7'
2011-10-08 23:36:38 +02:00
end
group :development, :test do
gem 'deprecation_toolkit', '~> 1.5.1', require: false
gem 'bullet', '~> 6.1.3'
2021-05-17 06:33:26 +02:00
gem 'pry-byebug'
2020-01-31 11:21:04 +01:00
gem 'pry-rails', '~> 0.3.9'
2021-09-28 14:13:11 +02:00
gem 'pry-shell', '~> 0.5.0'
2015-06-18 00:05:48 +02:00
gem 'awesome_print', require: false
2015-08-26 03:42:46 +02:00
gem 'database_cleaner', '~> 1.7.0'
gem 'factory_bot_rails', '~> 6.2.0'
gem 'rspec-rails', '~> 5.0.1'
2012-09-10 08:26:35 +02:00
# Prevent occasions where minitest is not bundled in packaged versions of ruby (see #3826)
gem 'minitest', '~> 5.11.0'
2013-04-04 09:55:43 +02:00
# Generate Fake data
gem 'ffaker', '~> 2.10'
gem 'spring', '~> 2.1.0'
2017-02-08 19:41:27 +01:00
gem 'spring-commands-rspec', '~> 1.0.4'
2015-08-26 03:42:46 +02:00
gem 'gitlab-styles', '~> 6.4.0', require: false
gem 'haml_lint', '~> 0.36.0', require: false
gem 'bundler-audit', '~> 0.7.0.1', require: false
gem 'benchmark-ips', '~> 2.3.0', require: false
gem 'knapsack', '~> 1.21.1'
gem 'crystalball', '~> 0.7.0', require: false
2017-07-20 17:32:17 +02:00
gem 'simple_po_parser', '~> 1.1.2', require: false
2020-02-29 09:09:44 +01:00
gem 'timecop', '~> 0.9.1'
gem 'png_quantizator', '~> 0.2.1', require: false
gem 'parallel', '~> 1.19', require: false
gem 'rblineprof', '~> 0.3.6', platform: :mri, require: false
gem 'test_file_finder', '~> 0.1.3'
2011-10-08 23:36:38 +02:00
end
group :development, :test, :danger do
gem 'gitlab-dangerfiles', '~> 2.5.0', require: false
end
group :development, :test, :coverage do
gem 'simplecov', '~> 0.18.5', require: false
gem 'simplecov-cobertura', '~> 1.3.1', require: false
end
# Gems required in omnibus-gitlab pipeline
group :development, :test, :omnibus do
gem 'license_finder', '~> 6.0', require: false
end
2011-10-08 23:36:38 +02:00
group :test do
gem 'fuubar', '~> 2.2.0'
gem 'rspec-retry', '~> 0.6.1'
gem 'rspec_profiling', '~> 0.0.6'
gem 'rspec-parameterized', require: false
gem 'capybara', '~> 3.35.3'
gem 'capybara-screenshot', '~> 1.0.22'
2019-11-28 16:19:37 +01:00
gem 'selenium-webdriver', '~> 3.142'
gem 'shoulda-matchers', '~> 4.0.1', require: false
2018-05-26 16:21:20 +02:00
gem 'email_spec', '~> 2.2.0'
gem 'webmock', '~> 3.9.1'
gem 'rails-controller-testing'
gem 'concurrent-ruby', '~> 1.1'
2021-10-06 18:06:14 +02:00
gem 'test-prof', '~> 1.0.7'
2018-08-31 12:22:33 +02:00
gem 'rspec_junit_formatter'
gem 'guard-rspec'
# Moved in `test` because https://gitlab.com/gitlab-org/gitlab/-/issues/217527
gem 'derailed_benchmarks', require: false
2011-10-08 23:36:38 +02:00
end
gem 'octokit', '~> 4.15'
2015-08-19 00:46:36 +02:00
# https://gitlab.com/gitlab-org/gitlab/issues/207207
gem 'gitlab-mail_room', '~> 0.0.9', require: 'mail_room'
2015-08-19 02:02:26 +02:00
gem 'email_reply_trimmer', '~> 0.1'
gem 'html2text'
2015-08-26 03:42:46 +02:00
gem 'ruby-prof', '~> 1.3.0'
gem 'stackprof', '~> 0.2.15', require: false
gem 'rbtrace', '~> 0.4', require: false
2019-05-27 10:30:17 +02:00
gem 'memory_profiler', '~> 0.9', require: false
gem 'benchmark-memory', '~> 0.1', require: false
gem 'activerecord-explain-analyze', '~> 0.1', require: false
2015-08-26 03:42:46 +02:00
# OAuth
gem 'oauth2', '~> 1.4'
2015-08-19 02:02:26 +02:00
# Health check
gem 'health_check', '~> 3.0'
# System information
gem 'vmstat', '~> 2.3.0'
gem 'sys-filesystem', '~> 1.1.6'
# NTP client
gem 'net-ntp'
2017-07-19 15:39:33 +02:00
# SSH host key support
2020-04-24 11:11:02 +02:00
gem 'net-ssh', '~> 6.0'
gem 'sshkey', '~> 2.0'
2017-07-19 15:39:33 +02:00
# Required for ED25519 SSH host key support
group :ed25519 do
gem 'ed25519', '~> 1.2'
2017-07-19 15:39:33 +02:00
gem 'bcrypt_pbkdf', '~> 1.0'
end
Squashed commit of the following: commit a2ef9f1e1c0ae4fd119481a493cf118fb0e2113d Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 29 12:24:51 2021 -0400 Responding to code review comments commit 107845cfcfefe3056bb772a3eeb09d7579faa07f Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 21:42:27 2021 -0400 Add support for Recaptcha and CONDITIONAL_ALLOW commit 82b0f2d5a4cfb5698f01d9c98b43cc6911e1496a Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 21:06:35 2021 -0400 Add GRPC credentials for TLS in production commit 5d569e39feea23a2606d9a2a23d5794251f1e704 Merge: cd12ff5e748 d6fb606a38d Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 17:17:01 2021 -0400 Merge branch '299558-integrate-with-anti-spam-service' of gitlab.com:gitlab-org/gitlab into 299558-integrate-with-anti-spam-service commit cd12ff5e748855c10b90f68394e3be60f82204fc Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 17:12:41 2021 -0400 Addressing code review comments Mostly removed unused or unnecessary code commit f71f72cac863375273eee1360ac2c4497c960e76 Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 16:10:39 2021 -0400 Adding changelog commit d6fb606a38de171b3c3c0347e581c2f7c4bb74aa Author: agroleau <agroleau@gitlab.com> Date: Wed Apr 28 16:10:36 2021 -0400 Integrate Spamcheck gRPC gem into GitLab spam verdict service Introduction of the Security Automation anti-spam engine protobuf gem. Sets up a GRPC channel from the SpamVerdictService to the anti-spam engine. commit 292046c74fdaf5f67c55ef361973835427fd253f Merge: 9058ba98ad6 c1e4eca80ca Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 16:03:03 2021 -0400 Merge branch '299558-integrate-with-anti-spam-service' of gitlab.com:gitlab-org/gitlab into 299558-integrate-with-anti-spam-service commit c1e4eca80ca26b5d0f0f0c28171170213b1ad85d Author: agroleau <agroleau@gitlab.com> Date: Wed Apr 28 14:39:09 2021 -0400 Integrate Spamcheck gRPC gem into GitLab spam verdict service The anti-spam engine, spamcheck, is going to utilize gRPC in production but for now, it provides an HTTP endpoint that accepts and returns JSON. However, the JSON has to be formatted to match the structure of the protocol buffers that will eventually be used. This MR reformats the JSON to match spamcheck's protobufs. commit 9058ba98ad614ad5c610382cecf727fab832bf9c Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Apr 26 14:17:04 2021 -0400 Re-implement rescuing a specific error type commit 4015eebfcc2eebab096ad5f4815f23477ad3388c Merge: d6b5a6ec4c8 ba710a0df6c Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Apr 26 12:57:38 2021 -0400 Merged with master commit d6b5a6ec4c87467cff8e8235cd9a90d21dc50a61 Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Apr 23 12:53:32 2021 -0400 Fix build issues commit 1e43f06fa678263779ec432818e6f4750aca8779 Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Apr 23 10:50:08 2021 -0400 Set spamcheck gem to 0.0.5 from rubygems Refactor `SpamVerdictService` to use the new Spamcheck client class commit 2c5d10fdf0716f7b843ca16abe7d29c54fa7adde Merge: 4cb5cbd1bc4 69594f0851b Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 22 16:53:16 2021 -0400 Merged with master commit 4cb5cbd1bc4ac15429c69d726bb2f649f87cadc8 Merge: 6d7eeb78d98 0dd8c84b74a Author: Ethan Urie <ethan.urie@gmail.com> Date: Tue Apr 20 16:03:46 2021 -0400 Merged with master commit 6d7eeb78d9818320dabf550a8796487f7d3414f8 Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 14 16:14:33 2021 -0400 Fix Ruby 2.7 deprecations commit 863ee96aafe1071c985f74decc59b624a04e507f Merge: 7cfd704de6f 2b6e5caba0d Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 14 08:47:41 2021 -0400 Merge remote-tracking branch 'origin/master' into 299558-integrate-with-anti-spam-service commit 7cfd704de6f915230aacb01d5b45647ebadb66a7 Merge: 50f0fcba818 b49dd8e17b4 Author: Ethan Urie <ethan.urie@gmail.com> Date: Tue Apr 13 15:09:35 2021 -0400 Merged with master commit 50f0fcba818e877e4382677b69b5ed04993da442 Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Apr 9 10:03:37 2021 -0400 Move `spamcheck_client` to `spamcheck` and updated tests commit ee7011fc712f53e88d4d84ef3576bd06723b7314 Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 8 15:02:50 2021 -0400 Capture the user's primary email address commit 324464315216f4759411cb9383457afd9f8255c2 Merge: 1dd4f510955 5dbbb980ac1 Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 8 10:47:24 2021 -0400 Merge branch '299558-integrate-with-anti-spam-service' of https://gitlab.com/gitlab-org/gitlab into 299558-integrate-with-anti-spam-service commit 5dbbb980ac1200e94e757354e484df17b1a7d34d Author: Jayson Salazar <jsalazar@gitlab.com> Date: Thu Apr 8 14:45:46 2021 +0000 Add a BLOCK_USER case to spam_action_service.rb as otherwise the result would be ALLOW for external_verdict='block' commit 1dd4f510955d137b3680d3417fb993781e945418 Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 8 10:44:43 2021 -0400 Set spamcheck branch to master commit ff64700c27f80dc0ee85dd56d5bb77f19a8abacb Author: Jayson Salazar <jsalazar@gitlab.com> Date: Thu Apr 8 14:43:34 2021 +0000 Add a BLOCK_USER case to spam_action_service.rb as otherwise the result would be ALLOW for external_verdict='block' commit f2af0e2833c5176dbd6907340f805a13eb566ed1 Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Mar 10 17:14:15 2021 -0500 Update application settings to support grpc spam check URL commit e016cb86d767f6750d78fa1d4e5b42fc614c0ae1 Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Mar 10 15:26:54 2021 -0500 Created initial SpamcheckClient specs commit ccccc3a682df9ad6730365e3dbca4f22f115cc0b Author: Ethan Urie <ethan.urie@gmail.com> Date: Tue Mar 9 08:41:12 2021 -0500 SpamVerdictService specs are passing, starting client specs commit 1193aeeea5295aea8b81de3a6c05d5975949f5e0 Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Mar 8 14:14:16 2021 -0500 Move verdict mappings into a hash from a method commit f014a98307b765202f784ec2c62dc9ebedbc72bb Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Mar 5 15:31:49 2021 -0500 Updated specs for GRPC commit b40b348702b843bc5d98c45ce01516d7ce60c43d Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Mar 3 14:12:15 2021 -0500 Initial client tests with updated gem files Updated gems and created the first, skeletal tests for the new client code for Spamcheck. commit b55a29c0bf15c0aaacf6fd5b5b6bd1eb8781b323 Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Jan 22 08:36:19 2021 -0500 Reformat JSON message to match the expeted protobuf message commit 8e89d41ccddfdbcc84c8b678c70da7c2a667ed7a Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Feb 25 13:54:16 2021 -0500 Initial client code commit 0e9621825cbf709bf2a5d6c40488ad38e8536be3 Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Feb 22 14:35:03 2021 -0500 Add spamcheck gem to the Gemfile commit 1d70b4e8dd849163321a6319421438579efe85ba Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Feb 1 14:32:08 2021 -0500 Add changes to format to include multiple emails and updated_at commit 9d4b43a234a1f5c4983a6c5d839b8b5a471cb95e Author: Ethan Urie <ethan.urie@gmail.com> Date: Tue Jan 26 14:59:42 2021 -0500 Reformat JSON message to match the expeted protobuf message
2021-04-29 20:51:19 +02:00
# Spamcheck GRPC protocol definitions
gem 'spamcheck', '~> 0.1.0'
Squashed commit of the following: commit a2ef9f1e1c0ae4fd119481a493cf118fb0e2113d Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 29 12:24:51 2021 -0400 Responding to code review comments commit 107845cfcfefe3056bb772a3eeb09d7579faa07f Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 21:42:27 2021 -0400 Add support for Recaptcha and CONDITIONAL_ALLOW commit 82b0f2d5a4cfb5698f01d9c98b43cc6911e1496a Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 21:06:35 2021 -0400 Add GRPC credentials for TLS in production commit 5d569e39feea23a2606d9a2a23d5794251f1e704 Merge: cd12ff5e748 d6fb606a38d Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 17:17:01 2021 -0400 Merge branch '299558-integrate-with-anti-spam-service' of gitlab.com:gitlab-org/gitlab into 299558-integrate-with-anti-spam-service commit cd12ff5e748855c10b90f68394e3be60f82204fc Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 17:12:41 2021 -0400 Addressing code review comments Mostly removed unused or unnecessary code commit f71f72cac863375273eee1360ac2c4497c960e76 Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 16:10:39 2021 -0400 Adding changelog commit d6fb606a38de171b3c3c0347e581c2f7c4bb74aa Author: agroleau <agroleau@gitlab.com> Date: Wed Apr 28 16:10:36 2021 -0400 Integrate Spamcheck gRPC gem into GitLab spam verdict service Introduction of the Security Automation anti-spam engine protobuf gem. Sets up a GRPC channel from the SpamVerdictService to the anti-spam engine. commit 292046c74fdaf5f67c55ef361973835427fd253f Merge: 9058ba98ad6 c1e4eca80ca Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 28 16:03:03 2021 -0400 Merge branch '299558-integrate-with-anti-spam-service' of gitlab.com:gitlab-org/gitlab into 299558-integrate-with-anti-spam-service commit c1e4eca80ca26b5d0f0f0c28171170213b1ad85d Author: agroleau <agroleau@gitlab.com> Date: Wed Apr 28 14:39:09 2021 -0400 Integrate Spamcheck gRPC gem into GitLab spam verdict service The anti-spam engine, spamcheck, is going to utilize gRPC in production but for now, it provides an HTTP endpoint that accepts and returns JSON. However, the JSON has to be formatted to match the structure of the protocol buffers that will eventually be used. This MR reformats the JSON to match spamcheck's protobufs. commit 9058ba98ad614ad5c610382cecf727fab832bf9c Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Apr 26 14:17:04 2021 -0400 Re-implement rescuing a specific error type commit 4015eebfcc2eebab096ad5f4815f23477ad3388c Merge: d6b5a6ec4c8 ba710a0df6c Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Apr 26 12:57:38 2021 -0400 Merged with master commit d6b5a6ec4c87467cff8e8235cd9a90d21dc50a61 Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Apr 23 12:53:32 2021 -0400 Fix build issues commit 1e43f06fa678263779ec432818e6f4750aca8779 Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Apr 23 10:50:08 2021 -0400 Set spamcheck gem to 0.0.5 from rubygems Refactor `SpamVerdictService` to use the new Spamcheck client class commit 2c5d10fdf0716f7b843ca16abe7d29c54fa7adde Merge: 4cb5cbd1bc4 69594f0851b Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 22 16:53:16 2021 -0400 Merged with master commit 4cb5cbd1bc4ac15429c69d726bb2f649f87cadc8 Merge: 6d7eeb78d98 0dd8c84b74a Author: Ethan Urie <ethan.urie@gmail.com> Date: Tue Apr 20 16:03:46 2021 -0400 Merged with master commit 6d7eeb78d9818320dabf550a8796487f7d3414f8 Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 14 16:14:33 2021 -0400 Fix Ruby 2.7 deprecations commit 863ee96aafe1071c985f74decc59b624a04e507f Merge: 7cfd704de6f 2b6e5caba0d Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Apr 14 08:47:41 2021 -0400 Merge remote-tracking branch 'origin/master' into 299558-integrate-with-anti-spam-service commit 7cfd704de6f915230aacb01d5b45647ebadb66a7 Merge: 50f0fcba818 b49dd8e17b4 Author: Ethan Urie <ethan.urie@gmail.com> Date: Tue Apr 13 15:09:35 2021 -0400 Merged with master commit 50f0fcba818e877e4382677b69b5ed04993da442 Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Apr 9 10:03:37 2021 -0400 Move `spamcheck_client` to `spamcheck` and updated tests commit ee7011fc712f53e88d4d84ef3576bd06723b7314 Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 8 15:02:50 2021 -0400 Capture the user's primary email address commit 324464315216f4759411cb9383457afd9f8255c2 Merge: 1dd4f510955 5dbbb980ac1 Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 8 10:47:24 2021 -0400 Merge branch '299558-integrate-with-anti-spam-service' of https://gitlab.com/gitlab-org/gitlab into 299558-integrate-with-anti-spam-service commit 5dbbb980ac1200e94e757354e484df17b1a7d34d Author: Jayson Salazar <jsalazar@gitlab.com> Date: Thu Apr 8 14:45:46 2021 +0000 Add a BLOCK_USER case to spam_action_service.rb as otherwise the result would be ALLOW for external_verdict='block' commit 1dd4f510955d137b3680d3417fb993781e945418 Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Apr 8 10:44:43 2021 -0400 Set spamcheck branch to master commit ff64700c27f80dc0ee85dd56d5bb77f19a8abacb Author: Jayson Salazar <jsalazar@gitlab.com> Date: Thu Apr 8 14:43:34 2021 +0000 Add a BLOCK_USER case to spam_action_service.rb as otherwise the result would be ALLOW for external_verdict='block' commit f2af0e2833c5176dbd6907340f805a13eb566ed1 Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Mar 10 17:14:15 2021 -0500 Update application settings to support grpc spam check URL commit e016cb86d767f6750d78fa1d4e5b42fc614c0ae1 Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Mar 10 15:26:54 2021 -0500 Created initial SpamcheckClient specs commit ccccc3a682df9ad6730365e3dbca4f22f115cc0b Author: Ethan Urie <ethan.urie@gmail.com> Date: Tue Mar 9 08:41:12 2021 -0500 SpamVerdictService specs are passing, starting client specs commit 1193aeeea5295aea8b81de3a6c05d5975949f5e0 Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Mar 8 14:14:16 2021 -0500 Move verdict mappings into a hash from a method commit f014a98307b765202f784ec2c62dc9ebedbc72bb Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Mar 5 15:31:49 2021 -0500 Updated specs for GRPC commit b40b348702b843bc5d98c45ce01516d7ce60c43d Author: Ethan Urie <ethan.urie@gmail.com> Date: Wed Mar 3 14:12:15 2021 -0500 Initial client tests with updated gem files Updated gems and created the first, skeletal tests for the new client code for Spamcheck. commit b55a29c0bf15c0aaacf6fd5b5b6bd1eb8781b323 Author: Ethan Urie <ethan.urie@gmail.com> Date: Fri Jan 22 08:36:19 2021 -0500 Reformat JSON message to match the expeted protobuf message commit 8e89d41ccddfdbcc84c8b678c70da7c2a667ed7a Author: Ethan Urie <ethan.urie@gmail.com> Date: Thu Feb 25 13:54:16 2021 -0500 Initial client code commit 0e9621825cbf709bf2a5d6c40488ad38e8536be3 Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Feb 22 14:35:03 2021 -0500 Add spamcheck gem to the Gemfile commit 1d70b4e8dd849163321a6319421438579efe85ba Author: Ethan Urie <ethan.urie@gmail.com> Date: Mon Feb 1 14:32:08 2021 -0500 Add changes to format to include multiple emails and updated_at commit 9d4b43a234a1f5c4983a6c5d839b8b5a471cb95e Author: Ethan Urie <ethan.urie@gmail.com> Date: Tue Jan 26 14:59:42 2021 -0500 Reformat JSON message to match the expeted protobuf message
2021-04-29 20:51:19 +02:00
2019-08-12 17:50:30 +02:00
# Gitaly GRPC protocol definitions
gem 'gitaly', '~> 14.4.0.pre.rc43'
# KAS GRPC protocol definitions
gem 'kas-grpc', '~> 0.0.2'
gem 'grpc', '~> 1.30.2'
gem 'google-protobuf', '~> 3.17.1'
2021-06-25 17:09:34 +02:00
gem 'toml-rb', '~> 2.0'
2017-05-31 23:06:01 +02:00
# Feature toggles
gem 'flipper', '~> 0.21.0'
gem 'flipper-active_record', '~> 0.21.0'
gem 'flipper-active_support_cache_store', '~> 0.21.0'
gem 'unleash', '~> 3.2.2'
gem 'gitlab-experiment', '~> 0.6.4'
# Structured logging
gem 'lograge', '~> 0.5'
gem 'grape_logging', '~> 1.7'
# DNS Lookup
gem 'gitlab-net-dns', '~> 0.9.1'
# Countries list
gem 'countries', '~> 3.0'
gem 'retriable', '~> 3.1.2'
# LRU cache
gem 'lru_redux'
2020-01-31 09:13:54 +01:00
gem 'erubi', '~> 1.9.0'
# Locked as long as quoted-printable encoding issues are not resolved
# Monkey-patched in `config/initializers/mail_encoding_patch.rb`
# See https://gitlab.com/gitlab-org/gitlab/issues/197386
gem 'mail', '= 2.7.1'
gem 'mail-smtp_pool', '~> 0.1.0', path: 'vendor/gems/mail-smtp_pool', require: false
# File encryption
gem 'lockbox', '~> 0.6.2'
# Email validation
gem 'valid_email', '~> 0.1'
# JSON
gem 'json', '~> 2.5.1'
gem 'json_schemer', '~> 0.2.18'
gem 'oj', '~> 3.10.6'
gem 'multi_json', '~> 1.14.1'
gem 'yajl-ruby', '~> 1.4.1', require: 'yajl'
gem 'webauthn', '~> 2.3'
2020-10-06 15:59:00 +02:00
# IPAddress utilities
gem 'ipaddress', '~> 0.8.3'
Replace the changelog regex parser with Parslet In https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50063 we introduced code for generating Markdown changelogs using the API, using a custom template language. The compiler for this language would convert a custom syntax into ERB, making sure arbitrary code execution isn't possible; or so we thought. In https://gitlab.com/gitlab-org/gitlab/-/issues/300224 we found a way to bypass the template engine's harness, and run arbitrary Ruby code. In response to this issue, I decided to investigate replacing the setup with something more secure. We always planned on doing so when deemed necessary, unfortunately that need arrived sooner than expected. In this commit we replace the regex/ERB based setup with a parser built using Parslet (http://kschiess.github.io/parslet/). Parslet makes it pretty easy to write a parser, and was already an indirect dependency of GitLab (through the license_finder Gem). This new parser doesn't allow for arbitrary code execution, doesn't depend on ERB, and is less fragile compared to the old setup. Templates are executed by walking and evaluating the AST nodes the parser produces. While this won't break any speed records, it's easy to maintain and understand, and fast enough for our needs. In this new setup there is a slight difference compared to the old setup. In the old setup, expression tags on their own line don't add a new line. So this: foo {% if something %}{% end %} bar Compiles into this: foo bar Getting this right using the Parslet parser proved difficult, so we took a slightly different approach: any newline following an expression tag (if, else, end, and each) consumes the newline that directly follows it (if any). This requires only a small change in the template, is easy to implement, and still intuitive to the user. As part of this commit we also fix a small bug that would lead to empty entries being included in the template, and add a note about using the right YAML syntax to preserve newlines.
2021-02-02 20:18:44 +01:00
gem 'parslet', '~> 1.8'
2021-11-04 16:15:41 +01:00
gem 'ipynbdiff', '0.3.7'