ehbrs_ruby_utils 0.23.0 → 0.24.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (22) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ehbrs_ruby_utils/bga/parsers/game_stats/players.rb +2 -2
  3. data/lib/ehbrs_ruby_utils/bga/parsers/game_stats.rb +4 -2
  4. data/lib/ehbrs_ruby_utils/bga/parsers/table/players.rb +1 -1
  5. data/lib/ehbrs_ruby_utils/bga/parsers/table.rb +8 -0
  6. data/lib/ehbrs_ruby_utils/bga/session/login.rb +1 -1
  7. data/lib/ehbrs_ruby_utils/bga/session/player_tables_on_game_stats.rb +99 -0
  8. data/lib/ehbrs_ruby_utils/bga/session.rb +10 -5
  9. data/lib/ehbrs_ruby_utils/bga/table.rb +5 -0
  10. data/lib/ehbrs_ruby_utils/bga/urls.rb +7 -1
  11. data/lib/ehbrs_ruby_utils/version.rb +1 -1
  12. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_stats_spec_files/1.target.yaml +10 -10
  13. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_stats_spec_files/2.source.html +1083 -0
  14. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_stats_spec_files/2.target.yaml +1127 -0
  15. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_302873643.target.yaml +1 -0
  16. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_356513708.source.html +1497 -0
  17. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_356513708.target.yaml +47 -0
  18. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_357408039.target.yaml +1 -0
  19. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_368448439.target.yaml +1 -0
  20. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_373602409.target.yaml +1 -0
  21. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_373747455.target.yaml +1 -0
  22. metadata +25 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 90c029952b15c0fa9fd3034c5766583e9f8679c8efd16a005304ede77774b1ee
4
- data.tar.gz: 8862eaf9b276fd42e92856ea98fa42e38d991c5e3c825ec1e1474ebaaaddefc6
3
+ metadata.gz: ef922dc8e609ca372c63e29cbfda768e95abc03b24c0fd5b9a5c6d46bf707445
4
+ data.tar.gz: ad3022d2b588614b4471798f751a8edca0800e301ab0f7bd689a22fc684fd59f
5
5
  SHA512:
6
- metadata.gz: fbc869e81f0a95f04cf9a393eb4f6f9b1d79e3d77ac3ff9f720b3115722adf41fbe6478e9c7d9878b297c8c46342686ce79a11fceb2f8b5d52c197044724372b
7
- data.tar.gz: aab5320864d3863cc32878679ae7ee7cfa84610ed24bd0ade989c60a20a3285fb0a348efeb2aafc7eed71bf824c1ff6ee7dcc2c12467ab5efbd89722f058474f
6
+ metadata.gz: f2e2052b2490544bcb9edd3234d082f46489aa76d277889d33cc75ad75e31e9181c1c38deb00b4741723ba396be7c0f2ebbe71931845fd7db4145cfffe60dd00
7
+ data.tar.gz: 4b27d92bade1d8a85151dbd2ce9c101286b75c433327a849fbab1bb275ce47e4c6b06c850616b320480b18ea294b59c76b55199023e80bcb38c7da465d4c54c1
@@ -10,10 +10,10 @@ module EhbrsRubyUtils
10
10
  class Players < ::Aranha::Parsers::Html::ItemList
11
11
  ITEMS_XPATH = '//div[@class = "simple-score-entry"]'
12
12
 
13
- field :rank, :integer, './div[@class = "rank"]'
13
+ field :rank, :integer_optional, './div[@class = "rank"]'
14
14
  field :id, :integer, './div[@class = "name"]/a/@href'
15
15
  field :name, :string, './div[@class = "name"]/a/text()'
16
- field :score, :integer, './div[@class = "score"]'
16
+ field :score, :integer_optional, './div[@class = "score"]'
17
17
 
18
18
  def items_xpath
19
19
  ITEMS_XPATH
@@ -23,7 +23,7 @@ module EhbrsRubyUtils
23
23
 
24
24
  def item_data(item)
25
25
  r = super
26
- r[:table_id] = table_name_to_id(r.delete(:table_name))
26
+ r[:id] = table_name_to_id(r.delete(:table_name))
27
27
  r[:players] = players_data(r.delete(:players))
28
28
  r
29
29
  end
@@ -36,8 +36,10 @@ module EhbrsRubyUtils
36
36
  ).data
37
37
  end
38
38
 
39
+ # @param name [String]
40
+ # @return [Integer]
39
41
  def table_name_to_id(name)
