bundler 2.1.0 → 2.2.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +832 -738
  3. data/README.md +6 -8
  4. data/bundler.gemspec +3 -3
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +15 -4
  7. data/lib/bundler/build_metadata.rb +2 -2
  8. data/lib/bundler/cli.rb +32 -11
  9. data/lib/bundler/cli/console.rb +1 -1
  10. data/lib/bundler/cli/exec.rb +3 -12
  11. data/lib/bundler/cli/gem.rb +83 -10
  12. data/lib/bundler/cli/info.rb +13 -3
  13. data/lib/bundler/cli/init.rb +1 -1
  14. data/lib/bundler/cli/install.rb +8 -16
  15. data/lib/bundler/cli/issue.rb +2 -2
  16. data/lib/bundler/cli/list.rb +11 -9
  17. data/lib/bundler/cli/outdated.rb +88 -65
  18. data/lib/bundler/cli/plugin.rb +10 -0
  19. data/lib/bundler/cli/pristine.rb +5 -0
  20. data/lib/bundler/definition.rb +32 -32
  21. data/lib/bundler/dependency.rb +0 -9
  22. data/lib/bundler/dsl.rb +1 -5
  23. data/lib/bundler/environment_preserver.rb +26 -2
  24. data/lib/bundler/errors.rb +1 -0
  25. data/lib/bundler/feature_flag.rb +0 -2
  26. data/lib/bundler/fetcher.rb +1 -0
  27. data/lib/bundler/friendly_errors.rb +4 -10
  28. data/lib/bundler/gem_helper.rb +18 -12
  29. data/lib/bundler/gem_version_promoter.rb +1 -1
  30. data/lib/bundler/injector.rb +14 -3
  31. data/lib/bundler/inline.rb +2 -2
  32. data/lib/bundler/installer.rb +29 -28
  33. data/lib/bundler/installer/gem_installer.rb +2 -2
  34. data/lib/bundler/installer/parallel_installer.rb +9 -9
  35. data/lib/bundler/lazy_specification.rb +16 -3
  36. data/lib/bundler/plugin.rb +26 -0
  37. data/lib/bundler/plugin/index.rb +9 -0
  38. data/lib/bundler/psyched_yaml.rb +0 -15
  39. data/lib/bundler/remote_specification.rb +4 -1
  40. data/lib/bundler/resolver.rb +31 -8
  41. data/lib/bundler/resolver/spec_group.rb +26 -5
  42. data/lib/bundler/rubygems_ext.rb +7 -8
  43. data/lib/bundler/rubygems_gem_installer.rb +1 -7
  44. data/lib/bundler/rubygems_integration.rb +13 -48
  45. data/lib/bundler/runtime.rb +2 -12
  46. data/lib/bundler/settings.rb +0 -3
  47. data/lib/bundler/setup.rb +5 -0
  48. data/lib/bundler/shared_helpers.rb +1 -1
  49. data/lib/bundler/source/git.rb +4 -4
  50. data/lib/bundler/source/git/git_proxy.rb +53 -58
  51. data/lib/bundler/source/path.rb +5 -1
  52. data/lib/bundler/source/path/installer.rb +7 -9
  53. data/lib/bundler/source/rubygems.rb +11 -14
  54. data/lib/bundler/stub_specification.rb +16 -4
  55. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  56. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  57. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  58. data/lib/bundler/templates/newgem/bin/console.tt +2 -0
  59. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  60. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  61. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  62. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  63. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +2 -0
  64. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  65. data/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -4
  66. data/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
  67. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  68. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -0
  69. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  70. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  71. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  72. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  73. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +72 -208
  74. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  75. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  76. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  77. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  78. data/lib/bundler/version.rb +1 -1
  79. data/man/bundle-add.1 +1 -1
  80. data/man/bundle-add.1.txt +15 -15
  81. data/man/bundle-binstubs.1 +1 -1
  82. data/man/bundle-binstubs.1.txt +10 -10
  83. data/man/bundle-cache.1 +1 -1
  84. data/man/bundle-cache.1.txt +15 -15
  85. data/man/bundle-check.1 +1 -1
  86. data/man/bundle-check.1.txt +8 -8
  87. data/man/bundle-clean.1 +1 -1
  88. data/man/bundle-clean.1.txt +6 -6
  89. data/man/bundle-config.1 +3 -9
  90. data/man/bundle-config.1.txt +271 -272
  91. data/man/bundle-config.ronn +5 -9
  92. data/man/bundle-doctor.1 +1 -1
  93. data/man/bundle-doctor.1.txt +9 -9
  94. data/man/bundle-exec.1 +1 -1
  95. data/man/bundle-exec.1.txt +84 -81
  96. data/man/bundle-gem.1 +25 -3
  97. data/man/bundle-gem.1.txt +65 -39
  98. data/man/bundle-gem.ronn +30 -7
  99. data/man/bundle-info.1 +1 -1
  100. data/man/bundle-info.1.txt +2 -2
  101. data/man/bundle-init.1 +1 -1
  102. data/man/bundle-init.1.txt +9 -9
  103. data/man/bundle-inject.1 +1 -1
  104. data/man/bundle-inject.1.txt +4 -4
  105. data/man/bundle-install.1 +1 -1
  106. data/man/bundle-install.1.txt +169 -169
  107. data/man/bundle-list.1 +7 -7
  108. data/man/bundle-list.1.txt +12 -11
  109. data/man/bundle-list.ronn +6 -6
  110. data/man/bundle-lock.1 +1 -1
  111. data/man/bundle-lock.1.txt +28 -28
  112. data/man/bundle-open.1 +1 -1
  113. data/man/bundle-open.1.txt +3 -3
  114. data/man/bundle-outdated.1 +1 -1
  115. data/man/bundle-outdated.1.txt +34 -34
  116. data/man/bundle-platform.1 +1 -1
  117. data/man/bundle-platform.1.txt +16 -16
  118. data/man/bundle-pristine.1 +1 -1
  119. data/man/bundle-pristine.1.txt +8 -8
  120. data/man/bundle-remove.1 +1 -1
  121. data/man/bundle-remove.1.txt +9 -9
  122. data/man/bundle-show.1 +1 -1
  123. data/man/bundle-show.1.txt +8 -8
  124. data/man/bundle-update.1 +1 -1
  125. data/man/bundle-update.1.txt +149 -148
  126. data/man/bundle-viz.1 +1 -1
  127. data/man/bundle-viz.1.txt +11 -11
  128. data/man/bundle.1 +1 -1
  129. data/man/bundle.1.txt +31 -31
  130. data/man/gemfile.5 +1 -1
  131. data/man/gemfile.5.txt +218 -216
  132. metadata +14 -8
