if_test_foo 0.0.4 → 0.0.5

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: dafb31274e1cce6fe5443f86457ce873ae19be43d3a205f9130b194fa1dab87b
4
- data.tar.gz: 73fccb790656c3fba9b8305bd15ac5bef7c2bf3bafd83a96b28b2a5230e3b8cb
3
+ metadata.gz: 8ffa70908fed56f8f808cd0e34fa82ea5d0dff6b7dfeb7076e6c2f940dbe8bbd
4
+ data.tar.gz: 300d99b7ac59c5acc020b49cc8a920c678e36bd0bc7606ee05872febc08de233
5
5
  SHA512:
6
- metadata.gz: 5775a971d8468ed8ba4b37c16d5755c0f843538b4c93c44d888ed02bec0b1051c5cd681ff7626c5d2e31f03e36190794d51fe42fba3dc4ba2b29935af14c74e8
7
- data.tar.gz: c22e3deeaad17152e322cb611f5591e19c3a7369f8550b433dccce6aab178bcdcad6f4aad49b243a488e81b0d95c174de6a30f0d3aa9f90b157ad468eb9d20bd
6
+ metadata.gz: 254f781ea32977293b1a469f74cc9cc0314187aa097dd9824419fb464665438fd5ed8471340feaa2a72cce88bba3e7a335c398f71ee4b91fb49b4afb797f7236
7
+ data.tar.gz: c7e5b30781f3e16b9d4ee18130328302a3019378c7d31130a9865b655950b11d8c74be8810793ac809dc056110866e859f93cfb42463603f503eb53c7c9a8c77
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+
5
+ module SemverDialects
6
+ # Handle the application command line parsing
7
+ # and the dispatch to various command objects
8
+ #
9
+ # @api public
10
+ class CLI < Thor
11
+ # Error raised by this runner
12
+ Error = Class.new(StandardError)
13
+
14
+ desc 'version', 'semver_dialects version'
15
+ def version
16
+ require_relative 'version'
17
+ puts "v#{SemverDialects::VERSION}"
18
+ end
19
+ map %w[--version -v] => :version
20
+
21
+ desc 'check_version TYPE VERSION CONSTRAINT', 'Command description...'
22
+ method_option :help, aliases: '-h', type: :boolean,
23
+ desc: 'Display usage information'
24
+ def check_version(type, version, constraint)
25
+ if options[:help]
26
+ invoke :help, ['check_version']
27
+ else
28
+ require_relative 'commands/check_version'
29
+ ecode = SemverDialects::Commands::CheckVersion.new(type, version, constraint, options).execute
30
+ exit(ecode)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+
5
+ module SemverDialects
6
+ # A CLI command
7
+ class Command
8
+ extend Forwardable
9
+
10
+ def_delegators :command, :run
11
+
12
+ # Execute this command
13
+ #
14
+ # @api public
15
+ def execute(*)
16
+ raise(
17
+ NotImplementedError,
18
+ "#{self.class}##{__method__} must be implemented"
19
+ )
20
+ end
21
+
22
+ # The external commands runner
23
+ #
24
+ # @see http://www.rubydoc.info/gems/tty-command
25
+ #
26
+ # @api public
27
+ def command(**options)
28
+ require 'tty-command'
29
+ TTY::Command.new(options)
30
+ end
31
+
32
+ # The cursor movement
33
+ #
34
+ # @see http://www.rubydoc.info/gems/tty-cursor
35
+ #
36
+ # @api public
37
+ def cursor
38
+ require 'tty-cursor'
39
+ TTY::Cursor
40
+ end
41
+
42
+ # Open a file or text in the user's preferred editor
43
+ #
44
+ # @see http://www.rubydoc.info/gems/tty-editor
45
+ #
46
+ # @api public
47
+ def editor
48
+ require 'tty-editor'
49
+ TTY::Editor
50
+ end
51
+
52
+ # File manipulation utility methods
53
+ #
54
+ # @see http://www.rubydoc.info/gems/tty-file
55
+ #
56
+ # @api public
57
+ def generator
58
+ require 'tty-file'
59
+ TTY::File
60
+ end
61
+
62
+ # Terminal output paging
63
+ #
64
+ # @see http://www.rubydoc.info/gems/tty-pager
65
+ #
66
+ # @api public
67
+ def pager(**options)
68
+ require 'tty-pager'
69
+ TTY::Pager.new(options)
70
+ end
71
+
72
+ # Terminal platform and OS properties
73
+ #
74
+ # @see http://www.rubydoc.info/gems/tty-pager
75
+ #
76
+ # @api public
77
+ def platform
78
+ require 'tty-platform'
79
+ TTY::Platform.new
80
+ end
81
+
82
+ # The interactive prompt
83
+ #
84
+ # @see http://www.rubydoc.info/gems/tty-prompt
85
+ #
86
+ # @api public
87
+ def prompt(**options)
88
+ require 'tty-prompt'
89
+ TTY::Prompt.new(options)
90
+ end
91
+
92
+ # Get terminal screen properties
93
+ #
94
+ # @see http://www.rubydoc.info/gems/tty-screen
95
+ #
96
+ # @api public
97
+ def screen
98
+ require 'tty-screen'
99
+ TTY::Screen
100
+ end
101
+
102
+ # The unix which utility
103
+ #
104
+ # @see http://www.rubydoc.info/gems/tty-which
105
+ #
106
+ # @api public
107
+ def which(*args)
108
+ require 'tty-which'
109
+ TTY::Which.which(*args)
110
+ end
111
+
112
+ # Check if executable exists
113
+ #
114
+ # @see http://www.rubydoc.info/gems/tty-which
115
+ #
116
+ # @api public
117
+ def exec_exist?(*args)
118
+ require 'tty-which'
119
+ TTY::Which.exist?(*args)
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../command'
4
+ require_relative '../../semver_dialects.rb'
5
+ require_relative '../semantic_version/version_translator.rb'
6
+ require_relative '../semantic_version/version_parser.rb'
7
+ require_relative '../semantic_version/version_range.rb'
8
+
9
+ module SemverDialects
10
+ module Commands
11
+ # The check version command implementation
12
+ class CheckVersion < SemverDialects::Command
13
+ def initialize(type, version, constraint, options)
14
+ @type = type
15
+ @version = version
16
+ @constraint = constraint
17
+ @options = options
18
+ @avail_types = %w[gem npm ruby pypi php maven go]
19
+ end
20
+
21
+ def execute(_input: $stdin, output: $stdout)
22
+ typ = @type.downcase
23
+ raise SemverDialects::Error, 'wrong package type' unless @avail_types.include?(typ)
24
+
25
+ if VersionChecker.version_sat?(typ, @version, @constraint)
26
+ output.puts "#{@version} matches #{@constraint} for #{@type}"
27
+ 0
28
+ else
29
+ output.puts "#{@version} does not match #{@constraint}"
30
+ 1
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,323 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../utils.rb'
4
+
5
+ class SemanticVersion
6
+ attr_reader :version_string, :prefix_delimiter, :prefix_segments, :suffix_segments, :segments
7
+
8
+ def initialize(version_string, segments = nil)
9
+ @version_string = version_string
10
+ @prefix_segments = []
11
+ @suffix_segments = []
12
+ @prefix_delimiter = 0
13
+ version, _ = version_string.split('+')
14
+ if segments.nil?
15
+ @segments = split_version_string!(version)
16
+ else
17
+ @prefix_segments = segments
18
+ @prefix_delimiter = segments.size - 1
19
+ @segments = segments
20
+ end
21
+ end
22
+
23
+ def split_version_string!(version_string)
24
+ delim_pattern = /[\.\-]/
25
+ split_array = version_string.split(delim_pattern).map {
26
+ |grp|
27
+ grp.split(/(\d+)/).reject { |cell| cell.nil? || cell.empty? }
28
+ }.flatten
29
+
30
+ # go as far to the right as possible considering numbers and placeholders
31
+ (0..split_array.size - 1).each do
32
+ |i|
33
+ if split_array[i].number? || split_array[i] == "X" || split_array[i] == "x"
34
+ @prefix_delimiter = i
35
+ else
36
+ break
37
+ end
38
+ end
39
+
40
+ # remove redundant trailing zeros
41
+ @prefix_delimiter.downto(0).each do
42
+ |i|
43
+ if split_array[i] == "0"
44
+ split_array.delete_at(i)
45
+ @prefix_delimiter -= 1
46
+ else
47
+ break
48
+ end
49
+ end
50
+
51
+ @prefix_segments = split_array[0..@prefix_delimiter].map { |group_string| SemanticVersionSegment.new(group_string) } unless @prefix_delimiter < 0
52
+ if split_array.size - 1 >= @prefix_delimiter + 1
53
+ @suffix_segments = split_array[@prefix_delimiter + 1, split_array.size].map { |group_string| SemanticVersionSegment.new(group_string) }
54
+ end
55
+
56
+ @prefix_segments.clone().concat(@suffix_segments)
57
+ end
58
+
59
+ def _get_equalized_arrays_for(array_a, array_b)
60
+ first_array = array_a.clone()
61
+ second_array = array_b.clone()
62
+ if first_array.size < second_array.size
63
+ (second_array.size - first_array.size).times do
64
+ first_array << SemanticVersionSegment.new("0")
65
+ end
66
+ elsif first_array.size > second_array.size
67
+ (first_array.size - second_array.size).times do
68
+ second_array << SemanticVersionSegment.new("0")
69
+ end
70
+ end
71
+ [first_array, second_array]
72
+ end
73
+
74
+ def get_equalized_arrays_for(semver_a, semver_b)
75
+ first_array_prefix = semver_a.prefix_segments.clone()
76
+ second_array_prefix = semver_b.prefix_segments.clone()
77
+ first_array_suffix = semver_a.suffix_segments.clone()
78
+ second_array_suffix = semver_b.suffix_segments.clone()
79
+ first_array_prefix, second_array_prefix = _get_equalized_arrays_for(first_array_prefix, second_array_prefix)
80
+ first_array_suffix, second_array_suffix = _get_equalized_arrays_for(first_array_suffix, second_array_suffix)
81
+ [first_array_prefix.concat(first_array_suffix), second_array_prefix.concat(second_array_suffix)]
82
+ end
83
+
84
+ def get_equalized_prefix_arrays_for(semver_a, semver_b)
85
+ first_array_prefix = semver_a.prefix_segments.clone()
86
+ second_array_prefix = semver_b.prefix_segments.clone()
87
+ first_array_prefix, second_array_prefix = _get_equalized_arrays_for(first_array_prefix, second_array_prefix)
88
+ [first_array_prefix, second_array_prefix]
89
+ end
90
+
91
+ def <(other_semver)
92
+ self_array, other_array = get_equalized_arrays_for(self, other_semver)
93
+ (0..self_array.size - 1).each {
94
+ |i|
95
+ if self_array[i] < other_array[i]
96
+ return true
97
+ elsif self_array[i] > other_array[i]
98
+ return false
99
+ end
100
+ }
101
+ false
102
+ end
103
+
104
+ def is_zero?
105
+ @prefix_segments.empty? || @prefix_segments.all? { |segment| segment.is_zero? }
106
+ end
107
+
108
+ def pre_release?
109
+ @suffix_segments.any?(&:is_pre_release)
110
+ end
111
+
112
+ def post_release?
113
+ @suffix_segments.any?(&:is_post_release)
114
+ end
115
+
116
+ def >(other_semver)
117
+ self_array, other_array = get_equalized_arrays_for(self, other_semver)
118
+ (0..self_array.size - 1).each {
119
+ |i|
120
+ if self_array[i] > other_array[i]
121
+ return true
122
+ elsif self_array[i] < other_array[i]
123
+ return false
124
+ end
125
+ }
126
+ false
127
+ end
128
+
129
+ def >=(other_semver)
130
+ self == other_semver || self > other_semver || self == other_semver
131
+ end
132
+
133
+ def <=(other_semver)
134
+ self == other_semver || self < other_semver
135
+ end
136
+
137
+ def ==(other_semver)
138
+ segments_a = []
139
+ segments_b = []
140
+
141
+ segments_a += other_semver.segments
142
+ segments_b += @segments
143
+
144
+ if other_semver.segments.size < @segments.size
145
+ (@segments.size - other_semver.segments.size).times {|_| segments_a << SemanticVersionSegment.new("0")}
146
+ elsif other_semver.segments.size > @segments.size
147
+ (other_semver.segments.size - @segments.size).times {|_| segments_b << SemanticVersionSegment.new("0") }
148
+ end
149
+
150
+ (0..segments_a.size - 1).each {
151
+ |i|
152
+ if segments_a[i] != segments_b[i]
153
+ return false
154
+ end
155
+ }
156
+ true
157
+ end
158
+
159
+ def !=(other_semver)
160
+ return !(self == other_semver)
161
+ end
162
+
163
+ def diff(other_semver, abs = true)
164
+ diffs = []
165
+
166
+ self_array, other_array = get_equalized_prefix_arrays_for(self, other_semver)
167
+ (0..self_array.size - 1).each {
168
+ |i|
169
+ # diff semantic groups
170
+ diffs << (self_array[i].diff(other_array[i], abs))
171
+ }
172
+ diffs
173
+ end
174
+
175
+ def to_normalized_s
176
+ @segments.map { |group| group.to_normalized_s }.join(":").to_s
177
+ end
178
+
179
+ def to_s
180
+ @segments.map { |group| group.to_s }.join(":").to_s
181
+ end
182
+
183
+ def minor
184
+ @prefix_segments.size >= 1 ? @prefix_segments[1].to_s : "0"
185
+ end
186
+
187
+ def major
188
+ @prefix_segments.size >= 2 ? @prefix_segments[0].to_s : "0"
189
+ end
190
+
191
+ def patch
192
+ @prefix_segments.size >= 3 ? @prefix_segments[2].to_s : "0"
193
+ end
194
+
195
+ def is_successor_of?(other_semver)
196
+ filtered_segments = self.diff(other_semver, false).reject { |i| i.to_i == 0 }
197
+ filtered_segments.size == 1 && filtered_segments.last.to_i == 1
198
+ end
199
+
200
+ def cross_total()
201
+ [self.major, self.minor, self.patch].reject { |i| i.empty? }.map { |i| i.to_i }.inject(0) { |sum, x| sum + x }
202
+ end
203
+ end
204
+
205
+ class SemanticVersionSegment
206
+ attr_accessor :normalized_group_string, :original_group_string, :is_post_release, :is_pre_release
207
+
208
+ @@group_suffixes = {
209
+ # pre-releases
210
+ "PRE" => -16,
211
+ "PREVIEW" => -16,
212
+ "DEV" => -15,
213
+ "A" => -14,
214
+ "ALPHA" => -13,
215
+ "B" => -12,
216
+ "BETA" => -12,
217
+ "RC" => -11,
218
+ "M" => -10,
219
+
220
+ "RELEASE" => 0,
221
+ "FINAL" => 0,
222
+ # PHP specific
223
+ "STABLE" => 0,
224
+
225
+ # post-releases
226
+ "SP" => 1,
227
+ }
228
+
229
+ def initialize(group_string)
230
+ @is_post_release = false
231
+ @is_pre_release = false
232
+
233
+ @version_string = group_string
234
+ @original_group_string = group_string
235
+ # use x as unique placeholder
236
+ group_string_ucase = group_string.to_s.gsub(/\*/, "x").upcase
237
+
238
+ if @@group_suffixes.key?(group_string_ucase)
239
+ value = @@group_suffixes[group_string_ucase]
240
+ @is_post_release = value > 0
241
+ @is_pre_release = value < 0
242
+ @normalized_group_string = @@group_suffixes[group_string_ucase].to_s
243
+ else
244
+ @normalized_group_string = group_string_ucase
245
+ end
246
+ end
247
+
248
+ def compare(semver_a, semver_b, ret_anr_bnonr, ret_anonr_bnr, comparator)
249
+ if semver_a.number? && semver_b.number?
250
+ semver_a.to_i.send(comparator, semver_b.to_i)
251
+ elsif semver_a.number? && !semver_b.number?
252
+ if semver_b == "X"
253
+ true
254
+ else
255
+ ret_anr_bnonr
256
+ end
257
+ elsif !semver_a.number? && semver_b.number?
258
+ if semver_a == "X"
259
+ true
260
+ else
261
+ ret_anonr_bnr
262
+ end
263
+ else # !semantic_version_b.group_string.is_number? && !semantic_version_agrous_string.is_number?
264
+ if semver_a == "X" || semver_b == "X"
265
+ true
266
+ else
267
+ semver_a.send(comparator, semver_b)
268
+ end
269
+ end
270
+ end
271
+
272
+ def <(other_semver)
273
+ compare(self.normalized_group_string, other_semver.normalized_group_string, true, false, :<)
274
+ end
275
+
276
+ def >(other_semver)
277
+ compare(self.normalized_group_string, other_semver.normalized_group_string, false, true, :>)
278
+ end
279
+
280
+ def >=(other_semver)
281
+ self == other_semver || compare(self.normalized_group_string, other_semver.normalized_group_string, false, true, :>)
282
+ end
283
+
284
+ def <=(other_semver)
285
+ self == other_semver || compare(self.normalized_group_string, other_semver.normalized_group_string, true, false, :<)
286
+ end
287
+
288
+ def ==(other_semver)
289
+ self.normalized_group_string == other_semver.normalized_group_string
290
+ end
291
+
292
+ def !=(other_semver)
293
+ return !(self == other_semver)
294
+ end
295
+
296
+ def to_normalized_s
297
+ @normalized_group_string
298
+ end
299
+
300
+ def to_s
301
+ @version_string
302
+ end
303
+
304
+ def is_number?
305
+ self.normalized_group_string.number?
306
+ end
307
+
308
+ def is_zero?
309
+ is_number? ? self.normalized_group_string.to_i == 0 : false
310
+ end
311
+
312
+ def diff(other_semver, abs = true)
313
+
314
+ if other_semver.normalized_group_string == "X" || self.normalized_group_string == "X"
315
+ "0"
316
+ elsif self.normalized_group_string.number? && other_semver.normalized_group_string.number?
317
+ ret = self.normalized_group_string.to_i - other_semver.normalized_group_string.to_i
318
+ (abs && ret < 0) ? -ret : ret
319
+ else
320
+ nil
321
+ end
322
+ end
323
+ end
@@ -0,0 +1,176 @@
1
+ require_relative "semantic_version"
2
+
3
+ class VersionCut
4
+ attr_accessor :semver, :value
5
+
6
+ def initialize(value, segments = nil)
7
+ @value = value.to_s
8
+ if segments.nil?
9
+ @semver = SemanticVersion.new(@value)
10
+ else
11
+ @semver = SemanticVersion.new(@value, segments)
12
+ end
13
+ end
14
+
15
+ def to_s
16
+ @value.to_s
17
+ end
18
+
19
+ def diff(other_cut, abs = true)
20
+ if other_cut.instance_of?(BelowAll)
21
+ AboveAll.new()
22
+ elsif other_cut.instance_of?(AboveAll)
23
+ BelowAll.new()
24
+ else
25
+ diff = self.semver.diff(other_cut.semver, abs)
26
+ if diff.nil?
27
+ EmptyInterval.new()
28
+ else
29
+ VersionCut.new(diff.join("."), diff)
30
+ end
31
+ end
32
+ end
33
+
34
+ def is_successor_of?(other_cut)
35
+ return true if other_cut.instance_of?(BelowAll)
36
+ return false if other_cut.instance_of?(AboveAll)
37
+
38
+ self.semver.is_successor_of?(other_cut.semver)
39
+ end
40
+
41
+ def <(other_cut)
42
+ other_cut.instance_of?(BelowAll) ? false : other_cut.instance_of?(AboveAll) ? true : @semver < other_cut.semver
43
+ end
44
+
45
+ def >(other_cut)
46
+ other_cut.instance_of?(BelowAll) ? true : other_cut.instance_of?(AboveAll) ? false : @semver > other_cut.semver
47
+ end
48
+
49
+ def <=(other_cut)
50
+ self < other_cut || self == other_cut
51
+ end
52
+
53
+ def >=(other_cut)
54
+ self > other_cut || self == other_cut
55
+ end
56
+
57
+ def ==(other_cut)
58
+ # self cannot be BelowAll or AboveAll
59
+ if other_cut.instance_of?(BelowAll) || other_cut.instance_of?(AboveAll)
60
+ false
61
+ else
62
+ @semver == other_cut.semver
63
+ end
64
+ end
65
+
66
+ def !=(other_cut)
67
+ # self cannot be BelowAll or AboveAll
68
+ if other_cut.instance_of?(BelowAll) || other_cut.instance_of?(AboveAll)
69
+ false
70
+ else
71
+ @semver != other_cut.semver
72
+ end
73
+ end
74
+
75
+ def is_initial_version?
76
+ @semver.is_zero?
77
+ end
78
+
79
+ def major
80
+ @semver.major
81
+ end
82
+
83
+ def minor
84
+ @semver.minor
85
+ end
86
+
87
+ def patch
88
+ @semver.patch
89
+ end
90
+
91
+ def cross_total
92
+ [minor, major, patch].reject { |i| i.empty? }.map { |i| i.to_i }.inject(0) { |sum, x| sum + x }
93
+ end
94
+ end
95
+
96
+ class BelowAll < VersionCut
97
+ def initialize()
98
+ end
99
+
100
+ def to_s
101
+ "-inf"
102
+ end
103
+
104
+ def is_initial_version?
105
+ false
106
+ end
107
+
108
+ def <(other_cut)
109
+ other_cut.instance_of?(BelowAll) ? false : true
110
+ end
111
+
112
+ def >(other_cut)
113
+ false
114
+ end
115
+
116
+ def <=(other_cut)
117
+ self < other_cut || self == other_cut
118
+ end
119
+
120
+ def >=(other_cut)
121
+ self > other_cut || self == other_cut
122
+ end
123
+
124
+ def ==(other_cut)
125
+ (other_cut.instance_of? BelowAll) ? true : false
126
+ end
127
+
128
+ def !=(other_cut)
129
+ !(self == other_cut)
130
+ end
131
+
132
+ def is_successor_of?(other_cut)
133
+ false
134
+ end
135
+ end
136
+
137
+ class AboveAll < VersionCut
138
+ def initialize()
139
+ end
140
+
141
+ def to_s
142
+ "+inf"
143
+ end
144
+
145
+ def is_initial_version?
146
+ false
147
+ end
148
+
149
+ def <(other_cut)
150
+ false
151
+ end
152
+
153
+ def >(other_cut)
154
+ other_cut.instance_of?(AboveAll) ? false : true
155
+ end
156
+
157
+ def <=(other_cut)
158
+ self < other_cut || self == other_cut
159
+ end
160
+
161
+ def >=(other_cut)
162
+ self > other_cut || self == other_cut
163
+ end
164
+
165
+ def ==(other_cut)
166
+ (other_cut.instance_of? AboveAll) ? true : false
167
+ end
168
+
169
+ def !=(other_cut)
170
+ !(self == other_cut)
171
+ end
172
+
173
+ def is_successor_of?(other_cut)
174
+ !other_cut.instance_of?(AboveAll)
175
+ end
176
+ end