Class: Kettle::Family::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/kettle/family/config.rb

Constant Summary collapse

DEFAULT_PATHS =
[".kettle-family.yml", ".structuredmerge/kettle-family.yml"].freeze
DEFAULT_MEMBER_EXCLUDES =
[
  "vendor/**",
  "**/vendor/**",
  "benchmarks/**",
  "**/benchmarks/**",
  "tmp/**",
  "**/tmp/**",
  "spec/**",
  "**/spec/**",
  "test/**",
  "**/test/**"
].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root:, path:, data:) ⇒ Config

Returns a new instance of Config.



35
36
37
38
39
# File 'lib/kettle/family/config.rb', line 35

def initialize(root:, path:, data:)
  @root = root
  @path = path
  @data = stringify_keys(data)
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



22
23
24
# File 'lib/kettle/family/config.rb', line 22

def data
  @data
end

#pathObject (readonly)

Returns the value of attribute path.



22
23
24
# File 'lib/kettle/family/config.rb', line 22

def path
  @path
end

#rootObject (readonly)

Returns the value of attribute root.



22
23
24
# File 'lib/kettle/family/config.rb', line 22

def root
  @root
end

Class Method Details

.load(root:, path: nil) ⇒ Object



24
25
26
27
28
29
30
31
32
33
# File 'lib/kettle/family/config.rb', line 24

def self.load(root:, path: nil)
  expanded_root = File.expand_path(root)
  config_path = path && File.expand_path(path, expanded_root)
  config_path ||= DEFAULT_PATHS
    .map { |candidate| File.join(expanded_root, candidate) }
    .find { |candidate| File.file?(candidate) }

  data = config_path ? YAML.load_file(config_path) : {}
  new(root: expanded_root, path: config_path, data: data || {})
end

Instance Method Details

#branch_lanesObject



299
300
301
# File 'lib/kettle/family/config.rb', line 299

def branch_lanes
  fetch_path("branch_lanes") || fetch_path("branches", "lanes") || {}
end

#changelog_envObject



182
183
184
185
186
187
188
# File 'lib/kettle/family/config.rb', line 182

def changelog_env
  env = {}
  env["K_CHANGELOG_VERSION_FILE"] = changelog_version_file.to_s if changelog_version_file
  env["K_CHANGELOG_GEM_NAME"] = family_name.to_s if shared_changelog?

  env
end

#changelog_full_path(member) ⇒ Object



178
179
180
# File 'lib/kettle/family/config.rb', line 178

def changelog_full_path(member)
  File.expand_path(changelog_path, shared_changelog? ? root : member.root)
end

#changelog_modeObject



158
159
160
# File 'lib/kettle/family/config.rb', line 158

def changelog_mode
  fetch_path("changelog", "mode") || "member"
end

#changelog_pathObject



166
167
168
# File 'lib/kettle/family/config.rb', line 166

def changelog_path
  fetch_path("changelog", "path") || "CHANGELOG.md"
end

#changelog_version_fileObject



170
171
172
# File 'lib/kettle/family/config.rb', line 170

def changelog_version_file
  fetch_path("changelog", "version_file")
end

#changelog_workdir(_member = nil) ⇒ Object



174
175
176
# File 'lib/kettle/family/config.rb', line 174

def changelog_workdir(_member = nil)
  shared_changelog? ? root : nil
end

#check_forbidden_tracked_member_dirsObject



142
143
144
# File 'lib/kettle/family/config.rb', line 142

def check_forbidden_tracked_member_dirs
  fetch_path("check", "forbidden_tracked_member_dirs") || []
end

#check_forbidden_tracked_member_dirs_exceptObject



146
147
148
# File 'lib/kettle/family/config.rb', line 146

def check_forbidden_tracked_member_dirs_except
  fetch_path("check", "forbidden_tracked_member_dirs_except") || []
end

#check_member_required_dirsObject



138
139
140
# File 'lib/kettle/family/config.rb', line 138

def check_member_required_dirs
  fetch_path("check", "member_required_dirs") || []
end


150
151
152
# File 'lib/kettle/family/config.rb', line 150

def check_readme_links
  fetch_path("check", "readme_links") || {}
end

#check_required_binsObject



130
131
132
# File 'lib/kettle/family/config.rb', line 130

def check_required_bins
  fetch_path("check", "required_bins") || ReadinessCheck::REQUIRED_BINS
end

#check_required_filesObject



126
127
128
# File 'lib/kettle/family/config.rb', line 126

def check_required_files
  fetch_path("check", "required_files") || ReadinessCheck::REQUIRED_FILES
end

#check_root_required_filesObject



134
135
136
# File 'lib/kettle/family/config.rb', line 134

def check_root_required_files
  fetch_path("check", "root_required_files") || []
end