@@ -12,7 +12,6 @@ module Bundler
12
12
  allow_offline_install
13
13
  auto_clean_without_path
14
14
  auto_install
15
- auto_config_jobs
16
15
  cache_all
17
16
  cache_all_platforms
18
17
  default_install_uses_path
@@ -22,7 +21,6 @@ module Bundler
22
21
  disable_exec_load
23
22
  disable_local_branch_check
24
23
  disable_multisource
25
- disable_platform_warnings
26
24
  disable_shared_gems
27
25
  disable_version_check
28
26
  force_ruby_platform
@@ -44,7 +42,6 @@ module Bundler
44
42
  setup_makes_kernel_gem_public
45
43
  silence_deprecations
46
44
  silence_root_warning
47
- skip_default_git_sources
48
45
  specific_platform
49
46
  suppress_install_using_messages
50
47
  unlock_source_unlocks_spec
@@ -19,4 +19,9 @@ if Bundler::SharedHelpers.in_bundle?
19
19
  else
20
20
  Bundler.ui.silence { Bundler.setup }
21
21
  end
22
+
23
+ # We might be in the middle of shelling out to rubygems
24
+ # (RUBYOPT=-rbundler/setup), so we need to give rubygems the opportunity of
25
+ # not being silent.
26
+ Gem::DefaultUserInteraction.ui = nil
22
27
  end
@@ -194,7 +194,7 @@ module Bundler
194
194
  return @md5_available if defined?(@md5_available)
195
195
  @md5_available = begin
196
196
  require "openssl"
197
- OpenSSL::Digest::MD5.digest("")
197
+ OpenSSL::Digest.digest("MD5", "")
198
198
  true
199
199
  rescue LoadError
200
200
  true
@@ -230,6 +230,10 @@ module Bundler
230
230
  @allow_remote || @allow_cached
231
231
  end
232
232
 
233
+ def local?
234
+ @local
235
+ end
236
+
233
237
  private
234
238
 
235
239
  def serialize_gemspecs_in(destination)
@@ -256,10 +260,6 @@ module Bundler
256
260
  cached_revision && super
