ehbrs_ruby_utils 0.48.1 → 0.49.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
  SHA256:
3
- metadata.gz: e292cd0ad725616776a221ce2d7cb93d878241b859ad1d413210e4e30dcc9810
4
- data.tar.gz: 759687bb2ee344b6f7619014850f23dfa6030d96a0683c8e1a93edf60651d574
3
+ metadata.gz: 6b3e1ad194bf9847d2c795bc0f3afc830d2210731ee8cb90b5c51dd65c7aa89c
4
+ data.tar.gz: c192269bc54cddb6fefd89dee7caca04b48e9c30a5678c5d230870237efb9923
5
5
  SHA512:
6
- metadata.gz: b8bf0f42ffba039e17bf7c36d01920adc8aa0631fedf798a29acb479113efbc61cbc9c46d989da4782959e7810d32b708ea7d115ab787563f3f7dba466d0bc29
7
- data.tar.gz: f7301417fd9dbb4c98a0d93730edb2ff8e320e7ef563d5480382c1cb7dba6a66f52990c35badeb8afc1ed547257d7a46351e7f703cd058cd2d6ea6d3ca0fe123
6
+ metadata.gz: d1f6ca93fc896974866819f89ff79e80f54bf51e01c68f591ab58b579c2b8f3f22f4f5a64ad2b3d65393946897fd9409a3e64081b650a7a1d351e6b9ade74ca2
7
+ data.tar.gz: 90178a31bcfab50461cf7208844ce373ea9601a626642a4ed6466fedb21c5edebd46e4c9e4f199f3120b9e8d555e0de0b509f8a87f7ab4d1297010257c70e146
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EhbrsRubyUtils
4
+ module Airbnb
5
+ module Parsers
6
+ class Page < ::Aranha::Parsers::Html::ItemList
7
+ class << self
8
+ # @param value [String]
9
+ # @param suffixes [Enumerable<String>]
10
+ # @return [String]
11
+ def testid_xpath(value, *suffixes)
12
+ ([".//*[@data-testid='#{value}']"] + suffixes).join('/')
13
+ end
14
+ end
15
+
16
+ DECLARED_COUNT_XPATH = '//h1/span[1]/text()'
17
+ ITEMS_XPATH = '//*[@data-xray-jira-component="Guest: Listing Cards"]/div'
18
+ NEXT_PAGE_HREF_XPATH = '//a[@aria-label="Próximo"]/@href'
19
+ REVIEW_STRUCT = ::Struct.new(:review_score, :review_count)
20
+ TYPE_ADDRESS_STRUCT = ::Struct.new(:type, :address)
21
+ REVIEW_PARSER = /\A(\S+)\s*\((\d+)\)\z/.to_parser do |m|
22
+ {
23
+ review_score: m[1].gsub(',', '.').to_f, review_count: m[2].to_i
24
+ }
25
+ end
26
+ REVIEW_TEXTS_ZERO = ['Novo', ''].freeze
27
+
28
+ field :name, :string, './/meta[@itemprop="name"]/@content'
29
+ field :href, :string, './/meta[@itemprop="url"]/@content'
30
+ field :type_address, :string, testid_xpath('listing-card-title', 'text()')
31
+ field :review_text, :string,
32
+ './/*[@inert="true"]/../span/span[@aria-hidden="true"]/text()'
33
+ field :price1, :decimal_comma_optional,
34
+ './/*[@style="--pricing-guest-primary-line-unit-price-text-decoration: none;"]'
35
+ field :price2, :decimal_comma_optional,
36
+ '(.//div[contains(@style, "--pricing-guest-display-price-alignment")]//button)[2]' \
37
+ '/span[1]/text()'
38
+
39
+ def data
40
+ %i[accommodations declared_count next_page_href].inject({}) do |a, e|
41
+ a.merge({ e => send(e) })
42
+ end
43
+ end
44
+
45
+ # @return [Enumerable<Hash>]
46
+ def accommodations
47
+ items_data.map do |e|
48
+ e.merge(parse_review(e.fetch(:review_text)))
49
+ .merge(parse_type_address(e.fetch(:type_address)))
50
+ .merge(price: build_price(e.fetch(:price1), e.fetch(:price2)))
51
+ end
52
+ end
53
+
54
+ # @return [Integer]
55
+ def declared_count
56
+ node_parser.integer_optional_value(nokogiri, DECLARED_COUNT_XPATH)
57
+ end
58
+
59
+ # @return [String]
60
+ def items_xpath
61
+ ITEMS_XPATH
62
+ end
63
+
64
+ # @return [String]
65
+ def next_page_href
66
+ nokogiri.at_xpath(NEXT_PAGE_HREF_XPATH).if_present(&:text)
67
+ end
68
+
69
+ # @param prices [Enumerable<Float, nil>]
70
+ # @return [Float]
71
+ def build_price(*prices)
72
+ prices.reject(&:blank?).min
73
+ end
74
+
75
+ # @param text [String]
76
+ # @return [Hash]
77
+ def parse_review(text)
78
+ return REVIEW_STRUCT.new(0, 0).to_h if REVIEW_TEXTS_ZERO.include?(text)
79
+
80
+ REVIEW_PARSER.parse!(text).to_h
81
+ end
82
+
83
+ # @param text [String]
84
+ # @return [Hash]
85
+ def parse_type_address(text)
86
+ TYPE_ADDRESS_STRUCT.new(*text.split('⋅').map(&:strip)).to_h
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EhbrsRubyUtils
4
+ module Airbnb
5
+ module Processors
6
+ class List
7
+ enable_memoized
8
+ common_constructor :url
9
+
10
+ # @return [Enumerable<Hash>]
11
+ def accommodations
12
+ current_url = url
13
+ index = 0
14
+ r = []
15
+ while current_url.present?
16
+ accommodations, current_url, index = page_accommodations(current_url, index)
17
+ r += accommodations
18
+ end
19
+ r
20
+ end
21
+
22
+ # @return [Integer]
23
+ def declared_count
24
+ @declared_count || raise('@declared_count is blank')
25
+ end
26
+
27
+ protected
28
+
29
+ # @param current_url [Addressable::URI]
30
+ # @param index [Integer]
31
+ # @return [Array]
32
+ def page_accommodations(current_url, index)
33
+ page = ::EhbrsRubyUtils::Airbnb::Processors::Page.new(current_url, session, index)
34
+ @declared_count ||= page.declared_count
35
+ [page.accommodations, page.next_page_url, index + 1]
36
+ end
37
+
38
+ # @return [Aranha::Selenium::Session]
39
+ memoize def session
40
+ ::Aranha::Selenium::Session.new(driver: :chrome)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EhbrsRubyUtils
4
+ module Airbnb
5
+ module Processors
6
+ class Page
7
+ class BuildAccommodation
8
+ acts_as_instance_method
9
+ common_constructor :list, :data
10
+
11
+ def result
12
+ %i[link].inject(data) do |a, e|
13
+ a.merge(e => send("#{e}_value"))
14
+ end
15
+ end
16
+
17
+ # @return [String]
18
+ def link_value
19
+ "=HYPERLINK(\"#{url_value}\";\"#{data.fetch(:name)}\")"
20
+ end
21
+
22
+ # @return [Addressable::URI]
23
+ def url_value
24
+ list.url + data.fetch(:href)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EhbrsRubyUtils
4
+ module Airbnb
5
+ module Processors
6
+ class Page < ::EhbrsRubyUtils::Aranha::AccommodationsProcessor
7
+ common_constructor :url, :session, :index, super_args: -> { [url] }
8
+
9
+ # @return [Boolean]
10
+ def all_data_loaded?
11
+ parser.data.fetch(:accommodations).all? { |e| e.fetch(:name).present? }
12
+ end
13
+
14
+ # @return [Addressable::URI]
15
+ def next_page_url
16
+ data.fetch(:next_page_href).if_present do |v|
17
+ url + v
18
+ end
19
+ end
20
+
21
+ require_sub __FILE__, require_mode: :kernel
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EhbrsRubyUtils
4
+ module Aranha
5
+ class AccommodationsProcessor
6
+ acts_as_abstract
7
+ enable_memoized
8
+ common_constructor :url
9
+
10
+ SCROLL_DOWN_STEP = 500
11
+
12
+ # @return [Array]
13
+ def accommodations
14
+ data.fetch(:accommodations).map { |a| build_accommodation(a) }
15
+ end
16
+
17
+ # @return [Integer]
18
+ def declared_count
19
+ data.fetch(:declared_count)
20
+ end
21
+
22
+ protected
23
+
24
+ # @return [Boolean]
25
+ def all_data_loaded?
26
+ raise_abstract_method __method__
27
+ end
28
+
29
+ # @param accommodation_data [Hash]
30
+ # @return [Hash]
31
+ def build_accommodation(_accommodation_data)
32
+ raise_abstract_method __method__
33
+ end
34
+
35
+ def data
36
+ @data ||= begin
37
+ session.navigate.to url
38
+ session.wait(5.minutes).until do
39
+ scroll_down
40
+ all_data_loaded?
41
+ end
42
+ parser.data
43
+ end
44
+ end
45
+
46
+ # @return [Object]
47
+ def parser
48
+ parser_class.from_string(session.current_source)
49
+ end
50
+
51
+ # @return [Class]
52
+ def parser_class
53
+ [self.class.module_parent.module_parent.name, 'Parsers', self.class.name.demodulize]
54
+ .join('::').constantize
55
+ end
56
+
57
+ # @return [Aranha::Selenium::Session]
58
+ def session
59
+ raise_abstract_method __method__
60
+ end
61
+
62
+ # @return [void]
63
+ def scroll_down
64
+ session.scroll_down_by(SCROLL_DOWN_STEP)
65
+ end
66
+
67
+ require_sub __FILE__, require_mode: :kernel
68
+ end
69
+ end
70
+ end
@@ -7,7 +7,7 @@ module EhbrsRubyUtils
7
7
  DEFAULT_STATUS = 'asyncplay'
