itch_client 0.3.0 → 0.4.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: 8d5a506c76194715b52cb040986184ea7a86875914f759f0afa8491aa0b31449
4
- data.tar.gz: c6665dd7c4595990cf43b01cebf66c97aec781d3624d46b28d3f232daf1555c0
3
+ metadata.gz: 6f876530a8599ff397068d9d47e2e8adc23b98fcc72408316d0115f7207302d4
4
+ data.tar.gz: 3bb26a90883d227f89b07ec3f10ec4c02e207d8ebfa4ca96e630aff2ff478a7e
5
5
  SHA512:
6
- metadata.gz: 9398d54b0995e61779c54fc6cdb55f26b618d51e601afe68eb06baf4f8b961ce796f40865d276574b914ffab819338e5402f1b0fc67ead8d034e4d46f2804170
7
- data.tar.gz: b01cb911f08c8a4c22c7266e89c80074268dbadf7fee91fb22b884af7c048e19ba28f746ec4cf562fdd200a49b470601fa0a13484bd6cd5c8c6307634d929985
6
+ metadata.gz: c7566cb970c91713a5c471b74a2a9d6b17d5b2fdf570976abc8b1f5b893a33fd45ca5b1160bf1f7324f49fd86eb50ebd7d1388b764c416fbb8c2d1493d7f46b9
7
+ data.tar.gz: 06566e4cf0598494518ca9a1a4d0c42ddb7ee1b4b8ba03b2d8e1fd10f885f9c84c226da62d55fad4001e2dfc11448afb033ee6b3e78dc715ffebcb304d5b82c6
data/.gitignore CHANGED
@@ -10,3 +10,5 @@
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
12
  .env
13
+ cookies.yml
14
+ *.gem
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.4.0] - 2022-04-03
2
+
3
+ - Added review list
4
+
1
5
  ## [0.3.0] - 2021-10-13
2
6
 
3
7
  - Added bundle list
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- itch_client (0.3.0)
4
+ itch_client (0.4.0)
5
5
  mechanize (~> 2.8)
6
6
 
7
7
  GEM
@@ -12,16 +12,16 @@ GEM
12
12
  ast (2.4.2)
13
13
  coderay (1.1.3)
14
14
  connection_pool (2.2.5)
15
- diff-lcs (1.4.4)
15
+ diff-lcs (1.5.0)
16
16
  domain_name (0.5.20190701)
17
17
  unf (>= 0.0.5, < 1.0.0)
18
- http-cookie (1.0.3)
18
+ http-cookie (1.0.4)
19
19
  domain_name (~> 0.5)
20
- io-console (0.5.9)
21
- irb (1.3.5)
22
- reline (>= 0.1.5)
23
- mechanize (2.8.1)
24
- addressable (~> 2.7)
20
+ io-console (0.5.11)
21
+ irb (1.4.1)
22
+ reline (>= 0.3.0)
23
+ mechanize (2.8.4)
24
+ addressable (~> 2.8)
25
25
  domain_name (~> 0.5, >= 0.5.20190701)
26
26
  http-cookie (~> 1.0, >= 1.0.3)
27
27
  mime-types (~> 3.0)
@@ -32,58 +32,58 @@ GEM
32
32
  webrick (~> 1.7)
33
33
  webrobots (~> 0.1.2)
34
34
  method_source (1.0.0)
35
- mime-types (3.3.1)
35
+ mime-types (3.4.1)
36
36
  mime-types-data (~> 3.2015)
37
- mime-types-data (3.2021.0225)
37
+ mime-types-data (3.2022.0105)
38
38
  net-http-digest_auth (1.4.1)
39
39
  net-http-persistent (4.0.1)
40
40
  connection_pool (~> 2.2)
41
- nokogiri (1.12.5-x86_64-linux)
41
+ nokogiri (1.13.3-x86_64-linux)
42
42
  racc (~> 1.4)
43
- parallel (1.20.1)
44
- parser (3.0.1.1)
43
+ parallel (1.22.1)
44
+ parser (3.1.1.0)
45
45
  ast (~> 2.4.1)
46
46
  pry (0.14.1)
47
47
  coderay (~> 1.1)
48
48
  method_source (~> 1.0)
