nexus_mods 2.0.1 → 2.1.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: 3aa5f91eb62460b72b2f0f31434cc1d3741c70970b3e4db5f22b57e95bbe6b4c
4
- data.tar.gz: 31cdf30406cbed8fa23a432cc7b916ed8223c9344a3d07379adb5cff19f4bfea
3
+ metadata.gz: ac9b76be57a989b2cd00cb120912dc8360fc926e76589769b725879f582e7d82
4
+ data.tar.gz: 61342738bb1678bdbbbf350bf645b90210c55c8b53a63bdbb9cc755ca6f146bd
5
5
  SHA512:
6
- metadata.gz: 03a0ddca6e1d752aee0cb6ec887067340d3f31546cb6212da7c01082327fd47f898aa176f0c24175483db6657a8ff54d00bedd71411c37a00141b26e5c68b09c
7
- data.tar.gz: ffd3177a8b3dcee3f1c96eeb03e5a9526c5bbcf967ae81c6d926a0f7158eeccae5b7214b4e8c0d769e98f6d5d2058135d8cab5e27436c1ae3df890378c6bca1e
6
+ metadata.gz: 8ad0436dd7917b94ebbedaa26e7f943a92520b0336413730e273108849b7f2659e026954ad1a68570e99c27ad6654a6c970be208ec500078a4490e65930ce896
7
+ data.tar.gz: 67a49c5e42db887253894726eed4b7ff3adde7f6da0f31d123ce6587117abb99d80a26e9a0db69bb541368fec4c6561b3b0a9564a8fe5ac27a412b0fb3c0173e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # [v2.1.0](https://github.com/Muriel-Salvan/nexus_mods/compare/v2.0.1...v2.1.0) (2023-04-11 18:24:04)
2
+
3
+ ### Features
4
+
5
+ * [[Feature] Add API entry point to retrieve last updated mods](https://github.com/Muriel-Salvan/nexus_mods/commit/cf702fc2c146cc7d61aadca005aa0e784b807c44)
6
+
1
7
  # [v2.0.1](https://github.com/Muriel-Salvan/nexus_mods/compare/v2.0.0...v2.0.1) (2023-04-11 10:22:54)
2
8
 
3
9
  ### Patches
@@ -0,0 +1,49 @@
1
+ class NexusMods
2
+
3
+ module Api
4
+
5
+ # A NexusMods mod updates.
6
+ class ModUpdates
7
+
8
+ attr_reader(
9
+ *%i[
10
+ mod_id
11
+ latest_file_update
12
+ latest_mod_activity
13
+ ]
14
+ )
15
+
16
+ # Constructor
17
+ #
18
+ # Parameters::
19
+ # * *mod_id* (Integer): The mod's id
20
+ # * *latest_file_update* (Time): The mod's latest file update
21
+ # * *latest_mod_activity* (Time): The mod's latest activity
22
+ def initialize(
23
+ mod_id:,
24
+ latest_file_update:,
25
+ latest_mod_activity:
26
+ )
27
+ @mod_id = mod_id
28
+ @latest_file_update = latest_file_update
29
+ @latest_mod_activity = latest_mod_activity
30
+ end
31
+
32
+ # Equality operator
33
+ #
34
+ # Parameters::
35
+ # * *other* (Object): Other object to compare with
36
+ # Result::
37
+ # * Boolean: Are objects equal?
38
+ def ==(other)
39
+ other.is_a?(ModUpdates) &&
40
+ @mod_id == other.mod_id &&
41
+ @latest_file_update == other.latest_file_update &&
42
+ @latest_mod_activity == other.latest_mod_activity
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -50,25 +50,27 @@ class NexusMods
50
50
  #
51
51
  # Parameters::
52
52
  # * *path* (String): API path to contact (from v1/ and without .json)
53
+ # * *parameters* (Hash<Symbol,Object>): Optional parameters to add to the path [default: {}]
53
54
  # * *verb* (Symbol): Verb to be used (:get, :post...) [default: :get]
54
55
  # * *clear_cache* (Boolean): Should we clear the API cache for this resource? [default: false]
55
56
  # Result::
56
57
  # * Object: The JSON response
57
- def api(path, verb: :get, clear_cache: false)
58
- clear_cached_api_cache(path, verb:) if clear_cache
59
- cached_api(path, verb:)
58
+ def api(path, parameters: {}, verb: :get, clear_cache: false)
59
+ clear_cached_api_cache(path, parameters:, verb:) if clear_cache
60
+ cached_api(path, parameters:, verb:)
60
61
  end
61
62
 
62
63
  # Send an HTTP request to the API and get back the HTTP response
63
64
  #
64
65
  # Parameters::
65
66
  # * *path* (String): API path to contact (from v1/ and without .json)
67
+ # * *parameters* (Hash<Symbol,Object>): Optional parameters to add to the path [default: {}]
66
68
  # * *verb* (Symbol): Verb to be used (:get, :post...) [default: :get]
67
69
  # Result::
68
70
  # * Faraday::Response: The HTTP response
69
- def http(path, verb: :get)
71
+ def http(path, parameters: {}, verb: :get)
70
72
  @http_client.send(verb) do |req|
71
- req.url api_uri(path)
73
+ req.url api_uri(path, parameters:)
72
74
  req.headers['apikey'] = @api_key
73
75
  req.headers['User-Agent'] = "nexus_mods/#{NexusMods::VERSION} (#{RUBY_PLATFORM}) Ruby/#{RUBY_VERSION}"
74
76
  end
@@ -106,11 +108,12 @@ class NexusMods
106
108
  #
107
109
  # Parameters::
108
110
  # * *path* (String): API path to contact (from v1/ and without .json)
111
+ # * *parameters* (Hash<Symbol,Object>): Optional parameters to add to the path [default: {}]
109
112
  # * *verb* (Symbol): Verb to be used (:get, :post...) [default: :get]
110
113
  # Result::
111
114
  # * Object: The JSON response
112
- def cached_api(path, verb: :get)
113
- res = http(path, verb:)
115
+ def cached_api(path, parameters: {}, verb: :get)
116
+ res = http(path, parameters:, verb:)
114
117
  json = JSON.parse(res.body)
115
118
  uri = api_uri(path)
116
119
  @logger.debug "[API call] - #{verb} #{uri} => #{res.status}\n#{
@@ -139,11 +142,14 @@ class NexusMods
139
142
  cacheable_api(
140
143
  :cached_api,
141
144
  key_format: proc do |_target, _method_name, method_args, method_kwargs|
142
- "#{method_kwargs[:verb]}/#{method_args.first}"
145
+ "#{method_kwargs[:verb]}/#{method_args.first}#{
146
+ method_kwargs[:parameters].empty? ? '' : "/#{method_kwargs[:parameters].map { |param, value| "#{param}=#{value}" }.sort.join('/')}"
147
+ }"
143
148
  end,
144
149
  expiry_from_key: proc do |key|
145
150
  # Example of keys:
146
151
  # get/games
152
+ # get/games/skyrimspecialedition/mods/updated/period=1d
147
153
  # get/games/skyrimspecialedition/mods/2014
148
154
  # get/games/skyrimspecialedition/mods/2014/files
149
155
  # get/users/validate
@@ -155,13 +161,19 @@ class NexusMods
155
161
  else
156
162
  case key_components[2]
157
163
  when 'mods'
158
- case key_components[4]
159
- when nil
160
- ApiClient.api_client.api_cache_expiry[:mod]
161
- when 'files'
162
- ApiClient.api_client.api_cache_expiry[:mod_files]
164
+ case key_components[3]
165
+ when 'updated'
166
+ # According to the API doc, this is updated every 5 minutes
167
+ 5 * 60
163
168
  else
164
- raise "Unknown API path: #{key}"
169
+ case key_components[4]
170
+ when nil
171
+ ApiClient.api_client.api_cache_expiry[:mod]
172
+ when 'files'
173
+ ApiClient.api_client.api_cache_expiry[:mod_files]
174
+ else
175
+ raise "Unknown API path: #{key}"
176
+ end
165
177
  end
166
178
  else
167
179
  raise "Unknown API path: #{key}"
@@ -183,10 +195,11 @@ class NexusMods
183
195
  #
184
196
  # Parameters::
185
197
  # * *path* (String): API path to contact (from v1/ and without .json)
198
+ # * *parameters* (Hash<Symbol,Object>): Optional parameters to add to the path [default: {}]
186
199
  # Result::
187
200
  # * String: The URI
188
- def api_uri(path)
189
- "https://api.nexusmods.com/v1/#{path}.json"
201
+ def api_uri(path, parameters: {})
202
+ "https://api.nexusmods.com/v1/#{path}.json#{parameters.empty? ? '' : "?#{parameters.map { |param, value| "#{param}=#{value}" }.join('&')}"}"
190
203
  end
191
204
 
192
205
  end
@@ -1,5 +1,5 @@
1
1
  class NexusMods
2
2
 
3
- VERSION = '2.0.1'
3
+ VERSION = '2.1.0'
4
4
 
5
5
  end
data/lib/nexus_mods.rb CHANGED
@@ -8,6 +8,7 @@ require 'nexus_mods/api/game'
8
8
  require 'nexus_mods/api/user'
9
9
  require 'nexus_mods/api/mod'
10
10
  require 'nexus_mods/api/mod_file'
11
+ require 'nexus_mods/api/mod_updates'
11
12
 
12
13
  # Ruby API to access NexusMods REST API
13
14
  class NexusMods
@@ -130,7 +131,7 @@ class NexusMods
130
131
  nexusmods_url: game_json['nexusmods_url'],
131
132
  genre: game_json['genre'],
132
133
  domain_name: game_json['domain_name'],
133
- approved_date: Time.at(game_json['approved_date']),
134
+ approved_date: Time.at(game_json['approved_date']).utc,
134
135
  files_count: game_json['file_count'],
135
136
  files_views: game_json['file_views'],
136
137
  files_endorsements: game_json['file_endorsements'],
@@ -213,4 +214,33 @@ class NexusMods
213
214
  end
214
215
  end
215
216
 
217
+ # Get a list of updated mod ids since a given time
218
+ #
219
+ # Parameters::
220
+ # * *game_domain_name* (String): Game domain name to query by default [default: @game_domain_name]
221
+ # * *since* (Symbol): The time from which we look for updated mods [default: :one_day]
222
+ # Possible values are:
223
+ # * *one_day*: Since 1 day
224
+ # * *one_week*: Since 1 week
225
+ # * *one_month*: Since 1 month
226
+ # * *clear_cache* (Boolean): Should we clear the API cache for this resource? [default: false]
227
+ # Result::
228
+ # * Array<ModUpdates>: Mod's updates information
229
+ def updated_mods(game_domain_name: @game_domain_name, since: :one_day, clear_cache: false)
230
+ nexus_mods_period = {
231
+ one_day: '1d',
232
+ one_week: '1w',
233
+ one_month: '1m'
234
+ }[since]
235
+ raise "Unknown time stamp: #{since}" if nexus_mods_period.nil?
236
+
237
+ @api_client.api("games/#{game_domain_name}/mods/updated", parameters: { period: nexus_mods_period }, clear_cache:).map do |updated_mod_json|
238
+ Api::ModUpdates.new(
239
+ mod_id: updated_mod_json['mod_id'],
240
+ latest_file_update: Time.at(updated_mod_json['latest_file_update']).utc,
241
+ latest_mod_activity: Time.at(updated_mod_json['latest_mod_activity']).utc
242
+ )
243
+ end
244
+ end
245
+
216
246
  end
@@ -63,7 +63,7 @@ module NexusModsTest
63
63
  # Expect a mod's file to be the example one with id 2472
64
64
  #
65
65
  # Parameters::
66
- # * *mod_file* (NexusMods::Api::File): Mod file to validate
66
+ # * *mod_file* (NexusMods::Api::ModFile): Mod file to validate
67
67
  def expect_mod_file_to_be2472(mod_file)
68
68
  expect(mod_file.ids).to eq [2472, 1704]
69
69
  expect(mod_file.uid).to eq 7_318_624_274_856
@@ -87,7 +87,7 @@ module NexusModsTest
87
87
  # Expect a mod's file to be the example one with id 2487
88
88
  #
89
89
  # Parameters::
90
- # * *mod_file* (NexusMods::Api::File): Mod file to validate
90
+ # * *mod_file* (NexusMods::Api::ModFile): Mod file to validate
91
91
  def expect_mod_file_to_be2487(mod_file)
92
92
  expect(mod_file.ids).to eq [2487, 1705]
93
93
  expect(mod_file.uid).to eq 7_318_624_274_857
@@ -0,0 +1,49 @@
1
+ module NexusModsTest
2
+
3
+ module Factories
4
+
5
+ module ModUpdates
6
+
7
+ # Test mod updates with id 2014
8
+ def json_mod_updates2014
9
+ {
10
+ 'mod_id' => 2014,
11
+ 'latest_file_update' => 1_655_813_855,
12
+ 'latest_mod_activity' => 1_681_169_675
13
+ }
14
+ end
15
+
16
+ # Test mod updates with id 100
17
+ def json_mod_updates100
18
+ {
19
+ 'mod_id' => 100,
20
+ 'latest_file_update' => 1_681_143_964,
21
+ 'latest_mod_activity' => 1_681_143_964
22
+ }
23
+ end
24
+
25
+ # Expect a mod's updates to be the example one with id 2014
26
+ #
27
+ # Parameters::
28
+ # * *mod_updates* (NexusMods::Api::ModUpdates): Mod updates to validate
29
+ def expect_mod_file_to_be2014(mod_updates)
30
+ expect(mod_updates.mod_id).to eq 2014
31
+ expect(mod_updates.latest_file_update).to eq Time.parse('2022-06-21 12:17:35 UTC')
32
+ expect(mod_updates.latest_mod_activity).to eq Time.parse('2023-04-10 23:34:35 UTC')
33
+ end
34
+
35
+ # Expect a mod's updates to be the example one with id 100
36
+ #
37
+ # Parameters::
38
+ # * *mod_updates* (NexusMods::Api::ModUpdates): Mod updates to validate
39
+ def expect_mod_file_to_be100(mod_updates)
40
+ expect(mod_updates.mod_id).to eq 100
41
+ expect(mod_updates.latest_file_update).to eq Time.parse('2023-04-10 16:26:04 UTC')
42
+ expect(mod_updates.latest_mod_activity).to eq Time.parse('2023-04-10 16:26:04 UTC')
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -4,6 +4,7 @@ require 'rspec/support/object_formatter'
4
4
  require 'nexus_mods_test/factories/games'
5
5
  require 'nexus_mods_test/factories/mods'
6
6
  require 'nexus_mods_test/factories/mod_files'
7
+ require 'nexus_mods_test/factories/mod_updates'
7
8
  require 'nexus_mods'
8
9
 
9
10
  module NexusModsTest
@@ -180,6 +181,7 @@ RSpec.configure do |config|
180
181
  config.include NexusModsTest::Factories::Games
181
182
  config.include NexusModsTest::Factories::Mods
182
183
  config.include NexusModsTest::Factories::ModFiles
184
+ config.include NexusModsTest::Factories::ModUpdates
183
185
  config.before do
184
186
  @nexus_mods = nil
185
187
  # Reload the ApiClient as it stores caches at class level
@@ -0,0 +1,91 @@
1
+ describe NexusMods::Api::ModUpdates do
2
+
3
+ context 'when testing mod updates' do
4
+
5
+ before do
6
+ expect_validate_user
7
+ end
8
+
9
+ # Expect the given array of mod updates to be the ones of examples (for mods 100 and 2014)
10
+ #
11
+ # Parameters::
12
+ # * *mod_updates* (Array<NexusMods::Api::ModUpdates>): The list of mod updates to validate
13
+ def expect_mod_updates_to_be_example(mod_updates)
14
+ sorted_mod_updates = mod_updates.sort_by(&:mod_id)
15
+ expect_mod_file_to_be100(sorted_mod_updates.first)
16
+ expect_mod_file_to_be2014(sorted_mod_updates[1])
17
+ end
18
+
19
+ {
20
+ 'last day' => {
21
+ since: :one_day,
22
+ expected_url_params: 'period=1d'
23
+ },
24
+ 'last week' => {
25
+ since: :one_week,
26
+ expected_url_params: 'period=1w'
27
+ },
28
+ 'last month' => {
29
+ since: :one_month,
30
+ expected_url_params: 'period=1m'
31
+ }
32
+ }.each do |since, since_config|
33
+
34
+ context "when testing updated months since #{since}" do
35
+
36
+ it 'returns updated mods' do
37
+ expect_http_call_to(
38
+ path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
39
+ json: [
40
+ json_mod_updates2014,
41
+ json_mod_updates100
42
+ ]
43
+ )
44
+ expect_mod_updates_to_be_example(nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since]))
45
+ end
46
+
47
+ it 'returns updated mods information for the default game' do
48
+ expect_http_call_to(
49
+ path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
50
+ json: [
51
+ json_mod_updates2014,
52
+ json_mod_updates100
53
+ ]
54
+ )
55
+ expect_mod_updates_to_be_example(nexus_mods(game_domain_name: 'skyrimspecialedition').updated_mods(since: since_config[:since]))
56
+ end
57
+
58
+ it 'returns updated mods information for the default game set using accessor' do
59
+ expect_http_call_to(
60
+ path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
61
+ json: [
62
+ json_mod_updates2014,
63
+ json_mod_updates100
64
+ ]
65
+ )
66
+ nexus_mods.game_domain_name = 'skyrimspecialedition'
67
+ expect_mod_updates_to_be_example(nexus_mods.updated_mods(since: since_config[:since]))
68
+ end
69
+
70
+ it 'compares objects for equality' do
71
+ expect_http_call_to(
72
+ path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
73
+ json: [json_mod_updates2014]
74
+ )
75
+ mod_updates1 = nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])
76
+ mod_updates2 = nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])
77
+ expect(mod_updates1.object_id).not_to eq mod_updates2.object_id
78
+ expect(mod_updates1).to eq mod_updates2
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+
85
+ it 'fails to fetch updated mods for an unknown period' do
86
+ expect { nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: :unknown_since) }.to raise_error 'Unknown time stamp: unknown_since'
87
+ end
88
+
89
+ end
90
+
91
+ end
@@ -20,7 +20,7 @@ describe NexusMods do
20
20
  ]