8
8
  ID_PARSER = /table=(\d+)/.to_parser { |m| m[1].to_i }
9
9
  ITEMS_XPATH = '//*[@id = "section-play"]//a[contains(@href, "table=")]'
10
- STATUS_CLASS_PATTERN = /\Agametable_status_(.+)\z/.freeze
10
+ STATUS_CLASS_PATTERN = /\Agametable_status_(.+)\z/
11
11
  STATUS_CLASS_PARSER = STATUS_CLASS_PATTERN.to_parser { |m| m[1] }
12
12
  TABLE_COUNT_XPATH =
13
13
  '//*[@id = "section-play"]/h1/span[contains(@class, "font-normal")]/span/text()'
@@ -11,7 +11,7 @@ module EhbrsRubyUtils
11
11
  'players_at_table' => ::EhbrsRubyUtils::Bga::Parsers::Table::ActivePlayers
12
12
  }.freeze
13
13
  PLAYERS_IDS_XPATH = PLAYERS_IDS.keys.map { |id| "@id = \"#{id}\"" }.join(' or ')
14
- PLAYERS_XPATH = ".//*[(#{PLAYERS_IDS_XPATH}) and count(./*) > 0]"
14
+ PLAYERS_XPATH = ".//*[(#{PLAYERS_IDS_XPATH}) and count(./*) > 0]".freeze
15
15
 
