Class: Semverve::Configuration

Inherits:
Object
  • Object
show all
Defined in:
lib/semverve/configuration.rb

Overview

Mutable configuration used before Semverve resolves project defaults.

Constant Summary collapse

VALID_VERSION_CHECKS =

Version-maintenance surfaces supported by umbrella check and fix tasks.

Returns:

  • (Array<Symbol>)
[:doc_references, :code_references, :metadata].freeze
VALID_RELEASE_CHECKS =

Release-readiness surfaces supported by release check tasks.

Returns:

  • (Array<Symbol>)
[:rubygems].freeze
DEFAULT_VERSION_CODE_REFERENCE_PATTERN =

Default Ruby pattern for code version literals that are safe to rewrite.

Returns:

  • (Regexp)
/^\s*(?:(?:[A-Z]\w*::)*(?:[A-Z]\w*VERSION[A-Z0-9_]*|VERSION)|(?:[a-z_]\w*|self)\.version)\s*=\s*(?<quote>["'])(?<version>\d+\.\d+\.\d+)\k<quote>/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSemverve::Configuration

Initializes configuration with Semverve's default settings.



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/semverve/configuration.rb', line 125

def initialize
  @explicit_attributes = []
  @bundle_lock = false
  @command_runner = ->(command) { system(command) }
  @format = :module
  @preset = nil
  @rubygems_host = "https://rubygems.org"
  @version_code_reference_files = Rake::FileList[]
  self.version_code_reference_pattern = DEFAULT_VERSION_CODE_REFERENCE_PATTERN
  @version_doc_reference_files = Rake::FileList["README*", "**/README*"].exclude(
    ".git/**/*",
    "coverage/**/*",
    "tmp/**/*",
    "vendor/**/*"
  )
  @version_reference_mode = :older
  self.release_checks = []
  self.version_checks = VALID_VERSION_CHECKS
end

Instance Attribute Details

#bundle_lockBoolean

Whether increments should run bundle lock after writing a version.

Returns:

  • (Boolean)


35
36
37
# File 'lib/semverve/configuration.rb', line 35

def bundle_lock
  @bundle_lock
end

#command_runner#call

Callable used to run shell commands such as bundle lock.

Returns:

  • (#call)


41
42
43
# File 'lib/semverve/configuration.rb', line 41

def command_runner
  @command_runner
end

#formatSymbol, String

Version-file format to read, replace, or generate.

Returns:

  • (Symbol, String)


47
48
49
# File 'lib/semverve/configuration.rb', line 47

def format
  @format
end

#gem_nameString?

Explicit gem name to use instead of inferring one from the project.

Returns:

  • (String, nil)


53
54
55
# File 'lib/semverve/configuration.rb', line 53

def gem_name
  @gem_name
end

#module_nameString?

Explicit Ruby module name to use in generated version files.

Returns:

  • (String, nil)


59
60
61
# File 'lib/semverve/configuration.rb', line 59

def module_name
  @module_name
end

#presetSymbol, ...

Framework preset used to apply project defaults.

Returns:

  • (Symbol, String, nil)


65
66
67
# File 'lib/semverve/configuration.rb', line 65

def preset
  @preset
end

#release_checksArray<Symbol, String>

Release-readiness surfaces run by the release check task.

Returns:

  • (Array<Symbol, String>)


71
72
73
# File 'lib/semverve/configuration.rb', line 71

def release_checks
  @release_checks
end

#rootString?

Project root used when inferring metadata and expanding paths.

Returns:

  • (String, nil)


77
78
79
# File 'lib/semverve/configuration.rb', line 77

def root
  @root
end

#rubygems_hostString

RubyGems-compatible host used for published-version checks.

Returns:

  • (String)


83
84
85
# File 'lib/semverve/configuration.rb', line 83

def rubygems_host
  @rubygems_host
end

#version_checksArray<Symbol, String>

Version-maintenance surfaces run by the umbrella check and fix tasks.

Returns:

  • (Array<Symbol, String>)


113
114
115
# File 'lib/semverve/configuration.rb', line 113

def version_checks
  @version_checks
end

#version_code_reference_filesRake::FileList

Code files to scan for safe version literals.

Returns:

  • (Rake::FileList)


95
96
97
# File 'lib/semverve/configuration.rb', line 95

def version_code_reference_files
  @version_code_reference_files
end

#version_code_reference_patternRegexp

Pattern used to find safe version literals in code files.

Returns:

  • (Regexp)


101
102
103
# File 'lib/semverve/configuration.rb', line 101

def version_code_reference_pattern
  @version_code_reference_pattern
end

#version_doc_reference_filesRake::FileList

Documentation files to scan for version references.

Returns:

  • (Rake::FileList)


107
108
109
# File 'lib/semverve/configuration.rb', line 107

def version_doc_reference_files
  @version_doc_reference_files
end

#version_fileString?

Explicit version-file path relative to the project root.

Returns:

  • (String, nil)


89
90
91
# File 'lib/semverve/configuration.rb', line 89

def version_file
  @version_file
end

#version_reference_modeSymbol, String

Version-reference comparison mode.

Returns:

  • (Symbol, String)


119
120
121
# File 'lib/semverve/configuration.rb', line 119

def version_reference_mode
  @version_reference_mode
end

Instance Method Details

#expanded_rootString

Absolute project root.

Returns:

  • (String)


266
267
268
# File 'lib/semverve/configuration.rb', line 266

def expanded_root
  File.expand_path(resolved_value(:root) || Dir.pwd)
end

#normalize_release_checks(checks) ⇒ Array<Symbol>

Normalizes and validates release checks.

Parameters:

  • checks (Array<Symbol, String>)

Returns:

  • (Array<Symbol>)

Raises:



339
340
341
342
343
344
345
346
347
# File 'lib/semverve/configuration.rb', line 339

def normalize_release_checks(checks)
  normalized_checks = Array(checks).map do |check|
    check.respond_to?(:to_sym) ? check.to_sym : check
  end
  return normalized_checks if normalized_checks.all? { |check| VALID_RELEASE_CHECKS.include?(check) }

  invalid_checks = normalized_checks.reject { |check| VALID_RELEASE_CHECKS.include?(check) }
  raise Error, "Unknown release check #{invalid_checks.map(&:inspect).join(", ")}. Use :rubygems."
end

#normalize_version_checks(checks) ⇒ Array<Symbol>

Normalizes and validates umbrella version checks.

Parameters:

  • checks (Array<Symbol, String>)

Returns:

  • (Array<Symbol>)

Raises:



321
322
323
324
325
326
327
328
329
330
331
# File 'lib/semverve/configuration.rb', line 321

def normalize_version_checks(checks)
  normalized_checks = Array(checks).map do |check|
    check.respond_to?(:to_sym) ? check.to_sym : check
  end
  return normalized_checks if normalized_checks.all? { |check| VALID_VERSION_CHECKS.include?(check) }

  invalid_checks = normalized_checks.reject { |check| VALID_VERSION_CHECKS.include?(check) }
  valid_check_names = VALID_VERSION_CHECKS.map(&:inspect)
  valid_checks = "#{valid_check_names[0...-1].join(", ")}, or #{valid_check_names.last}"
  raise Error, "Unknown version check #{invalid_checks.map(&:inspect).join(", ")}. Use #{valid_checks}."
end

#normalized_formatSymbol

Configured format normalized for lookup.

Returns:

  • (Symbol)


274
275
276
# File 'lib/semverve/configuration.rb', line 274

def normalized_format
  resolved_value(:format).to_sym
end

#normalized_release_checksArray<Symbol>

Configured release checks normalized for lookup.

Returns:

  • (Array<Symbol>)


282
283
284
# File 'lib/semverve/configuration.rb', line 282

def normalized_release_checks
  normalize_release_checks(release_checks)
end

#normalized_version_checksArray<Symbol>

Configured version checks normalized for lookup.

Returns:

  • (Array<Symbol>)


303
304
305
# File 'lib/semverve/configuration.rb', line 303

def normalized_version_checks
  normalize_version_checks(version_checks)
end

#normalized_version_reference_modeSymbol

Configured version-reference mode normalized for lookup.

Returns:

  • (Symbol)


311
312
313
# File 'lib/semverve/configuration.rb', line 311

def normalized_version_reference_mode
  version_reference_mode.to_sym
end

#resolvedSemverve::ResolvedConfiguration

Resolves explicit configuration and inferred project metadata.



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/semverve/configuration.rb', line 149

def resolved
   = ProjectMetadata.new(self)

  ResolvedConfiguration.new(
    bundle_lock: bundle_lock,
    command_runner: command_runner,
    format: normalized_format,
    gem_name: .gem_name,
    module_name: .module_name,
    release_checks: normalized_release_checks,
    root: expanded_root,
    rubygems_host: rubygems_host,
    version_file: .version_file,
    version_checks: normalized_version_checks,
    version_code_reference_files: version_code_reference_files,
    version_code_reference_pattern: version_code_reference_pattern,
    version_doc_reference_files: version_doc_reference_files,
    version_reference_mode: normalized_version_reference_mode
  )
end

#resolved_value(attribute) ⇒ Object

Resolved value for a configurable attribute before metadata inference.

Parameters:

  • attribute (Symbol)

Returns:

  • (Object)


292
293
294
295
296
297
# File 'lib/semverve/configuration.rb', line 292

def resolved_value(attribute)
  return public_send(attribute) if explicit_attribute?(attribute)
  return preset_defaults[attribute] if preset_defaults.key?(attribute)

  public_send(attribute)
end

#validate_version_code_reference_pattern(pattern) ⇒ void

This method returns an undefined value.

Validates the configured code reference pattern.

Parameters:

  • pattern (Object)


355
356
357
358
359
360
361
362
363
# File 'lib/semverve/configuration.rb', line 355

def validate_version_code_reference_pattern(pattern)
  unless pattern.is_a?(Regexp)
    raise Error, "version_code_reference_pattern must be a Regexp."
  end

  unless pattern.named_captures.key?("version")
    raise Error, "version_code_reference_pattern must include a named capture called version."
  end
end