dependabot-common 0.225.0 → 0.226.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eff50d0047fd94f2b62e76e55d42561e17780c26da251ba55cd04f493bce0cb5
4
- data.tar.gz: 34d2e201f6198e4478a2b13d8e2c12162ae1a2e74b6c66ebfd45e12518379155
3
+ metadata.gz: 47e3c8b72c7026283675f4969109de44931af6b655978be6762eb1c846f92dc9
4
+ data.tar.gz: 4d1b71853adbe711c8ad038c27df1fabc2612de1226705ac3a55de8f70ccfa0c
5
5
  SHA512:
6
- metadata.gz: 97d3947770789948f293026af11c4a8f065831ebf4c5ee5f06c3e2fe147766b5d4615b2497fbd7dfbfb4589a07df52a91de9c7041fe49cd74795fd3fb6be6437
7
- data.tar.gz: 640a7855071b6c94d1a8e91972bf4e34792e6ffcf02ac38d1bb6a42e985fdfc3479b994c645fdb24d77fe450f84e39aef0e6bef2ab41c0394989f9c63f792f19
6
+ metadata.gz: e8edba97936c9846ec37066eb5ff03dfce9f24aa8e7fe688665b17939ce6e785f2e00a3bda2baf666422e7044daef0dbfbb84d770c02ef12ccbd9b12aeb8fca6
7
+ data.tar.gz: aacddd041d120483380bc7d3e6b6e757cc4f80c304d6bd8df7a911174b53f361e1a1d3926dd193c3cd1e7451d8c6b29370406dfcfee52dcb3264304319417c46
@@ -44,7 +44,7 @@ module Dependabot
44
44
  @type = type
45
45
 
46
46
  begin
47
- @mode = File.stat((symlink_target || path).sub(%r{^/}, "")).mode.to_s(8)
47
+ @mode = File.stat(realpath).mode.to_s(8)
48
48
  rescue StandardError
49
49
  @mode = mode
50
50
  end
@@ -76,6 +76,10 @@ module Dependabot
76
76
  Pathname.new(File.join(directory, name)).cleanpath.to_path
77
77
  end
78
78
 
79
+ def realpath
80
+ (symlink_target || path).sub(%r{^/}, "")
81
+ end
82
+
79
83
  def ==(other)
80
84
  return false unless other.instance_of?(self.class)
81
85
 
@@ -9,34 +9,12 @@ require "yaml"
9
9
 
10
10
  module Dependabot
11
11
  class DependencyGroup
12
- ANY_DEPENDENCY_NAME = "*"
13
- SECURITY_UPDATES_ONLY = false
14
-
15
- DEFAULT_UPDATE_TYPES = [
16
- SEMVER_MAJOR = "major",
17
- SEMVER_MINOR = "minor",
18
- SEMVER_PATCH = "patch"
19
- ].freeze
20
-
21
- IGNORE_CONDITION_TYPES = {
22
- SEMVER_MAJOR => Dependabot::Config::IgnoreCondition::MAJOR_VERSION_TYPE,
23
- SEMVER_MINOR => Dependabot::Config::IgnoreCondition::MINOR_VERSION_TYPE,
24
- SEMVER_PATCH => Dependabot::Config::IgnoreCondition::PATCH_VERSION_TYPE
25
- }.freeze
26
-
27
- class NullIgnoreCondition
28
- def ignored_versions(_dependency, _security_updates_only)
29
- []
30
- end
31
- end
32
-
33
12
  attr_reader :name, :rules, :dependencies
34
13
 
35
14
  def initialize(name:, rules:)
36
15
  @name = name
37
16
  @rules = rules
38
17
  @dependencies = []
39
- @ignore_condition = generate_ignore_condition!
40
18
  end
41
19
 
42
20
  def contains?(dependency)
@@ -46,18 +24,6 @@ module Dependabot
46
24
  matches_pattern?(dependency.name) && matches_dependency_type?(dependency)
47
25
  end
48
26
 
