epitools 0.5.115 → 0.5.116

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8eee5098324ab45b4dd6302f414fa5481774f478c6f6dd69839ed12670277a8
4
- data.tar.gz: '0828b2ee573f259aedaa75398c2878bd489aaff40567ba71d2322ab6f3083ff2'
3
+ metadata.gz: f59b5b62bfba503dc018fd54d0862d83c39a28c42c111cb65f7c715ec148dac6
4
+ data.tar.gz: 9a39b0bbd31c21f7434e8230521f3ad69a7013915dc52eb8a917840a56e208d5
5
5
  SHA512:
6
- metadata.gz: 451de82760520fb395f34c9f88de6bc9c74f94576e256379390076f3f019453bed5457165a7371ecafa12103c3eae453d27533aee65662604f4562ff5ddc78e2
7
- data.tar.gz: 68fdc3a7e6294f5fad2c79fc79c411feb565fed4386455a05bea879a57d21c32f92a6156b94befe45b89a73b90321aa989cd845337c80f26ec7d29a6b0b221d8
6
+ metadata.gz: 9032e99a44dcc83f6277722d79384cdb5fefbebd4324d34c049b51e62dbc09fca49a16450863c1b607c6dc6075445dc744fab9bf717fe43599223b358e6dd191
7
+ data.tar.gz: 8abee532a4ecc30fe0ea6c9c365fe8c137e7190425b398f54cdc3dadeee4ec00431b3b55d25b91b4cc3f36918626c0d7404a370388f0622792d4f859919cbf09
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.115
1
+ 0.5.116
@@ -76,6 +76,7 @@ autoload :WM, 'epitools/wm'
76
76
  autoload :TypedStruct, 'epitools/typed_struct'
77
77
  autoload :Sys, 'epitools/sys'
78
78
  autoload :Matrix, 'epitools/core_ext/matrix'
79
+ autoload :SemanticVersion, 'epitools/semantic_version'
79
80
 
80
81
 
81
82
  ## Gems (common)