257
261
  end
258
262
 
259
- def local?
260
- @local
261
- end
262
-
263
263
  def requires_checkout?
264
264
  allow_git_ops? && !local? && !cached_revision_checked_out?
265
265
  end
@@ -18,7 +18,7 @@ module Bundler
18
18
  def initialize(command)
19
19
  msg = String.new
20
20
  msg << "Bundler is trying to run a `git #{command}` at runtime. You probably need to run `bundle install`. However, "
21
- msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/bundler/bundler/issues "
21
+ msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md "
22
22
  msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
23
23
  super msg
24
24
  end
@@ -27,21 +27,21 @@ module Bundler
27
27
  class GitCommandError < GitError
28
28
  attr_reader :command
29
29
 
30
- def initialize(command, path = nil, extra_info = nil)
30
+ def initialize(command, path, destination_path, extra_info = nil)
31
31
  @command = command
32
32
 
33
33
  msg = String.new
34
- msg << "Git error: command `git #{command}` in directory #{SharedHelpers.pwd} has failed."
34
+ msg << "Git error: command `git #{command}` in directory #{destination_path} has failed."
35
35
  msg << "\n#{extra_info}" if extra_info
36
- msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path && path.exist?
36
+ msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path.exist?
37
37
  super msg
38
38
  end
39
39
  end
40
40
 
41
41
  class MissingGitRevisionError < GitCommandError
42
- def initialize(command, path, ref, repo)
42
+ def initialize(command, path, destination_path, ref, repo)
43
43
  msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?"
44
- super command, path, msg
44
+ super command, path, destination_path, msg
45
45
  end
46
46
  end
47
47
 
@@ -62,26 +62,18 @@ module Bundler
62
62
  end
63
63
 
64
64
  def revision
65
- return @revision if @revision
66
-
67
- begin
68
- @revision ||= find_local_revision
69
- rescue GitCommandError => e
70
- raise MissingGitRevisionError.new(e.command, path, ref, URICredentialsFilter.credential_filtered_uri(uri))
71
- end
72
-
73
- @revision
65
+ @revision ||= find_local_revision
74
66
  end
75
67
 
76
68
  def branch
77
- @branch ||= allowed_in_path do
78
- git("rev-parse --abbrev-ref HEAD").strip
69
+ @branch ||= allowed_with_path do
70
+ git("rev-parse --abbrev-ref HEAD", :dir => path).strip
79
71
  end
80
72
  end
81
73
 
82
74
  def contains?(commit)
83
- allowed_in_path do
84
- result, status = git_null("branch --contains #{commit}")
75
+ allowed_with_path do
76
+ result, status = git_null("branch --contains #{commit}", :dir => path)
85
77
  status.success? && result =~ /^\* (.*)$/
86
78
  end
87
79
  end
@@ -108,8 +100,8 @@ module Bundler
108
100
  return unless extra_ref
109
101
  end
110
102
 
111
- in_path do
112
- git_retry %(fetch --force --quiet --tags #{uri_escaped_with_configured_credentials} "refs/heads/*:refs/heads/*" #{extra_ref})
103
+ with_path do
104
+ git_retry %(fetch --force --quiet --tags #{uri_escaped_with_configured_credentials} "refs/heads/*:refs/heads/*" #{extra_ref}), :dir => path
113
105
  end
114
106
  end
115
107
 
@@ -133,58 +125,54 @@ module Bundler
133
125
  end
134
126
  end
135
127
  # method 2
136
- SharedHelpers.chdir(destination) do
137
- git_retry %(fetch --force --quiet --tags "#{path}")
128
+ git_retry %(fetch --force --quiet --tags "#{path}"), :dir => destination
138
129
 
139
- begin
140
- git "reset --hard #{@revision}"
141
- rescue GitCommandError => e
142
- raise MissingGitRevisionError.new(e.command, path, @revision, URICredentialsFilter.credential_filtered_uri(uri))
143
- end
130
+ begin
131
+ git "reset --hard #{@revision}", :dir => destination
132
+ rescue GitCommandError => e
133
+ raise MissingGitRevisionError.new(e.command, path, destination, @revision, URICredentialsFilter.credential_filtered_uri(uri))
134
+ end
144
135
 
145
- if submodules
146
- git_retry "submodule update --init --recursive"
147
- elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
148
- git_retry "submodule deinit --all --force"
149
- end
136
+ if submodules
137
+ git_retry "submodule update --init --recursive", :dir => destination
138
+ elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
139
+ git_retry "submodule deinit --all --force", :dir => destination
150
140
  end
151
141
  end
152
142
 
153
143
  private
154
144
 
155
- def git_null(command)
156
- command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri)
157
- raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
145
+ def git_null(command, dir: SharedHelpers.pwd)
146
+ check_allowed(command)
158
147
 
159
148
  out, status = SharedHelpers.with_clean_git_env do
160
- capture_and_ignore_stderr("git #{command}")
149
+ capture_and_ignore_stderr("git #{command}", :chdir => dir.to_s)
161
150
  end
162
151
 
163
152
  [URICredentialsFilter.credential_filtered_string(out, uri), status]
164
153
  end
165
154
 
166
- def git_retry(command)
155
+ def git_retry(command, dir: SharedHelpers.pwd)
167
156
  Bundler::Retry.new("`git #{URICredentialsFilter.credential_filtered_string(command, uri)}`", GitNotAllowedError).attempts do
168
- git(command)
157
+ git(command, :dir => dir)
169
158
  end
170
159
  end
171
160
 
172
- def git(command, check_errors = true, error_msg = nil)
173
- command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri)
174
- raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
161
+ def git(command, dir: SharedHelpers.pwd)
162
+ command_with_no_credentials = check_allowed(command)
175
163
 