#command_for(name) ⇒ Object



122
123
124
# File 'lib/kettle/family/config.rb', line 122

def command_for(name)
  fetch_path("commands", name)
end

#configured_member_rootsObject



79
80
81
# File 'lib/kettle/family/config.rb', line 79

def configured_member_roots
  Array(fetch_path("members", "roots")).map { |path| File.expand_path(path, root) }
end

#configured_member_roots?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/kettle/family/config.rb', line 83

def configured_member_roots?
  !fetch_path("members", "roots").nil?
end

#discover_member_rootsObject



87
88
89
90
91
# File 'lib/kettle/family/config.rb', line 87

def discover_member_roots
  return sibling_member_roots if family_mode == "sibling_repos"

  [members_root]
end

#discover_members?Boolean

Returns:

  • (Boolean)


103
104
105
106
# File 'lib/kettle/family/config.rb', line 103

def discover_members?
  members = data.fetch("members", {})
  members.fetch("discover", true)
end

#explicit_membersObject



93
94
95
96
97
98
99
100
101
# File 'lib/kettle/family/config.rb', line 93

def explicit_members
  members = data.fetch("members", {})
  explicit = members.fetch("explicit", [])
  explicit.map do |entry|
    entry = stringify_keys(entry)
    member_root = File.expand_path(entry.fetch("root"), root)
    entry.merge("root" => member_root)
  end
end

#family_local_path_envObject



58
59
60
61
62
63
# File 'lib/kettle/family/config.rb', line 58

def family_local_path_env
  name = family_local_path_env_name
  return {} unless name

  {name => family_local_path_root}
end

#family_local_path_env_nameObject



45
46
47
48
49
50
51
# File 'lib/kettle/family/config.rb', line 45

def family_local_path_env_name
  configured = fetch_path("family", "local_path_env")
  return nil if configured == false
  return configured.to_s unless configured.to_s.empty?

  "#{family_name.gsub(/[^A-Za-z0-9]+/, "_").upcase}_DEV"
end

#family_local_path_rootObject



53
54
55
56
# File 'lib/kettle/family/config.rb', line 53

def family_local_path_root
  configured = fetch_path("family", "local_path_root")
  configured ? expand_config_relative_path(configured) : members_root
end

#family_modeObject



65
66
67
# File 'lib/kettle/family/config.rb', line 65

def family_mode
  fetch_path("family", "mode") || "monorepo"
end

#family_nameObject



41
42
43
# File 'lib/kettle/family/config.rb', line 41

def family_name
  fetch_path("family", "name") || File.basename(root)
end

#install_local_dependenciesObject



236
237
238
239
240
241
242
# File 'lib/kettle/family/config.rb', line 236

def install_local_dependencies
  paths = fetch_path("install", "local_dependencies") || fetch_path("local_dependencies") || []
  Array(paths).map do |entry|
    value = entry.is_a?(Hash) ? stringify_keys(entry).fetch("path") : entry
    expand_config_relative_path(value)
  end
end

#member_exclude_patternsObject



108
109
110
111
112
# File 'lib/kettle/family/config.rb', line 108

def member_exclude_patterns
  members = data.fetch("members", {})
  patterns = members.fetch("exclude", nil) || members.fetch("ignore", nil) || []
  DEFAULT_MEMBER_EXCLUDES + Array(patterns)
end

#member_release_target_branchesObject



292
293
294
295
296
297
# File 'lib/kettle/family/config.rb', line 292

def member_release_target_branches
  targets = fetch_path("release", "member_target_branches") || {}
  targets.to_h do |member_name, branches|
    [member_name.to_s, Array(branches).map(&:to_s)]
  end
end

#member_rootsObject



74
75
76
77
# File 'lib/kettle/family/config.rb', line 74

def member_roots
  return configured_member_roots if configured_member_roots?
  discover_member_roots
end

#members_rootObject



69
70
71
72
# File 'lib/kettle/family/config.rb', line 69

def members_root
  configured = fetch_path("family", "members_root") || fetch_path("members", "root")
  configured ? File.expand_path(configured, root) : root
end

#normalize_lockfiles?Boolean

Returns:

  • (Boolean)


213
214
215
# File 'lib/kettle/family/config.rb', line 213

def normalize_lockfiles?
  fetch_path("template", "normalize_lockfiles") == true
end

#normalize_lockfiles_commandObject



217
218
219
# File 'lib/kettle/family/config.rb', line 217

def normalize_lockfiles_command
  fetch_path("template", "normalize_lockfiles_command") || "bundle lock"
end

#order_hintsObject



118
119
120
# File 'lib/kettle/family/config.rb', line 118

def order_hints
  fetch_path("members", "order", "hints") || []
end

#order_modeObject



114
115
116
# File 'lib/kettle/family/config.rb', line 114