16
16
  field :game_code, :string, '//meta[@property="og:image"]/@content'
17
17
  field :game_name, :string, './/*[@id = "table_name"]/text()'
@@ -15,9 +15,9 @@ module EhbrsRubyUtils
15
15
 
16
16
  ([:id] + ::EhbrsRubyUtils::Bga::Parsers::Table.fields.map(&:name) - SET_ITEMS)
17
17
  .each do |field|
18
- define_method field do
19
- data.fetch(field)
20
- end
18
+ define_method field do
19
+ data.fetch(field)
20
+ end
21
21
  end
22
22
 
23
23
  # @return [Boolean]
@@ -9,7 +9,7 @@ module EhbrsRubyUtils
9
9
 
10
10
  LINE_SEPARATOR = "\n"
11
11
  OPTION_SEPARATOR = LINE_SEPARATOR
12
- SECTION_SEPARATOR = "#{LINE_SEPARATOR}#{LINE_SEPARATOR}"
12
+ SECTION_SEPARATOR = "#{LINE_SEPARATOR}#{LINE_SEPARATOR}".freeze
13
13
 
14
14
  # @param content [String, Enumerable]
15
15
  # @return [String]
@@ -16,11 +16,11 @@ module EhbrsRubyUtils
16
16
  field :href, :string, testid_xpath('title-link', '@href')