176
164
  out, status = SharedHelpers.with_clean_git_env do
177
- capture_and_filter_stderr(uri, "git #{command}")
165
+ capture_and_filter_stderr(uri, "git #{command}", :chdir => dir.to_s)
178
166
  end
179
167
 
180
- stdout_with_no_credentials = URICredentialsFilter.credential_filtered_string(out, uri)
181
- raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !status.success?
182
- stdout_with_no_credentials
168
+ raise GitCommandError.new(command_with_no_credentials, path, dir) unless status.success?
169
+
170
+ URICredentialsFilter.credential_filtered_string(out, uri)
183
171
  end
184
172
 
185
173
  def has_revision_cached?
186
174
  return unless @revision
187
- in_path { git("cat-file -e #{@revision}") }
175
+ with_path { git("cat-file -e #{@revision}", :dir => path) }
188
176
  true
189
177
  rescue GitError
190
178
  false
@@ -195,9 +183,11 @@ module Bundler
195
183
  end
196
184
 
197
185
  def find_local_revision
198
- allowed_in_path do
199
- git("rev-parse --verify #{Shellwords.shellescape(ref)}", true).strip
186
+ allowed_with_path do
187
+ git("rev-parse --verify #{Shellwords.shellescape(ref)}", :dir => path).strip
200
188
  end
189
+ rescue GitCommandError => e
190
+ raise MissingGitRevisionError.new(e.command, path, path, ref, URICredentialsFilter.credential_filtered_uri(uri))
201
191
  end
202
192
 
203
193
  # Escape the URI for git commands
@@ -230,27 +220,32 @@ module Bundler
230
220
  @git ? @git.allow_git_ops? : true
231
221
  end
232
222
 
233
- def in_path(&blk)
223
+ def with_path(&blk)
234
224
  checkout unless path.exist?
235
- _ = URICredentialsFilter # load it before we chdir
236
- SharedHelpers.chdir(path, &blk)
225
+ blk.call
237
226
  end
238
227
 
239
- def allowed_in_path
240
- return in_path { yield } if allow?
228
+ def allowed_with_path
229
+ return with_path { yield } if allow?
241
230
  raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application"
242
231
  end
243
232
 
244
- def capture_and_filter_stderr(uri, cmd)
233
+ def check_allowed(command)
234
+ command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri)
235
+ raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
236
+ command_with_no_credentials
237
+ end
238
+
239
+ def capture_and_filter_stderr(uri, cmd, chdir: SharedHelpers.pwd)
245
240
  require "open3"
246
- return_value, captured_err, status = Open3.capture3(cmd)
241
+ return_value, captured_err, status = Open3.capture3(cmd, :chdir => chdir)
247
242
  Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
248
243
  [return_value, status]
249
244
  end
250
245
 
251
- def capture_and_ignore_stderr(cmd)
246
+ def capture_and_ignore_stderr(cmd, chdir: SharedHelpers.pwd)
252
247
  require "open3"
253
- return_value, _, status = Open3.capture3(cmd)
248
+ return_value, _, status = Open3.capture3(cmd, :chdir => chdir)
254
249
  [return_value, status]