49
- # This method generates ignored versions for the given Dependency based on
50
- # the any update-types we have defined.
51
- def ignored_versions_for(dependency)
52
- @ignore_condition.ignored_versions(dependency, SECURITY_UPDATES_ONLY)
53
- end
54
-
55
- def targets_highest_versions_possible?
56
- return true unless experimental_rules_enabled?
57
-
58
- update_types.include?(SEMVER_MAJOR)
59
- end
60
-
61
27
  def to_h
62
28
  { "name" => name }
63
29
  end
@@ -93,46 +59,6 @@ module Dependabot
93
59
  end
94
60
  end
95
61
 
96
- def pattern_rules?
97
- rules.key?("patterns") && rules["patterns"]&.any?
98
- end
99
-
100
- def update_types
101
- rules.fetch("update-types", DEFAULT_UPDATE_TYPES)
102
- end
103
-
104
- def generate_ignore_condition!
105
- return NullIgnoreCondition.new unless experimental_rules_enabled?
106
-
107
- ignored_update_types = ignored_update_types_for_rules
108
-
109
- return NullIgnoreCondition.new unless ignored_update_types.any?
110
-
111
- Dependabot.logger.debug("The #{name} group has set ignores for update-type(s): #{ignored_update_types}")
112
-
113
- Dependabot::Config::IgnoreCondition.new(
114
- dependency_name: ANY_DEPENDENCY_NAME,
115
- update_types: ignored_update_types
116
- )
117
- end
118
-
119
- def ignored_update_types_for_rules
120
- unless update_types.is_a?(Array)
121
- raise ArgumentError,
122
- "The #{name} group has an unexpected value for update-types: '#{update_types}'"
123
- end
124
-
125
- unless update_types.any?
126
- raise ArgumentError,
127
- "The #{name} group has specified an empty array for update-types."
128
- end
129
-
130
- ignored_update_types = DEFAULT_UPDATE_TYPES - update_types
131
- return [] if ignored_update_types.empty?
132
-
133
- IGNORE_CONDITION_TYPES.fetch_values(*ignored_update_types)
134
- end
135
-
136
62
  def experimental_rules_enabled?
137
63
  Dependabot::Experiments.enabled?(:grouped_updates_experimental_rules)
138
64
  end
@@ -108,6 +108,10 @@ module Dependabot
108
108
 
109
109
  private
110
110
 
111
+ def fetch_support_file(name)
112
+ fetch_file_if_present(name)&.tap { |f| f.support_file = true }
113
+ end
114
+
111
115
  def fetch_file_if_present(filename, fetch_submodules: false)
112
116
  unless repo_contents_path.nil?
113
117
  begin
@@ -128,8 +132,7 @@ module Dependabot
128
132
 
129
133
  fetch_file_from_host(filename, fetch_submodules: fetch_submodules)
130
134
  rescue *CLIENT_NOT_FOUND_ERRORS
131
- path = Pathname.new(File.join(directory, filename)).cleanpath.to_path
132
- raise Dependabot::DependencyFileNotFound, path
135
+ nil
133
136
  end
134
137
 
135
138
  def load_cloned_file_if_present(filename)
@@ -159,19 +162,34 @@ module Dependabot
159
162
 
160
163
  path = Pathname.new(File.join(directory, filename)).cleanpath.to_path
161
164
  content = _fetch_file_content(path, fetch_submodules: fetch_submodules)
162
- type = "symlink" if @linked_paths.key?(path.gsub(%r{^/}, ""))
165
+ clean_path = path.gsub(%r{^/}, "")
166
+
167
+ linked_path = symlinked_subpath(clean_path)
168
+ type = "symlink" if linked_path
169
+ symlink_target = clean_path.sub(linked_path, @linked_paths.dig(linked_path, :path)) if type == "symlink"
163
170
 
164
171
  DependencyFile.new(
165
172
  name: Pathname.new(filename).cleanpath.to_path,
166
173
  directory: directory,
167
174
  type: type,
168
175
  content: content,
169
- symlink_target: @linked_paths.dig(path.gsub(%r{^/}, ""), :path)
176
+ symlink_target: symlink_target
170
177
  )
