dost 0.0.3 → 0.0.4
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/lib/dost.rb +33 -7
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a7533d8f01e26763794d5da377801dfe560caa9
|
4
|
+
data.tar.gz: e00ee61b072c398d0ad74c2f492817cccc363b3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 550cf596bcdc4108053e11add25fe46cf5e69616892dfcafa969ec6ba69292649578b1752cbebe35e83ea40d0f81c54c620be96704756142370679b4e12f128f
|
7
|
+
data.tar.gz: 54467348c7b173ea25a7be0bf43993ed41dc2c737046157773c3b7fffad49476b53862b166e87bfcf210880454fa721f7518840ee04db124a163f905eededd79
|
data/lib/dost.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
require 'pry'
|
2
1
|
module DOST
|
3
2
|
class Data
|
4
|
-
attr_reader :lines, :headers_delimiters, :values_delimiters
|
3
|
+
attr_reader :lines, :headers_delimiters, :values_delimiters, :key_modifier
|
5
4
|
|
6
|
-
def initialize(lines:, headers_delimiters:, values_delimiters:)
|
5
|
+
def initialize(lines:, headers_delimiters:, values_delimiters:, key_modifier: nil)
|
7
6
|
@lines = lines.map(&:chomp)
|
8
7
|
@headers_delimiters = headers_delimiters
|
9
8
|
@values_delimiters = values_delimiters
|
9
|
+
@key_modifier = key_modifier
|
10
10
|
end
|
11
11
|
|
12
12
|
def headers
|
@@ -17,11 +17,29 @@ module DOST
|
|
17
17
|
@values ||= parse_values
|
18
18
|
end
|
19
19
|
|
20
|
+
def dynamic_offseted_values(left_dynamic_bound_headers = [])
|
21
|
+
values_lines.map do |line|
|
22
|
+
headers.reverse.map do |(name, range)|
|
23
|
+
is_dynamic = left_dynamic_bound_headers.include?(name)
|
24
|
+
str = line[range]
|
25
|
+
if is_dynamic && range.first > 0
|
26
|
+
i = range.first - 1
|
27
|
+
while present?(line[i]) && i >= 0 do
|
28
|
+
str.prepend(line[i])
|
29
|
+
line[i] = ' '
|
30
|
+
i -= 1
|
31
|
+
end
|
32
|
+
end
|
33
|
+
[name, str.strip]
|
34
|
+
end.reverse.to_h
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
20
38
|
private def parse_headers
|
21
39
|
raw_headers = header_lines.map { |header_line| calc_ranges(header_line) }
|
22
40
|
|
23
41
|
first_row = raw_headers.first
|
24
|
-
second_row = raw_headers
|
42
|
+
second_row = raw_headers[1]
|
25
43
|
|
26
44
|
first_row.map.with_index do |(first_key, first_range)|
|
27
45
|
values_inside = second_row.select do |(second_key, second_range)|
|
@@ -32,7 +50,7 @@ module DOST
|
|
32
50
|
end
|
33
51
|
|
34
52
|
if values_inside.empty?
|
35
|
-
[[first_key
|
53
|
+
[[modify_key(first_key), first_range]]
|
36
54
|
else
|
37
55
|
values_inside.map.with_index do |(second_item_key, second_item_range), index|
|
38
56
|
key = (first_key.strip + second_item_key.strip.prepend('_'))
|
@@ -42,7 +60,7 @@ module DOST
|
|
42
60
|
right_bound = is_last_item ? [second_item_range.last, first_range.last].min : second_item_range.last
|
43
61
|
|
44
62
|
range = left_bound..right_bound
|
45
|
-
[key
|
63
|
+
[modify_key(key), range]
|
46
64
|
end
|
47
65
|
end
|
48
66
|
end.flatten(1)
|
@@ -91,7 +109,7 @@ module DOST
|
|
91
109
|
end
|
92
110
|
|
93
111
|
private def delimiter?(line)
|
94
|
-
line.chars.uniq.count == 1 &&
|
112
|
+
line.chars.uniq.count == 1 && present?(delimiter_char(line))
|
95
113
|
end
|
96
114
|
|
97
115
|
private def delimiter_char(line)
|
@@ -102,9 +120,17 @@ module DOST
|
|
102
120
|
str !~ /[^[:space:]]/
|
103
121
|
end
|
104
122
|
|
123
|
+
private def present?(str)
|
124
|
+
!blank?(str)
|
125
|
+
end
|
126
|
+
|
105
127
|
# from https://apidock.com/rails/Range/overlaps
|
106
128
|
private def overlaps?(orig, other)
|
107
129
|
orig.cover?(other.first) || other.cover?(orig.first)
|
108
130
|
end
|
131
|
+
|
132
|
+
private def modify_key(key)
|
133
|
+
key_modifier.nil? ? keyа : key_modifier.call(key)
|
134
|
+
end
|
109
135
|
end
|
110
136
|
end
|