255
250
  end
256
251
  end
@@ -132,7 +132,11 @@ module Bundler
132
132
  end
133
133
 
134
134
  def expand(somepath)
135
- somepath.expand_path(root_path)
135
+ if Bundler.current_ruby.jruby? # TODO: Unify when https://github.com/rubygems/bundler/issues/7598 fixed upstream and all supported jrubies include the fix
136
+ somepath.expand_path(root_path).expand_path
137
+ else
138
+ somepath.expand_path(root_path)
139
+ end
136
140
  rescue ArgumentError => e
137
141
  Bundler.ui.debug(e)
138
142
  raise PathError, "There was an error while trying to use the path " \
@@ -26,18 +26,16 @@ module Bundler
26
26
  end
27
27
 
28
28
  def post_install
29
- SharedHelpers.chdir(@gem_dir) do
30
- run_hooks(:pre_install)
29
+ run_hooks(:pre_install)
31
30
 
32
- unless @disable_extensions
33
- build_extensions
34
- run_hooks(:post_build)
35
- end
31
+ unless @disable_extensions
32
+ build_extensions
33
+ run_hooks(:post_build)
34
+ end
36
35
 
37
- generate_bin unless spec.executables.nil? || spec.executables.empty?
36
+ generate_bin unless spec.executables.nil? || spec.executables.empty?
38
37
 
39
- run_hooks(:post_install)
40
- end
38
+ run_hooks(:post_install)
41
39
  ensure
42
40
  Bundler.rm_rf(@tmp_dir) if Bundler.requires_sudo?
43
41
  end
@@ -145,20 +145,17 @@ module Bundler
145
145
 
146
146
  Bundler.mkdir_p bin_path, :no_sudo => true unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")
147
147
 
148
- installed_spec = nil
149
- Bundler.rubygems.preserve_paths do
150
- installed_spec = Bundler::RubyGemsGemInstaller.at(
151
- path,
152
- :install_dir => install_path.to_s,
153
- :bin_dir => bin_path.to_s,
154
- :ignore_dependencies => true,
155
- :wrappers => true,
156
- :env_shebang => true,
157
- :build_args => opts[:build_args],
158
- :bundler_expected_checksum => spec.respond_to?(:checksum) && spec.checksum,
159
- :bundler_extension_cache_path => extension_cache_path(spec)
160
- ).install
161
- end
148
+ installed_spec = Bundler::RubyGemsGemInstaller.at(
149
+ path,
150
+ :install_dir => install_path.to_s,
151
+ :bin_dir => bin_path.to_s,
152
+ :ignore_dependencies => true,
153
+ :wrappers => true,
154
+ :env_shebang => true,
155
+ :build_args => opts[:build_args],
156
+ :bundler_expected_checksum => spec.respond_to?(:checksum) && spec.checksum,
157
+ :bundler_extension_cache_path => extension_cache_path(spec)
158
+ ).install
162
159
  spec.full_gem_path = installed_spec.full_gem_path
163
160
 
164
161
  # SUDO HAX
@@ -28,9 +28,13 @@ module Bundler
28
28
 
29
29
  # @!group Stub Delegates
30
30
 
31
- # This is defined directly to avoid having to load every installed spec
31
+ # This is defined directly to avoid having to loading the full spec
32
32
  def missing_extensions?
33
- stub.missing_extensions?
33
+ return false if default_gem?
34
+ return false if extensions.empty?
35
+ return false if File.exist? gem_build_complete_path
36
+
37
+ true
34
38
  end
35
39
 
36
40
  def activated
@@ -41,8 +45,16 @@ module Bundler
41
45
  stub.instance_variable_set(:@activated, activated)
42
46
  end
43
47
 
44
- def default_gem
45
- stub.default_gem
48
+ def extensions
49
+ stub.extensions
50
+ end
51
+
52
+ def gem_build_complete_path
53
+ File.join(extension_dir, "gem.build_complete")
54
+ end
55
+
56
+ def default_gem?
57
+ stub.default_gem?
46
58
  end
47
59
 
48
60
  def full_gem_path
@@ -2,73 +2,83 @@
2
2
 
3
3
  ## Our Pledge
4
4
 