171
178
  rescue *CLIENT_NOT_FOUND_ERRORS
172
179
  raise Dependabot::DependencyFileNotFound, path
173
180
  end
174
181
 
182
+ # Finds the first subpath in path that is a symlink
183
+ def symlinked_subpath(path)
184
+ subpaths(path).find { |subpath| @linked_paths.key?(subpath) }
185
+ end
186
+
187
+ # Given a "foo/bar/baz" path, returns ["foo", "foo/bar", "foo/bar/baz"]
188
+ def subpaths(path)
189
+ components = path.split("/")
190
+ components.map { |component| components[0..components.index(component)].join("/") }
191
+ end
192
+
175
193
  def repo_contents(dir: ".", ignore_base_directory: false,
176
194
  raise_errors: true, fetch_submodules: false)
177
195
  dir = File.join(directory, dir) unless ignore_base_directory
@@ -375,7 +393,7 @@ module Dependabot
375
393
 
376
394
  def _gitlab_repo_contents(repo, path, commit)
377
395
  gitlab_client.
378
- repo_tree(repo, path: path, ref_name: commit, per_page: 100).
396
+ repo_tree(repo, path: path, ref: commit, per_page: 100).
379
397
  map do |file|
380
398
  # GitLab API essentially returns the output from `git ls-tree`
381
399
  type = case file.type
@@ -40,7 +40,6 @@ module Dependabot
40
40
  def pinned?
41
41
  raise "Not a git dependency!" unless git_dependency?
42
42
 
43
- ref = dependency_source_details.fetch(:ref)
44
43
  branch = dependency_source_details.fetch(:branch)
45
44
 
46
45
  return false if ref.nil?
@@ -61,16 +60,14 @@ module Dependabot
61
60
  def pinned_ref_looks_like_version?
62
61
  return false unless pinned?
63
62
 
64
- version_tag?(dependency_source_details.fetch(:ref))
63
+ version_tag?(ref)
65
64
  end
66
65
 
67
66
  def pinned_ref_looks_like_commit_sha?
68
- ref = dependency_source_details.fetch(:ref)
69
67
  ref_looks_like_commit_sha?(ref)
70
68
  end
71
69
 
72
70
  def head_commit_for_pinned_ref
73
- ref = dependency_source_details.fetch(:ref)
74
71
  local_repo_git_metadata_fetcher.head_commit_for_ref_sha(ref)
75
72
  end
76
73
 
@@ -144,15 +141,14 @@ module Dependabot
144
141
  end
145
142
 
146
143
  def most_specific_tag_equivalent_to_pinned_ref
147
- commit_sha = head_commit_for_local_branch(dependency_source_details.fetch(:ref))
144
+ commit_sha = head_commit_for_local_branch(ref)
148
145
  most_specific_version_tag_for_sha(commit_sha)
149
146
  end
150
147
 
151
148
  def local_tag_for_pinned_sha
152
- return unless pinned_ref_looks_like_commit_sha?
149
+ return @local_tag_for_pinned_sha if defined?(@local_tag_for_pinned_sha)
153
150
 
154
- commit_sha = dependency_source_details.fetch(:ref)
155
- most_specific_version_tag_for_sha(commit_sha)
151
+ @local_tag_for_pinned_sha = most_specific_version_tag_for_sha(ref) if pinned_ref_looks_like_commit_sha?
156
152
  end
157
153
 
158
154
  def git_repo_reachable?
@@ -223,7 +219,7 @@ module Dependabot
223
219
  return false unless tag
224
220
 
225
221
  commit_included_in_tag?(
226
- commit: dependency_source_details.fetch(:ref),
222
+ commit: ref,
227
223
  tag: tag,
228
224
  allow_identical: true
229
225
  )
@@ -327,8 +323,11 @@ module Dependabot
327
323
  end
328
324
 
329
325
  def ref_or_branch
330
- dependency_source_details.fetch(:ref) ||
331
- dependency_source_details.fetch(:branch)
326
+ ref || dependency_source_details.fetch(:branch)
327
+ end
328
+
329
+ def ref
330
+ dependency_source_details.fetch(:ref)
332
331
  end
