tablestructured 0.1.2 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a5c9006b6d4ebf186aa8724d2dfa389a70f44bed
4
- data.tar.gz: b0d01cc440f469ecff3c49420b2c35a24eb84c19
3
+ metadata.gz: afe95e0ea3585ddcf3f5eb0a76439ff7465b73c3
4
+ data.tar.gz: 9dc5a0d873b750f94a6b38485d88d6169aa5e46e
5
5
  SHA512:
6
- metadata.gz: 355ee52c41d87fde5a2a28480223abfbe6efe7d63eee84b88ded1efcd9b58a5eb54fdcf92614db43263620ab68b0a55bec4e29c90363dd6adc1bd76aaf9d12fa
7
- data.tar.gz: 9716ee1c7b6bd0874f896341e94110bee09234421351476d9bae2ba294e9fda0472c3ae335d860d79f432c4b55c3432b630303653fde9961ce8e2bad1a0cdf97
6
+ metadata.gz: e5a62687c47e0162da70c59c42f1ff1f47dc183094e8a423cef9eae5a6a9e7b20de45bc538a172efdcf1a51f1eb7076e5bf6cb4d01d8ece862d054315d735395
7
+ data.tar.gz: f9b29c7573f1ad098a576df0c008b468bae2870ed360c4c46b245111cf68dafc754dcc19783757450de657c63dfc4cf6d90923cc626f261599f84856a8c787f6
@@ -1,6 +1,9 @@
1
1
  module TableStructured
2
- def self.new object, headers: :top, drop: 0 # TODO: headers_left should probably mean the ids of entries
3
- if object.respond_to? :css
2
+ Error = Class.new RuntimeError
3
+ def self.new object, headers: :top, drop_first: 0, drop_last: 0 # TODO: headers_left should probably mean the ids of entries
4
+ if object.nil?
5
+ raise ArgumentError, "passed object can be an Array or Ferrum Node, but not Nil"
6
+ elsif object.respond_to? :css
4
7
  # the xml object ignores the :headers arg for now
5
8
  ss = if :top == headers
6
9
  object
@@ -8,16 +11,28 @@ module TableStructured
8
11
  headers
9
12
  else
10
13
  fail "invalid type of headers"
11
- end.css("th").drop(drop).map{ |_| _.text.sub(/\A[[[:space:]]]*/,"").sub(/[[[:space:]]]*\z/,"").to_sym }
14
+ end.css("th")[drop_first..-1-drop_last].map{ |_| _.text.sub(/\A[[[:space:]]]*/,"").sub(/[[[:space:]]]*\z/,"").to_sym }
12
15
  struct = begin
13
16
  Struct.new *ss
14
17
  rescue NameError
15
18
  raise $!.exception "#{$!}: #{ss.inspect}"
16
19
  end
17
- object.css("tbody>tr").map{ |_| struct.new *_.css("td").drop(drop) }
20
+ object.css("tbody>tr").map do |_|
21
+ tds = []
22
+ Timeout.timeout 2 do
23
+ tds = _.css("td")[drop_first..-1-drop_last]
24
+ if tds.empty?
25
+ STDERR.puts "empty row"
26
+ sleep 0.1
27
+ redo
28
+ end
29
+ end
30
+ raise Error, "size mismatch (#{ss.size} headers, #{tds.size} row items)" if tds.size != ss.size
31
+ struct.new *tds
32
+ end
18
33
  else
19
- struct = Struct.new *object.first.map(&:to_s).map(&:to_sym).tap{ |_| fail "headers should be unique" if _.uniq! }
20
- object.drop(1).map{ |_| struct.new *_ }
34
+ struct = Struct.new *(headers == :top ? object.first : headers).map(&:to_s).map(&:to_sym).tap{ |_| fail "headers should be unique" if _.uniq! }
35
+ object.drop(headers == :top ? 1 : 0).map{ |_| struct.new *_ }
21
36
  end
22
37
  end
23
38
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "tablestructured"
3
- spec.version = "0.1.2"
3
+ spec.version = "0.2.0"
4
4
  spec.summary = "convert two-dimensional Array into an Array of Structs consuming the first row and/or column as attributes"
5
5
 
6
6
  spec.author = "Victor Maslov aka Nakilon"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tablestructured
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Maslov aka Nakilon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-21 00:00:00.000000000 Z
11
+ date: 2022-09-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: nakilon@gmail.com