ehbrs_ruby_utils 0.43.0 → 0.44.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
  SHA256:
3
- metadata.gz: d49474096e476f03b1771e1da9b08054fa00d5a5daa095735d03bbab244c36b3
4
- data.tar.gz: 59f7d23319c7666b9751f2008b2c72fac3a4967a3c35f3988452f9c150450256
3
+ metadata.gz: 478c8b2a993c8da6facb45e2809c7210b0eaad73ad1379aa9653aba242ab7bb6
4
+ data.tar.gz: d9edd9c0400135a534d1f45077635fa6399d0b536925a4da02a5f9784730a937
5
5
  SHA512:
6
- metadata.gz: 98094f7b4340f323ad143a14f21c7ac6f7bb453d9647b3d55efbb0b4c567e4351d52fcbbb3ebd71a9e92a72a78debae83badf0eeffae02e2739c9993191ff07f
7
- data.tar.gz: c2e6242a13bf62cf5681107be0741caef823569196cf71809f79be4e1e865c2525bf0bf6f99d8ec959c43c350a7bcb0ad6676ab9b23233e31f2a8f97bd7fe126
6
+ metadata.gz: 31f4b15a837c816399ce97cf3cd89bcd0563c2c2b6f4e415221d95b8c50b260efc91489bc7b68e0341a9711238f8247b6e958b44c52f13959fb8eef5dcd5d1f7
7
+ data.tar.gz: e6cc85c4297ddf52ac3f6ba0b0ee5f1c6227b0a17eea3b44977dd91ed180b48b67c1e6956c02932dd17c9f631ca6fe759ff6c30f985be726eed0d2c8bb6ae55e
@@ -47,7 +47,7 @@ module EhbrsRubyUtils
47
47
  end
48
48
 
49
49
  def scroll_down
50
- session.execute_script('window.scrollBy(0, 90)')
50
+ session.scroll_down_by(90)
51
51
  end
52
52
  end
53
53
  end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/html/item_list'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module EhbrsRubyUtils