49
49
  public_suffix (4.0.6)
50
- racc (1.5.2)
51
- rainbow (3.0.0)
52
- rake (13.0.3)
53
- regexp_parser (2.1.1)
54
- reline (0.2.5)
50
+ racc (1.6.0)
51
+ rainbow (3.1.1)
52
+ rake (13.0.6)
53
+ regexp_parser (2.2.1)
54
+ reline (0.3.1)
55
55
  io-console (~> 0.5)
56
56
  rexml (3.2.5)
57
- rspec (3.10.0)
58
- rspec-core (~> 3.10.0)
59
- rspec-expectations (~> 3.10.0)
60
- rspec-mocks (~> 3.10.0)
61
- rspec-core (3.10.1)
62
- rspec-support (~> 3.10.0)
63
- rspec-expectations (3.10.1)
57
+ rspec (3.11.0)
58
+ rspec-core (~> 3.11.0)
59
+ rspec-expectations (~> 3.11.0)
60
+ rspec-mocks (~> 3.11.0)
61
+ rspec-core (3.11.0)
62
+ rspec-support (~> 3.11.0)
63
+ rspec-expectations (3.11.0)
64
64
  diff-lcs (>= 1.2.0, < 2.0)
65
- rspec-support (~> 3.10.0)
66
- rspec-mocks (3.10.2)
65
+ rspec-support (~> 3.11.0)
66
+ rspec-mocks (3.11.1)
67
67
  diff-lcs (>= 1.2.0, < 2.0)
68
- rspec-support (~> 3.10.0)
69
- rspec-support (3.10.2)
70
- rubocop (1.15.0)
68
+ rspec-support (~> 3.11.0)
69
+ rspec-support (3.11.0)
70
+ rubocop (1.26.1)
71
71
  parallel (~> 1.10)
72
- parser (>= 3.0.0.0)
72
+ parser (>= 3.1.0.0)
73
73
  rainbow (>= 2.2.2, < 4.0)
74
74
  regexp_parser (>= 1.8, < 3.0)
75
75
  rexml
76
- rubocop-ast (>= 1.5.0, < 2.0)
76
+ rubocop-ast (>= 1.16.0, < 2.0)
77
77
  ruby-progressbar (~> 1.7)
78
78
  unicode-display_width (>= 1.4.0, < 3.0)
79
- rubocop-ast (1.5.0)
80
- parser (>= 3.0.1.1)
79
+ rubocop-ast (1.16.0)
80
+ parser (>= 3.1.1.0)
81
81
  ruby-progressbar (1.11.0)
82
82
  rubyntlm (0.6.3)
83
83
  unf (0.1.4)
84
84
  unf_ext
85
- unf_ext (0.0.7.7)
86
- unicode-display_width (2.0.0)
85
+ unf_ext (0.0.8.1)
86
+ unicode-display_width (2.1.0)
87
87
  webrick (1.7.0)
88
88
  webrobots (0.1.2)
89
89
 
data/README.md CHANGED
@@ -171,6 +171,27 @@ client.game(12345).css
171
171
  client.game(12345).css = "body { background-color: green; }"
172
172
  ```
173
173
 
174
+ ### Reviews
175
+
176
+ Fetch current reviews
177
+
178
+ ```ruby
179
+ reviews = client.game(12345).reviews.list
180
+ #=>
181
+ [
182
+ #<Itch::Review:0x0000557aa98c7930
183
+ @id="123456789",
184
+ @user_name="Billiam",
185
+ @user_id="billiam",
186
+ @date=<DateTime: 2022-04-03T10:02:00+00:00>,
187
+ @stars=4,
188
+ @review=[
189
+ "I really like this game",
190
+ "So much that I've added a second paragraph"
191
+ ],
192
+ ]
193
+ ```
194
+
174
195
  ### Rewards
175
196
 
176
197
  Fetch reward CSV data
@@ -252,7 +273,8 @@ filtered_rewards = rewards.select do |reward|
252
273
  end
253
274
  client.game(12345).rewards.save(filtered_rewards)
254
275
  ```
255
- ### Bundles
276
+
277
+ ## Bundles
256
278
 
257
279
  Fetch current bundles
258
280
 