17
17
  field :price, :float, testid_xpath('price-and-discounted-price', '/text()')
18
18
  field :tax, :float_optional, testid_xpath('taxes-and-charges', 'text()')
19
- field :address, :string, testid_xpath('address', 'text()')
19
+ field :address, :string, testid_xpath('address-link', 'text()')
20
20
  field :distance, :distance, testid_xpath('distance', 'text()')
21
21
  field :review_score, :float_optional, testid_xpath('review-score', 'div[1]/text()')
22
22
  field :review_count, :integer_comma_optional,
23
- testid_xpath('review-score', 'div[2]/div[2]/text()')
23
+ testid_xpath('review-score', 'div[3]/div[2]/text()')
24
24
  field :unit_title, :string_recursive, testid_xpath('recommended-units',
25
25
  '/*[@role="link"]')
26
26
 
@@ -30,7 +30,7 @@ module EhbrsRubyUtils
30
30
 
31
31
  # @return [Integer]
32
32
  def declared_count
33
- node_parser.integer_value(nokogiri, '//h1/text()')
33
+ node_parser.integer_optional_value(nokogiri, '//h1/text()')
34
34
  end
35
35
 
36
36
  def items_xpath
@@ -3,30 +3,18 @@
3
3
  module EhbrsRubyUtils
4
4
  module Booking
5
5
  module Processors
6
- class List
7
- enable_simple_cache
8
- common_constructor :url
9
-
6
+ class List < ::EhbrsRubyUtils::Aranha::AccommodationsProcessor
10
7
  CLOSE_BANNER_XPATH = '//button[@aria-label = "Ignorar informações de login."]'
11
8
  MORE_RESULTS_XPATH = '//*[text() = "Ver mais resultados"]'
12
- SCROLL_DOWN_STEP = 500
13
-
14
- # @return [Array]
15
- def accommodations
16
- data.fetch(:accommodations).map { |a| build_accommodation(a) }
17
- end
18
-
19
- # @return [Integer]
20
- def declared_count
21
- data.fetch(:declared_count)
22
- end
23
9
 
24
10
  protected
25
11
 
26
12
  # @return [Boolean]
27
- def all_accommodations_reached?
13
+ def all_data_loaded?
28
14
  p = parser
29
- p.data.fetch(:accommodations).count >= p.data.fetch(:declared_count)
15
+ p.data.fetch(:declared_count).if_present(false) do |v|
16
+ p.data.fetch(:accommodations).count >= v
17
+ end
30
18
  end
31
19
 
32
20
  def click_more_results
@@ -42,33 +30,21 @@ module EhbrsRubyUtils
42
30
  session.element(xpath: CLOSE_BANNER_XPATH)
43
31
  end
44
32
 
45
- def data_uncached
46
- session.navigate.to url
47
- session.wait(5.minutes).until do
48
- close_banner
49
- click_more_results
50
- scroll_down
51
- all_accommodations_reached?
52
- end
53
- parser.data
54
- end
55
-
56
33
  # @return [Aranha::Selenium::Session::Element]