7
+ module Booking
8
+ module Parsers
9
+ class List < ::Aranha::Parsers::Html::ItemList
10
+ class << self
11
+ def testid_xpath(value, *suffixes)
12
+ ([".//*[@data-testid='#{value}']"] + suffixes).join('/')
13
+ end
14
+ end
15
+
16
+ ITEMS_XPATH = '//*[@data-testid="property-card"]'
17
+
18
+ field :name, :string, testid_xpath('title', 'text()')
19
+ field :href, :string, testid_xpath('title-link', '@href')
20
+ field :price, :float, testid_xpath('price-and-discounted-price', '/text()')
21
+ field :tax, :float_optional, testid_xpath('taxes-and-charges', 'text()')
22
+ field :address, :string, testid_xpath('address', 'text()')
23
+ field :distance, :distance, testid_xpath('distance', 'text()')
24
+ field :review_score, :float_optional, testid_xpath('review-score', 'div[1]/text()')
25
+ field :review_count, :integer, testid_xpath('review-score', 'div[2]/div[2]/text()')
26
+ field :unit_title, :string_recursive, testid_xpath('recommended-units',
27
+ '/*[@role="link"]')
28
+
29
+ def data
30
+ { accommodations: items_data, declared_count: declared_count }
31
+ end
32
+
33
+ # @return [Integer]
34
+ def declared_count
35
+ node_parser.integer_value(nokogiri, '//h1/text()')
36
+ end
37
+
38
+ def items_xpath
39
+ ITEMS_XPATH
40
+ end
41
+
42
+ def node_parser
43
+ r = super
44
+ r.extend(NodeParserExtra)
45
+ r
46
+ end
47
+
48
+ module NodeParserExtra
49
+ DISTANCE_PARSER = /\A(\d+)(?:,(\d+))? (m|km)/.to_parser do |m|
50
+ r = m[1].to_f + m[2].if_present(0) { |v| v.to_f / 10.pow(v.length) }
51
+ r /= 1000 if m[3] == 'm'
52
+ r
53
+ end
54
+
55
+ def distance_value(node, xpath)
56
+ s = string_value(node, xpath)
57
+ DISTANCE_PARSER.parse!(s)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Booking
7
+ module Processors
8
+ class List
9
+ class BuildAccommodation
10
+ acts_as_instance_method
11
+ common_constructor :list, :data
12
+
13
+ TOTAL_VALUE = '=index($A:$ZZZ;row();column()-2)+index($A:$ZZZ;row();column()-1)'
14
+
15
+ def result
16
+ %i[link total].inject(data) do |a, e|
17
+ a.merge(e => send("#{e}_value"))
18
+ end
19
+ end
20
+
21
+ # @return [String]
22
+ def link_value
23
+ "=HYPERLINK(\"#{data.fetch(:href)}\";\"#{data.fetch(:name)}\")"
24
+ end
25
+
26
+ # @return [String]
27
+ def total_value
28
+ TOTAL_VALUE
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/selenium/session'
4
+ require 'ehbrs_ruby_utils/booking/parsers/list'
5
+ require 'eac_ruby_utils/core_ext'
6
+
7
+ module EhbrsRubyUtils
8
+ module Booking
9
+ module Processors
10
+ class List
11
+ enable_simple_cache
12
+ common_constructor :url
13
+
14
+ CLOSE_BANNER_XPATH = '//button[@aria-label = "Ignorar informações de login."]'
15
+ MORE_RESULTS_XPATH = '//*[text() = "Ver mais resultados"]'
16
+ SCROLL_DOWN_STEP = 500
17
+
18
+ # @return [Array]
19
+ def accommodations
20
+ data.fetch(:accommodations).map { |a| build_accommodation(a) }
21
+ end
22
+
23
+ # @return [Integer]
24
+ def declared_count
25
+ data.fetch(:declared_count)
26
+ end
27
+
28
+ protected
29
+
30
+ # @return [Boolean]
31
+ def all_accommodations_reached?
32
+ p = parser
33
+ p.data.fetch(:accommodations).count >= p.data.fetch(:declared_count)
34
+ end
35
+
36
+ def click_more_results
37
+ more_results_button.click
38
+ end
39
+
40
+ def close_banner
41
+ close_banner_button.click
42
+ end
43
+
44
+ # @return [Aranha::Selenium::Session::Element]
45
+ def close_banner_button
46
+ session.element(xpath: CLOSE_BANNER_XPATH)
47
+ end
48
+
49
+ def data_uncached
50
+ session.navigate.to url
51
+ session.wait(5.minutes).until do
52
+ close_banner
53
+ click_more_results
54
+ scroll_down
55
+ all_accommodations_reached?
56
+ end
57
+ parser.data
58
+ end
59
+
60
+ # @return [Aranha::Selenium::Session::Element]
61
+ def more_results_button
62
+ session.element(xpath: MORE_RESULTS_XPATH)
63
+ end
64
+
65
+ def parser
66
+ ::EhbrsRubyUtils::Booking::Parsers::List.from_string(session.current_source)
67
+ end
68
+
69
+ # @return [Aranha::Selenium::Session]
70
+ def session_uncached
71
+ ::Aranha::Selenium::Session.new
72
+ end
73
+
74
+ def scroll_down
75
+ session.scroll_down_by(SCROLL_DOWN_STEP)
76
+ end
77
+
78
+ require_sub __FILE__, require_mode: :kernel
79
+ end
80
+ end
81
+ end
82
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EhbrsRubyUtils
4
- VERSION = '0.43.0'
4
+ VERSION = '0.44.0'
5
5
  end
@@ -16,7 +16,7 @@ module EhbrsRubyUtils
16
16
  end
17
17
 
18
18
  def show(level)
19
- super(level)
19
+ super
20
20
  children.each do |child|
21
21
  child.show(level + 1)
22
22
  end
@@ -25,7 +25,7 @@ module EhbrsRubyUtils
25
25
 
26
26
  class CheckWithProfiles < ::SimpleDelegator
27
27
  def initialize(check)