data/itch_client.gemspec CHANGED
@@ -16,6 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.metadata["homepage_uri"] = spec.homepage
17
17
  spec.metadata["source_code_uri"] = spec.homepage
18
18
  spec.metadata["changelog_uri"] = "#{spec.homepage}/CHANGELOG.md"
19
+ spec.metadata["rubygems_mfa_required"] = "true"
19
20
 
20
21
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
21
22
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
data/lib/itch/bundle.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "simple_inspect"
2
4
 
3
5
  module Itch
@@ -7,7 +9,6 @@ module Itch
7
9
 
8
10
  attr_accessor :id, :title, :games, :purchases, :price, :earnings
9
11
 
10
- # rubocop:disable Metrics/ParameterLists
11
12
  def initialize(id, title, purchases, price, earnings)
12
13
  @id = id
13
14
  @title = title
@@ -15,7 +16,6 @@ module Itch
15
16
  @price = price
16
17
  @earnings = earnings
17
18
  end
18
- # rubocop:enable Metrics/ParameterLists
19
19
 
20
20
  def url
21
21
  format(Itch::URL::BUNDLE, id: @id)
data/lib/itch/bundles.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
- require 'bigdecimal'
2
+
3
+ require "bigdecimal"
3
4
 
4
5
  require_relative "simple_inspect"
5
6
  require_relative "bundle"
6
7
  require_relative "request"
7
8
  require_relative "require_auth"
8
9
 
9
-
10
10
  module Itch
11
11
  # Fetch bundles
12
12
  class Bundles
@@ -23,16 +23,16 @@ module Itch
23
23
  @agent.get(bundles_url)
24
24
  end
25
25
 
26
- page.css('.bundle_list table > tr').map do |row|
26
+ page.css(".bundle_list table > tr").map do |row|
27
27
  parse_row(row)
28
28
  end
29
29
  end
30
30
 
31
31
  def parse_row(row)
32
- id = row.at_xpath('td[2]/a/@href').value.match(%r[^/b/(\d+)/])[1]
33
- vals = row.css('td').map(&:text)
34
- price = BigDecimal(vals[5].gsub(/[^\d.-]/, ''))
35
- earnings = BigDecimal(vals[6].gsub(/[\D-]/, ''))
32
+ id = row.at_xpath("td[2]/a/@href").value.match(%r{^/b/(\d+)/})[1]
33
+ vals = row.css("td").map(&:text)
34
+ price = BigDecimal(vals[5].gsub(/[^\d.-]/, ""))
35
+ earnings = BigDecimal(vals[6].gsub(/[\D-]/, ""))
36
36
 
37
37
  Bundle.new(id, vals[1], vals[4].to_i, price, earnings)
38
38
  end
data/lib/itch/game.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "reviews"
3
4
  require_relative "rewards"
4
5
  require_relative "reward"
5
6
  require_relative "require_auth"
@@ -48,6 +49,10 @@ module Itch
48
49
  Rewards.new(@agent, @id)
49
50
  end
50
51
 
52
+ def reviews
53
+ Reviews.new(@agent, @id)
54
+ end
55
+
51
56
  def reward(id)
52
57
  rewards.find { |reward| reward.id == id }
