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 +4 -4
- data/lib/ehbrs_ruby_utils/airbnb/parsers/page.rb +91 -0
- data/lib/ehbrs_ruby_utils/airbnb/processors/list.rb +45 -0
- data/lib/ehbrs_ruby_utils/airbnb/processors/page/build_accommodation.rb +30 -0
- data/lib/ehbrs_ruby_utils/airbnb/processors/page.rb +25 -0
- data/lib/ehbrs_ruby_utils/aranha/accommodations_processor.rb +70 -0
- data/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress.rb +1 -1
- data/lib/ehbrs_ruby_utils/bga/parsers/table.rb +1 -1
- data/lib/ehbrs_ruby_utils/bga/table.rb +3 -3
- data/lib/ehbrs_ruby_utils/bga/whatsapp_formatter.rb +1 -1
- data/lib/ehbrs_ruby_utils/booking/parsers/list.rb +3 -3
- data/lib/ehbrs_ruby_utils/booking/processors/list.rb +12 -36
- data/lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb +4 -4
- data/lib/ehbrs_ruby_utils/fs/selected.rb +2 -2
- data/lib/ehbrs_ruby_utils/mudslide/message.rb +2 -2
- data/lib/ehbrs_ruby_utils/version.rb +1 -1
- data/lib/ehbrs_ruby_utils/vg/ps2/iso_file.rb +1 -1
- data/lib/ehbrs_ruby_utils/vg/wii/game_file.rb +1 -1
- data/lib/ehbrs_ruby_utils/vg/wii/wit/image_format.rb +5 -5
- data/lib/ehbrs_ruby_utils/vg/wii/wit/parsers/dump.rb +1 -1
- data/lib/ehbrs_ruby_utils/vg/wii/wit/parsers/info.rb +1 -1
- data/lib/ehbrs_ruby_utils/vg/wii/wit/path.rb +1 -1
- data/lib/ehbrs_ruby_utils/videos2/unsupported/check_support.rb +2 -2
- data/lib/ehbrs_ruby_utils/videos2/unsupported/profiles/base.rb +2 -2
- data/template/ehbrs_ruby_utils/finances/bb_browser/docker_image/.gitrepo +12 -0
- metadata +29 -35
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6b3e1ad194bf9847d2c795bc0f3afc830d2210731ee8cb90b5c51dd65c7aa89c
|
|
4
|
+
data.tar.gz: c192269bc54cddb6fefd89dee7caca04b48e9c30a5678c5d230870237efb9923
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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[
|
|
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.
|
|
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
|
|
13
|
+
def all_data_loaded?
|
|
28
14
|
p = parser
|
|
29
|
-
p.data.fetch(:
|
|
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
|
-
|
|
62
|
-
|
|
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
|
|
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+)
|
|
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
|
|
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, &
|
|
17
|
-
::EhbrsRubyUtils::Fs::Selected::Build.new(self, target_dir, &
|
|
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(*
|
|
37
|
-
r = ::EhbrsRubyUtils::Executables.mudslide.command(*
|
|
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?('▄▄▄▄▄▄▄▄▄')
|
|
@@ -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}
|
|
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]
|
|
@@ -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
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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}
|
|
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
|
|
11
|
+
SECTION_NAME_PATTERN = /\A#{::Regexp.quote('IMAGE-FORMAT:')}(.+)\z/
|
|
12
12
|
|
|
13
13
|
enable_simple_cache
|
|
14
14
|
common_constructor :output
|
|
@@ -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(&
|
|
56
|
-
::EacRubyUtils::Speaker.context.on(::EacCli::Speaker.new(err_line_prefix: ' '), &
|
|
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, *
|
|
17
|
+
def add_check(name, *)
|
|
18
18
|
check_path = "ehbrs_ruby_utils/videos2/unsupported/checks/#{name}"
|
|
19
|
-
added_checks << check_path.camelize.constantize.new(*
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
451
|
+
version: '3.2'
|
|
458
452
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
459
453
|
requirements:
|
|
460
454
|
- - ">="
|