28
- super(check)
28
+ super
29
29
  @profiles = []
30
30
  end
31
31
 
@@ -23,7 +23,7 @@ module EhbrsRubyUtils
23
23
  MPEG4_EXTRA_UNSUPPORTED = %w[dx50 xvid].freeze
24
24
 
25
25
  def initialize
26
- super()
26
+ super
27
27
  add_check('invalid_extension', '.m4v')
28
28
  end
29
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ehbrs_ruby_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.43.0
4
+ version: 0.44.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo H. Bogoni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-16 00:00:00.000000000 Z
11
+ date: 2024-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha
@@ -50,34 +50,28 @@ dependencies:
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0.10'
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: 0.10.1
53
+ version: '0.11'
57
54
  type: :runtime
58
55
  prerelease: false
59
56
  version_requirements: !ruby/object:Gem::Requirement
60
57
  requirements:
61
58
  - - "~>"
62
59
  - !ruby/object:Gem::Version
63
- version: '0.10'
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: 0.10.1
60
+ version: '0.11'
67
61
  - !ruby/object:Gem::Dependency
68
62
  name: avm
69
63
  requirement: !ruby/object:Gem::Requirement
70
64
  requirements:
71
65
  - - "~>"
72
66
  - !ruby/object:Gem::Version
73
- version: '0.91'
67
+ version: '0.92'
74
68
  type: :runtime
75
69
  prerelease: false
76
70
  version_requirements: !ruby/object:Gem::Requirement
77
71
  requirements:
78
72
  - - "~>"
79
73
  - !ruby/object:Gem::Version
80
- version: '0.91'
74
+ version: '0.92'
81
75
  - !ruby/object:Gem::Dependency
82
76
  name: dentaku
83
77
  requirement: !ruby/object:Gem::Requirement
@@ -132,34 +126,28 @@ dependencies:
132
126
  requirements:
133
127
  - - "~>"
134
128
  - !ruby/object:Gem::Version
135
- version: '0.121'
129
+ version: '0.122'
136
130
  type: :runtime
137
131
  prerelease: false
138
132
  version_requirements: !ruby/object:Gem::Requirement
139
133
  requirements:
140
134
  - - "~>"
141
135
  - !ruby/object:Gem::Version
142
- version: '0.121'
136
+ version: '0.122'
143
137
  - !ruby/object:Gem::Dependency
144
138
  name: eac_templates
145
139
  requirement: !ruby/object:Gem::Requirement
146
140
  requirements:
147
141
  - - "~>"
148
142
  - !ruby/object:Gem::Version
149
- version: '0.5'
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: 0.5.1
143
+ version: '0.7'
153
144
  type: :runtime
154
145
  prerelease: false
155
146
  version_requirements: !ruby/object:Gem::Requirement
156
147
  requirements:
157
148
  - - "~>"
158
149
  - !ruby/object:Gem::Version
159
- version: '0.5'
160
- - - ">="
161
- - !ruby/object:Gem::Version
162
- version: 0.5.1
150
+ version: '0.7'
163
151
  - !ruby/object:Gem::Dependency
164
152
  name: inifile
165
153
  requirement: !ruby/object:Gem::Requirement
@@ -292,6 +280,9 @@ files:
292
280
  - lib/ehbrs_ruby_utils/bga/urls.rb
293
281
  - lib/ehbrs_ruby_utils/bga/whatsapp_formatter.rb
294
282
  - lib/ehbrs_ruby_utils/bga/whatsapp_formatter/option.rb
283
+ - lib/ehbrs_ruby_utils/booking/parsers/list.rb
284
+ - lib/ehbrs_ruby_utils/booking/processors/list.rb
285
+ - lib/ehbrs_ruby_utils/booking/processors/list/build_accommodation.rb
295
286
  - lib/ehbrs_ruby_utils/circular_list_spreader.rb
296
287
  - lib/ehbrs_ruby_utils/circular_list_spreader/base_level.rb
297
288
  - lib/ehbrs_ruby_utils/circular_list_spreader/group_level.rb