53
58
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "simple_inspect"
4
+
5
+ module Itch
6
+ # Data container for single review
7
+ class Review
8
+ include SimpleInspect
9
+
10
+ attr_reader :id, :user_name, :user_id, :stars, :date, :review
11
+
12
+ # rubocop:disable Metrics/ParameterLists
13
+ def initialize(user_name:, user_id:, stars:, date:, review:, id: nil)
14
+ @id = id
15
+ @user_name = user_name
16
+ @user_id = user_id
17
+ @stars = stars
18
+ @date = date
19
+ @review = review
20
+ end
21
+ # rubocop:enable Metrics/ParameterLists
22
+ end
23
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ require_relative "require_auth"
6
+ require_relative "simple_inspect"
7
+ require_relative "review"
8
+ require_relative "request"
9
+
10
+ module Itch
11
+ # Fetch reviews
12
+ class Reviews
13
+ include SimpleInspect
14
+ include RequireAuth
15
+ include Request
16
+
17
+ def initialize(agent, game_id)
18
+ @agent = agent
19
+ @game_id = game_id
20
+ end
21
+
22
+ def list
23
+ all_reviews = []
24
+
25
+ page_number = 1
26
+ loop do
27
+ page_reviews = parse_page_reviews(page_number)
28
+
29
+ break if page_reviews.empty?
30
+
31
+ all_reviews += page_reviews
32
+ page_number += 1
33
+ sleep 0.5
34
+ end
35
+
36
+ all_reviews
37
+ end
38
+
39
+ protected
40
+
41
+ def parse_page_reviews(page_number)
42
+ page = with_login do
43
+ @agent.get(review_url(page_number))
44
+ end
45
+
46
+ raise Error, "Could not find game id #{@game_id} rewards" unless page.code == "200"
47
+
48
+ page.css(".content_column .rating").map do |row|
49
+ parse_row row
50
+ end
51
+ end
52
+
53
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
54
+ def parse_row(row)
55
+ id = row.at_css("button[data-lightbox_url]")["data-lightbox_url"].split("/").last
56
+ stars = row.css(".star_picker .icon-star").length
57
+ header = row.at_css(".row_header")
58
+ date = DateTime.parse header.at_css("abbr")["title"].strip
59
+
60
+ user_link = header.at_css(".user_link")
61
+ user_name = user_link.search("./text()").text.strip
62
+ user_id = user_link["href"].split("/").last
63
+
64
+ text = row.css(".blurb p").map(&:text)
65
+
66
+ Review.new(
67
+ id: id,
68
+ user_name: user_name,
69
+ user_id: user_id,
70
+ stars: stars,
71
+ date: date,
72
+ review: text
73
+ )
74
+ end
75
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
76
+
77
+ def review_url(page = 1)
78
+ format(Itch::URL::REVIEWS, id: @game_id, page: page)
79
+ end
80
+ end
81
+ end
data/lib/itch/rewards.rb CHANGED
@@ -106,9 +106,9 @@ module Itch
106
106
  input.name.match(/^rewards\[(\d+)\]\[id\]/)
107
107
  end.value
108
108
 
109
- attributes = %w[title description amount price].map do |name|
109
+ attributes = %w[title description amount price].to_h do |name|
110
110
  [name.to_sym, row.css_at(".reward_#{name}_input").value]
111
- end.to_h
111
+ end
112
112
  attributes[:claimed] = row.css_at(".claimed_count").text
113
113
 
114
114
  Reward.new(@agent, @game_id, id, attributes)
data/lib/itch/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Itch
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/itch_client.rb CHANGED
@@ -35,6 +35,7 @@ module Itch
35
35
  LOGIN = "https://itch.io/login"
36
36
  MONTH_PURCHASES_CSV = "https://itch.io/export-purchases/by-date/%<month>d-%<year>d"
37
37
  PURCHASES_CSV = "https://itch.io/export-purchases/all"
38
+ REVIEWS = "https://itch.io/game/ratings/%<id>d?page=%<page>d"
38
39
  REWARD_CSV = "https://itch.io/game/rewards/%<id>d/claimed?format=csv"
39
40
  REWARDS = "https://itch.io/game/rewards/%<id>d"
40
41
  TOTP_FRAGMENT = "https://itch.io/totp/verify/"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itch_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Billiam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-13 00:00:00.000000000 Z
11
+ date: 2022-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mechanize
@@ -53,6 +53,8 @@ files:
53
53
  - lib/itch/purchases.rb
54
54
  - lib/itch/request.rb
55
55
  - lib/itch/require_auth.rb
56
+ - lib/itch/review.rb
57
+ - lib/itch/reviews.rb
56
58
  - lib/itch/reward.rb
57
59
  - lib/itch/rewards.rb
58
60
  - lib/itch/simple_inspect.rb
@@ -65,6 +67,7 @@ metadata:
65
67
  homepage_uri: https://github.com/Billiam/itch-client
66
68
  source_code_uri: https://github.com/Billiam/itch-client
67
69
  changelog_uri: https://github.com/Billiam/itch-client/CHANGELOG.md
70
+ rubygems_mfa_required: 'true'
68
71
  post_install_message:
69
72
  rdoc_options: []
70
73
  require_paths: