thefox-ext 1.10.0 → 3.0.0.pre.rc.0
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 +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
|