thefox-ext 1.10.0 → 3.0.0.pre.rc.0

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: 6b68b006a1bf2b6cdc73ca86ef2291c7fe8561e622cdf9f4b6434df6ced40a48
4
- data.tar.gz: 9e05dc8bedd4a625040d4899ed3f19315fa58c9a998e8cfc5749e929e15d7451
3
+ metadata.gz: a20be9c295afd672782bd04e2ab56b507fa81cf0f66e89c7557b1d88dc527687
4
+ data.tar.gz: b5bb8440e0df05a68571e9fa957f6e13e904a50697b34215383c1bd209eea5c8
5
5
  SHA512:
6
- metadata.gz: 91b5ff18299878084605508f46a5559b8339d52006e32b1908c5a44ee8c04bfa420cddd6fabdf8c7f0996b4d093dae9c916d9affd4efc0c22df3aca2d4ff181d
7
- data.tar.gz: d7629b1cff75db5e14ea30a5cd5d08f12227146e61491ca41368d696d7f5b3c5ee020161389fa6d7af113bbe8b7ac0fb9038ec95f32260fff4b552b6a48e7603
6
+ metadata.gz: 7aef25246b059342d994fbb7dd981f16a962abed342a474611d38acc8878d9487673286b4f802ed8a791eec92cfcc34189fa63fe2b9e5965ad16e2dbaf4022e6
7
+ data.tar.gz: 363c224dade536a709cc24f7eee8cdaf0a86d39a1ab676e80bd6b7f1cad2462f6f70e52f39c29f9e3904313bba93d24b4c54b3b7dfec749f06a26920d9a13601
@@ -10,6 +10,7 @@ on:
10
10
  push:
11
11
  branches:
12
12
  - master
13
+ - feature/*
13
14
 
14
15
  jobs:
15
16
  test:
@@ -17,8 +18,6 @@ jobs:
17
18
  strategy:
18
19
  matrix:
19
20
  ruby-version:
20
- - '2.3'
21
- - '2.4'
22
21
  - '2.5'
23
22
  - '2.6'
24
23
  - '2.7'
data/CHANGELOG-v2.md ADDED
@@ -0,0 +1,8 @@
1
+ # Release Notes for Extended Ruby Classes v2.x
2
+
3
+ ## v2.0.0
4
+
5
+ - Removed deprecated `Array.resolve_range_str`.
6
+ - Removed deprecated `String.resolve_range`.
7
+ - Dropped support for Ruby version 2.3.
8
+ - Added Range Resolver class.
data/CHANGELOG-v3.md ADDED
@@ -0,0 +1,6 @@
1
+ # Release Notes for Extended Ruby Classes v2.x
2
+
3
+ ## v3.0.0 [unreleased]
4
+
5
+ - Dropped support for Ruby version 2.4.
6
+ - Range Resolver v2
data/README.md CHANGED
@@ -21,7 +21,7 @@ gem install thefox-ext
21
21
  or via `Gemfile`:
22
22
 
23
23
  ```ruby
24
- gem 'thefox-ext', '~>1.10'
24
+ gem 'thefox-ext', '~>2.0'
25
25
  ```
26
26
 
27
27
  Use it in your sources:
@@ -40,11 +40,16 @@ require 'thefox-ext'
40
40
  - Date
41
41
  - `today?`
42
42
  - Get week array for a specific date.
43
- - Array
44
- - Range String Resolver
45
43
  - Hash
46
44
  - Recursive Merge
45
+ - Range String Resolver
47
46
 
48
47
  ## Project Links
49
48
 
50
49
  - [Gem](https://rubygems.org/gems/thefox-ext)
50
+
51
+ ## Dev
52
+
53
+ ```bash
54
+ bundler exec ./bin/test.rb
55
+ ```
data/bin/dev CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
- # coding: UTF-8
3
2
 
4
3
  require 'thefox-ext'
5
4
  require 'pp'
6
5
 
6
+ rr = TheFox::Range::Resolver.new(ARGV.join(' '))
7
+ pp rr.to_a
data/bin/test.rb ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pry'
4
+ require 'thefox-ext'
5
+ require 'pp'
6
+
7
+ include TheFox::Range::Lexer
8
+
9
+ n1 = Number.new('123')
10
+
11
+ binding.pry
12
+
13
+ puts '-> exit pry'
data/bin/test.sh CHANGED
@@ -10,4 +10,5 @@ which bundler &> /dev/null || { echo 'ERROR: bundler not found in PATH'; exit 1;
10
10
 
11
11
  cd "${SCRIPT_BASEDIR}/.."
12
12
 
13
+ echo 'run tests'
13
14
  bundler exec ./test/suite_all.rb $*
data/lib/thefox-ext.rb CHANGED
@@ -8,6 +8,21 @@ require 'thefox-ext/ext/integer'
8
8
  require 'thefox-ext/ext/nil'
9
9
  require 'thefox-ext/ext/string'
10
10
  require 'thefox-ext/ext/true'
11
- require 'thefox-ext/ext/array'
12
11
 
13
12
  require 'thefox-ext/console'
13
+
14
+ # Resolver
15
+ require 'thefox-ext/range/resolver'
16
+ require 'thefox-ext/range/lexer/lexer'
17
+ require 'thefox-ext/range/lexer/collection'
18
+ require 'thefox-ext/range/lexer/base'
19
+ require 'thefox-ext/range/lexer/block_level'
20
+ require 'thefox-ext/range/lexer/block'
21
+ require 'thefox-ext/range/lexer/block_down'
22
+ require 'thefox-ext/range/lexer/block_up'
23
+ require 'thefox-ext/range/lexer/operator'
24
+ require 'thefox-ext/range/lexer/scope'
25
+ require 'thefox-ext/range/lexer/number'
26
+ require 'thefox-ext/range/lexer/separator'
27
+ require 'thefox-ext/range/lexer/range'
28
+ require 'thefox-ext/range/lexer/interval'
@@ -63,64 +63,4 @@ class String
63
63
  self.force_encoding('ISO-8859-1').encode('UTF-8')
64
64
  end
65
65
  end
66
-
67
- # DEPRECATED: will be removed in v2.0.0.
68
- def resolve_range(prefix = '')
69
- # puts '-> resolve_range: %s {%s}' % [self, prefix]
70
- warn "[DEPRECATION] `String.resolve_range` is deprecated. Please use `TheFox::Range::Resolver` instead."
71
-
72
- rv = Array.new
73
-
74
- items = []
75
- is_sub_range = false
76
- sub_item = []
77
- self.split(',').each do |item|
78
- if item.count('{') > 0
79
- is_sub_range = true
80
- end
81
- if is_sub_range
82
- sub_item.push(item)
83
- else
84
- items.push(item)
85
- end
86
- if item.count('}') > 0
87
- is_sub_range = false
88
- items.push(sub_item.join(','))
89
- sub_item = []
90
- end
91
- end
92
-
93
- items.map{ |item|
94
- item_striped = item.strip
95
- if range_match = item_striped.match(/(\d+)\{([\d\-\+,]+)\}/)
96
- range_match[2].resolve_range(range_match[1])
97
- elsif /\.\./.match(item_striped) # ( . )( . ) <--- BOOBS
98
- Range.new(*item_striped.split('..', 2).map{ |range| range.to_i })
99
- elsif /-/.match(item_striped)
100
- Range.new(*item_striped.split('-', 2).map{ |range| range.to_i })
101
- elsif /\+/.match(item_striped)
102
- range_begin = item_striped.split('+').first.to_i
103
- range_end = range_begin + item_striped.count('+')
104
- Range.new(range_begin, range_end)
105
- else
106
- item_striped.to_i
107
- end
108
- }.each{ |range|
109
- if range.is_a?(Range)
110
- rv.push(*range.to_a)
111
- elsif range.is_a?(Array)
112
- rv.push(*range)
113
- else
114
- rv << range
115
- end
116
- }
117
-
118
- if !prefix.empty?
119
- rv = rv.map { |i|
120
- (prefix + i.to_s).to_i
121
- }
122
- end
123
-
124
- rv
125
- end
126
66
  end
@@ -0,0 +1,124 @@
1
+
2
+ module TheFox
3
+ module Range
4
+ module Lexer
5
+ class Base
6
+ @@instance_id = 0
7
+
8
+ def initialize(symbole = nil)
9
+ # puts '-> Base.initialize'
10
+
11
+ @@instance_id += 1
12
+ @instance_id = @@instance_id
13
+ @nonce = Base.generate_nonce()
14
+ @symbole = symbole
15
+ @prev_item = nil
16
+ @org_prev_item = nil
17
+ @next_item = nil
18
+
19
+ @parent_item = nil
20
+ #@parent_scope = nil
21
+ @children = []
22
+ end
23
+
24
+ # :nocov:
25
+ def inspect()
26
+ 'Base'
27
+ end
28
+ # :nocov:
29
+
30
+ def instance_id()
31
+ @instance_id
32
+ end
33
+ def instance_id=(instance_id)
34
+ @instance_id = instance_id
35
+ end
36
+
37
+ def nonce()
38
+ @nonce
39
+ end
40
+ def nonce=(nonce)
41
+ @nonce = nonce
42
+ end
43
+
44
+ def chain(prev_item)
45
+ # puts '%s(%s).chain' % [self.inspect, opts.inspect]
46
+ self.prev_item = prev_item
47
+ if !prev_item.nil?
48
+ prev_item.next_item = self
49
+ end
50
+ end
51
+
52
+ def symbole()
53
+ @symbole
54
+ end
55
+
56
+ def org_prev_item()
57
+ @org_prev_item
58
+ end
59
+ def org_prev_item=(org_prev_item)
60
+ @org_prev_item = org_prev_item
61
+ end
62
+
63
+ def prev_item()
64
+ @prev_item
65
+ end
66
+ def prev_item=(prev_item)
67
+ @prev_item = prev_item
68
+ end
69
+
70
+ def next_item()
71
+ @next_item
72
+ end
73
+ def next_item=(next_item)
74
+ @next_item = next_item
75
+ end
76
+
77
+ def parent_item()
78
+ @parent_item
79
+ end
80
+ def parent_item=(parent_item)
81
+ @parent_item = parent_item
82
+ end
83
+ def has_parent_item()
84
+ !@parent_item.nil?
85
+ end
86
+
87
+ def children()
88
+ @children
89
+ end
90
+ def add_child(child)
91
+ @children.push(child)
92
+ end
93
+ def has_children()
94
+ @children.length > 0
95
+ end
96
+
97
+ def dup()
98
+ # puts '-> Base.dup'
99
+ o = super()
100
+ o.nonce = Base.generate_nonce()
101
+ o.prev_item = nil
102
+ o.next_item = nil
103
+ o
104
+ end
105
+
106
+ def resolve()
107
+ puts '-> Base.resolve'
108
+ end
109
+
110
+ class << self
111
+ def generate_nonce()
112
+ rand(10 ** 3).to_s.rjust(3, '0')
113
+ end
114
+ def keep_nonce_on_dup()
115
+ false
116
+ end
117
+ def keep_instance_id_on_dup()
118
+ false
119
+ end
120
+ end
121
+ end # Base
122
+ end # Lexer
123
+ end # Range
124
+ end # TheFox
@@ -0,0 +1,19 @@
1
+
2
+ module TheFox
3
+ module Range
4
+ module Lexer
5
+ # { }
6
+ class Block < Base
7
+ def initialize(level)
8
+ super()
9
+ # puts '-> Block.initialize(%s)' % [level.inspect]
10
+ @level = level.dup
11
+ end
12
+
13
+ def level()
14
+ @level
15
+ end
16
+ end # Block
17
+ end # Lexer
18
+ end # Range
19
+ end # TheFox
@@ -0,0 +1,25 @@
1
+
2
+ module TheFox
3
+ module Range
4
+ module Lexer
5
+ # {
6
+ class BlockDown < Block
7
+ def initialize(level)
8
+ level.inc
9
+ super(level)
10
+ # puts '-> BlockDown.initialize(%s)' % [level.inspect]
11
+ end
12
+
13
+ # :nocov:
14
+ def inspect()
15
+ 'BlockDown(%s)' % [@level.level]
16
+ # if @prev_item.nil?
17
+ # else
18
+ # 'BlockDown(%s <%s)' % [@level.inspect, @prev_item.inspect]
19
+ # end
20
+ end
21
+ # :nocov:
22
+ end # BlockDown
23
+ end # Lexer
24
+ end # Range
25
+ end # TheFox
@@ -0,0 +1,37 @@
1
+
2
+ module TheFox
3
+ module Range
4
+ module Lexer
5
+ class BlockLevel
6
+ def initialize()
7
+ # puts '-> BlockLevel.initialize()'
8
+ @level = 0
9
+ end
10
+
11
+ # :nocov:
12
+ def inspect()
13
+ 'BlockLevel(%d)' % [@level]
14
+ end
15
+ # :nocov:
16
+
17
+ def inc()
18
+ @level += 1
19
+ end
20
+
21
+ def dec()
22
+ @level -= 1
23
+ end
24
+
25
+ def level()
26
+ @level
27
+ end
28
+
29
+ def ==(other)
30
+ if other.is_a?(BlockLevel)
31
+ @level == other.level
32
+ end
33
+ end
34
+ end # BlockLevel
35
+ end # Lexer
36
+ end # Range
37
+ end # TheFox
@@ -0,0 +1,23 @@
1
+
2
+ module TheFox
3
+ module Range
4
+ module Lexer
5
+ # }
6
+ class BlockUp < Block
7
+ def initialize(level)
8
+ super(level)
9
+ level.dec
10
+ # puts '-> BlockUp.initialize(%s)' % [level.inspect]
11
+ # puts '-> BlockUp.initialize()'
12
+ end
13
+
14
+ # :nocov:
15
+ def inspect()
16
+ 'BlockUp(%s)' % [@level.level]
17
+ # 'BlockUp()'
18
+ end
19
+ # :nocov:
20
+ end # BlockUp
21
+ end # Lexer
22
+ end # Range
23
+ end # TheFox
@@ -0,0 +1,73 @@
1
+
2
+ module TheFox
3
+ module Range
4
+ module Lexer
5
+ class Collection
6
+ def initialize(items = nil)
7
+ # puts '-> Collection.initialize()'
8
+ @items = items.to_a
9
+ @block_level = 0
10
+ end
11
+
12
+ # :nocov:
13
+ def inspect()
14
+ 'Collection(L=%d %s)' % [
15
+ @items.length,
16
+ @items.map{ |i| i.inspect }
17
+ ]
18
+ end
19
+ # :nocov:
20
+
21
+ def items()
22
+ @items
23
+ end
24
+
25
+ def curr()
26
+ @items.last
27
+ end
28
+
29
+ def prev()
30
+ @items[-2]
31
+ end
32
+
33
+ def is_empty()
34
+ @items.length == 0
35
+ end
36
+
37
+ def length()
38
+ @items.length
39
+ end
40
+
41
+ def push(item)
42
+ # puts '-> %s.push(%s)' % [self.inspect, item.inspect]
43
+ if item.nil?
44
+ return
45
+ end
46
+
47
+ # Prev
48
+ org_prev_item = item.prev_item
49
+ prev_item = @items.last
50
+
51
+ # Dup
52
+ curr_item = item.dup
53
+ @items.push(curr_item)
54
+
55
+ # Chain
56
+ curr_item.chain(prev_item)
57
+ curr_item.org_prev_item = org_prev_item
58
+
59
+ if curr_item.class.keep_nonce_on_dup
60
+ curr_item.nonce = item.nonce
61
+ end
62
+ if curr_item.class.keep_instance_id_on_dup
63
+ curr_item.instance_id = item.instance_id
64
+ end
65
+ end
66
+
67
+ def pop()
68
+ @items.pop
69
+ end
70
+ end # Collection
71
+ end # Lexer
72
+ end # Range
73
+ end # TheFox