333
332
 
334
333
  def version_tag?(tag)
@@ -336,10 +335,18 @@ module Dependabot
336
335
  end
337
336
 
338
337
  def matches_existing_prefix?(tag)
339
- return true unless ref_or_branch&.match?(VERSION_REGEX)
338
+ return true unless ref_or_branch
339
+
340
+ if version_tag?(ref_or_branch)
341
+ same_prefix?(ref_or_branch, tag)
342
+ else
343
+ local_tag_for_pinned_sha.nil? || same_prefix?(local_tag_for_pinned_sha, tag)
344
+ end
345
+ end
340
346
 
341
- ref_or_branch.gsub(VERSION_REGEX, "").gsub(/v$/i, "") ==
342
- tag.gsub(VERSION_REGEX, "").gsub(/v$/i, "")
347
+ def same_prefix?(tag, other_tag)
348
+ tag.gsub(VERSION_REGEX, "").gsub(/v$/i, "") ==
349
+ other_tag.gsub(VERSION_REGEX, "").gsub(/v$/i, "")
343
350
  end
344
351
 
345
352
  def to_local_tag(tag)
@@ -417,7 +424,7 @@ module Dependabot
417
424
  return false unless dependency_source_details&.fetch(:ref, nil)
418
425
  return false unless pinned_ref_looks_like_version?
419
426
 
420
- version = version_from_ref(dependency_source_details.fetch(:ref))
427
+ version = version_from_ref(ref)
421
428
  version.prerelease?
422
429
  end
423
430
 
@@ -47,8 +47,10 @@ module Dependabot
47
47
  if ref == "HEAD"
48
48
  # Remove the opening clause of the upload pack as this isn't always
49
49
  # followed by a line break. When it isn't (e.g., with Bitbucket) it