21
21
  )
22
22
  games = nexus_mods.games
23
- expect(nexus_mods.games).to eq(games)
23
+ expect(nexus_mods.games).to eq games
24
24
  end
25
25
 
26
26
  it 'does not cache games queries if asked' do
@@ -34,7 +34,7 @@ describe NexusMods do
34
34
  times: 2
35
35
  )
36
36
  games = nexus_mods.games
37
- expect(nexus_mods.games(clear_cache: true)).to eq(games)
37
+ expect(nexus_mods.games(clear_cache: true)).to eq games
38
38
  end
39
39
 
40
40
  it 'caches mod queries' do
@@ -44,7 +44,7 @@ describe NexusMods do
44
44
  json: json_complete_mod
45
45
  )
46
46
  mod = nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
47
- expect(nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq(mod)
47
+ expect(nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq mod
48
48
  end
49
49
 
50
50
  it 'does not cache mod queries if asked' do
@@ -55,7 +55,7 @@ describe NexusMods do
55
55
  times: 2
56
56
  )
57
57
  mod = nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
58
- expect(nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)).to eq(mod)
58
+ expect(nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)).to eq mod
59
59
  end
60
60
 
61
61
  it 'caches mod files queries' do
@@ -65,7 +65,7 @@ describe NexusMods do
65
65
  json: { files: [json_mod_file2472, json_mod_file2487] }