5
- In the interest of fostering an open and welcoming environment, we as
6
- contributors and maintainers pledge to making participation in our project and
7
- our community a harassment-free experience for everyone, regardless of age, body
8
- size, disability, ethnicity, gender identity and expression, level of experience,
9
- nationality, personal appearance, race, religion, or sexual identity and
10
- orientation.
5
+ We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+ We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
11
8
 
12
9
  ## Our Standards
13
10
 
14
- Examples of behavior that contributes to creating a positive environment
15
- include:
11
+ Examples of behavior that contributes to a positive environment for our community include:
16
12
 
17
- * Using welcoming and inclusive language
18
- * Being respectful of differing viewpoints and experiences
19
- * Gracefully accepting constructive criticism
20
- * Focusing on what is best for the community
21
- * Showing empathy towards other community members
13
+ * Demonstrating empathy and kindness toward other people
14
+ * Being respectful of differing opinions, viewpoints, and experiences
15
+ * Giving and gracefully accepting constructive feedback
16
+ * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
17
+ * Focusing on what is best not just for us as individuals, but for the overall community
22
18
 
23
- Examples of unacceptable behavior by participants include:
19
+ Examples of unacceptable behavior include:
24
20
 
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- * Trolling, insulting/derogatory comments, and personal or political attacks
21
+ * The use of sexualized language or imagery, and sexual attention or
22
+ advances of any kind
23
+ * Trolling, insulting or derogatory comments, and personal or political attacks
28
24
  * Public or private harassment
29
- * Publishing others' private information, such as a physical or electronic
30
- address, without explicit permission
25
+ * Publishing others' private information, such as a physical or email
26
+ address, without their explicit permission
31
27
  * Other conduct which could reasonably be considered inappropriate in a
32
28
  professional setting
33
29
 
34
- ## Our Responsibilities
30
+ ## Enforcement Responsibilities
35
31
 
36
- Project maintainers are responsible for clarifying the standards of acceptable
37
- behavior and are expected to take appropriate and fair corrective action in
38
- response to any instances of unacceptable behavior.
32
+ Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
39
33
 
40
- Project maintainers have the right and responsibility to remove, edit, or
41
- reject comments, commits, code, wiki edits, issues, and other contributions
42
- that are not aligned to this Code of Conduct, or to ban temporarily or
43
- permanently any contributor for other behaviors that they deem inappropriate,
44
- threatening, offensive, or harmful.
34
+ Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
45
35
 
46
36
  ## Scope
47
37
 
48
- This Code of Conduct applies both within project spaces and in public spaces
49
- when an individual is representing the project or its community. Examples of
50
- representing a project or community include using an official project e-mail
51
- address, posting via an official social media account, or acting as an appointed
52
- representative at an online or offline event. Representation of a project may be
53
- further defined and clarified by project maintainers.
38
+ This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
54
39
 
55
40
  ## Enforcement
56
41
 
57
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at <%= config[:email] %>. All
59
- complaints will be reviewed and investigated and will result in a response that
60
- is deemed necessary and appropriate to the circumstances. The project team is
61
- obligated to maintain confidentiality with regard to the reporter of an incident.
62
- Further details of specific enforcement policies may be posted separately.
42
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at <%= config[:email] %>. All complaints will be reviewed and investigated promptly and fairly.
43
+
44
+ All community leaders are obligated to respect the privacy and security of the reporter of any incident.
45
+
46
+ ## Enforcement Guidelines
47
+
48
+ Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
49
+
50
+ ### 1. Correction
51
+
52
+ **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
53
+
54
+ **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
55
+
56
+ ### 2. Warning
57
+
58
+ **Community Impact**: A violation through a single incident or series of actions.
63
59
 
64
- Project maintainers who do not follow or enforce the Code of Conduct in good
65
- faith may face temporary or permanent repercussions as determined by other
66
- members of the project's leadership.
60
+ **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
61
+
62
+ ### 3. Temporary Ban
63
+
64
+ **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
65
+
66
+ **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
67
+
68
+ ### 4. Permanent Ban
69
+
70
+ **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
71
+
72
+ **Consequence**: A permanent ban from any sort of public interaction within the community.
67
73
 
68
74
  ## Attribution
69
75
 
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [https://contributor-covenant.org/version/1/4][version]
76
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
77
+ available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
78
+
79
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
80
+
81
+ [homepage]: https://www.contributor-covenant.org
72
82
 
73
- [homepage]: https://contributor-covenant.org
74
- [version]: https://contributor-covenant.org/version/1/4/
83
+ For answers to common questions about this code of conduct, see the FAQ at
84
+ https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.