57
34
  def more_results_button
58
35
  session.element(xpath: MORE_RESULTS_XPATH)
59
36
  end
60
37
 
61
- def parser
62
- ::EhbrsRubyUtils::Booking::Parsers::List.from_string(session.current_source)
38
+ # @return [void]
39
+ def scroll_down
40
+ close_banner
41
+ click_more_results
42
+ super
63
43
  end
64
44
 
65
45
  # @return [Aranha::Selenium::Session]
66
- def session_uncached
67
- ::Aranha::Selenium::Session.new
68
- end
69
-
70
- def scroll_down
71
- session.scroll_down_by(SCROLL_DOWN_STEP)
46
+ memoize def session
47
+ ::Aranha::Selenium::Session.new(driver: :chrome)
72
48
  end
73
49
 
74
50
  require_sub __FILE__, require_mode: :kernel
@@ -4,10 +4,10 @@ module EhbrsRubyUtils
4
4
  module CookingBook
5
5
  class Recipe
6
6
  class Measure
7
- FLOAT_PATTERN = /\d+(?:\.\d+)?/.freeze
8
- FRACTION_PATTERN = %r{(#{FLOAT_PATTERN})(?:\s*/\s*(#{FLOAT_PATTERN}))?}.freeze
9
- QUANTITY_UNIT_PATTERN = /\A#{FRACTION_PATTERN}(?:\s*(\S+))?\z/.freeze
10
- VARIABLE_PATTERN = /\A~\z/.freeze
7
+ FLOAT_PATTERN = /\d+(?:\.\d+)?/
8
+ FRACTION_PATTERN = %r{(#{FLOAT_PATTERN})(?:\s*/\s*(#{FLOAT_PATTERN}))?}
9
+ QUANTITY_UNIT_PATTERN = /\A#{FRACTION_PATTERN}(?:\s*(\S+))?\z/
10
+ VARIABLE_PATTERN = /\A~\z/
11
11
  VARIABLE_TEXT = 'a gosto'
12
12
 
13
13
  class << self
@@ -13,8 +13,8 @@ module EhbrsRubyUtils
13
13
  self.options = self.class.lists.option.hash_keys_validate!(options)
14
14
  end
15
15
 
16
- def build(target_dir, &directory_target_basename)
17
- ::EhbrsRubyUtils::Fs::Selected::Build.new(self, target_dir, &directory_target_basename)
16
+ def build(target_dir, &)
17
+ ::EhbrsRubyUtils::Fs::Selected::Build.new(self, target_dir, &)
18
18
  end
19
19
 
20
20
  def filename
@@ -33,8 +33,8 @@ module EhbrsRubyUtils
33
33
  end
34
34
 
35
35
  # @return [void]
36
- def mudslide_run(*args)
37
- r = ::EhbrsRubyUtils::Executables.mudslide.command(*args).execute
36
+ def mudslide_run(*)
37
+ r = ::EhbrsRubyUtils::Executables.mudslide.command(*).execute
38
38
  raise_mudslide_run_error r, 'exit code not zero ' unless r.fetch(:exit_code).zero?
39
39
  raise_mudslide_run_error r, 'blank stdout' if r.fetch(:stdout).blank?
40
40
  raise_mudslide_run_error r, 'qrcode shown' if r.fetch(:stdout).include?('▄▄▄▄▄▄▄▄▄')
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EhbrsRubyUtils
4
- VERSION = '0.48.1'
4
+ VERSION = '0.49.0'
5
5
  end
@@ -4,7 +4,7 @@ module EhbrsRubyUtils
4
4
  module Vg
5
5
  module Ps2
6
6
  class IsoFile < ::EhbrsRubyUtils::Fs::Iso9660File
7
- CODE_PATTERN = /[a-zA-Z]{4}_[0-9]{3}\.[0-9]{2}/.freeze
7
+ CODE_PATTERN = /[a-zA-Z]{4}_[0-9]{3}\.[0-9]{2}/
8
8
  CODE_PARSER = CODE_PATTERN.to_parser(&:to_s)
9
9
 
10
10
  # @return [String]
@@ -8,7 +8,7 @@ module EhbrsRubyUtils
8
8
  class GameFile < ::Pathname
9
9
  enable_simple_cache
10
10
 
11
- DISC_NUMBER_PATTERN = /disc.?(\d)/i.freeze
11
+ DISC_NUMBER_PATTERN = /disc.?(\d)/i
12
12
 
13
13
  FORMAT = ::EacRubyUtils::CustomFormat.new(
14
14
  b: :basename,
@@ -6,7 +6,7 @@ module EhbrsRubyUtils
6
6
  module Wit
7
7
  class ImageFormat
8
8
  class << self
9
- SECTION_NAME_PATTERN = /\A#{::Regexp.quote('IMAGE-FORMAT:')}(.+)\z/.freeze
9
+ SECTION_NAME_PATTERN = /\A#{::Regexp.quote('IMAGE-FORMAT:')}(.+)\z/
10
10
 
11
11
  enable_simple_cache
12
12
 
@@ -21,10 +21,10 @@ module EhbrsRubyUtils
21
21
  def all_uncached
22
22
  ::EhbrsRubyUtils::Vg::Wii::Wit::Parsers::Info.new(info_output).images
23
23
  .map do |_label, data|
24
- new(
25
- *%w[name info option].map { |k| data.fetch(k) },
26
- *%w[extensions attributes].map { |k| data.fetch(k).to_s.split(/\s+/) }
27
- )
24
+ new(
25
+ *%w[name info option].map { |k| data.fetch(k) },
26
+ *%w[extensions attributes].map { |k| data.fetch(k).to_s.split(/\s+/) }
27
+ )
28
28
  end
29
29
  end
30
30
 
@@ -13,7 +13,7 @@ module EhbrsRubyUtils
13
13
  # ISO/WII & Wii
14
14
  # WBFS/WII & Wii
15
15
  # ISO/GC & GameCube
16
- FILE_DISC_TYPE_PATTERN = %r{\A(\S+)/(\S+)\s+(?:\(([^)]+)\)\s+)?&\s+(\S+)\z}.freeze
16
+ FILE_DISC_TYPE_PATTERN = %r{\A(\S+)/(\S+)\s+(?:\(([^)]+)\)\s+)?&\s+(\S+)\z}
17
17
 
18
18
  private
19
19
 
@@ -8,7 +8,7 @@ module EhbrsRubyUtils
8
8
  module Wit
9
9
  module Parsers
10
10
  class Info
11
- SECTION_NAME_PATTERN = /\A#{::Regexp.quote('IMAGE-FORMAT:')}(.+)\z/.freeze
11
+ SECTION_NAME_PATTERN = /\A#{::Regexp.quote('IMAGE-FORMAT:')}(.+)\z/
12
12
 
13
13
  enable_simple_cache
14
14
  common_constructor :output
@@ -5,7 +5,7 @@ module EhbrsRubyUtils
5
5
  module Wii
6
6
  module Wit
7
7
  class Path
8
- WIT_PATH_PATTERN = /\A(?:([a-z0-9]+):)?(.+)\z/i.freeze
8
+ WIT_PATH_PATTERN = /\A(?:([a-z0-9]+):)?(.+)\z/i
9
9
 
10
10
  class << self
11
11
  def assert(source)
@@ -52,8 +52,8 @@ module EhbrsRubyUtils
52
52
  checks.reject(&:passed?).map { |c| c.check.fix }.compact_blank
53
53
  end
54
54
 
55
- def pad_speaker(&block)
56
- ::EacRubyUtils::Speaker.context.on(::EacCli::Speaker.new(err_line_prefix: ' '), &block)
55
+ def pad_speaker(&)
56
+ ::EacRubyUtils::Speaker.context.on(::EacCli::Speaker.new(err_line_prefix: ' '), &)
57
57
  end
58
58
 
59
59
  def new_padded_cli_speaker
@@ -14,9 +14,9 @@ module EhbrsRubyUtils
14
14
  @added_checks ||= []
15
15
  end
16
16
 
17
- def add_check(name, *args)
17
+ def add_check(name, *)
18
18
  check_path = "ehbrs_ruby_utils/videos2/unsupported/checks/#{name}"
19
- added_checks << check_path.camelize.constantize.new(*args)
19
+ added_checks << check_path.camelize.constantize.new(*)
20
20
  end
21
21
 
22
22
  def base_checks
@@ -0,0 +1,12 @@
1
+ ; DO NOT EDIT (unless you know what you are doing)
2
+ ;
3
+ ; This subdirectory is a git "subrepo", and this file is maintained by the
4
+ ; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
5
+ ;
6
+ [subrepo]
7
+ remote = https://github.com/jsalatiel/wsbb-podman.git
8
+ branch = master
9
+ commit = 17e9e19bd755c3312b4cb7dd427acdf110b8a5f0
10
+ parent = f94d3b2833c4f75b55dd64d21d3440a3ab96a106
11
+ method = merge
12
+ cmdver = 0.4.1
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.48.1
4
+ version: 0.49.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: 2026-02-11 00:00:00.000000000 Z
11
+ date: 2026-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha
@@ -30,54 +30,42 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.26'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 0.26.2
33
+ version: '0.28'
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
38
  - - "~>"
42
39
  - !ruby/object:Gem::Version
43
- version: '0.26'
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 0.26.2
40
+ version: '0.28'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: aranha-selenium
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '0.13'
47
+ version: '0.14'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
52
  - - "~>"
59
53
  - !ruby/object:Gem::Version
60
- version: '0.13'
54
+ version: '0.14'
61
55
  - !ruby/object:Gem::Dependency
62
56
  name: avm
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
59
  - - "~>"
66
60
  - !ruby/object:Gem::Version
67
- version: '0.98'
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: 0.98.4
61
+ version: '0.100'
71
62
  type: :runtime
72
63
  prerelease: false
73
64
  version_requirements: !ruby/object:Gem::Requirement
74
65
  requirements:
75
66
  - - "~>"
76
67
  - !ruby/object:Gem::Version
77
- version: '0.98'
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: 0.98.4
68
+ version: '0.100'
81
69
  - !ruby/object:Gem::Dependency
82
70
  name: avm-eac_rails_base0
83
71
  requirement: !ruby/object:Gem::Requirement
@@ -87,7 +75,7 @@ dependencies:
87
75
  version: '0.11'
88
76
  - - ">="
89
77
  - !ruby/object:Gem::Version
90
- version: 0.11.1
78
+ version: 0.11.2
91
79
  type: :runtime
92
80
  prerelease: false
93
81
  version_requirements: !ruby/object:Gem::Requirement
@@ -97,7 +85,7 @@ dependencies:
97
85
  version: '0.11'
98
86
  - - ">="
99
87
  - !ruby/object:Gem::Version
100
- version: 0.11.1
88
+ version: 0.11.2
101
89
  - !ruby/object:Gem::Dependency
102
90
  name: dentaku
103
91
  requirement: !ruby/object:Gem::Requirement
@@ -125,6 +113,9 @@ dependencies:
125
113
  - - "~>"
126
114
  - !ruby/object:Gem::Version
127
115
  version: '0.20'
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 0.20.2
128
119
  type: :runtime
129
120
  prerelease: false
130
121
  version_requirements: !ruby/object:Gem::Requirement
@@ -132,34 +123,37 @@ dependencies:
132
123
  - - "~>"
133
124
  - !ruby/object:Gem::Version
134
125
  version: '0.20'
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 0.20.2
135
129
  - !ruby/object:Gem::Dependency
136
130
  name: eac_rest
137
131
  requirement: !ruby/object:Gem::Requirement
138
132
  requirements:
139
133
  - - "~>"
140
134
  - !ruby/object:Gem::Version
141
- version: '0.12'
135
+ version: '0.13'
142
136
  type: :runtime
143
137
  prerelease: false
144
138
  version_requirements: !ruby/object:Gem::Requirement
145
139
  requirements:
146
140
  - - "~>"
147
141
  - !ruby/object:Gem::Version
148
- version: '0.12'
142
+ version: '0.13'
149
143
  - !ruby/object:Gem::Dependency
150
144
  name: eac_ruby_utils
151
145
  requirement: !ruby/object:Gem::Requirement
152
146
  requirements:
153
147
  - - "~>"
154
148
  - !ruby/object:Gem::Version
155
- version: '0.129'
149
+ version: '0.131'
156
150
  type: :runtime
157
151
  prerelease: false
158
152
  version_requirements: !ruby/object:Gem::Requirement
159
153
  requirements:
160
154
  - - "~>"
161
155
  - !ruby/object:Gem::Version
162
- version: '0.129'
156
+ version: '0.131'
163
157
  - !ruby/object:Gem::Dependency
164
158
  name: eac_templates
165
159
  requirement: !ruby/object:Gem::Requirement
@@ -254,20 +248,14 @@ dependencies:
254
248
  requirements:
255
249
  - - "~>"
256
250
  - !ruby/object:Gem::Version
257
- version: '0.12'
258
- - - ">="
259
- - !ruby/object:Gem::Version
260
- version: 0.12.1
251
+ version: '0.13'
261
252
  type: :development
262
253
  prerelease: false
263
254
  version_requirements: !ruby/object:Gem::Requirement
264
255
  requirements:
265
256
  - - "~>"
266
257
  - !ruby/object:Gem::Version
267
- version: '0.12'
268
- - - ">="
269
- - !ruby/object:Gem::Version
270
- version: 0.12.1
258
+ version: '0.13'
271
259
  description:
272
260
  email:
273
261
  executables: []
@@ -275,6 +263,11 @@ extensions: []
275
263
  extra_rdoc_files: []
276
264
  files:
277
265
  - lib/ehbrs_ruby_utils.rb
266
+ - lib/ehbrs_ruby_utils/airbnb/parsers/page.rb
267
+ - lib/ehbrs_ruby_utils/airbnb/processors/list.rb
268
+ - lib/ehbrs_ruby_utils/airbnb/processors/page.rb
269
+ - lib/ehbrs_ruby_utils/airbnb/processors/page/build_accommodation.rb
270
+ - lib/ehbrs_ruby_utils/aranha/accommodations_processor.rb
278
271
  - lib/ehbrs_ruby_utils/bga/game.rb
279
272
  - lib/ehbrs_ruby_utils/bga/game/image.rb
280
273
  - lib/ehbrs_ruby_utils/bga/game_statistics.rb
@@ -432,6 +425,7 @@ files:
432
425
  - lib/ehbrs_ruby_utils/web_utils/videos/file.rb
433
426
  - lib/ehbrs_ruby_utils/web_utils/videos/file/rename.rb
434
427
  - lib/ehbrs_ruby_utils/web_utils/videos/files_list.rb
428
+ - template/ehbrs_ruby_utils/finances/bb_browser/docker_image/.gitrepo
435
429
  - template/ehbrs_ruby_utils/finances/bb_browser/docker_image/Dockerfile
436
430
  - template/ehbrs_ruby_utils/finances/bb_browser/docker_image/Makefile
437
431
  - template/ehbrs_ruby_utils/finances/bb_browser/docker_image/README.md
@@ -454,7 +448,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
454
448
  requirements:
455
449
  - - ">="
456
450
  - !ruby/object:Gem::Version
457
- version: 2.7.0
451
+ version: '3.2'
458
452
  required_rubygems_version: !ruby/object:Gem::Requirement
459
453
  requirements:
460
454
  - - ">="