66
66
  )
67
67
  mod_files = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
68
- expect(nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq(mod_files)
68
+ expect(nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq mod_files
69
69
  end
70
70
 
71
71
  it 'does not cache mod files queries if asked' do
@@ -76,7 +76,55 @@ describe NexusMods do
76
76
  times: 2
77
77
  )
78
78
  mod_files = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
79
- expect(nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)).to eq(mod_files)
79
+ expect(nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)).to eq mod_files
80
+ end
81
+
82
+ {
83
+ 'last day' => {
84
+ since: :one_day,
85
+ expected_url_params: 'period=1d'
86
+ },
87
+ 'last week' => {
88
+ since: :one_week,
89
+ expected_url_params: 'period=1w'
90
+ },
91
+ 'last month' => {
92
+ since: :one_month,
93
+ expected_url_params: 'period=1m'
94
+ }
95
+ }.each do |since, since_config|
96
+
97
+ context "when testing updated months since #{since}" do
98
+
99
+ it 'caches mod updates queries' do
100
+ expect_validate_user
101
+ expect_http_call_to(
102
+ path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
103
+ json: [
104
+ json_mod_updates2014,
105
+ json_mod_updates100
106
+ ]
107
+ )
108
+ mod_updates = nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])
109
+ expect(nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])).to eq mod_updates
110
+ end
111
+
112
+ it 'does not cache mod updates queries if asked' do
113
+ expect_validate_user
114
+ expect_http_call_to(
115
+ path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
116
+ json: [
117
+ json_mod_updates2014,
118
+ json_mod_updates100
119
+ ],
120
+ times: 2
121
+ )
122
+ mod_updates = nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])
123
+ expect(nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since], clear_cache: true)).to eq mod_updates
124
+ end
125
+
126
+ end
127
+
80
128
  end