def order_mode
  fetch_path("members", "order", "mode") || "dependency"
end

#pre_release_image_url_skip_patternsObject



154
155
156
# File 'lib/kettle/family/config.rb', line 154

def pre_release_image_url_skip_patterns
  Array(fetch_path("pre_release", "image_url_skip_patterns")).map(&:to_s)
end

#readme_corporate_sponsorsObject



206
207
208
209
210
211
# File 'lib/kettle/family/config.rb', line 206

def readme_corporate_sponsors
  raw = fetch_path("readme", "corporate_sponsors") ||
    fetch_path("sponsorships", "corporate") ||
    fetch_path("corporate_sponsors")
  normalize_corporate_sponsors(raw)
end

#release_auto_dependency_floors?Boolean

Returns:

  • (Boolean)


268
269
270
# File 'lib/kettle/family/config.rb', line 268

def release_auto_dependency_floors?
  fetch_path("release", "auto_dependency_floors") != false
end

#release_build_commandObject



244
245
246
# File 'lib/kettle/family/config.rb', line 244

def release_build_command
  fetch_path("release", "build_command") || command_for("release_build") || "bundle exec rake build"
end

#release_disable_local_path_envObject



232
233
234
# File 'lib/kettle/family/config.rb', line 232

def release_disable_local_path_env
  Array(fetch_path("release", "disable_local_path_env"))
end

#release_envObject



256
257
258
# File 'lib/kettle/family/config.rb', line 256

def release_env
  stringify_env(fetch_path("release", "env") || {})
end

#release_family_changelog?Boolean

Returns:

  • (Boolean)


272
273
274
# File 'lib/kettle/family/config.rb', line 272

def release_family_changelog?
  fetch_path("release", "family_changelog", "enabled") == true
end

#release_family_changelog_commandObject



276
277
278
# File 'lib/kettle/family/config.rb', line 276

def release_family_changelog_command
  fetch_path("release", "family_changelog", "command") || "bundle exec kettle-changelog"
end

#release_jobsObject



264
265
266
# File 'lib/kettle/family/config.rb', line 264

def release_jobs
  fetch_path("release", "jobs")
end

#release_normalize_lockfiles?Boolean

Returns:

  • (Boolean)


221
222
223
224
225
226
# File 'lib/kettle/family/config.rb', line 221

def release_normalize_lockfiles?
  configured = fetch_path("release", "normalize_lockfiles")
  return configured unless configured.nil?

  normalize_lockfiles?
end

#release_normalize_lockfiles_commandObject



228
229
230
# File 'lib/kettle/family/config.rb', line 228

def release_normalize_lockfiles_command
  fetch_path("release", "normalize_lockfiles_command") || normalize_lockfiles_command
end

#release_publish_commandObject



248
249
250
# File 'lib/kettle/family/config.rb', line 248

def release_publish_command
  fetch_path("release", "publish_command") || command_for("release_publish") || "bundle exec kettle-release"
end

#release_push_commandObject



284
285
286
# File 'lib/kettle/family/config.rb', line 284

def release_push_command
  fetch_path("release", "push_command") || command_for("release_push") || "git push --follow-tags"
end

#release_required_remotesObject



252
253
254
# File 'lib/kettle/family/config.rb', line 252

def release_required_remotes
  fetch_path("release", "required_remotes")
end

#release_secretsObject



260
261
262
# File 'lib/kettle/family/config.rb', line 260

def release_secrets
  stringify_keys(fetch_path("release", "secrets") || {})
end

#release_tag_commandObject



280
281
282
# File 'lib/kettle/family/config.rb', line 280

def release_tag_command
  fetch_path("release", "tag_command") || command_for("release_tag") || "git tag"
end

#release_target_branchesObject



288
289
290
# File 'lib/kettle/family/config.rb', line 288

def release_target_branches
  fetch_path("release", "target_branches") || fetch_path("branches", "release_targets") || []
end

#shared_changelog?Boolean

Returns:

  • (Boolean)


162
163
164
# File 'lib/kettle/family/config.rb', line 162

def shared_changelog?
  changelog_mode == "root"
end

#template_commandObject



190
191
192
# File 'lib/kettle/family/config.rb', line 190

def template_command
  fetch_path("template", "command") || command_for("template")
end

#template_jobsObject



202
203
204
# File 'lib/kettle/family/config.rb', line 202

def template_jobs
  fetch_path("template", "jobs")
end

#template_profileObject



194
195
196
# File 'lib/kettle/family/config.rb', line 194

def template_profile
  fetch_path("template", "profile")
end

#template_repository_topologyObject



198
199
200
# File 'lib/kettle/family/config.rb', line 198

def template_repository_topology
  fetch_path("template", "repository_topology")
end