@@ -0,0 +1,125 @@
1
+ class SemanticVersion
2
+
3
+ include Comparable
4
+
5
+ A_NEWER = 1
6
+ B_NEWER = -1
7
+ A_EQ_B = 0
8
+
9
+ attr_reader :val
10
+
11
+ def initialize(val)
12
+ @val = val
13
+ end
14
+
15
+ def self.compare(a,b)
16
+ new(a) <=> new(b)
17
+ end
18
+
19
+ def <=>(other)
20
+ version_a, version_b = val, other.val
21
+
22
+ return A_EQ_B if version_a == version_b
23
+
24
+ chars_a, chars_b = version_a.chars, version_b.chars
25
+
26
+ while chars_a.size != 0 and chars_b.size != 0
27
+ # logger.debug('starting loop comparing %s '
28
+ # 'to %s', chars_a, chars_b)
29
+ check_leading(chars_a, chars_b)
30
+
31
+ if chars_a.first == '~' and chars_b.first == '~'
32
+ chars_a.shift
33
+ chars_b.shift
34
+ elsif chars_a.first == '~'
35
+ return B_NEWER
36
+ elsif chars_b.first == '~'
37
+ return A_NEWER
38
+ end
39
+
40
+ break if chars_a.size == 0 or chars_b.size == 0
41
+
42
+ block_res = get_block_result(chars_a, chars_b)
43
+ return block_res if block_res != A_EQ_B
44
+ end
45
+
46
+ if chars_a.size == chars_b.size
47
+ # logger.debug('versions are equal')
48
+ return A_EQ_B
49
+ else
50
+ # logger.debug('versions not equal')
51
+ chars_a.size > chars_b.size ? A_NEWER : B_NEWER
52
+ end
53
+ end
54
+
55
+
56
+ private
57
+
58
+ def check_leading(*char_lists)
59
+ # logger.debug('_check_leading(%s)', char_lists)
60
+ for char_list in char_lists
61
+ while char_list.any? and not char_list[0] =~ /^\w/ and not char_list[0] == '~'
62
+ char_list.shift
63
+ end
64
+ # logger.debug('updated list: %s', char_list)
65
+ end
66
+ end
67
+
68
+ def get_block_result(chars_a, chars_b)
69
+ # logger.debug('get_block_result(%s, %s)', chars_a, chars_b)
70
+ first_is_digit = chars_a.first =~ /^\d/
71
+ pop_func = first_is_digit ? :pop_digits : :pop_letters
72
+ return_if_no_b = first_is_digit ? A_NEWER : B_NEWER
73
+ block_a, block_b = send(pop_func, chars_a), send(pop_func, chars_b)
74
+
75
+ # logger.debug('blocks are equal')
76
+ return return_if_no_b if block_b.size == 0
77
+
78
+ compare_blocks(block_a, block_b)
79
+ end
80
+
81
+ def pop_digits(char_list)
82
+ # logger.debug('pop_digits(%s)', char_list)
83
+ digits = []
84
+ while char_list.any? and char_list.first =~ /^\d/
85
+ digits.append(char_list.shift)
86
+ end
87
+
88
+ # logger.debug('got digits: %s', digits)
89
+ # logger.debug('updated char list: %s', char_list)
90
+ digits
91
+ end
92
+
93
+ def compare_blocks(block_a, block_b)
94
+ # logger.debug('compare_blocks(%s, %s)', block_a, block_b)
95
+ if block_a[0] =~ /^\d/
96
+ trim_zeros(block_a, block_b)
97
+ if block_a.size != block_b.size
98
+ # logger.debug('block lengths are not equal')
99
+ return block_a.size > block_b.size ? A_NEWER : B_NEWER
100
+ end
101
+ end
102
+
103
+ block_a <=> block_b
104
+ end
105
+
106
+ def trim_zeros(*char_lists)
107
+ for char_list in char_lists
108
+ while char_list.any? and char_list.first == '0'
109
+ char_list.shift
110
+ end
111
+ end
112
+ end
113
+
114
+ def pop_letters(char_list)
115
+ # logger.debug('pop_letters(%s)', char_list)
116
+ letters = []
117
+ while char_list.any? and char_list.first =~ /^[[:alpha:]]/
118
+ letters << char_list.shift
119
+ end
120
+ # logger.debug('got letters: %s', letters)
121
+ # logger.debug('updated char list: %s', char_list)
122
+ return letters
123
+ end
124
+ end
125
+
@@ -0,0 +1,32 @@
1
+ require 'epitools/semantic_version'
2
+
3
+ describe SemanticVersion do
4
+
5
+ it "works" do
6
+ [
7
+ ["3.1.3pre1", "3.1.3-1", -1],
8
+ ["1.15.10+54+g1ed124ace-1", "1.15.10-1", 1],
9
+ ["0.30+2+gc0620e4-1", "0.30pre1", 1],
10
+ ["1:0.27.2-1", "1:0.27.2-2", -1],
11
+ ["0+337-2", "1", -1],
12
+ # ["1.0", "1", 0], # <- fix this
13
+ ["1.0", "1.0", 0],
14
+ ["2:1.11-1", "1.9.4-1", 1],
15
+ ].each do |a,b,target|
16
+ result = SemanticVersion.compare(a,b)
17
+
18
+ result.should == target
19
+
20
+ case target
21
+ when -1
22
+ SemanticVersion.new(a).should be < SemanticVersion.new(b)
23
+ when 1
24
+ SemanticVersion.new(a).should be > SemanticVersion.new(b)
25
+ when 0
26
+ SemanticVersion.new(a).should == SemanticVersion.new(b)
27
+ end
28
+ end
29
+ end
30
+
31
+ end
32
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: epitools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.115
4
+ version: 0.5.116
5
5
  platform: ruby
6
6
  authors:
7
7
  - epitron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-01 00:00:00.000000000 Z
11
+ date: 2018-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -81,6 +81,7 @@ files:
81
81
  - lib/epitools/rails.rb
82
82
  - lib/epitools/rash.rb
83
83
  - lib/epitools/ratio.rb
84
+ - lib/epitools/semantic_version.rb
84
85
  - lib/epitools/sys.rb
85
86
  - lib/epitools/sys/mem.rb
86
87
  - lib/epitools/sys/misc.rb
@@ -107,6 +108,7 @@ files:
107
108
  - spec/permutations_spec.rb
108
109
  - spec/rash_spec.rb
109
110
  - spec/ratio_spec.rb
111
+ - spec/semantic_version_spec.rb
110
112
  - spec/sys_spec.rb
111
113
  - spec/term_spec.rb
112
114
  - spec/typed_struct_spec.rb