semverve 0.3.0 → 0.4.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.
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "error"
4
+
5
+ module Semverve
6
+ ##
7
+ # Rewrites a named capture inside the first match for a safe version literal.
8
+ class VersionLiteralRewriter
9
+ ##
10
+ # Initializes a literal rewriter.
11
+ #
12
+ # @param [Regexp] pattern
13
+ # @param [String, #to_s] replacement
14
+ # @param [Symbol, String] capture
15
+ #
16
+ # @return [Semverve::VersionLiteralRewriter]
17
+ def initialize(pattern:, replacement:, capture: :version)
18
+ @pattern = pattern
19
+ @replacement = replacement.to_s
20
+ @capture_name = capture.to_s
21
+ @capture_key = capture.to_sym
22
+
23
+ validate_capture
24
+ end
25
+
26
+ ##
27
+ # Rewrites the configured capture in +text+.
28
+ #
29
+ # @param [String] text
30
+ #
31
+ # @return [String]
32
+ def rewrite(text)
33
+ text.sub(pattern) do |matched_text|
34
+ match = Regexp.last_match
35
+ capture_start = match.begin(capture_key) - match.begin(0)
36
+ capture_end = match.end(capture_key) - match.begin(0)
37
+
38
+ "#{matched_text[0...capture_start]}#{replacement}#{matched_text[capture_end..]}"
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ ##
45
+ # Safe literal pattern.
46
+ #
47
+ # @return [Regexp]
48
+ attr_reader :pattern
49
+
50
+ ##
51
+ # Replacement text.
52
+ #
53
+ # @return [String]
54
+ attr_reader :replacement
55
+
56
+ ##
57
+ # Named capture as a string.
58
+ #
59
+ # @return [String]
60
+ attr_reader :capture_name
61
+
62
+ ##
63
+ # Named capture as a symbol.
64
+ #
65
+ # @return [Symbol]
66
+ attr_reader :capture_key
67
+
68
+ ##
69
+ # Validates that the pattern can be rewritten safely.
70
+ #
71
+ # @return [void]
72
+ def validate_capture
73
+ return if pattern.named_captures.key?(capture_name)
74
+
75
+ raise Error, "version literal pattern must include a named capture called #{capture_name}."
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "error"
4
+
5
+ module Semverve
6
+ ##
7
+ # Decides whether a discovered version should be reported or fixed.
8
+ class VersionMatchPolicy
9
+ ##
10
+ # Initializes a version match policy.
11
+ #
12
+ # @param [Semverve::SemanticVersion] current_version
13
+ # @param [Symbol, String] match_mode
14
+ # @param [Semverve::SemanticVersion, nil] target_version
15
+ #
16
+ # @return [Semverve::VersionMatchPolicy]
17
+ def initialize(current_version:, match_mode:, target_version: nil)
18
+ @current_version = current_version
19
+ @match_mode = match_mode.to_sym
20
+ @target_version = target_version
21
+ end
22
+
23
+ ##
24
+ # Whether the version should be reported or fixed.
25
+ #
26
+ # @param [Semverve::SemanticVersion] version
27
+ #
28
+ # @return [Boolean]
29
+ def report?(version)
30
+ return version == target_version if target_version
31
+
32
+ case match_mode
33
+ when :older
34
+ version < current_version
35
+ when :non_current
36
+ version != current_version
37
+ else
38
+ raise Error, "Unknown version match mode #{match_mode.inspect}. Use :older or :non_current."
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ ##
45
+ # Current Semverve version.
46
+ #
47
+ # @return [Semverve::SemanticVersion]
48
+ attr_reader :current_version
49
+
50
+ ##
51
+ # Matching mode when no exact target version is supplied.
52
+ #
53
+ # @return [Symbol]
54
+ attr_reader :match_mode
55
+
56
+ ##
57
+ # Exact version to match.
58
+ #
59
+ # @return [Semverve::SemanticVersion, nil]
60
+ attr_reader :target_version
61
+ end
62
+ end
@@ -2,9 +2,11 @@
2
2
 
