tablestructured 0.1.2 → 0.2.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
  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