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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +147 -27
- data/UPGRADING.md +78 -0
- data/lib/semverve/adapters.rb +292 -0
- data/lib/semverve/configuration.rb +52 -27
- data/lib/semverve/finding.rb +55 -0
- data/lib/semverve/fix_result.rb +39 -0
- data/lib/semverve/{version_metadata.rb → package_metadata.rb} +36 -116
- data/lib/semverve/presets.rb +4 -100
- data/lib/semverve/project_metadata.rb +8 -5
- data/lib/semverve/rails_config_metadata.rb +176 -0
- data/lib/semverve/railtie.rb +1 -1
- data/lib/semverve/task.rb +94 -150
- data/lib/semverve/version.rb +1 -1
- data/lib/semverve/version_checks.rb +518 -0
- data/lib/semverve/version_code_references.rb +32 -94
- data/lib/semverve/version_literal_rewriter.rb +78 -0
- data/lib/semverve/version_match_policy.rb +62 -0
- data/lib/semverve/version_references.rb +22 -87
- data/lib/semverve.rb +4 -0
- metadata +10 -2
|
@@ -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::
|
|
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::
|
|
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::
|
|
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::
|
|
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
|
-
|
|
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.
|
|
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/
|
|
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
|