81
129
 
82
130
  it 'expires games queries cache' do
@@ -92,7 +140,7 @@ describe NexusMods do
92
140
  nexus_mods_instance = nexus_mods(api_cache_expiry: { games: 1 })
93
141
  games = nexus_mods_instance.games
94
142
  sleep 2
95
- expect(nexus_mods_instance.games).to eq(games)
143
+ expect(nexus_mods_instance.games).to eq games
96
144
  end
97
145
 
98
146
  it 'expires mod queries cache' do
@@ -105,7 +153,7 @@ describe NexusMods do
105
153
  nexus_mods_instance = nexus_mods(api_cache_expiry: { mod: 1 })
106
154
  mod = nexus_mods_instance.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
107
155
  sleep 2
108
- expect(nexus_mods_instance.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq(mod)
156
+ expect(nexus_mods_instance.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq mod
109
157
  end
110
158
 
111
159
  it 'expires mod files queries cache' do
@@ -118,7 +166,7 @@ describe NexusMods do
118
166
  nexus_mods_instance = nexus_mods(api_cache_expiry: { mod_files: 1 })
119
167
  mod_files = nexus_mods_instance.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
120
168
  sleep 2
121
- expect(nexus_mods_instance.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq(mod_files)
169
+ expect(nexus_mods_instance.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq mod_files
122
170
  end
123
171
 
124
172
  it 'only clears the cache of the wanted resource' do
@@ -136,8 +184,8 @@ describe NexusMods do
136
184
  mod_files20151 = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2015)
137
185
  mod_files20142 = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)
138
186
  mod_files20152 = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2015)
139
- expect(mod_files20141).to eq(mod_files20142)
140
- expect(mod_files20151).to eq(mod_files20152)
187
+ expect(mod_files20141).to eq mod_files20142
188
+ expect(mod_files20151).to eq mod_files20152
141
189
  end
142
190
 
143
191
  context 'with file persistence' do
@@ -276,10 +324,10 @@ describe NexusMods do
276
324
  nexus_mods_instance3 = nexus_mods(api_cache_file:)
277
325
  mod_files20143 = nexus_mods_instance3.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
278
326
  mod_files20153 = nexus_mods_instance3.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2015)