40
- name.gsub(/\A\#/, '')
42
+ name.gsub(/\A\#/, '').to_i
41
43
  end
42
44
 
43
45
  require_sub __FILE__
@@ -14,7 +14,7 @@ module EhbrsRubyUtils
14
14
  field :table_rank, :integer, './div[@class = "rank"]'
15
15
  field :id, :integer, './div[@class = "name"]/a/@href'
16
16
  field :name, :string, './div[@class = "name"]/a/text()'
17
- field :score, :integer, './div[@class = "score"]'
17
+ field :score, :integer_optional, './div[@class = "score"]'
18
18
  field :win_points, :string, './/*[starts-with(@id, "winpoints_value_")]/text()'
19
19
  field :game_rank, :integer, './/*[@class = "gamerank_value"]/text()'
20
20
 
@@ -14,6 +14,7 @@ module EhbrsRubyUtils
14
14
  field :estimated_duration, :string, './/*[@id = "estimated_duration"]/text()'
15
15
  field :options, :node, './/*[@id = "gameoptions"]'
16
16
  field :players, :node, './/*[@id = "game_result"]'
17
+ field :game_conceded, :node, './/*[@id = "game_conceded" and @style="display: block;"]'
17
18
 
18
19
  def item_xpath
19
20
  ITEM_XPATH
@@ -25,6 +26,7 @@ module EhbrsRubyUtils
25
26
  r[key] = self.class.const_get(key.to_s.camelize).from_node(r.fetch(key)).data
26
27
  end
27
28
  r[:creation_time] = process_creation_time(r[:creation_time])
29
+ r[:game_conceded] = process_game_conceded(r[:game_conceded])
28
30
  r
29
31
  end
30
32
 
@@ -34,6 +36,12 @@ module EhbrsRubyUtils
34
36
  creation_time.gsub('Criado:', '').strip
35
37
  end
36
38
 
39
+ # @param node [Nokogiri::XML::Element]
40
+ # @return [Boolean]
41
+ def process_game_conceded(node)
42
+ node.present?
43
+ end
44
+
37
45
  require_sub __FILE__
38
46
  end
39
47
  end
@@ -24,7 +24,7 @@ module EhbrsRubyUtils
24
24
  input_username
25
25
  input_password
26
26
  submit_login
27
- logged_by_message?(message_info)
27
+ logged_by_message?(waited_message_info)
28
28
  end
29
29
 
30
30
  def login_url
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/bga/parsers/table'
4
+ require 'ehbrs_ruby_utils/bga/table'
5
+ require 'ehbrs_ruby_utils/bga/urls'
6
+ require 'eac_ruby_utils/core_ext'
7
+
8
+ module EhbrsRubyUtils
9
+ module Bga
10
+ class Session < ::SimpleDelegator
11
+ class PlayerTablesOnGameStats
12
+ include ::EhbrsRubyUtils::Bga::Urls
13
+ enable_method_class
14
+ enable_simple_cache
15
+ common_constructor :session, :player_id, :until_table_id, default: [nil] do
16
+ self.until_table_id = until_table_id.if_present(&:to_i)
17
+ end
18
+
19
+ SEE_MORE_BUTTON_ID = 'see_more_tables'
20
+
21
+ def result
22
+ navigate_to_page
23
+ loop do
24
+ return result_data unless more?
25
+ end
26
+ end
27
+
28
+ # @return [Addressable::URI]
29
+ def url
30
+ player_game_stats_url(player_id)
31
+ end
32
+
33
+ private
34
+
35
+ # @return [Array<Hash>]
36
+ def current_data_uncached
37
+ ::EhbrsRubyUtils::Bga::Parsers::GameStats.from_content(session.current_source).data
38
+ end
39
+
40
+ # @return [Array<Hash>]
41
+ def new_current_data
42
+ reset_cache(:current_data)
43
+ current_data
44
+ end
45
+
46
+ def navigate_to_page
47
+ session.navigate.to url
48
+ end
49
+
50
+ # @return [Boolean]
51
+ def more?
52
+ !(table_id_found? || list_end_reached?)
53
+ end
54
+
55
+ # @return [Boolean]
56
+ def list_end_reached?
57
+ previous_count = current_data.count
58
+ result = nil
59
+ session.wait_for_click(id: SEE_MORE_BUTTON_ID)
60
+ session.wait.until do
61
+ result = list_end_reached_non_waiting(previous_count)
62
+ !result.nil?
63
+ end
64
+ result
65
+ end
66
+
67
+ # @param previous_count [Integer]
68
+ # @return [Boolean, nil]
69
+ def list_end_reached_non_waiting(previous_count)
70
+ if session.message_info.present?
71
+ true
72
+ elsif new_current_data.count != previous_count
73
+ false
74
+ end
75
+ end
76
+
77
+ # @return [Array<Hash>]
78
+ def result_data
79
+ until_table_id.if_present(current_data) do |v|
80
+ r = []
81
+ current_data.each do |d|
82
+ break if d.fetch(:id) == v
83
+
84
+ r << d
85
+ end
86
+ r
87
+ end
88
+ end
89
+
90
+ # @return [Boolean]
91
+ def table_id_found?
92
+ until_table_id.if_present(false) do |v|
93
+ current_data.any? { |d| d.fetch(:id) == v }
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -12,16 +12,21 @@ module EhbrsRubyUtils
12
12
 
13
13
  common_constructor :username, :password, super_args: -> { [::Aranha::Selenium::Session.new] }
14
14
 
15
- # @return [String]
16
- def message_info
17
- wait_for_click(id: MESSAGE_ID).text
18
- end
19
-
20
15
  # @return [EhbrsRubyUtils::Bga::Session::Player]
21
16
  def player(id)
22
17
  ::EhbrsRubyUtils::Bga::Session::Player.new(self, id)
23
18
  end
24
19
 
20
+ # @return [String, nil]
21
+ def message_info
22
+ find_or_not_element(id: MESSAGE_ID).if_present { |v| v.text.strip }
23
+ end
24
+
25
+ # @return [String]
26
+ def waited_message_info
27
+ wait_for_click(id: MESSAGE_ID).text
28
+ end
29
+
25
30
  require_sub __FILE__, include_modules: true, require_mode: :kernel
26
31
  end
27
32
  end
@@ -20,6 +20,11 @@ module EhbrsRubyUtils
20
20
  end
21
21
  end
22
22
 
23
+ # @return [Boolean]
24
+ def game_conceded?
25
+ game_conceded
26
+ end
27
+
23
28
  # @return [Addressable::URI]
24
29
  def url
25
30
  table_url(id)
@@ -9,7 +9,7 @@ module EhbrsRubyUtils
9
9
  common_concern
10
10
 
11
11
  module InstanceMethods
12
- ROOT_URL = 'https://en.boardgamearena.com'
12
+ ROOT_URL = 'https://boardgamearena.com'
13
13
 
14
14
  # @param suffix [String]
15
15
  # @return [Addressable::URI]
@@ -17,6 +17,12 @@ module EhbrsRubyUtils
17
17
  root_url + suffix
18
18
  end
19
19
 
20
+ # @para player_id [Integer]
21
+ # @return [Addressable::URI]
22
+ def player_game_stats_url(player_id)
23
+ build_url("/gamestats?player=#{player_id}")
24
+ end
25
+
20
26
  # @return [Addressable::URI]
21
27
  def root_url
22
28
  ROOT_URL.to_uri
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EhbrsRubyUtils
4
- VERSION = '0.23.0'
4
+ VERSION = '0.24.1'
5
5
  end
@@ -4,7 +4,7 @@
4
4
  :leave_penalty:
5
5
  :rank_increment:
6
6
  :rank_after: 254
7
- :table_id: '374270557'
7
+ :id: 374270557
8
8
  :players:
9
9
  - :rank: 1
10
10
  :id: 92442373
@@ -19,7 +19,7 @@
19
19
  :leave_penalty:
20
20
  :rank_increment:
21
21
  :rank_after: 122
22
- :table_id: '375280703'
22
+ :id: 375280703
23
23
  :players:
24
24
  - :rank: 1
25
25
  :id: 84920871
@@ -34,7 +34,7 @@
34
34
  :leave_penalty:
35
35
  :rank_increment:
36
36
  :rank_after: 106
37
- :table_id: '373870907'
37
+ :id: 373870907
38
38
  :players:
39
39
  - :rank: 1
40
40
  :id: 84920871
@@ -49,7 +49,7 @@
49
49
  :leave_penalty:
50
50
  :rank_increment:
51
51
  :rank_after: 105
52
- :table_id: '373602409'
52
+ :id: 373602409
53
53
  :players:
54
54
  - :rank: 1
55
55
  :id: 84920871
@@ -64,7 +64,7 @@
64
64
  :leave_penalty:
65
65
  :rank_increment:
66
66
  :rank_after: 83
67
- :table_id: '372806271'
67
+ :id: 372806271
68
68
  :players:
69
69
  - :rank: 1
70
70
  :id: 84920871
@@ -79,7 +79,7 @@
79
79
  :leave_penalty:
80
80
  :rank_increment:
81
81
  :rank_after: 1
82
- :table_id: '373870075'
82
+ :id: 373870075
83
83
  :players:
84
84
  - :rank: 1
85
85
  :id: 90379834
@@ -94,7 +94,7 @@
94
94
  :leave_penalty:
95
95
  :rank_increment:
96
96
  :rank_after: 268
97
- :table_id: '370752197'
97
+ :id: 370752197
98
98
  :players:
99
99
  - :rank: 1
100
100
  :id: 84920871
@@ -109,7 +109,7 @@
109
109
  :leave_penalty:
110
110
  :rank_increment:
111
111
  :rank_after: 262
112
- :table_id: '372466754'
112
+ :id: 372466754
113
113
  :players:
114
114
  - :rank: 1
115
115
  :id: 84920871
@@ -124,7 +124,7 @@
124
124
  :leave_penalty:
125
125
  :rank_increment:
126
126
  :rank_after: 100
127
- :table_id: '373747455'
127
+ :id: 373747455
128
128
  :players:
129
129
  - :rank: 1
130
130
  :id: 84559362
@@ -139,7 +139,7 @@
139
139
  :leave_penalty:
140
140
  :rank_increment:
141
141
  :rank_after: 256
142
- :table_id: '373436042'
142
+ :id: 373436042
143
143
  :players:
144
144
  - :rank: 1
145
145
  :id: 84920871