3
3
  require "ripper"
4
4
 
5
- require_relative "error"
6
5
  require_relative "file_list_resolver"
6
+ require_relative "finding"
7
+ require_relative "fix_result"
7
8
  require_relative "semantic_version"
9
+ require_relative "version_match_policy"
8
10
 
9
11
  module Semverve
10
12
  ##
@@ -28,78 +30,6 @@ module Semverve
28
30
  # @return [Array<String>]
29
31
  TEXT_EXTENSIONS = %w[.adoc .markdown .md .rdoc .txt].freeze
30
32
 
31
- ##
32
- # A stale or non-current version reference found in a project file.
33
- class Finding
34
- ##
35
- # Path relative to the configured project root.
36
- #
37
- # @return [String]
38
- attr_reader :path
39
-
40
- ##
41
- # One-based line number.
42
- #
43
- # @return [Integer]
44
- attr_reader :line
45
-
46
- ##
47
- # One-based column number.
48
- #
49
- # @return [Integer]
50
- attr_reader :column
51
-
52
- ##
53
- # Referenced semantic version.
54
- #
55
- # @return [Semverve::SemanticVersion]
56
- attr_reader :version
57
-
58
- ##
59
- # Initializes a finding.
60
- #
61
- # @param [String] path
62
- # @param [Integer] line
63
- # @param [Integer] column
64
- # @param [Semverve::SemanticVersion] version
65
- #
66
- # @return [Semverve::VersionReferences::Finding]
67
- def initialize(path:, line:, column:, version:)
68
- @path = path
69
- @line = line
70
- @column = column
71
- @version = version
72
- end
73
- end
74
-
75
- ##
76
- # Result of fixing version references.
77
- class FixResult
78
- ##
79
- # Files changed by the fix.
80
- #
81
- # @return [Array<String>]
82
- attr_reader :changed_files
83
-
84
- ##
85
- # Number of replacements made.
86
- #
87
- # @return [Integer]
88
- attr_reader :replacement_count
89
-
90
- ##
91
- # Initializes a fix result.
92
- #
93
- # @param [Array<String>] changed_files
94
- # @param [Integer] replacement_count
95
- #
96
- # @return [Semverve::VersionReferences::FixResult]
97
- def initialize(changed_files:, replacement_count:)
98
- @changed_files = changed_files
99
- @replacement_count = replacement_count
100
- end
101
- end
102
-
103
33
  ##
104
34
  # Initializes version-reference scanning.
105
35
  #
@@ -117,7 +47,7 @@ module Semverve
117
47
  ##
118
48
  # Version-reference findings in configured files.
119
49
  #
120
- # @return [Array<Semverve::VersionReferences::Finding>]
50
+ # @return [Array<Semverve::Finding>]
121
51
  def findings
122
52
  files.flat_map { |path| findings_for_file(path) }
123
53
  end
@@ -125,7 +55,7 @@ module Semverve
125
55
  ##
126
56
  # Replaces found version references with the current version.
127
57
  #
128
- # @return [Semverve::VersionReferences::FixResult]
58
+ # @return [Semverve::FixResult]
129
59
  def fix
130
60
  changed_files = []
131
61
  replacement_count = 0
@@ -141,7 +71,7 @@ module Semverve
141
71
  replacement_count += count
142
72
  end
143
73
 
144
- FixResult.new(changed_files: changed_files, replacement_count: replacement_count)
74
+ Semverve::FixResult.new(changed_files: changed_files, replacement_count: replacement_count)
145
75
  end
146
76
 
147
77
  private
@@ -202,7 +132,7 @@ module Semverve
202
132
  #
203
133
  # @param [String] path
204
134
  #
205
- # @return [Array<Semverve::VersionReferences::Finding>]
135
+ # @return [Array<Semverve::Finding>]
206
136
  def findings_for_file(path)
207
137
  content = File.read(path)
208
138
 
@@ -324,10 +254,10 @@ module Semverve
324
254
  # @param [Hash] segment
325
255
  # @param [String] content
326
256
  #
327
- # @return [Array<Semverve::VersionReferences::Finding>]
257
+ # @return [Array<Semverve::Finding>]
328
258
  def findings_for_segment(path, segment, content)
329
259
  references_for_segment(segment, content).map do |reference|
330
- Finding.new(
260
+ Semverve::Finding.new(
331
261
  path: relative_path(path),
332
262
  line: segment[:line],
333
263
  column: reference[:column],
@@ -386,14 +316,7 @@ module Semverve
386
316
  def report?(version)
387
317
  return version == target_version if target_version
388
318
 
389
- case configuration.version_match_mode
390
- when :older
391
- version < current_version
392
- when :non_current
393
- version != current_version
394
- else
395
- raise Error, "Unknown version match mode #{configuration.version_match_mode.inspect}. Use :older or :non_current."
396
- end
319
+ match_policy.report?(version)
397
320
  end
398
321
 
399
322
  ##
@@ -414,6 +337,18 @@ module Semverve
414
337
  previous_nonblank_line&.include?(IGNORE_MARKER)
415
338
  end
416
339
 
340
+ ##
341
+ # Version matching behavior for references.
342
+ #
343
+ # @return [Semverve::VersionMatchPolicy]
344
+ def match_policy
345
+ @match_policy ||= VersionMatchPolicy.new(
346
+ current_version: current_version,
347
+ match_mode: configuration.version_match_mode,
348
+ target_version: target_version
349
+ )
350
+ end
351
+
417
352
  ##
418
353
  # Starting index for each line in content.
419
354
  #
data/lib/semverve.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "semverve/finding"
4
+ require_relative "semverve/fix_result"
5
+ require_relative "semverve/version_literal_rewriter"
6
+ require_relative "semverve/version_match_policy"
3
7
  require_relative "semverve/configuration"
4
8
  require_relative "semverve/version"
5
9
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semverve
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Gray
@@ -107,26 +107,34 @@ files:
107
107
  - LICENSE
108
108
  - README.md
109
109
  - Rakefile
110
+ - UPGRADING.md
110
111
  - lib/semverve.rb
112
+ - lib/semverve/adapters.rb
111
113
  - lib/semverve/configuration.rb
112
114
  - lib/semverve/docs_publisher.rb
113
115
  - lib/semverve/docs_publisher/task.rb
114
116
  - lib/semverve/error.rb
115
117
  - lib/semverve/file_list_resolver.rb
118
+ - lib/semverve/finding.rb
119
+ - lib/semverve/fix_result.rb
116
120
  - lib/semverve/formats.rb
117
121
  - lib/semverve/formats/module_constants.rb
118
122
  - lib/semverve/formats/simple_string.rb
119
123
  - lib/semverve/generator.rb
124
+ - lib/semverve/package_metadata.rb
120
125
  - lib/semverve/presets.rb
121
126
  - lib/semverve/project_metadata.rb
122
127
  - lib/semverve/published_version.rb
128
+ - lib/semverve/rails_config_metadata.rb
123
129
  - lib/semverve/railtie.rb
124
130
  - lib/semverve/semantic_version.rb
125
131
  - lib/semverve/task.rb
126
132
  - lib/semverve/version.rb
133
+ - lib/semverve/version_checks.rb
127
134
  - lib/semverve/version_code_references.rb
128
135
  - lib/semverve/version_file.rb
129
- - lib/semverve/version_metadata.rb
136
+ - lib/semverve/version_literal_rewriter.rb
137
+ - lib/semverve/version_match_policy.rb
130
138
  - lib/semverve/version_references.rb
131
139
  - semverve.gemspec
132
140
  homepage: https://github.com/evanthegrayt/semverve