279
- expect(mod_files20141).to eq(mod_files20142)
280
- expect(mod_files20141).to eq(mod_files20143)
281
- expect(mod_files20151).to eq(mod_files20152)
282
- expect(mod_files20151).to eq(mod_files20153)
327
+ expect(mod_files20141).to eq mod_files20142
328
+ expect(mod_files20141).to eq mod_files20143
329
+ expect(mod_files20151).to eq mod_files20152
330
+ expect(mod_files20151).to eq mod_files20153
283
331
  end
284
332
  end
285
333
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexus_mods
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Muriel Salvan
@@ -137,6 +137,7 @@ files:
137
137
  - lib/nexus_mods/api/game.rb
138
138
  - lib/nexus_mods/api/mod.rb
139
139
  - lib/nexus_mods/api/mod_file.rb
140
+ - lib/nexus_mods/api/mod_updates.rb
140
141
  - lib/nexus_mods/api/user.rb
141
142
  - lib/nexus_mods/api_client.rb
142
143
  - lib/nexus_mods/cacheable_api.rb
@@ -146,12 +147,14 @@ files:
146
147
  - lib/nexus_mods/version.rb
147
148
  - spec/nexus_mods_test/factories/games.rb
148
149
  - spec/nexus_mods_test/factories/mod_files.rb
150
+ - spec/nexus_mods_test/factories/mod_updates.rb
149
151
  - spec/nexus_mods_test/factories/mods.rb
150
152
  - spec/nexus_mods_test/helpers.rb
151
153
  - spec/nexus_mods_test/scenarios/nexus_mods/api/api_limits_spec.rb
152
154
  - spec/nexus_mods_test/scenarios/nexus_mods/api/game_spec.rb
153
155
  - spec/nexus_mods_test/scenarios/nexus_mods/api/mod_file_spec.rb
154
156
  - spec/nexus_mods_test/scenarios/nexus_mods/api/mod_spec.rb
157
+ - spec/nexus_mods_test/scenarios/nexus_mods/api/mod_updates_spec.rb
155
158
  - spec/nexus_mods_test/scenarios/nexus_mods/nexus_mods_access_spec.rb
156
159
  - spec/nexus_mods_test/scenarios/nexus_mods/nexus_mods_caching_spec.rb
157
160
  - spec/nexus_mods_test/scenarios/nexus_mods/nexus_mods_common_spec.rb