epitools 0.5.115 → 0.5.116

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: 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