50
- # causes problems for our `sha_for_update_pack_line` logic
51
- line = upload_pack.gsub(/.*git-upload-pack/, "").
50
+ # causes problems for our `sha_for_update_pack_line` logic. The format
51
+ # of this opening clause is documented at
52
+ # https://git-scm.com/docs/http-protocol#_smart_server_response
53
+ line = upload_pack.gsub(/^[0-9a-f]{4}# service=git-upload-pack/, "").
52
54
  lines.find { |l| l.include?(" HEAD") }
53
55
  return sha_for_update_pack_line(line) if line
54
56
  end
@@ -177,7 +179,7 @@ module Dependabot
177
179
  # (GitHub, GitLab, BitBucket) work with or without the suffix.
178
180
  # That change has other ramifications, so it'd be better if Azure started supporting ".git"
179
181
  # like all the other providers.
180
- uri = "https://#{uri.split('git@').last.sub(%r{:/?}, '/')}" if uri.start_with?("git@")
182
+ uri = SharedHelpers.scp_to_standard(uri)
181
183
  uri = URI(uri)
182
184
  hostname = uri.hostname.to_s
183
185
  hostname == "dev.azure.com" || hostname.end_with?(".visualstudio.com")
@@ -186,8 +188,7 @@ module Dependabot
186
188
  # Add in username and password if present in credentials.
187
189
  # Credentials are never present for production Dependabot.
188
190
  def uri_with_auth(uri)
189
- # Handle SCP-style git URIs
190
- uri = "https://#{uri.split('git@').last.sub(%r{:/?}, '/')}" if uri.start_with?("git@")
191
+ uri = SharedHelpers.scp_to_standard(uri)
191
192
  uri = URI(uri)
192
193
  cred = credentials.select { |c| c["type"] == "git_source" }.
193
194
  find { |c| uri.host == c["host"] }
@@ -117,9 +117,8 @@ module Dependabot
117
117
  end
118
118
 
119
119
  def source
120
- return @source if @source_lookup_attempted
120
+ return @source if defined?(@source)
121
121
 
122
- @source_lookup_attempted = true
123
122
  @source = look_up_source
124
123
  end
125
124
 
@@ -10,6 +10,9 @@ module Dependabot
10
10
  :files, :commit_message, :pr_description, :pr_name,
11
11
  :author_details, :labeler, :work_item
12
12
 
13
+ # BitBucket Cloud accepts > 1MB characters, but they display poorly in the UI, so limiting to 4x 65,536
14
+ PR_DESCRIPTION_MAX_LENGTH = 262_143 # 0 based count
15
+
13
16
  def initialize(source:, branch_name:, base_commit:, credentials:,
14
17
  files:, commit_message:, pr_description:, pr_name:,
15
18
  author_details:, labeler: nil, work_item: nil)
@@ -193,8 +193,7 @@ module Dependabot
193
193
  end
194
194
 
195
195
  {
196
- path: (file.symlink_target ||
197
- file.path).sub(%r{^/}, ""),
196
+ path: file.realpath,
198
197
  mode: (file.mode || "100644"),
199
198
  type: "blob"
200
199
  }.merge(content)
@@ -108,7 +108,8 @@ module Dependabot
108
108
  {
109
109
  action: file_action(file),
110
110
  file_path: file.type == "symlink" ? file.symlink_target : file.path,
111
- content: file.content
111
+ content: file.content,
112
+ encoding: file.content_encoding
112
113
  }
113
114
  end
114
115
  end
@@ -529,18 +529,18 @@ module Dependabot
529
529
 
530
530
  # Filter out the conditions where from_config_file is false and dependency is in @dependencies
531
531
  valid_ignore_conditions = @ignore_conditions.select do |ic|
532
- !ic[:from_config_file] && dependencies.any? { |dep| dep.name == ic[:dependency_name] }
532
+ ic["source"] =~ /\A@dependabot ignore/ && dependencies.any? { |dep| dep.name == ic["dependency-name"] }
533
533
  end
534
534
 
535
535
  # Return an empty string if no valid ignore conditions after filtering
536
536
  return "" if valid_ignore_conditions.empty?
537
537
 
538
538
  # Sort them by updated_at (or created_at if updated_at is nil), taking the latest 20
539
- sorted_ignore_conditions = valid_ignore_conditions.sort_by { |ic| ic[:updated_at] || ic[:created_at] }.last(20)
539
+ sorted_ignore_conditions = valid_ignore_conditions.sort_by { |ic| ic["updated-at"] }.last(20)
540
540
 
541
541
  # Map each condition to a row string
542
542
  table_rows = sorted_ignore_conditions.map do |ic|
543
- "| #{ic[:dependency_name]} | [#{ic[:version_requirement]}] |"
543
+ "| #{ic['dependency-name']} | [#{ic['version-requirement']}] |"
544
544
  end
545
545
 
546
546
  summary = "Most Recent Ignore Conditions Applied to This Pull Request"
@@ -230,6 +230,8 @@ module Dependabot
230
230
  @pr_message_encoding = Azure::PR_DESCRIPTION_ENCODING if @pr_message_encoding.nil?
231
231
  when "codecommit"
232
232
  @pr_message_max_length = Codecommit::PR_DESCRIPTION_MAX_LENGTH if @pr_message_max_length.nil?
233
+ when "bitbucket"
234
+ @pr_message_max_length = Bitbucket::PR_DESCRIPTION_MAX_LENGTH if @pr_message_max_length.nil?
233
235
  end
234
236
 
235
237
  @message = MessageBuilder.new(
@@ -144,8 +144,7 @@ module Dependabot
144
144
  end
145
145
 
146
146
  {
147
- path: (file.symlink_target ||
148
- file.path).sub(%r{^/}, ""),
147
+ path: file.realpath,
149
148
  mode: "100644",
150
149
  type: "blob"
151
150
  }.merge(content)
@@ -79,7 +79,8 @@ module Dependabot
79
79
  {
80
80
  action: file_action(file),
81
81
  file_path: file.type == "symlink" ? file.symlink_target : file.path,
82
- content: file.content
82
+ content: file.content,
83
+ encoding: file.content_encoding
83
84
  }
84
85
  end
85
86
  end
@@ -191,6 +191,13 @@ module Dependabot
191
191
  reset_global_git_config(backup_git_config_path)
192
192
  end
193
193
 
194
+ # Handle SCP-style git URIs
195
+ def self.scp_to_standard(uri)
196
+ return uri unless uri.start_with?("git@")
197
+
198
+ "https://#{uri.split('git@').last.sub(%r{:/?}, '/')}"
199
+ end
200
+
194
201
  def self.credential_helper_path
195
202
  File.join(__dir__, "../../bin/git-credential-store-immutable")
196
203
  end
data/lib/dependabot.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dependabot
4
- VERSION = "0.225.0"
4
+ VERSION = "0.226.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.225.0
4
+ version: 0.226.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-31 00:00:00.000000000 Z
11
+ date: 2023-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-codecommit
@@ -84,14 +84,14 @@ dependencies:
84
84
  requirements:
85
85
  - - "~>"
86
86
  - !ruby/object:Gem::Version
87
- version: 1.14.0
87
+ version: 1.18.0
88
88
  type: :runtime
89
89
  prerelease: false
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: 1.14.0
94
+ version: 1.18.0
95
95
  - !ruby/object:Gem::Dependency
96
96
  name: excon
97
97
  requirement: !ruby/object:Gem::Requirement
@@ -101,7 +101,7 @@ dependencies:
101
101
  version: '0.96'
102
102
  - - "<"
103
103
  - !ruby/object:Gem::Version
104
- version: '0.100'
104
+ version: '0.101'
105
105
  type: :runtime
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
@@ -111,35 +111,35 @@ dependencies:
111
111
  version: '0.96'
112
112
  - - "<"
113
113
  - !ruby/object:Gem::Version
114
- version: '0.100'
114
+ version: '0.101'
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: faraday
117
117
  requirement: !ruby/object:Gem::Requirement
118
118
  requirements:
119
119
  - - '='
120
120
  - !ruby/object:Gem::Version
121
- version: 2.7.4
121
+ version: 2.7.10
122
122
  type: :runtime
123
123
  prerelease: false
124
124
  version_requirements: !ruby/object:Gem::Requirement
125
125
  requirements:
126
126
  - - '='
127
127
  - !ruby/object:Gem::Version
128
- version: 2.7.4
128
+ version: 2.7.10
129
129
  - !ruby/object:Gem::Dependency
130
130
  name: faraday-retry
131
131
  requirement: !ruby/object:Gem::Requirement
132
132
  requirements:
133
133
  - - '='
134
134
  - !ruby/object:Gem::Version
135
- version: 2.1.0
135
+ version: 2.2.0
136
136
  type: :runtime
137
137
  prerelease: false
138
138
  version_requirements: !ruby/object:Gem::Requirement
139
139
  requirements:
140
140
  - - '='
141
141
  - !ruby/object:Gem::Version
142
- version: 2.1.0
142
+ version: 2.2.0
143
143
  - !ruby/object:Gem::Dependency
144
144
  name: gitlab
145
145
  requirement: !ruby/object:Gem::Requirement
@@ -346,14 +346,14 @@ dependencies:
346
346
  requirements:
347
347
  - - "~>"
348
348
  - !ruby/object:Gem::Version
349
- version: 1.17.1
349
+ version: 1.18.0
350
350
  type: :development
351
351
  prerelease: false
352
352
  version_requirements: !ruby/object:Gem::Requirement
353
353
  requirements:
354
354
  - - "~>"
355
355
  - !ruby/object:Gem::Version
356
- version: 1.17.1
356
+ version: 1.18.0
357
357
  - !ruby/object:Gem::Dependency
358
358
  name: stackprof
359
359
  requirement: !ruby/object:Gem::Requirement
@@ -486,7 +486,7 @@ licenses:
486
486
  - Nonstandard
487
487
  metadata:
488
488
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
489
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.225.0
489
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.226.0
490
490
  post_install_message:
491
491
  rdoc_options: []
492
492
  require_paths: