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 +4 -4
- data/.github/workflows/ci.yml +1 -2
- data/CHANGELOG-v2.md +8 -0
- data/CHANGELOG-v3.md +6 -0
- data/README.md +8 -3
- data/bin/dev +2 -1
- data/bin/test.rb +13 -0
- data/bin/test.sh +1 -0
- data/lib/thefox-ext.rb +16 -1
- data/lib/thefox-ext/ext/string.rb +0 -60
- data/lib/thefox-ext/range/lexer/base.rb +124 -0
- data/lib/thefox-ext/range/lexer/block.rb +19 -0
- data/lib/thefox-ext/range/lexer/block_down.rb +25 -0
- data/lib/thefox-ext/range/lexer/block_level.rb +37 -0
- data/lib/thefox-ext/range/lexer/block_up.rb +23 -0
- data/lib/thefox-ext/range/lexer/collection.rb +73 -0
- data/lib/thefox-ext/range/lexer/interval.rb +41 -0
- data/lib/thefox-ext/range/lexer/lexer.rb +94 -0
- data/lib/thefox-ext/range/lexer/number.rb +103 -0
- data/lib/thefox-ext/range/lexer/operator.rb +20 -0
- data/lib/thefox-ext/range/lexer/range.rb +65 -0
- data/lib/thefox-ext/range/lexer/scope.rb +266 -0
- data/lib/thefox-ext/range/lexer/separator.rb +19 -0
- data/lib/thefox-ext/range/resolver.rb +33 -0
- data/lib/thefox-ext/version.rb +2 -2
- data/thefox-ext.gemspec +4 -2
- metadata +52 -8
- data/lib/thefox-ext/ext/array.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a20be9c295afd672782bd04e2ab56b507fa81cf0f66e89c7557b1d88dc527687
|
4
|
+
data.tar.gz: b5bb8440e0df05a68571e9fa957f6e13e904a50697b34215383c1bd209eea5c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7aef25246b059342d994fbb7dd981f16a962abed342a474611d38acc8878d9487673286b4f802ed8a791eec92cfcc34189fa63fe2b9e5965ad16e2dbaf4022e6
|
7
|
+
data.tar.gz: 363c224dade536a709cc24f7eee8cdaf0a86d39a1ab676e80bd6b7f1cad2462f6f70e52f39c29f9e3904313bba93d24b4c54b3b7dfec749f06a26920d9a13601
|
data/.github/workflows/ci.yml
CHANGED
data/CHANGELOG-v2.md
ADDED
data/CHANGELOG-v3.md
ADDED
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', '~>
|
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
data/bin/test.rb
ADDED
data/bin/test.sh
CHANGED
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
|